Mesa (master): ac: use struct/raw load intrinsics for 8-bit/16-bit int with LLVM 9+

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Wed Apr 17 20:10:53 UTC 2019


Module: Mesa
Branch: master
Commit: 26ea50623550dd84c19e4f2132a355509b1b0c41
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=26ea50623550dd84c19e4f2132a355509b1b0c41

Author: Samuel Pitoiset <samuel.pitoiset at gmail.com>
Date:   Tue Mar 26 12:24:52 2019 +0100

ac: use struct/raw load intrinsics for 8-bit/16-bit int with LLVM 9+

This changes requires LLVM r356465.

Signed-off-by: Samuel Pitoiset <samuel.pitoiset at gmail.com>
Reviewed-by: Bas Nieuwenhuizen <bas at basnieuwenhuizen.nl>
Reviewed-by: Marek Olšák <marek.olsak at amd.com>

---

 src/amd/common/ac_llvm_build.c | 50 ++++++++++++++++++++++++++++++++----------
 1 file changed, 38 insertions(+), 12 deletions(-)

diff --git a/src/amd/common/ac_llvm_build.c b/src/amd/common/ac_llvm_build.c
index c7100e52295..55ad3534ae2 100644
--- a/src/amd/common/ac_llvm_build.c
+++ b/src/amd/common/ac_llvm_build.c
@@ -1603,15 +1603,28 @@ ac_build_tbuffer_load_short(struct ac_llvm_context *ctx,
 			    LLVMValueRef immoffset,
 			    bool glc)
 {
-	unsigned dfmt = V_008F0C_BUF_DATA_FORMAT_16;
-	unsigned nfmt = V_008F0C_BUF_NUM_FORMAT_UINT;
 	LLVMValueRef res;
 
-	res = ac_build_raw_tbuffer_load(ctx, rsrc, voffset, soffset,
-					immoffset, 1, dfmt, nfmt, glc, false,
-					false);
+	if (HAVE_LLVM >= 0x900) {
+		voffset = LLVMBuildAdd(ctx->builder, voffset, immoffset, "");
+
+		/* LLVM 9+ supports i8/i16 with struct/raw intrinsics. */
+		res = ac_build_llvm8_buffer_load_common(ctx, rsrc, NULL,
+							voffset, soffset,
+							1, ctx->i16, glc, false,
+							false, false, false);
+	} else {
+		unsigned dfmt = V_008F0C_BUF_DATA_FORMAT_16;
+		unsigned nfmt = V_008F0C_BUF_NUM_FORMAT_UINT;
 
-	return LLVMBuildTrunc(ctx->builder, res, ctx->i16, "");
+		res = ac_build_raw_tbuffer_load(ctx, rsrc, voffset, soffset,
+						immoffset, 1, dfmt, nfmt, glc, false,
+						false);
+
+		res = LLVMBuildTrunc(ctx->builder, res, ctx->i16, "");
+	}
+
+	return res;
 }
 
 LLVMValueRef
@@ -1622,15 +1635,28 @@ ac_build_tbuffer_load_byte(struct ac_llvm_context *ctx,
 			   LLVMValueRef immoffset,
 			   bool glc)
 {
-	unsigned dfmt = V_008F0C_BUF_DATA_FORMAT_8;
-	unsigned nfmt = V_008F0C_BUF_NUM_FORMAT_UINT;
 	LLVMValueRef res;
 
-	res = ac_build_raw_tbuffer_load(ctx, rsrc, voffset, soffset,
-					immoffset, 1, dfmt, nfmt, glc, false,
-					false);
+	if (HAVE_LLVM >= 0x900) {
+		voffset = LLVMBuildAdd(ctx->builder, voffset, immoffset, "");
+
+		/* LLVM 9+ supports i8/i16 with struct/raw intrinsics. */
+		res = ac_build_llvm8_buffer_load_common(ctx, rsrc, NULL,
+							voffset, soffset,
+							1, ctx->i8, glc, false,
+							false, false, false);
+	} else {
+		unsigned dfmt = V_008F0C_BUF_DATA_FORMAT_8;
+		unsigned nfmt = V_008F0C_BUF_NUM_FORMAT_UINT;
 
-	return LLVMBuildTrunc(ctx->builder, res, ctx->i8, "");
+		res = ac_build_raw_tbuffer_load(ctx, rsrc, voffset, soffset,
+						immoffset, 1, dfmt, nfmt, glc, false,
+						false);
+
+		res = LLVMBuildTrunc(ctx->builder, res, ctx->i8, "");
+	}
+
+	return res;
 }
 static void
 ac_build_llvm8_tbuffer_store(struct ac_llvm_context *ctx,




More information about the mesa-commit mailing list