皋陶 发表于 2021-3-5 23:00:52

RV32C指令集

本帖最后由 皋陶 于 2021-3-5 23:00 编辑

RISC-V支持16位压缩格式,压缩格式立即数位数更少,能使用的寄存器也比较少,有些指令只能用常用8个整数寄存器(x8-x15)或者(f8-f15)。
16 位指令只对汇编器和链接器可见,并且是否以短指令取代对应的宽指令由它们决定。
编译器编写者和汇编语言程序员可以幸福地忽略 RV32C 指令及其格式,他们能感知到的则是最后的程序大小小于大多数其它 ISA 的程序。
为了能在一系列的程序上得到良好的代码压缩效果, RISC-V 架构师精心挑选了 RVC扩展中的指令。
同时,基于以下的三点观察,架构师们成功地将指令压缩到了 16 位。
第一,对十个常用寄存器(a0-a5, s0-s1, sp 以及 ra)访问的频率远超过其他寄存器;
第二,许多指令的写入目标是它的源操作数之一;
第三,立即数往往很小,而且有些指令比较喜欢某些特定的立即数。因此,许多 RV32C 指令只能访问那些常用寄存器;
一些指令隐式写入源操作数的位置;
几乎所有的立即数都被缩短了, load 和 store 操作只使用操作数整数倍尺寸的无符号数偏移量。
      下图为RVC指令格式:

其中rs1’,rs2’, rd’如下图所示,只能用x8-x15,f8-f15这些寄存器。但有些指令可以使用所有通用寄存器作为操作数。

每个RVC指令都有对应的32位指令,下面列出所有的RV32C指令。
一、c.addispn
c.addi4spn rd’, uimm      //x = x + uimm
加 4 倍立即数到栈指针 (Add Immediate, Scaled by 4, to Stack Pointer, Nondestructive). RV32IC and RV64IC.
扩展形式为 addi rd, x2, uimm, 其中 rd=8+rd’. uimm=0 时非法。

imm
func354987623rd'opcode
nametype1514131211109876543210
c.addi4spnCIW00000
示例:to do
二、c.fld
c.fld rd’, uimm(rs1’)    //f = M + uimm]

浮点双字加载 (Floating-point Load Doubleword). RV32DC and RV64DC.
扩展形式为 fld rd, uimm(rs1), 其中 rd=8+rd’, rs1=8+rs1’

immimm
func3543rs1'76rd'opcode
nametype1514131211109876543210
c.fldCL00100
示例:to do
三、c.fsd
c.fsd rs2’, uimm(rs1’)   //M + uimm] = f
浮点双字存储 (Floating-point Store Doubleword). RV32DC and RV64DC.
扩展形式为 fsd rs2, uimm(rs1), 其中 rs2=8+rs2’, rs1=8+rs1’

immimm
func3543rs1'76rd'opcode
nametype1514131211109876543210
c.fsdCL10100
示例:to do
四、c.lw
c.lw rd’, uimm(rs1’)   //x = sext(M + uimm])
字加载 (Load Word). RV32IC and RV64IC.
扩展形式为 lw rd, uimm(rs1), 其中 rd=8+rd’, rs1=8+rs1’.

immimm
func3543rs1'26rd'opcode
nametype1514131211109876543210
c.lwCL01000
示例:to do

五、c.addi
c.addi rd, imm    //x = x + sext(imm)
加立即数 (Add Immediate). RV32IC and RV64IC.
扩展形式为 addi rd, rd, imm.

immimm
func35rd43210opcode
nametype1514131211109876543210
c.addiCI00001
示例:to do
六、c.jal
c.jal offset    //x = pc+2; pc += sext(offset)
链接跳转 (Jump and Link). RV32IC.
扩展形式为 jal x1, offset.

imm
func31149810673215opcode
nametype1514131211109876543210
c.jalCJ00101
示例:to do

七、c.li
c.li rd, imm   //x = sext(imm)
立即数加载 (Load Immediate). RV32IC and RV64IC.
扩展形式为 addi rd, x0, imm.

immimm
func35rd43210opcode
nametype1514131211109876543210
c.liCI01001
示例:to do
八、c.lui
c.lui rd, imm//x = sext(imm << 12)

高位立即数加载 (Load Upper Immediate). RV32IC and RV64IC.

