pub enum Instruction {
Show 156 variants
Lui {
dest: IRegister,
imm: UImmediate,
},
Auipc {
dest: IRegister,
imm: UImmediate,
},
Jal {
dest: IRegister,
offset: JImmediate,
},
Jalr {
dest: IRegister,
base: IRegister,
offset: IImmediate,
},
Beq {
src1: IRegister,
src2: IRegister,
offset: BImmediate,
},
Bne {
src1: IRegister,
src2: IRegister,
offset: BImmediate,
},
Blt {
src1: IRegister,
src2: IRegister,
offset: BImmediate,
},
Bge {
src1: IRegister,
src2: IRegister,
offset: BImmediate,
},
Bltu {
src1: IRegister,
src2: IRegister,
offset: BImmediate,
},
Bgeu {
src1: IRegister,
src2: IRegister,
offset: BImmediate,
},
Lb {
dest: IRegister,
base: IRegister,
offset: IImmediate,
},
Lh {
dest: IRegister,
base: IRegister,
offset: IImmediate,
},
Lw {
dest: IRegister,
base: IRegister,
offset: IImmediate,
},
Lbu {
dest: IRegister,
base: IRegister,
offset: IImmediate,
},
Lhu {
dest: IRegister,
base: IRegister,
offset: IImmediate,
},
Sb {
src: IRegister,
base: IRegister,
offset: SImmediate,
},
Sh {
src: IRegister,
base: IRegister,
offset: SImmediate,
},
Sw {
src: IRegister,
base: IRegister,
offset: SImmediate,
},
Addi {
dest: IRegister,
src: IRegister,
imm: IImmediate,
},
Slti {
dest: IRegister,
src: IRegister,
imm: IImmediate,
},
Sltiu {
dest: IRegister,
src: IRegister,
imm: IImmediate,
},
Xori {
dest: IRegister,
src: IRegister,
imm: IImmediate,
},
Ori {
dest: IRegister,
src: IRegister,
imm: IImmediate,
},
Andi {
dest: IRegister,
src: IRegister,
imm: IImmediate,
},
Slli {
dest: IRegister,
src: IRegister,
shamt: Shamt,
},
Srli {
dest: IRegister,
src: IRegister,
shamt: Shamt,
},
Srai {
dest: IRegister,
src: IRegister,
shamt: Shamt,
},
Add {
dest: IRegister,
src1: IRegister,
src2: IRegister,
},
Sub {
dest: IRegister,
src1: IRegister,
src2: IRegister,
},
Sll {
dest: IRegister,
src1: IRegister,
src2: IRegister,
},
Slt {
dest: IRegister,
src1: IRegister,
src2: IRegister,
},
Sltu {
dest: IRegister,
src1: IRegister,
src2: IRegister,
},
Xor {
dest: IRegister,
src1: IRegister,
src2: IRegister,
},
Srl {
dest: IRegister,
src1: IRegister,
src2: IRegister,
},
Sra {
dest: IRegister,
src1: IRegister,
src2: IRegister,
},
Or {
dest: IRegister,
src1: IRegister,
src2: IRegister,
},
And {
dest: IRegister,
src1: IRegister,
src2: IRegister,
},
Fence {
rd: IRegister,
rs1: IRegister,
ops: u8,
fm: u8,
},
Ecall,
Ebreak,
Lwu {
dest: IRegister,
base: IRegister,
offset: IImmediate,
},
Ld {
dest: IRegister,
base: IRegister,
offset: IImmediate,
},
Sd {
src: IRegister,
base: IRegister,
offset: SImmediate,
},
Addiw {
dest: IRegister,
src: IRegister,
imm: IImmediate,
},
Slliw {
dest: IRegister,
src: IRegister,
shamt: ShamtW,
},
Srliw {
dest: IRegister,
src: IRegister,
shamt: ShamtW,
},
Sraiw {
dest: IRegister,
src: IRegister,
shamt: ShamtW,
},
Addw {
dest: IRegister,
src1: IRegister,
src2: IRegister,
},
Subw {
dest: IRegister,
src1: IRegister,
src2: IRegister,
},
Sllw {
dest: IRegister,
src1: IRegister,
src2: IRegister,
},
Srlw {
dest: IRegister,
src1: IRegister,
src2: IRegister,
},
Sraw {
dest: IRegister,
src1: IRegister,
src2: IRegister,
},
Mul {
dest: IRegister,
src1: IRegister,
src2: IRegister,
},
Mulh {
dest: IRegister,
src1: IRegister,
src2: IRegister,
},
Mulhsu {
dest: IRegister,
src1: IRegister,
src2: IRegister,
},
Mulhu {
dest: IRegister,
src1: IRegister,
src2: IRegister,
},
Div {
dest: IRegister,
src1: IRegister,
src2: IRegister,
},
Divu {
dest: IRegister,
src1: IRegister,
src2: IRegister,
},
Rem {
dest: IRegister,
src1: IRegister,
src2: IRegister,
},
Remu {
dest: IRegister,
src1: IRegister,
src2: IRegister,
},
Mulw {
dest: IRegister,
src1: IRegister,
src2: IRegister,
},
Divw {
dest: IRegister,
src1: IRegister,
src2: IRegister,
},
Divuw {
dest: IRegister,
src1: IRegister,
src2: IRegister,
},
Remw {
dest: IRegister,
src1: IRegister,
src2: IRegister,
},
Remuw {
dest: IRegister,
src1: IRegister,
src2: IRegister,
},
LrW {
dest: IRegister,
addr: IRegister,
aq: bool,
rl: bool,
},
ScW {
dest: IRegister,
addr: IRegister,
src: IRegister,
aq: bool,
rl: bool,
},
AmoswapW {
dest: IRegister,
addr: IRegister,
src: IRegister,
aq: bool,
rl: bool,
},
AmoaddW {
dest: IRegister,
addr: IRegister,
src: IRegister,
aq: bool,
rl: bool,
},
AmoxorW {
dest: IRegister,
addr: IRegister,
src: IRegister,
aq: bool,
rl: bool,
},
AmoandW {
dest: IRegister,
addr: IRegister,
src: IRegister,
aq: bool,
rl: bool,
},
AmoorW {
dest: IRegister,
addr: IRegister,
src: IRegister,
aq: bool,
rl: bool,
},
AmominW {
dest: IRegister,
addr: IRegister,
src: IRegister,
aq: bool,
rl: bool,
},
AmomaxW {
dest: IRegister,
addr: IRegister,
src: IRegister,
aq: bool,
rl: bool,
},
AmominuW {
dest: IRegister,
addr: IRegister,
src: IRegister,
aq: bool,
rl: bool,
},
AmomaxuW {
dest: IRegister,
addr: IRegister,
src: IRegister,
aq: bool,
rl: bool,
},
LrD {
dest: IRegister,
addr: IRegister,
aq: bool,
rl: bool,
},
ScD {
dest: IRegister,
addr: IRegister,
src: IRegister,
aq: bool,
rl: bool,
},
AmoswapD {
dest: IRegister,
addr: IRegister,
src: IRegister,
aq: bool,
rl: bool,
},
AmoaddD {
dest: IRegister,
addr: IRegister,
src: IRegister,
aq: bool,
rl: bool,
},
AmoxorD {
dest: IRegister,
addr: IRegister,
src: IRegister,
aq: bool,
rl: bool,
},
AmoandD {
dest: IRegister,
addr: IRegister,
src: IRegister,
aq: bool,
rl: bool,
},
AmoorD {
dest: IRegister,
addr: IRegister,
src: IRegister,
aq: bool,
rl: bool,
},
AmominD {
dest: IRegister,
addr: IRegister,
src: IRegister,
aq: bool,
rl: bool,
},
AmomaxD {
dest: IRegister,
addr: IRegister,
src: IRegister,
aq: bool,
rl: bool,
},
AmominuD {
dest: IRegister,
addr: IRegister,
src: IRegister,
aq: bool,
rl: bool,
},
AmomaxuD {
dest: IRegister,
addr: IRegister,
src: IRegister,
aq: bool,
rl: bool,
},
Flw {
dest: FRegister,
base: IRegister,
offset: IImmediate,
},
Fsw {
base: IRegister,
src: FRegister,
offset: SImmediate,
},
FmaddS {
dest: FRegister,
src1: FRegister,
src2: FRegister,
src3: FRegister,
rm: RoundingMode,
},
FmsubS {
dest: FRegister,
src1: FRegister,
src2: FRegister,
src3: FRegister,
rm: RoundingMode,
},
FnmsubS {
dest: FRegister,
src1: FRegister,
src2: FRegister,
src3: FRegister,
rm: RoundingMode,
},
FnmaddS {
dest: FRegister,
src1: FRegister,
src2: FRegister,
src3: FRegister,
rm: RoundingMode,
},
FaddS {
dest: FRegister,
src1: FRegister,
src2: FRegister,
rm: RoundingMode,
},
FsubS {
dest: FRegister,
src1: FRegister,
src2: FRegister,
rm: RoundingMode,
},
FmulS {
dest: FRegister,
src1: FRegister,
src2: FRegister,
rm: RoundingMode,
},
FdivS {
dest: FRegister,
src1: FRegister,
src2: FRegister,
rm: RoundingMode,
},
FsqrtS {
dest: FRegister,
src: FRegister,
rm: RoundingMode,
},
FsgnjS {
dest: FRegister,
src1: FRegister,
src2: FRegister,
},
FsgnjnS {
dest: FRegister,
src1: FRegister,
src2: FRegister,
},
FsgnjxS {
dest: FRegister,
src1: FRegister,
src2: FRegister,
},
FminS {
dest: FRegister,
src1: FRegister,
src2: FRegister,
},
FmaxS {
dest: FRegister,
src1: FRegister,
src2: FRegister,
},
FcvtWS {
dest: IRegister,
src: FRegister,
rm: RoundingMode,
},
FcvtWuS {
dest: IRegister,
src: FRegister,
rm: RoundingMode,
},
FmvXW {
dest: IRegister,
src: FRegister,
},
FeqS {
dest: IRegister,
src1: FRegister,
src2: FRegister,
},
FltS {
dest: IRegister,
src1: FRegister,
src2: FRegister,
},
FleS {
dest: IRegister,
src1: FRegister,
src2: FRegister,
},
FclassS {
dest: IRegister,
src: FRegister,
},
FcvtSW {
dest: FRegister,
src: IRegister,
rm: RoundingMode,
},
FcvtSWu {
dest: FRegister,
src: IRegister,
rm: RoundingMode,
},
FmvWX {
dest: FRegister,
src: IRegister,
},
FcvtLS {
dest: IRegister,
src: FRegister,
rm: RoundingMode,
},
FcvtLuS {
dest: IRegister,
src: FRegister,
rm: RoundingMode,
},
FcvtSL {
dest: FRegister,
src: IRegister,
rm: RoundingMode,
},
FcvtSLu {
dest: FRegister,
src: IRegister,
rm: RoundingMode,
},
Csrrw {
dest: IRegister,
src: IRegister,
csr: CSR,
},
Csrrs {
dest: IRegister,
src: IRegister,
csr: CSR,
},
Csrrc {
dest: IRegister,
src: IRegister,
csr: CSR,
},
Csrrwi {
dest: IRegister,
imm: CSRImmediate,
csr: CSR,
},
Csrrsi {
dest: IRegister,
imm: CSRImmediate,
csr: CSR,
},
Csrrci {
dest: IRegister,
imm: CSRImmediate,
csr: CSR,
},
FenceI,
Fld {
dest: FRegister,
base: IRegister,
offset: IImmediate,
},
Fsd {
src: FRegister,
base: IRegister,
offset: SImmediate,
},
FmaddD {
dest: FRegister,
src1: FRegister,
src2: FRegister,
src3: FRegister,
rm: RoundingMode,
},
FmsubD {
dest: FRegister,
src1: FRegister,
src2: FRegister,
src3: FRegister,
rm: RoundingMode,
},
FnmaddD {
dest: FRegister,
src1: FRegister,
src2: FRegister,
src3: FRegister,
rm: RoundingMode,
},
FnmsubD {
dest: FRegister,
src1: FRegister,
src2: FRegister,
src3: FRegister,
rm: RoundingMode,
},
FaddD {
dest: FRegister,
src1: FRegister,
src2: FRegister,
rm: RoundingMode,
},
FsubD {
dest: FRegister,
src1: FRegister,
src2: FRegister,
rm: RoundingMode,
},
FmulD {
dest: FRegister,
src1: FRegister,
src2: FRegister,
rm: RoundingMode,
},
FdivD {
dest: FRegister,
src1: FRegister,
src2: FRegister,
rm: RoundingMode,
},
FsqrtD {
dest: FRegister,
src: FRegister,
rm: RoundingMode,
},
FsgnjD {
dest: FRegister,
src1: FRegister,
src2: FRegister,
},
FsgnjnD {
dest: FRegister,
src1: FRegister,
src2: FRegister,
},
FsgnjxD {
dest: FRegister,
src1: FRegister,
src2: FRegister,
},
FminD {
dest: FRegister,
src1: FRegister,
src2: FRegister,
},
FmaxD {
dest: FRegister,
src1: FRegister,
src2: FRegister,
},
FcvtSD {
dest: FRegister,
src: FRegister,
rm: RoundingMode,
},
FcvtDS {
dest: FRegister,
src: FRegister,
rm: RoundingMode,
},
FeqD {
dest: IRegister,
src1: FRegister,
src2: FRegister,
},
FltD {
dest: IRegister,
src1: FRegister,
src2: FRegister,
},
FleD {
dest: IRegister,
src1: FRegister,
src2: FRegister,
},
FclassD {
dest: IRegister,
src1: FRegister,
},
FcvtWD {
dest: IRegister,
src1: FRegister,
rm: RoundingMode,
},
FcvtWuD {
dest: IRegister,
src1: FRegister,
rm: RoundingMode,
},
FcvtDW {
dest: FRegister,
src1: IRegister,
rm: RoundingMode,
},
FcvtDWu {
dest: FRegister,
src1: IRegister,
rm: RoundingMode,
},
FcvtLD {
dest: IRegister,
src1: FRegister,
rm: RoundingMode,
},
FcvtLuD {
dest: IRegister,
src1: FRegister,
rm: RoundingMode,
},
FmvXD {
dest: IRegister,
src: FRegister,
},
FcvtDL {
dest: FRegister,
src: IRegister,
rm: RoundingMode,
},
FcvtDLu {
dest: FRegister,
src: IRegister,
rm: RoundingMode,
},
FmvDX {
dest: FRegister,
src: IRegister,
},
}Variants§
Lui
Load upper immediate
Auipc
Add upper immediate to PC
Jal
Jump and Link
Jalr
Jump and Link Register
Beq
Bne
Blt
Bge
Bltu
Bgeu
Lb
Load Byte
Lh
Load Halfword
Lw
Load Word
Lbu
Load Byte Unsigned
Lhu
Load Halfword Unsigned
Sb
Store Byte
Sh
Store Halfword
Sw
Store Word
Addi
Slti
Sltiu
Xori
Ori
Andi
Slli
Left Shift Immediate
Srli
Logical Right Shift Immediate
Srai
Arithmetic Right Shift Immediate
Add
Sub
Sll
Left Shift
Slt
Sltu
Xor
Srl
Logical Right Shift Immediate
Sra
Arithmetic Right Shift Immediate
Or
And
Fence
Ecall
Ebreak
Lwu
Load Word Unsigned
Ld
Load Doubleword
Sd
Store Doubleword
Addiw
Add Immediate (word)
Slliw
Left Shift Immediate (word)
Srliw
Logical Right Shift Immediate (word)
Sraiw
Arithmetic Right Shift Immediate (word)
Addw
Add (word)
Subw
Subtract (word)
Sllw
Left Shift (word)
Srlw
Logical Right Shift (word)
Sraw
Arithmetic Right Shift (word)
Mul
Multiply
Mulh
Multiply (High bits)
Mulhsu
Multiply Signed-Unsigned (High bits)
Mulhu
Multiply Unsigned (High)
Div
Divide
Divu
Divide (Unsigned)
Rem
Remainder
Remu
Remainder (Unsigned)
Mulw
Multiply Word
Divw
Divide Word
Divuw
Divide Unsigned Word
Remw
Remainder Word
Remuw
Remainder Unsigned Word
LrW
Load Reserved Word
ScW
AmoswapW
AmoaddW
AmoxorW
AmoandW
AmoorW
AmominW
AmomaxW
AmominuW
AmomaxuW
LrD
ScD
AmoswapD
AmoaddD
AmoxorD
AmoandD
AmoorD
AmominD
AmomaxD
AmominuD
AmomaxuD
Flw
Fsw
FmaddS
FmsubS
FnmsubS
FnmaddS
FaddS
FsubS
FmulS
FdivS
FsqrtS
FsgnjS
FsgnjnS
FsgnjxS
FminS
FmaxS
FcvtWS
FcvtWuS
FmvXW
FeqS
FltS
FleS
FclassS
FcvtSW
FcvtSWu
FmvWX
FcvtLS
FcvtLuS
FcvtSL
FcvtSLu
Csrrw
Csrrs
Csrrc
Csrrwi
Csrrsi
Csrrci
FenceI
Fld
Fsd
FmaddD
FmsubD
FnmaddD
FnmsubD
FaddD
FsubD
FmulD
FdivD
FsqrtD
FsgnjD
FsgnjnD
FsgnjxD
FminD
FmaxD
FcvtSD
FcvtDS
FeqD
FltD
FleD
FclassD
FcvtWD
FcvtWuD
FcvtDW
FcvtDWu
FcvtLD
FcvtLuD
FmvXD
FcvtDL
FcvtDLu
FmvDX
Implementations§
Source§impl Instruction
impl Instruction
Sourcepub fn decode(instruction: u32) -> Result<Instruction, String>
pub fn decode(instruction: u32) -> Result<Instruction, String>
Constructs an Instruction from it’s machine code representation.
Examples found in repository?
2fn main() {
3 // instruction can be assembled from strings
4 let instr: Instruction = assemble_line("addi t0, t1, 1024").unwrap().i();
5 // and disassembled
6 println!("assembled instruction: {}", instr);
7
8 // instructions can also be decoded from binary
9 let instr2 = Instruction::decode(0xe0058513).unwrap();
10
11 // and encoded
12 assert_eq!(Instruction::encode(&instr2), 0xe0058513);
13
14 let instr2 = assemble_line("fcvt.lu.s zero,ft0,rne").unwrap().i();
15 println!("assembled instruction: {}", instr2);
16}More examples
4fn main() {
5 let mut valid: u32 = 0;
6 for x in 0..u32::MAX {
7 if x % 10000 == 0 {
8 println!("{:.4}%", 100.0 * (x as f64) / (u32::MAX as f64))
9 }
10 if let Ok(i) = Instruction::decode(x) {
11 valid += 1;
12 let e = Instruction::encode(&i);
13 if x != e {
14 println!("i: {i}\nx: {x:032b}\ne: {e:032b}");
15 exit(1);
16 }
17
18 let d = i.to_string();
19 let i2 = assemble_line(&d).unwrap().i();
20 if i != i2 {
21 println!("disassembled {i:#?} to get {d}. Assembled to get {i2:#?}!");
22 exit(1);
23 }
24 }
25 }
26 println!("Done.");
27 println!("proportion of encoding space used: {}%", 100.0 * (valid as f64) / (u32::MAX as f64))
28}Sourcepub fn encode(instruction: &Instruction) -> u32
pub fn encode(instruction: &Instruction) -> u32
Examples found in repository?
2fn main() {
3 // instruction can be assembled from strings
4 let instr: Instruction = assemble_line("addi t0, t1, 1024").unwrap().i();
5 // and disassembled
6 println!("assembled instruction: {}", instr);
7
8 // instructions can also be decoded from binary
9 let instr2 = Instruction::decode(0xe0058513).unwrap();
10
11 // and encoded
12 assert_eq!(Instruction::encode(&instr2), 0xe0058513);
13
14 let instr2 = assemble_line("fcvt.lu.s zero,ft0,rne").unwrap().i();
15 println!("assembled instruction: {}", instr2);
16}More examples
4fn main() {
5 let mut valid: u32 = 0;
6 for x in 0..u32::MAX {
7 if x % 10000 == 0 {
8 println!("{:.4}%", 100.0 * (x as f64) / (u32::MAX as f64))
9 }
10 if let Ok(i) = Instruction::decode(x) {
11 valid += 1;
12 let e = Instruction::encode(&i);
13 if x != e {
14 println!("i: {i}\nx: {x:032b}\ne: {e:032b}");
15 exit(1);
16 }
17
18 let d = i.to_string();
19 let i2 = assemble_line(&d).unwrap().i();
20 if i != i2 {
21 println!("disassembled {i:#?} to get {d}. Assembled to get {i2:#?}!");
22 exit(1);
23 }
24 }
25 }
26 println!("Done.");
27 println!("proportion of encoding space used: {}%", 100.0 * (valid as f64) / (u32::MAX as f64))
28}