diff --git a/src/amd/compiler/aco_instruction_selection.cpp b/src/amd/compiler/aco_instruction_selection.cpp index 69b82d3e2c8..e18f7372d9f 100644 --- a/src/amd/compiler/aco_instruction_selection.cpp +++ b/src/amd/compiler/aco_instruction_selection.cpp @@ -1546,6 +1546,12 @@ visit_alu_instr(isel_context* ctx, nir_alu_instr* instr) bld.sop2(aco_opcode::s_or_b64, Definition(dst), bld.def(s1, scc), neg, bld.scc(neqz)); } else if (dst.regClass() == v1) { bld.vop3(aco_opcode::v_med3_i32, Definition(dst), Operand::c32(-1), src, Operand::c32(1u)); + } else if (dst.regClass() == v2b && ctx->program->gfx_level >= GFX9) { + bld.vop3(aco_opcode::v_med3_i16, Definition(dst), Operand::c16(-1), src, Operand::c16(1u)); + } else if (dst.regClass() == v2b) { + src = as_vgpr(ctx, src); + bld.vop2(aco_opcode::v_max_i16, Definition(dst), Operand::c16(-1), + bld.vop2(aco_opcode::v_min_i16, Definition(bld.tmp(v1)), Operand::c16(1u), src)); } else if (dst.regClass() == v2) { Temp upper = emit_extract_vector(ctx, src, 1, v1); Temp neg = bld.vop2(aco_opcode::v_ashrrev_i32, bld.def(v1), Operand::c32(31u), upper); diff --git a/src/amd/vulkan/radv_pipeline.c b/src/amd/vulkan/radv_pipeline.c index 113ca3a1339..7c610827e8b 100644 --- a/src/amd/vulkan/radv_pipeline.c +++ b/src/amd/vulkan/radv_pipeline.c @@ -3950,7 +3950,6 @@ lower_bit_size_callback(const nir_instr *instr, void *_) case nir_op_bitfield_select: case nir_op_imul_high: case nir_op_umul_high: - case nir_op_isign: return 32; case nir_op_iabs: case nir_op_imax: @@ -3960,6 +3959,7 @@ lower_bit_size_callback(const nir_instr *instr, void *_) case nir_op_ishr: case nir_op_ushr: case nir_op_ishl: + case nir_op_isign: case nir_op_uadd_sat: case nir_op_usub_sat: return (bit_size == 8 || !(chip >= GFX8 && nir_dest_is_divergent(alu->dest.dest))) ? 32