glsl: Properly handle ldexp(0.0f, non-zero-exp).

This commit is contained in:
Matt Turner
2016-04-12 18:24:06 -07:00
parent 3a26ef23e7
commit b1d9353cb5

View File

@@ -347,7 +347,7 @@ lower_instructions_visitor::ldexp_to_arith(ir_expression *ir)
* extracted_biased_exp = rshift(bitcast_f2i(abs(x)), exp_shift);
* resulting_biased_exp = extracted_biased_exp + exp;
*
* if (resulting_biased_exp < 1) {
* if (resulting_biased_exp < 1 || x == 0.0f) {
* return copysign(0.0, x);
* }
*
@@ -361,7 +361,8 @@ lower_instructions_visitor::ldexp_to_arith(ir_expression *ir)
* extracted_biased_exp = rshift(bitcast_f2i(abs(x)), exp_shift);
* resulting_biased_exp = extracted_biased_exp + exp;
*
* is_not_zero_or_underflow = gequal(resulting_biased_exp, 1);
* is_not_zero_or_underflow = logic_and(nequal(x, 0.0f),
* gequal(resulting_biased_exp, 1);
* x = csel(is_not_zero_or_underflow, x, copysign(0.0f, x));
* resulting_biased_exp = csel(is_not_zero_or_underflow,
* resulting_biased_exp, 0);
@@ -427,8 +428,9 @@ lower_instructions_visitor::ldexp_to_arith(ir_expression *ir)
i.insert_before(is_not_zero_or_underflow);
i.insert_before(assign(is_not_zero_or_underflow,
gequal(resulting_biased_exp,
new(ir) ir_constant(0x1, vec_elem))));
logic_and(nequal(x, new(ir) ir_constant(0.0f, vec_elem)),
gequal(resulting_biased_exp,
new(ir) ir_constant(0x1, vec_elem)))));
i.insert_before(assign(x, csel(is_not_zero_or_underflow,
x, zero_sign_x)));
i.insert_before(assign(resulting_biased_exp,