以下是带有3级流水线的arm Cortex M4处理器的说明。我们如何知道这些指令的流水线补充周期数???
Assembler Cycles
1. MOV PC, Rm 1 + P
2. ADD PC, PC, Rm 1 + P
3. B <label> 1 + P
4. BL <label> 1 + P
根据数据表P是管道补充所需的循环次数。其范围从1到3,具体取决于目标指令的对齐和宽度,以及处理器是否能够尽早推测地址。
答案 0 :(得分:4)
问题的答案就在那里:1至3个周期,取决于事物。即使在像Cortex-M4这样相对简单的东西上,也有足够的因素指出一些硬性规则并不一定可能(或有用)。但是,根据现有信息,我们不能做一些推理:
取决于目标指令的对齐和宽度
Instruction fetches are 32 bits wide,因此可以相当安全地假设3周期最坏情况涉及半字对齐的32位目标指令,在整个指令可被解码之前需要2次取指令。因此,有可能在一个较少的周期内达到一个16位目标指令或一个字对齐的32位指令,由一次指令读取覆盖。
以及处理器是否设法提前推测地址
鉴于上述情况,似乎合理的是,成功的分支预取和不成功的预取之间的差异占最佳情况和最差情况之间的2个周期中的另一个。似乎没有关于the branch predictor的大量信息,但我认为它是管道解码阶段的简单静态预测器,在这种情况下它是可能不预测寄存器分支(包括PC写入)和条件转发分支的情况,并且预测无条件立即分支和条件反向分支。
现在,这只是受过教育的猜测 - 我不知道ARM微体系结构的秘密,所以可能会有比我想象的更微妙的细节,但它已经是足够复杂。我怀疑是否有人愿意选择反汇编代码,对所有可能的分支/目标组合进行交叉引用,只需在这里和那里考虑2个周期 - 如果你真的需要知道一段代码执行了多少个周期,那么最好的办法就是execute it and count the cycles。