annotate gcc/config/nds32/nds32-multiple.md @ 111:04ced10e8804

gcc 7
author kono
date Fri, 27 Oct 2017 22:46:09 +0900
parents
children 84e7813d76e9
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
111
kono
parents:
diff changeset
1 ;; Load/Store Multiple patterns description of Andes NDS32 cpu for GNU compiler
kono
parents:
diff changeset
2 ;; Copyright (C) 2012-2017 Free Software Foundation, Inc.
kono
parents:
diff changeset
3 ;; Contributed by Andes Technology Corporation.for NDS32.
kono
parents:
diff changeset
4 ;;
kono
parents:
diff changeset
5 ;; This file is part of GCC.
kono
parents:
diff changeset
6 ;;
kono
parents:
diff changeset
7 ;; GCC is free software; you can redistribute it and/or modify it
kono
parents:
diff changeset
8 ;; under the terms of the GNU General Public License as published
kono
parents:
diff changeset
9 ;; by the Free Software Foundation; either version 3, or (at your
kono
parents:
diff changeset
10 ;; option) any later version.
kono
parents:
diff changeset
11 ;;
kono
parents:
diff changeset
12 ;; GCC is distributed in the hope that it will be useful, but WITHOUT
kono
parents:
diff changeset
13 ;; ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
kono
parents:
diff changeset
14 ;; or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
kono
parents:
diff changeset
15 ;; License for more details.
kono
parents:
diff changeset
16 ;;
kono
parents:
diff changeset
17 ;; You should have received a copy of the GNU General Public License
kono
parents:
diff changeset
18 ;; along with GCC; see the file COPYING3. If not see
kono
parents:
diff changeset
19 ;; <http://www.gnu.org/licenses/>.
kono
parents:
diff changeset
20
kono
parents:
diff changeset
21
kono
parents:
diff changeset
22 ;; Load Multiple Insns.
kono
parents:
diff changeset
23 ;;
kono
parents:
diff changeset
24 ;; operands[0] is the first of the consecutive registers.
kono
parents:
diff changeset
25 ;; operands[1] is the first memory location.
kono
parents:
diff changeset
26 ;; operands[2] is the number of consecutive registers.
kono
parents:
diff changeset
27
kono
parents:
diff changeset
28 (define_expand "load_multiple"
kono
parents:
diff changeset
29 [(match_par_dup 3 [(set (match_operand:SI 0 "" "")
kono
parents:
diff changeset
30 (match_operand:SI 1 "" ""))
kono
parents:
diff changeset
31 (use (match_operand:SI 2 "" ""))])]
kono
parents:
diff changeset
32 ""
kono
parents:
diff changeset
33 {
kono
parents:
diff changeset
34 int maximum;
kono
parents:
diff changeset
35
kono
parents:
diff changeset
36 /* Because reduced-set regsiters has few registers
kono
parents:
diff changeset
37 (r0~r5, r6~10, r15, r28~r31, where 'r15' and 'r28~r31' cannot
kono
parents:
diff changeset
38 be used for register allocation),
kono
parents:
diff changeset
39 using 8 registers for load_multiple may easily consume all of them.
kono
parents:
diff changeset
40 It makes register allocation/spilling hard to work.
kono
parents:
diff changeset
41 So we only allow maximum=4 registers for load_multiple
kono
parents:
diff changeset
42 under reduced-set registers. */
kono
parents:
diff changeset
43 if (TARGET_REDUCED_REGS)
kono
parents:
diff changeset
44 maximum = 4;
kono
parents:
diff changeset
45 else
kono
parents:
diff changeset
46 maximum = 8;
kono
parents:
diff changeset
47
kono
parents:
diff changeset
48 /* Here are the conditions that must be all passed,
kono
parents:
diff changeset
49 otherwise we have to FAIL this rtx generation:
kono
parents:
diff changeset
50 1. The number of consecutive registers must be integer.
kono
parents:
diff changeset
51 2. Maximum 4 or 8 registers for lmw.bi instruction
kono
parents:
diff changeset
52 (based on this nds32-multiple.md design).
kono
parents:
diff changeset
53 3. Minimum 2 registers for lmw.bi instruction
kono
parents:
diff changeset
54 (based on this nds32-multiple.md design).
kono
parents:
diff changeset
55 4. operands[0] must be register for sure.
kono
parents:
diff changeset
56 5. operands[1] must be memory for sure.
kono
parents:
diff changeset
57 6. Do not cross $r15 register because it is not allocatable. */
kono
parents:
diff changeset
58 if (GET_CODE (operands[2]) != CONST_INT
kono
parents:
diff changeset
59 || INTVAL (operands[2]) > maximum
kono
parents:
diff changeset
60 || INTVAL (operands[2]) < 2
kono
parents:
diff changeset
61 || GET_CODE (operands[0]) != REG
kono
parents:
diff changeset
62 || GET_CODE (operands[1]) != MEM
kono
parents:
diff changeset
63 || REGNO (operands[0]) + INTVAL (operands[2]) > TA_REGNUM)
kono
parents:
diff changeset
64 FAIL;
kono
parents:
diff changeset
65
kono
parents:
diff changeset
66 /* For (mem addr), we force_reg on addr here,
kono
parents:
diff changeset
67 so that nds32_expand_load_multiple can easily use it. */
kono
parents:
diff changeset
68 operands[3] = nds32_expand_load_multiple (REGNO (operands[0]),
kono
parents:
diff changeset
69 INTVAL (operands[2]),
kono
parents:
diff changeset
70 force_reg (SImode,
kono
parents:
diff changeset
71 XEXP (operands[1], 0)),
kono
parents:
diff changeset
72 operands[1]);
kono
parents:
diff changeset
73 })
kono
parents:
diff changeset
74
kono
parents:
diff changeset
75 ;; Ordinary Load Multiple.
kono
parents:
diff changeset
76
kono
parents:
diff changeset
77 (define_insn "*lmwsi8"
kono
parents:
diff changeset
78 [(match_parallel 0 "nds32_load_multiple_operation"
kono
parents:
diff changeset
79 [(set (match_operand:SI 2 "register_operand" "")
kono
parents:
diff changeset
80 (mem:SI (match_operand:SI 1 "register_operand" "r")))
kono
parents:
diff changeset
81 (set (match_operand:SI 3 "register_operand" "")
kono
parents:
diff changeset
82 (mem:SI (plus:SI (match_dup 1) (const_int 4))))
kono
parents:
diff changeset
83 (set (match_operand:SI 4 "register_operand" "")
kono
parents:
diff changeset
84 (mem:SI (plus:SI (match_dup 1) (const_int 8))))
kono
parents:
diff changeset
85 (set (match_operand:SI 5 "register_operand" "")
kono
parents:
diff changeset
86 (mem:SI (plus:SI (match_dup 1) (const_int 12))))
kono
parents:
diff changeset
87 (set (match_operand:SI 6 "register_operand" "")
kono
parents:
diff changeset
88 (mem:SI (plus:SI (match_dup 1) (const_int 16))))
kono
parents:
diff changeset
89 (set (match_operand:SI 7 "register_operand" "")
kono
parents:
diff changeset
90 (mem:SI (plus:SI (match_dup 1) (const_int 20))))
kono
parents:
diff changeset
91 (set (match_operand:SI 8 "register_operand" "")
kono
parents:
diff changeset
92 (mem:SI (plus:SI (match_dup 1) (const_int 24))))
kono
parents:
diff changeset
93 (set (match_operand:SI 9 "register_operand" "")
kono
parents:
diff changeset
94 (mem:SI (plus:SI (match_dup 1) (const_int 28))))])]
kono
parents:
diff changeset
95 "(XVECLEN (operands[0], 0) == 8)"
kono
parents:
diff changeset
96 "lmw.bi\t%2, [%1], %9, 0x0"
kono
parents:
diff changeset
97 [(set_attr "type" "load")
kono
parents:
diff changeset
98 (set_attr "length" "4")]
kono
parents:
diff changeset
99 )
kono
parents:
diff changeset
100
kono
parents:
diff changeset
101 (define_insn "*lmwsi7"
kono
parents:
diff changeset
102 [(match_parallel 0 "nds32_load_multiple_operation"
kono
parents:
diff changeset
103 [(set (match_operand:SI 2 "register_operand" "")
kono
parents:
diff changeset
104 (mem:SI (match_operand:SI 1 "register_operand" "r")))
kono
parents:
diff changeset
105 (set (match_operand:SI 3 "register_operand" "")
kono
parents:
diff changeset
106 (mem:SI (plus:SI (match_dup 1) (const_int 4))))
kono
parents:
diff changeset
107 (set (match_operand:SI 4 "register_operand" "")
kono
parents:
diff changeset
108 (mem:SI (plus:SI (match_dup 1) (const_int 8))))
kono
parents:
diff changeset
109 (set (match_operand:SI 5 "register_operand" "")
kono
parents:
diff changeset
110 (mem:SI (plus:SI (match_dup 1) (const_int 12))))
kono
parents:
diff changeset
111 (set (match_operand:SI 6 "register_operand" "")
kono
parents:
diff changeset
112 (mem:SI (plus:SI (match_dup 1) (const_int 16))))
kono
parents:
diff changeset
113 (set (match_operand:SI 7 "register_operand" "")
kono
parents:
diff changeset
114 (mem:SI (plus:SI (match_dup 1) (const_int 20))))
kono
parents:
diff changeset
115 (set (match_operand:SI 8 "register_operand" "")
kono
parents:
diff changeset
116 (mem:SI (plus:SI (match_dup 1) (const_int 24))))])]
kono
parents:
diff changeset
117 "(XVECLEN (operands[0], 0) == 7)"
kono
parents:
diff changeset
118 "lmw.bi\t%2, [%1], %8, 0x0"
kono
parents:
diff changeset
119 [(set_attr "type" "load")
kono
parents:
diff changeset
120 (set_attr "length" "4")]
kono
parents:
diff changeset
121 )
kono
parents:
diff changeset
122
kono
parents:
diff changeset
123 (define_insn "*lmwsi6"
kono
parents:
diff changeset
124 [(match_parallel 0 "nds32_load_multiple_operation"
kono
parents:
diff changeset
125 [(set (match_operand:SI 2 "register_operand" "")
kono
parents:
diff changeset
126 (mem:SI (match_operand:SI 1 "register_operand" "r")))
kono
parents:
diff changeset
127 (set (match_operand:SI 3 "register_operand" "")
kono
parents:
diff changeset
128 (mem:SI (plus:SI (match_dup 1) (const_int 4))))
kono
parents:
diff changeset
129 (set (match_operand:SI 4 "register_operand" "")
kono
parents:
diff changeset
130 (mem:SI (plus:SI (match_dup 1) (const_int 8))))
kono
parents:
diff changeset
131 (set (match_operand:SI 5 "register_operand" "")
kono
parents:
diff changeset
132 (mem:SI (plus:SI (match_dup 1) (const_int 12))))
kono
parents:
diff changeset
133 (set (match_operand:SI 6 "register_operand" "")
kono
parents:
diff changeset
134 (mem:SI (plus:SI (match_dup 1) (const_int 16))))
kono
parents:
diff changeset
135 (set (match_operand:SI 7 "register_operand" "")
kono
parents:
diff changeset
136 (mem:SI (plus:SI (match_dup 1) (const_int 20))))])]
kono
parents:
diff changeset
137 "(XVECLEN (operands[0], 0) == 6)"
kono
parents:
diff changeset
138 "lmw.bi\t%2, [%1], %7, 0x0"
kono
parents:
diff changeset
139 [(set_attr "type" "load")
kono
parents:
diff changeset
140 (set_attr "length" "4")]
kono
parents:
diff changeset
141 )
kono
parents:
diff changeset
142
kono
parents:
diff changeset
143 (define_insn "*lmwsi5"
kono
parents:
diff changeset
144 [(match_parallel 0 "nds32_load_multiple_operation"
kono
parents:
diff changeset
145 [(set (match_operand:SI 2 "register_operand" "")
kono
parents:
diff changeset
146 (mem:SI (match_operand:SI 1 "register_operand" "r")))
kono
parents:
diff changeset
147 (set (match_operand:SI 3 "register_operand" "")
kono
parents:
diff changeset
148 (mem:SI (plus:SI (match_dup 1) (const_int 4))))
kono
parents:
diff changeset
149 (set (match_operand:SI 4 "register_operand" "")
kono
parents:
diff changeset
150 (mem:SI (plus:SI (match_dup 1) (const_int 8))))
kono
parents:
diff changeset
151 (set (match_operand:SI 5 "register_operand" "")
kono
parents:
diff changeset
152 (mem:SI (plus:SI (match_dup 1) (const_int 12))))
kono
parents:
diff changeset
153 (set (match_operand:SI 6 "register_operand" "")
kono
parents:
diff changeset
154 (mem:SI (plus:SI (match_dup 1) (const_int 16))))])]
kono
parents:
diff changeset
155 "(XVECLEN (operands[0], 0) == 5)"
kono
parents:
diff changeset
156 "lmw.bi\t%2, [%1], %6, 0x0"
kono
parents:
diff changeset
157 [(set_attr "type" "load")
kono
parents:
diff changeset
158 (set_attr "length" "4")]
kono
parents:
diff changeset
159 )
kono
parents:
diff changeset
160
kono
parents:
diff changeset
161 (define_insn "*lmwsi4"
kono
parents:
diff changeset
162 [(match_parallel 0 "nds32_load_multiple_operation"
kono
parents:
diff changeset
163 [(set (match_operand:SI 2 "register_operand" "")
kono
parents:
diff changeset
164 (mem:SI (match_operand:SI 1 "register_operand" "r")))
kono
parents:
diff changeset
165 (set (match_operand:SI 3 "register_operand" "")
kono
parents:
diff changeset
166 (mem:SI (plus:SI (match_dup 1) (const_int 4))))
kono
parents:
diff changeset
167 (set (match_operand:SI 4 "register_operand" "")
kono
parents:
diff changeset
168 (mem:SI (plus:SI (match_dup 1) (const_int 8))))
kono
parents:
diff changeset
169 (set (match_operand:SI 5 "register_operand" "")
kono
parents:
diff changeset
170 (mem:SI (plus:SI (match_dup 1) (const_int 12))))])]
kono
parents:
diff changeset
171 "(XVECLEN (operands[0], 0) == 4)"
kono
parents:
diff changeset
172 "lmw.bi\t%2, [%1], %5, 0x0"
kono
parents:
diff changeset
173 [(set_attr "type" "load")
kono
parents:
diff changeset
174 (set_attr "length" "4")]
kono
parents:
diff changeset
175 )
kono
parents:
diff changeset
176
kono
parents:
diff changeset
177 (define_insn "*lmwsi3"
kono
parents:
diff changeset
178 [(match_parallel 0 "nds32_load_multiple_operation"
kono
parents:
diff changeset
179 [(set (match_operand:SI 2 "register_operand" "")
kono
parents:
diff changeset
180 (mem:SI (match_operand:SI 1 "register_operand" "r")))
kono
parents:
diff changeset
181 (set (match_operand:SI 3 "register_operand" "")
kono
parents:
diff changeset
182 (mem:SI (plus:SI (match_dup 1) (const_int 4))))
kono
parents:
diff changeset
183 (set (match_operand:SI 4 "register_operand" "")
kono
parents:
diff changeset
184 (mem:SI (plus:SI (match_dup 1) (const_int 8))))])]
kono
parents:
diff changeset
185 "(XVECLEN (operands[0], 0) == 3)"
kono
parents:
diff changeset
186 "lmw.bi\t%2, [%1], %4, 0x0"
kono
parents:
diff changeset
187 [(set_attr "type" "load")
kono
parents:
diff changeset
188 (set_attr "length" "4")]
kono
parents:
diff changeset
189 )
kono
parents:
diff changeset
190
kono
parents:
diff changeset
191 (define_insn "*lmwsi2"
kono
parents:
diff changeset
192 [(match_parallel 0 "nds32_load_multiple_operation"
kono
parents:
diff changeset
193 [(set (match_operand:SI 2 "register_operand" "")
kono
parents:
diff changeset
194 (mem:SI (match_operand:SI 1 "register_operand" "r")))
kono
parents:
diff changeset
195 (set (match_operand:SI 3 "register_operand" "")
kono
parents:
diff changeset
196 (mem:SI (plus:SI (match_dup 1) (const_int 4))))])]
kono
parents:
diff changeset
197 "(XVECLEN (operands[0], 0) == 2)"
kono
parents:
diff changeset
198 "lmw.bi\t%2, [%1], %3, 0x0"
kono
parents:
diff changeset
199 [(set_attr "type" "load")
kono
parents:
diff changeset
200 (set_attr "length" "4")]
kono
parents:
diff changeset
201 )
kono
parents:
diff changeset
202
kono
parents:
diff changeset
203
kono
parents:
diff changeset
204 ;; Store Multiple Insns.
kono
parents:
diff changeset
205 ;;
kono
parents:
diff changeset
206 ;; operands[0] is the first memory location.
kono
parents:
diff changeset
207 ;; opernads[1] is the first of the consecutive registers.
kono
parents:
diff changeset
208 ;; operands[2] is the number of consecutive registers.
kono
parents:
diff changeset
209
kono
parents:
diff changeset
210 (define_expand "store_multiple"
kono
parents:
diff changeset
211 [(match_par_dup 3 [(set (match_operand:SI 0 "" "")
kono
parents:
diff changeset
212 (match_operand:SI 1 "" ""))
kono
parents:
diff changeset
213 (use (match_operand:SI 2 "" ""))])]
kono
parents:
diff changeset
214 ""
kono
parents:
diff changeset
215 {
kono
parents:
diff changeset
216 int maximum;
kono
parents:
diff changeset
217
kono
parents:
diff changeset
218 /* Because reduced-set regsiters has few registers
kono
parents:
diff changeset
219 (r0~r5, r6~10, r15, r28~r31, where 'r15' and 'r28~r31' cannot
kono
parents:
diff changeset
220 be used for register allocation),
kono
parents:
diff changeset
221 using 8 registers for store_multiple may easily consume all of them.
kono
parents:
diff changeset
222 It makes register allocation/spilling hard to work.
kono
parents:
diff changeset
223 So we only allow maximum=4 registers for store_multiple
kono
parents:
diff changeset
224 under reduced-set registers. */
kono
parents:
diff changeset
225 if (TARGET_REDUCED_REGS)
kono
parents:
diff changeset
226 maximum = 4;
kono
parents:
diff changeset
227 else
kono
parents:
diff changeset
228 maximum = 8;
kono
parents:
diff changeset
229
kono
parents:
diff changeset
230 /* Here are the conditions that must be all passed,
kono
parents:
diff changeset
231 otherwise we have to FAIL this rtx generation:
kono
parents:
diff changeset
232 1. The number of consecutive registers must be integer.
kono
parents:
diff changeset
233 2. Maximum 4 or 8 registers for smw.bi instruction
kono
parents:
diff changeset
234 (based on this nds32-multiple.md design).
kono
parents:
diff changeset
235 3. Minimum 2 registers for smw.bi instruction
kono
parents:
diff changeset
236 (based on this nds32-multiple.md design).
kono
parents:
diff changeset
237 4. operands[0] must be memory for sure.
kono
parents:
diff changeset
238 5. operands[1] must be register for sure.
kono
parents:
diff changeset
239 6. Do not cross $r15 register because it is not allocatable. */
kono
parents:
diff changeset
240 if (GET_CODE (operands[2]) != CONST_INT
kono
parents:
diff changeset
241 || INTVAL (operands[2]) > maximum
kono
parents:
diff changeset
242 || INTVAL (operands[2]) < 2
kono
parents:
diff changeset
243 || GET_CODE (operands[0]) != MEM
kono
parents:
diff changeset
244 || GET_CODE (operands[1]) != REG
kono
parents:
diff changeset
245 || REGNO (operands[1]) + INTVAL (operands[2]) > TA_REGNUM)
kono
parents:
diff changeset
246 FAIL;
kono
parents:
diff changeset
247
kono
parents:
diff changeset
248 /* For (mem addr), we force_reg on addr here,
kono
parents:
diff changeset
249 so that nds32_expand_store_multiple can easily use it. */
kono
parents:
diff changeset
250 operands[3] = nds32_expand_store_multiple (REGNO (operands[1]),
kono
parents:
diff changeset
251 INTVAL (operands[2]),
kono
parents:
diff changeset
252 force_reg (SImode,
kono
parents:
diff changeset
253 XEXP (operands[0], 0)),
kono
parents:
diff changeset
254 operands[0]);
kono
parents:
diff changeset
255 })
kono
parents:
diff changeset
256
kono
parents:
diff changeset
257 ;; Ordinary Store Multiple.
kono
parents:
diff changeset
258
kono
parents:
diff changeset
259 (define_insn "*stmsi8"
kono
parents:
diff changeset
260 [(match_parallel 0 "nds32_store_multiple_operation"
kono
parents:
diff changeset
261 [(set (mem:SI (match_operand:SI 1 "register_operand" "r"))
kono
parents:
diff changeset
262 (match_operand:SI 2 "register_operand" ""))
kono
parents:
diff changeset
263 (set (mem:SI (plus:SI (match_dup 1) (const_int 4)))
kono
parents:
diff changeset
264 (match_operand:SI 3 "register_operand" ""))
kono
parents:
diff changeset
265 (set (mem:SI (plus:SI (match_dup 1) (const_int 8)))
kono
parents:
diff changeset
266 (match_operand:SI 4 "register_operand" ""))
kono
parents:
diff changeset
267 (set (mem:SI (plus:SI (match_dup 1) (const_int 12)))
kono
parents:
diff changeset
268 (match_operand:SI 5 "register_operand" ""))
kono
parents:
diff changeset
269 (set (mem:SI (plus:SI (match_dup 1) (const_int 16)))
kono
parents:
diff changeset
270 (match_operand:SI 6 "register_operand" ""))
kono
parents:
diff changeset
271 (set (mem:SI (plus:SI (match_dup 1) (const_int 20)))
kono
parents:
diff changeset
272 (match_operand:SI 7 "register_operand" ""))
kono
parents:
diff changeset
273 (set (mem:SI (plus:SI (match_dup 1) (const_int 24)))
kono
parents:
diff changeset
274 (match_operand:SI 8 "register_operand" ""))
kono
parents:
diff changeset
275 (set (mem:SI (plus:SI (match_dup 1) (const_int 28)))
kono
parents:
diff changeset
276 (match_operand:SI 9 "register_operand" ""))])]
kono
parents:
diff changeset
277 "(XVECLEN (operands[0], 0) == 8)"
kono
parents:
diff changeset
278 "smw.bi\t%2, [%1], %9, 0x0"
kono
parents:
diff changeset
279 [(set_attr "type" "store")
kono
parents:
diff changeset
280 (set_attr "length" "4")]
kono
parents:
diff changeset
281 )
kono
parents:
diff changeset
282
kono
parents:
diff changeset
283 (define_insn "*stmsi7"
kono
parents:
diff changeset
284 [(match_parallel 0 "nds32_store_multiple_operation"
kono
parents:
diff changeset
285 [(set (mem:SI (match_operand:SI 1 "register_operand" "r"))
kono
parents:
diff changeset
286 (match_operand:SI 2 "register_operand" ""))
kono
parents:
diff changeset
287 (set (mem:SI (plus:SI (match_dup 1) (const_int 4)))
kono
parents:
diff changeset
288 (match_operand:SI 3 "register_operand" ""))
kono
parents:
diff changeset
289 (set (mem:SI (plus:SI (match_dup 1) (const_int 8)))
kono
parents:
diff changeset
290 (match_operand:SI 4 "register_operand" ""))
kono
parents:
diff changeset
291 (set (mem:SI (plus:SI (match_dup 1) (const_int 12)))
kono
parents:
diff changeset
292 (match_operand:SI 5 "register_operand" ""))
kono
parents:
diff changeset
293 (set (mem:SI (plus:SI (match_dup 1) (const_int 16)))
kono
parents:
diff changeset
294 (match_operand:SI 6 "register_operand" ""))
kono
parents:
diff changeset
295 (set (mem:SI (plus:SI (match_dup 1) (const_int 20)))
kono
parents:
diff changeset
296 (match_operand:SI 7 "register_operand" ""))
kono
parents:
diff changeset
297 (set (mem:SI (plus:SI (match_dup 1) (const_int 24)))
kono
parents:
diff changeset
298 (match_operand:SI 8 "register_operand" ""))])]
kono
parents:
diff changeset
299 "(XVECLEN (operands[0], 0) == 7)"
kono
parents:
diff changeset
300 "smw.bi\t%2, [%1], %8, 0x0"
kono
parents:
diff changeset
301 [(set_attr "type" "store")
kono
parents:
diff changeset
302 (set_attr "length" "4")]
kono
parents:
diff changeset
303 )
kono
parents:
diff changeset
304
kono
parents:
diff changeset
305 (define_insn "*stmsi6"
kono
parents:
diff changeset
306 [(match_parallel 0 "nds32_store_multiple_operation"
kono
parents:
diff changeset
307 [(set (mem:SI (match_operand:SI 1 "register_operand" "r"))
kono
parents:
diff changeset
308 (match_operand:SI 2 "register_operand" ""))
kono
parents:
diff changeset
309 (set (mem:SI (plus:SI (match_dup 1) (const_int 4)))
kono
parents:
diff changeset
310 (match_operand:SI 3 "register_operand" ""))
kono
parents:
diff changeset
311 (set (mem:SI (plus:SI (match_dup 1) (const_int 8)))
kono
parents:
diff changeset
312 (match_operand:SI 4 "register_operand" ""))
kono
parents:
diff changeset
313 (set (mem:SI (plus:SI (match_dup 1) (const_int 12)))
kono
parents:
diff changeset
314 (match_operand:SI 5 "register_operand" ""))
kono
parents:
diff changeset
315 (set (mem:SI (plus:SI (match_dup 1) (const_int 16)))
kono
parents:
diff changeset
316 (match_operand:SI 6 "register_operand" ""))
kono
parents:
diff changeset
317 (set (mem:SI (plus:SI (match_dup 1) (const_int 20)))
kono
parents:
diff changeset
318 (match_operand:SI 7 "register_operand" ""))])]
kono
parents:
diff changeset
319 "(XVECLEN (operands[0], 0) == 6)"
kono
parents:
diff changeset
320 "smw.bi\t%2, [%1], %7, 0x0"
kono
parents:
diff changeset
321 [(set_attr "type" "store")
kono
parents:
diff changeset
322 (set_attr "length" "4")]
kono
parents:
diff changeset
323 )
kono
parents:
diff changeset
324
kono
parents:
diff changeset
325 (define_insn "*stmsi5"
kono
parents:
diff changeset
326 [(match_parallel 0 "nds32_store_multiple_operation"
kono
parents:
diff changeset
327 [(set (mem:SI (match_operand:SI 1 "register_operand" "r"))
kono
parents:
diff changeset
328 (match_operand:SI 2 "register_operand" ""))
kono
parents:
diff changeset
329 (set (mem:SI (plus:SI (match_dup 1) (const_int 4)))
kono
parents:
diff changeset
330 (match_operand:SI 3 "register_operand" ""))
kono
parents:
diff changeset
331 (set (mem:SI (plus:SI (match_dup 1) (const_int 8)))
kono
parents:
diff changeset
332 (match_operand:SI 4 "register_operand" ""))
kono
parents:
diff changeset
333 (set (mem:SI (plus:SI (match_dup 1) (const_int 12)))
kono
parents:
diff changeset
334 (match_operand:SI 5 "register_operand" ""))
kono
parents:
diff changeset
335 (set (mem:SI (plus:SI (match_dup 1) (const_int 16)))
kono
parents:
diff changeset
336 (match_operand:SI 6 "register_operand" ""))])]
kono
parents:
diff changeset
337 "(XVECLEN (operands[0], 0) == 5)"
kono
parents:
diff changeset
338 "smw.bi\t%2, [%1], %6, 0x0"
kono
parents:
diff changeset
339 [(set_attr "type" "store")
kono
parents:
diff changeset
340 (set_attr "length" "4")]
kono
parents:
diff changeset
341 )
kono
parents:
diff changeset
342
kono
parents:
diff changeset
343 (define_insn "*stmsi4"
kono
parents:
diff changeset
344 [(match_parallel 0 "nds32_store_multiple_operation"
kono
parents:
diff changeset
345 [(set (mem:SI (match_operand:SI 1 "register_operand" "r"))
kono
parents:
diff changeset
346 (match_operand:SI 2 "register_operand" ""))
kono
parents:
diff changeset
347 (set (mem:SI (plus:SI (match_dup 1) (const_int 4)))
kono
parents:
diff changeset
348 (match_operand:SI 3 "register_operand" ""))
kono
parents:
diff changeset
349 (set (mem:SI (plus:SI (match_dup 1) (const_int 8)))
kono
parents:
diff changeset
350 (match_operand:SI 4 "register_operand" ""))
kono
parents:
diff changeset
351 (set (mem:SI (plus:SI (match_dup 1) (const_int 12)))
kono
parents:
diff changeset
352 (match_operand:SI 5 "register_operand" ""))])]
kono
parents:
diff changeset
353 "(XVECLEN (operands[0], 0) == 4)"
kono
parents:
diff changeset
354 "smw.bi\t%2, [%1], %5, 0x0"
kono
parents:
diff changeset
355 [(set_attr "type" "store")
kono
parents:
diff changeset
356 (set_attr "length" "4")]
kono
parents:
diff changeset
357 )
kono
parents:
diff changeset
358
kono
parents:
diff changeset
359 (define_insn "*stmsi3"
kono
parents:
diff changeset
360 [(match_parallel 0 "nds32_store_multiple_operation"
kono
parents:
diff changeset
361 [(set (mem:SI (match_operand:SI 1 "register_operand" "r"))
kono
parents:
diff changeset
362 (match_operand:SI 2 "register_operand" ""))
kono
parents:
diff changeset
363 (set (mem:SI (plus:SI (match_dup 1) (const_int 4)))
kono
parents:
diff changeset
364 (match_operand:SI 3 "register_operand" ""))
kono
parents:
diff changeset
365 (set (mem:SI (plus:SI (match_dup 1) (const_int 8)))
kono
parents:
diff changeset
366 (match_operand:SI 4 "register_operand" ""))])]
kono
parents:
diff changeset
367 "(XVECLEN (operands[0], 0) == 3)"
kono
parents:
diff changeset
368 "smw.bi\t%2, [%1], %4, 0x0"
kono
parents:
diff changeset
369 [(set_attr "type" "store")
kono
parents:
diff changeset
370 (set_attr "length" "4")]
kono
parents:
diff changeset
371 )
kono
parents:
diff changeset
372
kono
parents:
diff changeset
373 (define_insn "*stmsi2"
kono
parents:
diff changeset
374 [(match_parallel 0 "nds32_store_multiple_operation"
kono
parents:
diff changeset
375 [(set (mem:SI (match_operand:SI 1 "register_operand" "r"))
kono
parents:
diff changeset
376 (match_operand:SI 2 "register_operand" ""))
kono
parents:
diff changeset
377 (set (mem:SI (plus:SI (match_dup 1) (const_int 4)))
kono
parents:
diff changeset
378 (match_operand:SI 3 "register_operand" ""))])]
kono
parents:
diff changeset
379 "(XVECLEN (operands[0], 0) == 2)"
kono
parents:
diff changeset
380 "smw.bi\t%2, [%1], %3, 0x0"
kono
parents:
diff changeset
381 [(set_attr "type" "store")
kono
parents:
diff changeset
382 (set_attr "length" "4")]
kono
parents:
diff changeset
383 )
kono
parents:
diff changeset
384
kono
parents:
diff changeset
385 ;; Move a block of memory if it is word aligned and MORE than 2 words long.
kono
parents:
diff changeset
386 ;; We could let this apply for blocks of less than this, but it clobbers so
kono
parents:
diff changeset
387 ;; many registers that there is then probably a better way.
kono
parents:
diff changeset
388 ;;
kono
parents:
diff changeset
389 ;; operands[0] is the destination block of memory.
kono
parents:
diff changeset
390 ;; operands[1] is the source block of memory.
kono
parents:
diff changeset
391 ;; operands[2] is the number of bytes to move.
kono
parents:
diff changeset
392 ;; operands[3] is the known shared alignment.
kono
parents:
diff changeset
393
kono
parents:
diff changeset
394 (define_expand "movmemqi"
kono
parents:
diff changeset
395 [(match_operand:BLK 0 "general_operand" "")
kono
parents:
diff changeset
396 (match_operand:BLK 1 "general_operand" "")
kono
parents:
diff changeset
397 (match_operand:SI 2 "const_int_operand" "")
kono
parents:
diff changeset
398 (match_operand:SI 3 "const_int_operand" "")]
kono
parents:
diff changeset
399 ""
kono
parents:
diff changeset
400 {
kono
parents:
diff changeset
401 if (nds32_expand_movmemqi (operands[0],
kono
parents:
diff changeset
402 operands[1],
kono
parents:
diff changeset
403 operands[2],
kono
parents:
diff changeset
404 operands[3]))
kono
parents:
diff changeset
405 DONE;
kono
parents:
diff changeset
406
kono
parents:
diff changeset
407 FAIL;
kono
parents:
diff changeset
408 })
kono
parents:
diff changeset
409
kono
parents:
diff changeset
410 ;; ------------------------------------------------------------------------