]> git.ipfire.org Git - thirdparty/gcc.git/blame - gcc/config/arm/vfp.md
* compare-debug: Grep for blank before dash to avoid grep -e.
[thirdparty/gcc.git] / gcc / config / arm / vfp.md
CommitLineData
3f4d9b98
PB
1;; ARM VFP instruction patterns
2;; Copyright (C) 2003, 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
3;; Written by CodeSourcery.
9b66ebb1
PB
4;;
5;; This file is part of GCC.
6;;
7;; GCC is free software; you can redistribute it and/or modify it
8;; under the terms of the GNU General Public License as published by
2f83c7d6 9;; the Free Software Foundation; either version 3, or (at your option)
9b66ebb1
PB
10;; any later version.
11;;
12;; GCC is distributed in the hope that it will be useful, but
13;; WITHOUT ANY WARRANTY; without even the implied warranty of
14;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15;; General Public License for more details.
16;;
17;; You should have received a copy of the GNU General Public License
2f83c7d6
NC
18;; along with GCC; see the file COPYING3. If not see
19;; <http://www.gnu.org/licenses/>. */
9b66ebb1
PB
20
21;; Additional register numbers
22(define_constants
f1adb0a9 23 [(VFPCC_REGNUM 127)]
9b66ebb1
PB
24)
25
9b66ebb1 26;; The VFP "type" attributes differ from those used in the FPA model.
51c69ddb
PB
27;; fcpys Single precision cpy.
28;; ffariths Single precision abs, neg.
29;; ffarithd Double precision abs, neg, cpy.
30;; fadds Single precision add/sub.
31;; faddd Double precision add/sub.
32;; fconsts Single precision load immediate.
33;; fconstd Double precision load immediate.
34;; fcmps Single precision comparison.
35;; fcmpd Double precision comparison.
a8e17e9e
PB
36;; fmuls Single precision multiply.
37;; fmuld Double precision multiply.
38;; fmacs Single precision multiply-accumulate.
39;; fmacd Double precision multiply-accumulate.
9b66ebb1
PB
40;; fdivs Single precision sqrt or division.
41;; fdivd Double precision sqrt or division.
75fe7b2f
RE
42;; f_flag fmstat operation
43;; f_load[sd] Floating point load from memory.
44;; f_store[sd] Floating point store to memory.
9b66ebb1
PB
45;; f_2_r Transfer vfp to arm reg.
46;; r_2_f Transfer arm to vfp reg.
75fe7b2f 47;; f_cvt Convert floating<->integral
9b66ebb1 48
9b66ebb1
PB
49;; SImode moves
50;; ??? For now do not allow loading constants into vfp regs. This causes
59b9a953 51;; problems because small constants get converted into adds.
9b66ebb1 52(define_insn "*arm_movsi_vfp"
f5c630c3 53 [(set (match_operand:SI 0 "nonimmediate_operand" "=rk,r,r,r,rk,m ,*t,r,*t,*t, *Uv")
d58bc084 54 (match_operand:SI 1 "general_operand" "rk, I,K,j,mi,rk,r,*t,*t,*Uvi,*t"))]
9b66ebb1
PB
55 "TARGET_ARM && TARGET_VFP && TARGET_HARD_FLOAT
56 && ( s_register_operand (operands[0], SImode)
57 || s_register_operand (operands[1], SImode))"
5b3e6663
PB
58 "*
59 switch (which_alternative)
60 {
f5c630c3 61 case 0: case 1:
5b3e6663 62 return \"mov%?\\t%0, %1\";
5b3e6663 63 case 2:
f5c630c3 64 return \"mvn%?\\t%0, #%B1\";
5b3e6663 65 case 3:
f5c630c3 66 return \"movw%?\\t%0, %1\";
5b3e6663 67 case 4:
f5c630c3 68 return \"ldr%?\\t%0, %1\";
5b3e6663 69 case 5:
f5c630c3 70 return \"str%?\\t%1, %0\";
5b3e6663 71 case 6:
f5c630c3 72 return \"fmsr%?\\t%0, %1\\t%@ int\";
5b3e6663 73 case 7:
f5c630c3
PB
74 return \"fmrs%?\\t%0, %1\\t%@ int\";
75 case 8:
5b3e6663 76 return \"fcpys%?\\t%0, %1\\t%@ int\";
f5c630c3 77 case 9: case 10:
5b3e6663
PB
78 return output_move_vfp (operands);
79 default:
80 gcc_unreachable ();
81 }
82 "
83 [(set_attr "predicable" "yes")
51c69ddb 84 (set_attr "type" "*,*,*,*,load1,store1,r_2_f,f_2_r,fcpys,f_loads,f_stores")
f5c630c3
PB
85 (set_attr "pool_range" "*,*,*,*,4096,*,*,*,*,1020,*")
86 (set_attr "neg_pool_range" "*,*,*,*,4084,*,*,*,*,1008,*")]
5b3e6663
PB
87)
88
89(define_insn "*thumb2_movsi_vfp"
f5c630c3 90 [(set (match_operand:SI 0 "nonimmediate_operand" "=rk,r,r,r,rk,m,*t,r, *t,*t, *Uv")
d58bc084 91 (match_operand:SI 1 "general_operand" "rk, I,K,j,mi,rk,r,*t,*t,*Uvi,*t"))]
5b3e6663
PB
92 "TARGET_THUMB2 && TARGET_VFP && TARGET_HARD_FLOAT
93 && ( s_register_operand (operands[0], SImode)
94 || s_register_operand (operands[1], SImode))"
95 "*
96 switch (which_alternative)
97 {
f5c630c3 98 case 0: case 1:
5b3e6663 99 return \"mov%?\\t%0, %1\";
5b3e6663 100 case 2:
f5c630c3 101 return \"mvn%?\\t%0, #%B1\";
5b3e6663 102 case 3:
f5c630c3 103 return \"movw%?\\t%0, %1\";
5b3e6663 104 case 4:
f5c630c3 105 return \"ldr%?\\t%0, %1\";
5b3e6663 106 case 5:
f5c630c3 107 return \"str%?\\t%1, %0\";
5b3e6663 108 case 6:
f5c630c3 109 return \"fmsr%?\\t%0, %1\\t%@ int\";
5b3e6663 110 case 7:
f5c630c3
PB
111 return \"fmrs%?\\t%0, %1\\t%@ int\";
112 case 8:
5b3e6663 113 return \"fcpys%?\\t%0, %1\\t%@ int\";
f5c630c3 114 case 9: case 10:
5b3e6663
PB
115 return output_move_vfp (operands);
116 default:
117 gcc_unreachable ();
118 }
119 "
9b66ebb1 120 [(set_attr "predicable" "yes")
51c69ddb 121 (set_attr "type" "*,*,*,*,load1,store1,r_2_f,f_2_r,fcpys,f_load,f_store")
f5c630c3
PB
122 (set_attr "pool_range" "*,*,*,*,4096,*,*,*,*,1020,*")
123 (set_attr "neg_pool_range" "*,*,*,*, 0,*,*,*,*,1008,*")]
9b66ebb1
PB
124)
125
126
127;; DImode moves
128
129(define_insn "*arm_movdi_vfp"
fdd695fd
PB
130 [(set (match_operand:DI 0 "nonimmediate_di_operand" "=r, r,m,w,r,w,w, Uv")
131 (match_operand:DI 1 "di_operand" "rIK,mi,r,r,w,w,Uvi,w"))]
d5b6e637
PB
132 "TARGET_ARM && TARGET_HARD_FLOAT && TARGET_VFP
133 && ( register_operand (operands[0], DImode)
134 || register_operand (operands[1], DImode))"
9b66ebb1
PB
135 "*
136 switch (which_alternative)
137 {
9b901d50
RE
138 case 0:
139 return \"#\";
140 case 1:
141 case 2:
142 return output_move_double (operands);
9b66ebb1 143 case 3:
94634f14 144 return \"fmdrr%?\\t%P0, %Q1, %R1\\t%@ int\";
9b66ebb1 145 case 4:
94634f14 146 return \"fmrrd%?\\t%Q0, %R0, %P1\\t%@ int\";
9b66ebb1
PB
147 case 5:
148 return \"fcpyd%?\\t%P0, %P1\\t%@ int\";
5b3e6663
PB
149 case 6: case 7:
150 return output_move_vfp (operands);
9b66ebb1 151 default:
e6d29d15 152 gcc_unreachable ();
9b66ebb1
PB
153 }
154 "
51c69ddb 155 [(set_attr "type" "*,load2,store2,r_2_f,f_2_r,ffarithd,f_loadd,f_stored")
9b66ebb1 156 (set_attr "length" "8,8,8,4,4,4,4,4")
54f52b81 157 (set_attr "predicable" "yes")
9b66ebb1
PB
158 (set_attr "pool_range" "*,1020,*,*,*,*,1020,*")
159 (set_attr "neg_pool_range" "*,1008,*,*,*,*,1008,*")]
160)
161
5b3e6663
PB
162(define_insn "*thumb2_movdi_vfp"
163 [(set (match_operand:DI 0 "nonimmediate_di_operand" "=r, r,m,w,r,w,w, Uv")
164 (match_operand:DI 1 "di_operand" "rIK,mi,r,r,w,w,Uvi,w"))]
165 "TARGET_THUMB2 && TARGET_HARD_FLOAT && TARGET_VFP"
166 "*
167 switch (which_alternative)
168 {
169 case 0: case 1: case 2:
170 return (output_move_double (operands));
171 case 3:
172 return \"fmdrr%?\\t%P0, %Q1, %R1\\t%@ int\";
173 case 4:
174 return \"fmrrd%?\\t%Q0, %R0, %P1\\t%@ int\";
175 case 5:
176 return \"fcpyd%?\\t%P0, %P1\\t%@ int\";
177 case 6: case 7:
178 return output_move_vfp (operands);
179 default:
180 abort ();
181 }
182 "
51c69ddb 183 [(set_attr "type" "*,load2,store2,r_2_f,f_2_r,ffarithd,f_load,f_store")
5b3e6663
PB
184 (set_attr "length" "8,8,8,4,4,4,4,4")
185 (set_attr "pool_range" "*,4096,*,*,*,*,1020,*")
186 (set_attr "neg_pool_range" "*, 0,*,*,*,*,1008,*")]
187)
188
0fd8c3ad
SL
189;; HFmode moves
190(define_insn "*movhf_vfp"
191 [(set (match_operand:HF 0 "nonimmediate_operand" "= t,Um,r,m,t,r,t,r,r")
192 (match_operand:HF 1 "general_operand" " Um, t,m,r,t,r,r,t,F"))]
193 "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_NEON_FP16
194 && ( s_register_operand (operands[0], HFmode)
195 || s_register_operand (operands[1], HFmode))"
196 "*
197 switch (which_alternative)
198 {
199 case 0: /* S register from memory */
200 return \"vld1.16\\t{%z0}, %A1\";
201 case 1: /* memory from S register */
202 return \"vst1.16\\t{%z1}, %A0\";
203 case 2: /* ARM register from memory */
204 return \"ldrh\\t%0, %1\\t%@ __fp16\";
205 case 3: /* memory from ARM register */
206 return \"strh\\t%1, %0\\t%@ __fp16\";
207 case 4: /* S register from S register */
208 return \"fcpys\\t%0, %1\";
209 case 5: /* ARM register from ARM register */
210 return \"mov\\t%0, %1\\t%@ __fp16\";
211 case 6: /* S register from ARM register */
212 return \"fmsr\\t%0, %1\";
213 case 7: /* ARM register from S register */
214 return \"fmrs\\t%0, %1\";
215 case 8: /* ARM register from constant */
216 {
217 REAL_VALUE_TYPE r;
218 long bits;
219 rtx ops[4];
220
221 REAL_VALUE_FROM_CONST_DOUBLE (r, operands[1]);
222 bits = real_to_target (NULL, &r, HFmode);
223 ops[0] = operands[0];
224 ops[1] = GEN_INT (bits);
225 ops[2] = GEN_INT (bits & 0xff00);
226 ops[3] = GEN_INT (bits & 0x00ff);
227
228 if (arm_arch_thumb2)
229 output_asm_insn (\"movw\\t%0, %1\", ops);
230 else
231 output_asm_insn (\"mov\\t%0, %2\;orr\\t%0, %0, %3\", ops);
232 return \"\";
233 }
234 default:
235 gcc_unreachable ();
236 }
237 "
238 [(set_attr "conds" "unconditional")
239 (set_attr "type" "*,*,load1,store1,fcpys,*,r_2_f,f_2_r,*")
240 (set_attr "neon_type" "neon_vld1_1_2_regs,neon_vst1_1_2_regs_vst2_2_regs,*,*,*,*,*,*,*")
241 (set_attr "length" "4,4,4,4,4,4,4,4,8")]
242)
243
9b66ebb1
PB
244
245;; SFmode moves
221b2a64
PB
246;; Disparage the w<->r cases because reloading an invalid address is
247;; preferable to loading the value via integer registers.
9b66ebb1
PB
248
249(define_insn "*movsf_vfp"
f1adb0a9
JB
250 [(set (match_operand:SF 0 "nonimmediate_operand" "=t,?r,t ,t ,Uv,r ,m,t,r")
251 (match_operand:SF 1 "general_operand" " ?r,t,Dv,UvE,t, mE,r,t,r"))]
9b66ebb1
PB
252 "TARGET_ARM && TARGET_HARD_FLOAT && TARGET_VFP
253 && ( s_register_operand (operands[0], SFmode)
254 || s_register_operand (operands[1], SFmode))"
5b3e6663
PB
255 "*
256 switch (which_alternative)
257 {
258 case 0:
259 return \"fmsr%?\\t%0, %1\";
260 case 1:
261 return \"fmrs%?\\t%0, %1\";
f1adb0a9
JB
262 case 2:
263 return \"fconsts%?\\t%0, #%G1\";
264 case 3: case 4:
5b3e6663 265 return output_move_vfp (operands);
5b3e6663 266 case 5:
f1adb0a9 267 return \"ldr%?\\t%0, %1\\t%@ float\";
5b3e6663 268 case 6:
f1adb0a9 269 return \"str%?\\t%1, %0\\t%@ float\";
5b3e6663 270 case 7:
f1adb0a9
JB
271 return \"fcpys%?\\t%0, %1\";
272 case 8:
5b3e6663
PB
273 return \"mov%?\\t%0, %1\\t%@ float\";
274 default:
275 gcc_unreachable ();
276 }
277 "
9b66ebb1 278 [(set_attr "predicable" "yes")
f1adb0a9 279 (set_attr "type"
51c69ddb 280 "r_2_f,f_2_r,fconsts,f_loads,f_stores,load1,store1,fcpys,*")
f1adb0a9
JB
281 (set_attr "pool_range" "*,*,*,1020,*,4096,*,*,*")
282 (set_attr "neg_pool_range" "*,*,*,1008,*,4080,*,*,*")]
9b66ebb1
PB
283)
284
5b3e6663 285(define_insn "*thumb2_movsf_vfp"
f1adb0a9
JB
286 [(set (match_operand:SF 0 "nonimmediate_operand" "=t,?r,t, t ,Uv,r ,m,t,r")
287 (match_operand:SF 1 "general_operand" " ?r,t,Dv,UvE,t, mE,r,t,r"))]
5b3e6663
PB
288 "TARGET_THUMB2 && TARGET_HARD_FLOAT && TARGET_VFP
289 && ( s_register_operand (operands[0], SFmode)
290 || s_register_operand (operands[1], SFmode))"
291 "*
292 switch (which_alternative)
293 {
294 case 0:
295 return \"fmsr%?\\t%0, %1\";
296 case 1:
297 return \"fmrs%?\\t%0, %1\";
f1adb0a9
JB
298 case 2:
299 return \"fconsts%?\\t%0, #%G1\";
300 case 3: case 4:
5b3e6663 301 return output_move_vfp (operands);
5b3e6663 302 case 5:
f1adb0a9 303 return \"ldr%?\\t%0, %1\\t%@ float\";
5b3e6663 304 case 6:
f1adb0a9 305 return \"str%?\\t%1, %0\\t%@ float\";
5b3e6663 306 case 7:
f1adb0a9
JB
307 return \"fcpys%?\\t%0, %1\";
308 case 8:
5b3e6663
PB
309 return \"mov%?\\t%0, %1\\t%@ float\";
310 default:
311 gcc_unreachable ();
312 }
313 "
314 [(set_attr "predicable" "yes")
f1adb0a9 315 (set_attr "type"
51c69ddb 316 "r_2_f,f_2_r,fconsts,f_load,f_store,load1,store1,fcpys,*")
f1adb0a9
JB
317 (set_attr "pool_range" "*,*,*,1020,*,4092,*,*,*")
318 (set_attr "neg_pool_range" "*,*,*,1008,*,0,*,*,*")]
5b3e6663
PB
319)
320
9b66ebb1
PB
321
322;; DFmode moves
323
324(define_insn "*movdf_vfp"
f1adb0a9
JB
325 [(set (match_operand:DF 0 "nonimmediate_soft_df_operand" "=w,?r,w ,r, m,w ,Uv,w,r")
326 (match_operand:DF 1 "soft_df_operand" " ?r,w,Dv,mF,r,UvF,w, w,r"))]
d5b6e637
PB
327 "TARGET_ARM && TARGET_HARD_FLOAT && TARGET_VFP
328 && ( register_operand (operands[0], DFmode)
329 || register_operand (operands[1], DFmode))"
9b66ebb1
PB
330 "*
331 {
332 switch (which_alternative)
333 {
334 case 0:
335 return \"fmdrr%?\\t%P0, %Q1, %R1\";
336 case 1:
337 return \"fmrrd%?\\t%Q0, %R0, %P1\";
f1adb0a9
JB
338 case 2:
339 return \"fconstd%?\\t%P0, #%G1\";
340 case 3: case 4:
9b66ebb1 341 return output_move_double (operands);
f1adb0a9 342 case 5: case 6:
5b3e6663 343 return output_move_vfp (operands);
9b901d50 344 case 7:
f1adb0a9
JB
345 return \"fcpyd%?\\t%P0, %P1\";
346 case 8:
9b901d50 347 return \"#\";
9b66ebb1 348 default:
e6d29d15 349 gcc_unreachable ();
9b66ebb1
PB
350 }
351 }
352 "
f1adb0a9 353 [(set_attr "type"
51c69ddb 354 "r_2_f,f_2_r,fconstd,f_loadd,f_stored,load2,store2,ffarithd,*")
f1adb0a9 355 (set_attr "length" "4,4,4,8,8,4,4,4,8")
54f52b81 356 (set_attr "predicable" "yes")
f1adb0a9
JB
357 (set_attr "pool_range" "*,*,*,1020,*,1020,*,*,*")
358 (set_attr "neg_pool_range" "*,*,*,1008,*,1008,*,*,*")]
9b66ebb1
PB
359)
360
5b3e6663 361(define_insn "*thumb2_movdf_vfp"
f1adb0a9
JB
362 [(set (match_operand:DF 0 "nonimmediate_soft_df_operand" "=w,?r,w ,r, m,w ,Uv,w,r")
363 (match_operand:DF 1 "soft_df_operand" " ?r,w,Dv,mF,r,UvF,w, w,r"))]
5b3e6663
PB
364 "TARGET_THUMB2 && TARGET_HARD_FLOAT && TARGET_VFP"
365 "*
366 {
367 switch (which_alternative)
368 {
369 case 0:
370 return \"fmdrr%?\\t%P0, %Q1, %R1\";
371 case 1:
372 return \"fmrrd%?\\t%Q0, %R0, %P1\";
f1adb0a9
JB
373 case 2:
374 return \"fconstd%?\\t%P0, #%G1\";
375 case 3: case 4: case 8:
5b3e6663 376 return output_move_double (operands);
f1adb0a9 377 case 5: case 6:
5b3e6663 378 return output_move_vfp (operands);
f1adb0a9 379 case 7:
5b3e6663
PB
380 return \"fcpyd%?\\t%P0, %P1\";
381 default:
382 abort ();
383 }
384 }
385 "
f1adb0a9 386 [(set_attr "type"
51c69ddb 387 "r_2_f,f_2_r,fconstd,load2,store2,f_load,f_store,ffarithd,*")
f1adb0a9
JB
388 (set_attr "length" "4,4,4,8,8,4,4,4,8")
389 (set_attr "pool_range" "*,*,*,4096,*,1020,*,*,*")
390 (set_attr "neg_pool_range" "*,*,*,0,*,1008,*,*,*")]
5b3e6663
PB
391)
392
9b66ebb1
PB
393
394;; Conditional move patterns
395
396(define_insn "*movsfcc_vfp"
f1adb0a9 397 [(set (match_operand:SF 0 "s_register_operand" "=t,t,t,t,t,t,?r,?r,?r")
9b66ebb1
PB
398 (if_then_else:SF
399 (match_operator 3 "arm_comparison_operator"
400 [(match_operand 4 "cc_register" "") (const_int 0)])
f1adb0a9
JB
401 (match_operand:SF 1 "s_register_operand" "0,t,t,0,?r,?r,0,t,t")
402 (match_operand:SF 2 "s_register_operand" "t,0,t,?r,0,?r,t,0,t")))]
9b66ebb1
PB
403 "TARGET_ARM && TARGET_HARD_FLOAT && TARGET_VFP"
404 "@
405 fcpys%D3\\t%0, %2
406 fcpys%d3\\t%0, %1
407 fcpys%D3\\t%0, %2\;fcpys%d3\\t%0, %1
408 fmsr%D3\\t%0, %2
409 fmsr%d3\\t%0, %1
410 fmsr%D3\\t%0, %2\;fmsr%d3\\t%0, %1
411 fmrs%D3\\t%0, %2
412 fmrs%d3\\t%0, %1
413 fmrs%D3\\t%0, %2\;fmrs%d3\\t%0, %1"
414 [(set_attr "conds" "use")
415 (set_attr "length" "4,4,8,4,4,8,4,4,8")
51c69ddb 416 (set_attr "type" "fcpys,fcpys,fcpys,r_2_f,r_2_f,r_2_f,f_2_r,f_2_r,f_2_r")]
9b66ebb1
PB
417)
418
5b3e6663 419(define_insn "*thumb2_movsfcc_vfp"
f1adb0a9 420 [(set (match_operand:SF 0 "s_register_operand" "=t,t,t,t,t,t,?r,?r,?r")
5b3e6663
PB
421 (if_then_else:SF
422 (match_operator 3 "arm_comparison_operator"
423 [(match_operand 4 "cc_register" "") (const_int 0)])
f1adb0a9
JB
424 (match_operand:SF 1 "s_register_operand" "0,t,t,0,?r,?r,0,t,t")
425 (match_operand:SF 2 "s_register_operand" "t,0,t,?r,0,?r,t,0,t")))]
5b3e6663
PB
426 "TARGET_THUMB2 && TARGET_HARD_FLOAT && TARGET_VFP"
427 "@
428 it\\t%D3\;fcpys%D3\\t%0, %2
429 it\\t%d3\;fcpys%d3\\t%0, %1
430 ite\\t%D3\;fcpys%D3\\t%0, %2\;fcpys%d3\\t%0, %1
431 it\\t%D3\;fmsr%D3\\t%0, %2
432 it\\t%d3\;fmsr%d3\\t%0, %1
433 ite\\t%D3\;fmsr%D3\\t%0, %2\;fmsr%d3\\t%0, %1
434 it\\t%D3\;fmrs%D3\\t%0, %2
435 it\\t%d3\;fmrs%d3\\t%0, %1
436 ite\\t%D3\;fmrs%D3\\t%0, %2\;fmrs%d3\\t%0, %1"
437 [(set_attr "conds" "use")
438 (set_attr "length" "6,6,10,6,6,10,6,6,10")
51c69ddb 439 (set_attr "type" "fcpys,fcpys,fcpys,r_2_f,r_2_f,r_2_f,f_2_r,f_2_r,f_2_r")]
5b3e6663
PB
440)
441
9b66ebb1
PB
442(define_insn "*movdfcc_vfp"
443 [(set (match_operand:DF 0 "s_register_operand" "=w,w,w,w,w,w,?r,?r,?r")
444 (if_then_else:DF
445 (match_operator 3 "arm_comparison_operator"
446 [(match_operand 4 "cc_register" "") (const_int 0)])
447 (match_operand:DF 1 "s_register_operand" "0,w,w,0,?r,?r,0,w,w")
448 (match_operand:DF 2 "s_register_operand" "w,0,w,?r,0,?r,w,0,w")))]
449 "TARGET_ARM && TARGET_HARD_FLOAT && TARGET_VFP"
450 "@
451 fcpyd%D3\\t%P0, %P2
452 fcpyd%d3\\t%P0, %P1
453 fcpyd%D3\\t%P0, %P2\;fcpyd%d3\\t%P0, %P1
454 fmdrr%D3\\t%P0, %Q2, %R2
455 fmdrr%d3\\t%P0, %Q1, %R1
456 fmdrr%D3\\t%P0, %Q2, %R2\;fmdrr%d3\\t%P0, %Q1, %R1
457 fmrrd%D3\\t%Q0, %R0, %P2
458 fmrrd%d3\\t%Q0, %R0, %P1
459 fmrrd%D3\\t%Q0, %R0, %P2\;fmrrd%d3\\t%Q0, %R0, %P1"
460 [(set_attr "conds" "use")
461 (set_attr "length" "4,4,8,4,4,8,4,4,8")
51c69ddb 462 (set_attr "type" "ffarithd,ffarithd,ffarithd,r_2_f,r_2_f,r_2_f,f_2_r,f_2_r,f_2_r")]
9b66ebb1
PB
463)
464
5b3e6663
PB
465(define_insn "*thumb2_movdfcc_vfp"
466 [(set (match_operand:DF 0 "s_register_operand" "=w,w,w,w,w,w,?r,?r,?r")
467 (if_then_else:DF
468 (match_operator 3 "arm_comparison_operator"
469 [(match_operand 4 "cc_register" "") (const_int 0)])
470 (match_operand:DF 1 "s_register_operand" "0,w,w,0,?r,?r,0,w,w")
471 (match_operand:DF 2 "s_register_operand" "w,0,w,?r,0,?r,w,0,w")))]
472 "TARGET_THUMB2 && TARGET_HARD_FLOAT && TARGET_VFP"
473 "@
474 it\\t%D3\;fcpyd%D3\\t%P0, %P2
475 it\\t%d3\;fcpyd%d3\\t%P0, %P1
476 ite\\t%D3\;fcpyd%D3\\t%P0, %P2\;fcpyd%d3\\t%P0, %P1
477 it\t%D3\;fmdrr%D3\\t%P0, %Q2, %R2
478 it\t%d3\;fmdrr%d3\\t%P0, %Q1, %R1
479 ite\\t%D3\;fmdrr%D3\\t%P0, %Q2, %R2\;fmdrr%d3\\t%P0, %Q1, %R1
480 it\t%D3\;fmrrd%D3\\t%Q0, %R0, %P2
481 it\t%d3\;fmrrd%d3\\t%Q0, %R0, %P1
482 ite\\t%D3\;fmrrd%D3\\t%Q0, %R0, %P2\;fmrrd%d3\\t%Q0, %R0, %P1"
483 [(set_attr "conds" "use")
484 (set_attr "length" "6,6,10,6,6,10,6,6,10")
51c69ddb 485 (set_attr "type" "ffarithd,ffarithd,ffarithd,r_2_f,r_2_f,r_2_f,f_2_r,f_2_r,f_2_r")]
5b3e6663
PB
486)
487
9b66ebb1
PB
488
489;; Sign manipulation functions
490
491(define_insn "*abssf2_vfp"
f1adb0a9
JB
492 [(set (match_operand:SF 0 "s_register_operand" "=t")
493 (abs:SF (match_operand:SF 1 "s_register_operand" "t")))]
5b3e6663 494 "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP"
9b66ebb1
PB
495 "fabss%?\\t%0, %1"
496 [(set_attr "predicable" "yes")
51c69ddb 497 (set_attr "type" "ffariths")]
9b66ebb1
PB
498)
499
500(define_insn "*absdf2_vfp"
501 [(set (match_operand:DF 0 "s_register_operand" "=w")
502 (abs:DF (match_operand:DF 1 "s_register_operand" "w")))]
5b3e6663 503 "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP"
9b66ebb1
PB
504 "fabsd%?\\t%P0, %P1"
505 [(set_attr "predicable" "yes")
51c69ddb 506 (set_attr "type" "ffarithd")]
9b66ebb1
PB
507)
508
509(define_insn "*negsf2_vfp"
f1adb0a9
JB
510 [(set (match_operand:SF 0 "s_register_operand" "=t,?r")
511 (neg:SF (match_operand:SF 1 "s_register_operand" "t,r")))]
5b3e6663 512 "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP"
81632f11
RE
513 "@
514 fnegs%?\\t%0, %1
515 eor%?\\t%0, %1, #-2147483648"
9b66ebb1 516 [(set_attr "predicable" "yes")
51c69ddb 517 (set_attr "type" "ffariths")]
9b66ebb1
PB
518)
519
81632f11
RE
520(define_insn_and_split "*negdf2_vfp"
521 [(set (match_operand:DF 0 "s_register_operand" "=w,?r,?r")
522 (neg:DF (match_operand:DF 1 "s_register_operand" "w,0,r")))]
5b3e6663 523 "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP"
81632f11
RE
524 "@
525 fnegd%?\\t%P0, %P1
526 #
527 #"
5b3e6663 528 "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP && reload_completed
81632f11
RE
529 && arm_general_register_operand (operands[0], DFmode)"
530 [(set (match_dup 0) (match_dup 1))]
531 "
532 if (REGNO (operands[0]) == REGNO (operands[1]))
533 {
534 operands[0] = gen_highpart (SImode, operands[0]);
535 operands[1] = gen_rtx_XOR (SImode, operands[0], GEN_INT (0x80000000));
536 }
537 else
538 {
539 rtx in_hi, in_lo, out_hi, out_lo;
540
541 in_hi = gen_rtx_XOR (SImode, gen_highpart (SImode, operands[1]),
542 GEN_INT (0x80000000));
543 in_lo = gen_lowpart (SImode, operands[1]);
544 out_hi = gen_highpart (SImode, operands[0]);
545 out_lo = gen_lowpart (SImode, operands[0]);
546
547 if (REGNO (in_lo) == REGNO (out_hi))
548 {
549 emit_insn (gen_rtx_SET (SImode, out_lo, in_lo));
550 operands[0] = out_hi;
551 operands[1] = in_hi;
552 }
553 else
554 {
555 emit_insn (gen_rtx_SET (SImode, out_hi, in_hi));
556 operands[0] = out_lo;
557 operands[1] = in_lo;
558 }
559 }
560 "
9b66ebb1 561 [(set_attr "predicable" "yes")
81632f11 562 (set_attr "length" "4,4,8")
51c69ddb 563 (set_attr "type" "ffarithd")]
9b66ebb1
PB
564)
565
566
567;; Arithmetic insns
568
569(define_insn "*addsf3_vfp"
f1adb0a9
JB
570 [(set (match_operand:SF 0 "s_register_operand" "=t")
571 (plus:SF (match_operand:SF 1 "s_register_operand" "t")
572 (match_operand:SF 2 "s_register_operand" "t")))]
5b3e6663 573 "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP"
9b66ebb1
PB
574 "fadds%?\\t%0, %1, %2"
575 [(set_attr "predicable" "yes")
51c69ddb 576 (set_attr "type" "fadds")]
9b66ebb1
PB
577)
578
579(define_insn "*adddf3_vfp"
580 [(set (match_operand:DF 0 "s_register_operand" "=w")
581 (plus:DF (match_operand:DF 1 "s_register_operand" "w")
582 (match_operand:DF 2 "s_register_operand" "w")))]
5b3e6663 583 "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP"
9b66ebb1
PB
584 "faddd%?\\t%P0, %P1, %P2"
585 [(set_attr "predicable" "yes")
51c69ddb 586 (set_attr "type" "faddd")]
9b66ebb1
PB
587)
588
589
590(define_insn "*subsf3_vfp"
f1adb0a9
JB
591 [(set (match_operand:SF 0 "s_register_operand" "=t")
592 (minus:SF (match_operand:SF 1 "s_register_operand" "t")
593 (match_operand:SF 2 "s_register_operand" "t")))]
5b3e6663 594 "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP"
9b66ebb1
PB
595 "fsubs%?\\t%0, %1, %2"
596 [(set_attr "predicable" "yes")
51c69ddb 597 (set_attr "type" "fadds")]
9b66ebb1
PB
598)
599
600(define_insn "*subdf3_vfp"
601 [(set (match_operand:DF 0 "s_register_operand" "=w")
602 (minus:DF (match_operand:DF 1 "s_register_operand" "w")
603 (match_operand:DF 2 "s_register_operand" "w")))]
5b3e6663 604 "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP"
9b66ebb1
PB
605 "fsubd%?\\t%P0, %P1, %P2"
606 [(set_attr "predicable" "yes")
51c69ddb 607 (set_attr "type" "faddd")]
9b66ebb1
PB
608)
609
610
611;; Division insns
612
613(define_insn "*divsf3_vfp"
f1adb0a9
JB
614 [(set (match_operand:SF 0 "s_register_operand" "+t")
615 (div:SF (match_operand:SF 1 "s_register_operand" "t")
616 (match_operand:SF 2 "s_register_operand" "t")))]
5b3e6663 617 "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP"
9b66ebb1
PB
618 "fdivs%?\\t%0, %1, %2"
619 [(set_attr "predicable" "yes")
620 (set_attr "type" "fdivs")]
621)
622
623(define_insn "*divdf3_vfp"
624 [(set (match_operand:DF 0 "s_register_operand" "+w")
625 (div:DF (match_operand:DF 1 "s_register_operand" "w")
626 (match_operand:DF 2 "s_register_operand" "w")))]
5b3e6663 627 "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP"
9b66ebb1
PB
628 "fdivd%?\\t%P0, %P1, %P2"
629 [(set_attr "predicable" "yes")
630 (set_attr "type" "fdivd")]
631)
632
633
634;; Multiplication insns
635
636(define_insn "*mulsf3_vfp"
f1adb0a9
JB
637 [(set (match_operand:SF 0 "s_register_operand" "+t")
638 (mult:SF (match_operand:SF 1 "s_register_operand" "t")
639 (match_operand:SF 2 "s_register_operand" "t")))]
5b3e6663 640 "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP"
9b66ebb1
PB
641 "fmuls%?\\t%0, %1, %2"
642 [(set_attr "predicable" "yes")
a8e17e9e 643 (set_attr "type" "fmuls")]
9b66ebb1
PB
644)
645
646(define_insn "*muldf3_vfp"
647 [(set (match_operand:DF 0 "s_register_operand" "+w")
648 (mult:DF (match_operand:DF 1 "s_register_operand" "w")
649 (match_operand:DF 2 "s_register_operand" "w")))]
5b3e6663 650 "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP"
9b66ebb1
PB
651 "fmuld%?\\t%P0, %P1, %P2"
652 [(set_attr "predicable" "yes")
a8e17e9e 653 (set_attr "type" "fmuld")]
9b66ebb1
PB
654)
655
656
657(define_insn "*mulsf3negsf_vfp"
f1adb0a9
JB
658 [(set (match_operand:SF 0 "s_register_operand" "+t")
659 (mult:SF (neg:SF (match_operand:SF 1 "s_register_operand" "t"))
660 (match_operand:SF 2 "s_register_operand" "t")))]
5b3e6663 661 "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP"
9b66ebb1
PB
662 "fnmuls%?\\t%0, %1, %2"
663 [(set_attr "predicable" "yes")
a8e17e9e 664 (set_attr "type" "fmuls")]
9b66ebb1
PB
665)
666
667(define_insn "*muldf3negdf_vfp"
668 [(set (match_operand:DF 0 "s_register_operand" "+w")
669 (mult:DF (neg:DF (match_operand:DF 1 "s_register_operand" "w"))
670 (match_operand:DF 2 "s_register_operand" "w")))]
5b3e6663 671 "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP"
9b66ebb1
PB
672 "fnmuld%?\\t%P0, %P1, %P2"
673 [(set_attr "predicable" "yes")
a8e17e9e 674 (set_attr "type" "fmuld")]
9b66ebb1
PB
675)
676
677
678;; Multiply-accumulate insns
679
680;; 0 = 1 * 2 + 0
681(define_insn "*mulsf3addsf_vfp"
f1adb0a9
JB
682 [(set (match_operand:SF 0 "s_register_operand" "=t")
683 (plus:SF (mult:SF (match_operand:SF 2 "s_register_operand" "t")
684 (match_operand:SF 3 "s_register_operand" "t"))
9b66ebb1 685 (match_operand:SF 1 "s_register_operand" "0")))]
5b3e6663 686 "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP"
9b66ebb1
PB
687 "fmacs%?\\t%0, %2, %3"
688 [(set_attr "predicable" "yes")
a8e17e9e 689 (set_attr "type" "fmacs")]
9b66ebb1
PB
690)
691
692(define_insn "*muldf3adddf_vfp"
693 [(set (match_operand:DF 0 "s_register_operand" "=w")
694 (plus:DF (mult:DF (match_operand:DF 2 "s_register_operand" "w")
695 (match_operand:DF 3 "s_register_operand" "w"))
696 (match_operand:DF 1 "s_register_operand" "0")))]
5b3e6663 697 "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP"
9b66ebb1
PB
698 "fmacd%?\\t%P0, %P2, %P3"
699 [(set_attr "predicable" "yes")
a8e17e9e 700 (set_attr "type" "fmacd")]
9b66ebb1
PB
701)
702
703;; 0 = 1 * 2 - 0
704(define_insn "*mulsf3subsf_vfp"
f1adb0a9
JB
705 [(set (match_operand:SF 0 "s_register_operand" "=t")
706 (minus:SF (mult:SF (match_operand:SF 2 "s_register_operand" "t")
707 (match_operand:SF 3 "s_register_operand" "t"))
9b66ebb1 708 (match_operand:SF 1 "s_register_operand" "0")))]
5b3e6663 709 "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP"
9b66ebb1
PB
710 "fmscs%?\\t%0, %2, %3"
711 [(set_attr "predicable" "yes")
a8e17e9e 712 (set_attr "type" "fmacs")]
9b66ebb1
PB
713)
714
715(define_insn "*muldf3subdf_vfp"
716 [(set (match_operand:DF 0 "s_register_operand" "=w")
717 (minus:DF (mult:DF (match_operand:DF 2 "s_register_operand" "w")
718 (match_operand:DF 3 "s_register_operand" "w"))
719 (match_operand:DF 1 "s_register_operand" "0")))]
5b3e6663 720 "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP"
9b66ebb1
PB
721 "fmscd%?\\t%P0, %P2, %P3"
722 [(set_attr "predicable" "yes")
a8e17e9e 723 (set_attr "type" "fmacd")]
9b66ebb1
PB
724)
725
726;; 0 = -(1 * 2) + 0
727(define_insn "*mulsf3negsfaddsf_vfp"
f1adb0a9 728 [(set (match_operand:SF 0 "s_register_operand" "=t")
9b66ebb1 729 (minus:SF (match_operand:SF 1 "s_register_operand" "0")
f1adb0a9
JB
730 (mult:SF (match_operand:SF 2 "s_register_operand" "t")
731 (match_operand:SF 3 "s_register_operand" "t"))))]
5b3e6663 732 "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP"
9b66ebb1
PB
733 "fnmacs%?\\t%0, %2, %3"
734 [(set_attr "predicable" "yes")
a8e17e9e 735 (set_attr "type" "fmacs")]
9b66ebb1
PB
736)
737
738(define_insn "*fmuldf3negdfadddf_vfp"
739 [(set (match_operand:DF 0 "s_register_operand" "=w")
740 (minus:DF (match_operand:DF 1 "s_register_operand" "0")
741 (mult:DF (match_operand:DF 2 "s_register_operand" "w")
742 (match_operand:DF 3 "s_register_operand" "w"))))]
5b3e6663 743 "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP"
9b66ebb1
PB
744 "fnmacd%?\\t%P0, %P2, %P3"
745 [(set_attr "predicable" "yes")
a8e17e9e 746 (set_attr "type" "fmacd")]
9b66ebb1
PB
747)
748
749
750;; 0 = -(1 * 2) - 0
751(define_insn "*mulsf3negsfsubsf_vfp"
f1adb0a9 752 [(set (match_operand:SF 0 "s_register_operand" "=t")
9b66ebb1 753 (minus:SF (mult:SF
f1adb0a9
JB
754 (neg:SF (match_operand:SF 2 "s_register_operand" "t"))
755 (match_operand:SF 3 "s_register_operand" "t"))
9b66ebb1 756 (match_operand:SF 1 "s_register_operand" "0")))]
5b3e6663 757 "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP"
9b66ebb1
PB
758 "fnmscs%?\\t%0, %2, %3"
759 [(set_attr "predicable" "yes")
a8e17e9e 760 (set_attr "type" "fmacs")]
9b66ebb1
PB
761)
762
763(define_insn "*muldf3negdfsubdf_vfp"
764 [(set (match_operand:DF 0 "s_register_operand" "=w")
765 (minus:DF (mult:DF
766 (neg:DF (match_operand:DF 2 "s_register_operand" "w"))
767 (match_operand:DF 3 "s_register_operand" "w"))
768 (match_operand:DF 1 "s_register_operand" "0")))]
5b3e6663 769 "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP"
9b66ebb1
PB
770 "fnmscd%?\\t%P0, %P2, %P3"
771 [(set_attr "predicable" "yes")
a8e17e9e 772 (set_attr "type" "fmacd")]
9b66ebb1
PB
773)
774
775
776;; Conversion routines
777
778(define_insn "*extendsfdf2_vfp"
779 [(set (match_operand:DF 0 "s_register_operand" "=w")
f1adb0a9 780 (float_extend:DF (match_operand:SF 1 "s_register_operand" "t")))]
5b3e6663 781 "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP"
9b66ebb1
PB
782 "fcvtds%?\\t%P0, %1"
783 [(set_attr "predicable" "yes")
75fe7b2f 784 (set_attr "type" "f_cvt")]
9b66ebb1
PB
785)
786
787(define_insn "*truncdfsf2_vfp"
f1adb0a9 788 [(set (match_operand:SF 0 "s_register_operand" "=t")
9b66ebb1 789 (float_truncate:SF (match_operand:DF 1 "s_register_operand" "w")))]
5b3e6663 790 "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP"
9b66ebb1
PB
791 "fcvtsd%?\\t%0, %P1"
792 [(set_attr "predicable" "yes")
75fe7b2f 793 (set_attr "type" "f_cvt")]
9b66ebb1
PB
794)
795
0fd8c3ad
SL
796(define_insn "extendhfsf2"
797 [(set (match_operand:SF 0 "s_register_operand" "=t")
798 (float_extend:SF (match_operand:HF 1 "s_register_operand" "t")))]
799 "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_NEON_FP16"
800 "vcvtb%?.f32.f16\\t%0, %1"
801 [(set_attr "predicable" "yes")
802 (set_attr "type" "f_cvt")]
803)
804
805(define_insn "truncsfhf2"
806 [(set (match_operand:HF 0 "s_register_operand" "=t")
807 (float_truncate:HF (match_operand:SF 1 "s_register_operand" "t")))]
808 "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_NEON_FP16"
809 "vcvtb%?.f16.f32\\t%0, %1"
810 [(set_attr "predicable" "yes")
811 (set_attr "type" "f_cvt")]
812)
813
9b66ebb1 814(define_insn "*truncsisf2_vfp"
f1adb0a9
JB
815 [(set (match_operand:SI 0 "s_register_operand" "=t")
816 (fix:SI (fix:SF (match_operand:SF 1 "s_register_operand" "t"))))]
5b3e6663 817 "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP"
9b66ebb1
PB
818 "ftosizs%?\\t%0, %1"
819 [(set_attr "predicable" "yes")
75fe7b2f 820 (set_attr "type" "f_cvt")]
9b66ebb1
PB
821)
822
823(define_insn "*truncsidf2_vfp"
f1adb0a9 824 [(set (match_operand:SI 0 "s_register_operand" "=t")
9b66ebb1 825 (fix:SI (fix:DF (match_operand:DF 1 "s_register_operand" "w"))))]
5b3e6663 826 "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP"
9b66ebb1
PB
827 "ftosizd%?\\t%0, %P1"
828 [(set_attr "predicable" "yes")
75fe7b2f 829 (set_attr "type" "f_cvt")]
9b66ebb1
PB
830)
831
6f6c1f6d
PB
832
833(define_insn "fixuns_truncsfsi2"
f1adb0a9
JB
834 [(set (match_operand:SI 0 "s_register_operand" "=t")
835 (unsigned_fix:SI (fix:SF (match_operand:SF 1 "s_register_operand" "t"))))]
5b3e6663 836 "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP"
6f6c1f6d
PB
837 "ftouizs%?\\t%0, %1"
838 [(set_attr "predicable" "yes")
75fe7b2f 839 (set_attr "type" "f_cvt")]
6f6c1f6d
PB
840)
841
842(define_insn "fixuns_truncdfsi2"
f1adb0a9
JB
843 [(set (match_operand:SI 0 "s_register_operand" "=t")
844 (unsigned_fix:SI (fix:DF (match_operand:DF 1 "s_register_operand" "t"))))]
5b3e6663 845 "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP"
6f6c1f6d
PB
846 "ftouizd%?\\t%0, %P1"
847 [(set_attr "predicable" "yes")
75fe7b2f 848 (set_attr "type" "f_cvt")]
6f6c1f6d
PB
849)
850
851
9b66ebb1 852(define_insn "*floatsisf2_vfp"
f1adb0a9
JB
853 [(set (match_operand:SF 0 "s_register_operand" "=t")
854 (float:SF (match_operand:SI 1 "s_register_operand" "t")))]
5b3e6663 855 "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP"
9b66ebb1
PB
856 "fsitos%?\\t%0, %1"
857 [(set_attr "predicable" "yes")
75fe7b2f 858 (set_attr "type" "f_cvt")]
9b66ebb1
PB
859)
860
861(define_insn "*floatsidf2_vfp"
862 [(set (match_operand:DF 0 "s_register_operand" "=w")
f1adb0a9 863 (float:DF (match_operand:SI 1 "s_register_operand" "t")))]
5b3e6663 864 "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP"
9b66ebb1
PB
865 "fsitod%?\\t%P0, %1"
866 [(set_attr "predicable" "yes")
75fe7b2f 867 (set_attr "type" "f_cvt")]
9b66ebb1
PB
868)
869
870
6f6c1f6d 871(define_insn "floatunssisf2"
f1adb0a9
JB
872 [(set (match_operand:SF 0 "s_register_operand" "=t")
873 (unsigned_float:SF (match_operand:SI 1 "s_register_operand" "t")))]
5b3e6663 874 "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP"
6f6c1f6d
PB
875 "fuitos%?\\t%0, %1"
876 [(set_attr "predicable" "yes")
75fe7b2f 877 (set_attr "type" "f_cvt")]
6f6c1f6d
PB
878)
879
880(define_insn "floatunssidf2"
881 [(set (match_operand:DF 0 "s_register_operand" "=w")
f1adb0a9 882 (unsigned_float:DF (match_operand:SI 1 "s_register_operand" "t")))]
5b3e6663 883 "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP"
6f6c1f6d
PB
884 "fuitod%?\\t%P0, %1"
885 [(set_attr "predicable" "yes")
75fe7b2f 886 (set_attr "type" "f_cvt")]
6f6c1f6d
PB
887)
888
889
9b66ebb1
PB
890;; Sqrt insns.
891
892(define_insn "*sqrtsf2_vfp"
f1adb0a9
JB
893 [(set (match_operand:SF 0 "s_register_operand" "=t")
894 (sqrt:SF (match_operand:SF 1 "s_register_operand" "t")))]
5b3e6663 895 "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP"
9b66ebb1
PB
896 "fsqrts%?\\t%0, %1"
897 [(set_attr "predicable" "yes")
898 (set_attr "type" "fdivs")]
899)
900
901(define_insn "*sqrtdf2_vfp"
902 [(set (match_operand:DF 0 "s_register_operand" "=w")
903 (sqrt:DF (match_operand:DF 1 "s_register_operand" "w")))]
5b3e6663 904 "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP"
9b66ebb1
PB
905 "fsqrtd%?\\t%P0, %P1"
906 [(set_attr "predicable" "yes")
907 (set_attr "type" "fdivd")]
908)
909
910
911;; Patterns to split/copy vfp condition flags.
912
913(define_insn "*movcc_vfp"
914 [(set (reg CC_REGNUM)
915 (reg VFPCC_REGNUM))]
5b3e6663 916 "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP"
9b66ebb1
PB
917 "fmstat%?"
918 [(set_attr "conds" "set")
75fe7b2f 919 (set_attr "type" "f_flag")]
9b66ebb1
PB
920)
921
922(define_insn_and_split "*cmpsf_split_vfp"
923 [(set (reg:CCFP CC_REGNUM)
f1adb0a9
JB
924 (compare:CCFP (match_operand:SF 0 "s_register_operand" "t")
925 (match_operand:SF 1 "vfp_compare_operand" "tG")))]
5b3e6663 926 "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP"
9b66ebb1 927 "#"
5b3e6663 928 "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP"
9b66ebb1
PB
929 [(set (reg:CCFP VFPCC_REGNUM)
930 (compare:CCFP (match_dup 0)
931 (match_dup 1)))
932 (set (reg:CCFP CC_REGNUM)
933 (reg:CCFP VFPCC_REGNUM))]
934 ""
935)
936
937(define_insn_and_split "*cmpsf_trap_split_vfp"
938 [(set (reg:CCFPE CC_REGNUM)
f1adb0a9
JB
939 (compare:CCFPE (match_operand:SF 0 "s_register_operand" "t")
940 (match_operand:SF 1 "vfp_compare_operand" "tG")))]
5b3e6663 941 "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP"
9b66ebb1 942 "#"
5b3e6663 943 "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP"
9b66ebb1
PB
944 [(set (reg:CCFPE VFPCC_REGNUM)
945 (compare:CCFPE (match_dup 0)
946 (match_dup 1)))
947 (set (reg:CCFPE CC_REGNUM)
948 (reg:CCFPE VFPCC_REGNUM))]
949 ""
950)
951
952(define_insn_and_split "*cmpdf_split_vfp"
953 [(set (reg:CCFP CC_REGNUM)
954 (compare:CCFP (match_operand:DF 0 "s_register_operand" "w")
955 (match_operand:DF 1 "vfp_compare_operand" "wG")))]
5b3e6663 956 "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP"
9b66ebb1 957 "#"
5b3e6663 958 "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP"
9b66ebb1
PB
959 [(set (reg:CCFP VFPCC_REGNUM)
960 (compare:CCFP (match_dup 0)
961 (match_dup 1)))
962 (set (reg:CCFP CC_REGNUM)
963 (reg:CCFPE VFPCC_REGNUM))]
964 ""
965)
966
967(define_insn_and_split "*cmpdf_trap_split_vfp"
968 [(set (reg:CCFPE CC_REGNUM)
969 (compare:CCFPE (match_operand:DF 0 "s_register_operand" "w")
970 (match_operand:DF 1 "vfp_compare_operand" "wG")))]
5b3e6663 971 "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP"
9b66ebb1 972 "#"
5b3e6663 973 "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP"
9b66ebb1
PB
974 [(set (reg:CCFPE VFPCC_REGNUM)
975 (compare:CCFPE (match_dup 0)
976 (match_dup 1)))
977 (set (reg:CCFPE CC_REGNUM)
978 (reg:CCFPE VFPCC_REGNUM))]
979 ""
980)
981
982
983;; Comparison patterns
984
985(define_insn "*cmpsf_vfp"
986 [(set (reg:CCFP VFPCC_REGNUM)
f1adb0a9
JB
987 (compare:CCFP (match_operand:SF 0 "s_register_operand" "t,t")
988 (match_operand:SF 1 "vfp_compare_operand" "t,G")))]
5b3e6663 989 "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP"
9b66ebb1
PB
990 "@
991 fcmps%?\\t%0, %1
992 fcmpzs%?\\t%0"
993 [(set_attr "predicable" "yes")
51c69ddb 994 (set_attr "type" "fcmps")]
9b66ebb1
PB
995)
996
997(define_insn "*cmpsf_trap_vfp"
998 [(set (reg:CCFPE VFPCC_REGNUM)
f1adb0a9
JB
999 (compare:CCFPE (match_operand:SF 0 "s_register_operand" "t,t")
1000 (match_operand:SF 1 "vfp_compare_operand" "t,G")))]
5b3e6663 1001 "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP"
9b66ebb1
PB
1002 "@
1003 fcmpes%?\\t%0, %1
1004 fcmpezs%?\\t%0"
1005 [(set_attr "predicable" "yes")
51c69ddb 1006 (set_attr "type" "fcmpd")]
9b66ebb1
PB
1007)
1008
1009(define_insn "*cmpdf_vfp"
1010 [(set (reg:CCFP VFPCC_REGNUM)
1011 (compare:CCFP (match_operand:DF 0 "s_register_operand" "w,w")
1012 (match_operand:DF 1 "vfp_compare_operand" "w,G")))]
5b3e6663 1013 "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP"
9b66ebb1
PB
1014 "@
1015 fcmpd%?\\t%P0, %P1
1016 fcmpzd%?\\t%P0"
1017 [(set_attr "predicable" "yes")
51c69ddb 1018 (set_attr "type" "fcmpd")]
9b66ebb1
PB
1019)
1020
1021(define_insn "*cmpdf_trap_vfp"
1022 [(set (reg:CCFPE VFPCC_REGNUM)
1023 (compare:CCFPE (match_operand:DF 0 "s_register_operand" "w,w")
1024 (match_operand:DF 1 "vfp_compare_operand" "w,G")))]
5b3e6663 1025 "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP"
9b66ebb1
PB
1026 "@
1027 fcmped%?\\t%P0, %P1
1028 fcmpezd%?\\t%P0"
1029 [(set_attr "predicable" "yes")
51c69ddb 1030 (set_attr "type" "fcmpd")]
9b66ebb1
PB
1031)
1032
1033
1034;; Store multiple insn used in function prologue.
1035
1036(define_insn "*push_multi_vfp"
1037 [(match_parallel 2 "multi_register_push"
1038 [(set (match_operand:BLK 0 "memory_operand" "=m")
1039 (unspec:BLK [(match_operand:DF 1 "s_register_operand" "w")]
1040 UNSPEC_PUSH_MULT))])]
5b3e6663 1041 "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP"
8edfc4cc 1042 "* return vfp_output_fstmd (operands);"
75fe7b2f 1043 [(set_attr "type" "f_stored")]
9b66ebb1
PB
1044)
1045
1046
1047;; Unimplemented insns:
1048;; fldm*
1049;; fstm*
1050;; fmdhr et al (VFPv1)
59b9a953 1051;; Support for xD (single precision only) variants.
9b66ebb1 1052;; fmrrs, fmsrr