RISC-V 常见指令

匿名 (未验证) 提交于 2019-12-02 23:32:01

算术运算

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[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[rs1]除以 x[rs2],向 0 舍入,都视为 2 的补码,余数写入 x[rd]。

neg rd, rs2

把寄存器 x[rs2]的二进制补码写入 x[rd]。

逻辑运算

and rd, rs1, rs2

x[rd] = x[rs1] & x[rs2]

将寄存器 x[rs1]和寄存器 x[rs2]位与的结果写入 x[rd]。

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

逻辑左移(空位补0)

slli rd, rs1, shamt

立即数逻辑左移

srl rd, rs1, rs2

逻辑右移(空位补0)

srli rd, rs1, shamt

立即数逻辑右移

sra rd, rs1, 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)

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。

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)。

参考:

http://crva.io/documents/RISC-V-Reader-Chinese-v2p1.pdf

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!