diff options
Diffstat (limited to 'src/compiler/nir')
-rw-r--r-- | src/compiler/nir/nir_opt_algebraic.py | 9 |
1 files changed, 9 insertions, 0 deletions
diff --git a/src/compiler/nir/nir_opt_algebraic.py b/src/compiler/nir/nir_opt_algebraic.py index e4295d7a9e9..9ec4acd13bf 100644 --- a/src/compiler/nir/nir_opt_algebraic.py +++ b/src/compiler/nir/nir_opt_algebraic.py @@ -29,6 +29,7 @@ from collections import OrderedDict import nir_algebraic from nir_opcodes import type_sizes import itertools +import struct from math import pi # Convenience variables @@ -84,6 +85,9 @@ def lowered_sincos(c): x = ('fmul', ('fsub', x, ('fmul', x, ('fabs', x))), 4.0) return ('ffma', ('ffma', x, ('fabs', x), ('fneg', x)), 0.225, x) +def intBitsToFloat(i): + return struct.unpack('!f', struct.pack('!I', i))[0] + optimizations = [ (('imul', a, '#b@32(is_pos_power_of_two)'), ('ishl', a, ('find_lsb', b)), '!options->lower_bitops'), @@ -1550,6 +1554,11 @@ late_optimizations = [ (('bcsel', a, 0, ('b2f32', ('inot', 'b@bool'))), ('b2f32', ('inot', ('ior', a, b)))), + # Putting this in 'optimizations' interferes with the bcsel(a, op(b, c), + # op(b, d)) => op(b, bcsel(a, c, d)) transformations. I do not know why. + (('bcsel', ('feq', ('fsqrt', 'a(is_not_negative)'), 0.0), intBitsToFloat(0x7f7fffff), ('frsq', a)), + ('fmin', ('frsq', a), intBitsToFloat(0x7f7fffff))), + # Things that look like DPH in the source shader may get expanded to # something that looks like dot(v1.xyz, v2.xyz) + v1.w by the time it gets # to NIR. After FFMA is generated, this can look like: |