aboutsummaryrefslogtreecommitdiffstats
path: root/ISA_cheatsheat.rst
blob: cafc6b83dc0394c04665aa0db5e38e66a8102ede (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
RISC-V full size Instructions Formats (32bit):
==============================================

.. contents::

R-format: op(rs1, rs2) -> rd
----------------------------

``opcode[7] rd[5] funct3[3] rs1[5] rs2[5] funct7[7]``

OPR - register arithmetic/logic
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
opcode: 0b0110011 / 0x33

====== ====== =========
funct7 funct3 operation
====== ====== =========
0x0    0x0    ADD
0x20   0x0    SUB
0x0    0x1    SLL
0x0    0x2    SLT
0x0    0x3    SLTU
0x0    0x4    XOR
0x0    0x5    SRL
0x20   0x5    SRA
0x0    0x6    OR
0x0    0x7    AND
====== ====== =========

I-Format: op(rs1, imm12) -> rd
------------------------------

``opcode[7] rd[5] funct3[3] rs1[5] imm[12]``

LOAD - read memory
~~~~~~~~~~~~~~~~~~
opcode: 0b0000011 / 0x03

-  rs1: base address
-  imm12: offset (scaled/signed by funct3)

====== ========= ===
funct3 operation 
====== ========= ===
0x0    LB        i8
0x1    LH        i16
0x2    LW        i32
0x4    LBU       u8
0x5    LHU       u16
====== ========= ===

OPI - immediate arhitmetic/logic
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
opcode: 0b0010011 / 0x13

-  rs1: base address
-  imm12: offset (scaled/signed by funct3)

====== ========= ============================
funct3 operation 
====== ========= ============================
0x0    ADDI      
0x2    SLTI      
0x3    SLTIU     
0x4    XORI      
0x6    ORI       
0x7    ANDI      
0x1    SLLI      imm12 = 0b0000000 , shamt[5]
0x5    SRLI      imm12 = 0b0000000 , shamt[5]
0x5    SRAI      imm12 = 0b0100000 , shamt[5]
====== ========= ============================

JALR - jump relative to register
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
opcode = 0b1100111 / 0x67

-  rs1: base address
-  imm12: offset (bytes)
-  save PC+4 in rd
-  jump to offset

S-format: op(rs1, rs2, imm12)
-----------------------------

``opcode[7] imm4:0[5] funct3[3] rs1[5] rs2[5] imm11:5[7]``

STORE - write memory
~~~~~~~~~~~~~~~~~~~~
opcode: 0b0100011 / 0x23

-  rs1: base address
-  rs2: data
-  imm12: offset (scaled/signed by funct3)

====== ========= ========================
funct3 operation 
====== ========= ========================
0x0    SB        i8, imm12 in bytes
0x1    SH        i16, imm12 in half-words
0x2    SW        i32, imm13 in words
====== ========= ========================

B-format: op(rs1, rs2, imm12/13)
--------------------------------

``opcode[7] imm11[1] imm4:1[4] funct3[3] rs1[5] rs2[5] imm10:5[6] imm12[1]``

BRANCH - conditional jump
~~~~~~~~~~~~~~~~~~~~~~~~~
opcode = 0b1100011 / 0x63

-  rs1, rs2: registers to compare
-  imm12/13: PC offset in half-words

====== =========
funct3 operation
====== =========
0x0    BEQ
0x1    BNE
0x4    BLT
0x5    BGE
0x6    BLTU
0x7    BGEU
====== =========

U-Format: op(imm20/32) -> rd
----------------------------

``opcode[7] rd[5] imm31:12[20]`` upper-bit immediates (lui, auipc)

LUI - load upper immediate
~~~~~~~~~~~~~~~~~~~~~~~~~~
opcode: 0b0110111 / 0x37

-  imm20: top 20 bits of rd
-  clears bottom 12 bits
-  combine lui + addi to load 32bit immediate NOTE: sign extension
   requires some trickery.

AUIPC - add upper immediate to PC
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
opcode: 0b0010111 / 0x17

-  imm20: top 20 bits of offset added to PC
-  result stored in rd

J-Format: op(imm20/21) -> rd
----------------------------

``opcode[7] rd[5] imm31:12[20]`` immediates on a 32bit scale (jal)

JAL - relative jump
~~~~~~~~~~~~~~~~~~~
opcode = 0b1101111 / 0x6f

-  save PC+4 in rd
-  imm20/21: PC offset in half-words