summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSamuel Pitoiset <samuel.pitoiset@gmail.com>2019-11-08 13:00:50 +0100
committerSamuel Pitoiset <samuel.pitoiset@gmail.com>2019-11-19 18:01:13 +0000
commitc29514bd226028631b12ae92529d862f8b5de707 (patch)
tree2707df92783af5bdced89df9166525acdb50cdb5
parent58d5ab98a3fde7dfafc2d48e91bf29a604e04b3b (diff)
ac: add 8-bit and 16-bit supports to ac_build_readlane()
Signed-off-by: Samuel Pitoiset <samuel.pitoiset@gmail.com> Reviewed-by: Bas Nieuwenhuizen <bas@basnieuwenhuizen.nl>
-rw-r--r--src/amd/llvm/ac_llvm_build.c22
1 files changed, 16 insertions, 6 deletions
diff --git a/src/amd/llvm/ac_llvm_build.c b/src/amd/llvm/ac_llvm_build.c
index f2349018dee..13c093fb3e6 100644
--- a/src/amd/llvm/ac_llvm_build.c
+++ b/src/amd/llvm/ac_llvm_build.c
@@ -3566,14 +3566,23 @@ void ac_apply_fmask_to_sample(struct ac_llvm_context *ac, LLVMValueRef fmask,
static LLVMValueRef
_ac_build_readlane(struct ac_llvm_context *ctx, LLVMValueRef src, LLVMValueRef lane)
{
+ LLVMTypeRef type = LLVMTypeOf(src);
+ LLVMValueRef result;
+
ac_build_optimization_barrier(ctx, &src);
- return ac_build_intrinsic(ctx,
+
+ src = LLVMBuildZExt(ctx->builder, src, ctx->i32, "");
+ if (lane)
+ lane = LLVMBuildZExt(ctx->builder, lane, ctx->i32, "");
+
+ result = ac_build_intrinsic(ctx,
lane == NULL ? "llvm.amdgcn.readfirstlane" : "llvm.amdgcn.readlane",
- LLVMTypeOf(src), (LLVMValueRef []) {
- src, lane },
+ ctx->i32, (LLVMValueRef []) { src, lane },
lane == NULL ? 1 : 2,
AC_FUNC_ATTR_READNONE |
AC_FUNC_ATTR_CONVERGENT);
+
+ return LLVMBuildTrunc(ctx->builder, result, type, "");
}
/**
@@ -3591,9 +3600,7 @@ ac_build_readlane(struct ac_llvm_context *ctx, LLVMValueRef src, LLVMValueRef la
unsigned bits = LLVMGetIntTypeWidth(LLVMTypeOf(src));
LLVMValueRef ret;
- if (bits == 32) {
- ret = _ac_build_readlane(ctx, src, lane);
- } else {
+ if (bits > 32) {
assert(bits % 32 == 0);
LLVMTypeRef vec_type = LLVMVectorType(ctx->i32, bits / 32);
LLVMValueRef src_vector =
@@ -3606,7 +3613,10 @@ ac_build_readlane(struct ac_llvm_context *ctx, LLVMValueRef src, LLVMValueRef la
ret = LLVMBuildInsertElement(ctx->builder, ret, ret_comp,
LLVMConstInt(ctx->i32, i, 0), "");
}
+ } else {
+ ret = _ac_build_readlane(ctx, src, lane);
}
+
if (LLVMGetTypeKind(src_type) == LLVMPointerTypeKind)
return LLVMBuildIntToPtr(ctx->builder, ret, src_type, "");
return LLVMBuildBitCast(ctx->builder, ret, src_type, "");