From: Kenneth Graunke Date: Sat, 16 Aug 2014 22:18:21 +0000 (-0700) Subject: i965: Disable try_emit_b2f_of_compare on Gen4-6. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=97d03b9366bfa55b27feb92aa5afacd9c5f6f421;p=mesa.git i965: Disable try_emit_b2f_of_compare on Gen4-6. The optimization relies on CMP setting the destination to 0, which is equivalent to 0.0f. However, early platforms only set the least significant byte, leaving the other bits undefined. So, we must disable the optimization on those platforms. Oddly, Sandybridge wasn't reported as broken. The PRM states that it only sets the LSB, but the internal documentation says that it follows the IVB behavior. Since it wasn't reported as broken, we believe it really does follow the IVB behavior. v2: Allow the optimization on Sandybridge (requested by Matt). +32 piglits on Ironlake. Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?=79963 Signed-off-by: Kenneth Graunke Reviewed-by: Chris Forbes Reviewed-by: Matt Turner --- diff --git a/src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp b/src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp index eca5d0cb01c..6e48be74852 100644 --- a/src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp +++ b/src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp @@ -1135,6 +1135,13 @@ vec4_visitor::try_emit_mad(ir_expression *ir) bool vec4_visitor::try_emit_b2f_of_compare(ir_expression *ir) { + /* This optimization relies on CMP setting the destination to 0 when + * false. Early hardware only sets the least significant bit, and + * leaves the other bits undefined. So we can't use it. + */ + if (brw->gen < 6) + return false; + ir_expression *const cmp = ir->operands[0]->as_expression(); if (cmp == NULL)