From c47cf4cf01a52af20c671160a5e925e26ba90b44 Mon Sep 17 00:00:00 2001 From: inixyz Date: Wed, 18 Oct 2023 00:22:17 +0300 Subject: [PATCH] fixed infinite loop when not branching --- src/tinyriscv.h | 14 ++++++-------- tests/1.bin | Bin 28 -> 100 bytes tests/1.c | 10 ++++++++++ tests/1.s | 40 ++++++++++++++++++++++++++++++++++++++++ tests/a.out | Bin 4864 -> 4932 bytes tests/main.c | 3 --- tests/main.s | 20 -------------------- 7 files changed, 56 insertions(+), 31 deletions(-) create mode 100644 tests/1.c create mode 100644 tests/1.s delete mode 100644 tests/main.c delete mode 100644 tests/main.s 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 cca49104d1ca9e630f43c948b3fed65c1c9a7e62..05a38aaf1d1475642c54d679622a486d649cbb11 100755 GIT binary patch literal 100 zcmWe;Wc;VB*T^8u!pO9pouOfJJ3GI!+LwRIDlGr<84fTttGE0U{{Ef6S^daA<%Z`B uAbN7UI0HxxNDj + +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 342c943f02cc4d5fe094c965eec1f03562a6a43f..8745bf8b97c1db235177d1733bd75331d28b9472 100755 GIT binary patch delta 378 zcmZorJEAs0K~hJE0SrtS6d0HoG#J4$M~h z@{bwBX8*wO_{Q@;li3*Ai%)L;0$3x`3ww3Ko+vR9U9*YsvhJoA)tPLRC#5FI8*_KR5U(=;bcd_bCU&x xL>MzBs|qOtNlzhl#`4L9Kyu3DnL_HUErJXTS(A?nDNDQqvTT3`zyKqZ0RZ;5MKb^Z delta 302 zcmX@2)}S^)LGpzl0~nYvC@?TFXfUudurV+*Fcj!dwA5x*07@xr%$&t9`CnPBkwKV+ zk#RCR1A}lYI|H-IK?Y$)AU{Q*p`HU`29#uE5C-X!fN%vEKK@q)@daRfMg}(s6HJ1H zO@SC$-Vu%O3swnK1Ehr*7#V_4<<%GxQ3V(>(D)3wiJ5tm+XT-|4i*w+RG6G8qzoi` qh16N~f%eNxHWU_~d`3us(P#2qpqLFXOme|uGQt9kD<|s;ivs{W2qcF9 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"