官术网_书友最值得收藏!

3.2 RISC-V指令編碼格式

RISC-V每條指令的寬度為32位(不考慮壓縮擴展指令),包括RV32指令集以及RV64指令集。指令編碼格式大致可分成如下6類。

R類型:寄存器與寄存器算術指令。

I類型:寄存器與立即數算術指令或者加載指令。

S類型:存儲指令。

B類型:條件跳轉指令。

U類型:長立即數操作指令。

J類型:無條件跳轉指令。

RISC-V指令集編碼格式如圖3.1所示。

圖3.1 RISC-V指令集編碼格式

指令編碼可以分成如下幾個部分。

opcode(操作碼)字段:位于指令編碼Bit[6:0],用于指令的分類。

funct3和funct7(功能碼)字段:常常與opcode字段結合在一起使用,用來定義指令的操作功能。

rd字段:表示目標寄存器的編號,位于指令編碼的Bit[11:7]。

rs1字段:表示第一源操作寄存器的編號,位于指令編碼的Bit[19:15]。

rs2字段:表示第二源操作寄存器的編號,位于指令編碼的Bit[24:20]。

imm:表示立即數。RISC-V中使用的立即數大部分是符號擴展(sign-extended)的立即數。

RV64指令集支持64位寬的數據和地址尋址,為什么指令的編碼寬度卻只有32位[1]


[1]RISC-V通常使用32位定長指令,不過為了減少代碼量,也支持16位的壓縮擴展指令。

因為RV64指令集是基于寄存器加載和存儲的體系結構設計,所以所有的數據加載、存儲以及處理都是在通用寄存器中完成的。RISC-V一共有32個通用寄存器(通用寄存器都是64位寬的,可以處理64位寬的數據),即x0~x31,其中,x0寄存器的編號為0,以此類推。因此,指令編碼使用5位寬(25 = 32),即索引32個通用寄存器。

對于精簡指令集來說,大部分運算指令最多采用3個寄存器來表示,例如加法指令add rd, rs1, rs2,那么在指令編碼中只需要15個位寬就可以索引3個通用寄存器,剩余的位寬可用于指令分類等。因此32位寬的指令編碼已經綽綽有余,使用32位寬指令編碼比使用64位寬指令編碼更有利于提高指令密度,減小代碼尺寸,從而提高指令高速緩存的命中率,提升程序執行效率。

加載和存儲指令通常采用12位立即數加上2個通用寄存器的方式來表示,下面以lw加載指令為例說明其指令編碼的布局,如圖3.2所示。

圖3.2 lw加載指令的編碼

第0~6位為opcode字段,用于指令的分類。

第7~11位為rd字段,用來描述目標寄存器rd的編號,可以從x0~x31通用寄存器中選擇。

第12~14位為功能碼字段,在加載指令中表示加載數據的位寬。

第15~19位為基地址rs1,可以從x0~x31通用寄存器中選擇。

第20~31位為offset字段,表示偏移量。

RV64指令集中常用的符號說明如下。

rd:表示目標寄存器的編號,可以從x0~x31通用寄存器中選擇。

rs1:表示源寄存器1的編號,可以從x0~x31通用寄存器中選擇。

rs2:表示源寄存器2的編號,可以從x0~x31通用寄存器中選擇。

():通常用來表示尋址模式,例如,(a0)表示以a0寄存器的值為基地址進行尋址。這個前面還可以加offset,表示偏移量,可以是正數或負數。例如,8(a0)表示以a0寄存器的值為基地址,偏移8字節進行尋址。

{ }:表示可選項。

imm:表示有符號立即數。

主站蜘蛛池模板: 调兵山市| 洛川县| 孝感市| 葵青区| 滁州市| 乌鲁木齐县| 丰都县| 宿松县| 陆河县| 西青区| 启东市| 崇信县| 广宁县| 民权县| 冀州市| 长垣县| 海盐县| 勃利县| 滦南县| 娄烦县| 中卫市| 东方市| 沙湾县| 宁波市| 太湖县| 巴林右旗| 漯河市| 左权县| 来宾市| 钟祥市| 三亚市| 吉安县| 镇平县| 岫岩| 峨山| 台安县| 合川市| 康平县| 朝阳区| 潍坊市| 桃源县|