[Mesa-dev] [PATCH 10/24] radeonsi: replace SI.packf16 with amdgcn.cvt.pkrtz

Marek Olšák maraeo at gmail.com
Sat Feb 25 23:58:08 UTC 2017


From: Marek Olšák <marek.olsak at 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



More information about the mesa-dev mailing list