diff --git a/src/ext/i/mod.rs b/src/ext/i/mod.rs index 204328b..b589182 100644 --- a/src/ext/i/mod.rs +++ b/src/ext/i/mod.rs @@ -89,13 +89,19 @@ impl Instruction for JALR { } fn match_inst(&self, inst: rv32::Word) -> bool { - match_mask!(inst, "xxxxxxxxxxxxxxxxxxxxxxxxx1101111") + // testing against print + println!("JALR: {:032b}", inst); + println!("JALR: xxxxxxxxxxxxxxxxx000xxxxx1100111"); + match_mask!(inst, "xxxxxxxxxxxxxxxxx000xxxxx1100111") } fn step(&self, inst: GenInstruction, state: &mut cpu::CPUState) { println!("VM > Executing JALR"); let inst = unsafe { inst.I }; - + let offset = sext(inst.full_imm(), 32); + let pc = offset.wrapping_add(state.x[inst.rs1() as usize]); + state.x[inst.rd() as usize] = state.pc + rv32::WORD as u32; + state.pc = pc - 4; } } @@ -144,6 +150,7 @@ pub enum ExtensionI { LUI(LUI), AUIPC(AUIPC), JAL(JAL), + JALR(JALR), ADDI(ADDI), ADD(ADD), } diff --git a/test/Makefile b/test/Makefile index a2556eb..8a6ae6c 100644 --- a/test/Makefile +++ b/test/Makefile @@ -9,7 +9,7 @@ assemble: build: $(GCC_PREFIX)-gcc -Wl,-Ttext=0x0 -nostdlib -march=rv64i -mabi=lp64 -o $(TARGET) $(TARGET).S $(GCC_PREFIX)-objdump -t $(TARGET) > $(TARGET).map - $(GCC_PREFIX)-objdump -S $(TARGET) > $(TARGET).lst + $(GCC_PREFIX)-objdump -d -M no-aliases $(TARGET) > $(TARGET).lst $(GCC_PREFIX)-objcopy -O binary $(TARGET) $(TARGET).bin $(GCC_PREFIX)-objcopy -O ihex $(TARGET) $(TARGET).hex diff --git a/test/test b/test/test index 05aee2d..7310d2a 100755 Binary files a/test/test and b/test/test differ diff --git a/test/test.S b/test/test.S index 36686d7..a6a6400 100644 --- a/test/test.S +++ b/test/test.S @@ -1,7 +1,8 @@ -j main -lui x2, 0xFFFFF -addi t1, x0, 0x123 -auipc x3, 0x12345 +lui x1, 0xFFFFF +addi x2, x0, 0x123 +addi x2, x0, 0x123 +lui t1, 0x80000 # jalr main into x4 then jump to x4 +jalr t1, 0x4 main: addi t0, x0, 100 diff --git a/test/test.bin b/test/test.bin index 9f2b90d..60fd114 100755 Binary files a/test/test.bin and b/test/test.bin differ diff --git a/test/test.hex b/test/test.hex index 74e1655..f3b58b8 100644 --- a/test/test.hex +++ b/test/test.hex @@ -1,3 +1,3 @@ -:100000006F00000137F1FFFF1303301297513412D4 -:040010009302400611 +:10000000B7F0FFFF130130121301301237030080E5 +:08001000E700430093024006E3 :00000001FF diff --git a/test/test.lst b/test/test.lst index 072a4a1..2983058 100644 --- a/test/test.lst +++ b/test/test.lst @@ -4,11 +4,12 @@ test: file format elf64-littleriscv Disassembly of section .text: -0000000000000000 : - 0: 0100006f j 10
- 4: fffff137 lui sp,0xfffff - 8: 12300313 li t1,291 - c: 12345197 auipc gp,0x12345 +0000000000000000 : + 0: fffff0b7 lui ra,0xfffff + 4: 12300113 addi sp,zero,291 + 8: 12300113 addi sp,zero,291 + c: 80000337 lui t1,0x80000 + 10: 004300e7 jalr ra,4(t1) # ffffffff80000004 <__global_pointer$+0xffffffff7fffe7ec> -0000000000000010
: - 10: 06400293 li t0,100 +0000000000000014
: + 14: 06400293 addi t0,zero,100 diff --git a/test/test.map b/test/test.map index 820a49c..741db51 100644 --- a/test/test.map +++ b/test/test.map @@ -4,15 +4,15 @@ test: file format elf64-littleriscv SYMBOL TABLE: 0000000000000000 l d .text 0000000000000000 .text 0000000000000000 l d .riscv.attributes 0000000000000000 .riscv.attributes -0000000000000000 l df *ABS* 0000000000000000 ccC0QKeL.o -0000000000000010 l .text 0000000000000000 main -0000000000001814 g *ABS* 0000000000000000 __global_pointer$ -0000000000001014 g .text 0000000000000000 __SDATA_BEGIN__ +0000000000000000 l df *ABS* 0000000000000000 ccC2JIEu.o +0000000000000014 l .text 0000000000000000 main +0000000000001818 g *ABS* 0000000000000000 __global_pointer$ +0000000000001018 g .text 0000000000000000 __SDATA_BEGIN__ 0000000000000000 *UND* 0000000000000000 _start 0000000000001018 g .text 0000000000000000 __BSS_END__ -0000000000001014 g .text 0000000000000000 __bss_start -0000000000001014 g .text 0000000000000000 __DATA_BEGIN__ -0000000000001014 g .text 0000000000000000 _edata +0000000000001018 g .text 0000000000000000 __bss_start +0000000000001018 g .text 0000000000000000 __DATA_BEGIN__ +0000000000001018 g .text 0000000000000000 _edata 0000000000001018 g .text 0000000000000000 _end