ac: add ac_build_llvm8_tbuffer_load() helper
It uses the new LLVM intrinsics. Signed-off-by: Samuel Pitoiset <samuel.pitoiset@gmail.com> Reviewed-by: Bas Nieuwenhuizen <bas@basnieuwenhuizen.nl>
This commit is contained in:
parent
9762a9f893
commit
f0223143a8
|
@ -1364,6 +1364,44 @@ ac_build_tbuffer_load_short(struct ac_llvm_context *ctx,
|
||||||
return LLVMBuildTrunc(ctx->builder, res, ctx->i16, "");
|
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
|
* 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
|
* call instructions. If you know an instruction can only produce the values
|
||||||
|
|
|
@ -298,6 +298,20 @@ ac_build_tbuffer_load_short(struct ac_llvm_context *ctx,
|
||||||
LLVMValueRef immoffset,
|
LLVMValueRef immoffset,
|
||||||
LLVMValueRef glc);
|
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
|
LLVMValueRef
|
||||||
ac_get_thread_id(struct ac_llvm_context *ctx);
|
ac_get_thread_id(struct ac_llvm_context *ctx);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue