[Mesa-dev] [PATCH 2/3] ac: use struct/raw load intrinsics for 8-bit/16-bit int with LLVM 9+

Samuel Pitoiset samuel.pitoiset at gmail.com
Tue Mar 26 11:39:50 UTC 2019


Signed-off-by: Samuel Pitoiset <samuel.pitoiset at gmail.com>
---
 src/amd/common/ac_llvm_build.c | 51 ++++++++++++++++++++++++++--------
 1 file changed, 39 insertions(+), 12 deletions(-)

diff --git a/src/amd/common/ac_llvm_build.c b/src/amd/common/ac_llvm_build.c
index 88df82dcc54..b35e5659c42 100644
--- a/src/amd/common/ac_llvm_build.c
+++ b/src/amd/common/ac_llvm_build.c
@@ -1612,15 +1612,29 @@ 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);
+		LLVMDumpValue(res);
+	} 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
@@ -1631,15 +1645,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,
-- 
2.21.0



More information about the mesa-dev mailing list