QEMU Branch and Exchange (arm thumb) 指令没有被调用

QEMU Branch and Exchange (arm thumb) instruction doesn't get called

所以我正在测试一个带有 QEMU 后端的 arm 模拟器的变化,我的微基准测试没有被分支和交换指令触发。

我关心的特定块: https://github.com/qemu/qemu/blob/19b599f7664b2ebfd0f405fb79c14dd241557452/target/arm/translate.c#L11748

无论如何我想我会先用手检查这些位

所以:

insn = (0b010001 << 10)

将等于: 100010000000000

所以如果那是命中 switch 语句:

 switch (insn >> 12)

我们会得到:4。到目前为止一切正常。

我们先检查if (insn & (1 << 11)) 那是 0 仍然很好我们继续下一个条件 if (insn & (1 << 10)) returns 1024 所以我们走分支。 这是事情开始变得毛茸茸的地方。

我们

op = (insn >> 8) & 3;
switch (op)

分行代码为案例3 但 (0b100010000000000 >> 8) & 3 将为 0: 更清楚地说 0b1000100 & 0b11 根本不排队。

我在这里错过了什么?这是一个错误吗?

0100010000000000(即 0b010001 << 10)不是 Thumb BX 指令,这就是为什么如果您将它输入解码器,它就不会进入 BX 的代码路径。正如代码中的注释所说,BX 和 BLX insns 是 0b0100_0111_xxxx_xxxx。 0100010000000000 是寄存器-寄存器 ADD 指令。

您可以通过查看 v7A Arm ARM(DDI0406C.c,可在 https://developer.arm.com/docs/ddi0406/c/arm-architecture-reference-manual-armv7-a-and-armv7-r-edition 获得),尤其是 A6.2 部分中的解码表来确认这一点。