同时使用SSE2内在函数和gcc内联汇编程序

时间:2012-01-27 21:33:09

标签: gcc sse inline-assembly intrinsics

我试图在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

谢谢:)

1 个答案:

答案 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"意味着输出),你会遇到有时有效但有时无效的情况。