Я пробую свои силы на ассемблере, чтобы использовать векторные операции, которые я никогда раньше не использовал, и, по общему признанию, у меня есть некоторые проблемы с пониманием синтаксиса.
Соответствующий код ниже.
unit16_t asdf[4];
asdf[0] = 1;
asdf[1] = 2;
asdf[2] = 3;
asdf[3] = 4;
uint16_t other = 3;
__asm__("movq %0, %%mm0"
:
: "m" (asdf));
__asm__("pcmpeqw %0, %%mm0"
:
: "r" (other));
__asm__("movq %%mm0, %0" : "=m" (asdf));
printf("%u %u %u %u\n", asdf[0], asdf[1], asdf[2], asdf[3]);
В этом простом примере я пытаюсь выполнить 16-битное сравнение «3» с каждым элементом массива. Я надеюсь, что на выходе будет «0 0 65535 0». Но он даже не собирается.
Первая инструкция по сборке выдает следующую ошибку:
ошибка: вход памяти 0 не адресуется напрямую
Вторая инструкция дает мне другую ошибку:
Ошибка: недопустимый суффикс или операнд для `pcmpeqw'
Любая помощь будет оценена по достоинству.
C
в заголовке, но тегC++
? - person crashmstr   schedule 24.02.2014_m_pcmpeqw
,_mm_cmpeq_pi16
или__builtin_ia32_pcmpeqw
. Кроме того, при использовании векторных расширений вы можете просто использовать оператор==
. См. документацию gcc. - person Jester   schedule 24.02.2014