From 15e6a1a3be0df32aa3bbeaaf9ac8afac17b66d5a Mon Sep 17 00:00:00 2001 From: Ian Romanick Date: Tue, 12 Apr 2016 17:30:25 -0700 Subject: [PATCH] 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 --- src/mesa/program/ir_to_mesa.cpp | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) 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]); -- 2.30.2