comparison gcc/config/i386/i386.md @ 132:d34655255c78

update gcc-8.2
author mir3636
date Thu, 25 Oct 2018 10:21:07 +0900
parents ab0bcb71f44d 84e7813d76e9
children 351920fa3827
comparison
equal deleted inserted replaced
130:e108057fa461 132:d34655255c78
1 ;; GCC machine description for IA-32 and x86-64. 1 ;; GCC machine description for IA-32 and x86-64.
2 ;; Copyright (C) 1988-2017 Free Software Foundation, Inc. 2 ;; Copyright (C) 1988-2018 Free Software Foundation, Inc.
3 ;; Mostly by William Schelter. 3 ;; Mostly by William Schelter.
4 ;; x86_64 support added by Jan Hubicka 4 ;; x86_64 support added by Jan Hubicka
5 ;; 5 ;;
6 ;; This file is part of GCC. 6 ;; This file is part of GCC.
7 ;; 7 ;;
60 ;; Y -- print condition for XOP pcom* instruction. 60 ;; Y -- print condition for XOP pcom* instruction.
61 ;; + -- print a branch hint as 'cs' or 'ds' prefix 61 ;; + -- print a branch hint as 'cs' or 'ds' prefix
62 ;; ; -- print a semicolon (after prefixes due to bug in older gas). 62 ;; ; -- print a semicolon (after prefixes due to bug in older gas).
63 ;; ~ -- print "i" if TARGET_AVX2, "f" otherwise. 63 ;; ~ -- print "i" if TARGET_AVX2, "f" otherwise.
64 ;; ^ -- print addr32 prefix if TARGET_64BIT and Pmode != word_mode 64 ;; ^ -- print addr32 prefix if TARGET_64BIT and Pmode != word_mode
65 ;; ! -- print MPX or NOTRACK prefix for jxx/call/ret instructions if required. 65 ;; ! -- print NOTRACK prefix for jxx/call/ret instructions if required.
66 66
67 (define_c_enum "unspec" [ 67 (define_c_enum "unspec" [
68 ;; Relocation specifiers 68 ;; Relocation specifiers
69 UNSPEC_GOT 69 UNSPEC_GOT
70 UNSPEC_GOTOFF 70 UNSPEC_GOTOFF
97 97
98 ;; Other random patterns 98 ;; Other random patterns
99 UNSPEC_SCAS 99 UNSPEC_SCAS
100 UNSPEC_FNSTSW 100 UNSPEC_FNSTSW
101 UNSPEC_SAHF 101 UNSPEC_SAHF
102 UNSPEC_NOTRAP
102 UNSPEC_PARITY 103 UNSPEC_PARITY
103 UNSPEC_FSTCW 104 UNSPEC_FSTCW
104 UNSPEC_FLDCW
105 UNSPEC_REP 105 UNSPEC_REP
106 UNSPEC_LD_MPIC ; load_macho_picbase 106 UNSPEC_LD_MPIC ; load_macho_picbase
107 UNSPEC_TRUNC_NOOP 107 UNSPEC_TRUNC_NOOP
108 UNSPEC_DIV_ALREADY_SPLIT 108 UNSPEC_DIV_ALREADY_SPLIT
109 UNSPEC_PAUSE 109 UNSPEC_PAUSE
141 141
142 ;; x87 Rounding 142 ;; x87 Rounding
143 UNSPEC_FRNDINT_FLOOR 143 UNSPEC_FRNDINT_FLOOR
144 UNSPEC_FRNDINT_CEIL 144 UNSPEC_FRNDINT_CEIL
145 UNSPEC_FRNDINT_TRUNC 145 UNSPEC_FRNDINT_TRUNC
146 UNSPEC_FRNDINT_MASK_PM
147 UNSPEC_FIST_FLOOR 146 UNSPEC_FIST_FLOOR
148 UNSPEC_FIST_CEIL 147 UNSPEC_FIST_CEIL
149 148
150 ;; x87 Double output FP 149 ;; x87 Double output FP
151 UNSPEC_SINCOS_COS 150 UNSPEC_SINCOS_COS
180 UNSPEC_BEXTR 179 UNSPEC_BEXTR
181 180
182 ;; For BMI2 support 181 ;; For BMI2 support
183 UNSPEC_PDEP 182 UNSPEC_PDEP
184 UNSPEC_PEXT 183 UNSPEC_PEXT
185
186 UNSPEC_BNDMK
187 UNSPEC_BNDMK_ADDR
188 UNSPEC_BNDSTX
189 UNSPEC_BNDLDX
190 UNSPEC_BNDLDX_ADDR
191 UNSPEC_BNDCL
192 UNSPEC_BNDCU
193 UNSPEC_BNDCN
194 UNSPEC_MPX_FENCE
195 184
196 ;; IRET support 185 ;; IRET support
197 UNSPEC_INTERRUPT_RETURN 186 UNSPEC_INTERRUPT_RETURN
198 ]) 187 ])
199 188
234 UNSPECV_XRSTORS64 223 UNSPECV_XRSTORS64
235 UNSPECV_XSAVEC 224 UNSPECV_XSAVEC
236 UNSPECV_XSAVEC64 225 UNSPECV_XSAVEC64
237 UNSPECV_XGETBV 226 UNSPECV_XGETBV
238 UNSPECV_XSETBV 227 UNSPECV_XSETBV
228 UNSPECV_WBINVD
229 UNSPECV_WBNOINVD
239 230
240 ;; For atomic compound assignments. 231 ;; For atomic compound assignments.
241 UNSPECV_FNSTENV 232 UNSPECV_FNSTENV
242 UNSPECV_FLDENV 233 UNSPECV_FLDENV
243 UNSPECV_FNSTSW 234 UNSPECV_FNSTSW
284 UNSPECV_RSTORSSP 275 UNSPECV_RSTORSSP
285 UNSPECV_WRSS 276 UNSPECV_WRSS
286 UNSPECV_WRUSS 277 UNSPECV_WRUSS
287 UNSPECV_SETSSBSY 278 UNSPECV_SETSSBSY
288 UNSPECV_CLRSSBSY 279 UNSPECV_CLRSSBSY
280
281 ;; For MOVDIRI and MOVDIR64B support
282 UNSPECV_MOVDIRI
283 UNSPECV_MOVDIR64B
284
285 ;; For WAITPKG support
286 UNSPECV_UMWAIT
287 UNSPECV_UMONITOR
288 UNSPECV_TPAUSE
289
290 ;; For CLDEMOTE support
291 UNSPECV_CLDEMOTE
292
293 ;; For Speculation Barrier support
294 UNSPECV_SPECULATION_BARRIER
289 ]) 295 ])
290 296
291 ;; Constants to represent rounding modes in the ROUND instruction 297 ;; Constants to represent rounding modes in the ROUND instruction
292 (define_constants 298 (define_constants
293 [(ROUND_FLOOR 0x1) 299 [(ROUND_FLOOR 0x1)
350 (ST6_REG 14) 356 (ST6_REG 14)
351 (ST7_REG 15) 357 (ST7_REG 15)
352 (ARGP_REG 16) 358 (ARGP_REG 16)
353 (FLAGS_REG 17) 359 (FLAGS_REG 17)
354 (FPSR_REG 18) 360 (FPSR_REG 18)
355 (FPCR_REG 19) 361 (FRAME_REG 19)
356 (FRAME_REG 20) 362 (XMM0_REG 20)
357 (XMM0_REG 21) 363 (XMM1_REG 21)
358 (XMM1_REG 22) 364 (XMM2_REG 22)
359 (XMM2_REG 23) 365 (XMM3_REG 23)
360 (XMM3_REG 24) 366 (XMM4_REG 24)
361 (XMM4_REG 25) 367 (XMM5_REG 25)
362 (XMM5_REG 26) 368 (XMM6_REG 26)
363 (XMM6_REG 27) 369 (XMM7_REG 27)
364 (XMM7_REG 28) 370 (MM0_REG 28)
365 (MM0_REG 29) 371 (MM1_REG 29)
366 (MM1_REG 30) 372 (MM2_REG 30)
367 (MM2_REG 31) 373 (MM3_REG 31)
368 (MM3_REG 32) 374 (MM4_REG 32)
369 (MM4_REG 33) 375 (MM5_REG 33)
370 (MM5_REG 34) 376 (MM6_REG 34)
371 (MM6_REG 35) 377 (MM7_REG 35)
372 (MM7_REG 36) 378 (R8_REG 36)
373 (R8_REG 37) 379 (R9_REG 37)
374 (R9_REG 38) 380 (R10_REG 38)
375 (R10_REG 39) 381 (R11_REG 39)
376 (R11_REG 40) 382 (R12_REG 40)
377 (R12_REG 41) 383 (R13_REG 41)
378 (R13_REG 42) 384 (R14_REG 42)
379 (R14_REG 43) 385 (R15_REG 43)
380 (R15_REG 44) 386 (XMM8_REG 44)
381 (XMM8_REG 45) 387 (XMM9_REG 45)
382 (XMM9_REG 46) 388 (XMM10_REG 46)
383 (XMM10_REG 47) 389 (XMM11_REG 47)
384 (XMM11_REG 48) 390 (XMM12_REG 48)
385 (XMM12_REG 49) 391 (XMM13_REG 49)
386 (XMM13_REG 50) 392 (XMM14_REG 50)
387 (XMM14_REG 51) 393 (XMM15_REG 51)
388 (XMM15_REG 52) 394 (XMM16_REG 52)
389 (XMM16_REG 53) 395 (XMM17_REG 53)
390 (XMM17_REG 54) 396 (XMM18_REG 54)
391 (XMM18_REG 55) 397 (XMM19_REG 55)
392 (XMM19_REG 56) 398 (XMM20_REG 56)
393 (XMM20_REG 57) 399 (XMM21_REG 57)
394 (XMM21_REG 58) 400 (XMM22_REG 58)
395 (XMM22_REG 59) 401 (XMM23_REG 59)
396 (XMM23_REG 60) 402 (XMM24_REG 60)
397 (XMM24_REG 61) 403 (XMM25_REG 61)
398 (XMM25_REG 62) 404 (XMM26_REG 62)
399 (XMM26_REG 63) 405 (XMM27_REG 63)
400 (XMM27_REG 64) 406 (XMM28_REG 64)
401 (XMM28_REG 65) 407 (XMM29_REG 65)
402 (XMM29_REG 66) 408 (XMM30_REG 66)
403 (XMM30_REG 67) 409 (XMM31_REG 67)
404 (XMM31_REG 68) 410 (MASK0_REG 68)
405 (MASK0_REG 69) 411 (MASK1_REG 69)
406 (MASK1_REG 70) 412 (MASK2_REG 70)
407 (MASK2_REG 71) 413 (MASK3_REG 71)
408 (MASK3_REG 72) 414 (MASK4_REG 72)
409 (MASK4_REG 73) 415 (MASK5_REG 73)
410 (MASK5_REG 74) 416 (MASK6_REG 74)
411 (MASK6_REG 75) 417 (MASK7_REG 75)
412 (MASK7_REG 76) 418 (FIRST_PSEUDO_REG 76)
413 (BND0_REG 77)
414 (BND1_REG 78)
415 (BND2_REG 79)
416 (BND3_REG 80)
417 (FIRST_PSEUDO_REG 81)
418 ]) 419 ])
419 420
420 ;; Insns whose names begin with "x86_" are emitted by gen_FOO calls 421 ;; Insns whose names begin with "x86_" are emitted by gen_FOO calls
421 ;; from i386.c. 422 ;; from i386.c.
422 423
426 ;; "reload_completed && TARGET_64BIT". 427 ;; "reload_completed && TARGET_64BIT".
427 428
428 429
429 ;; Processor type. 430 ;; Processor type.
430 (define_attr "cpu" "none,pentium,pentiumpro,geode,k6,athlon,k8,core2,nehalem, 431 (define_attr "cpu" "none,pentium,pentiumpro,geode,k6,athlon,k8,core2,nehalem,
431 atom,slm,haswell,generic,amdfam10,bdver1,bdver2,bdver3, 432 atom,slm,glm,haswell,generic,amdfam10,bdver1,bdver2,bdver3,
432 bdver4,btver2,znver1" 433 bdver4,btver2,znver1"
433 (const (symbol_ref "ix86_schedule"))) 434 (const (symbol_ref "ix86_schedule")))
434 435
435 ;; A basic instruction type. Refinements due to arguments to be 436 ;; A basic instruction type. Refinements due to arguments to be
436 ;; provided in other attributes. 437 ;; provided in other attributes.
447 ssemul,sseimul,ssediv,sselog,sselog1, 448 ssemul,sseimul,ssediv,sselog,sselog1,
448 sseishft,sseishft1,ssecmp,ssecomi, 449 sseishft,sseishft1,ssecmp,ssecomi,
449 ssecvt,ssecvt1,sseicvt,sseins, 450 ssecvt,ssecvt1,sseicvt,sseins,
450 sseshuf,sseshuf1,ssemuladd,sse4arg, 451 sseshuf,sseshuf1,ssemuladd,sse4arg,
451 lwp,mskmov,msklog, 452 lwp,mskmov,msklog,
452 mmx,mmxmov,mmxadd,mmxmul,mmxcmp,mmxcvt,mmxshft, 453 mmx,mmxmov,mmxadd,mmxmul,mmxcmp,mmxcvt,mmxshft"
453 mpxmov,mpxmk,mpxchk,mpxld,mpxst"
454 (const_string "other")) 454 (const_string "other"))
455 455
456 ;; Main data type used by the insn 456 ;; Main data type used by the insn
457 (define_attr "mode" 457 (define_attr "mode"
458 "unknown,none,QI,HI,SI,DI,TI,OI,XI,SF,DF,XF,TF,V16SF,V8SF,V4DF,V4SF, 458 "unknown,none,QI,HI,SI,DI,TI,OI,XI,SF,DF,XF,TF,V16SF,V8SF,V4DF,V4SF,
477 (const_string "integer"))) 477 (const_string "integer")))
478 478
479 ;; The (bounding maximum) length of an instruction immediate. 479 ;; The (bounding maximum) length of an instruction immediate.
480 (define_attr "length_immediate" "" 480 (define_attr "length_immediate" ""
481 (cond [(eq_attr "type" "incdec,setcc,icmov,str,lea,other,multi,idiv,leave, 481 (cond [(eq_attr "type" "incdec,setcc,icmov,str,lea,other,multi,idiv,leave,
482 bitmanip,imulx,msklog,mskmov,mpxmk,mpxmov,mpxchk, 482 bitmanip,imulx,msklog,mskmov")
483 mpxld,mpxst")
484 (const_int 0) 483 (const_int 0)
485 (eq_attr "unit" "i387,sse,mmx") 484 (eq_attr "unit" "i387,sse,mmx")
486 (const_int 0) 485 (const_int 0)
487 (eq_attr "type" "alu,alu1,negnot,imovx,ishift,ishiftx,ishift1, 486 (eq_attr "type" "alu,alu1,negnot,imovx,ishift,ishiftx,ishift1,
488 rotate,rotatex,rotate1,imul,icmp,push,pop") 487 rotate,rotatex,rotate1,imul,icmp,push,pop")
533 (define_attr "prefix_rep" "" 532 (define_attr "prefix_rep" ""
534 (cond [(eq_attr "type" "ssemuladd,sse4arg,sseiadd1,ssecvt1") 533 (cond [(eq_attr "type" "ssemuladd,sse4arg,sseiadd1,ssecvt1")
535 (const_int 0) 534 (const_int 0)
536 (and (eq_attr "unit" "sse") (eq_attr "mode" "SF,DF")) 535 (and (eq_attr "unit" "sse") (eq_attr "mode" "SF,DF"))
537 (const_int 1) 536 (const_int 1)
538 (and (eq_attr "type" "ibr,call,callv")
539 (match_test "ix86_bnd_prefixed_insn_p (insn)"))
540 (const_int 1)
541 ] 537 ]
542 (const_int 0))) 538 (const_int 0)))
543 539
544 ;; Set when 0f opcode prefix is used. 540 ;; Set when 0f opcode prefix is used.
545 (define_attr "prefix_0f" "" 541 (define_attr "prefix_0f" ""
546 (if_then_else 542 (if_then_else
547 (ior (eq_attr "type" "imovx,setcc,icmov,bitmanip,msklog,mskmov, 543 (ior (eq_attr "type" "imovx,setcc,icmov,bitmanip,msklog,mskmov")
548 mpxmk,mpxmov,mpxchk,mpxld,mpxst")
549 (eq_attr "unit" "sse,mmx")) 544 (eq_attr "unit" "sse,mmx"))
550 (const_int 1) 545 (const_int 1)
551 (const_int 0))) 546 (const_int 0)))
552 547
553 ;; Set when REX opcode prefix is used. 548 ;; Set when REX opcode prefix is used.
578 (const_int 2) 573 (const_int 2)
579 (eq_attr "type" "sseiadd1,ssecvt1") 574 (eq_attr "type" "sseiadd1,ssecvt1")
580 (const_int 1) 575 (const_int 1)
581 ] 576 ]
582 (const_int 0))) 577 (const_int 0)))
583
584 ;; Set when BND opcode prefix may be used.
585 (define_attr "maybe_prefix_bnd" "" (const_int 0))
586 578
587 ;; Prefix used: original, VEX or maybe VEX. 579 ;; Prefix used: original, VEX or maybe VEX.
588 (define_attr "prefix" "orig,vex,maybe_vex,evex,maybe_evex" 580 (define_attr "prefix" "orig,vex,maybe_vex,evex,maybe_evex"
589 (cond [(eq_attr "mode" "OI,V8SF,V4DF") 581 (cond [(eq_attr "mode" "OI,V8SF,V4DF")
590 (const_string "vex") 582 (const_string "vex")
648 (and (eq_attr "type" "alu,alu1,icmp,test") 640 (and (eq_attr "type" "alu,alu1,icmp,test")
649 (match_operand 0 "ax_reg_operand")) 641 (match_operand 0 "ax_reg_operand"))
650 (symbol_ref "(get_attr_length_immediate (insn) <= (get_attr_mode (insn) != MODE_QI))") 642 (symbol_ref "(get_attr_length_immediate (insn) <= (get_attr_mode (insn) != MODE_QI))")
651 ] 643 ]
652 (const_int 1))) 644 (const_int 1)))
653
654 (define_attr "modrm_class" "none,incdec,op0,op01,op02,pushpop,unknown"
655 (cond [(eq_attr "modrm" "0")
656 (const_string "none")
657 (eq_attr "type" "alu,imul,ishift")
658 (const_string "op02")
659 (eq_attr "type" "imov,imovx,lea,alu1,icmp")
660 (const_string "op01")
661 (eq_attr "type" "incdec")
662 (const_string "incdec")
663 (eq_attr "type" "push,pop")
664 (const_string "pushpop")]
665 (const_string "unknown")))
666 645
667 ;; The (bounding maximum) length of an instruction in bytes. 646 ;; The (bounding maximum) length of an instruction in bytes.
668 ;; ??? fistp and frndint are in fact fldcw/{fistp,frndint}/fldcw sequences. 647 ;; ??? fistp and frndint are in fact fldcw/{fistp,frndint}/fldcw sequences.
669 ;; Later we may want to split them and compute proper length as for 648 ;; Later we may want to split them and compute proper length as for
670 ;; other insns. 649 ;; other insns.
708 ;; if the instruction is complex. 687 ;; if the instruction is complex.
709 688
710 (define_attr "memory" "none,load,store,both,unknown" 689 (define_attr "memory" "none,load,store,both,unknown"
711 (cond [(eq_attr "type" "other,multi,str,lwp") 690 (cond [(eq_attr "type" "other,multi,str,lwp")
712 (const_string "unknown") 691 (const_string "unknown")
713 (eq_attr "type" "lea,fcmov,fpspc,mpxmk,mpxchk") 692 (eq_attr "type" "lea,fcmov,fpspc")
714 (const_string "none") 693 (const_string "none")
715 (eq_attr "type" "fistp,leave") 694 (eq_attr "type" "fistp,leave")
716 (const_string "both") 695 (const_string "both")
717 (eq_attr "type" "frndint") 696 (eq_attr "type" "frndint")
718 (const_string "load") 697 (const_string "load")
719 (eq_attr "type" "mpxld")
720 (const_string "load")
721 (eq_attr "type" "mpxst")
722 (const_string "store")
723 (eq_attr "type" "push") 698 (eq_attr "type" "push")
724 (if_then_else (match_operand 1 "memory_operand") 699 (if_then_else (match_operand 1 "memory_operand")
725 (const_string "both") 700 (const_string "both")
726 (const_string "store")) 701 (const_string "store"))
727 (eq_attr "type" "pop") 702 (eq_attr "type" "pop")
747 (const_string "load")) 722 (const_string "load"))
748 (eq_attr "type" "callv") 723 (eq_attr "type" "callv")
749 (if_then_else (match_operand 1 "constant_call_address_operand") 724 (if_then_else (match_operand 1 "constant_call_address_operand")
750 (const_string "none") 725 (const_string "none")
751 (const_string "load")) 726 (const_string "load"))
752 (and (eq_attr "type" "alu1,negnot,ishift1,sselog1,sseshuf1") 727 (and (eq_attr "type" "alu1,negnot,ishift1,rotate1,sselog1,sseshuf1")
753 (match_operand 1 "memory_operand")) 728 (match_operand 1 "memory_operand"))
754 (const_string "both") 729 (const_string "both")
755 (and (match_operand 0 "memory_operand") 730 (and (match_operand 0 "memory_operand")
756 (match_operand 1 "memory_operand")) 731 (match_operand 1 "memory_operand"))
757 (const_string "both") 732 (const_string "both")
758 (match_operand 0 "memory_operand") 733 (match_operand 0 "memory_operand")
759 (const_string "store") 734 (const_string "store")
760 (match_operand 1 "memory_operand") 735 (match_operand 1 "memory_operand")
761 (const_string "load") 736 (const_string "load")
762 (and (eq_attr "type" 737 (and (eq_attr "type"
763 "!alu1,negnot,ishift1, 738 "!alu1,negnot,ishift1,rotate1,
764 imov,imovx,icmp,test,bitmanip, 739 imov,imovx,icmp,test,bitmanip,
765 fmov,fcmp,fsgn, 740 fmov,fcmp,fsgn,
766 sse,ssemov,ssecmp,ssecomi,ssecvt,ssecvt1,sseicvt, 741 sse,ssemov,ssecmp,ssecomi,ssecvt,ssecvt1,sseicvt,
767 sselog1,sseshuf1,sseadd1,sseiadd1,sseishft1, 742 sselog1,sseshuf1,sseadd1,sseiadd1,sseishft1,
768 mmx,mmxmov,mmxcmp,mmxcvt,mskmov,msklog,mpxmov") 743 mmx,mmxmov,mmxcmp,mmxcvt,mskmov,msklog")
769 (match_operand 2 "memory_operand")) 744 (match_operand 2 "memory_operand"))
770 (const_string "load") 745 (const_string "load")
771 (and (eq_attr "type" "icmov,ssemuladd,sse4arg") 746 (and (eq_attr "type" "icmov,ssemuladd,sse4arg")
772 (match_operand 3 "memory_operand")) 747 (match_operand 3 "memory_operand"))
773 (const_string "load") 748 (const_string "load")
795 (define_attr "fp_int_src" "false,true" 770 (define_attr "fp_int_src" "false,true"
796 (const_string "false")) 771 (const_string "false"))
797 772
798 ;; Defines rounding mode of an FP operation. 773 ;; Defines rounding mode of an FP operation.
799 774
800 (define_attr "i387_cw" "trunc,floor,ceil,mask_pm,uninitialized,any" 775 (define_attr "i387_cw" "trunc,floor,ceil,uninitialized,any"
801 (const_string "any")) 776 (const_string "any"))
802 777
803 ;; Define attribute to classify add/sub insns that consumes carry flag (CF) 778 ;; Define attribute to classify add/sub insns that consumes carry flag (CF)
804 (define_attr "use_carry" "0,1" (const_string "0")) 779 (define_attr "use_carry" "0,1" (const_string "0"))
805 780
806 ;; Define attribute to indicate unaligned ssemov insns 781 ;; Define attribute to indicate unaligned ssemov insns
807 (define_attr "movu" "0,1" (const_string "0")) 782 (define_attr "movu" "0,1" (const_string "0"))
808 783
809 ;; Used to control the "enabled" attribute on a per-instruction basis. 784 ;; Used to control the "enabled" attribute on a per-instruction basis.
810 (define_attr "isa" "base,x64,x64_sse4,x64_sse4_noavx,x64_avx,nox64, 785 (define_attr "isa" "base,x64,x64_sse2,x64_sse4,x64_sse4_noavx,x64_avx,nox64,
811 sse2,sse2_noavx,sse3,sse4,sse4_noavx,avx,noavx, 786 sse2,sse2_noavx,sse3,sse4,sse4_noavx,avx,noavx,
812 avx2,noavx2,bmi,bmi2,fma4,fma,avx512f,noavx512f, 787 avx2,noavx2,bmi,bmi2,fma4,fma,avx512f,noavx512f,
813 avx512bw,noavx512bw,avx512dq,noavx512dq, 788 avx512bw,noavx512bw,avx512dq,noavx512dq,
814 avx512vl,noavx512vl,x64_avx512dq,x64_avx512bw" 789 avx512vl,noavx512vl,x64_avx512dq,x64_avx512bw"
815 (const_string "base")) 790 (const_string "base"))
816 791
817 (define_attr "enabled" "" 792 (define_attr "enabled" ""
818 (cond [(eq_attr "isa" "x64") (symbol_ref "TARGET_64BIT") 793 (cond [(eq_attr "isa" "x64") (symbol_ref "TARGET_64BIT")
794 (eq_attr "isa" "x64_sse2")
795 (symbol_ref "TARGET_64BIT && TARGET_SSE2")
819 (eq_attr "isa" "x64_sse4") 796 (eq_attr "isa" "x64_sse4")
820 (symbol_ref "TARGET_64BIT && TARGET_SSE4_1") 797 (symbol_ref "TARGET_64BIT && TARGET_SSE4_1")
821 (eq_attr "isa" "x64_sse4_noavx") 798 (eq_attr "isa" "x64_sse4_noavx")
822 (symbol_ref "TARGET_64BIT && TARGET_SSE4_1 && !TARGET_AVX") 799 (symbol_ref "TARGET_64BIT && TARGET_SSE4_1 && !TARGET_AVX")
823 (eq_attr "isa" "x64_avx") 800 (eq_attr "isa" "x64_avx")
941 918
942 ;; Mapping of abs neg operators 919 ;; Mapping of abs neg operators
943 (define_code_iterator absneg [abs neg]) 920 (define_code_iterator absneg [abs neg])
944 921
945 ;; Base name for x87 insn mnemonic. 922 ;; Base name for x87 insn mnemonic.
946 (define_code_attr absneg_mnemonic [(abs "abs") (neg "chs")]) 923 (define_code_attr absneg_mnemonic [(abs "fabs") (neg "fchs")])
947 924
948 ;; Used in signed and unsigned widening multiplications. 925 ;; Used in signed and unsigned widening multiplications.
949 (define_code_iterator any_extend [sign_extend zero_extend]) 926 (define_code_iterator any_extend [sign_extend zero_extend])
950 927
951 ;; Prefix for insn menmonic. 928 ;; Prefix for insn menmonic.
962 (define_code_attr trunsuffix [(ss_truncate "s") (truncate "") (us_truncate "us")]) 939 (define_code_attr trunsuffix [(ss_truncate "s") (truncate "") (us_truncate "us")])
963 940
964 ;; Used in signed and unsigned fix. 941 ;; Used in signed and unsigned fix.
965 (define_code_iterator any_fix [fix unsigned_fix]) 942 (define_code_iterator any_fix [fix unsigned_fix])
966 (define_code_attr fixsuffix [(fix "") (unsigned_fix "u")]) 943 (define_code_attr fixsuffix [(fix "") (unsigned_fix "u")])
944 (define_code_attr fixunssuffix [(fix "") (unsigned_fix "uns")])
945 (define_code_attr fixprefix [(fix "s") (unsigned_fix "u")])
967 946
968 ;; Used in signed and unsigned float. 947 ;; Used in signed and unsigned float.
969 (define_code_iterator any_float [float unsigned_float]) 948 (define_code_iterator any_float [float unsigned_float])
970 (define_code_attr floatsuffix [(float "") (unsigned_float "u")]) 949 (define_code_attr floatsuffix [(float "") (unsigned_float "u")])
950 (define_code_attr floatunssuffix [(float "") (unsigned_float "uns")])
951 (define_code_attr floatprefix [(float "s") (unsigned_float "u")])
971 952
972 ;; All integer modes. 953 ;; All integer modes.
973 (define_mode_iterator SWI1248x [QI HI SI DI]) 954 (define_mode_iterator SWI1248x [QI HI SI DI])
974 955
975 ;; All integer modes without QImode. 956 ;; All integer modes without QImode.
1047 1028
1048 ;; Half mode for double word integer modes. 1029 ;; Half mode for double word integer modes.
1049 (define_mode_iterator DWIH [(SI "!TARGET_64BIT") 1030 (define_mode_iterator DWIH [(SI "!TARGET_64BIT")
1050 (DI "TARGET_64BIT")]) 1031 (DI "TARGET_64BIT")])
1051 1032
1052 ;; Bound modes.
1053 (define_mode_iterator BND [(BND32 "!TARGET_LP64")
1054 (BND64 "TARGET_LP64")])
1055
1056 ;; Pointer mode corresponding to bound mode.
1057 (define_mode_attr bnd_ptr [(BND32 "SI") (BND64 "DI")])
1058
1059 ;; MPX check types
1060 (define_int_iterator BNDCHECK [UNSPEC_BNDCL UNSPEC_BNDCU UNSPEC_BNDCN])
1061
1062 ;; Check name
1063 (define_int_attr bndcheck [(UNSPEC_BNDCL "cl")
1064 (UNSPEC_BNDCU "cu")
1065 (UNSPEC_BNDCN "cn")])
1066
1067 ;; Instruction suffix for integer modes. 1033 ;; Instruction suffix for integer modes.
1068 (define_mode_attr imodesuffix [(QI "b") (HI "w") (SI "l") (DI "q")]) 1034 (define_mode_attr imodesuffix [(QI "b") (HI "w") (SI "l") (DI "q")])
1069 1035
1070 ;; Instruction suffix for masks. 1036 ;; Instruction suffix for masks.
1071 (define_mode_attr mskmodesuffix [(QI "b") (HI "w") (SI "d") (DI "q")]) 1037 (define_mode_attr mskmodesuffix [(QI "b") (HI "w") (SI "d") (DI "q")])
1193 (define_mode_attr avx512fvecmode 1159 (define_mode_attr avx512fvecmode
1194 [(QI "V64QI") (HI "V32HI") (SI "V16SI") (DI "V8DI") (SF "V16SF") (DF "V8DF")]) 1160 [(QI "V64QI") (HI "V32HI") (SI "V16SI") (DI "V8DI") (SF "V16SF") (DF "V8DF")])
1195 1161
1196 ;; Instruction suffix for REX 64bit operators. 1162 ;; Instruction suffix for REX 64bit operators.
1197 (define_mode_attr rex64suffix [(SI "") (DI "{q}")]) 1163 (define_mode_attr rex64suffix [(SI "") (DI "{q}")])
1164 (define_mode_attr rex64namesuffix [(SI "") (DI "q")])
1198 1165
1199 ;; This mode iterator allows :P to be used for patterns that operate on 1166 ;; This mode iterator allows :P to be used for patterns that operate on
1200 ;; pointer-sized quantities. Exactly one of the two alternatives will match. 1167 ;; pointer-sized quantities. Exactly one of the two alternatives will match.
1201 (define_mode_iterator P [(SI "Pmode == SImode") (DI "Pmode == DImode")]) 1168 (define_mode_iterator P [(SI "Pmode == SImode") (DI "Pmode == DImode")])
1202 1169
1221 (include "btver2.md") 1188 (include "btver2.md")
1222 (include "znver1.md") 1189 (include "znver1.md")
1223 (include "geode.md") 1190 (include "geode.md")
1224 (include "atom.md") 1191 (include "atom.md")
1225 (include "slm.md") 1192 (include "slm.md")
1193 (include "glm.md")
1226 (include "core2.md") 1194 (include "core2.md")
1227 (include "haswell.md") 1195 (include "haswell.md")
1228 1196
1229 1197
1230 ;; Operand and operator predicates and constraints 1198 ;; Operand and operator predicates and constraints
1272 (define_expand "cmp<mode>_1" 1240 (define_expand "cmp<mode>_1"
1273 [(set (reg:CC FLAGS_REG) 1241 [(set (reg:CC FLAGS_REG)
1274 (compare:CC (match_operand:SWI48 0 "nonimmediate_operand") 1242 (compare:CC (match_operand:SWI48 0 "nonimmediate_operand")
1275 (match_operand:SWI48 1 "<general_operand>")))]) 1243 (match_operand:SWI48 1 "<general_operand>")))])
1276 1244
1245 (define_mode_iterator SWI1248_AVX512BWDQ2_64
1246 [(QI "TARGET_AVX512DQ") (HI "TARGET_AVX512DQ")
1247 (SI "TARGET_AVX512BW") (DI "TARGET_AVX512BW && TARGET_64BIT")])
1248
1249 (define_insn "*cmp<mode>_ccz_1"
1250 [(set (reg FLAGS_REG)
1251 (compare (match_operand:SWI1248_AVX512BWDQ2_64 0
1252 "nonimmediate_operand" "<r>,?m<r>,$k")
1253 (match_operand:SWI1248_AVX512BWDQ2_64 1 "const0_operand")))]
1254 "ix86_match_ccmode (insn, CCZmode)"
1255 "@
1256 test{<imodesuffix>}\t%0, %0
1257 cmp{<imodesuffix>}\t{%1, %0|%0, %1}
1258 ktest<mskmodesuffix>\t%0, %0"
1259 [(set_attr "type" "test,icmp,msklog")
1260 (set_attr "length_immediate" "0,1,*")
1261 (set_attr "prefix" "*,*,vex")
1262 (set_attr "mode" "<MODE>")])
1263
1277 (define_insn "*cmp<mode>_ccno_1" 1264 (define_insn "*cmp<mode>_ccno_1"
1278 [(set (reg FLAGS_REG) 1265 [(set (reg FLAGS_REG)
1279 (compare (match_operand:SWI 0 "nonimmediate_operand" "<r>,?m<r>") 1266 (compare (match_operand:SWI 0 "nonimmediate_operand" "<r>,?m<r>")
1280 (match_operand:SWI 1 "const0_operand")))] 1267 (match_operand:SWI 1 "const0_operand")))]
1281 "ix86_match_ccmode (insn, CCNOmode)" 1268 "ix86_match_ccmode (insn, CCNOmode)"
1282 "@ 1269 "@
1283 test{<imodesuffix>}\t%0, %0 1270 test{<imodesuffix>}\t%0, %0
1284 cmp{<imodesuffix>}\t{%1, %0|%0, %1}" 1271 cmp{<imodesuffix>}\t{%1, %0|%0, %1}"
1285 [(set_attr "type" "test,icmp") 1272 [(set_attr "type" "test,icmp")
1286 (set_attr "length_immediate" "0,1") 1273 (set_attr "length_immediate" "0,1")
1287 (set_attr "modrm_class" "op0,unknown")
1288 (set_attr "mode" "<MODE>")]) 1274 (set_attr "mode" "<MODE>")])
1289 1275
1290 (define_insn "*cmp<mode>_1" 1276 (define_insn "*cmp<mode>_1"
1291 [(set (reg FLAGS_REG) 1277 [(set (reg FLAGS_REG)
1292 (compare (match_operand:SWI 0 "nonimmediate_operand" "<r>m,<r>") 1278 (compare (match_operand:SWI 0 "nonimmediate_operand" "<r>m,<r>")
1473 ix86_expand_setcc (operands[0], GET_CODE (operands[1]), 1459 ix86_expand_setcc (operands[0], GET_CODE (operands[1]),
1474 operands[2], operands[3]); 1460 operands[2], operands[3]);
1475 DONE; 1461 DONE;
1476 }) 1462 })
1477 1463
1478
1479 ;; FP compares, step 1: 1464 ;; FP compares, step 1:
1480 ;; Set the FP condition codes. 1465 ;; Set the FP condition codes and move fpsr to ax.
1481 ;; 1466
1482 ;; CCFPmode compare with exceptions 1467 ;; We may not use "#" to split and emit these
1483 ;; CCFPUmode compare with no exceptions 1468 ;; due to reg-stack pops killing fpsr.
1484
1485 ;; We may not use "#" to split and emit these, since the REG_DEAD notes
1486 ;; used to manage the reg stack popping would not be preserved.
1487
1488 (define_insn "*cmp<mode>_0_i387"
1489 [(set (match_operand:HI 0 "register_operand" "=a")
1490 (unspec:HI
1491 [(compare:CCFP
1492 (match_operand:X87MODEF 1 "register_operand" "f")
1493 (match_operand:X87MODEF 2 "const0_operand"))]
1494 UNSPEC_FNSTSW))]
1495 "TARGET_80387"
1496 "* return output_fp_compare (insn, operands, false, false);"
1497 [(set_attr "type" "multi")
1498 (set_attr "unit" "i387")
1499 (set_attr "mode" "<MODE>")])
1500
1501 (define_insn_and_split "*cmp<mode>_0_cc_i387"
1502 [(set (reg:CCFP FLAGS_REG)
1503 (compare:CCFP
1504 (match_operand:X87MODEF 1 "register_operand" "f")
1505 (match_operand:X87MODEF 2 "const0_operand")))
1506 (clobber (match_operand:HI 0 "register_operand" "=a"))]
1507 "TARGET_80387 && TARGET_SAHF && !TARGET_CMOVE"
1508 "#"
1509 "&& reload_completed"
1510 [(set (match_dup 0)
1511 (unspec:HI
1512 [(compare:CCFP (match_dup 1)(match_dup 2))]
1513 UNSPEC_FNSTSW))
1514 (set (reg:CC FLAGS_REG)
1515 (unspec:CC [(match_dup 0)] UNSPEC_SAHF))]
1516 ""
1517 [(set_attr "type" "multi")
1518 (set_attr "unit" "i387")
1519 (set_attr "mode" "<MODE>")])
1520 1469
1521 (define_insn "*cmpxf_i387" 1470 (define_insn "*cmpxf_i387"
1522 [(set (match_operand:HI 0 "register_operand" "=a") 1471 [(set (match_operand:HI 0 "register_operand" "=a")
1523 (unspec:HI 1472 (unspec:HI
1524 [(compare:CCFP 1473 [(compare:CCFP
1525 (match_operand:XF 1 "register_operand" "f") 1474 (match_operand:XF 1 "register_operand" "f")
1526 (match_operand:XF 2 "register_operand" "f"))] 1475 (match_operand:XF 2 "reg_or_0_operand" "fC"))]
1527 UNSPEC_FNSTSW))] 1476 UNSPEC_FNSTSW))]
1528 "TARGET_80387" 1477 "TARGET_80387"
1529 "* return output_fp_compare (insn, operands, false, false);" 1478 "* return output_fp_compare (insn, operands, false, false);"
1530 [(set_attr "type" "multi") 1479 [(set_attr "type" "multi")
1531 (set_attr "unit" "i387") 1480 (set_attr "unit" "i387")
1532 (set_attr "mode" "XF")]) 1481 (set_attr "mode" "XF")])
1533 1482
1534 (define_insn_and_split "*cmpxf_cc_i387"
1535 [(set (reg:CCFP FLAGS_REG)
1536 (compare:CCFP
1537 (match_operand:XF 1 "register_operand" "f")
1538 (match_operand:XF 2 "register_operand" "f")))
1539 (clobber (match_operand:HI 0 "register_operand" "=a"))]
1540 "TARGET_80387 && TARGET_SAHF && !TARGET_CMOVE"
1541 "#"
1542 "&& reload_completed"
1543 [(set (match_dup 0)
1544 (unspec:HI
1545 [(compare:CCFP (match_dup 1)(match_dup 2))]
1546 UNSPEC_FNSTSW))
1547 (set (reg:CC FLAGS_REG)
1548 (unspec:CC [(match_dup 0)] UNSPEC_SAHF))]
1549 ""
1550 [(set_attr "type" "multi")
1551 (set_attr "unit" "i387")
1552 (set_attr "mode" "XF")])
1553
1554 (define_insn "*cmp<mode>_i387" 1483 (define_insn "*cmp<mode>_i387"
1555 [(set (match_operand:HI 0 "register_operand" "=a") 1484 [(set (match_operand:HI 0 "register_operand" "=a")
1556 (unspec:HI 1485 (unspec:HI
1557 [(compare:CCFP 1486 [(compare:CCFP
1558 (match_operand:MODEF 1 "register_operand" "f") 1487 (match_operand:MODEF 1 "register_operand" "f")
1559 (match_operand:MODEF 2 "nonimmediate_operand" "fm"))] 1488 (match_operand:MODEF 2 "nonimm_or_0_operand" "fmC"))]
1560 UNSPEC_FNSTSW))] 1489 UNSPEC_FNSTSW))]
1561 "TARGET_80387" 1490 "TARGET_80387"
1562 "* return output_fp_compare (insn, operands, false, false);" 1491 "* return output_fp_compare (insn, operands, false, false);"
1563 [(set_attr "type" "multi") 1492 [(set_attr "type" "multi")
1564 (set_attr "unit" "i387") 1493 (set_attr "unit" "i387")
1565 (set_attr "mode" "<MODE>")]) 1494 (set_attr "mode" "<MODE>")])
1566 1495
1567 (define_insn_and_split "*cmp<mode>_cc_i387"
1568 [(set (reg:CCFP FLAGS_REG)
1569 (compare:CCFP
1570 (match_operand:MODEF 1 "register_operand" "f")
1571 (match_operand:MODEF 2 "nonimmediate_operand" "fm")))
1572 (clobber (match_operand:HI 0 "register_operand" "=a"))]
1573 "TARGET_80387 && TARGET_SAHF && !TARGET_CMOVE"
1574 "#"
1575 "&& reload_completed"
1576 [(set (match_dup 0)
1577 (unspec:HI
1578 [(compare:CCFP (match_dup 1)(match_dup 2))]
1579 UNSPEC_FNSTSW))
1580 (set (reg:CC FLAGS_REG)
1581 (unspec:CC [(match_dup 0)] UNSPEC_SAHF))]
1582 ""
1583 [(set_attr "type" "multi")
1584 (set_attr "unit" "i387")
1585 (set_attr "mode" "<MODE>")])
1586
1587 (define_insn "*cmpu<mode>_i387"
1588 [(set (match_operand:HI 0 "register_operand" "=a")
1589 (unspec:HI
1590 [(compare:CCFPU
1591 (match_operand:X87MODEF 1 "register_operand" "f")
1592 (match_operand:X87MODEF 2 "register_operand" "f"))]
1593 UNSPEC_FNSTSW))]
1594 "TARGET_80387"
1595 "* return output_fp_compare (insn, operands, false, true);"
1596 [(set_attr "type" "multi")
1597 (set_attr "unit" "i387")
1598 (set_attr "mode" "<MODE>")])
1599
1600 (define_insn_and_split "*cmpu<mode>_cc_i387"
1601 [(set (reg:CCFPU FLAGS_REG)
1602 (compare:CCFPU
1603 (match_operand:X87MODEF 1 "register_operand" "f")
1604 (match_operand:X87MODEF 2 "register_operand" "f")))
1605 (clobber (match_operand:HI 0 "register_operand" "=a"))]
1606 "TARGET_80387 && TARGET_SAHF && !TARGET_CMOVE"
1607 "#"
1608 "&& reload_completed"
1609 [(set (match_dup 0)
1610 (unspec:HI
1611 [(compare:CCFPU (match_dup 1)(match_dup 2))]
1612 UNSPEC_FNSTSW))
1613 (set (reg:CC FLAGS_REG)
1614 (unspec:CC [(match_dup 0)] UNSPEC_SAHF))]
1615 ""
1616 [(set_attr "type" "multi")
1617 (set_attr "unit" "i387")
1618 (set_attr "mode" "<MODE>")])
1619
1620 (define_insn "*cmp<X87MODEF:mode>_<SWI24:mode>_i387" 1496 (define_insn "*cmp<X87MODEF:mode>_<SWI24:mode>_i387"
1621 [(set (match_operand:HI 0 "register_operand" "=a") 1497 [(set (match_operand:HI 0 "register_operand" "=a")
1622 (unspec:HI 1498 (unspec:HI
1623 [(compare:CCFP 1499 [(compare:CCFP
1624 (match_operand:X87MODEF 1 "register_operand" "f") 1500 (match_operand:X87MODEF 1 "register_operand" "f")
1625 (float:X87MODEF 1501 (float:X87MODEF
1626 (match_operand:SWI24 2 "memory_operand" "m")))] 1502 (match_operand:SWI24 2 "nonimmediate_operand" "m")))]
1627 UNSPEC_FNSTSW))] 1503 UNSPEC_FNSTSW))]
1628 "TARGET_80387 1504 "TARGET_80387
1629 && (TARGET_USE_<SWI24:MODE>MODE_FIOP 1505 && (TARGET_USE_<SWI24:MODE>MODE_FIOP
1630 || optimize_function_for_size_p (cfun))" 1506 || optimize_function_for_size_p (cfun))"
1631 "* return output_fp_compare (insn, operands, false, false);" 1507 "* return output_fp_compare (insn, operands, false, false);"
1632 [(set_attr "type" "multi") 1508 [(set_attr "type" "multi")
1633 (set_attr "unit" "i387") 1509 (set_attr "unit" "i387")
1634 (set_attr "fp_int_src" "true") 1510 (set_attr "fp_int_src" "true")
1635 (set_attr "mode" "<SWI24:MODE>")]) 1511 (set_attr "mode" "<SWI24:MODE>")])
1636 1512
1637 (define_insn_and_split "*cmp<X87MODEF:mode>_<SWI24:mode>_cc_i387" 1513 (define_insn "*cmpu<mode>_i387"
1638 [(set (reg:CCFP FLAGS_REG) 1514 [(set (match_operand:HI 0 "register_operand" "=a")
1639 (compare:CCFP
1640 (match_operand:X87MODEF 1 "register_operand" "f")
1641 (float:X87MODEF
1642 (match_operand:SWI24 2 "memory_operand" "m"))))
1643 (clobber (match_operand:HI 0 "register_operand" "=a"))]
1644 "TARGET_80387 && TARGET_SAHF && !TARGET_CMOVE
1645 && (TARGET_USE_<SWI24:MODE>MODE_FIOP
1646 || optimize_function_for_size_p (cfun))"
1647 "#"
1648 "&& reload_completed"
1649 [(set (match_dup 0)
1650 (unspec:HI 1515 (unspec:HI
1651 [(compare:CCFP 1516 [(unspec:CCFP
1652 (match_dup 1) 1517 [(compare:CCFP
1653 (float:X87MODEF (match_dup 2)))] 1518 (match_operand:X87MODEF 1 "register_operand" "f")
1654 UNSPEC_FNSTSW)) 1519 (match_operand:X87MODEF 2 "register_operand" "f"))]
1655 (set (reg:CC FLAGS_REG) 1520 UNSPEC_NOTRAP)]
1656 (unspec:CC [(match_dup 0)] UNSPEC_SAHF))] 1521 UNSPEC_FNSTSW))]
1657 "" 1522 "TARGET_80387"
1523 "* return output_fp_compare (insn, operands, false, true);"
1658 [(set_attr "type" "multi") 1524 [(set_attr "type" "multi")
1659 (set_attr "unit" "i387") 1525 (set_attr "unit" "i387")
1660 (set_attr "fp_int_src" "true") 1526 (set_attr "mode" "<MODE>")])
1661 (set_attr "mode" "<SWI24:MODE>")]) 1527
1662 1528 ;; FP compares, step 2:
1663 ;; FP compares, step 2
1664 ;; Move the fpsw to ax.
1665
1666 (define_insn "x86_fnstsw_1"
1667 [(set (match_operand:HI 0 "register_operand" "=a")
1668 (unspec:HI [(reg:CCFP FPSR_REG)] UNSPEC_FNSTSW))]
1669 "TARGET_80387"
1670 "fnstsw\t%0"
1671 [(set_attr "length" "2")
1672 (set_attr "mode" "SI")
1673 (set_attr "unit" "i387")])
1674
1675 ;; FP compares, step 3
1676 ;; Get ax into flags, general case. 1529 ;; Get ax into flags, general case.
1677 1530
1678 (define_insn "x86_sahf_1" 1531 (define_insn "x86_sahf_1"
1679 [(set (reg:CC FLAGS_REG) 1532 [(set (reg:CC FLAGS_REG)
1680 (unspec:CC [(match_operand:HI 0 "register_operand" "a")] 1533 (unspec:CC [(match_operand:HI 0 "register_operand" "a")]
1692 (set_attr "athlon_decode" "vector") 1545 (set_attr "athlon_decode" "vector")
1693 (set_attr "amdfam10_decode" "direct") 1546 (set_attr "amdfam10_decode" "direct")
1694 (set_attr "bdver1_decode" "direct") 1547 (set_attr "bdver1_decode" "direct")
1695 (set_attr "mode" "SI")]) 1548 (set_attr "mode" "SI")])
1696 1549
1697 ;; Pentium Pro can do steps 1 through 3 in one go. 1550 ;; Pentium Pro can do both steps in one go.
1698 ;; (these instructions set flags directly) 1551 ;; (these instructions set flags directly)
1699 1552
1700 (define_mode_iterator FPCMP [CCFP CCFPU]) 1553 (define_subst_attr "unord" "unord_subst" "" "u")
1701 (define_mode_attr unord [(CCFP "") (CCFPU "u")]) 1554 (define_subst_attr "unordered" "unord_subst" "false" "true")
1702 1555
1703 (define_insn "*cmpi<FPCMP:unord><MODEF:mode>" 1556 (define_subst "unord_subst"
1704 [(set (reg:FPCMP FLAGS_REG) 1557 [(set (match_operand:CCFP 0)
1705 (compare:FPCMP 1558 (match_operand:CCFP 1))]
1559 ""
1560 [(set (match_dup 0)
1561 (unspec:CCFP
1562 [(match_dup 1)]
1563 UNSPEC_NOTRAP))])
1564
1565 (define_insn "*cmpi<unord>xf_i387"
1566 [(set (reg:CCFP FLAGS_REG)
1567 (compare:CCFP
1568 (match_operand:XF 0 "register_operand" "f")
1569 (match_operand:XF 1 "register_operand" "f")))]
1570 "TARGET_80387 && TARGET_CMOVE"
1571 "* return output_fp_compare (insn, operands, true, <unordered>);"
1572 [(set_attr "type" "fcmp")
1573 (set_attr "mode" "XF")
1574 (set_attr "athlon_decode" "vector")
1575 (set_attr "amdfam10_decode" "direct")
1576 (set_attr "bdver1_decode" "double")
1577 (set_attr "znver1_decode" "double")])
1578
1579 (define_insn "*cmpi<unord><MODEF:mode>"
1580 [(set (reg:CCFP FLAGS_REG)
1581 (compare:CCFP
1706 (match_operand:MODEF 0 "register_operand" "f,v") 1582 (match_operand:MODEF 0 "register_operand" "f,v")
1707 (match_operand:MODEF 1 "register_ssemem_operand" "f,vm")))] 1583 (match_operand:MODEF 1 "register_ssemem_operand" "f,vm")))]
1708 "(SSE_FLOAT_MODE_P (<MODEF:MODE>mode) && TARGET_SSE_MATH) 1584 "(SSE_FLOAT_MODE_P (<MODEF:MODE>mode) && TARGET_SSE_MATH)
1709 || (TARGET_80387 && TARGET_CMOVE)" 1585 || (TARGET_80387 && TARGET_CMOVE)"
1710 "@ 1586 "@
1711 * return output_fp_compare (insn, operands, true, \ 1587 * return output_fp_compare (insn, operands, true, <unordered>);
1712 <FPCMP:MODE>mode == CCFPUmode); 1588 %v<unord>comi<MODEF:ssemodesuffix>\t{%1, %0|%0, %1}"
1713 %v<FPCMP:unord>comi<MODEF:ssemodesuffix>\t{%1, %0|%0, %1}"
1714 [(set_attr "type" "fcmp,ssecomi") 1589 [(set_attr "type" "fcmp,ssecomi")
1715 (set_attr "prefix" "orig,maybe_vex") 1590 (set_attr "prefix" "orig,maybe_vex")
1716 (set_attr "mode" "<MODEF:MODE>") 1591 (set_attr "mode" "<MODEF:MODE>")
1717 (set_attr "prefix_rep" "*,0") 1592 (set_attr "prefix_rep" "*,0")
1718 (set (attr "prefix_data16") 1593 (set (attr "prefix_data16")
1735 (symbol_ref "true")) 1610 (symbol_ref "true"))
1736 (if_then_else 1611 (if_then_else
1737 (eq_attr "alternative" "0") 1612 (eq_attr "alternative" "0")
1738 (symbol_ref "true") 1613 (symbol_ref "true")
1739 (symbol_ref "false"))))]) 1614 (symbol_ref "false"))))])
1740
1741 (define_insn "*cmpi<unord>xf_i387"
1742 [(set (reg:FPCMP FLAGS_REG)
1743 (compare:FPCMP
1744 (match_operand:XF 0 "register_operand" "f")
1745 (match_operand:XF 1 "register_operand" "f")))]
1746 "TARGET_80387 && TARGET_CMOVE"
1747 "* return output_fp_compare (insn, operands, true,
1748 <MODE>mode == CCFPUmode);"
1749 [(set_attr "type" "fcmp")
1750 (set_attr "mode" "XF")
1751 (set_attr "athlon_decode" "vector")
1752 (set_attr "amdfam10_decode" "direct")
1753 (set_attr "bdver1_decode" "double")
1754 (set_attr "znver1_decode" "double")])
1755 1615
1756 ;; Push/pop instructions. 1616 ;; Push/pop instructions.
1757 1617
1758 (define_insn "*push<mode>2" 1618 (define_insn "*push<mode>2"
1759 [(set (match_operand:DWI 0 "push_operand" "=<") 1619 [(set (match_operand:DWI 0 "push_operand" "=<")
1987 (match_operand:SWI48 1 "const0_operand")) 1847 (match_operand:SWI48 1 "const0_operand"))
1988 (clobber (reg:CC FLAGS_REG))] 1848 (clobber (reg:CC FLAGS_REG))]
1989 "reload_completed" 1849 "reload_completed"
1990 "xor{l}\t%k0, %k0" 1850 "xor{l}\t%k0, %k0"
1991 [(set_attr "type" "alu1") 1851 [(set_attr "type" "alu1")
1992 (set_attr "modrm_class" "op0")
1993 (set_attr "mode" "SI") 1852 (set_attr "mode" "SI")
1994 (set_attr "length_immediate" "0")]) 1853 (set_attr "length_immediate" "0")])
1995 1854
1996 (define_insn "*mov<mode>_or" 1855 (define_insn "*mov<mode>_or"
1997 [(set (match_operand:SWI48 0 "register_operand" "=r") 1856 [(set (match_operand:SWI48 0 "register_operand" "=r")
2011 || register_operand (operands[1], XImode))" 1870 || register_operand (operands[1], XImode))"
2012 { 1871 {
2013 switch (get_attr_type (insn)) 1872 switch (get_attr_type (insn))
2014 { 1873 {
2015 case TYPE_SSELOG1: 1874 case TYPE_SSELOG1:
2016 return standard_sse_constant_opcode (insn, operands[1]); 1875 return standard_sse_constant_opcode (insn, operands);
2017 1876
2018 case TYPE_SSEMOV: 1877 case TYPE_SSEMOV:
2019 if (misaligned_operand (operands[0], XImode) 1878 if (misaligned_operand (operands[0], XImode)
2020 || misaligned_operand (operands[1], XImode)) 1879 || misaligned_operand (operands[1], XImode))
2021 return "vmovdqu32\t{%1, %0|%0, %1}"; 1880 return "vmovdqu32\t{%1, %0|%0, %1}";
2038 || register_operand (operands[1], OImode))" 1897 || register_operand (operands[1], OImode))"
2039 { 1898 {
2040 switch (get_attr_type (insn)) 1899 switch (get_attr_type (insn))
2041 { 1900 {
2042 case TYPE_SSELOG1: 1901 case TYPE_SSELOG1:
2043 return standard_sse_constant_opcode (insn, operands[1]); 1902 return standard_sse_constant_opcode (insn, operands);
2044 1903
2045 case TYPE_SSEMOV: 1904 case TYPE_SSEMOV:
2046 if (misaligned_operand (operands[0], OImode) 1905 if (misaligned_operand (operands[0], OImode)
2047 || misaligned_operand (operands[1], OImode)) 1906 || misaligned_operand (operands[1], OImode))
2048 { 1907 {
2084 ] 1943 ]
2085 (const_string "OI")))]) 1944 (const_string "OI")))])
2086 1945
2087 (define_insn "*movti_internal" 1946 (define_insn "*movti_internal"
2088 [(set (match_operand:TI 0 "nonimmediate_operand" "=!r ,o ,v,v ,v ,m,?r,?Yd") 1947 [(set (match_operand:TI 0 "nonimmediate_operand" "=!r ,o ,v,v ,v ,m,?r,?Yd")
2089 (match_operand:TI 1 "general_operand" "riFo,re,C,BC,vm,v,Ye,r"))] 1948 (match_operand:TI 1 "general_operand" "riFo,re,C,BC,vm,v,Yd,r"))]
2090 "(TARGET_64BIT 1949 "(TARGET_64BIT
2091 && !(MEM_P (operands[0]) && MEM_P (operands[1]))) 1950 && !(MEM_P (operands[0]) && MEM_P (operands[1])))
2092 || (TARGET_SSE 1951 || (TARGET_SSE
2093 && nonimmediate_or_sse_const_operand (operands[1], TImode) 1952 && nonimmediate_or_sse_const_operand (operands[1], TImode)
2094 && (register_operand (operands[0], TImode) 1953 && (register_operand (operands[0], TImode)
2098 { 1957 {
2099 case TYPE_MULTI: 1958 case TYPE_MULTI:
2100 return "#"; 1959 return "#";
2101 1960
2102 case TYPE_SSELOG1: 1961 case TYPE_SSELOG1:
2103 return standard_sse_constant_opcode (insn, operands[1]); 1962 return standard_sse_constant_opcode (insn, operands);
2104 1963
2105 case TYPE_SSEMOV: 1964 case TYPE_SSEMOV:
2106 /* TDmode values are passed as TImode on the stack. Moving them 1965 /* TDmode values are passed as TImode on the stack. Moving them
2107 to stack may result in unaligned memory access. */ 1966 to stack may result in unaligned memory access. */
2108 if (misaligned_operand (operands[0], TImode) 1967 if (misaligned_operand (operands[0], TImode)
2164 (match_test "TARGET_AVX") 2023 (match_test "TARGET_AVX")
2165 (const_string "TI") 2024 (const_string "TI")
2166 (match_test "optimize_function_for_size_p (cfun)") 2025 (match_test "optimize_function_for_size_p (cfun)")
2167 (const_string "V4SF") 2026 (const_string "V4SF")
2168 ] 2027 ]
2169 (const_string "TI")))]) 2028 (const_string "TI")))
2029 (set (attr "preferred_for_speed")
2030 (cond [(eq_attr "alternative" "6")
2031 (symbol_ref "TARGET_INTER_UNIT_MOVES_FROM_VEC")
2032 (eq_attr "alternative" "7")
2033 (symbol_ref "TARGET_INTER_UNIT_MOVES_TO_VEC")
2034 ]
2035 (symbol_ref "true")))])
2170 2036
2171 (define_split 2037 (define_split
2172 [(set (match_operand:TI 0 "sse_reg_operand") 2038 [(set (match_operand:TI 0 "sse_reg_operand")
2173 (match_operand:TI 1 "general_reg_operand"))] 2039 (match_operand:TI 1 "general_reg_operand"))]
2174 "TARGET_64BIT && TARGET_SSE4_1 && TARGET_INTER_UNIT_MOVES_TO_VEC 2040 "TARGET_64BIT && TARGET_SSE4_1
2175 && reload_completed" 2041 && reload_completed"
2176 [(set (match_dup 2) 2042 [(set (match_dup 2)
2177 (vec_merge:V2DI 2043 (vec_merge:V2DI
2178 (vec_duplicate:V2DI (match_dup 3)) 2044 (vec_duplicate:V2DI (match_dup 3))
2179 (match_dup 2) 2045 (match_dup 2)
2186 gen_lowpart (DImode, operands[1])); 2052 gen_lowpart (DImode, operands[1]));
2187 }) 2053 })
2188 2054
2189 (define_insn "*movdi_internal" 2055 (define_insn "*movdi_internal"
2190 [(set (match_operand:DI 0 "nonimmediate_operand" 2056 [(set (match_operand:DI 0 "nonimmediate_operand"
2191 "=r ,o ,r,r ,r,m ,*y,*y,?*y,?m,?r ,?*Ym,*v,*v,*v,m ,m,?r ,?*Yd,?r ,?*Yi,?*Ym,?*Yi,*k,*k ,*r,*m") 2057 "=r ,o ,r,r ,r,m ,*y,*y,?*y,?m,?r,?*y,*v,*v,*v,m ,m,?r ,?*Yd,?r,?*v,?*y,?*x,*k,*k ,*r,*m")
2192 (match_operand:DI 1 "general_operand" 2058 (match_operand:DI 1 "general_operand"
2193 "riFo,riF,Z,rem,i,re,C ,*y,m ,*y,*Yn,r ,C ,*v,m ,*v,v,*Ye,r ,*Yj,r ,*Yj ,*Yn ,*r,*km,*k,*k"))] 2059 "riFo,riF,Z,rem,i,re,C ,*y,m ,*y,*y,r ,C ,*v,m ,*v,v,*Yd,r ,*v,r ,*x ,*y ,*r,*km,*k,*k"))]
2194 "!(MEM_P (operands[0]) && MEM_P (operands[1]))" 2060 "!(MEM_P (operands[0]) && MEM_P (operands[1]))"
2195 { 2061 {
2196 switch (get_attr_type (insn)) 2062 switch (get_attr_type (insn))
2197 { 2063 {
2198 case TYPE_MSKMOV: 2064 case TYPE_MSKMOV:
2210 && (GENERAL_REG_P (operands[0]) || GENERAL_REG_P (operands[1]))) 2076 && (GENERAL_REG_P (operands[0]) || GENERAL_REG_P (operands[1])))
2211 return "movd\t{%1, %0|%0, %1}"; 2077 return "movd\t{%1, %0|%0, %1}";
2212 return "movq\t{%1, %0|%0, %1}"; 2078 return "movq\t{%1, %0|%0, %1}";
2213 2079
2214 case TYPE_SSELOG1: 2080 case TYPE_SSELOG1:
2215 return standard_sse_constant_opcode (insn, operands[1]); 2081 return standard_sse_constant_opcode (insn, operands);
2216 2082
2217 case TYPE_SSEMOV: 2083 case TYPE_SSEMOV:
2218 switch (get_attr_mode (insn)) 2084 switch (get_attr_mode (insn))
2219 { 2085 {
2220 case MODE_DI: 2086 case MODE_DI:
2221 /* Handle broken assemblers that require movd instead of movq. */ 2087 /* Handle broken assemblers that require movd instead of movq. */
2222 if (!HAVE_AS_IX86_INTERUNIT_MOVQ 2088 if (!HAVE_AS_IX86_INTERUNIT_MOVQ
2223 && (GENERAL_REG_P (operands[0]) || GENERAL_REG_P (operands[1]))) 2089 && (GENERAL_REG_P (operands[0]) || GENERAL_REG_P (operands[1])))
2224 return "%vmovd\t{%1, %0|%0, %1}"; 2090 return "%vmovd\t{%1, %0|%0, %1}";
2225 return "%vmovq\t{%1, %0|%0, %1}"; 2091 return "%vmovq\t{%1, %0|%0, %1}";
2092
2226 case MODE_TI: 2093 case MODE_TI:
2094 /* Handle AVX512 registers set. */
2095 if (EXT_REX_SSE_REG_P (operands[0])
2096 || EXT_REX_SSE_REG_P (operands[1]))
2097 return "vmovdqa64\t{%1, %0|%0, %1}";
2227 return "%vmovdqa\t{%1, %0|%0, %1}"; 2098 return "%vmovdqa\t{%1, %0|%0, %1}";
2228 case MODE_XI:
2229 return "vmovdqa64\t{%g1, %g0|%g0, %g1}";
2230 2099
2231 case MODE_V2SF: 2100 case MODE_V2SF:
2232 gcc_assert (!TARGET_AVX); 2101 gcc_assert (!TARGET_AVX);
2233 return "movlps\t{%1, %0|%0, %1}"; 2102 return "movlps\t{%1, %0|%0, %1}";
2234 case MODE_V4SF: 2103 case MODE_V4SF:
2263 } 2132 }
2264 } 2133 }
2265 [(set (attr "isa") 2134 [(set (attr "isa")
2266 (cond [(eq_attr "alternative" "0,1,17,18") 2135 (cond [(eq_attr "alternative" "0,1,17,18")
2267 (const_string "nox64") 2136 (const_string "nox64")
2268 (eq_attr "alternative" "2,3,4,5,10,11,19,20,23,25") 2137 (eq_attr "alternative" "2,3,4,5,10,11,23,25")
2269 (const_string "x64") 2138 (const_string "x64")
2139 (eq_attr "alternative" "19,20")
2140 (const_string "x64_sse2")
2141 (eq_attr "alternative" "21,22")
2142 (const_string "sse2")
2270 ] 2143 ]
2271 (const_string "*"))) 2144 (const_string "*")))
2272 (set (attr "type") 2145 (set (attr "type")
2273 (cond [(eq_attr "alternative" "0,1,17,18") 2146 (cond [(eq_attr "alternative" "0,1,17,18")
2274 (const_string "multi") 2147 (const_string "multi")
2316 (cond [(eq_attr "alternative" "2") 2189 (cond [(eq_attr "alternative" "2")
2317 (const_string "SI") 2190 (const_string "SI")
2318 (eq_attr "alternative" "12,13") 2191 (eq_attr "alternative" "12,13")
2319 (cond [(ior (match_operand 0 "ext_sse_reg_operand") 2192 (cond [(ior (match_operand 0 "ext_sse_reg_operand")
2320 (match_operand 1 "ext_sse_reg_operand")) 2193 (match_operand 1 "ext_sse_reg_operand"))
2321 (const_string "XI") 2194 (const_string "TI")
2322 (ior (not (match_test "TARGET_SSE2")) 2195 (ior (not (match_test "TARGET_SSE2"))
2323 (match_test "TARGET_SSE_PACKED_SINGLE_INSN_OPTIMAL")) 2196 (match_test "TARGET_SSE_PACKED_SINGLE_INSN_OPTIMAL"))
2324 (const_string "V4SF") 2197 (const_string "V4SF")
2325 (match_test "TARGET_AVX") 2198 (match_test "TARGET_AVX")
2326 (const_string "TI") 2199 (const_string "TI")
2332 (and (eq_attr "alternative" "14,15,16") 2205 (and (eq_attr "alternative" "14,15,16")
2333 (not (match_test "TARGET_SSE2"))) 2206 (not (match_test "TARGET_SSE2")))
2334 (const_string "V2SF") 2207 (const_string "V2SF")
2335 ] 2208 ]
2336 (const_string "DI"))) 2209 (const_string "DI")))
2210 (set (attr "preferred_for_speed")
2211 (cond [(eq_attr "alternative" "10,17,19")
2212 (symbol_ref "TARGET_INTER_UNIT_MOVES_FROM_VEC")
2213 (eq_attr "alternative" "11,18,20")
2214 (symbol_ref "TARGET_INTER_UNIT_MOVES_TO_VEC")
2215 ]
2216 (symbol_ref "true")))
2337 (set (attr "enabled") 2217 (set (attr "enabled")
2338 (cond [(eq_attr "alternative" "15") 2218 (cond [(eq_attr "alternative" "15")
2339 (if_then_else 2219 (if_then_else
2340 (match_test "TARGET_STV && TARGET_SSE2") 2220 (match_test "TARGET_STV && TARGET_SSE2")
2341 (symbol_ref "false") 2221 (symbol_ref "false")
2349 (const_string "*")))]) 2229 (const_string "*")))])
2350 2230
2351 (define_split 2231 (define_split
2352 [(set (match_operand:<DWI> 0 "general_reg_operand") 2232 [(set (match_operand:<DWI> 0 "general_reg_operand")
2353 (match_operand:<DWI> 1 "sse_reg_operand"))] 2233 (match_operand:<DWI> 1 "sse_reg_operand"))]
2354 "TARGET_SSE4_1 && TARGET_INTER_UNIT_MOVES_FROM_VEC 2234 "TARGET_SSE4_1
2355 && reload_completed" 2235 && reload_completed"
2356 [(set (match_dup 2) 2236 [(set (match_dup 2)
2357 (vec_select:DWIH 2237 (vec_select:DWIH
2358 (match_dup 3) 2238 (match_dup 3)
2359 (parallel [(const_int 1)])))] 2239 (parallel [(const_int 1)])))]
2373 "ix86_split_long_move (operands); DONE;") 2253 "ix86_split_long_move (operands); DONE;")
2374 2254
2375 (define_split 2255 (define_split
2376 [(set (match_operand:DI 0 "sse_reg_operand") 2256 [(set (match_operand:DI 0 "sse_reg_operand")
2377 (match_operand:DI 1 "general_reg_operand"))] 2257 (match_operand:DI 1 "general_reg_operand"))]
2378 "!TARGET_64BIT && TARGET_SSE4_1 && TARGET_INTER_UNIT_MOVES_TO_VEC 2258 "!TARGET_64BIT && TARGET_SSE4_1
2379 && reload_completed" 2259 && reload_completed"
2380 [(set (match_dup 2) 2260 [(set (match_dup 2)
2381 (vec_merge:V4SI 2261 (vec_merge:V4SI
2382 (vec_duplicate:V4SI (match_dup 3)) 2262 (vec_duplicate:V4SI (match_dup 3))
2383 (match_dup 2) 2263 (match_dup 2)
2412 operands[2] = gen_int_mode (shift, QImode); 2292 operands[2] = gen_int_mode (shift, QImode);
2413 }) 2293 })
2414 2294
2415 (define_insn "*movsi_internal" 2295 (define_insn "*movsi_internal"
2416 [(set (match_operand:SI 0 "nonimmediate_operand" 2296 [(set (match_operand:SI 0 "nonimmediate_operand"
2417 "=r,m ,*y,*y,?*y,?m,?r ,?*Ym,*v,*v,*v,m ,?r ,?*Yi,*k,*k ,*rm") 2297 "=r,m ,*y,*y,?*y,?m,?r,?*y,*v,*v,*v,m ,?r,?*v,*k,*k ,*rm")
2418 (match_operand:SI 1 "general_operand" 2298 (match_operand:SI 1 "general_operand"
2419 "g ,re,C ,*y,m ,*y,*Yn,r ,C ,*v,m ,*v,*Yj,r ,*r,*km,*k"))] 2299 "g ,re,C ,*y,m ,*y,*y,r ,C ,*v,m ,*v,*v,r ,*r,*km,*k"))]
2420 "!(MEM_P (operands[0]) && MEM_P (operands[1]))" 2300 "!(MEM_P (operands[0]) && MEM_P (operands[1]))"
2421 { 2301 {
2422 switch (get_attr_type (insn)) 2302 switch (get_attr_type (insn))
2423 { 2303 {
2424 case TYPE_SSELOG1: 2304 case TYPE_SSELOG1:
2425 return standard_sse_constant_opcode (insn, operands[1]); 2305 return standard_sse_constant_opcode (insn, operands);
2426 2306
2427 case TYPE_MSKMOV: 2307 case TYPE_MSKMOV:
2428 return "kmovd\t{%1, %0|%0, %1}"; 2308 return "kmovd\t{%1, %0|%0, %1}";
2429 2309
2430 case TYPE_SSEMOV: 2310 case TYPE_SSEMOV:
2475 2355
2476 default: 2356 default:
2477 gcc_unreachable (); 2357 gcc_unreachable ();
2478 } 2358 }
2479 } 2359 }
2480 [(set (attr "type") 2360 [(set (attr "isa")
2361 (cond [(eq_attr "alternative" "12,13")
2362 (const_string "sse2")
2363 ]
2364 (const_string "*")))
2365 (set (attr "type")
2481 (cond [(eq_attr "alternative" "2") 2366 (cond [(eq_attr "alternative" "2")
2482 (const_string "mmx") 2367 (const_string "mmx")
2483 (eq_attr "alternative" "3,4,5,6,7") 2368 (eq_attr "alternative" "3,4,5,6,7")
2484 (const_string "mmxmov") 2369 (const_string "mmxmov")
2485 (eq_attr "alternative" "8") 2370 (eq_attr "alternative" "8")
2520 2405
2521 (and (eq_attr "alternative" "10,11") 2406 (and (eq_attr "alternative" "10,11")
2522 (not (match_test "TARGET_SSE2"))) 2407 (not (match_test "TARGET_SSE2")))
2523 (const_string "SF") 2408 (const_string "SF")
2524 ] 2409 ]
2525 (const_string "SI")))]) 2410 (const_string "SI")))
2411 (set (attr "preferred_for_speed")
2412 (cond [(eq_attr "alternative" "6,12")
2413 (symbol_ref "TARGET_INTER_UNIT_MOVES_FROM_VEC")
2414 (eq_attr "alternative" "7,13")
2415 (symbol_ref "TARGET_INTER_UNIT_MOVES_TO_VEC")
2416 ]
2417 (symbol_ref "true")))])
2526 2418
2527 (define_insn "*movhi_internal" 2419 (define_insn "*movhi_internal"
2528 [(set (match_operand:HI 0 "nonimmediate_operand" "=r,r ,r ,m ,k,k ,r,m") 2420 [(set (match_operand:HI 0 "nonimmediate_operand" "=r,r ,r ,m ,k,k ,r,m")
2529 (match_operand:HI 1 "general_operand" "r ,rn,rm,rn,r,km,k,k"))] 2421 (match_operand:HI 1 "general_operand" "r ,rn,rm,rn,r,km,k,k"))]
2530 "!(MEM_P (operands[0]) && MEM_P (operands[1]))" 2422 "!(MEM_P (operands[0]) && MEM_P (operands[1]))"
2839 (match_operand:SWI12 1 "const0_operand")) 2731 (match_operand:SWI12 1 "const0_operand"))
2840 (clobber (reg:CC FLAGS_REG))] 2732 (clobber (reg:CC FLAGS_REG))]
2841 "reload_completed" 2733 "reload_completed"
2842 "xor{<imodesuffix>}\t%0, %0" 2734 "xor{<imodesuffix>}\t%0, %0"
2843 [(set_attr "type" "alu1") 2735 [(set_attr "type" "alu1")
2844 (set_attr "modrm_class" "op0")
2845 (set_attr "mode" "<MODE>") 2736 (set_attr "mode" "<MODE>")
2846 (set_attr "length_immediate" "0")]) 2737 (set_attr "length_immediate" "0")])
2847 2738
2848 (define_expand "extv<mode>" 2739 (define_expand "extv<mode>"
2849 [(set (match_operand:SWI24 0 "register_operand") 2740 [(set (match_operand:SWI24 0 "register_operand")
3291 && memory_operand (operands[0], TFmode)))" 3182 && memory_operand (operands[0], TFmode)))"
3292 { 3183 {
3293 switch (get_attr_type (insn)) 3184 switch (get_attr_type (insn))
3294 { 3185 {
3295 case TYPE_SSELOG1: 3186 case TYPE_SSELOG1:
3296 return standard_sse_constant_opcode (insn, operands[1]); 3187 return standard_sse_constant_opcode (insn, operands);
3297 3188
3298 case TYPE_SSEMOV: 3189 case TYPE_SSEMOV:
3299 /* Handle misaligned load/store since we 3190 /* Handle misaligned load/store since we
3300 don't have movmisaligntf pattern. */ 3191 don't have movmisaligntf pattern. */
3301 if (misaligned_operand (operands[0], TFmode) 3192 if (misaligned_operand (operands[0], TFmode)
3432 "ix86_split_long_move (operands); DONE;") 3323 "ix86_split_long_move (operands); DONE;")
3433 3324
3434 ;; Possible store forwarding (partial memory) stall in alternatives 4, 6 and 7. 3325 ;; Possible store forwarding (partial memory) stall in alternatives 4, 6 and 7.
3435 (define_insn "*movdf_internal" 3326 (define_insn "*movdf_internal"
3436 [(set (match_operand:DF 0 "nonimmediate_operand" 3327 [(set (match_operand:DF 0 "nonimmediate_operand"
3437 "=Yf*f,m ,Yf*f,?r ,!o,?*r ,!o,!o,?r,?m,?r,?r,v,v,v,m,*x,*x,*x,m ,r ,Yi,r ,o ,r ,m") 3328 "=Yf*f,m ,Yf*f,?r ,!o,?*r ,!o,!o,?r,?m,?r,?r,v,v,v,m,*x,*x,*x,m ,r ,v,r ,o ,r ,m")
3438 (match_operand:DF 1 "general_operand" 3329 (match_operand:DF 1 "general_operand"
3439 "Yf*fm,Yf*f,G ,roF,r ,*roF,*r,F ,rm,rC,C ,F ,C,v,m,v,C ,*x,m ,*x,Yj,r ,roF,rF,rmF,rC"))] 3330 "Yf*fm,Yf*f,G ,roF,r ,*roF,*r,F ,rm,rC,C ,F ,C,v,m,v,C ,*x,m ,*x,v,r ,roF,rF,rmF,rC"))]
3440 "!(MEM_P (operands[0]) && MEM_P (operands[1])) 3331 "!(MEM_P (operands[0]) && MEM_P (operands[1]))
3441 && (lra_in_progress || reload_completed 3332 && (lra_in_progress || reload_completed
3442 || !CONST_DOUBLE_P (operands[1]) 3333 || !CONST_DOUBLE_P (operands[1])
3443 || ((optimize_function_for_size_p (cfun) 3334 || ((optimize_function_for_size_p (cfun)
3444 || (ix86_cmodel == CM_LARGE || ix86_cmodel == CM_LARGE_PIC)) 3335 || (ix86_cmodel == CM_LARGE || ix86_cmodel == CM_LARGE_PIC))
3468 return "movabs{q}\t{%1, %0|%0, %1}"; 3359 return "movabs{q}\t{%1, %0|%0, %1}";
3469 else 3360 else
3470 return "mov{q}\t{%1, %0|%0, %1}"; 3361 return "mov{q}\t{%1, %0|%0, %1}";
3471 3362
3472 case TYPE_SSELOG1: 3363 case TYPE_SSELOG1:
3473 return standard_sse_constant_opcode (insn, operands[1]); 3364 return standard_sse_constant_opcode (insn, operands);
3474 3365
3475 case TYPE_SSEMOV: 3366 case TYPE_SSEMOV:
3476 switch (get_attr_mode (insn)) 3367 switch (get_attr_mode (insn))
3477 { 3368 {
3478 case MODE_DF: 3369 case MODE_DF:
3479 if (TARGET_AVX && REG_P (operands[0]) && REG_P (operands[1])) 3370 if (TARGET_AVX && REG_P (operands[0]) && REG_P (operands[1]))
3480 return "vmovsd\t{%1, %0, %0|%0, %0, %1}"; 3371 return "vmovsd\t{%d1, %0|%0, %d1}";
3481 return "%vmovsd\t{%1, %0|%0, %1}"; 3372 return "%vmovsd\t{%1, %0|%0, %1}";
3482 3373
3483 case MODE_V4SF: 3374 case MODE_V4SF:
3484 return "%vmovaps\t{%1, %0|%0, %1}"; 3375 return "%vmovaps\t{%1, %0|%0, %1}";
3485 case MODE_V8DF: 3376 case MODE_V8DF:
3510 } 3401 }
3511 } 3402 }
3512 [(set (attr "isa") 3403 [(set (attr "isa")
3513 (cond [(eq_attr "alternative" "3,4,5,6,7,22,23") 3404 (cond [(eq_attr "alternative" "3,4,5,6,7,22,23")
3514 (const_string "nox64") 3405 (const_string "nox64")
3515 (eq_attr "alternative" "8,9,10,11,20,21,24,25") 3406 (eq_attr "alternative" "8,9,10,11,24,25")
3516 (const_string "x64") 3407 (const_string "x64")
3517 (eq_attr "alternative" "12,13,14,15") 3408 (eq_attr "alternative" "12,13,14,15")
3518 (const_string "sse2") 3409 (const_string "sse2")
3410 (eq_attr "alternative" "20,21")
3411 (const_string "x64_sse2")
3519 ] 3412 ]
3520 (const_string "*"))) 3413 (const_string "*")))
3521 (set (attr "type") 3414 (set (attr "type")
3522 (cond [(eq_attr "alternative" "0,1,2") 3415 (cond [(eq_attr "alternative" "0,1,2")
3523 (const_string "fmov") 3416 (const_string "fmov")
3614 (cond [(eq_attr "alternative" "3,4") 3507 (cond [(eq_attr "alternative" "3,4")
3615 (symbol_ref "false")] 3508 (symbol_ref "false")]
3616 (symbol_ref "true"))) 3509 (symbol_ref "true")))
3617 (set (attr "preferred_for_speed") 3510 (set (attr "preferred_for_speed")
3618 (cond [(eq_attr "alternative" "3,4") 3511 (cond [(eq_attr "alternative" "3,4")
3619 (symbol_ref "TARGET_INTEGER_DFMODE_MOVES")] 3512 (symbol_ref "TARGET_INTEGER_DFMODE_MOVES")
3513 (eq_attr "alternative" "20")
3514 (symbol_ref "TARGET_INTER_UNIT_MOVES_FROM_VEC")
3515 (eq_attr "alternative" "21")
3516 (symbol_ref "TARGET_INTER_UNIT_MOVES_TO_VEC")
3517 ]
3620 (symbol_ref "true"))) 3518 (symbol_ref "true")))
3621 (set (attr "enabled") 3519 (set (attr "enabled")
3622 (cond [(eq_attr "alternative" "22,23,24,25") 3520 (cond [(eq_attr "alternative" "22,23,24,25")
3623 (if_then_else 3521 (if_then_else
3624 (match_test "TARGET_HARD_DF_REGS") 3522 (match_test "TARGET_HARD_DF_REGS")
3636 [(const_int 0)] 3534 [(const_int 0)]
3637 "ix86_split_long_move (operands); DONE;") 3535 "ix86_split_long_move (operands); DONE;")
3638 3536
3639 (define_insn "*movsf_internal" 3537 (define_insn "*movsf_internal"
3640 [(set (match_operand:SF 0 "nonimmediate_operand" 3538 [(set (match_operand:SF 0 "nonimmediate_operand"
3641 "=Yf*f,m ,Yf*f,?r ,?m,v,v,v,m,?r,?Yi,!*y,!*y,!m,!r ,!*Ym,r ,m") 3539 "=Yf*f,m ,Yf*f,?r ,?m,v,v,v,m,?r,?v,!*y,!*y,!m,!r,!*y,r ,m")
3642 (match_operand:SF 1 "general_operand" 3540 (match_operand:SF 1 "general_operand"
3643 "Yf*fm,Yf*f,G ,rmF,rF,C,v,m,v,Yj,r ,*y ,m ,*y,*Yn,r ,rmF,rF"))] 3541 "Yf*fm,Yf*f,G ,rmF,rF,C,v,m,v,v ,r ,*y ,m ,*y,*y,r ,rmF,rF"))]
3644 "!(MEM_P (operands[0]) && MEM_P (operands[1])) 3542 "!(MEM_P (operands[0]) && MEM_P (operands[1]))
3645 && (lra_in_progress || reload_completed 3543 && (lra_in_progress || reload_completed
3646 || !CONST_DOUBLE_P (operands[1]) 3544 || !CONST_DOUBLE_P (operands[1])
3647 || ((optimize_function_for_size_p (cfun) 3545 || ((optimize_function_for_size_p (cfun)
3648 || (ix86_cmodel == CM_LARGE || ix86_cmodel == CM_LARGE_PIC)) 3546 || (ix86_cmodel == CM_LARGE || ix86_cmodel == CM_LARGE_PIC))
3662 3560
3663 case TYPE_IMOV: 3561 case TYPE_IMOV:
3664 return "mov{l}\t{%1, %0|%0, %1}"; 3562 return "mov{l}\t{%1, %0|%0, %1}";
3665 3563
3666 case TYPE_SSELOG1: 3564 case TYPE_SSELOG1:
3667 return standard_sse_constant_opcode (insn, operands[1]); 3565 return standard_sse_constant_opcode (insn, operands);
3668 3566
3669 case TYPE_SSEMOV: 3567 case TYPE_SSEMOV:
3670 switch (get_attr_mode (insn)) 3568 switch (get_attr_mode (insn))
3671 { 3569 {
3672 case MODE_SF: 3570 case MODE_SF:
3673 if (TARGET_AVX && REG_P (operands[0]) && REG_P (operands[1])) 3571 if (TARGET_AVX && REG_P (operands[0]) && REG_P (operands[1]))
3674 return "vmovss\t{%1, %0, %0|%0, %0, %1}"; 3572 return "vmovss\t{%d1, %0|%0, %d1}";
3675 return "%vmovss\t{%1, %0|%0, %1}"; 3573 return "%vmovss\t{%1, %0|%0, %1}";
3676 3574
3677 case MODE_V16SF: 3575 case MODE_V16SF:
3678 return "vmovaps\t{%g1, %g0|%g0, %g1}"; 3576 return "vmovaps\t{%g1, %g0|%g0, %g1}";
3679 case MODE_V4SF: 3577 case MODE_V4SF:
3700 3598
3701 default: 3599 default:
3702 gcc_unreachable (); 3600 gcc_unreachable ();
3703 } 3601 }
3704 } 3602 }
3705 [(set (attr "type") 3603 [(set (attr "isa")
3604 (cond [(eq_attr "alternative" "14,15")
3605 (const_string "sse2")
3606 ]
3607 (const_string "*")))
3608 (set (attr "type")
3706 (cond [(eq_attr "alternative" "0,1,2") 3609 (cond [(eq_attr "alternative" "0,1,2")
3707 (const_string "fmov") 3610 (const_string "fmov")
3708 (eq_attr "alternative" "3,4,16,17") 3611 (eq_attr "alternative" "3,4,16,17")
3709 (const_string "imov") 3612 (const_string "imov")
3710 (eq_attr "alternative" "5") 3613 (eq_attr "alternative" "5")
3762 (const_string "V4SF") 3665 (const_string "V4SF")
3763 ] 3666 ]
3764 (const_string "SF")) 3667 (const_string "SF"))
3765 ] 3668 ]
3766 (const_string "SF"))) 3669 (const_string "SF")))
3670 (set (attr "preferred_for_speed")
3671 (cond [(eq_attr "alternative" "9,14")
3672 (symbol_ref "TARGET_INTER_UNIT_MOVES_FROM_VEC")
3673 (eq_attr "alternative" "10,15")
3674 (symbol_ref "TARGET_INTER_UNIT_MOVES_TO_VEC")
3675 ]
3676 (symbol_ref "true")))
3767 (set (attr "enabled") 3677 (set (attr "enabled")
3768 (cond [(eq_attr "alternative" "16,17") 3678 (cond [(eq_attr "alternative" "16,17")
3769 (if_then_else 3679 (if_then_else
3770 (match_test "TARGET_HARD_SF_REGS") 3680 (match_test "TARGET_HARD_SF_REGS")
3771 (symbol_ref "false") 3681 (symbol_ref "false")
3775 ] 3685 ]
3776 (const_string "*")))]) 3686 (const_string "*")))])
3777 3687
3778 (define_split 3688 (define_split
3779 [(set (match_operand 0 "any_fp_register_operand") 3689 [(set (match_operand 0 "any_fp_register_operand")
3780 (match_operand 1 "nonimmediate_operand"))] 3690 (match_operand 1 "memory_operand"))]
3781 "reload_completed 3691 "reload_completed
3782 && (GET_MODE (operands[0]) == TFmode 3692 && (GET_MODE (operands[0]) == TFmode
3783 || GET_MODE (operands[0]) == XFmode 3693 || GET_MODE (operands[0]) == XFmode
3784 || GET_MODE (operands[0]) == DFmode 3694 || GET_MODE (operands[0]) == DFmode
3785 || GET_MODE (operands[0]) == SFmode) 3695 || GET_MODE (operands[0]) == SFmode)
3787 [(set (match_dup 0) (match_dup 2))] 3697 [(set (match_dup 0) (match_dup 2))]
3788 "operands[2] = find_constant_src (curr_insn);") 3698 "operands[2] = find_constant_src (curr_insn);")
3789 3699
3790 (define_split 3700 (define_split
3791 [(set (match_operand 0 "any_fp_register_operand") 3701 [(set (match_operand 0 "any_fp_register_operand")
3792 (float_extend (match_operand 1 "nonimmediate_operand")))] 3702 (float_extend (match_operand 1 "memory_operand")))]
3793 "reload_completed 3703 "reload_completed
3794 && (GET_MODE (operands[0]) == TFmode 3704 && (GET_MODE (operands[0]) == TFmode
3795 || GET_MODE (operands[0]) == XFmode 3705 || GET_MODE (operands[0]) == XFmode
3796 || GET_MODE (operands[0]) == DFmode) 3706 || GET_MODE (operands[0]) == DFmode)
3797 && ix86_standard_x87sse_constant_load_p (insn, operands[0])" 3707 && ix86_standard_x87sse_constant_load_p (insn, operands[0])"
3813 operands[1] = CONST0_RTX (<MODE>mode); 3723 operands[1] = CONST0_RTX (<MODE>mode);
3814 else 3724 else
3815 operands[1] = CONST1_RTX (<MODE>mode); 3725 operands[1] = CONST1_RTX (<MODE>mode);
3816 }) 3726 })
3817 3727
3818 (define_insn "swapxf" 3728 (define_insn "*swapxf"
3819 [(set (match_operand:XF 0 "register_operand" "+f") 3729 [(set (match_operand:XF 0 "register_operand" "+f")
3820 (match_operand:XF 1 "register_operand" "+f")) 3730 (match_operand:XF 1 "register_operand" "+f"))
3821 (set (match_dup 1) 3731 (set (match_dup 1)
3822 (match_dup 0))] 3732 (match_dup 0))]
3823 "TARGET_80387" 3733 "TARGET_80387"
3827 else 3737 else
3828 return "fxch\t%0"; 3738 return "fxch\t%0";
3829 } 3739 }
3830 [(set_attr "type" "fxch") 3740 [(set_attr "type" "fxch")
3831 (set_attr "mode" "XF")]) 3741 (set_attr "mode" "XF")])
3832
3833 (define_insn "*swap<mode>"
3834 [(set (match_operand:MODEF 0 "fp_register_operand" "+f")
3835 (match_operand:MODEF 1 "fp_register_operand" "+f"))
3836 (set (match_dup 1)
3837 (match_dup 0))]
3838 "TARGET_80387 || reload_completed"
3839 {
3840 if (STACK_TOP_P (operands[0]))
3841 return "fxch\t%1";
3842 else
3843 return "fxch\t%0";
3844 }
3845 [(set_attr "type" "fxch")
3846 (set_attr "mode" "<MODE>")])
3847 3742
3743
3848 ;; Zero extension instructions 3744 ;; Zero extension instructions
3849 3745
3850 (define_expand "zero_extendsidi2" 3746 (define_expand "zero_extendsidi2"
3851 [(set (match_operand:DI 0 "nonimmediate_operand") 3747 [(set (match_operand:DI 0 "nonimmediate_operand")
3852 (zero_extend:DI (match_operand:SI 1 "nonimmediate_operand")))]) 3748 (zero_extend:DI (match_operand:SI 1 "nonimmediate_operand")))])
3853 3749
3854 (define_insn "*zero_extendsidi2" 3750 (define_insn "*zero_extendsidi2"
3855 [(set (match_operand:DI 0 "nonimmediate_operand" 3751 [(set (match_operand:DI 0 "nonimmediate_operand"
3856 "=r,?r,?o,r ,o,?*Ym,?!*y,?r ,?*Yi,*x,*x,*v,*r") 3752 "=r,?r,?o,r ,o,?*y,?!*y,$r,$v,$x,*x,*v,*r")
3857 (zero_extend:DI 3753 (zero_extend:DI
3858 (match_operand:SI 1 "x86_64_zext_operand" 3754 (match_operand:SI 1 "x86_64_zext_operand"
3859 "0 ,rm,r ,rmWz,0,r ,m ,*Yj,r ,m ,*x,*v,*k")))] 3755 "0 ,rm,r ,rmWz,0,r ,m ,v ,r ,m ,*x,*v,*k")))]
3860 "" 3756 ""
3861 { 3757 {
3862 switch (get_attr_type (insn)) 3758 switch (get_attr_type (insn))
3863 { 3759 {
3864 case TYPE_IMOVX: 3760 case TYPE_IMOVX:
3898 [(set (attr "isa") 3794 [(set (attr "isa")
3899 (cond [(eq_attr "alternative" "0,1,2") 3795 (cond [(eq_attr "alternative" "0,1,2")
3900 (const_string "nox64") 3796 (const_string "nox64")
3901 (eq_attr "alternative" "3") 3797 (eq_attr "alternative" "3")
3902 (const_string "x64") 3798 (const_string "x64")
3903 (eq_attr "alternative" "9") 3799 (eq_attr "alternative" "7,8,9")
3904 (const_string "sse2") 3800 (const_string "sse2")
3905 (eq_attr "alternative" "10") 3801 (eq_attr "alternative" "10")
3906 (const_string "sse4") 3802 (const_string "sse4")
3907 (eq_attr "alternative" "11") 3803 (eq_attr "alternative" "11")
3908 (const_string "avx512f") 3804 (const_string "avx512f")
3944 (match_test "TARGET_64BIT")) 3840 (match_test "TARGET_64BIT"))
3945 (const_string "TI") 3841 (const_string "TI")
3946 (eq_attr "alternative" "8,10,11") 3842 (eq_attr "alternative" "8,10,11")
3947 (const_string "TI") 3843 (const_string "TI")
3948 ] 3844 ]
3949 (const_string "SI")))]) 3845 (const_string "SI")))
3846 (set (attr "preferred_for_speed")
3847 (cond [(eq_attr "alternative" "7")
3848 (symbol_ref "TARGET_INTER_UNIT_MOVES_FROM_VEC")
3849 (eq_attr "alternative" "5,8")
3850 (symbol_ref "TARGET_INTER_UNIT_MOVES_TO_VEC")
3851 ]
3852 (symbol_ref "true")))])
3950 3853
3951 (define_split 3854 (define_split
3952 [(set (match_operand:DI 0 "memory_operand") 3855 [(set (match_operand:DI 0 "memory_operand")
3953 (zero_extend:DI (match_operand:SI 1 "memory_operand")))] 3856 (zero_extend:DI (match_operand:SI 1 "memory_operand")))]
3954 "reload_completed" 3857 "reload_completed"
3969 "!TARGET_64BIT && reload_completed 3872 "!TARGET_64BIT && reload_completed
3970 && !(MEM_P (operands[0]) && MEM_P (operands[1]))" 3873 && !(MEM_P (operands[0]) && MEM_P (operands[1]))"
3971 [(set (match_dup 3) (match_dup 1)) 3874 [(set (match_dup 3) (match_dup 1))
3972 (set (match_dup 4) (const_int 0))] 3875 (set (match_dup 4) (const_int 0))]
3973 "split_double_mode (DImode, &operands[0], 1, &operands[3], &operands[4]);") 3876 "split_double_mode (DImode, &operands[0], 1, &operands[3], &operands[4]);")
3974
3975 (define_peephole2
3976 [(set (match_operand:DI 0 "general_reg_operand")
3977 (zero_extend:DI (match_operand:SI 1 "nonimmediate_gr_operand")))
3978 (set (match_operand:DI 2 "sse_reg_operand") (match_dup 0))]
3979 "TARGET_64BIT && TARGET_SSE2 && TARGET_INTER_UNIT_MOVES_TO_VEC
3980 && peep2_reg_dead_p (2, operands[0])"
3981 [(set (match_dup 2)
3982 (zero_extend:DI (match_dup 1)))])
3983 3877
3984 (define_mode_attr kmov_isa 3878 (define_mode_attr kmov_isa
3985 [(QI "avx512dq") (HI "avx512f") (SI "avx512bw") (DI "avx512bw")]) 3879 [(QI "avx512dq") (HI "avx512f") (SI "avx512bw") (DI "avx512bw")])
3986 3880
3987 (define_insn "zero_extend<mode>di2" 3881 (define_insn "zero_extend<mode>di2"
4420 DONE; 4314 DONE;
4421 } 4315 }
4422 operands[1] = validize_mem (force_const_mem (SFmode, operands[1])); 4316 operands[1] = validize_mem (force_const_mem (SFmode, operands[1]));
4423 } 4317 }
4424 }) 4318 })
4319
4320 (define_insn "*extendsfdf2"
4321 [(set (match_operand:DF 0 "nonimm_ssenomem_operand" "=f,m,v")
4322 (float_extend:DF
4323 (match_operand:SF 1 "nonimmediate_operand" "fm,f,vm")))]
4324 "TARGET_80387 || (TARGET_SSE2 && TARGET_SSE_MATH)"
4325 {
4326 switch (which_alternative)
4327 {
4328 case 0:
4329 case 1:
4330 return output_387_reg_move (insn, operands);
4331
4332 case 2:
4333 return "%vcvtss2sd\t{%1, %d0|%d0, %1}";
4334
4335 default:
4336 gcc_unreachable ();
4337 }
4338 }
4339 [(set_attr "type" "fmov,fmov,ssecvt")
4340 (set_attr "prefix" "orig,orig,maybe_vex")
4341 (set_attr "mode" "SF,XF,DF")
4342 (set (attr "enabled")
4343 (if_then_else
4344 (match_test ("TARGET_SSE2 && TARGET_SSE_MATH"))
4345 (if_then_else
4346 (eq_attr "alternative" "0,1")
4347 (symbol_ref "TARGET_MIX_SSE_I387")
4348 (symbol_ref "true"))
4349 (if_then_else
4350 (eq_attr "alternative" "0,1")
4351 (symbol_ref "true")
4352 (symbol_ref "false"))))])
4425 4353
4426 /* For converting SF(xmm2) to DF(xmm1), use the following code instead of 4354 /* For converting SF(xmm2) to DF(xmm1), use the following code instead of
4427 cvtss2sd: 4355 cvtss2sd:
4428 unpcklps xmm2,xmm2 ; packed conversion might crash on signaling NaNs 4356 unpcklps xmm2,xmm2 ; packed conversion might crash on signaling NaNs
4429 cvtps2pd xmm2,xmm1 4357 cvtps2pd xmm2,xmm1
4488 && optimize_insn_for_speed_p ()" 4416 && optimize_insn_for_speed_p ()"
4489 [(set (match_dup 2) (match_dup 1)) 4417 [(set (match_dup 2) (match_dup 1))
4490 (set (match_dup 0) (float_extend:DF (match_dup 2)))] 4418 (set (match_dup 0) (float_extend:DF (match_dup 2)))]
4491 "operands[2] = lowpart_subreg (SFmode, operands[0], DFmode);") 4419 "operands[2] = lowpart_subreg (SFmode, operands[0], DFmode);")
4492 4420
4493 (define_insn "*extendsfdf2" 4421 ;; Break partial reg stall for cvtss2sd. This splitter should split
4494 [(set (match_operand:DF 0 "nonimm_ssenomem_operand" "=f,m,v") 4422 ;; late in the pass sequence (after register rename pass),
4423 ;; so allocated registers won't change anymore.
4424
4425 (define_split
4426 [(set (match_operand:DF 0 "sse_reg_operand")
4495 (float_extend:DF 4427 (float_extend:DF
4496 (match_operand:SF 1 "nonimmediate_operand" "fm,f,vm")))] 4428 (match_operand:SF 1 "nonimmediate_operand")))]
4497 "TARGET_80387 || (TARGET_SSE2 && TARGET_SSE_MATH)" 4429 "TARGET_SSE_PARTIAL_REG_DEPENDENCY && epilogue_completed
4498 { 4430 && optimize_function_for_speed_p (cfun)
4499 switch (which_alternative) 4431 && (!REG_P (operands[1])
4500 { 4432 || REGNO (operands[0]) != REGNO (operands[1]))
4501 case 0: 4433 && (!EXT_REX_SSE_REG_P (operands[0])
4502 case 1: 4434 || TARGET_AVX512VL)"
4503 return output_387_reg_move (insn, operands); 4435 [(set (match_dup 0)
4504 4436 (vec_merge:V2DF
4505 case 2: 4437 (vec_duplicate:V2DF
4506 return "%vcvtss2sd\t{%1, %d0|%d0, %1}"; 4438 (float_extend:DF
4507 4439 (match_dup 1)))
4508 default: 4440 (match_dup 0)
4509 gcc_unreachable (); 4441 (const_int 1)))]
4510 } 4442 {
4511 } 4443 operands[0] = lowpart_subreg (V2DFmode, operands[0], DFmode);
4512 [(set_attr "type" "fmov,fmov,ssecvt") 4444 emit_move_insn (operands[0], CONST0_RTX (V2DFmode));
4513 (set_attr "prefix" "orig,orig,maybe_vex") 4445 })
4514 (set_attr "mode" "SF,XF,DF")
4515 (set (attr "enabled")
4516 (if_then_else
4517 (match_test ("TARGET_SSE2 && TARGET_SSE_MATH"))
4518 (if_then_else
4519 (eq_attr "alternative" "0,1")
4520 (symbol_ref "TARGET_MIX_SSE_I387")
4521 (symbol_ref "true"))
4522 (if_then_else
4523 (eq_attr "alternative" "0,1")
4524 (symbol_ref "true")
4525 (symbol_ref "false"))))])
4526 4446
4527 (define_expand "extend<mode>xf2" 4447 (define_expand "extend<mode>xf2"
4528 [(set (match_operand:XF 0 "nonimmediate_operand") 4448 [(set (match_operand:XF 0 "nonimmediate_operand")
4529 (float_extend:XF (match_operand:MODEF 1 "general_operand")))] 4449 (float_extend:XF (match_operand:MODEF 1 "general_operand")))]
4530 "TARGET_80387" 4450 "TARGET_80387"
4559 ;; insn. So we pretend we can output to a reg in order to get better 4479 ;; insn. So we pretend we can output to a reg in order to get better
4560 ;; register preferencing, but we really use a stack slot. 4480 ;; register preferencing, but we really use a stack slot.
4561 4481
4562 ;; Conversion from DFmode to SFmode. 4482 ;; Conversion from DFmode to SFmode.
4563 4483
4564 (define_expand "truncdfsf2" 4484 (define_insn "truncdfsf2"
4565 [(set (match_operand:SF 0 "nonimmediate_operand") 4485 [(set (match_operand:SF 0 "nonimm_ssenomem_operand" "=m,f,v")
4566 (float_truncate:SF 4486 (float_truncate:SF
4567 (match_operand:DF 1 "nonimmediate_operand")))] 4487 (match_operand:DF 1 "register_ssemem_operand" "f,f,vm")))]
4568 "TARGET_80387 || (TARGET_SSE2 && TARGET_SSE_MATH)" 4488 "TARGET_80387 || (TARGET_SSE2 && TARGET_SSE_MATH)"
4569 { 4489 {
4570 if (TARGET_SSE2 && TARGET_SSE_MATH && !TARGET_MIX_SSE_I387) 4490 switch (which_alternative)
4571 ;
4572 else if (flag_unsafe_math_optimizations)
4573 ;
4574 else
4575 { 4491 {
4576 rtx temp = assign_386_stack_local (SFmode, SLOT_TEMP); 4492 case 0:
4577 emit_insn (gen_truncdfsf2_with_temp (operands[0], operands[1], temp)); 4493 case 1:
4578 DONE; 4494 return output_387_reg_move (insn, operands);
4495
4496 case 2:
4497 return "%vcvtsd2ss\t{%1, %d0|%d0, %1}";
4498
4499 default:
4500 gcc_unreachable ();
4579 } 4501 }
4580 }) 4502 }
4503 [(set_attr "type" "fmov,fmov,ssecvt")
4504 (set_attr "mode" "SF")
4505 (set (attr "enabled")
4506 (if_then_else
4507 (match_test ("TARGET_SSE2 && TARGET_SSE_MATH"))
4508 (cond [(eq_attr "alternative" "0")
4509 (symbol_ref "TARGET_MIX_SSE_I387")
4510 (eq_attr "alternative" "1")
4511 (symbol_ref "TARGET_MIX_SSE_I387
4512 && flag_unsafe_math_optimizations")
4513 ]
4514 (symbol_ref "true"))
4515 (cond [(eq_attr "alternative" "0")
4516 (symbol_ref "true")
4517 (eq_attr "alternative" "1")
4518 (symbol_ref "flag_unsafe_math_optimizations")
4519 ]
4520 (symbol_ref "false"))))])
4581 4521
4582 /* For converting DF(xmm2) to SF(xmm1), use the following code instead of 4522 /* For converting DF(xmm2) to SF(xmm1), use the following code instead of
4583 cvtsd2ss: 4523 cvtsd2ss:
4584 unpcklpd xmm2,xmm2 ; packed conversion might crash on signaling NaNs 4524 unpcklpd xmm2,xmm2 ; packed conversion might crash on signaling NaNs
4585 cvtpd2ps xmm2,xmm1 4525 cvtpd2ps xmm2,xmm1
4586 We do the conversion post reload to avoid producing of 128bit spills 4526 We do the conversion post reload to avoid producing of 128bit spills
4587 that might lead to ICE on 32bit target. The sequence unlikely combine 4527 that might lead to ICE on 32bit target. The sequence unlikely combine
4588 anyway. */ 4528 anyway. */
4589 (define_split 4529 (define_split
4590 [(set (match_operand:SF 0 "sse_reg_operand") 4530 [(set (match_operand:SF 0 "sse_reg_operand")
4591 (float_truncate:SF 4531 (float_truncate:SF
4592 (match_operand:DF 1 "nonimmediate_operand")))] 4532 (match_operand:DF 1 "nonimmediate_operand")))]
4593 "TARGET_USE_VECTOR_FP_CONVERTS 4533 "TARGET_USE_VECTOR_FP_CONVERTS
4594 && optimize_insn_for_speed_p () 4534 && optimize_insn_for_speed_p ()
4595 && reload_completed 4535 && reload_completed
4596 && (!EXT_REX_SSE_REG_P (operands[0]) 4536 && (!EXT_REX_SSE_REG_P (operands[0])
4623 else 4563 else
4624 emit_insn (gen_vec_concatv2df (operands[4], operands[1], 4564 emit_insn (gen_vec_concatv2df (operands[4], operands[1],
4625 CONST0_RTX (DFmode))); 4565 CONST0_RTX (DFmode)));
4626 }) 4566 })
4627 4567
4628 ;; It's more profitable to split and then extend in the same register. 4568 ;; It's more profitable to split and then truncate in the same register.
4629 (define_peephole2 4569 (define_peephole2
4630 [(set (match_operand:SF 0 "sse_reg_operand") 4570 [(set (match_operand:SF 0 "sse_reg_operand")
4631 (float_truncate:SF 4571 (float_truncate:SF
4632 (match_operand:DF 1 "memory_operand")))] 4572 (match_operand:DF 1 "memory_operand")))]
4633 "TARGET_SPLIT_MEM_OPND_FOR_FP_CONVERTS 4573 "TARGET_SPLIT_MEM_OPND_FOR_FP_CONVERTS
4634 && optimize_insn_for_speed_p ()" 4574 && optimize_insn_for_speed_p ()"
4635 [(set (match_dup 2) (match_dup 1)) 4575 [(set (match_dup 2) (match_dup 1))
4636 (set (match_dup 0) (float_truncate:SF (match_dup 2)))] 4576 (set (match_dup 0) (float_truncate:SF (match_dup 2)))]
4637 "operands[2] = lowpart_subreg (DFmode, operands[0], SFmode);") 4577 "operands[2] = lowpart_subreg (DFmode, operands[0], SFmode);")
4638 4578
4639 (define_expand "truncdfsf2_with_temp" 4579 ;; Break partial reg stall for cvtsd2ss. This splitter should split
4640 [(parallel [(set (match_operand:SF 0) 4580 ;; late in the pass sequence (after register rename pass),
4641 (float_truncate:SF (match_operand:DF 1))) 4581 ;; so allocated registers won't change anymore.
4642 (clobber (match_operand:SF 2))])]) 4582
4643 4583 (define_split
4644 ;; SSE alternative doesn't depend on flag_unsafe_math_optimizations, 4584 [(set (match_operand:SF 0 "sse_reg_operand")
4645 ;; because nothing we do there is unsafe.
4646 (define_insn "*truncdfsf_fast_mixed"
4647 [(set (match_operand:SF 0 "nonimmediate_operand" "=fm,v")
4648 (float_truncate:SF 4585 (float_truncate:SF
4649 (match_operand:DF 1 "nonimmediate_operand" "f ,vm")))] 4586 (match_operand:DF 1 "nonimmediate_operand")))]
4650 "TARGET_SSE2 && TARGET_SSE_MATH" 4587 "TARGET_SSE_PARTIAL_REG_DEPENDENCY && epilogue_completed
4651 { 4588 && optimize_function_for_speed_p (cfun)
4652 switch (which_alternative) 4589 && (!REG_P (operands[1])
4653 { 4590 || REGNO (operands[0]) != REGNO (operands[1]))
4654 case 0: 4591 && (!EXT_REX_SSE_REG_P (operands[0])
4655 return output_387_reg_move (insn, operands); 4592 || TARGET_AVX512VL)"
4656 case 1: 4593 [(set (match_dup 0)
4657 return "%vcvtsd2ss\t{%1, %d0|%d0, %1}"; 4594 (vec_merge:V4SF
4658 default: 4595 (vec_duplicate:V4SF
4659 gcc_unreachable (); 4596 (float_truncate:SF
4660 } 4597 (match_dup 1)))
4661 } 4598 (match_dup 0)
4662 [(set_attr "type" "fmov,ssecvt") 4599 (const_int 1)))]
4663 (set_attr "prefix" "orig,maybe_vex") 4600 {
4664 (set_attr "mode" "SF") 4601 operands[0] = lowpart_subreg (V4SFmode, operands[0], SFmode);
4665 (set (attr "enabled") 4602 emit_move_insn (operands[0], CONST0_RTX (V4SFmode));
4666 (cond [(eq_attr "alternative" "0") 4603 })
4667 (symbol_ref "TARGET_MIX_SSE_I387
4668 && flag_unsafe_math_optimizations")
4669 ]
4670 (symbol_ref "true")))])
4671
4672 (define_insn "*truncdfsf_fast_i387"
4673 [(set (match_operand:SF 0 "nonimmediate_operand" "=fm")
4674 (float_truncate:SF
4675 (match_operand:DF 1 "nonimmediate_operand" "f")))]
4676 "TARGET_80387 && flag_unsafe_math_optimizations"
4677 "* return output_387_reg_move (insn, operands);"
4678 [(set_attr "type" "fmov")
4679 (set_attr "mode" "SF")])
4680
4681 (define_insn "*truncdfsf_mixed"
4682 [(set (match_operand:SF 0 "nonimmediate_operand" "=m,v ,?f,?v,?*r")
4683 (float_truncate:SF
4684 (match_operand:DF 1 "nonimmediate_operand" "f ,vm,f ,f ,f")))
4685 (clobber (match_operand:SF 2 "memory_operand" "=X,X ,m ,m ,m"))]
4686 "TARGET_MIX_SSE_I387"
4687 {
4688 switch (which_alternative)
4689 {
4690 case 0:
4691 return output_387_reg_move (insn, operands);
4692 case 1:
4693 return "%vcvtsd2ss\t{%1, %d0|%d0, %1}";
4694
4695 default:
4696 return "#";
4697 }
4698 }
4699 [(set_attr "isa" "*,sse2,*,*,*")
4700 (set_attr "type" "fmov,ssecvt,multi,multi,multi")
4701 (set_attr "unit" "*,*,i387,i387,i387")
4702 (set_attr "prefix" "orig,maybe_vex,orig,orig,orig")
4703 (set_attr "mode" "SF")])
4704
4705 (define_insn "*truncdfsf_i387"
4706 [(set (match_operand:SF 0 "nonimmediate_operand" "=m,?f,?v,?*r")
4707 (float_truncate:SF
4708 (match_operand:DF 1 "nonimmediate_operand" "f ,f ,f ,f")))
4709 (clobber (match_operand:SF 2 "memory_operand" "=X,m ,m ,m"))]
4710 "TARGET_80387"
4711 {
4712 switch (which_alternative)
4713 {
4714 case 0:
4715 return output_387_reg_move (insn, operands);
4716
4717 default:
4718 return "#";
4719 }
4720 }
4721 [(set_attr "type" "fmov,multi,multi,multi")
4722 (set_attr "unit" "*,i387,i387,i387")
4723 (set_attr "mode" "SF")])
4724
4725 (define_insn "*truncdfsf2_i387_1"
4726 [(set (match_operand:SF 0 "memory_operand" "=m")
4727 (float_truncate:SF
4728 (match_operand:DF 1 "register_operand" "f")))]
4729 "TARGET_80387
4730 && !(TARGET_SSE2 && TARGET_SSE_MATH)
4731 && !TARGET_MIX_SSE_I387"
4732 "* return output_387_reg_move (insn, operands);"
4733 [(set_attr "type" "fmov")
4734 (set_attr "mode" "SF")])
4735
4736 (define_split
4737 [(set (match_operand:SF 0 "register_operand")
4738 (float_truncate:SF
4739 (match_operand:DF 1 "fp_register_operand")))
4740 (clobber (match_operand 2))]
4741 "reload_completed"
4742 [(set (match_dup 2) (match_dup 1))
4743 (set (match_dup 0) (match_dup 2))]
4744 "operands[1] = gen_rtx_REG (SFmode, REGNO (operands[1]));")
4745 4604
4746 ;; Conversion from XFmode to {SF,DF}mode 4605 ;; Conversion from XFmode to {SF,DF}mode
4747 4606
4748 (define_expand "truncxf<mode>2" 4607 (define_insn "truncxf<mode>2"
4749 [(parallel [(set (match_operand:MODEF 0 "nonimmediate_operand") 4608 [(set (match_operand:MODEF 0 "nonimmediate_operand" "=m,f")
4750 (float_truncate:MODEF
4751 (match_operand:XF 1 "register_operand")))
4752 (clobber (match_dup 2))])]
4753 "TARGET_80387"
4754 {
4755 if (flag_unsafe_math_optimizations)
4756 {
4757 rtx reg = REG_P (operands[0]) ? operands[0] : gen_reg_rtx (<MODE>mode);
4758 emit_insn (gen_truncxf<mode>2_i387_noop (reg, operands[1]));
4759 if (reg != operands[0])
4760 emit_move_insn (operands[0], reg);
4761 DONE;
4762 }
4763 else
4764 operands[2] = assign_386_stack_local (<MODE>mode, SLOT_TEMP);
4765 })
4766
4767 (define_insn "*truncxfsf2_mixed"
4768 [(set (match_operand:SF 0 "nonimmediate_operand" "=m,?f,?v,?*r")
4769 (float_truncate:SF
4770 (match_operand:XF 1 "register_operand" "f ,f ,f ,f")))
4771 (clobber (match_operand:SF 2 "memory_operand" "=X,m ,m ,m"))]
4772 "TARGET_80387"
4773 {
4774 gcc_assert (!which_alternative);
4775 return output_387_reg_move (insn, operands);
4776 }
4777 [(set_attr "type" "fmov,multi,multi,multi")
4778 (set_attr "unit" "*,i387,i387,i387")
4779 (set_attr "mode" "SF")])
4780
4781 (define_insn "*truncxfdf2_mixed"
4782 [(set (match_operand:DF 0 "nonimmediate_operand" "=m,?f,?v,?*r")
4783 (float_truncate:DF
4784 (match_operand:XF 1 "register_operand" "f ,f ,f ,f")))
4785 (clobber (match_operand:DF 2 "memory_operand" "=X,m ,m ,m"))]
4786 "TARGET_80387"
4787 {
4788 gcc_assert (!which_alternative);
4789 return output_387_reg_move (insn, operands);
4790 }
4791 [(set_attr "isa" "*,*,sse2,*")
4792 (set_attr "type" "fmov,multi,multi,multi")
4793 (set_attr "unit" "*,i387,i387,i387")
4794 (set_attr "mode" "DF")])
4795
4796 (define_insn "truncxf<mode>2_i387_noop"
4797 [(set (match_operand:MODEF 0 "register_operand" "=f")
4798 (float_truncate:MODEF 4609 (float_truncate:MODEF
4799 (match_operand:XF 1 "register_operand" "f")))] 4610 (match_operand:XF 1 "register_operand" "f,f")))]
4800 "TARGET_80387 && flag_unsafe_math_optimizations"
4801 "* return output_387_reg_move (insn, operands);"
4802 [(set_attr "type" "fmov")
4803 (set_attr "mode" "<MODE>")])
4804
4805 (define_insn "*truncxf<mode>2_i387"
4806 [(set (match_operand:MODEF 0 "memory_operand" "=m")
4807 (float_truncate:MODEF
4808 (match_operand:XF 1 "register_operand" "f")))]
4809 "TARGET_80387" 4611 "TARGET_80387"
4810 "* return output_387_reg_move (insn, operands);" 4612 "* return output_387_reg_move (insn, operands);"
4811 [(set_attr "type" "fmov") 4613 [(set_attr "type" "fmov")
4812 (set_attr "mode" "<MODE>")]) 4614 (set_attr "mode" "<MODE>")
4813 4615 (set (attr "enabled")
4814 (define_split 4616 (cond [(eq_attr "alternative" "1")
4815 [(set (match_operand:MODEF 0 "register_operand") 4617 (symbol_ref "flag_unsafe_math_optimizations")
4816 (float_truncate:MODEF 4618 ]
4817 (match_operand:XF 1 "register_operand"))) 4619 (symbol_ref "true")))])
4818 (clobber (match_operand:MODEF 2 "memory_operand"))]
4819 "TARGET_80387 && reload_completed"
4820 [(set (match_dup 2) (float_truncate:MODEF (match_dup 1)))
4821 (set (match_dup 0) (match_dup 2))])
4822
4823 (define_split
4824 [(set (match_operand:MODEF 0 "memory_operand")
4825 (float_truncate:MODEF
4826 (match_operand:XF 1 "register_operand")))
4827 (clobber (match_operand:MODEF 2 "memory_operand"))]
4828 "TARGET_80387"
4829 [(set (match_dup 0) (float_truncate:MODEF (match_dup 1)))])
4830 4620
4831 ;; Signed conversion to DImode. 4621 ;; Signed conversion to DImode.
4832 4622
4833 (define_expand "fix_truncxfdi2" 4623 (define_expand "fix_truncxfdi2"
4834 [(parallel [(set (match_operand:DI 0 "nonimmediate_operand") 4624 [(parallel [(set (match_operand:DI 0 "nonimmediate_operand")
4836 (clobber (reg:CC FLAGS_REG))])] 4626 (clobber (reg:CC FLAGS_REG))])]
4837 "TARGET_80387" 4627 "TARGET_80387"
4838 { 4628 {
4839 if (TARGET_FISTTP) 4629 if (TARGET_FISTTP)
4840 { 4630 {
4841 emit_insn (gen_fix_truncdi_fisttp_i387_1 (operands[0], operands[1])); 4631 emit_insn (gen_fix_truncdi_i387_fisttp (operands[0], operands[1]));
4842 DONE; 4632 DONE;
4843 } 4633 }
4844 }) 4634 })
4845 4635
4846 (define_expand "fix_trunc<mode>di2" 4636 (define_expand "fix_trunc<mode>di2"
4850 "TARGET_80387 || (TARGET_64BIT && SSE_FLOAT_MODE_P (<MODE>mode))" 4640 "TARGET_80387 || (TARGET_64BIT && SSE_FLOAT_MODE_P (<MODE>mode))"
4851 { 4641 {
4852 if (TARGET_FISTTP 4642 if (TARGET_FISTTP
4853 && !(TARGET_64BIT && SSE_FLOAT_MODE_P (<MODE>mode) && TARGET_SSE_MATH)) 4643 && !(TARGET_64BIT && SSE_FLOAT_MODE_P (<MODE>mode) && TARGET_SSE_MATH))
4854 { 4644 {
4855 emit_insn (gen_fix_truncdi_fisttp_i387_1 (operands[0], operands[1])); 4645 emit_insn (gen_fix_truncdi_i387_fisttp (operands[0], operands[1]));
4856 DONE; 4646 DONE;
4857 } 4647 }
4858 if (TARGET_64BIT && SSE_FLOAT_MODE_P (<MODE>mode)) 4648 if (TARGET_64BIT && SSE_FLOAT_MODE_P (<MODE>mode))
4859 { 4649 {
4860 rtx out = REG_P (operands[0]) ? operands[0] : gen_reg_rtx (DImode); 4650 rtx out = REG_P (operands[0]) ? operands[0] : gen_reg_rtx (DImode);
4873 (clobber (reg:CC FLAGS_REG))])] 4663 (clobber (reg:CC FLAGS_REG))])]
4874 "TARGET_80387" 4664 "TARGET_80387"
4875 { 4665 {
4876 if (TARGET_FISTTP) 4666 if (TARGET_FISTTP)
4877 { 4667 {
4878 emit_insn (gen_fix_truncsi_fisttp_i387_1 (operands[0], operands[1])); 4668 emit_insn (gen_fix_truncsi_i387_fisttp (operands[0], operands[1]));
4879 DONE; 4669 DONE;
4880 } 4670 }
4881 }) 4671 })
4882 4672
4883 (define_expand "fix_trunc<mode>si2" 4673 (define_expand "fix_trunc<mode>si2"
4887 "TARGET_80387 || SSE_FLOAT_MODE_P (<MODE>mode)" 4677 "TARGET_80387 || SSE_FLOAT_MODE_P (<MODE>mode)"
4888 { 4678 {
4889 if (TARGET_FISTTP 4679 if (TARGET_FISTTP
4890 && !(SSE_FLOAT_MODE_P (<MODE>mode) && TARGET_SSE_MATH)) 4680 && !(SSE_FLOAT_MODE_P (<MODE>mode) && TARGET_SSE_MATH))
4891 { 4681 {
4892 emit_insn (gen_fix_truncsi_fisttp_i387_1 (operands[0], operands[1])); 4682 emit_insn (gen_fix_truncsi_i387_fisttp (operands[0], operands[1]));
4893 DONE; 4683 DONE;
4894 } 4684 }
4895 if (SSE_FLOAT_MODE_P (<MODE>mode)) 4685 if (SSE_FLOAT_MODE_P (<MODE>mode))
4896 { 4686 {
4897 rtx out = REG_P (operands[0]) ? operands[0] : gen_reg_rtx (SImode); 4687 rtx out = REG_P (operands[0]) ? operands[0] : gen_reg_rtx (SImode);
4911 "TARGET_80387 4701 "TARGET_80387
4912 && !(SSE_FLOAT_MODE_P (<MODE>mode) && (!TARGET_FISTTP || TARGET_SSE_MATH))" 4702 && !(SSE_FLOAT_MODE_P (<MODE>mode) && (!TARGET_FISTTP || TARGET_SSE_MATH))"
4913 { 4703 {
4914 if (TARGET_FISTTP) 4704 if (TARGET_FISTTP)
4915 { 4705 {
4916 emit_insn (gen_fix_trunchi_fisttp_i387_1 (operands[0], operands[1])); 4706 emit_insn (gen_fix_trunchi_i387_fisttp (operands[0], operands[1]));
4917 DONE; 4707 DONE;
4918 } 4708 }
4919 }) 4709 })
4710
4711 ;; Unsigned conversion to DImode
4712
4713 (define_insn "fixuns_trunc<mode>di2"
4714 [(set (match_operand:DI 0 "register_operand" "=r")
4715 (unsigned_fix:DI
4716 (match_operand:MODEF 1 "nonimmediate_operand" "vm")))]
4717 "TARGET_64BIT && TARGET_AVX512F && TARGET_SSE_MATH"
4718 "vcvtt<ssemodesuffix>2usi\t{%1, %0|%0, %1}"
4719 [(set_attr "type" "sseicvt")
4720 (set_attr "prefix" "evex")
4721 (set_attr "mode" "DI")])
4920 4722
4921 ;; Unsigned conversion to SImode. 4723 ;; Unsigned conversion to SImode.
4922 4724
4923 (define_expand "fixuns_trunc<mode>si2" 4725 (define_expand "fixuns_trunc<mode>si2"
4924 [(parallel 4726 [(parallel
4926 (unsigned_fix:SI 4728 (unsigned_fix:SI
4927 (match_operand:MODEF 1 "nonimmediate_operand"))) 4729 (match_operand:MODEF 1 "nonimmediate_operand")))
4928 (use (match_dup 2)) 4730 (use (match_dup 2))
4929 (clobber (match_scratch:<ssevecmode> 3)) 4731 (clobber (match_scratch:<ssevecmode> 3))
4930 (clobber (match_scratch:<ssevecmode> 4))])] 4732 (clobber (match_scratch:<ssevecmode> 4))])]
4931 "!TARGET_64BIT && TARGET_SSE2 && TARGET_SSE_MATH" 4733 "(!TARGET_64BIT || TARGET_AVX512F) && TARGET_SSE2 && TARGET_SSE_MATH"
4932 { 4734 {
4933 machine_mode mode = <MODE>mode; 4735 machine_mode mode = <MODE>mode;
4934 machine_mode vecmode = <ssevecmode>mode; 4736 machine_mode vecmode = <ssevecmode>mode;
4935 REAL_VALUE_TYPE TWO31r; 4737 REAL_VALUE_TYPE TWO31r;
4936 rtx two31; 4738 rtx two31;
4937 4739
4740 if (TARGET_AVX512F)
4741 {
4742 emit_insn (gen_fixuns_trunc<mode>si2_avx512f (operands[0], operands[1]));
4743 DONE;
4744 }
4745
4938 if (optimize_insn_for_size_p ()) 4746 if (optimize_insn_for_size_p ())
4939 FAIL; 4747 FAIL;
4940 4748
4941 real_ldexp (&TWO31r, &dconst1, 31); 4749 real_ldexp (&TWO31r, &dconst1, 31);
4942 two31 = const_double_from_real_value (TWO31r, mode); 4750 two31 = const_double_from_real_value (TWO31r, mode);
4943 two31 = ix86_build_const_vector (vecmode, true, two31); 4751 two31 = ix86_build_const_vector (vecmode, true, two31);
4944 operands[2] = force_reg (vecmode, two31); 4752 operands[2] = force_reg (vecmode, two31);
4945 }) 4753 })
4754
4755 (define_insn "fixuns_trunc<mode>si2_avx512f"
4756 [(set (match_operand:SI 0 "register_operand" "=r")
4757 (unsigned_fix:SI
4758 (match_operand:MODEF 1 "nonimmediate_operand" "vm")))]
4759 "TARGET_AVX512F && TARGET_SSE_MATH"
4760 "vcvtt<ssemodesuffix>2usi\t{%1, %0|%0, %1}"
4761 [(set_attr "type" "sseicvt")
4762 (set_attr "prefix" "evex")
4763 (set_attr "mode" "SI")])
4764
4765 (define_insn "*fixuns_trunc<mode>si2_avx512f_zext"
4766 [(set (match_operand:DI 0 "register_operand" "=r")
4767 (zero_extend:DI
4768 (unsigned_fix:SI
4769 (match_operand:MODEF 1 "nonimmediate_operand" "vm"))))]
4770 "TARGET_64BIT && TARGET_AVX512F && TARGET_SSE_MATH"
4771 "vcvtt<ssemodesuffix>2usi\t{%1, %k0|%k0, %1}"
4772 [(set_attr "type" "sseicvt")
4773 (set_attr "prefix" "evex")
4774 (set_attr "mode" "SI")])
4946 4775
4947 (define_insn_and_split "*fixuns_trunc<mode>_1" 4776 (define_insn_and_split "*fixuns_trunc<mode>_1"
4948 [(set (match_operand:SI 0 "register_operand" "=&x,&x") 4777 [(set (match_operand:SI 0 "register_operand" "=&x,&x")
4949 (unsigned_fix:SI 4778 (unsigned_fix:SI
4950 (match_operand:MODEF 3 "nonimmediate_operand" "xm,xm"))) 4779 (match_operand:MODEF 3 "nonimmediate_operand" "xm,xm")))
5001 && SSE_FLOAT_MODE_P (<MODEF:MODE>mode) 4830 && SSE_FLOAT_MODE_P (<MODEF:MODE>mode)
5002 && optimize_insn_for_speed_p ()" 4831 && optimize_insn_for_speed_p ()"
5003 [(set (match_dup 2) (match_dup 1)) 4832 [(set (match_dup 2) (match_dup 1))
5004 (set (match_dup 0) (fix:SWI48 (match_dup 2)))]) 4833 (set (match_dup 0) (fix:SWI48 (match_dup 2)))])
5005 4834
5006 (define_insn_and_split "fix_trunc<mode>_fisttp_i387_1"
5007 [(set (match_operand:SWI248x 0 "nonimmediate_operand")
5008 (fix:SWI248x (match_operand 1 "register_operand")))]
5009 "X87_FLOAT_MODE_P (GET_MODE (operands[1]))
5010 && TARGET_FISTTP
5011 && !((SSE_FLOAT_MODE_P (GET_MODE (operands[1]))
5012 && (TARGET_64BIT || <MODE>mode != DImode))
5013 && TARGET_SSE_MATH)
5014 && can_create_pseudo_p ()"
5015 "#"
5016 "&& 1"
5017 [(const_int 0)]
5018 {
5019 if (memory_operand (operands[0], VOIDmode))
5020 emit_insn (gen_fix_trunc<mode>_i387_fisttp (operands[0], operands[1]));
5021 else
5022 {
5023 operands[2] = assign_386_stack_local (<MODE>mode, SLOT_TEMP);
5024 emit_insn (gen_fix_trunc<mode>_i387_fisttp_with_temp (operands[0],
5025 operands[1],
5026 operands[2]));
5027 }
5028 DONE;
5029 }
5030 [(set_attr "type" "fisttp")
5031 (set_attr "mode" "<MODE>")])
5032
5033 (define_insn "fix_trunc<mode>_i387_fisttp" 4835 (define_insn "fix_trunc<mode>_i387_fisttp"
5034 [(set (match_operand:SWI248x 0 "memory_operand" "=m") 4836 [(set (match_operand:SWI248x 0 "nonimmediate_operand" "=m")
5035 (fix:SWI248x (match_operand 1 "register_operand" "f"))) 4837 (fix:SWI248x (match_operand 1 "register_operand" "f")))
5036 (clobber (match_scratch:XF 2 "=&1f"))] 4838 (clobber (match_scratch:XF 2 "=&f"))]
5037 "X87_FLOAT_MODE_P (GET_MODE (operands[1])) 4839 "X87_FLOAT_MODE_P (GET_MODE (operands[1]))
5038 && TARGET_FISTTP 4840 && TARGET_FISTTP
5039 && !((SSE_FLOAT_MODE_P (GET_MODE (operands[1])) 4841 && !((SSE_FLOAT_MODE_P (GET_MODE (operands[1]))
5040 && (TARGET_64BIT || <MODE>mode != DImode)) 4842 && (TARGET_64BIT || <MODE>mode != DImode))
5041 && TARGET_SSE_MATH)" 4843 && TARGET_SSE_MATH)"
5042 "* return output_fix_trunc (insn, operands, true);" 4844 "* return output_fix_trunc (insn, operands, true);"
5043 [(set_attr "type" "fisttp") 4845 [(set_attr "type" "fisttp")
5044 (set_attr "mode" "<MODE>")]) 4846 (set_attr "mode" "<MODE>")])
5045 4847
5046 (define_insn "fix_trunc<mode>_i387_fisttp_with_temp"
5047 [(set (match_operand:SWI248x 0 "nonimmediate_operand" "=m,?r")
5048 (fix:SWI248x (match_operand 1 "register_operand" "f,f")))
5049 (clobber (match_operand:SWI248x 2 "memory_operand" "=X,m"))
5050 (clobber (match_scratch:XF 3 "=&1f,&1f"))]
5051 "X87_FLOAT_MODE_P (GET_MODE (operands[1]))
5052 && TARGET_FISTTP
5053 && !((SSE_FLOAT_MODE_P (GET_MODE (operands[1]))
5054 && (TARGET_64BIT || <MODE>mode != DImode))
5055 && TARGET_SSE_MATH)"
5056 "#"
5057 [(set_attr "type" "fisttp")
5058 (set_attr "mode" "<MODE>")])
5059
5060 (define_split
5061 [(set (match_operand:SWI248x 0 "register_operand")
5062 (fix:SWI248x (match_operand 1 "register_operand")))
5063 (clobber (match_operand:SWI248x 2 "memory_operand"))
5064 (clobber (match_scratch 3))]
5065 "reload_completed"
5066 [(parallel [(set (match_dup 2) (fix:SWI248x (match_dup 1)))
5067 (clobber (match_dup 3))])
5068 (set (match_dup 0) (match_dup 2))])
5069
5070 (define_split
5071 [(set (match_operand:SWI248x 0 "memory_operand")
5072 (fix:SWI248x (match_operand 1 "register_operand")))
5073 (clobber (match_operand:SWI248x 2 "memory_operand"))
5074 (clobber (match_scratch 3))]
5075 "reload_completed"
5076 [(parallel [(set (match_dup 0) (fix:SWI248x (match_dup 1)))
5077 (clobber (match_dup 3))])])
5078
5079 ;; See the comments in i386.h near OPTIMIZE_MODE_SWITCHING for the description 4848 ;; See the comments in i386.h near OPTIMIZE_MODE_SWITCHING for the description
5080 ;; of the machinery. Please note the clobber of FLAGS_REG. In i387 control 4849 ;; of the machinery. Please note the clobber of FLAGS_REG. In i387 control
5081 ;; word calculation (inserted by LCM in mode switching pass) a FLAGS_REG 4850 ;; word calculation (inserted by LCM in mode switching pass) a FLAGS_REG
5082 ;; clobbering insns can be used. Look at emit_i387_cw_initialization () 4851 ;; clobbering insns can be used. Look at emit_i387_cw_initialization ()
5083 ;; function in i386.c. 4852 ;; function in i386.c.
5096 { 4865 {
5097 ix86_optimize_mode_switching[I387_TRUNC] = 1; 4866 ix86_optimize_mode_switching[I387_TRUNC] = 1;
5098 4867
5099 operands[2] = assign_386_stack_local (HImode, SLOT_CW_STORED); 4868 operands[2] = assign_386_stack_local (HImode, SLOT_CW_STORED);
5100 operands[3] = assign_386_stack_local (HImode, SLOT_CW_TRUNC); 4869 operands[3] = assign_386_stack_local (HImode, SLOT_CW_TRUNC);
5101 if (memory_operand (operands[0], VOIDmode)) 4870
5102 emit_insn (gen_fix_trunc<mode>_i387 (operands[0], operands[1], 4871 emit_insn (gen_fix_trunc<mode>_i387 (operands[0], operands[1],
5103 operands[2], operands[3])); 4872 operands[2], operands[3]));
5104 else
5105 {
5106 operands[4] = assign_386_stack_local (<MODE>mode, SLOT_TEMP);
5107 emit_insn (gen_fix_trunc<mode>_i387_with_temp (operands[0], operands[1],
5108 operands[2], operands[3],
5109 operands[4]));
5110 }
5111 DONE; 4873 DONE;
5112 } 4874 }
5113 [(set_attr "type" "fistp") 4875 [(set_attr "type" "fistp")
5114 (set_attr "i387_cw" "trunc") 4876 (set_attr "i387_cw" "trunc")
5115 (set_attr "mode" "<MODE>")]) 4877 (set_attr "mode" "<MODE>")])
5116 4878
5117 (define_insn "fix_truncdi_i387" 4879 (define_insn "fix_truncdi_i387"
5118 [(set (match_operand:DI 0 "memory_operand" "=m") 4880 [(set (match_operand:DI 0 "nonimmediate_operand" "=m")
5119 (fix:DI (match_operand 1 "register_operand" "f"))) 4881 (fix:DI (match_operand 1 "register_operand" "f")))
5120 (use (match_operand:HI 2 "memory_operand" "m")) 4882 (use (match_operand:HI 2 "memory_operand" "m"))
5121 (use (match_operand:HI 3 "memory_operand" "m")) 4883 (use (match_operand:HI 3 "memory_operand" "m"))
5122 (clobber (match_scratch:XF 4 "=&1f"))] 4884 (clobber (match_scratch:XF 4 "=&f"))]
5123 "X87_FLOAT_MODE_P (GET_MODE (operands[1])) 4885 "X87_FLOAT_MODE_P (GET_MODE (operands[1]))
5124 && !TARGET_FISTTP 4886 && !TARGET_FISTTP
5125 && !(TARGET_64BIT && SSE_FLOAT_MODE_P (GET_MODE (operands[1])))" 4887 && !(TARGET_64BIT && SSE_FLOAT_MODE_P (GET_MODE (operands[1])))"
5126 "* return output_fix_trunc (insn, operands, false);" 4888 "* return output_fix_trunc (insn, operands, false);"
5127 [(set_attr "type" "fistp") 4889 [(set_attr "type" "fistp")
5128 (set_attr "i387_cw" "trunc") 4890 (set_attr "i387_cw" "trunc")
5129 (set_attr "mode" "DI")]) 4891 (set_attr "mode" "DI")])
5130 4892
5131 (define_insn "fix_truncdi_i387_with_temp"
5132 [(set (match_operand:DI 0 "nonimmediate_operand" "=m,?r")
5133 (fix:DI (match_operand 1 "register_operand" "f,f")))
5134 (use (match_operand:HI 2 "memory_operand" "m,m"))
5135 (use (match_operand:HI 3 "memory_operand" "m,m"))
5136 (clobber (match_operand:DI 4 "memory_operand" "=X,m"))
5137 (clobber (match_scratch:XF 5 "=&1f,&1f"))]
5138 "X87_FLOAT_MODE_P (GET_MODE (operands[1]))
5139 && !TARGET_FISTTP
5140 && !(TARGET_64BIT && SSE_FLOAT_MODE_P (GET_MODE (operands[1])))"
5141 "#"
5142 [(set_attr "type" "fistp")
5143 (set_attr "i387_cw" "trunc")
5144 (set_attr "mode" "DI")])
5145
5146 (define_split
5147 [(set (match_operand:DI 0 "register_operand")
5148 (fix:DI (match_operand 1 "register_operand")))
5149 (use (match_operand:HI 2 "memory_operand"))
5150 (use (match_operand:HI 3 "memory_operand"))
5151 (clobber (match_operand:DI 4 "memory_operand"))
5152 (clobber (match_scratch 5))]
5153 "reload_completed"
5154 [(parallel [(set (match_dup 4) (fix:DI (match_dup 1)))
5155 (use (match_dup 2))
5156 (use (match_dup 3))
5157 (clobber (match_dup 5))])
5158 (set (match_dup 0) (match_dup 4))])
5159
5160 (define_split
5161 [(set (match_operand:DI 0 "memory_operand")
5162 (fix:DI (match_operand 1 "register_operand")))
5163 (use (match_operand:HI 2 "memory_operand"))
5164 (use (match_operand:HI 3 "memory_operand"))
5165 (clobber (match_operand:DI 4 "memory_operand"))
5166 (clobber (match_scratch 5))]
5167 "reload_completed"
5168 [(parallel [(set (match_dup 0) (fix:DI (match_dup 1)))
5169 (use (match_dup 2))
5170 (use (match_dup 3))
5171 (clobber (match_dup 5))])])
5172
5173 (define_insn "fix_trunc<mode>_i387" 4893 (define_insn "fix_trunc<mode>_i387"
5174 [(set (match_operand:SWI24 0 "memory_operand" "=m") 4894 [(set (match_operand:SWI24 0 "nonimmediate_operand" "=m")
5175 (fix:SWI24 (match_operand 1 "register_operand" "f"))) 4895 (fix:SWI24 (match_operand 1 "register_operand" "f")))
5176 (use (match_operand:HI 2 "memory_operand" "m")) 4896 (use (match_operand:HI 2 "memory_operand" "m"))
5177 (use (match_operand:HI 3 "memory_operand" "m"))] 4897 (use (match_operand:HI 3 "memory_operand" "m"))]
5178 "X87_FLOAT_MODE_P (GET_MODE (operands[1])) 4898 "X87_FLOAT_MODE_P (GET_MODE (operands[1]))
5179 && !TARGET_FISTTP 4899 && !TARGET_FISTTP
5181 "* return output_fix_trunc (insn, operands, false);" 4901 "* return output_fix_trunc (insn, operands, false);"
5182 [(set_attr "type" "fistp") 4902 [(set_attr "type" "fistp")
5183 (set_attr "i387_cw" "trunc") 4903 (set_attr "i387_cw" "trunc")
5184 (set_attr "mode" "<MODE>")]) 4904 (set_attr "mode" "<MODE>")])
5185 4905
5186 (define_insn "fix_trunc<mode>_i387_with_temp"
5187 [(set (match_operand:SWI24 0 "nonimmediate_operand" "=m,?r")
5188 (fix:SWI24 (match_operand 1 "register_operand" "f,f")))
5189 (use (match_operand:HI 2 "memory_operand" "m,m"))
5190 (use (match_operand:HI 3 "memory_operand" "m,m"))
5191 (clobber (match_operand:SWI24 4 "memory_operand" "=X,m"))]
5192 "X87_FLOAT_MODE_P (GET_MODE (operands[1]))
5193 && !TARGET_FISTTP
5194 && !SSE_FLOAT_MODE_P (GET_MODE (operands[1]))"
5195 "#"
5196 [(set_attr "type" "fistp")
5197 (set_attr "i387_cw" "trunc")
5198 (set_attr "mode" "<MODE>")])
5199
5200 (define_split
5201 [(set (match_operand:SWI24 0 "register_operand")
5202 (fix:SWI24 (match_operand 1 "register_operand")))
5203 (use (match_operand:HI 2 "memory_operand"))
5204 (use (match_operand:HI 3 "memory_operand"))
5205 (clobber (match_operand:SWI24 4 "memory_operand"))]
5206 "reload_completed"
5207 [(parallel [(set (match_dup 4) (fix:SWI24 (match_dup 1)))
5208 (use (match_dup 2))
5209 (use (match_dup 3))])
5210 (set (match_dup 0) (match_dup 4))])
5211
5212 (define_split
5213 [(set (match_operand:SWI24 0 "memory_operand")
5214 (fix:SWI24 (match_operand 1 "register_operand")))
5215 (use (match_operand:HI 2 "memory_operand"))
5216 (use (match_operand:HI 3 "memory_operand"))
5217 (clobber (match_operand:SWI24 4 "memory_operand"))]
5218 "reload_completed"
5219 [(parallel [(set (match_dup 0) (fix:SWI24 (match_dup 1)))
5220 (use (match_dup 2))
5221 (use (match_dup 3))])])
5222
5223 (define_insn "x86_fnstcw_1" 4906 (define_insn "x86_fnstcw_1"
5224 [(set (match_operand:HI 0 "memory_operand" "=m") 4907 [(set (match_operand:HI 0 "memory_operand" "=m")
5225 (unspec:HI [(reg:HI FPCR_REG)] UNSPEC_FSTCW))] 4908 (unspec:HI [(const_int 0)] UNSPEC_FSTCW))]
5226 "TARGET_80387" 4909 "TARGET_80387"
5227 "fnstcw\t%0" 4910 "fnstcw\t%0"
5228 [(set (attr "length") 4911 [(set (attr "length")
5229 (symbol_ref "ix86_attr_length_address_default (insn) + 2")) 4912 (symbol_ref "ix86_attr_length_address_default (insn) + 2"))
5230 (set_attr "mode" "HI") 4913 (set_attr "mode" "HI")
5231 (set_attr "unit" "i387") 4914 (set_attr "unit" "i387")
5232 (set_attr "bdver1_decode" "vector")])
5233
5234 (define_insn "x86_fldcw_1"
5235 [(set (reg:HI FPCR_REG)
5236 (unspec:HI [(match_operand:HI 0 "memory_operand" "m")] UNSPEC_FLDCW))]
5237 "TARGET_80387"
5238 "fldcw\t%0"
5239 [(set (attr "length")
5240 (symbol_ref "ix86_attr_length_address_default (insn) + 2"))
5241 (set_attr "mode" "HI")
5242 (set_attr "unit" "i387")
5243 (set_attr "athlon_decode" "vector")
5244 (set_attr "amdfam10_decode" "vector")
5245 (set_attr "bdver1_decode" "vector")]) 4915 (set_attr "bdver1_decode" "vector")])
5246 4916
5247 ;; Conversion between fixed point and floating point. 4917 ;; Conversion between fixed point and floating point.
5248 4918
5249 ;; Even though we only accept memory inputs, the backend _really_ 4919 ;; Even though we only accept memory inputs, the backend _really_
5270 [(set_attr "type" "fmov") 4940 [(set_attr "type" "fmov")
5271 (set_attr "mode" "XF") 4941 (set_attr "mode" "XF")
5272 (set_attr "znver1_decode" "double") 4942 (set_attr "znver1_decode" "double")
5273 (set_attr "fp_int_src" "true")]) 4943 (set_attr "fp_int_src" "true")])
5274 4944
5275 (define_expand "float<SWI48:mode><MODEF:mode>2" 4945 (define_expand "float<SWI48x:mode><MODEF:mode>2"
5276 [(set (match_operand:MODEF 0 "register_operand") 4946 [(set (match_operand:MODEF 0 "register_operand")
5277 (float:MODEF (match_operand:SWI48 1 "nonimmediate_operand")))] 4947 (float:MODEF (match_operand:SWI48x 1 "nonimmediate_operand")))]
5278 "TARGET_80387 || (SSE_FLOAT_MODE_P (<MODEF:MODE>mode) && TARGET_SSE_MATH)" 4948 "(TARGET_80387 && X87_ENABLE_FLOAT (<MODEF:MODE>mode, <SWI48x:MODE>mode))
5279 { 4949 || (SSE_FLOAT_MODE_P (<MODEF:MODE>mode) && TARGET_SSE_MATH
5280 if (!(SSE_FLOAT_MODE_P (<MODEF:MODE>mode) && TARGET_SSE_MATH) 4950 && ((<SWI48x:MODE>mode != DImode) || TARGET_64BIT))")
5281 && !X87_ENABLE_FLOAT (<MODEF:MODE>mode, <SWI48:MODE>mode)) 4951
5282 { 4952 (define_insn "*float<SWI48:mode><MODEF:mode>2"
5283 rtx reg = gen_reg_rtx (XFmode); 4953 [(set (match_operand:MODEF 0 "register_operand" "=f,v,v")
5284 rtx (*insn)(rtx, rtx);
5285
5286 emit_insn (gen_float<SWI48:mode>xf2 (reg, operands[1]));
5287
5288 if (<MODEF:MODE>mode == SFmode)
5289 insn = gen_truncxfsf2;
5290 else if (<MODEF:MODE>mode == DFmode)
5291 insn = gen_truncxfdf2;
5292 else
5293 gcc_unreachable ();
5294
5295 emit_insn (insn (operands[0], reg));
5296 DONE;
5297 }
5298 })
5299
5300 (define_insn "*float<SWI48:mode><MODEF:mode>2_mixed"
5301 [(set (match_operand:MODEF 0 "register_operand" "=f,Yc,v")
5302 (float:MODEF 4954 (float:MODEF
5303 (match_operand:SWI48 1 "nonimmediate_operand" "m,r,m")))] 4955 (match_operand:SWI48 1 "nonimmediate_operand" "m,r,m")))]
5304 "SSE_FLOAT_MODE_P (<MODEF:MODE>mode) && TARGET_SSE_MATH" 4956 "(TARGET_80387 && X87_ENABLE_FLOAT (<MODEF:MODE>mode, <SWI48:MODE>mode))
4957 || (SSE_FLOAT_MODE_P (<MODEF:MODE>mode) && TARGET_SSE_MATH)"
5305 "@ 4958 "@
5306 fild%Z1\t%1 4959 fild%Z1\t%1
5307 %vcvtsi2<MODEF:ssemodesuffix><SWI48:rex64suffix>\t{%1, %d0|%d0, %1} 4960 %vcvtsi2<MODEF:ssemodesuffix><SWI48:rex64suffix>\t{%1, %d0|%d0, %1}
5308 %vcvtsi2<MODEF:ssemodesuffix><SWI48:rex64suffix>\t{%1, %d0|%d0, %1}" 4961 %vcvtsi2<MODEF:ssemodesuffix><SWI48:rex64suffix>\t{%1, %d0|%d0, %1}"
5309 [(set_attr "type" "fmov,sseicvt,sseicvt") 4962 [(set_attr "type" "fmov,sseicvt,sseicvt")
5320 (set_attr "amdfam10_decode" "*,vector,double") 4973 (set_attr "amdfam10_decode" "*,vector,double")
5321 (set_attr "bdver1_decode" "*,double,direct") 4974 (set_attr "bdver1_decode" "*,double,direct")
5322 (set_attr "znver1_decode" "double,*,*") 4975 (set_attr "znver1_decode" "double,*,*")
5323 (set_attr "fp_int_src" "true") 4976 (set_attr "fp_int_src" "true")
5324 (set (attr "enabled") 4977 (set (attr "enabled")
5325 (cond [(eq_attr "alternative" "0") 4978 (if_then_else
5326 (symbol_ref "TARGET_MIX_SSE_I387 4979 (match_test ("SSE_FLOAT_MODE_P (<MODEF:MODE>mode) && TARGET_SSE_MATH"))
5327 && X87_ENABLE_FLOAT (<MODEF:MODE>mode, 4980 (if_then_else
5328 <SWI48:MODE>mode)") 4981 (eq_attr "alternative" "0")
5329 ] 4982 (symbol_ref "TARGET_MIX_SSE_I387
5330 (symbol_ref "true")))]) 4983 && X87_ENABLE_FLOAT (<MODEF:MODE>mode,
5331 4984 <SWI48:MODE>mode)")
5332 (define_insn "*float<SWI48x:mode><MODEF:mode>2_i387" 4985 (symbol_ref "true"))
4986 (if_then_else
4987 (eq_attr "alternative" "0")
4988 (symbol_ref "true")
4989 (symbol_ref "false"))))
4990 (set (attr "preferred_for_speed")
4991 (cond [(eq_attr "alternative" "1")
4992 (symbol_ref "TARGET_INTER_UNIT_CONVERSIONS")]
4993 (symbol_ref "true")))])
4994
4995 (define_insn "*floatdi<MODEF:mode>2_i387"
5333 [(set (match_operand:MODEF 0 "register_operand" "=f") 4996 [(set (match_operand:MODEF 0 "register_operand" "=f")
5334 (float:MODEF (match_operand:SWI48x 1 "nonimmediate_operand" "m")))] 4997 (float:MODEF (match_operand:DI 1 "nonimmediate_operand" "m")))]
5335 "TARGET_80387 && X87_ENABLE_FLOAT (<MODEF:MODE>mode, <SWI48x:MODE>mode)" 4998 "!TARGET_64BIT
4999 && TARGET_80387 && X87_ENABLE_FLOAT (<MODEF:MODE>mode, DImode)"
5336 "fild%Z1\t%1" 5000 "fild%Z1\t%1"
5337 [(set_attr "type" "fmov") 5001 [(set_attr "type" "fmov")
5338 (set_attr "mode" "<MODEF:MODE>") 5002 (set_attr "mode" "<MODEF:MODE>")
5339 (set_attr "znver1_decode" "double") 5003 (set_attr "znver1_decode" "double")
5340 (set_attr "fp_int_src" "true")]) 5004 (set_attr "fp_int_src" "true")])
5365 else 5029 else
5366 emit_insn (gen_sse2_cvtdq2pd (operands[3], operands[4])); 5030 emit_insn (gen_sse2_cvtdq2pd (operands[3], operands[4]));
5367 DONE; 5031 DONE;
5368 }) 5032 })
5369 5033
5034 ;; Avoid store forwarding (partial memory) stall penalty
5035 ;; by passing DImode value through XMM registers. */
5036
5037 (define_split
5038 [(set (match_operand:X87MODEF 0 "register_operand")
5039 (float:X87MODEF
5040 (match_operand:DI 1 "register_operand")))]
5041 "!TARGET_64BIT && TARGET_INTER_UNIT_MOVES_TO_VEC
5042 && TARGET_80387 && X87_ENABLE_FLOAT (<X87MODEF:MODE>mode, DImode)
5043 && TARGET_SSE2 && optimize_function_for_speed_p (cfun)
5044 && can_create_pseudo_p ()"
5045 [(const_int 0)]
5046 {
5047 emit_insn (gen_floatdi<mode>2_i387_with_xmm
5048 (operands[0], operands[1],
5049 assign_386_stack_local (DImode, SLOT_TEMP)));
5050 DONE;
5051 })
5052
5053 (define_insn_and_split "floatdi<X87MODEF:mode>2_i387_with_xmm"
5054 [(set (match_operand:X87MODEF 0 "register_operand" "=f")
5055 (float:X87MODEF
5056 (match_operand:DI 1 "register_operand" "r")))
5057 (clobber (match_scratch:V4SI 3 "=x"))
5058 (clobber (match_scratch:V4SI 4 "=x"))
5059 (clobber (match_operand:DI 2 "memory_operand" "=m"))]
5060 "!TARGET_64BIT && TARGET_INTER_UNIT_MOVES_TO_VEC
5061 && TARGET_80387 && X87_ENABLE_FLOAT (<X87MODEF:MODE>mode, DImode)
5062 && TARGET_SSE2 && optimize_function_for_speed_p (cfun)"
5063 "#"
5064 "&& reload_completed"
5065 [(set (match_dup 2) (match_dup 3))
5066 (set (match_dup 0) (float:X87MODEF (match_dup 2)))]
5067 {
5068 /* The DImode arrived in a pair of integral registers (e.g. %edx:%eax).
5069 Assemble the 64-bit DImode value in an xmm register. */
5070 emit_insn (gen_sse2_loadld (operands[3], CONST0_RTX (V4SImode),
5071 gen_lowpart (SImode, operands[1])));
5072 emit_insn (gen_sse2_loadld (operands[4], CONST0_RTX (V4SImode),
5073 gen_highpart (SImode, operands[1])));
5074 emit_insn (gen_vec_interleave_lowv4si (operands[3], operands[3],
5075 operands[4]));
5076
5077 operands[3] = gen_lowpart (DImode, operands[3]);
5078 }
5079 [(set_attr "type" "multi")
5080 (set_attr "mode" "<X87MODEF:MODE>")
5081 (set_attr "unit" "i387")
5082 (set_attr "fp_int_src" "true")])
5083
5370 ;; Avoid partial SSE register dependency stalls. This splitter should split 5084 ;; Avoid partial SSE register dependency stalls. This splitter should split
5371 ;; late in the pass sequence (after register rename pass), so allocated 5085 ;; late in the pass sequence (after register rename pass), so allocated
5372 ;; registers won't change anymore 5086 ;; registers won't change anymore
5373 5087
5374 (define_split 5088 (define_split
5390 5104
5391 operands[0] = lowpart_subreg (vmode, operands[0], <MODEF:MODE>mode); 5105 operands[0] = lowpart_subreg (vmode, operands[0], <MODEF:MODE>mode);
5392 emit_move_insn (operands[0], CONST0_RTX (vmode)); 5106 emit_move_insn (operands[0], CONST0_RTX (vmode));
5393 }) 5107 })
5394 5108
5395 ;; Break partial reg stall for cvtsd2ss. This splitter should split
5396 ;; late in the pass sequence (after register rename pass),
5397 ;; so allocated registers won't change anymore.
5398
5399 (define_split
5400 [(set (match_operand:SF 0 "sse_reg_operand")
5401 (float_truncate:SF
5402 (match_operand:DF 1 "nonimmediate_operand")))]
5403 "TARGET_SSE_PARTIAL_REG_DEPENDENCY && epilogue_completed
5404 && optimize_function_for_speed_p (cfun)
5405 && (!REG_P (operands[1])
5406 || REGNO (operands[0]) != REGNO (operands[1]))
5407 && (!EXT_REX_SSE_REG_P (operands[0])
5408 || TARGET_AVX512VL)"
5409 [(set (match_dup 0)
5410 (vec_merge:V4SF
5411 (vec_duplicate:V4SF
5412 (float_truncate:SF
5413 (match_dup 1)))
5414 (match_dup 0)
5415 (const_int 1)))]
5416 {
5417 operands[0] = lowpart_subreg (V4SFmode, operands[0], SFmode);
5418 emit_move_insn (operands[0], CONST0_RTX (V4SFmode));
5419 })
5420
5421 ;; Break partial reg stall for cvtss2sd. This splitter should split
5422 ;; late in the pass sequence (after register rename pass),
5423 ;; so allocated registers won't change anymore.
5424
5425 (define_split
5426 [(set (match_operand:DF 0 "sse_reg_operand")
5427 (float_extend:DF
5428 (match_operand:SF 1 "nonimmediate_operand")))]
5429 "TARGET_SSE_PARTIAL_REG_DEPENDENCY && epilogue_completed
5430 && optimize_function_for_speed_p (cfun)
5431 && (!REG_P (operands[1])
5432 || REGNO (operands[0]) != REGNO (operands[1]))
5433 && (!EXT_REX_SSE_REG_P (operands[0])
5434 || TARGET_AVX512VL)"
5435 [(set (match_dup 0)
5436 (vec_merge:V2DF
5437 (vec_duplicate:V2DF
5438 (float_extend:DF
5439 (match_dup 1)))
5440 (match_dup 0)
5441 (const_int 1)))]
5442 {
5443 operands[0] = lowpart_subreg (V2DFmode, operands[0], DFmode);
5444 emit_move_insn (operands[0], CONST0_RTX (V2DFmode));
5445 })
5446
5447 ;; Avoid store forwarding (partial memory) stall penalty
5448 ;; by passing DImode value through XMM registers. */
5449
5450 (define_insn "floatdi<X87MODEF:mode>2_i387_with_xmm"
5451 [(set (match_operand:X87MODEF 0 "register_operand" "=f,f")
5452 (float:X87MODEF
5453 (match_operand:DI 1 "nonimmediate_operand" "m,?r")))
5454 (clobber (match_scratch:V4SI 3 "=X,x"))
5455 (clobber (match_scratch:V4SI 4 "=X,x"))
5456 (clobber (match_operand:DI 2 "memory_operand" "=X,m"))]
5457 "TARGET_80387 && X87_ENABLE_FLOAT (<X87MODEF:MODE>mode, DImode)
5458 && TARGET_SSE2 && TARGET_INTER_UNIT_MOVES_TO_VEC
5459 && !TARGET_64BIT && optimize_function_for_speed_p (cfun)"
5460 "#"
5461 [(set_attr "type" "multi")
5462 (set_attr "mode" "<X87MODEF:MODE>")
5463 (set_attr "unit" "i387")
5464 (set_attr "fp_int_src" "true")])
5465
5466 (define_split
5467 [(set (match_operand:X87MODEF 0 "fp_register_operand")
5468 (float:X87MODEF (match_operand:DI 1 "register_operand")))
5469 (clobber (match_scratch:V4SI 3))
5470 (clobber (match_scratch:V4SI 4))
5471 (clobber (match_operand:DI 2 "memory_operand"))]
5472 "TARGET_80387 && X87_ENABLE_FLOAT (<X87MODEF:MODE>mode, DImode)
5473 && TARGET_SSE2 && TARGET_INTER_UNIT_MOVES_TO_VEC
5474 && !TARGET_64BIT && optimize_function_for_speed_p (cfun)
5475 && reload_completed"
5476 [(set (match_dup 2) (match_dup 3))
5477 (set (match_dup 0) (float:X87MODEF (match_dup 2)))]
5478 {
5479 /* The DImode arrived in a pair of integral registers (e.g. %edx:%eax).
5480 Assemble the 64-bit DImode value in an xmm register. */
5481 emit_insn (gen_sse2_loadld (operands[3], CONST0_RTX (V4SImode),
5482 gen_lowpart (SImode, operands[1])));
5483 emit_insn (gen_sse2_loadld (operands[4], CONST0_RTX (V4SImode),
5484 gen_highpart (SImode, operands[1])));
5485 emit_insn (gen_vec_interleave_lowv4si (operands[3], operands[3],
5486 operands[4]));
5487
5488 operands[3] = gen_lowpart (DImode, operands[3]);
5489 })
5490
5491 (define_split
5492 [(set (match_operand:X87MODEF 0 "fp_register_operand")
5493 (float:X87MODEF (match_operand:DI 1 "memory_operand")))
5494 (clobber (match_scratch:V4SI 3))
5495 (clobber (match_scratch:V4SI 4))
5496 (clobber (match_operand:DI 2 "memory_operand"))]
5497 "TARGET_80387 && X87_ENABLE_FLOAT (<X87MODEF:MODE>mode, DImode)
5498 && TARGET_SSE2 && TARGET_INTER_UNIT_MOVES_TO_VEC
5499 && !TARGET_64BIT && optimize_function_for_speed_p (cfun)
5500 && reload_completed"
5501 [(set (match_dup 0) (float:X87MODEF (match_dup 1)))])
5502
5503 (define_expand "floatuns<SWI12:mode><MODEF:mode>2" 5109 (define_expand "floatuns<SWI12:mode><MODEF:mode>2"
5504 [(set (match_operand:MODEF 0 "register_operand") 5110 [(set (match_operand:MODEF 0 "register_operand")
5505 (unsigned_float:MODEF 5111 (unsigned_float:MODEF
5506 (match_operand:SWI12 1 "nonimmediate_operand")))] 5112 (match_operand:SWI12 1 "nonimmediate_operand")))]
5507 "!TARGET_64BIT 5113 "!TARGET_64BIT
5510 operands[1] = convert_to_mode (SImode, operands[1], 1); 5116 operands[1] = convert_to_mode (SImode, operands[1], 1);
5511 emit_insn (gen_floatsi<MODEF:mode>2 (operands[0], operands[1])); 5117 emit_insn (gen_floatsi<MODEF:mode>2 (operands[0], operands[1]));
5512 DONE; 5118 DONE;
5513 }) 5119 })
5514 5120
5121 (define_insn "*floatuns<SWI48:mode><MODEF:mode>2_avx512"
5122 [(set (match_operand:MODEF 0 "register_operand" "=v")
5123 (unsigned_float:MODEF
5124 (match_operand:SWI48 1 "nonimmediate_operand" "rm")))]
5125 "TARGET_AVX512F && TARGET_SSE_MATH"
5126 "vcvtusi2<MODEF:ssemodesuffix><SWI48:rex64suffix>\t{%1, %0, %0|%0, %0, %1}"
5127 [(set_attr "type" "sseicvt")
5128 (set_attr "prefix" "evex")
5129 (set_attr "mode" "<MODEF:MODE>")])
5130
5515 ;; Avoid store forwarding (partial memory) stall penalty by extending 5131 ;; Avoid store forwarding (partial memory) stall penalty by extending
5516 ;; SImode value to DImode through XMM register instead of pushing two 5132 ;; SImode value to DImode through XMM register instead of pushing two
5517 ;; SImode values to stack. Also note that fild loads from memory only. 5133 ;; SImode values to stack. Also note that fild loads from memory only.
5518 5134
5519 (define_insn_and_split "*floatunssi<mode>2_i387_with_xmm" 5135 (define_insn_and_split "floatunssi<mode>2_i387_with_xmm"
5520 [(set (match_operand:X87MODEF 0 "register_operand" "=f") 5136 [(set (match_operand:X87MODEF 0 "register_operand" "=f")
5521 (unsigned_float:X87MODEF 5137 (unsigned_float:X87MODEF
5522 (match_operand:SI 1 "nonimmediate_operand" "rm"))) 5138 (match_operand:SI 1 "nonimmediate_operand" "rm")))
5523 (clobber (match_scratch:DI 3 "=x")) 5139 (clobber (match_operand:DI 2 "memory_operand" "=m"))
5524 (clobber (match_operand:DI 2 "memory_operand" "=m"))] 5140 (clobber (match_scratch:DI 3 "=x"))]
5525 "!TARGET_64BIT 5141 "!TARGET_64BIT
5526 && TARGET_80387 && X87_ENABLE_FLOAT (<X87MODEF:MODE>mode, DImode) 5142 && TARGET_80387 && X87_ENABLE_FLOAT (<X87MODEF:MODE>mode, DImode)
5527 && TARGET_SSE2 && TARGET_INTER_UNIT_MOVES_TO_VEC" 5143 && TARGET_SSE2 && TARGET_INTER_UNIT_MOVES_TO_VEC"
5528 "#" 5144 "#"
5529 "&& reload_completed" 5145 "&& reload_completed"
5534 "" 5150 ""
5535 [(set_attr "type" "multi") 5151 [(set_attr "type" "multi")
5536 (set_attr "mode" "<MODE>")]) 5152 (set_attr "mode" "<MODE>")])
5537 5153
5538 (define_expand "floatunssi<mode>2" 5154 (define_expand "floatunssi<mode>2"
5539 [(parallel 5155 [(set (match_operand:X87MODEF 0 "register_operand")
5540 [(set (match_operand:X87MODEF 0 "register_operand") 5156 (unsigned_float:X87MODEF
5541 (unsigned_float:X87MODEF 5157 (match_operand:SI 1 "nonimmediate_operand")))]
5542 (match_operand:SI 1 "nonimmediate_operand"))) 5158 "(!TARGET_64BIT
5543 (clobber (match_scratch:DI 3)) 5159 && TARGET_80387 && X87_ENABLE_FLOAT (<X87MODEF:MODE>mode, DImode)
5544 (clobber (match_dup 2))])] 5160 && TARGET_SSE2 && TARGET_INTER_UNIT_MOVES_TO_VEC)
5545 "!TARGET_64BIT 5161 || ((!TARGET_64BIT || TARGET_AVX512F)
5546 && ((TARGET_80387 && X87_ENABLE_FLOAT (<X87MODEF:MODE>mode, DImode) 5162 && SSE_FLOAT_MODE_P (<MODE>mode) && TARGET_SSE_MATH)"
5547 && TARGET_SSE2 && TARGET_INTER_UNIT_MOVES_TO_VEC) 5163 {
5548 || (SSE_FLOAT_MODE_P (<MODE>mode) && TARGET_SSE_MATH))" 5164 if (!(SSE_FLOAT_MODE_P (<MODE>mode) && TARGET_SSE_MATH))
5549 { 5165 {
5550 if (SSE_FLOAT_MODE_P (<MODE>mode) && TARGET_SSE_MATH) 5166 emit_insn (gen_floatunssi<mode>2_i387_with_xmm
5167 (operands[0], operands[1],
5168 assign_386_stack_local (DImode, SLOT_TEMP)));
5169 DONE;
5170 }
5171 if (!TARGET_AVX512F)
5551 { 5172 {
5552 ix86_expand_convert_uns_si<mode>_sse (operands[0], operands[1]); 5173 ix86_expand_convert_uns_si<mode>_sse (operands[0], operands[1]);
5553 DONE; 5174 DONE;
5554 } 5175 }
5555 else
5556 operands[2] = assign_386_stack_local (DImode, SLOT_TEMP);
5557 }) 5176 })
5558 5177
5559 (define_expand "floatunsdisf2" 5178 (define_expand "floatunsdisf2"
5560 [(use (match_operand:SF 0 "register_operand")) 5179 [(set (match_operand:SF 0 "register_operand")
5561 (use (match_operand:DI 1 "nonimmediate_operand"))] 5180 (unsigned_float:SF
5181 (match_operand:DI 1 "nonimmediate_operand")))]
5562 "TARGET_64BIT && TARGET_SSE && TARGET_SSE_MATH" 5182 "TARGET_64BIT && TARGET_SSE && TARGET_SSE_MATH"
5563 "x86_emit_floatuns (operands); DONE;") 5183 {
5184 if (!TARGET_AVX512F)
5185 {
5186 x86_emit_floatuns (operands);
5187 DONE;
5188 }
5189 })
5564 5190
5565 (define_expand "floatunsdidf2" 5191 (define_expand "floatunsdidf2"
5566 [(use (match_operand:DF 0 "register_operand")) 5192 [(set (match_operand:DF 0 "register_operand")
5567 (use (match_operand:DI 1 "nonimmediate_operand"))] 5193 (unsigned_float:DF
5568 "(TARGET_64BIT || TARGET_KEEPS_VECTOR_ALIGNED_STACK) 5194 (match_operand:DI 1 "nonimmediate_operand")))]
5195 "(TARGET_KEEPS_VECTOR_ALIGNED_STACK || TARGET_AVX512F)
5569 && TARGET_SSE2 && TARGET_SSE_MATH" 5196 && TARGET_SSE2 && TARGET_SSE_MATH"
5570 { 5197 {
5571 if (TARGET_64BIT) 5198 if (!TARGET_64BIT)
5572 x86_emit_floatuns (operands); 5199 {
5573 else 5200 ix86_expand_convert_uns_didf_sse (operands[0], operands[1]);
5574 ix86_expand_convert_uns_didf_sse (operands[0], operands[1]); 5201 DONE;
5575 DONE; 5202 }
5203 if (!TARGET_AVX512F)
5204 {
5205 x86_emit_floatuns (operands);
5206 DONE;
5207 }
5576 }) 5208 })
5577 5209
5578 ;; Load effective address instructions 5210 ;; Load effective address instructions
5579 5211
5580 (define_insn_and_split "*lea<mode>" 5212 (define_insn_and_split "*lea<mode>"
6821 [(set_attr "type" "alu") 6453 [(set_attr "type" "alu")
6822 (set_attr "use_carry" "1") 6454 (set_attr "use_carry" "1")
6823 (set_attr "pent_pair" "pu") 6455 (set_attr "pent_pair" "pu")
6824 (set_attr "mode" "<MODE>")]) 6456 (set_attr "mode" "<MODE>")])
6825 6457
6458 (define_insn "*add<mode>3_carry_0"
6459 [(set (match_operand:SWI 0 "nonimmediate_operand" "=<r>m")
6460 (plus:SWI
6461 (match_operator:SWI 3 "ix86_carry_flag_operator"
6462 [(match_operand 2 "flags_reg_operand") (const_int 0)])
6463 (match_operand:SWI 1 "nonimmediate_operand" "0")))
6464 (clobber (reg:CC FLAGS_REG))]
6465 "ix86_unary_operator_ok (PLUS, <MODE>mode, operands)"
6466 "adc{<imodesuffix>}\t{$0, %0|%0, 0}"
6467 [(set_attr "type" "alu")
6468 (set_attr "use_carry" "1")
6469 (set_attr "pent_pair" "pu")
6470 (set_attr "mode" "<MODE>")])
6471
6826 (define_insn "*addsi3_carry_zext" 6472 (define_insn "*addsi3_carry_zext"
6827 [(set (match_operand:DI 0 "register_operand" "=r") 6473 [(set (match_operand:DI 0 "register_operand" "=r")
6828 (zero_extend:DI 6474 (zero_extend:DI
6829 (plus:SI 6475 (plus:SI
6830 (plus:SI (match_operator:SI 3 "ix86_carry_flag_operator" 6476 (plus:SI (match_operator:SI 3 "ix86_carry_flag_operator"
6832 (match_operand:SI 1 "register_operand" "%0")) 6478 (match_operand:SI 1 "register_operand" "%0"))
6833 (match_operand:SI 2 "x86_64_general_operand" "rme")))) 6479 (match_operand:SI 2 "x86_64_general_operand" "rme"))))
6834 (clobber (reg:CC FLAGS_REG))] 6480 (clobber (reg:CC FLAGS_REG))]
6835 "TARGET_64BIT && ix86_binary_operator_ok (PLUS, SImode, operands)" 6481 "TARGET_64BIT && ix86_binary_operator_ok (PLUS, SImode, operands)"
6836 "adc{l}\t{%2, %k0|%k0, %2}" 6482 "adc{l}\t{%2, %k0|%k0, %2}"
6483 [(set_attr "type" "alu")
6484 (set_attr "use_carry" "1")
6485 (set_attr "pent_pair" "pu")
6486 (set_attr "mode" "SI")])
6487
6488 (define_insn "*addsi3_carry_zext_0"
6489 [(set (match_operand:DI 0 "register_operand" "=r")
6490 (zero_extend:DI
6491 (plus:SI (match_operator:SI 2 "ix86_carry_flag_operator"
6492 [(reg FLAGS_REG) (const_int 0)])
6493 (match_operand:SI 1 "register_operand" "0"))))
6494 (clobber (reg:CC FLAGS_REG))]
6495 "TARGET_64BIT"
6496 "adc{l}\t{$0, %k0|%k0, 0}"
6837 [(set_attr "type" "alu") 6497 [(set_attr "type" "alu")
6838 (set_attr "use_carry" "1") 6498 (set_attr "use_carry" "1")
6839 (set_attr "pent_pair" "pu") 6499 (set_attr "pent_pair" "pu")
6840 (set_attr "mode" "SI")]) 6500 (set_attr "mode" "SI")])
6841 6501
6893 [(set_attr "type" "alu") 6553 [(set_attr "type" "alu")
6894 (set_attr "use_carry" "1") 6554 (set_attr "use_carry" "1")
6895 (set_attr "pent_pair" "pu") 6555 (set_attr "pent_pair" "pu")
6896 (set_attr "mode" "<MODE>")]) 6556 (set_attr "mode" "<MODE>")])
6897 6557
6558 (define_insn "*sub<mode>3_carry_0"
6559 [(set (match_operand:SWI 0 "nonimmediate_operand" "=<r>m")
6560 (minus:SWI
6561 (match_operand:SWI 1 "nonimmediate_operand" "0")
6562 (match_operator:SWI 3 "ix86_carry_flag_operator"
6563 [(match_operand 2 "flags_reg_operand") (const_int 0)])))
6564 (clobber (reg:CC FLAGS_REG))]
6565 "ix86_unary_operator_ok (MINUS, <MODE>mode, operands)"
6566 "sbb{<imodesuffix>}\t{$0, %0|%0, 0}"
6567 [(set_attr "type" "alu")
6568 (set_attr "use_carry" "1")
6569 (set_attr "pent_pair" "pu")
6570 (set_attr "mode" "<MODE>")])
6571
6898 (define_insn "*subsi3_carry_zext" 6572 (define_insn "*subsi3_carry_zext"
6899 [(set (match_operand:DI 0 "register_operand" "=r") 6573 [(set (match_operand:DI 0 "register_operand" "=r")
6900 (zero_extend:DI 6574 (zero_extend:DI
6901 (minus:SI 6575 (minus:SI
6902 (minus:SI 6576 (minus:SI
6905 [(reg FLAGS_REG) (const_int 0)])) 6579 [(reg FLAGS_REG) (const_int 0)]))
6906 (match_operand:SI 2 "x86_64_general_operand" "rme")))) 6580 (match_operand:SI 2 "x86_64_general_operand" "rme"))))
6907 (clobber (reg:CC FLAGS_REG))] 6581 (clobber (reg:CC FLAGS_REG))]
6908 "TARGET_64BIT && ix86_binary_operator_ok (MINUS, SImode, operands)" 6582 "TARGET_64BIT && ix86_binary_operator_ok (MINUS, SImode, operands)"
6909 "sbb{l}\t{%2, %k0|%k0, %2}" 6583 "sbb{l}\t{%2, %k0|%k0, %2}"
6584 [(set_attr "type" "alu")
6585 (set_attr "use_carry" "1")
6586 (set_attr "pent_pair" "pu")
6587 (set_attr "mode" "SI")])
6588
6589 (define_insn "*subsi3_carry_zext_0"
6590 [(set (match_operand:DI 0 "register_operand" "=r")
6591 (zero_extend:DI
6592 (minus:SI
6593 (match_operand:SI 1 "register_operand" "0")
6594 (match_operator:SI 2 "ix86_carry_flag_operator"
6595 [(reg FLAGS_REG) (const_int 0)]))))
6596 (clobber (reg:CC FLAGS_REG))]
6597 "TARGET_64BIT"
6598 "sbb{l}\t{$0, %k0|%k0, 0}"
6910 [(set_attr "type" "alu") 6599 [(set_attr "type" "alu")
6911 (set_attr "use_carry" "1") 6600 (set_attr "use_carry" "1")
6912 (set_attr "pent_pair" "pu") 6601 (set_attr "pent_pair" "pu")
6913 (set_attr "mode" "SI")]) 6602 (set_attr "mode" "SI")])
6914 6603
7575 (set_attr "amdfam10_decode" "direct") 7264 (set_attr "amdfam10_decode" "direct")
7576 (set_attr "bdver1_decode" "direct") 7265 (set_attr "bdver1_decode" "direct")
7577 (set_attr "mode" "QI")]) 7266 (set_attr "mode" "QI")])
7578 7267
7579 (define_expand "<s>mul<mode>3_highpart" 7268 (define_expand "<s>mul<mode>3_highpart"
7580 [(parallel [(set (match_operand:SWI48 0 "register_operand") 7269 [(parallel [(set (match_operand:DWIH 0 "register_operand")
7581 (truncate:SWI48 7270 (truncate:DWIH
7582 (lshiftrt:<DWI> 7271 (lshiftrt:<DWI>
7583 (mult:<DWI> 7272 (mult:<DWI>
7584 (any_extend:<DWI> 7273 (any_extend:<DWI>
7585 (match_operand:SWI48 1 "nonimmediate_operand")) 7274 (match_operand:DWIH 1 "nonimmediate_operand"))
7586 (any_extend:<DWI> 7275 (any_extend:<DWI>
7587 (match_operand:SWI48 2 "register_operand"))) 7276 (match_operand:DWIH 2 "register_operand")))
7588 (match_dup 3)))) 7277 (match_dup 3))))
7589 (clobber (match_scratch:SWI48 4)) 7278 (clobber (match_scratch:DWIH 4))
7590 (clobber (reg:CC FLAGS_REG))])] 7279 (clobber (reg:CC FLAGS_REG))])]
7591 "" 7280 ""
7592 "operands[3] = GEN_INT (GET_MODE_BITSIZE (<MODE>mode));") 7281 "operands[3] = GEN_INT (GET_MODE_BITSIZE (<MODE>mode));")
7593 7282
7594 (define_insn "*<s>muldi3_highpart_1" 7283 (define_insn "*<s>muldi3_highpart_1"
9223 operands[1] = gen_lowpart (QImode, operands[1]); 8912 operands[1] = gen_lowpart (QImode, operands[1]);
9224 operands[2] = gen_int_mode (INTVAL (operands[2]), QImode); 8913 operands[2] = gen_int_mode (INTVAL (operands[2]), QImode);
9225 }) 8914 })
9226 8915
9227 (define_insn "*andndi3_doubleword" 8916 (define_insn "*andndi3_doubleword"
9228 [(set (match_operand:DI 0 "register_operand" "=r,&r") 8917 [(set (match_operand:DI 0 "register_operand" "=&r,r,r,&r")
9229 (and:DI 8918 (and:DI
9230 (not:DI (match_operand:DI 1 "register_operand" "r,0")) 8919 (not:DI (match_operand:DI 1 "register_operand" "r,0,r,0"))
9231 (match_operand:DI 2 "nonimmediate_operand" "rm,rm"))) 8920 (match_operand:DI 2 "nonimmediate_operand" "rm,rm,0,rm")))
9232 (clobber (reg:CC FLAGS_REG))] 8921 (clobber (reg:CC FLAGS_REG))]
9233 "!TARGET_64BIT && TARGET_STV && TARGET_SSE2" 8922 "!TARGET_64BIT && TARGET_STV && TARGET_SSE2"
9234 "#" 8923 "#"
9235 [(set_attr "isa" "bmi,*")]) 8924 [(set_attr "isa" "bmi,bmi,bmi,*")])
9236 8925
9237 (define_split 8926 (define_split
9238 [(set (match_operand:DI 0 "register_operand") 8927 [(set (match_operand:DI 0 "register_operand")
9239 (and:DI 8928 (and:DI
9240 (not:DI (match_operand:DI 1 "register_operand")) 8929 (not:DI (match_operand:DI 1 "register_operand"))
9981 [(set (match_operand:X87MODEF 0 "register_operand" "=f") 9670 [(set (match_operand:X87MODEF 0 "register_operand" "=f")
9982 (absneg:X87MODEF (match_operand:X87MODEF 1 "register_operand" "0")))] 9671 (absneg:X87MODEF (match_operand:X87MODEF 1 "register_operand" "0")))]
9983 "TARGET_80387 9672 "TARGET_80387
9984 && (reload_completed 9673 && (reload_completed
9985 || !(SSE_FLOAT_MODE_P (<MODE>mode) && TARGET_SSE_MATH))" 9674 || !(SSE_FLOAT_MODE_P (<MODE>mode) && TARGET_SSE_MATH))"
9986 "f<absneg_mnemonic>" 9675 "<absneg_mnemonic>"
9987 [(set_attr "type" "fsgn") 9676 [(set_attr "type" "fsgn")
9988 (set_attr "mode" "<MODE>")]) 9677 (set_attr "mode" "<MODE>")])
9989
9990 (define_insn "*<code>extendsfdf2"
9991 [(set (match_operand:DF 0 "register_operand" "=f")
9992 (absneg:DF (float_extend:DF
9993 (match_operand:SF 1 "register_operand" "0"))))]
9994 "TARGET_80387 && (!TARGET_SSE_MATH || TARGET_MIX_SSE_I387)"
9995 "f<absneg_mnemonic>"
9996 [(set_attr "type" "fsgn")
9997 (set_attr "mode" "DF")])
9998
9999 (define_insn "*<code>extendsfxf2"
10000 [(set (match_operand:XF 0 "register_operand" "=f")
10001 (absneg:XF (float_extend:XF
10002 (match_operand:SF 1 "register_operand" "0"))))]
10003 "TARGET_80387"
10004 "f<absneg_mnemonic>"
10005 [(set_attr "type" "fsgn")
10006 (set_attr "mode" "XF")])
10007
10008 (define_insn "*<code>extenddfxf2"
10009 [(set (match_operand:XF 0 "register_operand" "=f")
10010 (absneg:XF (float_extend:XF
10011 (match_operand:DF 1 "register_operand" "0"))))]
10012 "TARGET_80387"
10013 "f<absneg_mnemonic>"
10014 [(set_attr "type" "fsgn")
10015 (set_attr "mode" "XF")])
10016 9678
10017 ;; Copysign instructions 9679 ;; Copysign instructions
10018 9680
10019 (define_mode_iterator CSGNMODE [SF DF TF]) 9681 (define_mode_iterator CSGNMODE [SF DF TF])
10020 (define_mode_attr CSGNVMODE [(SF "V4SF") (DF "V2DF") (TF "TF")]) 9682 (define_mode_attr CSGNVMODE [(SF "V4SF") (DF "V2DF") (TF "TF")])
10028 "ix86_expand_copysign (operands); DONE;") 9690 "ix86_expand_copysign (operands); DONE;")
10029 9691
10030 (define_insn_and_split "copysign<mode>3_const" 9692 (define_insn_and_split "copysign<mode>3_const"
10031 [(set (match_operand:CSGNMODE 0 "register_operand" "=Yv") 9693 [(set (match_operand:CSGNMODE 0 "register_operand" "=Yv")
10032 (unspec:CSGNMODE 9694 (unspec:CSGNMODE
10033 [(match_operand:<CSGNVMODE> 1 "vector_move_operand" "YvmC") 9695 [(match_operand:<CSGNVMODE> 1 "nonimm_or_0_operand" "YvmC")
10034 (match_operand:CSGNMODE 2 "register_operand" "0") 9696 (match_operand:CSGNMODE 2 "register_operand" "0")
10035 (match_operand:<CSGNVMODE> 3 "nonimmediate_operand" "Yvm")] 9697 (match_operand:<CSGNVMODE> 3 "nonimmediate_operand" "Yvm")]
10036 UNSPEC_COPYSIGN))] 9698 UNSPEC_COPYSIGN))]
10037 "(SSE_FLOAT_MODE_P (<MODE>mode) && TARGET_SSE_MATH) 9699 "(SSE_FLOAT_MODE_P (<MODE>mode) && TARGET_SSE_MATH)
10038 || (TARGET_SSE && (<MODE>mode == TFmode))" 9700 || (TARGET_SSE && (<MODE>mode == TFmode))"
10207 (ashift:SDWIM (match_operand:SDWIM 1 "<ashl_input_operand>") 9869 (ashift:SDWIM (match_operand:SDWIM 1 "<ashl_input_operand>")
10208 (match_operand:QI 2 "nonmemory_operand")))] 9870 (match_operand:QI 2 "nonmemory_operand")))]
10209 "" 9871 ""
10210 "ix86_expand_binary_operator (ASHIFT, <MODE>mode, operands); DONE;") 9872 "ix86_expand_binary_operator (ASHIFT, <MODE>mode, operands); DONE;")
10211 9873
9874 (define_insn_and_split "*ashl<dwi>3_doubleword_mask"
9875 [(set (match_operand:<DWI> 0 "register_operand")
9876 (ashift:<DWI>
9877 (match_operand:<DWI> 1 "register_operand")
9878 (subreg:QI
9879 (and:SI
9880 (match_operand:SI 2 "register_operand" "c")
9881 (match_operand:SI 3 "const_int_operand")) 0)))
9882 (clobber (reg:CC FLAGS_REG))]
9883 "(INTVAL (operands[3]) & (<MODE_SIZE> * BITS_PER_UNIT)) == 0
9884 && can_create_pseudo_p ()"
9885 "#"
9886 "&& 1"
9887 [(parallel
9888 [(set (match_dup 6)
9889 (ior:DWIH (ashift:DWIH (match_dup 6) (match_dup 2))
9890 (lshiftrt:DWIH (match_dup 5)
9891 (minus:QI (match_dup 8) (match_dup 2)))))
9892 (clobber (reg:CC FLAGS_REG))])
9893 (parallel
9894 [(set (match_dup 4)
9895 (ashift:DWIH (match_dup 5) (match_dup 2)))
9896 (clobber (reg:CC FLAGS_REG))])]
9897 {
9898 split_double_mode (<DWI>mode, &operands[0], 2, &operands[4], &operands[6]);
9899
9900 operands[8] = GEN_INT (<MODE_SIZE> * BITS_PER_UNIT);
9901
9902 if ((INTVAL (operands[3]) & ((<MODE_SIZE> * BITS_PER_UNIT) - 1))
9903 != ((<MODE_SIZE> * BITS_PER_UNIT) - 1))
9904 {
9905 rtx tem = gen_reg_rtx (SImode);
9906 emit_insn (gen_andsi3 (tem, operands[2], operands[3]));
9907 operands[2] = tem;
9908 }
9909
9910 operands[2] = gen_lowpart (QImode, operands[2]);
9911
9912 if (!rtx_equal_p (operands[6], operands[7]))
9913 emit_move_insn (operands[6], operands[7]);
9914 })
9915
9916 (define_insn_and_split "*ashl<dwi>3_doubleword_mask_1"
9917 [(set (match_operand:<DWI> 0 "register_operand")
9918 (ashift:<DWI>
9919 (match_operand:<DWI> 1 "register_operand")
9920 (and:QI
9921 (match_operand:QI 2 "register_operand" "c")
9922 (match_operand:QI 3 "const_int_operand"))))
9923 (clobber (reg:CC FLAGS_REG))]
9924 "(INTVAL (operands[3]) & (<MODE_SIZE> * BITS_PER_UNIT)) == 0
9925 && can_create_pseudo_p ()"
9926 "#"
9927 "&& 1"
9928 [(parallel
9929 [(set (match_dup 6)
9930 (ior:DWIH (ashift:DWIH (match_dup 6) (match_dup 2))
9931 (lshiftrt:DWIH (match_dup 5)
9932 (minus:QI (match_dup 8) (match_dup 2)))))
9933 (clobber (reg:CC FLAGS_REG))])
9934 (parallel
9935 [(set (match_dup 4)
9936 (ashift:DWIH (match_dup 5) (match_dup 2)))
9937 (clobber (reg:CC FLAGS_REG))])]
9938 {
9939 split_double_mode (<DWI>mode, &operands[0], 2, &operands[4], &operands[6]);
9940
9941 operands[8] = GEN_INT (<MODE_SIZE> * BITS_PER_UNIT);
9942
9943 if ((INTVAL (operands[3]) & ((<MODE_SIZE> * BITS_PER_UNIT) - 1))
9944 != ((<MODE_SIZE> * BITS_PER_UNIT) - 1))
9945 {
9946 rtx tem = gen_reg_rtx (QImode);
9947 emit_insn (gen_andqi3 (tem, operands[2], operands[3]));
9948 operands[2] = tem;
9949 }
9950
9951 if (!rtx_equal_p (operands[6], operands[7]))
9952 emit_move_insn (operands[6], operands[7]);
9953 })
9954
10212 (define_insn "*ashl<mode>3_doubleword" 9955 (define_insn "*ashl<mode>3_doubleword"
10213 [(set (match_operand:DWI 0 "register_operand" "=&r") 9956 [(set (match_operand:DWI 0 "register_operand" "=&r")
10214 (ashift:DWI (match_operand:DWI 1 "reg_or_pm1_operand" "0n") 9957 (ashift:DWI (match_operand:DWI 1 "reg_or_pm1_operand" "0n")
10215 (match_operand:QI 2 "nonmemory_operand" "<S>c"))) 9958 (match_operand:QI 2 "nonmemory_operand" "<S>c")))
10216 (clobber (reg:CC FLAGS_REG))] 9959 (clobber (reg:CC FLAGS_REG))]
10326 [(set (match_operand:SWI48 0 "nonimmediate_operand") 10069 [(set (match_operand:SWI48 0 "nonimmediate_operand")
10327 (ashift:SWI48 10070 (ashift:SWI48
10328 (match_operand:SWI48 1 "nonimmediate_operand") 10071 (match_operand:SWI48 1 "nonimmediate_operand")
10329 (subreg:QI 10072 (subreg:QI
10330 (and:SI 10073 (and:SI
10331 (match_operand:SI 2 "register_operand") 10074 (match_operand:SI 2 "register_operand" "c,r")
10332 (match_operand:SI 3 "const_int_operand")) 0))) 10075 (match_operand:SI 3 "const_int_operand")) 0)))
10333 (clobber (reg:CC FLAGS_REG))] 10076 (clobber (reg:CC FLAGS_REG))]
10334 "ix86_binary_operator_ok (ASHIFT, <MODE>mode, operands) 10077 "ix86_binary_operator_ok (ASHIFT, <MODE>mode, operands)
10335 && (INTVAL (operands[3]) & (GET_MODE_BITSIZE (<MODE>mode)-1)) 10078 && (INTVAL (operands[3]) & (GET_MODE_BITSIZE (<MODE>mode)-1))
10336 == GET_MODE_BITSIZE (<MODE>mode)-1 10079 == GET_MODE_BITSIZE (<MODE>mode)-1
10340 [(parallel 10083 [(parallel
10341 [(set (match_dup 0) 10084 [(set (match_dup 0)
10342 (ashift:SWI48 (match_dup 1) 10085 (ashift:SWI48 (match_dup 1)
10343 (match_dup 2))) 10086 (match_dup 2)))
10344 (clobber (reg:CC FLAGS_REG))])] 10087 (clobber (reg:CC FLAGS_REG))])]
10345 "operands[2] = gen_lowpart (QImode, operands[2]);") 10088 "operands[2] = gen_lowpart (QImode, operands[2]);"
10089 [(set_attr "isa" "*,bmi2")])
10346 10090
10347 (define_insn_and_split "*ashl<mode>3_mask_1" 10091 (define_insn_and_split "*ashl<mode>3_mask_1"
10348 [(set (match_operand:SWI48 0 "nonimmediate_operand") 10092 [(set (match_operand:SWI48 0 "nonimmediate_operand")
10349 (ashift:SWI48 10093 (ashift:SWI48
10350 (match_operand:SWI48 1 "nonimmediate_operand") 10094 (match_operand:SWI48 1 "nonimmediate_operand")
10351 (and:QI 10095 (and:QI
10352 (match_operand:QI 2 "register_operand") 10096 (match_operand:QI 2 "register_operand" "c,r")
10353 (match_operand:QI 3 "const_int_operand")))) 10097 (match_operand:QI 3 "const_int_operand"))))
10354 (clobber (reg:CC FLAGS_REG))] 10098 (clobber (reg:CC FLAGS_REG))]
10355 "ix86_binary_operator_ok (ASHIFT, <MODE>mode, operands) 10099 "ix86_binary_operator_ok (ASHIFT, <MODE>mode, operands)
10356 && (INTVAL (operands[3]) & (GET_MODE_BITSIZE (<MODE>mode)-1)) 10100 && (INTVAL (operands[3]) & (GET_MODE_BITSIZE (<MODE>mode)-1))
10357 == GET_MODE_BITSIZE (<MODE>mode)-1 10101 == GET_MODE_BITSIZE (<MODE>mode)-1
10360 "&& 1" 10104 "&& 1"
10361 [(parallel 10105 [(parallel
10362 [(set (match_dup 0) 10106 [(set (match_dup 0)
10363 (ashift:SWI48 (match_dup 1) 10107 (ashift:SWI48 (match_dup 1)
10364 (match_dup 2))) 10108 (match_dup 2)))
10365 (clobber (reg:CC FLAGS_REG))])]) 10109 (clobber (reg:CC FLAGS_REG))])]
10110 ""
10111 [(set_attr "isa" "*,bmi2")])
10366 10112
10367 (define_insn "*bmi2_ashl<mode>3_1" 10113 (define_insn "*bmi2_ashl<mode>3_1"
10368 [(set (match_operand:SWI48 0 "register_operand" "=r") 10114 [(set (match_operand:SWI48 0 "register_operand" "=r")
10369 (ashift:SWI48 (match_operand:SWI48 1 "nonimmediate_operand" "rm") 10115 (ashift:SWI48 (match_operand:SWI48 1 "nonimmediate_operand" "rm")
10370 (match_operand:SWI48 2 "register_operand" "r")))] 10116 (match_operand:SWI48 2 "register_operand" "r")))]
10620 && (TARGET_SHIFT1 10366 && (TARGET_SHIFT1
10621 || (TARGET_DOUBLE_WITH_ADD && REG_P (operands[0])))))" 10367 || (TARGET_DOUBLE_WITH_ADD && REG_P (operands[0])))))"
10622 { 10368 {
10623 switch (get_attr_type (insn)) 10369 switch (get_attr_type (insn))
10624 { 10370 {
10625 case TYPE_ALU: 10371 case TYPE_ALU1:
10626 gcc_assert (operands[1] == const1_rtx); 10372 gcc_assert (operands[1] == const1_rtx);
10627 return "add{b}\t%0, %0"; 10373 return "add{b}\t%0, %0";
10628 10374
10629 default: 10375 default:
10630 if (operands[1] == const1_rtx 10376 if (operands[1] == const1_rtx
10636 } 10382 }
10637 [(set (attr "type") 10383 [(set (attr "type")
10638 (cond [(and (and (match_test "TARGET_DOUBLE_WITH_ADD") 10384 (cond [(and (and (match_test "TARGET_DOUBLE_WITH_ADD")
10639 (match_operand 0 "register_operand")) 10385 (match_operand 0 "register_operand"))
10640 (match_operand 1 "const1_operand")) 10386 (match_operand 1 "const1_operand"))
10641 (const_string "alu") 10387 (const_string "alu1")
10642 ] 10388 ]
10643 (const_string "ishift1"))) 10389 (const_string "ishift1")))
10644 (set (attr "length_immediate") 10390 (set (attr "length_immediate")
10645 (if_then_else 10391 (if_then_else
10646 (ior (eq_attr "type" "alu") 10392 (ior (eq_attr "type" "alu1")
10647 (and (eq_attr "type" "ishift1") 10393 (and (eq_attr "type" "ishift1")
10648 (and (match_operand 1 "const1_operand") 10394 (and (match_operand 1 "const1_operand")
10649 (ior (match_test "TARGET_SHIFT1") 10395 (ior (match_test "TARGET_SHIFT1")
10650 (match_test "optimize_function_for_size_p (cfun)"))))) 10396 (match_test "optimize_function_for_size_p (cfun)")))))
10651 (const_string "0") 10397 (const_string "0")
10846 [(set (match_operand:SWI48 0 "nonimmediate_operand") 10592 [(set (match_operand:SWI48 0 "nonimmediate_operand")
10847 (any_shiftrt:SWI48 10593 (any_shiftrt:SWI48
10848 (match_operand:SWI48 1 "nonimmediate_operand") 10594 (match_operand:SWI48 1 "nonimmediate_operand")
10849 (subreg:QI 10595 (subreg:QI
10850 (and:SI 10596 (and:SI
10851 (match_operand:SI 2 "register_operand") 10597 (match_operand:SI 2 "register_operand" "c,r")
10852 (match_operand:SI 3 "const_int_operand")) 0))) 10598 (match_operand:SI 3 "const_int_operand")) 0)))
10853 (clobber (reg:CC FLAGS_REG))] 10599 (clobber (reg:CC FLAGS_REG))]
10854 "ix86_binary_operator_ok (<CODE>, <MODE>mode, operands) 10600 "ix86_binary_operator_ok (<CODE>, <MODE>mode, operands)
10855 && (INTVAL (operands[3]) & (GET_MODE_BITSIZE (<MODE>mode)-1)) 10601 && (INTVAL (operands[3]) & (GET_MODE_BITSIZE (<MODE>mode)-1))
10856 == GET_MODE_BITSIZE (<MODE>mode)-1 10602 == GET_MODE_BITSIZE (<MODE>mode)-1
10860 [(parallel 10606 [(parallel
10861 [(set (match_dup 0) 10607 [(set (match_dup 0)
10862 (any_shiftrt:SWI48 (match_dup 1) 10608 (any_shiftrt:SWI48 (match_dup 1)
10863 (match_dup 2))) 10609 (match_dup 2)))
10864 (clobber (reg:CC FLAGS_REG))])] 10610 (clobber (reg:CC FLAGS_REG))])]
10865 "operands[2] = gen_lowpart (QImode, operands[2]);") 10611 "operands[2] = gen_lowpart (QImode, operands[2]);"
10612 [(set_attr "isa" "*,bmi2")])
10866 10613
10867 (define_insn_and_split "*<shift_insn><mode>3_mask_1" 10614 (define_insn_and_split "*<shift_insn><mode>3_mask_1"
10868 [(set (match_operand:SWI48 0 "nonimmediate_operand") 10615 [(set (match_operand:SWI48 0 "nonimmediate_operand")
10869 (any_shiftrt:SWI48 10616 (any_shiftrt:SWI48
10870 (match_operand:SWI48 1 "nonimmediate_operand") 10617 (match_operand:SWI48 1 "nonimmediate_operand")
10871 (and:QI 10618 (and:QI
10872 (match_operand:QI 2 "register_operand") 10619 (match_operand:QI 2 "register_operand" "c,r")
10873 (match_operand:QI 3 "const_int_operand")))) 10620 (match_operand:QI 3 "const_int_operand"))))
10874 (clobber (reg:CC FLAGS_REG))] 10621 (clobber (reg:CC FLAGS_REG))]
10875 "ix86_binary_operator_ok (<CODE>, <MODE>mode, operands) 10622 "ix86_binary_operator_ok (<CODE>, <MODE>mode, operands)
10876 && (INTVAL (operands[3]) & (GET_MODE_BITSIZE (<MODE>mode)-1)) 10623 && (INTVAL (operands[3]) & (GET_MODE_BITSIZE (<MODE>mode)-1))
10877 == GET_MODE_BITSIZE (<MODE>mode)-1 10624 == GET_MODE_BITSIZE (<MODE>mode)-1
10880 "&& 1" 10627 "&& 1"
10881 [(parallel 10628 [(parallel
10882 [(set (match_dup 0) 10629 [(set (match_dup 0)
10883 (any_shiftrt:SWI48 (match_dup 1) 10630 (any_shiftrt:SWI48 (match_dup 1)
10884 (match_dup 2))) 10631 (match_dup 2)))
10885 (clobber (reg:CC FLAGS_REG))])]) 10632 (clobber (reg:CC FLAGS_REG))])]
10633 ""
10634 [(set_attr "isa" "*,bmi2")])
10635
10636 (define_insn_and_split "*<shift_insn><dwi>3_doubleword_mask"
10637 [(set (match_operand:<DWI> 0 "register_operand")
10638 (any_shiftrt:<DWI>
10639 (match_operand:<DWI> 1 "register_operand")
10640 (subreg:QI
10641 (and:SI
10642 (match_operand:SI 2 "register_operand" "c")
10643 (match_operand:SI 3 "const_int_operand")) 0)))
10644 (clobber (reg:CC FLAGS_REG))]
10645 "(INTVAL (operands[3]) & (<MODE_SIZE> * BITS_PER_UNIT)) == 0
10646 && can_create_pseudo_p ()"
10647 "#"
10648 "&& 1"
10649 [(parallel
10650 [(set (match_dup 4)
10651 (ior:DWIH (lshiftrt:DWIH (match_dup 4) (match_dup 2))
10652 (ashift:DWIH (match_dup 7)
10653 (minus:QI (match_dup 8) (match_dup 2)))))
10654 (clobber (reg:CC FLAGS_REG))])
10655 (parallel
10656 [(set (match_dup 6)
10657 (any_shiftrt:DWIH (match_dup 7) (match_dup 2)))
10658 (clobber (reg:CC FLAGS_REG))])]
10659 {
10660 split_double_mode (<DWI>mode, &operands[0], 2, &operands[4], &operands[6]);
10661
10662 operands[8] = GEN_INT (<MODE_SIZE> * BITS_PER_UNIT);
10663
10664 if ((INTVAL (operands[3]) & ((<MODE_SIZE> * BITS_PER_UNIT) - 1))
10665 != ((<MODE_SIZE> * BITS_PER_UNIT) - 1))
10666 {
10667 rtx tem = gen_reg_rtx (SImode);
10668 emit_insn (gen_andsi3 (tem, operands[2], operands[3]));
10669 operands[2] = tem;
10670 }
10671
10672 operands[2] = gen_lowpart (QImode, operands[2]);
10673
10674 if (!rtx_equal_p (operands[4], operands[5]))
10675 emit_move_insn (operands[4], operands[5]);
10676 })
10677
10678 (define_insn_and_split "*<shift_insn><dwi>3_doubleword_mask_1"
10679 [(set (match_operand:<DWI> 0 "register_operand")
10680 (any_shiftrt:<DWI>
10681 (match_operand:<DWI> 1 "register_operand")
10682 (and:QI
10683 (match_operand:QI 2 "register_operand" "c")
10684 (match_operand:QI 3 "const_int_operand"))))
10685 (clobber (reg:CC FLAGS_REG))]
10686 "(INTVAL (operands[3]) & (<MODE_SIZE> * BITS_PER_UNIT)) == 0
10687 && can_create_pseudo_p ()"
10688 "#"
10689 "&& 1"
10690 [(parallel
10691 [(set (match_dup 4)
10692 (ior:DWIH (lshiftrt:DWIH (match_dup 4) (match_dup 2))
10693 (ashift:DWIH (match_dup 7)
10694 (minus:QI (match_dup 8) (match_dup 2)))))
10695 (clobber (reg:CC FLAGS_REG))])
10696 (parallel
10697 [(set (match_dup 6)
10698 (any_shiftrt:DWIH (match_dup 7) (match_dup 2)))
10699 (clobber (reg:CC FLAGS_REG))])]
10700 {
10701 split_double_mode (<DWI>mode, &operands[0], 2, &operands[4], &operands[6]);
10702
10703 operands[8] = GEN_INT (<MODE_SIZE> * BITS_PER_UNIT);
10704
10705 if ((INTVAL (operands[3]) & ((<MODE_SIZE> * BITS_PER_UNIT) - 1))
10706 != ((<MODE_SIZE> * BITS_PER_UNIT) - 1))
10707 {
10708 rtx tem = gen_reg_rtx (QImode);
10709 emit_insn (gen_andqi3 (tem, operands[2], operands[3]));
10710 operands[2] = tem;
10711 }
10712
10713 if (!rtx_equal_p (operands[4], operands[5]))
10714 emit_move_insn (operands[4], operands[5]);
10715 })
10886 10716
10887 (define_insn_and_split "*<shift_insn><mode>3_doubleword" 10717 (define_insn_and_split "*<shift_insn><mode>3_doubleword"
10888 [(set (match_operand:DWI 0 "register_operand" "=&r") 10718 [(set (match_operand:DWI 0 "register_operand" "=&r")
10889 (any_shiftrt:DWI (match_operand:DWI 1 "register_operand" "0") 10719 (any_shiftrt:DWI (match_operand:DWI 1 "register_operand" "0")
10890 (match_operand:QI 2 "nonmemory_operand" "<S>c"))) 10720 (match_operand:QI 2 "nonmemory_operand" "<S>c")))
11325 [(set (match_operand:SWI48 0 "nonimmediate_operand") 11155 [(set (match_operand:SWI48 0 "nonimmediate_operand")
11326 (any_rotate:SWI48 11156 (any_rotate:SWI48
11327 (match_operand:SWI48 1 "nonimmediate_operand") 11157 (match_operand:SWI48 1 "nonimmediate_operand")
11328 (subreg:QI 11158 (subreg:QI
11329 (and:SI 11159 (and:SI
11330 (match_operand:SI 2 "register_operand") 11160 (match_operand:SI 2 "register_operand" "c")
11331 (match_operand:SI 3 "const_int_operand")) 0))) 11161 (match_operand:SI 3 "const_int_operand")) 0)))
11332 (clobber (reg:CC FLAGS_REG))] 11162 (clobber (reg:CC FLAGS_REG))]
11333 "ix86_binary_operator_ok (<CODE>, <MODE>mode, operands) 11163 "ix86_binary_operator_ok (<CODE>, <MODE>mode, operands)
11334 && (INTVAL (operands[3]) & (GET_MODE_BITSIZE (<MODE>mode)-1)) 11164 && (INTVAL (operands[3]) & (GET_MODE_BITSIZE (<MODE>mode)-1))
11335 == GET_MODE_BITSIZE (<MODE>mode)-1 11165 == GET_MODE_BITSIZE (<MODE>mode)-1
11346 (define_insn_and_split "*<rotate_insn><mode>3_mask_1" 11176 (define_insn_and_split "*<rotate_insn><mode>3_mask_1"
11347 [(set (match_operand:SWI48 0 "nonimmediate_operand") 11177 [(set (match_operand:SWI48 0 "nonimmediate_operand")
11348 (any_rotate:SWI48 11178 (any_rotate:SWI48
11349 (match_operand:SWI48 1 "nonimmediate_operand") 11179 (match_operand:SWI48 1 "nonimmediate_operand")
11350 (and:QI 11180 (and:QI
11351 (match_operand:QI 2 "register_operand") 11181 (match_operand:QI 2 "register_operand" "c")
11352 (match_operand:QI 3 "const_int_operand")))) 11182 (match_operand:QI 3 "const_int_operand"))))
11353 (clobber (reg:CC FLAGS_REG))] 11183 (clobber (reg:CC FLAGS_REG))]
11354 "ix86_binary_operator_ok (<CODE>, <MODE>mode, operands) 11184 "ix86_binary_operator_ok (<CODE>, <MODE>mode, operands)
11355 && (INTVAL (operands[3]) & (GET_MODE_BITSIZE (<MODE>mode)-1)) 11185 && (INTVAL (operands[3]) & (GET_MODE_BITSIZE (<MODE>mode)-1))
11356 == GET_MODE_BITSIZE (<MODE>mode)-1 11186 == GET_MODE_BITSIZE (<MODE>mode)-1
11610 (const_string "0") 11440 (const_string "0")
11611 (const_string "*"))) 11441 (const_string "*")))
11612 (set_attr "mode" "QI")]) 11442 (set_attr "mode" "QI")])
11613 11443
11614 (define_split 11444 (define_split
11615 [(set (match_operand:HI 0 "register_operand") 11445 [(set (match_operand:HI 0 "QIreg_operand")
11616 (any_rotate:HI (match_dup 0) (const_int 8))) 11446 (any_rotate:HI (match_dup 0) (const_int 8)))
11617 (clobber (reg:CC FLAGS_REG))] 11447 (clobber (reg:CC FLAGS_REG))]
11618 "reload_completed 11448 "reload_completed
11619 && (TARGET_USE_XCHGB || optimize_function_for_size_p (cfun))" 11449 && (TARGET_USE_XCHGB || optimize_function_for_size_p (cfun))"
11620 [(parallel [(set (strict_low_part (match_dup 0)) 11450 [(parallel [(set (strict_low_part (match_dup 0))
12202 (and (ge (minus (match_dup 0) (pc)) 12032 (and (ge (minus (match_dup 0) (pc))
12203 (const_int -126)) 12033 (const_int -126))
12204 (lt (minus (match_dup 0) (pc)) 12034 (lt (minus (match_dup 0) (pc))
12205 (const_int 128))) 12035 (const_int 128)))
12206 (const_int 2) 12036 (const_int 2)
12207 (const_int 6))) 12037 (const_int 6)))])
12208 (set_attr "maybe_prefix_bnd" "1")])
12209 12038
12210 ;; In general it is not safe to assume too much about CCmode registers, 12039 ;; In general it is not safe to assume too much about CCmode registers,
12211 ;; so simplify-rtx stops when it sees a second one. Under certain 12040 ;; so simplify-rtx stops when it sees a second one. Under certain
12212 ;; conditions this is safe on x86, so help combine not create 12041 ;; conditions this is safe on x86, so help combine not create
12213 ;; 12042 ;;
12271 (and (ge (minus (match_dup 0) (pc)) 12100 (and (ge (minus (match_dup 0) (pc))
12272 (const_int -126)) 12101 (const_int -126))
12273 (lt (minus (match_dup 0) (pc)) 12102 (lt (minus (match_dup 0) (pc))
12274 (const_int 128))) 12103 (const_int 128)))
12275 (const_int 2) 12104 (const_int 2)
12276 (const_int 5))) 12105 (const_int 5)))])
12277 (set_attr "maybe_prefix_bnd" "1")])
12278 12106
12279 (define_expand "indirect_jump" 12107 (define_expand "indirect_jump"
12280 [(set (pc) (match_operand 0 "indirect_branch_operand"))] 12108 [(set (pc) (match_operand 0 "indirect_branch_operand"))]
12281 "" 12109 ""
12282 { 12110 {
12283 if (TARGET_X32) 12111 if (TARGET_X32 || TARGET_INDIRECT_BRANCH_REGISTER)
12284 operands[0] = convert_memory_address (word_mode, operands[0]); 12112 operands[0] = convert_memory_address (word_mode, operands[0]);
12113 cfun->machine->has_local_indirect_jump = true;
12285 }) 12114 })
12286 12115
12287 (define_insn "*indirect_jump" 12116 (define_insn "*indirect_jump"
12288 [(set (pc) (match_operand:W 0 "indirect_branch_operand" "rBw"))] 12117 [(set (pc) (match_operand:W 0 "indirect_branch_operand" "rBw"))]
12289 "" 12118 ""
12290 "%!jmp\t%A0" 12119 "* return ix86_output_indirect_jmp (operands[0]);"
12291 [(set_attr "type" "ibr") 12120 [(set (attr "type")
12292 (set_attr "length_immediate" "0") 12121 (if_then_else (match_test "(cfun->machine->indirect_branch_type
12293 (set_attr "maybe_prefix_bnd" "1")]) 12122 != indirect_branch_keep)")
12123 (const_string "multi")
12124 (const_string "ibr")))
12125 (set_attr "length_immediate" "0")])
12294 12126
12295 (define_expand "tablejump" 12127 (define_expand "tablejump"
12296 [(parallel [(set (pc) (match_operand 0 "indirect_branch_operand")) 12128 [(parallel [(set (pc) (match_operand 0 "indirect_branch_operand"))
12297 (use (label_ref (match_operand 1)))])] 12129 (use (label_ref (match_operand 1)))])]
12298 "" 12130 ""
12327 12159
12328 operands[0] = expand_simple_binop (Pmode, code, op0, op1, NULL_RTX, 0, 12160 operands[0] = expand_simple_binop (Pmode, code, op0, op1, NULL_RTX, 0,
12329 OPTAB_DIRECT); 12161 OPTAB_DIRECT);
12330 } 12162 }
12331 12163
12332 if (TARGET_X32) 12164 if (TARGET_X32 || TARGET_INDIRECT_BRANCH_REGISTER)
12333 operands[0] = convert_memory_address (word_mode, operands[0]); 12165 operands[0] = convert_memory_address (word_mode, operands[0]);
12166 cfun->machine->has_local_indirect_jump = true;
12334 }) 12167 })
12335 12168
12336 (define_insn "*tablejump_1" 12169 (define_insn "*tablejump_1"
12337 [(set (pc) (match_operand:W 0 "indirect_branch_operand" "rBw")) 12170 [(set (pc) (match_operand:W 0 "indirect_branch_operand" "rBw"))
12338 (use (label_ref (match_operand 1)))] 12171 (use (label_ref (match_operand 1)))]
12339 "" 12172 ""
12340 "%!jmp\t%A0" 12173 "* return ix86_output_indirect_jmp (operands[0]);"
12341 [(set_attr "type" "ibr") 12174 [(set (attr "type")
12342 (set_attr "length_immediate" "0") 12175 (if_then_else (match_test "(cfun->machine->indirect_branch_type
12343 (set_attr "maybe_prefix_bnd" "1")]) 12176 != indirect_branch_keep)")
12177 (const_string "multi")
12178 (const_string "ibr")))
12179 (set_attr "length_immediate" "0")])
12344 12180
12345 ;; Convert setcc + movzbl to xor + setcc if operands don't overlap. 12181 ;; Convert setcc + movzbl to xor + setcc if operands don't overlap.
12346 12182
12347 (define_peephole2 12183 (define_peephole2
12348 [(set (reg FLAGS_REG) (match_operand 0)) 12184 [(set (reg FLAGS_REG) (match_operand 0))
12373 (set (match_operand 3 "any_QIreg_operand") 12209 (set (match_operand 3 "any_QIreg_operand")
12374 (zero_extend (match_dup 1)))] 12210 (zero_extend (match_dup 1)))]
12375 "(peep2_reg_dead_p (3, operands[1]) 12211 "(peep2_reg_dead_p (3, operands[1])
12376 || operands_match_p (operands[1], operands[3])) 12212 || operands_match_p (operands[1], operands[3]))
12377 && ! reg_overlap_mentioned_p (operands[3], operands[0]) 12213 && ! reg_overlap_mentioned_p (operands[3], operands[0])
12214 && ! reg_overlap_mentioned_p (operands[3], operands[4])
12378 && ! reg_set_p (operands[3], operands[4]) 12215 && ! reg_set_p (operands[3], operands[4])
12379 && peep2_regno_dead_p (0, FLAGS_REG)" 12216 && peep2_regno_dead_p (0, FLAGS_REG)"
12380 [(parallel [(set (match_dup 5) (match_dup 0)) 12217 [(parallel [(set (match_dup 5) (match_dup 0))
12381 (match_dup 4)]) 12218 (match_dup 4)])
12382 (set (strict_low_part (match_dup 6)) 12219 (set (strict_low_part (match_dup 6))
12398 (zero_extend (match_dup 2)))] 12235 (zero_extend (match_dup 2)))]
12399 "(peep2_reg_dead_p (4, operands[2]) 12236 "(peep2_reg_dead_p (4, operands[2])
12400 || operands_match_p (operands[2], operands[4])) 12237 || operands_match_p (operands[2], operands[4]))
12401 && ! reg_overlap_mentioned_p (operands[4], operands[0]) 12238 && ! reg_overlap_mentioned_p (operands[4], operands[0])
12402 && ! reg_overlap_mentioned_p (operands[4], operands[1]) 12239 && ! reg_overlap_mentioned_p (operands[4], operands[1])
12240 && ! reg_overlap_mentioned_p (operands[4], operands[5])
12403 && ! reg_set_p (operands[4], operands[5]) 12241 && ! reg_set_p (operands[4], operands[5])
12404 && refers_to_regno_p (FLAGS_REG, operands[1], (rtx *)NULL) 12242 && refers_to_regno_p (FLAGS_REG, operands[1], (rtx *)NULL)
12405 && peep2_regno_dead_p (0, FLAGS_REG)" 12243 && peep2_regno_dead_p (0, FLAGS_REG)"
12406 [(set (match_dup 6) (match_dup 0)) 12244 [(set (match_dup 6) (match_dup 0))
12407 (parallel [(set (match_dup 7) (match_dup 1)) 12245 (parallel [(set (match_dup 7) (match_dup 1))
12447 (zero_extend (match_dup 1))) 12285 (zero_extend (match_dup 1)))
12448 (clobber (reg:CC FLAGS_REG))])] 12286 (clobber (reg:CC FLAGS_REG))])]
12449 "(peep2_reg_dead_p (3, operands[1]) 12287 "(peep2_reg_dead_p (3, operands[1])
12450 || operands_match_p (operands[1], operands[3])) 12288 || operands_match_p (operands[1], operands[3]))
12451 && ! reg_overlap_mentioned_p (operands[3], operands[0]) 12289 && ! reg_overlap_mentioned_p (operands[3], operands[0])
12290 && ! reg_overlap_mentioned_p (operands[3], operands[4])
12452 && ! reg_set_p (operands[3], operands[4]) 12291 && ! reg_set_p (operands[3], operands[4])
12453 && peep2_regno_dead_p (0, FLAGS_REG)" 12292 && peep2_regno_dead_p (0, FLAGS_REG)"
12454 [(parallel [(set (match_dup 5) (match_dup 0)) 12293 [(parallel [(set (match_dup 5) (match_dup 0))
12455 (match_dup 4)]) 12294 (match_dup 4)])
12456 (set (strict_low_part (match_dup 6)) 12295 (set (strict_low_part (match_dup 6))
12473 (clobber (reg:CC FLAGS_REG))])] 12312 (clobber (reg:CC FLAGS_REG))])]
12474 "(peep2_reg_dead_p (4, operands[2]) 12313 "(peep2_reg_dead_p (4, operands[2])
12475 || operands_match_p (operands[2], operands[4])) 12314 || operands_match_p (operands[2], operands[4]))
12476 && ! reg_overlap_mentioned_p (operands[4], operands[0]) 12315 && ! reg_overlap_mentioned_p (operands[4], operands[0])
12477 && ! reg_overlap_mentioned_p (operands[4], operands[1]) 12316 && ! reg_overlap_mentioned_p (operands[4], operands[1])
12317 && ! reg_overlap_mentioned_p (operands[4], operands[5])
12478 && ! reg_set_p (operands[4], operands[5]) 12318 && ! reg_set_p (operands[4], operands[5])
12479 && refers_to_regno_p (FLAGS_REG, operands[1], (rtx *)NULL) 12319 && refers_to_regno_p (FLAGS_REG, operands[1], (rtx *)NULL)
12480 && peep2_regno_dead_p (0, FLAGS_REG)" 12320 && peep2_regno_dead_p (0, FLAGS_REG)"
12481 [(set (match_dup 6) (match_dup 0)) 12321 [(set (match_dup 6) (match_dup 0))
12482 (parallel [(set (match_dup 7) (match_dup 1)) 12322 (parallel [(set (match_dup 7) (match_dup 1))
12552 [(call (mem:QI 12392 [(call (mem:QI
12553 (mem:SI (plus:SI 12393 (mem:SI (plus:SI
12554 (match_operand:SI 0 "register_no_elim_operand" "U") 12394 (match_operand:SI 0 "register_no_elim_operand" "U")
12555 (match_operand:SI 1 "GOT32_symbol_operand")))) 12395 (match_operand:SI 1 "GOT32_symbol_operand"))))
12556 (match_operand 2))] 12396 (match_operand 2))]
12557 "!TARGET_MACHO && !TARGET_64BIT && SIBLING_CALL_P (insn)" 12397 "!TARGET_MACHO
12398 && !TARGET_64BIT
12399 && !TARGET_INDIRECT_BRANCH_REGISTER
12400 && SIBLING_CALL_P (insn)"
12558 { 12401 {
12559 rtx fnaddr = gen_rtx_PLUS (SImode, operands[0], operands[1]); 12402 rtx fnaddr = gen_rtx_PLUS (SImode, operands[0], operands[1]);
12560 fnaddr = gen_const_mem (SImode, fnaddr); 12403 fnaddr = gen_const_mem (SImode, fnaddr);
12561 return ix86_output_call_insn (insn, fnaddr); 12404 return ix86_output_call_insn (insn, fnaddr);
12562 } 12405 }
12571 12414
12572 (define_insn "*sibcall_memory" 12415 (define_insn "*sibcall_memory"
12573 [(call (mem:QI (match_operand:W 0 "memory_operand" "m")) 12416 [(call (mem:QI (match_operand:W 0 "memory_operand" "m"))
12574 (match_operand 1)) 12417 (match_operand 1))
12575 (unspec [(const_int 0)] UNSPEC_PEEPSIB)] 12418 (unspec [(const_int 0)] UNSPEC_PEEPSIB)]
12576 "!TARGET_X32" 12419 "!TARGET_X32 && !TARGET_INDIRECT_BRANCH_REGISTER"
12577 "* return ix86_output_call_insn (insn, operands[0]);" 12420 "* return ix86_output_call_insn (insn, operands[0]);"
12578 [(set_attr "type" "call")]) 12421 [(set_attr "type" "call")])
12579 12422
12580 (define_peephole2 12423 (define_peephole2
12581 [(set (match_operand:W 0 "register_operand") 12424 [(set (match_operand:W 0 "register_operand")
12582 (match_operand:W 1 "memory_operand")) 12425 (match_operand:W 1 "memory_operand"))
12583 (call (mem:QI (match_dup 0)) 12426 (call (mem:QI (match_dup 0))
12584 (match_operand 3))] 12427 (match_operand 3))]
12585 "!TARGET_X32 && SIBLING_CALL_P (peep2_next_insn (1)) 12428 "!TARGET_X32
12429 && !TARGET_INDIRECT_BRANCH_REGISTER
12430 && SIBLING_CALL_P (peep2_next_insn (1))
12586 && !reg_mentioned_p (operands[0], 12431 && !reg_mentioned_p (operands[0],
12587 CALL_INSN_FUNCTION_USAGE (peep2_next_insn (1)))" 12432 CALL_INSN_FUNCTION_USAGE (peep2_next_insn (1)))"
12588 [(parallel [(call (mem:QI (match_dup 1)) 12433 [(parallel [(call (mem:QI (match_dup 1))
12589 (match_dup 3)) 12434 (match_dup 3))
12590 (unspec [(const_int 0)] UNSPEC_PEEPSIB)])]) 12435 (unspec [(const_int 0)] UNSPEC_PEEPSIB)])])
12593 [(set (match_operand:W 0 "register_operand") 12438 [(set (match_operand:W 0 "register_operand")
12594 (match_operand:W 1 "memory_operand")) 12439 (match_operand:W 1 "memory_operand"))
12595 (unspec_volatile [(const_int 0)] UNSPECV_BLOCKAGE) 12440 (unspec_volatile [(const_int 0)] UNSPECV_BLOCKAGE)
12596 (call (mem:QI (match_dup 0)) 12441 (call (mem:QI (match_dup 0))
12597 (match_operand 3))] 12442 (match_operand 3))]
12598 "!TARGET_X32 && SIBLING_CALL_P (peep2_next_insn (2)) 12443 "!TARGET_X32
12444 && !TARGET_INDIRECT_BRANCH_REGISTER
12445 && SIBLING_CALL_P (peep2_next_insn (2))
12599 && !reg_mentioned_p (operands[0], 12446 && !reg_mentioned_p (operands[0],
12600 CALL_INSN_FUNCTION_USAGE (peep2_next_insn (2)))" 12447 CALL_INSN_FUNCTION_USAGE (peep2_next_insn (2)))"
12601 [(unspec_volatile [(const_int 0)] UNSPECV_BLOCKAGE) 12448 [(unspec_volatile [(const_int 0)] UNSPECV_BLOCKAGE)
12602 (parallel [(call (mem:QI (match_dup 1)) 12449 (parallel [(call (mem:QI (match_dup 1))
12603 (match_dup 3)) 12450 (match_dup 3))
12615 operands[2], operands[3], false); 12462 operands[2], operands[3], false);
12616 DONE; 12463 DONE;
12617 }) 12464 })
12618 12465
12619 (define_insn "*call_pop" 12466 (define_insn "*call_pop"
12620 [(call (mem:QI (match_operand:SI 0 "call_insn_operand" "lmBz")) 12467 [(call (mem:QI (match_operand:SI 0 "call_insn_operand" "lBwBz"))
12621 (match_operand 1)) 12468 (match_operand 1))
12622 (set (reg:SI SP_REG) 12469 (set (reg:SI SP_REG)
12623 (plus:SI (reg:SI SP_REG) 12470 (plus:SI (reg:SI SP_REG)
12624 (match_operand:SI 2 "immediate_operand" "i")))] 12471 (match_operand:SI 2 "immediate_operand" "i")))]
12625 "!TARGET_64BIT && !SIBLING_CALL_P (insn)" 12472 "!TARGET_64BIT && !SIBLING_CALL_P (insn)"
12635 "!TARGET_64BIT && SIBLING_CALL_P (insn)" 12482 "!TARGET_64BIT && SIBLING_CALL_P (insn)"
12636 "* return ix86_output_call_insn (insn, operands[0]);" 12483 "* return ix86_output_call_insn (insn, operands[0]);"
12637 [(set_attr "type" "call")]) 12484 [(set_attr "type" "call")])
12638 12485
12639 (define_insn "*sibcall_pop_memory" 12486 (define_insn "*sibcall_pop_memory"
12640 [(call (mem:QI (match_operand:SI 0 "memory_operand" "m")) 12487 [(call (mem:QI (match_operand:SI 0 "memory_operand" "Bs"))
12641 (match_operand 1)) 12488 (match_operand 1))
12642 (set (reg:SI SP_REG) 12489 (set (reg:SI SP_REG)
12643 (plus:SI (reg:SI SP_REG) 12490 (plus:SI (reg:SI SP_REG)
12644 (match_operand:SI 2 "immediate_operand" "i"))) 12491 (match_operand:SI 2 "immediate_operand" "i")))
12645 (unspec [(const_int 0)] UNSPEC_PEEPSIB)] 12492 (unspec [(const_int 0)] UNSPEC_PEEPSIB)]
12689 12536
12690 (define_peephole2 12537 (define_peephole2
12691 [(set (match_operand:W 0 "register_operand") 12538 [(set (match_operand:W 0 "register_operand")
12692 (match_operand:W 1 "memory_operand")) 12539 (match_operand:W 1 "memory_operand"))
12693 (set (pc) (match_dup 0))] 12540 (set (pc) (match_dup 0))]
12694 "!TARGET_X32 && peep2_reg_dead_p (2, operands[0])" 12541 "!TARGET_X32
12542 && !TARGET_INDIRECT_BRANCH_REGISTER
12543 && peep2_reg_dead_p (2, operands[0])"
12695 [(set (pc) (match_dup 1))]) 12544 [(set (pc) (match_dup 1))])
12696 12545
12697 ;; Call subroutine, returning value in operand 0 12546 ;; Call subroutine, returning value in operand 0
12698 12547
12699 (define_expand "call_value" 12548 (define_expand "call_value"
12749 (call (mem:QI 12598 (call (mem:QI
12750 (mem:SI (plus:SI 12599 (mem:SI (plus:SI
12751 (match_operand:SI 1 "register_no_elim_operand" "U") 12600 (match_operand:SI 1 "register_no_elim_operand" "U")
12752 (match_operand:SI 2 "GOT32_symbol_operand")))) 12601 (match_operand:SI 2 "GOT32_symbol_operand"))))
12753 (match_operand 3)))] 12602 (match_operand 3)))]
12754 "!TARGET_MACHO && !TARGET_64BIT && SIBLING_CALL_P (insn)" 12603 "!TARGET_MACHO
12604 && !TARGET_64BIT
12605 && !TARGET_INDIRECT_BRANCH_REGISTER
12606 && SIBLING_CALL_P (insn)"
12755 { 12607 {
12756 rtx fnaddr = gen_rtx_PLUS (SImode, operands[1], operands[2]); 12608 rtx fnaddr = gen_rtx_PLUS (SImode, operands[1], operands[2]);
12757 fnaddr = gen_const_mem (SImode, fnaddr); 12609 fnaddr = gen_const_mem (SImode, fnaddr);
12758 return ix86_output_call_insn (insn, fnaddr); 12610 return ix86_output_call_insn (insn, fnaddr);
12759 } 12611 }
12770 (define_insn "*sibcall_value_memory" 12622 (define_insn "*sibcall_value_memory"
12771 [(set (match_operand 0) 12623 [(set (match_operand 0)
12772 (call (mem:QI (match_operand:W 1 "memory_operand" "m")) 12624 (call (mem:QI (match_operand:W 1 "memory_operand" "m"))
12773 (match_operand 2))) 12625 (match_operand 2)))
12774 (unspec [(const_int 0)] UNSPEC_PEEPSIB)] 12626 (unspec [(const_int 0)] UNSPEC_PEEPSIB)]
12775 "!TARGET_X32" 12627 "!TARGET_X32 && !TARGET_INDIRECT_BRANCH_REGISTER"
12776 "* return ix86_output_call_insn (insn, operands[1]);" 12628 "* return ix86_output_call_insn (insn, operands[1]);"
12777 [(set_attr "type" "callv")]) 12629 [(set_attr "type" "callv")])
12778 12630
12779 (define_peephole2 12631 (define_peephole2
12780 [(set (match_operand:W 0 "register_operand") 12632 [(set (match_operand:W 0 "register_operand")
12781 (match_operand:W 1 "memory_operand")) 12633 (match_operand:W 1 "memory_operand"))
12782 (set (match_operand 2) 12634 (set (match_operand 2)
12783 (call (mem:QI (match_dup 0)) 12635 (call (mem:QI (match_dup 0))
12784 (match_operand 3)))] 12636 (match_operand 3)))]
12785 "!TARGET_X32 && SIBLING_CALL_P (peep2_next_insn (1)) 12637 "!TARGET_X32
12638 && !TARGET_INDIRECT_BRANCH_REGISTER
12639 && SIBLING_CALL_P (peep2_next_insn (1))
12786 && !reg_mentioned_p (operands[0], 12640 && !reg_mentioned_p (operands[0],
12787 CALL_INSN_FUNCTION_USAGE (peep2_next_insn (1)))" 12641 CALL_INSN_FUNCTION_USAGE (peep2_next_insn (1)))"
12788 [(parallel [(set (match_dup 2) 12642 [(parallel [(set (match_dup 2)
12789 (call (mem:QI (match_dup 1)) 12643 (call (mem:QI (match_dup 1))
12790 (match_dup 3))) 12644 (match_dup 3)))
12795 (match_operand:W 1 "memory_operand")) 12649 (match_operand:W 1 "memory_operand"))
12796 (unspec_volatile [(const_int 0)] UNSPECV_BLOCKAGE) 12650 (unspec_volatile [(const_int 0)] UNSPECV_BLOCKAGE)
12797 (set (match_operand 2) 12651 (set (match_operand 2)
12798 (call (mem:QI (match_dup 0)) 12652 (call (mem:QI (match_dup 0))
12799 (match_operand 3)))] 12653 (match_operand 3)))]
12800 "!TARGET_X32 && SIBLING_CALL_P (peep2_next_insn (2)) 12654 "!TARGET_X32
12655 && !TARGET_INDIRECT_BRANCH_REGISTER
12656 && SIBLING_CALL_P (peep2_next_insn (2))
12801 && !reg_mentioned_p (operands[0], 12657 && !reg_mentioned_p (operands[0],
12802 CALL_INSN_FUNCTION_USAGE (peep2_next_insn (2)))" 12658 CALL_INSN_FUNCTION_USAGE (peep2_next_insn (2)))"
12803 [(unspec_volatile [(const_int 0)] UNSPECV_BLOCKAGE) 12659 [(unspec_volatile [(const_int 0)] UNSPECV_BLOCKAGE)
12804 (parallel [(set (match_dup 2) 12660 (parallel [(set (match_dup 2)
12805 (call (mem:QI (match_dup 1)) 12661 (call (mem:QI (match_dup 1))
12820 DONE; 12676 DONE;
12821 }) 12677 })
12822 12678
12823 (define_insn "*call_value_pop" 12679 (define_insn "*call_value_pop"
12824 [(set (match_operand 0) 12680 [(set (match_operand 0)
12825 (call (mem:QI (match_operand:SI 1 "call_insn_operand" "lmBz")) 12681 (call (mem:QI (match_operand:SI 1 "call_insn_operand" "lBwBz"))
12826 (match_operand 2))) 12682 (match_operand 2)))
12827 (set (reg:SI SP_REG) 12683 (set (reg:SI SP_REG)
12828 (plus:SI (reg:SI SP_REG) 12684 (plus:SI (reg:SI SP_REG)
12829 (match_operand:SI 3 "immediate_operand" "i")))] 12685 (match_operand:SI 3 "immediate_operand" "i")))]
12830 "!TARGET_64BIT && !SIBLING_CALL_P (insn)" 12686 "!TARGET_64BIT && !SIBLING_CALL_P (insn)"
13030 }) 12886 })
13031 12887
13032 (define_insn "simple_return_internal" 12888 (define_insn "simple_return_internal"
13033 [(simple_return)] 12889 [(simple_return)]
13034 "reload_completed" 12890 "reload_completed"
13035 "%!ret" 12891 "* return ix86_output_function_return (false);"
13036 [(set_attr "length" "1") 12892 [(set_attr "length" "1")
13037 (set_attr "atom_unit" "jeu") 12893 (set_attr "atom_unit" "jeu")
13038 (set_attr "length_immediate" "0") 12894 (set_attr "length_immediate" "0")
13039 (set_attr "modrm" "0") 12895 (set_attr "modrm" "0")])
13040 (set_attr "maybe_prefix_bnd" "1")])
13041 12896
13042 (define_insn "interrupt_return" 12897 (define_insn "interrupt_return"
13043 [(simple_return) 12898 [(simple_return)
13044 (unspec [(const_int 0)] UNSPEC_INTERRUPT_RETURN)] 12899 (unspec [(const_int 0)] UNSPEC_INTERRUPT_RETURN)]
13045 "reload_completed" 12900 "reload_completed"
13052 12907
13053 (define_insn "simple_return_internal_long" 12908 (define_insn "simple_return_internal_long"
13054 [(simple_return) 12909 [(simple_return)
13055 (unspec [(const_int 0)] UNSPEC_REP)] 12910 (unspec [(const_int 0)] UNSPEC_REP)]
13056 "reload_completed" 12911 "reload_completed"
13057 { 12912 "* return ix86_output_function_return (true);"
13058 if (ix86_bnd_prefixed_insn_p (insn))
13059 return "%!ret";
13060
13061 return "rep%; ret";
13062 }
13063 [(set_attr "length" "2") 12913 [(set_attr "length" "2")
13064 (set_attr "atom_unit" "jeu") 12914 (set_attr "atom_unit" "jeu")
13065 (set_attr "length_immediate" "0") 12915 (set_attr "length_immediate" "0")
13066 (set_attr "prefix_rep" "1") 12916 (set_attr "prefix_rep" "1")
13067 (set_attr "modrm" "0")]) 12917 (set_attr "modrm" "0")])
13068 12918
13069 (define_insn "simple_return_pop_internal" 12919 (define_insn_and_split "simple_return_pop_internal"
13070 [(simple_return) 12920 [(simple_return)
13071 (use (match_operand:SI 0 "const_int_operand"))] 12921 (use (match_operand:SI 0 "const_int_operand"))]
13072 "reload_completed" 12922 "reload_completed"
13073 "%!ret\t%0" 12923 "%!ret\t%0"
12924 "&& cfun->machine->function_return_type != indirect_branch_keep"
12925 [(const_int 0)]
12926 "ix86_split_simple_return_pop_internal (operands[0]); DONE;"
13074 [(set_attr "length" "3") 12927 [(set_attr "length" "3")
13075 (set_attr "atom_unit" "jeu") 12928 (set_attr "atom_unit" "jeu")
13076 (set_attr "length_immediate" "2") 12929 (set_attr "length_immediate" "2")
13077 (set_attr "modrm" "0") 12930 (set_attr "modrm" "0")])
13078 (set_attr "maybe_prefix_bnd" "1")]) 12931
13079 12932 (define_expand "simple_return_indirect_internal"
13080 (define_insn "simple_return_indirect_internal" 12933 [(parallel
12934 [(simple_return)
12935 (use (match_operand 0 "register_operand"))])])
12936
12937 (define_insn "*simple_return_indirect_internal<mode>"
13081 [(simple_return) 12938 [(simple_return)
13082 (use (match_operand:SI 0 "register_operand" "r"))] 12939 (use (match_operand:W 0 "register_operand" "r"))]
13083 "reload_completed" 12940 "reload_completed"
13084 "%!jmp\t%A0" 12941 "* return ix86_output_indirect_function_return (operands[0]);"
13085 [(set_attr "type" "ibr") 12942 [(set (attr "type")
13086 (set_attr "length_immediate" "0") 12943 (if_then_else (match_test "(cfun->machine->indirect_branch_type
13087 (set_attr "maybe_prefix_bnd" "1")]) 12944 != indirect_branch_keep)")
12945 (const_string "multi")
12946 (const_string "ibr")))
12947 (set_attr "length_immediate" "0")])
13088 12948
13089 (define_insn "nop" 12949 (define_insn "nop"
13090 [(const_int 0)] 12950 [(const_int 0)]
13091 "" 12951 ""
13092 "nop" 12952 "nop"
13185 (unspec:DI [(const_int 0)] UNSPEC_SET_GOT))] 13045 (unspec:DI [(const_int 0)] UNSPEC_SET_GOT))]
13186 "TARGET_64BIT" 13046 "TARGET_64BIT"
13187 "lea{q}\t{_GLOBAL_OFFSET_TABLE_(%%rip), %0|%0, _GLOBAL_OFFSET_TABLE_[rip]}" 13047 "lea{q}\t{_GLOBAL_OFFSET_TABLE_(%%rip), %0|%0, _GLOBAL_OFFSET_TABLE_[rip]}"
13188 [(set_attr "type" "lea") 13048 [(set_attr "type" "lea")
13189 (set_attr "length_address" "4") 13049 (set_attr "length_address" "4")
13190 (set_attr "modrm_class" "unknown")
13191 (set_attr "mode" "DI")]) 13050 (set_attr "mode" "DI")])
13192 13051
13193 (define_insn "set_rip_rex64" 13052 (define_insn "set_rip_rex64"
13194 [(set (match_operand:DI 0 "register_operand" "=r") 13053 [(set (match_operand:DI 0 "register_operand" "=r")
13195 (unspec:DI [(label_ref (match_operand 1))] UNSPEC_SET_RIP))] 13054 (unspec:DI [(label_ref (match_operand 1))] UNSPEC_SET_RIP))]
13230 /* Tricky bit: we write the address of the handler to which we will 13089 /* Tricky bit: we write the address of the handler to which we will
13231 be returning into someone else's stack frame, one word below the 13090 be returning into someone else's stack frame, one word below the
13232 stack address we wish to restore. */ 13091 stack address we wish to restore. */
13233 tmp = gen_rtx_PLUS (Pmode, arg_pointer_rtx, sa); 13092 tmp = gen_rtx_PLUS (Pmode, arg_pointer_rtx, sa);
13234 tmp = plus_constant (Pmode, tmp, -UNITS_PER_WORD); 13093 tmp = plus_constant (Pmode, tmp, -UNITS_PER_WORD);
13235 tmp = gen_rtx_MEM (Pmode, tmp); 13094 /* Return address is always in word_mode. */
13095 tmp = gen_rtx_MEM (word_mode, tmp);
13096 if (GET_MODE (ra) != word_mode)
13097 ra = convert_to_mode (word_mode, ra, 1);
13236 emit_move_insn (tmp, ra); 13098 emit_move_insn (tmp, ra);
13237 13099
13238 emit_jump_insn (gen_eh_return_internal ()); 13100 emit_jump_insn (gen_eh_return_internal ());
13239 emit_barrier (); 13101 emit_barrier ();
13240 DONE; 13102 DONE;
13722 "blsr\t{%1, %0|%0, %1}" 13584 "blsr\t{%1, %0|%0, %1}"
13723 [(set_attr "type" "bitmanip") 13585 [(set_attr "type" "bitmanip")
13724 (set_attr "btver2_decode" "double") 13586 (set_attr "btver2_decode" "double")
13725 (set_attr "mode" "<MODE>")]) 13587 (set_attr "mode" "<MODE>")])
13726 13588
13589 (define_insn "*bmi_blsr_<mode>_cmp"
13590 [(set (reg:CCZ FLAGS_REG)
13591 (compare:CCZ
13592 (and:SWI48
13593 (plus:SWI48
13594 (match_operand:SWI48 1 "nonimmediate_operand" "rm")
13595 (const_int -1))
13596 (match_dup 1))
13597 (const_int 0)))
13598 (set (match_operand:SWI48 0 "register_operand" "=r")
13599 (and:SWI48
13600 (plus:SWI48
13601 (match_dup 1)
13602 (const_int -1))
13603 (match_dup 1)))]
13604 "TARGET_BMI"
13605 "blsr\t{%1, %0|%0, %1}"
13606 [(set_attr "type" "bitmanip")
13607 (set_attr "btver2_decode" "double")
13608 (set_attr "mode" "<MODE>")])
13609
13610 (define_insn "*bmi_blsr_<mode>_ccz"
13611 [(set (reg:CCZ FLAGS_REG)
13612 (compare:CCZ
13613 (and:SWI48
13614 (plus:SWI48
13615 (match_operand:SWI48 1 "nonimmediate_operand" "rm")
13616 (const_int -1))
13617 (match_dup 1))
13618 (const_int 0)))
13619 (clobber (match_scratch:SWI48 0 "=r"))]
13620 "TARGET_BMI"
13621 "blsr\t{%1, %0|%0, %1}"
13622 [(set_attr "type" "bitmanip")
13623 (set_attr "btver2_decode" "double")
13624 (set_attr "mode" "<MODE>")])
13625
13727 ;; BMI2 instructions. 13626 ;; BMI2 instructions.
13728 (define_expand "bmi2_bzhi_<mode>3" 13627 (define_expand "bmi2_bzhi_<mode>3"
13729 [(parallel 13628 [(parallel
13730 [(set (match_operand:SWI48 0 "register_operand") 13629 [(set (match_operand:SWI48 0 "register_operand")
13731 (zero_extract:SWI48 13630 (zero_extract:SWI48
14065 (bswap:SWI48 (match_operand:SWI48 1 "nonimmediate_operand" "0,m,r")))] 13964 (bswap:SWI48 (match_operand:SWI48 1 "nonimmediate_operand" "0,m,r")))]
14066 "TARGET_MOVBE 13965 "TARGET_MOVBE
14067 && !(MEM_P (operands[0]) && MEM_P (operands[1]))" 13966 && !(MEM_P (operands[0]) && MEM_P (operands[1]))"
14068 "@ 13967 "@
14069 bswap\t%0 13968 bswap\t%0
14070 movbe\t{%1, %0|%0, %1} 13969 movbe{<imodesuffix>}\t{%1, %0|%0, %1}
14071 movbe\t{%1, %0|%0, %1}" 13970 movbe{<imodesuffix>}\t{%1, %0|%0, %1}"
14072 [(set_attr "type" "bitmanip,imov,imov") 13971 [(set_attr "type" "bitmanip,imov,imov")
14073 (set_attr "modrm" "0,1,1") 13972 (set_attr "modrm" "0,1,1")
14074 (set_attr "prefix_0f" "*,1,1") 13973 (set_attr "prefix_0f" "*,1,1")
14075 (set_attr "prefix_extra" "*,1,1") 13974 (set_attr "prefix_extra" "*,1,1")
14076 (set_attr "mode" "<MODE>")]) 13975 (set_attr "mode" "<MODE>")])
14082 "bswap\t%0" 13981 "bswap\t%0"
14083 [(set_attr "type" "bitmanip") 13982 [(set_attr "type" "bitmanip")
14084 (set_attr "modrm" "0") 13983 (set_attr "modrm" "0")
14085 (set_attr "mode" "<MODE>")]) 13984 (set_attr "mode" "<MODE>")])
14086 13985
14087 (define_insn "*bswaphi_lowpart_1" 13986 (define_expand "bswaphi2"
13987 [(set (match_operand:HI 0 "register_operand")
13988 (bswap:HI (match_operand:HI 1 "nonimmediate_operand")))]
13989 "TARGET_MOVBE")
13990
13991 (define_insn "*bswaphi2_movbe"
13992 [(set (match_operand:HI 0 "nonimmediate_operand" "=Q,r,m")
13993 (bswap:HI (match_operand:HI 1 "nonimmediate_operand" "0,m,r")))]
13994 "TARGET_MOVBE
13995 && !(MEM_P (operands[0]) && MEM_P (operands[1]))"
13996 "@
13997 xchg{b}\t{%h0, %b0|%b0, %h0}
13998 movbe{w}\t{%1, %0|%0, %1}
13999 movbe{w}\t{%1, %0|%0, %1}"
14000 [(set_attr "type" "imov")
14001 (set_attr "modrm" "*,1,1")
14002 (set_attr "prefix_0f" "*,1,1")
14003 (set_attr "prefix_extra" "*,1,1")
14004 (set_attr "pent_pair" "np,*,*")
14005 (set_attr "athlon_decode" "vector,*,*")
14006 (set_attr "amdfam10_decode" "double,*,*")
14007 (set_attr "bdver1_decode" "double,*,*")
14008 (set_attr "mode" "QI,HI,HI")])
14009
14010 (define_peephole2
14011 [(set (match_operand:HI 0 "general_reg_operand")
14012 (bswap:HI (match_dup 0)))]
14013 "TARGET_MOVBE
14014 && !(TARGET_USE_XCHGB || optimize_function_for_size_p (cfun))
14015 && peep2_regno_dead_p (0, FLAGS_REG)"
14016 [(parallel [(set (match_dup 0) (rotate:HI (match_dup 0) (const_int 8)))
14017 (clobber (reg:CC FLAGS_REG))])])
14018
14019 (define_insn "bswaphi_lowpart"
14088 [(set (strict_low_part (match_operand:HI 0 "register_operand" "+Q,r")) 14020 [(set (strict_low_part (match_operand:HI 0 "register_operand" "+Q,r"))
14089 (bswap:HI (match_dup 0))) 14021 (bswap:HI (match_dup 0)))
14090 (clobber (reg:CC FLAGS_REG))] 14022 (clobber (reg:CC FLAGS_REG))]
14091 "TARGET_USE_XCHGB || optimize_function_for_size_p (cfun)" 14023 ""
14092 "@ 14024 "@
14093 xchg{b}\t{%h0, %b0|%b0, %h0} 14025 xchg{b}\t{%h0, %b0|%b0, %h0}
14094 rol{w}\t{$8, %0|%0, 8}" 14026 rol{w}\t{$8, %0|%0, 8}"
14095 [(set_attr "length" "2,4") 14027 [(set (attr "preferred_for_size")
14028 (cond [(eq_attr "alternative" "0")
14029 (symbol_ref "true")]
14030 (symbol_ref "false")))
14031 (set (attr "preferred_for_speed")
14032 (cond [(eq_attr "alternative" "0")
14033 (symbol_ref "TARGET_USE_XCHGB")]
14034 (symbol_ref "!TARGET_USE_XCHGB")))
14035 (set_attr "length" "2,4")
14096 (set_attr "mode" "QI,HI")]) 14036 (set_attr "mode" "QI,HI")])
14097
14098 (define_insn "bswaphi_lowpart"
14099 [(set (strict_low_part (match_operand:HI 0 "register_operand" "+r"))
14100 (bswap:HI (match_dup 0)))
14101 (clobber (reg:CC FLAGS_REG))]
14102 ""
14103 "rol{w}\t{$8, %0|%0, 8}"
14104 [(set_attr "length" "4")
14105 (set_attr "mode" "HI")])
14106 14037
14107 (define_expand "paritydi2" 14038 (define_expand "paritydi2"
14108 [(set (match_operand:DI 0 "register_operand") 14039 [(set (match_operand:DI 0 "register_operand")
14109 (parity:DI (match_operand:DI 1 "register_operand")))] 14040 (parity:DI (match_operand:DI 1 "register_operand")))]
14110 "! TARGET_POPCNT" 14041 "! TARGET_POPCNT"
14271 (reg:P SP_REG)] 14202 (reg:P SP_REG)]
14272 UNSPEC_TLS_GD)] 14203 UNSPEC_TLS_GD)]
14273 "TARGET_64BIT" 14204 "TARGET_64BIT"
14274 { 14205 {
14275 if (!TARGET_X32) 14206 if (!TARGET_X32)
14276 fputs (ASM_BYTE "0x66\n", asm_out_file); 14207 /* The .loc directive has effect for 'the immediately following assembly
14208 instruction'. So for a sequence:
14209 .loc f l
14210 .byte x
14211 insn1
14212 the 'immediately following assembly instruction' is insn1.
14213 We want to emit an insn prefix here, but if we use .byte (as shown in
14214 'ELF Handling For Thread-Local Storage'), a preceding .loc will point
14215 inside the insn sequence, rather than to the start. After relaxation
14216 of the sequence by the linker, the .loc might point inside an insn.
14217 Use data16 prefix instead, which doesn't have this problem. */
14218 fputs ("\tdata16", asm_out_file);
14277 output_asm_insn 14219 output_asm_insn
14278 ("lea{q}\t{%E1@tlsgd(%%rip), %%rdi|rdi, %E1@tlsgd[rip]}", operands); 14220 ("lea{q}\t{%E1@tlsgd(%%rip), %%rdi|rdi, %E1@tlsgd[rip]}", operands);
14279 if (TARGET_SUN_TLS || flag_plt || !HAVE_AS_IX86_TLS_GET_ADDR_GOT) 14221 if (TARGET_SUN_TLS || flag_plt || !HAVE_AS_IX86_TLS_GET_ADDR_GOT)
14280 fputs (ASM_SHORT "0x6666\n", asm_out_file); 14222 fputs (ASM_SHORT "0x6666\n", asm_out_file);
14281 else 14223 else
14678 ;; SImode if the target mode DFmode, but only SImode if the target mode 14620 ;; SImode if the target mode DFmode, but only SImode if the target mode
14679 ;; is SFmode. 14621 ;; is SFmode.
14680 14622
14681 ;; Gcc is slightly more smart about handling normal two address instructions 14623 ;; Gcc is slightly more smart about handling normal two address instructions
14682 ;; so use special patterns for add and mull. 14624 ;; so use special patterns for add and mull.
14625
14626 (define_insn "*fop_xf_comm_i387"
14627 [(set (match_operand:XF 0 "register_operand" "=f")
14628 (match_operator:XF 3 "binary_fp_operator"
14629 [(match_operand:XF 1 "register_operand" "%0")
14630 (match_operand:XF 2 "register_operand" "f")]))]
14631 "TARGET_80387
14632 && COMMUTATIVE_ARITH_P (operands[3])"
14633 "* return output_387_binary_op (insn, operands);"
14634 [(set (attr "type")
14635 (if_then_else (match_operand:XF 3 "mult_operator")
14636 (const_string "fmul")
14637 (const_string "fop")))
14638 (set_attr "mode" "XF")])
14683 14639
14684 (define_insn "*fop_<mode>_comm" 14640 (define_insn "*fop_<mode>_comm"
14685 [(set (match_operand:MODEF 0 "register_operand" "=f,x,v") 14641 [(set (match_operand:MODEF 0 "register_operand" "=f,x,v")
14686 (match_operator:MODEF 3 "binary_fp_operator" 14642 (match_operator:MODEF 3 "binary_fp_operator"
14687 [(match_operand:MODEF 1 "nonimmediate_operand" "%0,0,v") 14643 [(match_operand:MODEF 1 "nonimmediate_operand" "%0,0,v")
14714 (eq_attr "alternative" "0") 14670 (eq_attr "alternative" "0")
14715 (symbol_ref "true") 14671 (symbol_ref "true")
14716 (symbol_ref "false"))))]) 14672 (symbol_ref "false"))))])
14717 14673
14718 (define_insn "*rcpsf2_sse" 14674 (define_insn "*rcpsf2_sse"
14719 [(set (match_operand:SF 0 "register_operand" "=x") 14675 [(set (match_operand:SF 0 "register_operand" "=x,x")
14720 (unspec:SF [(match_operand:SF 1 "nonimmediate_operand" "xm")] 14676 (unspec:SF [(match_operand:SF 1 "nonimmediate_operand" "x,m")]
14721 UNSPEC_RCP))] 14677 UNSPEC_RCP))]
14722 "TARGET_SSE && TARGET_SSE_MATH" 14678 "TARGET_SSE && TARGET_SSE_MATH"
14723 "%vrcpss\t{%1, %d0|%d0, %1}" 14679 "@
14680 %vrcpss\t{%d1, %0|%0, %d1}
14681 %vrcpss\t{%1, %d0|%d0, %1}"
14724 [(set_attr "type" "sse") 14682 [(set_attr "type" "sse")
14725 (set_attr "atom_sse_attr" "rcp") 14683 (set_attr "atom_sse_attr" "rcp")
14726 (set_attr "btver2_sse_attr" "rcp") 14684 (set_attr "btver2_sse_attr" "rcp")
14727 (set_attr "prefix" "maybe_vex") 14685 (set_attr "prefix" "maybe_vex")
14728 (set_attr "mode" "SF")]) 14686 (set_attr "mode" "SF")])
14687
14688 (define_insn "*fop_xf_1_i387"
14689 [(set (match_operand:XF 0 "register_operand" "=f,f")
14690 (match_operator:XF 3 "binary_fp_operator"
14691 [(match_operand:XF 1 "register_operand" "0,f")
14692 (match_operand:XF 2 "register_operand" "f,0")]))]
14693 "TARGET_80387
14694 && !COMMUTATIVE_ARITH_P (operands[3])"
14695 "* return output_387_binary_op (insn, operands);"
14696 [(set (attr "type")
14697 (if_then_else (match_operand:XF 3 "div_operator")
14698 (const_string "fdiv")
14699 (const_string "fop")))
14700 (set_attr "mode" "XF")])
14729 14701
14730 (define_insn "*fop_<mode>_1" 14702 (define_insn "*fop_<mode>_1"
14731 [(set (match_operand:MODEF 0 "register_operand" "=f,f,x,v") 14703 [(set (match_operand:MODEF 0 "register_operand" "=f,f,x,v")
14732 (match_operator:MODEF 3 "binary_fp_operator" 14704 (match_operator:MODEF 3 "binary_fp_operator"
14733 [(match_operand:MODEF 1 14705 [(match_operand:MODEF 1
14761 (if_then_else 14733 (if_then_else
14762 (eq_attr "alternative" "0,1") 14734 (eq_attr "alternative" "0,1")
14763 (symbol_ref "true") 14735 (symbol_ref "true")
14764 (symbol_ref "false"))))]) 14736 (symbol_ref "false"))))])
14765 14737
14766 ;; ??? Add SSE splitters for these! 14738 (define_insn "*fop_<X87MODEF:mode>_2_i387"
14767 (define_insn "*fop_<MODEF:mode>_2_i387" 14739 [(set (match_operand:X87MODEF 0 "register_operand" "=f")
14768 [(set (match_operand:MODEF 0 "register_operand" "=f") 14740 (match_operator:X87MODEF 3 "binary_fp_operator"
14769 (match_operator:MODEF 3 "binary_fp_operator" 14741 [(float:X87MODEF
14770 [(float:MODEF
14771 (match_operand:SWI24 1 "nonimmediate_operand" "m")) 14742 (match_operand:SWI24 1 "nonimmediate_operand" "m"))
14772 (match_operand:MODEF 2 "register_operand" "0")]))] 14743 (match_operand:X87MODEF 2 "register_operand" "0")]))]
14773 "TARGET_80387 && X87_ENABLE_FLOAT (<MODEF:MODE>mode, <SWI24:MODE>mode) 14744 "TARGET_80387 && X87_ENABLE_FLOAT (<X87MODEF:MODE>mode, <SWI24:MODE>mode)
14774 && !(SSE_FLOAT_MODE_P (<MODEF:MODE>mode) && TARGET_SSE_MATH) 14745 && !(SSE_FLOAT_MODE_P (<X87MODEF:MODE>mode) && TARGET_SSE_MATH)
14775 && (TARGET_USE_<SWI24:MODE>MODE_FIOP 14746 && (TARGET_USE_<SWI24:MODE>MODE_FIOP
14776 || optimize_function_for_size_p (cfun))" 14747 || optimize_function_for_size_p (cfun))"
14777 "* return output_387_binary_op (insn, operands);" 14748 "* return output_387_binary_op (insn, operands);"
14778 [(set (attr "type") 14749 [(set (attr "type")
14779 (cond [(match_operand:MODEF 3 "mult_operator") 14750 (cond [(match_operand:X87MODEF 3 "mult_operator")
14780 (const_string "fmul") 14751 (const_string "fmul")
14781 (match_operand:MODEF 3 "div_operator") 14752 (match_operand:X87MODEF 3 "div_operator")
14782 (const_string "fdiv") 14753 (const_string "fdiv")
14783 ] 14754 ]
14784 (const_string "fop"))) 14755 (const_string "fop")))
14785 (set_attr "fp_int_src" "true") 14756 (set_attr "fp_int_src" "true")
14786 (set_attr "mode" "<SWI24:MODE>")]) 14757 (set_attr "mode" "<SWI24:MODE>")])
14787 14758
14788 (define_insn "*fop_<MODEF:mode>_3_i387" 14759 (define_insn "*fop_<X87MODEF:mode>_3_i387"
14789 [(set (match_operand:MODEF 0 "register_operand" "=f") 14760 [(set (match_operand:X87MODEF 0 "register_operand" "=f")
14790 (match_operator:MODEF 3 "binary_fp_operator" 14761 (match_operator:X87MODEF 3 "binary_fp_operator"
14791 [(match_operand:MODEF 1 "register_operand" "0") 14762 [(match_operand:X87MODEF 1 "register_operand" "0")
14792 (float:MODEF 14763 (float:X87MODEF
14793 (match_operand:SWI24 2 "nonimmediate_operand" "m"))]))] 14764 (match_operand:SWI24 2 "nonimmediate_operand" "m"))]))]
14794 "TARGET_80387 && X87_ENABLE_FLOAT (<MODEF:MODE>mode, <SWI24:MODE>mode) 14765 "TARGET_80387 && X87_ENABLE_FLOAT (<X87MODEF:MODE>mode, <SWI24:MODE>mode)
14795 && !(SSE_FLOAT_MODE_P (<MODEF:MODE>mode) && TARGET_SSE_MATH) 14766 && !(SSE_FLOAT_MODE_P (<X87MODEF:MODE>mode) && TARGET_SSE_MATH)
14796 && (TARGET_USE_<SWI24:MODE>MODE_FIOP 14767 && (TARGET_USE_<SWI24:MODE>MODE_FIOP
14797 || optimize_function_for_size_p (cfun))" 14768 || optimize_function_for_size_p (cfun))"
14798 "* return output_387_binary_op (insn, operands);" 14769 "* return output_387_binary_op (insn, operands);"
14799 [(set (attr "type") 14770 [(set (attr "type")
14800 (cond [(match_operand:MODEF 3 "mult_operator") 14771 (cond [(match_operand:X87MODEF 3 "mult_operator")
14801 (const_string "fmul") 14772 (const_string "fmul")
14802 (match_operand:MODEF 3 "div_operator") 14773 (match_operand:X87MODEF 3 "div_operator")
14803 (const_string "fdiv") 14774 (const_string "fdiv")
14804 ] 14775 ]
14805 (const_string "fop"))) 14776 (const_string "fop")))
14806 (set_attr "fp_int_src" "true") 14777 (set_attr "fp_int_src" "true")
14778 (set_attr "mode" "<MODE>")])
14779
14780 (define_insn "*fop_xf_4_i387"
14781 [(set (match_operand:XF 0 "register_operand" "=f,f")
14782 (match_operator:XF 3 "binary_fp_operator"
14783 [(float_extend:XF
14784 (match_operand:MODEF 1 "nonimmediate_operand" "fm,0"))
14785 (match_operand:XF 2 "register_operand" "0,f")]))]
14786 "TARGET_80387"
14787 "* return output_387_binary_op (insn, operands);"
14788 [(set (attr "type")
14789 (cond [(match_operand:XF 3 "mult_operator")
14790 (const_string "fmul")
14791 (match_operand:XF 3 "div_operator")
14792 (const_string "fdiv")
14793 ]
14794 (const_string "fop")))
14807 (set_attr "mode" "<MODE>")]) 14795 (set_attr "mode" "<MODE>")])
14808 14796
14809 (define_insn "*fop_df_4_i387" 14797 (define_insn "*fop_df_4_i387"
14810 [(set (match_operand:DF 0 "register_operand" "=f,f") 14798 [(set (match_operand:DF 0 "register_operand" "=f,f")
14811 (match_operator:DF 3 "binary_fp_operator" 14799 (match_operator:DF 3 "binary_fp_operator"
14814 (match_operand:DF 2 "register_operand" "0,f")]))] 14802 (match_operand:DF 2 "register_operand" "0,f")]))]
14815 "TARGET_80387 && X87_ENABLE_ARITH (DFmode) 14803 "TARGET_80387 && X87_ENABLE_ARITH (DFmode)
14816 && !(SSE_FLOAT_MODE_P (DFmode) && TARGET_SSE_MATH)" 14804 && !(SSE_FLOAT_MODE_P (DFmode) && TARGET_SSE_MATH)"
14817 "* return output_387_binary_op (insn, operands);" 14805 "* return output_387_binary_op (insn, operands);"
14818 [(set (attr "type") 14806 [(set (attr "type")
14819 (cond [(match_operand:DF 3 "mult_operator") 14807 (cond [(match_operand:DF 3 "mult_operator")
14820 (const_string "fmul") 14808 (const_string "fmul")
14821 (match_operand:DF 3 "div_operator") 14809 (match_operand:DF 3 "div_operator")
14822 (const_string "fdiv") 14810 (const_string "fdiv")
14823 ] 14811 ]
14824 (const_string "fop"))) 14812 (const_string "fop")))
14825 (set_attr "mode" "SF")]) 14813 (set_attr "mode" "SF")])
14814
14815 (define_insn "*fop_xf_5_i387"
14816 [(set (match_operand:XF 0 "register_operand" "=f,f")
14817 (match_operator:XF 3 "binary_fp_operator"
14818 [(match_operand:XF 1 "register_operand" "0,f")
14819 (float_extend:XF
14820 (match_operand:MODEF 2 "nonimmediate_operand" "fm,0"))]))]
14821 "TARGET_80387"
14822 "* return output_387_binary_op (insn, operands);"
14823 [(set (attr "type")
14824 (cond [(match_operand:XF 3 "mult_operator")
14825 (const_string "fmul")
14826 (match_operand:XF 3 "div_operator")
14827 (const_string "fdiv")
14828 ]
14829 (const_string "fop")))
14830 (set_attr "mode" "<MODE>")])
14826 14831
14827 (define_insn "*fop_df_5_i387" 14832 (define_insn "*fop_df_5_i387"
14828 [(set (match_operand:DF 0 "register_operand" "=f,f") 14833 [(set (match_operand:DF 0 "register_operand" "=f,f")
14829 (match_operator:DF 3 "binary_fp_operator" 14834 (match_operator:DF 3 "binary_fp_operator"
14830 [(match_operand:DF 1 "register_operand" "0,f") 14835 [(match_operand:DF 1 "register_operand" "0,f")
14832 (match_operand:SF 2 "nonimmediate_operand" "fm,0"))]))] 14837 (match_operand:SF 2 "nonimmediate_operand" "fm,0"))]))]
14833 "TARGET_80387 && X87_ENABLE_ARITH (DFmode) 14838 "TARGET_80387 && X87_ENABLE_ARITH (DFmode)
14834 && !(SSE_FLOAT_MODE_P (DFmode) && TARGET_SSE_MATH)" 14839 && !(SSE_FLOAT_MODE_P (DFmode) && TARGET_SSE_MATH)"
14835 "* return output_387_binary_op (insn, operands);" 14840 "* return output_387_binary_op (insn, operands);"
14836 [(set (attr "type") 14841 [(set (attr "type")
14837 (cond [(match_operand:DF 3 "mult_operator") 14842 (cond [(match_operand:DF 3 "mult_operator")
14838 (const_string "fmul") 14843 (const_string "fmul")
14839 (match_operand:DF 3 "div_operator") 14844 (match_operand:DF 3 "div_operator")
14840 (const_string "fdiv") 14845 (const_string "fdiv")
14841 ] 14846 ]
14842 (const_string "fop"))) 14847 (const_string "fop")))
14843 (set_attr "mode" "SF")]) 14848 (set_attr "mode" "SF")])
14849
14850 (define_insn "*fop_xf_6_i387"
14851 [(set (match_operand:XF 0 "register_operand" "=f,f")
14852 (match_operator:XF 3 "binary_fp_operator"
14853 [(float_extend:XF
14854 (match_operand:MODEF 1 "register_operand" "0,f"))
14855 (float_extend:XF
14856 (match_operand:MODEF 2 "nonimmediate_operand" "fm,0"))]))]
14857 "TARGET_80387"
14858 "* return output_387_binary_op (insn, operands);"
14859 [(set (attr "type")
14860 (cond [(match_operand:XF 3 "mult_operator")
14861 (const_string "fmul")
14862 (match_operand:XF 3 "div_operator")
14863 (const_string "fdiv")
14864 ]
14865 (const_string "fop")))
14866 (set_attr "mode" "<MODE>")])
14844 14867
14845 (define_insn "*fop_df_6_i387" 14868 (define_insn "*fop_df_6_i387"
14846 [(set (match_operand:DF 0 "register_operand" "=f,f") 14869 [(set (match_operand:DF 0 "register_operand" "=f,f")
14847 (match_operator:DF 3 "binary_fp_operator" 14870 (match_operator:DF 3 "binary_fp_operator"
14848 [(float_extend:DF 14871 [(float_extend:DF
14851 (match_operand:SF 2 "nonimmediate_operand" "fm,0"))]))] 14874 (match_operand:SF 2 "nonimmediate_operand" "fm,0"))]))]
14852 "TARGET_80387 && X87_ENABLE_ARITH (DFmode) 14875 "TARGET_80387 && X87_ENABLE_ARITH (DFmode)
14853 && !(SSE_FLOAT_MODE_P (DFmode) && TARGET_SSE_MATH)" 14876 && !(SSE_FLOAT_MODE_P (DFmode) && TARGET_SSE_MATH)"
14854 "* return output_387_binary_op (insn, operands);" 14877 "* return output_387_binary_op (insn, operands);"
14855 [(set (attr "type") 14878 [(set (attr "type")
14856 (cond [(match_operand:DF 3 "mult_operator") 14879 (cond [(match_operand:DF 3 "mult_operator")
14857 (const_string "fmul") 14880 (const_string "fmul")
14858 (match_operand:DF 3 "div_operator") 14881 (match_operand:DF 3 "div_operator")
14859 (const_string "fdiv") 14882 (const_string "fdiv")
14860 ] 14883 ]
14861 (const_string "fop"))) 14884 (const_string "fop")))
14862 (set_attr "mode" "SF")]) 14885 (set_attr "mode" "SF")])
14863
14864 (define_insn "*fop_xf_comm_i387"
14865 [(set (match_operand:XF 0 "register_operand" "=f")
14866 (match_operator:XF 3 "binary_fp_operator"
14867 [(match_operand:XF 1 "register_operand" "%0")
14868 (match_operand:XF 2 "register_operand" "f")]))]
14869 "TARGET_80387
14870 && COMMUTATIVE_ARITH_P (operands[3])"
14871 "* return output_387_binary_op (insn, operands);"
14872 [(set (attr "type")
14873 (if_then_else (match_operand:XF 3 "mult_operator")
14874 (const_string "fmul")
14875 (const_string "fop")))
14876 (set_attr "mode" "XF")])
14877
14878 (define_insn "*fop_xf_1_i387"
14879 [(set (match_operand:XF 0 "register_operand" "=f,f")
14880 (match_operator:XF 3 "binary_fp_operator"
14881 [(match_operand:XF 1 "register_operand" "0,f")
14882 (match_operand:XF 2 "register_operand" "f,0")]))]
14883 "TARGET_80387
14884 && !COMMUTATIVE_ARITH_P (operands[3])"
14885 "* return output_387_binary_op (insn, operands);"
14886 [(set (attr "type")
14887 (if_then_else (match_operand:XF 3 "div_operator")
14888 (const_string "fdiv")
14889 (const_string "fop")))
14890 (set_attr "mode" "XF")])
14891
14892 (define_insn "*fop_xf_2_i387"
14893 [(set (match_operand:XF 0 "register_operand" "=f")
14894 (match_operator:XF 3 "binary_fp_operator"
14895 [(float:XF
14896 (match_operand:SWI24 1 "nonimmediate_operand" "m"))
14897 (match_operand:XF 2 "register_operand" "0")]))]
14898 "TARGET_80387
14899 && (TARGET_USE_<MODE>MODE_FIOP || optimize_function_for_size_p (cfun))"
14900 "* return output_387_binary_op (insn, operands);"
14901 [(set (attr "type")
14902 (cond [(match_operand:XF 3 "mult_operator")
14903 (const_string "fmul")
14904 (match_operand:XF 3 "div_operator")
14905 (const_string "fdiv")
14906 ]
14907 (const_string "fop")))
14908 (set_attr "fp_int_src" "true")
14909 (set_attr "mode" "<MODE>")])
14910
14911 (define_insn "*fop_xf_3_i387"
14912 [(set (match_operand:XF 0 "register_operand" "=f")
14913 (match_operator:XF 3 "binary_fp_operator"
14914 [(match_operand:XF 1 "register_operand" "0")
14915 (float:XF
14916 (match_operand:SWI24 2 "nonimmediate_operand" "m"))]))]
14917 "TARGET_80387
14918 && (TARGET_USE_<MODE>MODE_FIOP || optimize_function_for_size_p (cfun))"
14919 "* return output_387_binary_op (insn, operands);"
14920 [(set (attr "type")
14921 (cond [(match_operand:XF 3 "mult_operator")
14922 (const_string "fmul")
14923 (match_operand:XF 3 "div_operator")
14924 (const_string "fdiv")
14925 ]
14926 (const_string "fop")))
14927 (set_attr "fp_int_src" "true")
14928 (set_attr "mode" "<MODE>")])
14929
14930 (define_insn "*fop_xf_4_i387"
14931 [(set (match_operand:XF 0 "register_operand" "=f,f")
14932 (match_operator:XF 3 "binary_fp_operator"
14933 [(float_extend:XF
14934 (match_operand:MODEF 1 "nonimmediate_operand" "fm,0"))
14935 (match_operand:XF 2 "register_operand" "0,f")]))]
14936 "TARGET_80387"
14937 "* return output_387_binary_op (insn, operands);"
14938 [(set (attr "type")
14939 (cond [(match_operand:XF 3 "mult_operator")
14940 (const_string "fmul")
14941 (match_operand:XF 3 "div_operator")
14942 (const_string "fdiv")
14943 ]
14944 (const_string "fop")))
14945 (set_attr "mode" "<MODE>")])
14946
14947 (define_insn "*fop_xf_5_i387"
14948 [(set (match_operand:XF 0 "register_operand" "=f,f")
14949 (match_operator:XF 3 "binary_fp_operator"
14950 [(match_operand:XF 1 "register_operand" "0,f")
14951 (float_extend:XF
14952 (match_operand:MODEF 2 "nonimmediate_operand" "fm,0"))]))]
14953 "TARGET_80387"
14954 "* return output_387_binary_op (insn, operands);"
14955 [(set (attr "type")
14956 (cond [(match_operand:XF 3 "mult_operator")
14957 (const_string "fmul")
14958 (match_operand:XF 3 "div_operator")
14959 (const_string "fdiv")
14960 ]
14961 (const_string "fop")))
14962 (set_attr "mode" "<MODE>")])
14963
14964 (define_insn "*fop_xf_6_i387"
14965 [(set (match_operand:XF 0 "register_operand" "=f,f")
14966 (match_operator:XF 3 "binary_fp_operator"
14967 [(float_extend:XF
14968 (match_operand:MODEF 1 "register_operand" "0,f"))
14969 (float_extend:XF
14970 (match_operand:MODEF 2 "nonimmediate_operand" "fm,0"))]))]
14971 "TARGET_80387"
14972 "* return output_387_binary_op (insn, operands);"
14973 [(set (attr "type")
14974 (cond [(match_operand:XF 3 "mult_operator")
14975 (const_string "fmul")
14976 (match_operand:XF 3 "div_operator")
14977 (const_string "fdiv")
14978 ]
14979 (const_string "fop")))
14980 (set_attr "mode" "<MODE>")])
14981 14886
14982 ;; FPU special functions. 14887 ;; FPU special functions.
14983 14888
14984 ;; This pattern implements a no-op XFmode truncation for 14889 ;; This pattern implements a no-op XFmode truncation for
14985 ;; all fancy i386 XFmode math functions. 14890 ;; all fancy i386 XFmode math functions.
14986 14891
14987 (define_insn "truncxf<mode>2_i387_noop_unspec" 14892 (define_insn "truncxf<mode>2_i387_noop_unspec"
14988 [(set (match_operand:MODEF 0 "register_operand" "=f") 14893 [(set (match_operand:MODEF 0 "nonimmediate_operand" "=mf")
14989 (unspec:MODEF [(match_operand:XF 1 "register_operand" "f")] 14894 (unspec:MODEF [(match_operand:XF 1 "register_operand" "f")]
14990 UNSPEC_TRUNC_NOOP))] 14895 UNSPEC_TRUNC_NOOP))]
14991 "TARGET_USE_FANCY_MATH_387" 14896 "TARGET_USE_FANCY_MATH_387"
14992 "* return output_387_reg_move (insn, operands);" 14897 "* return output_387_reg_move (insn, operands);"
14993 [(set_attr "type" "fmov") 14898 [(set_attr "type" "fmov")
15002 (set_attr "mode" "XF") 14907 (set_attr "mode" "XF")
15003 (set_attr "athlon_decode" "direct") 14908 (set_attr "athlon_decode" "direct")
15004 (set_attr "amdfam10_decode" "direct") 14909 (set_attr "amdfam10_decode" "direct")
15005 (set_attr "bdver1_decode" "direct")]) 14910 (set_attr "bdver1_decode" "direct")])
15006 14911
15007 (define_insn "sqrt_extend<mode>xf2_i387"
15008 [(set (match_operand:XF 0 "register_operand" "=f")
15009 (sqrt:XF
15010 (float_extend:XF
15011 (match_operand:MODEF 1 "register_operand" "0"))))]
15012 "TARGET_USE_FANCY_MATH_387"
15013 "fsqrt"
15014 [(set_attr "type" "fpspc")
15015 (set_attr "mode" "XF")
15016 (set_attr "athlon_decode" "direct")
15017 (set_attr "amdfam10_decode" "direct")
15018 (set_attr "bdver1_decode" "direct")])
15019
15020 (define_insn "*rsqrtsf2_sse" 14912 (define_insn "*rsqrtsf2_sse"
15021 [(set (match_operand:SF 0 "register_operand" "=x") 14913 [(set (match_operand:SF 0 "register_operand" "=x,x")
15022 (unspec:SF [(match_operand:SF 1 "nonimmediate_operand" "xm")] 14914 (unspec:SF [(match_operand:SF 1 "nonimmediate_operand" "x,m")]
15023 UNSPEC_RSQRT))] 14915 UNSPEC_RSQRT))]
15024 "TARGET_SSE && TARGET_SSE_MATH" 14916 "TARGET_SSE && TARGET_SSE_MATH"
15025 "%vrsqrtss\t{%1, %d0|%d0, %1}" 14917 "@
14918 %vrsqrtss\t{%d1, %0|%0, %d1}
14919 %vrsqrtss\t{%1, %d0|%d0, %1}"
15026 [(set_attr "type" "sse") 14920 [(set_attr "type" "sse")
15027 (set_attr "atom_sse_attr" "rcp") 14921 (set_attr "atom_sse_attr" "rcp")
15028 (set_attr "btver2_sse_attr" "rcp") 14922 (set_attr "btver2_sse_attr" "rcp")
15029 (set_attr "prefix" "maybe_vex") 14923 (set_attr "prefix" "maybe_vex")
15030 (set_attr "mode" "SF")]) 14924 (set_attr "mode" "SF")])
15038 ix86_emit_swsqrtsf (operands[0], operands[1], SFmode, 1); 14932 ix86_emit_swsqrtsf (operands[0], operands[1], SFmode, 1);
15039 DONE; 14933 DONE;
15040 }) 14934 })
15041 14935
15042 (define_insn "*sqrt<mode>2_sse" 14936 (define_insn "*sqrt<mode>2_sse"
15043 [(set (match_operand:MODEF 0 "register_operand" "=v") 14937 [(set (match_operand:MODEF 0 "register_operand" "=v,v")
15044 (sqrt:MODEF 14938 (sqrt:MODEF
15045 (match_operand:MODEF 1 "nonimmediate_operand" "vm")))] 14939 (match_operand:MODEF 1 "nonimmediate_operand" "v,m")))]
15046 "SSE_FLOAT_MODE_P (<MODE>mode) && TARGET_SSE_MATH" 14940 "SSE_FLOAT_MODE_P (<MODE>mode) && TARGET_SSE_MATH"
15047 "%vsqrt<ssemodesuffix>\t{%1, %d0|%d0, %1}" 14941 "@
14942 %vsqrt<ssemodesuffix>\t{%d1, %0|%0, %d1}
14943 %vsqrt<ssemodesuffix>\t{%1, %d0|%d0, %1}"
15048 [(set_attr "type" "sse") 14944 [(set_attr "type" "sse")
15049 (set_attr "atom_sse_attr" "sqrt") 14945 (set_attr "atom_sse_attr" "sqrt")
15050 (set_attr "btver2_sse_attr" "sqrt") 14946 (set_attr "btver2_sse_attr" "sqrt")
15051 (set_attr "prefix" "maybe_vex") 14947 (set_attr "prefix" "maybe_vex")
15052 (set_attr "mode" "<MODE>") 14948 (set_attr "mode" "<MODE>")
15073 } 14969 }
15074 14970
15075 if (!(SSE_FLOAT_MODE_P (<MODE>mode) && TARGET_SSE_MATH)) 14971 if (!(SSE_FLOAT_MODE_P (<MODE>mode) && TARGET_SSE_MATH))
15076 { 14972 {
15077 rtx op0 = gen_reg_rtx (XFmode); 14973 rtx op0 = gen_reg_rtx (XFmode);
15078 rtx op1 = force_reg (<MODE>mode, operands[1]); 14974 rtx op1 = gen_reg_rtx (XFmode);
15079 14975
15080 emit_insn (gen_sqrt_extend<mode>xf2_i387 (op0, op1)); 14976 emit_insn (gen_extend<mode>xf2 (op1, operands[1]));
14977 emit_insn (gen_sqrtxf2 (op0, op1));
15081 emit_insn (gen_truncxf<mode>2_i387_noop_unspec (operands[0], op0)); 14978 emit_insn (gen_truncxf<mode>2_i387_noop_unspec (operands[0], op0));
15082 DONE; 14979 DONE;
15083 } 14980 }
15084 }) 14981 })
14982
14983 (define_insn "x86_fnstsw_1"
14984 [(set (match_operand:HI 0 "register_operand" "=a")
14985 (unspec:HI [(reg:CCFP FPSR_REG)] UNSPEC_FNSTSW))]
14986 "TARGET_80387"
14987 "fnstsw\t%0"
14988 [(set_attr "length" "2")
14989 (set_attr "mode" "SI")
14990 (set_attr "unit" "i387")])
15085 14991
15086 (define_insn "fpremxf4_i387" 14992 (define_insn "fpremxf4_i387"
15087 [(set (match_operand:XF 0 "register_operand" "=f") 14993 [(set (match_operand:XF 0 "register_operand" "=f")
15088 (unspec:XF [(match_operand:XF 2 "register_operand" "0") 14994 (unspec:XF [(match_operand:XF 2 "register_operand" "0")
15089 (match_operand:XF 3 "register_operand" "1")] 14995 (match_operand:XF 3 "register_operand" "1")]
15090 UNSPEC_FPREM_F)) 14996 UNSPEC_FPREM_F))
15091 (set (match_operand:XF 1 "register_operand" "=u") 14997 (set (match_operand:XF 1 "register_operand" "=f")
15092 (unspec:XF [(match_dup 2) (match_dup 3)] 14998 (unspec:XF [(match_dup 2) (match_dup 3)]
15093 UNSPEC_FPREM_U)) 14999 UNSPEC_FPREM_U))
15094 (set (reg:CCFP FPSR_REG) 15000 (set (reg:CCFP FPSR_REG)
15095 (unspec:CCFP [(match_dup 2) (match_dup 3)] 15001 (unspec:CCFP [(match_dup 2) (match_dup 3)]
15096 UNSPEC_C2_FLAG))] 15002 UNSPEC_C2_FLAG))]
15161 (define_insn "fprem1xf4_i387" 15067 (define_insn "fprem1xf4_i387"
15162 [(set (match_operand:XF 0 "register_operand" "=f") 15068 [(set (match_operand:XF 0 "register_operand" "=f")
15163 (unspec:XF [(match_operand:XF 2 "register_operand" "0") 15069 (unspec:XF [(match_operand:XF 2 "register_operand" "0")
15164 (match_operand:XF 3 "register_operand" "1")] 15070 (match_operand:XF 3 "register_operand" "1")]
15165 UNSPEC_FPREM1_F)) 15071 UNSPEC_FPREM1_F))
15166 (set (match_operand:XF 1 "register_operand" "=u") 15072 (set (match_operand:XF 1 "register_operand" "=f")
15167 (unspec:XF [(match_dup 2) (match_dup 3)] 15073 (unspec:XF [(match_dup 2) (match_dup 3)]
15168 UNSPEC_FPREM1_U)) 15074 UNSPEC_FPREM1_U))
15169 (set (reg:CCFP FPSR_REG) 15075 (set (reg:CCFP FPSR_REG)
15170 (unspec:CCFP [(match_dup 2) (match_dup 3)] 15076 (unspec:CCFP [(match_dup 2) (match_dup 3)]
15171 UNSPEC_C2_FLAG))] 15077 UNSPEC_C2_FLAG))]
15240 15146
15241 (define_int_attr sincos 15147 (define_int_attr sincos
15242 [(UNSPEC_SIN "sin") 15148 [(UNSPEC_SIN "sin")
15243 (UNSPEC_COS "cos")]) 15149 (UNSPEC_COS "cos")])
15244 15150
15245 (define_insn "*<sincos>xf2_i387" 15151 (define_insn "<sincos>xf2"
15246 [(set (match_operand:XF 0 "register_operand" "=f") 15152 [(set (match_operand:XF 0 "register_operand" "=f")
15247 (unspec:XF [(match_operand:XF 1 "register_operand" "0")] 15153 (unspec:XF [(match_operand:XF 1 "register_operand" "0")]
15248 SINCOS))] 15154 SINCOS))]
15249 "TARGET_USE_FANCY_MATH_387 15155 "TARGET_USE_FANCY_MATH_387
15250 && flag_unsafe_math_optimizations" 15156 && flag_unsafe_math_optimizations"
15251 "f<sincos>" 15157 "f<sincos>"
15252 [(set_attr "type" "fpspc") 15158 [(set_attr "type" "fpspc")
15253 (set_attr "znver1_decode" "vector") 15159 (set_attr "znver1_decode" "vector")
15254 (set_attr "mode" "XF")]) 15160 (set_attr "mode" "XF")])
15255 15161
15256 (define_insn "*<sincos>_extend<mode>xf2_i387" 15162 (define_expand "<sincos><mode>2"
15257 [(set (match_operand:XF 0 "register_operand" "=f") 15163 [(set (match_operand:MODEF 0 "register_operand")
15258 (unspec:XF [(float_extend:XF 15164 (unspec:MODEF [(match_operand:MODEF 1 "general_operand")]
15259 (match_operand:MODEF 1 "register_operand" "0"))] 15165 SINCOS))]
15260 SINCOS))]
15261 "TARGET_USE_FANCY_MATH_387 15166 "TARGET_USE_FANCY_MATH_387
15262 && (!(SSE_FLOAT_MODE_P (<MODE>mode) && TARGET_SSE_MATH) 15167 && (!(SSE_FLOAT_MODE_P (<MODE>mode) && TARGET_SSE_MATH)
15263 || TARGET_MIX_SSE_I387) 15168 || TARGET_MIX_SSE_I387)
15264 && flag_unsafe_math_optimizations" 15169 && flag_unsafe_math_optimizations"
15265 "f<sincos>" 15170 {
15266 [(set_attr "type" "fpspc") 15171 rtx op0 = gen_reg_rtx (XFmode);
15267 (set_attr "znver1_decode" "vector") 15172 rtx op1 = gen_reg_rtx (XFmode);
15268 (set_attr "mode" "XF")]) 15173
15269 15174 emit_insn (gen_extend<mode>xf2 (op1, operands[1]));
15270 ;; When sincos pattern is defined, sin and cos builtin functions will be 15175 emit_insn (gen_<sincos>xf2 (op0, op1));
15271 ;; expanded to sincos pattern with one of its outputs left unused. 15176 emit_insn (gen_truncxf<mode>2 (operands[0], op0));
15272 ;; CSE pass will figure out if two sincos patterns can be combined, 15177 DONE;
15273 ;; otherwise sincos pattern will be split back to sin or cos pattern, 15178 })
15274 ;; depending on the unused output.
15275 15179
15276 (define_insn "sincosxf3" 15180 (define_insn "sincosxf3"
15277 [(set (match_operand:XF 0 "register_operand" "=f") 15181 [(set (match_operand:XF 0 "register_operand" "=f")
15278 (unspec:XF [(match_operand:XF 2 "register_operand" "0")] 15182 (unspec:XF [(match_operand:XF 2 "register_operand" "0")]
15279 UNSPEC_SINCOS_COS)) 15183 UNSPEC_SINCOS_COS))
15280 (set (match_operand:XF 1 "register_operand" "=u") 15184 (set (match_operand:XF 1 "register_operand" "=f")
15281 (unspec:XF [(match_dup 2)] UNSPEC_SINCOS_SIN))] 15185 (unspec:XF [(match_dup 2)] UNSPEC_SINCOS_SIN))]
15282 "TARGET_USE_FANCY_MATH_387 15186 "TARGET_USE_FANCY_MATH_387
15283 && flag_unsafe_math_optimizations" 15187 && flag_unsafe_math_optimizations"
15284 "fsincos" 15188 "fsincos"
15285 [(set_attr "type" "fpspc") 15189 [(set_attr "type" "fpspc")
15286 (set_attr "znver1_decode" "vector") 15190 (set_attr "znver1_decode" "vector")
15287 (set_attr "mode" "XF")]) 15191 (set_attr "mode" "XF")])
15288 15192
15289 (define_split 15193 (define_expand "sincos<mode>3"
15290 [(set (match_operand:XF 0 "register_operand") 15194 [(use (match_operand:MODEF 0 "register_operand"))
15291 (unspec:XF [(match_operand:XF 2 "register_operand")] 15195 (use (match_operand:MODEF 1 "register_operand"))
15292 UNSPEC_SINCOS_COS)) 15196 (use (match_operand:MODEF 2 "general_operand"))]
15293 (set (match_operand:XF 1 "register_operand")
15294 (unspec:XF [(match_dup 2)] UNSPEC_SINCOS_SIN))]
15295 "find_regno_note (insn, REG_UNUSED, REGNO (operands[0]))
15296 && can_create_pseudo_p ()"
15297 [(set (match_dup 1) (unspec:XF [(match_dup 2)] UNSPEC_SIN))])
15298
15299 (define_split
15300 [(set (match_operand:XF 0 "register_operand")
15301 (unspec:XF [(match_operand:XF 2 "register_operand")]
15302 UNSPEC_SINCOS_COS))
15303 (set (match_operand:XF 1 "register_operand")
15304 (unspec:XF [(match_dup 2)] UNSPEC_SINCOS_SIN))]
15305 "find_regno_note (insn, REG_UNUSED, REGNO (operands[1]))
15306 && can_create_pseudo_p ()"
15307 [(set (match_dup 0) (unspec:XF [(match_dup 2)] UNSPEC_COS))])
15308
15309 (define_insn "sincos_extend<mode>xf3_i387"
15310 [(set (match_operand:XF 0 "register_operand" "=f")
15311 (unspec:XF [(float_extend:XF
15312 (match_operand:MODEF 2 "register_operand" "0"))]
15313 UNSPEC_SINCOS_COS))
15314 (set (match_operand:XF 1 "register_operand" "=u")
15315 (unspec:XF [(float_extend:XF (match_dup 2))] UNSPEC_SINCOS_SIN))]
15316 "TARGET_USE_FANCY_MATH_387 15197 "TARGET_USE_FANCY_MATH_387
15317 && (!(SSE_FLOAT_MODE_P (<MODE>mode) && TARGET_SSE_MATH) 15198 && (!(SSE_FLOAT_MODE_P (<MODE>mode) && TARGET_SSE_MATH)
15318 || TARGET_MIX_SSE_I387) 15199 || TARGET_MIX_SSE_I387)
15319 && flag_unsafe_math_optimizations" 15200 && flag_unsafe_math_optimizations"
15320 "fsincos"
15321 [(set_attr "type" "fpspc")
15322 (set_attr "znver1_decode" "vector")
15323 (set_attr "mode" "XF")])
15324
15325 (define_split
15326 [(set (match_operand:XF 0 "register_operand")
15327 (unspec:XF [(float_extend:XF
15328 (match_operand:MODEF 2 "register_operand"))]
15329 UNSPEC_SINCOS_COS))
15330 (set (match_operand:XF 1 "register_operand")
15331 (unspec:XF [(float_extend:XF (match_dup 2))] UNSPEC_SINCOS_SIN))]
15332 "find_regno_note (insn, REG_UNUSED, REGNO (operands[0]))
15333 && can_create_pseudo_p ()"
15334 [(set (match_dup 1)
15335 (unspec:XF [(float_extend:XF (match_dup 2))] UNSPEC_SIN))])
15336
15337 (define_split
15338 [(set (match_operand:XF 0 "register_operand")
15339 (unspec:XF [(float_extend:XF
15340 (match_operand:MODEF 2 "register_operand"))]
15341 UNSPEC_SINCOS_COS))
15342 (set (match_operand:XF 1 "register_operand")
15343 (unspec:XF [(float_extend:XF (match_dup 2))] UNSPEC_SINCOS_SIN))]
15344 "find_regno_note (insn, REG_UNUSED, REGNO (operands[1]))
15345 && can_create_pseudo_p ()"
15346 [(set (match_dup 0)
15347 (unspec:XF [(float_extend:XF (match_dup 2))] UNSPEC_COS))])
15348
15349 (define_expand "sincos<mode>3"
15350 [(use (match_operand:MODEF 0 "register_operand"))
15351 (use (match_operand:MODEF 1 "register_operand"))
15352 (use (match_operand:MODEF 2 "register_operand"))]
15353 "TARGET_USE_FANCY_MATH_387
15354 && (!(SSE_FLOAT_MODE_P (<MODE>mode) && TARGET_SSE_MATH)
15355 || TARGET_MIX_SSE_I387)
15356 && flag_unsafe_math_optimizations"
15357 { 15201 {
15358 rtx op0 = gen_reg_rtx (XFmode); 15202 rtx op0 = gen_reg_rtx (XFmode);
15359 rtx op1 = gen_reg_rtx (XFmode); 15203 rtx op1 = gen_reg_rtx (XFmode);
15360 15204 rtx op2 = gen_reg_rtx (XFmode);
15361 emit_insn (gen_sincos_extend<mode>xf3_i387 (op0, op1, operands[2])); 15205
15362 emit_insn (gen_truncxf<mode>2_i387_noop (operands[0], op0)); 15206 emit_insn (gen_extend<mode>xf2 (op2, operands[2]));
15363 emit_insn (gen_truncxf<mode>2_i387_noop (operands[1], op1)); 15207 emit_insn (gen_sincosxf3 (op0, op1, op2));
15208 emit_insn (gen_truncxf<mode>2 (operands[0], op0));
15209 emit_insn (gen_truncxf<mode>2 (operands[1], op1));
15364 DONE; 15210 DONE;
15365 }) 15211 })
15366 15212
15367 (define_insn "fptanxf4_i387" 15213 (define_insn "fptanxf4_i387"
15368 [(set (match_operand:XF 0 "register_operand" "=f") 15214 [(set (match_operand:SF 0 "register_operand" "=f")
15369 (match_operand:XF 3 "const_double_operand" "F")) 15215 (match_operand:SF 3 "const1_operand"))
15370 (set (match_operand:XF 1 "register_operand" "=u") 15216 (set (match_operand:XF 1 "register_operand" "=f")
15371 (unspec:XF [(match_operand:XF 2 "register_operand" "0")] 15217 (unspec:XF [(match_operand:XF 2 "register_operand" "0")]
15372 UNSPEC_TAN))] 15218 UNSPEC_TAN))]
15373 "TARGET_USE_FANCY_MATH_387 15219 "TARGET_USE_FANCY_MATH_387
15374 && flag_unsafe_math_optimizations 15220 && flag_unsafe_math_optimizations"
15375 && standard_80387_constant_p (operands[3]) == 2"
15376 "fptan"
15377 [(set_attr "type" "fpspc")
15378 (set_attr "znver1_decode" "vector")
15379 (set_attr "mode" "XF")])
15380
15381 (define_insn "fptan_extend<mode>xf4_i387"
15382 [(set (match_operand:MODEF 0 "register_operand" "=f")
15383 (match_operand:MODEF 3 "const_double_operand" "F"))
15384 (set (match_operand:XF 1 "register_operand" "=u")
15385 (unspec:XF [(float_extend:XF
15386 (match_operand:MODEF 2 "register_operand" "0"))]
15387 UNSPEC_TAN))]
15388 "TARGET_USE_FANCY_MATH_387
15389 && (!(SSE_FLOAT_MODE_P (<MODE>mode) && TARGET_SSE_MATH)
15390 || TARGET_MIX_SSE_I387)
15391 && flag_unsafe_math_optimizations
15392 && standard_80387_constant_p (operands[3]) == 2"
15393 "fptan" 15221 "fptan"
15394 [(set_attr "type" "fpspc") 15222 [(set_attr "type" "fpspc")
15395 (set_attr "znver1_decode" "vector") 15223 (set_attr "znver1_decode" "vector")
15396 (set_attr "mode" "XF")]) 15224 (set_attr "mode" "XF")])
15397 15225
15399 [(use (match_operand:XF 0 "register_operand")) 15227 [(use (match_operand:XF 0 "register_operand"))
15400 (use (match_operand:XF 1 "register_operand"))] 15228 (use (match_operand:XF 1 "register_operand"))]
15401 "TARGET_USE_FANCY_MATH_387 15229 "TARGET_USE_FANCY_MATH_387
15402 && flag_unsafe_math_optimizations" 15230 && flag_unsafe_math_optimizations"
15403 { 15231 {
15404 rtx one = gen_reg_rtx (XFmode); 15232 rtx one = gen_reg_rtx (SFmode);
15405 rtx op2 = CONST1_RTX (XFmode); /* fld1 */ 15233 emit_insn (gen_fptanxf4_i387 (one, operands[0], operands[1],
15406 15234 CONST1_RTX (SFmode)));
15407 emit_insn (gen_fptanxf4_i387 (one, operands[0], operands[1], op2));
15408 DONE; 15235 DONE;
15409 }) 15236 })
15410 15237
15411 (define_expand "tan<mode>2" 15238 (define_expand "tan<mode>2"
15412 [(use (match_operand:MODEF 0 "register_operand")) 15239 [(use (match_operand:MODEF 0 "register_operand"))
15413 (use (match_operand:MODEF 1 "register_operand"))] 15240 (use (match_operand:MODEF 1 "general_operand"))]
15414 "TARGET_USE_FANCY_MATH_387 15241 "TARGET_USE_FANCY_MATH_387
15415 && (!(SSE_FLOAT_MODE_P (<MODE>mode) && TARGET_SSE_MATH) 15242 && (!(SSE_FLOAT_MODE_P (<MODE>mode) && TARGET_SSE_MATH)
15416 || TARGET_MIX_SSE_I387) 15243 || TARGET_MIX_SSE_I387)
15417 && flag_unsafe_math_optimizations" 15244 && flag_unsafe_math_optimizations"
15418 { 15245 {
15419 rtx op0 = gen_reg_rtx (XFmode); 15246 rtx op0 = gen_reg_rtx (XFmode);
15420 15247 rtx op1 = gen_reg_rtx (XFmode);
15421 rtx one = gen_reg_rtx (<MODE>mode); 15248
15422 rtx op2 = CONST1_RTX (<MODE>mode); /* fld1 */ 15249 emit_insn (gen_extend<mode>xf2 (op1, operands[1]));
15423 15250 emit_insn (gen_tanxf2 (op0, op1));
15424 emit_insn (gen_fptan_extend<mode>xf4_i387 (one, op0, 15251 emit_insn (gen_truncxf<mode>2 (operands[0], op0));
15425 operands[1], op2));
15426 emit_insn (gen_truncxf<mode>2_i387_noop (operands[0], op0));
15427 DONE; 15252 DONE;
15428 }) 15253 })
15429 15254
15430 (define_insn "*fpatanxf3_i387" 15255 (define_insn "atan2xf3"
15431 [(set (match_operand:XF 0 "register_operand" "=f") 15256 [(set (match_operand:XF 0 "register_operand" "=f")
15432 (unspec:XF [(match_operand:XF 1 "register_operand" "0") 15257 (unspec:XF [(match_operand:XF 1 "register_operand" "0")
15433 (match_operand:XF 2 "register_operand" "u")] 15258 (match_operand:XF 2 "register_operand" "f")]
15434 UNSPEC_FPATAN)) 15259 UNSPEC_FPATAN))
15435 (clobber (match_scratch:XF 3 "=2"))] 15260 (clobber (match_scratch:XF 3 "=2"))]
15436 "TARGET_USE_FANCY_MATH_387 15261 "TARGET_USE_FANCY_MATH_387
15437 && flag_unsafe_math_optimizations" 15262 && flag_unsafe_math_optimizations"
15438 "fpatan" 15263 "fpatan"
15439 [(set_attr "type" "fpspc") 15264 [(set_attr "type" "fpspc")
15440 (set_attr "znver1_decode" "vector") 15265 (set_attr "znver1_decode" "vector")
15441 (set_attr "mode" "XF")]) 15266 (set_attr "mode" "XF")])
15442 15267
15443 (define_insn "fpatan_extend<mode>xf3_i387" 15268 (define_expand "atan2<mode>3"
15444 [(set (match_operand:XF 0 "register_operand" "=f") 15269 [(use (match_operand:MODEF 0 "register_operand"))
15445 (unspec:XF [(float_extend:XF 15270 (use (match_operand:MODEF 1 "general_operand"))
15446 (match_operand:MODEF 1 "register_operand" "0")) 15271 (use (match_operand:MODEF 2 "general_operand"))]
15447 (float_extend:XF
15448 (match_operand:MODEF 2 "register_operand" "u"))]
15449 UNSPEC_FPATAN))
15450 (clobber (match_scratch:XF 3 "=2"))]
15451 "TARGET_USE_FANCY_MATH_387 15272 "TARGET_USE_FANCY_MATH_387
15452 && (!(SSE_FLOAT_MODE_P (<MODE>mode) && TARGET_SSE_MATH) 15273 && (!(SSE_FLOAT_MODE_P (<MODE>mode) && TARGET_SSE_MATH)
15453 || TARGET_MIX_SSE_I387) 15274 || TARGET_MIX_SSE_I387)
15454 && flag_unsafe_math_optimizations" 15275 && flag_unsafe_math_optimizations"
15455 "fpatan"
15456 [(set_attr "type" "fpspc")
15457 (set_attr "znver1_decode" "vector")
15458 (set_attr "mode" "XF")])
15459
15460 (define_expand "atan2xf3"
15461 [(parallel [(set (match_operand:XF 0 "register_operand")
15462 (unspec:XF [(match_operand:XF 2 "register_operand")
15463 (match_operand:XF 1 "register_operand")]
15464 UNSPEC_FPATAN))
15465 (clobber (match_scratch:XF 3))])]
15466 "TARGET_USE_FANCY_MATH_387
15467 && flag_unsafe_math_optimizations")
15468
15469 (define_expand "atan2<mode>3"
15470 [(use (match_operand:MODEF 0 "register_operand"))
15471 (use (match_operand:MODEF 1 "register_operand"))
15472 (use (match_operand:MODEF 2 "register_operand"))]
15473 "TARGET_USE_FANCY_MATH_387
15474 && (!(SSE_FLOAT_MODE_P (<MODE>mode) && TARGET_SSE_MATH)
15475 || TARGET_MIX_SSE_I387)
15476 && flag_unsafe_math_optimizations"
15477 { 15276 {
15478 rtx op0 = gen_reg_rtx (XFmode); 15277 rtx op0 = gen_reg_rtx (XFmode);
15479 15278 rtx op1 = gen_reg_rtx (XFmode);
15480 emit_insn (gen_fpatan_extend<mode>xf3_i387 (op0, operands[2], operands[1])); 15279 rtx op2 = gen_reg_rtx (XFmode);
15481 emit_insn (gen_truncxf<mode>2_i387_noop (operands[0], op0)); 15280
15281 emit_insn (gen_extend<mode>xf2 (op2, operands[2]));
15282 emit_insn (gen_extend<mode>xf2 (op1, operands[1]));
15283
15284 emit_insn (gen_atan2xf3 (op0, op2, op1));
15285 emit_insn (gen_truncxf<mode>2 (operands[0], op0));
15482 DONE; 15286 DONE;
15483 }) 15287 })
15484 15288
15485 (define_expand "atanxf2" 15289 (define_expand "atanxf2"
15486 [(parallel [(set (match_operand:XF 0 "register_operand") 15290 [(parallel [(set (match_operand:XF 0 "register_operand")
15488 (match_operand:XF 1 "register_operand")] 15292 (match_operand:XF 1 "register_operand")]
15489 UNSPEC_FPATAN)) 15293 UNSPEC_FPATAN))
15490 (clobber (match_scratch:XF 3))])] 15294 (clobber (match_scratch:XF 3))])]
15491 "TARGET_USE_FANCY_MATH_387 15295 "TARGET_USE_FANCY_MATH_387
15492 && flag_unsafe_math_optimizations" 15296 && flag_unsafe_math_optimizations"
15493 { 15297 "operands[2] = force_reg (XFmode, CONST1_RTX (XFmode));")
15494 operands[2] = gen_reg_rtx (XFmode);
15495 emit_move_insn (operands[2], CONST1_RTX (XFmode)); /* fld1 */
15496 })
15497 15298
15498 (define_expand "atan<mode>2" 15299 (define_expand "atan<mode>2"
15499 [(use (match_operand:MODEF 0 "register_operand")) 15300 [(use (match_operand:MODEF 0 "register_operand"))
15500 (use (match_operand:MODEF 1 "register_operand"))] 15301 (use (match_operand:MODEF 1 "general_operand"))]
15501 "TARGET_USE_FANCY_MATH_387 15302 "TARGET_USE_FANCY_MATH_387
15502 && (!(SSE_FLOAT_MODE_P (<MODE>mode) && TARGET_SSE_MATH) 15303 && (!(SSE_FLOAT_MODE_P (<MODE>mode) && TARGET_SSE_MATH)
15503 || TARGET_MIX_SSE_I387) 15304 || TARGET_MIX_SSE_I387)
15504 && flag_unsafe_math_optimizations" 15305 && flag_unsafe_math_optimizations"
15505 { 15306 {
15506 rtx op0 = gen_reg_rtx (XFmode); 15307 rtx op0 = gen_reg_rtx (XFmode);
15507 15308 rtx op1 = gen_reg_rtx (XFmode);
15508 rtx op2 = gen_reg_rtx (<MODE>mode); 15309
15509 emit_move_insn (op2, CONST1_RTX (<MODE>mode)); /* fld1 */ 15310 emit_insn (gen_extend<mode>xf2 (op1, operands[1]));
15510 15311 emit_insn (gen_atanxf2 (op0, op1));
15511 emit_insn (gen_fpatan_extend<mode>xf3_i387 (op0, op2, operands[1])); 15312 emit_insn (gen_truncxf<mode>2 (operands[0], op0));
15512 emit_insn (gen_truncxf<mode>2_i387_noop (operands[0], op0));
15513 DONE; 15313 DONE;
15514 }) 15314 })
15515 15315
15516 (define_expand "asinxf2" 15316 (define_expand "asinxf2"
15517 [(set (match_dup 2) 15317 [(set (match_dup 2)
15529 int i; 15329 int i;
15530 15330
15531 for (i = 2; i < 6; i++) 15331 for (i = 2; i < 6; i++)
15532 operands[i] = gen_reg_rtx (XFmode); 15332 operands[i] = gen_reg_rtx (XFmode);
15533 15333
15534 emit_move_insn (operands[3], CONST1_RTX (XFmode)); /* fld1 */ 15334 emit_move_insn (operands[3], CONST1_RTX (XFmode));
15535 }) 15335 })
15536 15336
15537 (define_expand "asin<mode>2" 15337 (define_expand "asin<mode>2"
15538 [(use (match_operand:MODEF 0 "register_operand")) 15338 [(use (match_operand:MODEF 0 "register_operand"))
15539 (use (match_operand:MODEF 1 "general_operand"))] 15339 (use (match_operand:MODEF 1 "general_operand"))]
15545 rtx op0 = gen_reg_rtx (XFmode); 15345 rtx op0 = gen_reg_rtx (XFmode);
15546 rtx op1 = gen_reg_rtx (XFmode); 15346 rtx op1 = gen_reg_rtx (XFmode);
15547 15347
15548 emit_insn (gen_extend<mode>xf2 (op1, operands[1])); 15348 emit_insn (gen_extend<mode>xf2 (op1, operands[1]));
15549 emit_insn (gen_asinxf2 (op0, op1)); 15349 emit_insn (gen_asinxf2 (op0, op1));
15550 emit_insn (gen_truncxf<mode>2_i387_noop (operands[0], op0)); 15350 emit_insn (gen_truncxf<mode>2 (operands[0], op0));
15551 DONE; 15351 DONE;
15552 }) 15352 })
15553 15353
15554 (define_expand "acosxf2" 15354 (define_expand "acosxf2"
15555 [(set (match_dup 2) 15355 [(set (match_dup 2)
15567 int i; 15367 int i;
15568 15368
15569 for (i = 2; i < 6; i++) 15369 for (i = 2; i < 6; i++)
15570 operands[i] = gen_reg_rtx (XFmode); 15370 operands[i] = gen_reg_rtx (XFmode);
15571 15371
15572 emit_move_insn (operands[3], CONST1_RTX (XFmode)); /* fld1 */ 15372 emit_move_insn (operands[3], CONST1_RTX (XFmode));
15573 }) 15373 })
15574 15374
15575 (define_expand "acos<mode>2" 15375 (define_expand "acos<mode>2"
15576 [(use (match_operand:MODEF 0 "register_operand")) 15376 [(use (match_operand:MODEF 0 "register_operand"))
15577 (use (match_operand:MODEF 1 "general_operand"))] 15377 (use (match_operand:MODEF 1 "general_operand"))]
15583 rtx op0 = gen_reg_rtx (XFmode); 15383 rtx op0 = gen_reg_rtx (XFmode);
15584 rtx op1 = gen_reg_rtx (XFmode); 15384 rtx op1 = gen_reg_rtx (XFmode);
15585 15385
15586 emit_insn (gen_extend<mode>xf2 (op1, operands[1])); 15386 emit_insn (gen_extend<mode>xf2 (op1, operands[1]));
15587 emit_insn (gen_acosxf2 (op0, op1)); 15387 emit_insn (gen_acosxf2 (op0, op1));
15588 emit_insn (gen_truncxf<mode>2_i387_noop (operands[0], op0)); 15388 emit_insn (gen_truncxf<mode>2 (operands[0], op0));
15589 DONE; 15389 DONE;
15590 }) 15390 })
15591 15391
15592 (define_insn "fyl2xxf3_i387" 15392 (define_insn "fyl2xxf3_i387"
15593 [(set (match_operand:XF 0 "register_operand" "=f") 15393 [(set (match_operand:XF 0 "register_operand" "=f")
15594 (unspec:XF [(match_operand:XF 1 "register_operand" "0") 15394 (unspec:XF [(match_operand:XF 1 "register_operand" "0")
15595 (match_operand:XF 2 "register_operand" "u")] 15395 (match_operand:XF 2 "register_operand" "f")]
15596 UNSPEC_FYL2X)) 15396 UNSPEC_FYL2X))
15597 (clobber (match_scratch:XF 3 "=2"))] 15397 (clobber (match_scratch:XF 3 "=2"))]
15598 "TARGET_USE_FANCY_MATH_387 15398 "TARGET_USE_FANCY_MATH_387
15599 && flag_unsafe_math_optimizations" 15399 && flag_unsafe_math_optimizations"
15600 "fyl2x" 15400 "fyl2x"
15601 [(set_attr "type" "fpspc") 15401 [(set_attr "type" "fpspc")
15602 (set_attr "znver1_decode" "vector") 15402 (set_attr "znver1_decode" "vector")
15603 (set_attr "mode" "XF")]) 15403 (set_attr "mode" "XF")])
15604 15404
15605 (define_insn "fyl2x_extend<mode>xf3_i387"
15606 [(set (match_operand:XF 0 "register_operand" "=f")
15607 (unspec:XF [(float_extend:XF
15608 (match_operand:MODEF 1 "register_operand" "0"))
15609 (match_operand:XF 2 "register_operand" "u")]
15610 UNSPEC_FYL2X))
15611 (clobber (match_scratch:XF 3 "=2"))]
15612 "TARGET_USE_FANCY_MATH_387
15613 && (!(SSE_FLOAT_MODE_P (<MODE>mode) && TARGET_SSE_MATH)
15614 || TARGET_MIX_SSE_I387)
15615 && flag_unsafe_math_optimizations"
15616 "fyl2x"
15617 [(set_attr "type" "fpspc")
15618 (set_attr "znver1_decode" "vector")
15619 (set_attr "mode" "XF")])
15620
15621 (define_expand "logxf2" 15405 (define_expand "logxf2"
15622 [(parallel [(set (match_operand:XF 0 "register_operand") 15406 [(parallel [(set (match_operand:XF 0 "register_operand")
15623 (unspec:XF [(match_operand:XF 1 "register_operand") 15407 (unspec:XF [(match_operand:XF 1 "register_operand")
15624 (match_dup 2)] UNSPEC_FYL2X)) 15408 (match_dup 2)] UNSPEC_FYL2X))
15625 (clobber (match_scratch:XF 3))])] 15409 (clobber (match_scratch:XF 3))])]
15626 "TARGET_USE_FANCY_MATH_387 15410 "TARGET_USE_FANCY_MATH_387
15627 && flag_unsafe_math_optimizations" 15411 && flag_unsafe_math_optimizations"
15628 { 15412 {
15629 operands[2] = gen_reg_rtx (XFmode); 15413 operands[2]
15630 emit_move_insn (operands[2], standard_80387_constant_rtx (4)); /* fldln2 */ 15414 = force_reg (XFmode, standard_80387_constant_rtx (4)); /* fldln2 */
15631 }) 15415 })
15632 15416
15633 (define_expand "log<mode>2" 15417 (define_expand "log<mode>2"
15634 [(use (match_operand:MODEF 0 "register_operand")) 15418 [(use (match_operand:MODEF 0 "register_operand"))
15635 (use (match_operand:MODEF 1 "register_operand"))] 15419 (use (match_operand:MODEF 1 "general_operand"))]
15636 "TARGET_USE_FANCY_MATH_387 15420 "TARGET_USE_FANCY_MATH_387
15637 && (!(SSE_FLOAT_MODE_P (<MODE>mode) && TARGET_SSE_MATH) 15421 && (!(SSE_FLOAT_MODE_P (<MODE>mode) && TARGET_SSE_MATH)
15638 || TARGET_MIX_SSE_I387) 15422 || TARGET_MIX_SSE_I387)
15639 && flag_unsafe_math_optimizations" 15423 && flag_unsafe_math_optimizations"
15640 { 15424 {
15641 rtx op0 = gen_reg_rtx (XFmode); 15425 rtx op0 = gen_reg_rtx (XFmode);
15642 15426 rtx op1 = gen_reg_rtx (XFmode);
15643 rtx op2 = gen_reg_rtx (XFmode); 15427
15644 emit_move_insn (op2, standard_80387_constant_rtx (4)); /* fldln2 */ 15428 emit_insn (gen_extend<mode>xf2 (op1, operands[1]));
15645 15429 emit_insn (gen_logxf2 (op0, op1));
15646 emit_insn (gen_fyl2x_extend<mode>xf3_i387 (op0, operands[1], op2)); 15430 emit_insn (gen_truncxf<mode>2 (operands[0], op0));
15647 emit_insn (gen_truncxf<mode>2_i387_noop (operands[0], op0));
15648 DONE; 15431 DONE;
15649 }) 15432 })
15650 15433
15651 (define_expand "log10xf2" 15434 (define_expand "log10xf2"
15652 [(parallel [(set (match_operand:XF 0 "register_operand") 15435 [(parallel [(set (match_operand:XF 0 "register_operand")
15654 (match_dup 2)] UNSPEC_FYL2X)) 15437 (match_dup 2)] UNSPEC_FYL2X))
15655 (clobber (match_scratch:XF 3))])] 15438 (clobber (match_scratch:XF 3))])]
15656 "TARGET_USE_FANCY_MATH_387 15439 "TARGET_USE_FANCY_MATH_387
15657 && flag_unsafe_math_optimizations" 15440 && flag_unsafe_math_optimizations"
15658 { 15441 {
15659 operands[2] = gen_reg_rtx (XFmode); 15442 operands[2]
15660 emit_move_insn (operands[2], standard_80387_constant_rtx (3)); /* fldlg2 */ 15443 = force_reg (XFmode, standard_80387_constant_rtx (3)); /* fldlg2 */
15661 }) 15444 })
15662 15445
15663 (define_expand "log10<mode>2" 15446 (define_expand "log10<mode>2"
15664 [(use (match_operand:MODEF 0 "register_operand")) 15447 [(use (match_operand:MODEF 0 "register_operand"))
15665 (use (match_operand:MODEF 1 "register_operand"))] 15448 (use (match_operand:MODEF 1 "general_operand"))]
15666 "TARGET_USE_FANCY_MATH_387 15449 "TARGET_USE_FANCY_MATH_387
15667 && (!(SSE_FLOAT_MODE_P (<MODE>mode) && TARGET_SSE_MATH) 15450 && (!(SSE_FLOAT_MODE_P (<MODE>mode) && TARGET_SSE_MATH)
15668 || TARGET_MIX_SSE_I387) 15451 || TARGET_MIX_SSE_I387)
15669 && flag_unsafe_math_optimizations" 15452 && flag_unsafe_math_optimizations"
15670 { 15453 {
15671 rtx op0 = gen_reg_rtx (XFmode); 15454 rtx op0 = gen_reg_rtx (XFmode);
15672 15455 rtx op1 = gen_reg_rtx (XFmode);
15673 rtx op2 = gen_reg_rtx (XFmode); 15456
15674 emit_move_insn (op2, standard_80387_constant_rtx (3)); /* fldlg2 */ 15457 emit_insn (gen_extend<mode>xf2 (op1, operands[1]));
15675 15458 emit_insn (gen_log10xf2 (op0, op1));
15676 emit_insn (gen_fyl2x_extend<mode>xf3_i387 (op0, operands[1], op2)); 15459 emit_insn (gen_truncxf<mode>2 (operands[0], op0));
15677 emit_insn (gen_truncxf<mode>2_i387_noop (operands[0], op0));
15678 DONE; 15460 DONE;
15679 }) 15461 })
15680 15462
15681 (define_expand "log2xf2" 15463 (define_expand "log2xf2"
15682 [(parallel [(set (match_operand:XF 0 "register_operand") 15464 [(parallel [(set (match_operand:XF 0 "register_operand")
15683 (unspec:XF [(match_operand:XF 1 "register_operand") 15465 (unspec:XF [(match_operand:XF 1 "register_operand")
15684 (match_dup 2)] UNSPEC_FYL2X)) 15466 (match_dup 2)] UNSPEC_FYL2X))
15685 (clobber (match_scratch:XF 3))])] 15467 (clobber (match_scratch:XF 3))])]
15686 "TARGET_USE_FANCY_MATH_387 15468 "TARGET_USE_FANCY_MATH_387
15687 && flag_unsafe_math_optimizations" 15469 && flag_unsafe_math_optimizations"
15688 { 15470 "operands[2] = force_reg (XFmode, CONST1_RTX (XFmode));")
15689 operands[2] = gen_reg_rtx (XFmode);
15690 emit_move_insn (operands[2], CONST1_RTX (XFmode)); /* fld1 */
15691 })
15692 15471
15693 (define_expand "log2<mode>2" 15472 (define_expand "log2<mode>2"
15694 [(use (match_operand:MODEF 0 "register_operand")) 15473 [(use (match_operand:MODEF 0 "register_operand"))
15695 (use (match_operand:MODEF 1 "register_operand"))] 15474 (use (match_operand:MODEF 1 "general_operand"))]
15696 "TARGET_USE_FANCY_MATH_387 15475 "TARGET_USE_FANCY_MATH_387
15697 && (!(SSE_FLOAT_MODE_P (<MODE>mode) && TARGET_SSE_MATH) 15476 && (!(SSE_FLOAT_MODE_P (<MODE>mode) && TARGET_SSE_MATH)
15698 || TARGET_MIX_SSE_I387) 15477 || TARGET_MIX_SSE_I387)
15699 && flag_unsafe_math_optimizations" 15478 && flag_unsafe_math_optimizations"
15700 { 15479 {
15701 rtx op0 = gen_reg_rtx (XFmode); 15480 rtx op0 = gen_reg_rtx (XFmode);
15702 15481 rtx op1 = gen_reg_rtx (XFmode);
15703 rtx op2 = gen_reg_rtx (XFmode); 15482
15704 emit_move_insn (op2, CONST1_RTX (XFmode)); /* fld1 */ 15483 emit_insn (gen_extend<mode>xf2 (op1, operands[1]));
15705 15484 emit_insn (gen_log2xf2 (op0, op1));
15706 emit_insn (gen_fyl2x_extend<mode>xf3_i387 (op0, operands[1], op2)); 15485 emit_insn (gen_truncxf<mode>2 (operands[0], op0));
15707 emit_insn (gen_truncxf<mode>2_i387_noop (operands[0], op0));
15708 DONE; 15486 DONE;
15709 }) 15487 })
15710 15488
15711 (define_insn "fyl2xp1xf3_i387" 15489 (define_insn "fyl2xp1xf3_i387"
15712 [(set (match_operand:XF 0 "register_operand" "=f") 15490 [(set (match_operand:XF 0 "register_operand" "=f")
15713 (unspec:XF [(match_operand:XF 1 "register_operand" "0") 15491 (unspec:XF [(match_operand:XF 1 "register_operand" "0")
15714 (match_operand:XF 2 "register_operand" "u")] 15492 (match_operand:XF 2 "register_operand" "f")]
15715 UNSPEC_FYL2XP1)) 15493 UNSPEC_FYL2XP1))
15716 (clobber (match_scratch:XF 3 "=2"))] 15494 (clobber (match_scratch:XF 3 "=2"))]
15717 "TARGET_USE_FANCY_MATH_387 15495 "TARGET_USE_FANCY_MATH_387
15718 && flag_unsafe_math_optimizations" 15496 && flag_unsafe_math_optimizations"
15719 "fyl2xp1" 15497 "fyl2xp1"
15720 [(set_attr "type" "fpspc") 15498 [(set_attr "type" "fpspc")
15721 (set_attr "znver1_decode" "vector") 15499 (set_attr "znver1_decode" "vector")
15722 (set_attr "mode" "XF")]) 15500 (set_attr "mode" "XF")])
15723 15501
15724 (define_insn "fyl2xp1_extend<mode>xf3_i387"
15725 [(set (match_operand:XF 0 "register_operand" "=f")
15726 (unspec:XF [(float_extend:XF
15727 (match_operand:MODEF 1 "register_operand" "0"))
15728 (match_operand:XF 2 "register_operand" "u")]
15729 UNSPEC_FYL2XP1))
15730 (clobber (match_scratch:XF 3 "=2"))]
15731 "TARGET_USE_FANCY_MATH_387
15732 && (!(SSE_FLOAT_MODE_P (<MODE>mode) && TARGET_SSE_MATH)
15733 || TARGET_MIX_SSE_I387)
15734 && flag_unsafe_math_optimizations"
15735 "fyl2xp1"
15736 [(set_attr "type" "fpspc")
15737 (set_attr "znver1_decode" "vector")
15738 (set_attr "mode" "XF")])
15739
15740 (define_expand "log1pxf2" 15502 (define_expand "log1pxf2"
15741 [(use (match_operand:XF 0 "register_operand")) 15503 [(use (match_operand:XF 0 "register_operand"))
15742 (use (match_operand:XF 1 "register_operand"))] 15504 (use (match_operand:XF 1 "register_operand"))]
15743 "TARGET_USE_FANCY_MATH_387 15505 "TARGET_USE_FANCY_MATH_387
15744 && flag_unsafe_math_optimizations" 15506 && flag_unsafe_math_optimizations"
15747 DONE; 15509 DONE;
15748 }) 15510 })
15749 15511
15750 (define_expand "log1p<mode>2" 15512 (define_expand "log1p<mode>2"
15751 [(use (match_operand:MODEF 0 "register_operand")) 15513 [(use (match_operand:MODEF 0 "register_operand"))
15752 (use (match_operand:MODEF 1 "register_operand"))] 15514 (use (match_operand:MODEF 1 "general_operand"))]
15753 "TARGET_USE_FANCY_MATH_387 15515 "TARGET_USE_FANCY_MATH_387
15754 && (!(SSE_FLOAT_MODE_P (<MODE>mode) && TARGET_SSE_MATH) 15516 && (!(SSE_FLOAT_MODE_P (<MODE>mode) && TARGET_SSE_MATH)
15755 || TARGET_MIX_SSE_I387) 15517 || TARGET_MIX_SSE_I387)
15756 && flag_unsafe_math_optimizations" 15518 && flag_unsafe_math_optimizations"
15757 { 15519 {
15758 rtx op0; 15520 rtx op0 = gen_reg_rtx (XFmode);
15759 15521 rtx op1 = gen_reg_rtx (XFmode);
15760 op0 = gen_reg_rtx (XFmode); 15522
15761 15523 emit_insn (gen_extend<mode>xf2 (op1, operands[1]));
15762 operands[1] = gen_rtx_FLOAT_EXTEND (XFmode, operands[1]); 15524 emit_insn (gen_log1pxf2 (op0, op1));
15763 15525 emit_insn (gen_truncxf<mode>2 (operands[0], op0));
15764 ix86_emit_i387_log1p (op0, operands[1]);
15765 emit_insn (gen_truncxf<mode>2_i387_noop (operands[0], op0));
15766 DONE; 15526 DONE;
15767 }) 15527 })
15768 15528
15769 (define_insn "fxtractxf3_i387" 15529 (define_insn "fxtractxf3_i387"
15770 [(set (match_operand:XF 0 "register_operand" "=f") 15530 [(set (match_operand:XF 0 "register_operand" "=f")
15771 (unspec:XF [(match_operand:XF 2 "register_operand" "0")] 15531 (unspec:XF [(match_operand:XF 2 "register_operand" "0")]
15772 UNSPEC_XTRACT_FRACT)) 15532 UNSPEC_XTRACT_FRACT))
15773 (set (match_operand:XF 1 "register_operand" "=u") 15533 (set (match_operand:XF 1 "register_operand" "=f")
15774 (unspec:XF [(match_dup 2)] UNSPEC_XTRACT_EXP))] 15534 (unspec:XF [(match_dup 2)] UNSPEC_XTRACT_EXP))]
15775 "TARGET_USE_FANCY_MATH_387 15535 "TARGET_USE_FANCY_MATH_387
15776 && flag_unsafe_math_optimizations"
15777 "fxtract"
15778 [(set_attr "type" "fpspc")
15779 (set_attr "znver1_decode" "vector")
15780 (set_attr "mode" "XF")])
15781
15782 (define_insn "fxtract_extend<mode>xf3_i387"
15783 [(set (match_operand:XF 0 "register_operand" "=f")
15784 (unspec:XF [(float_extend:XF
15785 (match_operand:MODEF 2 "register_operand" "0"))]
15786 UNSPEC_XTRACT_FRACT))
15787 (set (match_operand:XF 1 "register_operand" "=u")
15788 (unspec:XF [(float_extend:XF (match_dup 2))] UNSPEC_XTRACT_EXP))]
15789 "TARGET_USE_FANCY_MATH_387
15790 && (!(SSE_FLOAT_MODE_P (<MODE>mode) && TARGET_SSE_MATH)
15791 || TARGET_MIX_SSE_I387)
15792 && flag_unsafe_math_optimizations" 15536 && flag_unsafe_math_optimizations"
15793 "fxtract" 15537 "fxtract"
15794 [(set_attr "type" "fpspc") 15538 [(set_attr "type" "fpspc")
15795 (set_attr "znver1_decode" "vector") 15539 (set_attr "znver1_decode" "vector")
15796 (set_attr "mode" "XF")]) 15540 (set_attr "mode" "XF")])
15805 && flag_unsafe_math_optimizations" 15549 && flag_unsafe_math_optimizations"
15806 "operands[2] = gen_reg_rtx (XFmode);") 15550 "operands[2] = gen_reg_rtx (XFmode);")
15807 15551
15808 (define_expand "logb<mode>2" 15552 (define_expand "logb<mode>2"
15809 [(use (match_operand:MODEF 0 "register_operand")) 15553 [(use (match_operand:MODEF 0 "register_operand"))
15810 (use (match_operand:MODEF 1 "register_operand"))] 15554 (use (match_operand:MODEF 1 "general_operand"))]
15811 "TARGET_USE_FANCY_MATH_387 15555 "TARGET_USE_FANCY_MATH_387
15812 && (!(SSE_FLOAT_MODE_P (<MODE>mode) && TARGET_SSE_MATH) 15556 && (!(SSE_FLOAT_MODE_P (<MODE>mode) && TARGET_SSE_MATH)
15813 || TARGET_MIX_SSE_I387) 15557 || TARGET_MIX_SSE_I387)
15814 && flag_unsafe_math_optimizations" 15558 && flag_unsafe_math_optimizations"
15815 { 15559 {
15816 rtx op0 = gen_reg_rtx (XFmode); 15560 rtx op0 = gen_reg_rtx (XFmode);
15817 rtx op1 = gen_reg_rtx (XFmode); 15561 rtx op1 = gen_reg_rtx (XFmode);
15818 15562
15819 emit_insn (gen_fxtract_extend<mode>xf3_i387 (op0, op1, operands[1])); 15563 emit_insn (gen_extend<mode>xf2 (op1, operands[1]));
15820 emit_insn (gen_truncxf<mode>2_i387_noop (operands[0], op1)); 15564 emit_insn (gen_logbxf2 (op0, op1));
15565 emit_insn (gen_truncxf<mode>2 (operands[0], op1));
15821 DONE; 15566 DONE;
15822 }) 15567 })
15823 15568
15824 (define_expand "ilogbxf2" 15569 (define_expand "ilogbxf2"
15825 [(use (match_operand:SI 0 "register_operand")) 15570 [(use (match_operand:SI 0 "register_operand"))
15840 DONE; 15585 DONE;
15841 }) 15586 })
15842 15587
15843 (define_expand "ilogb<mode>2" 15588 (define_expand "ilogb<mode>2"
15844 [(use (match_operand:SI 0 "register_operand")) 15589 [(use (match_operand:SI 0 "register_operand"))
15845 (use (match_operand:MODEF 1 "register_operand"))] 15590 (use (match_operand:MODEF 1 "general_operand"))]
15846 "TARGET_USE_FANCY_MATH_387 15591 "TARGET_USE_FANCY_MATH_387
15847 && (!(SSE_FLOAT_MODE_P (<MODE>mode) && TARGET_SSE_MATH) 15592 && (!(SSE_FLOAT_MODE_P (<MODE>mode) && TARGET_SSE_MATH)
15848 || TARGET_MIX_SSE_I387) 15593 || TARGET_MIX_SSE_I387)
15849 && flag_unsafe_math_optimizations" 15594 && flag_unsafe_math_optimizations"
15850 { 15595 {
15851 rtx op0, op1; 15596 rtx op0, op1, op2;
15852 15597
15853 if (optimize_insn_for_size_p ()) 15598 if (optimize_insn_for_size_p ())
15854 FAIL; 15599 FAIL;
15855 15600
15856 op0 = gen_reg_rtx (XFmode); 15601 op0 = gen_reg_rtx (XFmode);
15857 op1 = gen_reg_rtx (XFmode); 15602 op1 = gen_reg_rtx (XFmode);
15858 15603 op2 = gen_reg_rtx (XFmode);
15859 emit_insn (gen_fxtract_extend<mode>xf3_i387 (op0, op1, operands[1])); 15604
15605 emit_insn (gen_extend<mode>xf2 (op2, operands[1]));
15606 emit_insn (gen_fxtractxf3_i387 (op0, op1, op2));
15860 emit_insn (gen_fix_truncxfsi2 (operands[0], op1)); 15607 emit_insn (gen_fix_truncxfsi2 (operands[0], op1));
15861 DONE; 15608 DONE;
15862 }) 15609 })
15863 15610
15864 (define_insn "*f2xm1xf2_i387" 15611 (define_insn "*f2xm1xf2_i387"
15875 (define_insn "fscalexf4_i387" 15622 (define_insn "fscalexf4_i387"
15876 [(set (match_operand:XF 0 "register_operand" "=f") 15623 [(set (match_operand:XF 0 "register_operand" "=f")
15877 (unspec:XF [(match_operand:XF 2 "register_operand" "0") 15624 (unspec:XF [(match_operand:XF 2 "register_operand" "0")
15878 (match_operand:XF 3 "register_operand" "1")] 15625 (match_operand:XF 3 "register_operand" "1")]
15879 UNSPEC_FSCALE_FRACT)) 15626 UNSPEC_FSCALE_FRACT))
15880 (set (match_operand:XF 1 "register_operand" "=u") 15627 (set (match_operand:XF 1 "register_operand" "=f")
15881 (unspec:XF [(match_dup 2) (match_dup 3)] 15628 (unspec:XF [(match_dup 2) (match_dup 3)]
15882 UNSPEC_FSCALE_EXP))] 15629 UNSPEC_FSCALE_EXP))]
15883 "TARGET_USE_FANCY_MATH_387 15630 "TARGET_USE_FANCY_MATH_387
15884 && flag_unsafe_math_optimizations" 15631 && flag_unsafe_math_optimizations"
15885 "fscale" 15632 "fscale"
15906 int i; 15653 int i;
15907 15654
15908 for (i = 3; i < 10; i++) 15655 for (i = 3; i < 10; i++)
15909 operands[i] = gen_reg_rtx (XFmode); 15656 operands[i] = gen_reg_rtx (XFmode);
15910 15657
15911 emit_move_insn (operands[7], CONST1_RTX (XFmode)); /* fld1 */ 15658 emit_move_insn (operands[7], CONST1_RTX (XFmode));
15912 }) 15659 })
15913 15660
15914 (define_expand "expxf2" 15661 (define_expand "expxf2"
15915 [(use (match_operand:XF 0 "register_operand")) 15662 [(use (match_operand:XF 0 "register_operand"))
15916 (use (match_operand:XF 1 "register_operand"))] 15663 (use (match_operand:XF 1 "register_operand"))]
15917 "TARGET_USE_FANCY_MATH_387 15664 "TARGET_USE_FANCY_MATH_387
15918 && flag_unsafe_math_optimizations" 15665 && flag_unsafe_math_optimizations"
15919 { 15666 {
15920 rtx op2; 15667 rtx op2 = force_reg (XFmode, standard_80387_constant_rtx (5)); /* fldl2e */
15921
15922 op2 = gen_reg_rtx (XFmode);
15923 emit_move_insn (op2, standard_80387_constant_rtx (5)); /* fldl2e */
15924 15668
15925 emit_insn (gen_expNcorexf3 (operands[0], operands[1], op2)); 15669 emit_insn (gen_expNcorexf3 (operands[0], operands[1], op2));
15926 DONE; 15670 DONE;
15927 }) 15671 })
15928 15672
15932 "TARGET_USE_FANCY_MATH_387 15676 "TARGET_USE_FANCY_MATH_387
15933 && (!(SSE_FLOAT_MODE_P (<MODE>mode) && TARGET_SSE_MATH) 15677 && (!(SSE_FLOAT_MODE_P (<MODE>mode) && TARGET_SSE_MATH)
15934 || TARGET_MIX_SSE_I387) 15678 || TARGET_MIX_SSE_I387)
15935 && flag_unsafe_math_optimizations" 15679 && flag_unsafe_math_optimizations"
15936 { 15680 {
15937 rtx op0, op1; 15681 rtx op0 = gen_reg_rtx (XFmode);
15938 15682 rtx op1 = gen_reg_rtx (XFmode);
15939 op0 = gen_reg_rtx (XFmode);
15940 op1 = gen_reg_rtx (XFmode);
15941 15683
15942 emit_insn (gen_extend<mode>xf2 (op1, operands[1])); 15684 emit_insn (gen_extend<mode>xf2 (op1, operands[1]));
15943 emit_insn (gen_expxf2 (op0, op1)); 15685 emit_insn (gen_expxf2 (op0, op1));
15944 emit_insn (gen_truncxf<mode>2_i387_noop (operands[0], op0)); 15686 emit_insn (gen_truncxf<mode>2 (operands[0], op0));
15945 DONE; 15687 DONE;
15946 }) 15688 })
15947 15689
15948 (define_expand "exp10xf2" 15690 (define_expand "exp10xf2"
15949 [(use (match_operand:XF 0 "register_operand")) 15691 [(use (match_operand:XF 0 "register_operand"))
15950 (use (match_operand:XF 1 "register_operand"))] 15692 (use (match_operand:XF 1 "register_operand"))]
15951 "TARGET_USE_FANCY_MATH_387 15693 "TARGET_USE_FANCY_MATH_387
15952 && flag_unsafe_math_optimizations" 15694 && flag_unsafe_math_optimizations"
15953 { 15695 {
15954 rtx op2; 15696 rtx op2 = force_reg (XFmode, standard_80387_constant_rtx (6)); /* fldl2t */
15955
15956 op2 = gen_reg_rtx (XFmode);
15957 emit_move_insn (op2, standard_80387_constant_rtx (6)); /* fldl2t */
15958 15697
15959 emit_insn (gen_expNcorexf3 (operands[0], operands[1], op2)); 15698 emit_insn (gen_expNcorexf3 (operands[0], operands[1], op2));
15960 DONE; 15699 DONE;
15961 }) 15700 })
15962 15701
15966 "TARGET_USE_FANCY_MATH_387 15705 "TARGET_USE_FANCY_MATH_387
15967 && (!(SSE_FLOAT_MODE_P (<MODE>mode) && TARGET_SSE_MATH) 15706 && (!(SSE_FLOAT_MODE_P (<MODE>mode) && TARGET_SSE_MATH)
15968 || TARGET_MIX_SSE_I387) 15707 || TARGET_MIX_SSE_I387)
15969 && flag_unsafe_math_optimizations" 15708 && flag_unsafe_math_optimizations"
15970 { 15709 {
15971 rtx op0, op1; 15710 rtx op0 = gen_reg_rtx (XFmode);
15972 15711 rtx op1 = gen_reg_rtx (XFmode);
15973 op0 = gen_reg_rtx (XFmode);
15974 op1 = gen_reg_rtx (XFmode);
15975 15712
15976 emit_insn (gen_extend<mode>xf2 (op1, operands[1])); 15713 emit_insn (gen_extend<mode>xf2 (op1, operands[1]));
15977 emit_insn (gen_exp10xf2 (op0, op1)); 15714 emit_insn (gen_exp10xf2 (op0, op1));
15978 emit_insn (gen_truncxf<mode>2_i387_noop (operands[0], op0)); 15715 emit_insn (gen_truncxf<mode>2 (operands[0], op0));
15979 DONE; 15716 DONE;
15980 }) 15717 })
15981 15718
15982 (define_expand "exp2xf2" 15719 (define_expand "exp2xf2"
15983 [(use (match_operand:XF 0 "register_operand")) 15720 [(use (match_operand:XF 0 "register_operand"))
15984 (use (match_operand:XF 1 "register_operand"))] 15721 (use (match_operand:XF 1 "register_operand"))]
15985 "TARGET_USE_FANCY_MATH_387 15722 "TARGET_USE_FANCY_MATH_387
15986 && flag_unsafe_math_optimizations" 15723 && flag_unsafe_math_optimizations"
15987 { 15724 {
15988 rtx op2; 15725 rtx op2 = force_reg (XFmode, CONST1_RTX (XFmode));
15989
15990 op2 = gen_reg_rtx (XFmode);
15991 emit_move_insn (op2, CONST1_RTX (XFmode)); /* fld1 */
15992 15726
15993 emit_insn (gen_expNcorexf3 (operands[0], operands[1], op2)); 15727 emit_insn (gen_expNcorexf3 (operands[0], operands[1], op2));
15994 DONE; 15728 DONE;
15995 }) 15729 })
15996 15730
16000 "TARGET_USE_FANCY_MATH_387 15734 "TARGET_USE_FANCY_MATH_387
16001 && (!(SSE_FLOAT_MODE_P (<MODE>mode) && TARGET_SSE_MATH) 15735 && (!(SSE_FLOAT_MODE_P (<MODE>mode) && TARGET_SSE_MATH)
16002 || TARGET_MIX_SSE_I387) 15736 || TARGET_MIX_SSE_I387)
16003 && flag_unsafe_math_optimizations" 15737 && flag_unsafe_math_optimizations"
16004 { 15738 {
16005 rtx op0, op1; 15739 rtx op0 = gen_reg_rtx (XFmode);
16006 15740 rtx op1 = gen_reg_rtx (XFmode);
16007 op0 = gen_reg_rtx (XFmode);
16008 op1 = gen_reg_rtx (XFmode);
16009 15741
16010 emit_insn (gen_extend<mode>xf2 (op1, operands[1])); 15742 emit_insn (gen_extend<mode>xf2 (op1, operands[1]));
16011 emit_insn (gen_exp2xf2 (op0, op1)); 15743 emit_insn (gen_exp2xf2 (op0, op1));
16012 emit_insn (gen_truncxf<mode>2_i387_noop (operands[0], op0)); 15744 emit_insn (gen_truncxf<mode>2 (operands[0], op0));
16013 DONE; 15745 DONE;
16014 }) 15746 })
16015 15747
16016 (define_expand "expm1xf2" 15748 (define_expand "expm1xf2"
16017 [(set (match_dup 3) (mult:XF (match_operand:XF 1 "register_operand") 15749 [(set (match_dup 3) (mult:XF (match_operand:XF 1 "register_operand")
16018 (match_dup 2))) 15750 (match_dup 2)))
16019 (set (match_dup 4) (unspec:XF [(match_dup 3)] UNSPEC_FRNDINT)) 15751 (set (match_dup 4) (unspec:XF [(match_dup 3)] UNSPEC_FRNDINT))
16020 (set (match_dup 5) (minus:XF (match_dup 3) (match_dup 4))) 15752 (set (match_dup 5) (minus:XF (match_dup 3) (match_dup 4)))
16021 (set (match_dup 9) (float_extend:XF (match_dup 13)))
16022 (set (match_dup 6) (unspec:XF [(match_dup 5)] UNSPEC_F2XM1)) 15753 (set (match_dup 6) (unspec:XF [(match_dup 5)] UNSPEC_F2XM1))
16023 (parallel [(set (match_dup 7) 15754 (parallel [(set (match_dup 7)
16024 (unspec:XF [(match_dup 6) (match_dup 4)] 15755 (unspec:XF [(match_dup 6) (match_dup 4)]
16025 UNSPEC_FSCALE_FRACT)) 15756 UNSPEC_FSCALE_FRACT))
16026 (set (match_dup 8) 15757 (set (match_dup 8)
16030 (unspec:XF [(match_dup 9) (match_dup 8)] 15761 (unspec:XF [(match_dup 9) (match_dup 8)]
16031 UNSPEC_FSCALE_FRACT)) 15762 UNSPEC_FSCALE_FRACT))
16032 (set (match_dup 11) 15763 (set (match_dup 11)
16033 (unspec:XF [(match_dup 9) (match_dup 8)] 15764 (unspec:XF [(match_dup 9) (match_dup 8)]
16034 UNSPEC_FSCALE_EXP))]) 15765 UNSPEC_FSCALE_EXP))])
16035 (set (match_dup 12) (minus:XF (match_dup 10) 15766 (set (match_dup 12) (minus:XF (match_dup 10) (match_dup 9)))
16036 (float_extend:XF (match_dup 13))))
16037 (set (match_operand:XF 0 "register_operand") 15767 (set (match_operand:XF 0 "register_operand")
16038 (plus:XF (match_dup 12) (match_dup 7)))] 15768 (plus:XF (match_dup 12) (match_dup 7)))]
16039 "TARGET_USE_FANCY_MATH_387 15769 "TARGET_USE_FANCY_MATH_387
16040 && flag_unsafe_math_optimizations" 15770 && flag_unsafe_math_optimizations"
16041 { 15771 {
16042 int i; 15772 int i;
16043 15773
16044 for (i = 2; i < 13; i++) 15774 for (i = 2; i < 13; i++)
16045 operands[i] = gen_reg_rtx (XFmode); 15775 operands[i] = gen_reg_rtx (XFmode);
16046 15776
16047 operands[13]
16048 = validize_mem (force_const_mem (SFmode, CONST1_RTX (SFmode))); /* fld1 */
16049
16050 emit_move_insn (operands[2], standard_80387_constant_rtx (5)); /* fldl2e */ 15777 emit_move_insn (operands[2], standard_80387_constant_rtx (5)); /* fldl2e */
15778 emit_move_insn (operands[9], CONST1_RTX (XFmode));
16051 }) 15779 })
16052 15780
16053 (define_expand "expm1<mode>2" 15781 (define_expand "expm1<mode>2"
16054 [(use (match_operand:MODEF 0 "register_operand")) 15782 [(use (match_operand:MODEF 0 "register_operand"))
16055 (use (match_operand:MODEF 1 "general_operand"))] 15783 (use (match_operand:MODEF 1 "general_operand"))]
16056 "TARGET_USE_FANCY_MATH_387 15784 "TARGET_USE_FANCY_MATH_387
16057 && (!(SSE_FLOAT_MODE_P (<MODE>mode) && TARGET_SSE_MATH) 15785 && (!(SSE_FLOAT_MODE_P (<MODE>mode) && TARGET_SSE_MATH)
16058 || TARGET_MIX_SSE_I387) 15786 || TARGET_MIX_SSE_I387)
16059 && flag_unsafe_math_optimizations" 15787 && flag_unsafe_math_optimizations"
16060 { 15788 {
16061 rtx op0, op1; 15789 rtx op0 = gen_reg_rtx (XFmode);
16062 15790 rtx op1 = gen_reg_rtx (XFmode);
16063 op0 = gen_reg_rtx (XFmode);
16064 op1 = gen_reg_rtx (XFmode);
16065 15791
16066 emit_insn (gen_extend<mode>xf2 (op1, operands[1])); 15792 emit_insn (gen_extend<mode>xf2 (op1, operands[1]));
16067 emit_insn (gen_expm1xf2 (op0, op1)); 15793 emit_insn (gen_expm1xf2 (op0, op1));
16068 emit_insn (gen_truncxf<mode>2_i387_noop (operands[0], op0)); 15794 emit_insn (gen_truncxf<mode>2 (operands[0], op0));
16069 DONE; 15795 DONE;
16070 }) 15796 })
16071 15797
16072 (define_expand "ldexpxf3" 15798 (define_expand "ldexpxf3"
16073 [(match_operand:XF 0 "register_operand") 15799 [(match_operand:XF 0 "register_operand")
16074 (match_operand:XF 1 "register_operand") 15800 (match_operand:XF 1 "register_operand")
16075 (match_operand:SI 2 "register_operand")] 15801 (match_operand:SI 2 "register_operand")]
16076 "TARGET_USE_FANCY_MATH_387 15802 "TARGET_USE_FANCY_MATH_387
16077 && flag_unsafe_math_optimizations" 15803 && flag_unsafe_math_optimizations"
16078 { 15804 {
16079 rtx tmp1, tmp2; 15805 rtx tmp1 = gen_reg_rtx (XFmode);
16080 15806 rtx tmp2 = gen_reg_rtx (XFmode);
16081 tmp1 = gen_reg_rtx (XFmode);
16082 tmp2 = gen_reg_rtx (XFmode);
16083 15807
16084 emit_insn (gen_floatsixf2 (tmp1, operands[2])); 15808 emit_insn (gen_floatsixf2 (tmp1, operands[2]));
16085 emit_insn (gen_fscalexf4_i387 (operands[0], tmp2, 15809 emit_insn (gen_fscalexf4_i387 (operands[0], tmp2,
16086 operands[1], tmp1)); 15810 operands[1], tmp1));
16087 DONE; 15811 DONE;
16094 "TARGET_USE_FANCY_MATH_387 15818 "TARGET_USE_FANCY_MATH_387
16095 && (!(SSE_FLOAT_MODE_P (<MODE>mode) && TARGET_SSE_MATH) 15819 && (!(SSE_FLOAT_MODE_P (<MODE>mode) && TARGET_SSE_MATH)
16096 || TARGET_MIX_SSE_I387) 15820 || TARGET_MIX_SSE_I387)
16097 && flag_unsafe_math_optimizations" 15821 && flag_unsafe_math_optimizations"
16098 { 15822 {
16099 rtx op0, op1; 15823 rtx op0 = gen_reg_rtx (XFmode);
16100 15824 rtx op1 = gen_reg_rtx (XFmode);
16101 op0 = gen_reg_rtx (XFmode);
16102 op1 = gen_reg_rtx (XFmode);
16103 15825
16104 emit_insn (gen_extend<mode>xf2 (op1, operands[1])); 15826 emit_insn (gen_extend<mode>xf2 (op1, operands[1]));
16105 emit_insn (gen_ldexpxf3 (op0, op1, operands[2])); 15827 emit_insn (gen_ldexpxf3 (op0, op1, operands[2]));
16106 emit_insn (gen_truncxf<mode>2_i387_noop (operands[0], op0)); 15828 emit_insn (gen_truncxf<mode>2 (operands[0], op0));
16107 DONE; 15829 DONE;
16108 }) 15830 })
16109 15831
16110 (define_expand "scalbxf3" 15832 (define_expand "scalbxf3"
16111 [(parallel [(set (match_operand:XF 0 " register_operand") 15833 [(parallel [(set (match_operand:XF 0 " register_operand")
16115 (set (match_dup 3) 15837 (set (match_dup 3)
16116 (unspec:XF [(match_dup 1) (match_dup 2)] 15838 (unspec:XF [(match_dup 1) (match_dup 2)]
16117 UNSPEC_FSCALE_EXP))])] 15839 UNSPEC_FSCALE_EXP))])]
16118 "TARGET_USE_FANCY_MATH_387 15840 "TARGET_USE_FANCY_MATH_387
16119 && flag_unsafe_math_optimizations" 15841 && flag_unsafe_math_optimizations"
16120 { 15842 "operands[3] = gen_reg_rtx (XFmode);")
16121 operands[3] = gen_reg_rtx (XFmode);
16122 })
16123 15843
16124 (define_expand "scalb<mode>3" 15844 (define_expand "scalb<mode>3"
16125 [(use (match_operand:MODEF 0 "register_operand")) 15845 [(use (match_operand:MODEF 0 "register_operand"))
16126 (use (match_operand:MODEF 1 "general_operand")) 15846 (use (match_operand:MODEF 1 "general_operand"))
16127 (use (match_operand:MODEF 2 "general_operand"))] 15847 (use (match_operand:MODEF 2 "general_operand"))]
16128 "TARGET_USE_FANCY_MATH_387 15848 "TARGET_USE_FANCY_MATH_387
16129 && (!(SSE_FLOAT_MODE_P (<MODE>mode) && TARGET_SSE_MATH) 15849 && (!(SSE_FLOAT_MODE_P (<MODE>mode) && TARGET_SSE_MATH)
16130 || TARGET_MIX_SSE_I387) 15850 || TARGET_MIX_SSE_I387)
16131 && flag_unsafe_math_optimizations" 15851 && flag_unsafe_math_optimizations"
16132 { 15852 {
16133 rtx op0, op1, op2; 15853 rtx op0 = gen_reg_rtx (XFmode);
16134 15854 rtx op1 = gen_reg_rtx (XFmode);
16135 op0 = gen_reg_rtx (XFmode); 15855 rtx op2 = gen_reg_rtx (XFmode);
16136 op1 = gen_reg_rtx (XFmode);
16137 op2 = gen_reg_rtx (XFmode);
16138 15856
16139 emit_insn (gen_extend<mode>xf2 (op1, operands[1])); 15857 emit_insn (gen_extend<mode>xf2 (op1, operands[1]));
16140 emit_insn (gen_extend<mode>xf2 (op2, operands[2])); 15858 emit_insn (gen_extend<mode>xf2 (op2, operands[2]));
16141 emit_insn (gen_scalbxf3 (op0, op1, op2)); 15859 emit_insn (gen_scalbxf3 (op0, op1, op2));
16142 emit_insn (gen_truncxf<mode>2_i387_noop (operands[0], op0)); 15860 emit_insn (gen_truncxf<mode>2 (operands[0], op0));
16143 DONE; 15861 DONE;
16144 }) 15862 })
16145 15863
16146 (define_expand "significandxf2" 15864 (define_expand "significandxf2"
16147 [(parallel [(set (match_operand:XF 0 "register_operand") 15865 [(parallel [(set (match_operand:XF 0 "register_operand")
16153 && flag_unsafe_math_optimizations" 15871 && flag_unsafe_math_optimizations"
16154 "operands[2] = gen_reg_rtx (XFmode);") 15872 "operands[2] = gen_reg_rtx (XFmode);")
16155 15873
16156 (define_expand "significand<mode>2" 15874 (define_expand "significand<mode>2"
16157 [(use (match_operand:MODEF 0 "register_operand")) 15875 [(use (match_operand:MODEF 0 "register_operand"))
16158 (use (match_operand:MODEF 1 "register_operand"))] 15876 (use (match_operand:MODEF 1 "general_operand"))]
16159 "TARGET_USE_FANCY_MATH_387 15877 "TARGET_USE_FANCY_MATH_387
16160 && (!(SSE_FLOAT_MODE_P (<MODE>mode) && TARGET_SSE_MATH) 15878 && (!(SSE_FLOAT_MODE_P (<MODE>mode) && TARGET_SSE_MATH)
16161 || TARGET_MIX_SSE_I387) 15879 || TARGET_MIX_SSE_I387)
16162 && flag_unsafe_math_optimizations" 15880 && flag_unsafe_math_optimizations"
16163 { 15881 {
16164 rtx op0 = gen_reg_rtx (XFmode); 15882 rtx op0 = gen_reg_rtx (XFmode);
16165 rtx op1 = gen_reg_rtx (XFmode); 15883 rtx op1 = gen_reg_rtx (XFmode);
16166 15884
16167 emit_insn (gen_fxtract_extend<mode>xf3_i387 (op0, op1, operands[1])); 15885 emit_insn (gen_extend<mode>xf2 (op1, operands[1]));
16168 emit_insn (gen_truncxf<mode>2_i387_noop (operands[0], op0)); 15886 emit_insn (gen_significandxf2 (op0, op1));
15887 emit_insn (gen_truncxf<mode>2 (operands[0], op0));
16169 DONE; 15888 DONE;
16170 }) 15889 })
16171 15890
16172 15891
16173 (define_insn "sse4_1_round<mode>2" 15892 (define_insn "sse4_1_round<mode>2"
16174 [(set (match_operand:MODEF 0 "register_operand" "=x,v") 15893 [(set (match_operand:MODEF 0 "register_operand" "=x,v")
16175 (unspec:MODEF [(match_operand:MODEF 1 "register_operand" "x,v") 15894 (unspec:MODEF [(match_operand:MODEF 1 "nonimmediate_operand" "xm,vm")
16176 (match_operand:SI 2 "const_0_to_15_operand" "n,n")] 15895 (match_operand:SI 2 "const_0_to_15_operand" "n,n")]
16177 UNSPEC_ROUND))] 15896 UNSPEC_ROUND))]
16178 "TARGET_SSE4_1" 15897 "TARGET_SSE4_1"
16179 "@ 15898 "@
16180 %vround<ssemodesuffix>\t{%2, %1, %d0|%d0, %1, %2} 15899 %vround<ssemodesuffix>\t{%2, %1, %d0|%d0, %1, %2}
16194 "frndint" 15913 "frndint"
16195 [(set_attr "type" "fpspc") 15914 [(set_attr "type" "fpspc")
16196 (set_attr "znver1_decode" "vector") 15915 (set_attr "znver1_decode" "vector")
16197 (set_attr "mode" "XF")]) 15916 (set_attr "mode" "XF")])
16198 15917
16199 (define_insn "rint<mode>2_frndint"
16200 [(set (match_operand:MODEF 0 "register_operand" "=f")
16201 (unspec:MODEF [(match_operand:MODEF 1 "register_operand" "0")]
16202 UNSPEC_FRNDINT))]
16203 "TARGET_USE_FANCY_MATH_387"
16204 "frndint"
16205 [(set_attr "type" "fpspc")
16206 (set_attr "znver1_decode" "vector")
16207 (set_attr "mode" "<MODE>")])
16208
16209 (define_expand "rint<mode>2" 15918 (define_expand "rint<mode>2"
16210 [(use (match_operand:MODEF 0 "register_operand")) 15919 [(use (match_operand:MODEF 0 "register_operand"))
16211 (use (match_operand:MODEF 1 "register_operand"))] 15920 (use (match_operand:MODEF 1 "nonimmediate_operand"))]
16212 "(TARGET_USE_FANCY_MATH_387 15921 "TARGET_USE_FANCY_MATH_387
16213 && (!(SSE_FLOAT_MODE_P (<MODE>mode) && TARGET_SSE_MATH)
16214 || TARGET_MIX_SSE_I387))
16215 || (SSE_FLOAT_MODE_P (<MODE>mode) && TARGET_SSE_MATH)" 15922 || (SSE_FLOAT_MODE_P (<MODE>mode) && TARGET_SSE_MATH)"
16216 { 15923 {
16217 if (SSE_FLOAT_MODE_P (<MODE>mode) && TARGET_SSE_MATH) 15924 if (SSE_FLOAT_MODE_P (<MODE>mode) && TARGET_SSE_MATH)
16218 { 15925 {
16219 if (TARGET_SSE4_1) 15926 if (TARGET_SSE4_1)
16221 (operands[0], operands[1], GEN_INT (ROUND_MXCSR))); 15928 (operands[0], operands[1], GEN_INT (ROUND_MXCSR)));
16222 else 15929 else
16223 ix86_expand_rint (operands[0], operands[1]); 15930 ix86_expand_rint (operands[0], operands[1]);
16224 } 15931 }
16225 else 15932 else
16226 emit_insn (gen_rint<mode>2_frndint (operands[0], operands[1])); 15933 {
15934 rtx op0 = gen_reg_rtx (XFmode);
15935 rtx op1 = gen_reg_rtx (XFmode);
15936
15937 emit_insn (gen_extend<mode>xf2 (op1, operands[1]));
15938 emit_insn (gen_rintxf2 (op0, op1));
15939 emit_insn (gen_truncxf<mode>2_i387_noop_unspec (operands[0], op0));
15940 }
15941 DONE;
15942 })
15943
15944 (define_expand "nearbyintxf2"
15945 [(set (match_operand:XF 0 "register_operand")
15946 (unspec:XF [(match_operand:XF 1 "register_operand")]
15947 UNSPEC_FRNDINT))]
15948 "TARGET_USE_FANCY_MATH_387
15949 && !flag_trapping_math")
15950
15951 (define_expand "nearbyint<mode>2"
15952 [(use (match_operand:MODEF 0 "register_operand"))
15953 (use (match_operand:MODEF 1 "nonimmediate_operand"))]
15954 "(TARGET_USE_FANCY_MATH_387
15955 && (!(SSE_FLOAT_MODE_P (<MODE>mode) && TARGET_SSE_MATH)
15956 || TARGET_MIX_SSE_I387)
15957 && !flag_trapping_math)
15958 || (TARGET_SSE4_1 && TARGET_SSE_MATH)"
15959 {
15960 if (TARGET_SSE4_1 && TARGET_SSE_MATH)
15961 emit_insn (gen_sse4_1_round<mode>2
15962 (operands[0], operands[1], GEN_INT (ROUND_MXCSR
15963 | ROUND_NO_EXC)));
15964 else
15965 {
15966 rtx op0 = gen_reg_rtx (XFmode);
15967 rtx op1 = gen_reg_rtx (XFmode);
15968
15969 emit_insn (gen_extend<mode>xf2 (op1, operands[1]));
15970 emit_insn (gen_nearbyintxf2 (op0, op1));
15971 emit_insn (gen_truncxf<mode>2_i387_noop_unspec (operands[0], op0));
15972 }
16227 DONE; 15973 DONE;
16228 }) 15974 })
16229 15975
16230 (define_expand "round<mode>2" 15976 (define_expand "round<mode>2"
16231 [(match_operand:X87MODEF 0 "register_operand") 15977 [(match_operand:X87MODEF 0 "register_operand")
16232 (match_operand:X87MODEF 1 "nonimmediate_operand")] 15978 (match_operand:X87MODEF 1 "nonimmediate_operand")]
16233 "(TARGET_USE_FANCY_MATH_387 15979 "(TARGET_USE_FANCY_MATH_387
16234 && (!(SSE_FLOAT_MODE_P (<MODE>mode) && TARGET_SSE_MATH) 15980 && (!(SSE_FLOAT_MODE_P (<MODE>mode) && TARGET_SSE_MATH)
16235 || TARGET_MIX_SSE_I387) 15981 || TARGET_MIX_SSE_I387)
16236 && flag_unsafe_math_optimizations) 15982 && flag_unsafe_math_optimizations
15983 && (flag_fp_int_builtin_inexact || !flag_trapping_math))
16237 || (SSE_FLOAT_MODE_P (<MODE>mode) && TARGET_SSE_MATH 15984 || (SSE_FLOAT_MODE_P (<MODE>mode) && TARGET_SSE_MATH
16238 && !flag_trapping_math && !flag_rounding_math)" 15985 && !flag_trapping_math && !flag_rounding_math)"
16239 { 15986 {
16240 if (SSE_FLOAT_MODE_P (<MODE>mode) && TARGET_SSE_MATH 15987 if (SSE_FLOAT_MODE_P (<MODE>mode) && TARGET_SSE_MATH
16241 && !flag_trapping_math && !flag_rounding_math) 15988 && !flag_trapping_math && !flag_rounding_math)
16256 ix86_emit_i387_round (operands[0], operands[1]); 16003 ix86_emit_i387_round (operands[0], operands[1]);
16257 } 16004 }
16258 DONE; 16005 DONE;
16259 }) 16006 })
16260 16007
16261 (define_insn_and_split "*fistdi2_1" 16008 (define_insn "lrintxfdi2"
16262 [(set (match_operand:DI 0 "nonimmediate_operand") 16009 [(set (match_operand:DI 0 "nonimmediate_operand" "=m")
16263 (unspec:DI [(match_operand:XF 1 "register_operand")]
16264 UNSPEC_FIST))]
16265 "TARGET_USE_FANCY_MATH_387
16266 && can_create_pseudo_p ()"
16267 "#"
16268 "&& 1"
16269 [(const_int 0)]
16270 {
16271 if (memory_operand (operands[0], VOIDmode))
16272 emit_insn (gen_fistdi2 (operands[0], operands[1]));
16273 else
16274 {
16275 operands[2] = assign_386_stack_local (DImode, SLOT_TEMP);
16276 emit_insn (gen_fistdi2_with_temp (operands[0], operands[1],
16277 operands[2]));
16278 }
16279 DONE;
16280 }
16281 [(set_attr "type" "fpspc")
16282 (set_attr "mode" "DI")])
16283
16284 (define_insn "fistdi2"
16285 [(set (match_operand:DI 0 "memory_operand" "=m")
16286 (unspec:DI [(match_operand:XF 1 "register_operand" "f")] 16010 (unspec:DI [(match_operand:XF 1 "register_operand" "f")]
16287 UNSPEC_FIST)) 16011 UNSPEC_FIST))
16288 (clobber (match_scratch:XF 2 "=&1f"))] 16012 (clobber (match_scratch:XF 2 "=&f"))]
16289 "TARGET_USE_FANCY_MATH_387" 16013 "TARGET_USE_FANCY_MATH_387"
16290 "* return output_fix_trunc (insn, operands, false);" 16014 "* return output_fix_trunc (insn, operands, false);"
16291 [(set_attr "type" "fpspc") 16015 [(set_attr "type" "fpspc")
16292 (set_attr "mode" "DI")]) 16016 (set_attr "mode" "DI")])
16293 16017
16294 (define_insn "fistdi2_with_temp" 16018 (define_insn "lrintxf<mode>2"
16295 [(set (match_operand:DI 0 "nonimmediate_operand" "=m,?r") 16019 [(set (match_operand:SWI24 0 "nonimmediate_operand" "=m")
16296 (unspec:DI [(match_operand:XF 1 "register_operand" "f,f")]
16297 UNSPEC_FIST))
16298 (clobber (match_operand:DI 2 "memory_operand" "=X,m"))
16299 (clobber (match_scratch:XF 3 "=&1f,&1f"))]
16300 "TARGET_USE_FANCY_MATH_387"
16301 "#"
16302 [(set_attr "type" "fpspc")
16303 (set_attr "mode" "DI")])
16304
16305 (define_split
16306 [(set (match_operand:DI 0 "register_operand")
16307 (unspec:DI [(match_operand:XF 1 "register_operand")]
16308 UNSPEC_FIST))
16309 (clobber (match_operand:DI 2 "memory_operand"))
16310 (clobber (match_scratch 3))]
16311 "reload_completed"
16312 [(parallel [(set (match_dup 2) (unspec:DI [(match_dup 1)] UNSPEC_FIST))
16313 (clobber (match_dup 3))])
16314 (set (match_dup 0) (match_dup 2))])
16315
16316 (define_split
16317 [(set (match_operand:DI 0 "memory_operand")
16318 (unspec:DI [(match_operand:XF 1 "register_operand")]
16319 UNSPEC_FIST))
16320 (clobber (match_operand:DI 2 "memory_operand"))
16321 (clobber (match_scratch 3))]
16322 "reload_completed"
16323 [(parallel [(set (match_dup 0) (unspec:DI [(match_dup 1)] UNSPEC_FIST))
16324 (clobber (match_dup 3))])])
16325
16326 (define_insn_and_split "*fist<mode>2_1"
16327 [(set (match_operand:SWI24 0 "register_operand")
16328 (unspec:SWI24 [(match_operand:XF 1 "register_operand")]
16329 UNSPEC_FIST))]
16330 "TARGET_USE_FANCY_MATH_387
16331 && can_create_pseudo_p ()"
16332 "#"
16333 "&& 1"
16334 [(const_int 0)]
16335 {
16336 operands[2] = assign_386_stack_local (<MODE>mode, SLOT_TEMP);
16337 emit_insn (gen_fist<mode>2_with_temp (operands[0], operands[1],
16338 operands[2]));
16339 DONE;
16340 }
16341 [(set_attr "type" "fpspc")
16342 (set_attr "mode" "<MODE>")])
16343
16344 (define_insn "fist<mode>2"
16345 [(set (match_operand:SWI24 0 "memory_operand" "=m")
16346 (unspec:SWI24 [(match_operand:XF 1 "register_operand" "f")] 16020 (unspec:SWI24 [(match_operand:XF 1 "register_operand" "f")]
16347 UNSPEC_FIST))] 16021 UNSPEC_FIST))]
16348 "TARGET_USE_FANCY_MATH_387" 16022 "TARGET_USE_FANCY_MATH_387"
16349 "* return output_fix_trunc (insn, operands, false);" 16023 "* return output_fix_trunc (insn, operands, false);"
16350 [(set_attr "type" "fpspc") 16024 [(set_attr "type" "fpspc")
16351 (set_attr "mode" "<MODE>")]) 16025 (set_attr "mode" "<MODE>")])
16352
16353 (define_insn "fist<mode>2_with_temp"
16354 [(set (match_operand:SWI24 0 "register_operand" "=r")
16355 (unspec:SWI24 [(match_operand:XF 1 "register_operand" "f")]
16356 UNSPEC_FIST))
16357 (clobber (match_operand:SWI24 2 "memory_operand" "=m"))]
16358 "TARGET_USE_FANCY_MATH_387"
16359 "#"
16360 [(set_attr "type" "fpspc")
16361 (set_attr "mode" "<MODE>")])
16362
16363 (define_split
16364 [(set (match_operand:SWI24 0 "register_operand")
16365 (unspec:SWI24 [(match_operand:XF 1 "register_operand")]
16366 UNSPEC_FIST))
16367 (clobber (match_operand:SWI24 2 "memory_operand"))]
16368 "reload_completed"
16369 [(set (match_dup 2) (unspec:SWI24 [(match_dup 1)] UNSPEC_FIST))
16370 (set (match_dup 0) (match_dup 2))])
16371
16372 (define_split
16373 [(set (match_operand:SWI24 0 "memory_operand")
16374 (unspec:SWI24 [(match_operand:XF 1 "register_operand")]
16375 UNSPEC_FIST))
16376 (clobber (match_operand:SWI24 2 "memory_operand"))]
16377 "reload_completed"
16378 [(set (match_dup 0) (unspec:SWI24 [(match_dup 1)] UNSPEC_FIST))])
16379
16380 (define_expand "lrintxf<mode>2"
16381 [(set (match_operand:SWI248x 0 "nonimmediate_operand")
16382 (unspec:SWI248x [(match_operand:XF 1 "register_operand")]
16383 UNSPEC_FIST))]
16384 "TARGET_USE_FANCY_MATH_387")
16385 16026
16386 (define_expand "lrint<MODEF:mode><SWI48:mode>2" 16027 (define_expand "lrint<MODEF:mode><SWI48:mode>2"
16387 [(set (match_operand:SWI48 0 "nonimmediate_operand") 16028 [(set (match_operand:SWI48 0 "nonimmediate_operand")
16388 (unspec:SWI48 [(match_operand:MODEF 1 "register_operand")] 16029 (unspec:SWI48 [(match_operand:MODEF 1 "register_operand")]
16389 UNSPEC_FIX_NOTRUNC))] 16030 UNSPEC_FIX_NOTRUNC))]
16444 (UNSPEC_FRNDINT_TRUNC "TRUNC") 16085 (UNSPEC_FRNDINT_TRUNC "TRUNC")
16445 (UNSPEC_FIST_FLOOR "FLOOR") 16086 (UNSPEC_FIST_FLOOR "FLOOR")
16446 (UNSPEC_FIST_CEIL "CEIL")]) 16087 (UNSPEC_FIST_CEIL "CEIL")])
16447 16088
16448 ;; Rounding mode control word calculation could clobber FLAGS_REG. 16089 ;; Rounding mode control word calculation could clobber FLAGS_REG.
16449 (define_insn_and_split "frndint<mode>2_<rounding>" 16090 (define_insn_and_split "frndintxf2_<rounding>"
16450 [(set (match_operand:X87MODEF 0 "register_operand") 16091 [(set (match_operand:XF 0 "register_operand")
16451 (unspec:X87MODEF [(match_operand:X87MODEF 1 "register_operand")] 16092 (unspec:XF [(match_operand:XF 1 "register_operand")]
16452 FRNDINT_ROUNDING)) 16093 FRNDINT_ROUNDING))
16453 (clobber (reg:CC FLAGS_REG))] 16094 (clobber (reg:CC FLAGS_REG))]
16454 "TARGET_USE_FANCY_MATH_387 16095 "TARGET_USE_FANCY_MATH_387
16455 && (flag_fp_int_builtin_inexact || !flag_trapping_math) 16096 && (flag_fp_int_builtin_inexact || !flag_trapping_math)
16456 && can_create_pseudo_p ()" 16097 && can_create_pseudo_p ()"
16461 ix86_optimize_mode_switching[I387_<ROUNDING>] = 1; 16102 ix86_optimize_mode_switching[I387_<ROUNDING>] = 1;
16462 16103
16463 operands[2] = assign_386_stack_local (HImode, SLOT_CW_STORED); 16104 operands[2] = assign_386_stack_local (HImode, SLOT_CW_STORED);
16464 operands[3] = assign_386_stack_local (HImode, SLOT_CW_<ROUNDING>); 16105 operands[3] = assign_386_stack_local (HImode, SLOT_CW_<ROUNDING>);
16465 16106
16466 emit_insn (gen_frndint<mode>2_<rounding>_i387 (operands[0], operands[1], 16107 emit_insn (gen_frndintxf2_<rounding>_i387 (operands[0], operands[1],
16467 operands[2], operands[3])); 16108 operands[2], operands[3]));
16468 DONE; 16109 DONE;
16469 } 16110 }
16470 [(set_attr "type" "frndint") 16111 [(set_attr "type" "frndint")
16471 (set_attr "i387_cw" "<rounding>") 16112 (set_attr "i387_cw" "<rounding>")
16472 (set_attr "mode" "<MODE>")]) 16113 (set_attr "mode" "XF")])
16473 16114
16474 (define_insn "frndint<mode>2_<rounding>_i387" 16115 (define_insn "frndintxf2_<rounding>_i387"
16475 [(set (match_operand:X87MODEF 0 "register_operand" "=f") 16116 [(set (match_operand:XF 0 "register_operand" "=f")
16476 (unspec:X87MODEF [(match_operand:X87MODEF 1 "register_operand" "0")] 16117 (unspec:XF [(match_operand:XF 1 "register_operand" "0")]
16477 FRNDINT_ROUNDING)) 16118 FRNDINT_ROUNDING))
16478 (use (match_operand:HI 2 "memory_operand" "m")) 16119 (use (match_operand:HI 2 "memory_operand" "m"))
16479 (use (match_operand:HI 3 "memory_operand" "m"))] 16120 (use (match_operand:HI 3 "memory_operand" "m"))]
16480 "TARGET_USE_FANCY_MATH_387 16121 "TARGET_USE_FANCY_MATH_387
16481 && (flag_fp_int_builtin_inexact || !flag_trapping_math)" 16122 && (flag_fp_int_builtin_inexact || !flag_trapping_math)"
16482 "fldcw\t%3\n\tfrndint\n\tfldcw\t%2" 16123 "fldcw\t%3\n\tfrndint\n\tfldcw\t%2"
16483 [(set_attr "type" "frndint") 16124 [(set_attr "type" "frndint")
16484 (set_attr "i387_cw" "<rounding>") 16125 (set_attr "i387_cw" "<rounding>")
16485 (set_attr "mode" "<MODE>")]) 16126 (set_attr "mode" "XF")])
16486 16127
16487 (define_expand "<rounding_insn>xf2" 16128 (define_expand "<rounding_insn>xf2"
16488 [(parallel [(set (match_operand:XF 0 "register_operand") 16129 [(parallel [(set (match_operand:XF 0 "register_operand")
16489 (unspec:XF [(match_operand:XF 1 "register_operand")] 16130 (unspec:XF [(match_operand:XF 1 "register_operand")]
16490 FRNDINT_ROUNDING)) 16131 FRNDINT_ROUNDING))
16500 "(TARGET_USE_FANCY_MATH_387 16141 "(TARGET_USE_FANCY_MATH_387
16501 && (!(SSE_FLOAT_MODE_P (<MODE>mode) && TARGET_SSE_MATH) 16142 && (!(SSE_FLOAT_MODE_P (<MODE>mode) && TARGET_SSE_MATH)
16502 || TARGET_MIX_SSE_I387) 16143 || TARGET_MIX_SSE_I387)
16503 && (flag_fp_int_builtin_inexact || !flag_trapping_math)) 16144 && (flag_fp_int_builtin_inexact || !flag_trapping_math))
16504 || (SSE_FLOAT_MODE_P (<MODE>mode) && TARGET_SSE_MATH 16145 || (SSE_FLOAT_MODE_P (<MODE>mode) && TARGET_SSE_MATH
16505 && (TARGET_SSE4_1 || !flag_trapping_math 16146 && (TARGET_SSE4_1 || flag_fp_int_builtin_inexact
16506 || flag_fp_int_builtin_inexact))" 16147 || !flag_trapping_math))"
16507 { 16148 {
16508 if (SSE_FLOAT_MODE_P (<MODE>mode) && TARGET_SSE_MATH 16149 if (SSE_FLOAT_MODE_P (<MODE>mode) && TARGET_SSE_MATH
16509 && (TARGET_SSE4_1 || !flag_trapping_math || flag_fp_int_builtin_inexact)) 16150 && (TARGET_SSE4_1 || flag_fp_int_builtin_inexact || !flag_trapping_math))
16510 { 16151 {
16511 if (TARGET_SSE4_1) 16152 if (TARGET_SSE4_1)
16512 emit_insn (gen_sse4_1_round<mode>2 16153 emit_insn (gen_sse4_1_round<mode>2
16513 (operands[0], operands[1], GEN_INT (ROUND_<ROUNDING> 16154 (operands[0], operands[1], GEN_INT (ROUND_<ROUNDING>
16514 | ROUND_NO_EXC))); 16155 | ROUND_NO_EXC)));
16534 else 16175 else
16535 gcc_unreachable (); 16176 gcc_unreachable ();
16536 } 16177 }
16537 } 16178 }
16538 else 16179 else
16539 emit_insn (gen_frndint<mode>2_<rounding> (operands[0], operands[1])); 16180 {
16181 rtx op0 = gen_reg_rtx (XFmode);
16182 rtx op1 = gen_reg_rtx (XFmode);
16183
16184 emit_insn (gen_extend<mode>xf2 (op1, operands[1]));
16185 emit_insn (gen_frndintxf2_<rounding> (op0, op1));
16186 emit_insn (gen_truncxf<mode>2_i387_noop_unspec (operands[0], op0));
16187 }
16540 DONE; 16188 DONE;
16541 }) 16189 })
16542 16190
16543 ;; Rounding mode control word calculation could clobber FLAGS_REG. 16191 ;; Rounding mode control word calculation could clobber FLAGS_REG.
16544 (define_insn_and_split "frndintxf2_mask_pm" 16192 (define_insn_and_split "*fist<mode>2_<rounding>_1"
16545 [(set (match_operand:XF 0 "register_operand") 16193 [(set (match_operand:SWI248x 0 "nonimmediate_operand")
16546 (unspec:XF [(match_operand:XF 1 "register_operand")] 16194 (unspec:SWI248x [(match_operand:XF 1 "register_operand")]
16547 UNSPEC_FRNDINT_MASK_PM)) 16195 FIST_ROUNDING))
16548 (clobber (reg:CC FLAGS_REG))] 16196 (clobber (reg:CC FLAGS_REG))]
16549 "TARGET_USE_FANCY_MATH_387 16197 "TARGET_USE_FANCY_MATH_387
16550 && flag_unsafe_math_optimizations 16198 && flag_unsafe_math_optimizations
16551 && can_create_pseudo_p ()" 16199 && can_create_pseudo_p ()"
16552 "#" 16200 "#"
16553 "&& 1" 16201 "&& 1"
16554 [(const_int 0)] 16202 [(const_int 0)]
16555 { 16203 {
16556 ix86_optimize_mode_switching[I387_MASK_PM] = 1;
16557
16558 operands[2] = assign_386_stack_local (HImode, SLOT_CW_STORED);
16559 operands[3] = assign_386_stack_local (HImode, SLOT_CW_MASK_PM);
16560
16561 emit_insn (gen_frndintxf2_mask_pm_i387 (operands[0], operands[1],
16562 operands[2], operands[3]));
16563 DONE;
16564 }
16565 [(set_attr "type" "frndint")
16566 (set_attr "i387_cw" "mask_pm")
16567 (set_attr "mode" "XF")])
16568
16569 (define_insn "frndintxf2_mask_pm_i387"
16570 [(set (match_operand:XF 0 "register_operand" "=f")
16571 (unspec:XF [(match_operand:XF 1 "register_operand" "0")]
16572 UNSPEC_FRNDINT_MASK_PM))
16573 (use (match_operand:HI 2 "memory_operand" "m"))
16574 (use (match_operand:HI 3 "memory_operand" "m"))]
16575 "TARGET_USE_FANCY_MATH_387
16576 && flag_unsafe_math_optimizations"
16577 "fldcw\t%3\n\tfrndint\n\tfclex\n\tfldcw\t%2"
16578 [(set_attr "type" "frndint")
16579 (set_attr "i387_cw" "mask_pm")
16580 (set_attr "mode" "XF")])
16581
16582 (define_expand "nearbyintxf2"
16583 [(parallel [(set (match_operand:XF 0 "register_operand")
16584 (unspec:XF [(match_operand:XF 1 "register_operand")]
16585 UNSPEC_FRNDINT_MASK_PM))
16586 (clobber (reg:CC FLAGS_REG))])]
16587 "TARGET_USE_FANCY_MATH_387
16588 && flag_unsafe_math_optimizations")
16589
16590 (define_expand "nearbyint<mode>2"
16591 [(use (match_operand:MODEF 0 "register_operand"))
16592 (use (match_operand:MODEF 1 "register_operand"))]
16593 "TARGET_USE_FANCY_MATH_387
16594 && (!(SSE_FLOAT_MODE_P (<MODE>mode) && TARGET_SSE_MATH)
16595 || TARGET_MIX_SSE_I387)
16596 && flag_unsafe_math_optimizations"
16597 {
16598 rtx op0 = gen_reg_rtx (XFmode);
16599 rtx op1 = gen_reg_rtx (XFmode);
16600
16601 emit_insn (gen_extend<mode>xf2 (op1, operands[1]));
16602 emit_insn (gen_frndintxf2_mask_pm (op0, op1));
16603
16604 emit_insn (gen_truncxf<mode>2_i387_noop (operands[0], op0));
16605 DONE;
16606 })
16607
16608 ;; Rounding mode control word calculation could clobber FLAGS_REG.
16609 (define_insn_and_split "*fist<mode>2_<rounding>_1"
16610 [(set (match_operand:SWI248x 0 "nonimmediate_operand")
16611 (unspec:SWI248x [(match_operand:XF 1 "register_operand")]
16612 FIST_ROUNDING))
16613 (clobber (reg:CC FLAGS_REG))]
16614 "TARGET_USE_FANCY_MATH_387
16615 && flag_unsafe_math_optimizations
16616 && can_create_pseudo_p ()"
16617 "#"
16618 "&& 1"
16619 [(const_int 0)]
16620 {
16621 ix86_optimize_mode_switching[I387_<ROUNDING>] = 1; 16204 ix86_optimize_mode_switching[I387_<ROUNDING>] = 1;
16622 16205
16623 operands[2] = assign_386_stack_local (HImode, SLOT_CW_STORED); 16206 operands[2] = assign_386_stack_local (HImode, SLOT_CW_STORED);
16624 operands[3] = assign_386_stack_local (HImode, SLOT_CW_<ROUNDING>); 16207 operands[3] = assign_386_stack_local (HImode, SLOT_CW_<ROUNDING>);
16625 if (memory_operand (operands[0], VOIDmode)) 16208
16626 emit_insn (gen_fist<mode>2_<rounding> (operands[0], operands[1], 16209 emit_insn (gen_fist<mode>2_<rounding> (operands[0], operands[1],
16627 operands[2], operands[3])); 16210 operands[2], operands[3]));
16628 else
16629 {
16630 operands[4] = assign_386_stack_local (<MODE>mode, SLOT_TEMP);
16631 emit_insn (gen_fist<mode>2_<rounding>_with_temp
16632 (operands[0], operands[1], operands[2],
16633 operands[3], operands[4]));
16634 }
16635 DONE; 16211 DONE;
16636 } 16212 }
16637 [(set_attr "type" "fistp") 16213 [(set_attr "type" "fistp")
16638 (set_attr "i387_cw" "<rounding>") 16214 (set_attr "i387_cw" "<rounding>")
16639 (set_attr "mode" "<MODE>")]) 16215 (set_attr "mode" "<MODE>")])
16640 16216
16641 (define_insn "fistdi2_<rounding>" 16217 (define_insn "fistdi2_<rounding>"
16642 [(set (match_operand:DI 0 "memory_operand" "=m") 16218 [(set (match_operand:DI 0 "nonimmediate_operand" "=m")
16643 (unspec:DI [(match_operand:XF 1 "register_operand" "f")] 16219 (unspec:DI [(match_operand:XF 1 "register_operand" "f")]
16644 FIST_ROUNDING)) 16220 FIST_ROUNDING))
16645 (use (match_operand:HI 2 "memory_operand" "m")) 16221 (use (match_operand:HI 2 "memory_operand" "m"))
16646 (use (match_operand:HI 3 "memory_operand" "m")) 16222 (use (match_operand:HI 3 "memory_operand" "m"))
16647 (clobber (match_scratch:XF 4 "=&1f"))] 16223 (clobber (match_scratch:XF 4 "=&f"))]
16648 "TARGET_USE_FANCY_MATH_387 16224 "TARGET_USE_FANCY_MATH_387
16649 && flag_unsafe_math_optimizations" 16225 && flag_unsafe_math_optimizations"
16650 "* return output_fix_trunc (insn, operands, false);" 16226 "* return output_fix_trunc (insn, operands, false);"
16651 [(set_attr "type" "fistp") 16227 [(set_attr "type" "fistp")
16652 (set_attr "i387_cw" "<rounding>") 16228 (set_attr "i387_cw" "<rounding>")
16653 (set_attr "mode" "DI")]) 16229 (set_attr "mode" "DI")])
16654 16230
16655 (define_insn "fistdi2_<rounding>_with_temp"
16656 [(set (match_operand:DI 0 "nonimmediate_operand" "=m,?r")
16657 (unspec:DI [(match_operand:XF 1 "register_operand" "f,f")]
16658 FIST_ROUNDING))
16659 (use (match_operand:HI 2 "memory_operand" "m,m"))
16660 (use (match_operand:HI 3 "memory_operand" "m,m"))
16661 (clobber (match_operand:DI 4 "memory_operand" "=X,m"))
16662 (clobber (match_scratch:XF 5 "=&1f,&1f"))]
16663 "TARGET_USE_FANCY_MATH_387
16664 && flag_unsafe_math_optimizations"
16665 "#"
16666 [(set_attr "type" "fistp")
16667 (set_attr "i387_cw" "<rounding>")
16668 (set_attr "mode" "DI")])
16669
16670 (define_split
16671 [(set (match_operand:DI 0 "register_operand")
16672 (unspec:DI [(match_operand:XF 1 "register_operand")]
16673 FIST_ROUNDING))
16674 (use (match_operand:HI 2 "memory_operand"))
16675 (use (match_operand:HI 3 "memory_operand"))
16676 (clobber (match_operand:DI 4 "memory_operand"))
16677 (clobber (match_scratch 5))]
16678 "reload_completed"
16679 [(parallel [(set (match_dup 4)
16680 (unspec:DI [(match_dup 1)] FIST_ROUNDING))
16681 (use (match_dup 2))
16682 (use (match_dup 3))
16683 (clobber (match_dup 5))])
16684 (set (match_dup 0) (match_dup 4))])
16685
16686 (define_split
16687 [(set (match_operand:DI 0 "memory_operand")
16688 (unspec:DI [(match_operand:XF 1 "register_operand")]
16689 FIST_ROUNDING))
16690 (use (match_operand:HI 2 "memory_operand"))
16691 (use (match_operand:HI 3 "memory_operand"))
16692 (clobber (match_operand:DI 4 "memory_operand"))
16693 (clobber (match_scratch 5))]
16694 "reload_completed"
16695 [(parallel [(set (match_dup 0)
16696 (unspec:DI [(match_dup 1)] FIST_ROUNDING))
16697 (use (match_dup 2))
16698 (use (match_dup 3))
16699 (clobber (match_dup 5))])])
16700
16701 (define_insn "fist<mode>2_<rounding>" 16231 (define_insn "fist<mode>2_<rounding>"
16702 [(set (match_operand:SWI24 0 "memory_operand" "=m") 16232 [(set (match_operand:SWI24 0 "nonimmediate_operand" "=m")
16703 (unspec:SWI24 [(match_operand:XF 1 "register_operand" "f")] 16233 (unspec:SWI24 [(match_operand:XF 1 "register_operand" "f")]
16704 FIST_ROUNDING)) 16234 FIST_ROUNDING))
16705 (use (match_operand:HI 2 "memory_operand" "m")) 16235 (use (match_operand:HI 2 "memory_operand" "m"))
16706 (use (match_operand:HI 3 "memory_operand" "m"))] 16236 (use (match_operand:HI 3 "memory_operand" "m"))]
16707 "TARGET_USE_FANCY_MATH_387 16237 "TARGET_USE_FANCY_MATH_387
16709 "* return output_fix_trunc (insn, operands, false);" 16239 "* return output_fix_trunc (insn, operands, false);"
16710 [(set_attr "type" "fistp") 16240 [(set_attr "type" "fistp")
16711 (set_attr "i387_cw" "<rounding>") 16241 (set_attr "i387_cw" "<rounding>")
16712 (set_attr "mode" "<MODE>")]) 16242 (set_attr "mode" "<MODE>")])
16713 16243
16714 (define_insn "fist<mode>2_<rounding>_with_temp"
16715 [(set (match_operand:SWI24 0 "nonimmediate_operand" "=m,?r")
16716 (unspec:SWI24 [(match_operand:XF 1 "register_operand" "f,f")]
16717 FIST_ROUNDING))
16718 (use (match_operand:HI 2 "memory_operand" "m,m"))
16719 (use (match_operand:HI 3 "memory_operand" "m,m"))
16720 (clobber (match_operand:SWI24 4 "memory_operand" "=X,m"))]
16721 "TARGET_USE_FANCY_MATH_387
16722 && flag_unsafe_math_optimizations"
16723 "#"
16724 [(set_attr "type" "fistp")
16725 (set_attr "i387_cw" "<rounding>")
16726 (set_attr "mode" "<MODE>")])
16727
16728 (define_split
16729 [(set (match_operand:SWI24 0 "register_operand")
16730 (unspec:SWI24 [(match_operand:XF 1 "register_operand")]
16731 FIST_ROUNDING))
16732 (use (match_operand:HI 2 "memory_operand"))
16733 (use (match_operand:HI 3 "memory_operand"))
16734 (clobber (match_operand:SWI24 4 "memory_operand"))]
16735 "reload_completed"
16736 [(parallel [(set (match_dup 4)
16737 (unspec:SWI24 [(match_dup 1)] FIST_ROUNDING))
16738 (use (match_dup 2))
16739 (use (match_dup 3))])
16740 (set (match_dup 0) (match_dup 4))])
16741
16742 (define_split
16743 [(set (match_operand:SWI24 0 "memory_operand")
16744 (unspec:SWI24 [(match_operand:XF 1 "register_operand")]
16745 FIST_ROUNDING))
16746 (use (match_operand:HI 2 "memory_operand"))
16747 (use (match_operand:HI 3 "memory_operand"))
16748 (clobber (match_operand:SWI24 4 "memory_operand"))]
16749 "reload_completed"
16750 [(parallel [(set (match_dup 0)
16751 (unspec:SWI24 [(match_dup 1)] FIST_ROUNDING))
16752 (use (match_dup 2))
16753 (use (match_dup 3))])])
16754
16755 (define_expand "l<rounding_insn>xf<mode>2" 16244 (define_expand "l<rounding_insn>xf<mode>2"
16756 [(parallel [(set (match_operand:SWI248x 0 "nonimmediate_operand") 16245 [(parallel [(set (match_operand:SWI248x 0 "nonimmediate_operand")
16757 (unspec:SWI248x [(match_operand:XF 1 "register_operand")] 16246 (unspec:SWI248x [(match_operand:XF 1 "register_operand")]
16758 FIST_ROUNDING)) 16247 FIST_ROUNDING))
16759 (clobber (reg:CC FLAGS_REG))])] 16248 (clobber (reg:CC FLAGS_REG))])]
16765 [(parallel [(set (match_operand:SWI48 0 "nonimmediate_operand") 16254 [(parallel [(set (match_operand:SWI48 0 "nonimmediate_operand")
16766 (unspec:SWI48 [(match_operand:MODEF 1 "register_operand")] 16255 (unspec:SWI48 [(match_operand:MODEF 1 "register_operand")]
16767 FIST_ROUNDING)) 16256 FIST_ROUNDING))
16768 (clobber (reg:CC FLAGS_REG))])] 16257 (clobber (reg:CC FLAGS_REG))])]
16769 "SSE_FLOAT_MODE_P (<MODEF:MODE>mode) && TARGET_SSE_MATH 16258 "SSE_FLOAT_MODE_P (<MODEF:MODE>mode) && TARGET_SSE_MATH
16770 && !flag_trapping_math" 16259 && (TARGET_SSE4_1 || !flag_trapping_math)"
16771 { 16260 {
16772 if (TARGET_64BIT && optimize_insn_for_size_p ()) 16261 if (TARGET_SSE4_1)
16773 FAIL; 16262 {
16774 16263 rtx tmp = gen_reg_rtx (<MODEF:MODE>mode);
16775 if (ROUND_<ROUNDING> == ROUND_FLOOR) 16264
16265 emit_insn (gen_sse4_1_round<mode>2
16266 (tmp, operands[1], GEN_INT (ROUND_<ROUNDING>
16267 | ROUND_NO_EXC)));
16268 emit_insn (gen_fix_trunc<MODEF:mode><SWI48:mode>2
16269 (operands[0], tmp));
16270 }
16271 else if (ROUND_<ROUNDING> == ROUND_FLOOR)
16776 ix86_expand_lfloorceil (operands[0], operands[1], true); 16272 ix86_expand_lfloorceil (operands[0], operands[1], true);
16777 else if (ROUND_<ROUNDING> == ROUND_CEIL) 16273 else if (ROUND_<ROUNDING> == ROUND_CEIL)
16778 ix86_expand_lfloorceil (operands[0], operands[1], false); 16274 ix86_expand_lfloorceil (operands[0], operands[1], false);
16779 else 16275 else
16780 gcc_unreachable (); 16276 gcc_unreachable ();
16791 "fxam\n\tfnstsw\t%0" 16287 "fxam\n\tfnstsw\t%0"
16792 [(set_attr "type" "multi") 16288 [(set_attr "type" "multi")
16793 (set_attr "length" "4") 16289 (set_attr "length" "4")
16794 (set_attr "unit" "i387") 16290 (set_attr "unit" "i387")
16795 (set_attr "mode" "<MODE>")]) 16291 (set_attr "mode" "<MODE>")])
16796
16797 (define_insn_and_split "fxam<mode>2_i387_with_temp"
16798 [(set (match_operand:HI 0 "register_operand")
16799 (unspec:HI
16800 [(match_operand:MODEF 1 "memory_operand")]
16801 UNSPEC_FXAM_MEM))]
16802 "TARGET_USE_FANCY_MATH_387
16803 && can_create_pseudo_p ()"
16804 "#"
16805 "&& 1"
16806 [(set (match_dup 2)(match_dup 1))
16807 (set (match_dup 0)
16808 (unspec:HI [(match_dup 2)] UNSPEC_FXAM))]
16809 {
16810 operands[2] = gen_reg_rtx (<MODE>mode);
16811
16812 MEM_VOLATILE_P (operands[1]) = 1;
16813 }
16814 [(set_attr "type" "multi")
16815 (set_attr "unit" "i387")
16816 (set_attr "mode" "<MODE>")])
16817
16818 (define_expand "isinfxf2"
16819 [(use (match_operand:SI 0 "register_operand"))
16820 (use (match_operand:XF 1 "register_operand"))]
16821 "TARGET_USE_FANCY_MATH_387
16822 && ix86_libc_has_function (function_c99_misc)"
16823 {
16824 rtx mask = GEN_INT (0x45);
16825 rtx val = GEN_INT (0x05);
16826
16827 rtx scratch = gen_reg_rtx (HImode);
16828 rtx res = gen_reg_rtx (QImode);
16829
16830 emit_insn (gen_fxamxf2_i387 (scratch, operands[1]));
16831
16832 emit_insn (gen_andqi_ext_1 (scratch, scratch, mask));
16833 emit_insn (gen_cmpqi_ext_3 (scratch, val));
16834 ix86_expand_setcc (res, EQ,
16835 gen_rtx_REG (CCmode, FLAGS_REG), const0_rtx);
16836 emit_insn (gen_zero_extendqisi2 (operands[0], res));
16837 DONE;
16838 })
16839
16840 (define_expand "isinf<mode>2"
16841 [(use (match_operand:SI 0 "register_operand"))
16842 (use (match_operand:MODEF 1 "nonimmediate_operand"))]
16843 "TARGET_USE_FANCY_MATH_387
16844 && ix86_libc_has_function (function_c99_misc)
16845 && !(SSE_FLOAT_MODE_P (<MODE>mode) && TARGET_SSE_MATH)"
16846 {
16847 rtx mask = GEN_INT (0x45);
16848 rtx val = GEN_INT (0x05);
16849
16850 rtx scratch = gen_reg_rtx (HImode);
16851 rtx res = gen_reg_rtx (QImode);
16852
16853 /* Remove excess precision by forcing value through memory. */
16854 if (memory_operand (operands[1], VOIDmode))
16855 emit_insn (gen_fxam<mode>2_i387_with_temp (scratch, operands[1]));
16856 else
16857 {
16858 rtx temp = assign_386_stack_local (<MODE>mode, SLOT_TEMP);
16859
16860 emit_move_insn (temp, operands[1]);
16861 emit_insn (gen_fxam<mode>2_i387_with_temp (scratch, temp));
16862 }
16863
16864 emit_insn (gen_andqi_ext_1 (scratch, scratch, mask));
16865 emit_insn (gen_cmpqi_ext_3 (scratch, val));
16866 ix86_expand_setcc (res, EQ,
16867 gen_rtx_REG (CCmode, FLAGS_REG), const0_rtx);
16868 emit_insn (gen_zero_extendqisi2 (operands[0], res));
16869 DONE;
16870 })
16871 16292
16872 (define_expand "signbittf2" 16293 (define_expand "signbittf2"
16873 [(use (match_operand:SI 0 "register_operand")) 16294 [(use (match_operand:SI 0 "register_operand"))
16874 (use (match_operand:TF 1 "register_operand"))] 16295 (use (match_operand:TF 1 "register_operand"))]
16875 "TARGET_SSE" 16296 "TARGET_SSE"
17719 (const_int -1) 17140 (const_int -1)
17720 (const_int 0))) 17141 (const_int 0)))
17721 (clobber (reg:CC FLAGS_REG))] 17142 (clobber (reg:CC FLAGS_REG))]
17722 "" 17143 ""
17723 "sbb{<imodesuffix>}\t%0, %0" 17144 "sbb{<imodesuffix>}\t%0, %0"
17724 ; Since we don't have the proper number of operands for an alu insn, 17145 [(set_attr "type" "alu1")
17725 ; fill in all the blanks.
17726 [(set_attr "type" "alu")
17727 (set_attr "modrm_class" "op0")
17728 (set_attr "use_carry" "1") 17146 (set_attr "use_carry" "1")
17729 (set_attr "pent_pair" "pu") 17147 (set_attr "pent_pair" "pu")
17730 (set_attr "memory" "none")
17731 (set_attr "imm_disp" "false")
17732 (set_attr "mode" "<MODE>") 17148 (set_attr "mode" "<MODE>")
17733 (set_attr "length_immediate" "0")]) 17149 (set_attr "length_immediate" "0")])
17734 17150
17735 (define_insn "*x86_mov<mode>cc_0_m1_se" 17151 (define_insn "*x86_mov<mode>cc_0_m1_se"
17736 [(set (match_operand:SWI48 0 "register_operand" "=r") 17152 [(set (match_operand:SWI48 0 "register_operand" "=r")
17739 (const_int 1) 17155 (const_int 1)
17740 (const_int 0))) 17156 (const_int 0)))
17741 (clobber (reg:CC FLAGS_REG))] 17157 (clobber (reg:CC FLAGS_REG))]
17742 "" 17158 ""
17743 "sbb{<imodesuffix>}\t%0, %0" 17159 "sbb{<imodesuffix>}\t%0, %0"
17744 [(set_attr "type" "alu") 17160 [(set_attr "type" "alu1")
17745 (set_attr "modrm_class" "op0")
17746 (set_attr "use_carry" "1") 17161 (set_attr "use_carry" "1")
17747 (set_attr "pent_pair" "pu") 17162 (set_attr "pent_pair" "pu")
17748 (set_attr "memory" "none")
17749 (set_attr "imm_disp" "false")
17750 (set_attr "mode" "<MODE>") 17163 (set_attr "mode" "<MODE>")
17751 (set_attr "length_immediate" "0")]) 17164 (set_attr "length_immediate" "0")])
17752 17165
17753 (define_insn "*x86_mov<mode>cc_0_m1_neg" 17166 (define_insn "*x86_mov<mode>cc_0_m1_neg"
17754 [(set (match_operand:SWI48 0 "register_operand" "=r") 17167 [(set (match_operand:SWI48 0 "register_operand" "=r")
17755 (neg:SWI48 (match_operator 1 "ix86_carry_flag_operator" 17168 (neg:SWI48 (match_operator 1 "ix86_carry_flag_operator"
17756 [(reg FLAGS_REG) (const_int 0)]))) 17169 [(reg FLAGS_REG) (const_int 0)])))
17757 (clobber (reg:CC FLAGS_REG))] 17170 (clobber (reg:CC FLAGS_REG))]
17758 "" 17171 ""
17759 "sbb{<imodesuffix>}\t%0, %0" 17172 "sbb{<imodesuffix>}\t%0, %0"
17760 [(set_attr "type" "alu") 17173 [(set_attr "type" "alu1")
17761 (set_attr "modrm_class" "op0")
17762 (set_attr "use_carry" "1") 17174 (set_attr "use_carry" "1")
17763 (set_attr "pent_pair" "pu") 17175 (set_attr "pent_pair" "pu")
17764 (set_attr "memory" "none")
17765 (set_attr "imm_disp" "false")
17766 (set_attr "mode" "<MODE>") 17176 (set_attr "mode" "<MODE>")
17767 (set_attr "length_immediate" "0")]) 17177 (set_attr "length_immediate" "0")])
17768 17178
17769 (define_insn "*mov<mode>cc_noc" 17179 (define_insn "*mov<mode>cc_noc"
17770 [(set (match_operand:SWI248 0 "register_operand" "=r,r") 17180 [(set (match_operand:SWI248 0 "register_operand" "=r,r")
18306 (clobber (reg:CC FLAGS_REG))] 17716 (clobber (reg:CC FLAGS_REG))]
18307 "" 17717 ""
18308 "* return output_probe_stack_range (operands[0], operands[2]);" 17718 "* return output_probe_stack_range (operands[0], operands[2]);"
18309 [(set_attr "type" "multi")]) 17719 [(set_attr "type" "multi")])
18310 17720
18311 /* Additional processing for builtin_setjmp. Store the shadow stack pointer
18312 as a forth element in jmpbuf. */
18313 (define_expand "builtin_setjmp_setup"
18314 [(match_operand 0 "address_operand")]
18315 "TARGET_SHSTK"
18316 {
18317 if (flag_cf_protection & CF_RETURN)
18318 {
18319 rtx mem, reg_ssp;
18320
18321 mem = gen_rtx_MEM (Pmode, plus_constant (Pmode, operands[0],
18322 3 * GET_MODE_SIZE (Pmode)));
18323 reg_ssp = gen_reg_rtx (Pmode);
18324 emit_insn (gen_rtx_SET (reg_ssp, const0_rtx));
18325 emit_insn ((Pmode == SImode)
18326 ? gen_rdsspsi (reg_ssp, reg_ssp)
18327 : gen_rdsspdi (reg_ssp, reg_ssp));
18328 emit_move_insn (mem, reg_ssp);
18329 }
18330 DONE;
18331 })
18332
18333 (define_expand "builtin_setjmp_receiver" 17721 (define_expand "builtin_setjmp_receiver"
18334 [(label_ref (match_operand 0))] 17722 [(label_ref (match_operand 0))]
18335 "!TARGET_64BIT && flag_pic" 17723 "!TARGET_64BIT && flag_pic"
18336 { 17724 {
18337 #if TARGET_MACHO 17725 #if TARGET_MACHO
18348 #endif 17736 #endif
18349 emit_insn (gen_set_got (pic_offset_table_rtx)); 17737 emit_insn (gen_set_got (pic_offset_table_rtx));
18350 DONE; 17738 DONE;
18351 }) 17739 })
18352 17740
18353 (define_expand "builtin_longjmp" 17741 (define_expand "save_stack_nonlocal"
18354 [(match_operand 0 "address_operand")] 17742 [(set (match_operand 0 "memory_operand")
18355 "TARGET_SHSTK" 17743 (match_operand 1 "register_operand"))]
18356 { 17744 ""
18357 rtx fp, lab, stack; 17745 {
18358 rtx jump, label, reg_adj, reg_ssp, reg_minus, mem_buf, tmp, clob; 17746 rtx stack_slot;
18359 machine_mode sa_mode = STACK_SAVEAREA_MODE (SAVE_NONLOCAL); 17747 if ((flag_cf_protection & CF_RETURN))
18360
18361 /* Adjust the shadow stack pointer (ssp) to the value saved in the
18362 jmp_buf. The saving was done in the builtin_setjmp_setup. */
18363 if (flag_cf_protection & CF_RETURN)
18364 { 17748 {
18365 /* Get current shadow stack pointer. The code below will check if 17749 /* Copy shadow stack pointer to the first slot and stack ppointer
18366 SHSTK feature is enabled. If it's not enabled RDSSP instruction 17750 to the second slot. */
17751 rtx ssp_slot = adjust_address (operands[0], word_mode, 0);
17752 stack_slot = adjust_address (operands[0], Pmode, UNITS_PER_WORD);
17753 rtx ssp = gen_reg_rtx (word_mode);
17754 emit_insn ((word_mode == SImode)
17755 ? gen_rdsspsi (ssp)
17756 : gen_rdsspdi (ssp));
17757 emit_move_insn (ssp_slot, ssp);
17758 }
17759 else
17760 stack_slot = adjust_address (operands[0], Pmode, 0);
17761 emit_move_insn (stack_slot, operands[1]);
17762 DONE;
17763 })
17764
17765 (define_expand "restore_stack_nonlocal"
17766 [(set (match_operand 0 "register_operand" "")
17767 (match_operand 1 "memory_operand" ""))]
17768 ""
17769 {
17770 rtx stack_slot;
17771 if ((flag_cf_protection & CF_RETURN))
17772 {
17773 /* Restore shadow stack pointer from the first slot and stack
17774 pointer from the second slot. */
17775 rtx ssp_slot = adjust_address (operands[1], word_mode, 0);
17776 stack_slot = adjust_address (operands[1], Pmode, UNITS_PER_WORD);
17777
17778 rtx flags, jump, noadj_label, inc_label, loop_label;
17779 rtx reg_adj, reg_ssp, tmp, clob;
17780
17781 /* Get the current shadow stack pointer. The code below will check if
17782 SHSTK feature is enabled. If it is not enabled the RDSSP instruction
18367 is a NOP. */ 17783 is a NOP. */
18368 reg_ssp = gen_reg_rtx (Pmode); 17784 reg_ssp = gen_reg_rtx (word_mode);
18369 emit_insn (gen_rtx_SET (reg_ssp, const0_rtx)); 17785 emit_insn (gen_rtx_SET (reg_ssp, const0_rtx));
18370 emit_insn ((Pmode == SImode) 17786 emit_insn ((word_mode == SImode)
18371 ? gen_rdsspsi (reg_ssp, reg_ssp) 17787 ? gen_rdsspsi (reg_ssp)
18372 : gen_rdsspdi (reg_ssp, reg_ssp)); 17788 : gen_rdsspdi (reg_ssp));
18373 mem_buf = gen_rtx_MEM (Pmode, plus_constant (Pmode, operands[0],
18374 3 * GET_MODE_SIZE (Pmode))),
18375 17789
18376 /* Compare through substraction the saved and the current ssp to decide 17790 /* Compare through substraction the saved and the current ssp to decide
18377 if ssp has to be adjusted. */ 17791 if ssp has to be adjusted. */
18378 reg_minus = gen_reg_rtx (Pmode); 17792 tmp = gen_rtx_SET (reg_ssp, gen_rtx_MINUS (word_mode, reg_ssp,
18379 tmp = gen_rtx_SET (reg_minus, gen_rtx_MINUS (Pmode, reg_ssp, mem_buf)); 17793 ssp_slot));
18380 clob = gen_rtx_CLOBBER (VOIDmode, gen_rtx_REG (CCmode, FLAGS_REG)); 17794 clob = gen_rtx_CLOBBER (VOIDmode, gen_rtx_REG (CCmode, FLAGS_REG));
18381 tmp = gen_rtx_PARALLEL (VOIDmode, gen_rtvec (2, tmp, clob)); 17795 tmp = gen_rtx_PARALLEL (VOIDmode, gen_rtvec (2, tmp, clob));
18382 emit_insn (tmp); 17796 emit_insn (tmp);
18383 17797
18384 /* Jump over adjustment code. */ 17798 /* Compare and jump over adjustment code. */
18385 label = gen_label_rtx (); 17799 noadj_label = gen_label_rtx ();
18386 tmp = gen_rtx_REG (CCmode, FLAGS_REG); 17800 flags = gen_rtx_REG (CCZmode, FLAGS_REG);
18387 tmp = gen_rtx_EQ (VOIDmode, tmp, const0_rtx); 17801 tmp = gen_rtx_EQ (VOIDmode, flags, const0_rtx);
18388 tmp = gen_rtx_IF_THEN_ELSE (VOIDmode, tmp, 17802 tmp = gen_rtx_IF_THEN_ELSE (VOIDmode, tmp,
18389 gen_rtx_LABEL_REF (VOIDmode, label), 17803 gen_rtx_LABEL_REF (VOIDmode, noadj_label),
18390 pc_rtx); 17804 pc_rtx);
18391 jump = emit_jump_insn (gen_rtx_SET (pc_rtx, tmp)); 17805 jump = emit_jump_insn (gen_rtx_SET (pc_rtx, tmp));
18392 JUMP_LABEL (jump) = label; 17806 JUMP_LABEL (jump) = noadj_label;
18393 17807
18394 /* Adjust the ssp. */ 17808 /* Compute the numebr of frames to adjust. */
18395 reg_adj = gen_reg_rtx (Pmode); 17809 reg_adj = gen_lowpart (ptr_mode, reg_ssp);
18396 tmp = gen_rtx_SET (reg_adj, 17810 tmp = gen_rtx_SET (reg_adj,
18397 gen_rtx_LSHIFTRT (Pmode, negate_rtx (Pmode, reg_minus), 17811 gen_rtx_LSHIFTRT (ptr_mode,
18398 GEN_INT (3))); 17812 negate_rtx (ptr_mode, reg_adj),
17813 GEN_INT ((word_mode == SImode)
17814 ? 2
17815 : 3)));
18399 clob = gen_rtx_CLOBBER (VOIDmode, gen_rtx_REG (CCmode, FLAGS_REG)); 17816 clob = gen_rtx_CLOBBER (VOIDmode, gen_rtx_REG (CCmode, FLAGS_REG));
18400 tmp = gen_rtx_PARALLEL (VOIDmode, gen_rtvec (2, tmp, clob)); 17817 tmp = gen_rtx_PARALLEL (VOIDmode, gen_rtvec (2, tmp, clob));
18401 emit_insn (tmp); 17818 emit_insn (tmp);
18402 emit_insn ((Pmode == SImode) 17819
18403 ? gen_incsspsi (reg_adj) 17820 /* Check if number of frames <= 255 so no loop is needed. */
18404 : gen_incsspdi (reg_adj)); 17821 tmp = gen_rtx_COMPARE (CCmode, reg_adj, GEN_INT (255));
18405 17822 flags = gen_rtx_REG (CCmode, FLAGS_REG);
18406 emit_label (label); 17823 emit_insn (gen_rtx_SET (flags, tmp));
18407 LABEL_NUSES (label) = 1; 17824
17825 inc_label = gen_label_rtx ();
17826 tmp = gen_rtx_LEU (VOIDmode, flags, const0_rtx);
17827 tmp = gen_rtx_IF_THEN_ELSE (VOIDmode, tmp,
17828 gen_rtx_LABEL_REF (VOIDmode, inc_label),
17829 pc_rtx);
17830 jump = emit_jump_insn (gen_rtx_SET (pc_rtx, tmp));
17831 JUMP_LABEL (jump) = inc_label;
17832
17833 rtx reg_255 = gen_reg_rtx (word_mode);
17834 emit_move_insn (reg_255, GEN_INT (255));
17835
17836 /* Adjust the ssp in a loop. */
17837 loop_label = gen_label_rtx ();
17838 emit_label (loop_label);
17839 LABEL_NUSES (loop_label) = 1;
17840
17841 emit_insn ((word_mode == SImode)
17842 ? gen_incsspsi (reg_255)
17843 : gen_incsspdi (reg_255));
17844 tmp = gen_rtx_SET (reg_adj, gen_rtx_MINUS (ptr_mode,
17845 reg_adj,
17846 GEN_INT (255)));
17847 clob = gen_rtx_CLOBBER (VOIDmode, gen_rtx_REG (CCmode, FLAGS_REG));
17848 tmp = gen_rtx_PARALLEL (VOIDmode, gen_rtvec (2, tmp, clob));
17849 emit_insn (tmp);
17850
17851 tmp = gen_rtx_COMPARE (CCmode, reg_adj, GEN_INT (255));
17852 flags = gen_rtx_REG (CCmode, FLAGS_REG);
17853 emit_insn (gen_rtx_SET (flags, tmp));
17854
17855 /* Jump to the loop label. */
17856 tmp = gen_rtx_GTU (VOIDmode, flags, const0_rtx);
17857 tmp = gen_rtx_IF_THEN_ELSE (VOIDmode, tmp,
17858 gen_rtx_LABEL_REF (VOIDmode, loop_label),
17859 pc_rtx);
17860 jump = emit_jump_insn (gen_rtx_SET (pc_rtx, tmp));
17861 JUMP_LABEL (jump) = loop_label;
17862
17863 emit_label (inc_label);
17864 LABEL_NUSES (inc_label) = 1;
17865 emit_insn ((word_mode == SImode)
17866 ? gen_incsspsi (reg_ssp)
17867 : gen_incsspdi (reg_ssp));
17868
17869 emit_label (noadj_label);
17870 LABEL_NUSES (noadj_label) = 1;
18408 } 17871 }
18409 17872 else
18410 /* This code is the same as in expand_buildin_longjmp. */ 17873 stack_slot = adjust_address (operands[1], Pmode, 0);
18411 fp = gen_rtx_MEM (Pmode, operands[0]); 17874 emit_move_insn (operands[0], stack_slot);
18412 lab = gen_rtx_MEM (Pmode, plus_constant (Pmode, operands[0], 17875 DONE;
18413 GET_MODE_SIZE (Pmode)));
18414 stack = gen_rtx_MEM (sa_mode, plus_constant (Pmode, operands[0],
18415 2 * GET_MODE_SIZE (Pmode)));
18416 lab = copy_to_reg (lab);
18417
18418 emit_clobber (gen_rtx_MEM (BLKmode, gen_rtx_SCRATCH (VOIDmode)));
18419 emit_clobber (gen_rtx_MEM (BLKmode, hard_frame_pointer_rtx));
18420
18421 emit_move_insn (hard_frame_pointer_rtx, fp);
18422 emit_stack_restore (SAVE_NONLOCAL, stack);
18423
18424 emit_use (hard_frame_pointer_rtx);
18425 emit_use (stack_pointer_rtx);
18426 emit_indirect_jump (lab);
18427 }) 17876 })
18428 17877
18429 17878
18430 ;; Avoid redundant prefixes by splitting HImode arithmetic to SImode. 17879 ;; Avoid redundant prefixes by splitting HImode arithmetic to SImode.
18431 ;; Do not split instructions with mask registers. 17880 ;; Do not split instructions with mask registers.
18853 = gen_rtx_COMPARE (GET_MODE (operands[4]), 18302 = gen_rtx_COMPARE (GET_MODE (operands[4]),
18854 copy_rtx (operands[5]), 18303 copy_rtx (operands[5]),
18855 const0_rtx); 18304 const0_rtx);
18856 }) 18305 })
18857 18306
18307 ;; Likewise for cmpelim optimized pattern.
18308 (define_peephole2
18309 [(set (match_operand:SWI 0 "register_operand")
18310 (match_operand:SWI 1 "memory_operand"))
18311 (parallel [(set (reg FLAGS_REG)
18312 (compare (match_operator:SWI 3 "plusminuslogic_operator"
18313 [(match_dup 0)
18314 (match_operand:SWI 2 "<nonmemory_operand>")])
18315 (const_int 0)))
18316 (set (match_dup 0) (match_dup 3))])
18317 (set (match_dup 1) (match_dup 0))]
18318 "(TARGET_READ_MODIFY_WRITE || optimize_insn_for_size_p ())
18319 && peep2_reg_dead_p (3, operands[0])
18320 && !reg_overlap_mentioned_p (operands[0], operands[1])
18321 && !reg_overlap_mentioned_p (operands[0], operands[2])
18322 && ix86_match_ccmode (peep2_next_insn (1),
18323 (GET_CODE (operands[3]) == PLUS
18324 || GET_CODE (operands[3]) == MINUS)
18325 ? CCGOCmode : CCNOmode)"
18326 [(parallel [(set (match_dup 4) (match_dup 6))
18327 (set (match_dup 1) (match_dup 5))])]
18328 {
18329 operands[4] = SET_DEST (XVECEXP (PATTERN (peep2_next_insn (1)), 0, 0));
18330 operands[5]
18331 = gen_rtx_fmt_ee (GET_CODE (operands[3]), GET_MODE (operands[3]),
18332 copy_rtx (operands[1]), operands[2]);
18333 operands[6]
18334 = gen_rtx_COMPARE (GET_MODE (operands[4]), copy_rtx (operands[5]),
18335 const0_rtx);
18336 })
18337
18858 ;; Likewise for instances where we have a lea pattern. 18338 ;; Likewise for instances where we have a lea pattern.
18859 (define_peephole2 18339 (define_peephole2
18860 [(set (match_operand:SWI 0 "register_operand") 18340 [(set (match_operand:SWI 0 "register_operand")
18861 (match_operand:SWI 1 "memory_operand")) 18341 (match_operand:SWI 1 "memory_operand"))
18862 (set (match_operand:SWI 3 "register_operand") 18342 (set (match_operand:SWI 3 "register_operand")
18896 (match_operand:SWI 1 "memory_operand")])) 18376 (match_operand:SWI 1 "memory_operand")]))
18897 (clobber (reg:CC FLAGS_REG))]) 18377 (clobber (reg:CC FLAGS_REG))])
18898 (set (match_dup 1) (match_dup 0)) 18378 (set (match_dup 1) (match_dup 0))
18899 (set (reg FLAGS_REG) (compare (match_dup 0) (const_int 0)))] 18379 (set (reg FLAGS_REG) (compare (match_dup 0) (const_int 0)))]
18900 "(TARGET_READ_MODIFY_WRITE || optimize_insn_for_size_p ()) 18380 "(TARGET_READ_MODIFY_WRITE || optimize_insn_for_size_p ())
18901 && GET_CODE (operands[2]) != MINUS 18381 && COMMUTATIVE_ARITH_P (operands[2])
18902 && peep2_reg_dead_p (3, operands[0]) 18382 && peep2_reg_dead_p (3, operands[0])
18903 && !reg_overlap_mentioned_p (operands[0], operands[1]) 18383 && !reg_overlap_mentioned_p (operands[0], operands[1])
18904 && ix86_match_ccmode (peep2_next_insn (2), 18384 && ix86_match_ccmode (peep2_next_insn (2),
18905 GET_CODE (operands[2]) == PLUS 18385 GET_CODE (operands[2]) == PLUS
18906 ? CCGOCmode : CCNOmode)" 18386 ? CCGOCmode : CCNOmode)"
18913 copy_rtx (operands[1]), 18393 copy_rtx (operands[1]),
18914 operands[0]); 18394 operands[0]);
18915 operands[5] 18395 operands[5]
18916 = gen_rtx_COMPARE (GET_MODE (operands[3]), 18396 = gen_rtx_COMPARE (GET_MODE (operands[3]),
18917 copy_rtx (operands[4]), 18397 copy_rtx (operands[4]),
18398 const0_rtx);
18399 })
18400
18401 ;; Likewise for cmpelim optimized pattern.
18402 (define_peephole2
18403 [(parallel [(set (reg FLAGS_REG)
18404 (compare (match_operator:SWI 2 "plusminuslogic_operator"
18405 [(match_operand:SWI 0 "register_operand")
18406 (match_operand:SWI 1 "memory_operand")])
18407 (const_int 0)))
18408 (set (match_dup 0) (match_dup 2))])
18409 (set (match_dup 1) (match_dup 0))]
18410 "(TARGET_READ_MODIFY_WRITE || optimize_insn_for_size_p ())
18411 && COMMUTATIVE_ARITH_P (operands[2])
18412 && peep2_reg_dead_p (2, operands[0])
18413 && !reg_overlap_mentioned_p (operands[0], operands[1])
18414 && ix86_match_ccmode (peep2_next_insn (0),
18415 GET_CODE (operands[2]) == PLUS
18416 ? CCGOCmode : CCNOmode)"
18417 [(parallel [(set (match_dup 3) (match_dup 5))
18418 (set (match_dup 1) (match_dup 4))])]
18419 {
18420 operands[3] = SET_DEST (XVECEXP (PATTERN (peep2_next_insn (0)), 0, 0));
18421 operands[4]
18422 = gen_rtx_fmt_ee (GET_CODE (operands[2]), GET_MODE (operands[2]),
18423 copy_rtx (operands[1]), operands[0]);
18424 operands[5]
18425 = gen_rtx_COMPARE (GET_MODE (operands[3]), copy_rtx (operands[4]),
18918 const0_rtx); 18426 const0_rtx);
18919 }) 18427 })
18920 18428
18921 (define_peephole2 18429 (define_peephole2
18922 [(set (match_operand:SWI12 0 "register_operand") 18430 [(set (match_operand:SWI12 0 "register_operand")
19834 ; Clobber all floating-point registers on environment save and restore 19342 ; Clobber all floating-point registers on environment save and restore
19835 ; to ensure that the TOS value saved at fnstenv is valid after fldenv. 19343 ; to ensure that the TOS value saved at fnstenv is valid after fldenv.
19836 (define_insn "fnstenv" 19344 (define_insn "fnstenv"
19837 [(set (match_operand:BLK 0 "memory_operand" "=m") 19345 [(set (match_operand:BLK 0 "memory_operand" "=m")
19838 (unspec_volatile:BLK [(const_int 0)] UNSPECV_FNSTENV)) 19346 (unspec_volatile:BLK [(const_int 0)] UNSPECV_FNSTENV))
19839 (clobber (reg:HI FPCR_REG))
19840 (clobber (reg:XF ST0_REG)) 19347 (clobber (reg:XF ST0_REG))
19841 (clobber (reg:XF ST1_REG)) 19348 (clobber (reg:XF ST1_REG))
19842 (clobber (reg:XF ST2_REG)) 19349 (clobber (reg:XF ST2_REG))
19843 (clobber (reg:XF ST3_REG)) 19350 (clobber (reg:XF ST3_REG))
19844 (clobber (reg:XF ST4_REG)) 19351 (clobber (reg:XF ST4_REG))
19853 (symbol_ref "ix86_attr_length_address_default (insn) + 2"))]) 19360 (symbol_ref "ix86_attr_length_address_default (insn) + 2"))])
19854 19361
19855 (define_insn "fldenv" 19362 (define_insn "fldenv"
19856 [(unspec_volatile [(match_operand:BLK 0 "memory_operand" "m")] 19363 [(unspec_volatile [(match_operand:BLK 0 "memory_operand" "m")]
19857 UNSPECV_FLDENV) 19364 UNSPECV_FLDENV)
19858 (clobber (reg:CCFP FPSR_REG))
19859 (clobber (reg:HI FPCR_REG))
19860 (clobber (reg:XF ST0_REG)) 19365 (clobber (reg:XF ST0_REG))
19861 (clobber (reg:XF ST1_REG)) 19366 (clobber (reg:XF ST1_REG))
19862 (clobber (reg:XF ST2_REG)) 19367 (clobber (reg:XF ST2_REG))
19863 (clobber (reg:XF ST3_REG)) 19368 (clobber (reg:XF ST3_REG))
19864 (clobber (reg:XF ST4_REG)) 19369 (clobber (reg:XF ST4_REG))
20048 (set_attr "memory" "unknown")]) 19553 (set_attr "memory" "unknown")])
20049 19554
20050 ;; CET instructions 19555 ;; CET instructions
20051 (define_insn "rdssp<mode>" 19556 (define_insn "rdssp<mode>"
20052 [(set (match_operand:SWI48x 0 "register_operand" "=r") 19557 [(set (match_operand:SWI48x 0 "register_operand" "=r")
20053 (unspec_volatile:SWI48x 19558 (unspec_volatile:SWI48x [(const_int 0)] UNSPECV_NOP_RDSSP))]
20054 [(match_operand:SWI48x 1 "register_operand" "0")] 19559 "TARGET_SHSTK || (flag_cf_protection & CF_RETURN)"
20055 UNSPECV_NOP_RDSSP))] 19560 "xor{l}\t%k0, %k0\n\trdssp<mskmodesuffix>\t%0"
20056 "TARGET_SHSTK" 19561 [(set_attr "length" "6")
20057 "rdssp<mskmodesuffix>\t%0"
20058 [(set_attr "length" "4")
20059 (set_attr "type" "other")]) 19562 (set_attr "type" "other")])
20060 19563
20061 (define_insn "incssp<mode>" 19564 (define_insn "incssp<mode>"
20062 [(unspec_volatile [(match_operand:SWI48x 0 "register_operand" "r")] 19565 [(unspec_volatile [(match_operand:SWI48x 0 "register_operand" "r")]
20063 UNSPECV_INCSSP)] 19566 UNSPECV_INCSSP)]
20064 "TARGET_SHSTK" 19567 "TARGET_SHSTK || (flag_cf_protection & CF_RETURN)"
20065 "incssp<mskmodesuffix>\t%0" 19568 "incssp<mskmodesuffix>\t%0"
20066 [(set_attr "length" "4") 19569 [(set_attr "length" "4")
20067 (set_attr "type" "other")]) 19570 (set_attr "type" "other")])
20068 19571
20069 (define_insn "saveprevssp" 19572 (define_insn "saveprevssp"
20071 "TARGET_SHSTK" 19574 "TARGET_SHSTK"
20072 "saveprevssp" 19575 "saveprevssp"
20073 [(set_attr "length" "5") 19576 [(set_attr "length" "5")
20074 (set_attr "type" "other")]) 19577 (set_attr "type" "other")])
20075 19578
20076 (define_insn "rstorssp" 19579 (define_expand "rstorssp"
20077 [(unspec_volatile [(match_operand 0 "memory_operand" "m")] 19580 [(unspec_volatile [(match_operand 0 "memory_operand")]
20078 UNSPECV_RSTORSSP)] 19581 UNSPECV_RSTORSSP)]
19582 "TARGET_SHSTK")
19583
19584 (define_insn "*rstorssp<mode>"
19585 [(unspec_volatile [(match_operand:P 0 "memory_operand" "m")]
19586 UNSPECV_RSTORSSP)]
20079 "TARGET_SHSTK" 19587 "TARGET_SHSTK"
20080 "rstorssp\t%0" 19588 "rstorssp\t%0"
20081 [(set_attr "length" "5") 19589 [(set_attr "length" "5")
20082 (set_attr "type" "other")]) 19590 (set_attr "type" "other")])
20083 19591
20084 (define_insn "wrss<mode>" 19592 (define_insn "wrss<mode>"
20085 [(unspec_volatile [(match_operand:SWI48x 0 "register_operand" "r") 19593 [(unspec_volatile [(match_operand:SWI48x 0 "register_operand" "r")
20086 (match_operand:SWI48x 1 "memory_operand" "m")] 19594 (match_operand:SWI48x 1 "memory_operand" "m")]
20087 UNSPECV_WRSS)] 19595 UNSPECV_WRSS)]
20088 "TARGET_SHSTK" 19596 "TARGET_SHSTK"
20089 "wrss<mskmodesuffix>\t%0, %1" 19597 "wrss<mskmodesuffix>\t%0, %1"
20090 [(set_attr "length" "3") 19598 [(set_attr "length" "3")
20091 (set_attr "type" "other")]) 19599 (set_attr "type" "other")])
20092 19600
20093 (define_insn "wruss<mode>" 19601 (define_insn "wruss<mode>"
20094 [(unspec_volatile [(match_operand:SWI48x 0 "register_operand" "r") 19602 [(unspec_volatile [(match_operand:SWI48x 0 "register_operand" "r")
20095 (match_operand:SWI48x 1 "memory_operand" "m")] 19603 (match_operand:SWI48x 1 "memory_operand" "m")]
20096 UNSPECV_WRUSS)] 19604 UNSPECV_WRUSS)]
20097 "TARGET_SHSTK" 19605 "TARGET_SHSTK"
20098 "wruss<mskmodesuffix>\t%0, %1" 19606 "wruss<mskmodesuffix>\t%0, %1"
20099 [(set_attr "length" "4") 19607 [(set_attr "length" "4")
20100 (set_attr "type" "other")]) 19608 (set_attr "type" "other")])
20101 19609
20104 "TARGET_SHSTK" 19612 "TARGET_SHSTK"
20105 "setssbsy" 19613 "setssbsy"
20106 [(set_attr "length" "4") 19614 [(set_attr "length" "4")
20107 (set_attr "type" "other")]) 19615 (set_attr "type" "other")])
20108 19616
20109 (define_insn "clrssbsy" 19617 (define_expand "clrssbsy"
20110 [(unspec_volatile [(match_operand 0 "memory_operand" "m")] 19618 [(unspec_volatile [(match_operand 0 "memory_operand")]
20111 UNSPECV_CLRSSBSY)] 19619 UNSPECV_CLRSSBSY)]
19620 "TARGET_SHSTK")
19621
19622 (define_insn "*clrssbsy<mode>"
19623 [(unspec_volatile [(match_operand:P 0 "memory_operand" "m")]
19624 UNSPECV_CLRSSBSY)]
20112 "TARGET_SHSTK" 19625 "TARGET_SHSTK"
20113 "clrssbsy\t%0" 19626 "clrssbsy\t%0"
20114 [(set_attr "length" "4") 19627 [(set_attr "length" "4")
20115 (set_attr "type" "other")]) 19628 (set_attr "type" "other")])
20116 19629
20117 (define_insn "nop_endbr" 19630 (define_insn "nop_endbr"
20118 [(unspec_volatile [(const_int 0)] UNSPECV_NOP_ENDBR)] 19631 [(unspec_volatile [(const_int 0)] UNSPECV_NOP_ENDBR)]
20119 "TARGET_IBT" 19632 "(flag_cf_protection & CF_BRANCH)"
20120 "* 19633 {
20121 { return (TARGET_64BIT)? \"endbr64\" : \"endbr32\"; }" 19634 return TARGET_64BIT ? "endbr64" : "endbr32";
19635 }
20122 [(set_attr "length" "4") 19636 [(set_attr "length" "4")
20123 (set_attr "length_immediate" "0") 19637 (set_attr "length_immediate" "0")
20124 (set_attr "modrm" "0")]) 19638 (set_attr "modrm" "0")])
20125 19639
20126 ;; For RTM support 19640 ;; For RTM support
20245 "TARGET_CLZERO" 19759 "TARGET_CLZERO"
20246 "clzero" 19760 "clzero"
20247 [(set_attr "length" "3") 19761 [(set_attr "length" "3")
20248 (set_attr "memory" "unknown")]) 19762 (set_attr "memory" "unknown")])
20249 19763
20250 ;; MPX instructions
20251
20252 (define_expand "<mode>_mk"
20253 [(set (match_operand:BND 0 "register_operand")
20254 (unspec:BND
20255 [(mem:<bnd_ptr>
20256 (match_par_dup 3
20257 [(match_operand:<bnd_ptr> 1 "register_operand")
20258 (match_operand:<bnd_ptr> 2 "address_mpx_no_base_operand")]))]
20259 UNSPEC_BNDMK))]
20260 "TARGET_MPX"
20261 {
20262 operands[3] = gen_rtx_UNSPEC (Pmode, gen_rtvec (2, operands[1],
20263 operands[2]),
20264 UNSPEC_BNDMK_ADDR);
20265 })
20266
20267 (define_insn "*<mode>_mk"
20268 [(set (match_operand:BND 0 "register_operand" "=w")
20269 (unspec:BND
20270 [(match_operator:<bnd_ptr> 3 "bnd_mem_operator"
20271 [(unspec:<bnd_ptr>
20272 [(match_operand:<bnd_ptr> 1 "register_operand" "r")
20273 (match_operand:<bnd_ptr> 2 "address_mpx_no_base_operand" "Tb")]
20274 UNSPEC_BNDMK_ADDR)])]
20275 UNSPEC_BNDMK))]
20276 "TARGET_MPX"
20277 "bndmk\t{%3, %0|%0, %3}"
20278 [(set_attr "type" "mpxmk")])
20279
20280 (define_expand "mov<mode>"
20281 [(set (match_operand:BND 0 "general_operand")
20282 (match_operand:BND 1 "general_operand"))]
20283 "TARGET_MPX"
20284 "ix86_expand_move (<MODE>mode, operands); DONE;")
20285
20286 (define_insn "*mov<mode>_internal_mpx"
20287 [(set (match_operand:BND 0 "nonimmediate_operand" "=w,m")
20288 (match_operand:BND 1 "general_operand" "wm,w"))]
20289 "TARGET_MPX"
20290 "bndmov\t{%1, %0|%0, %1}"
20291 [(set_attr "type" "mpxmov")])
20292
20293 (define_expand "<mode>_<bndcheck>"
20294 [(parallel
20295 [(unspec
20296 [(match_operand:BND 0 "register_operand")
20297 (match_operand:<bnd_ptr> 1 "address_no_seg_operand")] BNDCHECK)
20298 (set (match_dup 2)
20299 (unspec:BLK [(match_dup 2)] UNSPEC_MPX_FENCE))])]
20300 "TARGET_MPX"
20301 {
20302 operands[2] = gen_rtx_MEM (BLKmode, operands[1]);
20303 MEM_VOLATILE_P (operands[2]) = 1;
20304 })
20305
20306 (define_insn "*<mode>_<bndcheck>"
20307 [(unspec
20308 [(match_operand:BND 0 "register_operand" "w")
20309 (match_operand:<bnd_ptr> 1 "address_no_seg_operand" "Ts")] BNDCHECK)
20310 (set (match_operand:BLK 2 "bnd_mem_operator")
20311 (unspec:BLK [(match_dup 2)] UNSPEC_MPX_FENCE))]
20312 "TARGET_MPX"
20313 "bnd<bndcheck>\t{%a1, %0|%0, %a1}"
20314 [(set_attr "type" "mpxchk")])
20315
20316 (define_expand "<mode>_ldx"
20317 [(parallel
20318 [(set (match_operand:BND 0 "register_operand")
20319 (unspec:BND
20320 [(mem:<bnd_ptr>
20321 (match_par_dup 3
20322 [(match_operand:<bnd_ptr> 1 "address_mpx_no_index_operand")
20323 (match_operand:<bnd_ptr> 2 "register_operand")]))]
20324 UNSPEC_BNDLDX))
20325 (use (mem:BLK (match_dup 1)))])]
20326 "TARGET_MPX"
20327 {
20328 /* Avoid registers which cannot be used as index. */
20329 if (!index_register_operand (operands[2], Pmode))
20330 operands[2] = copy_addr_to_reg (operands[2]);
20331
20332 operands[3] = gen_rtx_UNSPEC (Pmode, gen_rtvec (2, operands[1],
20333 operands[2]),
20334 UNSPEC_BNDLDX_ADDR);
20335 })
20336
20337 (define_insn "*<mode>_ldx"
20338 [(set (match_operand:BND 0 "register_operand" "=w")
20339 (unspec:BND
20340 [(match_operator:<bnd_ptr> 3 "bnd_mem_operator"
20341 [(unspec:<bnd_ptr>
20342 [(match_operand:<bnd_ptr> 1 "address_mpx_no_index_operand" "Ti")
20343 (match_operand:<bnd_ptr> 2 "register_operand" "l")]
20344 UNSPEC_BNDLDX_ADDR)])]
20345 UNSPEC_BNDLDX))
20346 (use (mem:BLK (match_dup 1)))]
20347 "TARGET_MPX"
20348 "bndldx\t{%3, %0|%0, %3}"
20349 [(set_attr "type" "mpxld")])
20350
20351 (define_expand "<mode>_stx"
20352 [(parallel
20353 [(unspec
20354 [(mem:<bnd_ptr>
20355 (match_par_dup 3
20356 [(match_operand:<bnd_ptr> 0 "address_mpx_no_index_operand")
20357 (match_operand:<bnd_ptr> 1 "register_operand")]))
20358 (match_operand:BND 2 "register_operand")]
20359 UNSPEC_BNDSTX)
20360 (set (match_dup 4)
20361 (unspec:BLK [(match_dup 4)] UNSPEC_MPX_FENCE))])]
20362 "TARGET_MPX"
20363 {
20364 /* Avoid registers which cannot be used as index. */
20365 if (!index_register_operand (operands[1], Pmode))
20366 operands[1] = copy_addr_to_reg (operands[1]);
20367
20368 operands[3] = gen_rtx_UNSPEC (Pmode, gen_rtvec (2, operands[0],
20369 operands[1]),
20370 UNSPEC_BNDLDX_ADDR);
20371 operands[4] = gen_rtx_MEM (BLKmode, operands[0]);
20372 MEM_VOLATILE_P (operands[4]) = 1;
20373 })
20374
20375 (define_insn "*<mode>_stx"
20376 [(unspec
20377 [(match_operator:<bnd_ptr> 3 "bnd_mem_operator"
20378 [(unspec:<bnd_ptr>
20379 [(match_operand:<bnd_ptr> 0 "address_mpx_no_index_operand" "Ti")
20380 (match_operand:<bnd_ptr> 1 "register_operand" "l")]
20381 UNSPEC_BNDLDX_ADDR)])
20382 (match_operand:BND 2 "register_operand" "w")]
20383 UNSPEC_BNDSTX)
20384 (set (match_operand:BLK 4 "bnd_mem_operator")
20385 (unspec:BLK [(match_dup 4)] UNSPEC_MPX_FENCE))]
20386 "TARGET_MPX"
20387 "bndstx\t{%2, %3|%3, %2}"
20388 [(set_attr "type" "mpxst")])
20389
20390 (define_insn "move_size_reloc_<mode>"
20391 [(set (match_operand:SWI48 0 "register_operand" "=r")
20392 (unspec:SWI48
20393 [(match_operand:SWI48 1 "symbol_operand")]
20394 UNSPEC_SIZEOF))]
20395 "TARGET_MPX"
20396 {
20397 if (x86_64_immediate_size_operand (operands[1], VOIDmode))
20398 return "mov{l}\t{%1@SIZE, %k0|%k0, %1@SIZE}";
20399 else
20400 return "movabs{q}\t{%1@SIZE, %0|%0, %1@SIZE}";
20401 }
20402 [(set_attr "type" "imov")
20403 (set_attr "mode" "<MODE>")])
20404
20405 ;; RDPKRU and WRPKRU 19764 ;; RDPKRU and WRPKRU
20406 19765
20407 (define_expand "rdpkru" 19766 (define_expand "rdpkru"
20408 [(parallel 19767 [(parallel
20409 [(set (match_operand:SI 0 "register_operand") 19768 [(set (match_operand:SI 0 "register_operand")
20445 [(set_attr "type" "other")]) 19804 [(set_attr "type" "other")])
20446 19805
20447 (define_insn "rdpid" 19806 (define_insn "rdpid"
20448 [(set (match_operand:SI 0 "register_operand" "=r") 19807 [(set (match_operand:SI 0 "register_operand" "=r")
20449 (unspec_volatile:SI [(const_int 0)] UNSPECV_RDPID))] 19808 (unspec_volatile:SI [(const_int 0)] UNSPECV_RDPID))]
20450 "TARGET_RDPID" 19809 "!TARGET_64BIT && TARGET_RDPID"
20451 "rdpid\t%0" 19810 "rdpid\t%0"
20452 [(set_attr "type" "other")]) 19811 [(set_attr "type" "other")])
19812
19813 (define_insn "rdpid_rex64"
19814 [(set (match_operand:DI 0 "register_operand" "=r")
19815 (unspec_volatile:DI [(const_int 0)] UNSPECV_RDPID))]
19816 "TARGET_64BIT && TARGET_RDPID"
19817 "rdpid\t%0"
19818 [(set_attr "type" "other")])
19819
19820 ;; Intirinsics for > i486
19821
19822 (define_insn "wbinvd"
19823 [(unspec_volatile [(const_int 0)] UNSPECV_WBINVD)]
19824 ""
19825 "wbinvd"
19826 [(set_attr "type" "other")])
19827
19828 (define_insn "wbnoinvd"
19829 [(unspec_volatile [(const_int 0)] UNSPECV_WBNOINVD)]
19830 "TARGET_WBNOINVD"
19831 "wbnoinvd"
19832 [(set_attr "type" "other")])
19833
19834 ;; MOVDIRI and MOVDIR64B
19835
19836 (define_insn "movdiri<mode>"
19837 [(unspec_volatile:SWI48 [(match_operand:SWI48 0 "memory_operand" "m")
19838 (match_operand:SWI48 1 "register_operand" "r")]
19839 UNSPECV_MOVDIRI)]
19840 "TARGET_MOVDIRI"
19841 "movdiri\t{%1, %0|%0, %1}"
19842 [(set_attr "type" "other")])
19843
19844 (define_insn "movdir64b_<mode>"
19845 [(unspec_volatile:XI [(match_operand:P 0 "register_operand" "r")
19846 (match_operand:XI 1 "memory_operand")]
19847 UNSPECV_MOVDIR64B)]
19848 "TARGET_MOVDIR64B"
19849 "movdir64b\t{%1, %0|%0, %1}"
19850 [(set_attr "type" "other")])
19851
19852 ;; WAITPKG
19853
19854 (define_insn "umwait"
19855 [(set (reg:CCC FLAGS_REG)
19856 (unspec_volatile:CCC [(match_operand:SI 0 "register_operand" "r")
19857 (match_operand:DI 1 "register_operand" "A")]
19858 UNSPECV_UMWAIT))]
19859 "!TARGET_64BIT && TARGET_WAITPKG"
19860 "umwait\t%0"
19861 [(set_attr "length" "3")])
19862
19863 (define_insn "umwait_rex64"
19864 [(set (reg:CCC FLAGS_REG)
19865 (unspec_volatile:CCC [(match_operand:SI 0 "register_operand" "r")
19866 (match_operand:SI 1 "register_operand" "a")
19867 (match_operand:SI 2 "register_operand" "d")]
19868 UNSPECV_UMWAIT))]
19869 "TARGET_64BIT && TARGET_WAITPKG"
19870 "umwait\t%0"
19871 [(set_attr "length" "3")])
19872
19873 (define_insn "umonitor_<mode>"
19874 [(unspec_volatile [(match_operand:P 0 "register_operand" "r")]
19875 UNSPECV_UMONITOR)]
19876 "TARGET_WAITPKG"
19877 "umonitor\t%0"
19878 [(set (attr "length")
19879 (symbol_ref ("(Pmode != word_mode) + 3")))])
19880
19881 (define_insn "tpause"
19882 [(set (reg:CCC FLAGS_REG)
19883 (unspec_volatile:CCC [(match_operand:SI 0 "register_operand" "r")
19884 (match_operand:DI 1 "register_operand" "A")]
19885 UNSPECV_TPAUSE))]
19886 "!TARGET_64BIT && TARGET_WAITPKG"
19887 "tpause\t%0"
19888 [(set_attr "length" "3")])
19889
19890 (define_insn "tpause_rex64"
19891 [(set (reg:CCC FLAGS_REG)
19892 (unspec_volatile:CCC [(match_operand:SI 0 "register_operand" "r")
19893 (match_operand:SI 1 "register_operand" "a")
19894 (match_operand:SI 2 "register_operand" "d")]
19895 UNSPECV_TPAUSE))]
19896 "TARGET_64BIT && TARGET_WAITPKG"
19897 "tpause\t%0"
19898 [(set_attr "length" "3")])
19899
19900 (define_insn "cldemote"
19901 [(unspec_volatile[(match_operand 0 "address_operand" "p")]
19902 UNSPECV_CLDEMOTE)]
19903 "TARGET_CLDEMOTE"
19904 "cldemote\t%a0"
19905 [(set_attr "type" "other")
19906 (set_attr "memory" "unknown")])
19907
19908 (define_insn "speculation_barrier"
19909 [(unspec_volatile [(const_int 0)] UNSPECV_SPECULATION_BARRIER)]
19910 ""
19911 "lfence"
19912 [(set_attr "type" "other")
19913 (set_attr "length" "3")])
20453 19914
20454 (include "mmx.md") 19915 (include "mmx.md")
20455 (include "sse.md") 19916 (include "sse.md")
20456 (include "sync.md") 19917 (include "sync.md")