Skip to main content

4 RV64I Base Integer Instruction Set, Version 2.1

This chapter describes the RV64I base integer instruction set, which builds upon the RV32I variant described in rv32. This chapter presents only the differences with RV32I, so should be read in conjunction with the earlier chapter.

4.1 Register State

RV64I widens the integer registers and supported user address space to 64 bits (XLEN=64 in gprs).

4.2 Integer Computational Instructions

Most integer computational instructions operate on XLEN-bit values. Additional instruction variants are provided to manipulate 32-bit values in RV64I, indicated by a 'W' suffix to the opcode. These "*W" instructions ignore the upper 32 bits of their inputs and always produce 32-bit signed values, sign-extending them to 64 bits, i.e. bits XLEN-1 through 31 are equal.

note

The compiler and calling convention maintain an invariant that all 32-bit values are held in a sign-extended format in 64-bit registers. Even 32-bit unsigned integers extend bit 31 into bits 63 through 32. Consequently, conversion between unsigned and signed 32-bit integers is a no-op, as is conversion from a signed 32-bit integer to a signed 64-bit integer. Existing 64-bit wide SLTU and unsigned branch compares still operate correctly on unsigned 32-bit integers under this invariant. Similarly, existing 64-bit wide logical operations on 32-bit sign-extended integers preserve the sign-extension property. A few new instructions (ADD[I]W/SUBW/SxxW) are required for addition and shifts to ensure reasonable performance for 32-bit values.

4.2.1 Integer Register-Immediate Instructions

8d13a8c91c5d76701e288cb81315df94

ADDIW is an RV64I instruction that adds the sign-extended 12-bit immediate to register rs1 and produces the proper sign extension of a 32-bit result in rd. Overflows are ignored and the result is the low 32 bits of the result sign-extended to 64 bits. Note, ADDIW rd, rs1, 0 writes the sign extension of the lower 32 bits of register rs1 into register rd (assembler pseudoinstruction SEXT.W).

1a1a7b9c884f53ae3865c3ead55cc281

Shifts by a constant are encoded as a specialization of the I-type format using the same instruction opcode as RV32I. The operand to be shifted is in rs1, and the shift amount is encoded in the lower 6 bits of the I-immediate field for RV64I. The right-shift type is encoded in bit 30. SLLI is a logical left shift (zeros are shifted into the lower bits); SRLI is a logical right shift (zeros are shifted into the upper bits); and SRAI is an arithmetic right shift (the original sign bit is copied into the vacated upper bits).

7d977f3e6066bc22d9a4513cb1bab757

SLLIW, SRLIW, and SRAIW are RV64I-only instructions that are analogously defined but operate on 32-bit values and sign-extend their 32-bit results to 64 bits. SLLIW, SRLIW, and SRAIW encodings with imm[5] ≠ 0 are reserved.

note

Previously, SLLIW, SRLIW, and SRAIW with imm[5] ≠ 0 were defined to cause illegal-instruction exceptions, whereas now they are marked as reserved. This is a backwards-compatible change.

1d7b3de7c9ea2d9ac21931da6bde75ff

LUI (load upper immediate) uses the same opcode as RV32I. LUI places the 32-bit U-immediate into register rd, filling in the lowest 12 bits with zeros. The 32-bit result is sign-extended to 64 bits.

AUIPC (add upper immediate to pc) uses the same opcode as RV32I. AUIPC is used to build pc-relative addresses and uses the U-type format. AUIPC forms a 32-bit offset from the U-immediate, filling in the lowest 12 bits with zeros, sign-extends the result to 64 bits, adds it to the address of the AUIPC instruction, then places the result in register rd.

note

Note that the set of address offsets that can be formed by pairing LUI with LD, AUIPC with JALR, etc. in RV64I is [−231−211, 231−211−1].

4.2.2 Integer Register-Register Operations

8d7b796e590a5c517c52d7727f2458b4

