[Mesa-dev] [PATCH 2/2] ac: use new LLVM 8 intrinsic when loading 16-bit values

Samuel Pitoiset samuel.pitoiset at gmail.com
Thu Feb 14 13:42:30 UTC 2019


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

diff --git a/src/amd/common/ac_llvm_build.c b/src/amd/common/ac_llvm_build.c
index 3acf41728ac..867a13622f9 100644
--- a/src/amd/common/ac_llvm_build.c
+++ b/src/amd/common/ac_llvm_build.c
@@ -1347,20 +1347,33 @@ ac_build_tbuffer_load_short(struct ac_llvm_context *ctx,
 				LLVMValueRef immoffset,
 				LLVMValueRef glc)
 {
-	const char *name = "llvm.amdgcn.tbuffer.load.i32";
-	LLVMTypeRef type = ctx->i32;
-	LLVMValueRef params[] = {
-				rsrc,
-				vindex,
-				voffset,
-				soffset,
-				immoffset,
-				LLVMConstInt(ctx->i32, V_008F0C_BUF_DATA_FORMAT_16, false),
-				LLVMConstInt(ctx->i32, V_008F0C_BUF_NUM_FORMAT_UINT, false),
-				glc,
-				ctx->i1false,
-	};
-	LLVMValueRef res = ac_build_intrinsic(ctx, name, type, params, 9, 0);
+	unsigned dfmt = V_008F0C_BUF_DATA_FORMAT_16;
+	unsigned nfmt = V_008F0C_BUF_NUM_FORMAT_UINT;
+	LLVMValueRef res;
+
+	if (HAVE_LLVM >= 0x0800) {
+		voffset = LLVMBuildAdd(ctx->builder, voffset, immoffset, "");
+
+		res = ac_build_llvm8_tbuffer_load(ctx, rsrc, vindex, voffset,
+						  soffset, 1, dfmt, nfmt, glc,
+						  false, true, true);
+	} else {
+		const char *name = "llvm.amdgcn.tbuffer.load.i32";
+		LLVMTypeRef type = ctx->i32;
+		LLVMValueRef params[] = {
+					rsrc,
+					vindex,
+					voffset,
+					soffset,
+					immoffset,
+					LLVMConstInt(ctx->i32, dfmt, false),
+					LLVMConstInt(ctx->i32, nfmt, false),
+					glc,
+					ctx->i1false,
+		};
+		res = ac_build_intrinsic(ctx, name, type, params, 9, 0);
+	}
+
 	return LLVMBuildTrunc(ctx->builder, res, ctx->i16, "");
 }
 
-- 
2.20.1



More information about the mesa-dev mailing list