我将如何添加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]
您可以在内存或另一个寄存器中保留一个常量:
_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
。
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