我有 2 个变量来模拟 X86 XMM 和 YMM,如下所示:
uint64_t xmm_value[2];
uint64_t ymm_value[4];
现在我想使用内联汇编来读取和写入 XMM/YMM 寄存器。
- 如何编写GCC内联汇编来复制
xmm_value
注册XMM0
?
- 如何编写GCC内联汇编来复制寄存器
YMM0
to 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的下半部分,那么这段代码还可以改进吗?