Skip to content

Commit

Permalink
gcc: xtensa: Add some dedicated patterns that correspond to GIMPLE ca…
Browse files Browse the repository at this point in the history
…nonicalizations

This patch offers better RTL representations against straightforward
derivations from some tree optimizers' canonicalized forms.

- rounding up to even, such as '(x + (x & 1))', is canonicalized to
  '((x + 1) & -2)', but the former is one instruction less than the latter
  in Xtensa ISA.
- signed greater or equal to zero as logical value '((signed)x >= 0)',
  is canonicalized to '((unsigned)(x ^ -1) >> 31)', but the equivalent
  '(((signed)x >> 31) + 1)' is one instruction less.
  • Loading branch information
jjsuwa-sys3175 committed Apr 30, 2022
1 parent 35823c1 commit 12bb08c
Showing 1 changed file with 80 additions and 0 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
From 960bab2133ba1c45c9a8c70f9dba4ed3f4da56e1 Mon Sep 17 00:00:00 2001
From: Takayuki 'January June' Suwa <[email protected]>
Date: Sun, 20 Feb 2022 17:20:31 +0900
Subject: [PATCH 17/17] xtensa: Add some dedicated patterns that correspond to
GIMPLE canonicalizations

This patch offers better RTL representations against straightforward
derivations from some tree optimizers' canonicalized forms.

- rounding up to even, such as '(x + (x & 1))', is canonicalized to
'((x + 1) & -2)', but the former is one instruction less than the latter
in Xtensa ISA.
- signed greater or equal to zero as logical value '((signed)x >= 0)',
is canonicalized to '((unsigned)(x ^ -1) >> 31)', but the equivalent
'(((signed)x >> 31) + 1)' is one instruction less.

gcc/ChangeLog:

* gcc/config/xtensa/xtensa.md (*round_up_to_even):
New insn-and-split pattern.
(*signed_ge_zero): Ditto.
---
gcc/config/xtensa/xtensa.md | 44 +++++++++++++++++++++++++++++++++++++
1 file changed, 44 insertions(+)

diff --git a/gcc/config/xtensa/xtensa.md b/gcc/config/xtensa/xtensa.md
index 8e0911ae0..a737bb7ed 100644
--- a/gcc/config/xtensa/xtensa.md
+++ b/gcc/config/xtensa/xtensa.md
@@ -2627,3 +2627,47 @@
xtensa_expand_atomic (<CODE>, operands[0], operands[1], operands[2], true);
DONE;
})
+
+(define_insn_and_split "*round_up_to_even"
+ [(set (match_operand:SI 0 "register_operand" "=a")
+ (and:SI (plus:SI (match_operand:SI 1 "register_operand" "r")
+ (const_int 1))
+ (const_int -2)))
+ (clobber (match_scratch:SI 2 "=&a"))]
+ ""
+ "#"
+ "reload_completed"
+ [(set (match_dup 2)
+ (and:SI (match_dup 1)
+ (const_int 1)))
+ (set (match_dup 0)
+ (plus:SI (match_dup 2)
+ (match_dup 1)))]
+ ""
+ [(set_attr "type" "arith")
+ (set_attr "mode" "SI")
+ (set (attr "length")
+ (if_then_else (match_test "TARGET_DENSITY")
+ (const_int 5)
+ (const_int 6)))])
+
+(define_insn_and_split "*signed_ge_zero"
+ [(set (match_operand:SI 0 "register_operand" "=a")
+ (ge:SI (match_operand:SI 1 "register_operand" "r")
+ (const_int 0)))]
+ ""
+ "#"
+ ""
+ [(set (match_dup 0)
+ (ashiftrt:SI (match_dup 1)
+ (const_int 31)))
+ (set (match_dup 0)
+ (plus:SI (match_dup 0)
+ (const_int 1)))]
+ ""
+ [(set_attr "type" "arith")
+ (set_attr "mode" "SI")
+ (set (attr "length")
+ (if_then_else (match_test "TARGET_DENSITY")
+ (const_int 5)
+ (const_int 6)))])
--
2.20.1

0 comments on commit 12bb08c

Please sign in to comment.