From 763c8aabed3e03a67b6c7ba1388aa72f5b6044e4 Mon Sep 17 00:00:00 2001 From: Iago Toral Quiroga Date: Thu, 24 May 2018 09:54:45 +0200 Subject: [PATCH] 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 Reviewed-by: Jason Ekstrand --- src/compiler/nir/nir_opt_algebraic.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/compiler/nir/nir_opt_algebraic.py b/src/compiler/nir/nir_opt_algebraic.py index 78e273d..5f6ae5e 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'), ] -- 2.7.4