summaryrefslogtreecommitdiffstats
path: root/src/compiler/nir/nir_opt_algebraic.py
diff options
context:
space:
mode:
authorIago Toral Quiroga <[email protected]>2018-05-24 09:54:45 +0200
committerJuan A. Suarez Romero <[email protected]>2019-03-25 16:08:25 +0100
commit763c8aabed3e03a67b6c7ba1388aa72f5b6044e4 (patch)
tree6b1410bff50069d40484e971e1449a8ba1acfe3f /src/compiler/nir/nir_opt_algebraic.py
parent3766334923e9180c5ed98a97808dda1a2665332d (diff)
compiler/nir: add lowering for 16-bit ldexp
v2 (Topi): - Make bit-size handling order be 16-bit, 32-bit, 64-bit - Clamp lower exponent range at -28 instead of -30. Reviewed-by: Topi Pohjolainen <[email protected]> Reviewed-by: Jason Ekstrand <[email protected]>
Diffstat (limited to 'src/compiler/nir/nir_opt_algebraic.py')
-rw-r--r--src/compiler/nir/nir_opt_algebraic.py9
1 files changed, 7 insertions, 2 deletions
diff --git a/src/compiler/nir/nir_opt_algebraic.py b/src/compiler/nir/nir_opt_algebraic.py
index 78e273d0e64..5f6ae5eeccc 100644
--- a/src/compiler/nir/nir_opt_algebraic.py
+++ b/src/compiler/nir/nir_opt_algebraic.py
@@ -851,7 +851,9 @@ for x, y in itertools.product(['f', 'u', 'i'], ['f', 'u', 'i']):
def fexp2i(exp, bits):
# We assume that exp is already in the right range.
- if bits == 32:
+ if bits == 16:
+ return ('i2i16', ('ishl', ('iadd', exp, 15), 10))
+ elif bits == 32:
return ('ishl', ('iadd', exp, 127), 23)
elif bits == 64:
return ('pack_64_2x32_split', 0, ('ishl', ('iadd', exp, 1023), 20))
@@ -869,7 +871,9 @@ def ldexp(f, exp, bits):
# handles a range on exp of [-252, 254] which allows you to create any
# value (including denorms if the hardware supports it) and to adjust the
# exponent of any normal value to anything you want.
- if bits == 32:
+ if bits == 16:
+ exp = ('imin', ('imax', exp, -28), 30)
+ elif bits == 32:
exp = ('imin', ('imax', exp, -252), 254)
elif bits == 64:
exp = ('imin', ('imax', exp, -2044), 2046)
@@ -889,6 +893,7 @@ def ldexp(f, exp, bits):
return ('fmul', ('fmul', f, pow2_1), pow2_2)
optimizations += [
+ (('ldexp@16', 'x', 'exp'), ldexp('x', 'exp', 16), 'options->lower_ldexp'),
(('ldexp@32', 'x', 'exp'), ldexp('x', 'exp', 32), 'options->lower_ldexp'),
(('ldexp@64', 'x', 'exp'), ldexp('x', 'exp', 64), 'options->lower_ldexp'),
]