前段時間在修改 picorv32 核心(乙個riscv-32的cpu核心),閱讀了一下riscv指令集的手冊。
在此,做一下簡單記錄。
rv32i:32位risc-v整數指令集
1. 暫存器
32個x暫存器,rv32下x reg是32位寬
x0:硬連線 常數0
x1-x31:31個通用reg
pc:額外的使用者可見暫存器
3. 基本指令格式
四種基礎指令格式 r/i/s/u
imm:立即數
rs1:源暫存器1
rs2:源暫存器2
rd:目標暫存器
opcode:操作碼
4. 立即數
各種指令格式下,拼裝出立即數
inst[i]:指令第i位
5. 整數計算
使用r或者i類指令
r類:暫存器-立即數
i類:暫存器-暫存器
整數計算不會造成運算異常
暫存器-立即數:
addi:將12位有符號立即數和rs相加,溢位忽略,直接使用結果的最低32bit,並存入rd
偽指令mv:"mv rd,rs"實際上是"addi rd, rs, 0"
slti:如果rs小於立即數(都是有符號整數),將rd置1,否則置0
sltiu:和slti一致,不過都是無符號數
偽指令seqz:"seqz rd, rs" 實際上是 "sltiu rd, rs1, 1"
andi/ori/xori:rs與有符號12位立即數進行and,or,xor操作
偽指令not:"not rd, rs"實際上是"xori rd, rs1, -1"
shift是i類指令格式
slli:邏輯左移,低位移入0
srli:邏輯右移,高位移入0
srai:算數右移,符號移入高位
u類指令格式
lui:建立32位無符號整數,存放立即數到rd的高20位,低20位置0
auipc:建立pc的相對位址,pc+無符號立即數(偏移量)=>rd
暫存器-暫存器:
add/sub:rs1(+/-)rs2 => rd
slt/sltu: 如果rs1and/or/xor: rs1與rs2進行and,or,xor操作
sll/srl/sra: 和"暫存器-立即數"指令一致,將r2的低5位作為立即數即可
nop指令:
實際上是addi x0,x0,0
6. 控制傳輸指令
1)非條件跳**
jal:j類指令,立即數+pc為跳轉目標,rd存放pc+4(返回位址)
跳轉範圍為pc(+/-)1mb
jalr:i類指令,rs+立即數為跳轉目標,rd存放pc+4(返回位址)
實現遠跳轉
2)條件跳轉
所有分支指令使用b類指令格式,12位立即數+pc作為目標
跳轉範圍為pc(+/-)4kb
beq/bne:rs1(==/!=)rs2, 分別在相等或者不等時,發生跳轉
blt:rs1 < rs2, 跳轉
bge:rs1 >= rs2, 跳轉
7. 載入儲存指令
rv32i是乙個載入/儲存架構,只有load/store能訪問記憶體,運算指令只操作暫存器
load是i類指令,store是s類指令
load:rs作為基位址,加上有符號的偏移,讀取到rd暫存器
store:rs1作為基位址加上有符號的偏移,作為記憶體位址,寫入內容為rs2
8. 記憶體模型
risc-v isa支援單位址空間上多執行緒執行,每個hardware thread都有都有自己的暫存器狀態
9. 控制狀態暫存器指令
暫存器-暫存器:讀/寫/修改 csr
csrrw:atomic read/write csr
讀取csr的值存入rd暫存器,並將rs存入csr
另外:如果rd為x0,將不會執行
csrrs:atomic read and set bits in csr
讀取csr的值存入rd暫存器,並根據rs中高位對csr置1
另外:如果rs為x0,將不會執行
csrrc:atomic read and clear bits in csr
讀取csr的值存入rd暫存器,並根據rs中高位對csr置0
另外:如果rs為x0,將不會執行
立即數-暫存器:讀/寫/修改 csr
csrrwi/csrrsi/csrrci
將csrrw類暫存器中的rs換成立即數
另外:如果立即數為0,將不會執行
使用者級系統指令:時鐘和計數器
rv32i提供三個64位唯讀使用者級暫存器:rdcycle[h]/rdtime[h]/rdinstret[h]
使用csrrs讀取這三個暫存器的高32 bit
rdcycle:時鐘週期計數
rdtime:時間 tick數
rdinstret:指令數
10. 環境呼叫和斷點
ecall
ebreak
ARM NEON 基本指令集介紹
目錄 暫存器基本資料型別 結構化資料型別 基本指令集 armv7架構包含 下面這些資料型別是上述基本資料型別的組合而成的結構化資料型別,通常為被對映到多個暫存器中。typedef struct int8x8x2 t int8x8x2 t 省略.ifdef arm feature crypto typ...
基本彙編指令集
基本彙編指令集 彙編指令集 1.通用資料傳送指令 mov 傳送字或位元組.movsx 先符號擴充套件,再傳送.movzx 先零擴充套件,再傳送.push 把字壓入堆疊.pop 把字彈出堆疊.pusha 把ax,cx,dx,bx,sp,bp,si,di依次壓入堆疊.popa 把di,si,bp,sp,...
看到乙個RISC V指令集的評論
來科普一下risc v指令集吧。1 riscv 密度大約是arm的50 左右,同樣計算所需週期是arm的150 300 所以risc v感覺只能用於物聯網等需要低功耗簡單cpu的場景 2 riscv自身的開源性質並不妨礙arm intel 高通 三星 amd 蘋果這樣的公司繼續在riscv佔據優勢。...