From: Eric Anholt Date: Wed, 2 May 2018 21:13:23 +0000 (-0700) Subject: nir: Add lowering for bitfieldInsert without using bfi. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=74618ccbcab6d785152c2840525d5bef08ed0696;p=mesa.git nir: Add lowering for bitfieldInsert without using bfi. If you don't have HW to do bfi, then lowering bitfieldInsert to bfi makes things harder than keeping the "bits" argument around. This still uses bfm, but I've added the obvious lowering of bfm if you need it. Reviewed-by: Matt Turner Reviewed-by: Ian Romanick --- 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')),