如何将1
或2
添加到注册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]
答案 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代码,double
是qwords
,而不是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