RISC-V Instruction Set Summary

 

 

Table 1 : RISC-V Registers names and numbers   2

Table 2 : RISC-V (32-bits) instruction formats   3

Table 3 : RV32I RISC-V Integer instructions   4

Table 4 : RISC-V compressed (16-bits) instruction formats   4

 

 

 

 


 

Table 1 : RISC-V Registers names and numbers

#

RISC-V Base

Ext

ABI Name

Register

Description

0

Integer

Base

-

RV32I

RV64I

RV128I

RV32-E

zero

x0

Hard-wired zero

1

ra

x1

Return address

2

sp

x2

Stack pointer

3

gp

x3

Global pointer

4

tp

x4

Thread pointer

5

t0

x5

Temporary/alternate link register

6-7

t1-2

x6-7

Temporaries

8

s0 / fp

x8

Saved register/frame pointer

9

s1

x9

Saved register

10-11

a0-a1

x10-11

Function arguments/return values

12-15

a2-a5

x12-15

Function arguments

16-17

 

a6-a7

x16-17

Function arguments

18-27

s2-s11

x18-27

Saved registers

28-31

t3-t6

x28-31

Temporaries

32-39

Floating

Point

-

F

ft0-7

f0-7

FP temporaries

40-41

fs0-1

f8-9

FP saved registers

42-43

fa0-1

f10-11

FP arguments/return values

44-49

fa2-7

f12-17

FP arguments

50-59

fs2-11

f18-27

FP saved registers

60-63

ft8-11

f28-31

FP temporaries

 

 


 

Table 2 : RISC-V (32-bits) instruction formats

31:25

24:20

19:15

14:12

11:7

6:0

func7

rs2

rs1

func3

rd

op

R-TYPE

imm11:0

rs1

func3

rd

op

I-TYPE

imm11:5

rs2

rs1

func3

imm4:0

op

S-TYPE

imm12,10:5

rs2

rs1

func3

imm4:1,11

op

SB-TYPE

imm31:12

rd

op

U-TYPE

imm20,10:1,11,19:12

rd

op

UJ-TYPE

fs3

func2

fs2

fs1

func3

fd

op

R4-TYPE

5bits

2bits

5bits

5bits

3bits

5bits

7bits

32bits

 

Instruction formats details

In the base ISA, there are four core instruction formats (R/I/S/U) :

▪          R-TYPE

Register-register ALU instructions : add, xor, mul

▪          I-TYPE

Immediate ALU instructions, load instructions : addi, lw, jalr, slli

▪          S-TYPE

Store instructions : sw, sb

▪          SB-TYPE

Comparison and branch instructions: beq, bge

▪          U-TYPE

Instructions with upper immediates

▪          UJ-TYPES

Jump instructions: jal

 

 

▪          func2

type of operation on 2bits

▪          func3

type of operation on 3bits

▪          func4

type of operation on 4bits

▪          func6

type of operation on 6bits

▪          func7

type of operation on 7bits

 

Glossary of instruction descriptions

▪          rs1, rs2

Register descriptors* : Source operands 1 and 2

▪          rd

Register descriptor* : Destination operand

▪          op

Operation code

 

*Register descriptors (rs1,rs2, rd) always need 5 bits to address all possible 32 (2^5) working registers (from x0 to x31). That is partly why it is not possible to use CSR directly into regular instructions. In “Priviledge / CSR instructions” that are all I-TYPE, the csr operand is coded by imm11:0 (on 12 bits), and that is what theorically allows to address up to 4096 CSR (2^12). In addition, in the “Priviledge / CSR instructions”, the 5-bit unsigned immediate (uimm) is coded in the rs1 field and not in the imm11:0 field as it should be because of its previous use.

▪          imm

signed immediate in imm11:0

▪          uimm

5-bit unsigned immediate in imm4:0

▪          upimm

20 upper bits of a 32-bit immediate, in imm31:12

▪          Address

memory address : rs1 + SignExt(imm11:0)

▪          [Address]

data at memory location Address

▪          BTA

branch target address : PC + SignExt({imm12:1, 1’b0})

▪          JTA

jump target address : PC + SignExt({imm20:1, 1’b0})

▪          Label

text indicating instruction address

▪          SignExt

value sign-extended to 32 bits

▪          ZeroExt

value zero-extended to 32 bits

▪          csr

constrol and status register

 


 

Table 3 : RV32I RISC-V Integer instructions

op

Func3

Func7

Type

Mnemonic

Description

Operation

0000011(3)

000

 

I

lb    rd, imm(rs1)

Load byte

rd = SignExt([Address]7:0)

0000011(3)

001

 

I

lh    rd, imm(rs1)

Load half

rd = SignExt([Address]15:0)

0000011(3)

010

 

I

lw    rd, imm(rs1)

Load word

rd = ([Address]31:0)

0000011(3)

100

 

I

lbu   rd, imm(rs1)

Load byte unsigned

rd = ZeroExt([Address]7:0)

0000011(3)

101

 

I

lhu   rd, imm(rs1)

Load half unsigned

rd = ZeroExt([Address]15:0)

