2012-12-30 117 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' –