某些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]


但这可能会导致商店转发失败,这可能要花费十几个周期。

10-08 04:58