1 ;; ::::::::::::::::::::
3 ;; :: 32-bit floating point arithmetic
5 ;; ::::::::::::::::::::
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")))]
13 && (register_operand (operands[1], SFmode)
14 || register_operand (operands[2], SFmode))"
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")
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")))]
29 && (register_operand (operands[1], SFmode)
30 || register_operand (operands[2], SFmode))"
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")
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")))]
45 && (register_operand (operands[1], SFmode)
46 || register_operand (operands[2], SFmode))"
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")
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" "")))]
64 tmp = gen_rtx_REG (SFmode, ACCL_REGNO);
65 emit_move_insn (tmp, operands[3]);
67 if (!register_operand (operands[1], SFmode)
68 && !register_operand (operands[2], SFmode))
69 operands[2] = force_reg (SFmode, operands[2]);
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" "")))]
80 tmp = gen_rtx_REG (SFmode, ACCL_REGNO);
81 emit_move_insn (tmp, operands[3]);
83 if (!register_operand (operands[1], SFmode)
84 && !register_operand (operands[2], SFmode))
85 operands[2] = force_reg (SFmode, operands[2]);
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" "")))]
94 && (register_operand (operands[1], SFmode)
95 || register_operand (operands[2], SFmode))"
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")])
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" "")))]
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")])
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" "")]
125 emit_insn (gen_fmadf4_split (operands[0], operands[1], operands[2], operands[3]));
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))]
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]));
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" "")]
154 emit_insn (gen_fnmadf4_split (operands[0], operands[1], operands[2], operands[3]));
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))]
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]));
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)))]
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")])
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)))]
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")])
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")))]
207 && (register_operand (operands[1], SFmode)
208 || register_operand (operands[2], SFmode))"
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")
218 ;; see pattern in arc.md
221 ;; see pattern in arc.md
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")))]
229 [(set_attr "length" "4,8")
230 (set_attr "type" "fpu_sdiv")])
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")))]
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")])
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")))]
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")])
257 (define_insn "*cmpsf_fpu_uneq"
258 [(set (reg:CC_FPU_UNEQ CC_REG)
260 (match_operand:SF 0 "register_operand" "r, r,r")
261 (match_operand:SF 1 "nonmemory_operand" "r,CfZ,F")))]
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")])
269 ;; ::::::::::::::::::::
271 ;; :: 64-bit floating point arithmetic
273 ;; ::::::::::::::::::::
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")))]
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")
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")))]
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")
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")))]
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")
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")))]
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")
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")))]
337 [(set_attr "length" "4")
338 (set_attr "type" "fpu_ddiv")])
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")))]
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")])
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")))]
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")])
365 (define_insn "*cmpdf_fpu_uneq"
366 [(set (reg:CC_FPU_UNEQ CC_REG)
368 (match_operand:DF 0 "even_register_operand" "r")
369 (match_operand:DF 1 "even_register_operand" "r")))]
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")])
377 ;; ::::::::::::::::::::
379 ;; :: Conversion routines
381 ;; ::::::::::::::::::::
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")))]
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")]
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")))]
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")]
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")))]
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")]
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"))))]
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")]
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"))))]
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")]
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")))]
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")]
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")))]
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")]
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"))))]
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")]
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"))))]
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")]
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")))]
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")]
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")))]
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")]
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"))))]
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")]
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"))))]
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")]
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")))]
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")]
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")))]
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")]
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")))]
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")]
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"))))]
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")]
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"))))]
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")]