diff options
-rw-r--r-- | src/compiler/nir/nir_opcodes.py | 6 | ||||
-rw-r--r-- | src/compiler/nir/nir_opt_algebraic.py | 5 |
2 files changed, 11 insertions, 0 deletions
diff --git a/src/compiler/nir/nir_opcodes.py b/src/compiler/nir/nir_opcodes.py index d5e3108c69a..f83b8300d18 100644 --- a/src/compiler/nir/nir_opcodes.py +++ b/src/compiler/nir/nir_opcodes.py @@ -100,6 +100,7 @@ tbool16 = "bool16" tbool32 = "bool32" tuint = "uint" tuint16 = "uint16" +tfloat16 = "float16" tfloat32 = "float32" tint32 = "int32" tuint32 = "uint32" @@ -265,6 +266,11 @@ for src_t in [tint, tuint, tfloat, tbool]: dst_bit_size), dst_t + str(dst_bit_size), src_t, conv_expr) +# Special opcode that is the same as f2f16 except that it is safe to remove it +# if the result is immediately converted back to float32 again. This is +# generated as part of the precision lowering pass. mp stands for medium +# precision. +unop_numeric_convert("f2fmp", tfloat16, tfloat, opcodes["f2f16"].const_expr) # Unary floating-point rounding operations. diff --git a/src/compiler/nir/nir_opt_algebraic.py b/src/compiler/nir/nir_opt_algebraic.py index 94c8836cbf7..281b3a61e78 100644 --- a/src/compiler/nir/nir_opt_algebraic.py +++ b/src/compiler/nir/nir_opt_algebraic.py @@ -1737,6 +1737,11 @@ late_optimizations = [ ('ffma', a, b, ('ffma', c, d, ('ffma', e, 'f', 'g'))), '(info->stage != MESA_SHADER_VERTEX && info->stage != MESA_SHADER_GEOMETRY) && !options->intel_vec4'), (('~fadd', ('ffma(is_used_once)', a, b, ('fmul', 'c(is_not_const_and_not_fsign)', 'd(is_not_const_and_not_fsign)') ), 'e(is_not_const)'), ('ffma', a, b, ('ffma', c, d, e)), '(info->stage != MESA_SHADER_VERTEX && info->stage != MESA_SHADER_GEOMETRY) && !options->intel_vec4'), + + # Convert f2fmp instructions to concrete f2f16 instructions. At this point + # any conversions that could have been removed will have been removed in + # nir_opt_algebraic so any remaining ones are required. + (('f2fmp', a), ('f2f16', a)), ] for op in ['fadd']: |