[英]Assembler - Load value from register instead of Immediate value
一些AMD64 / x86命令期望立即值作為操作數(例如imm8)。 是否可以使用存儲在某個寄存器中的值(例如啊)而不是這個硬編碼值?
例如:
如果我想移動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]
但這可能會受到商店轉發失敗的影響,這可能會花費十幾個周期。
在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
而且你的代碼庫必須啟用寫訪問權限。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.