算術運算
add rd, rs1, rs2
x[rd] = x[rs1] + x[rs2]
把寄存器 x[rs2]加到寄存器 x[rs1]上,結果寫入 x[rd]。忽略算術溢出。
addi rd, rs1, immediate
x[rd] = x[rs1] + sext(immediate)
把符號位擴展的立即數加到寄存器 x[rs1]上,結果寫入 x[rd]。忽略算術溢出。
sub rd, rs1, rs2
x[rd] = x[rs1] − x[rs2]
x[rs1]減去 x[rs2],結果寫入 x[rd]。忽略算術溢出。
div rd, rs1, rs2
x[rd] = x[rs1] ÷s x[rs2]
用寄存器 x[rs1]的值除以寄存器 x[rs2]的值,向零舍入,將這些數視為二進制補碼,把商寫 入 x[rd]。
mul rd, rs1, rs2
x[rd] = x[rs1] × x[rs2]
把寄存器 x[rs2]乘到寄存器 x[rs1]上,乘積寫入 x[rd]。忽略算術溢出。
rem rd, rs1, rs2
x[rd] = x[rs1] %𝑠 x[rs2]
求余數。x[rs1]除以 x[rs2],向 0 舍入,都視為 2 的補碼,余數寫入 x[rd]。
neg rd, rs2
x[rd] = −x[rs2]
把寄存器 x[rs2]的二進制補碼寫入 x[rd]。
邏輯運算
and rd, rs1, rs2
x[rd] = x[rs1] & x[rs2]
將寄存器 x[rs1]和寄存器 x[rs2]位與的結果寫入 x[rd]。
andi rd, rs1, immediate
x[rd] = x[rs1] & sext(immediate)
把符號位擴展的立即數和寄存器 x[rs1]上的值進行位與,結果寫入 x[rd]。
or rd, rs1, rs2
x[rd] = ~x[rs1]
把寄存器 x[rs1]和寄存器 x[rs2]按位取或,結果寫入 x[rd]。
xor rd, rs1, immediate
x[rd] = x[rs1] ^ sext(immediate)
x[rs1]和有符號擴展的 immediate 按位異或,結果寫入 x[rd]。
位運算
sll rd, rs1, rs2
x[rd] = x[rs1] ≪ x[rs2]
邏輯左移(空位補0)
slli rd, rs1, shamt
立即數邏輯左移
srl rd, rs1, rs2
x[rd] = (x[rs1] ≫𝑢 x[rs2])
邏輯右移(空位補0)
srli rd, rs1, shamt
立即數邏輯右移
sra rd, rs1, rs2
x[rd] = (x[rs1] ≫𝑠 x[rs2])
算術右移(空位用最高位填充)
srai rd, rs1, shamt
立即數邏輯右移
not td, rs1
x[rd] = ~x[rs1]
把寄存器 x[rs1]對於 1 的補碼(即按位取反的值)寫入 x[rd]。實際被擴展為 xori rd, rs1, -1。
條件控制指令
beq rs1, rs2, offset
if (rs1 == rs2) pc += sext(offset)
若寄存器 x[rs1]和寄存器 x[rs2]的值相等,把 pc 的值設為當前值加上符號位擴展的偏移 offset。
bge rs1, rs2, offset
if (rs1 ≥s rs2) pc += sext(offset)
若寄存器 x[rs1]的值大於等於寄存器 x[rs2]的值(均視為二進制補碼),把 pc 的值設為當前 值加上符號位擴展的偏移 offset。
blt rs1, rs2, offset
if (rs1 <s rs2) pc += sext(offset)
若寄存器 x[rs1]的值小於寄存器 x[rs2]的值(均視為二進制補碼),把 pc 的值設為當前值加 上符號位擴展的偏移 offset。
bne rs1, rs2, offset
if (rs1 ≠ rs2) pc += sext(offset)
若寄存器 x[rs1]和寄存器 x[rs2]的值不相等,把 pc 的值設為當前值加上符號位擴展的偏移 offset。
跳轉指令
j offset
pc += sext(offset)
把 pc 設置為當前值加上符號位擴展的 offset,等同於 jal x0, offset。
jal rd, offset
x[rd] = pc+4; pc += sext(offset)
把下一條指令的地址 (pc+4),然后把 pc 設置為當前值加上符號位擴展的offset。rd 默認為 x1。
jr rs1
pc = x[rs1]
把 pc 設置為 x[rs1],等同於 jalr x0, 0(rs1)。
jalr rd, offset(rs1)
t = pc+4; pc =(x[rs1]+sext(offset))&~1; x[rd]= t
把 pc 設置為 x[rs1] + sign-extend(offset),把計算出的地址的最低有效位設為 0,並將原 pc+4 的值寫入 f[rd]。rd 默認為 x1。
ret
pc = x[1]
從子過程返回。實際被擴展為 jalr x0, 0(x1)。
加載與存儲指令
la rd, symbol
x[rd] = &symbol
將 symbol 的地址加載到 x[rd]中。
li rd, immediate
x[rd] = immediate
將常量加載到 x[rd]中。
lw rd, offset(rs1)
x[rd] = sext(M[x[rs1] + sext(offset)][31:0])
從地址 x[rs1] + sign-extend(offset)讀取四個字節,寫入 x[rd]。
sw rs2, offset(rs1)
M[x[rs1] + sext(offset) = x[rs2][31: 0]
將 x[rs2]的低位 4 個字節存入內存地址 x[rs1]+sign-extend(offset)。
參考:
RISC-V 手冊(翻譯版) http://crva.io/documents/RISC-V-Reader-Chinese-v2p1.pdf