1132718Skan;; Cirrus EP9312 "Maverick" ARM floating point co-processor description.
2169689Skan;; Copyright (C) 2003, 2004, 2005 Free Software Foundation, Inc.
3132718Skan;; Contributed by Red Hat.
4132718Skan;; Written by Aldy Hernandez (aldyh@redhat.com)
5132718Skan
6132718Skan;; This file is part of GCC.
7132718Skan
8132718Skan;; GCC is free software; you can redistribute it and/or modify
9132718Skan;; it under the terms of the GNU General Public License as published by
10132718Skan;; the Free Software Foundation; either version 2, or (at your option)
11132718Skan;; any later version.
12132718Skan
13132718Skan;; GCC is distributed in the hope that it will be useful,
14132718Skan;; but WITHOUT ANY WARRANTY; without even the implied warranty of
15132718Skan;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16132718Skan;; GNU General Public License for more details.
17132718Skan
18132718Skan;; You should have received a copy of the GNU General Public License
19132718Skan;; along with GCC; see the file COPYING.  If not, write to
20169689Skan;; the Free Software Foundation, 51 Franklin Street, Fifth Floor,
21169689Skan;; Boston, MA 02110-1301, USA.
22132718Skan
23132718Skan
24132718Skan; Cirrus types for invalid insn combinations
25132718Skan; not		Not a cirrus insn
26132718Skan; normal	Any Cirrus insn not covered by the special cases below
27132718Skan; double	cfldrd, cfldr64, cfstrd, cfstr64
28132718Skan; compare	cfcmps, cfcmpd, cfcmp32, cfcmp64
29132718Skan; move		cfmvdlr, cfmvdhr, cfmvsr, cfmv64lr, cfmv64hr
30132718Skan(define_attr "cirrus" "not,normal,double,compare,move" (const_string "not"))
31132718Skan
32132718Skan
33132718Skan(define_insn "cirrus_adddi3"
34132718Skan  [(set (match_operand:DI          0 "cirrus_fp_register" "=v")
35132718Skan	(plus:DI (match_operand:DI 1 "cirrus_fp_register"  "v")
36132718Skan		 (match_operand:DI 2 "cirrus_fp_register"  "v")))]
37169689Skan  "TARGET_ARM && TARGET_HARD_FLOAT && TARGET_MAVERICK"
38132718Skan  "cfadd64%?\\t%V0, %V1, %V2"
39132718Skan  [(set_attr "type" "mav_farith")
40132718Skan   (set_attr "cirrus" "normal")]
41132718Skan)
42132718Skan
43132718Skan(define_insn "*cirrus_addsi3"
44132718Skan  [(set (match_operand:SI          0 "cirrus_fp_register" "=v")
45132718Skan	(plus:SI (match_operand:SI 1 "cirrus_fp_register" "v")
46132718Skan		 (match_operand:SI 2 "cirrus_fp_register" "v")))]
47169689Skan  "TARGET_ARM && TARGET_HARD_FLOAT && TARGET_MAVERICK && 0"
48132718Skan  "cfadd32%?\\t%V0, %V1, %V2"
49132718Skan  [(set_attr "type" "mav_farith")
50132718Skan   (set_attr "cirrus" "normal")]
51132718Skan)
52132718Skan
53132718Skan(define_insn "*cirrus_addsf3"
54132718Skan  [(set (match_operand:SF          0 "cirrus_fp_register" "=v")
55132718Skan	(plus:SF (match_operand:SF 1 "cirrus_fp_register" "v")
56132718Skan		 (match_operand:SF 2 "cirrus_fp_register" "v")))]
57169689Skan  "TARGET_ARM && TARGET_HARD_FLOAT && TARGET_MAVERICK"
58132718Skan  "cfadds%?\\t%V0, %V1, %V2"
59132718Skan  [(set_attr "type" "mav_farith")
60132718Skan   (set_attr "cirrus" "normal")]
61132718Skan)
62132718Skan
63132718Skan(define_insn "*cirrus_adddf3"
64132718Skan  [(set (match_operand:DF          0 "cirrus_fp_register" "=v")
65132718Skan	(plus:DF (match_operand:DF 1 "cirrus_fp_register" "v")
66132718Skan		 (match_operand:DF 2 "cirrus_fp_register" "v")))]
67169689Skan  "TARGET_ARM && TARGET_HARD_FLOAT && TARGET_MAVERICK"
68132718Skan  "cfaddd%?\\t%V0, %V1, %V2"
69132718Skan  [(set_attr "type" "mav_farith")
70132718Skan   (set_attr "cirrus" "normal")]
71132718Skan)
72132718Skan
73132718Skan(define_insn "cirrus_subdi3"
74132718Skan  [(set (match_operand:DI           0 "cirrus_fp_register" "=v")
75132718Skan	(minus:DI (match_operand:DI 1 "cirrus_fp_register"  "v")
76132718Skan		  (match_operand:DI 2 "cirrus_fp_register"  "v")))]
77169689Skan  "TARGET_ARM && TARGET_HARD_FLOAT && TARGET_MAVERICK"
78132718Skan  "cfsub64%?\\t%V0, %V1, %V2"
79132718Skan  [(set_attr "type" "mav_farith")
80132718Skan   (set_attr "cirrus" "normal")]
81132718Skan)
82132718Skan
83132718Skan(define_insn "*cirrus_subsi3_insn"
84132718Skan  [(set (match_operand:SI           0 "cirrus_fp_register" "=v")
85132718Skan	(minus:SI (match_operand:SI 1 "cirrus_fp_register" "v")
86132718Skan		  (match_operand:SI 2 "cirrus_fp_register" "v")))]
87169689Skan  "TARGET_ARM && TARGET_HARD_FLOAT && TARGET_MAVERICK && 0"
88132718Skan  "cfsub32%?\\t%V0, %V1, %V2"
89132718Skan  [(set_attr "type" "mav_farith")
90132718Skan   (set_attr "cirrus" "normal")]
91132718Skan)
92132718Skan
93132718Skan(define_insn "*cirrus_subsf3"
94132718Skan  [(set (match_operand:SF           0 "cirrus_fp_register" "=v")
95132718Skan	(minus:SF (match_operand:SF 1 "cirrus_fp_register"  "v")
96132718Skan		  (match_operand:SF 2 "cirrus_fp_register"  "v")))]
97169689Skan  "TARGET_ARM && TARGET_HARD_FLOAT && TARGET_MAVERICK"
98132718Skan  "cfsubs%?\\t%V0, %V1, %V2"
99132718Skan  [(set_attr "type" "mav_farith")
100132718Skan   (set_attr "cirrus" "normal")]
101132718Skan)
102132718Skan
103132718Skan(define_insn "*cirrus_subdf3"
104132718Skan  [(set (match_operand:DF           0 "cirrus_fp_register" "=v")
105132718Skan	(minus:DF (match_operand:DF 1 "cirrus_fp_register" "v")
106132718Skan		  (match_operand:DF 2 "cirrus_fp_register" "v")))]
107169689Skan  "TARGET_ARM && TARGET_HARD_FLOAT && TARGET_MAVERICK"
108132718Skan  "cfsubd%?\\t%V0, %V1, %V2"
109132718Skan  [(set_attr "type" "mav_farith")
110132718Skan   (set_attr "cirrus" "normal")]
111132718Skan)
112132718Skan
113132718Skan(define_insn "*cirrus_mulsi3"
114132718Skan  [(set (match_operand:SI          0 "cirrus_fp_register" "=v")
115132718Skan	(mult:SI (match_operand:SI 2 "cirrus_fp_register"  "v")
116132718Skan		 (match_operand:SI 1 "cirrus_fp_register"  "v")))]
117169689Skan  "TARGET_ARM && TARGET_HARD_FLOAT && TARGET_MAVERICK && 0"
118132718Skan  "cfmul32%?\\t%V0, %V1, %V2"
119132718Skan  [(set_attr "type" "mav_farith")
120132718Skan   (set_attr "cirrus" "normal")]
121132718Skan)
122132718Skan
123132718Skan(define_insn "muldi3"
124132718Skan  [(set (match_operand:DI          0 "cirrus_fp_register" "=v")
125132718Skan	(mult:DI (match_operand:DI 2 "cirrus_fp_register"  "v")
126132718Skan		 (match_operand:DI 1 "cirrus_fp_register"  "v")))]
127169689Skan  "TARGET_ARM && TARGET_HARD_FLOAT && TARGET_MAVERICK"
128132718Skan  "cfmul64%?\\t%V0, %V1, %V2"
129132718Skan  [(set_attr "type" "mav_dmult")
130132718Skan   (set_attr "cirrus" "normal")]
131132718Skan)
132132718Skan
133132718Skan(define_insn "*cirrus_mulsi3addsi"
134132718Skan  [(set (match_operand:SI            0 "cirrus_fp_register" "=v")
135132718Skan	(plus:SI
136132718Skan	  (mult:SI (match_operand:SI 1 "cirrus_fp_register"  "v")
137132718Skan		   (match_operand:SI 2 "cirrus_fp_register"  "v"))
138132718Skan	  (match_operand:SI          3 "cirrus_fp_register"  "0")))]
139169689Skan  "TARGET_ARM && TARGET_HARD_FLOAT && TARGET_MAVERICK && 0"
140132718Skan  "cfmac32%?\\t%V0, %V1, %V2"
141132718Skan  [(set_attr "type" "mav_farith")
142132718Skan   (set_attr "cirrus" "normal")]
143132718Skan)
144132718Skan
145132718Skan;; Cirrus SI multiply-subtract
146132718Skan(define_insn "*cirrus_mulsi3subsi"
147132718Skan  [(set (match_operand:SI            0 "cirrus_fp_register" "=v")
148132718Skan	(minus:SI
149132718Skan	  (match_operand:SI          1 "cirrus_fp_register"  "0")
150132718Skan	  (mult:SI (match_operand:SI 2 "cirrus_fp_register"  "v")
151132718Skan		   (match_operand:SI 3 "cirrus_fp_register"  "v"))))]
152169689Skan  "0 && TARGET_ARM && TARGET_HARD_FLOAT && TARGET_MAVERICK"
153132718Skan  "cfmsc32%?\\t%V0, %V2, %V3"
154132718Skan  [(set_attr "type" "mav_farith")
155132718Skan   (set_attr "cirrus" "normal")]
156132718Skan)
157132718Skan
158132718Skan(define_insn "*cirrus_mulsf3"
159132718Skan  [(set (match_operand:SF          0 "cirrus_fp_register" "=v")
160132718Skan	(mult:SF (match_operand:SF 1 "cirrus_fp_register"  "v")
161132718Skan		 (match_operand:SF 2 "cirrus_fp_register"  "v")))]
162169689Skan  "TARGET_ARM && TARGET_HARD_FLOAT && TARGET_MAVERICK"
163132718Skan  "cfmuls%?\\t%V0, %V1, %V2"
164132718Skan  [(set_attr "type" "mav_farith")
165132718Skan   (set_attr "cirrus" "normal")]
166132718Skan)
167132718Skan
168132718Skan(define_insn "*cirrus_muldf3"
169132718Skan  [(set (match_operand:DF          0 "cirrus_fp_register" "=v")
170132718Skan	(mult:DF (match_operand:DF 1 "cirrus_fp_register"  "v")
171132718Skan		 (match_operand:DF 2 "cirrus_fp_register"  "v")))]
172169689Skan  "TARGET_ARM && TARGET_HARD_FLOAT && TARGET_MAVERICK"
173132718Skan  "cfmuld%?\\t%V0, %V1, %V2"
174132718Skan  [(set_attr "type" "mav_dmult")
175132718Skan   (set_attr "cirrus" "normal")]
176132718Skan)
177132718Skan
178132718Skan(define_insn "cirrus_ashl_const"
179132718Skan  [(set (match_operand:SI            0 "cirrus_fp_register" "=v")
180132718Skan	(ashift:SI (match_operand:SI 1 "cirrus_fp_register"  "v")
181132718Skan		   (match_operand:SI 2 "cirrus_shift_const"  "")))]
182169689Skan  "TARGET_ARM && TARGET_HARD_FLOAT && TARGET_MAVERICK && 0"
183132718Skan  "cfsh32%?\\t%V0, %V1, #%s2"
184132718Skan  [(set_attr "cirrus" "normal")]
185132718Skan)
186132718Skan
187132718Skan(define_insn "cirrus_ashiftrt_const"
188132718Skan  [(set (match_operand:SI	       0 "cirrus_fp_register" "=v")
189132718Skan	(ashiftrt:SI (match_operand:SI 1 "cirrus_fp_register"  "v")
190132718Skan		     (match_operand:SI 2 "cirrus_shift_const"  "")))]
191169689Skan  "TARGET_ARM && TARGET_HARD_FLOAT && TARGET_MAVERICK && 0"
192132718Skan  "cfsh32%?\\t%V0, %V1, #-%s2"
193132718Skan  [(set_attr "cirrus" "normal")]
194132718Skan)
195132718Skan
196132718Skan(define_insn "cirrus_ashlsi3"
197132718Skan  [(set (match_operand:SI            0 "cirrus_fp_register" "=v")
198132718Skan	(ashift:SI (match_operand:SI 1 "cirrus_fp_register"  "v")
199132718Skan		   (match_operand:SI 2 "register_operand"    "r")))]
200169689Skan  "TARGET_ARM && TARGET_HARD_FLOAT && TARGET_MAVERICK && 0"
201132718Skan  "cfrshl32%?\\t%V1, %V0, %s2"
202132718Skan  [(set_attr "cirrus" "normal")]
203132718Skan)
204132718Skan
205132718Skan(define_insn "ashldi3_cirrus"
206132718Skan  [(set (match_operand:DI            0 "cirrus_fp_register" "=v")
207132718Skan	(ashift:DI (match_operand:DI 1 "cirrus_fp_register"  "v")
208132718Skan		   (match_operand:SI 2 "register_operand"    "r")))]
209169689Skan  "TARGET_ARM && TARGET_HARD_FLOAT && TARGET_MAVERICK"
210132718Skan  "cfrshl64%?\\t%V1, %V0, %s2"
211132718Skan  [(set_attr "cirrus" "normal")]
212132718Skan)
213132718Skan
214132718Skan(define_insn "cirrus_ashldi_const"
215132718Skan  [(set (match_operand:DI            0 "cirrus_fp_register" "=v")
216132718Skan	(ashift:DI (match_operand:DI 1 "cirrus_fp_register"  "v")
217132718Skan		   (match_operand:SI 2 "cirrus_shift_const"  "")))]
218169689Skan  "TARGET_ARM && TARGET_HARD_FLOAT && TARGET_MAVERICK"
219132718Skan  "cfsh64%?\\t%V0, %V1, #%s2"
220132718Skan  [(set_attr "cirrus" "normal")]
221132718Skan)
222132718Skan
223132718Skan(define_insn "cirrus_ashiftrtdi_const"
224132718Skan  [(set (match_operand:DI            0 "cirrus_fp_register" "=v")
225132718Skan	(ashiftrt:DI (match_operand:DI 1 "cirrus_fp_register"  "v")
226132718Skan		     (match_operand:SI 2 "cirrus_shift_const"  "")))]
227169689Skan  "TARGET_ARM && TARGET_HARD_FLOAT && TARGET_MAVERICK"
228132718Skan  "cfsh64%?\\t%V0, %V1, #-%s2"
229132718Skan  [(set_attr "cirrus" "normal")]
230132718Skan)
231132718Skan
232132718Skan(define_insn "*cirrus_absdi2"
233132718Skan  [(set (match_operand:DI         0 "cirrus_fp_register" "=v")
234132718Skan	(abs:DI (match_operand:DI 1 "cirrus_fp_register"  "v")))]
235169689Skan  "TARGET_ARM && TARGET_HARD_FLOAT && TARGET_MAVERICK"
236132718Skan  "cfabs64%?\\t%V0, %V1"
237132718Skan  [(set_attr "cirrus" "normal")]
238132718Skan)
239132718Skan
240132718Skan;; This doesn't really clobber ``cc''.  Fixme: aldyh.  
241132718Skan(define_insn "*cirrus_negdi2"
242132718Skan  [(set (match_operand:DI         0 "cirrus_fp_register" "=v")
243132718Skan	(neg:DI (match_operand:DI 1 "cirrus_fp_register"  "v")))
244132718Skan   (clobber (reg:CC CC_REGNUM))]
245169689Skan  "TARGET_ARM && TARGET_HARD_FLOAT && TARGET_MAVERICK"
246132718Skan  "cfneg64%?\\t%V0, %V1"
247132718Skan  [(set_attr "cirrus" "normal")]
248132718Skan)
249132718Skan
250132718Skan(define_insn "*cirrus_negsi2"
251132718Skan  [(set (match_operand:SI         0 "cirrus_fp_register" "=v")
252132718Skan	(neg:SI (match_operand:SI 1 "cirrus_fp_register"  "v")))]
253169689Skan  "TARGET_ARM && TARGET_HARD_FLOAT && TARGET_MAVERICK && 0"
254132718Skan  "cfneg32%?\\t%V0, %V1"
255132718Skan  [(set_attr "cirrus" "normal")]
256132718Skan)
257132718Skan
258132718Skan(define_insn "*cirrus_negsf2"
259132718Skan  [(set (match_operand:SF         0 "cirrus_fp_register" "=v")
260132718Skan	(neg:SF (match_operand:SF 1 "cirrus_fp_register"  "v")))]
261169689Skan  "TARGET_ARM && TARGET_HARD_FLOAT && TARGET_MAVERICK"
262132718Skan  "cfnegs%?\\t%V0, %V1"
263132718Skan  [(set_attr "cirrus" "normal")]
264132718Skan)
265132718Skan
266132718Skan(define_insn "*cirrus_negdf2"
267132718Skan  [(set (match_operand:DF         0 "cirrus_fp_register" "=v")
268132718Skan	(neg:DF (match_operand:DF 1 "cirrus_fp_register"  "v")))]
269169689Skan  "TARGET_ARM && TARGET_HARD_FLOAT && TARGET_MAVERICK"
270132718Skan  "cfnegd%?\\t%V0, %V1"
271132718Skan  [(set_attr "cirrus" "normal")]
272132718Skan)
273132718Skan
274132718Skan;; This doesn't really clobber the condition codes either.  
275132718Skan(define_insn "*cirrus_abssi2"
276132718Skan  [(set (match_operand:SI         0 "cirrus_fp_register" "=v")
277132718Skan        (abs:SI (match_operand:SI 1 "cirrus_fp_register"  "v")))
278132718Skan   (clobber (reg:CC CC_REGNUM))]
279169689Skan  "TARGET_ARM && TARGET_HARD_FLOAT && TARGET_MAVERICK && 0"
280132718Skan  "cfabs32%?\\t%V0, %V1"
281132718Skan  [(set_attr "cirrus" "normal")]
282132718Skan)
283132718Skan
284132718Skan(define_insn "*cirrus_abssf2"
285132718Skan  [(set (match_operand:SF         0 "cirrus_fp_register" "=v")
286132718Skan        (abs:SF (match_operand:SF 1 "cirrus_fp_register"  "v")))]
287169689Skan  "TARGET_ARM && TARGET_HARD_FLOAT && TARGET_MAVERICK"
288132718Skan  "cfabss%?\\t%V0, %V1"
289132718Skan  [(set_attr "cirrus" "normal")]
290132718Skan)
291132718Skan
292132718Skan(define_insn "*cirrus_absdf2"
293132718Skan  [(set (match_operand:DF         0 "cirrus_fp_register" "=v")
294132718Skan        (abs:DF (match_operand:DF 1 "cirrus_fp_register"  "v")))]
295169689Skan  "TARGET_ARM && TARGET_HARD_FLOAT && TARGET_MAVERICK"
296132718Skan  "cfabsd%?\\t%V0, %V1"
297132718Skan  [(set_attr "cirrus" "normal")]
298132718Skan)
299132718Skan
300132718Skan;; Convert Cirrus-SI to Cirrus-SF
301132718Skan(define_insn "cirrus_floatsisf2"
302132718Skan  [(set (match_operand:SF           0 "cirrus_fp_register" "=v")
303132718Skan 	(float:SF (match_operand:SI 1 "s_register_operand"  "r")))
304132718Skan   (clobber (match_scratch:DF 2 "=v"))]
305169689Skan  "TARGET_ARM && TARGET_HARD_FLOAT && TARGET_MAVERICK"
306132718Skan  "cfmv64lr%?\\t%Z2, %1\;cfcvt32s%?\\t%V0, %Y2"
307132718Skan  [(set_attr "length" "8")
308132718Skan   (set_attr "cirrus" "move")]
309132718Skan)
310132718Skan
311132718Skan(define_insn "cirrus_floatsidf2"
312132718Skan  [(set (match_operand:DF           0 "cirrus_fp_register" "=v")
313132718Skan	(float:DF (match_operand:SI 1 "s_register_operand" "r")))
314132718Skan   (clobber (match_scratch:DF 2 "=v"))]
315169689Skan  "TARGET_ARM && TARGET_HARD_FLOAT && TARGET_MAVERICK"
316132718Skan  "cfmv64lr%?\\t%Z2, %1\;cfcvt32d%?\\t%V0, %Y2"
317132718Skan  [(set_attr "length" "8")
318132718Skan   (set_attr "cirrus" "move")]
319132718Skan)
320132718Skan
321132718Skan(define_insn "floatdisf2"
322132718Skan  [(set (match_operand:SF           0 "cirrus_fp_register" "=v")
323132718Skan	(float:SF (match_operand:DI 1 "cirrus_fp_register" "v")))]
324169689Skan  "TARGET_ARM && TARGET_HARD_FLOAT && TARGET_MAVERICK"
325132718Skan  "cfcvt64s%?\\t%V0, %V1"
326132718Skan  [(set_attr "cirrus" "normal")])
327132718Skan
328132718Skan(define_insn "floatdidf2"
329132718Skan  [(set (match_operand:DF 0 "cirrus_fp_register" "=v")
330132718Skan	(float:DF (match_operand:DI 1 "cirrus_fp_register" "v")))]
331169689Skan  "TARGET_ARM && TARGET_HARD_FLOAT && TARGET_MAVERICK"
332132718Skan  "cfcvt64d%?\\t%V0, %V1"
333132718Skan  [(set_attr "cirrus" "normal")])
334132718Skan
335132718Skan(define_insn "cirrus_truncsfsi2"
336132718Skan  [(set (match_operand:SI         0 "s_register_operand" "=r")
337132718Skan	(fix:SI (fix:SF (match_operand:SF 1 "cirrus_fp_register"  "v"))))
338132718Skan   (clobber (match_scratch:DF     2                      "=v"))]
339169689Skan  "TARGET_ARM && TARGET_HARD_FLOAT && TARGET_MAVERICK"
340132718Skan  "cftruncs32%?\\t%Y2, %V1\;cfmvr64l%?\\t%0, %Z2"
341132718Skan  [(set_attr "length" "8")
342132718Skan   (set_attr "cirrus" "normal")]
343132718Skan)
344132718Skan
345132718Skan(define_insn "cirrus_truncdfsi2"
346132718Skan  [(set (match_operand:SI         0 "s_register_operand" "=r")
347132718Skan	(fix:SI (fix:DF (match_operand:DF 1 "cirrus_fp_register"  "v"))))
348132718Skan   (clobber (match_scratch:DF     2                      "=v"))]
349169689Skan  "TARGET_ARM && TARGET_HARD_FLOAT && TARGET_MAVERICK"
350132718Skan  "cftruncd32%?\\t%Y2, %V1\;cfmvr64l%?\\t%0, %Z2"
351132718Skan  [(set_attr "length" "8")]
352132718Skan)
353132718Skan
354132718Skan(define_insn "*cirrus_truncdfsf2"
355132718Skan  [(set (match_operand:SF  0 "cirrus_fp_register" "=v")
356132718Skan        (float_truncate:SF
357132718Skan         (match_operand:DF 1 "cirrus_fp_register" "v")))]
358169689Skan  "TARGET_ARM && TARGET_HARD_FLOAT && TARGET_MAVERICK"
359132718Skan  "cfcvtds%?\\t%V0, %V1"
360132718Skan  [(set_attr "cirrus" "normal")]
361132718Skan)
362132718Skan
363132718Skan(define_insn "*cirrus_extendsfdf2"
364132718Skan  [(set (match_operand:DF                  0 "cirrus_fp_register" "=v")
365132718Skan        (float_extend:DF (match_operand:SF 1 "cirrus_fp_register"  "v")))]
366169689Skan  "TARGET_ARM && TARGET_HARD_FLOAT && TARGET_MAVERICK"
367132718Skan  "cfcvtsd%?\\t%V0, %V1"
368132718Skan  [(set_attr "cirrus" "normal")]
369132718Skan)
370132718Skan
371132718Skan(define_insn "*cirrus_arm_movdi"
372132718Skan  [(set (match_operand:DI 0 "nonimmediate_di_operand" "=r,r,o<>,v,r,v,m,v")
373169689Skan	(match_operand:DI 1 "di_operand"              "rIK,mi,r,r,v,mi,v,v"))]
374169689Skan  "TARGET_ARM && TARGET_HARD_FLOAT && TARGET_MAVERICK"
375132718Skan  "*
376132718Skan  {
377132718Skan  switch (which_alternative)
378132718Skan    {
379132718Skan    case 0:
380169689Skan      return \"#\";
381132718Skan    case 1:
382132718Skan    case 2:
383169689Skan      return output_move_double (operands);
384132718Skan
385132718Skan    case 3: return \"cfmv64lr%?\\t%V0, %Q1\;cfmv64hr%?\\t%V0, %R1\";
386132718Skan    case 4: return \"cfmvr64l%?\\t%Q0, %V1\;cfmvr64h%?\\t%R0, %V1\";
387132718Skan
388132718Skan    case 5: return \"cfldr64%?\\t%V0, %1\";
389132718Skan    case 6: return \"cfstr64%?\\t%V1, %0\";
390132718Skan
391132718Skan    /* Shifting by 0 will just copy %1 into %0.  */
392132718Skan    case 7: return \"cfsh64%?\\t%V0, %V1, #0\";
393132718Skan
394169689Skan    default: gcc_unreachable ();
395132718Skan    }
396132718Skan  }"
397132718Skan  [(set_attr "length"         "  8,   8,     8,   8,     8,     4,     4,     4")
398169689Skan   (set_attr "type"           "  *,load2,store2,   *,     *,  load2,store2,     *")
399169689Skan   (set_attr "pool_range"     "  *,1020,     *,   *,     *,  1020,     *,     *")
400169689Skan   (set_attr "neg_pool_range" "  *,1012,     *,   *,     *,  1008,     *,     *")
401132718Skan   (set_attr "cirrus"         "not, not,   not,move,normal,double,double,normal")]
402132718Skan)
403132718Skan
404132718Skan;; Cirrus SI values have been outlawed.  Look in arm.h for the comment
405132718Skan;; on HARD_REGNO_MODE_OK.
406132718Skan
407132718Skan(define_insn "*cirrus_movsf_hard_insn"
408132718Skan  [(set (match_operand:SF 0 "nonimmediate_operand" "=v,v,v,r,m,r,r,m")
409169689Skan        (match_operand:SF 1 "general_operand"      "v,mE,r,v,v,r,mE,r"))]
410169689Skan  "TARGET_ARM && TARGET_HARD_FLOAT && TARGET_MAVERICK
411132718Skan   && (GET_CODE (operands[0]) != MEM
412132718Skan       || register_operand (operands[1], SFmode))"
413132718Skan  "@
414132718Skan   cfcpys%?\\t%V0, %V1
415132718Skan   cfldrs%?\\t%V0, %1
416132718Skan   cfmvsr%?\\t%V0, %1
417132718Skan   cfmvrs%?\\t%0, %V1
418132718Skan   cfstrs%?\\t%V1, %0
419132718Skan   mov%?\\t%0, %1
420132718Skan   ldr%?\\t%0, %1\\t%@ float
421132718Skan   str%?\\t%1, %0\\t%@ float"
422132718Skan  [(set_attr "length"         "     *,     *,   *,     *,     *,  4,   4,     4")
423169689Skan   (set_attr "type"           "     *,  load1,   *,     *,store1,  *,load1,store1")
424169689Skan   (set_attr "pool_range"     "     *,   1020,   *,     *,     *,  *,4096,     *")
425169689Skan   (set_attr "neg_pool_range" "     *,   1008,   *,     *,     *,  *,4084,     *")
426132718Skan   (set_attr "cirrus"         "normal,normal,move,normal,normal,not, not,   not")]
427132718Skan)
428132718Skan
429132718Skan(define_insn "*cirrus_movdf_hard_insn"
430132718Skan  [(set (match_operand:DF 0 "nonimmediate_operand" "=r,Q,r,m,r,v,v,v,r,m")
431169689Skan	(match_operand:DF 1 "general_operand"       "Q,r,r,r,mF,v,mF,r,v,v"))]
432132718Skan  "TARGET_ARM
433169689Skan   && TARGET_HARD_FLOAT && TARGET_MAVERICK
434132718Skan   && (GET_CODE (operands[0]) != MEM
435132718Skan       || register_operand (operands[1], DFmode))"
436132718Skan  "*
437132718Skan  {
438132718Skan  switch (which_alternative)
439132718Skan    {
440132718Skan    case 0: return \"ldm%?ia\\t%m1, %M0\\t%@ double\";
441132718Skan    case 1: return \"stm%?ia\\t%m0, %M1\\t%@ double\";
442169689Skan    case 2: return \"#\";
443169689Skan    case 3: case 4: return output_move_double (operands);
444132718Skan    case 5: return \"cfcpyd%?\\t%V0, %V1\";
445132718Skan    case 6: return \"cfldrd%?\\t%V0, %1\";
446132718Skan    case 7: return \"cfmvdlr\\t%V0, %Q1\;cfmvdhr%?\\t%V0, %R1\";
447132718Skan    case 8: return \"cfmvrdl%?\\t%Q0, %V1\;cfmvrdh%?\\t%R0, %V1\";
448132718Skan    case 9: return \"cfstrd%?\\t%V1, %0\";
449169689Skan    default: gcc_unreachable ();
450132718Skan    }
451132718Skan  }"
452169689Skan  [(set_attr "type"           "load1,store2,  *,store2,load1,     *,  load1,   *,     *,store2")
453132718Skan   (set_attr "length"         "   4,     4,  8,     8,   8,     4,     4,   8,     8,     4")
454169689Skan   (set_attr "pool_range"     "   *,     *,  *,     *, 252,     *,  1020,   *,     *,     *")
455169689Skan   (set_attr "neg_pool_range" "   *,     *,  *,     *, 244,     *,  1008,   *,     *,     *")
456132718Skan   (set_attr "cirrus"         " not,   not,not,   not, not,normal,double,move,normal,double")]
457132718Skan)
458132718Skan
459