diff --git a/src/amd/compiler/aco_instruction_selection.cpp b/src/amd/compiler/aco_instruction_selection.cpp index 99be3539ee9..90bb0a37a25 100644 --- a/src/amd/compiler/aco_instruction_selection.cpp +++ b/src/amd/compiler/aco_instruction_selection.cpp @@ -1823,6 +1823,12 @@ visit_alu_instr(isel_context* ctx, nir_alu_instr* instr) break; } case nir_op_uadd_sat: { + if (dst.regClass() == v1 && instr->dest.dest.ssa.bit_size == 16) { + Instruction* add_instr = + emit_vop3p_instruction(ctx, instr, aco_opcode::v_pk_add_u16, dst); + add_instr->vop3p().clamp = 1; + break; + } Temp src0 = get_alu_src(ctx, instr->src[0]); Temp src1 = get_alu_src(ctx, instr->src[1]); if (dst.regClass() == s1) { @@ -1901,6 +1907,12 @@ visit_alu_instr(isel_context* ctx, nir_alu_instr* instr) break; } case nir_op_iadd_sat: { + if (dst.regClass() == v1 && instr->dest.dest.ssa.bit_size == 16) { + Instruction* add_instr = + emit_vop3p_instruction(ctx, instr, aco_opcode::v_pk_add_i16, dst); + add_instr->vop3p().clamp = 1; + break; + } Temp src0 = get_alu_src(ctx, instr->src[0]); Temp src1 = get_alu_src(ctx, instr->src[1]); if (dst.regClass() == s1) { diff --git a/src/amd/compiler/aco_instruction_selection_setup.cpp b/src/amd/compiler/aco_instruction_selection_setup.cpp index 6d0efade16b..664fe3a768d 100644 --- a/src/amd/compiler/aco_instruction_selection_setup.cpp +++ b/src/amd/compiler/aco_instruction_selection_setup.cpp @@ -557,6 +557,8 @@ init_context(isel_context* ctx, nir_shader* shader) case nir_op_b2f32: case nir_op_mov: break; case nir_op_iadd: + case nir_op_iadd_sat: + case nir_op_uadd_sat: case nir_op_isub: case nir_op_imul: case nir_op_imin: diff --git a/src/amd/vulkan/radv_pipeline.c b/src/amd/vulkan/radv_pipeline.c index 6193323f128..bcf6d552a4c 100644 --- a/src/amd/vulkan/radv_pipeline.c +++ b/src/amd/vulkan/radv_pipeline.c @@ -3667,6 +3667,8 @@ opt_vectorize_callback(const nir_instr *instr, void *_) case nir_op_fmin: case nir_op_fmax: case nir_op_iadd: + case nir_op_iadd_sat: + case nir_op_uadd_sat: case nir_op_isub: case nir_op_imul: case nir_op_imin: