Mesa (master): gallivm: add bitfield reverse and ufind_msb
GitLab Mirror
gitlab-mirror at kemper.freedesktop.org
Sun Dec 8 20:29:05 UTC 2019
Module: Mesa
Branch: master
Commit: d7dc14628a96989d9bf317f4c64540b41dee48cb
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=d7dc14628a96989d9bf317f4c64540b41dee48cb
Author: Dave Airlie <airlied at redhat.com>
Date: Tue Dec 3 15:54:56 2019 +1000
gallivm: add bitfield reverse and ufind_msb
Reviewed-by: Roland Scheidegger <sroland at vmware.com>
Reviewed-by: Krzysztof Raszkowski <krzysztof.raszkowski at intel.com>
---
src/gallium/auxiliary/gallivm/lp_bld_bitarit.c | 26 ++++++++++++++++++++++++++
src/gallium/auxiliary/gallivm/lp_bld_bitarit.h | 6 ++++++
src/gallium/auxiliary/gallivm/lp_bld_nir.c | 9 +++++++++
3 files changed, 41 insertions(+)
diff --git a/src/gallium/auxiliary/gallivm/lp_bld_bitarit.c b/src/gallium/auxiliary/gallivm/lp_bld_bitarit.c
index c717b988f27..eee3cba2fb5 100644
--- a/src/gallium/auxiliary/gallivm/lp_bld_bitarit.c
+++ b/src/gallium/auxiliary/gallivm/lp_bld_bitarit.c
@@ -254,6 +254,18 @@ lp_build_popcount(struct lp_build_context *bld, LLVMValueRef a)
}
LLVMValueRef
+lp_build_bitfield_reverse(struct lp_build_context *bld, LLVMValueRef a)
+{
+ LLVMBuilderRef builder = bld->gallivm->builder;
+ LLVMValueRef result;
+ char intr_str[256];
+
+ lp_format_intrinsic(intr_str, sizeof(intr_str), "llvm.bitreverse", bld->vec_type);
+ result = lp_build_intrinsic_unary(builder, intr_str, bld->vec_type, a);
+ return result;
+}
+
+LLVMValueRef
lp_build_cttz(struct lp_build_context *bld, LLVMValueRef a)
{
LLVMBuilderRef builder = bld->gallivm->builder;
@@ -266,3 +278,17 @@ lp_build_cttz(struct lp_build_context *bld, LLVMValueRef a)
result = lp_build_intrinsic_binary(builder, intr_str, bld->vec_type, a, undef_val);
return result;
}
+
+LLVMValueRef
+lp_build_ctlz(struct lp_build_context *bld, LLVMValueRef a)
+{
+ LLVMBuilderRef builder = bld->gallivm->builder;
+ LLVMValueRef result;
+ char intr_str[256];
+
+ lp_format_intrinsic(intr_str, sizeof(intr_str), "llvm.ctlz", bld->vec_type);
+
+ LLVMValueRef undef_val = LLVMConstNull(LLVMInt1TypeInContext(bld->gallivm->context));
+ result = lp_build_intrinsic_binary(builder, intr_str, bld->vec_type, a, undef_val);
+ return result;
+}
diff --git a/src/gallium/auxiliary/gallivm/lp_bld_bitarit.h b/src/gallium/auxiliary/gallivm/lp_bld_bitarit.h
index 989ce5ca568..ae85ea4b16d 100644
--- a/src/gallium/auxiliary/gallivm/lp_bld_bitarit.h
+++ b/src/gallium/auxiliary/gallivm/lp_bld_bitarit.h
@@ -75,5 +75,11 @@ LLVMValueRef
lp_build_popcount(struct lp_build_context *bld, LLVMValueRef a);
LLVMValueRef
+lp_build_bitfield_reverse(struct lp_build_context *bld, LLVMValueRef a);
+
+LLVMValueRef
lp_build_cttz(struct lp_build_context *bld, LLVMValueRef a);
+
+LLVMValueRef
+lp_build_ctlz(struct lp_build_context *bld, LLVMValueRef a);
#endif /* !LP_BLD_ARIT_H */
diff --git a/src/gallium/auxiliary/gallivm/lp_bld_nir.c b/src/gallium/auxiliary/gallivm/lp_bld_nir.c
index e13ec4e1a19..197e4118d0d 100644
--- a/src/gallium/auxiliary/gallivm/lp_bld_nir.c
+++ b/src/gallium/auxiliary/gallivm/lp_bld_nir.c
@@ -406,6 +406,9 @@ static LLVMValueRef do_alu_action(struct lp_build_nir_context *bld_base,
case nir_op_bitfield_select:
result = lp_build_xor(&bld_base->uint_bld, src[2], lp_build_and(&bld_base->uint_bld, src[0], lp_build_xor(&bld_base->uint_bld, src[1], src[2])));
break;
+ case nir_op_bitfield_reverse:
+ result = lp_build_bitfield_reverse(get_int_bld(bld_base, false, src_bit_size[0]), src[0]);
+ break;
case nir_op_f2b32:
result = flt_to_bool32(bld_base, src_bit_size[0], src[0]);
break;
@@ -653,6 +656,12 @@ static LLVMValueRef do_alu_action(struct lp_build_nir_context *bld_base,
result = lp_build_div(&bld_base->uint_bld,
src[0], src[1]);
break;
+ case nir_op_ufind_msb: {
+ struct lp_build_context *uint_bld = get_int_bld(bld_base, true, src_bit_size[0]);
+ result = lp_build_ctlz(uint_bld, src[0]);
+ result = lp_build_sub(uint_bld, lp_build_const_int_vec(gallivm, uint_bld->type, src_bit_size[0] - 1), result);
+ break;
+ }
case nir_op_uge32:
result = icmp32(bld_base, PIPE_FUNC_GEQUAL, true, src_bit_size[0], src);
break;
More information about the mesa-commit
mailing list