fpu.md revision 1.5
1;; ::::::::::::::::::::
2;; ::
3;; :: 32-bit floating point arithmetic
4;; ::
5;; ::::::::::::::::::::
6
7;; Addition
8(define_insn "*addsf3_fpu"
9  [(set (match_operand:SF 0 "register_operand"           "=r,r,  r,r,r,r")
10	(plus:SF (match_operand:SF 1 "nonmemory_operand" "%0,r,  r,0,r,F")
11		 (match_operand:SF 2 "nonmemory_operand"  "r,r,CfZ,F,F,r")))]
12  "TARGET_FP_SP_BASE
13   && (register_operand (operands[1], SFmode)
14       || register_operand (operands[2], SFmode))"
15  "fsadd%?\\t%0,%1,%2"
16  [(set_attr "length" "4,4,4,8,8,8")
17   (set_attr "iscompact" "false")
18   (set_attr "type" "fpu")
19   (set_attr "predicable" "yes,no,no,yes,no,no")
20   (set_attr "cond" "canuse,nocond,nocond,canuse_limm,nocond,nocond")
21   ])
22
23;; Subtraction
24(define_insn "*subsf3_fpu"
25  [(set (match_operand:SF 0 "register_operand"           "=r,r,  r,r,r,r")
26	(minus:SF (match_operand:SF 1 "nonmemory_operand" "0,r,  r,0,r,F")
27		  (match_operand:SF 2 "nonmemory_operand" "r,r,CfZ,F,F,r")))]
28  "TARGET_FP_SP_BASE
29   && (register_operand (operands[1], SFmode)
30       || register_operand (operands[2], SFmode))"
31  "fssub%?\\t%0,%1,%2"
32  [(set_attr "length" "4,4,4,8,8,8")
33   (set_attr "iscompact" "false")
34   (set_attr "type" "fpu")
35   (set_attr "predicable" "yes,no,no,yes,no,no")
36   (set_attr "cond" "canuse,nocond,nocond,canuse_limm,nocond,nocond")
37   ])
38
39;; Multiplication
40(define_insn "*mulsf3_fpu"
41  [(set (match_operand:SF 0 "register_operand"           "=r,r,r,r,r")
42	(mult:SF (match_operand:SF 1 "nonmemory_operand" "%0,r,0,r,F")
43		 (match_operand:SF 2 "nonmemory_operand"  "r,r,F,F,r")))]
44  "TARGET_FP_SP_BASE
45   && (register_operand (operands[1], SFmode)
46       || register_operand (operands[2], SFmode))"
47  "fsmul%?\\t%0,%1,%2"
48  [(set_attr "length" "4,4,8,8,8")
49   (set_attr "iscompact" "false")
50   (set_attr "type" "fpu")
51   (set_attr "predicable" "yes,no,yes,no,no")
52   (set_attr "cond" "canuse,nocond,canuse_limm,nocond,nocond")
53   ])
54
55;; Multiplication with addition/subtraction
56(define_expand "fmasf4"
57  [(set (match_operand:SF 0 "register_operand" "")
58	(fma:SF (match_operand:SF 1 "nonmemory_operand" "")
59		(match_operand:SF 2 "nonmemory_operand" "")
60		(match_operand:SF 3 "nonmemory_operand" "")))]
61  "TARGET_FP_SP_FUSED"
62  "{
63   rtx tmp;
64   tmp = gen_rtx_REG (SFmode, ACCL_REGNO);
65   emit_move_insn (tmp, operands[3]);
66   operands[3] = tmp;
67   if (!register_operand (operands[1], SFmode)
68        && !register_operand (operands[2], SFmode))
69     operands[2] = force_reg (SFmode, operands[2]);
70   }")
71
72(define_expand "fnmasf4"
73  [(set (match_operand:SF 0 "register_operand" "")
74	(fma:SF (neg:SF (match_operand:SF 1 "nonmemory_operand" ""))
75		(match_operand:SF 2 "nonmemory_operand"         "")
76		(match_operand:SF 3 "nonmemory_operand"         "")))]
77  "TARGET_FP_SP_FUSED"
78  "{
79   rtx tmp;
80   tmp = gen_rtx_REG (SFmode, ACCL_REGNO);
81   emit_move_insn (tmp, operands[3]);
82   operands[3] = tmp;
83   if (!register_operand (operands[1], SFmode)
84        && !register_operand (operands[2], SFmode))
85     operands[2] = force_reg (SFmode, operands[2]);
86}")
87
88(define_insn "fmasf4_fpu"
89  [(set (match_operand:SF 0 "register_operand"          "=r,r,r,r,r")
90	(fma:SF (match_operand:SF 1 "nonmemory_operand" "%0,r,0,r,F")
91		(match_operand:SF 2 "nonmemory_operand"  "r,r,F,F,r")
92		(match_operand:SF 3 "accl_operand" "")))]
93  "TARGET_FP_SP_FUSED
94   && (register_operand (operands[1], SFmode)
95       || register_operand (operands[2], SFmode))"
96  "fsmadd%? %0,%1,%2"
97  [(set_attr "length" "4,4,8,8,8")
98   (set_attr "predicable" "yes,no,yes,no,no")
99   (set_attr "cond" "canuse,nocond,canuse_limm,nocond,nocond")
100   (set_attr "iscompact" "false")
101   (set_attr "type" "fpu_fuse")])
102
103(define_insn "fnmasf4_fpu"
104  [(set (match_operand:SF 0 "register_operand"                  "=r,r,r,r,r")
105	(fma:SF (neg:SF (match_operand:SF 1 "nonmemory_operand" "%0,r,0,r,F"))
106		(match_operand:SF 2 "nonmemory_operand"          "r,r,F,F,r")
107		(match_operand:SF 3 "accl_operand" "")))]
108  "TARGET_FP_SP_FUSED
109   && (register_operand (operands[1], SFmode)
110       || register_operand (operands[2], SFmode))"
111  "fsmsub%?\\t%0,%1,%2"
112  [(set_attr "length" "4,4,8,8,8")
113   (set_attr "predicable" "yes,no,yes,no,no")
114   (set_attr "cond" "canuse,nocond,canuse_limm,nocond,nocond")
115   (set_attr "iscompact" "false")
116   (set_attr "type" "fpu_fuse")])
117
118(define_expand "fmadf4"
119  [(match_operand:DF 0 "even_register_operand" "")
120   (match_operand:DF 1 "even_register_operand" "")
121   (match_operand:DF 2 "even_register_operand" "")
122   (match_operand:DF 3 "even_register_operand" "")]
123  "TARGET_FP_DP_FUSED"
124  "{
125   emit_insn (gen_fmadf4_split (operands[0], operands[1], operands[2], operands[3]));
126   DONE;
127   }")
128
129(define_insn_and_split "fmadf4_split"
130  [(set (match_operand:DF 0 "even_register_operand"        "")
131	(fma:DF (match_operand:DF 1 "even_register_operand" "")
132		(match_operand:DF 2 "even_register_operand" "")
133		(match_operand:DF 3 "even_register_operand" "")))
134   (clobber (reg:DF ARCV2_ACC))]
135  "TARGET_FP_DP_FUSED"
136  "#"
137  "TARGET_FP_DP_FUSED"
138  [(const_int 0)]
139  "{
140   rtx acc_reg = gen_rtx_REG (DFmode, ACC_REG_FIRST);
141   emit_move_insn (acc_reg, operands[3]);
142   emit_insn (gen_fmadf4_fpu (operands[0], operands[1], operands[2]));
143   DONE;
144  }"
145)
146
147(define_expand "fnmadf4"
148  [(match_operand:DF 0 "even_register_operand" "")
149   (match_operand:DF 1 "even_register_operand" "")
150   (match_operand:DF 2 "even_register_operand" "")
151   (match_operand:DF 3 "even_register_operand" "")]
152  "TARGET_FP_DP_FUSED"
153  "{
154   emit_insn (gen_fnmadf4_split (operands[0], operands[1], operands[2], operands[3]));
155   DONE;
156   }")
157
158(define_insn_and_split "fnmadf4_split"
159  [(set (match_operand:DF 0 "even_register_operand"                 "")
160	(fma:DF (neg:DF (match_operand:DF 1 "even_register_operand" ""))
161		(match_operand:DF 2 "even_register_operand"         "")
162		(match_operand:DF 3 "even_register_operand"         "")))
163   (clobber (reg:DF ARCV2_ACC))]
164  "TARGET_FP_DP_FUSED"
165  "#"
166  "TARGET_FP_DP_FUSED"
167  [(const_int 0)]
168  "{
169   rtx acc_reg = gen_rtx_REG (DFmode, ACC_REG_FIRST);
170   emit_move_insn (acc_reg, operands[3]);
171   emit_insn (gen_fnmadf4_fpu (operands[0], operands[1], operands[2]));
172   DONE;
173  }")
174
175(define_insn "fmadf4_fpu"
176  [(set (match_operand:DF 0 "even_register_operand"         "=r,r")
177	(fma:DF (match_operand:DF 1 "even_register_operand" "%0,r")
178		(match_operand:DF 2 "even_register_operand"  "r,r")
179		(reg:DF ARCV2_ACC)))]
180  "TARGET_FP_DP_FUSED"
181  "fdmadd%?\\t%0,%1,%2"
182  [(set_attr "length" "4,4")
183   (set_attr "predicable" "yes,no")
184   (set_attr "cond" "canuse,nocond")
185   (set_attr "iscompact" "false")
186   (set_attr "type" "fpu_fuse")])
187
188(define_insn "fnmadf4_fpu"
189  [(set (match_operand:DF 0 "even_register_operand"                 "=r,r")
190	(fma:DF (neg:DF (match_operand:DF 1 "even_register_operand" "%0,r"))
191		(match_operand:DF 2 "even_register_operand"          "r,r")
192		(reg:DF ARCV2_ACC)))]
193  "TARGET_FP_DP_FUSED"
194  "fdmsub%?\\t%0,%1,%2"
195  [(set_attr "length" "4,4")
196   (set_attr "predicable" "yes,no")
197   (set_attr "cond" "canuse,nocond")
198   (set_attr "iscompact" "false")
199   (set_attr "type" "fpu_fuse")])
200
201;; Division
202(define_insn "*divsf3_fpu"
203  [(set (match_operand:SF 0 "register_operand"         "=r,r,r,r,r")
204	(div:SF (match_operand:SF 1 "nonmemory_operand" "0,r,0,r,F")
205		(match_operand:SF 2 "nonmemory_operand" "r,r,F,F,r")))]
206  "TARGET_FP_SP_SQRT
207   && (register_operand (operands[1], SFmode)
208       || register_operand (operands[2], SFmode))"
209  "fsdiv%?\\t%0,%1,%2"
210  [(set_attr "length" "4,4,8,8,8")
211   (set_attr "iscompact" "false")
212   (set_attr "type" "fpu_sdiv")
213   (set_attr "predicable" "yes,no,yes,no,no")
214   (set_attr "cond" "canuse,nocond,canuse_limm,nocond,nocond")
215   ])
216
217;; Negation
218;; see pattern in arc.md
219
220;; Absolute value
221;; see pattern in arc.md
222
223;; Square root
224(define_insn "sqrtsf2_fpu"
225  [(set (match_operand:SF 0 "register_operand"           "=r,r")
226	(sqrt:SF (match_operand:SF 1 "nonmemory_operand"  "r,F")))]
227  "TARGET_FP_SP_SQRT"
228  "fssqrt\\t%0,%1"
229  [(set_attr "length" "4,8")
230   (set_attr "type" "fpu_sdiv")])
231
232;; Comparison
233(define_insn "*cmpsf_fpu"
234  [(set (reg:CC_FPU CC_REG)
235	(compare:CC_FPU (match_operand:SF 0 "register_operand"  "r,  r,r")
236			(match_operand:SF 1 "nonmemory_operand" "r,CfZ,F")))]
237  "TARGET_FP_SP_BASE"
238  "fscmp%?\\t%0,%1"
239  [(set_attr "length" "4,4,8")
240   (set_attr "iscompact" "false")
241   (set_attr "cond" "set")
242   (set_attr "type" "fpu")
243   (set_attr "predicable" "yes")])
244
245(define_insn "*cmpsf_fpu_trap"
246  [(set (reg:CC_FPUE CC_REG)
247	(compare:CC_FPUE (match_operand:SF 0 "register_operand"  "r,  r,r")
248			(match_operand:SF 1 "nonmemory_operand" "r,CfZ,F")))]
249  "TARGET_FP_SP_BASE"
250  "fscmpf%?\\t%0,%1"
251  [(set_attr "length" "4,4,8")
252   (set_attr "iscompact" "false")
253   (set_attr "cond" "set")
254   (set_attr "type" "fpu")
255   (set_attr "predicable" "yes")])
256
257(define_insn "*cmpsf_fpu_uneq"
258  [(set (reg:CC_FPU_UNEQ CC_REG)
259	(compare:CC_FPU_UNEQ
260	 (match_operand:SF 0 "register_operand"  "r,  r,r")
261	 (match_operand:SF 1 "nonmemory_operand" "r,CfZ,F")))]
262  "TARGET_FP_SP_BASE"
263  "fscmp\\t%0,%1\\n\\tmov.v.f\\t0,0\\t;set Z flag"
264  [(set_attr "length" "8,8,12")
265   (set_attr "iscompact" "false")
266   (set_attr "cond" "set")
267   (set_attr "type" "fpu")])
268
269;; ::::::::::::::::::::
270;; ::
271;; :: 64-bit floating point arithmetic
272;; ::
273;; ::::::::::::::::::::
274
275;; Addition
276(define_insn "*adddf3_fpu"
277  [(set (match_operand:DF 0 "even_register_operand"           "=r,r")
278	(plus:DF (match_operand:DF 1 "even_register_operand"  "%0,r")
279		 (match_operand:DF 2 "even_register_operand"   "r,r")))]
280  "TARGET_FP_DP_BASE"
281  "fdadd%? %0,%1,%2"
282  [(set_attr "length" "4,4")
283   (set_attr "iscompact" "false")
284   (set_attr "type" "fpu")
285   (set_attr "predicable" "yes,no")
286   (set_attr "cond" "canuse,nocond")
287   ])
288
289;; Subtraction
290(define_insn "*subdf3_fpu"
291  [(set (match_operand:DF 0 "even_register_operand"           "=r,r")
292	(minus:DF (match_operand:DF 1 "even_register_operand"  "0,r")
293		  (match_operand:DF 2 "even_register_operand"  "r,r")))]
294  "TARGET_FP_DP_BASE"
295  "fdsub%? %0,%1,%2"
296  [(set_attr "length" "4,4")
297   (set_attr "iscompact" "false")
298   (set_attr "type" "fpu")
299   (set_attr "predicable" "yes,no")
300   (set_attr "cond" "canuse,nocond")
301   ])
302
303;; Multiplication
304(define_insn "*muldf3_fpu"
305  [(set (match_operand:DF 0 "even_register_operand"           "=r,r")
306	(mult:DF (match_operand:DF 1 "even_register_operand"  "%0,r")
307		 (match_operand:DF 2 "even_register_operand"   "r,r")))]
308  "TARGET_FP_DP_BASE"
309  "fdmul%? %0,%1,%2"
310  [(set_attr "length" "4,4")
311   (set_attr "iscompact" "false")
312   (set_attr "type" "fpu")
313   (set_attr "predicable" "yes,no")
314   (set_attr "cond" "canuse,nocond")
315   ])
316
317;; Division
318(define_insn "divdf3"
319  [(set (match_operand:DF 0 "even_register_operand"         "=r,r")
320	(div:DF (match_operand:DF 1 "even_register_operand"  "0,r")
321		(match_operand:DF 2 "even_register_operand"  "r,r")))]
322  "TARGET_FP_DP_SQRT"
323  "fddiv%? %0,%1,%2"
324  [(set_attr "length" "4,4")
325   (set_attr "iscompact" "false")
326   (set_attr "type" "fpu_ddiv")
327   (set_attr "predicable" "yes,no")
328   (set_attr "cond" "canuse,nocond")
329   ])
330
331;; Square root
332(define_insn "sqrtdf2"
333  [(set (match_operand:DF 0 "even_register_operand"          "=r")
334	(sqrt:DF (match_operand:DF 1 "even_register_operand"  "r")))]
335  "TARGET_FP_DP_SQRT"
336  "fdsqrt %0,%1"
337  [(set_attr "length" "4")
338   (set_attr "type" "fpu_ddiv")])
339
340;; Comparison
341(define_insn "*cmpdf_fpu"
342  [(set (reg:CC_FPU CC_REG)
343	(compare:CC_FPU (match_operand:DF 0 "even_register_operand"  "r")
344			(match_operand:DF 1 "even_register_operand"  "r")))]
345  "TARGET_FP_DP_BASE"
346  "fdcmp%? %0, %1"
347  [(set_attr "length" "4")
348   (set_attr "iscompact" "false")
349   (set_attr "cond" "set")
350   (set_attr "type" "fpu")
351   (set_attr "predicable" "yes")])
352
353(define_insn "*cmpdf_fpu_trap"
354  [(set (reg:CC_FPUE CC_REG)
355	(compare:CC_FPUE (match_operand:DF 0 "even_register_operand"  "r")
356			(match_operand:DF 1 "even_register_operand"  "r")))]
357  "TARGET_FP_DP_BASE"
358  "fdcmpf%? %0, %1"
359  [(set_attr "length" "4")
360   (set_attr "iscompact" "false")
361   (set_attr "cond" "set")
362   (set_attr "type" "fpu")
363   (set_attr "predicable" "yes")])
364
365(define_insn "*cmpdf_fpu_uneq"
366  [(set (reg:CC_FPU_UNEQ CC_REG)
367	(compare:CC_FPU_UNEQ
368	 (match_operand:DF 0 "even_register_operand"  "r")
369	 (match_operand:DF 1 "even_register_operand"  "r")))]
370  "TARGET_FP_DP_BASE"
371  "fdcmp %0, %1\\n\\tmov.v.f 0,0\\t;set Z flag"
372  [(set_attr "length" "8")
373   (set_attr "iscompact" "false")
374   (set_attr "cond" "set")
375   (set_attr "type" "fpu")])
376
377;; ::::::::::::::::::::
378;; ::
379;; :: Conversion routines
380;; ::
381;; ::::::::::::::::::::
382
383;; SF->DF
384(define_insn "extendsfdf2"
385  [(set (match_operand:DF 0 "even_register_operand"             "=r,r")
386	(float_extend:DF (match_operand:SF 1 "register_operand"  "0,r")))]
387  "TARGET_FP_DP_CONV"
388  "fcvt32_64%? %0,%1,0x04\\t;fs2d %0,%1"
389  [(set_attr "length" "4,4")
390   (set_attr "iscompact" "false")
391   (set_attr "type" "fpu")
392   (set_attr "predicable" "yes,no")]
393)
394
395;; SI->DF
396(define_insn "floatsidf2"
397  [(set (match_operand:DF 0 "even_register_operand"      "=r,r")
398	(float:DF (match_operand:SI 1 "register_operand"  "0,r")))]
399  "TARGET_FP_DP_CONV"
400  "fcvt32_64%? %0,%1,0x02\\t;fint2d %0,%1"
401  [(set_attr "length" "4,4")
402   (set_attr "iscompact" "false")
403   (set_attr "type" "fpu")
404   (set_attr "predicable" "yes,no")]
405)
406
407;; uSI->DF
408(define_insn "floatunssidf2"
409  [(set (match_operand:DF 0 "even_register_operand"               "=r,r")
410	(unsigned_float:DF (match_operand:SI 1 "register_operand"  "0,r")))]
411  "TARGET_FP_DP_CONV"
412  "fcvt32_64%? %0,%1,0x00\\t;fuint2d %0,%1"
413  [(set_attr "length" "4,4")
414   (set_attr "iscompact" "false")
415   (set_attr "type" "fpu")
416   (set_attr "predicable" "yes,no")]
417)
418
419;; SF->uDI (using rounding towards zero)
420(define_insn "fixuns_truncsfdi2"
421  [(set (match_operand:DI 0 "even_register_operand"                    "=r,r")
422	(unsigned_fix:DI (fix:SF (match_operand:SF 1 "register_operand" "0,r"))))]
423  "TARGET_FP_DP_CONV"
424  "fcvt32_64%? %0,%1,0x09\\t;fs2ul_rz %0,%1"
425  [(set_attr "length" "4,4")
426   (set_attr "iscompact" "false")
427   (set_attr "type" "fpu")
428   (set_attr "predicable" "yes,no")]
429)
430
431;; SF->DI (using rounding towards zero)
432(define_insn "fix_truncsfdi2"
433  [(set (match_operand:DI 0 "even_register_operand"           "=r,r")
434	(fix:DI (fix:SF (match_operand:SF 1 "register_operand" "0,r"))))]
435  "TARGET_FP_DP_CONV"
436  "fcvt32_64%? %0,%1,0x0B\\t;fs2l_rz %0,%1"
437  [(set_attr "length" "4,4")
438   (set_attr "iscompact" "false")
439   (set_attr "type" "fpu")
440   (set_attr "predicable" "yes,no")]
441)
442
443;; SI->SF
444(define_insn "floatsisf2_fpu"
445  [(set (match_operand:SF 0 "register_operand"           "=r,r")
446	(float:SF (match_operand:SI 1 "register_operand"  "0,r")))]
447  "TARGET_FP_SP_CONV"
448  "fcvt32%? %0,%1,0x02\\t;fint2s %0,%1"
449  [(set_attr "length" "4,4")
450   (set_attr "iscompact" "false")
451   (set_attr "type" "fpu")
452   (set_attr "predicable" "yes,no")]
453)
454
455;; uSI->SF
456(define_insn "floatunssisf2"
457  [(set (match_operand:SF 0 "register_operand"                    "=r,r")
458	(unsigned_float:SF (match_operand:SI 1 "register_operand"  "0,r")))]
459  "TARGET_FP_SP_CONV"
460  "fcvt32%? %0,%1,0x00\\t;fuint2s %0,%1"
461  [(set_attr "length" "4,4")
462   (set_attr "iscompact" "false")
463   (set_attr "type" "fpu")
464   (set_attr "predicable" "yes,no")]
465)
466
467;; SF->uSI (using rounding towards zero)
468(define_insn "fixuns_truncsfsi2"
469  [(set (match_operand:SI 0 "register_operand"                         "=r,r")
470	(unsigned_fix:SI (fix:SF (match_operand:SF 1 "register_operand" "0,r"))))]
471  "TARGET_FP_SP_CONV"
472  "fcvt32%? %0,%1,0x09\\t;fs2uint_rz %0,%1"
473  [(set_attr "length" "4,4")
474   (set_attr "iscompact" "false")
475   (set_attr "type" "fpu")
476   (set_attr "predicable" "yes,no")]
477)
478
479;; SF->SI (using rounding towards zero)
480(define_insn "fix_truncsfsi2_fpu"
481  [(set (match_operand:SI 0 "register_operand"                "=r,r")
482	(fix:SI (fix:SF (match_operand:SF 1 "register_operand" "0,r"))))]
483  "TARGET_FP_SP_CONV"
484  "fcvt32%? %0,%1,0x0B\\t;fs2int_rz %0,%1"
485  [(set_attr "length" "4,4")
486   (set_attr "iscompact" "false")
487   (set_attr "type" "fpu")
488   (set_attr "predicable" "yes,no")]
489)
490
491;; DI->DF
492(define_insn "floatdidf2"
493  [(set (match_operand:DF 0 "even_register_operand"          "=r,r")
494	(float:DF (match_operand:DI 1 "even_register_operand" "0,r")))]
495  "TARGET_FP_DP_CONV"
496  "fcvt64%? %0,%1,0x02\\t;fl2d %0,%1"
497  [(set_attr "length" "4,4")
498   (set_attr "iscompact" "false")
499   (set_attr "type" "fpu")
500   (set_attr "predicable" "yes,no")]
501)
502
503;; uDI->DF
504(define_insn "floatunsdidf2"
505  [(set (match_operand:DF 0 "even_register_operand"                   "=r,r")
506	(unsigned_float:DF (match_operand:DI 1 "even_register_operand" "0,r")))]
507  "TARGET_FP_DP_CONV"
508  "fcvt64%? %0,%1,0x00\\t;ful2d %0,%1"
509  [(set_attr "length" "4,4")
510   (set_attr "iscompact" "false")
511   (set_attr "type" "fpu")
512   (set_attr "predicable" "yes,no")]
513)
514
515;; DF->uDI (using rounding towards zero)
516(define_insn "fixuns_truncdfdi2"
517  [(set (match_operand:DI 0 "even_register_operand"                         "=r,r")
518	(unsigned_fix:DI (fix:DF (match_operand:DF 1 "even_register_operand" "0,r"))))]
519  "TARGET_FP_DP_CONV"
520  "fcvt64%? %0,%1,0x09\\t;fd2ul_rz %0,%1"
521  [(set_attr "length" "4,4")
522   (set_attr "iscompact" "false")
523   (set_attr "type" "fpu")
524   (set_attr "predicable" "yes,no")]
525)
526
527;; DF->DI (using rounding towards zero)
528(define_insn "fix_truncdfdi2"
529  [(set (match_operand:DI 0 "even_register_operand"                "=r,r")
530	(fix:DI (fix:DF (match_operand:DF 1 "even_register_operand" "0,r"))))]
531  "TARGET_FP_DP_CONV"
532  "fcvt64%? %0,%1,0x0B\\t;fd2l_rz %0,%1"
533  [(set_attr "length" "4,4")
534   (set_attr "iscompact" "false")
535   (set_attr "type" "fpu")
536   (set_attr "predicable" "yes,no")]
537)
538
539;; DF->SF
540(define_insn "truncdfsf2"
541  [(set (match_operand:SF 0 "register_operand"                        "=r,r")
542	(float_truncate:SF (match_operand:DF 1 "even_register_operand" "0,r")))]
543  "TARGET_FP_DP_CONV"
544  "fcvt64_32%? %0,%1,0x04\\t;fd2s %0,%1"
545  [(set_attr "length" "4,4")
546   (set_attr "iscompact" "false")
547   (set_attr "type" "fpu")
548   (set_attr "predicable" "yes,no")]
549)
550
551;; DI->SF
552(define_insn "floatdisf2"
553  [(set (match_operand:SF 0 "register_operand"               "=r,r")
554	(float:SF (match_operand:DI 1 "even_register_operand" "0,r")))]
555  "TARGET_FP_DP_CONV"
556  "fcvt64_32%? %0,%1,0x02\\t;fl2s %0,%1"
557  [(set_attr "length" "4,4")
558   (set_attr "iscompact" "false")
559   (set_attr "type" "fpu")
560   (set_attr "predicable" "yes,no")]
561)
562
563;; uDI->SF
564(define_insn "floatunsdisf2"
565  [(set (match_operand:SF 0 "register_operand"                        "=r,r")
566	(unsigned_float:SF (match_operand:DI 1 "even_register_operand" "0,r")))]
567  "TARGET_FP_DP_CONV"
568  "fcvt64_32%? %0,%1,0x00\\t;ful2s %0,%1"
569  [(set_attr "length" "4,4")
570   (set_attr "iscompact" "false")
571   (set_attr "type" "fpu")
572   (set_attr "predicable" "yes,no")]
573)
574
575;; DF->uSI (using rounding towards zero)
576(define_insn "fixuns_truncdfsi2"
577  [(set (match_operand:SI 0 "register_operand"                              "=r,r")
578	(unsigned_fix:SI (fix:DF (match_operand:DF 1 "even_register_operand" "0,r"))))]
579  "TARGET_FP_DP_CONV"
580  "fcvt64_32%? %0,%1,0x09\\t;fd2uint_rz %0,%1"
581  [(set_attr "length" "4,4")
582   (set_attr "iscompact" "false")
583   (set_attr "type" "fpu")
584   (set_attr "predicable" "yes,no")]
585)
586
587;; DF->SI (using rounding towards zero)
588(define_insn "fix_truncdfsi2"
589  [(set (match_operand:SI 0 "register_operand"                     "=r,r")
590	(fix:SI (fix:DF (match_operand:DF 1 "even_register_operand" "0,r"))))]
591  "TARGET_FP_DP_CONV"
592  "fcvt64_32%? %0,%1,0x0B\\t;fd2int_rz %0,%1"
593  [(set_attr "length" "4,4")
594   (set_attr "iscompact" "false")
595   (set_attr "type" "fpu")
596   (set_attr "predicable" "yes,no")]
597)
598