RV32EC指令集

        RV32ECRISC V的最精简版本 RV32I的压缩版本。仅仅适用于嵌入式场合。

  压缩版本的指令为16位指令,在非数学运算的场合其代码密度可以和ARMThumb比拟,比8051CISC的仅仅略低一点点。

  其指令总共47条,非常精简。无M(乘除法)、A(原子操作)、F(浮点数)、D(双精度浮点数)等指令。

              M:无乘除法指令,编译器会用加法和移位做的函数来完成乘除法。

              A:无原子操作指令,需要手工关中断来实现原子操作。

             FD:无浮点指令,编译器会链接浮点函数库里面的函数来实现浮点操作。这将导致数学运算能力仅比4位机和PIC12系列强一点。可能会略弱于传统的8051PICAVR等架构的8位机。

     优点:指令条数少,成本低。

   缺点:但是不适合大量快速运算的场合,根据picorv32的跑分大概1MHz主频下每秒只有五十万次运算能力。

           Ayawawa说过,漂亮的女人没有我聪明,聪明的女人没有我漂亮。虽然速度性能(dmips)和密度均没有太大的优势,但是好歹是个32位的免费内核,而且是民主自由的。我最看好的就是出身这一条。

 

本文翻译自 RISC-VSPEC的第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、有些”客户”的说明使用者可以用来扩展自己的指令;

3HINT”的说明码被保留用于微架构性能监控(见第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象限.

 

posted @ 2022-10-21 19:08  william1994  阅读(647)  收藏2(0