是否可以构造跳转到 SIMD 寄存器的x86_64操作码



今天早上我有一个有趣的想法。我想知道是否可以构建到存储在 SIMD 寄存器(如 XMM0(中的地址的无条件跳转。显然,它不应该是,我从未见过编译器这样做,但我想知道是否有可能将一个操作码放在一起。

现在我的意思不是说在 SIMD 寄存器中做一些算术,将其移动到通用寄存器,然后说

JMP EAX

我想做的是,弄清楚是否有一个可接受的X86_64操作码可以做类似的事情

JMP XMM0

当然,不知何故,你只需要抓住寄存器的前半部分。这一切都可能是不可能的,但我很好奇它是否是或确切为什么不能做到。

这样的指令不存在。唯一jmp说明是:

EB cb        JMP rel8         jump short
E9 cw/cd     JMP rel16/32     jump near
FF /4        JMP r/m16/32/64  jump near indirect
EA cd/cp     JMP ptr16:16/32  jump far
FF /5        JMP m16:16/32    jump far indirect
REX.W FF /5  JMP m16:64       jump far indirect

这些指令中的每一个要么跳转到即时、通用寄存器或内存操作数中给出的地址。不能使用 SSE 寄存器。

还有许多其他指令可用于跳转,例如ret,但它们都不支持跳转到SSE寄存器。

虽然它确实会通过内存并且从技术上讲是 3 条指令,但您可能会争辩说48 8D 64 24 F8 66 0F D6 04 24 C3实际上是一个jmp xmm0操作码。当然只是

lea rsp, [rsp-8]
movq [rsp], xmm0
ret

这可能属于您的排除范围,但它不会破坏任何寄存器或标志,因此如果这是您的原因,这应该有效。

如果您有可用的红色区域,您可以这样做

movq [rsp-8], xmm0
jmp [rsp-8]

相反。

最新更新