同时使用 SSE2 内在函数和 gcc 内联汇编器
我尝试在 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
谢谢:)
I have tried to mix SSE2 intrinsics and inline assembler in gcc. But if I specify a variable as xmm0/register as input then in some cases I get a compiler error. Example:
#include <emmintrin.h>
int main() {
__m128i test = _mm_setzero_si128();
asm ("pxor %%xmm0, %%xmm0" : : "xmm0" (test) : );
}
When compiled with gcc version 4.6.1 I get:
>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
The strange thing is that in same cases where I have other input variables/registers then it suddenly works with xmm0 as input but not xmm1, etc. And in another case I was able to specify xmm0-xmm4 but not above. A little confused/frustrated about this :S
Thanks :)
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
您应该让编译器完成寄存器分配。以下是
pshufb
的示例(对于gcc
来说太旧了,无法为 SSSE3 提供tmmintrin
):请注意
"x"
参数上的限定符和程序集本身中的简单%0
,编译器将在它选择的寄存器中替换。小心使用正确的修饰符。
"+x"
表示xmm
既是输入参数又是输出参数。如果你不小心使用这些修饰符(例如,使用"=x"
表示仅在需要"+x"
时输出),你会遇到有时有效有时有效的情况没有。You should let the compiler do the register assignment. Here's an example of
pshufb
(forgcc
too old to havetmmintrin
for SSSE3):Note the
"x"
qualifier on the arguments and simply%0
in the assembly itself, where the compiler will substitute in the register it selected.Be careful to use the right modifiers.
"+x"
meansxmm
is both an input and an output parameter. If you are sloppy with these modifiers (eg using"=x"
meaning output only when you needed"+x"
) you will run into cases where it sometimes works and sometimes doesn't.