在与masm for ml64一起使用时,我试图将两个无符号qword从r9和r10移动到xmm0作为一个无符号128b int。
到目前为止,我想到了以下代码:
mov r9, 111 ;low qword for test
mov r10, 222 ;high qword for test
movq xmm0, r9 ;move low to xmm0 lower bits
movq xmm1, r10 ;move high to xmm1 lower bits
pslldq xmm1, 4 ;shift xmm1 lower half to higher half
por xmm0, xmm1 ;or the 2 halves together
我认为它有效的原因是:
movq rax, xmm0
返回正确的低值
psrldq xmm0, 4
movq rax, xmm0
返回正确的高值。
问题是,有没有更好的方法?我正在浏览英特尔指令集指南,但我不太擅长猜测可能存在的指令名称。
PINSRQ
是什么意思? - Jester_mm_set_epi64x
不应存储/重新加载以用于-mtune=haswell,Zen应避免存储/重新加载,通用应考虑此问题。另外相关:https://gcc.gnu.org/bugzilla/show_bug.cgi?id=80833 - Peter Cordes