管道加注循环,用于手臂中的说明

Man*_*aur 3 assembly arm pipeline instruction-set

以下是具有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
Run Code Online (Sandbox Code Playgroud)

根据数据表,P是管道重新填充所需的循环数。根据目标指令的对齐方式和宽度,以及处理器是否设法尽早推测地址,该范围为1到3。

Not*_*hat 5

答案就在问题所在:1到3个循环之间,具体取决于事物。即使在像Cortex-M4这样相对简单的事物上,也有足够多的因素表明不一定要(或有用)指定一些严格的规则。但是,这并不是说鉴于可用信息我们无法做一些推理:

取决于目标指令的对齐方式和宽度

指令提取为32位宽,因此可以很安全地假设3周期最坏情况涉及与半字对齐的32位目标指令,需要进行2次指令提取才能对整个指令进行解码。因此,有可能在一个更少的周期内达到16位目标指令或一个单字取指所覆盖的字对齐的32位指令。

以及处理器是否设法尽早推测地址

鉴于以上所述,那么合理的分支预取成功与不成功之间的差异似乎是造成最佳情况与最坏情况之间的两个周期中另一个周期的原因。似乎没有太多有关分支预测器的信息,但我认为它是管道解码阶段中的简单静态预测器,在这种情况下,可能是寄存器分支(包括PC写入)和条件寄存器的情况。不预测前向分支,并且预测无条件立即分支和有条件后向分支。

现在,这只是有根据的猜测-我不知道ARM微体系结构的秘密,因此可能比我在这里想象的要细微得多,但已经足够复杂了。我怀疑有人会介意反汇编代码,对所有可能的分支/目标组合进行交叉引用,只是为了在这里和那里解决2个周期-如果您确实需要知道一段代码执行了多少个周期,那么最好的办法就是执行它并计算周期