Ошибка компиляции встроенного ассемблера MMX: недопустимый суффикс или операнды

Следующий код:

simd(n, is)
long *is;
{   
   long i;
   asm("pxor %mm0,%mm0");
   for (i = 0; i < n; i += W) {

       asm("movq %0 %%mm1\n\t"
           "paddq %%mm1 %%mm0"
           :
           :"m"(is[i])          );

   }
   return 0;
}

Я не могу понять, почему он не компилируется со следующей ошибкой:

/tmp/ccrDnFTm.s: Assembler messages:
/tmp/ccrDnFTm.s:29: Error: suffix or operands invalid for `movq'
/tmp/ccrDnFTm.s:30: Error: junk `%mm0' after register

Почему?


person MarZalazar    schedule 16.01.2013    source источник
comment
Почему вы до сих пор пишете код, использующий MMX? Это невероятно устаревший набор инструкций; если у вас нет очень веской причины, вы должны вместо этого использовать SSE.   -  person Stephen Canon    schedule 17.01.2013
comment
@StephenCanon: код будет работать в промышленной системе управления, в которой используется старый процессор Pentium. Изменение аппаратного обеспечения было вариантом, но на материнской плате есть специальные периферийные устройства (аналоговый ввод-вывод), копирование которых было бы дорогостоящим.   -  person MarZalazar    schedule 17.01.2013
comment
Хорошо, это редкая веская причина. Обязательно выполните команду EMMS после выполнения любых вычислений с использованием MMX, чтобы сбросить состояние x87. Неспособность сделать это является распространенной причиной крайне трудно диагностируемых ошибок.   -  person Stephen Canon    schedule 17.01.2013


Ответы (1)


Операнды должны быть разделены запятыми:

movq %0, %%mm1
person istepaniuk    schedule 16.01.2013