From f0223143a8ba26962cebcec9118ac5c9de3113aa Mon Sep 17 00:00:00 2001 From: Samuel Pitoiset Date: Thu, 14 Feb 2019 14:42:29 +0100 Subject: [PATCH] ac: add ac_build_llvm8_tbuffer_load() helper It uses the new LLVM intrinsics. Signed-off-by: Samuel Pitoiset Reviewed-by: Bas Nieuwenhuizen --- src/amd/common/ac_llvm_build.c | 38 ++++++++++++++++++++++++++++++++++ src/amd/common/ac_llvm_build.h | 14 +++++++++++++ 2 files changed, 52 insertions(+) diff --git a/src/amd/common/ac_llvm_build.c b/src/amd/common/ac_llvm_build.c index d06eb7df50c..3acf41728ac 100644 --- a/src/amd/common/ac_llvm_build.c +++ b/src/amd/common/ac_llvm_build.c @@ -1364,6 +1364,44 @@ ac_build_tbuffer_load_short(struct ac_llvm_context *ctx, return LLVMBuildTrunc(ctx->builder, res, ctx->i16, ""); } +LLVMValueRef +ac_build_llvm8_tbuffer_load(struct ac_llvm_context *ctx, + LLVMValueRef rsrc, + LLVMValueRef vindex, + LLVMValueRef voffset, + LLVMValueRef soffset, + unsigned num_channels, + unsigned dfmt, + unsigned nfmt, + bool glc, + bool slc, + bool can_speculate, + bool structurized) +{ + LLVMValueRef args[6]; + int idx = 0; + args[idx++] = LLVMBuildBitCast(ctx->builder, rsrc, ctx->v4i32, ""); + if (structurized) + args[idx++] = vindex ? vindex : ctx->i32_0; + args[idx++] = voffset ? voffset : ctx->i32_0; + args[idx++] = soffset ? soffset : ctx->i32_0; + args[idx++] = LLVMConstInt(ctx->i32, dfmt | (nfmt << 4), 0); + args[idx++] = LLVMConstInt(ctx->i32, (glc ? 1 : 0) + (slc ? 2 : 0), 0); + unsigned func = CLAMP(num_channels, 1, 3) - 1; + + LLVMTypeRef types[] = {ctx->i32, ctx->v2i32, ctx->v4i32}; + const char *type_names[] = {"i32", "v2i32", "v4i32"}; + const char *indexing_kind = structurized ? "struct" : "raw"; + char name[256]; + + snprintf(name, sizeof(name), "llvm.amdgcn.%s.tbuffer.load.%s", + indexing_kind, type_names[func]); + + return ac_build_intrinsic(ctx, name, types[func], args, + idx, + ac_get_load_intr_attribs(can_speculate)); +} + /** * Set range metadata on an instruction. This can only be used on load and * call instructions. If you know an instruction can only produce the values diff --git a/src/amd/common/ac_llvm_build.h b/src/amd/common/ac_llvm_build.h index 7f8e2398a25..00d59a9e369 100644 --- a/src/amd/common/ac_llvm_build.h +++ b/src/amd/common/ac_llvm_build.h @@ -298,6 +298,20 @@ ac_build_tbuffer_load_short(struct ac_llvm_context *ctx, LLVMValueRef immoffset, LLVMValueRef glc); +LLVMValueRef +ac_build_llvm8_tbuffer_load(struct ac_llvm_context *ctx, + LLVMValueRef rsrc, + LLVMValueRef vindex, + LLVMValueRef voffset, + LLVMValueRef soffset, + unsigned num_channels, + unsigned dfmt, + unsigned nfmt, + bool glc, + bool slc, + bool can_speculate, + bool structurized); + LLVMValueRef ac_get_thread_id(struct ac_llvm_context *ctx);