2012-12-30 313 views
2

如何將12添加到寄存器xmm0(double)?在x86中向xmm寄存器添加恆定值

我能做到這樣,但肯定必須有一個更簡單的方法:

 
movsd xmm0, [ecx] 

xor eax, eax 
inc eax 
cvtsi2sd xmm1, eax 
addsd xmm0, xmm1 

movsd [ecx], xmm0 

也纔有可能與浮點指令的x87做到這一點?

這並沒有爲我工作:

 
fld dword ptr [ecx] 
fld1 
faddp 
fstp dword ptr [ecx] 

回答

9

可以保持恆定的內存或另一個寄存器:

_1  dq  1.0 

addsd xmm1,[_1] 

movsd xmm0,[_1] 
addsd xmm1,xmm0 

如果你在x64上,你可以這樣做:

mov  rax,1.0 
movq xmm0,rax 
addsd xmm1,xmm0 

或使用堆棧如果類型不匹配困擾你:

mov  rax,1.0 
push rax 
movsd xmm0,[rsp] 
pop  rax 
addsd xmm1,xmm0 

至於的x87代碼,double s爲qwords,不是dwords

+0

'movsd xmm0,[esp]'或'movsd xmm0,[rsp]'? –

+0

好點,可能意味着rsp,因爲我們正在談論x64。 –

+1

無論如何,使用堆棧的建議是非常糟糕的,並且不會避免令人驚訝地使用'double'常量作爲'mov r64,imm64'的操作數。如果你想避免這種情況,建議'mov eax,1' /'cvtsi2sd xmm0,eax' –