扩展形式为 lui rd, imm. 当 rd=x2 或 imm=0 时非法。

immimm
func317rd1615141312opcode
nametype1514131211109876543210
c.luiCI01101
示例:to do

九、c.srli
c.srli rd’, uimm   //x = x >>u uimm

立即数逻辑右移 (Shift Right Logical Immediate). RV32IC and RV64IC.
扩展形式为 srli rd, rd, uimm, 其中 rd=8+rd’

immimm
func35rd'43210opcode
nametype1514131211109876543210
c.srliCA1000001
示例:to do
十、c.srai
c.srai rd’, uimm    //x = x >>s uimm

立即数算术右移 (Shift Right Arithmetic Immediate). RV32IC and RV64IC.

扩展形式为 srai rd, rd, uimm, 其中 rd=8+rd’.

immimm
func35rd'43210opcode
nametype1514131211109876543210
c.sraiCA1000101
示例:to do

十一、c.andi
c.andi rd’, imm    //x = x & sext(imm)
与立即数 (AND Immediate). RV32IC and RV64IC.
扩展形式为 andi rd, rd, imm, 其中 rd=8+rd’.

immimm
func35rd'43210opcode
nametype1514131211109876543210
c.andiCA1001001
示例:to do

十二、c.sub
c.sub rd’, rs2’    //x = x - x
减 (Subtract). RV32IC and RV64IC.
扩展形式为 sub rd, rd, rs2. 其中 rd=8+rd’, rs2=8+rs2’.


rd'rs2'opcode
nametype1514131211109876543210
c.subCA1000110001
示例:to do

十三、c.xor
c.xor rd’, rs2’   //x = x ^ x

异或 (Exclusive-OR). RV32IC and RV64IC.

扩展形式为 xor rd, rd, rs2, 其中 rd=8+rd’, rs2=8+rs2’.


rd'rs2'opcode
nametype1514131211109876543210
c.xorCA1000110101
示例:to do

十四、c.or
c.or rd’, rs2’    //x = x | x

或 (OR). RV32IC and RV64IC.

扩展形式为 or rd, rd, rs2, 其中 rd=8+rd’, rs2=8+rs2’.


rd'rs2'opcode
nametype1514131211109876543210
c.orCA1000111001
示例:to do

十五、c.and
c.and rd’, rs2’    //x = x & x

与 (AND). RV32IC and RV64IC.
扩展形式为 and rd, rd, rs2, 其中 rd=8+rd’, rs2=8+rs2’


rd'rs2'opcode
nametype1514131211109876543210
c.andCA1000111101
示例:to do

十六、c.subw
c.subw rd’, rs2’    //x = sext((x - x))
减字 (Subtract Word). RV64IC.
扩展形式为 subw rd, rd, rs2. 其中 rd=8+rd’, rs2=8+rs2’. .


rd'rs2'opcode
nametype1514131211109876543210
c.subwCA1001110001
示例:to do

十七、c.addw
c.addw rd’, rs2’    //x = sext((x + x))

加字 (Add Word). RV64IC.
扩展形式为 addw rd, rd, rs2, 其中 rd=8+rd’, rs2=8+rs2’.

rd'rs2'opcode
nametype1514131211109876543210
c.addwCA1001110101
示例:to do

十八、c.j
c.j offset   //pc += sext(offset)
跳转 (Jump). RV32IC and RV64IC.
扩展形式为 jal x0, offset.

imm
func31149810673215opcode
nametype1514131211109876543210
c.jCJ10101
示例:to do

十九、c.bnez
c.bnez rs1’, offset   //if (x ≠ 0) pc += sext(offset)

不等于零时分支 (Branch if Not Equal to Zero). RV32IC and RV64IC.

扩展形式为 bne rs1, x0, offset, 其中 rs1=8+rs1’.

immimm
func3843rs1'76215opcode
nametype1514131211109876543210
c.bnezCI11101
示例:to do
二十、c.beqz
c.beqz rs1’, offset   //if (x == 0) pc += sext(offset)
等于零时分支 (Branch if Equal to Zero). RV32IC and RV64IC.
扩展形式为 beq rs1, x0, offset, 其中 rs1=8+rs1’.

