Registri

RegisterABI NameDescription
x0zerohardwired zero
x1rareturn address
x2spstack pointer
x3gpglobal pointer
x4tpthread pointer
x5t0temporary register 0
x6t1temporary register 1
x7t2temporary register 2
x8s0 / fpsaved register 0 / frame pointer
x9s1saved register 1
x10a0function argument 0 / return value 0
x11a1function argument 1 / return value 1
x12a2function argument 2
x13a3function argument 3
x14a4function argument 4
x15a5function argument 5
x16a6function argument 6
x17a7function argument 7
x18s2saved register 2
x19s3saved register 3
x20s4saved register 4
x21s5saved register 5
x22s6saved register 6
x23s7saved register 7
x24s8saved register 8
x25s9saved register 9
x26s10saved register 10
x27s11saved register 11
x28t3temporary register 3
x29t4temporary register 4
x30t5temporary register 5
x31t6temporary register 6

Instruction set

NotationDescription
pcprogram counter
rdinteger register destination
rsNinteger register source N
immimmediate operand value
offsetimmediate program counter relative offset
ux(reg)unsigned XLEN-bit integer (32-bit on RV32, 64-bit on RV64)
sx(reg)signed XLEN-bit integer (32-bit on RV32, 64-bit on RV64)
uN(reg)zero extended N-bit integer register value
sN(reg)sign extended N-bit integer register value
uN[reg + imm]unsigned N-bit memory reference
sN[reg + imm]signed N-bit memory reference







Binop

Arithmetic

InstructionNamePseudocode
ADD rd,rs1,rs2Addrd ← sx(rs1) + sx(rs2)
ADDI rd,rs1,immAdd Immediaterd ← rs1 + sx(imm)
SUB rd,rs1,rs2Subtractrd ← sx(rs1) - sx(rs2)
MUL rd,rs1,rs2Multiplyrd ← ux(rs1) × ux(rs2)
DIV rd,rs1,rs2Divide Signedrd ← sx(rs1) ÷ sx(rs2)
REM rd,rs1,rs2Remainder Signedrd ← sx(rs1) mod sx(rs2)
MULH rd,rs1,rs2Multiply High Signed Signedrd ← (sx(rs1) × sx(rs2)) » xlen
MULHSU rd,rs1,rs2Multiply High Signed Unsignedrd ← (sx(rs1) × ux(rs2)) » xlen
MULHU rd,rs1,rs2Multiply High Unsigned Unsignedrd ← (ux(rs1) × ux(rs2)) » xlen
DIVU rd,rs1,rs2Divide Unsignedrd ← ux(rs1) ÷ ux(rs2)
REMU rd,rs1,rs2Remainder Unsignedrd ← ux(rs1) mod ux(rs2)
MV rd,rs1Copy Registerrd ← rs1

Logical

InstructionNamePseudocode
AND rd,rs1,rs2Andrd ← ux(rs1) ∧ ux(rs2)
ANDI rd,rs1,immAnd Immediaterd ← ux(rs1) ∧ ux(imm)
OR rd,rs1,rs2Orrd ← ux(rs1) ∨ ux(rs2)
ORI rd,rs1,immOr Immediaterd ← ux(rs1) ∨ ux(imm)
XOR rd,rs1,rs2Xorrd ← ux(rs1) ⊕ ux(rs2)
XORI rd,rs1,immXor Immediaterd ← ux(rs1) ⊕ ux(imm)

Shift

InstructionNamePseudocode
SLL rd,rs1,rs2Shift Left Logicalrd ← ux(rs1) « rs2
SLLI rd,rs1,immShift Left Logical Immediaterd ← ux(rs1) « ux(imm)
SRL rd,rs1,rs2Shift Right Logicalrd ← ux(rs1) » rs2
SRLI rd,rs1,immShift Right Logical Immediaterd ← ux(rs1) » ux(imm)
SRA rd,rs1,rs2Shift Right Arithmeticrd ← sx(rs1) » rs2
SRAI rd,rs1,immShift Right Arithmetic Immediaterd ← sx(rs1) » sx(imm)

