1. 指令緩存
- 指令緩存本質上是一個FIFO, 它能夠將指令按照程序中指定的順序存儲起來,這樣指令在解碼的時候,仍然可以按照程序中指定的順序進行解碼。指令緩存是超標量處理器中必須的部件,其原因有兩個: 1. 每周期可以取指的個數大于每周期可以解碼指令的個數,這樣即使在I-Cache缺失的時候,指令緩存中仍然存在一些指令,不會引起流水線的暫停
- 有些復雜指令需要拆解成小的指令,因此需要指令緩存來緩存部分取出來的指令。
2. 指令譯碼完成的工作
- what type: 譯碼出指令是算術指令/訪存指令還是分支指令,方便送到不同的issue queue
- what operation: 當指令是算術指令時,進行何種算術指令,當時訪存指令時,是load還是store指令
- what resource: 譯碼出源寄存器和目的寄存器,rename要用
3. 常見指令的處理
3.1 分支指令
如果采用checkpoint的方式對分支預測失敗的場景進行狀態恢復,為了減少電路的復雜度,一般我們需要限制每周期內分支指令的個數,因此需要提前進行約束.
盡量提前檢測預測錯誤的情況,可以減少penalty。
3.2 乘累加指令
涉及3 src的指令,所以PRF的讀口個數會有影響
3.3 pre/post index指令
涉及 2 dst的指令,
pre-index : 對于load指令, 先更新存地址的寄存器值,然后用更新后的值索引內存 LDR W0, [X1, #12]
post-index: 先用寄存器的值索引內存,然后更新存放地址的寄存器值 LDR W0, [X1], #12
pre 和post針對的是啥時候更新X1的值
3.4 LDM/STM指令
這些涉及多個src和多個dst, 一般需要指令拆解