i965: Add support for AVG instruction.
authorPaul Berry <stereotype441@gmail.com>
Sat, 7 Jul 2012 15:28:46 +0000 (08:28 -0700)
committerPaul Berry <stereotype441@gmail.com>
Fri, 20 Jul 2012 16:35:37 +0000 (09:35 -0700)
From the Ivy Bridge PRM, Vol4 Part3 p152:

    "The avg instruction performs component-wise integer average of
    src0 and src1 and stores the results in dst. An integer average
    uses integer upward rounding. It is equivalent to increment one to
    the addition of src0 and src1 and then apply an arithmetic right
    shift to this intermediate value."

Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
Reviewed-by: Anuj Phogat <anuj.phogat@gmail.com>
src/mesa/drivers/dri/i965/brw_eu.h
src/mesa/drivers/dri/i965/brw_eu_emit.c

index f25b09d896df03e866164ecb2b1d72f69ebe5195..233b94cfda4ad9036c1b259fab1ed8d18e412def 100644 (file)
@@ -861,6 +861,7 @@ ALU2(RSL)
 ALU2(ASR)
 ALU2(JMPI)
 ALU2(ADD)
+ALU2(AVG)
 ALU2(MUL)
 ALU1(FRC)
 ALU1(RNDD)
index 8de872efcae8b9dd1dd4094d323da1d61dee9982..93e84ae54bd64eec6379f3682d9c4ea55ca6b24f 100644 (file)
@@ -929,6 +929,28 @@ struct brw_instruction *brw_ADD(struct brw_compile *p,
    return brw_alu2(p, BRW_OPCODE_ADD, dest, src0, src1);
 }
 
+struct brw_instruction *brw_AVG(struct brw_compile *p,
+                                struct brw_reg dest,
+                                struct brw_reg src0,
+                                struct brw_reg src1)
+{
+   assert(dest.type == src0.type);
+   assert(src0.type == src1.type);
+   switch (src0.type) {
+   case BRW_REGISTER_TYPE_B:
+   case BRW_REGISTER_TYPE_UB:
+   case BRW_REGISTER_TYPE_W:
+   case BRW_REGISTER_TYPE_UW:
+   case BRW_REGISTER_TYPE_D:
+   case BRW_REGISTER_TYPE_UD:
+      break;
+   default:
+      assert(!"Bad type for brw_AVG");
+   }
+
+   return brw_alu2(p, BRW_OPCODE_AVG, dest, src0, src1);
+}
+
 struct brw_instruction *brw_MUL(struct brw_compile *p,
                                struct brw_reg dest,
                                struct brw_reg src0,