某些AMD64 / x86命令期望立即数作为操作数(例如imm8)。是否可以使用存储在某个寄存器中的值(例如ah)代替该硬编码值?
例如:
如果要移位xmm寄存器,请使用pslldq命令:
PSLLDQ xmm1, imm8
我必须将其移位n次(其中n存储在寄存器中)。没有条件跳转就可以做到吗?
最佳答案
您可以使用pshufb
和查找表来模拟它。
shl eax, 4
pshufb xmm0, [lut + eax]
查找表将从(我认为)开始
00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
80 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E
80 80 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D
您还可以使用普通的旧的未对齐读取,而不使用“怪异的” :(未测试)
movdqa [temp + 16], xmm0
pxor xmm0, xmm0
movdqa [temp], xmm0
neg eax
movdqu xmm0, [eax + temp + 16]
但这可能会导致商店转发失败,这可能要花费十几个周期。