4

我将如何添加1或添加2到寄存器xmm0(双)?

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

movsd xmm0, [ecx]

xor eax, eax
公司
cvtsi2sd xmm1, eax
添加 xmm0, xmm1

movsd [ecx], xmm0

也可以用浮点x87指令来做到这一点吗?

这对我不起作用:

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

2 回答 2

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 代码,doubles 是qwords, 不是dwords

于 2012-12-30T05:36:12.900 回答
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

于 2021-04-10T13:46:08.160 回答