ok alright alright alright alright alright

This commit is contained in:
2026-08-26 14:33:36 +02:00
parent 1c5659b79a
commit e44f52212f
3 changed files with 32 additions and 69 deletions
View File
+32 -69
View File
@@ -1,3 +1,31 @@
pub trait RegisterValue: Sized {
fn read_from(raw: i64) -> Self;
fn write_to(value: Self) -> i64;
}
macro_rules! impl_register_value {
($ty:ty) => {
impl RegisterValue for $ty {
fn read_from(raw: i64) -> Self {
raw as $ty
}
fn write_to(value: Self) -> i64 {
value as i64
}
}
};
}
impl_register_value!(u8);
impl_register_value!(i8);
impl_register_value!(u16);
impl_register_value!(i16);
impl_register_value!(u32);
impl_register_value!(i32);
impl_register_value!(u64);
impl_register_value!(i64);
pub struct Registers {
delay_slot: bool,
prev_delay_slot: bool,
@@ -37,81 +65,16 @@ impl Registers {
self.next_pc = self.pc + 4;
}
pub fn read_u8(&self, idx: usize) -> u8 {
self.gpr[idx] as u8
pub fn read<T: RegisterValue>(&self, idx: usize) -> T {
T::read_from(self.gpr[idx])
}
pub fn read_i8(&self, idx: usize) -> i8 {
self.gpr[idx] as i8
}
pub fn read_u16(&self, idx: usize) -> u16 {
self.gpr[idx] as u16
}
pub fn read_u32(&self, idx: usize) -> u32 {
self.gpr[idx] as u32
}
pub fn read_i16(&self, idx: usize) -> i16 {
self.gpr[idx] as i16
}
pub fn read_i32(&self, idx: usize) -> i32 {
self.gpr[idx] as i32
}
pub fn write_u8(&mut self, idx: usize, val: u8) {
pub fn write<T: RegisterValue>(&mut self, idx: usize, val: T) {
if idx == 0 {
return;
}
self.constant_regs |= 1 << idx;
self.gpr[idx] = val as i64;
}
pub fn write_i8(&mut self, idx: usize, val: i8) {
if idx == 0 {
return;
}
self.constant_regs |= 1 << idx;
self.gpr[idx] = val as i64;
}
pub fn write_u16(&mut self, idx: usize, val: u16) {
if idx == 0 {
return;
}
self.constant_regs |= 1 << idx;
self.gpr[idx] = val as i64;
}
pub fn write_u32(&mut self, idx: usize, val: u32) {
if idx == 0 {
return;
}
self.constant_regs |= 1 << idx;
self.gpr[idx] = val as i64;
}
pub fn write_i16(&mut self, idx: usize, val: i16) {
if idx == 0 {
return;
}
self.constant_regs |= 1 << idx;
self.gpr[idx] = val as i64;
}
pub fn write_i32(&mut self, idx: usize, val: i32) {
if idx == 0 {
return;
}
self.constant_regs |= 1 << idx;
self.gpr[idx] = val as i64;
self.gpr[idx] = T::write_to(val);
}
}