Mercurial > hg > CbC > CbC_gcc
comparison gcc/config/arm/cirrus.md @ 0:a06113de4d67
first commit
author | kent <kent@cr.ie.u-ryukyu.ac.jp> |
---|---|
date | Fri, 17 Jul 2009 14:47:48 +0900 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:a06113de4d67 |
---|---|
1 ;; Cirrus EP9312 "Maverick" ARM floating point co-processor description. | |
2 ;; Copyright (C) 2003, 2004, 2005, 2007 Free Software Foundation, Inc. | |
3 ;; Contributed by Red Hat. | |
4 ;; Written by Aldy Hernandez (aldyh@redhat.com) | |
5 | |
6 ;; This file is part of GCC. | |
7 | |
8 ;; GCC is free software; you can redistribute it and/or modify | |
9 ;; it under the terms of the GNU General Public License as published by | |
10 ;; the Free Software Foundation; either version 3, or (at your option) | |
11 ;; any later version. | |
12 | |
13 ;; GCC is distributed in the hope that it will be useful, | |
14 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of | |
15 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
16 ;; GNU General Public License for more details. | |
17 | |
18 ;; You should have received a copy of the GNU General Public License | |
19 ;; along with GCC; see the file COPYING3. If not see | |
20 ;; <http://www.gnu.org/licenses/>. | |
21 | |
22 | |
23 ; Cirrus types for invalid insn combinations | |
24 ; not Not a cirrus insn | |
25 ; normal Any Cirrus insn not covered by the special cases below | |
26 ; double cfldrd, cfldr64, cfstrd, cfstr64 | |
27 ; compare cfcmps, cfcmpd, cfcmp32, cfcmp64 | |
28 ; move cfmvdlr, cfmvdhr, cfmvsr, cfmv64lr, cfmv64hr | |
29 (define_attr "cirrus" "not,normal,double,compare,move" (const_string "not")) | |
30 | |
31 | |
32 (define_insn "cirrus_adddi3" | |
33 [(set (match_operand:DI 0 "cirrus_fp_register" "=v") | |
34 (plus:DI (match_operand:DI 1 "cirrus_fp_register" "v") | |
35 (match_operand:DI 2 "cirrus_fp_register" "v")))] | |
36 "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_MAVERICK" | |
37 "cfadd64%?\\t%V0, %V1, %V2" | |
38 [(set_attr "type" "mav_farith") | |
39 (set_attr "cirrus" "normal")] | |
40 ) | |
41 | |
42 (define_insn "*cirrus_addsi3" | |
43 [(set (match_operand:SI 0 "cirrus_fp_register" "=v") | |
44 (plus:SI (match_operand:SI 1 "cirrus_fp_register" "v") | |
45 (match_operand:SI 2 "cirrus_fp_register" "v")))] | |
46 "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_MAVERICK && 0" | |
47 "cfadd32%?\\t%V0, %V1, %V2" | |
48 [(set_attr "type" "mav_farith") | |
49 (set_attr "cirrus" "normal")] | |
50 ) | |
51 | |
52 (define_insn "*cirrus_addsf3" | |
53 [(set (match_operand:SF 0 "cirrus_fp_register" "=v") | |
54 (plus:SF (match_operand:SF 1 "cirrus_fp_register" "v") | |
55 (match_operand:SF 2 "cirrus_fp_register" "v")))] | |
56 "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_MAVERICK" | |
57 "cfadds%?\\t%V0, %V1, %V2" | |
58 [(set_attr "type" "mav_farith") | |
59 (set_attr "cirrus" "normal")] | |
60 ) | |
61 | |
62 (define_insn "*cirrus_adddf3" | |
63 [(set (match_operand:DF 0 "cirrus_fp_register" "=v") | |
64 (plus:DF (match_operand:DF 1 "cirrus_fp_register" "v") | |
65 (match_operand:DF 2 "cirrus_fp_register" "v")))] | |
66 "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_MAVERICK" | |
67 "cfaddd%?\\t%V0, %V1, %V2" | |
68 [(set_attr "type" "mav_farith") | |
69 (set_attr "cirrus" "normal")] | |
70 ) | |
71 | |
72 (define_insn "cirrus_subdi3" | |
73 [(set (match_operand:DI 0 "cirrus_fp_register" "=v") | |
74 (minus:DI (match_operand:DI 1 "cirrus_fp_register" "v") | |
75 (match_operand:DI 2 "cirrus_fp_register" "v")))] | |
76 "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_MAVERICK" | |
77 "cfsub64%?\\t%V0, %V1, %V2" | |
78 [(set_attr "type" "mav_farith") | |
79 (set_attr "cirrus" "normal")] | |
80 ) | |
81 | |
82 (define_insn "*cirrus_subsi3_insn" | |
83 [(set (match_operand:SI 0 "cirrus_fp_register" "=v") | |
84 (minus:SI (match_operand:SI 1 "cirrus_fp_register" "v") | |
85 (match_operand:SI 2 "cirrus_fp_register" "v")))] | |
86 "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_MAVERICK && 0" | |
87 "cfsub32%?\\t%V0, %V1, %V2" | |
88 [(set_attr "type" "mav_farith") | |
89 (set_attr "cirrus" "normal")] | |
90 ) | |
91 | |
92 (define_insn "*cirrus_subsf3" | |
93 [(set (match_operand:SF 0 "cirrus_fp_register" "=v") | |
94 (minus:SF (match_operand:SF 1 "cirrus_fp_register" "v") | |
95 (match_operand:SF 2 "cirrus_fp_register" "v")))] | |
96 "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_MAVERICK" | |
97 "cfsubs%?\\t%V0, %V1, %V2" | |
98 [(set_attr "type" "mav_farith") | |
99 (set_attr "cirrus" "normal")] | |
100 ) | |
101 | |
102 (define_insn "*cirrus_subdf3" | |
103 [(set (match_operand:DF 0 "cirrus_fp_register" "=v") | |
104 (minus:DF (match_operand:DF 1 "cirrus_fp_register" "v") | |
105 (match_operand:DF 2 "cirrus_fp_register" "v")))] | |
106 "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_MAVERICK" | |
107 "cfsubd%?\\t%V0, %V1, %V2" | |
108 [(set_attr "type" "mav_farith") | |
109 (set_attr "cirrus" "normal")] | |
110 ) | |
111 | |
112 (define_insn "*cirrus_mulsi3" | |
113 [(set (match_operand:SI 0 "cirrus_fp_register" "=v") | |
114 (mult:SI (match_operand:SI 2 "cirrus_fp_register" "v") | |
115 (match_operand:SI 1 "cirrus_fp_register" "v")))] | |
116 "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_MAVERICK && 0" | |
117 "cfmul32%?\\t%V0, %V1, %V2" | |
118 [(set_attr "type" "mav_farith") | |
119 (set_attr "cirrus" "normal")] | |
120 ) | |
121 | |
122 (define_insn "muldi3" | |
123 [(set (match_operand:DI 0 "cirrus_fp_register" "=v") | |
124 (mult:DI (match_operand:DI 2 "cirrus_fp_register" "v") | |
125 (match_operand:DI 1 "cirrus_fp_register" "v")))] | |
126 "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_MAVERICK" | |
127 "cfmul64%?\\t%V0, %V1, %V2" | |
128 [(set_attr "type" "mav_dmult") | |
129 (set_attr "cirrus" "normal")] | |
130 ) | |
131 | |
132 (define_insn "*cirrus_mulsi3addsi" | |
133 [(set (match_operand:SI 0 "cirrus_fp_register" "=v") | |
134 (plus:SI | |
135 (mult:SI (match_operand:SI 1 "cirrus_fp_register" "v") | |
136 (match_operand:SI 2 "cirrus_fp_register" "v")) | |
137 (match_operand:SI 3 "cirrus_fp_register" "0")))] | |
138 "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_MAVERICK && 0" | |
139 "cfmac32%?\\t%V0, %V1, %V2" | |
140 [(set_attr "type" "mav_farith") | |
141 (set_attr "cirrus" "normal")] | |
142 ) | |
143 | |
144 ;; Cirrus SI multiply-subtract | |
145 (define_insn "*cirrus_mulsi3subsi" | |
146 [(set (match_operand:SI 0 "cirrus_fp_register" "=v") | |
147 (minus:SI | |
148 (match_operand:SI 1 "cirrus_fp_register" "0") | |
149 (mult:SI (match_operand:SI 2 "cirrus_fp_register" "v") | |
150 (match_operand:SI 3 "cirrus_fp_register" "v"))))] | |
151 "0 && TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_MAVERICK" | |
152 "cfmsc32%?\\t%V0, %V2, %V3" | |
153 [(set_attr "type" "mav_farith") | |
154 (set_attr "cirrus" "normal")] | |
155 ) | |
156 | |
157 (define_insn "*cirrus_mulsf3" | |
158 [(set (match_operand:SF 0 "cirrus_fp_register" "=v") | |
159 (mult:SF (match_operand:SF 1 "cirrus_fp_register" "v") | |
160 (match_operand:SF 2 "cirrus_fp_register" "v")))] | |
161 "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_MAVERICK" | |
162 "cfmuls%?\\t%V0, %V1, %V2" | |
163 [(set_attr "type" "mav_farith") | |
164 (set_attr "cirrus" "normal")] | |
165 ) | |
166 | |
167 (define_insn "*cirrus_muldf3" | |
168 [(set (match_operand:DF 0 "cirrus_fp_register" "=v") | |
169 (mult:DF (match_operand:DF 1 "cirrus_fp_register" "v") | |
170 (match_operand:DF 2 "cirrus_fp_register" "v")))] | |
171 "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_MAVERICK" | |
172 "cfmuld%?\\t%V0, %V1, %V2" | |
173 [(set_attr "type" "mav_dmult") | |
174 (set_attr "cirrus" "normal")] | |
175 ) | |
176 | |
177 (define_insn "cirrus_ashl_const" | |
178 [(set (match_operand:SI 0 "cirrus_fp_register" "=v") | |
179 (ashift:SI (match_operand:SI 1 "cirrus_fp_register" "v") | |
180 (match_operand:SI 2 "cirrus_shift_const" "")))] | |
181 "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_MAVERICK && 0" | |
182 "cfsh32%?\\t%V0, %V1, #%s2" | |
183 [(set_attr "cirrus" "normal")] | |
184 ) | |
185 | |
186 (define_insn "cirrus_ashiftrt_const" | |
187 [(set (match_operand:SI 0 "cirrus_fp_register" "=v") | |
188 (ashiftrt:SI (match_operand:SI 1 "cirrus_fp_register" "v") | |
189 (match_operand:SI 2 "cirrus_shift_const" "")))] | |
190 "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_MAVERICK && 0" | |
191 "cfsh32%?\\t%V0, %V1, #-%s2" | |
192 [(set_attr "cirrus" "normal")] | |
193 ) | |
194 | |
195 (define_insn "cirrus_ashlsi3" | |
196 [(set (match_operand:SI 0 "cirrus_fp_register" "=v") | |
197 (ashift:SI (match_operand:SI 1 "cirrus_fp_register" "v") | |
198 (match_operand:SI 2 "register_operand" "r")))] | |
199 "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_MAVERICK && 0" | |
200 "cfrshl32%?\\t%V1, %V0, %s2" | |
201 [(set_attr "cirrus" "normal")] | |
202 ) | |
203 | |
204 (define_insn "ashldi3_cirrus" | |
205 [(set (match_operand:DI 0 "cirrus_fp_register" "=v") | |
206 (ashift:DI (match_operand:DI 1 "cirrus_fp_register" "v") | |
207 (match_operand:SI 2 "register_operand" "r")))] | |
208 "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_MAVERICK" | |
209 "cfrshl64%?\\t%V1, %V0, %s2" | |
210 [(set_attr "cirrus" "normal")] | |
211 ) | |
212 | |
213 (define_insn "cirrus_ashldi_const" | |
214 [(set (match_operand:DI 0 "cirrus_fp_register" "=v") | |
215 (ashift:DI (match_operand:DI 1 "cirrus_fp_register" "v") | |
216 (match_operand:SI 2 "cirrus_shift_const" "")))] | |
217 "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_MAVERICK" | |
218 "cfsh64%?\\t%V0, %V1, #%s2" | |
219 [(set_attr "cirrus" "normal")] | |
220 ) | |
221 | |
222 (define_insn "cirrus_ashiftrtdi_const" | |
223 [(set (match_operand:DI 0 "cirrus_fp_register" "=v") | |
224 (ashiftrt:DI (match_operand:DI 1 "cirrus_fp_register" "v") | |
225 (match_operand:SI 2 "cirrus_shift_const" "")))] | |
226 "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_MAVERICK" | |
227 "cfsh64%?\\t%V0, %V1, #-%s2" | |
228 [(set_attr "cirrus" "normal")] | |
229 ) | |
230 | |
231 (define_insn "*cirrus_absdi2" | |
232 [(set (match_operand:DI 0 "cirrus_fp_register" "=v") | |
233 (abs:DI (match_operand:DI 1 "cirrus_fp_register" "v")))] | |
234 "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_MAVERICK" | |
235 "cfabs64%?\\t%V0, %V1" | |
236 [(set_attr "cirrus" "normal")] | |
237 ) | |
238 | |
239 ;; This doesn't really clobber ``cc''. Fixme: aldyh. | |
240 (define_insn "*cirrus_negdi2" | |
241 [(set (match_operand:DI 0 "cirrus_fp_register" "=v") | |
242 (neg:DI (match_operand:DI 1 "cirrus_fp_register" "v"))) | |
243 (clobber (reg:CC CC_REGNUM))] | |
244 "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_MAVERICK" | |
245 "cfneg64%?\\t%V0, %V1" | |
246 [(set_attr "cirrus" "normal")] | |
247 ) | |
248 | |
249 (define_insn "*cirrus_negsi2" | |
250 [(set (match_operand:SI 0 "cirrus_fp_register" "=v") | |
251 (neg:SI (match_operand:SI 1 "cirrus_fp_register" "v")))] | |
252 "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_MAVERICK && 0" | |
253 "cfneg32%?\\t%V0, %V1" | |
254 [(set_attr "cirrus" "normal")] | |
255 ) | |
256 | |
257 (define_insn "*cirrus_negsf2" | |
258 [(set (match_operand:SF 0 "cirrus_fp_register" "=v") | |
259 (neg:SF (match_operand:SF 1 "cirrus_fp_register" "v")))] | |
260 "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_MAVERICK" | |
261 "cfnegs%?\\t%V0, %V1" | |
262 [(set_attr "cirrus" "normal")] | |
263 ) | |
264 | |
265 (define_insn "*cirrus_negdf2" | |
266 [(set (match_operand:DF 0 "cirrus_fp_register" "=v") | |
267 (neg:DF (match_operand:DF 1 "cirrus_fp_register" "v")))] | |
268 "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_MAVERICK" | |
269 "cfnegd%?\\t%V0, %V1" | |
270 [(set_attr "cirrus" "normal")] | |
271 ) | |
272 | |
273 ;; This doesn't really clobber the condition codes either. | |
274 (define_insn "*cirrus_abssi2" | |
275 [(set (match_operand:SI 0 "cirrus_fp_register" "=v") | |
276 (abs:SI (match_operand:SI 1 "cirrus_fp_register" "v"))) | |
277 (clobber (reg:CC CC_REGNUM))] | |
278 "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_MAVERICK && 0" | |
279 "cfabs32%?\\t%V0, %V1" | |
280 [(set_attr "cirrus" "normal")] | |
281 ) | |
282 | |
283 (define_insn "*cirrus_abssf2" | |
284 [(set (match_operand:SF 0 "cirrus_fp_register" "=v") | |
285 (abs:SF (match_operand:SF 1 "cirrus_fp_register" "v")))] | |
286 "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_MAVERICK" | |
287 "cfabss%?\\t%V0, %V1" | |
288 [(set_attr "cirrus" "normal")] | |
289 ) | |
290 | |
291 (define_insn "*cirrus_absdf2" | |
292 [(set (match_operand:DF 0 "cirrus_fp_register" "=v") | |
293 (abs:DF (match_operand:DF 1 "cirrus_fp_register" "v")))] | |
294 "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_MAVERICK" | |
295 "cfabsd%?\\t%V0, %V1" | |
296 [(set_attr "cirrus" "normal")] | |
297 ) | |
298 | |
299 ;; Convert Cirrus-SI to Cirrus-SF | |
300 (define_insn "cirrus_floatsisf2" | |
301 [(set (match_operand:SF 0 "cirrus_fp_register" "=v") | |
302 (float:SF (match_operand:SI 1 "s_register_operand" "r"))) | |
303 (clobber (match_scratch:DF 2 "=v"))] | |
304 "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_MAVERICK" | |
305 "cfmv64lr%?\\t%Z2, %1\;cfcvt32s%?\\t%V0, %Y2" | |
306 [(set_attr "length" "8") | |
307 (set_attr "cirrus" "move")] | |
308 ) | |
309 | |
310 (define_insn "cirrus_floatsidf2" | |
311 [(set (match_operand:DF 0 "cirrus_fp_register" "=v") | |
312 (float:DF (match_operand:SI 1 "s_register_operand" "r"))) | |
313 (clobber (match_scratch:DF 2 "=v"))] | |
314 "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_MAVERICK" | |
315 "cfmv64lr%?\\t%Z2, %1\;cfcvt32d%?\\t%V0, %Y2" | |
316 [(set_attr "length" "8") | |
317 (set_attr "cirrus" "move")] | |
318 ) | |
319 | |
320 (define_insn "floatdisf2" | |
321 [(set (match_operand:SF 0 "cirrus_fp_register" "=v") | |
322 (float:SF (match_operand:DI 1 "cirrus_fp_register" "v")))] | |
323 "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_MAVERICK" | |
324 "cfcvt64s%?\\t%V0, %V1" | |
325 [(set_attr "cirrus" "normal")]) | |
326 | |
327 (define_insn "floatdidf2" | |
328 [(set (match_operand:DF 0 "cirrus_fp_register" "=v") | |
329 (float:DF (match_operand:DI 1 "cirrus_fp_register" "v")))] | |
330 "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_MAVERICK" | |
331 "cfcvt64d%?\\t%V0, %V1" | |
332 [(set_attr "cirrus" "normal")]) | |
333 | |
334 (define_insn "cirrus_truncsfsi2" | |
335 [(set (match_operand:SI 0 "s_register_operand" "=r") | |
336 (fix:SI (fix:SF (match_operand:SF 1 "cirrus_fp_register" "v")))) | |
337 (clobber (match_scratch:DF 2 "=v"))] | |
338 "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_MAVERICK" | |
339 "cftruncs32%?\\t%Y2, %V1\;cfmvr64l%?\\t%0, %Z2" | |
340 [(set_attr "length" "8") | |
341 (set_attr "cirrus" "normal")] | |
342 ) | |
343 | |
344 (define_insn "cirrus_truncdfsi2" | |
345 [(set (match_operand:SI 0 "s_register_operand" "=r") | |
346 (fix:SI (fix:DF (match_operand:DF 1 "cirrus_fp_register" "v")))) | |
347 (clobber (match_scratch:DF 2 "=v"))] | |
348 "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_MAVERICK" | |
349 "cftruncd32%?\\t%Y2, %V1\;cfmvr64l%?\\t%0, %Z2" | |
350 [(set_attr "length" "8")] | |
351 ) | |
352 | |
353 (define_insn "*cirrus_truncdfsf2" | |
354 [(set (match_operand:SF 0 "cirrus_fp_register" "=v") | |
355 (float_truncate:SF | |
356 (match_operand:DF 1 "cirrus_fp_register" "v")))] | |
357 "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_MAVERICK" | |
358 "cfcvtds%?\\t%V0, %V1" | |
359 [(set_attr "cirrus" "normal")] | |
360 ) | |
361 | |
362 (define_insn "*cirrus_extendsfdf2" | |
363 [(set (match_operand:DF 0 "cirrus_fp_register" "=v") | |
364 (float_extend:DF (match_operand:SF 1 "cirrus_fp_register" "v")))] | |
365 "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_MAVERICK" | |
366 "cfcvtsd%?\\t%V0, %V1" | |
367 [(set_attr "cirrus" "normal")] | |
368 ) | |
369 | |
370 (define_insn "*cirrus_arm_movdi" | |
371 [(set (match_operand:DI 0 "nonimmediate_di_operand" "=r,r,o<>,v,r,v,m,v") | |
372 (match_operand:DI 1 "di_operand" "rIK,mi,r,r,v,mi,v,v"))] | |
373 "TARGET_ARM && TARGET_HARD_FLOAT && TARGET_MAVERICK" | |
374 "* | |
375 { | |
376 switch (which_alternative) | |
377 { | |
378 case 0: | |
379 return \"#\"; | |
380 case 1: | |
381 case 2: | |
382 return output_move_double (operands); | |
383 | |
384 case 3: return \"cfmv64lr%?\\t%V0, %Q1\;cfmv64hr%?\\t%V0, %R1\"; | |
385 case 4: return \"cfmvr64l%?\\t%Q0, %V1\;cfmvr64h%?\\t%R0, %V1\"; | |
386 | |
387 case 5: return \"cfldr64%?\\t%V0, %1\"; | |
388 case 6: return \"cfstr64%?\\t%V1, %0\"; | |
389 | |
390 /* Shifting by 0 will just copy %1 into %0. */ | |
391 case 7: return \"cfsh64%?\\t%V0, %V1, #0\"; | |
392 | |
393 default: gcc_unreachable (); | |
394 } | |
395 }" | |
396 [(set_attr "length" " 8, 8, 8, 8, 8, 4, 4, 4") | |
397 (set_attr "type" " *,load2,store2, *, *, load2,store2, *") | |
398 (set_attr "pool_range" " *,1020, *, *, *, 1020, *, *") | |
399 (set_attr "neg_pool_range" " *,1012, *, *, *, 1008, *, *") | |
400 (set_attr "cirrus" "not, not, not,move,normal,double,double,normal")] | |
401 ) | |
402 | |
403 ;; Cirrus SI values have been outlawed. Look in arm.h for the comment | |
404 ;; on HARD_REGNO_MODE_OK. | |
405 | |
406 (define_insn "*cirrus_movsf_hard_insn" | |
407 [(set (match_operand:SF 0 "nonimmediate_operand" "=v,v,v,r,m,r,r,m") | |
408 (match_operand:SF 1 "general_operand" "v,mE,r,v,v,r,mE,r"))] | |
409 "TARGET_ARM && TARGET_HARD_FLOAT && TARGET_MAVERICK | |
410 && (GET_CODE (operands[0]) != MEM | |
411 || register_operand (operands[1], SFmode))" | |
412 "@ | |
413 cfcpys%?\\t%V0, %V1 | |
414 cfldrs%?\\t%V0, %1 | |
415 cfmvsr%?\\t%V0, %1 | |
416 cfmvrs%?\\t%0, %V1 | |
417 cfstrs%?\\t%V1, %0 | |
418 mov%?\\t%0, %1 | |
419 ldr%?\\t%0, %1\\t%@ float | |
420 str%?\\t%1, %0\\t%@ float" | |
421 [(set_attr "length" " *, *, *, *, *, 4, 4, 4") | |
422 (set_attr "type" " *, load1, *, *,store1, *,load1,store1") | |
423 (set_attr "pool_range" " *, 1020, *, *, *, *,4096, *") | |
424 (set_attr "neg_pool_range" " *, 1008, *, *, *, *,4084, *") | |
425 (set_attr "cirrus" "normal,normal,move,normal,normal,not, not, not")] | |
426 ) | |
427 | |
428 (define_insn "*cirrus_movdf_hard_insn" | |
429 [(set (match_operand:DF 0 "nonimmediate_operand" "=r,Q,r,m,r,v,v,v,r,m") | |
430 (match_operand:DF 1 "general_operand" "Q,r,r,r,mF,v,mF,r,v,v"))] | |
431 "TARGET_ARM | |
432 && TARGET_HARD_FLOAT && TARGET_MAVERICK | |
433 && (GET_CODE (operands[0]) != MEM | |
434 || register_operand (operands[1], DFmode))" | |
435 "* | |
436 { | |
437 switch (which_alternative) | |
438 { | |
439 case 0: return \"ldm%?ia\\t%m1, %M0\\t%@ double\"; | |
440 case 1: return \"stm%?ia\\t%m0, %M1\\t%@ double\"; | |
441 case 2: return \"#\"; | |
442 case 3: case 4: return output_move_double (operands); | |
443 case 5: return \"cfcpyd%?\\t%V0, %V1\"; | |
444 case 6: return \"cfldrd%?\\t%V0, %1\"; | |
445 case 7: return \"cfmvdlr\\t%V0, %Q1\;cfmvdhr%?\\t%V0, %R1\"; | |
446 case 8: return \"cfmvrdl%?\\t%Q0, %V1\;cfmvrdh%?\\t%R0, %V1\"; | |
447 case 9: return \"cfstrd%?\\t%V1, %0\"; | |
448 default: gcc_unreachable (); | |
449 } | |
450 }" | |
451 [(set_attr "type" "load1,store2, *,store2,load1, *, load1, *, *,store2") | |
452 (set_attr "length" " 4, 4, 8, 8, 8, 4, 4, 8, 8, 4") | |
453 (set_attr "pool_range" " *, *, *, *, 252, *, 1020, *, *, *") | |
454 (set_attr "neg_pool_range" " *, *, *, *, 244, *, 1008, *, *, *") | |
455 (set_attr "cirrus" " not, not,not, not, not,normal,double,move,normal,double")] | |
456 ) | |
457 | |
458 (define_insn "*cirrus_thumb2_movdi" | |
459 [(set (match_operand:DI 0 "nonimmediate_di_operand" "=r,r,o<>,v,r,v,m,v") | |
460 (match_operand:DI 1 "di_operand" "rIK,mi,r,r,v,mi,v,v"))] | |
461 "TARGET_THUMB2 && TARGET_HARD_FLOAT && TARGET_MAVERICK" | |
462 "* | |
463 { | |
464 switch (which_alternative) | |
465 { | |
466 case 0: | |
467 case 1: | |
468 case 2: | |
469 return (output_move_double (operands)); | |
470 | |
471 case 3: return \"cfmv64lr%?\\t%V0, %Q1\;cfmv64hr%?\\t%V0, %R1\"; | |
472 case 4: return \"cfmvr64l%?\\t%Q0, %V1\;cfmvr64h%?\\t%R0, %V1\"; | |
473 | |
474 case 5: return \"cfldr64%?\\t%V0, %1\"; | |
475 case 6: return \"cfstr64%?\\t%V1, %0\"; | |
476 | |
477 /* Shifting by 0 will just copy %1 into %0. */ | |
478 case 7: return \"cfsh64%?\\t%V0, %V1, #0\"; | |
479 | |
480 default: abort (); | |
481 } | |
482 }" | |
483 [(set_attr "length" " 8, 8, 8, 8, 8, 4, 4, 4") | |
484 (set_attr "type" " *,load2,store2, *, *, load2,store2, *") | |
485 (set_attr "pool_range" " *,4096, *, *, *, 1020, *, *") | |
486 (set_attr "neg_pool_range" " *, 0, *, *, *, 1008, *, *") | |
487 (set_attr "cirrus" "not, not, not,move,normal,double,double,normal")] | |
488 ) | |
489 | |
490 (define_insn "*thumb2_cirrus_movsf_hard_insn" | |
491 [(set (match_operand:SF 0 "nonimmediate_operand" "=v,v,v,r,m,r,r,m") | |
492 (match_operand:SF 1 "general_operand" "v,mE,r,v,v,r,mE,r"))] | |
493 "TARGET_THUMB2 && TARGET_HARD_FLOAT && TARGET_MAVERICK | |
494 && (GET_CODE (operands[0]) != MEM | |
495 || register_operand (operands[1], SFmode))" | |
496 "@ | |
497 cfcpys%?\\t%V0, %V1 | |
498 cfldrs%?\\t%V0, %1 | |
499 cfmvsr%?\\t%V0, %1 | |
500 cfmvrs%?\\t%0, %V1 | |
501 cfstrs%?\\t%V1, %0 | |
502 mov%?\\t%0, %1 | |
503 ldr%?\\t%0, %1\\t%@ float | |
504 str%?\\t%1, %0\\t%@ float" | |
505 [(set_attr "length" " *, *, *, *, *, 4, 4, 4") | |
506 (set_attr "type" " *, load1, *, *,store1, *,load1,store1") | |
507 (set_attr "pool_range" " *, 1020, *, *, *, *,4096, *") | |
508 (set_attr "neg_pool_range" " *, 1008, *, *, *, *, 0, *") | |
509 (set_attr "cirrus" "normal,normal,move,normal,normal,not, not, not")] | |
510 ) | |
511 | |
512 (define_insn "*thumb2_cirrus_movdf_hard_insn" | |
513 [(set (match_operand:DF 0 "nonimmediate_operand" "=r,Q,r,m,r,v,v,v,r,m") | |
514 (match_operand:DF 1 "general_operand" "Q,r,r,r,mF,v,mF,r,v,v"))] | |
515 "TARGET_THUMB2 | |
516 && TARGET_HARD_FLOAT && TARGET_MAVERICK | |
517 && (GET_CODE (operands[0]) != MEM | |
518 || register_operand (operands[1], DFmode))" | |
519 "* | |
520 { | |
521 switch (which_alternative) | |
522 { | |
523 case 0: return \"ldm%?ia\\t%m1, %M0\\t%@ double\"; | |
524 case 1: return \"stm%?ia\\t%m0, %M1\\t%@ double\"; | |
525 case 2: case 3: case 4: return output_move_double (operands); | |
526 case 5: return \"cfcpyd%?\\t%V0, %V1\"; | |
527 case 6: return \"cfldrd%?\\t%V0, %1\"; | |
528 case 7: return \"cfmvdlr\\t%V0, %Q1\;cfmvdhr%?\\t%V0, %R1\"; | |
529 case 8: return \"cfmvrdl%?\\t%Q0, %V1\;cfmvrdh%?\\t%R0, %V1\"; | |
530 case 9: return \"cfstrd%?\\t%V1, %0\"; | |
531 default: abort (); | |
532 } | |
533 }" | |
534 [(set_attr "type" "load1,store2, *,store2,load1, *, load1, *, *,store2") | |
535 (set_attr "length" " 4, 4, 8, 8, 8, 4, 4, 8, 8, 4") | |
536 (set_attr "pool_range" " *, *, *, *,4092, *, 1020, *, *, *") | |
537 (set_attr "neg_pool_range" " *, *, *, *, 0, *, 1008, *, *, *") | |
538 (set_attr "cirrus" " not, not,not, not, not,normal,double,move,normal,double")] | |
539 ) | |
540 |