From: Matt Turner Date: Thu, 8 Aug 2013 20:50:01 +0000 (-0700) Subject: i965: Emit MOVs for neg/abs. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=0ae9ca12a887a5aca47edc2a6a99eac4235bf4b0;p=mesa.git i965: Emit MOVs for neg/abs. Necessary to avoid combining a bitcast and a modifier into a single operation. Otherwise if safe, the MOV should be removed by copy-propagation or register coalescing. With this and the next patch, there are only four changes in shader-db: all a single extra instruction. The code does something like mov a.w, -b.x and copy propagation doesn't work because it only handles no-op swizzles. Seems acceptable, given the known limitation of our copy propagation. Reviewed-by: Ian Romanick Reviewed-by: Paul Berry --- diff --git a/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp b/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp index 984b08a6b60..964ad4074a6 100644 --- a/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp +++ b/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp @@ -361,12 +361,12 @@ fs_visitor::visit(ir_expression *ir) break; case ir_unop_neg: op[0].negate = !op[0].negate; - this->result = op[0]; + emit(MOV(this->result, op[0])); break; case ir_unop_abs: op[0].abs = true; op[0].negate = false; - this->result = op[0]; + emit(MOV(this->result, op[0])); break; case ir_unop_sign: temp = fs_reg(this, ir->type); diff --git a/src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp b/src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp index 454ec38feea..455d9dcb12c 100644 --- a/src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp +++ b/src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp @@ -1365,12 +1365,12 @@ vec4_visitor::visit(ir_expression *ir) break; case ir_unop_neg: op[0].negate = !op[0].negate; - this->result = op[0]; + emit(MOV(result_dst, op[0])); break; case ir_unop_abs: op[0].abs = true; op[0].negate = false; - this->result = op[0]; + emit(MOV(result_dst, op[0])); break; case ir_unop_sign: