diff options
author | Neil Roberts <[email protected]> | 2019-02-28 16:13:56 +0100 |
---|---|---|
committer | Rob Clark <[email protected]> | 2019-06-03 13:31:51 -0700 |
commit | 3222216a589f0952f11af76ce591c10ba96cdeb7 (patch) | |
tree | 1ed827a0e73a9c70783479ce96f53e09dc64c1a4 /src/freedreno | |
parent | daee6bc1a1af0ac472ca2766b772ae86082d2c98 (diff) |
freedreno/ir3: Add a 16-bit implementation of nir_op_imul
Signed-off-by: Rob Clark <[email protected]>
Diffstat (limited to 'src/freedreno')
-rw-r--r-- | src/freedreno/ir3/ir3_compiler_nir.c | 24 |
1 files changed, 15 insertions, 9 deletions
diff --git a/src/freedreno/ir3/ir3_compiler_nir.c b/src/freedreno/ir3/ir3_compiler_nir.c index 8692869d5ef..a441eadee84 100644 --- a/src/freedreno/ir3/ir3_compiler_nir.c +++ b/src/freedreno/ir3/ir3_compiler_nir.c @@ -543,15 +543,21 @@ emit_alu(struct ir3_context *ctx, nir_alu_instr *alu) dst[0] = ir3_MIN_U(b, src[0], 0, src[1], 0); break; case nir_op_imul: - /* - * dst = (al * bl) + (ah * bl << 16) + (al * bh << 16) - * mull.u tmp0, a, b ; mul low, i.e. al * bl - * madsh.m16 tmp1, a, b, tmp0 ; mul-add shift high mix, i.e. ah * bl << 16 - * madsh.m16 dst, b, a, tmp1 ; i.e. al * bh << 16 - */ - dst[0] = ir3_MADSH_M16(b, src[1], 0, src[0], 0, - ir3_MADSH_M16(b, src[0], 0, src[1], 0, - ir3_MULL_U(b, src[0], 0, src[1], 0), 0), 0); + if (bs[0] > 16 || bs[1] > 16) { + /* + * dst = (al * bl) + (ah * bl << 16) + (al * bh << 16) + * mull.u tmp0, a, b ; mul low, i.e. al * bl + * madsh.m16 tmp1, a, b, tmp0 ; mul-add shift high mix, + * ; i.e. ah * bl << 16 + * madsh.m16 dst, b, a, tmp1 ; i.e. al * bh << 16 + */ + dst[0] = ir3_MADSH_M16(b, src[1], 0, src[0], 0, + ir3_MADSH_M16(b, src[0], 0, src[1], 0, + ir3_MULL_U(b, src[0], 0, + src[1], 0), 0), 0); + } else { + dst[0] = ir3_MUL_S(b, src[0], 0, src[1], 0); + } break; case nir_op_ineg: dst[0] = ir3_ABSNEG_S(b, src[0], IR3_REG_SNEG); |