我需要为一个项目分析不同的机器指令,所以我在一个每次大约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块最多可以有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块是由Thumb-2 ISA强制执行的,而且整个ARM即使没有条件指令也可以使用,所以我的问题是:* * 我可以指示汇编程序使用它们吗?**此外,如果我没有听错,Thumb-2 * 需要 * 它们,是否有办法进一步减少"噪音"?(优于1/5指令?)
谢谢!
- 编辑:**我得到了很多有用的评论(谢谢!),但我意识到我错过了一些重要信息,无法更好地理解我的目标,我为此道歉。我正在尝试分析CPU的"功耗",因此IT块是否"执行"实际上会产生差异,这是产生的二进制编码等,而所需的时钟周期不是这里的重点。
我认为这意味着(如果我错了请纠正我),即使Thumb-2巧妙地隐藏了IT块的复杂性,我应该看到一个功率差异,万用表在手。
1条答案
按热度按时间jhkqcmku1#
IT指令使后续指令成为条件指令。你会发现,如果你删除它,指令就变成无条件指令。这就是指令编码的工作原理。你可以把IT块看作一个或多个指令的前缀,修改它们的行为,可能不再设置标志,而是有条件地执行。如果你删除前缀,执行就不再是有条件的。
对于基准测试,我会使用IT块,每个块有一条指令,因为这是最常见的用例。一些ARM处理器有一个解码器,专门支持这种情况,在通常情况下,将IT指令和后续的条件指令作为一条来解析。
另一方面,Cortex-M4还具有其他功能:如果前一条指令(!)是16位指令,则IT指令将合并到其中,并在零周期内有效执行。这至少可以解决测量16位条件执行的情况下的测量问题。
你可以做的另一件事是用不同大小的IT块运行基准测试,然后使用算术计算IT指令花费的时间。然后你可以从总运行时间中删除该时间。一般来说,有条件执行的指令与无条件执行的指令花费的时间相同,尽管可能有例外(例如,控制转移指令或通过其他方式写入PC的指令)。