Вы должны позволить компилятору выполнить присваивание регистра.Вот пример pshufb
(для gcc
слишком стар, чтобы иметь tmmintrin
для SSSE3):
static inline __m128i __attribute__((always_inline))
_mm_shuffle_epi8(__m128i xmm, __m128i xmm_shuf)
{
__asm__("pshufb %1, %0" : "+x" (xmm) : "xm" (xmm_shuf));
return xmm;
}
Обратите внимание на квалификатор "x"
в аргументах и просто %0
в самой сборкегде компилятор подставит в выбранный им регистр.
Будьте осторожны, чтобы использовать правильные модификаторы."+x"
означает, что xmm
является одновременно входным и выходным параметром.Если вы неаккуратны с этими модификаторами (например, используете "=x"
, что означает вывод только тогда, когда вам нужно "+x"
), вы столкнетесь с ситуациями, когда иногда это работает, а иногда нет.