From: Qiang Yu Date: Fri, 24 Feb 2023 06:17:07 +0000 (+0800) Subject: ac/llvm: implement float16 nir_op_pack_(s|u)norm_2x16 X-Git-Tag: upstream/23.3.3~10969 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=3df1c4455e86653a4980c8d7ed54d844b14ce13e;p=platform%2Fupstream%2Fmesa.git ac/llvm: implement float16 nir_op_pack_(s|u)norm_2x16 Reviewed-by: Marek Olšák Signed-off-by: Qiang Yu Part-of: --- diff --git a/src/amd/llvm/ac_nir_to_llvm.c b/src/amd/llvm/ac_nir_to_llvm.c index 1660573..129ec5f 100644 --- a/src/amd/llvm/ac_nir_to_llvm.c +++ b/src/amd/llvm/ac_nir_to_llvm.c @@ -1127,11 +1127,29 @@ static bool visit_alu(struct ac_nir_context *ctx, const nir_alu_instr *instr) ctx->ac.i32, ""); break; case nir_op_pack_snorm_2x16: - result = emit_pack_2x16(&ctx->ac, src[0], ac_build_cvt_pknorm_i16); - break; - case nir_op_pack_unorm_2x16: - result = emit_pack_2x16(&ctx->ac, src[0], ac_build_cvt_pknorm_u16); + case nir_op_pack_unorm_2x16: { + unsigned bit_size = instr->src[0].src.ssa->bit_size; + /* Only support 16 and 32bit. */ + assert(bit_size == 16 || bit_size == 32); + + LLVMValueRef data = src[0]; + /* Work around for pre-GFX9 GPU which don't have fp16 pknorm instruction. */ + if (bit_size == 16 && ctx->ac.gfx_level < GFX9) { + data = LLVMBuildFPExt(ctx->ac.builder, data, ctx->ac.v2f32, ""); + bit_size = 32; + } + + LLVMValueRef (*pack)(struct ac_llvm_context *ctx, LLVMValueRef args[2]); + if (bit_size == 32) { + pack = instr->op == nir_op_pack_snorm_2x16 ? + ac_build_cvt_pknorm_i16 : ac_build_cvt_pknorm_u16; + } else { + pack = instr->op == nir_op_pack_snorm_2x16 ? + ac_build_cvt_pknorm_i16_f16 : ac_build_cvt_pknorm_u16_f16; + } + result = emit_pack_2x16(&ctx->ac, data, pack); break; + } case nir_op_pack_uint_2x16: { LLVMValueRef comp[2];