From 58055d81b12b8a703924cf2039753a9fc03e00b7 Mon Sep 17 00:00:00 2001 From: Forest Belton <65484+forestbelton@users.noreply.github.com> Date: Sat, 26 Jun 2021 19:18:14 -0400 Subject: [PATCH] Implement ADDU/ADDIU --- src/insn.c | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/src/insn.c b/src/insn.c index 868d7c7..f3f78f0 100644 --- a/src/insn.c +++ b/src/insn.c @@ -54,7 +54,7 @@ void insn_lw(cpu_t *cpu, uint32_t insn) { } void insn_srl(cpu_t *cpu, uint32_t insn) { - const uint8_t rd = RT(insn); + const uint8_t rd = RD(insn); const uint8_t rt = RT(insn); const uint8_t imm5 = IMM5(insn); @@ -62,10 +62,30 @@ void insn_srl(cpu_t *cpu, uint32_t insn) { cpu->regs[rd] = cpu->regs[rt] >> imm5; } +void insn_addu(cpu_t *cpu, uint32_t insn) { + const uint8_t rd = RD(insn); + const uint8_t rs = RS(insn); + const uint8_t rt = RT(insn); + + debug("ADDU %s, %s, %s", REG_NAMES[rd], REG_NAMES[rs], REG_NAMES[rt]); + cpu->regs[rd] = cpu->regs[rs] + cpu->regs[rt]; +} + +void insn_addiu(cpu_t *cpu, uint32_t insn) { + const uint8_t rt = RT(insn); + const uint8_t rs = RS(insn); + const int16_t imm = (int16_t)IMM(insn); + + debug("ADDIU %s, %s, %x", REG_NAMES[rt], REG_NAMES[rs], imm); + cpu->regs[rt] = cpu->regs[rs] + imm; +} + static cpu_insn_handler primary_insn_handler[TABLE_SIZE] = { [LW] = insn_lw, + [ADDIU] = insn_addiu, }; static cpu_insn_handler secondary_insn_handler[TABLE_SIZE] = { + [ADDU] = insn_addu, [SRL] = insn_srl, };