From a6860100b87415ab510d0d210cabfeeccebc9a0a Mon Sep 17 00:00:00 2001 From: Juha-Pekka Heikkila Date: Fri, 28 Mar 2014 15:28:33 +0200 Subject: [PATCH] i965/fs: Change fs_visitor::emit_lrp to use MAC for gen<6 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 Reviewed-by: Matt Turner Signed-off-by: Juha-Pekka Heikkila --- src/mesa/drivers/dri/i965/brw_fs_visitor.cpp | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp b/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp index 63a0ae53d7b..2aa3acddcf6 100644 --- a/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp +++ b/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp @@ -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. -- 2.30.2