diff --git a/src/tinyriscv.h b/src/tinyriscv.h index adb24d8..08ccea1 100644 --- a/src/tinyriscv.h +++ b/src/tinyriscv.h @@ -45,15 +45,13 @@ static inline void store32(u8* mem, const u32 addr, const u32 val){ void tinyriscv_b_type(u32* pc, const u8 func3, const u32 x[32], const u8 rs1, const u8 rs2, const i16 imm){ - *pc -= 4; - switch(func3){ - case /*BEQ*/ 0: if(x[rs1] == x[rs2]) *pc += (i32)imm; break; - case /*BNE*/ 1: if(x[rs1] != x[rs2]) *pc += (i32)imm; break; - case /*BLT*/ 4: if((i32)x[rs1] < (i32)x[rs2]) *pc += (i32)imm; break; - case /*BGE*/ 5: if((i32)x[rs1] >= (i32)x[rs2]) *pc += (i32)imm; break; - case /*BLTU*/ 6: if(x[rs1] < x[rs2]) *pc += (i32)imm; break; - case /*BGEU*/ 7: if(x[rs1] >= x[rs2]) *pc += (i32)imm; break; + case /*BEQ*/ 0: if(x[rs1] == x[rs2]) *pc += (i32)imm - 4; break; + case /*BNE*/ 1: if(x[rs1] != x[rs2]) *pc += (i32)imm - 4; break; + case /*BLT*/ 4: if((i32)x[rs1] < (i32)x[rs2]) *pc += (i32)imm - 4; break; + case /*BGE*/ 5: if((i32)x[rs1] >= (i32)x[rs2]) *pc += (i32)imm - 4; break; + case /*BLTU*/ 6: if(x[rs1] < x[rs2]) *pc += (i32)imm - 4; break; + case /*BGEU*/ 7: if(x[rs1] >= x[rs2]) *pc += (i32)imm - 4; break; } } diff --git a/tests/1.bin b/tests/1.bin index cca4910..05a38aa 100755 Binary files a/tests/1.bin and b/tests/1.bin differ diff --git a/tests/1.c b/tests/1.c new file mode 100644 index 0000000..7676ae9 --- /dev/null +++ b/tests/1.c @@ -0,0 +1,10 @@ +#include + +int main(){ + uint8_t* ptr = 0x800000F0; + + for(int i = 0; i < 16; i++){ + *ptr = i; + ptr++; + } +} \ No newline at end of file diff --git a/tests/1.s b/tests/1.s new file mode 100644 index 0000000..521b0be --- /dev/null +++ b/tests/1.s @@ -0,0 +1,40 @@ + .file "1.c" + .option nopic + .attribute arch, "rv32i2p1" + .attribute unaligned_access, 0 + .attribute stack_align, 16 + .text + .align 2 + .globl main + .type main, @function +main: + addi sp,sp,-32 + sw s0,28(sp) + addi s0,sp,32 + li a5,-2147483648 + addi a5,a5,240 + sw a5,-20(s0) + sw zero,-24(s0) + j .L2 +.L3: + lw a5,-24(s0) + andi a4,a5,0xff + lw a5,-20(s0) + sb a4,0(a5) + lw a5,-20(s0) + addi a5,a5,1 + sw a5,-20(s0) + lw a5,-24(s0) + addi a5,a5,1 + sw a5,-24(s0) +.L2: + lw a4,-24(s0) + li a5,15 + ble a4,a5,.L3 + li a5,0 + mv a0,a5 + lw s0,28(sp) + addi sp,sp,32 + jr ra + .size main, .-main + .ident "GCC: () 13.2.0" diff --git a/tests/a.out b/tests/a.out index 342c943..8745bf8 100755 Binary files a/tests/a.out and b/tests/a.out differ diff --git a/tests/main.c b/tests/main.c deleted file mode 100644 index 98f7e00..0000000 --- a/tests/main.c +++ /dev/null @@ -1,3 +0,0 @@ -int main(){ - -} \ No newline at end of file diff --git a/tests/main.s b/tests/main.s deleted file mode 100644 index 7e13dcc..0000000 --- a/tests/main.s +++ /dev/null @@ -1,20 +0,0 @@ - .file "main.c" - .option nopic - .attribute arch, "rv32i2p1" - .attribute unaligned_access, 0 - .attribute stack_align, 16 - .text - .align 2 - .globl main - .type main, @function -main: - addi sp,sp,-16 - sw s0,12(sp) - addi s0,sp,16 - li a5,0 - mv a0,a5 - lw s0,12(sp) - addi sp,sp,16 - jr ra - .size main, .-main - .ident "GCC: () 13.2.0"