xtensa: Optimize '(~x & y)' to '((x & y) ^ y)'
In Xtensa ISA, there is no single machine instruction that calculates unary bitwise negation. gcc/ChangeLog: * config/xtensa/xtensa.md (*andsi3_bitcmpl): New insn_and_split pattern. gcc/testsuite/ChangeLog: * gcc.target/xtensa/check_zero_byte.c: New.
This commit is contained in:
parent
9777d446e2
commit
e44e7face1
2 changed files with 29 additions and 0 deletions
|
@ -601,6 +601,26 @@
|
|||
(set_attr "mode" "SI")
|
||||
(set_attr "length" "3,3")])
|
||||
|
||||
(define_insn_and_split "*andsi3_bitcmpl"
|
||||
[(set (match_operand:SI 0 "register_operand" "=a")
|
||||
(and:SI (not:SI (match_operand:SI 1 "register_operand" "r"))
|
||||
(match_operand:SI 2 "register_operand" "r")))]
|
||||
""
|
||||
"#"
|
||||
"&& can_create_pseudo_p ()"
|
||||
[(set (match_dup 3)
|
||||
(and:SI (match_dup 1)
|
||||
(match_dup 2)))
|
||||
(set (match_dup 0)
|
||||
(xor:SI (match_dup 3)
|
||||
(match_dup 2)))]
|
||||
{
|
||||
operands[3] = gen_reg_rtx (SImode);
|
||||
}
|
||||
[(set_attr "type" "arith")
|
||||
(set_attr "mode" "SI")
|
||||
(set_attr "length" "6")])
|
||||
|
||||
(define_insn "iorsi3"
|
||||
[(set (match_operand:SI 0 "register_operand" "=a")
|
||||
(ior:SI (match_operand:SI 1 "register_operand" "%r")
|
||||
|
|
9
gcc/testsuite/gcc.target/xtensa/check_zero_byte.c
Normal file
9
gcc/testsuite/gcc.target/xtensa/check_zero_byte.c
Normal file
|
@ -0,0 +1,9 @@
|
|||
/* { dg-do compile } */
|
||||
/* { dg-options "-O" } */
|
||||
|
||||
int check_zero_byte(int v)
|
||||
{
|
||||
return (v - 0x01010101) & ~v & 0x80808080;
|
||||
}
|
||||
|
||||
/* { dg-final { scan-assembler-not "movi" } } */
|
Loading…
Add table
Reference in a new issue