diff --git a/src/compiler/nir/nir_opcodes.py b/src/compiler/nir/nir_opcodes.py index cef3d2f6417..4e7283dcb25 100644 --- a/src/compiler/nir/nir_opcodes.py +++ b/src/compiler/nir/nir_opcodes.py @@ -251,7 +251,9 @@ for src_t in [tint, tuint, tfloat, tbool]: for rnd_mode in rnd_modes: if rnd_mode == '_rtne': conv_expr = """ - if (bit_size > 16) { + if (bit_size > 32) { + dst = _mesa_half_to_float(_mesa_double_to_float16_rtne(src0)); + } else if (bit_size > 16) { dst = _mesa_half_to_float(_mesa_float_to_float16_rtne(src0)); } else { dst = src0; @@ -259,14 +261,30 @@ for src_t in [tint, tuint, tfloat, tbool]: """ elif rnd_mode == '_rtz': conv_expr = """ - if (bit_size > 16) { + if (bit_size > 32) { + dst = _mesa_half_to_float(_mesa_double_to_float16_rtz(src0)); + } else if (bit_size > 16) { dst = _mesa_half_to_float(_mesa_float_to_float16_rtz(src0)); } else { dst = src0; } """ else: - conv_expr = "src0" + conv_expr = """ + if (bit_size > 32) { + if (nir_is_rounding_mode_rtz(execution_mode, 16)) + dst = _mesa_half_to_float(_mesa_double_to_float16_rtz(src0)); + else + dst = _mesa_half_to_float(_mesa_double_to_float16_rtne(src0)); + } else if (bit_size > 16) { + if (nir_is_rounding_mode_rtz(execution_mode, 16)) + dst = _mesa_half_to_float(_mesa_float_to_float16_rtz(src0)); + else + dst = _mesa_half_to_float(_mesa_float_to_float16_rtne(src0)); + } else { + dst = src0; + } + """ unop_numeric_convert("{0}2{1}{2}{3}".format(src_t[0], dst_t[0],