Mesa (master): freedreno/ir3: add UMAD support

Rob Clark robclark at kemper.freedesktop.org
Fri Oct 3 03:31:25 UTC 2014


Module: Mesa
Branch: master
Commit: c4e2a196c3e699023e2d371d1c698daaa19a6e77
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=c4e2a196c3e699023e2d371d1c698daaa19a6e77

Author: Ilia Mirkin <imirkin at alum.mit.edu>
Date:   Wed Oct  1 01:13:38 2014 -0400

freedreno/ir3: add UMAD support

Signed-off-by: Ilia Mirkin <imirkin at alum.mit.edu>

---

 src/gallium/drivers/freedreno/ir3/ir3_compiler.c |   19 +++++++++++++++----
 1 file changed, 15 insertions(+), 4 deletions(-)

diff --git a/src/gallium/drivers/freedreno/ir3/ir3_compiler.c b/src/gallium/drivers/freedreno/ir3/ir3_compiler.c
index 83c687f..3f1d721 100644
--- a/src/gallium/drivers/freedreno/ir3/ir3_compiler.c
+++ b/src/gallium/drivers/freedreno/ir3/ir3_compiler.c
@@ -1986,7 +1986,7 @@ trans_cov(const struct instr_translater *t,
 }
 
 /*
- * UMUL
+ * UMUL / UMAD
  *
  * There is no 32-bit multiply instruction, so splitting a and b into high and
  * low components, we get that
@@ -1996,6 +1996,8 @@ trans_cov(const struct instr_translater *t,
  *  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)
+ *
+ * For UMAD, replace first mull.u with mad.u16.
  */
 static void
 trans_umul(const struct instr_translater *t,
@@ -2018,9 +2020,17 @@ trans_umul(const struct instr_translater *t,
 	if (is_rel_or_const(b))
 		b = get_unconst(ctx, b);
 
-	/* mull.u tmp0, a, b */
-	instr = instr_create(ctx, 2, OPC_MULL_U);
-	vectorize(ctx, instr, &tmp0_dst, 2, a, 0, b, 0);
+	if (t->tgsi_opc == TGSI_OPCODE_UMUL) {
+		/* mull.u tmp0, a, b */
+		instr = instr_create(ctx, 2, OPC_MULL_U);
+		vectorize(ctx, instr, &tmp0_dst, 2, a, 0, b, 0);
+	} else {
+		struct tgsi_src_register *c = &inst->Src[2].Register;
+
+		/* mad.u16 tmp0, a, b, c */
+		instr = instr_create(ctx, 3, OPC_MAD_U16);
+		vectorize(ctx, instr, &tmp0_dst, 3, a, 0, b, 0, c, 0);
+	}
 
 	/* madsh.m16 tmp1, a, b, tmp0 */
 	instr = instr_create(ctx, 3, OPC_MADSH_M16);
@@ -2404,6 +2414,7 @@ static const struct instr_translater translaters[TGSI_OPCODE_LAST] = {
 	INSTR(NOT,          instr_cat2, .opc = OPC_NOT_B),
 	INSTR(XOR,          instr_cat2, .opc = OPC_XOR_B),
 	INSTR(UMUL,         trans_umul),
+	INSTR(UMAD,         trans_umul),
 	INSTR(UDIV,         trans_idiv),
 	INSTR(IDIV,         trans_idiv),
 	INSTR(MOD,          trans_idiv),




More information about the mesa-commit mailing list