From 10951bb11ab982941b5c80765e7be266eae20bd4 Mon Sep 17 00:00:00 2001 From: Georg Lehmann Date: Fri, 18 Oct 2024 12:23:54 +0200 Subject: [PATCH] aco: fix 64bit extract_i8/extract_i16 The old code only sign extended to 32bit, with a zero hi half. Fixes: 1f2518ef9fc ("aco: implement nir_op_extract/nir_op_insert") Reviewed-by: Rhys Perry Part-of: --- .../compiler/aco_instruction_selection.cpp | 36 ++++++++++++------- .../zink/ci/zink-radv-navi10-fails.txt | 2 -- .../zink/ci/zink-radv-navi31-fails.txt | 2 -- .../zink/ci/zink-radv-polaris10-fails.txt | 2 -- .../zink/ci/zink-radv-vangogh-fails.txt | 2 -- 5 files changed, 24 insertions(+), 20 deletions(-) diff --git a/src/amd/compiler/aco_instruction_selection.cpp b/src/amd/compiler/aco_instruction_selection.cpp index be72578386e..8b4bb1f8bcf 100644 --- a/src/amd/compiler/aco_instruction_selection.cpp +++ b/src/amd/compiler/aco_instruction_selection.cpp @@ -3841,26 +3841,38 @@ visit_alu_instr(isel_context* ctx, nir_alu_instr* instr) index += swizzle * instr->def.bit_size / bits; bld.pseudo(aco_opcode::p_extract, Definition(dst), bld.def(s1, scc), Operand(vec), Operand::c32(index), Operand::c32(bits), Operand::c32(is_signed)); + } else if (dst.regClass() == s1) { + Temp src = get_alu_src(ctx, instr->src[0]); + bld.pseudo(aco_opcode::p_extract, Definition(dst), bld.def(s1, scc), Operand(src), + Operand::c32(index), Operand::c32(bits), Operand::c32(is_signed)); + } else if (dst.regClass() == s2) { + Temp src = get_alu_src(ctx, instr->src[0]); + aco_opcode op = is_signed ? aco_opcode::s_bfe_i64 : aco_opcode::s_bfe_u64; + Temp extract = bld.copy(bld.def(s1), Operand::c32((bits << 16) | (index * bits))); + bld.sop2(op, Definition(dst), bld.def(s1, scc), src, extract); } else { + assert(dst.regClass().type() == RegType::vgpr); Temp src = get_alu_src(ctx, instr->src[0]); Definition def(dst); + if (dst.bytes() == 8) { - src = emit_extract_vector(ctx, src, index / comp, RegClass(src.type(), 1)); + src = emit_extract_vector(ctx, src, index / comp, v1); index %= comp; - def = bld.def(src.type(), 1); + def = bld.def(v1); } + assert(def.bytes() <= 4); - if (def.regClass() == s1) { - bld.pseudo(aco_opcode::p_extract, def, bld.def(s1, scc), Operand(src), - Operand::c32(index), Operand::c32(bits), Operand::c32(is_signed)); - } else { - src = emit_extract_vector(ctx, src, 0, def.regClass()); - bld.pseudo(aco_opcode::p_extract, def, Operand(src), Operand::c32(index), - Operand::c32(bits), Operand::c32(is_signed)); + src = emit_extract_vector(ctx, src, 0, def.regClass()); + bld.pseudo(aco_opcode::p_extract, def, Operand(src), Operand::c32(index), + Operand::c32(bits), Operand::c32(is_signed)); + + if (dst.size() == 2) { + Temp lo = def.getTemp(); + Operand hi = Operand::zero(); + if (is_signed) + hi = bld.vop2(aco_opcode::v_ashrrev_i32, bld.def(v1), Operand::c32(31), lo); + bld.pseudo(aco_opcode::p_create_vector, Definition(dst), lo, hi); } - if (dst.size() == 2) - bld.pseudo(aco_opcode::p_create_vector, Definition(dst), def.getTemp(), - Operand::zero()); } break; } diff --git a/src/gallium/drivers/zink/ci/zink-radv-navi10-fails.txt b/src/gallium/drivers/zink/ci/zink-radv-navi10-fails.txt index b9e9358b5d2..27e88c99c03 100644 --- a/src/gallium/drivers/zink/ci/zink-radv-navi10-fails.txt +++ b/src/gallium/drivers/zink/ci/zink-radv-navi10-fails.txt @@ -11,8 +11,6 @@ spec@arb_framebuffer_object@fbo-blit-scaled-linear,Fail spec@arb_bindless_texture@compiler@samplers@arith-bound-sampler-texture2d.frag,Crash spec@arb_gpu_shader_fp64@execution@arb_gpu_shader_fp64-tf-separate,Fail -spec@arb_gpu_shader_int64@execution@fs-ishl-then-ishr,Fail -spec@arb_gpu_shader_int64@execution@fs-ishl-then-ishr-loop,Fail spec@arb_program_interface_query@arb_program_interface_query-getprogramresourceindex,Fail spec@arb_program_interface_query@arb_program_interface_query-getprogramresourceindex@'vs_input2[1][0]' on GL_PROGRAM_INPUT,Fail spec@arb_sample_shading@ignore-centroid-qualifier 2,Fail diff --git a/src/gallium/drivers/zink/ci/zink-radv-navi31-fails.txt b/src/gallium/drivers/zink/ci/zink-radv-navi31-fails.txt index abed8682c81..600d253fc5d 100644 --- a/src/gallium/drivers/zink/ci/zink-radv-navi31-fails.txt +++ b/src/gallium/drivers/zink/ci/zink-radv-navi31-fails.txt @@ -11,8 +11,6 @@ spec@arb_framebuffer_object@fbo-blit-scaled-linear,Fail spec@arb_bindless_texture@compiler@samplers@arith-bound-sampler-texture2d.frag,Crash spec@arb_gpu_shader_fp64@execution@arb_gpu_shader_fp64-tf-separate,Fail -spec@arb_gpu_shader_int64@execution@fs-ishl-then-ishr,Fail -spec@arb_gpu_shader_int64@execution@fs-ishl-then-ishr-loop,Fail spec@arb_program_interface_query@arb_program_interface_query-getprogramresourceindex,Fail spec@arb_program_interface_query@arb_program_interface_query-getprogramresourceindex@'vs_input2[1][0]' on GL_PROGRAM_INPUT,Fail spec@arb_sample_shading@ignore-centroid-qualifier 2,Fail diff --git a/src/gallium/drivers/zink/ci/zink-radv-polaris10-fails.txt b/src/gallium/drivers/zink/ci/zink-radv-polaris10-fails.txt index f521c977719..66dd138c47d 100644 --- a/src/gallium/drivers/zink/ci/zink-radv-polaris10-fails.txt +++ b/src/gallium/drivers/zink/ci/zink-radv-polaris10-fails.txt @@ -11,8 +11,6 @@ spec@arb_framebuffer_object@fbo-blit-scaled-linear,Fail spec@arb_bindless_texture@compiler@samplers@arith-bound-sampler-texture2d.frag,Crash spec@arb_gpu_shader_fp64@execution@arb_gpu_shader_fp64-tf-separate,Fail -spec@arb_gpu_shader_int64@execution@fs-ishl-then-ishr,Fail -spec@arb_gpu_shader_int64@execution@fs-ishl-then-ishr-loop,Fail spec@arb_program_interface_query@arb_program_interface_query-getprogramresourceindex,Fail spec@arb_program_interface_query@arb_program_interface_query-getprogramresourceindex@'vs_input2[1][0]' on GL_PROGRAM_INPUT,Fail spec@arb_sample_shading@ignore-centroid-qualifier 2,Fail diff --git a/src/gallium/drivers/zink/ci/zink-radv-vangogh-fails.txt b/src/gallium/drivers/zink/ci/zink-radv-vangogh-fails.txt index 771c8855eb7..61c00e3942d 100644 --- a/src/gallium/drivers/zink/ci/zink-radv-vangogh-fails.txt +++ b/src/gallium/drivers/zink/ci/zink-radv-vangogh-fails.txt @@ -11,8 +11,6 @@ spec@arb_framebuffer_object@fbo-blit-scaled-linear,Fail spec@arb_bindless_texture@compiler@samplers@arith-bound-sampler-texture2d.frag,Crash spec@arb_gpu_shader_fp64@execution@arb_gpu_shader_fp64-tf-separate,Fail -spec@arb_gpu_shader_int64@execution@fs-ishl-then-ishr,Fail -spec@arb_gpu_shader_int64@execution@fs-ishl-then-ishr-loop,Fail spec@arb_program_interface_query@arb_program_interface_query-getprogramresourceindex,Fail spec@arb_program_interface_query@arb_program_interface_query-getprogramresourceindex@'vs_input2[1][0]' on GL_PROGRAM_INPUT,Fail spec@arb_sample_shading@ignore-centroid-qualifier 2,Fail