xtensa: Optimize bitwise AND operation with some specific forms of constants
authorTakayuki 'January June' Suwa <jjsuwa_sys3175@yahoo.co.jp>
Mon, 13 Jun 2022 16:28:43 +0000 (01:28 +0900)
committerMax Filippov <jcmvbkbc@gmail.com>
Tue, 14 Jun 2022 00:25:48 +0000 (17:25 -0700)
commit077438933cf94f00cc5edf974338c11ba4bf7a39
tree3aaa6644fecdbe2930ae77cfe889f41fa938acc1
parent70ce04ca353bb0cda8321b91a77c2477e26d339b
xtensa: Optimize bitwise AND operation with some specific forms of constants

This patch offers several insn-and-split patterns for bitwise AND with
register and constant that can be represented as:

i.   1's least significant N bits and the others 0's (17 <= N <= 31)
ii.  1's most significant N bits and the others 0's (12 <= N <= 31)
iii. M 1's sequence of bits and trailing N 0's bits, that cannot fit into a
"MOVI Ax, simm12" instruction (1 <= M <= 16, 1 <= N <= 30)

And also offers shortcuts for conditional branch if each of the abovementioned
operations is (not) equal to zero.

gcc/ChangeLog:

* config/xtensa/predicates.md (shifted_mask_operand):
New predicate.
* config/xtensa/xtensa.md (*andsi3_const_pow2_minus_one):
New insn-and-split pattern.
(*andsi3_const_negative_pow2, *andsi3_const_shifted_mask,
*masktrue_const_pow2_minus_one, *masktrue_const_negative_pow2,
*masktrue_const_shifted_mask): Ditto.
gcc/config/xtensa/predicates.md
gcc/config/xtensa/xtensa.md