From 8e03e19f2c667973375644636b6d48c068a0bc3b Mon Sep 17 00:00:00 2001 From: inixyz Date: Thu, 26 Oct 2023 21:07:05 +0300 Subject: [PATCH] fixed div by 0 exception --- src/tinyriscv.h | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/src/tinyriscv.h b/src/tinyriscv.h index bad7e20..45da352 100644 --- a/src/tinyriscv.h +++ b/src/tinyriscv.h @@ -114,10 +114,22 @@ inline void tinyriscv_R_type(const u8 funct3, const u8 funct7, u32* x, x[rd] = ((i64)(i32)x[rs1] * (u64)x[rs2]) >> 32; break; case /*MULHU*/ 0x00b: x[rd] = ((u64)x[rs1] * (u64)x[rs2]) >> 32; break; - case /*DIV*/ 0x00c: x[rd] = (i32)x[rs1] / (i32)x[rs2]; break; - case /*DIVU*/ 0x00d: x[rd] = x[rs1] / x[rs2]; break; - case /*REM*/ 0x00e: x[rd] = (i32)x[rs1] % (i32)x[rs2]; break; - case /*REMU*/ 0x00f: x[rd] = x[rs1] % x[rs2]; break; + case /*DIV*/ 0x00c: + if(x[rs2]) x[rd] = (i32)x[rs1] / (i32)x[rs2]; + else x[rd] = -1; + break; + case /*DIVU*/ 0x00d: + if(x[rs2]) x[rd] = x[rs1] / x[rs2]; + else x[rd] = 0xffffffff; + break; + case /*REM*/ 0x00e: + if(x[rs2]) x[rd] = (i32)x[rs1] % (i32)x[rs2]; + else x[rd] = x[rs1]; + break; + case /*REMU*/ 0x00f: + if(x[rs2]) x[rd] = x[rs1] % x[rs2]; + else x[rd] = x[rs1]; + break; #endif } }