V3D doesn't have opcodes for ibfe/ubfe, so we need to lower similarly to glsl/lower_instructions.cpp. Reviewed-by: Matt Turner <mattst88@gmail.com> Reviewed-by: Ian Romanick <ian.d.romanick@intel.com>tags/18.2-branchpoint
@@ -1903,7 +1903,10 @@ typedef struct nir_shader_compiler_options { | |||
bool lower_fsqrt; | |||
bool lower_fmod32; | |||
bool lower_fmod64; | |||
/** Lowers ibitfield_extract/ubitfield_extract to ibfe/ubfe. */ | |||
bool lower_bitfield_extract; | |||
/** Lowers ibitfield_extract/ubitfield_extract to bfm, compares, shifts. */ | |||
bool lower_bitfield_extract_to_shifts; | |||
/** Lowers bitfield_insert to bfi/bfm */ | |||
bool lower_bitfield_insert; | |||
/** Lowers bitfield_insert to bfm, compares, and shifts. */ |
@@ -539,6 +539,22 @@ optimizations = [ | |||
('ubfe', 'value', 'offset', 'bits')), | |||
'options->lower_bitfield_extract'), | |||
(('ibitfield_extract', 'value', 'offset', 'bits'), | |||
('bcsel', ('ieq', 0, 'bits'), | |||
0, | |||
('ishr', | |||
('ishl', 'value', ('isub', ('isub', 32, 'bits'), 'offset')), | |||
('isub', 32, 'bits'))), | |||
'options->lower_bitfield_extract_to_shifts'), | |||
(('ubitfield_extract', 'value', 'offset', 'bits'), | |||
('iand', | |||
('ushr', 'value', 'offset'), | |||
('bcsel', ('ieq', 'bits', 32), | |||
0xffffffff, | |||
('bfm', 'bits', 0))), | |||
'options->lower_bitfield_extract_to_shifts'), | |||
(('extract_i8', a, 'b@32'), | |||
('ishr', ('ishl', a, ('imul', ('isub', 3, b), 8)), 24), | |||
'options->lower_extract_byte'), |