|
|
|
@@ -3081,15 +3081,27 @@ late_optimizations.extend([
|
|
|
|
|
(('iadd', a, ('ineg', 'b')), ('isub', 'a', 'b'), 'options->has_isub || options->lower_ineg'),
|
|
|
|
|
(('ineg', a), ('isub', 0, a), 'options->lower_ineg'),
|
|
|
|
|
(('iabs', a), ('imax', a, ('ineg', a)), 'options->lower_iabs'),
|
|
|
|
|
])
|
|
|
|
|
|
|
|
|
|
for s in [8, 16, 32, 64]:
|
|
|
|
|
cond = 'options->has_iadd3'
|
|
|
|
|
if s == 64:
|
|
|
|
|
cond += ' && !(options->lower_int64_options & nir_lower_iadd3_64)'
|
|
|
|
|
|
|
|
|
|
iadd = "iadd@{}".format(s)
|
|
|
|
|
|
|
|
|
|
# On Intel GPUs, the constant field for an ADD3 instruction must be either
|
|
|
|
|
# int16_t or uint16_t.
|
|
|
|
|
(('iadd', ('iadd(is_used_once)', 'a(is_not_const)', 'b(is_not_const)'), 'c(is_not_const)'), ('iadd3', a, b, c), 'options->has_iadd3'),
|
|
|
|
|
(('iadd', ('iadd(is_used_once)', '#a(is_16_bits)', 'b(is_not_const)'), 'c(is_not_const)'), ('iadd3', a, b, c), 'options->has_iadd3'),
|
|
|
|
|
(('iadd', ('iadd(is_used_once)', 'a(is_not_const)', 'b(is_not_const)'), '#c(is_16_bits)'), ('iadd3', a, b, c), 'options->has_iadd3'),
|
|
|
|
|
(('iadd', ('ineg', ('iadd(is_used_once)', 'a(is_not_const)', 'b(is_not_const)')), 'c(is_not_const)'), ('iadd3', ('ineg', a), ('ineg', b), c), 'options->has_iadd3'),
|
|
|
|
|
(('iadd', ('ineg', ('iadd(is_used_once)', '#a(is_16_bits)', 'b(is_not_const)')), 'c(is_not_const)'), ('iadd3', ('ineg', a), ('ineg', b), c), 'options->has_iadd3'),
|
|
|
|
|
(('iadd', ('ineg', ('iadd(is_used_once)', 'a(is_not_const)', 'b(is_not_const)')), '#c(is_16_bits)'), ('iadd3', ('ineg', a), ('ineg', b), c), 'options->has_iadd3'),
|
|
|
|
|
late_optimizations.extend([
|
|
|
|
|
((iadd, ('iadd(is_used_once)', 'a(is_not_const)', 'b(is_not_const)'), 'c(is_not_const)'), ('iadd3', a, b, c), cond),
|
|
|
|
|
((iadd, ('iadd(is_used_once)', '#a(is_16_bits)', 'b(is_not_const)'), 'c(is_not_const)'), ('iadd3', a, b, c), cond),
|
|
|
|
|
((iadd, ('iadd(is_used_once)', 'a(is_not_const)', 'b(is_not_const)'), '#c(is_16_bits)'), ('iadd3', a, b, c), cond),
|
|
|
|
|
((iadd, ('ineg', ('iadd(is_used_once)', 'a(is_not_const)', 'b(is_not_const)')), 'c(is_not_const)'), ('iadd3', ('ineg', a), ('ineg', b), c), cond),
|
|
|
|
|
((iadd, ('ineg', ('iadd(is_used_once)', '#a(is_16_bits)', 'b(is_not_const)')), 'c(is_not_const)'), ('iadd3', ('ineg', a), ('ineg', b), c), cond),
|
|
|
|
|
((iadd, ('ineg', ('iadd(is_used_once)', 'a(is_not_const)', 'b(is_not_const)')), '#c(is_16_bits)'), ('iadd3', ('ineg', a), ('ineg', b), c), cond),
|
|
|
|
|
])
|
|
|
|
|
|
|
|
|
|
late_optimizations.extend([
|
|
|
|
|
# fneg_lo / fneg_hi
|
|
|
|
|
(('vec2(is_only_used_as_float)', ('fneg@16', a), b), ('fmul', ('vec2', a, b), ('vec2', -1.0, 1.0)), 'options->vectorize_vec2_16bit'),
|
|
|
|
|
(('vec2(is_only_used_as_float)', a, ('fneg@16', b)), ('fmul', ('vec2', a, b), ('vec2', 1.0, -1.0)), 'options->vectorize_vec2_16bit'),
|
|
|
|
|