Compare commits

..

1 commit

Author SHA1 Message Date
gkgoat1
104464b12b
Merge 07e2f754df into 8d01c9f1d7 2025-04-15 23:13:19 -04:00

View file

@ -235,13 +235,8 @@ pub enum Inst {
Lh { offset: Imm, dest: Reg, base: Reg }, Lh { offset: Imm, dest: Reg, base: Reg },
/// Load Unsigned Half (zero-ext) /// Load Unsigned Half (zero-ext)
Lhu { offset: Imm, dest: Reg, base: Reg }, Lhu { offset: Imm, dest: Reg, base: Reg },
/// Load Word (on RV64: sign-ext) /// Load Word
Lw { offset: Imm, dest: Reg, base: Reg }, Lw { offset: Imm, dest: Reg, base: Reg },
/// Load Word (zero-ext) (**RV64 only**)
Lwu { offset: Imm, dest: Reg, base: Reg },
/// Load Doubleword (**RV64 only**)
Ld { offset: Imm, dest: Reg, base: Reg },
/// Store Byte /// Store Byte
Sb { offset: Imm, src: Reg, base: Reg }, Sb { offset: Imm, src: Reg, base: Reg },
@ -249,8 +244,6 @@ pub enum Inst {
Sh { offset: Imm, src: Reg, base: Reg }, Sh { offset: Imm, src: Reg, base: Reg },
/// Store Word /// Store Word
Sw { offset: Imm, src: Reg, base: Reg }, Sw { offset: Imm, src: Reg, base: Reg },
/// Store Doubleword (**RV64 only**)
Sd { offset: Imm, src: Reg, base: Reg },
/// Add Immediate /// Add Immediate
Addi { imm: Imm, dest: Reg, src1: Reg }, Addi { imm: Imm, dest: Reg, src1: Reg },
@ -554,14 +547,9 @@ impl Display for Inst {
write!(f, "lhu {dest}, {}({base})", offset.as_i32()) write!(f, "lhu {dest}, {}({base})", offset.as_i32())
} }
Inst::Lw { offset, dest, base } => write!(f, "lw {dest}, {}({base})", offset.as_i32()), Inst::Lw { offset, dest, base } => write!(f, "lw {dest}, {}({base})", offset.as_i32()),
Inst::Lwu { offset, dest, base } => {
write!(f, "lwu {dest}, {}({base})", offset.as_i32())
}
Inst::Ld { offset, dest, base } => write!(f, "ld {dest}, {}({base})", offset.as_i32()),
Inst::Sb { offset, src, base } => write!(f, "sb {src}, {}({base})", offset.as_i32()), Inst::Sb { offset, src, base } => write!(f, "sb {src}, {}({base})", offset.as_i32()),
Inst::Sh { offset, src, base } => write!(f, "sh {src}, {}({base})", offset.as_i32()), Inst::Sh { offset, src, base } => write!(f, "sh {src}, {}({base})", offset.as_i32()),
Inst::Sw { offset, src, base } => write!(f, "sw {src}, {}({base})", offset.as_i32()), Inst::Sw { offset, src, base } => write!(f, "sw {src}, {}({base})", offset.as_i32()),
Inst::Sd { offset, src, base } => write!(f, "sd {src}, {}({base})", offset.as_i32()),
Inst::Addi { imm, dest, src1 } => { Inst::Addi { imm, dest, src1 } => {
if dest.0 == 0 && src1.0 == 0 && imm.as_u32() == 0 { if dest.0 == 0 && src1.0 == 0 && imm.as_u32() == 0 {
write!(f, "nop") write!(f, "nop")
@ -972,7 +960,7 @@ impl Inst {
/// let inst = rvdc::Inst::decode_compressed(x, rvdc::Xlen::Rv32).unwrap(); /// let inst = rvdc::Inst::decode_compressed(x, rvdc::Xlen::Rv32).unwrap();
/// assert_eq!(inst, expected); /// assert_eq!(inst, expected);
/// ``` /// ```
pub fn decode_compressed(code: u16, xlen: Xlen) -> Result<Inst, DecodeError> { pub fn decode_compressed(code: u16, _xlen: Xlen) -> Result<Inst, DecodeError> {
let code = InstCodeC(code); let code = InstCodeC(code);
if code.0 == 0 { if code.0 == 0 {
return Err(decode_error(code, "null instruction")); return Err(decode_error(code, "null instruction"));
@ -1189,7 +1177,7 @@ impl Inst {
0b010 => { 0b010 => {
let dest = code.rd(); let dest = code.rd();
if dest.0 == 0 { if dest.0 == 0 {
return Err(decode_error(code, "C.LWSP rd must not be zero")); return Err(decode_error(code, "C.LWSP rd"));
} }
Inst::Lw { Inst::Lw {
@ -1198,23 +1186,6 @@ impl Inst {
base: Reg::SP, base: Reg::SP,
} }
} }
// C.LDSP -> ld \reg \offset(sp)
0b011 => {
if xlen.is_32() {
return Err(decode_error(code, "C.LDSP is not allowed on RV32"));
}
let dest = code.rd();
if dest.0 == 0 {
return Err(decode_error(code, "C.LWSP rd must not be zero"));
}
Inst::Ld {
offset: code.immediate_u(&[(12..=12, 5), (4..=6, 2), (2..=3, 6)]),
dest,
base: Reg::SP,
}
}
0b100 => { 0b100 => {
let bit = code.extract(12..=12); let bit = code.extract(12..=12);
let rs2 = code.rs2(); let rs2 = code.rs2();
@ -1223,7 +1194,7 @@ impl Inst {
// C.JR -> jalr zero, 0(\rs1) // C.JR -> jalr zero, 0(\rs1)
(0, _, 0) => { (0, _, 0) => {
if rd_rs1.0 == 0 { if rd_rs1.0 == 0 {
return Err(decode_error(code, "C.JR rs1 must not be zero")); return Err(decode_error(code, "C.JR rs1"));
} }
Inst::Jalr { Inst::Jalr {
offset: Imm::ZERO, offset: Imm::ZERO,
@ -1260,17 +1231,6 @@ impl Inst {
src: code.rs2(), src: code.rs2(),
base: Reg::SP, base: Reg::SP,
}, },
// C.SDSP -> sd \reg \offset(sp)
0b111 => {
if xlen.is_32() {
return Err(decode_error(code, "C.SDSP is not allowed on RV32"));
}
Inst::Sd {
offset: code.immediate_u(&[(7..=9, 6), (10..=12, 3)]),
src: code.rs2(),
base: Reg::SP,
}
}
_ => return Err(decode_error(code, "C2 funct3")), _ => return Err(decode_error(code, "C2 funct3")),
}, },
_ => return Err(decode_error(code, "instruction is not compressed")), _ => return Err(decode_error(code, "instruction is not compressed")),
@ -1357,16 +1317,6 @@ impl Inst {
dest: code.rd(), dest: code.rd(),
base: code.rs1(), base: code.rs1(),
}, },
0b011 => {
if xlen.is_32() {
return Err(decode_error(code, "LD is not supported on RV32"));
}
Inst::Ld {
offset: code.imm_i(),
dest: code.rd(),
base: code.rs1(),
}
}
0b100 => Inst::Lbu { 0b100 => Inst::Lbu {
offset: code.imm_i(), offset: code.imm_i(),
dest: code.rd(), dest: code.rd(),
@ -1377,17 +1327,7 @@ impl Inst {
dest: code.rd(), dest: code.rd(),
base: code.rs1(), base: code.rs1(),
}, },
0b110 => { _ => return Err(decode_error(code, "LOAD funct3")),
if xlen.is_32() {
return Err(decode_error(code, "LWU is not supported on RV32"));
}
Inst::Lwu {
offset: code.imm_i(),
dest: code.rd(),
base: code.rs1(),
}
}
_ => return Err(decode_error(code, "Invalid funct3 for LOAD instruction")),
}, },
// STORE // STORE
0b0100011 => match code.funct3() { 0b0100011 => match code.funct3() {
@ -1406,16 +1346,6 @@ impl Inst {
src: code.rs2(), src: code.rs2(),
base: code.rs1(), base: code.rs1(),
}, },
0b011 => {
if xlen.is_32() {
return Err(decode_error(code, "SD is not supported on RV32"));
}
Inst::Sd {
offset: code.imm_s(),
src: code.rs2(),
base: code.rs1(),
}
}
_ => return Err(decode_error(code, "STORE funct3")), _ => return Err(decode_error(code, "STORE funct3")),
}, },
// OP-IMM // OP-IMM