RISC V精簡到何種程度?

2021-08-15 17:06:54 字數 1866 閱讀 7360

risc-v作為最新設計的精簡指令集計算機體系,那麼其精簡到什麼程度呢?

mingdu.zhengatgmail dot com

先來看看指令格式,這格式規律地一塌糊塗啊,看著這張圖,我的強迫症瞬間消失了。有規律的指令編碼不僅是讓強迫症患者舒服,也讓處理器很舒服,指令越有規律,解碼器所要的gate越少,晶元面積越小,執行速度越快。

只有addi沒有subi,減法怎麼辦?無論是數學上還是程式上,x - y都等價於x + (-y),也就是說可以把減法變成加法的,把被減數轉成負數然後再加上減數就實現了和減法一樣的功能了。正是基於這個原理,risc-v只提供立即數加法,沒有提供立即數減法,如果需要立即數減法,那麼就要麻煩編譯器把這個立即數轉化成負數,然後繼續使用加法。這也是risc-v將立即數作為有符號數處理的原因吧。

通過引入x0暫存器,很多特殊指令用普通的指令加上x0做運算元就給解決了。指令的數量大大降低,指令數降低了,這處理器的解碼電路不就簡化了嘛。有關x0暫存器的內容可以參考《牽手risc-v:x0暫存器》

之前用arm的處理器,arm都是將立即數表示不下的常量存到常量池,然後用pc相關的ldr指令載入到暫存器的。risc-v的常量完全是用指令拼接的,不需要load指令,要知道使用load指令是需要額外的訪問週期的。risc-v單條指令可以表示12位的有符號常量,超過12位需要兩條指令來合成。其中一條指令是luilui指令載入常量的高20位,低12位可以用addi指令加上去,當然了這個過程又要麻煩編譯器仔細算一算立即數到底是什麼了,因為addi指令執行的是有符號加法,其中的12位立即數是會先被符號擴充套件成32位的有符號數再參與計算的。arm的常量載入需要8個位元組,一條指令+乙個常量;risc-v的常量載入也是需要8個位元組,兩條指令。占用的程式空間是一樣的。

risc-v的比較跳轉指令只有bltbge,即只有小於和大於等於。那大於和小於等於就不需要了嗎?也是需要的,不過risc-v用了個很巧妙的辦法,將blt的兩個參與比較的運算元位置換一下,就有了bgt,將bge的兩個參與比較的運算元位置換一下,就有了ble。真是個好辦法。用兩條指令實現了四條指令的工作,其中兩條是偽指令,實際的指令只有兩條。

我對risc的理解就是:處理器盡量少做,讓編譯器盡量多做。這是非常有道理的,畢竟編譯的次數遠少於執行的次數啊。上面幾個段落就提到不少要讓編譯器多做的工作,再例舉個為了簡化處理器的設計而讓編譯器多做的工作。

b-type是比較跳轉指令的格式,j-type是長跳轉或函式呼叫指令格式,注意它們的立即數排列次序,我都有點同情編譯器設計師了,這怎麼搞啊?具體一點講,填充這裡的立即數的應該是鏈結器的工作。這麼排放偏移位址立即數的目的還是為了簡化處理器的設計,但明顯給編譯器增加了工作了。

還有很多常用的指令也被省掉了,比如nopmovenotneg,當然不是說這些功能沒有,所有這些功能都是有的,不過都是用其它的指令來等價實現的,比如not指令是用xori rd, rs, -1實現的。每看到這樣的指令,我對berkeley的大神都是佩服地五體投地。

能省的指令都省了。能讓編譯器做的都讓編譯器做了。絕對精簡。

原來「人」可以無恥到這種程度

在cnbeta看到這則訊息 url 大站掛iframe變相攻擊小站 顏面盡失治標不治本 b url 才發現 人 原來可以無恥到這種程度。b 校內網在其首頁嵌入 iframe 變相對某第三方模板站進行ddos b 截圖如下 color red update 鏈結已經失效 color url 目前還存在...

軟體架構要設計到什麼程度

由於軟體系統的複雜性,一般人很難非常清楚的將整個系統理的很清楚,所以才會出現架構檢視的概念,而架構檢視出現的乙個主要動力或者原則就是 分而治之。分而治之有兩種型別 1.按問題深度分而治之,即先不把問題想的那麼深入,那麼仔細,要淺嘗輒止。例如定義各個模組之間的介面就屬於這種,先不考慮如何實現介面,只是...

動態文字可以華麗到什麼程度

動態文字可以華麗到什麼程度?首先咒罵 馬可肉公尺迪亞 和 磚頭 的那幫人一下,因為as2有個bug是用as給文字設定中文字型無效.你不信?不信自己去試 我說的可是動態文字哦.而且讓人抓狂的事是文字框裡面放點中英文混合的文字,用as把字型去設定成表示黑體系的 sans 結果竟然是英文本元變成了黑體,而...