summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRob Clark <robdclark@gmail.com>2015-04-18 14:05:28 -0400
committerRob Clark <robdclark@gmail.com>2015-04-18 14:05:28 -0400
commit849000b08d60273221594c0c82843cc8f8767941 (patch)
treeca582b77560ef16fdf487f905fb48998ca6ab22d
parent0ab745edfc9e06aa67db13dcddba2ec24839cc83 (diff)
ir3emu: add some more instructions
-rw-r--r--ir3emu.c19
1 files changed, 19 insertions, 0 deletions
diff --git a/ir3emu.c b/ir3emu.c
index 18ea19e..0c481a5 100644
--- a/ir3emu.c
+++ b/ir3emu.c
@@ -505,9 +505,21 @@ emu_run_cat2(struct ir3_emu_ctx *ctx, instr_cat2_t *cat2)
case OPC_MIN_F:
dst.f = fminf(src1.f, src2.f);
break;
+ case OPC_MIN_U:
+ dst.u = min(src1.u, src2.u);
+ break;
+ case OPC_MIN_S:
+ dst.i = min(src1.i, src2.i);
+ break;
case OPC_MAX_F:
dst.f = fmaxf(src1.f, src2.f);
break;
+ case OPC_MAX_U:
+ dst.u = max(src1.u, src2.u);
+ break;
+ case OPC_MAX_S:
+ dst.i = max(src1.i, src2.i);
+ break;
case OPC_MUL_F:
dst.f = src1.f * src2.f;
break;
@@ -566,6 +578,9 @@ emu_run_cat2(struct ir3_emu_ctx *ctx, instr_cat2_t *cat2)
case OPC_TRUNC_F:
dst.f = truncf(src1.f);
break;
+ case OPC_RNDNE_F:
+ dst.f = round(src1.f);
+ break;
case OPC_ADD_U:
dst.u = src1.u + src2.u;
break;
@@ -596,6 +611,9 @@ emu_run_cat2(struct ir3_emu_ctx *ctx, instr_cat2_t *cat2)
case OPC_SHR_B:
dst.u = src1.u >> src2.u;
break;
+ case OPC_ASHR_B:
+ dst.i = src1.i >> src2.i;
+ break;
case OPC_BARY_F:
dst.i = (src1.i + 1) * (src2.i + 1);
/* bary.f seems to read r0.xy */
@@ -772,6 +790,7 @@ emu_run_cat5(struct ir3_emu_ctx *ctx, instr_cat5_t *cat5)
case OPC_SAML:
case OPC_DSX:
case OPC_DSY:
+ case OPC_GETSIZE:
break;
default:
emu_fatal(ctx, "unhandled cat5 opc: %u", cat5->opc);