From: Ian Romanick <ian.d.roman...@intel.com> v2: Don't up-convert the shift count parameter if shift instructions. Suggested by Connor. Add type_is_singed() function. This will make adding 8- and 16-bit types easier.
Signed-off-by: Ian Romanick <ian.d.roman...@intel.com> Reviewed-by: Connor Abbott <cwabbo...@gmail.com> Cc: Jason Ekstrand <ja...@jlekstrand.net> --- src/compiler/glsl/glsl_to_nir.cpp | 24 +++++++++++++++--------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/src/compiler/glsl/glsl_to_nir.cpp b/src/compiler/glsl/glsl_to_nir.cpp index 6fce5b4..13000c9 100644 --- a/src/compiler/glsl/glsl_to_nir.cpp +++ b/src/compiler/glsl/glsl_to_nir.cpp @@ -1271,6 +1271,12 @@ type_is_float(glsl_base_type type) return type == GLSL_TYPE_FLOAT || type == GLSL_TYPE_DOUBLE; } +static bool +type_is_signed(glsl_base_type type) +{ + return type == GLSL_TYPE_INT || type == GLSL_TYPE_INT64; +} + void nir_visitor::visit(ir_expression *ir) { @@ -1625,7 +1631,7 @@ nir_visitor::visit(ir_expression *ir) case ir_binop_div: if (type_is_float(out_type)) result = nir_fdiv(&b, srcs[0], srcs[1]); - else if (out_type == GLSL_TYPE_INT) + else if (type_is_signed(out_type)) result = nir_idiv(&b, srcs[0], srcs[1]); else result = nir_udiv(&b, srcs[0], srcs[1]); @@ -1637,7 +1643,7 @@ nir_visitor::visit(ir_expression *ir) case ir_binop_min: if (type_is_float(out_type)) result = nir_fmin(&b, srcs[0], srcs[1]); - else if (out_type == GLSL_TYPE_INT) + else if (type_is_signed(out_type)) result = nir_imin(&b, srcs[0], srcs[1]); else result = nir_umin(&b, srcs[0], srcs[1]); @@ -1645,7 +1651,7 @@ nir_visitor::visit(ir_expression *ir) case ir_binop_max: if (type_is_float(out_type)) result = nir_fmax(&b, srcs[0], srcs[1]); - else if (out_type == GLSL_TYPE_INT) + else if (type_is_signed(out_type)) result = nir_imax(&b, srcs[0], srcs[1]); else result = nir_umax(&b, srcs[0], srcs[1]); @@ -1668,8 +1674,8 @@ nir_visitor::visit(ir_expression *ir) break; case ir_binop_lshift: result = nir_ishl(&b, srcs[0], srcs[1]); break; case ir_binop_rshift: - result = (out_type == GLSL_TYPE_INT) ? nir_ishr(&b, srcs[0], srcs[1]) - : nir_ushr(&b, srcs[0], srcs[1]); + result = (type_is_signed(out_type)) ? nir_ishr(&b, srcs[0], srcs[1]) + : nir_ushr(&b, srcs[0], srcs[1]); break; case ir_binop_imul_high: result = (out_type == GLSL_TYPE_INT) ? nir_imul_high(&b, srcs[0], srcs[1]) @@ -1681,7 +1687,7 @@ nir_visitor::visit(ir_expression *ir) if (supports_ints) { if (type_is_float(types[0])) result = nir_flt(&b, srcs[0], srcs[1]); - else if (types[0] == GLSL_TYPE_INT) + else if (type_is_signed(types[0])) result = nir_ilt(&b, srcs[0], srcs[1]); else result = nir_ult(&b, srcs[0], srcs[1]); @@ -1693,7 +1699,7 @@ nir_visitor::visit(ir_expression *ir) if (supports_ints) { if (type_is_float(types[0])) result = nir_flt(&b, srcs[1], srcs[0]); - else if (types[0] == GLSL_TYPE_INT) + else if (type_is_signed(types[0])) result = nir_ilt(&b, srcs[1], srcs[0]); else result = nir_ult(&b, srcs[1], srcs[0]); @@ -1705,7 +1711,7 @@ nir_visitor::visit(ir_expression *ir) if (supports_ints) { if (type_is_float(types[0])) result = nir_fge(&b, srcs[1], srcs[0]); - else if (types[0] == GLSL_TYPE_INT) + else if (type_is_signed(types[0])) result = nir_ige(&b, srcs[1], srcs[0]); else result = nir_uge(&b, srcs[1], srcs[0]); @@ -1717,7 +1723,7 @@ nir_visitor::visit(ir_expression *ir) if (supports_ints) { if (type_is_float(types[0])) result = nir_fge(&b, srcs[0], srcs[1]); - else if (types[0] == GLSL_TYPE_INT) + else if (type_is_signed(types[0])) result = nir_ige(&b, srcs[0], srcs[1]); else result = nir_uge(&b, srcs[0], srcs[1]); -- 2.7.4 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev