Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 在x86中向xmm寄存器添加一个常量值_Assembly_X86_Sse_X87 - Fatal编程技术网

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