From: Marek Olšák <marek.ol...@amd.com>

---
 src/amd/common/ac_llvm_build.c           | 18 ++++++++++++++++++
 src/amd/common/ac_llvm_build.h           |  2 ++
 src/gallium/drivers/radeonsi/si_shader.c |  6 +-----
 3 files changed, 21 insertions(+), 5 deletions(-)

diff --git a/src/amd/common/ac_llvm_build.c b/src/amd/common/ac_llvm_build.c
index 187c2cb..42965b6 100644
--- a/src/amd/common/ac_llvm_build.c
+++ b/src/amd/common/ac_llvm_build.c
@@ -1073,10 +1073,28 @@ LLVMValueRef ac_emit_image_opcode(struct 
ac_llvm_context *ctx,
                a->deriv ? ".d" :
                a->level_zero ? ".lz" : "",
                a->offset ? ".o" : "",
                type);
 
        return ac_emit_llvm_intrinsic(ctx, intr_name,
                                      dst_type, args, num_args,
                                      AC_FUNC_ATTR_READNONE |
                                      AC_FUNC_ATTR_LEGACY);
 }
+
+LLVMValueRef ac_emit_cvt_pkrtz_f16(struct ac_llvm_context *ctx,
+                                  LLVMValueRef args[2])
+{
+       if (HAVE_LLVM >= 0x0500) {
+               LLVMTypeRef v2f16 =
+                       LLVMVectorType(LLVMHalfTypeInContext(ctx->context), 2);
+               LLVMValueRef res =
+                       ac_emit_llvm_intrinsic(ctx, "llvm.amdgcn.cvt.pkrtz",
+                                              v2f16, args, 2,
+                                              AC_FUNC_ATTR_READNONE);
+               return LLVMBuildBitCast(ctx->builder, res, ctx->i32, "");
+       }
+
+       return ac_emit_llvm_intrinsic(ctx, "llvm.SI.packf16", ctx->i32, args, 2,
+                                     AC_FUNC_ATTR_READNONE |
+                                     AC_FUNC_ATTR_LEGACY);
+}
diff --git a/src/amd/common/ac_llvm_build.h b/src/amd/common/ac_llvm_build.h
index f57acc2..e6bb90f 100644
--- a/src/amd/common/ac_llvm_build.h
+++ b/src/amd/common/ac_llvm_build.h
@@ -226,16 +226,18 @@ struct ac_image_args {
        LLVMValueRef resource;
        LLVMValueRef sampler;
        LLVMValueRef addr;
        unsigned dmask;
        bool unorm;
        bool da;
 };
 
 LLVMValueRef ac_emit_image_opcode(struct ac_llvm_context *ctx,
                                  struct ac_image_args *a);
+LLVMValueRef ac_emit_cvt_pkrtz_f16(struct ac_llvm_context *ctx,
+                                  LLVMValueRef args[2]);
 
 #ifdef __cplusplus
 }
 #endif
 
 #endif
diff --git a/src/gallium/drivers/radeonsi/si_shader.c 
b/src/gallium/drivers/radeonsi/si_shader.c
index f894bc0..af031c7 100644
--- a/src/gallium/drivers/radeonsi/si_shader.c
+++ b/src/gallium/drivers/radeonsi/si_shader.c
@@ -1815,25 +1815,21 @@ static void si_llvm_init_export_args(struct 
lp_build_tgsi_context *bld_base,
        case V_028714_SPI_SHADER_FP16_ABGR:
                args->compr = 1; /* COMPR flag */
 
                for (chan = 0; chan < 2; chan++) {
                        LLVMValueRef pack_args[2] = {
                                values[2 * chan],
                                values[2 * chan + 1]
                        };
                        LLVMValueRef packed;
 
-                       packed = lp_build_intrinsic(base->gallivm->builder,
-                                                   "llvm.SI.packf16",
-                                                   ctx->i32, pack_args, 2,
-                                                   LP_FUNC_ATTR_READNONE |
-                                                   LP_FUNC_ATTR_LEGACY);
+                       packed = ac_emit_cvt_pkrtz_f16(&ctx->ac, pack_args);
                        args->out[chan] =
                                LLVMBuildBitCast(base->gallivm->builder,
                                                 packed, ctx->f32, "");
                }
                break;
 
        case V_028714_SPI_SHADER_UNORM16_ABGR:
                for (chan = 0; chan < 4; chan++) {
                        val[chan] = ac_emit_clamp(&ctx->ac, values[chan]);
                        val[chan] = LLVMBuildFMul(builder, val[chan],
-- 
2.7.4

_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to