arm指令的流水线再填充周期

Pipeline refill cycles for instructions in arm

以下是arm Cortex M4处理器的3级指令pipeline.How我们知道这些指令的流水线填充周期数吗?

     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。

答案就在问题中:1 到 3 个周期取决于 事物。即使在像 Cortex-M4 这样相对简单的东西上,也有足够多的因素使它不一定可能(或有用)指定一些硬性规定。然而,这并不是说我们不能根据现有信息进行一些推理:

depending on the alignment and width of the target instruction

Instruction fetches are 32 bits wide,因此可以相当安全地假设 3 周期最坏情况涉及半字对齐的 32 位目标指令,需要 2 次取指才能解码整个指令。那么,一条 16 位目标指令或一条字对齐的 32 位目标指令(由单个指令获取覆盖)可能会在更少的周期内完成。

and whether the processor manages to speculate the address early

鉴于上述情况,成功的分支预取和不成功的分支预取之间的差异解释了最好情况和最坏情况之间的 2 个周期中的另一个似乎是合理的。关于 the branch predictor 似乎没有太多可用信息,但我假设它是管道解码阶段的一个简单静态预测器,在这种情况下它是 可能 不预测寄存器分支(包括PC写)和条件前向分支,预测无条件立即分支和条件后向分支的情况。

现在,这只是有根据的猜测 - 我不知道 ARM 微体系结构的秘密,所以这里可能有比我想象的更多的微妙之处,但它已经足够复杂了。我怀疑有人会关心通过反汇编代码进行选择,交叉引用所有可能的 branch/target 组合,只是为了在这里和那里解释 2 个周期——如果你真的需要知道一段代码执行了多少个周期, 那么最好的办法就是 execute it and count the cycles.