Compare

InstructionNamePseudocode
SLT rd,rs1,rs2Set Less Thanrd ← sx(rs1) < sx(rs2)
SLTI rd,rs1,immSet Less Than Immediaterd ← sx(rs1) < sx(imm)
SLTIU rd,rs1,immSet Less Than Immediate Unsignedrd ← ux(rs1) < ux(imm)
SLTU rd,rs1,rs2Set Less Than Unsignedrd ← ux(rs1) < ux(rs2)

Unop

InstructionNamePseudocode
NEG rd,rs1Negaterd ← -rs1





Memory

InstructionNamePseudocode
LD rd,offset(rs1)Load Doublerd ← u64[rs1 + offset]
LBU rd,offset(rs1)Load Byte Unsignedrd ← u8[rs1 + offset]
SD rs2,offset(rs1)Store Doubleu64[rs1 + offset] ← rs2
SB rs2,offset(rs1)Store Byteu8[rs1 + offset] ← rs2
LA rd, labelLoad Symbol Addressrd ← &label
LI rd, immLoad Immediaterd ← imm
LB rd,offset(rs1)Load Byterd ← s8[rs1 + offset]
LH rd,offset(rs1)Load Halfrd ← s16[rs1 + offset]
LW rd,offset(rs1)Load Wordrd ← s32[rs1 + offset]
SH rs2,offset(rs1)Store Halfu16[rs1 + offset] ← rs2
SW rs2,offset(rs1)Store Wordu32[rs1 + offset] ← rs2
LUI rd,immLoad Upper Immediaterd ← imm
AUIPC rd,offsetAdd Upper Immediate to PCrd ← pc + offset

Jumps

Jumps

InstructionNamePseudocode
J immJumppc ← pc + imm
JALR rd,rs1,offsetJump and Link Registerrd ← pc + length(inst)
pc ← (rs1 + offset) ∧ -2
JAL rd,offsetJump and Linkrd ← pc + length(inst)
pc ← pc + offset

Branches

InstructionNamePseudocode
BNEZ rs1,immBranch not equal zeroif(rs1 ≠ 0) pc ← pc + imm
BEQ rs1,rs2,offsetBranch Equalif (rs1 = rs2) pc ← pc + offset
BEQZ rs1, immBranch Equal Zeroif(rs1 == 0) pc ← pc + imm
BNE rs1,rs2,offsetBranch Not Equalif (rs1 ≠ rs2) pc ← pc + offset
BLT rs1,rs2,offsetBranch Less Thanif (rs1 < rs2) pc ← pc + offset
BGE rs1,rs2,offsetBranch Greater than Equalif (rs1 ≥ rs2) pc ← pc + offset
BLTU rs1,rs2,offsetBranch Less Than Unsignedif (rs1 < rs2) pc ← pc + offset
BGEU rs1,rs2,offsetBranch Greater than Equal Unsignedif (rs1 ≥ rs2) pc ← pc + offset
BLTZ rs1,immBranch Less Than Zeroif(rs1 < 0) pc ← pc + imm
BGTZ rs1,immBranch Greater Than Zeroif(rs1 > 0) pc ← pc + imm
BLE rs1,rs2,immBranch Less or Equalif(rs1 ≤ rs2) pc ← pc + imm
BLEU rs1,rs2,immBranch Less or Equal Unsignedif(rs1 ≤ rs2) pc ← pc + imm
BLEZ rs1,immBranch Less or Equal Zeroif(rs1 ≤ 0) pc ← pc + imm
BGEZ rs1,immBranch Greater or Equal Zeroif(rs1 ≥ 0) pc ← pc + imm
You can use a label in place of a branch immediate, for example: BEQ t0,t1,label

Functions

InstructionNamePseudocode
CALL labelCall Functionra ← pc+4;
pc ← &label
RETReturn from Functionpc ← ra