我需要为项目分析不同的机器指令,因此我每次在大约 200 条指令的循环中运行一些指令(在 __asm__
中使用 .rept
> 指令)。我使用的处理器是 ARM Cortex-M4。我现在需要测试 ARM 的条件指令。如果我输入类似的内容
".rept 200\n\t"
"addeq r1, r1, r1\n\t"
".endr\n\t"
我明白了
Error: thumb conditional instruction should be in IT block -- `addeq r1,r1,r1'
现在,IT block 最多可以有 4 条指令,所以我能用它们做的最好的事情就是这样
".rept 200\n\t"
"ITTTT EQ\n\t"
".rept 4\n\t"
"addeq r1, r1, r1\n\t"
".endr\n\t"
".endr\n\t"
产生像这样的二进制文件
80003ae: bf01 itttt eq
80003b0: 1849 addeq r1, r1, r1
80003b2: 1849 addeq r1, r1, r1
80003b4: 1849 addeq r1, r1, r1
80003b6: 1849 addeq r1, r1, r1
但是,这样一来,五分之一的指令就不会是我想要分析的指令(在我采取的措施中造成一些噪音)。由于我听说 IT block 是由 Thumb-2 ISA 强制执行的,并且即使没有它们,完整的 ARM 也可以使用条件指令,所以我的问题是:我可以指示汇编器使用它们吗?此外,如果我没听错,Thumb-2 需要它们,有办法进一步减少“噪音”吗?(比 1/5 指令更好?)
谢谢!
编辑:我收到了很多有用的评论(谢谢!),但我意识到我错过了一些重要信息以更好地理解我的目标,对此我深表歉意。我正在尝试分析 CPU 的功耗,因此,如果 IT block “执行”与否(这是生成的二进制编码 ecc),那么它实际上会产生影响,而时钟周期需要的不是这里的重点。
我认为这意味着(如果我错了,请纠正我)即使 Thumb-2 巧妙地隐藏了 IT 模块的复杂性,我也应该看到功率差异,手头有万用表。
最佳答案
IT 指令使后续指令成为有条件的。您会发现,如果将其删除,说明将变成无条件的。这就是指令编码的工作原理。您可以将 IT block 视为一个或多个指令的前缀,修改它们的行为以可能不再设置标志并有条件地执行。如果删除前缀,执行将不再有条件。
对于基准测试,我会使用 IT block ,每个 block 包含一条指令,因为这是最常见的用例。一些 ARM 处理器有专门支持这种情况的解码器,将 IT 指令和后续条件指令解析为通常情况下的一个。
另一方面,Cortex-M4 会执行其他操作:如果前面的指令 (!) 是 16 位指令,则 IT 指令将被折叠到其中并在零周期内有效执行。这至少可以解决你测量16位条件执行情况下的测量问题。
您可以做的另一件事是使用不同大小的 IT block 运行基准测试,然后使用算术来计算 IT 指令花费的时间。然后您可以从总运行时间中删除该时间。一般来说,条件执行指令与无条件指令花费相同的时间,尽管可能存在异常(exception)(例如,控制传输指令或通过其他方式写入 PC 的指令)。
关于assembly - 我可以强制 Cortex-M4 ARM 处理器在 IT block 之外使用条件指令吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75474394/