编辑“︁
RISC-V
”︁(章节)
跳转到导航
跳转到搜索
警告:
您没有登录。如果您进行任何编辑,您的IP地址会公开展示。如果您
登录
或
创建账号
,您的编辑会以您的用户名署名,此外还有其他益处。
反垃圾检查。
不要
加入这个!
=== 函數呼叫、跳躍和分支 === RISC-V 的函數呼叫 {{code|JAL}}(Jump and Link)把回傳地址放入一個暫存器。由於相較於其他把回傳地址存入堆疊的設計,它省下了一次對堆疊記憶體的存取,所以在許多的處理器設計中是比較快速的。 {{code|JAL}} 有一個 20-bit signed 位移。這個位移會被乘上 2 之後,加到 PC 當中,以產生指向 32 位元指令的相對位址。如果該位址沒有對齊到 32-bit 位址(即不可被 4 整除),CPU 會觸發一個[[异常处理|例外]]。 RISC-V 的 {{code|JALR}}(Jump and Link Register)指令與 {{code|JAL}} 相似,但是 {{code|JALR}} 是把一個 12-bit 的相對位移和某一個暫存器相加,而 {{code|JAL}} 是用 20-bit 的相對位移與 PC 相加。 {{code|JALR}} 的指令格式與使用暫存器的 load/store 指令相似。搭配另一個設定高位 20-bit 的基底暫存器,可以組成一個 32-bit 的地址(可以是絕對位址,例如 {{code|LUI}};或是相對於 PC 的位址,例如 {{code|AUIPC}})。(使用零暫存器當基底暫存器,則可以跳到 0 ± 2KB 的絕對位址) 透過使用零暫存器,兩種無條件跳躍:「20-bit PC 相對位址」以及「暫存器為底的 12-bit」,分別使用 {{code|JAL}} 與 {{code|JALR}} 兩個指令來實作。在這個情況下,因為目的地暫存器是零存器,所以回傳位址會被丟棄。 如同許多的 RISC 系統,在一個函數呼叫當中,RISC-V 編譯器必須使用多個指令將暫存器一個一個地存到堆疊當中,然後在函數結束的時候,一個一個地將暫存器自堆疊中還原。RISC-V 沒有「儲存多個」或是「還原多個」暫存器的指令,因為這些指令被認為會讓 CPU 變得過於複雜,而且可能更慢。<ref name="riscvc"/>然而 RISC-V 的這種設計會增加程式大小,而設計者原本的規劃是透過呼叫子程序來減少程式大小。<ref name="isacompressed"/> RISC-V 沒有{{link-en|條件碼暫存器|Status register}}。設計者相信條件碼暫存器會讓高速 CPU 的設計更加複雜,因為它強迫了不同執行階段的指令之間進行交互。這樣的設計會使得高精度計算變得更複雜,有些數值計算需要更多的能量。 相反地,RISC-V 透過比較兩個暫存器來實現分支,指令包括:相等、不相等、小於、無號數小於、大於、無號數大於。十種「比較分支」運算,可以透過反轉運算元順序的方式,只用上述六種指令實作出來。舉例來說:「如果大於時跳躍」可以用運算元順序相反的「如果小於或等於時跳躍」來實作。 這六種比較分支指令具有 12-bit 的有號位移,可以跳到 PC±4KB 的範圍內。 RISC-V 要求 CPU 實作「預設分支預測」(default branch prediction)。如果是往回跳躍 (例如:{{code|do {...} while (expr)}}中的 {{code|expr}} 判斷式),CPU 要預測跳躍會發生,也就是預測 {{code|expr}} 「會」成立。如果是向前跳躍(例如:{{code|if (expr) {...} else {...}}} 中的 {{code|else}} 部分),CPU 預測這個跳躍會發生,也就是預測 {{code|expr}} 「不會」成立。CPU 判斷往回或向前的方法,是看指令中相對位址的最高位元,也就是有號數(signed bit)的部分:如果是 1,表示是負數,要往回跳躍;如果是 0,表示是正數,要向前跳躍。當然,複雜的 CPU 實作也可以加入更多的分支預測。 RISC-V 手冊也建議軟體(如:編譯器)利用預設分支預測的特性,來避免分支造成 [[Pipelines|pipeline]] 被停滯。方法就是利用上一段提到的 signed bit 來「暗示」 CPU 這個分支會不會發生。所以,就是算是簡單又便宜的 CPU ,也可以透過編譯器來優化效能。如果有需要,編譯器也可以透過統計等方式來優化效能。 所以,為了避免不必要的分支預測電路(以及不必要的 pipeline 停滯),無條件跳躍不要用「比較分支」來實作。 RISC-V 並不支援「條件執行」指令(conditional execution,註:當某個條件成立的時候,才執行該指令)。設計者宣稱沒有這種設計的 CPU 比較容易設計,而且編譯器在進行優化的時候,也比較不容易假設錯誤。設計者宣稱高速又不照順序執行的 CPU 反正都會同時執行正反兩種結果,之後再丟棄其中一個。他們也宣稱,即使在簡單的 CPU 當中,條件執行其實是比較沒有價值的,不如跳躍預測來的有用。不使用條件執行的程式碼會比較大,但是他們宣稱壓縮指令集在大部分的情況下,可以解決這樣的問題。 許多的 RISC 設計都有「[[延迟间隙|分支延遲槽]]」(branch delay slot),用來充份使用跳躍指令的下一個記憶體位址,這可以略略增加整體的 CPU 效能。RISC-V 並不支援這個功能,因為他會讓多時序、超純量,以及 long pipeline 變得很複雜。而動態分支預測其實已經做得很好,可以不需要這個功能了。
摘要:
请注意,所有对Local Chinese Wikipedia的贡献均可能会被其他贡献者编辑、修改或删除。如果您不希望您的文字作品被随意编辑,请不要在此提交。
您同时也向我们承诺,您提交的内容为您自己所创作,或是复制自公共领域或类似自由来源(详情请见
Project:著作权
)。
未经许可,请勿提交受著作权保护的作品!
取消
编辑帮助
(在新窗口中打开)
导航菜单
个人工具
未登录
讨论
贡献
创建账号
登录
命名空间
页面
讨论
大陆简体
不转换
简体
繁體
大陆简体
香港繁體
澳門繁體
大马简体
新加坡简体
臺灣正體
查看
阅读
编辑
查看历史
更多
搜索
导航
首页
最近更改
随机页面
MediaWiki帮助
工具
链入页面
相关更改
特殊页面
页面信息