i965/fs: Change fs_visitor::emit_lrp to use MAC for gen<6
authorJuha-Pekka Heikkila <juhapekka.heikkila@gmail.com>
Fri, 28 Mar 2014 13:28:33 +0000 (15:28 +0200)
committerMatt Turner <mattst88@gmail.com>
Thu, 17 Apr 2014 05:46:45 +0000 (22:46 -0700)
This allows us to emit ADD/MUL/MAC instead of MUL/ADD/MUL/ADD,
saving one instruction and two temporary registers.

Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
Reviewed-by: Matt Turner <mattst88@gmail.com>
Signed-off-by: Juha-Pekka Heikkila <juhapekka.heikkila@gmail.com>
src/mesa/drivers/dri/i965/brw_fs_visitor.cpp

index 63a0ae53d7b02543f1332291cedf6a6fc7d7229a..2aa3acddcf667360bc96430d1885659d1cf070e9 100644 (file)
@@ -221,18 +221,15 @@ fs_visitor::emit_lrp(const fs_reg &dst, const fs_reg &x, const fs_reg &y,
        !y.is_valid_3src() ||
        !a.is_valid_3src()) {
       /* We can't use the LRP instruction.  Emit x*(1-a) + y*a. */
-      fs_reg y_times_a           = fs_reg(this, glsl_type::float_type);
       fs_reg one_minus_a         = fs_reg(this, glsl_type::float_type);
-      fs_reg x_times_one_minus_a = fs_reg(this, glsl_type::float_type);
-
-      emit(MUL(y_times_a, y, a));
 
       fs_reg negative_a = a;
       negative_a.negate = !a.negate;
-      emit(ADD(one_minus_a, negative_a, fs_reg(1.0f)));
-      emit(MUL(x_times_one_minus_a, x, one_minus_a));
 
-      emit(ADD(dst, x_times_one_minus_a, y_times_a));
+      emit(ADD(one_minus_a, negative_a, fs_reg(1.0f)));
+      fs_inst *mul = emit(MUL(reg_null_f, y, a));
+      mul->writes_accumulator = true;
+      emit(MAC(dst, x, one_minus_a));
    } else {
       /* The LRP instruction actually does op1 * op0 + op2 * (1 - op0), so
        * we need to reorder the operands.