ADDW and SUBW are RV64I-only instructions that are defined analogously to ADD and SUB but operate on 32-bit values and produce signed 32-bit results. Overflows are ignored, and the low 32-bits of the result is sign-extended to 64-bits and written to the destination register.

SLL, SRL, and SRA perform logical left, logical right, and arithmetic right shifts on the value in register rs1 by the shift amount held in register rs2. In RV64I, only the low 6 bits of rs2 are considered for the shift amount.

SLLW, SRLW, and SRAW are RV64I-only instructions that are analogously defined but operate on 32-bit values and sign-extend their 32-bit results to 64 bits. The shift amount is given by rs2[4:0].

4.3 Load and Store Instructions

RV64I extends the address space to 64 bits. The execution environment will define what portions of the address space are legal to access.

d5cdc80be7c30a05cb5791780c37fc38

773158fc2fa0d31fdb19974f41c596c1

The LD instruction loads a 64-bit value from memory into register rd for RV64I.

The LW instruction loads a 32-bit value from memory and sign-extends this to 64 bits before storing it in register rd for RV64I. The LWU instruction, on the other hand, zero-extends the 32-bit value from memory for RV64I. LH and LHU are defined analogously for 16-bit values, as are LB and LBU for 8-bit values. The SD, SW, SH, and SB instructions store 64-bit, 32-bit, 16-bit, and 8-bit values from the low bits of register rs2 to memory respectively.

4.4 HINT Instructions

All instructions that are microarchitectural HINTs in RV32I (see rv32) are also HINTs in RV64I.# The additional computational instructions in RV64I expand both the standard and custom HINT encoding spaces.

rv64i-h lists all RV64I HINT code points. 91% of the HINT space is reserved for standard HINTs. The remainder of the HINT space is designated for custom HINTs; no standard HINTs will ever be defined in this subspace.

InstructionConstraintsCode PointsPurpose
LUIrd=x0220Designated for future standard use
AUIPCrd=x0220
ADDIrd=x0, and either rs1x0 or imm≠0217−1
ANDIrd=x0217
ORIrd=x0217
XORIrd=x0217
ADDIWrd=x0217
ADDrd=x0, rs1x0210−32
ADDrd=x0, rs1=x0, rs2x2-x528
ADDrd=x0, rs1=x0, rs2=x2-x54(rs2=x5) NTL.ALL
SLLIrd=x0, rs1=x0, shamt=311Semihosting entry marker
SRAIrd=x0, rs1=x0, shamt=71Semihosting exit marker
SUBrd=x0210Designated for future standard use
ANDrd=x0210
ORrd=x0210
XORrd=x0210
SLLrd=x0210
SRLrd=x0210
SRArd=x0210
ADDWrd=x0210
SUBWrd=x0210
SLLWrd=x0210
SRLWrd=x0210
SRAWrd=x0210
FENCErd=x0, rs1x0, fm=0, and either pred=0 or succ=0210−63
FENCErdx0, rs1=x0, fm=0, and either pred=0 or succ=0210−63
FENCErd=rs1=x0, fm=0, pred=0, succ≠015
FENCErd=rs1=x0, fm=0, pred≠W, succ=015
FENCErd=rs1=x0, fm=0, pred=W, succ=01PAUSE
SLTIrd=x0217Designated for custom use
SLTIUrd=x0217
SLLIrd=x0, and either rs1x0 or shamt≠31211−1
SRLIrd=x0211
SRAIrd=x0, and either rs1x0 or shamt≠7211−1
SLLIWrd=x0210
SRLIWrd=x0210
SRAIWrd=x0210
SLTrd=x0210
SLTUrd=x0210
note

slli x0, x0, 0x1f and srai x0, x0, 7 were previously designated as custom HINTs, but they have been appropriated for use in semihosting calls, as described in ecall-ebreak. To reflect their usage in practice, the base ISA spec has been changed to designate them as standard HINTs.