Вообщем взят код с Wikipedia:
Код: Выделить всё
float a[4] = { 300.0, 4.0, 4.0, 12.0 };
float b[4] = { 1.5, 2.5, 3.5, 4.5 };
asm ("movups (%[a]), %%xmm0\n"
"movups (%[b]), %%xmm1\n"
"mulps %%xmm0, %%xmm1\n"
"movups %%xmm1, (%[a])\n"
:
:[b] "r" (b), [a] "r" (a)
:"%xmm0", "%xmm1"
);
Он не работает (массивы теже), я так понял из-за того, что %[a] находится не в output. По этому поводу сделал так:
Код: Выделить всё
__asm
(
"movups (%[a]), %%xmm0\n\t"
"movups (%[b]), %%xmm1\n\t"
"mulps %%xmm0, %%xmm1\n\t"
"movups %%xmm1, (%[a])\n\t"
: [a]"=r"(a)
: [b]"r"(b)
: "%xmm0", "%xmm1"
);
А он мне выдает что: "error: impossible constraint in `asm`"
... Код из Wikipedia работает, оптимизации gcc что-то делают. volatile не спасает.
Помогло указание, что a находится в памяти, тобишь "=m".