RISC-V 指令格式

RISC-V 字段

  1. 给出 RISC-V (R型)字段命名使其易于讨论:
|  funct7  |  rs2  |  rs1  |  funct3  |  rd  |  opcode  |            [R]
     7         5       5        3        5        7           

以下是 RISC-V 指令字段信息:

  • 操作码opcode):用于表示该指令操作和指令格式的字段;
  • 目的操作数寄存器rd):用来存放操作结果;
  • 附加操作码字段funct3 & funct7):另外的操作码字段;
  • 第一源操作数寄存器rs1):第一个源操作数;
  • 第二源操作数寄存器rs2):第一个源操作数;

问题:当指令需要两个寄存器和一个常数,则常数通常比31(2^5-1)大得多,5位字段太小。

设计原则3:优秀的设计需要适当的折中

RISC-V 对于不同指令使用不同格式,上述R型格式用于寄存器。另一种为I型,用于带一个常数的算数运算及加载指令。

  1. I型字段如下:
|  immediate  |  rs1  |  funct3  |  rd  |  opcode  |                  [I]
       12         5        3        5        7
  • 立即数(immediate):为补码值,表示-2^11~2^11-1,用于加载指令时,表示一个字节的偏移量,可相对于基址寄存器rd偏移2^11(2048)字节;
  • 对于加载双字指令ld x9, 64(x22)22存放在rs164存放在immediate9存放在rd
  1. S型字段如下:适用于存储双字的指令,需要两个源寄存器(基址和数据)和地址偏移immediate
|  imm[11:5]  |  rs2  |  rs1  |  funct3  |  imm[4:0]  |  opcode  |     [S]
       7          5       5        3           5           7

总结

R型指令:

Rfunct7rs2rs1funct3rdopcode示例
add00000000001100010000000010110011add x1, x2, x3
sub01000000001100010000000010110011sub x1, x2, x3

I型指令:

Iimmediaters1funct3rdopcode示例
addi00111110100000010000000010110011addi x1, x2, x3
ld00111110100000010011000010000011ld x1, 1000(x2)

S型指令:

Simm[11:5]rs2rs1funct3imm[4:0]opcode示例
sd00111110000100010011010000100011sd x1, 1000(x2)