我有2个变量来模拟X86 XMM和YMM,如下所示:
uint64_t xmm_value[2];
uint64_t ymm_value[4];
现在,我想使用内联汇编对XMM / YMM寄存器进行读写。
xmm_value
复制到注册XMM0
?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的下半部分,因此仍可以改进此代码吗?
答案 0 :(得分:2)
第一步是#include <immintrin.h>
,其中包括所需类型的所有定义以及用于访问所有MMX / SSE / AVX指令的所有Intel Intrinsics。在大多数情况下,您希望使用这些内在函数而不是内联汇编,因为它们更清晰,更便于移植,但是如果您确实想使用内联汇编,则可以使用内在类型(__m64
,{{1} },__m128
,__m128d
等)和__m256
约束来绑定到正确类型的xmm / ymm寄存器。