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

发布于 2024-12-31 21:39:23 字数 639 浏览 1 评论 0原文

我尝试在 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

半山落雨半山空 2025-01-07 21:39:23

您应该让编译器完成寄存器分配。以下是 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" 时输出),你会遇到有时有效有时有效的情况没有。

You should let the compiler do the register assignment. Here's an example of pshufb (for gcc too old to have tmmintrin for 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;
}

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" means xmm 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.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文