RV32EC指令集
RV32EC是RISC V的最精简版本 RV32I的压缩版本。仅仅适用于嵌入式场合。
压缩版本的指令为16位指令,在非数学运算的场合其代码密度可以和ARM的Thumb比拟,比8051等CISC的仅仅略低一点点。
其指令总共47条,非常精简。无M(乘除法)、A(原子操作)、F(浮点数)、D(双精度浮点数)等指令。
M:无乘除法指令,编译器会用加法和移位做的函数来完成乘除法。
A:无原子操作指令,需要手工关中断来实现原子操作。
FD:无浮点指令,编译器会链接浮点函数库里面的函数来实现浮点操作。这将导致数学运算能力仅比4位机和PIC12系列强一点。可能会略弱于传统的8051、PIC、AVR等架构的8位机。
优点:指令条数少,成本低。
缺点:但是不适合大量快速运算的场合,根据picorv32的跑分大概1MHz主频下每秒只有五十万次运算能力。
Ayawawa说过,漂亮的女人没有我聪明,聪明的女人没有我漂亮。虽然速度性能(dmips)和密度均没有太大的优势,但是好歹是个32位的免费内核,而且是民主自由的。我最看好的就是出身这一条。
本文翻译自 RISC-V的SPEC的第18.8节。原文见:
https://github.com/riscv/riscv-isa-manual/releases/download/draft-20221004-28b46de/riscv-spec.pdf
Table 18.4 shows a map of the major opcodes for RVC. Each row of the table corresponds to one quadrant of the encoding space. The last quadrant, which has the two least-significant bits set, corresponds to instructions wider than 16 bits, including those in the base ISAs. Several instructions are only valid for certain operands; when invalid, they are marked either RES to indicate that the opcode is reserved for future standard extensions; Custom to indicate that the opcode is designated for custom extensions; or HINT to indicate that the opcode is reserved for microarchitectural hints (see Section 18.7).
表18.4显示了RVC的主要操作码的列表。
表格的每一行对应指令低两位的一个组合。
最后的11的组合是留给RISC V非压缩格式指令集的,所以只有00 01 10前三行是有效的。
并不是所有的列都是有效的:
1、有些“保留”的是给将来的扩展做准备;
2、有些”客户”的说明使用者可以用来扩展自己的指令;
3、”HINT”的说明码被保留用于微架构性能监控(见第18.7节)。
高三位 \ 低两位
|
000 |
001 |
010 |
011 |
100 |
101 |
110 |
111 |
00 |
ADDI4SPN |
FLD LQ |
LW |
FLW LD |
保留 |
FSD SQ |
SW |
FSW SD |
01 |
ADDI |
JAL ADDIW |
LI |
LUI/ ADDI16SP |
MISC-ALU |
J |
BEQZ |
BNEZ |
10 |
SLLI |
FLDSP LQSP |
LWSP |
FLWSP LDSP |
J[AL]R/ MV/ADD |
FSDSP SQSP |
SWSP |
FSWSP SDSP |
11 |
大于16位长度的非压缩指令集 |
表18.4 RVC 操作数总表
在总表(低两位、高三位组合3*8=24)的基础上,根据源寄存器和目的寄存器是否为0寄存器,很多指令又可以额外拆出来三种特殊指令。最终详细的指令列表如下三个表所示。
151413 |
12 11 10 |
9 8 7 |
6 5 |
4 3 2 |
1 0 |
指令名称 |
000 |
0 |
00 |
非法指令 |
|||
000 |
nzuimm[5:4|9:6|2|3] |
rd’ |
00 |
C.ADDI4SPN (RES, nzuimm=0) |
||
001 |
uimm[5:3] |
rs1 ′ |
uimm[7:6] |
rd ′ |
00 |
C.FLD (RV32/64) |
001 |
uimm[5:4|8] |
rs1 ′ |
uimm[7:6] |
rd ′ |
00 |
C.LQ (RV128) |
010 |
uimm[5:3] |
rs1 ′ |
uimm[2|6] |
rd ′ |
00 |
C.LW |
011 |
uimm[5:3] |
rs1 ′ |
uimm[2|6] |
rd ′ |
00 |
C.FLW (RV32) |
011 |
uimm[5:3] |
rs1 ′ |
uimm[7:6] |
rd ′ |
00 |
C.LD (RV64/128) |
100 |
--- |
|
保留 |
|||
101 |
uimm[5:3] |
rs1 ′ |
uimm[7:6] |
rs2 ′ |
00 |
C.FSD (RV32/64) |
101 |
uimm[5:4|8] |
rs1 ′ |
uimm[7:6] |
rs2 ′ |
00 |
C.SQ (RV128) |
110 |
uimm[5:3] |
rs1 ′ |
uimm[2|6] |
rs2 ′ |
00 |
C.SW |
111 |
uimm[5:3] |
rs1 ′ |
uimm[2|6] |
rs2 ′ |
00 |
C.FSW (RV32) |
111 |
uimm[5:3] |
rs1 ′ |
uimm[7:6] |
rs2 ′ |
00 |
C.SD (RV64/128) |
表 18.5: RVC的指令列表, 第0象限.
151413 |
12 |
11 10 |
9 8 7 |
6 5 |
4 3 2 |
1 0 |
指令名称 |
000 |
nzimm[5] |
0 |
nzimm[4:0] |
01 |
C.NOP (HINT, nzimm̸=0) |
||
000 |
nzimm[5] |
rs1/rd≠0 |
nzimm[4:0] |
01 |
C.ADDI (HINT, nzimm=0) |
||
001 |
imm[11|4|9:8|10|6|7|3:1|5] |
01 |
C.JAL (RV32) |
||||
001 |
imm[5] |
rs1/rd≠0 |
imm[4:0] |
01 |
C.ADDIW (RV64/128; RES, rd=0) |
||
010 |
imm[5] |
rd≠0 |
imm[4:0] |
01 |
C.LI (HINT, rd=0) |
||
011 |
nzimm[9] |
2 |
nzimm[4|6|8:7|5] |
01 |
C.ADDI16SP (RES, nzimm=0) |
||
011 |
nzimm[17] |
rd≠{0, 2} |
nzimm[16:12] |
01 |
C.LUI (RES, nzimm=0; HINT, rd=0) |
||
100 |
nzuimm[5] |
00 |
rs’/rd’ |
nzuimm[4:0] |
01 |
C.SRLI (RV32 Custom, nzuimm[5]=1) |
|
100 |
0 |
00 |
rs’/rd’ |
0 |
01 |
C.SRLI64 (RV128; RV32/64 HINT) |
|
100 |
nzuimm[5] |
01 |
rs’/rd’ |
nzuimm[4:0] |
01 |
C.SRAI (RV32 Custom, nzuimm[5]=1) |
|
100 |
0 |
01 |
rs’/rd’ |
0 |
01 |
C.SRAI64 (RV128; RV32/64 HINT) |
|
100 |
imm[5] |
10 |
rs’/rd’ |
imm[4] |
01 |
C.ANDI |
|
100 |
0 |
11 |
rs’/rd’ |
00 |
rs2’ |
01 |
C.SUB |
100 |
0 |
11 |
rs’/rd’ |
01 |
rs2’ |
01 |
C.XOR |
100 |
0 |
11 |
rs’/rd’ |
10 |
rs2’ |
01 |
C.OR |
100 |
0 |
11 |
rs’/rd’ |
11 |
rs2’ |
01 |
C.AND |
100 |
1 |
11 |
rs’/rd’ |
00 |
rs2’ |
01 |
C.SUBW (RV64/128; RV32 RES) |
100 |
1 |
11 |
rs’/rd’ |
01 |
rs2’ |
01 |
C.ADDW (RV64/128; RV32 RES) |
100 |
1 |
11 |
- |
10 |
- |
01 |
Reserved |
100 |
1 |
11 |
- |
11 |
- |
01 |
Reserved |
101 |
imm[11|4|9:8|10|6|7|3:1|5] |
01 |
C.J |
||||
110 |
imm[8|4:3] |
rs1’ |
imm[7:6|2:1|5] |
01 |
C.BEQZ |
||
111 |
imm[8|4:3] |
rs1’ |
imm[7:6|2:1|5] |
01 |
C.BNEZ |
表 18.6: RVC的指令列表, 第1象限.
151413 |
12 |
11 10 9 8 7 |
6 5 4 3 2 |
1 0 |
指令名称 |
000 |
nzuimm[5] |
rs1/rd≠0 |
nzuimm[4:0] |
10 |
C.SLLI (HINT, rd=0; RV32 Custom, nzuimm[5]=1) |
000 |
0 |
rs1/rd≠0 |
0 |
10 |
C.SLLI64 (RV128; RV32/64 HINT; HINT, rd=0) |
001 |
uimm[5] |
rd |
uimm[4:3|8:6] |
10 |
C.FLDSP (RV32/64) |
001 |
uimm[5] |
rd≠0 |
uimm[4|9:6] |
10 |
C.LQSP (RV128; RES, rd=0) |
010 |
uimm[5] |
rd≠0 |
uimm[4:2|7:6] |
10 |
C.LWSP (RES, rd=0) |
011 |
uimm[5] |
rd |
uimm[4:2|7:6] |
10 |
C.FLWSP (RV32) |
011 |
uimm[5] |
rd≠0 |
uimm[4:3|8:6] |
10 |
C.LDSP (RV64/128; RES, rd=0) |
100 |
0 |
rs1≠0 |
0 |
10 |
C.JR (RES, rs1=0) |
100 |
0 |
rd≠0 |
rs2≠0 |
10 |
C.MV (HINT, rd=0) |
100 |
1 |
0 |
0 |
10 |
C.EBREAK |
100 |
1 |
rs1≠0 |
0 |
10 |
C.JALR |
100 |
1 |
rs1/rd≠0 |
rs2≠0 |
10 |
C.ADD (HINT, rd=0) |
101 |
uimm[5:3|8:6] |
rs2 |
10 |
C.FSDSP (RV32/64) |
|
101 |
uimm[5:4|9:6] |
rs2 |
10 |
C.SQSP (RV128) |
|
110 |
uimm[5:2|7:6 |
rs2 |
10 |
C.SWSP |
|
111 |
uimm[5:2|7:6 |
rs2 |
10 |
C.FSWSP (RV32) |
|
111 |
uimm[5:3|8:6] |
rs2 |
10 |
C.SDSP (RV64/128) |
表 18.7: RVC的指令列表, 第2象限.
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)