aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/tri.h5
-rw-r--r--triscv/src/cpu.c8
-rw-r--r--triscv/src/mmu.c1
3 files changed, 14 insertions, 0 deletions
diff --git a/core/tri.h b/core/tri.h
index 3837e95..1589345 100644
--- a/core/tri.h
+++ b/core/tri.h
@@ -586,6 +586,11 @@ static inline bool tri_eq(tri_t a, tri_t b)
return a == b;
}
+static inline bool tri_ne(tri_t a, tri_t b)
+{
+ return a != b;
+}
+
static inline bool tri_lt(tri_t a, tri_t b)
{
tri_t r = tri_sub(a, b);
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);