【问题标题】:Use both SSE2 intrinsics and gcc inline assembler同时使用 SSE2 内在函数和 gcc 内联汇编程序
【发布时间】:2012-02-20 20:37:29
【问题描述】:

我尝试在 gcc 中混合使用 SSE2 内在函数和内联汇编程序。但是,如果我将变量指定为 xmm0/register 作为输入,那么在 some 情况下,我会收到编译器错误。示例:

#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

谢谢:)

【问题讨论】:

    标签: gcc sse inline-assembly intrinsics


    【解决方案1】:

    您应该让编译器进行寄存器分配。这是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" 时输出),您将遇到有时有效有时无效的情况。

    【讨论】:

      猜你喜欢
      • 2012-02-07
      • 1970-01-01
      • 2011-12-20
      • 1970-01-01
      • 2012-10-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-14
      相关资源
      最近更新 更多