SSE2 movq xmm, xmm/m64
在32位代码的作品(在支持它的CPU)。你显示的代码已经使用了32位寻址模式,所以它在32位模式下不会改变。还有另一种形式的movq
只适用于64位模式,即movq xmm, r64/m64
。相同操作码的内存源形式,可让您执行movq xmm0, rax
。
但无论如何,32位SSE2:
movq xmm5, [esi+2h]
movq [edi+f1h], xmm5
如果你只能假设SSE1但不是SSE2,你可以使用movlps
;; xorps xmm5,xmm5 ; optional to break a dependency on old value
movlps xmm5, [esi+2h] ; merges into xmm5: false dependency
movlps [edi+f1h], xmm5
取决于你在做什么,它可能可能是值得的使用MMX,如果你有,但不是SSE1:
movq mm0, [esi+2h]
movq [edi+f1h], mm0
; emms required later, after a loop.
如果你真的想要一个单指令64位加载/存储so it's atomic (on P5 and later)对齐地址,那么fild
/fistp
是一个不错的选择。 (海湾合作委员会将此用于std::atomic<int64_t>
与-m32 -mno-sse
。)
它永远不会将您的数据淹没unless you (or MSVC++'s CRT) have the x87 precision bits set to less than a 64-bit mantissa。
fild qword ptr [esi+2h]
fistp qword ptr [edi+f1h]
fild
/fistp
甚至可能有更好的吞吐量拷贝零散的64位块比使用32位整数,加载/存储,至少在现代的CPU。对于32或64字节或更大的连续副本,请使用rep movsd
。 (一般为rep movsd
的阈值是值得的高得多,但我们不SIMD矢量谈论和仅32位整数或64位fild
/fistp
多UOP加载/存储指令。)
使用普通整数,只需选择一个可以打开的寄存器即可。 (或者在MSVC内联汇编,让编译器担心保存它。)如果寄存器是紧张,只能使用一个(如果你的SRC和DST已知不重叠):
mov eax, [esi+2h]
mov [edi+f1h], eax
mov eax, [esi+2h + 4] ; write the +4 separately in the addressing mode as documentation
mov [edi+f1h + 4], eax
如果你能抽出2个寄存器,那么是的,这可能会更好地做两个负载,然后两个商店。
你为什么不试试比较两者的结果? –
我认为[this](http://www.x86-64.org/documentation/assembly.html)会有帮助。如果不是那么抱歉) –
我试过比较两个结果,但是当我使用我的时候发生崩溃提供了片段。 – user3475849