diff options
author | Samuel Pitoiset <[email protected]> | 2019-11-08 13:00:50 +0100 |
---|---|---|
committer | Samuel Pitoiset <[email protected]> | 2019-11-19 18:01:13 +0000 |
commit | c29514bd226028631b12ae92529d862f8b5de707 (patch) | |
tree | 2707df92783af5bdced89df9166525acdb50cdb5 /src/amd/llvm/ac_llvm_build.c | |
parent | 58d5ab98a3fde7dfafc2d48e91bf29a604e04b3b (diff) |
ac: add 8-bit and 16-bit supports to ac_build_readlane()
Signed-off-by: Samuel Pitoiset <[email protected]>
Reviewed-by: Bas Nieuwenhuizen <[email protected]>
Diffstat (limited to 'src/amd/llvm/ac_llvm_build.c')
-rw-r--r-- | src/amd/llvm/ac_llvm_build.c | 22 |
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, ""); |