2003-12-26 Guilhem Lavaux <guilhem@kaffe.org>
[official-gcc.git] / gcc / config / arm / fpa.md
blob3b6efbfbbda36daf1375bcecd8f9fe29770d5573
1 ;;- Machine description for FPA co-processor for ARM cpus.
2 ;;  Copyright 1991, 1993, 1994, 1995, 1996, 1996, 1997, 1998, 1999, 2000,
3 ;;  2001, 2002, 2003  Free Software Foundation, Inc.
4 ;;  Contributed by Pieter `Tiggr' Schoenmakers (rcpieter@win.tue.nl)
5 ;;  and Martin Simmons (@harleqn.co.uk).
6 ;;  More major hacks by Richard Earnshaw (rearnsha@arm.com).
8 ;; This file is part of GCC.
10 ;; GCC is free software; you can redistribute it and/or modify it
11 ;; under the terms of the GNU General Public License as published
12 ;; by the Free Software Foundation; either version 2, or (at your
13 ;; option) any later version.
15 ;; GCC is distributed in the hope that it will be useful, but WITHOUT
16 ;; ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
17 ;; or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public
18 ;; License for more details.
20 ;; You should have received a copy of the GNU General Public License
21 ;; along with GCC; see the file COPYING.  If not, write to
22 ;; the Free Software Foundation, 59 Temple Place - Suite 330,
23 ;; Boston, MA 02111-1307, USA.
25 ;; FPA automaton.
26 (define_automaton "armfp")
28 ;; Floating point unit (FPA)
29 (define_cpu_unit "fpa" "armfp")
31 ; The fpa10 doesn't really have a memory read unit, but it can start
32 ; to speculatively execute the instruction in the pipeline, provided
33 ; the data is already loaded, so pretend reads have a delay of 2 (and
34 ; that the pipeline is infinite).
35 (define_cpu_unit "fpa_mem" "arm")
37 (define_insn_reservation "fdivx" 71
38   (and (eq_attr "fpu" "fpa")
39        (eq_attr "type" "fdivx"))
40   "core+fpa*69")
42 (define_insn_reservation "fdivd" 59
43   (and (eq_attr "fpu" "fpa")
44        (eq_attr "type" "fdivd"))
45   "core+fpa*57")
47 (define_insn_reservation "fdivs" 31
48   (and (eq_attr "fpu" "fpa")
49        (eq_attr "type" "fdivs"))
50   "core+fpa*29")
52 (define_insn_reservation "fmul" 9
53   (and (eq_attr "fpu" "fpa")
54        (eq_attr "type" "fmul"))
55   "core+fpa*7")
57 (define_insn_reservation "ffmul" 6
58   (and (eq_attr "fpu" "fpa")
59        (eq_attr "type" "ffmul"))
60   "core+fpa*4")
62 (define_insn_reservation "farith" 4
63   (and (eq_attr "fpu" "fpa")
64        (eq_attr "type" "farith"))
65   "core+fpa*2")
67 (define_insn_reservation "ffarith" 2
68   (and (eq_attr "fpu" "fpa")
69        (eq_attr "type" "ffarith"))
70   "core+fpa*2")
72 (define_insn_reservation "r_2_f" 5
73   (and (eq_attr "fpu" "fpa")
74        (eq_attr "type" "r_2_f"))
75   "core+fpa*3")
77 (define_insn_reservation "f_2_r" 1
78   (and (eq_attr "fpu" "fpa")
79        (eq_attr "type" "f_2_r"))
80   "core+fpa*2")
82 (define_insn_reservation "f_load" 3
83   (and (eq_attr "fpu" "fpa") (eq_attr "type" "f_load"))
84   "fpa_mem+core*3")
86 (define_insn_reservation "f_store" 4
87   (and (eq_attr "fpu" "fpa") (eq_attr "type" "f_store"))
88   "core*4")
90 (define_insn_reservation "r_mem_f" 6
91   (and (eq_attr "model_wbuf" "no")
92     (and (eq_attr "fpu" "fpa") (eq_attr "type" "r_mem_f")))
93   "core*6")
95 (define_insn_reservation "f_mem_r" 7
96   (and (eq_attr "fpu" "fpa") (eq_attr "type" "f_mem_r"))
97   "core*7")
100 (define_insn "*addsf3_fpa"
101   [(set (match_operand:SF          0 "s_register_operand" "=f,f")
102         (plus:SF (match_operand:SF 1 "s_register_operand" "%f,f")
103                  (match_operand:SF 2 "fpa_add_operand"    "fG,H")))]
104   "TARGET_ARM && TARGET_HARD_FLOAT"
105   "@
106    adf%?s\\t%0, %1, %2
107    suf%?s\\t%0, %1, #%N2"
108   [(set_attr "type" "farith")
109    (set_attr "predicable" "yes")]
112 (define_insn "*adddf3_fpa"
113   [(set (match_operand:DF          0 "s_register_operand" "=f,f")
114         (plus:DF (match_operand:DF 1 "s_register_operand" "%f,f")
115                  (match_operand:DF 2 "fpa_add_operand"    "fG,H")))]
116   "TARGET_ARM && TARGET_HARD_FLOAT"
117   "@
118    adf%?d\\t%0, %1, %2
119    suf%?d\\t%0, %1, #%N2"
120   [(set_attr "type" "farith")
121    (set_attr "predicable" "yes")]
124 (define_insn "*adddf_esfdf_df_fpa"
125   [(set (match_operand:DF           0 "s_register_operand" "=f,f")
126         (plus:DF (float_extend:DF
127                   (match_operand:SF 1 "s_register_operand"  "f,f"))
128                  (match_operand:DF  2 "fpa_add_operand"    "fG,H")))]
129   "TARGET_ARM && TARGET_HARD_FLOAT"
130   "@
131    adf%?d\\t%0, %1, %2
132    suf%?d\\t%0, %1, #%N2"
133   [(set_attr "type" "farith")
134    (set_attr "predicable" "yes")]
137 (define_insn "*adddf_df_esfdf_fpa"
138   [(set (match_operand:DF           0 "s_register_operand" "=f")
139         (plus:DF (match_operand:DF  1 "s_register_operand"  "f")
140                  (float_extend:DF
141                   (match_operand:SF 2 "s_register_operand"  "f"))))]
142   "TARGET_ARM && TARGET_HARD_FLOAT"
143   "adf%?d\\t%0, %1, %2"
144   [(set_attr "type" "farith")
145    (set_attr "predicable" "yes")]
148 (define_insn "*adddf_esfdf_esfdf_fpa"
149   [(set (match_operand:DF           0 "s_register_operand" "=f")
150         (plus:DF (float_extend:DF 
151                   (match_operand:SF 1 "s_register_operand" "f"))
152                  (float_extend:DF
153                   (match_operand:SF 2 "s_register_operand" "f"))))]
154   "TARGET_ARM && TARGET_HARD_FLOAT"
155   "adf%?d\\t%0, %1, %2"
156   [(set_attr "type" "farith")
157    (set_attr "predicable" "yes")]
160 (define_insn "*subsf3_fpa"
161   [(set (match_operand:SF 0 "s_register_operand" "=f,f")
162         (minus:SF (match_operand:SF 1 "fpa_rhs_operand" "f,G")
163                   (match_operand:SF 2 "fpa_rhs_operand" "fG,f")))]
164   "TARGET_ARM && TARGET_HARD_FLOAT"
165   "@
166    suf%?s\\t%0, %1, %2
167    rsf%?s\\t%0, %2, %1"
168   [(set_attr "type" "farith")]
171 (define_insn "*subdf3_fpa"
172   [(set (match_operand:DF           0 "s_register_operand" "=f,f")
173         (minus:DF (match_operand:DF 1 "fpa_rhs_operand"     "f,G")
174                   (match_operand:DF 2 "fpa_rhs_operand"    "fG,f")))]
175   "TARGET_ARM && TARGET_HARD_FLOAT"
176   "@
177    suf%?d\\t%0, %1, %2
178    rsf%?d\\t%0, %2, %1"
179   [(set_attr "type" "farith")
180    (set_attr "predicable" "yes")]
183 (define_insn "*subdf_esfdf_df_fpa"
184   [(set (match_operand:DF            0 "s_register_operand" "=f")
185         (minus:DF (float_extend:DF
186                    (match_operand:SF 1 "s_register_operand"  "f"))
187                   (match_operand:DF  2 "fpa_rhs_operand"    "fG")))]
188   "TARGET_ARM && TARGET_HARD_FLOAT"
189   "suf%?d\\t%0, %1, %2"
190   [(set_attr "type" "farith")
191    (set_attr "predicable" "yes")]
194 (define_insn "*subdf_df_esfdf_fpa"
195   [(set (match_operand:DF 0 "s_register_operand" "=f,f")
196         (minus:DF (match_operand:DF 1 "fpa_rhs_operand" "f,G")
197                   (float_extend:DF
198                    (match_operand:SF 2 "s_register_operand" "f,f"))))]
199   "TARGET_ARM && TARGET_HARD_FLOAT"
200   "@
201    suf%?d\\t%0, %1, %2
202    rsf%?d\\t%0, %2, %1"
203   [(set_attr "type" "farith")
204    (set_attr "predicable" "yes")]
207 (define_insn "*subdf_esfdf_esfdf_fpa"
208   [(set (match_operand:DF 0 "s_register_operand" "=f")
209         (minus:DF (float_extend:DF
210                    (match_operand:SF 1 "s_register_operand" "f"))
211                   (float_extend:DF
212                    (match_operand:SF 2 "s_register_operand" "f"))))]
213   "TARGET_ARM && TARGET_HARD_FLOAT"
214   "suf%?d\\t%0, %1, %2"
215   [(set_attr "type" "farith")
216    (set_attr "predicable" "yes")]
219 (define_insn "*mulsf3_fpa"
220   [(set (match_operand:SF 0 "s_register_operand" "=f")
221         (mult:SF (match_operand:SF 1 "s_register_operand" "f")
222                  (match_operand:SF 2 "fpa_rhs_operand" "fG")))]
223   "TARGET_ARM && TARGET_HARD_FLOAT"
224   "fml%?s\\t%0, %1, %2"
225   [(set_attr "type" "ffmul")
226    (set_attr "predicable" "yes")]
229 (define_insn "*muldf3_fpa"
230   [(set (match_operand:DF 0 "s_register_operand" "=f")
231         (mult:DF (match_operand:DF 1 "s_register_operand" "f")
232                  (match_operand:DF 2 "fpa_rhs_operand" "fG")))]
233   "TARGET_ARM && TARGET_HARD_FLOAT"
234   "muf%?d\\t%0, %1, %2"
235   [(set_attr "type" "fmul")
236    (set_attr "predicable" "yes")]
239 (define_insn "*muldf_esfdf_df_fpa"
240   [(set (match_operand:DF 0 "s_register_operand" "=f")
241         (mult:DF (float_extend:DF
242                   (match_operand:SF 1 "s_register_operand" "f"))
243                  (match_operand:DF 2 "fpa_rhs_operand" "fG")))]
244   "TARGET_ARM && TARGET_HARD_FLOAT"
245   "muf%?d\\t%0, %1, %2"
246   [(set_attr "type" "fmul")
247    (set_attr "predicable" "yes")]
250 (define_insn "*muldf_df_esfdf_fpa"
251   [(set (match_operand:DF 0 "s_register_operand" "=f")
252         (mult:DF (match_operand:DF 1 "s_register_operand" "f")
253                  (float_extend:DF
254                   (match_operand:SF 2 "s_register_operand" "f"))))]
255   "TARGET_ARM && TARGET_HARD_FLOAT"
256   "muf%?d\\t%0, %1, %2"
257   [(set_attr "type" "fmul")
258    (set_attr "predicable" "yes")]
261 (define_insn "*muldf_esfdf_esfdf_fpa"
262   [(set (match_operand:DF 0 "s_register_operand" "=f")
263         (mult:DF
264          (float_extend:DF (match_operand:SF 1 "s_register_operand" "f"))
265          (float_extend:DF (match_operand:SF 2 "s_register_operand" "f"))))]
266   "TARGET_ARM && TARGET_HARD_FLOAT"
267   "muf%?d\\t%0, %1, %2"
268   [(set_attr "type" "fmul")
269    (set_attr "predicable" "yes")]
272 ;; Division insns
274 (define_insn "*divsf3_fpa"
275   [(set (match_operand:SF 0 "s_register_operand" "=f,f")
276         (div:SF (match_operand:SF 1 "fpa_rhs_operand" "f,G")
277                 (match_operand:SF 2 "fpa_rhs_operand" "fG,f")))]
278   "TARGET_ARM && TARGET_HARD_FLOAT"
279   "@
280    fdv%?s\\t%0, %1, %2
281    frd%?s\\t%0, %2, %1"
282   [(set_attr "type" "fdivs")
283    (set_attr "predicable" "yes")]
286 (define_insn "*divdf3_fpa"
287   [(set (match_operand:DF 0 "s_register_operand" "=f,f")
288         (div:DF (match_operand:DF 1 "fpa_rhs_operand" "f,G")
289                 (match_operand:DF 2 "fpa_rhs_operand" "fG,f")))]
290   "TARGET_ARM && TARGET_HARD_FLOAT"
291   "@
292    dvf%?d\\t%0, %1, %2
293    rdf%?d\\t%0, %2, %1"
294   [(set_attr "type" "fdivd")
295    (set_attr "predicable" "yes")]
298 (define_insn "*divdf_esfdf_df_fpa"
299   [(set (match_operand:DF 0 "s_register_operand" "=f")
300         (div:DF (float_extend:DF
301                  (match_operand:SF 1 "s_register_operand" "f"))
302                 (match_operand:DF 2 "fpa_rhs_operand" "fG")))]
303   "TARGET_ARM && TARGET_HARD_FLOAT"
304   "dvf%?d\\t%0, %1, %2"
305   [(set_attr "type" "fdivd")
306    (set_attr "predicable" "yes")]
309 (define_insn "*divdf_df_esfdf_fpa"
310   [(set (match_operand:DF 0 "s_register_operand" "=f")
311         (div:DF (match_operand:DF 1 "fpa_rhs_operand" "fG")
312                 (float_extend:DF
313                  (match_operand:SF 2 "s_register_operand" "f"))))]
314   "TARGET_ARM && TARGET_HARD_FLOAT"
315   "rdf%?d\\t%0, %2, %1"
316   [(set_attr "type" "fdivd")
317    (set_attr "predicable" "yes")]
320 (define_insn "*divdf_esfdf_esfdf_fpa"
321   [(set (match_operand:DF 0 "s_register_operand" "=f")
322         (div:DF (float_extend:DF
323                  (match_operand:SF 1 "s_register_operand" "f"))
324                 (float_extend:DF
325                  (match_operand:SF 2 "s_register_operand" "f"))))]
326   "TARGET_ARM && TARGET_HARD_FLOAT"
327   "dvf%?d\\t%0, %1, %2"
328   [(set_attr "type" "fdivd")
329    (set_attr "predicable" "yes")]
332 (define_insn "*modsf3_fpa"
333   [(set (match_operand:SF 0 "s_register_operand" "=f")
334         (mod:SF (match_operand:SF 1 "s_register_operand" "f")
335                 (match_operand:SF 2 "fpa_rhs_operand" "fG")))]
336   "TARGET_ARM && TARGET_HARD_FLOAT"
337   "rmf%?s\\t%0, %1, %2"
338   [(set_attr "type" "fdivs")
339    (set_attr "predicable" "yes")]
342 (define_insn "*moddf3_fpa"
343   [(set (match_operand:DF 0 "s_register_operand" "=f")
344         (mod:DF (match_operand:DF 1 "s_register_operand" "f")
345                 (match_operand:DF 2 "fpa_rhs_operand" "fG")))]
346   "TARGET_ARM && TARGET_HARD_FLOAT"
347   "rmf%?d\\t%0, %1, %2"
348   [(set_attr "type" "fdivd")
349    (set_attr "predicable" "yes")]
352 (define_insn "*moddf_esfdf_df_fpa"
353   [(set (match_operand:DF 0 "s_register_operand" "=f")
354         (mod:DF (float_extend:DF
355                  (match_operand:SF 1 "s_register_operand" "f"))
356                 (match_operand:DF 2 "fpa_rhs_operand" "fG")))]
357   "TARGET_ARM && TARGET_HARD_FLOAT"
358   "rmf%?d\\t%0, %1, %2"
359   [(set_attr "type" "fdivd")
360    (set_attr "predicable" "yes")]
363 (define_insn "*moddf_df_esfdf_fpa"
364   [(set (match_operand:DF 0 "s_register_operand" "=f")
365         (mod:DF (match_operand:DF 1 "s_register_operand" "f")
366                 (float_extend:DF
367                  (match_operand:SF 2 "s_register_operand" "f"))))]
368   "TARGET_ARM && TARGET_HARD_FLOAT"
369   "rmf%?d\\t%0, %1, %2"
370   [(set_attr "type" "fdivd")
371    (set_attr "predicable" "yes")]
374 (define_insn "*moddf_esfdf_esfdf_fpa"
375   [(set (match_operand:DF 0 "s_register_operand" "=f")
376         (mod:DF (float_extend:DF
377                  (match_operand:SF 1 "s_register_operand" "f"))
378                 (float_extend:DF
379                  (match_operand:SF 2 "s_register_operand" "f"))))]
380   "TARGET_ARM && TARGET_HARD_FLOAT"
381   "rmf%?d\\t%0, %1, %2"
382   [(set_attr "type" "fdivd")
383    (set_attr "predicable" "yes")]
386 (define_insn "*negsf2_fpa"
387   [(set (match_operand:SF         0 "s_register_operand" "=f")
388         (neg:SF (match_operand:SF 1 "s_register_operand" "f")))]
389   "TARGET_ARM && TARGET_HARD_FLOAT"
390   "mnf%?s\\t%0, %1"
391   [(set_attr "type" "ffarith")
392    (set_attr "predicable" "yes")]
395 (define_insn "*negdf2_fpa"
396   [(set (match_operand:DF         0 "s_register_operand" "=f")
397         (neg:DF (match_operand:DF 1 "s_register_operand" "f")))]
398   "TARGET_ARM && TARGET_HARD_FLOAT"
399   "mnf%?d\\t%0, %1"
400   [(set_attr "type" "ffarith")
401    (set_attr "predicable" "yes")]
404 (define_insn "*negdf_esfdf_fpa"
405   [(set (match_operand:DF 0 "s_register_operand" "=f")
406         (neg:DF (float_extend:DF
407                  (match_operand:SF 1 "s_register_operand" "f"))))]
408   "TARGET_ARM && TARGET_HARD_FLOAT"
409   "mnf%?d\\t%0, %1"
410   [(set_attr "type" "ffarith")
411    (set_attr "predicable" "yes")]
414 (define_insn "*abssf2_fpa"
415   [(set (match_operand:SF          0 "s_register_operand" "=f")
416          (abs:SF (match_operand:SF 1 "s_register_operand" "f")))]
417   "TARGET_ARM && TARGET_HARD_FLOAT"
418   "abs%?s\\t%0, %1"
419   [(set_attr "type" "ffarith")
420    (set_attr "predicable" "yes")]
423 (define_insn "*absdf2_fpa"
424   [(set (match_operand:DF         0 "s_register_operand" "=f")
425         (abs:DF (match_operand:DF 1 "s_register_operand" "f")))]
426   "TARGET_ARM && TARGET_HARD_FLOAT"
427   "abs%?d\\t%0, %1"
428   [(set_attr "type" "ffarith")
429    (set_attr "predicable" "yes")]
432 (define_insn "*absdf_esfdf_fpa"
433   [(set (match_operand:DF 0 "s_register_operand" "=f")
434         (abs:DF (float_extend:DF
435                  (match_operand:SF 1 "s_register_operand" "f"))))]
436   "TARGET_ARM && TARGET_HARD_FLOAT"
437   "abs%?d\\t%0, %1"
438   [(set_attr "type" "ffarith")
439    (set_attr "predicable" "yes")]
442 (define_insn "*sqrtsf2_fpa"
443   [(set (match_operand:SF 0 "s_register_operand" "=f")
444         (sqrt:SF (match_operand:SF 1 "s_register_operand" "f")))]
445   "TARGET_ARM && TARGET_HARD_FLOAT"
446   "sqt%?s\\t%0, %1"
447   [(set_attr "type" "float_em")
448    (set_attr "predicable" "yes")]
451 (define_insn "*sqrtdf2_fpa"
452   [(set (match_operand:DF 0 "s_register_operand" "=f")
453         (sqrt:DF (match_operand:DF 1 "s_register_operand" "f")))]
454   "TARGET_ARM && TARGET_HARD_FLOAT"
455   "sqt%?d\\t%0, %1"
456   [(set_attr "type" "float_em")
457    (set_attr "predicable" "yes")]
460 (define_insn "*sqrtdf_esfdf_fpa"
461   [(set (match_operand:DF 0 "s_register_operand" "=f")
462         (sqrt:DF (float_extend:DF
463                   (match_operand:SF 1 "s_register_operand" "f"))))]
464   "TARGET_ARM && TARGET_HARD_FLOAT"
465   "sqt%?d\\t%0, %1"
466   [(set_attr "type" "float_em")
467    (set_attr "predicable" "yes")]
470 (define_insn "*floatsisf2_fpa"
471   [(set (match_operand:SF           0 "s_register_operand" "=f")
472         (float:SF (match_operand:SI 1 "s_register_operand" "r")))]
473   "TARGET_ARM && TARGET_HARD_FLOAT"
474   "flt%?s\\t%0, %1"
475   [(set_attr "type" "r_2_f")
476    (set_attr "predicable" "yes")]
479 (define_insn "*floatsidf2_fpa"
480   [(set (match_operand:DF           0 "s_register_operand" "=f")
481         (float:DF (match_operand:SI 1 "s_register_operand" "r")))]
482   "TARGET_ARM && TARGET_HARD_FLOAT"
483   "flt%?d\\t%0, %1"
484   [(set_attr "type" "r_2_f")
485    (set_attr "predicable" "yes")]
488 (define_insn "*fix_truncsfsi2_fpa"
489   [(set (match_operand:SI         0 "s_register_operand" "=r")
490         (fix:SI (fix:SF (match_operand:SF 1 "s_register_operand" "f"))))]
491   "TARGET_ARM && TARGET_HARD_FLOAT"
492   "fix%?z\\t%0, %1"
493   [(set_attr "type" "f_2_r")
494    (set_attr "predicable" "yes")]
497 (define_insn "*fix_truncdfsi2_fpa"
498   [(set (match_operand:SI         0 "s_register_operand" "=r")
499         (fix:SI (fix:DF (match_operand:DF 1 "s_register_operand" "f"))))]
500   "TARGET_ARM && TARGET_HARD_FLOAT"
501   "fix%?z\\t%0, %1"
502   [(set_attr "type" "f_2_r")
503    (set_attr "predicable" "yes")]
506 (define_insn "*truncdfsf2_fpa"
507   [(set (match_operand:SF 0 "s_register_operand" "=f")
508         (float_truncate:SF
509          (match_operand:DF 1 "s_register_operand" "f")))]
510   "TARGET_ARM && TARGET_HARD_FLOAT"
511   "mvf%?s\\t%0, %1"
512   [(set_attr "type" "ffarith")
513    (set_attr "predicable" "yes")]
516 (define_insn "*extendsfdf2_fpa"
517   [(set (match_operand:DF                  0 "s_register_operand" "=f")
518         (float_extend:DF (match_operand:SF 1 "s_register_operand"  "f")))]
519   "TARGET_ARM && TARGET_HARD_FLOAT"
520   "mvf%?d\\t%0, %1"
521   [(set_attr "type" "ffarith")
522    (set_attr "predicable" "yes")]
525 (define_insn "*movsf_fpa"
526   [(set (match_operand:SF 0 "nonimmediate_operand" "=f,f,f, m,f,r,r,r, m")
527         (match_operand:SF 1 "general_operand"      "fG,H,mE,f,r,f,r,mE,r"))]
528   "TARGET_ARM
529    && TARGET_HARD_FLOAT
530    && (GET_CODE (operands[0]) != MEM
531        || register_operand (operands[1], SFmode))"
532   "@
533    mvf%?s\\t%0, %1
534    mnf%?s\\t%0, #%N1
535    ldf%?s\\t%0, %1
536    stf%?s\\t%1, %0
537    str%?\\t%1, [%|sp, #-4]!\;ldf%?s\\t%0, [%|sp], #4
538    stf%?s\\t%1, [%|sp, #-4]!\;ldr%?\\t%0, [%|sp], #4
539    mov%?\\t%0, %1
540    ldr%?\\t%0, %1\\t%@ float
541    str%?\\t%1, %0\\t%@ float"
542   [(set_attr "length" "4,4,4,4,8,8,4,4,4")
543    (set_attr "predicable" "yes")
544    (set_attr "type"
545          "ffarith,ffarith,f_load,f_store,r_mem_f,f_mem_r,*,load,store1")
546    (set_attr "pool_range" "*,*,1024,*,*,*,*,4096,*")
547    (set_attr "neg_pool_range" "*,*,1012,*,*,*,*,4084,*")]
550 (define_insn "*movdf_fpa"
551   [(set (match_operand:DF 0 "nonimmediate_operand"
552                                                 "=r,Q,r,m,r, f, f,f, m,!f,!r")
553         (match_operand:DF 1 "general_operand"
554                                                 "Q, r,r,r,mF,fG,H,mF,f,r, f"))]
555   "TARGET_ARM
556    && TARGET_HARD_FLOAT
557    && (GET_CODE (operands[0]) != MEM
558        || register_operand (operands[1], DFmode))"
559   "*
560   {
561   switch (which_alternative)
562     {
563     default:
564     case 0: return \"ldm%?ia\\t%m1, %M0\\t%@ double\";
565     case 1: return \"stm%?ia\\t%m0, %M1\\t%@ double\";
566     case 2: case 3: case 4: return output_move_double (operands);
567     case 5: return \"mvf%?d\\t%0, %1\";
568     case 6: return \"mnf%?d\\t%0, #%N1\";
569     case 7: return \"ldf%?d\\t%0, %1\";
570     case 8: return \"stf%?d\\t%1, %0\";
571     case 9: return output_mov_double_fpa_from_arm (operands);
572     case 10: return output_mov_double_arm_from_fpa (operands);
573     }
574   }
575   "
576   [(set_attr "length" "4,4,8,8,8,4,4,4,4,8,8")
577    (set_attr "predicable" "yes")
578    (set_attr "type"
579     "load,store2,*,store2,load,ffarith,ffarith,f_load,f_store,r_mem_f,f_mem_r")
580    (set_attr "pool_range" "*,*,*,*,1020,*,*,1024,*,*,*")
581    (set_attr "neg_pool_range" "*,*,*,*,1008,*,*,1008,*,*,*")]
584 ;; Saving and restoring the floating point registers in the prologue should
585 ;; be done in XFmode, even though we don't support that for anything else
586 ;; (Well, strictly it's 'internal representation', but that's effectively
587 ;; XFmode).
589 (define_insn "*movxf_fpa"
590   [(set (match_operand:XF 0 "nonimmediate_operand" "=f,f,f,m,f,r,r")
591         (match_operand:XF 1 "general_operand" "fG,H,m,f,r,f,r"))]
592   "TARGET_ARM && TARGET_HARD_FLOAT && reload_completed"
593   "*
594   switch (which_alternative)
595     {
596     default:
597     case 0: return \"mvf%?e\\t%0, %1\";
598     case 1: return \"mnf%?e\\t%0, #%N1\";
599     case 2: return \"ldf%?e\\t%0, %1\";
600     case 3: return \"stf%?e\\t%1, %0\";
601     case 4: return output_mov_long_double_fpa_from_arm (operands);
602     case 5: return output_mov_long_double_arm_from_fpa (operands);
603     case 6: return output_mov_long_double_arm_from_arm (operands);
604     }
605   "
606   [(set_attr "length" "4,4,4,4,8,8,12")
607    (set_attr "predicable" "yes")
608    (set_attr "type" "ffarith,ffarith,f_load,f_store,r_mem_f,f_mem_r,*")
609    (set_attr "pool_range" "*,*,1024,*,*,*,*")
610    (set_attr "neg_pool_range" "*,*,1004,*,*,*,*")]
613 (define_insn "*cmpsf_fpa"
614   [(set (reg:CCFP CC_REGNUM)
615         (compare:CCFP (match_operand:SF 0 "s_register_operand" "f,f")
616                       (match_operand:SF 1 "fpa_add_operand" "fG,H")))]
617   "TARGET_ARM && TARGET_HARD_FLOAT"
618   "@
619    cmf%?\\t%0, %1
620    cnf%?\\t%0, #%N1"
621   [(set_attr "conds" "set")
622    (set_attr "type" "f_2_r")]
625 (define_insn "*cmpdf_fpa"
626   [(set (reg:CCFP CC_REGNUM)
627         (compare:CCFP (match_operand:DF 0 "s_register_operand" "f,f")
628                       (match_operand:DF 1 "fpa_add_operand" "fG,H")))]
629   "TARGET_ARM && TARGET_HARD_FLOAT"
630   "@
631    cmf%?\\t%0, %1
632    cnf%?\\t%0, #%N1"
633   [(set_attr "conds" "set")
634    (set_attr "type" "f_2_r")]
637 (define_insn "*cmpesfdf_df_fpa"
638   [(set (reg:CCFP CC_REGNUM)
639         (compare:CCFP (float_extend:DF
640                        (match_operand:SF 0 "s_register_operand" "f,f"))
641                       (match_operand:DF 1 "fpa_add_operand" "fG,H")))]
642   "TARGET_ARM && TARGET_HARD_FLOAT"
643   "@
644    cmf%?\\t%0, %1
645    cnf%?\\t%0, #%N1"
646   [(set_attr "conds" "set")
647    (set_attr "type" "f_2_r")]
650 (define_insn "*cmpdf_esfdf_fpa"
651   [(set (reg:CCFP CC_REGNUM)
652         (compare:CCFP (match_operand:DF 0 "s_register_operand" "f")
653                       (float_extend:DF
654                        (match_operand:SF 1 "s_register_operand" "f"))))]
655   "TARGET_ARM && TARGET_HARD_FLOAT"
656   "cmf%?\\t%0, %1"
657   [(set_attr "conds" "set")
658    (set_attr "type" "f_2_r")]
661 (define_insn "*cmpsf_trap_fpa"
662   [(set (reg:CCFPE CC_REGNUM)
663         (compare:CCFPE (match_operand:SF 0 "s_register_operand" "f,f")
664                        (match_operand:SF 1 "fpa_add_operand" "fG,H")))]
665   "TARGET_ARM && TARGET_HARD_FLOAT"
666   "@
667    cmf%?e\\t%0, %1
668    cnf%?e\\t%0, #%N1"
669   [(set_attr "conds" "set")
670    (set_attr "type" "f_2_r")]
673 (define_insn "*cmpdf_trap_fpa"
674   [(set (reg:CCFPE CC_REGNUM)
675         (compare:CCFPE (match_operand:DF 0 "s_register_operand" "f,f")
676                        (match_operand:DF 1 "fpa_add_operand" "fG,H")))]
677   "TARGET_ARM && TARGET_HARD_FLOAT"
678   "@
679    cmf%?e\\t%0, %1
680    cnf%?e\\t%0, #%N1"
681   [(set_attr "conds" "set")
682    (set_attr "type" "f_2_r")]
685 (define_insn "*cmp_esfdf_df_trap_fpa"
686   [(set (reg:CCFPE CC_REGNUM)
687         (compare:CCFPE (float_extend:DF
688                         (match_operand:SF 0 "s_register_operand" "f,f"))
689                        (match_operand:DF 1 "fpa_add_operand" "fG,H")))]
690   "TARGET_ARM && TARGET_HARD_FLOAT"
691   "@
692    cmf%?e\\t%0, %1
693    cnf%?e\\t%0, #%N1"
694   [(set_attr "conds" "set")
695    (set_attr "type" "f_2_r")]
698 (define_insn "*cmp_df_esfdf_trap_fpa"
699   [(set (reg:CCFPE CC_REGNUM)
700         (compare:CCFPE (match_operand:DF 0 "s_register_operand" "f")
701                        (float_extend:DF
702                         (match_operand:SF 1 "s_register_operand" "f"))))]
703   "TARGET_ARM && TARGET_HARD_FLOAT"
704   "cmf%?e\\t%0, %1"
705   [(set_attr "conds" "set")
706    (set_attr "type" "f_2_r")]
709 (define_insn "*movsfcc_fpa"
710   [(set (match_operand:SF 0 "s_register_operand" "=f,f,f,f,f,f,f,f")
711         (if_then_else:SF
712          (match_operator 3 "arm_comparison_operator" 
713           [(match_operand 4 "cc_register" "") (const_int 0)])
714          (match_operand:SF 1 "fpa_add_operand" "0,0,fG,H,fG,fG,H,H")
715          (match_operand:SF 2 "fpa_add_operand" "fG,H,0,0,fG,H,fG,H")))]
716   "TARGET_ARM && TARGET_HARD_FLOAT"
717   "@
718    mvf%D3s\\t%0, %2
719    mnf%D3s\\t%0, #%N2
720    mvf%d3s\\t%0, %1
721    mnf%d3s\\t%0, #%N1
722    mvf%d3s\\t%0, %1\;mvf%D3s\\t%0, %2
723    mvf%d3s\\t%0, %1\;mnf%D3s\\t%0, #%N2
724    mnf%d3s\\t%0, #%N1\;mvf%D3s\\t%0, %2
725    mnf%d3s\\t%0, #%N1\;mnf%D3s\\t%0, #%N2"
726   [(set_attr "length" "4,4,4,4,8,8,8,8")
727    (set_attr "type" "ffarith")
728    (set_attr "conds" "use")]
731 (define_insn "*movdfcc_fpa"
732   [(set (match_operand:DF 0 "s_register_operand" "=f,f,f,f,f,f,f,f")
733         (if_then_else:DF
734          (match_operator 3 "arm_comparison_operator"
735           [(match_operand 4 "cc_register" "") (const_int 0)])
736          (match_operand:DF 1 "fpa_add_operand" "0,0,fG,H,fG,fG,H,H")
737          (match_operand:DF 2 "fpa_add_operand" "fG,H,0,0,fG,H,fG,H")))]
738   "TARGET_ARM && TARGET_HARD_FLOAT"
739   "@
740    mvf%D3d\\t%0, %2
741    mnf%D3d\\t%0, #%N2
742    mvf%d3d\\t%0, %1
743    mnf%d3d\\t%0, #%N1
744    mvf%d3d\\t%0, %1\;mvf%D3d\\t%0, %2
745    mvf%d3d\\t%0, %1\;mnf%D3d\\t%0, #%N2
746    mnf%d3d\\t%0, #%N1\;mvf%D3d\\t%0, %2
747    mnf%d3d\\t%0, #%N1\;mnf%D3d\\t%0, #%N2"
748   [(set_attr "length" "4,4,4,4,8,8,8,8")
749    (set_attr "type" "ffarith")
750    (set_attr "conds" "use")]