Jen*_*zer 7 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) : );
}
Run Code Online (Sandbox Code Playgroud)
使用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
Run Code Online (Sandbox Code Playgroud)
奇怪的是,在我有其他输入变量/寄存器的相同情况下,它突然使用xmm0作为输入而不是xmm1等.而在另一种情况下,我能够指定xmm0-xmm4但不能在上面.对此有点困惑/沮丧:S
谢谢 :)
Ben*_*son 11
您应该让编译器执行寄存器分配.这是一个例子pshufb(对于SSSE3 gcc太旧了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;
}
Run Code Online (Sandbox Code Playgroud)
请注意"x"参数上的限定符,只需%0在程序集本身中,编译器将在其选择的寄存器中替换.
小心使用正确的修饰符. "+x"means xmm既是输入参数又是输出参数.如果你对这些修饰语很邋((例如,"=x"只在你需要的时候使用含义输出"+x"),你会遇到有时有效但有时无效的情况.
| 归档时间: |
|
| 查看次数: |
3368 次 |
| 最近记录: |