内联汇编代码以读取/写入XMM和YMM寄存器?

时间:2019-08-01 16:17:08

标签: gcc assembly sse inline-assembly

我有2个变量来模拟X86 XMM和YMM,如下所示:

uint64_t xmm_value[2];
uint64_t ymm_value[4];

现在,我想使用内联汇编对XMM / YMM寄存器进行读写。

  • 如何编写GCC内联汇编以将xmm_value复制到注册XMM0
  • 如何编写GCC内联汇编以将寄存器YMM0复制到ymm_value

我已经尝试搜索这样做的示例内联汇编,但是找不到任何好的答案。谢谢!


因此,在一些帮助下,我编写了这段代码,并编译成功。我将movups用于XMM,将vmovups用于YMM,如下所示。这是正确的,并且我仍然可以优化代码吗?

__m128 xmm0;
__m256 ymm0;

// write to XMM0, and read from YMM0
__asm__("movups %1, %%xmm0\n\t"
        "vmovups %%ymm0, %0"
        : "=m"(ymm0)
        : "m"(xmm0)
        : "xmm0", "ymm0");

更新2:这是我的完整代码(已添加vpbroadcastb)

__m128 xmm0;
__m256 ymm0;

// write to XMM0, and read from YMM0
__asm__("movups %1, %%xmm0\n\t"
        "vpbroadcastb %%xmm0, %%ymm0\n\t"
        "vmovups %%ymm0, %0"
        : "=m"(ymm0)
        : "m"(xmm0)
        : "xmm0", "ymm0");

这个想法是我想将xmm0(变量)复制到XMM0,然后运行vpbroadcastb,然后将YMM0中的结果复制到ymm0(变量)。现在我意识到XMM0是YMM0的下半部分,因此仍可以改进此代码吗?

1 个答案:

答案 0 :(得分:2)

第一步是#include <immintrin.h>,其中包括所需类型的所有定义以及用于访问所有MMX / SSE / AVX指令的所有Intel Intrinsics。在大多数情况下,您希望使用这些内在函数而不是内联汇编,因为它们更清晰,更便于移植,但是如果您确实想使用内联汇编,则可以使用内在类型(__m64,{{1} },__m128__m128d等)和__m256约束来绑定到正确类型的xmm / ymm寄存器。