0010011(19)

000

 

I

addi  rd, rs1, imm

ADD immediate

rd = rs1   +  SignExt(imm)

0010011(19)

001

 

I

slli  rd, rs1, uimm

Shift left logical immediate

rd = rs1   << uimm

0010011(19)

010

 

I

slti  rd, rs1, imm

Set less than immediate

rd = rs1   <  SignExt(imm)

0010011(19)

011

0000000

I

sltiu rd, rs1, imm

Set less than imm. unsigned

rd = rs1   <  SignExt(imm)

0010011(19)

100

 

I

xori  rd, rs1, imm

XOR immediate

rd = rs1   ^  SignExt(imm)

0010011(19)

101

0000000

I

srli  rd, rs1, uimm

Shift right logical immediate

rd = rs1   >> uimm

0010011(19)

101

0100000

I

srai  rd, rs1, uimm

Shift right arithmetic immediate

rd = rs1   >> uimm

0010011(19)

110

 

I

ori   rd, rs1, uimm

OR immediate

rd = rs1   |  SignExt(imm)

0010011(19)

111

 

I

andi  rd, rs1, uimm

AND immediate

rd = rs1   &  SignExt(imm)

0010111(23)

 

 

U

auipc rd, rs1, uimm

ADD upper immediate to PC

rd = (upimm, 12’b0) + PC

0100011(35)

 

 

S

sb    rs2,imm(rs1)

Store byte

[Address]7:0 = rs27:0

0100011(35)

 

 

S

sh    rs2,imm(rs1)

Store half

[Address]15:0 = rs215:0

0100011(35)

 

 

S

sw    rs2,imm(rs1)

Store word

[Address]31:0 = rs2

0110011(51)

000

0000000

R

add   rd, rs1,  rs2

ADD

rd = rs1   +  rs2

0110011(51)

000

0100000

R

sub   rd, rs1,  rs2

SUB

rd = rs1   -  rs2

0110011(51)

001

0000000

R

sll   rd, rs1,  rs2

Shift left logical

rd = rs1   << rs24:0

0110011(51)

010

0000000

R

slt   rd, rs1,  rs2

Set less than

rd = rs1   <  rs2

0110011(51)

011

0000000

R

sltu  rd, rs1,  rs2

Set less than unsigned

rd = rs1   <  rs2

0110011(51)

100

0000000

R

xor   rd, rs1,  rs2

XOR

rd = rs1   ^  rs2

0110011(51)

101

0000000

R

srl   rd, rs1,  rs2

Shift right logical

rd = rs1   >> rs24:0

0110011(51)

101

0100000

R

sra   rd, rs1,  rs2

Shift right arithmetic

rd = rs1   >>>rs24:0

0110011(51)

110

0000000

R

or    rd, rs1,  rs2

OR

rd = rs1   |  rs2

0110011(51)

111

0000000

R

and   rd, rs1,  rs2

AND

rd = rs1   &  rs2

0110111(55)

 -

 

U

lui   rd, upimm

Load upper immediate

rd = {upimm, 12’b0}

1100011(99)

000

 

B

beq   rs1,rs2,  label

Branch if equal =

if (rs1 == rs2)  PC = BTA

1100011(99)

001

 

B

bne   rs1,rs2,  label

Branch if not equal ≠

if (rs1 != rs2)  PC = BTA

1100011(99)

010

 

B

blt   rs1,rs2,  label

Branch if lower than <

if (rs1 <  rs2)  PC = BTA

1100011(99)

011

 

B

bge   rs1,rs2,  label

Branch if greater / equal ≥

if (rs1 ≥  rs2)  PC = BTA

1100011(99)

100

 

B

bltu  rs1,rs2,  label

Branch if lower than unsigned <

if (rs1 <  rs2)  PC = BTA

1100011(99)

101

 

B

bgeu  rs1,rs2,  label

Branch if greater / equal unsign. ≥

if (rs1 ≥  rs2)  PC = BTA

1100111(103)

000

 

I

jalr  rd, rs1, label

Jump and link register

PC = rs1 + SignExt(imm)

                  rd = PC + 4

1101111(111)

 -

 

J

jal   rd, label

Jump and link

PC = JTA

                  rd = PC + 4

 

 

 

Table 4 : RISC-V compressed (16-bits) instruction formats

15:13

12

11

10

9

8

7

6:5

4:2

1:0

func4

rd/rs1

rs2

op

CR-TYPE

func3

imm

rd/rs1

imm

op

CI-TYPE

func3

imm

rs1’

imm

rs2’

op

CS-TYPE

func6

rd/rs1

func2

rs2’

op

CS’-TYPE

func3

imm

rs1’

imm

op

CB-TYPE

func3

imm

func

rd’/rs1’

imm

op

CB’-TYPE

func3

imm

op

CJ-TYPE

func3

imm

rs2

op

CSS-TYPE

func3

imm

rd’

op

CIW-TYPE

func3

imm

rs1’

imm

rd’

op

CL-TYPE

3bits

1bit

-

-

-

-

-

2bits

3bits

2bits

16bits