* tree-ssa-loop-prefetch.c (determine_unroll_factor): Bound the unroll
[official-gcc.git] / gcc / config / arm / cirrus.md
blobe7b3015d820da01131f29d54e448b7e92f9fc962
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)
6 ;; This file is part of GCC.
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 2, or (at your option)
11 ;; any later version.
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.
18 ;; You should have received a copy of the GNU General Public License
19 ;; along with GCC; see the file COPYING.  If not, write to
20 ;; the Free Software Foundation, 51 Franklin Street, Fifth Floor,
21 ;; Boston, MA 02110-1301, USA.
24 ; Cirrus types for invalid insn combinations
25 ; not           Not a cirrus insn
26 ; normal        Any Cirrus insn not covered by the special cases below
27 ; double        cfldrd, cfldr64, cfstrd, cfstr64
28 ; compare       cfcmps, cfcmpd, cfcmp32, cfcmp64
29 ; move          cfmvdlr, cfmvdhr, cfmvsr, cfmv64lr, cfmv64hr
30 (define_attr "cirrus" "not,normal,double,compare,move" (const_string "not"))
33 (define_insn "cirrus_adddi3"
34   [(set (match_operand:DI          0 "cirrus_fp_register" "=v")
35         (plus:DI (match_operand:DI 1 "cirrus_fp_register"  "v")
36                  (match_operand:DI 2 "cirrus_fp_register"  "v")))]
37   "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_MAVERICK"
38   "cfadd64%?\\t%V0, %V1, %V2"
39   [(set_attr "type" "mav_farith")
40    (set_attr "cirrus" "normal")]
43 (define_insn "*cirrus_addsi3"
44   [(set (match_operand:SI          0 "cirrus_fp_register" "=v")
45         (plus:SI (match_operand:SI 1 "cirrus_fp_register" "v")
46                  (match_operand:SI 2 "cirrus_fp_register" "v")))]
47   "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_MAVERICK && 0"
48   "cfadd32%?\\t%V0, %V1, %V2"
49   [(set_attr "type" "mav_farith")
50    (set_attr "cirrus" "normal")]
53 (define_insn "*cirrus_addsf3"
54   [(set (match_operand:SF          0 "cirrus_fp_register" "=v")
55         (plus:SF (match_operand:SF 1 "cirrus_fp_register" "v")
56                  (match_operand:SF 2 "cirrus_fp_register" "v")))]
57   "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_MAVERICK"
58   "cfadds%?\\t%V0, %V1, %V2"
59   [(set_attr "type" "mav_farith")
60    (set_attr "cirrus" "normal")]
63 (define_insn "*cirrus_adddf3"
64   [(set (match_operand:DF          0 "cirrus_fp_register" "=v")
65         (plus:DF (match_operand:DF 1 "cirrus_fp_register" "v")
66                  (match_operand:DF 2 "cirrus_fp_register" "v")))]
67   "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_MAVERICK"
68   "cfaddd%?\\t%V0, %V1, %V2"
69   [(set_attr "type" "mav_farith")
70    (set_attr "cirrus" "normal")]
73 (define_insn "cirrus_subdi3"
74   [(set (match_operand:DI           0 "cirrus_fp_register" "=v")
75         (minus:DI (match_operand:DI 1 "cirrus_fp_register"  "v")
76                   (match_operand:DI 2 "cirrus_fp_register"  "v")))]
77   "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_MAVERICK"
78   "cfsub64%?\\t%V0, %V1, %V2"
79   [(set_attr "type" "mav_farith")
80    (set_attr "cirrus" "normal")]
83 (define_insn "*cirrus_subsi3_insn"
84   [(set (match_operand:SI           0 "cirrus_fp_register" "=v")
85         (minus:SI (match_operand:SI 1 "cirrus_fp_register" "v")
86                   (match_operand:SI 2 "cirrus_fp_register" "v")))]
87   "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_MAVERICK && 0"
88   "cfsub32%?\\t%V0, %V1, %V2"
89   [(set_attr "type" "mav_farith")
90    (set_attr "cirrus" "normal")]
93 (define_insn "*cirrus_subsf3"
94   [(set (match_operand:SF           0 "cirrus_fp_register" "=v")
95         (minus:SF (match_operand:SF 1 "cirrus_fp_register"  "v")
96                   (match_operand:SF 2 "cirrus_fp_register"  "v")))]
97   "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_MAVERICK"
98   "cfsubs%?\\t%V0, %V1, %V2"
99   [(set_attr "type" "mav_farith")
100    (set_attr "cirrus" "normal")]
103 (define_insn "*cirrus_subdf3"
104   [(set (match_operand:DF           0 "cirrus_fp_register" "=v")
105         (minus:DF (match_operand:DF 1 "cirrus_fp_register" "v")
106                   (match_operand:DF 2 "cirrus_fp_register" "v")))]
107   "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_MAVERICK"
108   "cfsubd%?\\t%V0, %V1, %V2"
109   [(set_attr "type" "mav_farith")
110    (set_attr "cirrus" "normal")]
113 (define_insn "*cirrus_mulsi3"
114   [(set (match_operand:SI          0 "cirrus_fp_register" "=v")
115         (mult:SI (match_operand:SI 2 "cirrus_fp_register"  "v")
116                  (match_operand:SI 1 "cirrus_fp_register"  "v")))]
117   "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_MAVERICK && 0"
118   "cfmul32%?\\t%V0, %V1, %V2"
119   [(set_attr "type" "mav_farith")
120    (set_attr "cirrus" "normal")]
123 (define_insn "muldi3"
124   [(set (match_operand:DI          0 "cirrus_fp_register" "=v")
125         (mult:DI (match_operand:DI 2 "cirrus_fp_register"  "v")
126                  (match_operand:DI 1 "cirrus_fp_register"  "v")))]
127   "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_MAVERICK"
128   "cfmul64%?\\t%V0, %V1, %V2"
129   [(set_attr "type" "mav_dmult")
130    (set_attr "cirrus" "normal")]
133 (define_insn "*cirrus_mulsi3addsi"
134   [(set (match_operand:SI            0 "cirrus_fp_register" "=v")
135         (plus:SI
136           (mult:SI (match_operand:SI 1 "cirrus_fp_register"  "v")
137                    (match_operand:SI 2 "cirrus_fp_register"  "v"))
138           (match_operand:SI          3 "cirrus_fp_register"  "0")))]
139   "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_MAVERICK && 0"
140   "cfmac32%?\\t%V0, %V1, %V2"
141   [(set_attr "type" "mav_farith")
142    (set_attr "cirrus" "normal")]
145 ;; Cirrus SI multiply-subtract
146 (define_insn "*cirrus_mulsi3subsi"
147   [(set (match_operand:SI            0 "cirrus_fp_register" "=v")
148         (minus:SI
149           (match_operand:SI          1 "cirrus_fp_register"  "0")
150           (mult:SI (match_operand:SI 2 "cirrus_fp_register"  "v")
151                    (match_operand:SI 3 "cirrus_fp_register"  "v"))))]
152   "0 && TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_MAVERICK"
153   "cfmsc32%?\\t%V0, %V2, %V3"
154   [(set_attr "type" "mav_farith")
155    (set_attr "cirrus" "normal")]
158 (define_insn "*cirrus_mulsf3"
159   [(set (match_operand:SF          0 "cirrus_fp_register" "=v")
160         (mult:SF (match_operand:SF 1 "cirrus_fp_register"  "v")
161                  (match_operand:SF 2 "cirrus_fp_register"  "v")))]
162   "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_MAVERICK"
163   "cfmuls%?\\t%V0, %V1, %V2"
164   [(set_attr "type" "mav_farith")
165    (set_attr "cirrus" "normal")]
168 (define_insn "*cirrus_muldf3"
169   [(set (match_operand:DF          0 "cirrus_fp_register" "=v")
170         (mult:DF (match_operand:DF 1 "cirrus_fp_register"  "v")
171                  (match_operand:DF 2 "cirrus_fp_register"  "v")))]
172   "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_MAVERICK"
173   "cfmuld%?\\t%V0, %V1, %V2"
174   [(set_attr "type" "mav_dmult")
175    (set_attr "cirrus" "normal")]
178 (define_insn "cirrus_ashl_const"
179   [(set (match_operand:SI            0 "cirrus_fp_register" "=v")
180         (ashift:SI (match_operand:SI 1 "cirrus_fp_register"  "v")
181                    (match_operand:SI 2 "cirrus_shift_const"  "")))]
182   "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_MAVERICK && 0"
183   "cfsh32%?\\t%V0, %V1, #%s2"
184   [(set_attr "cirrus" "normal")]
187 (define_insn "cirrus_ashiftrt_const"
188   [(set (match_operand:SI              0 "cirrus_fp_register" "=v")
189         (ashiftrt:SI (match_operand:SI 1 "cirrus_fp_register"  "v")
190                      (match_operand:SI 2 "cirrus_shift_const"  "")))]
191   "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_MAVERICK && 0"
192   "cfsh32%?\\t%V0, %V1, #-%s2"
193   [(set_attr "cirrus" "normal")]
196 (define_insn "cirrus_ashlsi3"
197   [(set (match_operand:SI            0 "cirrus_fp_register" "=v")
198         (ashift:SI (match_operand:SI 1 "cirrus_fp_register"  "v")
199                    (match_operand:SI 2 "register_operand"    "r")))]
200   "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_MAVERICK && 0"
201   "cfrshl32%?\\t%V1, %V0, %s2"
202   [(set_attr "cirrus" "normal")]
205 (define_insn "ashldi3_cirrus"
206   [(set (match_operand:DI            0 "cirrus_fp_register" "=v")
207         (ashift:DI (match_operand:DI 1 "cirrus_fp_register"  "v")
208                    (match_operand:SI 2 "register_operand"    "r")))]
209   "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_MAVERICK"
210   "cfrshl64%?\\t%V1, %V0, %s2"
211   [(set_attr "cirrus" "normal")]
214 (define_insn "cirrus_ashldi_const"
215   [(set (match_operand:DI            0 "cirrus_fp_register" "=v")
216         (ashift:DI (match_operand:DI 1 "cirrus_fp_register"  "v")
217                    (match_operand:SI 2 "cirrus_shift_const"  "")))]
218   "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_MAVERICK"
219   "cfsh64%?\\t%V0, %V1, #%s2"
220   [(set_attr "cirrus" "normal")]
223 (define_insn "cirrus_ashiftrtdi_const"
224   [(set (match_operand:DI            0 "cirrus_fp_register" "=v")
225         (ashiftrt:DI (match_operand:DI 1 "cirrus_fp_register"  "v")
226                      (match_operand:SI 2 "cirrus_shift_const"  "")))]
227   "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_MAVERICK"
228   "cfsh64%?\\t%V0, %V1, #-%s2"
229   [(set_attr "cirrus" "normal")]
232 (define_insn "*cirrus_absdi2"
233   [(set (match_operand:DI         0 "cirrus_fp_register" "=v")
234         (abs:DI (match_operand:DI 1 "cirrus_fp_register"  "v")))]
235   "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_MAVERICK"
236   "cfabs64%?\\t%V0, %V1"
237   [(set_attr "cirrus" "normal")]
240 ;; This doesn't really clobber ``cc''.  Fixme: aldyh.  
241 (define_insn "*cirrus_negdi2"
242   [(set (match_operand:DI         0 "cirrus_fp_register" "=v")
243         (neg:DI (match_operand:DI 1 "cirrus_fp_register"  "v")))
244    (clobber (reg:CC CC_REGNUM))]
245   "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_MAVERICK"
246   "cfneg64%?\\t%V0, %V1"
247   [(set_attr "cirrus" "normal")]
250 (define_insn "*cirrus_negsi2"
251   [(set (match_operand:SI         0 "cirrus_fp_register" "=v")
252         (neg:SI (match_operand:SI 1 "cirrus_fp_register"  "v")))]
253   "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_MAVERICK && 0"
254   "cfneg32%?\\t%V0, %V1"
255   [(set_attr "cirrus" "normal")]
258 (define_insn "*cirrus_negsf2"
259   [(set (match_operand:SF         0 "cirrus_fp_register" "=v")
260         (neg:SF (match_operand:SF 1 "cirrus_fp_register"  "v")))]
261   "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_MAVERICK"
262   "cfnegs%?\\t%V0, %V1"
263   [(set_attr "cirrus" "normal")]
266 (define_insn "*cirrus_negdf2"
267   [(set (match_operand:DF         0 "cirrus_fp_register" "=v")
268         (neg:DF (match_operand:DF 1 "cirrus_fp_register"  "v")))]
269   "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_MAVERICK"
270   "cfnegd%?\\t%V0, %V1"
271   [(set_attr "cirrus" "normal")]
274 ;; This doesn't really clobber the condition codes either.  
275 (define_insn "*cirrus_abssi2"
276   [(set (match_operand:SI         0 "cirrus_fp_register" "=v")
277         (abs:SI (match_operand:SI 1 "cirrus_fp_register"  "v")))
278    (clobber (reg:CC CC_REGNUM))]
279   "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_MAVERICK && 0"
280   "cfabs32%?\\t%V0, %V1"
281   [(set_attr "cirrus" "normal")]
284 (define_insn "*cirrus_abssf2"
285   [(set (match_operand:SF         0 "cirrus_fp_register" "=v")
286         (abs:SF (match_operand:SF 1 "cirrus_fp_register"  "v")))]
287   "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_MAVERICK"
288   "cfabss%?\\t%V0, %V1"
289   [(set_attr "cirrus" "normal")]
292 (define_insn "*cirrus_absdf2"
293   [(set (match_operand:DF         0 "cirrus_fp_register" "=v")
294         (abs:DF (match_operand:DF 1 "cirrus_fp_register"  "v")))]
295   "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_MAVERICK"
296   "cfabsd%?\\t%V0, %V1"
297   [(set_attr "cirrus" "normal")]
300 ;; Convert Cirrus-SI to Cirrus-SF
301 (define_insn "cirrus_floatsisf2"
302   [(set (match_operand:SF           0 "cirrus_fp_register" "=v")
303         (float:SF (match_operand:SI 1 "s_register_operand"  "r")))
304    (clobber (match_scratch:DF 2 "=v"))]
305   "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_MAVERICK"
306   "cfmv64lr%?\\t%Z2, %1\;cfcvt32s%?\\t%V0, %Y2"
307   [(set_attr "length" "8")
308    (set_attr "cirrus" "move")]
311 (define_insn "cirrus_floatsidf2"
312   [(set (match_operand:DF           0 "cirrus_fp_register" "=v")
313         (float:DF (match_operand:SI 1 "s_register_operand" "r")))
314    (clobber (match_scratch:DF 2 "=v"))]
315   "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_MAVERICK"
316   "cfmv64lr%?\\t%Z2, %1\;cfcvt32d%?\\t%V0, %Y2"
317   [(set_attr "length" "8")
318    (set_attr "cirrus" "move")]
321 (define_insn "floatdisf2"
322   [(set (match_operand:SF           0 "cirrus_fp_register" "=v")
323         (float:SF (match_operand:DI 1 "cirrus_fp_register" "v")))]
324   "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_MAVERICK"
325   "cfcvt64s%?\\t%V0, %V1"
326   [(set_attr "cirrus" "normal")])
328 (define_insn "floatdidf2"
329   [(set (match_operand:DF 0 "cirrus_fp_register" "=v")
330         (float:DF (match_operand:DI 1 "cirrus_fp_register" "v")))]
331   "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_MAVERICK"
332   "cfcvt64d%?\\t%V0, %V1"
333   [(set_attr "cirrus" "normal")])
335 (define_insn "cirrus_truncsfsi2"
336   [(set (match_operand:SI         0 "s_register_operand" "=r")
337         (fix:SI (fix:SF (match_operand:SF 1 "cirrus_fp_register"  "v"))))
338    (clobber (match_scratch:DF     2                      "=v"))]
339   "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_MAVERICK"
340   "cftruncs32%?\\t%Y2, %V1\;cfmvr64l%?\\t%0, %Z2"
341   [(set_attr "length" "8")
342    (set_attr "cirrus" "normal")]
345 (define_insn "cirrus_truncdfsi2"
346   [(set (match_operand:SI         0 "s_register_operand" "=r")
347         (fix:SI (fix:DF (match_operand:DF 1 "cirrus_fp_register"  "v"))))
348    (clobber (match_scratch:DF     2                      "=v"))]
349   "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_MAVERICK"
350   "cftruncd32%?\\t%Y2, %V1\;cfmvr64l%?\\t%0, %Z2"
351   [(set_attr "length" "8")]
354 (define_insn "*cirrus_truncdfsf2"
355   [(set (match_operand:SF  0 "cirrus_fp_register" "=v")
356         (float_truncate:SF
357          (match_operand:DF 1 "cirrus_fp_register" "v")))]
358   "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_MAVERICK"
359   "cfcvtds%?\\t%V0, %V1"
360   [(set_attr "cirrus" "normal")]
363 (define_insn "*cirrus_extendsfdf2"
364   [(set (match_operand:DF                  0 "cirrus_fp_register" "=v")
365         (float_extend:DF (match_operand:SF 1 "cirrus_fp_register"  "v")))]
366   "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_MAVERICK"
367   "cfcvtsd%?\\t%V0, %V1"
368   [(set_attr "cirrus" "normal")]
371 (define_insn "*cirrus_arm_movdi"
372   [(set (match_operand:DI 0 "nonimmediate_di_operand" "=r,r,o<>,v,r,v,m,v")
373         (match_operand:DI 1 "di_operand"              "rIK,mi,r,r,v,mi,v,v"))]
374   "TARGET_ARM && TARGET_HARD_FLOAT && TARGET_MAVERICK"
375   "*
376   {
377   switch (which_alternative)
378     {
379     case 0:
380       return \"#\";
381     case 1:
382     case 2:
383       return output_move_double (operands);
385     case 3: return \"cfmv64lr%?\\t%V0, %Q1\;cfmv64hr%?\\t%V0, %R1\";
386     case 4: return \"cfmvr64l%?\\t%Q0, %V1\;cfmvr64h%?\\t%R0, %V1\";
388     case 5: return \"cfldr64%?\\t%V0, %1\";
389     case 6: return \"cfstr64%?\\t%V1, %0\";
391     /* Shifting by 0 will just copy %1 into %0.  */
392     case 7: return \"cfsh64%?\\t%V0, %V1, #0\";
394     default: gcc_unreachable ();
395     }
396   }"
397   [(set_attr "length"         "  8,   8,     8,   8,     8,     4,     4,     4")
398    (set_attr "type"           "  *,load2,store2,   *,     *,  load2,store2,     *")
399    (set_attr "pool_range"     "  *,1020,     *,   *,     *,  1020,     *,     *")
400    (set_attr "neg_pool_range" "  *,1012,     *,   *,     *,  1008,     *,     *")
401    (set_attr "cirrus"         "not, not,   not,move,normal,double,double,normal")]
404 ;; Cirrus SI values have been outlawed.  Look in arm.h for the comment
405 ;; on HARD_REGNO_MODE_OK.
407 (define_insn "*cirrus_arm_movsi_insn"
408   [(set (match_operand:SI 0 "general_operand" "=r,r,r,m,*v,r,*v,T,*v")
409         (match_operand:SI 1 "general_operand" "rI,K,mi,r,r,*v,T,*v,*v"))]
410   "TARGET_ARM && TARGET_HARD_FLOAT && TARGET_MAVERICK && 0
411    && (register_operand (operands[0], SImode)
412        || register_operand (operands[1], SImode))"
413   "@
414    mov%?\\t%0, %1
415    mvn%?\\t%0, #%B1
416    ldr%?\\t%0, %1
417    str%?\\t%1, %0
418    cfmv64lr%?\\t%Z0, %1
419    cfmvr64l%?\\t%0, %Z1
420    cfldr32%?\\t%V0, %1
421    cfstr32%?\\t%V1, %0
422    cfsh32%?\\t%V0, %V1, #0"
423   [(set_attr "type"           "*,  *,  load1,store1,   *,     *,  load1,store1,     *")
424    (set_attr "pool_range"     "*,  *,  4096,     *,   *,     *,  1024,     *,     *")
425    (set_attr "neg_pool_range" "*,  *,  4084,     *,   *,     *,  1012,     *,     *")
426    (set_attr "cirrus"         "not,not, not,   not,move,normal,normal,normal,normal")]
429 (define_insn "*cirrus_movsf_hard_insn"
430   [(set (match_operand:SF 0 "nonimmediate_operand" "=v,v,v,r,m,r,r,m")
431         (match_operand:SF 1 "general_operand"      "v,mE,r,v,v,r,mE,r"))]
432   "TARGET_ARM && TARGET_HARD_FLOAT && TARGET_MAVERICK
433    && (GET_CODE (operands[0]) != MEM
434        || register_operand (operands[1], SFmode))"
435   "@
436    cfcpys%?\\t%V0, %V1
437    cfldrs%?\\t%V0, %1
438    cfmvsr%?\\t%V0, %1
439    cfmvrs%?\\t%0, %V1
440    cfstrs%?\\t%V1, %0
441    mov%?\\t%0, %1
442    ldr%?\\t%0, %1\\t%@ float
443    str%?\\t%1, %0\\t%@ float"
444   [(set_attr "length"         "     *,     *,   *,     *,     *,  4,   4,     4")
445    (set_attr "type"           "     *,  load1,   *,     *,store1,  *,load1,store1")
446    (set_attr "pool_range"     "     *,   1020,   *,     *,     *,  *,4096,     *")
447    (set_attr "neg_pool_range" "     *,   1008,   *,     *,     *,  *,4084,     *")
448    (set_attr "cirrus"         "normal,normal,move,normal,normal,not, not,   not")]
451 (define_insn "*cirrus_movdf_hard_insn"
452   [(set (match_operand:DF 0 "nonimmediate_operand" "=r,Q,r,m,r,v,v,v,r,m")
453         (match_operand:DF 1 "general_operand"       "Q,r,r,r,mF,v,mF,r,v,v"))]
454   "TARGET_ARM
455    && TARGET_HARD_FLOAT && TARGET_MAVERICK
456    && (GET_CODE (operands[0]) != MEM
457        || register_operand (operands[1], DFmode))"
458   "*
459   {
460   switch (which_alternative)
461     {
462     case 0: return \"ldm%?ia\\t%m1, %M0\\t%@ double\";
463     case 1: return \"stm%?ia\\t%m0, %M1\\t%@ double\";
464     case 2: return \"#\";
465     case 3: case 4: return output_move_double (operands);
466     case 5: return \"cfcpyd%?\\t%V0, %V1\";
467     case 6: return \"cfldrd%?\\t%V0, %1\";
468     case 7: return \"cfmvdlr\\t%V0, %Q1\;cfmvdhr%?\\t%V0, %R1\";
469     case 8: return \"cfmvrdl%?\\t%Q0, %V1\;cfmvrdh%?\\t%R0, %V1\";
470     case 9: return \"cfstrd%?\\t%V1, %0\";
471     default: gcc_unreachable ();
472     }
473   }"
474   [(set_attr "type"           "load1,store2,  *,store2,load1,     *,  load1,   *,     *,store2")
475    (set_attr "length"         "   4,     4,  8,     8,   8,     4,     4,   8,     8,     4")
476    (set_attr "pool_range"     "   *,     *,  *,     *, 252,     *,  1020,   *,     *,     *")
477    (set_attr "neg_pool_range" "   *,     *,  *,     *, 244,     *,  1008,   *,     *,     *")
478    (set_attr "cirrus"         " not,   not,not,   not, not,normal,double,move,normal,double")]
481 (define_insn "*cirrus_thumb2_movdi"
482   [(set (match_operand:DI 0 "nonimmediate_di_operand" "=r,r,o<>,v,r,v,m,v")
483         (match_operand:DI 1 "di_operand"              "rIK,mi,r,r,v,mi,v,v"))]
484   "TARGET_THUMB2 && TARGET_HARD_FLOAT && TARGET_MAVERICK"
485   "*
486   {
487   switch (which_alternative)
488     {
489     case 0:
490     case 1:
491     case 2:
492       return (output_move_double (operands));
494     case 3: return \"cfmv64lr%?\\t%V0, %Q1\;cfmv64hr%?\\t%V0, %R1\";
495     case 4: return \"cfmvr64l%?\\t%Q0, %V1\;cfmvr64h%?\\t%R0, %V1\";
497     case 5: return \"cfldr64%?\\t%V0, %1\";
498     case 6: return \"cfstr64%?\\t%V1, %0\";
500     /* Shifting by 0 will just copy %1 into %0.  */
501     case 7: return \"cfsh64%?\\t%V0, %V1, #0\";
503     default: abort ();
504     }
505   }"
506   [(set_attr "length"         "  8,   8,     8,   8,     8,     4,     4,     4")
507    (set_attr "type"           "  *,load2,store2,   *,     *,  load2,store2,     *")
508    (set_attr "pool_range"     "  *,4096,     *,   *,     *,  1020,     *,     *")
509    (set_attr "neg_pool_range" "  *,   0,     *,   *,     *,  1008,     *,     *")
510    (set_attr "cirrus"         "not, not,   not,move,normal,double,double,normal")]
513 ;; Cirrus SI values have been outlawed.  Look in arm.h for the comment
514 ;; on HARD_REGNO_MODE_OK.
516 (define_insn "*cirrus_thumb2_movsi_insn"
517   [(set (match_operand:SI 0 "general_operand" "=r,r,r,m,*v,r,*v,T,*v")
518         (match_operand:SI 1 "general_operand" "rI,K,mi,r,r,*v,T,*v,*v"))]
519   "TARGET_THUMB2 && TARGET_HARD_FLOAT && TARGET_MAVERICK && 0
520    && (register_operand (operands[0], SImode)
521        || register_operand (operands[1], SImode))"
522   "@
523    mov%?\\t%0, %1
524    mvn%?\\t%0, #%B1
525    ldr%?\\t%0, %1
526    str%?\\t%1, %0
527    cfmv64lr%?\\t%Z0, %1
528    cfmvr64l%?\\t%0, %Z1
529    cfldr32%?\\t%V0, %1
530    cfstr32%?\\t%V1, %0
531    cfsh32%?\\t%V0, %V1, #0"
532   [(set_attr "type"           "*,  *,  load1,store1,   *,     *,  load1,store1,     *")
533    (set_attr "pool_range"     "*,  *,  4096,     *,   *,     *,  1024,     *,     *")
534    (set_attr "neg_pool_range" "*,  *,     0,     *,   *,     *,  1012,     *,     *")
535    (set_attr "cirrus"         "not,not, not,   not,move,normal,normal,normal,normal")]
538 (define_insn "*thumb2_cirrus_movsf_hard_insn"
539   [(set (match_operand:SF 0 "nonimmediate_operand" "=v,v,v,r,m,r,r,m")
540         (match_operand:SF 1 "general_operand"      "v,mE,r,v,v,r,mE,r"))]
541   "TARGET_THUMB2 && TARGET_HARD_FLOAT && TARGET_MAVERICK
542    && (GET_CODE (operands[0]) != MEM
543        || register_operand (operands[1], SFmode))"
544   "@
545    cfcpys%?\\t%V0, %V1
546    cfldrs%?\\t%V0, %1
547    cfmvsr%?\\t%V0, %1
548    cfmvrs%?\\t%0, %V1
549    cfstrs%?\\t%V1, %0
550    mov%?\\t%0, %1
551    ldr%?\\t%0, %1\\t%@ float
552    str%?\\t%1, %0\\t%@ float"
553   [(set_attr "length"         "     *,     *,   *,     *,     *,  4,   4,     4")
554    (set_attr "type"           "     *,  load1,   *,     *,store1,  *,load1,store1")
555    (set_attr "pool_range"     "     *,   1020,   *,     *,     *,  *,4096,     *")
556    (set_attr "neg_pool_range" "     *,   1008,   *,     *,     *,  *,   0,     *")
557    (set_attr "cirrus"         "normal,normal,move,normal,normal,not, not,   not")]
560 (define_insn "*thumb2_cirrus_movdf_hard_insn"
561   [(set (match_operand:DF 0 "nonimmediate_operand" "=r,Q,r,m,r,v,v,v,r,m")
562         (match_operand:DF 1 "general_operand"       "Q,r,r,r,mF,v,mF,r,v,v"))]
563   "TARGET_THUMB2
564    && TARGET_HARD_FLOAT && TARGET_MAVERICK
565    && (GET_CODE (operands[0]) != MEM
566        || register_operand (operands[1], DFmode))"
567   "*
568   {
569   switch (which_alternative)
570     {
571     case 0: return \"ldm%?ia\\t%m1, %M0\\t%@ double\";
572     case 1: return \"stm%?ia\\t%m0, %M1\\t%@ double\";
573     case 2: case 3: case 4: return output_move_double (operands);
574     case 5: return \"cfcpyd%?\\t%V0, %V1\";
575     case 6: return \"cfldrd%?\\t%V0, %1\";
576     case 7: return \"cfmvdlr\\t%V0, %Q1\;cfmvdhr%?\\t%V0, %R1\";
577     case 8: return \"cfmvrdl%?\\t%Q0, %V1\;cfmvrdh%?\\t%R0, %V1\";
578     case 9: return \"cfstrd%?\\t%V1, %0\";
579     default: abort ();
580     }
581   }"
582   [(set_attr "type"           "load1,store2,  *,store2,load1,     *,  load1,   *,     *,store2")
583    (set_attr "length"         "   4,     4,  8,     8,   8,     4,     4,   8,     8,     4")
584    (set_attr "pool_range"     "   *,     *,  *,     *,4092,     *,  1020,   *,     *,     *")
585    (set_attr "neg_pool_range" "   *,     *,  *,     *,   0,     *,  1008,   *,     *,     *")
586    (set_attr "cirrus"         " not,   not,not,   not, not,normal,double,move,normal,double")]