diff options
Diffstat (limited to 'triscv')
| -rw-r--r-- | triscv/src/cpu.c | 8 | ||||
| -rw-r--r-- | triscv/src/mmu.c | 1 |
2 files changed, 9 insertions, 0 deletions
diff --git a/triscv/src/cpu.c b/triscv/src/cpu.c index a2bc9fb..9e82974 100644 --- a/triscv/src/cpu.c +++ b/triscv/src/cpu.c @@ -101,6 +101,12 @@ static void do_op_imm(struct cpu *cpu, tri_t i) tri_t src = get_gpr(cpu, rs1); switch (fn0) { + case OP_IMM_SLTI: { + tri_t r = tri_lt(src, imm9); + set_gpr(cpu, rd, r); + break; + } + case OP_IMM_ADDI: { tri_t r = tri_add(src, imm9); set_gpr(cpu, rd, r); @@ -293,6 +299,8 @@ static void do_branch(struct cpu *cpu, tri_t i) switch (fn0) { case BRANCH_BLT: take = tri_lt(c0, c1); break; case BRANCH_BGE: take = tri_ge(c0, c1); break; + case BRANCH_BNE: take = tri_ne(c0, c1); break; + case BRANCH_BEQ: take = tri_eq(c0, c1); break; default: fprintf(stderr, "illegal/unimplemented BRANCH at %lli," "aborting\n", (long long int)cpu->pc); abort(); diff --git a/triscv/src/mmu.c b/triscv/src/mmu.c index c90c51d..7549012 100644 --- a/triscv/src/mmu.c +++ b/triscv/src/mmu.c @@ -236,6 +236,7 @@ void mmu_write3(struct cpu *cpu, struct mmu *mmu, vm_t addr, tri_t t) struct dev_map *d = mmu_find_dev_map(mmu, addr); if (!d || !d->dev.write3) { /** @todo raise bus error */ + return; } d->dev.write3(cpu, d->dev.dev, addr - d->start, t); |
