首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在ARM Cortex-M4中不同情况下的条件装配分支指令持续时间是什么?

在ARM Cortex-M4中不同情况下的条件装配分支指令持续时间是什么?
EN

Stack Overflow用户
提问于 2021-11-29 10:46:11
回答 1查看 382关注 0票数 2

我试图确定以下简单延迟循环在时钟周期中的确切持续时间:

代码语言:javascript
复制
loop:  subs        r2, r2, 1 
       bne         loop 

皮质-M4技术参考手册说:1+ P,其中P是:

管道再填充所需的循环次数。这范围从1到3,取决于目标指令的对齐方式和宽度,以及处理器是否能够尽早推测地址。

ARM9 (5级流水线)在本例中bne有3个周期,subs有1个循环.皮质M4有一个三级管道,但看起来很相似,因为前两个阶段是相同的.

所以我的问题是,根据参考手册,它可以是2到4个周期,对吗?什么时候是2,什么时候3,什么时候4?在一个三级管道中,至少有3个周期是合乎逻辑的,但似乎只有2个周期是可能的。是否涉及某种分支预测?

EN

回答 1

Stack Overflow用户

发布于 2021-11-30 19:50:29

Cortex-M4没有分支预测(至少在实际获取分支之前它将开始执行分支)。但是,它确实包含了一个预取单元(PFU),它从FIFO中的内存中获取下一个(连续的)指令,这样执行单元就可以直接访问它们。它还推测地从分支目标地址预取指令。这意味着,如果在第二个管道阶段已知(条件)分支目标,则将预取该内存地址。

Cortex-M4技术参考手册确实指出,分支指令的时钟周期数是1 + P,其中P是管道再填充所需的周期数。它还载有一个脚注,说明:

如果不接受条件分支,则条件分支在单个周期内完成。

因此,这意味着,分支指令本身的执行(即检查条件是真还是假)只需要一个时钟周期。如果条件为false,因此不接受分支,则执行单元可以直接继续执行下一条指令,该指令已经由PFU预取。

但是,如果条件为真,并且获得了分支,则必须对部分管道进行冲洗和重新加载。我无法确切地知道这将花费1周期还是3周期,但如果目标指令是16位对齐地址上的32位指令,则可能需要额外读取内存,因为内存总线是32位(因此“取决于目标指令的对齐方式和宽度”)。

我不完全确定“以及处理器是否能够提前推测地址”部分。我猜这是因为文档中的P也用于诸如MOV PC, Rm之类的指令,其中可能存在数据依赖关系,因为指令没有固定的偏移量(解码时Rm的值还不清楚)。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70153316

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档