精確異常與非精確異常
非精確異常 (Imprecise Exception)
在多發射亂序執行的流水線 CPU 上,從指令進入流水線到異常事件的發生,期間要經過若干流水級,此時 PC 的值已指向其後的某條指令,在實現非精確異常的 CPU 上就把此時的 PC 值作為引起異常指令的所在(為了表達的方便,記為 eptr)。
簡單地說就是 eptr 的指向,並非真正的引起異常的指令之所在,而是其後面的某條指令所在。
精確異常 (Precise Exception)
簡單地說就是 eptr 的指向就是真正引起異常的指令之所在
而實現精確異常的 CPU,則在最後指令提交時 (commit) 按指令流的順序提交,異常的丟擲也在該指令提交時,這樣就能精確計算出引起異常的指令相對於當前 PC 的偏移,從而保證精確異常。
不管是何類異常,eptr 之前的所有指令都會被執行完成 (commit),eptr 之後的指令不會被執行。
關於 eptr 的值,在 MIPS 上用 EPC 置之,在 PowerPC 上用 SRR0/CSRR0 置之,SPARC 上用 TPC[TL] 置之,x86 上當前 CS:EIP 即是,但 x86 將 CS:EIP 保存於棧上。
題外話:
關於 eptr 的指向,還有一些情形值得考慮:
A. 位於延遲槽中的指令 (MIPS, SPARC)
B. 由分支指令引起 (x86)
C. 上下文切換時 (x86)