diff options
author | Ian Bolton <ian.bolton@arm.com> | 2013-01-16 16:21:05 +0000 |
---|---|---|
committer | Ian Bolton <ibolton@gcc.gnu.org> | 2013-01-16 16:21:05 +0000 |
commit | d0b6bb1b12b417f73f36a7405b44fd5b51197159 (patch) | |
tree | 973b8f80e643dd69dc2940bc4e6ee9fc9a2ae500 | |
parent | f34dea03005c1cddd28e8bca73dffb4b05c1aff7 (diff) | |
download | gcc-d0b6bb1b12b417f73f36a7405b44fd5b51197159.zip gcc-d0b6bb1b12b417f73f36a7405b44fd5b51197159.tar.gz gcc-d0b6bb1b12b417f73f36a7405b44fd5b51197159.tar.bz2 |
Make zero_extends explicit for some more SImode patterns (AArch64)
From-SVN: r195243
-rw-r--r-- | gcc/ChangeLog | 10 | ||||
-rw-r--r-- | gcc/config/aarch64/aarch64.md | 94 |
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 ;; ------------------------------------------------------------------- |