aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorIan Bolton <ian.bolton@arm.com>2013-01-16 16:21:05 +0000
committerIan Bolton <ibolton@gcc.gnu.org>2013-01-16 16:21:05 +0000
commitd0b6bb1b12b417f73f36a7405b44fd5b51197159 (patch)
tree973b8f80e643dd69dc2940bc4e6ee9fc9a2ae500 /gcc
parentf34dea03005c1cddd28e8bca73dffb4b05c1aff7 (diff)
downloadgcc-d0b6bb1b12b417f73f36a7405b44fd5b51197159.zip
gcc-d0b6bb1b12b417f73f36a7405b44fd5b51197159.tar.gz
gcc-d0b6bb1b12b417f73f36a7405b44fd5b51197159.tar.bz2
Make zero_extends explicit for some more SImode patterns (AArch64)
From-SVN: r195243
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog10
-rw-r--r--gcc/config/aarch64/aarch64.md94
2 files changed, 104 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 0587ff9..2205dc4 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,13 @@
+2013-01-16 Ian Bolton <ian.bolton@arm.com>
+
+ * gcc/config/aarch64/aarch64.md
+ (*cstoresi_neg_uxtw): New pattern.
+ (*cmovsi_insn_uxtw): New pattern.
+ (*<optab>si3_uxtw): New pattern.
+ (*<LOGICAL:optab>_<SHIFT:optab>si3_uxtw): New pattern.
+ (*<optab>si3_insn_uxtw): New pattern.
+ (*bswapsi2_uxtw): New pattern.
+
2013-01-16 Richard Biener <rguenther@suse.de>
* tree-inline.c (tree_function_versioning): Remove set but
diff --git a/gcc/config/aarch64/aarch64.md b/gcc/config/aarch64/aarch64.md
index d3baa08..73d86a7 100644
--- a/gcc/config/aarch64/aarch64.md
+++ b/gcc/config/aarch64/aarch64.md
@@ -2198,6 +2198,18 @@
(set_attr "mode" "<MODE>")]
)
+;; zero_extend version of the above
+(define_insn "*cstoresi_insn_uxtw"
+ [(set (match_operand:DI 0 "register_operand" "=r")
+ (zero_extend:DI
+ (match_operator:SI 1 "aarch64_comparison_operator"
+ [(match_operand 2 "cc_register" "") (const_int 0)])))]
+ ""
+ "cset\\t%w0, %m1"
+ [(set_attr "v8type" "csel")
+ (set_attr "mode" "SI")]
+)
+
(define_insn "*cstore<mode>_neg"
[(set (match_operand:ALLI 0 "register_operand" "=r")
(neg:ALLI (match_operator:ALLI 1 "aarch64_comparison_operator"
@@ -2208,6 +2220,18 @@
(set_attr "mode" "<MODE>")]
)
+;; zero_extend version of the above
+(define_insn "*cstoresi_neg_uxtw"
+ [(set (match_operand:DI 0 "register_operand" "=r")
+ (zero_extend:DI
+ (neg:SI (match_operator:SI 1 "aarch64_comparison_operator"
+ [(match_operand 2 "cc_register" "") (const_int 0)]))))]
+ ""
+ "csetm\\t%w0, %m1"
+ [(set_attr "v8type" "csel")
+ (set_attr "mode" "SI")]
+)
+
(define_expand "cmov<mode>6"
[(set (match_operand:GPI 0 "register_operand" "")
(if_then_else:GPI
@@ -2262,6 +2286,30 @@
(set_attr "mode" "<MODE>")]
)
+;; zero_extend version of above
+(define_insn "*cmovsi_insn_uxtw"
+ [(set (match_operand:DI 0 "register_operand" "=r,r,r,r,r,r,r")
+ (zero_extend:DI
+ (if_then_else:SI
+ (match_operator 1 "aarch64_comparison_operator"
+ [(match_operand 2 "cc_register" "") (const_int 0)])
+ (match_operand:SI 3 "aarch64_reg_zero_or_m1_or_1" "rZ,rZ,UsM,rZ,Ui1,UsM,Ui1")
+ (match_operand:SI 4 "aarch64_reg_zero_or_m1_or_1" "rZ,UsM,rZ,Ui1,rZ,UsM,Ui1"))))]
+ "!((operands[3] == const1_rtx && operands[4] == constm1_rtx)
+ || (operands[3] == constm1_rtx && operands[4] == const1_rtx))"
+ ;; Final two alternatives should be unreachable, but included for completeness
+ "@
+ csel\\t%w0, %w3, %w4, %m1
+ csinv\\t%w0, %w3, wzr, %m1
+ csinv\\t%w0, %w4, wzr, %M1
+ csinc\\t%w0, %w3, wzr, %m1
+ csinc\\t%w0, %w4, wzr, %M1
+ mov\\t%w0, -1
+ mov\\t%w0, 1"
+ [(set_attr "v8type" "csel")
+ (set_attr "mode" "SI")]
+)
+
(define_insn "*cmov<mode>_insn"
[(set (match_operand:GPF 0 "register_operand" "=w")
(if_then_else:GPF
@@ -2374,6 +2422,17 @@
[(set_attr "v8type" "logic,logic_imm")
(set_attr "mode" "<MODE>")])
+;; zero_extend version of above
+(define_insn "*<optab>si3_uxtw"
+ [(set (match_operand:DI 0 "register_operand" "=r,rk")
+ (zero_extend:DI
+ (LOGICAL:SI (match_operand:SI 1 "register_operand" "%r,r")
+ (match_operand:SI 2 "aarch64_logical_operand" "r,K"))))]
+ ""
+ "<logical>\\t%w0, %w1, %w2"
+ [(set_attr "v8type" "logic,logic_imm")
+ (set_attr "mode" "SI")])
+
(define_insn "*<LOGICAL:optab>_<SHIFT:optab><mode>3"
[(set (match_operand:GPI 0 "register_operand" "=r")
(LOGICAL:GPI (SHIFT:GPI
@@ -2385,6 +2444,19 @@
[(set_attr "v8type" "logic_shift")
(set_attr "mode" "<MODE>")])
+;; zero_extend version of above
+(define_insn "*<LOGICAL:optab>_<SHIFT:optab>si3_uxtw"
+ [(set (match_operand:DI 0 "register_operand" "=r")
+ (zero_extend:DI
+ (LOGICAL:SI (SHIFT:SI
+ (match_operand:SI 1 "register_operand" "r")
+ (match_operand:QI 2 "aarch64_shift_imm_si" "n"))
+ (match_operand:SI 3 "register_operand" "r"))))]
+ ""
+ "<LOGICAL:logical>\\t%w0, %w3, %w1, <SHIFT:shift> %2"
+ [(set_attr "v8type" "logic_shift")
+ (set_attr "mode" "SI")])
+
(define_insn "one_cmpl<mode>2"
[(set (match_operand:GPI 0 "register_operand" "=r")
(not:GPI (match_operand:GPI 1 "register_operand" "r")))]
@@ -2596,6 +2668,18 @@
(set_attr "mode" "<MODE>")]
)
+;; zero_extend version of above
+(define_insn "*<optab>si3_insn_uxtw"
+ [(set (match_operand:DI 0 "register_operand" "=r")
+ (zero_extend:DI (SHIFT:SI
+ (match_operand:SI 1 "register_operand" "r")
+ (match_operand:QI 2 "aarch64_reg_or_shift_imm_si" "rUss"))))]
+ ""
+ "<shift>\\t%w0, %w1, %w2"
+ [(set_attr "v8type" "shift")
+ (set_attr "mode" "SI")]
+)
+
(define_insn "*ashl<mode>3_insn"
[(set (match_operand:SHORT 0 "register_operand" "=r")
(ashift:SHORT (match_operand:SHORT 1 "register_operand" "r")
@@ -2733,6 +2817,16 @@
(set_attr "mode" "HI")]
)
+;; zero_extend version of above
+(define_insn "*bswapsi2_uxtw"
+ [(set (match_operand:DI 0 "register_operand" "=r")
+ (zero_extend:DI (bswap:SI (match_operand:SI 1 "register_operand" "r"))))]
+ ""
+ "rev\\t%w0, %w1"
+ [(set_attr "v8type" "rev")
+ (set_attr "mode" "SI")]
+)
+
;; -------------------------------------------------------------------
;; Floating-point intrinsics
;; -------------------------------------------------------------------