assembly 在ARM Cortex-M4中,不同情况下的条件汇编分支指令持续时间是多少?

idfiyjo8  于 2022-11-13  发布在  其他
关注(0)|答案(1)|浏览(430)

我尝试确定以下简单延迟环路的时钟周期的确切持续时间:

loop:  subs        r2, r2, 1 
       bne         loop

Cortex-M4 Technical Reference Manual表示:1 + P,其中P为:
管道重新填充所需的周期数。它的范围是1到3,具体取决于目标指令的对齐方式和宽度,以及处理器是否设法提前推测地址。
ARM9(5级流水线)对于bne有3个周期,对于subs有1个周期。Cortex-M4有一个3级流水线,但看起来非常相似,因为前两个阶段是相同的...
所以我的问题是:根据参考手册,它可以是2到4个周期,对吗?2什么时候是2,什么时候是3,什么时候是4?3级流水线中,至少有3个周期是合理的,但似乎只有2个周期也是可能的。2这里面是否包含了某种分支预测?

pbpqsu0x

pbpqsu0x1#

Cortex-M4没有分支预测功能(至少不是在实际执行之前就开始执行分支)。(PFU),它提取下一个(连续的)指令,因此执行单元可以直接访问它们。它还推测性地从分支目标地址预取指令。这意味着,如果在第二管线级中已知(条件)分支目标,那么将预取所述存储器地址。
《Cortex-M4技术参考手册》确实指出分支指令的时钟周期数为1 + P,其中P是管道重新填充所需的周期数。它还包含一个脚注,说明:
如果不执行分支,则条件分支在单个周期内完成.
因此,这意味着分支指令本身的执行(即,检查条件是否为真或假)仅花费一个时钟周期。如果条件为假并且因此分支未被采用,则执行单元可以直接继续执行下一个指令,该指令已经由PFU预取。
但是,如果条件为真,分支被执行,则必须刷新并重新加载流水线的一部分。我无法准确地判断何时需要1个周期,何时需要3个周期,但如果目标指令是16位对齐地址上的32位指令,则可能需要额外的内存读取。因为存储器总线是32位的(因此“* 取决于目标指令的对准和宽度 ”)。
我不太确定“
以及处理器是否能够提前推测地址 *”部分。我猜这是因为文档中的P也用于MOV PC, Rm之类的指令,其中可能存在数据相关性,因为该指令没有固定的偏移量(解码时尚不知道Rm的值)。

相关问题