ac: use new LLVM 8 intrinsic when loading 16-bit values

Signed-off-by: Samuel Pitoiset <samuel.pitoiset@gmail.com>
Reviewed-by: Bas Nieuwenhuizen <bas@basnieuwenhuizen.nl>
This commit is contained in:
Samuel Pitoiset
2019-02-14 14:42:30 +01:00
parent f0223143a8
commit 2cf5433b99
+27 -14
View File
@@ -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, "");
}