summaryrefslogtreecommitdiffstats
path: root/src/mesa/drivers
diff options
context:
space:
mode:
authorTapani Pälli <tapani.palli@intel.com>2015-03-16 10:08:08 +0200
committerTapani Pälli <tapani.palli@intel.com>2015-03-17 07:59:30 +0200
commit627c68308683abbd6e563a09af6013a33938a790 (patch)
treed24266b6bd8a788ce2198e8fe923f7c5d58e6666 /src/mesa/drivers
parent60f77b22b1e3bbef7e4d1f10012acf830d81ed7b (diff)
downloadexternal_mesa3d-627c68308683abbd6e563a09af6013a33938a790.zip
external_mesa3d-627c68308683abbd6e563a09af6013a33938a790.tar.gz
external_mesa3d-627c68308683abbd6e563a09af6013a33938a790.tar.bz2
i965/fs: in MAD optimizations, switch last argument to be immediate
Commit bb33a31 introduced optimizations that transform cases of MAD in to simpler forms but it did not take in to account that src[0] can not be immediate and did not report progress. Patch switches src[0] and src[1] if src[0] is immediate and adds progress reporting. If both sources are immediates, this is taken care of by the same opt_algebraic pass on later run. v2: Fix for all cases, use temporary fs_reg (Matt, Kenneth) Signed-off-by: Tapani Pälli <tapani.palli@intel.com> Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=89569 Reviewed-by: Francisco Jerez <currojerez@riseup.net> (v1) Reviewed-by: Kenneth Graunke <kenneth@whitecape.org> Cc: "10.5" <mesa-stable@lists.freedesktop.org>
Diffstat (limited to 'src/mesa/drivers')
-rw-r--r--src/mesa/drivers/dri/i965/brw_fs.cpp11
1 files changed, 10 insertions, 1 deletions
diff --git a/src/mesa/drivers/dri/i965/brw_fs.cpp b/src/mesa/drivers/dri/i965/brw_fs.cpp
index 8702ea8..53ceb29 100644
--- a/src/mesa/drivers/dri/i965/brw_fs.cpp
+++ b/src/mesa/drivers/dri/i965/brw_fs.cpp
@@ -2491,6 +2491,7 @@ fs_visitor::opt_algebraic()
inst->opcode = BRW_OPCODE_MUL;
inst->src[0] = inst->src[2];
inst->src[2] = reg_undef;
+ progress = true;
} else if (inst->src[1].is_one()) {
inst->opcode = BRW_OPCODE_ADD;
inst->src[1] = inst->src[2];
@@ -2521,8 +2522,16 @@ fs_visitor::opt_algebraic()
default:
break;
}
- }
+ /* Swap if src[0] is immediate. */
+ if (progress && inst->is_commutative()) {
+ if (inst->src[0].file == IMM) {
+ fs_reg tmp = inst->src[1];
+ inst->src[1] = inst->src[0];
+ inst->src[0] = tmp;
+ }
+ }
+ }
return progress;
}