PR c++/56838
[official-gcc.git] / gcc / config / mips / micromips.md
blob4b7a4a7013f7d6740e338e0fb7dba7a002ebcedd
1 ;; Copyright (C) 2013 Free Software Foundation, Inc.
2 ;;
3 ;; micromips.md   Machine Description for the microMIPS instruction set
4 ;; This file is part of GCC.
6 ;; GCC is free software; you can redistribute it and/or modify it
7 ;; under the terms of the GNU General Public License as published
8 ;; by the Free Software Foundation; either version 3, or (at your
9 ;; option) any later version.
11 ;; GCC is distributed in the hope that it will be useful, but WITHOUT
12 ;; ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
13 ;; or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public
14 ;; License for more details.
16 ;; You should have received a copy of the GNU General Public License
17 ;; along with GCC; see the file COPYING3.  If not see
18 ;; <http://www.gnu.org/licenses/>.
20 (define_insn "*store_word_multiple"
21   [(match_parallel 0 ""
22        [(set (match_operand:SI 1 "memory_operand")
23              (match_operand:SI 2 "register_operand"))])]
24   "TARGET_MICROMIPS
25    && umips_save_restore_pattern_p (true, operands[0])"
26   { return umips_output_save_restore (true, operands[0]); }
27   [(set_attr "type" "multimem")
28    (set_attr "mode" "SI")
29    (set_attr "can_delay" "no")])
31 (define_insn "*load_word_multiple"
32   [(match_parallel 0 ""
33        [(set (match_operand:SI 1 "register_operand")
34              (match_operand:SI 2 "memory_operand"))])]
35   "TARGET_MICROMIPS
36    && umips_save_restore_pattern_p (false, operands[0])"
37   { return umips_output_save_restore (false, operands[0]); }
38   [(set_attr "type" "multimem")
39    (set_attr "mode" "SI")
40    (set_attr "can_delay" "no")])
42 ;; For LWP.
43 (define_peephole2
44   [(set (match_operand:SI 0 "d_operand" "")
45         (match_operand:SI 1 "non_volatile_mem_operand" ""))
46    (set (match_operand:SI 2 "d_operand" "")
47         (match_operand:SI 3 "non_volatile_mem_operand" ""))]
48   "TARGET_MICROMIPS
49    && umips_load_store_pair_p (true, operands)"
50   [(parallel [(set (match_dup 0) (match_dup 1))
51               (set (match_dup 2) (match_dup 3))])])
53 ;; The behavior of the LWP insn is undefined if placed in a delay slot.
54 (define_insn "*lwp"
55   [(parallel [(set (match_operand:SI 0 "d_operand")
56                    (match_operand:SI 1 "non_volatile_mem_operand"))
57               (set (match_operand:SI 2 "d_operand")
58                    (match_operand:SI 3 "non_volatile_mem_operand"))])]
60   "TARGET_MICROMIPS
61    && umips_load_store_pair_p (true, operands)"
63   umips_output_load_store_pair (true, operands);
64   return "";
66   [(set_attr "type" "load")
67    (set_attr "mode" "SI")
68    (set_attr "can_delay" "no")])
70 ;; For SWP.
71 (define_peephole2
72   [(set (match_operand:SI 0 "non_volatile_mem_operand" "")
73         (match_operand:SI 1 "d_operand" ""))
74    (set (match_operand:SI 2 "non_volatile_mem_operand" "")
75         (match_operand:SI 3 "d_operand" ""))]
76   "TARGET_MICROMIPS
77    && umips_load_store_pair_p (false, operands)"
78   [(parallel [(set (match_dup 0) (match_dup 1))
79               (set (match_dup 2) (match_dup 3))])])
81 ;; The behavior of the SWP insn is undefined if placed in a delay slot.
82 (define_insn "*swp"
83   [(parallel [(set (match_operand:SI 0 "non_volatile_mem_operand")
84                    (match_operand:SI 1 "d_operand"))
85               (set (match_operand:SI 2 "non_volatile_mem_operand")
86                    (match_operand:SI 3 "d_operand"))])]
88   "TARGET_MICROMIPS
89    && umips_load_store_pair_p (false, operands)"
91   umips_output_load_store_pair (false, operands);
92   return "";
94   [(set_attr "type" "store")
95    (set_attr "mode" "SI")
96    (set_attr "can_delay" "no")])
98 ;; For MOVEP.
99 (define_peephole2
100   [(set (match_operand:MOVEP1 0 "register_operand" "")
101         (match_operand:MOVEP1 1 "movep_src_operand" ""))
102    (set (match_operand:MOVEP2 2 "register_operand" "")
103         (match_operand:MOVEP2 3 "movep_src_operand" ""))]
104   "TARGET_MICROMIPS
105    && umips_movep_target_p (operands[0], operands[2])"
106   [(parallel [(set (match_dup 0) (match_dup 1))
107               (set (match_dup 2) (match_dup 3))])])
109 ;; The behavior of the MOVEP insn is undefined if placed in a delay slot.
110 (define_insn "*movep<MOVEP1:mode><MOVEP2:mode>"
111   [(parallel [(set (match_operand:MOVEP1 0 "register_operand")
112                    (match_operand:MOVEP1 1 "movep_src_operand"))
113               (set (match_operand:MOVEP2 2 "register_operand")
114                    (match_operand:MOVEP2 3 "movep_src_operand"))])]
115   "TARGET_MICROMIPS
116    && umips_movep_target_p (operands[0], operands[2])"
118   if (REGNO (operands[0]) < REGNO (operands[2]))
119     return "movep\t%0,%2,%z1,%z3";
120   else
121     return "movep\t%2,%0,%z3,%z1";
123   [(set_attr "type" "move")
124    (set_attr "mode" "<MODE>")
125    (set_attr "can_delay" "no")])