将常量值添加到x86中的xmm寄存器

时间:2012-12-30 04:08:13

标签: assembly x86 sse x87

如何将12添加到注册xmm0(双倍)?

我可以这样做,但肯定必须有一个更简单的方法:

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]

2 个答案:

答案 0 :(得分: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代码,doubleqwords,而不是dwords

答案 1 :(得分:0)

vpcmpeqq  xmm1,xmm1,xmm1          ; xmm1 = [ -1 | -1 | -1 | -1 ] as ints
vmovsd    xmm0,dword ptr [ecx]    ; xmm0 = VALUE as int
vsubsd    xmm0,xmm0,xmm1          ; xmm0 = VALUE - (-1) = VALUE + 1

以上应该是

vpcmpeqq  xmm1,xmm1,xmm1          ; xmm1 = [ -1 | -1 | -1 | -1 ] as ints
vmovd     xmm0,dword ptr [ecx]    ; xmm0 = VALUE as int
vpsubd    xmm0,xmm0,xmm1          ; xmm0 = VALUE - (-1) = VALUE + 1

对于整数递增 1 和

vpcmpeqq  xmm1,xmm1,xmm1          ; xmm1 = [ -1 | -1 ] as quads
vmovsd    xmm0,dword ptr [ecx]    ; xmm0 = VALUE as double
vcvtdq2pd xmm1,xmm1               ; xmm1 = [ -1.0 | -1.0 ] as doubles
vsubsd    xmm0,xmm0,xmm1          ; xmm0 = VALUE - (-1.0) = VALUE + 1.0

双倍递增 1.0