diff --git a/src/amd/llvm/ac_nir_to_llvm.c b/src/amd/llvm/ac_nir_to_llvm.c index 2645cfbffcd..d227358322d 100644 --- a/src/amd/llvm/ac_nir_to_llvm.c +++ b/src/amd/llvm/ac_nir_to_llvm.c @@ -897,6 +897,7 @@ static void visit_alu(struct ac_nir_context *ctx, const nir_alu_instr *instr) break; case nir_op_f2i8: case nir_op_f2i16: + case nir_op_f2imp: case nir_op_f2i32: case nir_op_f2i64: src[0] = ac_to_float(&ctx->ac, src[0]); @@ -904,17 +905,20 @@ static void visit_alu(struct ac_nir_context *ctx, const nir_alu_instr *instr) break; case nir_op_f2u8: case nir_op_f2u16: + case nir_op_f2ump: case nir_op_f2u32: case nir_op_f2u64: src[0] = ac_to_float(&ctx->ac, src[0]); result = LLVMBuildFPToUI(ctx->ac.builder, src[0], def_type, ""); break; case nir_op_i2f16: + case nir_op_i2fmp: case nir_op_i2f32: case nir_op_i2f64: result = LLVMBuildSIToFP(ctx->ac.builder, src[0], ac_to_float_type(&ctx->ac, def_type), ""); break; case nir_op_u2f16: + case nir_op_u2fmp: case nir_op_u2f32: case nir_op_u2f64: result = LLVMBuildUIToFP(ctx->ac.builder, src[0], ac_to_float_type(&ctx->ac, def_type), ""); diff --git a/src/compiler/nir/nir_opcodes.py b/src/compiler/nir/nir_opcodes.py index 99194af2f13..27b09fa7900 100644 --- a/src/compiler/nir/nir_opcodes.py +++ b/src/compiler/nir/nir_opcodes.py @@ -275,6 +275,10 @@ for src_t in [tint, tuint, tfloat, tbool]: unop_numeric_convert("f2fmp", tfloat16, tfloat32, opcodes["f2f16"].const_expr) unop_numeric_convert("i2imp", tint16, tint32, opcodes["i2i16"].const_expr) # u2ump isn't defined, because the behavior is equal to i2imp +unop_numeric_convert("f2imp", tint16, tfloat32, opcodes["f2i16"].const_expr) +unop_numeric_convert("f2ump", tuint16, tfloat32, opcodes["f2u16"].const_expr) +unop_numeric_convert("i2fmp", tfloat16, tint32, opcodes["i2f16"].const_expr) +unop_numeric_convert("u2fmp", tfloat16, tuint32, opcodes["u2f16"].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 3e42f2552e4..663fb365135 100644 --- a/src/compiler/nir/nir_opt_algebraic.py +++ b/src/compiler/nir/nir_opt_algebraic.py @@ -2068,8 +2068,12 @@ late_optimizations = [ # 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)), + (('f2imp', a), ('f2i16', a)), + (('f2ump', a), ('f2u16', a)), (('i2imp', a), ('i2i16', a)), + (('i2fmp', a), ('i2f16', a)), (('i2imp', a), ('u2u16', a)), + (('u2fmp', a), ('u2f16', a)), # Section 8.8 (Integer Functions) of the GLSL 4.60 spec says: #