immimm
func3843rs1'76215opcode
nametype1514131211109876543210
c.beqzCI11001
示例:to do

二十一、c.slli
c.slli rd, uimm   //x = x << uimm

立即数逻辑左移 (Shift Left Logical Immediate). RV32IC and RV64IC.
扩展形式为 slli rd, rd, uimm.

immimm
func35rd43210opcode
nametype1514131211109876543210
c.slliCI00010
示例:to do

二十二、c.fldsp
c.fldsp rd, uimm(x2)   //f = M + uimm]
栈指针相关浮点双字加载 (Floating-point Load Doubleword, Stack-Pointer Relative). RV32DC
and RV64DC.
扩展形式为 fld rd, uimm(x2).

immimm
func35rd43876opcode
nametype1514131211109876543210
c.fldspCI00110
示例:to do

二十三、c.lwsp
c.lwsp rd, uimm(x2)   //x = sext(M + uimm])
栈指针相关字加载 (Load Word, Stack-Pointer Relative). RV32IC and RV64IC.
扩展形式为 lw rd, uimm(x2). rd=x0 时非法。

immimm
func35rd43276opcode
nametype1514131211109876543210
c.lwspCI01010
示例:to do

二十四、c.flwsp
c.flwsp rd, uimm(x2)   //f = M + uimm]

栈指针相关浮点字加载 (Floating-point Load Word, Stack-Pointer Relative). RV32FC.

扩展形式为 flw rd, uimm(x2).

immimm
func35rd43276opcode
nametype1514131211109876543210
c.flwspCI01110
示例:to do

二十五、c.mv
c.mv rd, rs2    //x = x
移动 (Move). RV32IC and RV64IC.
扩展形式为 add rd, x0, rs2. rs2=x0 时非法


rdrs2opcode
nametype1514131211109876543210
c.mvCA100010
示例:to do

二十六、c.fsdsp
c.fsdsp rs2, uimm(x2)   //M + uimm] = f

栈指针相关浮点双字存储 (Floating-point Store Doubleword, Stack-Pointer Relative). RV32DC and RV64DC.
扩展形式为 fsd rs2, uimm(x2).

imm
543876rs2opcode
nametype1514131211109876543210
c.fsdspCSS10110
示例:to do

二十七、c.fswsp
c.fswsp rs2, uimm(x2)    //M + uimm] = f
栈指针相关浮点字存储 (Floating-point Store Word, Stack-Pointer Relative). RV32FC.
扩展形式为 fsw rs2, uimm(x2)

imm
543276rs2opcode
nametype1514131211109876543210
c.fswspCSS11110
示例:to do

二十八、c.nop
空操作,只增加PC值。对应 addi x0,x0,0

immimm
func35rd43210opcode
nametype1514131211109876543210
c.nopCI0000000000000001
示例:to do

二十九、c.ebreak
c.ebreak RaiseException(Breakpoint)
环境断点 (Environment Breakpoint). RV32IC and RV64IC.
扩展形式为 ebreak.

immimm
func35rd43210opcode
nametype1514131211109876543210
c.nopCI1001000000000010
示例:to do

三十、c.addi16sp
c.addi16sp imm    //x = x + sext(imm)
加 16 倍立即数到栈指针 (Add Immediate, Scaled by 16, to Stack Pointer). RV32IC and RV64IC.
扩展形式为 addi x2, x2, imm. imm=0 时非法。




func3946875opcode
nametype1514131211109876543210
c.addi16spnCIW0110001001
示例:to do
三十一、c.jr
c.jr rs1//pc = x
寄存器跳转 (Jump Register). RV32IC and RV64IC.
扩展形式为 jalr x0, 0(rs1). 当 rs1=x0 时非法。


func39rs1opcode
nametype1514131211109876543210
c.jrCI10000000010
示例:to do

三十二、c.jalr
c.jalr rs1 t = pc+2; pc = x; x = t
寄存器链接跳转 (Jump and Link Register). RV32IC and RV64IC.
扩展形式为 jalr x1, 0(rs1). 当 rs1=x0 时非法


func39rs1opcode
nametype1514131211109876543210
c.jalrCI10010000010
示例:to do
xxxxx
示例:to do
xxxxx
示例:to do
页: [1]
查看完整版本: RV32C指令集