summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRob Clark <robdclark@gmail.com>2015-04-01 10:10:11 -0400
committerRob Clark <robdclark@gmail.com>2015-04-01 10:10:11 -0400
commit99eccf0a52c794914840cf10a43eec7f6b54f36a (patch)
tree7e3fdd1232622a6e002a7a68809eff1562e00b75
parent171fbd900dc47fb44288e21e3763ee6bb41be50f (diff)
ir3emu: some fixes
-rw-r--r--ir3emu.c23
1 files changed, 18 insertions, 5 deletions
diff --git a/ir3emu.c b/ir3emu.c
index f7983c9..2319714 100644
--- a/ir3emu.c
+++ b/ir3emu.c
@@ -264,12 +264,12 @@ static regval_t read_src(struct ir3_emu_ctx *ctx, int n, struct ir3_regsrc rs)
}
}
- if (rs.neg)
- r.f = -r.f;
-
if (rs.abs)
r.f = fabs(r.f);
+ if (rs.neg)
+ r.f = -r.f;
+
if (ctx->verbose)
printf(" src%d: %08x %f\n", n, r.u, r.f);
@@ -517,6 +517,18 @@ emu_run_cat2(struct ir3_emu_ctx *ctx, instr_cat2_t *cat2)
emu_fatal(ctx, "unhandled cat2 cond: %u", cat2->cond);
}
break;
+ case OPC_CMPS_S:
+ switch (cat2->cond) {
+ case 0: dst.u = (src1.i < src2.i) ? 1 : 0; break;
+ case 1: dst.u = (src1.i <= src2.i) ? 1 : 0; break;
+ case 2: dst.u = (src1.i > src2.i) ? 1 : 0; break;
+ case 3: dst.u = (src1.i >= src2.i) ? 1 : 0; break;
+ case 4: dst.u = (src1.i == src2.i) ? 1 : 0; break;
+ case 5: dst.u = (src1.i != src2.i) ? 1 : 0; break;
+ default:
+ emu_fatal(ctx, "unhandled cat2 cond: %u", cat2->cond);
+ }
+ break;
case OPC_ABSNEG_F:
case OPC_ABSNEG_S:
/* seems to basically just be a type of mov which can do
@@ -548,11 +560,12 @@ emu_run_cat2(struct ir3_emu_ctx *ctx, instr_cat2_t *cat2)
case OPC_OR_B:
dst.u = src1.u | src2.u;
break;
- //case OPC_NOT_B:
+ case OPC_NOT_B:
+ dst.u = ~src1.u;
+ break;
case OPC_XOR_B:
dst.u = src1.u ^ src2.u;
break;
- break;
case OPC_SHL_B:
dst.u = src1.u << src2.u;
break;