diff options
author | Daniel Schürmann <daniel.schuermann@campus.tu-berlin.de> | 2019-01-25 16:24:55 +0100 |
---|---|---|
committer | Ian Romanick <ian.d.romanick@intel.com> | 2019-04-17 15:15:50 -0700 |
commit | 294b0b66e734c9770309a57145078110d7f67e5c (patch) | |
tree | 6e75bd98d69db27baec5bcf5c17138f3610a5c63 | |
parent | 941428a49fd5c25b755dc47d6b46574002c7f47a (diff) |
amd/common: lower bitfield_extract to ubfe/ibfe.daniel-schuermann/mesa-bitfield
-rw-r--r-- | src/amd/common/ac_llvm_build.c | 21 | ||||
-rw-r--r-- | src/amd/common/ac_nir_to_llvm.c | 34 | ||||
-rw-r--r-- | src/amd/vulkan/radv_shader.c | 1 | ||||
-rw-r--r-- | src/gallium/drivers/radeonsi/si_get.c | 1 |
4 files changed, 22 insertions, 35 deletions
diff --git a/src/amd/common/ac_llvm_build.c b/src/amd/common/ac_llvm_build.c index d75b28e1b82..8b9b27986fd 100644 --- a/src/amd/common/ac_llvm_build.c +++ b/src/amd/common/ac_llvm_build.c @@ -2482,11 +2482,22 @@ LLVMValueRef ac_build_bfe(struct ac_llvm_context *ctx, LLVMValueRef input, width, }; - return ac_build_intrinsic(ctx, - is_signed ? "llvm.amdgcn.sbfe.i32" : - "llvm.amdgcn.ubfe.i32", - ctx->i32, args, 3, - AC_FUNC_ATTR_READNONE); + LLVMValueRef result = ac_build_intrinsic(ctx, + is_signed ? "llvm.amdgcn.sbfe.i32" : + "llvm.amdgcn.ubfe.i32", + ctx->i32, args, 3, + AC_FUNC_ATTR_READNONE); + + if (HAVE_LLVM < 0x0800) { + /* FIXME: LLVM 7+ returns incorrect result when count is 0. + * https://bugs.freedesktop.org/show_bug.cgi?id=107276 + */ + LLVMValueRef zero = ctx->i32_0; + LLVMValueRef icond = LLVMBuildICmp(ctx->builder, LLVMIntEQ, width, zero, ""); + result = LLVMBuildSelect(ctx->builder, icond, zero, result, ""); + } + + return result; } LLVMValueRef ac_build_imad(struct ac_llvm_context *ctx, LLVMValueRef s0, diff --git a/src/amd/common/ac_nir_to_llvm.c b/src/amd/common/ac_nir_to_llvm.c index bfeb230fbe8..67f807b5349 100644 --- a/src/amd/common/ac_nir_to_llvm.c +++ b/src/amd/common/ac_nir_to_llvm.c @@ -428,32 +428,6 @@ static LLVMValueRef emit_imul_high(struct ac_llvm_context *ctx, return result; } -static LLVMValueRef emit_bitfield_extract(struct ac_llvm_context *ctx, - bool is_signed, - const LLVMValueRef srcs[3]) -{ - LLVMValueRef result; - - if (HAVE_LLVM >= 0x0800) { - LLVMValueRef icond = LLVMBuildICmp(ctx->builder, LLVMIntEQ, srcs[2], LLVMConstInt(ctx->i32, 32, false), ""); - result = ac_build_bfe(ctx, srcs[0], srcs[1], srcs[2], is_signed); - result = LLVMBuildSelect(ctx->builder, icond, srcs[0], result, ""); - } else { - /* FIXME: LLVM 7+ returns incorrect result when count is 0. - * https://bugs.freedesktop.org/show_bug.cgi?id=107276 - */ - LLVMValueRef zero = ctx->i32_0; - LLVMValueRef icond1 = LLVMBuildICmp(ctx->builder, LLVMIntEQ, srcs[2], LLVMConstInt(ctx->i32, 32, false), ""); - LLVMValueRef icond2 = LLVMBuildICmp(ctx->builder, LLVMIntEQ, srcs[2], zero, ""); - - result = ac_build_bfe(ctx, srcs[0], srcs[1], srcs[2], is_signed); - result = LLVMBuildSelect(ctx->builder, icond1, srcs[0], result, ""); - result = LLVMBuildSelect(ctx->builder, icond2, zero, result, ""); - } - - return result; -} - static LLVMValueRef emit_bfm(struct ac_llvm_context *ctx, LLVMValueRef bits, LLVMValueRef offset) { @@ -837,11 +811,11 @@ static void visit_alu(struct ac_nir_context *ctx, const nir_alu_instr *instr) case nir_op_bitfield_select: result = emit_bitfield_select(&ctx->ac, src[0], src[1], src[2]); break; - case nir_op_ibitfield_extract: - result = emit_bitfield_extract(&ctx->ac, true, src); + case nir_op_ubfe: + result = ac_build_bfe(&ctx->ac, src[0], src[1], src[2], false); break; - case nir_op_ubitfield_extract: - result = emit_bitfield_extract(&ctx->ac, false, src); + case nir_op_ibfe: + result = ac_build_bfe(&ctx->ac, src[0], src[1], src[2], true); break; case nir_op_bitfield_reverse: result = ac_build_bitfield_reverse(&ctx->ac, src[0]); diff --git a/src/amd/vulkan/radv_shader.c b/src/amd/vulkan/radv_shader.c index 9d27c89b014..ff29e640dc1 100644 --- a/src/amd/vulkan/radv_shader.c +++ b/src/amd/vulkan/radv_shader.c @@ -60,6 +60,7 @@ static const struct nir_shader_compiler_options nir_options = { .lower_fsat = true, .lower_fdiv = true, .lower_bitfield_insert_to_bitfield_select = true, + .lower_bitfield_extract = true, .lower_sub = true, .lower_pack_snorm_2x16 = true, .lower_pack_snorm_4x8 = true, diff --git a/src/gallium/drivers/radeonsi/si_get.c b/src/gallium/drivers/radeonsi/si_get.c index 820517bbbad..fcd9fb5fc1d 100644 --- a/src/gallium/drivers/radeonsi/si_get.c +++ b/src/gallium/drivers/radeonsi/si_get.c @@ -491,6 +491,7 @@ static const struct nir_shader_compiler_options nir_options = { .lower_fsat = true, .lower_fdiv = true, .lower_bitfield_insert_to_bitfield_select = true, + .lower_bitfield_extract = true, .lower_sub = true, .lower_ffma = true, .lower_pack_snorm_2x16 = true, |