Assembly 在x86中向xmm寄存器添加一个常量值
如何将Assembly 在x86中向xmm寄存器添加一个常量值,assembly,x86,sse,x87,Assembly,X86,Sse,X87,如何将1或2添加到寄存器xmm0(双精度) 我可以这样做,但肯定有更简单的方法: movsd xmm0, [ecx] xor eax, eax inc eax cvtsi2sd xmm1, eax addsd xmm0, xmm1 movsd [ecx], xmm0 movsd xmm0,[ecx] 异或eax,eax 埃克斯公司 cvtsi2sd xmm1,eax addsd xmm0,xmm1 movsd[ecx],xmm0 是否也可以使用浮点x87指令执行此操作 这对我不起作用: fl
1
或2
添加到寄存器xmm0
(双精度)
我可以这样做,但肯定有更简单的方法:
movsd xmm0, [ecx]
xor eax, eax
inc eax
cvtsi2sd xmm1, eax
addsd xmm0, xmm1
movsd [ecx], xmm0
movsd xmm0,[ecx]
异或eax,eax
埃克斯公司
cvtsi2sd xmm1,eax
addsd xmm0,xmm1
movsd[ecx],xmm0
是否也可以使用浮点x87指令执行此操作
这对我不起作用:
fld dword ptr [ecx]
fld1
faddp
fstp dword ptr [ecx]
德沃德机场客运大楼[ecx]
fld1
faddp
fstp dword ptr[ecx]
您可以在内存或其他寄存器中保持常量:
_1 dq 1.0
及
或
如果您使用的是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的情况,
movsd xmm0,[esp]
或movsd xmm0,[rsp]
?使用堆栈的建议非常糟糕,并且不能避免意外使用double
常量作为mov r64,imm64
的操作数。如果您想避免这种情况,建议mov eax,1
/cvtsi2sd xmm0,eax
您也可以在xmm寄存器中生成1.0
,只需3条指令IIRC(从pcmpeqw
开始生成所有指令)。Agner Fog’s您能否指定这些AVX/SIMD指令需要哪些CPU扩展?这似乎不起作用。您将使用位模式0xffffffffffffffffff
减去双精度浮点,这是一个NaN,而不是-1。您缺少一个vcvtdq2pd xmm1,xmm1
int->FP转换来获得双-1.0
。或者,-1all
的单个左移位可能会创建右位模式,并在顶部设置连续位。请不要只发布代码作为答案,还要解释代码的作用以及如何解决问题。带解释的答案通常更有帮助,质量更好,更容易吸引选票。谢谢大家指出我的错误。我纠正了他们,所以我希望现在一切正常。所有指令均为AVX。
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
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