QEMU Branch and Exchange (arm thumb) 指令没有被调用
QEMU Branch and Exchange (arm thumb) instruction doesn't get called
所以我正在测试一个带有 QEMU 后端的 arm 模拟器的变化,我的微基准测试没有被分支和交换指令触发。
无论如何我想我会先用手检查这些位
所以:
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 部分中的解码表来确认这一点。
所以我正在测试一个带有 QEMU 后端的 arm 模拟器的变化,我的微基准测试没有被分支和交换指令触发。
无论如何我想我会先用手检查这些位
所以:
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 部分中的解码表来确认这一点。