同时使用SSE2内嵌函数和gcc内联汇编

7

我曾尝试在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个回答

11

你应该让编译器进行寄存器分配。这里是一个示例,使用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"),则会出现有时可以工作,有时不能工作的情况。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接