#[non_exhaustive]pub enum Inst {
Show 68 variants
Lui {
uimm: Imm,
dest: Reg,
},
Auipc {
uimm: Imm,
dest: Reg,
},
Jal {
offset: Imm,
dest: Reg,
},
Jalr {
offset: Imm,
base: Reg,
dest: Reg,
},
Beq {
offset: Imm,
src1: Reg,
src2: Reg,
},
Bne {
offset: Imm,
src1: Reg,
src2: Reg,
},
Blt {
offset: Imm,
src1: Reg,
src2: Reg,
},
Bge {
offset: Imm,
src1: Reg,
src2: Reg,
},
Bltu {
offset: Imm,
src1: Reg,
src2: Reg,
},
Bgeu {
offset: Imm,
src1: Reg,
src2: Reg,
},
Lb {
offset: Imm,
dest: Reg,
base: Reg,
},
Lbu {
offset: Imm,
dest: Reg,
base: Reg,
},
Lh {
offset: Imm,
dest: Reg,
base: Reg,
},
Lhu {
offset: Imm,
dest: Reg,
base: Reg,
},
Lw {
offset: Imm,
dest: Reg,
base: Reg,
},
Lwu {
offset: Imm,
dest: Reg,
base: Reg,
},
Ld {
offset: Imm,
dest: Reg,
base: Reg,
},
Sb {
offset: Imm,
src: Reg,
base: Reg,
},
Sh {
offset: Imm,
src: Reg,
base: Reg,
},
Sw {
offset: Imm,
src: Reg,
base: Reg,
},
Sd {
offset: Imm,
src: Reg,
base: Reg,
},
Addi {
imm: Imm,
dest: Reg,
src1: Reg,
},
AddiW {
imm: Imm,
dest: Reg,
src1: Reg,
},
Slti {
imm: Imm,
dest: Reg,
src1: Reg,
},
Sltiu {
imm: Imm,
dest: Reg,
src1: Reg,
},
Xori {
imm: Imm,
dest: Reg,
src1: Reg,
},
Ori {
imm: Imm,
dest: Reg,
src1: Reg,
},
Andi {
imm: Imm,
dest: Reg,
src1: Reg,
},
Slli {
imm: Imm,
dest: Reg,
src1: Reg,
},
SlliW {
imm: Imm,
dest: Reg,
src1: Reg,
},
Srli {
imm: Imm,
dest: Reg,
src1: Reg,
},
SrliW {
imm: Imm,
dest: Reg,
src1: Reg,
},
Srai {
imm: Imm,
dest: Reg,
src1: Reg,
},
SraiW {
imm: Imm,
dest: Reg,
src1: Reg,
},
Add {
dest: Reg,
src1: Reg,
src2: Reg,
},
AddW {
dest: Reg,
src1: Reg,
src2: Reg,
},
Sub {
dest: Reg,
src1: Reg,
src2: Reg,
},
SubW {
dest: Reg,
src1: Reg,
src2: Reg,
},
Sll {
dest: Reg,
src1: Reg,
src2: Reg,
},
SllW {
dest: Reg,
src1: Reg,
src2: Reg,
},
Slt {
dest: Reg,
src1: Reg,
src2: Reg,
},
Sltu {
dest: Reg,
src1: Reg,
src2: Reg,
},
Xor {
dest: Reg,
src1: Reg,
src2: Reg,
},
Srl {
dest: Reg,
src1: Reg,
src2: Reg,
},
SrlW {
dest: Reg,
src1: Reg,
src2: Reg,
},
Sra {
dest: Reg,
src1: Reg,
src2: Reg,
},
SraW {
dest: Reg,
src1: Reg,
src2: Reg,
},
Or {
dest: Reg,
src1: Reg,
src2: Reg,
},
And {
dest: Reg,
src1: Reg,
src2: Reg,
},
Fence {
fence: Fence,
},
Ecall,
Ebreak,
Mul {
dest: Reg,
src1: Reg,
src2: Reg,
},
MulW {
dest: Reg,
src1: Reg,
src2: Reg,
},
Mulh {
dest: Reg,
src1: Reg,
src2: Reg,
},
Mulhsu {
dest: Reg,
src1: Reg,
src2: Reg,
},
Mulhu {
dest: Reg,
src1: Reg,
src2: Reg,
},
Div {
dest: Reg,
src1: Reg,
src2: Reg,
},
DivW {
dest: Reg,
src1: Reg,
src2: Reg,
},
Divu {
dest: Reg,
src1: Reg,
src2: Reg,
},
DivuW {
dest: Reg,
src1: Reg,
src2: Reg,
},
Rem {
dest: Reg,
src1: Reg,
src2: Reg,
},
RemW {
dest: Reg,
src1: Reg,
src2: Reg,
},
Remu {
dest: Reg,
src1: Reg,
src2: Reg,
},
RemuW {
dest: Reg,
src1: Reg,
src2: Reg,
},
LrW {
order: AmoOrdering,
dest: Reg,
addr: Reg,
},
ScW {
order: AmoOrdering,
dest: Reg,
addr: Reg,
src: Reg,
},
AmoW {
order: AmoOrdering,
op: AmoOp,
dest: Reg,
addr: Reg,
src: Reg,
},
}Expand description
A RISC-V instruction.
Every variant is a different instruction, with immediates as u32.
For instructions that sign-extend immediates, the immediates will have been
sign-extended already, so the value can be used as-is.
For instructions that have immediates in the upper bits (lui, auipc),
the shift will have been done already, so the value can also be used as-is.
Variants (Non-exhaustive)§
This enum is marked as non-exhaustive
Lui
Load Upper Immediate
Auipc
Add Upper Immediate to PC
Jal
Jump And Link
Jalr
Jump And Link Register (indirect)
Beq
Branch Equal
Bne
Branch Not Equal
Blt
Branch Less Than (signed)
Bge
Branch Greater or Equal (signed)
Bltu
Branch Less Than Unsigned
Bgeu
Branch Greater or Equal Unsigned
Lb
Load Byte (sign-ext)
Lbu
Load Unsigned Byte (zero-ext)
Lh
Load Half (sign-ext)
Lhu
Load Unsigned Half (zero-ext)
Lw
Load Word (on RV64: sign-ext)
Lwu
Load Word (zero-ext) (RV64 only)
Ld
Load Doubleword (RV64 only)
Sb
Store Byte
Sh
Store Half
Sw
Store Word
Sd
Store Doubleword (RV64 only)
Addi
Add Immediate
AddiW
Add Immediate 32-bit (RV64 only)
Slti
Set Less Than Immediate (signed)
Sltiu
Set Less Than Immediate Unsigned
Xori
XOR Immediate
Ori
OR Immediate
Andi
AND Immediate
Slli
Shift Left Logical Immediate
SlliW
Shift Left Logical Immediate 32-bit (RV64 only)
Srli
Shift Right Logical Immediate (unsigned)
SrliW
Shift Right Logical Immediate (unsigned) 32-bit (RV64 only)
Srai
Shift Right Arithmetic Immediate (signed)
SraiW
Shift Right Arithmetic Immediate (signed) 32-bit (RV64 only)
Add
Add
AddW
Add 32-bit (RV64 only)
Sub
Subtract
SubW
Subtract 32-bit (RV64 only)
Sll
Shift Left Logical
SllW
Shift Left Logical 32-bit (RV64 only)
Slt
Set Less Than (signed)
Sltu
Set Less Than Unsigned
Xor
XOR
Srl
Shift Right Logical (unsigned)
SrlW
Shift Right Logical (unsigned) 32-bit (RV64 only)
Sra
Shift Right Arithmetic (unsigned)
SraW
Shift Right Arithmetic (unsigned) 32-bit (RV64 only)
Or
OR
And
AND
Fence
Memory Fence
Ecall
ECALL, call into environment
Ebreak
EBREAK, break into debugger
Mul
Multiply
MulW
Multiply 32-bit (RV64 only)
Mulh
Mul Upper Half Signed-Signed
Mulhsu
Mul Upper Half Signed-Unsigned
Mulhu
Mul Upper Half Unsigned-Unsigned
Div
Divide (signed)
DivW
Divide (signed) 32-bit (RV64 only)
Divu
Divide Unsigned
DivuW
Divide Unsigned 32-bit (RV64 only)
Rem
Remainder (signed)
RemW
Remainder (signed) 32-bit (RV64 only)
Remu
Remainder Unsigned
RemuW
Remainder Unsigned 32-bit (RV64 only)
LrW
Load-Reserved Word
ScW
Store-Conditional Word
AmoW
Atomic Memory Operation
Implementations§
Source§impl Inst
impl Inst
Sourcepub fn first_byte_is_compressed(byte: u8) -> bool
pub fn first_byte_is_compressed(byte: u8) -> bool
Whether the first byte of an instruction indicates a compressed or uncompressed instruction.
§Examples
// addi sp, sp, -0x20 (compressed)
let x = 0x1101_u32;
assert!(rvdc::Inst::first_byte_is_compressed(x.to_le_bytes()[0]));
let x = 0x1101_u16;
assert!(rvdc::Inst::first_byte_is_compressed(x.to_le_bytes()[0]));// auipc t1, 0xa
let x = 0x0000a317_u32;
assert!(!rvdc::Inst::first_byte_is_compressed(x.to_le_bytes()[0]));Sourcepub fn decode(
code: u32,
xlen: Xlen,
) -> Result<(Inst, IsCompressed), DecodeError>
pub fn decode( code: u32, xlen: Xlen, ) -> Result<(Inst, IsCompressed), DecodeError>
Decode an instruction from four bytes.
The instruction may be compressed, in which case only two bytes are consumed. Even in these cases, the full next four bytes must be passed.
If the caller wants to avoid reading more bytes than necessary, Self::first_byte_is_compressed
can be used to check, read the required bytes, and then call Self::decode_compressed or
Self::decode_normal directly.
Sourcepub fn decode_compressed(code: u16, xlen: Xlen) -> Result<Inst, DecodeError>
pub fn decode_compressed(code: u16, xlen: Xlen) -> Result<Inst, DecodeError>
Decode a known compressed instruction from its two bytes.
§Example
// Compressed addi sp, sp, -0x20
let x = 0x1101_u16;
let expected = rvdc::Inst::Addi { imm: rvdc::Imm::new_i32(-0x20), dest: rvdc::Reg::SP, src1: rvdc::Reg::SP };
let inst = rvdc::Inst::decode_compressed(x, rvdc::Xlen::Rv32).unwrap();
assert_eq!(inst, expected);Sourcepub fn decode_normal(code: u32, xlen: Xlen) -> Result<Inst, DecodeError>
pub fn decode_normal(code: u32, xlen: Xlen) -> Result<Inst, DecodeError>
Decode a normal (not compressed) instruction.
Sourcepub fn encode_normal(&self, xlen: Xlen) -> u32
pub fn encode_normal(&self, xlen: Xlen) -> u32
Encode a normal (not compressed) instruction
Trait Implementations§
Source§impl Display for Inst
Prints the instruction in disassembled form.
impl Display for Inst
Prints the instruction in disassembled form.
Note that the precise output here is not considered stable.