某些AMD64 / x86命令期望立即值为操作数(例如imm8)。是否可以使用存储在某个寄存器中的值(例如啊)而不是这个硬编码值?
例如:
如果我想移动xmm寄存器,则有pslldq-command:
PSLLDQ xmm1, imm8
我必须将它移位n次(其中n存储在寄存器中)。没有条件跳转是否可以做到?
答案 0 :(得分:1)
如果部分长度相等,您可以将跳转表或索引分支用于重复的代码部分。
答案 1 :(得分:1)
您可以使用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]
但这可能会受到商店转发失败的影响,这可能需要十几个周期。
答案 2 :(得分:0)
x86下没有指令(暂时)。 但你可以用硬核方式做:
mov cl, n ;n as shift count number from 0 to 31
mov byte ptr[@_PSLLDQ + 4], cl ;overwrite last byte of instruction
mfence ;ensure that intruction is globally visible
@_PSLLDQ:
PSLLDQ xmm1, 0
并且你的代码库必须启用写访问权。