Mesa (master): nir: add opcodes for *find_msb_rev and lowering
GitLab Mirror
gitlab-mirror at kemper.freedesktop.org
Mon Mar 22 14:59:18 UTC 2021
Module: Mesa
Branch: master
Commit: a5747f8ab357ff00c630b937b221e5fb59d90289
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=a5747f8ab357ff00c630b937b221e5fb59d90289
Author: Gert Wollny <gert.wollny at collabora.com>
Date: Wed Mar 10 09:38:18 2021 +0100
nir: add opcodes for *find_msb_rev and lowering
Some hardware supports a version of find_msb where the bits are counted
starting at the high bit, and this needs some lowering to obtain the
value that is expected by *find_msb
Signed-off-by: Gert Wollny <gert.wollny at collabora.com>
Reviewed-by: Kristian H. Kristensen <hoegsberg at gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/9452>
---
src/compiler/nir/nir.h | 2 ++
src/compiler/nir/nir_opcodes.py | 26 ++++++++++++++++++++++++++
src/compiler/nir/nir_opt_algebraic.py | 12 ++++++++++++
3 files changed, 40 insertions(+)
diff --git a/src/compiler/nir/nir.h b/src/compiler/nir/nir.h
index 3620dde1a30..ec841c43536 100644
--- a/src/compiler/nir/nir.h
+++ b/src/compiler/nir/nir.h
@@ -3160,6 +3160,8 @@ typedef struct nir_shader_compiler_options {
bool lower_bit_count;
/** Lowers ifind_msb to compare and ufind_msb */
bool lower_ifind_msb;
+ /** Lowers ifind_msb and ufind_msb to reverse variants */
+ bool lower_find_msb_to_reverse;
/** Lowers find_lsb to ufind_msb and logic ops */
bool lower_find_lsb;
bool lower_uadd_carry;
diff --git a/src/compiler/nir/nir_opcodes.py b/src/compiler/nir/nir_opcodes.py
index 854f7562635..012c7bfea09 100644
--- a/src/compiler/nir/nir_opcodes.py
+++ b/src/compiler/nir/nir_opcodes.py
@@ -454,6 +454,16 @@ for (int bit = bit_size - 1; bit >= 0; bit--) {
}
""")
+unop_convert("ufind_msb_rev", tint32, tuint, """
+dst = -1;
+for (int bit = 0; bit < bit_size; bit++) {
+ if ((src0 << bit) & 0x80000000) {
+ dst = bit;
+ break;
+ }
+}
+""")
+
unop("uclz", tuint32, """
int bit;
for (bit = bit_size - 1; bit >= 0; bit--) {
@@ -477,6 +487,22 @@ for (int bit = 31; bit >= 0; bit--) {
}
""")
+unop_convert("ifind_msb_rev", tint32, tuint, """
+dst = -1;
+if (src0 != 0 || src0 != -1) {
+ for (int bit = 0; bit < 31; bit++) {
+ /* If src0 < 0, we're looking for the first 0 bit.
+ * if src0 >= 0, we're looking for the first 1 bit.
+ */
+ if ((((src0 << bit) & 0x40000000) && (src0 >= 0)) ||
+ ((!((src0 << bit) & 0x40000000)) && (src0 < 0))) {
+ dst = bit;
+ break;
+ }
+ }
+}
+""")
+
unop_convert("find_lsb", tint32, tint, """
dst = -1;
for (unsigned bit = 0; bit < bit_size; bit++) {
diff --git a/src/compiler/nir/nir_opt_algebraic.py b/src/compiler/nir/nir_opt_algebraic.py
index 5938561735e..32d1dab1743 100644
--- a/src/compiler/nir/nir_opt_algebraic.py
+++ b/src/compiler/nir/nir_opt_algebraic.py
@@ -1523,6 +1523,18 @@ optimizations.extend([
('ufind_msb', ('bcsel', ('ilt', 'value', 0), ('inot', 'value'), 'value')),
'options->lower_ifind_msb'),
+ (('ifind_msb', 'value'),
+ ('bcsel', ('ige', ('ifind_msb_rev', 'value'), 0),
+ ('isub', 31, ('ifind_msb_rev', 'value')),
+ ('ifind_msb_rev', 'value')),
+ 'options->lower_find_msb_to_reverse'),
+
+ (('ufind_msb', 'value'),
+ ('bcsel', ('ige', ('ufind_msb_rev', 'value'), 0),
+ ('isub', 31, ('ufind_msb_rev', 'value')),
+ ('ufind_msb_rev', 'value')),
+ 'options->lower_find_msb_to_reverse'),
+
(('find_lsb', 'value'),
('ufind_msb', ('iand', 'value', ('ineg', 'value'))),
'options->lower_find_lsb'),
More information about the mesa-commit
mailing list