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 <mattst88@gmail.com>
Reviewed-by: Ian Romanick <ian.d.romanick@intel.com>
This commit is contained in:
Eric Anholt
2018-05-02 14:13:23 -07:00
parent 735b104707
commit 74618ccbca
2 changed files with 19 additions and 0 deletions

View File

@@ -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. */

View File

@@ -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')),