diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/compiler/nir/nir.h | 5 | ||||
-rw-r--r-- | src/compiler/nir/nir_opt_algebraic.py | 14 |
2 files changed, 19 insertions, 0 deletions
diff --git a/src/compiler/nir/nir.h b/src/compiler/nir/nir.h index 5a1f79515ad..6c0276fcc7f 100644 --- a/src/compiler/nir/nir.h +++ b/src/compiler/nir/nir.h @@ -1904,7 +1904,12 @@ typedef struct nir_shader_compiler_options { bool lower_fmod32; bool lower_fmod64; bool lower_bitfield_extract; + /** Lowers bitfield_insert to bfi/bfm */ bool lower_bitfield_insert; + /** Lowers bitfield_insert to bfm, compares, and shifts. */ + bool lower_bitfield_insert_to_shifts; + /** Lowers bfm to shifts and subtracts. */ + bool lower_bfm; bool lower_uadd_carry; bool lower_usub_borrow; /** lowers fneg and ineg to fsub and isub. */ diff --git a/src/compiler/nir/nir_opt_algebraic.py b/src/compiler/nir/nir_opt_algebraic.py index fdfb0250b0b..878d13ded5e 100644 --- a/src/compiler/nir/nir_opt_algebraic.py +++ b/src/compiler/nir/nir_opt_algebraic.py @@ -515,6 +515,20 @@ optimizations = [ ('bfi', ('bfm', 'bits', 'offset'), 'insert', 'base')), 'options->lower_bitfield_insert'), + # Alternative lowering that doesn't rely on bfi. + (('bitfield_insert', 'base', 'insert', 'offset', 'bits'), + ('bcsel', ('ilt', 31, 'bits'), + 'insert', + ('ior', + ('iand', 'base', ('inot', ('bfm', 'bits', 'offset'))), + ('iand', ('ishl', 'insert', 'offset'), ('bfm', 'bits', 'offset')))), + 'options->lower_bitfield_insert_to_shifts'), + + # bfm lowering -- note that the NIR opcode is undefined if either arg is 32. + (('bfm', 'bits', 'offset'), + ('ishl', ('isub', ('ishl', 1, 'bits'), 1), 'offset'), + 'options->lower_bfm'), + (('ibitfield_extract', 'value', 'offset', 'bits'), ('bcsel', ('ilt', 31, 'bits'), 'value', ('ibfe', 'value', 'offset', 'bits')), |