From: Ian Romanick Date: Wed, 13 Apr 2016 00:30:25 +0000 (-0700) Subject: ir_to_mesa: Do not emit OPCODE_SLE or OPCODE_SGT X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=15e6a1a3be0df32aa3bbeaaf9ac8afac17b66d5a;p=mesa.git ir_to_mesa: Do not emit OPCODE_SLE or OPCODE_SGT Nothing that consumes the output of this backend consumes them navtively. This is the way i915 has implemented these instructions since it began consuming GLSL. Signed-off-by: Ian Romanick Reviewed-by: Matt Turner --- diff --git a/src/mesa/program/ir_to_mesa.cpp b/src/mesa/program/ir_to_mesa.cpp index 35a68562001..c5b67ad706a 100644 --- a/src/mesa/program/ir_to_mesa.cpp +++ b/src/mesa/program/ir_to_mesa.cpp @@ -1067,10 +1067,20 @@ ir_to_mesa_visitor::visit(ir_expression *ir) emit(ir, OPCODE_SLT, result_dst, op[0], op[1]); break; case ir_binop_greater: - emit(ir, OPCODE_SGT, result_dst, op[0], op[1]); + /* Negating the operands (as opposed to switching the order of the + * operands) produces the correct result when both are +/-Inf. + */ + op[0].negate = ~op[0].negate; + op[1].negate = ~op[1].negate; + emit(ir, OPCODE_SLT, result_dst, op[0], op[1]); break; case ir_binop_lequal: - emit(ir, OPCODE_SLE, result_dst, op[0], op[1]); + /* Negating the operands (as opposed to switching the order of the + * operands) produces the correct result when both are +/-Inf. + */ + op[0].negate = ~op[0].negate; + op[1].negate = ~op[1].negate; + emit(ir, OPCODE_SGE, result_dst, op[0], op[1]); break; case ir_binop_gequal: emit(ir, OPCODE_SGE, result_dst, op[0], op[1]);