Assembly X86操作码将xmm寄存器移动到通用寄存器

Assembly X86操作码将xmm寄存器移动到通用寄存器,assembly,x86,nasm,Assembly,X86,Nasm,将xmm0寄存器移动到eax和edx的短x86指令序列是什么?您需要xmm0的哪些部分 movd eax, xmm0 pextrd edx, xmm0, 1 ; SSE4.1 将xmm0的低位64位获取到edx:eax。如果您需要所有4个部分,考虑存储到内存和重新加载:存储转发到负载具有更多的等待时间,但吞吐量比洗牌(更少的总UOP)更好,特别是如果您可以将它们用作内存源操作数而不是仅使用代码> MOV > (但是如果你想要一个水平和或什么,通常像pshufd/padd两次

将xmm0寄存器移动到eax和edx的短x86指令序列是什么?

您需要xmm0的哪些部分

movd     eax, xmm0
pextrd   edx, xmm0, 1    ; SSE4.1
将xmm0的低位64位获取到
edx:eax
。如果您需要所有4个部分,考虑存储到内存和重新加载:存储转发到负载具有更多的等待时间,但吞吐量比洗牌(更少的总UOP)更好,特别是如果您可以将它们用作内存源操作数而不是仅使用代码> MOV >

(但是如果你想要一个水平和或什么,通常像
pshufd
/
padd
两次,将4个元素减少到2,然后再减少到1。尽管
movdeax,xmm0
/
movdqa[esp],xmm0
存储和3个标量
添加eax,[esp+4/8/12]
在这种情况下,对于总UOP或延迟来说,这实际上并不坏,这与标量FP不同,标量FP的延迟更高,并且您希望结果是XMM reg。)


在64位代码中,
movq-rax,xmm0
/
shld-rdx,rax,32
可能优于
pextrd
,并且不需要SSE4.1

更普通的
mov-rdx,rax
/
shr-rdx,32
可能比SHLD更高效,即使它在英特尔CPU上的成本更高<代码>shld在AMD CPU上速度较慢,在Zen上速度为8 UOP。()

BMI2
rorx rdx,rax,32
是一种很好的复制和移位方法,在所有支持它的CPU上都很有效。当然,它会使RDX的高半部分可能不为零,但这很好

另一种选择是
movd
/
movq
,如果您在他们竞争的单个端口的吞吐量方面没有接近瓶颈。在大多数CPU上,它们实际上不能并行运行,因此movd/movq竞争一个端口仍然需要第二个端口的延迟。在具有mov消除功能的现代CPU上(Zen或IvyBridge),
mov rdx、rax
零延迟更好。但这确实会将EAX和EDX zero中的值扩展为RAX和RDX

    movq  rdx, xmm0
    movd  eax, xmm0       ; or schedule this first if you can use EAX right away
    shr   rdx, 32
有关指令集引用和其他内容,请参见标记wiki


有关使用哪些说明的提示,请参阅。

您想要xmm0的哪些部分

movd     eax, xmm0
pextrd   edx, xmm0, 1    ; SSE4.1
将xmm0的低位64位获取到
edx:eax
。如果您需要所有4个部分,考虑存储到内存和重新加载:存储转发到负载具有更多的等待时间,但吞吐量比洗牌(更少的总UOP)更好,特别是如果您可以将它们用作内存源操作数而不是仅使用代码> MOV >

(但是如果你想要一个水平和或什么,通常像
pshufd
/
padd
两次,将4个元素减少到2,然后再减少到1。尽管
movdeax,xmm0
/
movdqa[esp],xmm0
存储和3个标量
添加eax,[esp+4/8/12]
在这种情况下,对于总UOP或延迟来说,这实际上并不坏,这与标量FP不同,标量FP的延迟更高,并且您希望结果是XMM reg。)


在64位代码中,
movq-rax,xmm0
/
shld-rdx,rax,32
可能优于
pextrd
,并且不需要SSE4.1

更普通的
mov-rdx,rax
/
shr-rdx,32
可能比SHLD更高效,即使它在英特尔CPU上的成本更高<代码>shld在AMD CPU上速度较慢,在Zen上速度为8 UOP。()

BMI2
rorx rdx,rax,32
是一种很好的复制和移位方法,在所有支持它的CPU上都很有效。当然,它会使RDX的高半部分可能不为零,但这很好

另一种选择是
movd
/
movq
,如果您在他们竞争的单个端口的吞吐量方面没有接近瓶颈。在大多数CPU上,它们实际上不能并行运行,因此movd/movq竞争一个端口仍然需要第二个端口的延迟。在具有mov消除功能的现代CPU上(Zen或IvyBridge),
mov rdx、rax
零延迟更好。但这确实会将EAX和EDX zero中的值扩展为RAX和RDX

    movq  rdx, xmm0
    movd  eax, xmm0       ; or schedule this first if you can use EAX right away
    shr   rdx, 32
有关指令集引用和其他内容,请参见标记wiki


有关使用说明的提示,请参阅。

除非必要,否则不要在不同域之间移动。除非必要,否则不要在不同域之间移动。查找x86上xmm0中64位双精度的位(32位)。@tgiphil:好的,我猜的是低64位。你为什么不接受这个答案?您是否需要一个32位的SSE2版本,使用向量移位或洗牌将另一个
movd
的第二个字向下移动到元素0?在没有SSE4.1的x86上有没有办法做到这一点?@tgiphil:
pshufd
+
movd
,或者任何其他方便的洗牌,将您想要的元素设置为低64位或32位。希望从x86(32位)上xmm0的64位双精度中获取位。@tgiphil:好的,低64位是我猜的。你为什么不接受这个答案?您是否需要一个32位的SSE2版本,使用向量移位或洗牌将另一个
movd
的第二个字向下移动到元素0?在没有SSE4.1的x86上有什么方法可以做到这一点?@tgiphil:
pshufd
+
movd
,或任何其他方便的洗牌将您想要的元素调到低位64或32位。