rvemu

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

commit e437d30c7b412e620c272575563a12a2a9a7d868
parent 6531dc54564c59c9c4aeb0c919ea7591bc619977
Author: Michail Konstantinos Dimopoulos <mk@mcdim.xyz>
Date:   Wed,  2 Sep 2026 18:47:59 +0300

Cleaned up printf clutter

Diffstat:
Mmain.c | 196+------------------------------------------------------------------------------
1 file changed, 2 insertions(+), 194 deletions(-)

diff --git a/main.c b/main.c @@ -74,35 +74,16 @@ static int32_t get_valid_jalr_target(uint32_t base, int32_t offset, static void exec_itype(cpu_state_t *cpu, uint32_t inst, uint8_t *mem) { (void)mem; /* suppressing unused parameters warning */ - printf("TYPE I\n"); itype_t i; decode_itype(&i, inst); - /**print**/ - printf("f7 rs2 rs1 f3 rd opcode\n"); - print_binless(i.imm, 12); - printf(" "); - print_binless(i.rs1, 5); - printf(" "); - print_binless(i.funct3, 3); - printf(" "); - print_binless(i.rd, 5); - printf("\nf7 in\n"); - print_binless(i.funct7, 7); - printf(" "); - print_binless(i.inimm, 5); - printf("\n"); - /*********/ - uint32_t x; uint32_t shamt; switch(i.funct3) { case 0x0: - printf("ADDI\n"); x = cpu->x[i.rs1]+i.imm; break; case 0x1: if (i.funct7 != 0x00) { - printf("Shift logical left i\n"); shamt = i.imm & 31; x = cpu->x[i.rs1] << shamt; } else { @@ -111,26 +92,21 @@ static void exec_itype(cpu_state_t *cpu, uint32_t inst, uint8_t *mem) { } break; case 0x2: - printf("Set less than i\n"); x = ((int32_t)cpu->x[i.rs1] < (int32_t)i.imm) ? 1 : 0; break; case 0x3: - printf("Set less than Ui\n"); x = (cpu->x[i.rs1] < i.imm) ? 1 : 0; break; case 0x4: - printf("XORi\n"); x = cpu->x[i.rs1]^i.imm; break; case 0x5: switch(i.funct7) { case 0x00: - printf("Shift logical right i\n"); shamt = i.imm & 31; x = cpu->x[i.rs1] >> shamt; break; case 0x20: - printf("Shift arithm right i\n"); shamt = i.imm & 31; x = (uint32_t)((int32_t)cpu->x[i.rs1] >> shamt); break; @@ -140,11 +116,9 @@ static void exec_itype(cpu_state_t *cpu, uint32_t inst, uint8_t *mem) { } break; case 0x6: - printf("OR\n"); x = cpu->x[i.rs1]|i.imm; break; case 0x7: - printf("AND\n"); x = cpu->x[i.rs1]&i.imm; break; default: @@ -152,47 +126,27 @@ static void exec_itype(cpu_state_t *cpu, uint32_t inst, uint8_t *mem) { return; } - printf("rs1:%u imm:%u rd:%u\n",cpu->x[i.rs1],i.imm,cpu->x[i.rd]); if (i.rd != 0) { cpu->x[i.rd] = x; } - printf("rd:%u\n", cpu->x[i.rd]); - cpu->pc += 4; } static void exec_rtype(cpu_state_t *cpu, uint32_t inst, uint8_t *mem) { (void)mem; /* suppressing unused parameters warning */ - printf("TYPE R\n"); rtype_t r; decode_rtype(&r, inst); - /**print**/ - printf("f7 rs2 rs1 f3 rd opcode\n"); - print_binless(r.funct7, 7); - printf(" "); - print_binless(r.rs2, 5); - printf(" "); - print_binless(r.rs1, 5); - printf(" "); - print_binless(r.funct3, 3); - printf(" "); - print_binless(r.rd, 5); - printf("\n"); - /*********/ - uint32_t x; uint32_t shamt; switch(r.funct3) { case 0x0: switch(r.funct7) { case 0x00: - printf("ADD\n"); x = cpu->x[r.rs1]+cpu->x[r.rs2]; break; case 0x20: - printf("SUB\n"); x = cpu->x[r.rs1]-cpu->x[r.rs2]; break; default: @@ -201,31 +155,25 @@ static void exec_rtype(cpu_state_t *cpu, uint32_t inst, uint8_t *mem) { } break; case 0x1: - printf("Shift logical left\n"); shamt = cpu->x[r.rs2] & 31; x = cpu->x[r.rs1] << shamt; break; case 0x2: - printf("Set less than\n"); x = ((int32_t)cpu->x[r.rs1] < (int32_t)cpu->x[r.rs2]) ? 1 : 0; break; case 0x3: - printf("Set less than U\n"); x = (cpu->x[r.rs1] < cpu->x[r.rs2]) ? 1 : 0; break; case 0x4: - printf("XOR\n"); x = cpu->x[r.rs1]^cpu->x[r.rs2]; break; case 0x5: switch(r.funct7) { case 0x00: - printf("Shift logical right\n"); shamt = cpu->x[r.rs2] & 31; x = cpu->x[r.rs1] >> shamt; break; case 0x20: - printf("Shift arithm right\n"); shamt = cpu->x[r.rs2] & 31; x = (uint32_t)((int32_t)cpu->x[r.rs1] >> shamt); break; @@ -235,11 +183,9 @@ static void exec_rtype(cpu_state_t *cpu, uint32_t inst, uint8_t *mem) { } break; case 0x6: - printf("OR\n"); x = cpu->x[r.rs1]|cpu->x[r.rs2]; break; case 0x7: - printf("AND\n"); x = cpu->x[r.rs1]&cpu->x[r.rs2]; break; default: @@ -247,32 +193,17 @@ static void exec_rtype(cpu_state_t *cpu, uint32_t inst, uint8_t *mem) { return; } - printf("rs1:%u rs2:%u rd:%u\n",cpu->x[r.rs1],cpu->x[r.rs2],cpu->x[r.rd]); if (r.rd != 0) { cpu->x[r.rd] = x; } - printf("rd:%u\n", cpu->x[r.rd]); cpu->pc += 4; } static void exec_itype_loads(cpu_state_t *cpu, uint32_t inst, uint8_t *mem) { - printf("TYPE L\n"); itype_t i; decode_itype(&i, inst); - /**print**/ - printf("imm rs1 f3 rd opcode\n"); - print_binless(i.imm, 12); - printf(" "); - print_binless(i.rs1, 5); - printf(" "); - print_binless(i.funct3, 3); - printf(" "); - print_binless(i.rd, 5); - printf("\n"); - /*********/ - uint32_t addr = (uint32_t)i.imm + cpu->x[i.rs1]; /* TODO: do I need to check before loading halves and words */ @@ -280,16 +211,13 @@ static void exec_itype_loads(cpu_state_t *cpu, uint32_t inst, uint8_t *mem) { uint32_t x; switch(i.funct3) { case 0x0: - printf("Load byte\n"); x = (uint32_t)(int32_t)(int8_t)mem[addr]; break; case 0x1: - printf("Load half, little endian\n"); uint16_t half = (uint16_t)mem[addr] | ((uint16_t)mem[addr+1] << 8); x = (uint32_t)(int32_t)(int16_t)half; break; case 0x2: - printf("Load word, little endian"); /* TODO: clean up */ x = (uint32_t)(int32_t)( ((uint16_t)mem[addr] | ((uint16_t)mem[addr+1] << 8)) @@ -299,12 +227,10 @@ static void exec_itype_loads(cpu_state_t *cpu, uint32_t inst, uint8_t *mem) { ); break; case 0x4: - printf("Load byte (U) zero-extends\n"); x = (uint32_t)(uint8_t)mem[addr]; break; case 0x5: - printf("Load half, little endian\n"); int16_t uhalf = (int16_t)mem[addr] | ((int16_t)mem[addr+1] << 8); x = (uint32_t)(int32_t)uhalf; break; @@ -317,46 +243,20 @@ static void exec_itype_loads(cpu_state_t *cpu, uint32_t inst, uint8_t *mem) { cpu->x[i.rd] = x; } cpu->pc += 4; - - printf("\nrd:%d\n", cpu->x[i.rd]); - printf("rd:%x\n", cpu->x[i.rd]); - } static void exec_stype(cpu_state_t *cpu, uint32_t inst, uint8_t *mem) { - printf("TYPE S\n"); stype_t s; decode_stype(&s, inst); - printf("\nimm:%x\n", s.imm); - - /**print**/ - /*for printing, not needed*/uint32_t imm_11_5 = (inst >> 25) & 127; - /*for printing, not needed*/uint32_t imm_4_0 = (inst >> 7) & 31; - printf("imm rs2 rs1 f3 imm opcode\n"); - printf("[11:5] [4:0]\n"); - print_binless(imm_11_5, 7); - printf(" "); - print_binless(s.rs2, 5); - printf(" "); - print_binless(s.rs1, 5); - printf(" "); - print_binless(s.funct3, 3); - printf(" "); - print_binless(imm_4_0, 5); - printf("\n"); - /*********/ - uint32_t addr = s.imm + cpu->x[s.rs1]; /* TODO: helpers, better checks */ switch(s.funct3) { case 0x0: - printf("STORE BYTE\n"); mem[addr] = cpu->x[s.rs2] & 255; break; case 0x1: - printf("STORE half, little endian\n"); if (addr+1 > MEMSIZE-1) { fprintf(stderr, "Illegal addr\n"); return; @@ -368,7 +268,6 @@ static void exec_stype(cpu_state_t *cpu, uint32_t inst, uint8_t *mem) { } break; case 0x2: - printf("STORE word, little endian\n"); if (addr+3 > MEMSIZE-1) { fprintf(stderr, "Illegal addr\n"); return; @@ -390,29 +289,9 @@ static void exec_stype(cpu_state_t *cpu, uint32_t inst, uint8_t *mem) { static void exec_btype(cpu_state_t *cpu, uint32_t inst, uint8_t *mem) { (void)mem; /* suppressing unused parameters warning */ - printf("TYPE B\n"); btype_t b; decode_btype(&b, inst); - printf("imm: %" PRId32 "\n", b.imm); - - /**print**/ - //printf("imm rs2 rs1 f3 imm opcode\n"); - //printf("[12|10:5] [4:1|11]\n"); - //print_binless(imm_12, 1); - //print_binless(imm_10_5, 6); - //printf(" "); - //print_binless(b.rs2, 5); - //printf(" "); - //print_binless(b.rs1, 5); - //printf(" "); - //print_binless(b.funct3, 3); - //printf(" "); - //print_binless(imm_4_1, 4); - //print_binless(imm_11, 1); - //printf("\n"); - /*********/ - int jump = 0; switch (b.funct3) { case 0x0: @@ -462,26 +341,9 @@ static void exec_btype(cpu_state_t *cpu, uint32_t inst, uint8_t *mem) { static void exec_itype_jalr(cpu_state_t *cpu, uint32_t inst, uint8_t *mem) { (void)mem; /* suppressing unused parameters warning */ - printf("TYPE I\n"); itype_t i; decode_itype(&i, inst); - /**print**/ - printf("f7 rs2 rs1 f3 rd opcode\n"); - print_binless(i.imm, 12); - printf(" "); - print_binless(i.rs1, 5); - printf(" "); - print_binless(i.funct3, 3); - printf(" "); - print_binless(i.rd, 5); - printf("\nf7 in\n"); - print_binless(i.funct7, 7); - printf(" "); - print_binless(i.inimm, 5); - printf("\n"); - /*********/ - uint32_t x; if (i.funct3 != 0x0) { fprintf(stderr, "Illegal funct3\n"); @@ -500,28 +362,16 @@ static void exec_itype_jalr(cpu_state_t *cpu, uint32_t inst, uint8_t *mem) { return; } - printf("rs1:%u imm:%u rd:%u\n",cpu->x[i.rs1],i.imm,cpu->x[i.rd]); if (i.rd != 0) { cpu->x[i.rd] = x; } - - printf("rd:%u\n", cpu->x[i.rd]); } static void exec_jtype(cpu_state_t *cpu, uint32_t inst, uint8_t *mem) { (void)mem; /* suppressing unused parameters warning */ - printf("TYPE J\n"); jtype_t j; decode_jtype(&j, inst); - /**print**/ - printf("imm rd opcode\n"); - print_binless(j.imm, 20); - printf(" "); - print_binless(j.rd, 5); - printf("\n"); - /*********/ - uint32_t x; x = cpu->pc + 4; cpu->pc += j.imm; @@ -536,73 +386,38 @@ static void exec_jtype(cpu_state_t *cpu, uint32_t inst, uint8_t *mem) { return; } - printf("imm:%u rd:%u\n",j.imm,cpu->x[j.rd]); if (j.rd != 0) { cpu->x[j.rd] = x; } - - printf("rd:%u\n", cpu->x[j.rd]); } static void exec_utype(cpu_state_t *cpu, uint32_t inst, uint8_t *mem) { (void)mem; /* suppressing unused parameters warning */ - printf("TYPE U\n"); utype_t u; decode_utype(&u, inst); - /**print**/ - printf("imm rd opcode\n"); - print_binless(u.imm, 20); - printf(" "); - print_binless(u.rd, 5); - printf("\n"); - /*********/ - if (u.rd != 0) cpu->x[u.rd] = u.imm << 12; cpu->pc += 4; - - - printf("rd:%u\n", cpu->x[u.rd]); - printf("rd:%x\n", cpu->x[u.rd]); } -static void exec_utype_auipc(cpu_state_t *cpu, uint32_t inst, uint8_t *mem) { +static void +exec_utype_auipc(cpu_state_t *cpu, uint32_t inst, uint8_t *mem) { (void)mem; /* suppressing unused parameters warning */ - printf("TYPE U\n"); utype_t u; decode_utype(&u, inst); - /**print**/ - printf("imm rd opcode\n"); - print_binless(u.imm, 20); - printf(" "); - print_binless(u.rd, 5); - printf("\n"); - /*********/ - if (u.rd != 0) cpu->x[u.rd] = cpu->pc + (u.imm << 12); cpu->pc += 4; - - printf("rd:%u\n", cpu->x[u.rd]); - printf("rd:%x\n", cpu->x[u.rd]); } static void load_program(uint8_t *mem) { /* PROGRAM */ - - /*uint32_t arr[] = { - 0x500193, // addi x3, x0, 5 - 0x600093, // addi x1, x0, 6 - 0x118263, // beq x3, x1. +4 - 0x728263 // beq x5, x7, +4 - }; */ - uint32_t arr[] = { 0x00500193, // addi x3, x0, 5 0x00600093, // addi x1, x0, 6 @@ -683,15 +498,8 @@ int main() { uint32_t inst = make_instruction(mem, cpu.pc); disassemble_instruction(inst); - printf("------------INST------\n"); - print_bin32(inst); - printf("\n"); - /* decode opcode */ uint16_t opcode = inst & 127; - printf("opcode: "); - print_binless(opcode,7); - printf("\n"); exec_fn fn = opcode_table[opcode];