i965: Don't use MACH for integer multiplies on Gen8+.
authorKenneth Graunke <kenneth@whitecape.org>
Sun, 20 Jan 2013 16:58:14 +0000 (08:58 -0800)
committerKenneth Graunke <kenneth@whitecape.org>
Mon, 2 Dec 2013 21:25:32 +0000 (13:25 -0800)
The documentation is really hard to follow, but apparently a 32-bit x
32-bit multiply just works without the MACH macro.  The macro apparently
is only necessary to get the full 64-bit value.

Fixes Piglit tests [vf]s-op-mult-int-int.shader_test.

Signed-off-by: Kenneth Graunke <kenneth@whitecape.org>
Reviewed-by: Eric Anholt <eric@anholt.net>
src/mesa/drivers/dri/i965/brw_fs_visitor.cpp
src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp

index 9eb9a9d07acac39548ab22a7fce041857f04651c..97776c8618966f375f96c797bec0e94e8e036322 100644 (file)
@@ -433,7 +433,7 @@ fs_visitor::visit(ir_expression *ir)
       break;
 
    case ir_binop_mul:
-      if (ir->type->is_integer()) {
+      if (brw->gen < 8 && ir->type->is_integer()) {
         /* For integer multiplication, the MUL uses the low 16 bits
          * of one of the operands (src0 on gen6, src1 on gen7).  The
          * MACH accumulates in the contribution of the upper 16 bits
index 9c1975b3e5ed1412d3cf0d0ff8a8f1ba262fd4d4..aece78015ad0dee0deedc4b6ce5bb1479e5f1e93 100644 (file)
@@ -1344,7 +1344,7 @@ vec4_visitor::visit(ir_expression *ir)
       break;
 
    case ir_binop_mul:
-      if (ir->type->is_integer()) {
+      if (brw->gen < 8 && ir->type->is_integer()) {
         /* For integer multiplication, the MUL uses the low 16 bits of one of
          * the operands (src0 through SNB, src1 on IVB and later).  The MACH
          * accumulates in the contribution of the upper 16 bits of that