nir: Add opcodes to extract bytes or words.
The uint versions zero extend while the int versions sign extend. Reviewed-by: Iago Toral Quiroga <itoral@igalia.com>
This commit is contained in:
@@ -1471,6 +1471,9 @@ typedef struct nir_shader_compiler_options {
|
|||||||
bool lower_pack_half_2x16;
|
bool lower_pack_half_2x16;
|
||||||
bool lower_unpack_half_2x16;
|
bool lower_unpack_half_2x16;
|
||||||
|
|
||||||
|
bool lower_extract_byte;
|
||||||
|
bool lower_extract_word;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Does the driver support real 32-bit integers? (Otherwise, integers
|
* Does the driver support real 32-bit integers? (Otherwise, integers
|
||||||
* are simulated by floats.)
|
* are simulated by floats.)
|
||||||
|
@@ -536,6 +536,15 @@ dst.x = src0.x;
|
|||||||
dst.y = src1.x;
|
dst.y = src1.x;
|
||||||
""")
|
""")
|
||||||
|
|
||||||
|
# Byte extraction
|
||||||
|
binop("extract_u8", tuint, "", "(uint8_t)(src0 >> (src1 * 8))")
|
||||||
|
binop("extract_i8", tint, "", "(int8_t)(src0 >> (src1 * 8))")
|
||||||
|
|
||||||
|
# Word extraction
|
||||||
|
binop("extract_u16", tuint, "", "(uint16_t)(src0 >> (src1 * 16))")
|
||||||
|
binop("extract_i16", tint, "", "(int16_t)(src0 >> (src1 * 16))")
|
||||||
|
|
||||||
|
|
||||||
def triop(name, ty, const_expr):
|
def triop(name, ty, const_expr):
|
||||||
opcode(name, 0, ty, [0, 0, 0], [ty, ty, ty], "", const_expr)
|
opcode(name, 0, ty, [0, 0, 0], [ty, ty, ty], "", const_expr)
|
||||||
def triop_horiz(name, output_size, src1_size, src2_size, src3_size, const_expr):
|
def triop_horiz(name, output_size, src1_size, src2_size, src3_size, const_expr):
|
||||||
|
@@ -242,6 +242,22 @@ optimizations = [
|
|||||||
('bcsel', ('ult', 31, 'bits'), 'value',
|
('bcsel', ('ult', 31, 'bits'), 'value',
|
||||||
('ubfe', 'value', 'offset', 'bits')),
|
('ubfe', 'value', 'offset', 'bits')),
|
||||||
'options->lower_bitfield_extract'),
|
'options->lower_bitfield_extract'),
|
||||||
|
|
||||||
|
(('extract_i8', a, b),
|
||||||
|
('ishr', ('ishl', a, ('imul', ('isub', 3, b), 8)), 24),
|
||||||
|
'options->lower_extract_byte'),
|
||||||
|
|
||||||
|
(('extract_u8', a, b),
|
||||||
|
('iand', ('ushr', a, ('imul', b, 8)), 0xff),
|
||||||
|
'options->lower_extract_byte'),
|
||||||
|
|
||||||
|
(('extract_i16', a, b),
|
||||||
|
('ishr', ('ishl', a, ('imul', ('isub', 1, b), 16)), 16),
|
||||||
|
'options->lower_extract_word'),
|
||||||
|
|
||||||
|
(('extract_u16', a, b),
|
||||||
|
('iand', ('ushr', a, ('imul', b, 16)), 0xffff),
|
||||||
|
'options->lower_extract_word'),
|
||||||
]
|
]
|
||||||
|
|
||||||
# Add optimizations to handle the case where the result of a ternary is
|
# Add optimizations to handle the case where the result of a ternary is
|
||||||
|
Reference in New Issue
Block a user