relative JAL

soft-float
Erin 2023-10-20 00:42:45 +02:00
parent 0e701e31b5
commit a944a145ed
2 changed files with 15 additions and 4 deletions

View File

@ -82,8 +82,8 @@
0x51, BMC, RRH, "Copy block of memory" ;
0x52, BRC, RRB, "Copy register block" ;
0x53, JMP, O, "Relative jump" ;
0x54, JAL, RRA, "Linking absolute jump" ;
0x55, JALR, RRO, "Linking relative jump" ;
0x54, JAL, RRO, "Linking relative jump" ;
0x55, JALA, RRA, "Linking absolute jump" ;
0x56, JEQ, RRP, "Branch on equal" ;
0x57, JNE, RRP, "Branch on nonequal" ;
0x58, JLT, RRP, "Branch on lesser-than (signed)" ;

View File

@ -280,7 +280,16 @@ where
JMP => handler!(self, |OpsO(off)| self.pc = self.pc.wrapping_add(off)),
JAL => handler!(self, |OpsRRW(save, reg, offset)| {
// Jump and link. Save PC after this instruction to
// specified register and jump to reg + offset.
// specified register and jump to reg + relative offset.
self.write_reg(save, self.pc.get());
self.pc = self
.pc
.wrapping_add(self.read_reg(reg).cast::<u64>())
.wrapping_add(offset);
}),
JALA => handler!(self, |OpsRRW(save, reg, offset)| {
// Jump and link. Save PC after this instruction to
// specified register and jump to reg
self.write_reg(save, self.pc.get());
self.pc = Address::new(
self.read_reg(reg).cast::<u64>().wrapping_add(offset.into()),
@ -400,7 +409,9 @@ where
/// Bump instruction pointer
#[inline(always)]
fn bump_pc<T: Copy, const PAST_OP: bool>(&mut self) {
self.pc = self.pc.wrapping_add(core::mem::size_of::<T>() + PAST_OP as usize);
self.pc = self
.pc
.wrapping_add(core::mem::size_of::<T>() + PAST_OP as usize);
}
/// Decode instruction operands