rvemu

RISC-V RV32I execution engine
git clone git://mcdim.xyz/revemu.git
Log | Files | Refs

commit 0cc9916509027b5af4690f39d4c1ba10f9b49d5e
parent a7e5dc83d3e11fd14bca2d5641d415ee1faba162
Author: Michail Konstantinos Dimopoulos <mk@mcdim.xyz>
Date:   Sat,  5 Sep 2026 18:13:46 +0300

Fixed load/store signedness and cast-order bugs

Diffstat:
Mexec.c | 13++++++-------
Mmain.c | 8++++----
2 files changed, 10 insertions(+), 11 deletions(-)

diff --git a/exec.c b/exec.c @@ -234,10 +234,9 @@ static void exec_itype_loads(cpu_state_t *cpu, uint32_t inst, uint8_t *mem) { case 0x4: x = (uint32_t)(uint8_t)mem[addr]; break; - case 0x5: - int16_t uhalf = (int16_t)mem[addr] | ((int16_t)mem[addr+1] << 8); - x = (uint32_t)(int32_t)uhalf; + uint16_t uhalf = (uint16_t)mem[addr] | ((uint16_t)mem[addr+1] << 8); + x = (uint32_t)uhalf; break; default: raise_trap(cpu, TRAP_ILLEGAL_INSTRUCTION, inst); @@ -269,7 +268,7 @@ static void exec_stype(cpu_state_t *cpu, uint32_t inst, uint8_t *mem) { if (addr % 2 == 0) { mem[addr] = (uint8_t)cpu->x[s.rs2]; - mem[addr+1] = (uint8_t)cpu->x[s.rs2] >> 8; + mem[addr+1] = (uint8_t)(cpu->x[s.rs2] >> 8); } break; case 0x2: @@ -279,9 +278,9 @@ static void exec_stype(cpu_state_t *cpu, uint32_t inst, uint8_t *mem) { } if (addr % 4 == 0) { mem[addr] = (uint8_t)cpu->x[s.rs2]; - mem[addr+1] = (uint8_t)cpu->x[s.rs2] >> 8; - mem[addr+2] = (uint8_t)cpu->x[s.rs2] >> 16; - mem[addr+3] = (uint8_t)cpu->x[s.rs2] >> 24; + mem[addr+1] = (uint8_t)(cpu->x[s.rs2] >> 8); + mem[addr+2] = (uint8_t)(cpu->x[s.rs2] >> 16); + mem[addr+3] = (uint8_t)(cpu->x[s.rs2] >> 24); } break; default: diff --git a/main.c b/main.c @@ -19,12 +19,14 @@ load_program(uint8_t *mem) { /* program */ uint32_t arr[] = { +/* 0xfff00093, // addi x1, x0, -1 0xfff04113, // xori x2, x0, -1 0xfff06193, // ori x3, x0, -1 0xfff17213, // andi x4, x2, -1 0xfff02293, // slti x5, x0, -1 0xfff03313 // sltiu x6, x0, -1 +*/ /* 0xfff00093, // li ra,-1 0xfff04113, // not sp,zero @@ -42,7 +44,6 @@ load_program(uint8_t *mem) 0xff750513, // addi x10, x10, -9 0x00100073 // ebreak */ -/* 0x10000593, //li a1,256 0xfff00513, //li a0,-1 0x00a58023, //sb a0,0(a1) @@ -62,7 +63,6 @@ load_program(uint8_t *mem) 0x0085a503, //lw a0,8(a1) 0x00000593, //li a1,0 0x00100073 //ebreak -*/ /* 0x00200093, // addi x1, x0, 2 0x00000113, // addi x2, x0, 0 @@ -146,12 +146,12 @@ debugger(cpu_state_t *cpu, uint8_t *mem) strncmp(line, "registers", 9) == 0) { printf("Registers:\n"); for (int i=0; i<32; i++) { - printf("0x%x: 0x%x\n", i, cpu->x[i]); + printf("x%d: 0x%x\n", i, cpu->x[i]); } } else if (strncmp(line, "m", 1) == 0 || strncmp(line, "memory", 6) == 0) { printf("Memory:\n"); - for (uint32_t i=0; i<128; i+=4) { + for (uint32_t i=0; i<0x110; i+=4) { if (cpu->pc == i) { printf("-> "); } else {