summaryrefslogtreecommitdiff
path: root/src/core.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/core.rs')
-rw-r--r--src/core.rs57
1 files changed, 16 insertions, 41 deletions
diff --git a/src/core.rs b/src/core.rs
index 6317c9e..2746d1b 100644
--- a/src/core.rs
+++ b/src/core.rs
@@ -151,74 +151,53 @@ pub fn sltiu(state: &mut CpuState, rd: usize, rs1: usize, imm: u32) {
state.registers[rd] = if state.registers[rs1] < imm { 1 } else { 0 };
}
pub fn lb(state: &mut CpuState, rd: usize, rs1: usize, imm: u32) {
- let byte = state
- .memory
- .read((state.registers[rs1] + imm) as usize, 99)
- .unwrap();
+ let byte = state.memory.read(state.registers[rs1] + imm).unwrap();
state.registers[rd] = (byte as i8) as u32;
}
pub fn lh(state: &mut CpuState, rd: usize, rs1: usize, imm: u32) {
- let bytes = state
- .memory
- .read_multiple_bytes((state.registers[rs1] + imm) as usize, 2, 99)
- .unwrap();
-
- state.registers[rd] = (((bytes[1] as u16) << 8 | bytes[0] as u16) as i16) as u32;
+ let halfword = state.memory.read_halfword(state.registers[rs1] + imm).unwrap();
+ state.registers[rd] = (halfword as i16) as u32;
}
pub fn lw(state: &mut CpuState, rd: usize, rs1: usize, imm: u32) {
- let addr = (state.registers[rs1].wrapping_add(imm)) as usize;
- let slice = state.memory.read_multiple_bytes(addr, 4, 99).unwrap();
- let number = u32::from_le_bytes(slice[0..4].try_into().unwrap());
-
- state.registers[rd] = number;
+ let addr = state.registers[rs1].wrapping_add(imm);
+ let word = state.memory.read_word(addr).unwrap();
+ state.registers[rd] = word;
}
pub fn lbu(state: &mut CpuState, rd: usize, rs1: usize, imm: u32) {
state.registers[rd] = state
.memory
- .read((state.registers[rs1] + imm) as usize, 99)
+ .read(state.registers[rs1].wrapping_add(imm))
.unwrap() as u32;
}
pub fn lhu(state: &mut CpuState, rd: usize, rs1: usize, imm: u32) {
- let bytes = state
- .memory
- .read_multiple_bytes((state.registers[rs1] + imm) as usize, 2, 99)
- .unwrap();
-
- state.registers[rd] = ((bytes[1] as u16) << 8 | bytes[0] as u16) as u32;
+ state.registers[rd] = state.memory.read_halfword(state.registers[rs1] + imm).unwrap() as u32;
}
pub fn sb(state: &mut CpuState, rs1: usize, rs2: usize, imm: u32) {
- let addr = (state.registers[rs1] + imm) as usize;
+ let addr = state.registers[rs1] + imm;
state
.memory
- .write(addr, 99, state.registers[rs2] as u8)
+ .write(addr, state.registers[rs2] as u8)
.unwrap();
- state.release_reservations(&[addr]);
+ state.release_reservations(&[addr as usize]);
}
pub fn sh(state: &mut CpuState, rs1: usize, rs2: usize, imm: u32) {
let addr = (state.registers[rs1] + imm) as usize;
- let halfword = state.registers[rs2] & 0xFFFF;
-
- state
- .memory
- .write_multiple_bytes(addr, &[(halfword & 0xFF) as u8, (halfword >> 8) as u8], 99)
- .unwrap();
+ let halfword= (state.registers[rs2] & 0xFFFF) as u16;
+ state.memory.write_halfword(addr as u32, halfword).unwrap();
state.release_reservations(&[addr, addr + 1]);
}
pub fn sw(state: &mut CpuState, rs1: usize, rs2: usize, imm: u32) {
let addr = (state.registers[rs1] + imm) as usize;
- state
- .memory
- .write_multiple_bytes(addr, &state.registers[rs2].to_le_bytes(), 99)
- .unwrap();
+ state.memory.write_word(addr as u32, state.registers[rs2]).unwrap();
state.release_reservations(&[addr, addr + 1, addr + 2, addr + 3]);
}
@@ -362,14 +341,10 @@ pub fn amominu_w(state: &mut CpuState, rd: usize, rs1: usize, rs2: usize) {
}
fn load_word(state: &CpuState, addr: usize) -> u32 {
- let slice = state.memory.read_multiple_bytes(addr, 4, 99).unwrap();
- u32::from_le_bytes(slice[0..4].try_into().unwrap())
+ state.memory.read_word(addr as u32).unwrap()
}
fn store_word(state: &mut CpuState, addr: usize, value: u32) {
- state
- .memory
- .write_multiple_bytes(addr, &value.to_le_bytes(), 99)
- .unwrap();
+ state.memory.write_word(addr as u32, value).unwrap()
}
pub fn auipc(state: &mut CpuState, rd: usize, imm: u32) {