This PR shows that we get the load/store_lanes logic wrong for arm big-endian.
[official-gcc.git] / gcc / config / mips / micromips.md
blob9c0d9c34651d3feb910e931c5f0956ef5fd05ae1
1 ;; Copyright (C) 2013-2018 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   [(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"))]
87   "TARGET_MICROMIPS
88    && umips_load_store_pair_p (false, operands)"
90   umips_output_load_store_pair (false, operands);
91   return "";
93   [(set_attr "type" "store")
94    (set_attr "mode" "SI")
95    (set_attr "can_delay" "no")])
97 ;; For JRADDIUSP.
98 (define_insn "jraddiusp"
99   [(return)
100    (use (reg:SI 31))
101    (set (reg:SI 29)
102         (plus:SI (reg:SI 29)
103                  (match_operand 0 "uw5_operand")))]
104   "TARGET_MICROMIPS"
105   "jraddiusp\t%0"
106   [(set_attr "type"     "trap")
107    (set_attr "can_delay" "no")
108    (set_attr "mode"     "SI")])
110 ;; For MOVEP.
111 (define_peephole2
112   [(set (match_operand:MOVEP1 0 "register_operand" "")
113         (match_operand:MOVEP1 1 "movep_src_operand" ""))
114    (set (match_operand:MOVEP2 2 "register_operand" "")
115         (match_operand:MOVEP2 3 "movep_src_operand" ""))]
116   "TARGET_MICROMIPS
117    && umips_movep_target_p (operands[0], operands[2])"
118   [(parallel [(set (match_dup 0) (match_dup 1))
119               (set (match_dup 2) (match_dup 3))])])
121 ;; The behavior of the MOVEP insn is undefined if placed in a delay slot.
122 (define_insn "*movep<MOVEP1:mode><MOVEP2:mode>"
123   [(set (match_operand:MOVEP1 0 "register_operand")
124         (match_operand:MOVEP1 1 "movep_src_operand"))
125    (set (match_operand:MOVEP2 2 "register_operand")
126         (match_operand:MOVEP2 3 "movep_src_operand"))]
127   "TARGET_MICROMIPS
128    && umips_movep_target_p (operands[0], operands[2])"
130   if (REGNO (operands[0]) < REGNO (operands[2]))
131     return "movep\t%0,%2,%z1,%z3";
132   else
133     return "movep\t%2,%0,%z3,%z1";
135   [(set_attr "type" "move")
136    (set_attr "mode" "<MODE>")
137    (set_attr "can_delay" "no")])