章七至章九總結
1.這幾章多爲具體指令的實現,基本的原理沒有什麼變化,重複性很強,屬於一通百通型.
2.涉及到的一些概念:
乘加器: 在數字信號處理的濾波器、FFT、卷積及各種矢量運算中,由於要執行
Σb(n)*x(n - k) 一類的運算,這類運算的乘法和加法總是同時出現,因此DSP中就希望將乘法器和加法器相結合,在一個時鐘週期完成一次乘、加運算,並且累加乘法運算的結果。這樣的運算單元稱爲乘法累加器
流水線暫停機制:由於某些階段的指令需要不止一個時鐘週期來完成運算,這時候就需要暫停流水線,以等待指令完成.
3.實現除法:
試商法.移位和減法相結合.書上的方法和用筆算十進制除法的方式很相像.這一段我看了好幾遍.最後發現正確的理解思路是動手寫,把理論,流程圖理解下來,知道每一步爲什麼這樣做,然後去看代碼,就容易理解了.在其他地方,也叫作基於減法的除法器.
參見http://blog.csdn.net/rill_zhen/article/details/7961937
最簡單的方法:移位除法.
4.延遲槽.
這個概念已經很老了,有了分支預測之後,它的用處不大.
5.精確/非精確異常
在多發射亂序執行的流水線 CPU 上,從指令進入流水線到異常事件的發生,期間要經過若干流水級,此時 PC 的值已指向其後的某條指令,在實現非精確異常的 CPU 上就把此時的 PC 值作爲引起異常指令的所在(爲了表達的方便,記爲 eptr)。
簡單地說就是 eptr 的指向,並非真正的引起異常的指令之所在,而是其後面的某條指令所在。
引用:
簡單地說就是 eptr 的指向就是真正引起異常的指令之所在
而實現精確異常的 CPU,則在最後指令提交時 (commit) 按指令流的順序提交,異常的產生也在該指令提交時,這樣就能精確計算出引起異常的指令相對於當前 PC 的偏移,從而保證精確異常。
也就是說當異常產生時,之前的預備工作(即取指,譯碼,當然PC隨之增長)便被廢棄。CPU從異常中返回時,再重新做讀取和譯碼的工作。
總之,不管是何類異常,eptr 之前的所有指令都會被執行完成 (commit之後),eptr 之後的指令不會被執行。 來自http://blog.chinaunix.net/uid-26817832-id-3146408.html
6.load相關
概念:在加載數據之前,系統以錯誤的值做了運算.
解決方法: 在加載數據之前暫停流水線.
Key:判斷load相關
若上一條指令是加載指令,且加載指令要加載的寄存器就是當前指令要通過regfile端口讀取的值.則存在load相關,需要進行暫停流水線.