GCC Inline Assembler

Модератор: Модераторы разделов

BratSinot
Сообщения: 812
ОС: Slackware64

GCC Inline Assembler

Сообщение BratSinot »

Доброго времени суток!

Вообщем взят код с 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".
Спасибо сказали:
Аватара пользователя
deadhead
Сообщения: 1913
Статус: zzz..z

Re: GCC Inline Assembler

Сообщение deadhead »

BratSinot писал(а):
18.08.2012 00:53
Вообщем взят код с Wikipedia:

BratSinot писал(а):
18.08.2012 00:53
Он не работает

BratSinot писал(а):
18.08.2012 00:53
... Код из Wikipedia работает
так все таки?
[x] close
Спасибо сказали:
BratSinot
Сообщения: 812
ОС: Slackware64

Re: GCC Inline Assembler

Сообщение BratSinot »

deadhead писал(а):
20.08.2012 10:17
BratSinot писал(а):
18.08.2012 00:53
Вообщем взят код с Wikipedia:

BratSinot писал(а):
18.08.2012 00:53
Он не работает

BratSinot писал(а):
18.08.2012 00:53
... Код из Wikipedia работает
так все таки?

Я уже сказал "... Код из Wikipedia работает, оптимизации gcc что-то делают". Если например вставить второй printf, то он выведет новое значение, а первый старое. Или если отключить оптимизации (-O) то printf будет выводить новое значение сразу.

И как я уже сказал "Помогло указание, что a находится в памяти, тобишь "=m"". Хотя я не понимаю почему при указании "a" как "=r" он выдает ошибку.
Спасибо сказали: