我试图在gcc中混合使用SSE2内在函数和内联汇编程序。但是,如果我将变量指定为xmm0 / register作为输入,那么在一些情况下,我会收到编译器错误。例如:
#include <emmintrin.h>
int main() {
__m128i test = _mm_setzero_si128();
asm ("pxor %%xmm0, %%xmm0" : : "xmm0" (test) : );
}
使用gcc版本4.6.1编译时,我得到:
>gcc asm_xmm.c
asm_xmm.c: In function ‘main’:
asm_xmm.c:10:3: error: matching constraint references invalid operand number
asm_xmm.c:7:5: error: matching constraint references invalid operand number
奇怪的是,在我有其他输入变量/寄存器的情况下,它突然使用xmm0作为输入而不是xmm1等。而在另一种情况下,我能够指定xmm0-xmm4但不能在上面。对此有点困惑/沮丧:S
谢谢:)
答案 0 :(得分:11)
您应该让编译器执行寄存器分配。以下是pshufb
的示例(gcc
太旧而无法为SSSE3提供tmmintrin
):
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"
意味着输出),你会遇到有时有效但有时无效的情况。