1 ;;- Machine description for GNU compiler -- S/390 / zSeries version.
2 ;; Copyright (C) 1999-2017 Free Software Foundation, Inc.
3 ;; Contributed by Hartmut Penner (hpenner@de.ibm.com) and
4 ;; Ulrich Weigand (uweigand@de.ibm.com) and
5 ;; Andreas Krebbel (Andreas.Krebbel@de.ibm.com)
7 ;; This file is part of GCC.
9 ;; GCC is free software; you can redistribute it and/or modify it under
10 ;; the terms of the GNU General Public License as published by the Free
11 ;; Software Foundation; either version 3, or (at your option) any later
14 ;; GCC is distributed in the hope that it will be useful, but WITHOUT ANY
15 ;; WARRANTY; without even the implied warranty of MERCHANTABILITY or
16 ;; FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
19 ;; You should have received a copy of the GNU General Public License
20 ;; along with GCC; see the file COPYING3. If not see
21 ;; <http://www.gnu.org/licenses/>.
24 ;; See constraints.md for a description of constraints specific to s390.
27 ;; Special formats used for outputting 390 instructions.
29 ;; %C: print opcode suffix for branch condition.
30 ;; %D: print opcode suffix for inverse branch condition.
31 ;; %J: print tls_load/tls_gdcall/tls_ldcall suffix
32 ;; %G: print the size of the operand in bytes.
33 ;; %O: print only the displacement of a memory reference.
34 ;; %R: print only the base register of a memory reference.
35 ;; %S: print S-type memory reference (base+displacement).
36 ;; %N: print the second word of a DImode operand.
37 ;; %M: print the second word of a TImode operand.
38 ;; %Y: print shift count operand.
40 ;; %b: print integer X as if it's an unsigned byte.
41 ;; %c: print integer X as if it's an signed byte.
42 ;; %x: print integer X as if it's an unsigned halfword.
43 ;; %h: print integer X as if it's a signed halfword.
44 ;; %i: print the first nonzero HImode part of X.
45 ;; %j: print the first HImode part unequal to -1 of X.
46 ;; %k: print the first nonzero SImode part of X.
47 ;; %m: print the first SImode part unequal to -1 of X.
48 ;; %o: print integer X as if it's an unsigned 32bit word.
50 ;; We have a special constraint for pattern matching.
52 ;; s_operand -- Matches a valid S operand in a RS, SI or SS type instruction.
59 (define_c_enum "unspec" [
65 ; Convert CC into a str comparison result and copy it into an
67 ; cc0->0, cc1->1, cc2->-1, (cc3->-1)
68 UNSPEC_STRCMPCC_TO_INT
70 ; Copy CC as is into the lower 2 bits of an integer register
73 ; The right hand side of an setmem
76 ; GOT/PLT and lt-relative accesses
97 ; TLS relocation specifiers
113 ; Stack Smashing Protector
117 ; Split stack support
120 ; Test Data Class (TDC)
132 UNSPEC_FPINT_NEARBYINT
141 UNSPEC_VEC_SMULT_EVEN
142 UNSPEC_VEC_UMULT_EVEN
156 UNSPEC_VEC_INSERT_AND_ZERO
157 UNSPEC_VEC_LOAD_BNDRY
162 UNSPEC_VEC_PACK_SATURATE
163 UNSPEC_VEC_PACK_SATURATE_CC
164 UNSPEC_VEC_PACK_SATURATE_GENCC
165 UNSPEC_VEC_PACK_UNSIGNED_SATURATE
166 UNSPEC_VEC_PACK_UNSIGNED_SATURATE_CC
167 UNSPEC_VEC_PACK_UNSIGNED_SATURATE_GENCC
178 UNSPEC_VEC_ADDEC_U128
183 UNSPEC_VEC_GFMSUM_128
184 UNSPEC_VEC_GFMSUM_ACCUM
185 UNSPEC_VEC_GFMSUM_ACCUM_128
202 UNSPEC_VEC_SUBEC_U128
236 ;; UNSPEC_VOLATILE usage
239 (define_c_enum "unspecv" [
261 ; Hotpatching (unremovable NOPs)
266 ; Transactional Execution support
276 ; Set and get floating point control register
280 ; Split stack support
281 UNSPECV_SPLIT_STACK_CALL
282 UNSPECV_SPLIT_STACK_DATA
291 ; Registers with special meaning
295 ; Sibling call register.
297 ; Literal pool base register.
299 ; Return address register.
301 ; Stack pointer register.
303 ; Condition code register.
305 ; Thread local storage pointer register.
309 ; Hardware register names
313 ; General purpose registers
318 ; Floating point registers.
342 ; Rounding modes for binary floating point numbers
345 (BFP_RND_NEAREST_TIE_AWAY_FROM_0 1)
346 (BFP_RND_PREP_FOR_SHORT_PREC 3)
347 (BFP_RND_NEAREST_TIE_TO_EVEN 4)
349 (BFP_RND_TOWARD_INF 6)
350 (BFP_RND_TOWARD_MINF 7)])
352 ; Rounding modes for decimal floating point numbers
353 ; 1-7 were introduced with the floating point extension facility
354 ; available with z196
355 ; With these rounding modes (1-7) a quantum exception might occur
356 ; which is suppressed for the other modes.
359 (DFP_RND_NEAREST_TIE_AWAY_FROM_0_QUANTEXC 1)
360 (DFP_RND_CURRENT_QUANTEXC 2)
361 (DFP_RND_PREP_FOR_SHORT_PREC_QUANTEXC 3)
362 (DFP_RND_NEAREST_TIE_TO_EVEN_QUANTEXC 4)
363 (DFP_RND_TOWARD_0_QUANTEXC 5)
364 (DFP_RND_TOWARD_INF_QUANTEXC 6)
365 (DFP_RND_TOWARD_MINF_QUANTEXC 7)
366 (DFP_RND_NEAREST_TIE_TO_EVEN 8)
368 (DFP_RND_TOWARD_INF 10)
369 (DFP_RND_TOWARD_MINF 11)
370 (DFP_RND_NEAREST_TIE_AWAY_FROM_0 12)
371 (DFP_RND_NEAREST_TIE_TO_0 13)
372 (DFP_RND_AWAY_FROM_0 14)
373 (DFP_RND_PREP_FOR_SHORT_PREC 15)])
376 ;; PFPO GPR0 argument format
381 ; PFPO operation type
382 (PFPO_CONVERT 0x1000000)
384 (PFPO_OP_TYPE_SF 0x5)
385 (PFPO_OP_TYPE_DF 0x6)
386 (PFPO_OP_TYPE_TF 0x7)
387 (PFPO_OP_TYPE_SD 0x8)
388 (PFPO_OP_TYPE_DD 0x9)
389 (PFPO_OP_TYPE_TD 0xa)
390 ; Bitposition of operand types
391 (PFPO_OP0_TYPE_SHIFT 16)
392 (PFPO_OP1_TYPE_SHIFT 8)
395 ; Immediate operands for tbegin and tbeginc
396 (define_constants [(TBEGIN_MASK 65292)]) ; 0xff0c
397 (define_constants [(TBEGINC_MASK 65288)]) ; 0xff08
399 ;; Instruction operand type as used in the Principles of Operation.
400 ;; Used to determine defaults for length and other attribute values.
402 (define_attr "op_type"
403 "NN,E,RR,RRE,RX,RS,RSI,RI,SI,S,SS,SSE,RXE,RSE,RIL,RIE,RXY,RSY,SIY,RRF,SIL,RRS,RIS,VRI,VRR,VRS,VRV,VRX"
406 ;; Instruction type attribute used for scheduling.
408 (define_attr "type" "none,integer,load,lr,la,larl,lm,stm,
409 cs,vs,store,sem,idiv,
410 imulhi,imulsi,imuldi,
411 branch,jsr,fsimptf,fsimpdf,fsimpsf,fhex,
412 floadtf,floaddf,floadsf,fstoredf,fstoresf,
413 fmultf,fmuldf,fmulsf,fdivtf,fdivdf,fdivsf,
414 ftoi,fsqrttf,fsqrtdf,fsqrtsf,
416 ftrunctf,ftruncdf, ftruncsd, ftruncdd,
417 itoftf, itofdf, itofsf, itofdd, itoftd,
418 fdivdd, fdivtd, floaddd, floadsd, fmuldd, fmultd,
419 fsimpdd, fsimpsd, fsimptd, fstoredd, fstoresd,
421 (cond [(eq_attr "op_type" "NN") (const_string "other")
422 (eq_attr "op_type" "SS") (const_string "cs")]
423 (const_string "integer")))
425 ;; Another attribute used for scheduling purposes:
426 ;; agen: Instruction uses the address generation unit
427 ;; reg: Instruction does not use the agen unit
429 (define_attr "atype" "agen,reg"
430 (if_then_else (eq_attr "op_type" "E,RR,RI,RRE,RSI,RIL,RIE,RRF")
432 (const_string "agen")))
434 ;; Properties concerning Z10 execution grouping and value forwarding.
435 ;; z10_super: instruction is superscalar.
436 ;; z10_super_c: instruction is superscalar and meets the condition of z10_c.
437 ;; z10_fwd: The instruction reads the value of an operand and stores it into a
438 ;; target register. It can forward this value to a second instruction that reads
439 ;; the same register if that second instruction is issued in the same group.
440 ;; z10_rec: The instruction is in the T pipeline and reads a register. If the
441 ;; instruction in the S pipe writes to the register, then the T instruction
442 ;; can immediately read the new value.
443 ;; z10_fr: union of Z10_fwd and z10_rec.
444 ;; z10_c: second operand of instruction is a register and read with complemented bits.
446 ;; An additional suffix A1, A3, or E1 indicates the respective AGI bypass.
449 (define_attr "z10prop" "none,
450 z10_super, z10_super_E1, z10_super_A1, z10_super_c, z10_super_c_E1,
451 z10_fwd, z10_fwd_A1, z10_fwd_A3, z10_fwd_E1,
453 z10_fr, z10_fr_A3, z10_fr_E1,
455 (const_string "none"))
457 ;; Properties concerning Z196 decoding
458 ;; z196_alone: must group alone
459 ;; z196_end: ends a group
460 ;; z196_cracked: instruction is cracked or expanded
461 (define_attr "z196prop" "none,
462 z196_alone, z196_ends,
464 (const_string "none"))
466 (define_attr "mnemonic" "bcr_flush,unknown" (const_string "unknown"))
470 (define_attr "length" ""
471 (cond [(eq_attr "op_type" "E,RR") (const_int 2)
472 (eq_attr "op_type" "RX,RI,RRE,RS,RSI,S,SI,RRF") (const_int 4)]
476 ;; Processor type. This attribute must exactly match the processor_type
477 ;; enumeration in s390.h. The current machine description does not
478 ;; distinguish between g5 and g6, but there are differences between the two
479 ;; CPUs could in theory be modeled.
481 (define_attr "cpu" "g5,g6,z900,z990,z9_109,z9_ec,z10,z196,zEC12,z13"
482 (const (symbol_ref "s390_tune_attr")))
484 (define_attr "cpu_facility"
485 "standard,ieee,zarch,cpu_zarch,longdisp,extimm,dfp,z10,z196,zEC12,vec,z13"
486 (const_string "standard"))
488 (define_attr "enabled" ""
489 (cond [(eq_attr "cpu_facility" "standard")
492 (and (eq_attr "cpu_facility" "ieee")
493 (match_test "TARGET_CPU_IEEE_FLOAT"))
496 (and (eq_attr "cpu_facility" "zarch")
497 (match_test "TARGET_ZARCH"))
500 (and (eq_attr "cpu_facility" "longdisp")
501 (match_test "TARGET_LONG_DISPLACEMENT"))
504 (and (eq_attr "cpu_facility" "extimm")
505 (match_test "TARGET_EXTIMM"))
508 (and (eq_attr "cpu_facility" "dfp")
509 (match_test "TARGET_DFP"))
512 (and (eq_attr "cpu_facility" "cpu_zarch")
513 (match_test "TARGET_CPU_ZARCH"))
516 (and (eq_attr "cpu_facility" "z10")
517 (match_test "TARGET_Z10"))
520 (and (eq_attr "cpu_facility" "z196")
521 (match_test "TARGET_Z196"))
524 (and (eq_attr "cpu_facility" "zEC12")
525 (match_test "TARGET_ZEC12"))
528 (and (eq_attr "cpu_facility" "vec")
529 (match_test "TARGET_VX"))
532 (and (eq_attr "cpu_facility" "z13")
533 (match_test "TARGET_Z13"))
538 ;; Pipeline description for z900. For lack of anything better,
539 ;; this description is also used for the g5 and g6.
542 ;; Pipeline description for z990, z9-109 and z9-ec.
545 ;; Pipeline description for z10
548 ;; Pipeline description for z196
551 ;; Pipeline description for zEC12
554 ;; Pipeline description for z13
558 (include "predicates.md")
560 ;; Constraint definitions
561 (include "constraints.md")
568 (define_mode_iterator ALL [TI DI SI HI QI TF DF SF TD DD SD V1QI V2QI V4QI V8QI V16QI V1HI V2HI V4HI V8HI V1SI V2SI V4SI V1DI V2DI V1SF V2SF V4SF V1TI V1DF V2DF V1TF])
570 ;; These mode iterators allow floating point patterns to be generated from the
572 (define_mode_iterator FP_ALL [TF DF SF (TD "TARGET_HARD_DFP") (DD "TARGET_HARD_DFP")
573 (SD "TARGET_HARD_DFP")])
574 (define_mode_iterator FP [TF DF SF (TD "TARGET_HARD_DFP") (DD "TARGET_HARD_DFP")])
575 (define_mode_iterator BFP [TF DF SF])
576 (define_mode_iterator DFP [TD DD])
577 (define_mode_iterator DFP_ALL [TD DD SD])
578 (define_mode_iterator DSF [DF SF])
579 (define_mode_iterator SD_SF [SF SD])
580 (define_mode_iterator DD_DF [DF DD])
581 (define_mode_iterator TD_TF [TF TD])
583 ;; These mode iterators allow 31-bit and 64-bit GPR patterns to be generated
584 ;; from the same template.
585 (define_mode_iterator GPR [(DI "TARGET_ZARCH") SI])
586 (define_mode_iterator DGPR [(TI "TARGET_ZARCH") DI SI])
587 (define_mode_iterator DSI [DI SI])
588 (define_mode_iterator TDI [TI DI])
590 ;; These mode iterators allow :P to be used for patterns that operate on
591 ;; pointer-sized quantities. Exactly one of the two alternatives will match.
592 (define_mode_iterator P [(DI "TARGET_64BIT") (SI "!TARGET_64BIT")])
594 ;; These macros refer to the actual word_mode of the configuration.
595 ;; This is equal to Pmode except on 31-bit machines in zarch mode.
596 (define_mode_iterator DW [(TI "TARGET_ZARCH") (DI "!TARGET_ZARCH")])
597 (define_mode_iterator W [(DI "TARGET_ZARCH") (SI "!TARGET_ZARCH")])
599 ;; Used by the umul pattern to express modes having half the size.
600 (define_mode_attr DWH [(TI "DI") (DI "SI")])
601 (define_mode_attr dwh [(TI "di") (DI "si")])
603 ;; This mode iterator allows the QI and HI patterns to be defined from
604 ;; the same template.
605 (define_mode_iterator HQI [HI QI])
607 ;; This mode iterator allows the integer patterns to be defined from the
609 (define_mode_iterator INT [(DI "TARGET_ZARCH") SI HI QI])
610 (define_mode_iterator DINT [(TI "TARGET_ZARCH") DI SI HI QI])
611 (define_mode_iterator SINT [SI HI QI])
613 ;; This iterator allows some 'ashift' and 'lshiftrt' pattern to be defined from
614 ;; the same template.
615 (define_code_iterator SHIFT [ashift lshiftrt])
617 ;; This iterator allows r[ox]sbg to be defined with the same template
618 (define_code_iterator IXOR [ior xor])
620 ;; This iterator is used to expand the patterns for the nearest
621 ;; integer functions.
622 (define_int_iterator FPINT [UNSPEC_FPINT_FLOOR UNSPEC_FPINT_BTRUNC
623 UNSPEC_FPINT_ROUND UNSPEC_FPINT_CEIL
624 UNSPEC_FPINT_NEARBYINT])
625 (define_int_attr fpint_name [(UNSPEC_FPINT_FLOOR "floor")
626 (UNSPEC_FPINT_BTRUNC "btrunc")
627 (UNSPEC_FPINT_ROUND "round")
628 (UNSPEC_FPINT_CEIL "ceil")
629 (UNSPEC_FPINT_NEARBYINT "nearbyint")])
630 (define_int_attr fpint_roundingmode [(UNSPEC_FPINT_FLOOR "7")
631 (UNSPEC_FPINT_BTRUNC "5")
632 (UNSPEC_FPINT_ROUND "1")
633 (UNSPEC_FPINT_CEIL "6")
634 (UNSPEC_FPINT_NEARBYINT "0")])
636 ;; This iterator and attribute allow to combine most atomic operations.
637 (define_code_iterator ATOMIC [and ior xor plus minus mult])
638 (define_code_iterator ATOMIC_Z196 [and ior xor plus])
639 (define_code_attr atomic [(and "and") (ior "or") (xor "xor")
640 (plus "add") (minus "sub") (mult "nand")])
641 (define_code_attr noxa [(and "n") (ior "o") (xor "x") (plus "a")])
643 ;; In FP templates, a string like "lt<de>br" will expand to "ltxbr" in
644 ;; TF/TDmode, "ltdbr" in DF/DDmode, and "ltebr" in SF/SDmode.
645 (define_mode_attr xde [(TF "x") (DF "d") (SF "e") (TD "x") (DD "d") (SD "e")])
647 ;; In FP templates, a <dee> in "m<dee><bt>r" will expand to "mx<bt>r" in
648 ;; TF/TDmode, "md<bt>r" in DF/DDmode, "mee<bt>r" in SFmode and "me<bt>r in
650 (define_mode_attr xdee [(TF "x") (DF "d") (SF "ee") (TD "x") (DD "d") (SD "e")])
652 ;; In FP templates, "<RRe>" will expand to "RRE" in TFmode and "RR" otherwise.
653 ;; Likewise for "<RXe>".
654 (define_mode_attr RRe [(TF "RRE") (DF "RR") (SF "RR")])
655 (define_mode_attr RXe [(TF "RXE") (DF "RX") (SF "RX")])
657 ;; The decimal floating point variants of add, sub, div and mul support 3
658 ;; fp register operands. The following attributes allow to merge the bfp and
659 ;; dfp variants in a single insn definition.
661 ;; These mode attributes are supposed to be used in the `enabled' insn
662 ;; attribute to disable certain alternatives for certain modes.
663 (define_mode_attr nBFP [(TF "0") (DF "0") (SF "0") (TD "*") (DD "*") (DD "*")])
664 (define_mode_attr nDFP [(TF "*") (DF "*") (SF "*") (TD "0") (DD "0") (DD "0")])
665 (define_mode_attr DSF [(TF "0") (DF "*") (SF "*") (TD "0") (DD "0") (SD "0")])
666 (define_mode_attr DFDI [(TF "0") (DF "*") (SF "0")
667 (TD "0") (DD "0") (DD "0")
668 (TI "0") (DI "*") (SI "0")])
670 ;; This attribute is used in the operand constraint list
671 ;; for instructions dealing with the sign bit of 32 or 64bit fp values.
672 ;; TFmode values are represented by a fp register pair. Since the
673 ;; sign bit instructions only handle single source and target fp registers
674 ;; these instructions can only be used for TFmode values if the source and
675 ;; target operand uses the same fp register.
676 (define_mode_attr fT0 [(TF "0") (DF "f") (SF "f")])
678 ;; This attribute adds b for bfp instructions and t for dfp instructions and is used
679 ;; within instruction mnemonics.
680 (define_mode_attr bt [(TF "b") (DF "b") (SF "b") (TD "t") (DD "t") (SD "t")])
682 ;; This attribute is used within instruction mnemonics. It evaluates to d for dfp
683 ;; modes and to an empty string for bfp modes.
684 (define_mode_attr _d [(TF "") (DF "") (SF "") (TD "d") (DD "d") (SD "d")])
686 ;; In GPR and P templates, a constraint like "<d0>" will expand to "d" in DImode
687 ;; and "0" in SImode. This allows to combine instructions of which the 31bit
688 ;; version only operates on one register.
689 (define_mode_attr d0 [(DI "d") (SI "0")])
691 ;; In combination with d0 this allows to combine instructions of which the 31bit
692 ;; version only operates on one register. The DImode version needs an additional
693 ;; register for the assembler output.
694 (define_mode_attr 1 [(DI "%1,") (SI "")])
696 ;; In SHIFT templates, a string like "s<lr>dl" will expand to "sldl" in
697 ;; 'ashift' and "srdl" in 'lshiftrt'.
698 (define_code_attr lr [(ashift "l") (lshiftrt "r")])
700 ;; In SHIFT templates, this attribute holds the correct standard name for the
701 ;; pattern itself and the corresponding function calls.
702 (define_code_attr shift [(ashift "ashl") (lshiftrt "lshr")])
704 ;; This attribute handles differences in the instruction 'type' and will result
705 ;; in "RRE" for DImode and "RR" for SImode.
706 (define_mode_attr E [(DI "E") (SI "")])
708 ;; This attribute handles differences in the instruction 'type' and makes RX<Y>
709 ;; to result in "RXY" for DImode and "RX" for SImode.
710 (define_mode_attr Y [(DI "Y") (SI "")])
712 ;; This attribute handles differences in the instruction 'type' and will result
713 ;; in "RSE" for TImode and "RS" for DImode.
714 (define_mode_attr TE [(TI "E") (DI "")])
716 ;; In GPR templates, a string like "lc<g>r" will expand to "lcgr" in DImode
717 ;; and "lcr" in SImode.
718 (define_mode_attr g [(DI "g") (SI "")])
720 ;; In GPR templates, a string like "sl<y>" will expand to "slg" in DImode
721 ;; and "sly" in SImode. This is useful because on 64bit the ..g instructions
722 ;; were enhanced with long displacements whereas 31bit instructions got a ..y
723 ;; variant for long displacements.
724 (define_mode_attr y [(DI "g") (SI "y")])
726 ;; In DW templates, a string like "cds<g>" will expand to "cdsg" in TImode
727 ;; and "cds" in DImode.
728 (define_mode_attr tg [(TI "g") (DI "")])
730 ;; In TDI templates, a string like "c<d>sg".
731 (define_mode_attr td [(TI "d") (DI "")])
733 ;; In GPR templates, a string like "c<gf>dbr" will expand to "cgdbr" in DImode
734 ;; and "cfdbr" in SImode.
735 (define_mode_attr gf [(DI "g") (SI "f")])
737 ;; In GPR templates, a string like sll<gk> will expand to sllg for DI
738 ;; and sllk for SI. This way it is possible to merge the new z196 SI
739 ;; 3 operands shift instructions into the existing patterns.
740 (define_mode_attr gk [(DI "g") (SI "k")])
742 ;; ICM mask required to load MODE value into the lowest subreg
743 ;; of a SImode register.
744 (define_mode_attr icm_lo [(HI "3") (QI "1")])
746 ;; In HQI templates, a string like "llg<hc>" will expand to "llgh" in
747 ;; HImode and "llgc" in QImode.
748 (define_mode_attr hc [(HI "h") (QI "c")])
750 ;; In P templates, the mode <DBL> will expand to "TI" in DImode and "DI"
752 (define_mode_attr DBL [(DI "TI") (SI "DI")])
754 ;; This attribute expands to DF for TFmode and to DD for TDmode . It is
755 ;; used for Txmode splitters splitting a Txmode copy into 2 Dxmode copies.
756 (define_mode_attr HALF_TMODE [(TF "DF") (TD "DD")])
758 ;; Maximum unsigned integer that fits in MODE.
759 (define_mode_attr max_uint [(HI "65535") (QI "255")])
761 ;; Start and end field computations for RISBG et al.
762 (define_mode_attr bfstart [(DI "s") (SI "t")])
763 (define_mode_attr bfend [(DI "e") (SI "f")])
765 ;; In place of GET_MODE_BITSIZE (<MODE>mode)
766 (define_mode_attr bitsize [(DI "64") (SI "32") (HI "16") (QI "8")])
768 (define_mode_attr bitoff [(DI "0") (SI "32") (HI "48") (QI "56")])
769 (define_mode_attr bitoff_plus [(DI "") (SI "32+") (HI "48+") (QI "56+")])
771 ;; In place of GET_MODE_SIZE (<MODE>mode)
772 (define_mode_attr modesize [(DI "8") (SI "4")])
774 ;; Allow return and simple_return to be defined from a single template.
775 (define_code_iterator ANY_RETURN [return simple_return])
779 ; Condition code modes generated by vector fp comparisons. These will
780 ; be used also in single element mode.
781 (define_mode_iterator VFCMP [CCVEQ CCVFH CCVFHE])
782 ; Used with VFCMP to expand part of the mnemonic
783 ; For fp we have a mismatch: eq in the insn name - e in asm
784 (define_mode_attr asm_fcmp [(CCVEQ "e") (CCVFH "h") (CCVFHE "he")])
785 (define_mode_attr insn_cmp [(CCVEQ "eq") (CCVIH "h") (CCVIHU "hl") (CCVFH "h") (CCVFHE "he")])
787 ;; Subst pattern definitions
790 (include "vector.md")
793 ;;- Compare instructions.
796 ; Test-under-Mask instructions
798 (define_insn "*tmqi_mem"
799 [(set (reg CC_REGNUM)
800 (compare (and:QI (match_operand:QI 0 "memory_operand" "Q,S")
801 (match_operand:QI 1 "immediate_operand" "n,n"))
802 (match_operand:QI 2 "immediate_operand" "n,n")))]
803 "s390_match_ccmode (insn, s390_tm_ccmode (operands[1], operands[2], false))"
807 [(set_attr "op_type" "SI,SIY")
808 (set_attr "cpu_facility" "*,longdisp")
809 (set_attr "z10prop" "z10_super,z10_super")])
811 (define_insn "*tmdi_reg"
812 [(set (reg CC_REGNUM)
813 (compare (and:DI (match_operand:DI 0 "nonimmediate_operand" "d,d,d,d")
814 (match_operand:DI 1 "immediate_operand"
815 "N0HD0,N1HD0,N2HD0,N3HD0"))
816 (match_operand:DI 2 "immediate_operand" "n,n,n,n")))]
818 && s390_match_ccmode (insn, s390_tm_ccmode (operands[1], operands[2], true))
819 && s390_single_part (operands[1], DImode, HImode, 0) >= 0"
825 [(set_attr "op_type" "RI")
826 (set_attr "z10prop" "z10_super,z10_super,z10_super,z10_super")])
828 (define_insn "*tmsi_reg"
829 [(set (reg CC_REGNUM)
830 (compare (and:SI (match_operand:SI 0 "nonimmediate_operand" "d,d")
831 (match_operand:SI 1 "immediate_operand" "N0HS0,N1HS0"))
832 (match_operand:SI 2 "immediate_operand" "n,n")))]
833 "s390_match_ccmode (insn, s390_tm_ccmode (operands[1], operands[2], true))
834 && s390_single_part (operands[1], SImode, HImode, 0) >= 0"
838 [(set_attr "op_type" "RI")
839 (set_attr "z10prop" "z10_super,z10_super")])
841 (define_insn "*tm<mode>_full"
842 [(set (reg CC_REGNUM)
843 (compare (match_operand:HQI 0 "register_operand" "d")
844 (match_operand:HQI 1 "immediate_operand" "n")))]
845 "s390_match_ccmode (insn, s390_tm_ccmode (constm1_rtx, operands[1], true))"
847 [(set_attr "op_type" "RI")
848 (set_attr "z10prop" "z10_super")])
852 ; Load-and-Test instructions
855 ; tst(di|si) instruction pattern(s).
857 (define_insn "*tstdi_sign"
858 [(set (reg CC_REGNUM)
862 (subreg:DI (match_operand:SI 0 "nonimmediate_operand" "d,T") 0)
863 (const_int 32)) (const_int 32))
864 (match_operand:DI 1 "const0_operand" "")))
865 (set (match_operand:DI 2 "register_operand" "=d,d")
866 (sign_extend:DI (match_dup 0)))]
867 "s390_match_ccmode(insn, CCSmode) && TARGET_ZARCH"
870 [(set_attr "op_type" "RRE,RXY")
871 (set_attr "cpu_facility" "*,z10")
872 (set_attr "z10prop" "z10_super_E1,z10_super_E1") ])
875 (define_insn "*tst<mode>_extimm"
876 [(set (reg CC_REGNUM)
877 (compare (match_operand:GPR 0 "nonimmediate_operand" "d,T")
878 (match_operand:GPR 1 "const0_operand" "")))
879 (set (match_operand:GPR 2 "register_operand" "=d,d")
881 "s390_match_ccmode(insn, CCSmode) && TARGET_EXTIMM"
885 [(set_attr "op_type" "RR<E>,RXY")
886 (set_attr "z10prop" "z10_fr_E1,z10_fwd_A3") ])
889 (define_insn "*tst<mode>_cconly_extimm"
890 [(set (reg CC_REGNUM)
891 (compare (match_operand:GPR 0 "nonimmediate_operand" "d,T")
892 (match_operand:GPR 1 "const0_operand" "")))
893 (clobber (match_scratch:GPR 2 "=X,d"))]
894 "s390_match_ccmode(insn, CCSmode) && TARGET_EXTIMM"
898 [(set_attr "op_type" "RR<E>,RXY")
899 (set_attr "z10prop" "z10_fr_E1,z10_fwd_A3")])
901 (define_insn "*tstdi"
902 [(set (reg CC_REGNUM)
903 (compare (match_operand:DI 0 "register_operand" "d")
904 (match_operand:DI 1 "const0_operand" "")))
905 (set (match_operand:DI 2 "register_operand" "=d")
907 "s390_match_ccmode(insn, CCSmode) && TARGET_ZARCH && !TARGET_EXTIMM"
909 [(set_attr "op_type" "RRE")
910 (set_attr "z10prop" "z10_fr_E1")])
912 (define_insn "*tstsi"
913 [(set (reg CC_REGNUM)
914 (compare (match_operand:SI 0 "nonimmediate_operand" "d,Q,S")
915 (match_operand:SI 1 "const0_operand" "")))
916 (set (match_operand:SI 2 "register_operand" "=d,d,d")
918 "s390_match_ccmode(insn, CCSmode) && !TARGET_EXTIMM"
923 [(set_attr "op_type" "RR,RS,RSY")
924 (set_attr "cpu_facility" "*,*,longdisp")
925 (set_attr "z10prop" "z10_fr_E1,z10_super_E1,z10_super_E1")])
927 (define_insn "*tstsi_cconly"
928 [(set (reg CC_REGNUM)
929 (compare (match_operand:SI 0 "nonimmediate_operand" "d,Q,S")
930 (match_operand:SI 1 "const0_operand" "")))
931 (clobber (match_scratch:SI 2 "=X,d,d"))]
932 "s390_match_ccmode(insn, CCSmode)"
937 [(set_attr "op_type" "RR,RS,RSY")
938 (set_attr "cpu_facility" "*,*,longdisp")
939 (set_attr "z10prop" "z10_fr_E1,z10_super_E1,z10_super_E1")])
941 (define_insn "*tstdi_cconly_31"
942 [(set (reg CC_REGNUM)
943 (compare (match_operand:DI 0 "register_operand" "d")
944 (match_operand:DI 1 "const0_operand" "")))]
945 "s390_match_ccmode(insn, CCSmode) && !TARGET_ZARCH"
947 [(set_attr "op_type" "RS")
948 (set_attr "atype" "reg")])
951 (define_insn "*tst<mode>_cconly2"
952 [(set (reg CC_REGNUM)
953 (compare (match_operand:GPR 0 "register_operand" "d")
954 (match_operand:GPR 1 "const0_operand" "")))]
955 "s390_match_ccmode(insn, CCSmode)"
957 [(set_attr "op_type" "RR<E>")
958 (set_attr "z10prop" "z10_fr_E1")])
960 ; tst(hi|qi) instruction pattern(s).
962 (define_insn "*tst<mode>CCT"
963 [(set (reg CC_REGNUM)
964 (compare (match_operand:HQI 0 "nonimmediate_operand" "?Q,?S,d")
965 (match_operand:HQI 1 "const0_operand" "")))
966 (set (match_operand:HQI 2 "register_operand" "=d,d,0")
968 "s390_match_ccmode(insn, CCTmode)"
971 icmy\t%2,<icm_lo>,%S0
973 [(set_attr "op_type" "RS,RSY,RI")
974 (set_attr "cpu_facility" "*,longdisp,*")
975 (set_attr "z10prop" "z10_super_E1,z10_super_E1,z10_super")])
977 (define_insn "*tsthiCCT_cconly"
978 [(set (reg CC_REGNUM)
979 (compare (match_operand:HI 0 "nonimmediate_operand" "Q,S,d")
980 (match_operand:HI 1 "const0_operand" "")))
981 (clobber (match_scratch:HI 2 "=d,d,X"))]
982 "s390_match_ccmode(insn, CCTmode)"
987 [(set_attr "op_type" "RS,RSY,RI")
988 (set_attr "cpu_facility" "*,longdisp,*")
989 (set_attr "z10prop" "z10_super_E1,z10_super_E1,z10_super")])
991 (define_insn "*tstqiCCT_cconly"
992 [(set (reg CC_REGNUM)
993 (compare (match_operand:QI 0 "nonimmediate_operand" "?Q,?S,d")
994 (match_operand:QI 1 "const0_operand" "")))]
995 "s390_match_ccmode(insn, CCTmode)"
1000 [(set_attr "op_type" "SI,SIY,RI")
1001 (set_attr "cpu_facility" "*,longdisp,*")
1002 (set_attr "z10prop" "z10_super,z10_super,z10_super")])
1004 (define_insn "*tst<mode>"
1005 [(set (reg CC_REGNUM)
1006 (compare (match_operand:HQI 0 "s_operand" "Q,S")
1007 (match_operand:HQI 1 "const0_operand" "")))
1008 (set (match_operand:HQI 2 "register_operand" "=d,d")
1010 "s390_match_ccmode(insn, CCSmode)"
1012 icm\t%2,<icm_lo>,%S0
1013 icmy\t%2,<icm_lo>,%S0"
1014 [(set_attr "op_type" "RS,RSY")
1015 (set_attr "cpu_facility" "*,longdisp")
1016 (set_attr "z10prop" "z10_super_E1,z10_super_E1")])
1018 (define_insn "*tst<mode>_cconly"
1019 [(set (reg CC_REGNUM)
1020 (compare (match_operand:HQI 0 "s_operand" "Q,S")
1021 (match_operand:HQI 1 "const0_operand" "")))
1022 (clobber (match_scratch:HQI 2 "=d,d"))]
1023 "s390_match_ccmode(insn, CCSmode)"
1025 icm\t%2,<icm_lo>,%S0
1026 icmy\t%2,<icm_lo>,%S0"
1027 [(set_attr "op_type" "RS,RSY")
1028 (set_attr "cpu_facility" "*,longdisp")
1029 (set_attr "z10prop" "z10_super_E1,z10_super_E1")])
1032 ; Compare (equality) instructions
1034 (define_insn "*cmpdi_cct"
1035 [(set (reg CC_REGNUM)
1036 (compare (match_operand:DI 0 "nonimmediate_operand" "%d,d,d,d,Q")
1037 (match_operand:DI 1 "general_operand" "d,K,Os,T,BQ")))]
1038 "s390_match_ccmode (insn, CCTmode) && TARGET_ZARCH"
1045 [(set_attr "op_type" "RRE,RI,RIL,RXY,SS")
1046 (set_attr "z10prop" "z10_super_c,z10_super,z10_super,z10_super,*")])
1048 (define_insn "*cmpsi_cct"
1049 [(set (reg CC_REGNUM)
1050 (compare (match_operand:SI 0 "nonimmediate_operand" "%d,d,d,d,d,Q")
1051 (match_operand:SI 1 "general_operand" "d,K,Os,R,T,BQ")))]
1052 "s390_match_ccmode (insn, CCTmode)"
1060 [(set_attr "op_type" "RR,RI,RIL,RX,RXY,SS")
1061 (set_attr "cpu_facility" "*,*,*,*,longdisp,*")
1062 (set_attr "z10prop" "z10_super_c,z10_super,z10_super,z10_super,z10_super,*")])
1064 ; Compare (signed) instructions
1066 (define_insn "*cmpdi_ccs_sign"
1067 [(set (reg CC_REGNUM)
1068 (compare (sign_extend:DI (match_operand:SI 1 "nonimmediate_operand"
1070 (match_operand:DI 0 "register_operand" "d, d,d")))]
1071 "s390_match_ccmode(insn, CCSRmode) && TARGET_ZARCH"
1076 [(set_attr "op_type" "RRE,RXY,RIL")
1077 (set_attr "z10prop" "z10_c,*,*")
1078 (set_attr "type" "*,*,larl")])
1082 (define_insn "*cmpsi_ccs_sign"
1083 [(set (reg CC_REGNUM)
1084 (compare (sign_extend:SI (match_operand:HI 1 "memory_operand" "R,T,b"))
1085 (match_operand:SI 0 "register_operand" "d,d,d")))]
1086 "s390_match_ccmode(insn, CCSRmode)"
1091 [(set_attr "op_type" "RX,RXY,RIL")
1092 (set_attr "cpu_facility" "*,longdisp,z10")
1093 (set_attr "type" "*,*,larl")
1094 (set_attr "z196prop" "z196_cracked,z196_cracked,z196_cracked")])
1096 (define_insn "*cmphi_ccs_z10"
1097 [(set (reg CC_REGNUM)
1098 (compare (match_operand:HI 0 "s_operand" "Q")
1099 (match_operand:HI 1 "immediate_operand" "K")))]
1100 "s390_match_ccmode(insn, CCSmode) && TARGET_Z10"
1102 [(set_attr "op_type" "SIL")
1103 (set_attr "z196prop" "z196_cracked")])
1105 (define_insn "*cmpdi_ccs_signhi_rl"
1106 [(set (reg CC_REGNUM)
1107 (compare (sign_extend:DI (match_operand:HI 1 "memory_operand" "T,b"))
1108 (match_operand:GPR 0 "register_operand" "d,d")))]
1109 "s390_match_ccmode(insn, CCSRmode) && TARGET_Z10"
1113 [(set_attr "op_type" "RXY,RIL")
1114 (set_attr "type" "*,larl")])
1116 ; cr, chi, cfi, c, cy, cgr, cghi, cgfi, cg, chsi, cghsi, crl, cgrl
1117 (define_insn "*cmp<mode>_ccs"
1118 [(set (reg CC_REGNUM)
1119 (compare (match_operand:GPR 0 "nonimmediate_operand"
1121 (match_operand:GPR 1 "general_operand"
1122 "d,K,K,Os,R,T,b")))]
1123 "s390_match_ccmode(insn, CCSmode)"
1132 [(set_attr "op_type" "RR<E>,RI,SIL,RIL,RX<Y>,RXY,RIL")
1133 (set_attr "cpu_facility" "*,*,z10,extimm,*,longdisp,z10")
1134 (set_attr "type" "*,*,*,*,*,*,larl")
1135 (set_attr "z10prop" "z10_super_c,z10_super,z10_super,z10_super,z10_super,z10_super,z10_super")])
1138 ; Compare (unsigned) instructions
1140 (define_insn "*cmpsi_ccu_zerohi_rlsi"
1141 [(set (reg CC_REGNUM)
1142 (compare (zero_extend:SI (mem:HI (match_operand:SI 1
1143 "larl_operand" "X")))
1144 (match_operand:SI 0 "register_operand" "d")))]
1145 "s390_match_ccmode(insn, CCURmode) && TARGET_Z10"
1147 [(set_attr "op_type" "RIL")
1148 (set_attr "type" "larl")
1149 (set_attr "z10prop" "z10_super")])
1152 (define_insn "*cmp<GPR:mode>_ccu_zerohi_rldi"
1153 [(set (reg CC_REGNUM)
1154 (compare (zero_extend:GPR (mem:HI (match_operand:DI 1
1155 "larl_operand" "X")))
1156 (match_operand:GPR 0 "register_operand" "d")))]
1157 "s390_match_ccmode(insn, CCURmode) && TARGET_Z10"
1159 [(set_attr "op_type" "RIL")
1160 (set_attr "type" "larl")
1161 (set_attr "z10prop" "z10_super")])
1163 (define_insn "*cmpdi_ccu_zero"
1164 [(set (reg CC_REGNUM)
1165 (compare (zero_extend:DI (match_operand:SI 1 "nonimmediate_operand"
1167 (match_operand:DI 0 "register_operand" "d,d,d")))]
1168 "s390_match_ccmode (insn, CCURmode) && TARGET_ZARCH"
1173 [(set_attr "op_type" "RRE,RXY,RIL")
1174 (set_attr "cpu_facility" "*,*,z10")
1175 (set_attr "type" "*,*,larl")
1176 (set_attr "z10prop" "z10_super_c,z10_super_E1,z10_super")])
1178 (define_insn "*cmpdi_ccu"
1179 [(set (reg CC_REGNUM)
1180 (compare (match_operand:DI 0 "nonimmediate_operand"
1182 (match_operand:DI 1 "general_operand"
1183 "d,Op,b,D,T,BQ,Q")))]
1184 "s390_match_ccmode (insn, CCUmode) && TARGET_ZARCH"
1193 [(set_attr "op_type" "RRE,RIL,RIL,SIL,RXY,SS,SS")
1194 (set_attr "cpu_facility" "*,extimm,z10,z10,*,*,*")
1195 (set_attr "type" "*,*,larl,*,*,*,*")
1196 (set_attr "z10prop" "z10_super_c,z10_super,z10_super,z10_super,z10_super,*,*")])
1198 (define_insn "*cmpsi_ccu"
1199 [(set (reg CC_REGNUM)
1200 (compare (match_operand:SI 0 "nonimmediate_operand" "d, d,d,Q,d,d, Q,BQ")
1201 (match_operand:SI 1 "general_operand" "d,Os,b,D,R,T,BQ, Q")))]
1202 "s390_match_ccmode (insn, CCUmode)"
1212 [(set_attr "op_type" "RR,RIL,RIL,SIL,RX,RXY,SS,SS")
1213 (set_attr "cpu_facility" "*,extimm,z10,z10,*,longdisp,*,*")
1214 (set_attr "type" "*,*,larl,*,*,*,*,*")
1215 (set_attr "z10prop" "z10_super_c,z10_super,z10_super,z10_super,z10_super,z10_super,*,*")])
1217 (define_insn "*cmphi_ccu"
1218 [(set (reg CC_REGNUM)
1219 (compare (match_operand:HI 0 "nonimmediate_operand" "d,d,Q,Q,BQ")
1220 (match_operand:HI 1 "general_operand" "Q,S,D,BQ,Q")))]
1221 "s390_match_ccmode (insn, CCUmode)
1222 && !register_operand (operands[1], HImode)"
1229 [(set_attr "op_type" "RS,RSY,SIL,SS,SS")
1230 (set_attr "cpu_facility" "*,longdisp,z10,*,*")
1231 (set_attr "z10prop" "*,*,z10_super,*,*")])
1233 (define_insn "*cmpqi_ccu"
1234 [(set (reg CC_REGNUM)
1235 (compare (match_operand:QI 0 "nonimmediate_operand" "d,d,Q,S,Q,BQ")
1236 (match_operand:QI 1 "general_operand" "Q,S,n,n,BQ,Q")))]
1237 "s390_match_ccmode (insn, CCUmode)
1238 && !register_operand (operands[1], QImode)"
1246 [(set_attr "op_type" "RS,RSY,SI,SIY,SS,SS")
1247 (set_attr "cpu_facility" "*,longdisp,*,longdisp,*,*")
1248 (set_attr "z10prop" "*,*,z10_super,z10_super,*,*")])
1251 ; Block compare (CLC) instruction patterns.
1254 [(set (reg CC_REGNUM)
1255 (compare (match_operand:BLK 0 "memory_operand" "Q")
1256 (match_operand:BLK 1 "memory_operand" "Q")))
1257 (use (match_operand 2 "const_int_operand" "n"))]
1258 "s390_match_ccmode (insn, CCUmode)
1259 && INTVAL (operands[2]) >= 1 && INTVAL (operands[2]) <= 256"
1260 "clc\t%O0(%2,%R0),%S1"
1261 [(set_attr "op_type" "SS")])
1264 [(set (reg CC_REGNUM)
1265 (compare (match_operand 0 "memory_operand" "")
1266 (match_operand 1 "memory_operand" "")))]
1268 && s390_match_ccmode (insn, CCUmode)
1269 && GET_MODE (operands[0]) == GET_MODE (operands[1])
1270 && GET_MODE_SIZE (GET_MODE (operands[0])) > 0"
1272 [(set (match_dup 0) (match_dup 1))
1273 (use (match_dup 2))])]
1275 operands[2] = GEN_INT (GET_MODE_SIZE (GET_MODE (operands[0])));
1276 operands[0] = adjust_address (operands[0], BLKmode, 0);
1277 operands[1] = adjust_address (operands[1], BLKmode, 0);
1279 operands[1] = gen_rtx_COMPARE (GET_MODE (SET_DEST (PATTERN (curr_insn))),
1280 operands[0], operands[1]);
1281 operands[0] = SET_DEST (PATTERN (curr_insn));
1285 ; (TF|DF|SF|TD|DD|SD) instructions
1287 ; ltxbr, ltdbr, ltebr, ltxtr, ltdtr
1288 (define_insn "*cmp<mode>_ccs_0"
1289 [(set (reg CC_REGNUM)
1290 (compare (match_operand:FP 0 "register_operand" "f")
1291 (match_operand:FP 1 "const0_operand" "")))]
1292 "s390_match_ccmode(insn, CCSmode) && TARGET_HARD_FLOAT"
1293 "lt<xde><bt>r\t%0,%0"
1294 [(set_attr "op_type" "RRE")
1295 (set_attr "type" "fsimp<mode>")])
1297 ; cxtr, cxbr, cdtr, cdbr, cebr, cdb, ceb
1298 (define_insn "*cmp<mode>_ccs"
1299 [(set (reg CC_REGNUM)
1300 (compare (match_operand:FP 0 "register_operand" "f,f")
1301 (match_operand:FP 1 "general_operand" "f,R")))]
1302 "s390_match_ccmode(insn, CCSmode) && TARGET_HARD_FLOAT"
1306 [(set_attr "op_type" "RRE,RXE")
1307 (set_attr "type" "fsimp<mode>")
1308 (set_attr "enabled" "*,<DSF>")])
1310 ; wfcedbs, wfchdbs, wfchedbs
1311 (define_insn "*vec_cmp<insn_cmp>df_cconly"
1312 [(set (reg:VFCMP CC_REGNUM)
1313 (compare:VFCMP (match_operand:DF 0 "register_operand" "v")
1314 (match_operand:DF 1 "register_operand" "v")))
1315 (clobber (match_scratch:V2DI 2 "=v"))]
1316 "TARGET_VX && TARGET_HARD_FLOAT"
1317 "wfc<asm_fcmp>dbs\t%v2,%v0,%v1"
1318 [(set_attr "op_type" "VRR")])
1320 ; Compare and Branch instructions
1322 ; cij, cgij, crj, cgrj, cfi, cgfi, cr, cgr
1323 ; The following instructions do a complementary access of their second
1324 ; operand (z01 only): crj_c, cgrjc, cr, cgr
1325 (define_insn "*cmp_and_br_signed_<mode>"
1327 (if_then_else (match_operator 0 "s390_signed_integer_comparison"
1328 [(match_operand:GPR 1 "register_operand" "d,d")
1329 (match_operand:GPR 2 "nonmemory_operand" "d,C")])
1330 (label_ref (match_operand 3 "" ""))
1332 (clobber (reg:CC CC_REGNUM))]
1333 "TARGET_Z10 && !TARGET_AVOID_CMP_AND_BRANCH"
1335 if (get_attr_length (insn) == 6)
1336 return which_alternative ?
1337 "c<g>ij%C0\t%1,%c2,%l3" : "c<g>rj%C0\t%1,%2,%l3";
1339 return which_alternative ?
1340 "c<g>fi\t%1,%c2\;jg%C0\t%l3" : "c<g>r\t%1,%2\;jg%C0\t%l3";
1342 [(set_attr "op_type" "RIE")
1343 (set_attr "type" "branch")
1344 (set_attr "z10prop" "z10_super_c,z10_super")
1345 (set (attr "length")
1346 (if_then_else (lt (abs (minus (pc) (match_dup 3))) (const_int 60000))
1347 (const_int 6) (const_int 12)))]) ; 8 byte for cr/jg
1348 ; 10 byte for cgr/jg
1350 ; clij, clgij, clrj, clgrj, clfi, clgfi, clr, clgr
1351 ; The following instructions do a complementary access of their second
1352 ; operand (z10 only): clrj, clgrj, clr, clgr
1353 (define_insn "*cmp_and_br_unsigned_<mode>"
1355 (if_then_else (match_operator 0 "s390_unsigned_integer_comparison"
1356 [(match_operand:GPR 1 "register_operand" "d,d")
1357 (match_operand:GPR 2 "nonmemory_operand" "d,I")])
1358 (label_ref (match_operand 3 "" ""))
1360 (clobber (reg:CC CC_REGNUM))]
1361 "TARGET_Z10 && !TARGET_AVOID_CMP_AND_BRANCH"
1363 if (get_attr_length (insn) == 6)
1364 return which_alternative ?
1365 "cl<g>ij%C0\t%1,%b2,%l3" : "cl<g>rj%C0\t%1,%2,%l3";
1367 return which_alternative ?
1368 "cl<g>fi\t%1,%b2\;jg%C0\t%l3" : "cl<g>r\t%1,%2\;jg%C0\t%l3";
1370 [(set_attr "op_type" "RIE")
1371 (set_attr "type" "branch")
1372 (set_attr "z10prop" "z10_super_c,z10_super")
1373 (set (attr "length")
1374 (if_then_else (lt (abs (minus (pc) (match_dup 3))) (const_int 60000))
1375 (const_int 6) (const_int 12)))]) ; 8 byte for clr/jg
1376 ; 10 byte for clgr/jg
1378 ; And now the same two patterns as above but with a negated CC mask.
1380 ; cij, cgij, crj, cgrj, cfi, cgfi, cr, cgr
1381 ; The following instructions do a complementary access of their second
1382 ; operand (z01 only): crj_c, cgrjc, cr, cgr
1383 (define_insn "*icmp_and_br_signed_<mode>"
1385 (if_then_else (match_operator 0 "s390_signed_integer_comparison"
1386 [(match_operand:GPR 1 "register_operand" "d,d")
1387 (match_operand:GPR 2 "nonmemory_operand" "d,C")])
1389 (label_ref (match_operand 3 "" ""))))
1390 (clobber (reg:CC CC_REGNUM))]
1391 "TARGET_Z10 && !TARGET_AVOID_CMP_AND_BRANCH"
1393 if (get_attr_length (insn) == 6)
1394 return which_alternative ?
1395 "c<g>ij%D0\t%1,%c2,%l3" : "c<g>rj%D0\t%1,%2,%l3";
1397 return which_alternative ?
1398 "c<g>fi\t%1,%c2\;jg%D0\t%l3" : "c<g>r\t%1,%2\;jg%D0\t%l3";
1400 [(set_attr "op_type" "RIE")
1401 (set_attr "type" "branch")
1402 (set_attr "z10prop" "z10_super_c,z10_super")
1403 (set (attr "length")
1404 (if_then_else (lt (abs (minus (pc) (match_dup 3))) (const_int 60000))
1405 (const_int 6) (const_int 12)))]) ; 8 byte for cr/jg
1406 ; 10 byte for cgr/jg
1408 ; clij, clgij, clrj, clgrj, clfi, clgfi, clr, clgr
1409 ; The following instructions do a complementary access of their second
1410 ; operand (z10 only): clrj, clgrj, clr, clgr
1411 (define_insn "*icmp_and_br_unsigned_<mode>"
1413 (if_then_else (match_operator 0 "s390_unsigned_integer_comparison"
1414 [(match_operand:GPR 1 "register_operand" "d,d")
1415 (match_operand:GPR 2 "nonmemory_operand" "d,I")])
1417 (label_ref (match_operand 3 "" ""))))
1418 (clobber (reg:CC CC_REGNUM))]
1419 "TARGET_Z10 && !TARGET_AVOID_CMP_AND_BRANCH"
1421 if (get_attr_length (insn) == 6)
1422 return which_alternative ?
1423 "cl<g>ij%D0\t%1,%b2,%l3" : "cl<g>rj%D0\t%1,%2,%l3";
1425 return which_alternative ?
1426 "cl<g>fi\t%1,%b2\;jg%D0\t%l3" : "cl<g>r\t%1,%2\;jg%D0\t%l3";
1428 [(set_attr "op_type" "RIE")
1429 (set_attr "type" "branch")
1430 (set_attr "z10prop" "z10_super_c,z10_super")
1431 (set (attr "length")
1432 (if_then_else (lt (abs (minus (pc) (match_dup 3))) (const_int 60000))
1433 (const_int 6) (const_int 12)))]) ; 8 byte for clr/jg
1434 ; 10 byte for clgr/jg
1437 ;;- Move instructions.
1441 ; movti instruction pattern(s).
1444 ; FIXME: More constants are possible by enabling jxx, jyy constraints
1445 ; for TImode (use double-int for the calculations)
1446 (define_insn "movti"
1447 [(set (match_operand:TI 0 "nonimmediate_operand" "=d,S,v, v, v,v,d,v,R, d,o")
1448 (match_operand:TI 1 "general_operand" " S,d,v,j00,jm1,d,v,R,v,dPT,d"))]
1462 [(set_attr "op_type" "RSY,RSY,VRR,VRI,VRI,VRR,*,VRX,VRX,*,*")
1463 (set_attr "type" "lm,stm,*,*,*,*,*,*,*,*,*")
1464 (set_attr "cpu_facility" "*,*,vec,vec,vec,vec,vec,vec,vec,*,*")])
1467 [(set (match_operand:TI 0 "nonimmediate_operand" "")
1468 (match_operand:TI 1 "general_operand" ""))]
1469 "TARGET_ZARCH && reload_completed
1470 && s390_split_ok_p (operands[0], operands[1], TImode, 0)"
1471 [(set (match_dup 2) (match_dup 4))
1472 (set (match_dup 3) (match_dup 5))]
1474 operands[2] = operand_subword (operands[0], 0, 0, TImode);
1475 operands[3] = operand_subword (operands[0], 1, 0, TImode);
1476 operands[4] = operand_subword (operands[1], 0, 0, TImode);
1477 operands[5] = operand_subword (operands[1], 1, 0, TImode);
1481 [(set (match_operand:TI 0 "nonimmediate_operand" "")
1482 (match_operand:TI 1 "general_operand" ""))]
1483 "TARGET_ZARCH && reload_completed
1484 && s390_split_ok_p (operands[0], operands[1], TImode, 1)"
1485 [(set (match_dup 2) (match_dup 4))
1486 (set (match_dup 3) (match_dup 5))]
1488 operands[2] = operand_subword (operands[0], 1, 0, TImode);
1489 operands[3] = operand_subword (operands[0], 0, 0, TImode);
1490 operands[4] = operand_subword (operands[1], 1, 0, TImode);
1491 operands[5] = operand_subword (operands[1], 0, 0, TImode);
1494 ; Use part of the TImode target reg to perform the address
1495 ; calculation. If the TImode value is supposed to be copied into a VR
1496 ; this splitter is not necessary.
1498 [(set (match_operand:TI 0 "register_operand" "")
1499 (match_operand:TI 1 "memory_operand" ""))]
1500 "TARGET_ZARCH && reload_completed
1501 && !VECTOR_REG_P (operands[0])
1502 && !s_operand (operands[1], VOIDmode)"
1503 [(set (match_dup 0) (match_dup 1))]
1505 rtx addr = operand_subword (operands[0], 1, 0, TImode);
1506 addr = gen_lowpart (Pmode, addr);
1507 s390_load_address (addr, XEXP (operands[1], 0));
1508 operands[1] = replace_equiv_address (operands[1], addr);
1512 ; Split a VR -> GPR TImode move into 2 vector load GR from VR element.
1513 ; For the higher order bits we do simply a DImode move while the
1514 ; second part is done via vec extract. Both will end up as vlgvg.
1516 [(set (match_operand:TI 0 "register_operand" "")
1517 (match_operand:TI 1 "register_operand" ""))]
1518 "TARGET_VX && reload_completed
1519 && GENERAL_REG_P (operands[0])
1520 && VECTOR_REG_P (operands[1])"
1521 [(set (match_dup 2) (match_dup 4))
1522 (set (match_dup 3) (unspec:DI [(match_dup 5) (const_int 1)]
1523 UNSPEC_VEC_EXTRACT))]
1525 operands[2] = operand_subword (operands[0], 0, 0, TImode);
1526 operands[3] = operand_subword (operands[0], 1, 0, TImode);
1527 operands[4] = gen_rtx_REG (DImode, REGNO (operands[1]));
1528 operands[5] = gen_rtx_REG (V2DImode, REGNO (operands[1]));
1532 ; Patterns used for secondary reloads
1535 ; z10 provides move instructions accepting larl memory operands.
1536 ; Unfortunately there is no such variant for QI, TI and FP mode moves.
1537 ; These patterns are also used for unaligned SI and DI accesses.
1539 (define_expand "reload<ALL:mode><P:mode>_tomem_z10"
1540 [(parallel [(match_operand:ALL 0 "memory_operand" "")
1541 (match_operand:ALL 1 "register_operand" "=d")
1542 (match_operand:P 2 "register_operand" "=&a")])]
1545 s390_reload_symref_address (operands[1], operands[0], operands[2], 1);
1549 (define_expand "reload<ALL:mode><P:mode>_toreg_z10"
1550 [(parallel [(match_operand:ALL 0 "register_operand" "=d")
1551 (match_operand:ALL 1 "memory_operand" "")
1552 (match_operand:P 2 "register_operand" "=a")])]
1555 s390_reload_symref_address (operands[0], operands[1], operands[2], 0);
1559 (define_expand "reload<P:mode>_larl_odd_addend_z10"
1560 [(parallel [(match_operand:P 0 "register_operand" "=d")
1561 (match_operand:P 1 "larl_operand" "")
1562 (match_operand:P 2 "register_operand" "=a")])]
1565 s390_reload_larl_operand (operands[0], operands[1], operands[2]);
1569 ; Handles loading a PLUS (load address) expression
1571 (define_expand "reload<mode>_plus"
1572 [(parallel [(match_operand:P 0 "register_operand" "=a")
1573 (match_operand:P 1 "s390_plus_operand" "")
1574 (match_operand:P 2 "register_operand" "=&a")])]
1577 s390_expand_plus_operand (operands[0], operands[1], operands[2]);
1581 ; Not all the indirect memory access instructions support the full
1582 ; format (long disp + index + base). So whenever a move from/to such
1583 ; an address is required and the instruction cannot deal with it we do
1584 ; a load address into a scratch register first and use this as the new
1586 ; This in particular is used for:
1587 ; - non-offsetable memory accesses for multiword moves
1588 ; - full vector reg moves with long displacements
1590 (define_expand "reload<mode>_la_in"
1591 [(parallel [(match_operand 0 "register_operand" "")
1592 (match_operand 1 "" "")
1593 (match_operand:P 2 "register_operand" "=&a")])]
1596 gcc_assert (MEM_P (operands[1]));
1597 s390_load_address (operands[2], find_replacement (&XEXP (operands[1], 0)));
1598 operands[1] = replace_equiv_address (operands[1], operands[2]);
1599 emit_move_insn (operands[0], operands[1]);
1603 (define_expand "reload<mode>_la_out"
1604 [(parallel [(match_operand 0 "" "")
1605 (match_operand 1 "register_operand" "")
1606 (match_operand:P 2 "register_operand" "=&a")])]
1609 gcc_assert (MEM_P (operands[0]));
1610 s390_load_address (operands[2], find_replacement (&XEXP (operands[0], 0)));
1611 operands[0] = replace_equiv_address (operands[0], operands[2]);
1612 emit_move_insn (operands[0], operands[1]);
1616 (define_expand "reload<mode>_PIC_addr"
1617 [(parallel [(match_operand 0 "register_operand" "=d")
1618 (match_operand 1 "larl_operand" "")
1619 (match_operand:P 2 "register_operand" "=a")])]
1622 rtx new_rtx = legitimize_pic_address (operands[1], operands[2]);
1623 emit_move_insn (operands[0], new_rtx);
1627 ; movdi instruction pattern(s).
1630 (define_expand "movdi"
1631 [(set (match_operand:DI 0 "general_operand" "")
1632 (match_operand:DI 1 "general_operand" ""))]
1635 /* Handle symbolic constants. */
1637 && (SYMBOLIC_CONST (operands[1])
1638 || (GET_CODE (operands[1]) == PLUS
1639 && XEXP (operands[1], 0) == pic_offset_table_rtx
1640 && SYMBOLIC_CONST (XEXP (operands[1], 1)))))
1641 emit_symbolic_move (operands);
1644 (define_insn "*movdi_larl"
1645 [(set (match_operand:DI 0 "register_operand" "=d")
1646 (match_operand:DI 1 "larl_operand" "X"))]
1648 && !FP_REG_P (operands[0])"
1650 [(set_attr "op_type" "RIL")
1651 (set_attr "type" "larl")
1652 (set_attr "z10prop" "z10_super_A1")])
1654 (define_insn "*movdi_64"
1655 [(set (match_operand:DI 0 "nonimmediate_operand"
1656 "=d, d, d, d, d, d, d, d,f,d,d,d,d,d,T,!*f,!*f,!*f,!R,!T,b,Q,d,t,Q,t,v,v,v,d,v,R")
1657 (match_operand:DI 1 "general_operand"
1658 " K,N0HD0,N1HD0,N2HD0,N3HD0,Os,N0SD0,N1SD0,d,f,L,b,d,T,d, *f, R, T,*f,*f,d,K,t,d,t,Q,K,v,d,v,R,v"))]
1693 [(set_attr "op_type" "RI,RI,RI,RI,RI,RIL,RIL,RIL,RRE,RRE,RXY,RIL,RRE,RXY,
1694 RXY,RR,RX,RXY,RX,RXY,RIL,SIL,*,*,RS,RS,VRI,VRR,VRS,VRS,VRX,VRX")
1695 (set_attr "type" "*,*,*,*,*,*,*,*,floaddf,floaddf,la,larl,lr,load,store,
1696 floaddf,floaddf,floaddf,fstoredf,fstoredf,larl,*,*,*,*,
1698 (set_attr "cpu_facility" "*,*,*,*,*,extimm,extimm,extimm,dfp,dfp,longdisp,
1699 z10,*,*,*,*,*,longdisp,*,longdisp,
1700 z10,z10,*,*,*,*,vec,vec,vec,vec,vec,vec")
1701 (set_attr "z10prop" "z10_fwd_A1,
1730 [(set (match_operand:DI 0 "register_operand" "")
1731 (match_operand:DI 1 "register_operand" ""))]
1732 "TARGET_ZARCH && ACCESS_REG_P (operands[1])"
1733 [(set (match_dup 2) (match_dup 3))
1734 (set (match_dup 0) (ashift:DI (match_dup 0) (const_int 32)))
1735 (set (strict_low_part (match_dup 2)) (match_dup 4))]
1736 "operands[2] = gen_lowpart (SImode, operands[0]);
1737 s390_split_access_reg (operands[1], &operands[4], &operands[3]);")
1740 [(set (match_operand:DI 0 "register_operand" "")
1741 (match_operand:DI 1 "register_operand" ""))]
1742 "TARGET_ZARCH && ACCESS_REG_P (operands[0])
1743 && dead_or_set_p (insn, operands[1])"
1744 [(set (match_dup 3) (match_dup 2))
1745 (set (match_dup 1) (lshiftrt:DI (match_dup 1) (const_int 32)))
1746 (set (match_dup 4) (match_dup 2))]
1747 "operands[2] = gen_lowpart (SImode, operands[1]);
1748 s390_split_access_reg (operands[0], &operands[3], &operands[4]);")
1751 [(set (match_operand:DI 0 "register_operand" "")
1752 (match_operand:DI 1 "register_operand" ""))]
1753 "TARGET_ZARCH && ACCESS_REG_P (operands[0])
1754 && !dead_or_set_p (insn, operands[1])"
1755 [(set (match_dup 3) (match_dup 2))
1756 (set (match_dup 1) (rotate:DI (match_dup 1) (const_int 32)))
1757 (set (match_dup 4) (match_dup 2))
1758 (set (match_dup 1) (rotate:DI (match_dup 1) (const_int 32)))]
1759 "operands[2] = gen_lowpart (SImode, operands[1]);
1760 s390_split_access_reg (operands[0], &operands[3], &operands[4]);")
1762 (define_insn "*movdi_31"
1763 [(set (match_operand:DI 0 "nonimmediate_operand"
1764 "=d,d,Q,S,d ,o,!*f,!*f,!*f,!R,!T,d")
1765 (match_operand:DI 1 "general_operand"
1766 " Q,S,d,d,dPT,d, *f, R, T,*f,*f,b"))]
1781 [(set_attr "op_type" "RS,RSY,RS,RSY,*,*,RR,RX,RXY,RX,RXY,*")
1782 (set_attr "type" "lm,lm,stm,stm,*,*,floaddf,floaddf,floaddf,fstoredf,fstoredf,*")
1783 (set_attr "cpu_facility" "*,longdisp,*,longdisp,*,*,*,*,longdisp,*,longdisp,z10")])
1785 ; For a load from a symbol ref we can use one of the target registers
1786 ; together with larl to load the address.
1788 [(set (match_operand:DI 0 "register_operand" "")
1789 (match_operand:DI 1 "memory_operand" ""))]
1790 "!TARGET_ZARCH && reload_completed && TARGET_Z10
1791 && larl_operand (XEXP (operands[1], 0), SImode)"
1792 [(set (match_dup 2) (match_dup 3))
1793 (set (match_dup 0) (match_dup 1))]
1795 operands[2] = operand_subword (operands[0], 1, 0, DImode);
1796 operands[3] = XEXP (operands[1], 0);
1797 operands[1] = replace_equiv_address (operands[1], operands[2]);
1801 [(set (match_operand:DI 0 "nonimmediate_operand" "")
1802 (match_operand:DI 1 "general_operand" ""))]
1803 "!TARGET_ZARCH && reload_completed
1804 && s390_split_ok_p (operands[0], operands[1], DImode, 0)"
1805 [(set (match_dup 2) (match_dup 4))
1806 (set (match_dup 3) (match_dup 5))]
1808 operands[2] = operand_subword (operands[0], 0, 0, DImode);
1809 operands[3] = operand_subword (operands[0], 1, 0, DImode);
1810 operands[4] = operand_subword (operands[1], 0, 0, DImode);
1811 operands[5] = operand_subword (operands[1], 1, 0, DImode);
1815 [(set (match_operand:DI 0 "nonimmediate_operand" "")
1816 (match_operand:DI 1 "general_operand" ""))]
1817 "!TARGET_ZARCH && reload_completed
1818 && s390_split_ok_p (operands[0], operands[1], DImode, 1)"
1819 [(set (match_dup 2) (match_dup 4))
1820 (set (match_dup 3) (match_dup 5))]
1822 operands[2] = operand_subword (operands[0], 1, 0, DImode);
1823 operands[3] = operand_subword (operands[0], 0, 0, DImode);
1824 operands[4] = operand_subword (operands[1], 1, 0, DImode);
1825 operands[5] = operand_subword (operands[1], 0, 0, DImode);
1829 [(set (match_operand:DI 0 "register_operand" "")
1830 (match_operand:DI 1 "memory_operand" ""))]
1831 "!TARGET_ZARCH && reload_completed
1832 && !FP_REG_P (operands[0])
1833 && !s_operand (operands[1], VOIDmode)"
1834 [(set (match_dup 0) (match_dup 1))]
1836 rtx addr = operand_subword (operands[0], 1, 0, DImode);
1837 s390_load_address (addr, XEXP (operands[1], 0));
1838 operands[1] = replace_equiv_address (operands[1], addr);
1842 [(set (match_operand:DI 0 "register_operand" "")
1843 (mem:DI (match_operand 1 "address_operand" "")))]
1845 && !FP_REG_P (operands[0])
1846 && GET_CODE (operands[1]) == SYMBOL_REF
1847 && CONSTANT_POOL_ADDRESS_P (operands[1])
1848 && get_pool_mode (operands[1]) == DImode
1849 && legitimate_reload_constant_p (get_pool_constant (operands[1]))"
1850 [(set (match_dup 0) (match_dup 2))]
1851 "operands[2] = get_pool_constant (operands[1]);")
1853 (define_insn "*la_64"
1854 [(set (match_operand:DI 0 "register_operand" "=d,d")
1855 (match_operand:QI 1 "address_operand" "ZR,ZT"))]
1860 [(set_attr "op_type" "RX,RXY")
1861 (set_attr "type" "la")
1862 (set_attr "cpu_facility" "*,longdisp")
1863 (set_attr "z10prop" "z10_fwd_A1,z10_fwd_A1")])
1867 [(set (match_operand:DI 0 "register_operand" "")
1868 (match_operand:QI 1 "address_operand" ""))
1869 (clobber (reg:CC CC_REGNUM))])]
1871 && preferred_la_operand_p (operands[1], const0_rtx)"
1872 [(set (match_dup 0) (match_dup 1))]
1876 [(set (match_operand:DI 0 "register_operand" "")
1877 (match_operand:DI 1 "register_operand" ""))
1880 (plus:DI (match_dup 0)
1881 (match_operand:DI 2 "nonmemory_operand" "")))
1882 (clobber (reg:CC CC_REGNUM))])]
1884 && !reg_overlap_mentioned_p (operands[0], operands[2])
1885 && preferred_la_operand_p (operands[1], operands[2])"
1886 [(set (match_dup 0) (plus:DI (match_dup 1) (match_dup 2)))]
1890 ; movsi instruction pattern(s).
1893 (define_expand "movsi"
1894 [(set (match_operand:SI 0 "general_operand" "")
1895 (match_operand:SI 1 "general_operand" ""))]
1898 /* Handle symbolic constants. */
1900 && (SYMBOLIC_CONST (operands[1])
1901 || (GET_CODE (operands[1]) == PLUS
1902 && XEXP (operands[1], 0) == pic_offset_table_rtx
1903 && SYMBOLIC_CONST (XEXP(operands[1], 1)))))
1904 emit_symbolic_move (operands);
1907 (define_insn "*movsi_larl"
1908 [(set (match_operand:SI 0 "register_operand" "=d")
1909 (match_operand:SI 1 "larl_operand" "X"))]
1910 "!TARGET_64BIT && TARGET_CPU_ZARCH
1911 && !FP_REG_P (operands[0])"
1913 [(set_attr "op_type" "RIL")
1914 (set_attr "type" "larl")
1915 (set_attr "z10prop" "z10_fwd_A1")])
1917 (define_insn "*movsi_zarch"
1918 [(set (match_operand:SI 0 "nonimmediate_operand"
1919 "=d, d, d, d,d,d,d,d,d,R,T,!*f,!*f,!*f,!*f,!*f,!R,!T,d,t,Q,b,Q,t,v,v,v,d,v,R")
1920 (match_operand:SI 1 "general_operand"
1921 " K,N0HS0,N1HS0,Os,L,b,d,R,T,d,d, *f, *f, R, R, T,*f,*f,t,d,t,d,K,Q,K,v,d,v,R,v"))]
1954 [(set_attr "op_type" "RI,RI,RI,RIL,RXY,RIL,RR,RX,RXY,RX,RXY,
1955 RR,RR,RXE,RX,RXY,RX,RXY,RRE,RRE,RS,RIL,SIL,RS,VRI,VRR,VRS,VRS,VRX,VRX")
1956 (set_attr "type" "*,
1980 (set_attr "cpu_facility" "*,*,*,extimm,longdisp,z10,*,*,longdisp,*,longdisp,
1981 vec,*,vec,*,longdisp,*,longdisp,*,*,*,z10,z10,*,vec,vec,vec,vec,vec,vec")
1982 (set_attr "z10prop" "z10_fwd_A1,
2007 (define_insn "*movsi_esa"
2008 [(set (match_operand:SI 0 "nonimmediate_operand" "=d,d,d,R,!*f,!*f,!*f,!*f,!R,d,t,Q,t")
2009 (match_operand:SI 1 "general_operand" "K,d,R,d, *f, *f, R, R,*f,t,d,t,Q"))]
2025 [(set_attr "op_type" "RI,RR,RX,RX,RR,RR,RXE,RX,RX,RRE,RRE,RS,RS")
2026 (set_attr "type" "*,lr,load,store,floadsf,floadsf,floadsf,floadsf,fstoresf,*,*,*,*")
2027 (set_attr "z10prop" "z10_fwd_A1,z10_fr_E1,z10_fwd_A3,z10_rec,*,*,*,*,*,z10_super_E1,
2029 (set_attr "cpu_facility" "*,*,*,*,vec,*,vec,*,*,*,*,*,*")
2033 [(set (match_operand:SI 0 "register_operand" "")
2034 (mem:SI (match_operand 1 "address_operand" "")))]
2035 "!FP_REG_P (operands[0])
2036 && GET_CODE (operands[1]) == SYMBOL_REF
2037 && CONSTANT_POOL_ADDRESS_P (operands[1])
2038 && get_pool_mode (operands[1]) == SImode
2039 && legitimate_reload_constant_p (get_pool_constant (operands[1]))"
2040 [(set (match_dup 0) (match_dup 2))]
2041 "operands[2] = get_pool_constant (operands[1]);")
2043 (define_insn "*la_31"
2044 [(set (match_operand:SI 0 "register_operand" "=d,d")
2045 (match_operand:QI 1 "address_operand" "ZR,ZT"))]
2046 "!TARGET_64BIT && legitimate_la_operand_p (operands[1])"
2050 [(set_attr "op_type" "RX,RXY")
2051 (set_attr "type" "la")
2052 (set_attr "cpu_facility" "*,longdisp")
2053 (set_attr "z10prop" "z10_fwd_A1,z10_fwd_A1")])
2057 [(set (match_operand:SI 0 "register_operand" "")
2058 (match_operand:QI 1 "address_operand" ""))
2059 (clobber (reg:CC CC_REGNUM))])]
2061 && preferred_la_operand_p (operands[1], const0_rtx)"
2062 [(set (match_dup 0) (match_dup 1))]
2066 [(set (match_operand:SI 0 "register_operand" "")
2067 (match_operand:SI 1 "register_operand" ""))
2070 (plus:SI (match_dup 0)
2071 (match_operand:SI 2 "nonmemory_operand" "")))
2072 (clobber (reg:CC CC_REGNUM))])]
2074 && !reg_overlap_mentioned_p (operands[0], operands[2])
2075 && preferred_la_operand_p (operands[1], operands[2])"
2076 [(set (match_dup 0) (plus:SI (match_dup 1) (match_dup 2)))]
2079 (define_insn "*la_31_and"
2080 [(set (match_operand:SI 0 "register_operand" "=d,d")
2081 (and:SI (match_operand:QI 1 "address_operand" "ZR,ZT")
2082 (const_int 2147483647)))]
2087 [(set_attr "op_type" "RX,RXY")
2088 (set_attr "type" "la")
2089 (set_attr "cpu_facility" "*,longdisp")
2090 (set_attr "z10prop" "z10_fwd_A1,z10_fwd_A1")])
2092 (define_insn_and_split "*la_31_and_cc"
2093 [(set (match_operand:SI 0 "register_operand" "=d")
2094 (and:SI (match_operand:QI 1 "address_operand" "p")
2095 (const_int 2147483647)))
2096 (clobber (reg:CC CC_REGNUM))]
2099 "&& reload_completed"
2101 (and:SI (match_dup 1) (const_int 2147483647)))]
2103 [(set_attr "op_type" "RX")
2104 (set_attr "type" "la")])
2106 (define_insn "force_la_31"
2107 [(set (match_operand:SI 0 "register_operand" "=d,d")
2108 (match_operand:QI 1 "address_operand" "ZR,ZT"))
2109 (use (const_int 0))]
2114 [(set_attr "op_type" "RX")
2115 (set_attr "type" "la")
2116 (set_attr "cpu_facility" "*,longdisp")
2117 (set_attr "z10prop" "z10_fwd_A1,z10_fwd_A1")])
2120 ; movhi instruction pattern(s).
2123 (define_expand "movhi"
2124 [(set (match_operand:HI 0 "nonimmediate_operand" "")
2125 (match_operand:HI 1 "general_operand" ""))]
2128 /* Make it explicit that loading a register from memory
2129 always sign-extends (at least) to SImode. */
2130 if (optimize && can_create_pseudo_p ()
2131 && register_operand (operands[0], VOIDmode)
2132 && GET_CODE (operands[1]) == MEM)
2134 rtx tmp = gen_reg_rtx (SImode);
2135 rtx ext = gen_rtx_SIGN_EXTEND (SImode, operands[1]);
2136 emit_insn (gen_rtx_SET (tmp, ext));
2137 operands[1] = gen_lowpart (HImode, tmp);
2141 (define_insn "*movhi"
2142 [(set (match_operand:HI 0 "nonimmediate_operand" "=d,d,d,d,d,R,T,b,Q,v,v,v,d,v,R")
2143 (match_operand:HI 1 "general_operand" " d,n,R,T,b,d,d,d,K,K,v,d,v,R,v"))]
2161 [(set_attr "op_type" "RR,RI,RX,RXY,RIL,RX,RXY,RIL,SIL,VRI,VRR,VRS,VRS,VRX,VRX")
2162 (set_attr "type" "lr,*,*,*,larl,store,store,store,*,*,*,*,*,*,*")
2163 (set_attr "cpu_facility" "*,*,*,longdisp,z10,*,longdisp,z10,z10,vec,vec,vec,vec,vec,vec")
2164 (set_attr "z10prop" "z10_fr_E1,
2172 z10_super,*,*,*,*,*,*")])
2175 [(set (match_operand:HI 0 "register_operand" "")
2176 (mem:HI (match_operand 1 "address_operand" "")))]
2177 "GET_CODE (operands[1]) == SYMBOL_REF
2178 && CONSTANT_POOL_ADDRESS_P (operands[1])
2179 && get_pool_mode (operands[1]) == HImode
2180 && GET_CODE (get_pool_constant (operands[1])) == CONST_INT"
2181 [(set (match_dup 0) (match_dup 2))]
2182 "operands[2] = get_pool_constant (operands[1]);")
2185 ; movqi instruction pattern(s).
2188 (define_expand "movqi"
2189 [(set (match_operand:QI 0 "nonimmediate_operand" "")
2190 (match_operand:QI 1 "general_operand" ""))]
2193 /* On z/Architecture, zero-extending from memory to register
2194 is just as fast as a QImode load. */
2195 if (TARGET_ZARCH && optimize && can_create_pseudo_p ()
2196 && register_operand (operands[0], VOIDmode)
2197 && GET_CODE (operands[1]) == MEM)
2199 rtx tmp = gen_reg_rtx (DImode);
2200 rtx ext = gen_rtx_ZERO_EXTEND (DImode, operands[1]);
2201 emit_insn (gen_rtx_SET (tmp, ext));
2202 operands[1] = gen_lowpart (QImode, tmp);
2206 (define_insn "*movqi"
2207 [(set (match_operand:QI 0 "nonimmediate_operand" "=d,d,d,d,R,T,Q,S,?Q,v,v,v,d,v,R")
2208 (match_operand:QI 1 "general_operand" " d,n,R,T,d,d,n,n,?Q,K,v,d,v,R,v"))]
2226 [(set_attr "op_type" "RR,RI,RX,RXY,RX,RXY,SI,SIY,SS,VRI,VRR,VRS,VRS,VRX,VRX")
2227 (set_attr "type" "lr,*,*,*,store,store,store,store,*,*,*,*,*,*,*")
2228 (set_attr "cpu_facility" "*,*,*,longdisp,*,longdisp,*,longdisp,*,vec,vec,vec,vec,vec,vec")
2229 (set_attr "z10prop" "z10_fr_E1,
2240 [(set (match_operand:QI 0 "nonimmediate_operand" "")
2241 (mem:QI (match_operand 1 "address_operand" "")))]
2242 "GET_CODE (operands[1]) == SYMBOL_REF
2243 && CONSTANT_POOL_ADDRESS_P (operands[1])
2244 && get_pool_mode (operands[1]) == QImode
2245 && GET_CODE (get_pool_constant (operands[1])) == CONST_INT"
2246 [(set (match_dup 0) (match_dup 2))]
2247 "operands[2] = get_pool_constant (operands[1]);")
2250 ; movstrictqi instruction pattern(s).
2253 (define_insn "*movstrictqi"
2254 [(set (strict_low_part (match_operand:QI 0 "register_operand" "+d,d"))
2255 (match_operand:QI 1 "memory_operand" "R,T"))]
2260 [(set_attr "op_type" "RX,RXY")
2261 (set_attr "cpu_facility" "*,longdisp")
2262 (set_attr "z10prop" "z10_super_E1,z10_super_E1")])
2265 ; movstricthi instruction pattern(s).
2268 (define_insn "*movstricthi"
2269 [(set (strict_low_part (match_operand:HI 0 "register_operand" "+d,d"))
2270 (match_operand:HI 1 "memory_operand" "Q,S"))
2271 (clobber (reg:CC CC_REGNUM))]
2276 [(set_attr "op_type" "RS,RSY")
2277 (set_attr "cpu_facility" "*,longdisp")
2278 (set_attr "z10prop" "z10_super_E1,z10_super_E1")])
2281 ; movstrictsi instruction pattern(s).
2284 (define_insn "movstrictsi"
2285 [(set (strict_low_part (match_operand:SI 0 "register_operand" "+d,d,d,d"))
2286 (match_operand:SI 1 "general_operand" "d,R,T,t"))]
2293 [(set_attr "op_type" "RR,RX,RXY,RRE")
2294 (set_attr "type" "lr,load,load,*")
2295 (set_attr "cpu_facility" "*,*,longdisp,*")
2296 (set_attr "z10prop" "z10_fr_E1,z10_fwd_A3,z10_fwd_A3,z10_super_E1")])
2299 ; mov(tf|td) instruction pattern(s).
2302 (define_expand "mov<mode>"
2303 [(set (match_operand:TD_TF 0 "nonimmediate_operand" "")
2304 (match_operand:TD_TF 1 "general_operand" ""))]
2308 (define_insn "*mov<mode>_64"
2309 [(set (match_operand:TD_TF 0 "nonimmediate_operand" "=f,f,f,o,d,S, d,o")
2310 (match_operand:TD_TF 1 "general_operand" " G,f,o,f,S,d,dT,d"))]
2321 [(set_attr "op_type" "RRE,RRE,*,*,RSY,RSY,*,*")
2322 (set_attr "type" "fsimptf,fsimptf,*,*,lm,stm,*,*")
2323 (set_attr "cpu_facility" "z196,*,*,*,*,*,*,*")])
2325 (define_insn "*mov<mode>_31"
2326 [(set (match_operand:TD_TF 0 "nonimmediate_operand" "=f,f,f,o")
2327 (match_operand:TD_TF 1 "general_operand" " G,f,o,f"))]
2334 [(set_attr "op_type" "RRE,RRE,*,*")
2335 (set_attr "type" "fsimptf,fsimptf,*,*")
2336 (set_attr "cpu_facility" "z196,*,*,*")])
2338 ; TFmode in GPRs splitters
2341 [(set (match_operand:TD_TF 0 "nonimmediate_operand" "")
2342 (match_operand:TD_TF 1 "general_operand" ""))]
2343 "TARGET_ZARCH && reload_completed
2344 && s390_split_ok_p (operands[0], operands[1], <MODE>mode, 0)"
2345 [(set (match_dup 2) (match_dup 4))
2346 (set (match_dup 3) (match_dup 5))]
2348 operands[2] = operand_subword (operands[0], 0, 0, <MODE>mode);
2349 operands[3] = operand_subword (operands[0], 1, 0, <MODE>mode);
2350 operands[4] = operand_subword (operands[1], 0, 0, <MODE>mode);
2351 operands[5] = operand_subword (operands[1], 1, 0, <MODE>mode);
2355 [(set (match_operand:TD_TF 0 "nonimmediate_operand" "")
2356 (match_operand:TD_TF 1 "general_operand" ""))]
2357 "TARGET_ZARCH && reload_completed
2358 && s390_split_ok_p (operands[0], operands[1], <MODE>mode, 1)"
2359 [(set (match_dup 2) (match_dup 4))
2360 (set (match_dup 3) (match_dup 5))]
2362 operands[2] = operand_subword (operands[0], 1, 0, <MODE>mode);
2363 operands[3] = operand_subword (operands[0], 0, 0, <MODE>mode);
2364 operands[4] = operand_subword (operands[1], 1, 0, <MODE>mode);
2365 operands[5] = operand_subword (operands[1], 0, 0, <MODE>mode);
2369 [(set (match_operand:TD_TF 0 "register_operand" "")
2370 (match_operand:TD_TF 1 "memory_operand" ""))]
2371 "TARGET_ZARCH && reload_completed
2372 && GENERAL_REG_P (operands[0])
2373 && !s_operand (operands[1], VOIDmode)"
2374 [(set (match_dup 0) (match_dup 1))]
2376 rtx addr = operand_subword (operands[0], 1, 0, <MODE>mode);
2377 addr = gen_lowpart (Pmode, addr);
2378 s390_load_address (addr, XEXP (operands[1], 0));
2379 operands[1] = replace_equiv_address (operands[1], addr);
2382 ; TFmode in BFPs splitters
2385 [(set (match_operand:TD_TF 0 "register_operand" "")
2386 (match_operand:TD_TF 1 "memory_operand" ""))]
2387 "reload_completed && offsettable_memref_p (operands[1])
2388 && FP_REG_P (operands[0])"
2389 [(set (match_dup 2) (match_dup 4))
2390 (set (match_dup 3) (match_dup 5))]
2392 operands[2] = simplify_gen_subreg (<HALF_TMODE>mode, operands[0],
2394 operands[3] = simplify_gen_subreg (<HALF_TMODE>mode, operands[0],
2396 operands[4] = adjust_address_nv (operands[1], <HALF_TMODE>mode, 0);
2397 operands[5] = adjust_address_nv (operands[1], <HALF_TMODE>mode, 8);
2401 [(set (match_operand:TD_TF 0 "memory_operand" "")
2402 (match_operand:TD_TF 1 "register_operand" ""))]
2403 "reload_completed && offsettable_memref_p (operands[0])
2404 && FP_REG_P (operands[1])"
2405 [(set (match_dup 2) (match_dup 4))
2406 (set (match_dup 3) (match_dup 5))]
2408 operands[2] = adjust_address_nv (operands[0], <HALF_TMODE>mode, 0);
2409 operands[3] = adjust_address_nv (operands[0], <HALF_TMODE>mode, 8);
2410 operands[4] = simplify_gen_subreg (<HALF_TMODE>mode, operands[1],
2412 operands[5] = simplify_gen_subreg (<HALF_TMODE>mode, operands[1],
2417 ; mov(df|dd) instruction pattern(s).
2420 (define_expand "mov<mode>"
2421 [(set (match_operand:DD_DF 0 "nonimmediate_operand" "")
2422 (match_operand:DD_DF 1 "general_operand" ""))]
2426 (define_insn "*mov<mode>_64dfp"
2427 [(set (match_operand:DD_DF 0 "nonimmediate_operand"
2428 "=f,f,f,d,f,f,R,T,d,d,d,d,b,T,v,v,d,v,R")
2429 (match_operand:DD_DF 1 "general_operand"
2430 " G,f,d,f,R,T,f,f,G,d,b,T,d,d,v,d,v,R,v"))]
2452 [(set_attr "op_type" "RRE,RR,RRE,RRE,RX,RXY,RX,RXY,RI,RRE,RIL,RXY,RIL,RXY,VRR,VRS,VRS,VRX,VRX")
2453 (set_attr "type" "fsimpdf,floaddf,floaddf,floaddf,floaddf,floaddf,
2454 fstoredf,fstoredf,*,lr,load,load,store,store,*,*,*,load,store")
2455 (set_attr "z10prop" "*,*,*,*,*,*,*,*,z10_fwd_A1,z10_fr_E1,z10_fwd_A3,z10_fwd_A3,z10_rec,z10_rec,*,*,*,*,*")
2456 (set_attr "cpu_facility" "z196,*,*,*,*,longdisp,*,longdisp,*,*,z10,*,z10,*,vec,vec,vec,vec,vec")])
2458 (define_insn "*mov<mode>_64"
2459 [(set (match_operand:DD_DF 0 "nonimmediate_operand" "=f,f,f,f,R,T,d,d,d,d,b,T,v,v,R")
2460 (match_operand:DD_DF 1 "general_operand" " G,f,R,T,f,f,G,d,b,T,d,d,v,R,v"))]
2478 [(set_attr "op_type" "RRE,RR,RX,RXY,RX,RXY,RI,RRE,RIL,RXY,RIL,RXY,VRR,VRX,VRX")
2479 (set_attr "type" "fsimpdf,fload<mode>,fload<mode>,fload<mode>,
2480 fstore<mode>,fstore<mode>,*,lr,load,load,store,store,*,load,store")
2481 (set_attr "z10prop" "*,*,*,*,*,*,z10_fwd_A1,z10_fr_E1,z10_fwd_A3,z10_fwd_A3,z10_rec,z10_rec,*,*,*")
2482 (set_attr "cpu_facility" "z196,*,*,longdisp,*,longdisp,*,*,z10,*,z10,*,vec,vec,vec")])
2484 (define_insn "*mov<mode>_31"
2485 [(set (match_operand:DD_DF 0 "nonimmediate_operand"
2486 "=f,f,f,f,R,T,d,d,Q,S, d,o")
2487 (match_operand:DD_DF 1 "general_operand"
2488 " G,f,R,T,f,f,Q,S,d,d,dPT,d"))]
2503 [(set_attr "op_type" "RRE,RR,RX,RXY,RX,RXY,RS,RSY,RS,RSY,*,*")
2504 (set_attr "type" "fsimpdf,fload<mode>,fload<mode>,fload<mode>,
2505 fstore<mode>,fstore<mode>,lm,lm,stm,stm,*,*")
2506 (set_attr "cpu_facility" "z196,*,*,longdisp,*,longdisp,*,longdisp,*,longdisp,*,*")])
2509 [(set (match_operand:DD_DF 0 "nonimmediate_operand" "")
2510 (match_operand:DD_DF 1 "general_operand" ""))]
2511 "!TARGET_ZARCH && reload_completed
2512 && s390_split_ok_p (operands[0], operands[1], <MODE>mode, 0)"
2513 [(set (match_dup 2) (match_dup 4))
2514 (set (match_dup 3) (match_dup 5))]
2516 operands[2] = operand_subword (operands[0], 0, 0, <MODE>mode);
2517 operands[3] = operand_subword (operands[0], 1, 0, <MODE>mode);
2518 operands[4] = operand_subword (operands[1], 0, 0, <MODE>mode);
2519 operands[5] = operand_subword (operands[1], 1, 0, <MODE>mode);
2523 [(set (match_operand:DD_DF 0 "nonimmediate_operand" "")
2524 (match_operand:DD_DF 1 "general_operand" ""))]
2525 "!TARGET_ZARCH && reload_completed
2526 && s390_split_ok_p (operands[0], operands[1], <MODE>mode, 1)"
2527 [(set (match_dup 2) (match_dup 4))
2528 (set (match_dup 3) (match_dup 5))]
2530 operands[2] = operand_subword (operands[0], 1, 0, <MODE>mode);
2531 operands[3] = operand_subword (operands[0], 0, 0, <MODE>mode);
2532 operands[4] = operand_subword (operands[1], 1, 0, <MODE>mode);
2533 operands[5] = operand_subword (operands[1], 0, 0, <MODE>mode);
2537 [(set (match_operand:DD_DF 0 "register_operand" "")
2538 (match_operand:DD_DF 1 "memory_operand" ""))]
2539 "!TARGET_ZARCH && reload_completed
2540 && !FP_REG_P (operands[0])
2541 && !s_operand (operands[1], VOIDmode)"
2542 [(set (match_dup 0) (match_dup 1))]
2544 rtx addr = operand_subword (operands[0], 1, 0, <MODE>mode);
2545 s390_load_address (addr, XEXP (operands[1], 0));
2546 operands[1] = replace_equiv_address (operands[1], addr);
2550 ; mov(sf|sd) instruction pattern(s).
2553 (define_insn "mov<mode>"
2554 [(set (match_operand:SD_SF 0 "nonimmediate_operand"
2555 "=f,f,f,f,f,f,R,T,d,d,d,d,d,b,R,T,v,v,v,d,v,R")
2556 (match_operand:SD_SF 1 "general_operand"
2557 " G,f,f,R,R,T,f,f,G,d,b,R,T,d,d,d,v,G,d,v,R,v"))]
2582 [(set_attr "op_type" "RRE,RR,RR,RXE,RX,RXY,RX,RXY,RI,RR,RIL,RX,RXY,RIL,RX,RXY,VRR,VRI,VRS,VRS,VRX,VRX")
2583 (set_attr "type" "fsimpsf,fsimpsf,fload<mode>,fload<mode>,fload<mode>,fload<mode>,
2584 fstore<mode>,fstore<mode>,*,lr,load,load,load,store,store,store,*,*,*,*,load,store")
2585 (set_attr "z10prop" "*,*,*,*,*,*,*,*,z10_fwd_A1,z10_fr_E1,z10_fr_E1,z10_fwd_A3,z10_fwd_A3,z10_rec,z10_rec,z10_rec,*,*,*,*,*,*")
2586 (set_attr "cpu_facility" "z196,vec,*,vec,*,longdisp,*,longdisp,*,*,z10,*,longdisp,z10,*,longdisp,vec,vec,vec,vec,vec,vec")])
2589 ; movcc instruction pattern
2592 (define_insn "movcc"
2593 [(set (match_operand:CC 0 "nonimmediate_operand" "=d,c,d,d,d,R,T")
2594 (match_operand:CC 1 "nonimmediate_operand" " d,d,c,R,T,d,d"))]
2604 [(set_attr "op_type" "RR,RI,RRE,RX,RXY,RX,RXY")
2605 (set_attr "type" "lr,*,*,load,load,store,store")
2606 (set_attr "cpu_facility" "*,*,*,*,longdisp,*,longdisp")
2607 (set_attr "z10prop" "z10_fr_E1,z10_super,*,z10_fwd_A3,z10_fwd_A3,z10_rec,z10_rec")
2608 (set_attr "z196prop" "*,*,z196_ends,*,*,*,*")])
2611 ; Block move (MVC) patterns.
2615 [(set (match_operand:BLK 0 "memory_operand" "=Q")
2616 (match_operand:BLK 1 "memory_operand" "Q"))
2617 (use (match_operand 2 "const_int_operand" "n"))]
2618 "INTVAL (operands[2]) >= 1 && INTVAL (operands[2]) <= 256"
2619 "mvc\t%O0(%2,%R0),%S1"
2620 [(set_attr "op_type" "SS")])
2622 ; This splitter converts a QI to QI mode copy into a BLK mode copy in
2623 ; order to have it implemented with mvc.
2626 [(set (match_operand:QI 0 "memory_operand" "")
2627 (match_operand:QI 1 "memory_operand" ""))]
2630 [(set (match_dup 0) (match_dup 1))
2631 (use (const_int 1))])]
2633 operands[0] = adjust_address (operands[0], BLKmode, 0);
2634 operands[1] = adjust_address (operands[1], BLKmode, 0);
2640 [(set (match_operand:BLK 0 "memory_operand" "")
2641 (match_operand:BLK 1 "memory_operand" ""))
2642 (use (match_operand 2 "const_int_operand" ""))])
2644 [(set (match_operand:BLK 3 "memory_operand" "")
2645 (match_operand:BLK 4 "memory_operand" ""))
2646 (use (match_operand 5 "const_int_operand" ""))])]
2647 "s390_offset_p (operands[0], operands[3], operands[2])
2648 && s390_offset_p (operands[1], operands[4], operands[2])
2649 && !s390_overlap_p (operands[0], operands[1],
2650 INTVAL (operands[2]) + INTVAL (operands[5]))
2651 && INTVAL (operands[2]) + INTVAL (operands[5]) <= 256"
2653 [(set (match_dup 6) (match_dup 7))
2654 (use (match_dup 8))])]
2655 "operands[6] = gen_rtx_MEM (BLKmode, XEXP (operands[0], 0));
2656 operands[7] = gen_rtx_MEM (BLKmode, XEXP (operands[1], 0));
2657 operands[8] = GEN_INT (INTVAL (operands[2]) + INTVAL (operands[5]));")
2661 ; load_multiple pattern(s).
2663 ; ??? Due to reload problems with replacing registers inside match_parallel
2664 ; we currently support load_multiple/store_multiple only after reload.
2667 (define_expand "load_multiple"
2668 [(match_par_dup 3 [(set (match_operand 0 "" "")
2669 (match_operand 1 "" ""))
2670 (use (match_operand 2 "" ""))])]
2679 /* Support only loading a constant number of fixed-point registers from
2680 memory and only bother with this if more than two */
2681 if (GET_CODE (operands[2]) != CONST_INT
2682 || INTVAL (operands[2]) < 2
2683 || INTVAL (operands[2]) > 16
2684 || GET_CODE (operands[1]) != MEM
2685 || GET_CODE (operands[0]) != REG
2686 || REGNO (operands[0]) >= 16)
2689 count = INTVAL (operands[2]);
2690 regno = REGNO (operands[0]);
2691 mode = GET_MODE (operands[0]);
2692 if (mode != SImode && (!TARGET_ZARCH || mode != DImode))
2695 operands[3] = gen_rtx_PARALLEL (VOIDmode, rtvec_alloc (count));
2696 if (!can_create_pseudo_p ())
2698 if (GET_CODE (XEXP (operands[1], 0)) == REG)
2700 from = XEXP (operands[1], 0);
2703 else if (GET_CODE (XEXP (operands[1], 0)) == PLUS
2704 && GET_CODE (XEXP (XEXP (operands[1], 0), 0)) == REG
2705 && GET_CODE (XEXP (XEXP (operands[1], 0), 1)) == CONST_INT)
2707 from = XEXP (XEXP (operands[1], 0), 0);
2708 off = INTVAL (XEXP (XEXP (operands[1], 0), 1));
2715 from = force_reg (Pmode, XEXP (operands[1], 0));
2719 for (i = 0; i < count; i++)
2720 XVECEXP (operands[3], 0, i)
2721 = gen_rtx_SET (gen_rtx_REG (mode, regno + i),
2722 change_address (operands[1], mode,
2723 plus_constant (Pmode, from,
2724 off + i * GET_MODE_SIZE (mode))));
2727 (define_insn "*load_multiple_di"
2728 [(match_parallel 0 "load_multiple_operation"
2729 [(set (match_operand:DI 1 "register_operand" "=r")
2730 (match_operand:DI 2 "s_operand" "S"))])]
2731 "reload_completed && TARGET_ZARCH"
2733 int words = XVECLEN (operands[0], 0);
2734 operands[0] = gen_rtx_REG (DImode, REGNO (operands[1]) + words - 1);
2735 return "lmg\t%1,%0,%S2";
2737 [(set_attr "op_type" "RSY")
2738 (set_attr "type" "lm")])
2740 (define_insn "*load_multiple_si"
2741 [(match_parallel 0 "load_multiple_operation"
2742 [(set (match_operand:SI 1 "register_operand" "=r,r")
2743 (match_operand:SI 2 "s_operand" "Q,S"))])]
2746 int words = XVECLEN (operands[0], 0);
2747 operands[0] = gen_rtx_REG (SImode, REGNO (operands[1]) + words - 1);
2748 return which_alternative == 0 ? "lm\t%1,%0,%S2" : "lmy\t%1,%0,%S2";
2750 [(set_attr "op_type" "RS,RSY")
2751 (set_attr "cpu_facility" "*,longdisp")
2752 (set_attr "type" "lm")])
2755 ; store multiple pattern(s).
2758 (define_expand "store_multiple"
2759 [(match_par_dup 3 [(set (match_operand 0 "" "")
2760 (match_operand 1 "" ""))
2761 (use (match_operand 2 "" ""))])]
2770 /* Support only storing a constant number of fixed-point registers to
2771 memory and only bother with this if more than two. */
2772 if (GET_CODE (operands[2]) != CONST_INT
2773 || INTVAL (operands[2]) < 2
2774 || INTVAL (operands[2]) > 16
2775 || GET_CODE (operands[0]) != MEM
2776 || GET_CODE (operands[1]) != REG
2777 || REGNO (operands[1]) >= 16)
2780 count = INTVAL (operands[2]);
2781 regno = REGNO (operands[1]);
2782 mode = GET_MODE (operands[1]);
2783 if (mode != SImode && (!TARGET_ZARCH || mode != DImode))
2786 operands[3] = gen_rtx_PARALLEL (VOIDmode, rtvec_alloc (count));
2788 if (!can_create_pseudo_p ())
2790 if (GET_CODE (XEXP (operands[0], 0)) == REG)
2792 to = XEXP (operands[0], 0);
2795 else if (GET_CODE (XEXP (operands[0], 0)) == PLUS
2796 && GET_CODE (XEXP (XEXP (operands[0], 0), 0)) == REG
2797 && GET_CODE (XEXP (XEXP (operands[0], 0), 1)) == CONST_INT)
2799 to = XEXP (XEXP (operands[0], 0), 0);
2800 off = INTVAL (XEXP (XEXP (operands[0], 0), 1));
2807 to = force_reg (Pmode, XEXP (operands[0], 0));
2811 for (i = 0; i < count; i++)
2812 XVECEXP (operands[3], 0, i)
2813 = gen_rtx_SET (change_address (operands[0], mode,
2814 plus_constant (Pmode, to,
2815 off + i * GET_MODE_SIZE (mode))),
2816 gen_rtx_REG (mode, regno + i));
2819 (define_insn "*store_multiple_di"
2820 [(match_parallel 0 "store_multiple_operation"
2821 [(set (match_operand:DI 1 "s_operand" "=S")
2822 (match_operand:DI 2 "register_operand" "r"))])]
2823 "reload_completed && TARGET_ZARCH"
2825 int words = XVECLEN (operands[0], 0);
2826 operands[0] = gen_rtx_REG (DImode, REGNO (operands[2]) + words - 1);
2827 return "stmg\t%2,%0,%S1";
2829 [(set_attr "op_type" "RSY")
2830 (set_attr "type" "stm")])
2833 (define_insn "*store_multiple_si"
2834 [(match_parallel 0 "store_multiple_operation"
2835 [(set (match_operand:SI 1 "s_operand" "=Q,S")
2836 (match_operand:SI 2 "register_operand" "r,r"))])]
2839 int words = XVECLEN (operands[0], 0);
2840 operands[0] = gen_rtx_REG (SImode, REGNO (operands[2]) + words - 1);
2841 return which_alternative == 0 ? "stm\t%2,%0,%S1" : "stmy\t%2,%0,%S1";
2843 [(set_attr "op_type" "RS,RSY")
2844 (set_attr "cpu_facility" "*,longdisp")
2845 (set_attr "type" "stm")])
2848 ;; String instructions.
2851 (define_insn "*execute_rl"
2852 [(match_parallel 0 "execute_operation"
2853 [(unspec [(match_operand 1 "register_operand" "a")
2854 (match_operand 2 "" "")
2855 (match_operand:SI 3 "larl_operand" "X")] UNSPEC_EXECUTE)])]
2856 "TARGET_Z10 && GET_MODE_CLASS (GET_MODE (operands[1])) == MODE_INT
2857 && GET_MODE_SIZE (GET_MODE (operands[1])) <= UNITS_PER_WORD"
2859 [(set_attr "op_type" "RIL")
2860 (set_attr "type" "cs")])
2862 (define_insn "*execute"
2863 [(match_parallel 0 "execute_operation"
2864 [(unspec [(match_operand 1 "register_operand" "a")
2865 (match_operand:BLK 2 "memory_operand" "R")
2866 (match_operand 3 "" "")] UNSPEC_EXECUTE)])]
2867 "GET_MODE_CLASS (GET_MODE (operands[1])) == MODE_INT
2868 && GET_MODE_SIZE (GET_MODE (operands[1])) <= UNITS_PER_WORD"
2870 [(set_attr "op_type" "RX")
2871 (set_attr "type" "cs")])
2875 ; strlenM instruction pattern(s).
2878 (define_expand "strlen<mode>"
2879 [(match_operand:P 0 "register_operand" "") ; result
2880 (match_operand:BLK 1 "memory_operand" "") ; input string
2881 (match_operand:SI 2 "immediate_operand" "") ; search character
2882 (match_operand:SI 3 "immediate_operand" "")] ; known alignment
2885 if (!TARGET_VX || operands[2] != const0_rtx)
2886 emit_insn (gen_strlen_srst<mode> (operands[0], operands[1],
2887 operands[2], operands[3]));
2889 s390_expand_vec_strlen (operands[0], operands[1], operands[3]);
2894 (define_expand "strlen_srst<mode>"
2895 [(set (reg:SI 0) (match_operand:SI 2 "immediate_operand" ""))
2898 (unspec:P [(const_int 0)
2899 (match_operand:BLK 1 "memory_operand" "")
2901 (match_operand 3 "immediate_operand" "")] UNSPEC_SRST))
2902 (clobber (scratch:P))
2903 (clobber (reg:CC CC_REGNUM))])
2905 [(set (match_operand:P 0 "register_operand" "")
2906 (minus:P (match_dup 4) (match_dup 5)))
2907 (clobber (reg:CC CC_REGNUM))])]
2910 operands[4] = gen_reg_rtx (Pmode);
2911 operands[5] = gen_reg_rtx (Pmode);
2912 emit_move_insn (operands[5], force_operand (XEXP (operands[1], 0), NULL_RTX));
2913 operands[1] = replace_equiv_address (operands[1], operands[5]);
2916 (define_insn "*strlen<mode>"
2917 [(set (match_operand:P 0 "register_operand" "=a")
2918 (unspec:P [(match_operand:P 2 "general_operand" "0")
2919 (mem:BLK (match_operand:P 3 "register_operand" "1"))
2921 (match_operand 4 "immediate_operand" "")] UNSPEC_SRST))
2922 (clobber (match_scratch:P 1 "=a"))
2923 (clobber (reg:CC CC_REGNUM))]
2925 "srst\t%0,%1\;jo\t.-4"
2926 [(set_attr "length" "8")
2927 (set_attr "type" "vs")])
2930 ; cmpstrM instruction pattern(s).
2933 (define_expand "cmpstrsi"
2934 [(set (reg:SI 0) (const_int 0))
2936 [(clobber (match_operand 3 "" ""))
2937 (clobber (match_dup 4))
2938 (set (reg:CCU CC_REGNUM)
2939 (compare:CCU (match_operand:BLK 1 "memory_operand" "")
2940 (match_operand:BLK 2 "memory_operand" "")))
2943 [(set (match_operand:SI 0 "register_operand" "=d")
2944 (unspec:SI [(reg:CCU CC_REGNUM)] UNSPEC_STRCMPCC_TO_INT))
2945 (clobber (reg:CC CC_REGNUM))])]
2948 /* As the result of CMPINT is inverted compared to what we need,
2949 we have to swap the operands. */
2950 rtx op1 = operands[2];
2951 rtx op2 = operands[1];
2952 rtx addr1 = gen_reg_rtx (Pmode);
2953 rtx addr2 = gen_reg_rtx (Pmode);
2955 emit_move_insn (addr1, force_operand (XEXP (op1, 0), NULL_RTX));
2956 emit_move_insn (addr2, force_operand (XEXP (op2, 0), NULL_RTX));
2957 operands[1] = replace_equiv_address_nv (op1, addr1);
2958 operands[2] = replace_equiv_address_nv (op2, addr2);
2959 operands[3] = addr1;
2960 operands[4] = addr2;
2963 (define_insn "*cmpstr<mode>"
2964 [(clobber (match_operand:P 0 "register_operand" "=d"))
2965 (clobber (match_operand:P 1 "register_operand" "=d"))
2966 (set (reg:CCU CC_REGNUM)
2967 (compare:CCU (mem:BLK (match_operand:P 2 "register_operand" "0"))
2968 (mem:BLK (match_operand:P 3 "register_operand" "1"))))
2971 "clst\t%0,%1\;jo\t.-4"
2972 [(set_attr "length" "8")
2973 (set_attr "type" "vs")])
2976 ; movstr instruction pattern.
2979 (define_expand "movstr"
2980 [(match_operand 0 "register_operand" "")
2981 (match_operand 1 "memory_operand" "")
2982 (match_operand 2 "memory_operand" "")]
2986 emit_insn (gen_movstrdi (operands[0], operands[1], operands[2]));
2988 emit_insn (gen_movstrsi (operands[0], operands[1], operands[2]));
2992 (define_expand "movstr<P:mode>"
2993 [(set (reg:SI 0) (const_int 0))
2995 [(clobber (match_dup 3))
2996 (set (match_operand:BLK 1 "memory_operand" "")
2997 (match_operand:BLK 2 "memory_operand" ""))
2998 (set (match_operand:P 0 "register_operand" "")
2999 (unspec:P [(match_dup 1)
3001 (reg:SI 0)] UNSPEC_MVST))
3002 (clobber (reg:CC CC_REGNUM))])]
3007 if (TARGET_VX && optimize_function_for_speed_p (cfun))
3009 s390_expand_vec_movstr (operands[0], operands[1], operands[2]);
3013 addr1 = gen_reg_rtx (Pmode);
3014 addr2 = gen_reg_rtx (Pmode);
3016 emit_move_insn (addr1, force_operand (XEXP (operands[1], 0), NULL_RTX));
3017 emit_move_insn (addr2, force_operand (XEXP (operands[2], 0), NULL_RTX));
3018 operands[1] = replace_equiv_address_nv (operands[1], addr1);
3019 operands[2] = replace_equiv_address_nv (operands[2], addr2);
3020 operands[3] = addr2;
3023 (define_insn "*movstr"
3024 [(clobber (match_operand:P 2 "register_operand" "=d"))
3025 (set (mem:BLK (match_operand:P 1 "register_operand" "0"))
3026 (mem:BLK (match_operand:P 3 "register_operand" "2")))
3027 (set (match_operand:P 0 "register_operand" "=d")
3028 (unspec:P [(mem:BLK (match_dup 1))
3029 (mem:BLK (match_dup 3))
3030 (reg:SI 0)] UNSPEC_MVST))
3031 (clobber (reg:CC CC_REGNUM))]
3033 "mvst\t%1,%2\;jo\t.-4"
3034 [(set_attr "length" "8")
3035 (set_attr "type" "vs")])
3039 ; movmemM instruction pattern(s).
3042 (define_expand "movmem<mode>"
3043 [(set (match_operand:BLK 0 "memory_operand" "") ; destination
3044 (match_operand:BLK 1 "memory_operand" "")) ; source
3045 (use (match_operand:GPR 2 "general_operand" "")) ; count
3046 (match_operand 3 "" "")]
3049 if (s390_expand_movmem (operands[0], operands[1], operands[2]))
3055 ; Move a block that is up to 256 bytes in length.
3056 ; The block length is taken as (operands[2] % 256) + 1.
3058 (define_expand "movmem_short"
3060 [(set (match_operand:BLK 0 "memory_operand" "")
3061 (match_operand:BLK 1 "memory_operand" ""))
3062 (use (match_operand 2 "nonmemory_operand" ""))
3063 (use (const:BLK (unspec:BLK [(const_int 0)] UNSPEC_INSN)))
3064 (clobber (match_dup 3))])]
3066 "operands[3] = gen_rtx_SCRATCH (Pmode);")
3068 (define_insn "*movmem_short"
3069 [(set (match_operand:BLK 0 "memory_operand" "=Q,Q,Q,Q")
3070 (match_operand:BLK 1 "memory_operand" "Q,Q,Q,Q"))
3071 (use (match_operand 2 "nonmemory_operand" "n,a,a,a"))
3072 (use (match_operand 3 "immediate_operand" "X,R,X,X"))
3073 (clobber (match_scratch:P 4 "=X,X,X,&a"))]
3074 "(GET_MODE (operands[2]) == Pmode || GET_MODE (operands[2]) == VOIDmode)"
3076 [(set_attr "type" "cs")
3077 (set_attr "cpu_facility" "*,*,z10,cpu_zarch")])
3080 [(set (match_operand:BLK 0 "memory_operand" "")
3081 (match_operand:BLK 1 "memory_operand" ""))
3082 (use (match_operand 2 "const_int_operand" ""))
3083 (use (match_operand 3 "immediate_operand" ""))
3084 (clobber (scratch))]
3087 [(set (match_dup 0) (match_dup 1))
3088 (use (match_dup 2))])]
3089 "operands[2] = GEN_INT ((INTVAL (operands[2]) & 0xff) + 1);")
3092 [(set (match_operand:BLK 0 "memory_operand" "")
3093 (match_operand:BLK 1 "memory_operand" ""))
3094 (use (match_operand 2 "register_operand" ""))
3095 (use (match_operand 3 "memory_operand" ""))
3096 (clobber (scratch))]
3099 [(unspec [(match_dup 2) (match_dup 3)
3100 (const_int 0)] UNSPEC_EXECUTE)
3101 (set (match_dup 0) (match_dup 1))
3102 (use (const_int 1))])]
3106 [(set (match_operand:BLK 0 "memory_operand" "")
3107 (match_operand:BLK 1 "memory_operand" ""))
3108 (use (match_operand 2 "register_operand" ""))
3109 (use (const:BLK (unspec:BLK [(const_int 0)] UNSPEC_INSN)))
3110 (clobber (scratch))]
3111 "TARGET_Z10 && reload_completed"
3113 [(unspec [(match_dup 2) (const_int 0)
3114 (label_ref (match_dup 3))] UNSPEC_EXECUTE)
3115 (set (match_dup 0) (match_dup 1))
3116 (use (const_int 1))])]
3117 "operands[3] = gen_label_rtx ();")
3120 [(set (match_operand:BLK 0 "memory_operand" "")
3121 (match_operand:BLK 1 "memory_operand" ""))
3122 (use (match_operand 2 "register_operand" ""))
3123 (use (const:BLK (unspec:BLK [(const_int 0)] UNSPEC_INSN)))
3124 (clobber (match_operand 3 "register_operand" ""))]
3125 "reload_completed && TARGET_CPU_ZARCH"
3126 [(set (match_dup 3) (label_ref (match_dup 4)))
3128 [(unspec [(match_dup 2) (mem:BLK (match_dup 3))
3129 (label_ref (match_dup 4))] UNSPEC_EXECUTE)
3130 (set (match_dup 0) (match_dup 1))
3131 (use (const_int 1))])]
3132 "operands[4] = gen_label_rtx ();")
3134 ; Move a block of arbitrary length.
3136 (define_expand "movmem_long"
3138 [(clobber (match_dup 2))
3139 (clobber (match_dup 3))
3140 (set (match_operand:BLK 0 "memory_operand" "")
3141 (match_operand:BLK 1 "memory_operand" ""))
3142 (use (match_operand 2 "general_operand" ""))
3144 (clobber (reg:CC CC_REGNUM))])]
3147 machine_mode sreg_mode = TARGET_ZARCH ? DImode : SImode;
3148 machine_mode dreg_mode = TARGET_ZARCH ? TImode : DImode;
3149 rtx reg0 = gen_reg_rtx (dreg_mode);
3150 rtx reg1 = gen_reg_rtx (dreg_mode);
3151 rtx addr0 = gen_lowpart (Pmode, gen_highpart (sreg_mode, reg0));
3152 rtx addr1 = gen_lowpart (Pmode, gen_highpart (sreg_mode, reg1));
3153 rtx len0 = gen_lowpart (Pmode, reg0);
3154 rtx len1 = gen_lowpart (Pmode, reg1);
3156 emit_clobber (reg0);
3157 emit_move_insn (addr0, force_operand (XEXP (operands[0], 0), NULL_RTX));
3158 emit_move_insn (len0, operands[2]);
3160 emit_clobber (reg1);
3161 emit_move_insn (addr1, force_operand (XEXP (operands[1], 0), NULL_RTX));
3162 emit_move_insn (len1, operands[2]);
3164 operands[0] = replace_equiv_address_nv (operands[0], addr0);
3165 operands[1] = replace_equiv_address_nv (operands[1], addr1);
3170 (define_insn "*movmem_long"
3171 [(clobber (match_operand:<DBL> 0 "register_operand" "=d"))
3172 (clobber (match_operand:<DBL> 1 "register_operand" "=d"))
3173 (set (mem:BLK (subreg:P (match_operand:<DBL> 2 "register_operand" "0") 0))
3174 (mem:BLK (subreg:P (match_operand:<DBL> 3 "register_operand" "1") 0)))
3177 (clobber (reg:CC CC_REGNUM))]
3178 "TARGET_64BIT || !TARGET_ZARCH"
3179 "mvcle\t%0,%1,0\;jo\t.-4"
3180 [(set_attr "length" "8")
3181 (set_attr "type" "vs")])
3183 (define_insn "*movmem_long_31z"
3184 [(clobber (match_operand:TI 0 "register_operand" "=d"))
3185 (clobber (match_operand:TI 1 "register_operand" "=d"))
3186 (set (mem:BLK (subreg:SI (match_operand:TI 2 "register_operand" "0") 4))
3187 (mem:BLK (subreg:SI (match_operand:TI 3 "register_operand" "1") 4)))
3190 (clobber (reg:CC CC_REGNUM))]
3191 "!TARGET_64BIT && TARGET_ZARCH"
3192 "mvcle\t%0,%1,0\;jo\t.-4"
3193 [(set_attr "length" "8")
3194 (set_attr "type" "vs")])
3201 (define_expand "signbit<mode>2"
3202 [(set (reg:CCZ CC_REGNUM)
3203 (unspec:CCZ [(match_operand:FP_ALL 1 "register_operand" "f")
3206 (set (match_operand:SI 0 "register_operand" "=d")
3207 (unspec:SI [(reg:CCZ CC_REGNUM)] UNSPEC_CC_TO_INT))]
3210 operands[2] = GEN_INT (S390_TDC_SIGNBIT_SET);
3213 (define_expand "isinf<mode>2"
3214 [(set (reg:CCZ CC_REGNUM)
3215 (unspec:CCZ [(match_operand:FP_ALL 1 "register_operand" "f")
3218 (set (match_operand:SI 0 "register_operand" "=d")
3219 (unspec:SI [(reg:CCZ CC_REGNUM)] UNSPEC_CC_TO_INT))]
3222 operands[2] = GEN_INT (S390_TDC_INFINITY);
3225 ; This extracts CC into a GPR properly shifted. The actual IPM
3226 ; instruction will be issued by reload. The constraint of operand 1
3227 ; forces reload to use a GPR. So reload will issue a movcc insn for
3228 ; copying CC into a GPR first.
3229 (define_insn_and_split "*cc_to_int"
3230 [(set (match_operand:SI 0 "nonimmediate_operand" "=d")
3231 (unspec:SI [(match_operand 1 "register_operand" "0")]
3236 [(set (match_dup 0) (lshiftrt:SI (match_dup 0) (const_int 28)))])
3238 ; This insn is used to generate all variants of the Test Data Class
3239 ; instruction, namely tcxb, tcdb, and tceb. The insn's first operand
3240 ; is the register to be tested and the second one is the bit mask
3241 ; specifying the required test(s).
3243 ; tcxb, tcdb, tceb, tdcxt, tdcdt, tdcet
3244 (define_insn "*TDC_insn_<mode>"
3245 [(set (reg:CCZ CC_REGNUM)
3246 (unspec:CCZ [(match_operand:FP_ALL 0 "register_operand" "f")
3247 (match_operand:SI 1 "const_int_operand")] UNSPEC_TDC_INSN))]
3249 "t<_d>c<xde><bt>\t%0,%1"
3250 [(set_attr "op_type" "RXE")
3251 (set_attr "type" "fsimp<mode>")])
3256 ; setmemM instruction pattern(s).
3259 (define_expand "setmem<mode>"
3260 [(set (match_operand:BLK 0 "memory_operand" "")
3261 (match_operand:QI 2 "general_operand" ""))
3262 (use (match_operand:GPR 1 "general_operand" ""))
3263 (match_operand 3 "" "")]
3265 "s390_expand_setmem (operands[0], operands[1], operands[2]); DONE;")
3267 ; Clear a block that is up to 256 bytes in length.
3268 ; The block length is taken as (operands[1] % 256) + 1.
3270 (define_expand "clrmem_short"
3272 [(set (match_operand:BLK 0 "memory_operand" "")
3274 (use (match_operand 1 "nonmemory_operand" ""))
3275 (use (const:BLK (unspec:BLK [(const_int 0)] UNSPEC_INSN)))
3276 (clobber (match_dup 2))
3277 (clobber (reg:CC CC_REGNUM))])]
3279 "operands[2] = gen_rtx_SCRATCH (Pmode);")
3281 (define_insn "*clrmem_short"
3282 [(set (match_operand:BLK 0 "memory_operand" "=Q,Q,Q,Q")
3284 (use (match_operand 1 "nonmemory_operand" "n,a,a,a"))
3285 (use (match_operand 2 "immediate_operand" "X,R,X,X"))
3286 (clobber (match_scratch:P 3 "=X,X,X,&a"))
3287 (clobber (reg:CC CC_REGNUM))]
3288 "(GET_MODE (operands[1]) == Pmode || GET_MODE (operands[1]) == VOIDmode)"
3290 [(set_attr "type" "cs")
3291 (set_attr "cpu_facility" "*,*,z10,cpu_zarch")])
3294 [(set (match_operand:BLK 0 "memory_operand" "")
3296 (use (match_operand 1 "const_int_operand" ""))
3297 (use (match_operand 2 "immediate_operand" ""))
3299 (clobber (reg:CC CC_REGNUM))]
3302 [(set (match_dup 0) (const_int 0))
3304 (clobber (reg:CC CC_REGNUM))])]
3305 "operands[1] = GEN_INT ((INTVAL (operands[1]) & 0xff) + 1);")
3308 [(set (match_operand:BLK 0 "memory_operand" "")
3310 (use (match_operand 1 "register_operand" ""))
3311 (use (match_operand 2 "memory_operand" ""))
3313 (clobber (reg:CC CC_REGNUM))]
3316 [(unspec [(match_dup 1) (match_dup 2)
3317 (const_int 0)] UNSPEC_EXECUTE)
3318 (set (match_dup 0) (const_int 0))
3320 (clobber (reg:CC CC_REGNUM))])]
3324 [(set (match_operand:BLK 0 "memory_operand" "")
3326 (use (match_operand 1 "register_operand" ""))
3327 (use (const:BLK (unspec:BLK [(const_int 0)] UNSPEC_INSN)))
3329 (clobber (reg:CC CC_REGNUM))]
3330 "TARGET_Z10 && reload_completed"
3332 [(unspec [(match_dup 1) (const_int 0)
3333 (label_ref (match_dup 3))] UNSPEC_EXECUTE)
3334 (set (match_dup 0) (const_int 0))
3336 (clobber (reg:CC CC_REGNUM))])]
3337 "operands[3] = gen_label_rtx ();")
3340 [(set (match_operand:BLK 0 "memory_operand" "")
3342 (use (match_operand 1 "register_operand" ""))
3343 (use (const:BLK (unspec:BLK [(const_int 0)] UNSPEC_INSN)))
3344 (clobber (match_operand 2 "register_operand" ""))
3345 (clobber (reg:CC CC_REGNUM))]
3346 "reload_completed && TARGET_CPU_ZARCH"
3347 [(set (match_dup 2) (label_ref (match_dup 3)))
3349 [(unspec [(match_dup 1) (mem:BLK (match_dup 2))
3350 (label_ref (match_dup 3))] UNSPEC_EXECUTE)
3351 (set (match_dup 0) (const_int 0))
3353 (clobber (reg:CC CC_REGNUM))])]
3354 "operands[3] = gen_label_rtx ();")
3356 ; Initialize a block of arbitrary length with (operands[2] % 256).
3358 (define_expand "setmem_long_<P:mode>"
3360 [(clobber (match_dup 1))
3361 (set (match_operand:BLK 0 "memory_operand" "")
3362 (unspec:BLK [(match_operand:P 2 "setmem_operand" "")
3363 (match_dup 4)] UNSPEC_REPLICATE_BYTE))
3365 (clobber (reg:CC CC_REGNUM))])]
3368 machine_mode sreg_mode = TARGET_ZARCH ? DImode : SImode;
3369 machine_mode dreg_mode = TARGET_ZARCH ? TImode : DImode;
3370 rtx reg0 = gen_reg_rtx (dreg_mode);
3371 rtx reg1 = gen_reg_rtx (dreg_mode);
3372 rtx addr0 = gen_lowpart (Pmode, gen_highpart (sreg_mode, reg0));
3373 rtx len0 = gen_lowpart (Pmode, reg0);
3375 emit_clobber (reg0);
3376 emit_move_insn (addr0, force_operand (XEXP (operands[0], 0), NULL_RTX));
3377 emit_move_insn (len0, operands[1]);
3379 emit_move_insn (reg1, const0_rtx);
3381 operands[0] = replace_equiv_address_nv (operands[0], addr0);
3384 operands[4] = gen_lowpart (Pmode, operands[1]);
3387 ; Patterns for 31 bit + Esa and 64 bit + Zarch.
3389 (define_insn "*setmem_long"
3390 [(clobber (match_operand:<DBL> 0 "register_operand" "=d"))
3391 (set (mem:BLK (subreg:P (match_operand:<DBL> 3 "register_operand" "0") 0))
3392 (unspec:BLK [(match_operand:P 2 "setmem_operand" "Y")
3393 (subreg:P (match_dup 3) <modesize>)]
3394 UNSPEC_REPLICATE_BYTE))
3395 (use (match_operand:<DBL> 1 "register_operand" "d"))
3396 (clobber (reg:CC CC_REGNUM))]
3397 "TARGET_64BIT || !TARGET_ZARCH"
3398 "mvcle\t%0,%1,%Y2\;jo\t.-4"
3399 [(set_attr "length" "8")
3400 (set_attr "type" "vs")])
3402 (define_insn "*setmem_long_and"
3403 [(clobber (match_operand:<DBL> 0 "register_operand" "=d"))
3404 (set (mem:BLK (subreg:P (match_operand:<DBL> 3 "register_operand" "0") 0))
3405 (unspec:BLK [(zero_extend:P (match_operand:QI 2 "setmem_operand" "Y"))
3406 (subreg:P (match_dup 3) <modesize>)]
3407 UNSPEC_REPLICATE_BYTE))
3408 (use (match_operand:<DBL> 1 "register_operand" "d"))
3409 (clobber (reg:CC CC_REGNUM))]
3410 "(TARGET_64BIT || !TARGET_ZARCH)"
3411 "mvcle\t%0,%1,%Y2\;jo\t.-4"
3412 [(set_attr "length" "8")
3413 (set_attr "type" "vs")])
3415 ; Variants for 31 bit + Zarch, necessary because of the odd in-register offsets
3416 ; of the SImode subregs.
3418 (define_insn "*setmem_long_31z"
3419 [(clobber (match_operand:TI 0 "register_operand" "=d"))
3420 (set (mem:BLK (subreg:SI (match_operand:TI 3 "register_operand" "0") 4))
3421 (unspec:BLK [(match_operand:SI 2 "setmem_operand" "Y")
3422 (subreg:SI (match_dup 3) 12)] UNSPEC_REPLICATE_BYTE))
3423 (use (match_operand:TI 1 "register_operand" "d"))
3424 (clobber (reg:CC CC_REGNUM))]
3425 "!TARGET_64BIT && TARGET_ZARCH"
3426 "mvcle\t%0,%1,%Y2\;jo\t.-4"
3427 [(set_attr "length" "8")
3428 (set_attr "type" "vs")])
3430 (define_insn "*setmem_long_and_31z"
3431 [(clobber (match_operand:TI 0 "register_operand" "=d"))
3432 (set (mem:BLK (subreg:SI (match_operand:TI 3 "register_operand" "0") 4))
3433 (unspec:BLK [(zero_extend:SI (match_operand:QI 2 "setmem_operand" "Y"))
3434 (subreg:SI (match_dup 3) 12)] UNSPEC_REPLICATE_BYTE))
3435 (use (match_operand:TI 1 "register_operand" "d"))
3436 (clobber (reg:CC CC_REGNUM))]
3437 "(!TARGET_64BIT && TARGET_ZARCH)"
3438 "mvcle\t%0,%1,%Y2\;jo\t.-4"
3439 [(set_attr "length" "8")
3440 (set_attr "type" "vs")])
3443 ; cmpmemM instruction pattern(s).
3446 (define_expand "cmpmemsi"
3447 [(set (match_operand:SI 0 "register_operand" "")
3448 (compare:SI (match_operand:BLK 1 "memory_operand" "")
3449 (match_operand:BLK 2 "memory_operand" "") ) )
3450 (use (match_operand:SI 3 "general_operand" ""))
3451 (use (match_operand:SI 4 "" ""))]
3454 if (s390_expand_cmpmem (operands[0], operands[1],
3455 operands[2], operands[3]))
3461 ; Compare a block that is up to 256 bytes in length.
3462 ; The block length is taken as (operands[2] % 256) + 1.
3464 (define_expand "cmpmem_short"
3466 [(set (reg:CCU CC_REGNUM)
3467 (compare:CCU (match_operand:BLK 0 "memory_operand" "")
3468 (match_operand:BLK 1 "memory_operand" "")))
3469 (use (match_operand 2 "nonmemory_operand" ""))
3470 (use (const:BLK (unspec:BLK [(const_int 0)] UNSPEC_INSN)))
3471 (clobber (match_dup 3))])]
3473 "operands[3] = gen_rtx_SCRATCH (Pmode);")
3475 (define_insn "*cmpmem_short"
3476 [(set (reg:CCU CC_REGNUM)
3477 (compare:CCU (match_operand:BLK 0 "memory_operand" "Q,Q,Q,Q")
3478 (match_operand:BLK 1 "memory_operand" "Q,Q,Q,Q")))
3479 (use (match_operand 2 "nonmemory_operand" "n,a,a,a"))
3480 (use (match_operand 3 "immediate_operand" "X,R,X,X"))
3481 (clobber (match_scratch:P 4 "=X,X,X,&a"))]
3482 "(GET_MODE (operands[2]) == Pmode || GET_MODE (operands[2]) == VOIDmode)"
3484 [(set_attr "type" "cs")
3485 (set_attr "cpu_facility" "*,*,z10,cpu_zarch")])
3488 [(set (reg:CCU CC_REGNUM)
3489 (compare:CCU (match_operand:BLK 0 "memory_operand" "")
3490 (match_operand:BLK 1 "memory_operand" "")))
3491 (use (match_operand 2 "const_int_operand" ""))
3492 (use (match_operand 3 "immediate_operand" ""))
3493 (clobber (scratch))]
3496 [(set (reg:CCU CC_REGNUM) (compare:CCU (match_dup 0) (match_dup 1)))
3497 (use (match_dup 2))])]
3498 "operands[2] = GEN_INT ((INTVAL (operands[2]) & 0xff) + 1);")
3501 [(set (reg:CCU CC_REGNUM)
3502 (compare:CCU (match_operand:BLK 0 "memory_operand" "")
3503 (match_operand:BLK 1 "memory_operand" "")))
3504 (use (match_operand 2 "register_operand" ""))
3505 (use (match_operand 3 "memory_operand" ""))
3506 (clobber (scratch))]
3509 [(unspec [(match_dup 2) (match_dup 3)
3510 (const_int 0)] UNSPEC_EXECUTE)
3511 (set (reg:CCU CC_REGNUM) (compare:CCU (match_dup 0) (match_dup 1)))
3512 (use (const_int 1))])]
3516 [(set (reg:CCU CC_REGNUM)
3517 (compare:CCU (match_operand:BLK 0 "memory_operand" "")
3518 (match_operand:BLK 1 "memory_operand" "")))
3519 (use (match_operand 2 "register_operand" ""))
3520 (use (const:BLK (unspec:BLK [(const_int 0)] UNSPEC_INSN)))
3521 (clobber (scratch))]
3522 "TARGET_Z10 && reload_completed"
3524 [(unspec [(match_dup 2) (const_int 0)
3525 (label_ref (match_dup 4))] UNSPEC_EXECUTE)
3526 (set (reg:CCU CC_REGNUM) (compare:CCU (match_dup 0) (match_dup 1)))
3527 (use (const_int 1))])]
3528 "operands[4] = gen_label_rtx ();")
3531 [(set (reg:CCU CC_REGNUM)
3532 (compare:CCU (match_operand:BLK 0 "memory_operand" "")
3533 (match_operand:BLK 1 "memory_operand" "")))
3534 (use (match_operand 2 "register_operand" ""))
3535 (use (const:BLK (unspec:BLK [(const_int 0)] UNSPEC_INSN)))
3536 (clobber (match_operand 3 "register_operand" ""))]
3537 "reload_completed && TARGET_CPU_ZARCH"
3538 [(set (match_dup 3) (label_ref (match_dup 4)))
3540 [(unspec [(match_dup 2) (mem:BLK (match_dup 3))
3541 (label_ref (match_dup 4))] UNSPEC_EXECUTE)
3542 (set (reg:CCU CC_REGNUM) (compare:CCU (match_dup 0) (match_dup 1)))
3543 (use (const_int 1))])]
3544 "operands[4] = gen_label_rtx ();")
3546 ; Compare a block of arbitrary length.
3548 (define_expand "cmpmem_long"
3550 [(clobber (match_dup 2))
3551 (clobber (match_dup 3))
3552 (set (reg:CCU CC_REGNUM)
3553 (compare:CCU (match_operand:BLK 0 "memory_operand" "")
3554 (match_operand:BLK 1 "memory_operand" "")))
3555 (use (match_operand 2 "general_operand" ""))
3556 (use (match_dup 3))])]
3559 machine_mode sreg_mode = TARGET_ZARCH ? DImode : SImode;
3560 machine_mode dreg_mode = TARGET_ZARCH ? TImode : DImode;
3561 rtx reg0 = gen_reg_rtx (dreg_mode);
3562 rtx reg1 = gen_reg_rtx (dreg_mode);
3563 rtx addr0 = gen_lowpart (Pmode, gen_highpart (sreg_mode, reg0));
3564 rtx addr1 = gen_lowpart (Pmode, gen_highpart (sreg_mode, reg1));
3565 rtx len0 = gen_lowpart (Pmode, reg0);
3566 rtx len1 = gen_lowpart (Pmode, reg1);
3568 emit_clobber (reg0);
3569 emit_move_insn (addr0, force_operand (XEXP (operands[0], 0), NULL_RTX));
3570 emit_move_insn (len0, operands[2]);
3572 emit_clobber (reg1);
3573 emit_move_insn (addr1, force_operand (XEXP (operands[1], 0), NULL_RTX));
3574 emit_move_insn (len1, operands[2]);
3576 operands[0] = replace_equiv_address_nv (operands[0], addr0);
3577 operands[1] = replace_equiv_address_nv (operands[1], addr1);
3582 (define_insn "*cmpmem_long"
3583 [(clobber (match_operand:<DBL> 0 "register_operand" "=d"))
3584 (clobber (match_operand:<DBL> 1 "register_operand" "=d"))
3585 (set (reg:CCU CC_REGNUM)
3586 (compare:CCU (mem:BLK (subreg:P (match_operand:<DBL> 2 "register_operand" "0") 0))
3587 (mem:BLK (subreg:P (match_operand:<DBL> 3 "register_operand" "1") 0))))
3589 (use (match_dup 3))]
3590 "TARGET_64BIT || !TARGET_ZARCH"
3591 "clcle\t%0,%1,0\;jo\t.-4"
3592 [(set_attr "length" "8")
3593 (set_attr "type" "vs")])
3595 (define_insn "*cmpmem_long_31z"
3596 [(clobber (match_operand:TI 0 "register_operand" "=d"))
3597 (clobber (match_operand:TI 1 "register_operand" "=d"))
3598 (set (reg:CCU CC_REGNUM)
3599 (compare:CCU (mem:BLK (subreg:SI (match_operand:TI 2 "register_operand" "0") 4))
3600 (mem:BLK (subreg:SI (match_operand:TI 3 "register_operand" "1") 4))))
3602 (use (match_dup 3))]
3603 "!TARGET_64BIT && TARGET_ZARCH"
3604 "clcle\t%0,%1,0\;jo\t.-4"
3605 [(set_attr "op_type" "NN")
3606 (set_attr "type" "vs")
3607 (set_attr "length" "8")])
3609 ; Convert CCUmode condition code to integer.
3610 ; Result is zero if EQ, positive if LTU, negative if GTU.
3612 (define_insn_and_split "cmpint"
3613 [(set (match_operand:SI 0 "register_operand" "=d")
3614 (unspec:SI [(match_operand:CCU 1 "register_operand" "0")]
3615 UNSPEC_STRCMPCC_TO_INT))
3616 (clobber (reg:CC CC_REGNUM))]
3620 [(set (match_dup 0) (ashift:SI (match_dup 0) (const_int 2)))
3622 [(set (match_dup 0) (ashiftrt:SI (match_dup 0) (const_int 30)))
3623 (clobber (reg:CC CC_REGNUM))])])
3625 (define_insn_and_split "*cmpint_cc"
3626 [(set (reg CC_REGNUM)
3627 (compare (unspec:SI [(match_operand:CCU 1 "register_operand" "0")]
3628 UNSPEC_STRCMPCC_TO_INT)
3630 (set (match_operand:SI 0 "register_operand" "=d")
3631 (unspec:SI [(match_dup 1)] UNSPEC_STRCMPCC_TO_INT))]
3632 "s390_match_ccmode (insn, CCSmode)"
3634 "&& reload_completed"
3635 [(set (match_dup 0) (ashift:SI (match_dup 0) (const_int 2)))
3637 [(set (match_dup 2) (match_dup 3))
3638 (set (match_dup 0) (ashiftrt:SI (match_dup 0) (const_int 30)))])]
3640 rtx result = gen_rtx_ASHIFTRT (SImode, operands[0], GEN_INT (30));
3641 operands[2] = SET_DEST (XVECEXP (PATTERN (curr_insn), 0, 0));
3642 operands[3] = gen_rtx_COMPARE (GET_MODE (operands[2]), result, const0_rtx);
3645 (define_insn_and_split "*cmpint_sign"
3646 [(set (match_operand:DI 0 "register_operand" "=d")
3647 (sign_extend:DI (unspec:SI [(match_operand:CCU 1 "register_operand" "0")]
3648 UNSPEC_STRCMPCC_TO_INT)))
3649 (clobber (reg:CC CC_REGNUM))]
3652 "&& reload_completed"
3653 [(set (match_dup 0) (ashift:DI (match_dup 0) (const_int 34)))
3655 [(set (match_dup 0) (ashiftrt:DI (match_dup 0) (const_int 62)))
3656 (clobber (reg:CC CC_REGNUM))])])
3658 (define_insn_and_split "*cmpint_sign_cc"
3659 [(set (reg CC_REGNUM)
3660 (compare (ashiftrt:DI (ashift:DI (subreg:DI
3661 (unspec:SI [(match_operand:CCU 1 "register_operand" "0")]
3662 UNSPEC_STRCMPCC_TO_INT) 0)
3663 (const_int 32)) (const_int 32))
3665 (set (match_operand:DI 0 "register_operand" "=d")
3666 (sign_extend:DI (unspec:SI [(match_dup 1)] UNSPEC_STRCMPCC_TO_INT)))]
3667 "s390_match_ccmode (insn, CCSmode) && TARGET_ZARCH"
3669 "&& reload_completed"
3670 [(set (match_dup 0) (ashift:DI (match_dup 0) (const_int 34)))
3672 [(set (match_dup 2) (match_dup 3))
3673 (set (match_dup 0) (ashiftrt:DI (match_dup 0) (const_int 62)))])]
3675 rtx result = gen_rtx_ASHIFTRT (DImode, operands[0], GEN_INT (62));
3676 operands[2] = SET_DEST (XVECEXP (PATTERN (curr_insn), 0, 0));
3677 operands[3] = gen_rtx_COMPARE (GET_MODE (operands[2]), result, const0_rtx);
3682 ;;- Conversion instructions.
3685 (define_insn "*sethighpartsi"
3686 [(set (match_operand:SI 0 "register_operand" "=d,d")
3687 (unspec:SI [(match_operand:BLK 1 "s_operand" "Q,S")
3688 (match_operand 2 "const_int_operand" "n,n")] UNSPEC_ICM))
3689 (clobber (reg:CC CC_REGNUM))]
3694 [(set_attr "op_type" "RS,RSY")
3695 (set_attr "cpu_facility" "*,longdisp")
3696 (set_attr "z10prop" "z10_super_E1,z10_super_E1")])
3698 (define_insn "*sethighpartdi_64"
3699 [(set (match_operand:DI 0 "register_operand" "=d")
3700 (unspec:DI [(match_operand:BLK 1 "s_operand" "S")
3701 (match_operand 2 "const_int_operand" "n")] UNSPEC_ICM))
3702 (clobber (reg:CC CC_REGNUM))]
3705 [(set_attr "op_type" "RSY")
3706 (set_attr "z10prop" "z10_super")])
3708 (define_insn "*sethighpartdi_31"
3709 [(set (match_operand:DI 0 "register_operand" "=d,d")
3710 (unspec:DI [(match_operand:BLK 1 "s_operand" "Q,S")
3711 (match_operand 2 "const_int_operand" "n,n")] UNSPEC_ICM))
3712 (clobber (reg:CC CC_REGNUM))]
3717 [(set_attr "op_type" "RS,RSY")
3718 (set_attr "cpu_facility" "*,longdisp")
3719 (set_attr "z10prop" "z10_super_E1,z10_super_E1")])
3722 ; extv instruction patterns
3725 ; FIXME: This expander needs to be converted from DI to GPR as well
3726 ; after resolving some issues with it.
3728 (define_expand "extzv"
3730 [(set (match_operand:DI 0 "register_operand" "=d")
3732 (match_operand:DI 1 "register_operand" "d")
3733 (match_operand 2 "const_int_operand" "") ; size
3734 (match_operand 3 "const_int_operand" ""))) ; start
3735 (clobber (reg:CC CC_REGNUM))])]
3738 if (! EXTRACT_ARGS_IN_RANGE (INTVAL (operands[2]), INTVAL (operands[3]), 64))
3740 /* Starting with zEC12 there is risbgn not clobbering CC. */
3743 emit_move_insn (operands[0],
3744 gen_rtx_ZERO_EXTRACT (DImode,
3752 (define_insn "*extzv<mode><clobbercc_or_nocc>"
3753 [(set (match_operand:GPR 0 "register_operand" "=d")
3755 (match_operand:GPR 1 "register_operand" "d")
3756 (match_operand 2 "const_int_operand" "") ; size
3757 (match_operand 3 "const_int_operand" ""))) ; start
3759 "<z10_or_zEC12_cond>
3760 && EXTRACT_ARGS_IN_RANGE (INTVAL (operands[2]), INTVAL (operands[3]),
3761 GET_MODE_BITSIZE (<MODE>mode))"
3762 "<risbg_n>\t%0,%1,64-%2,128+63,<bitoff_plus>%3+%2" ; dst, src, start, end, shift
3763 [(set_attr "op_type" "RIE")
3764 (set_attr "z10prop" "z10_super_E1")])
3766 ; 64 bit: (a & -16) | ((b >> 8) & 15)
3767 (define_insn "*extzvdi<clobbercc_or_nocc>_lshiftrt"
3768 [(set (zero_extract:DI (match_operand:DI 0 "register_operand" "+d")
3769 (match_operand 1 "const_int_operand" "") ; size
3770 (match_operand 2 "const_int_operand" "")) ; start
3771 (lshiftrt:DI (match_operand:DI 3 "register_operand" "d")
3772 (match_operand:DI 4 "nonzero_shift_count_operand" "")))]
3773 "<z10_or_zEC12_cond>
3774 && EXTRACT_ARGS_IN_RANGE (INTVAL (operands[1]), INTVAL (operands[2]), 64)
3775 && 64 - UINTVAL (operands[4]) >= UINTVAL (operands[1])"
3776 "<risbg_n>\t%0,%3,%2,%2+%1-1,128-%2-%1-%4"
3777 [(set_attr "op_type" "RIE")
3778 (set_attr "z10prop" "z10_super_E1")])
3780 ; 32 bit: (a & -16) | ((b >> 8) & 15)
3781 (define_insn "*<risbg_n>_ior_and_sr_ze"
3782 [(set (match_operand:SI 0 "register_operand" "=d")
3784 (match_operand:SI 1 "register_operand" "0")
3785 (match_operand:SI 2 "const_int_operand" ""))
3788 (match_operand:DI 3 "register_operand" "d")
3789 (match_operand 4 "const_int_operand" "") ; size
3790 (match_operand 5 "const_int_operand" "")) ; start
3792 "<z10_or_zEC12_cond>
3793 && EXTRACT_ARGS_IN_RANGE (INTVAL (operands[4]), INTVAL (operands[5]), 64)
3794 && UINTVAL (operands[2]) == (~(0ULL) << UINTVAL (operands[4]))"
3795 "<risbg_n>\t%0,%3,64-%4,63,%4+%5"
3796 [(set_attr "op_type" "RIE")
3797 (set_attr "z10prop" "z10_super_E1")])
3799 ; ((int)foo >> 10) & 1;
3800 (define_insn "*extract1bitdi<clobbercc_or_nocc>"
3801 [(set (match_operand:DI 0 "register_operand" "=d")
3802 (ne:DI (zero_extract:DI
3803 (match_operand:DI 1 "register_operand" "d")
3804 (const_int 1) ; size
3805 (match_operand 2 "const_int_operand" "")) ; start
3807 "<z10_or_zEC12_cond>
3808 && EXTRACT_ARGS_IN_RANGE (1, INTVAL (operands[2]), 64)"
3809 "<risbg_n>\t%0,%1,64-1,128+63,%2+1" ; dst, src, start, end, shift
3810 [(set_attr "op_type" "RIE")
3811 (set_attr "z10prop" "z10_super_E1")])
3813 (define_insn "*<risbg_n>_and_subregdi_rotr"
3814 [(set (match_operand:DI 0 "register_operand" "=d")
3816 (rotate:SINT (match_operand:SINT 1 "register_operand" "d")
3817 (match_operand:SINT 2 "const_int_operand" "")) 0)
3818 (match_operand:DI 3 "contiguous_bitmask_operand" "")))]
3819 "<z10_or_zEC12_cond>
3820 && UINTVAL (operands[3]) < (1ULL << (UINTVAL (operands[2]) & 0x3f))"
3821 "<risbg_n>\t%0,%1,%s3,128+%e3,<bitoff_plus>%2" ; dst, src, start, end, shift
3822 [(set_attr "op_type" "RIE")
3823 (set_attr "z10prop" "z10_super_E1")])
3825 (define_insn "*<risbg_n>_and_subregdi_rotl"
3826 [(set (match_operand:DI 0 "register_operand" "=d")
3828 (rotate:SINT (match_operand:SINT 1 "register_operand" "d")
3829 (match_operand:SINT 2 "const_int_operand" "")) 0)
3830 (match_operand:DI 3 "contiguous_bitmask_operand" "")))]
3831 "<z10_or_zEC12_cond>
3832 && !(UINTVAL (operands[3]) & ((1ULL << (UINTVAL (operands[2]) & 0x3f)) - 1))"
3833 "<risbg_n>\t%0,%1,%s3,128+%e3,%2" ; dst, src, start, end, shift
3834 [(set_attr "op_type" "RIE")
3835 (set_attr "z10prop" "z10_super_E1")])
3837 (define_insn "*<risbg_n>_di_and_rot"
3838 [(set (match_operand:DI 0 "register_operand" "=d")
3839 (and:DI (rotate:DI (match_operand:DI 1 "register_operand" "d")
3840 (match_operand:DI 2 "const_int_operand" ""))
3841 (match_operand:DI 3 "contiguous_bitmask_operand" "")))]
3842 "<z10_or_zEC12_cond>"
3843 "<risbg_n>\t%0,%1,%s3,128+%e3,%2" ; dst, src, start, end, shift
3844 [(set_attr "op_type" "RIE")
3845 (set_attr "z10prop" "z10_super_E1")])
3847 (define_insn_and_split "*pre_z10_extzv<mode>"
3848 [(set (match_operand:GPR 0 "register_operand" "=d")
3849 (zero_extract:GPR (match_operand:QI 1 "s_operand" "S")
3850 (match_operand 2 "nonzero_shift_count_operand" "")
3852 (clobber (reg:CC CC_REGNUM))]
3855 "&& reload_completed"
3857 [(set (match_dup 0) (unspec:GPR [(match_dup 1) (match_dup 3)] UNSPEC_ICM))
3858 (clobber (reg:CC CC_REGNUM))])
3859 (set (match_dup 0) (lshiftrt:GPR (match_dup 0) (match_dup 2)))]
3861 int bitsize = INTVAL (operands[2]);
3862 int size = (bitsize - 1) / BITS_PER_UNIT + 1; /* round up */
3863 int mask = ((1ul << size) - 1) << (GET_MODE_SIZE (SImode) - size);
3865 operands[1] = adjust_address (operands[1], BLKmode, 0);
3866 set_mem_size (operands[1], size);
3867 operands[2] = GEN_INT (<GPR:bitsize> - bitsize);
3868 operands[3] = GEN_INT (mask);
3871 (define_insn_and_split "*pre_z10_extv<mode>"
3872 [(set (match_operand:GPR 0 "register_operand" "=d")
3873 (sign_extract:GPR (match_operand:QI 1 "s_operand" "S")
3874 (match_operand 2 "nonzero_shift_count_operand" "")
3876 (clobber (reg:CC CC_REGNUM))]
3879 "&& reload_completed"
3881 [(set (match_dup 0) (unspec:GPR [(match_dup 1) (match_dup 3)] UNSPEC_ICM))
3882 (clobber (reg:CC CC_REGNUM))])
3884 [(set (match_dup 0) (ashiftrt:GPR (match_dup 0) (match_dup 2)))
3885 (clobber (reg:CC CC_REGNUM))])]
3887 int bitsize = INTVAL (operands[2]);
3888 int size = (bitsize - 1) / BITS_PER_UNIT + 1; /* round up */
3889 int mask = ((1ul << size) - 1) << (GET_MODE_SIZE (SImode) - size);
3891 operands[1] = adjust_address (operands[1], BLKmode, 0);
3892 set_mem_size (operands[1], size);
3893 operands[2] = GEN_INT (<GPR:bitsize> - bitsize);
3894 operands[3] = GEN_INT (mask);
3898 ; insv instruction patterns
3901 (define_expand "insv"
3902 [(set (zero_extract (match_operand 0 "nonimmediate_operand" "")
3903 (match_operand 1 "const_int_operand" "")
3904 (match_operand 2 "const_int_operand" ""))
3905 (match_operand 3 "general_operand" ""))]
3908 if (s390_expand_insv (operands[0], operands[1], operands[2], operands[3]))
3914 ; The normal RTL expansion will never generate a zero_extract where
3915 ; the location operand isn't word mode. However, we do this in the
3916 ; back-end when generating atomic operations. See s390_two_part_insv.
3917 (define_insn "*insv<mode><clobbercc_or_nocc>"
3918 [(set (zero_extract:GPR (match_operand:GPR 0 "nonimmediate_operand" "+d")
3919 (match_operand 1 "const_int_operand" "I") ; size
3920 (match_operand 2 "const_int_operand" "I")) ; pos
3921 (match_operand:GPR 3 "nonimmediate_operand" "d"))]
3922 "<z10_or_zEC12_cond>
3923 && EXTRACT_ARGS_IN_RANGE (INTVAL (operands[1]), INTVAL (operands[2]),
3924 GET_MODE_BITSIZE (<MODE>mode))
3925 && (INTVAL (operands[1]) + INTVAL (operands[2])) <= <bitsize>"
3926 "<risbg_n>\t%0,%3,<bitoff_plus>%2,<bitoff_plus>%2+%1-1,<bitsize>-%2-%1"
3927 [(set_attr "op_type" "RIE")
3928 (set_attr "z10prop" "z10_super_E1")])
3930 ; and op1 with a mask being 1 for the selected bits and 0 for the rest
3931 ; and op3=op0 with a mask being 0 for the selected bits and 1 for the rest
3932 (define_insn "*insv<mode><clobbercc_or_nocc>_noshift"
3933 [(set (match_operand:GPR 0 "nonimmediate_operand" "=d,d")
3934 (ior:GPR (and:GPR (match_operand:GPR 1 "nonimmediate_operand" "d,0")
3935 (match_operand:GPR 2 "contiguous_bitmask_operand" ""))
3936 (and:GPR (match_operand:GPR 3 "nonimmediate_operand" "0,d")
3937 (match_operand:GPR 4 "const_int_operand" ""))))]
3938 "<z10_or_zEC12_cond> && INTVAL (operands[2]) == ~INTVAL (operands[4])"
3940 <risbg_n>\t%0,%1,%<bfstart>2,%<bfend>2,0
3941 <risbg_n>\t%0,%3,%<bfstart>4,%<bfend>4,0"
3942 [(set_attr "op_type" "RIE")
3943 (set_attr "z10prop" "z10_super_E1")])
3945 (define_insn "*insv_z10_noshift_cc"
3946 [(set (reg CC_REGNUM)
3949 (and:DI (match_operand:DI 1 "nonimmediate_operand" "d,0")
3950 (match_operand:DI 2 "contiguous_bitmask_operand" ""))
3951 (and:DI (match_operand:DI 3 "nonimmediate_operand" "0,d")
3952 (match_operand:DI 4 "const_int_operand" "")))
3954 (set (match_operand:DI 0 "nonimmediate_operand" "=d,d")
3955 (ior:DI (and:DI (match_dup 1) (match_dup 2))
3956 (and:DI (match_dup 3) (match_dup 4))))]
3957 "TARGET_Z10 && s390_match_ccmode (insn, CCSmode)
3958 && INTVAL (operands[2]) == ~INTVAL (operands[4])"
3960 risbg\t%0,%1,%s2,%e2,0
3961 risbg\t%0,%3,%s4,%e4,0"
3962 [(set_attr "op_type" "RIE")
3963 (set_attr "z10prop" "z10_super_E1")])
3965 (define_insn "*insv_z10_noshift_cconly"
3970 (and:DI (match_operand:DI 1 "nonimmediate_operand" "d,0")
3971 (match_operand:DI 2 "contiguous_bitmask_operand" ""))
3972 (and:DI (match_operand:DI 3 "nonimmediate_operand" "0,d")
3973 (match_operand:DI 4 "const_int_operand" "")))
3975 (clobber (match_scratch:DI 0 "=d,d"))]
3976 "TARGET_Z10 && s390_match_ccmode (insn, CCSmode)
3977 && INTVAL (operands[2]) == ~INTVAL (operands[4])"
3979 risbg\t%0,%1,%s2,%e2,0
3980 risbg\t%0,%3,%s4,%e4,0"
3981 [(set_attr "op_type" "RIE")
3982 (set_attr "z10prop" "z10_super_E1")])
3984 ; Implement appending Y on the left of S bits of X
3985 ; x = (y << s) | (x & ((1 << s) - 1))
3986 (define_insn "*insv<mode><clobbercc_or_nocc>_appendbitsleft"
3987 [(set (match_operand:GPR 0 "nonimmediate_operand" "=d")
3988 (ior:GPR (and:GPR (match_operand:GPR 1 "nonimmediate_operand" "0")
3989 (match_operand:GPR 2 "immediate_operand" ""))
3990 (ashift:GPR (match_operand:GPR 3 "nonimmediate_operand" "d")
3991 (match_operand:GPR 4 "nonzero_shift_count_operand" ""))))]
3992 "<z10_or_zEC12_cond>
3993 && UINTVAL (operands[2]) == (1UL << UINTVAL (operands[4])) - 1"
3994 "<risbg_n>\t%0,%3,<bitoff>,64-%4-1,%4"
3995 [(set_attr "op_type" "RIE")
3996 (set_attr "z10prop" "z10_super_E1")])
3998 ; a = ((i32)a & -16777216) | (((ui32)b) >> 8)
3999 (define_insn "*<risbg_n>_<mode>_ior_and_lshiftrt"
4000 [(set (match_operand:GPR 0 "register_operand" "=d")
4002 (match_operand:GPR 1 "register_operand" "0")
4003 (match_operand:GPR 2 "const_int_operand" ""))
4005 (match_operand:GPR 3 "register_operand" "d")
4006 (match_operand:GPR 4 "nonzero_shift_count_operand" ""))))]
4007 "<z10_or_zEC12_cond> && UINTVAL (operands[2])
4008 == (~(0ULL) << (GET_MODE_BITSIZE (<MODE>mode) - UINTVAL (operands[4])))"
4009 "<risbg_n>\t%0,%3,<bitoff_plus>%4,63,64-%4"
4010 [(set_attr "op_type" "RIE")
4011 (set_attr "z10prop" "z10_super_E1")])
4013 ; (ui32)(((ui64)x) >> 48) | ((i32)y & -65536);
4014 (define_insn "*<risbg_n>_sidi_ior_and_lshiftrt"
4015 [(set (match_operand:SI 0 "register_operand" "=d")
4017 (match_operand:SI 1 "register_operand" "0")
4018 (match_operand:SI 2 "const_int_operand" ""))
4021 (match_operand:DI 3 "register_operand" "d")
4022 (match_operand:DI 4 "nonzero_shift_count_operand" "")) 4)))]
4023 "<z10_or_zEC12_cond>
4024 && UINTVAL (operands[2]) == ~(~(0ULL) >> UINTVAL (operands[4]))"
4025 "<risbg_n>\t%0,%3,%4,63,64-%4"
4026 [(set_attr "op_type" "RIE")
4027 (set_attr "z10prop" "z10_super_E1")])
4029 ; (ui32)(((ui64)x) >> 12) & -4
4030 (define_insn "*trunc_sidi_and_subreg_lshrt<clobbercc_or_nocc>"
4031 [(set (match_operand:SI 0 "register_operand" "=d")
4033 (subreg:SI (lshiftrt:DI
4034 (match_operand:DI 1 "register_operand" "d")
4035 (match_operand:DI 2 "nonzero_shift_count_operand" "")) 4)
4036 (match_operand:SI 3 "contiguous_bitmask_nowrap_operand" "")))]
4037 "<z10_or_zEC12_cond>"
4038 "<risbg_n>\t%0,%1,%t3,128+%f3,64-%2"
4039 [(set_attr "op_type" "RIE")
4040 (set_attr "z10prop" "z10_super_E1")])
4042 ; z = (x << c) | (y >> d) with (x << c) and (y >> d) not overlapping after shifting
4043 ; -> z = y >> d; z = (x << c) | (z & ((1 << c) - 1))
4044 ; -> z = y >> d; z = risbg;
4047 [(set (match_operand:GPR 0 "nonimmediate_operand" "")
4048 (ior:GPR (lshiftrt:GPR (match_operand:GPR 1 "nonimmediate_operand" "")
4049 (match_operand:GPR 2 "nonzero_shift_count_operand" ""))
4050 (ashift:GPR (match_operand:GPR 3 "nonimmediate_operand" "")
4051 (match_operand:GPR 4 "nonzero_shift_count_operand" ""))))]
4052 "TARGET_ZEC12 && UINTVAL (operands[2]) + UINTVAL (operands[4]) >= <bitsize>"
4054 (lshiftrt:GPR (match_dup 1) (match_dup 2)))
4056 (ior:GPR (and:GPR (match_dup 6) (match_dup 5))
4057 (ashift:GPR (match_dup 3) (match_dup 4))))]
4059 operands[5] = GEN_INT ((1UL << UINTVAL (operands[4])) - 1);
4060 if (reg_overlap_mentioned_p (operands[0], operands[3]))
4062 if (!can_create_pseudo_p ())
4064 operands[6] = gen_reg_rtx (<MODE>mode);
4067 operands[6] = operands[0];
4072 [(set (match_operand:GPR 0 "nonimmediate_operand" "")
4073 (ior:GPR (lshiftrt:GPR (match_operand:GPR 1 "nonimmediate_operand" "")
4074 (match_operand:GPR 2 "nonzero_shift_count_operand" ""))
4075 (ashift:GPR (match_operand:GPR 3 "nonimmediate_operand" "")
4076 (match_operand:GPR 4 "nonzero_shift_count_operand" ""))))
4077 (clobber (reg:CC CC_REGNUM))])]
4078 "TARGET_Z10 && !TARGET_ZEC12 && UINTVAL (operands[2]) + UINTVAL (operands[4]) >= <bitsize>"
4080 (lshiftrt:GPR (match_dup 1) (match_dup 2)))
4083 (ior:GPR (and:GPR (match_dup 6) (match_dup 5))
4084 (ashift:GPR (match_dup 3) (match_dup 4))))
4085 (clobber (reg:CC CC_REGNUM))])]
4087 operands[5] = GEN_INT ((1UL << UINTVAL (operands[4])) - 1);
4088 if (reg_overlap_mentioned_p (operands[0], operands[3]))
4090 if (!can_create_pseudo_p ())
4092 operands[6] = gen_reg_rtx (<MODE>mode);
4095 operands[6] = operands[0];
4099 (define_insn "*r<noxa>sbg_<mode>_noshift"
4100 [(set (match_operand:GPR 0 "nonimmediate_operand" "=d")
4102 (and:GPR (match_operand:GPR 1 "nonimmediate_operand" "d")
4103 (match_operand:GPR 2 "contiguous_bitmask_operand" ""))
4104 (match_operand:GPR 3 "nonimmediate_operand" "0")))
4105 (clobber (reg:CC CC_REGNUM))]
4107 "r<noxa>sbg\t%0,%1,%<bfstart>2,%<bfend>2,0"
4108 [(set_attr "op_type" "RIE")])
4111 (define_insn "*r<noxa>sbg_di_rotl"
4112 [(set (match_operand:DI 0 "nonimmediate_operand" "=d")
4116 (match_operand:DI 1 "nonimmediate_operand" "d")
4117 (match_operand:DI 3 "const_int_operand" ""))
4118 (match_operand:DI 2 "contiguous_bitmask_operand" ""))
4119 (match_operand:DI 4 "nonimmediate_operand" "0")))
4120 (clobber (reg:CC CC_REGNUM))]
4122 "r<noxa>sbg\t%0,%1,%<bfstart>2,%<bfend>2,%b3"
4123 [(set_attr "op_type" "RIE")])
4126 (define_insn "*r<noxa>sbg_<mode>_srl_bitmask"
4127 [(set (match_operand:GPR 0 "nonimmediate_operand" "=d")
4131 (match_operand:GPR 1 "nonimmediate_operand" "d")
4132 (match_operand:GPR 3 "nonzero_shift_count_operand" ""))
4133 (match_operand:GPR 2 "contiguous_bitmask_nowrap_operand" ""))
4134 (match_operand:GPR 4 "nonimmediate_operand" "0")))
4135 (clobber (reg:CC CC_REGNUM))]
4137 && s390_extzv_shift_ok (<bitsize>, 64 - INTVAL (operands[3]),
4138 INTVAL (operands[2]))"
4139 "r<noxa>sbg\t%0,%1,%<bfstart>2,%<bfend>2,64-%3"
4140 [(set_attr "op_type" "RIE")])
4143 (define_insn "*r<noxa>sbg_<mode>_sll_bitmask"
4144 [(set (match_operand:GPR 0 "nonimmediate_operand" "=d")
4148 (match_operand:GPR 1 "nonimmediate_operand" "d")
4149 (match_operand:GPR 3 "nonzero_shift_count_operand" ""))
4150 (match_operand:GPR 2 "contiguous_bitmask_nowrap_operand" ""))
4151 (match_operand:GPR 4 "nonimmediate_operand" "0")))
4152 (clobber (reg:CC CC_REGNUM))]
4154 && s390_extzv_shift_ok (<bitsize>, INTVAL (operands[3]),
4155 INTVAL (operands[2]))"
4156 "r<noxa>sbg\t%0,%1,%<bfstart>2,%<bfend>2,%3"
4157 [(set_attr "op_type" "RIE")])
4159 ;; unsigned {int,long} a, b
4160 ;; a = a | (b << const_int)
4161 ;; a = a ^ (b << const_int)
4163 (define_insn "*r<noxa>sbg_<mode>_sll"
4164 [(set (match_operand:GPR 0 "nonimmediate_operand" "=d")
4167 (match_operand:GPR 1 "nonimmediate_operand" "d")
4168 (match_operand:GPR 2 "nonzero_shift_count_operand" ""))
4169 (match_operand:GPR 3 "nonimmediate_operand" "0")))
4170 (clobber (reg:CC CC_REGNUM))]
4172 "r<noxa>sbg\t%0,%1,<bitoff>,63-%2,%2"
4173 [(set_attr "op_type" "RIE")])
4175 ;; unsigned {int,long} a, b
4176 ;; a = a | (b >> const_int)
4177 ;; a = a ^ (b >> const_int)
4179 (define_insn "*r<noxa>sbg_<mode>_srl"
4180 [(set (match_operand:GPR 0 "nonimmediate_operand" "=d")
4183 (match_operand:GPR 1 "nonimmediate_operand" "d")
4184 (match_operand:GPR 2 "nonzero_shift_count_operand" ""))
4185 (match_operand:GPR 3 "nonimmediate_operand" "0")))
4186 (clobber (reg:CC CC_REGNUM))]
4188 "r<noxa>sbg\t%0,%1,<bitoff_plus>%2,63,64-%2"
4189 [(set_attr "op_type" "RIE")])
4191 ;; These two are generated by combine for s.bf &= val.
4192 ;; ??? For bitfields smaller than 32-bits, we wind up with SImode
4193 ;; shifts and ands, which results in some truly awful patterns
4194 ;; including subregs of operations. Rather unnecessisarily, IMO.
4197 ;; (set (zero_extract:DI (reg/v:DI 50 [ s ])
4198 ;; (const_int 24 [0x18])
4199 ;; (const_int 0 [0]))
4200 ;; (subreg:DI (and:SI (subreg:SI (lshiftrt:DI (reg/v:DI 50 [ s ])
4201 ;; (const_int 40 [0x28])) 4)
4202 ;; (reg:SI 4 %r4 [ y+4 ])) 0))
4204 ;; we should instead generate
4206 ;; (set (zero_extract:DI (reg/v:DI 50 [ s ])
4207 ;; (const_int 24 [0x18])
4208 ;; (const_int 0 [0]))
4209 ;; (and:DI (lshiftrt:DI (reg/v:DI 50 [ s ])
4210 ;; (const_int 40 [0x28]))
4211 ;; (subreg:DI (reg:SI 4 %r4 [ y+4 ]) 0)))
4213 ;; by noticing that we can push down the outer paradoxical subreg
4214 ;; into the operation.
4216 (define_insn "*insv_rnsbg_noshift"
4217 [(set (zero_extract:DI
4218 (match_operand:DI 0 "nonimmediate_operand" "+d")
4219 (match_operand 1 "const_int_operand" "")
4220 (match_operand 2 "const_int_operand" ""))
4223 (match_operand:DI 3 "nonimmediate_operand" "d")))
4224 (clobber (reg:CC CC_REGNUM))]
4226 && EXTRACT_ARGS_IN_RANGE (INTVAL (operands[1]), INTVAL (operands[2]), 64)
4227 && INTVAL (operands[1]) + INTVAL (operands[2]) == 64"
4228 "rnsbg\t%0,%3,%2,63,0"
4229 [(set_attr "op_type" "RIE")])
4231 (define_insn "*insv_rnsbg_srl"
4232 [(set (zero_extract:DI
4233 (match_operand:DI 0 "nonimmediate_operand" "+d")
4234 (match_operand 1 "const_int_operand" "")
4235 (match_operand 2 "const_int_operand" ""))
4239 (match_operand 3 "const_int_operand" ""))
4240 (match_operand:DI 4 "nonimmediate_operand" "d")))
4241 (clobber (reg:CC CC_REGNUM))]
4243 && EXTRACT_ARGS_IN_RANGE (INTVAL (operands[1]), INTVAL (operands[2]), 64)
4244 && INTVAL (operands[3]) == 64 - INTVAL (operands[1]) - INTVAL (operands[2])"
4245 "rnsbg\t%0,%4,%2,%2+%1-1,%3"
4246 [(set_attr "op_type" "RIE")])
4248 (define_insn "*insv<mode>_mem_reg"
4249 [(set (zero_extract:W (match_operand:QI 0 "memory_operand" "+Q,S")
4250 (match_operand 1 "const_int_operand" "n,n")
4252 (match_operand:W 2 "register_operand" "d,d"))]
4253 "EXTRACT_ARGS_IN_RANGE (INTVAL (operands[1]), 0, 64)
4254 && INTVAL (operands[1]) > 0
4255 && INTVAL (operands[1]) <= GET_MODE_BITSIZE (SImode)
4256 && INTVAL (operands[1]) % BITS_PER_UNIT == 0"
4258 int size = INTVAL (operands[1]) / BITS_PER_UNIT;
4260 operands[1] = GEN_INT ((1ul << size) - 1);
4261 return (which_alternative == 0) ? "stcm\t%2,%1,%S0"
4262 : "stcmy\t%2,%1,%S0";
4264 [(set_attr "op_type" "RS,RSY")
4265 (set_attr "cpu_facility" "*,longdisp")
4266 (set_attr "z10prop" "z10_super,z10_super")])
4268 (define_insn "*insvdi_mem_reghigh"
4269 [(set (zero_extract:DI (match_operand:QI 0 "memory_operand" "+S")
4270 (match_operand 1 "const_int_operand" "n")
4272 (lshiftrt:DI (match_operand:DI 2 "register_operand" "d")
4275 && EXTRACT_ARGS_IN_RANGE (INTVAL (operands[1]), 0, 64)
4276 && INTVAL (operands[1]) > 0
4277 && INTVAL (operands[1]) <= GET_MODE_BITSIZE (SImode)
4278 && INTVAL (operands[1]) % BITS_PER_UNIT == 0"
4280 int size = INTVAL (operands[1]) / BITS_PER_UNIT;
4282 operands[1] = GEN_INT ((1ul << size) - 1);
4283 return "stcmh\t%2,%1,%S0";
4285 [(set_attr "op_type" "RSY")
4286 (set_attr "z10prop" "z10_super")])
4288 (define_insn "*insvdi_reg_imm"
4289 [(set (zero_extract:DI (match_operand:DI 0 "register_operand" "+d")
4291 (match_operand 1 "const_int_operand" "n"))
4292 (match_operand:DI 2 "const_int_operand" "n"))]
4294 && EXTRACT_ARGS_IN_RANGE (16, INTVAL (operands[1]), 64)
4295 && INTVAL (operands[1]) >= 0
4296 && INTVAL (operands[1]) < BITS_PER_WORD
4297 && INTVAL (operands[1]) % 16 == 0"
4299 switch (BITS_PER_WORD - INTVAL (operands[1]))
4301 case 64: return "iihh\t%0,%x2"; break;
4302 case 48: return "iihl\t%0,%x2"; break;
4303 case 32: return "iilh\t%0,%x2"; break;
4304 case 16: return "iill\t%0,%x2"; break;
4305 default: gcc_unreachable();
4308 [(set_attr "op_type" "RI")
4309 (set_attr "z10prop" "z10_super_E1")])
4311 ; Update the left-most 32 bit of a DI.
4312 (define_insn "*insv_h_di_reg_extimm"
4313 [(set (zero_extract:DI (match_operand:DI 0 "register_operand" "+d")
4316 (match_operand:DI 1 "const_int_operand" "n"))]
4319 [(set_attr "op_type" "RIL")
4320 (set_attr "z10prop" "z10_fwd_E1")])
4322 ; Update the right-most 32 bit of a DI.
4323 (define_insn "*insv_l_di_reg_extimm"
4324 [(set (zero_extract:DI (match_operand:DI 0 "register_operand" "+d")
4327 (match_operand:DI 1 "const_int_operand" "n"))]
4330 [(set_attr "op_type" "RIL")
4331 (set_attr "z10prop" "z10_fwd_A1")])
4334 ; extendsidi2 instruction pattern(s).
4337 (define_expand "extendsidi2"
4338 [(set (match_operand:DI 0 "register_operand" "")
4339 (sign_extend:DI (match_operand:SI 1 "nonimmediate_operand" "")))]
4344 emit_clobber (operands[0]);
4345 emit_move_insn (gen_highpart (SImode, operands[0]), operands[1]);
4346 emit_move_insn (gen_lowpart (SImode, operands[0]), const0_rtx);
4347 emit_insn (gen_ashrdi3 (operands[0], operands[0], GEN_INT (32)));
4352 (define_insn "*extendsidi2"
4353 [(set (match_operand:DI 0 "register_operand" "=d,d,d")
4354 (sign_extend:DI (match_operand:SI 1 "nonimmediate_operand" "d,T,b")))]
4360 [(set_attr "op_type" "RRE,RXY,RIL")
4361 (set_attr "type" "*,*,larl")
4362 (set_attr "cpu_facility" "*,*,z10")
4363 (set_attr "z10prop" "z10_super_E1,z10_super_E1,z10_super_E1")])
4366 ; extend(hi|qi)(si|di)2 instruction pattern(s).
4369 (define_expand "extend<HQI:mode><DSI:mode>2"
4370 [(set (match_operand:DSI 0 "register_operand" "")
4371 (sign_extend:DSI (match_operand:HQI 1 "nonimmediate_operand" "")))]
4374 if (<DSI:MODE>mode == DImode && !TARGET_ZARCH)
4376 rtx tmp = gen_reg_rtx (SImode);
4377 emit_insn (gen_extend<HQI:mode>si2 (tmp, operands[1]));
4378 emit_insn (gen_extendsidi2 (operands[0], tmp));
4381 else if (!TARGET_EXTIMM)
4383 rtx bitcount = GEN_INT (<DSI:bitsize> - <HQI:bitsize>);
4385 operands[1] = gen_lowpart (<DSI:MODE>mode, operands[1]);
4386 emit_insn (gen_ashl<DSI:mode>3 (operands[0], operands[1], bitcount));
4387 emit_insn (gen_ashr<DSI:mode>3 (operands[0], operands[0], bitcount));
4393 ; extendhidi2 instruction pattern(s).
4396 (define_insn "*extendhidi2_extimm"
4397 [(set (match_operand:DI 0 "register_operand" "=d,d,d")
4398 (sign_extend:DI (match_operand:HI 1 "general_operand" "d,T,b")))]
4399 "TARGET_ZARCH && TARGET_EXTIMM"
4404 [(set_attr "op_type" "RRE,RXY,RIL")
4405 (set_attr "type" "*,*,larl")
4406 (set_attr "cpu_facility" "extimm,extimm,z10")
4407 (set_attr "z10prop" "z10_super_E1,z10_super_E1,z10_super_E1")])
4409 (define_insn "*extendhidi2"
4410 [(set (match_operand:DI 0 "register_operand" "=d")
4411 (sign_extend:DI (match_operand:HI 1 "memory_operand" "T")))]
4414 [(set_attr "op_type" "RXY")
4415 (set_attr "z10prop" "z10_super_E1")])
4418 ; extendhisi2 instruction pattern(s).
4421 (define_insn "*extendhisi2_extimm"
4422 [(set (match_operand:SI 0 "register_operand" "=d,d,d,d")
4423 (sign_extend:SI (match_operand:HI 1 "nonimmediate_operand" " d,R,T,b")))]
4430 [(set_attr "op_type" "RRE,RX,RXY,RIL")
4431 (set_attr "type" "*,*,*,larl")
4432 (set_attr "cpu_facility" "extimm,extimm,extimm,z10")
4433 (set_attr "z10prop" "z10_super_E1,z10_super_E1,z10_super_E1,z10_super_E1")])
4435 (define_insn "*extendhisi2"
4436 [(set (match_operand:SI 0 "register_operand" "=d,d")
4437 (sign_extend:SI (match_operand:HI 1 "memory_operand" "R,T")))]
4442 [(set_attr "op_type" "RX,RXY")
4443 (set_attr "cpu_facility" "*,longdisp")
4444 (set_attr "z10prop" "z10_super_E1,z10_super_E1")])
4447 ; extendqi(si|di)2 instruction pattern(s).
4450 ; lbr, lgbr, lb, lgb
4451 (define_insn "*extendqi<mode>2_extimm"
4452 [(set (match_operand:GPR 0 "register_operand" "=d,d")
4453 (sign_extend:GPR (match_operand:QI 1 "nonimmediate_operand" "d,T")))]
4458 [(set_attr "op_type" "RRE,RXY")
4459 (set_attr "z10prop" "z10_super_E1,z10_super_E1")])
4462 (define_insn "*extendqi<mode>2"
4463 [(set (match_operand:GPR 0 "register_operand" "=d")
4464 (sign_extend:GPR (match_operand:QI 1 "memory_operand" "T")))]
4465 "!TARGET_EXTIMM && TARGET_LONG_DISPLACEMENT"
4467 [(set_attr "op_type" "RXY")
4468 (set_attr "z10prop" "z10_super_E1")])
4470 (define_insn_and_split "*extendqi<mode>2_short_displ"
4471 [(set (match_operand:GPR 0 "register_operand" "=d")
4472 (sign_extend:GPR (match_operand:QI 1 "s_operand" "Q")))
4473 (clobber (reg:CC CC_REGNUM))]
4474 "!TARGET_EXTIMM && !TARGET_LONG_DISPLACEMENT"
4476 "&& reload_completed"
4478 [(set (match_dup 0) (unspec:GPR [(match_dup 1) (const_int 8)] UNSPEC_ICM))
4479 (clobber (reg:CC CC_REGNUM))])
4481 [(set (match_dup 0) (ashiftrt:GPR (match_dup 0) (match_dup 2)))
4482 (clobber (reg:CC CC_REGNUM))])]
4484 operands[1] = adjust_address (operands[1], BLKmode, 0);
4485 set_mem_size (operands[1], GET_MODE_SIZE (QImode));
4486 operands[2] = GEN_INT (<GPR:bitsize> - BITS_PER_UNIT);
4490 ; zero_extendsidi2 instruction pattern(s).
4493 (define_expand "zero_extendsidi2"
4494 [(set (match_operand:DI 0 "register_operand" "")
4495 (zero_extend:DI (match_operand:SI 1 "nonimmediate_operand" "")))]
4500 emit_clobber (operands[0]);
4501 emit_move_insn (gen_lowpart (SImode, operands[0]), operands[1]);
4502 emit_move_insn (gen_highpart (SImode, operands[0]), const0_rtx);
4507 (define_insn "*zero_extendsidi2"
4508 [(set (match_operand:DI 0 "register_operand" "=d,d,d")
4509 (zero_extend:DI (match_operand:SI 1 "nonimmediate_operand" "d,T,b")))]
4515 [(set_attr "op_type" "RRE,RXY,RIL")
4516 (set_attr "type" "*,*,larl")
4517 (set_attr "cpu_facility" "*,*,z10")
4518 (set_attr "z10prop" "z10_fwd_E1,z10_fwd_A3,z10_fwd_A3")])
4521 ; LLGT-type instructions (zero-extend from 31 bit to 64 bit).
4524 (define_insn "*llgt_sidi"
4525 [(set (match_operand:DI 0 "register_operand" "=d")
4526 (and:DI (subreg:DI (match_operand:SI 1 "memory_operand" "T") 0)
4527 (const_int 2147483647)))]
4530 [(set_attr "op_type" "RXE")
4531 (set_attr "z10prop" "z10_super_E1")])
4533 (define_insn_and_split "*llgt_sidi_split"
4534 [(set (match_operand:DI 0 "register_operand" "=d")
4535 (and:DI (subreg:DI (match_operand:SI 1 "memory_operand" "T") 0)
4536 (const_int 2147483647)))
4537 (clobber (reg:CC CC_REGNUM))]
4540 "&& reload_completed"
4542 (and:DI (subreg:DI (match_dup 1) 0)
4543 (const_int 2147483647)))]
4546 (define_insn "*llgt_sisi"
4547 [(set (match_operand:SI 0 "register_operand" "=d,d")
4548 (and:SI (match_operand:SI 1 "nonimmediate_operand" "d,T")
4549 (const_int 2147483647)))]
4554 [(set_attr "op_type" "RRE,RXE")
4555 (set_attr "z10prop" "z10_super_E1,z10_super_E1")])
4557 (define_insn "*llgt_didi"
4558 [(set (match_operand:DI 0 "register_operand" "=d,d")
4559 (and:DI (match_operand:DI 1 "nonimmediate_operand" "d,o")
4560 (const_int 2147483647)))]
4565 [(set_attr "op_type" "RRE,RXE")
4566 (set_attr "z10prop" "z10_super_E1,z10_super_E1")])
4569 [(set (match_operand:DSI 0 "register_operand" "")
4570 (and:DSI (match_operand:DSI 1 "nonimmediate_operand" "")
4571 (const_int 2147483647)))
4572 (clobber (reg:CC CC_REGNUM))]
4573 "TARGET_ZARCH && reload_completed"
4575 (and:DSI (match_dup 1)
4576 (const_int 2147483647)))]
4580 ; zero_extend(hi|qi)(si|di)2 instruction pattern(s).
4583 (define_expand "zero_extend<mode>di2"
4584 [(set (match_operand:DI 0 "register_operand" "")
4585 (zero_extend:DI (match_operand:HQI 1 "nonimmediate_operand" "")))]
4590 rtx tmp = gen_reg_rtx (SImode);
4591 emit_insn (gen_zero_extend<mode>si2 (tmp, operands[1]));
4592 emit_insn (gen_zero_extendsidi2 (operands[0], tmp));
4595 else if (!TARGET_EXTIMM)
4597 rtx bitcount = GEN_INT (64 - <HQI:bitsize>);
4598 operands[1] = gen_lowpart (DImode, operands[1]);
4599 emit_insn (gen_ashldi3 (operands[0], operands[1], bitcount));
4600 emit_insn (gen_lshrdi3 (operands[0], operands[0], bitcount));
4605 (define_expand "zero_extend<mode>si2"
4606 [(set (match_operand:SI 0 "register_operand" "")
4607 (zero_extend:SI (match_operand:HQI 1 "nonimmediate_operand" "")))]
4612 operands[1] = gen_lowpart (SImode, operands[1]);
4613 emit_insn (gen_andsi3 (operands[0], operands[1],
4614 GEN_INT ((1 << <HQI:bitsize>) - 1)));
4620 (define_insn "*zero_extendhi<mode>2_z10"
4621 [(set (match_operand:GPR 0 "register_operand" "=d,d,d")
4622 (zero_extend:GPR (match_operand:HI 1 "nonimmediate_operand" "d,T,b")))]
4628 [(set_attr "op_type" "RXY,RRE,RIL")
4629 (set_attr "type" "*,*,larl")
4630 (set_attr "cpu_facility" "*,*,z10")
4631 (set_attr "z10prop" "z10_super_E1,z10_fwd_A3,z10_fwd_A3")])
4633 ; llhr, llcr, llghr, llgcr, llh, llc, llgh, llgc
4634 (define_insn "*zero_extend<HQI:mode><GPR:mode>2_extimm"
4635 [(set (match_operand:GPR 0 "register_operand" "=d,d")
4636 (zero_extend:GPR (match_operand:HQI 1 "nonimmediate_operand" "d,T")))]
4641 [(set_attr "op_type" "RRE,RXY")
4642 (set_attr "z10prop" "z10_super_E1,z10_fwd_A3")])
4645 (define_insn "*zero_extend<HQI:mode><GPR:mode>2"
4646 [(set (match_operand:GPR 0 "register_operand" "=d")
4647 (zero_extend:GPR (match_operand:HQI 1 "memory_operand" "T")))]
4648 "TARGET_ZARCH && !TARGET_EXTIMM"
4650 [(set_attr "op_type" "RXY")
4651 (set_attr "z10prop" "z10_fwd_A3")])
4653 (define_insn_and_split "*zero_extendhisi2_31"
4654 [(set (match_operand:SI 0 "register_operand" "=&d")
4655 (zero_extend:SI (match_operand:HI 1 "s_operand" "S")))
4656 (clobber (reg:CC CC_REGNUM))]
4659 "&& reload_completed"
4660 [(set (match_dup 0) (const_int 0))
4662 [(set (strict_low_part (match_dup 2)) (match_dup 1))
4663 (clobber (reg:CC CC_REGNUM))])]
4664 "operands[2] = gen_lowpart (HImode, operands[0]);")
4666 (define_insn_and_split "*zero_extendqisi2_31"
4667 [(set (match_operand:SI 0 "register_operand" "=&d")
4668 (zero_extend:SI (match_operand:QI 1 "memory_operand" "T")))]
4671 "&& reload_completed"
4672 [(set (match_dup 0) (const_int 0))
4673 (set (strict_low_part (match_dup 2)) (match_dup 1))]
4674 "operands[2] = gen_lowpart (QImode, operands[0]);")
4677 ; zero_extendqihi2 instruction pattern(s).
4680 (define_expand "zero_extendqihi2"
4681 [(set (match_operand:HI 0 "register_operand" "")
4682 (zero_extend:HI (match_operand:QI 1 "register_operand" "")))]
4683 "TARGET_ZARCH && !TARGET_EXTIMM"
4685 operands[1] = gen_lowpart (HImode, operands[1]);
4686 emit_insn (gen_andhi3 (operands[0], operands[1], GEN_INT (0xff)));
4690 (define_insn "*zero_extendqihi2_64"
4691 [(set (match_operand:HI 0 "register_operand" "=d")
4692 (zero_extend:HI (match_operand:QI 1 "memory_operand" "T")))]
4693 "TARGET_ZARCH && !TARGET_EXTIMM"
4695 [(set_attr "op_type" "RXY")
4696 (set_attr "z10prop" "z10_fwd_A3")])
4698 (define_insn_and_split "*zero_extendqihi2_31"
4699 [(set (match_operand:HI 0 "register_operand" "=&d")
4700 (zero_extend:HI (match_operand:QI 1 "memory_operand" "T")))]
4703 "&& reload_completed"
4704 [(set (match_dup 0) (const_int 0))
4705 (set (strict_low_part (match_dup 2)) (match_dup 1))]
4706 "operands[2] = gen_lowpart (QImode, operands[0]);")
4709 ; fixuns_trunc(dd|td)di2 instruction pattern(s).
4712 (define_expand "fixuns_truncdddi2"
4714 [(set (match_operand:DI 0 "register_operand" "")
4715 (unsigned_fix:DI (match_operand:DD 1 "register_operand" "")))
4716 (unspec:DI [(const_int DFP_RND_TOWARD_0)] UNSPEC_ROUND)
4717 (clobber (reg:CC CC_REGNUM))])]
4723 rtx_code_label *label1 = gen_label_rtx ();
4724 rtx_code_label *label2 = gen_label_rtx ();
4725 rtx temp = gen_reg_rtx (TDmode);
4726 REAL_VALUE_TYPE cmp, sub;
4728 decimal_real_from_string (&cmp, "9223372036854775808.0"); /* 2^63 */
4729 decimal_real_from_string (&sub, "18446744073709551616.0"); /* 2^64 */
4731 /* 2^63 can't be represented as 64bit DFP number with full precision. The
4732 solution is doing the check and the subtraction in TD mode and using a
4733 TD -> DI convert afterwards. */
4734 emit_insn (gen_extendddtd2 (temp, operands[1]));
4735 temp = force_reg (TDmode, temp);
4736 emit_cmp_and_jump_insns (temp,
4737 const_double_from_real_value (cmp, TDmode),
4738 LT, NULL_RTX, VOIDmode, 0, label1);
4739 emit_insn (gen_subtd3 (temp, temp,
4740 const_double_from_real_value (sub, TDmode)));
4741 emit_insn (gen_fix_trunctddi2_dfp (operands[0], temp,
4742 GEN_INT (DFP_RND_TOWARD_MINF)));
4745 emit_label (label1);
4746 emit_insn (gen_fix_truncdddi2_dfp (operands[0], operands[1],
4747 GEN_INT (DFP_RND_TOWARD_0)));
4748 emit_label (label2);
4753 (define_expand "fixuns_trunctddi2"
4755 [(set (match_operand:DI 0 "register_operand" "")
4756 (unsigned_fix:DI (match_operand:TD 1 "register_operand" "")))
4757 (unspec:DI [(const_int DFP_RND_TOWARD_0)] UNSPEC_ROUND)
4758 (clobber (reg:CC CC_REGNUM))])]
4764 rtx_code_label *label1 = gen_label_rtx ();
4765 rtx_code_label *label2 = gen_label_rtx ();
4766 rtx temp = gen_reg_rtx (TDmode);
4767 REAL_VALUE_TYPE cmp, sub;
4769 operands[1] = force_reg (TDmode, operands[1]);
4770 decimal_real_from_string (&cmp, "9223372036854775808.0"); /* 2^63 */
4771 decimal_real_from_string (&sub, "18446744073709551616.0"); /* 2^64 */
4773 emit_cmp_and_jump_insns (operands[1],
4774 const_double_from_real_value (cmp, TDmode),
4775 LT, NULL_RTX, VOIDmode, 0, label1);
4776 emit_insn (gen_subtd3 (temp, operands[1],
4777 const_double_from_real_value (sub, TDmode)));
4778 emit_insn (gen_fix_trunctddi2_dfp (operands[0], temp,
4779 GEN_INT (DFP_RND_TOWARD_MINF)));
4782 emit_label (label1);
4783 emit_insn (gen_fix_trunctddi2_dfp (operands[0], operands[1],
4784 GEN_INT (DFP_RND_TOWARD_0)));
4785 emit_label (label2);
4791 ; fixuns_trunc(sf|df|tf)(si|di)2 and fix_trunc(sf|df|tf)(si|di)2
4792 ; instruction pattern(s).
4795 (define_expand "fixuns_trunc<BFP:mode><GPR:mode>2"
4797 [(set (match_operand:GPR 0 "register_operand" "")
4798 (unsigned_fix:GPR (match_operand:BFP 1 "register_operand" "")))
4799 (unspec:GPR [(const_int BFP_RND_TOWARD_0)] UNSPEC_ROUND)
4800 (clobber (reg:CC CC_REGNUM))])]
4805 rtx_code_label *label1 = gen_label_rtx ();
4806 rtx_code_label *label2 = gen_label_rtx ();
4807 rtx temp = gen_reg_rtx (<BFP:MODE>mode);
4808 REAL_VALUE_TYPE cmp, sub;
4810 operands[1] = force_reg (<BFP:MODE>mode, operands[1]);
4811 real_2expN (&cmp, <GPR:bitsize> - 1, <BFP:MODE>mode);
4812 real_2expN (&sub, <GPR:bitsize>, <BFP:MODE>mode);
4814 emit_cmp_and_jump_insns (operands[1],
4815 const_double_from_real_value (cmp, <BFP:MODE>mode),
4816 LT, NULL_RTX, VOIDmode, 0, label1);
4817 emit_insn (gen_sub<BFP:mode>3 (temp, operands[1],
4818 const_double_from_real_value (sub, <BFP:MODE>mode)));
4819 emit_insn (gen_fix_trunc<BFP:mode><GPR:mode>2_bfp (operands[0], temp,
4820 GEN_INT (BFP_RND_TOWARD_MINF)));
4823 emit_label (label1);
4824 emit_insn (gen_fix_trunc<BFP:mode><GPR:mode>2_bfp (operands[0],
4825 operands[1], GEN_INT (BFP_RND_TOWARD_0)));
4826 emit_label (label2);
4831 ; fixuns_trunc(td|dd)si2 expander
4832 (define_expand "fixuns_trunc<mode>si2"
4834 [(set (match_operand:SI 0 "register_operand" "")
4835 (unsigned_fix:SI (match_operand:DFP 1 "register_operand" "")))
4836 (unspec:SI [(const_int DFP_RND_TOWARD_0)] UNSPEC_ROUND)
4837 (clobber (reg:CC CC_REGNUM))])]
4838 "TARGET_Z196 && TARGET_HARD_DFP"
4841 ; fixuns_trunc(tf|df|sf|td|dd)(di|si)2 instruction patterns.
4843 (define_insn "*fixuns_truncdfdi2_z13"
4844 [(set (match_operand:DI 0 "register_operand" "=d,v")
4845 (unsigned_fix:DI (match_operand:DF 1 "register_operand" "f,v")))
4846 (unspec:DI [(match_operand:DI 2 "immediate_operand" "K,K")] UNSPEC_ROUND)
4847 (clobber (reg:CC CC_REGNUM))]
4848 "TARGET_VX && TARGET_HARD_FLOAT"
4851 wclgdb\t%v0,%v1,0,%h2"
4852 [(set_attr "op_type" "RRF,VRR")
4853 (set_attr "type" "ftoi")])
4855 ; clfebr, clfdbr, clfxbr, clgebr, clgdbr, clgxbr
4856 ; clfdtr, clfxtr, clgdtr, clgxtr
4857 (define_insn "*fixuns_trunc<FP:mode><GPR:mode>2_z196"
4858 [(set (match_operand:GPR 0 "register_operand" "=d")
4859 (unsigned_fix:GPR (match_operand:FP 1 "register_operand" "f")))
4860 (unspec:GPR [(match_operand:GPR 2 "immediate_operand" "K")] UNSPEC_ROUND)
4861 (clobber (reg:CC CC_REGNUM))]
4862 "TARGET_Z196 && TARGET_HARD_FLOAT
4863 && (!TARGET_VX || <GPR:MODE>mode != DImode || <FP:MODE>mode != DFmode)"
4864 "cl<GPR:gf><FP:xde><FP:bt>r\t%0,%h2,%1,0"
4865 [(set_attr "op_type" "RRF")
4866 (set_attr "type" "ftoi")])
4868 (define_expand "fix_trunc<DSF:mode><GPR:mode>2"
4869 [(set (match_operand:GPR 0 "register_operand" "")
4870 (fix:GPR (match_operand:DSF 1 "register_operand" "")))]
4873 emit_insn (gen_fix_trunc<DSF:mode><GPR:mode>2_bfp (operands[0], operands[1],
4874 GEN_INT (BFP_RND_TOWARD_0)));
4878 (define_insn "*fix_truncdfdi2_bfp_z13"
4879 [(set (match_operand:DI 0 "register_operand" "=d,v")
4880 (fix:DI (match_operand:DF 1 "register_operand" "f,v")))
4881 (unspec:DI [(match_operand:DI 2 "immediate_operand" "K,K")] UNSPEC_ROUND)
4882 (clobber (reg:CC CC_REGNUM))]
4883 "TARGET_VX && TARGET_HARD_FLOAT"
4886 wcgdb\t%v0,%v1,0,%h2"
4887 [(set_attr "op_type" "RRE,VRR")
4888 (set_attr "type" "ftoi")])
4890 ; cgxbr, cgdbr, cgebr, cfxbr, cfdbr, cfebr
4891 (define_insn "*fix_trunc<BFP:mode><GPR:mode>2_bfp"
4892 [(set (match_operand:GPR 0 "register_operand" "=d")
4893 (fix:GPR (match_operand:BFP 1 "register_operand" "f")))
4894 (unspec:GPR [(match_operand:GPR 2 "immediate_operand" "K")] UNSPEC_ROUND)
4895 (clobber (reg:CC CC_REGNUM))]
4897 && (!TARGET_VX || <GPR:MODE>mode != DImode || <BFP:MODE>mode != DFmode)"
4898 "c<GPR:gf><BFP:xde>br\t%0,%h2,%1"
4899 [(set_attr "op_type" "RRE")
4900 (set_attr "type" "ftoi")])
4902 (define_expand "fix_trunc<BFP:mode><GPR:mode>2_bfp"
4904 [(set (match_operand:GPR 0 "register_operand" "=d")
4905 (fix:GPR (match_operand:BFP 1 "register_operand" "f")))
4906 (unspec:GPR [(match_operand:GPR 2 "immediate_operand" "K")] UNSPEC_ROUND)
4907 (clobber (reg:CC CC_REGNUM))])]
4908 "TARGET_HARD_FLOAT")
4910 ; fix_trunc(td|dd)di2 instruction pattern(s).
4913 (define_expand "fix_trunc<mode>di2"
4914 [(set (match_operand:DI 0 "register_operand" "")
4915 (fix:DI (match_operand:DFP 1 "nonimmediate_operand" "")))]
4916 "TARGET_ZARCH && TARGET_HARD_DFP"
4918 operands[1] = force_reg (<MODE>mode, operands[1]);
4919 emit_insn (gen_fix_trunc<mode>di2_dfp (operands[0], operands[1],
4920 GEN_INT (DFP_RND_TOWARD_0)));
4925 (define_insn "fix_trunc<DFP:mode>di2_dfp"
4926 [(set (match_operand:DI 0 "register_operand" "=d")
4927 (fix:DI (match_operand:DFP 1 "register_operand" "f")))
4928 (unspec:DI [(match_operand:DI 2 "immediate_operand" "K")] UNSPEC_ROUND)
4929 (clobber (reg:CC CC_REGNUM))]
4930 "TARGET_ZARCH && TARGET_HARD_DFP"
4931 "cg<DFP:xde>tr\t%0,%h2,%1"
4932 [(set_attr "op_type" "RRF")
4933 (set_attr "type" "ftoidfp")])
4937 ; fix_trunctf(si|di)2 instruction pattern(s).
4940 (define_expand "fix_trunctf<mode>2"
4941 [(parallel [(set (match_operand:GPR 0 "register_operand" "")
4942 (fix:GPR (match_operand:TF 1 "register_operand" "")))
4943 (unspec:GPR [(const_int BFP_RND_TOWARD_0)] UNSPEC_ROUND)
4944 (clobber (reg:CC CC_REGNUM))])]
4950 ; float(si|di)(tf|df|sf|td|dd)2 instruction pattern(s).
4953 ; cxgbr, cdgbr, cegbr, cxgtr, cdgtr
4954 (define_insn "floatdi<mode>2"
4955 [(set (match_operand:FP 0 "register_operand" "=f,v")
4956 (float:FP (match_operand:DI 1 "register_operand" "d,v")))]
4957 "TARGET_ZARCH && TARGET_HARD_FLOAT"
4961 [(set_attr "op_type" "RRE,VRR")
4962 (set_attr "type" "itof<mode>" )
4963 (set_attr "cpu_facility" "*,vec")
4964 (set_attr "enabled" "*,<DFDI>")])
4966 ; cxfbr, cdfbr, cefbr
4967 (define_insn "floatsi<mode>2"
4968 [(set (match_operand:BFP 0 "register_operand" "=f")
4969 (float:BFP (match_operand:SI 1 "register_operand" "d")))]
4972 [(set_attr "op_type" "RRE")
4973 (set_attr "type" "itof<mode>" )])
4976 (define_insn "floatsi<mode>2"
4977 [(set (match_operand:DFP 0 "register_operand" "=f")
4978 (float:DFP (match_operand:SI 1 "register_operand" "d")))]
4979 "TARGET_Z196 && TARGET_HARD_FLOAT"
4980 "c<xde>ftr\t%0,0,%1,0"
4981 [(set_attr "op_type" "RRE")
4982 (set_attr "type" "itof<mode>" )])
4985 ; floatuns(si|di)(tf|df|sf|td|dd)2 instruction pattern(s).
4988 (define_insn "*floatunsdidf2_z13"
4989 [(set (match_operand:DF 0 "register_operand" "=f,v")
4990 (unsigned_float:DF (match_operand:DI 1 "register_operand" "d,v")))]
4991 "TARGET_VX && TARGET_HARD_FLOAT"
4994 wcdlgb\t%v0,%v1,0,0"
4995 [(set_attr "op_type" "RRE,VRR")
4996 (set_attr "type" "itofdf")])
4998 ; cxlgbr, cdlgbr, celgbr, cxlgtr, cdlgtr
4999 ; cxlfbr, cdlfbr, celfbr, cxlftr, cdlftr
5000 (define_insn "*floatuns<GPR:mode><FP:mode>2"
5001 [(set (match_operand:FP 0 "register_operand" "=f")
5002 (unsigned_float:FP (match_operand:GPR 1 "register_operand" "d")))]
5003 "TARGET_Z196 && TARGET_HARD_FLOAT
5004 && (!TARGET_VX || <FP:MODE>mode != DFmode || <GPR:MODE>mode != DImode)"
5005 "c<FP:xde>l<GPR:gf><FP:bt>r\t%0,0,%1,0"
5006 [(set_attr "op_type" "RRE")
5007 (set_attr "type" "itof<FP:mode>")])
5009 (define_expand "floatuns<GPR:mode><FP:mode>2"
5010 [(set (match_operand:FP 0 "register_operand" "")
5011 (unsigned_float:FP (match_operand:GPR 1 "register_operand" "")))]
5012 "TARGET_Z196 && TARGET_HARD_FLOAT")
5015 ; truncdfsf2 instruction pattern(s).
5018 (define_insn "truncdfsf2"
5019 [(set (match_operand:SF 0 "register_operand" "=f,v")
5020 (float_truncate:SF (match_operand:DF 1 "register_operand" "f,v")))]
5024 wledb\t%v0,%v1,0,0" ; IEEE inexact exception not suppressed
5025 ; According to BFP rounding mode
5026 [(set_attr "op_type" "RRE,VRR")
5027 (set_attr "type" "ftruncdf")
5028 (set_attr "cpu_facility" "*,vec")])
5031 ; trunctf(df|sf)2 instruction pattern(s).
5035 (define_insn "trunctf<mode>2"
5036 [(set (match_operand:DSF 0 "register_operand" "=f")
5037 (float_truncate:DSF (match_operand:TF 1 "register_operand" "f")))
5038 (clobber (match_scratch:TF 2 "=f"))]
5040 "l<xde>xbr\t%2,%1\;l<xde>r\t%0,%2"
5041 [(set_attr "length" "6")
5042 (set_attr "type" "ftrunctf")])
5045 ; trunctddd2 and truncddsd2 instruction pattern(s).
5049 (define_expand "trunctddd2"
5051 [(set (match_operand:DD 0 "register_operand" "")
5052 (float_truncate:DD (match_operand:TD 1 "register_operand" "")))
5053 (unspec:DI [(const_int DFP_RND_CURRENT)] UNSPEC_ROUND)
5054 (clobber (scratch:TD))])]
5057 (define_insn "*trunctddd2"
5058 [(set (match_operand:DD 0 "register_operand" "=f")
5059 (float_truncate:DD (match_operand:TD 1 "register_operand" "f")))
5060 (unspec:DI [(match_operand:DI 2 "const_mask_operand" "I")] UNSPEC_ROUND)
5061 (clobber (match_scratch:TD 3 "=f"))]
5063 "ldxtr\t%3,%2,%1,0\;ldr\t%0,%3"
5064 [(set_attr "length" "6")
5065 (set_attr "type" "ftruncdd")])
5067 (define_insn "truncddsd2"
5068 [(set (match_operand:SD 0 "register_operand" "=f")
5069 (float_truncate:SD (match_operand:DD 1 "register_operand" "f")))]
5072 [(set_attr "op_type" "RRF")
5073 (set_attr "type" "ftruncsd")])
5075 (define_expand "trunctdsd2"
5078 (float_truncate:DD (match_operand:TD 1 "register_operand" "")))
5079 (unspec:DI [(const_int DFP_RND_PREP_FOR_SHORT_PREC)] UNSPEC_ROUND)
5080 (clobber (match_scratch:TD 2 ""))])
5081 (set (match_operand:SD 0 "register_operand" "")
5082 (float_truncate:SD (match_dup 3)))]
5085 operands[3] = gen_reg_rtx (DDmode);
5089 ; extend(sf|df)(df|tf)2 instruction pattern(s).
5092 (define_insn "*extendsfdf2_z13"
5093 [(set (match_operand:DF 0 "register_operand" "=f,f,v")
5094 (float_extend:DF (match_operand:SF 1 "nonimmediate_operand" "f,R,v")))]
5095 "TARGET_VX && TARGET_HARD_FLOAT"
5100 [(set_attr "op_type" "RRE,RXE,VRR")
5101 (set_attr "type" "fsimpdf, floaddf,fsimpdf")])
5103 ; ldebr, ldeb, lxdbr, lxdb, lxebr, lxeb
5104 (define_insn "*extend<DSF:mode><BFP:mode>2"
5105 [(set (match_operand:BFP 0 "register_operand" "=f,f")
5106 (float_extend:BFP (match_operand:DSF 1 "nonimmediate_operand" "f,R")))]
5108 && GET_MODE_SIZE (<BFP:MODE>mode) > GET_MODE_SIZE (<DSF:MODE>mode)
5109 && (!TARGET_VX || <BFP:MODE>mode != DFmode || <DSF:MODE>mode != SFmode)"
5111 l<BFP:xde><DSF:xde>br\t%0,%1
5112 l<BFP:xde><DSF:xde>b\t%0,%1"
5113 [(set_attr "op_type" "RRE,RXE")
5114 (set_attr "type" "fsimp<BFP:mode>, fload<BFP:mode>")])
5116 (define_expand "extend<DSF:mode><BFP:mode>2"
5117 [(set (match_operand:BFP 0 "register_operand" "")
5118 (float_extend:BFP (match_operand:DSF 1 "nonimmediate_operand" "")))]
5120 && GET_MODE_SIZE (<BFP:MODE>mode) > GET_MODE_SIZE (<DSF:MODE>mode)")
5123 ; extendddtd2 and extendsddd2 instruction pattern(s).
5126 (define_insn "extendddtd2"
5127 [(set (match_operand:TD 0 "register_operand" "=f")
5128 (float_extend:TD (match_operand:DD 1 "register_operand" "f")))]
5131 [(set_attr "op_type" "RRF")
5132 (set_attr "type" "fsimptf")])
5134 (define_insn "extendsddd2"
5135 [(set (match_operand:DD 0 "register_operand" "=f")
5136 (float_extend:DD (match_operand:SD 1 "register_operand" "f")))]
5139 [(set_attr "op_type" "RRF")
5140 (set_attr "type" "fsimptf")])
5142 (define_expand "extendsdtd2"
5144 (float_extend:DD (match_operand:SD 1 "register_operand" "")))
5145 (set (match_operand:TD 0 "register_operand" "")
5146 (float_extend:TD (match_dup 2)))]
5149 operands[2] = gen_reg_rtx (DDmode);
5152 ; Binary Floating Point - load fp integer
5154 ; Expanders for: floor, btrunc, round, ceil, and nearbyint
5155 ; For all of them the inexact exceptions are suppressed.
5157 ; fiebra, fidbra, fixbra
5158 (define_insn "<FPINT:fpint_name><BFP:mode>2"
5159 [(set (match_operand:BFP 0 "register_operand" "=f")
5160 (unspec:BFP [(match_operand:BFP 1 "register_operand" "f")]
5163 "fi<BFP:xde>bra\t%0,<FPINT:fpint_roundingmode>,%1,4"
5164 [(set_attr "op_type" "RRF")
5165 (set_attr "type" "fsimp<BFP:mode>")])
5167 ; rint is supposed to raise an inexact exception so we can use the
5168 ; older instructions.
5170 ; fiebr, fidbr, fixbr
5171 (define_insn "rint<BFP:mode>2"
5172 [(set (match_operand:BFP 0 "register_operand" "=f")
5173 (unspec:BFP [(match_operand:BFP 1 "register_operand" "f")]
5174 UNSPEC_FPINT_RINT))]
5176 "fi<BFP:xde>br\t%0,0,%1"
5177 [(set_attr "op_type" "RRF")
5178 (set_attr "type" "fsimp<BFP:mode>")])
5181 ; Decimal Floating Point - load fp integer
5184 (define_insn "<FPINT:fpint_name><DFP:mode>2"
5185 [(set (match_operand:DFP 0 "register_operand" "=f")
5186 (unspec:DFP [(match_operand:DFP 1 "register_operand" "f")]
5189 "fi<DFP:xde>tr\t%0,<FPINT:fpint_roundingmode>,%1,4"
5190 [(set_attr "op_type" "RRF")
5191 (set_attr "type" "fsimp<DFP:mode>")])
5194 (define_insn "rint<DFP:mode>2"
5195 [(set (match_operand:DFP 0 "register_operand" "=f")
5196 (unspec:DFP [(match_operand:DFP 1 "register_operand" "f")]
5197 UNSPEC_FPINT_RINT))]
5199 "fi<DFP:xde>tr\t%0,0,%1,0"
5200 [(set_attr "op_type" "RRF")
5201 (set_attr "type" "fsimp<DFP:mode>")])
5204 ; Binary <-> Decimal floating point trunc patterns
5207 (define_insn "*trunc<BFP:mode><DFP_ALL:mode>2"
5208 [(set (reg:DFP_ALL FPR0_REGNUM)
5209 (float_truncate:DFP_ALL (reg:BFP FPR4_REGNUM)))
5210 (use (reg:SI GPR0_REGNUM))
5211 (clobber (reg:CC CC_REGNUM))
5212 (clobber (reg:SI GPR1_REGNUM))]
5216 (define_insn "*trunc<DFP_ALL:mode><BFP:mode>2"
5217 [(set (reg:BFP FPR0_REGNUM)
5218 (float_truncate:BFP (reg:DFP_ALL FPR4_REGNUM)))
5219 (use (reg:SI GPR0_REGNUM))
5220 (clobber (reg:CC CC_REGNUM))
5221 (clobber (reg:SI GPR1_REGNUM))]
5225 (define_expand "trunc<BFP:mode><DFP_ALL:mode>2"
5226 [(set (reg:BFP FPR4_REGNUM) (match_operand:BFP 1 "nonimmediate_operand" ""))
5227 (set (reg:SI GPR0_REGNUM) (match_dup 2))
5229 [(set (reg:DFP_ALL FPR0_REGNUM)
5230 (float_truncate:DFP_ALL (reg:BFP FPR4_REGNUM)))
5231 (use (reg:SI GPR0_REGNUM))
5232 (clobber (reg:CC CC_REGNUM))
5233 (clobber (reg:SI GPR1_REGNUM))])
5234 (set (match_operand:DFP_ALL 0 "nonimmediate_operand" "")
5235 (reg:DFP_ALL FPR0_REGNUM))]
5237 && GET_MODE_SIZE (<BFP:MODE>mode) > GET_MODE_SIZE (<DFP_ALL:MODE>mode)"
5239 HOST_WIDE_INT flags;
5241 flags = (PFPO_CONVERT |
5242 PFPO_OP_TYPE_<DFP_ALL:MODE> << PFPO_OP0_TYPE_SHIFT |
5243 PFPO_OP_TYPE_<BFP:MODE> << PFPO_OP1_TYPE_SHIFT);
5245 operands[2] = GEN_INT (flags);
5248 (define_expand "trunc<DFP_ALL:mode><BFP:mode>2"
5249 [(set (reg:DFP_ALL FPR4_REGNUM)
5250 (match_operand:DFP_ALL 1 "nonimmediate_operand" ""))
5251 (set (reg:SI GPR0_REGNUM) (match_dup 2))
5253 [(set (reg:BFP FPR0_REGNUM) (float_truncate:BFP (reg:DFP_ALL FPR4_REGNUM)))
5254 (use (reg:SI GPR0_REGNUM))
5255 (clobber (reg:CC CC_REGNUM))
5256 (clobber (reg:SI GPR1_REGNUM))])
5257 (set (match_operand:BFP 0 "nonimmediate_operand" "") (reg:BFP FPR0_REGNUM))]
5259 && GET_MODE_SIZE (<DFP_ALL:MODE>mode) >= GET_MODE_SIZE (<BFP:MODE>mode)"
5261 HOST_WIDE_INT flags;
5263 flags = (PFPO_CONVERT |
5264 PFPO_OP_TYPE_<BFP:MODE> << PFPO_OP0_TYPE_SHIFT |
5265 PFPO_OP_TYPE_<DFP_ALL:MODE> << PFPO_OP1_TYPE_SHIFT);
5267 operands[2] = GEN_INT (flags);
5271 ; Binary <-> Decimal floating point extend patterns
5274 (define_insn "*extend<BFP:mode><DFP_ALL:mode>2"
5275 [(set (reg:DFP_ALL FPR0_REGNUM) (float_extend:DFP_ALL (reg:BFP FPR4_REGNUM)))
5276 (use (reg:SI GPR0_REGNUM))
5277 (clobber (reg:CC CC_REGNUM))
5278 (clobber (reg:SI GPR1_REGNUM))]
5282 (define_insn "*extend<DFP_ALL:mode><BFP:mode>2"
5283 [(set (reg:BFP FPR0_REGNUM) (float_extend:BFP (reg:DFP_ALL FPR4_REGNUM)))
5284 (use (reg:SI GPR0_REGNUM))
5285 (clobber (reg:CC CC_REGNUM))
5286 (clobber (reg:SI GPR1_REGNUM))]
5290 (define_expand "extend<BFP:mode><DFP_ALL:mode>2"
5291 [(set (reg:BFP FPR4_REGNUM) (match_operand:BFP 1 "nonimmediate_operand" ""))
5292 (set (reg:SI GPR0_REGNUM) (match_dup 2))
5294 [(set (reg:DFP_ALL FPR0_REGNUM)
5295 (float_extend:DFP_ALL (reg:BFP FPR4_REGNUM)))
5296 (use (reg:SI GPR0_REGNUM))
5297 (clobber (reg:CC CC_REGNUM))
5298 (clobber (reg:SI GPR1_REGNUM))])
5299 (set (match_operand:DFP_ALL 0 "nonimmediate_operand" "")
5300 (reg:DFP_ALL FPR0_REGNUM))]
5302 && GET_MODE_SIZE (<BFP:MODE>mode) <= GET_MODE_SIZE (<DFP_ALL:MODE>mode)"
5304 HOST_WIDE_INT flags;
5306 flags = (PFPO_CONVERT |
5307 PFPO_OP_TYPE_<DFP_ALL:MODE> << PFPO_OP0_TYPE_SHIFT |
5308 PFPO_OP_TYPE_<BFP:MODE> << PFPO_OP1_TYPE_SHIFT);
5310 operands[2] = GEN_INT (flags);
5313 (define_expand "extend<DFP_ALL:mode><BFP:mode>2"
5314 [(set (reg:DFP_ALL FPR4_REGNUM)
5315 (match_operand:DFP_ALL 1 "nonimmediate_operand" ""))
5316 (set (reg:SI GPR0_REGNUM) (match_dup 2))
5318 [(set (reg:BFP FPR0_REGNUM) (float_extend:BFP (reg:DFP_ALL FPR4_REGNUM)))
5319 (use (reg:SI GPR0_REGNUM))
5320 (clobber (reg:CC CC_REGNUM))
5321 (clobber (reg:SI GPR1_REGNUM))])
5322 (set (match_operand:BFP 0 "nonimmediate_operand" "") (reg:BFP FPR0_REGNUM))]
5324 && GET_MODE_SIZE (<DFP_ALL:MODE>mode) < GET_MODE_SIZE (<BFP:MODE>mode)"
5326 HOST_WIDE_INT flags;
5328 flags = (PFPO_CONVERT |
5329 PFPO_OP_TYPE_<BFP:MODE> << PFPO_OP0_TYPE_SHIFT |
5330 PFPO_OP_TYPE_<DFP_ALL:MODE> << PFPO_OP1_TYPE_SHIFT);
5332 operands[2] = GEN_INT (flags);
5337 ;; ARITHMETIC OPERATIONS
5339 ; arithmetic operations set the ConditionCode,
5340 ; because of unpredictable Bits in Register for Halfword and Byte
5341 ; the ConditionCode can be set wrong in operations for Halfword and Byte
5344 ;;- Add instructions.
5348 ; addti3 instruction pattern(s).
5351 (define_expand "addti3"
5353 [(set (match_operand:TI 0 "register_operand" "")
5354 (plus:TI (match_operand:TI 1 "nonimmediate_operand" "")
5355 (match_operand:TI 2 "general_operand" "") ) )
5356 (clobber (reg:CC CC_REGNUM))])]
5359 /* For z13 we have vaq which doesn't set CC. */
5362 emit_insn (gen_rtx_SET (operands[0],
5363 gen_rtx_PLUS (TImode,
5364 copy_to_mode_reg (TImode, operands[1]),
5365 copy_to_mode_reg (TImode, operands[2]))));
5370 (define_insn_and_split "*addti3"
5371 [(set (match_operand:TI 0 "register_operand" "=&d")
5372 (plus:TI (match_operand:TI 1 "nonimmediate_operand" "%0")
5373 (match_operand:TI 2 "general_operand" "do") ) )
5374 (clobber (reg:CC CC_REGNUM))]
5377 "&& reload_completed"
5379 [(set (reg:CCL1 CC_REGNUM)
5380 (compare:CCL1 (plus:DI (match_dup 7) (match_dup 8))
5382 (set (match_dup 6) (plus:DI (match_dup 7) (match_dup 8)))])
5384 [(set (match_dup 3) (plus:DI
5385 (plus:DI (ltu:DI (reg:CCL1 CC_REGNUM) (const_int 0))
5386 (match_dup 4)) (match_dup 5)))
5387 (clobber (reg:CC CC_REGNUM))])]
5388 "operands[3] = operand_subword (operands[0], 0, 0, TImode);
5389 operands[4] = operand_subword (operands[1], 0, 0, TImode);
5390 operands[5] = operand_subword (operands[2], 0, 0, TImode);
5391 operands[6] = operand_subword (operands[0], 1, 0, TImode);
5392 operands[7] = operand_subword (operands[1], 1, 0, TImode);
5393 operands[8] = operand_subword (operands[2], 1, 0, TImode);"
5394 [(set_attr "op_type" "*")
5395 (set_attr "cpu_facility" "*")])
5398 ; adddi3 instruction pattern(s).
5401 (define_expand "adddi3"
5403 [(set (match_operand:DI 0 "nonimmediate_operand" "")
5404 (plus:DI (match_operand:DI 1 "nonimmediate_operand" "")
5405 (match_operand:DI 2 "general_operand" "")))
5406 (clobber (reg:CC CC_REGNUM))])]
5410 (define_insn "*adddi3_sign"
5411 [(set (match_operand:DI 0 "register_operand" "=d,d")
5412 (plus:DI (sign_extend:DI (match_operand:SI 2 "general_operand" "d,T"))
5413 (match_operand:DI 1 "register_operand" "0,0")))
5414 (clobber (reg:CC CC_REGNUM))]
5419 [(set_attr "op_type" "RRE,RXY")
5420 (set_attr "z196prop" "z196_cracked,z196_cracked")])
5422 (define_insn "*adddi3_zero_cc"
5423 [(set (reg CC_REGNUM)
5424 (compare (plus:DI (zero_extend:DI (match_operand:SI 2 "general_operand" "d,T"))
5425 (match_operand:DI 1 "register_operand" "0,0"))
5427 (set (match_operand:DI 0 "register_operand" "=d,d")
5428 (plus:DI (zero_extend:DI (match_dup 2)) (match_dup 1)))]
5429 "s390_match_ccmode (insn, CCLmode) && TARGET_ZARCH"
5433 [(set_attr "op_type" "RRE,RXY")
5434 (set_attr "z10prop" "z10_super_E1,z10_super_E1")])
5436 (define_insn "*adddi3_zero_cconly"
5437 [(set (reg CC_REGNUM)
5438 (compare (plus:DI (zero_extend:DI (match_operand:SI 2 "general_operand" "d,T"))
5439 (match_operand:DI 1 "register_operand" "0,0"))
5441 (clobber (match_scratch:DI 0 "=d,d"))]
5442 "s390_match_ccmode (insn, CCLmode) && TARGET_ZARCH"
5446 [(set_attr "op_type" "RRE,RXY")
5447 (set_attr "z10prop" "z10_super_E1,z10_super_E1")])
5449 (define_insn "*adddi3_zero"
5450 [(set (match_operand:DI 0 "register_operand" "=d,d")
5451 (plus:DI (zero_extend:DI (match_operand:SI 2 "general_operand" "d,T"))
5452 (match_operand:DI 1 "register_operand" "0,0")))
5453 (clobber (reg:CC CC_REGNUM))]
5458 [(set_attr "op_type" "RRE,RXY")
5459 (set_attr "z10prop" "z10_super_E1,z10_super_E1")])
5461 (define_insn_and_split "*adddi3_31z"
5462 [(set (match_operand:DI 0 "nonimmediate_operand" "=&d")
5463 (plus:DI (match_operand:DI 1 "nonimmediate_operand" "%0")
5464 (match_operand:DI 2 "general_operand" "do") ) )
5465 (clobber (reg:CC CC_REGNUM))]
5466 "!TARGET_ZARCH && TARGET_CPU_ZARCH"
5468 "&& reload_completed"
5470 [(set (reg:CCL1 CC_REGNUM)
5471 (compare:CCL1 (plus:SI (match_dup 7) (match_dup 8))
5473 (set (match_dup 6) (plus:SI (match_dup 7) (match_dup 8)))])
5475 [(set (match_dup 3) (plus:SI
5476 (plus:SI (ltu:SI (reg:CCL1 CC_REGNUM) (const_int 0))
5477 (match_dup 4)) (match_dup 5)))
5478 (clobber (reg:CC CC_REGNUM))])]
5479 "operands[3] = operand_subword (operands[0], 0, 0, DImode);
5480 operands[4] = operand_subword (operands[1], 0, 0, DImode);
5481 operands[5] = operand_subword (operands[2], 0, 0, DImode);
5482 operands[6] = operand_subword (operands[0], 1, 0, DImode);
5483 operands[7] = operand_subword (operands[1], 1, 0, DImode);
5484 operands[8] = operand_subword (operands[2], 1, 0, DImode);")
5486 (define_insn_and_split "*adddi3_31"
5487 [(set (match_operand:DI 0 "nonimmediate_operand" "=&d")
5488 (plus:DI (match_operand:DI 1 "nonimmediate_operand" "%0")
5489 (match_operand:DI 2 "general_operand" "do") ) )
5490 (clobber (reg:CC CC_REGNUM))]
5493 "&& reload_completed"
5495 [(set (match_dup 3) (plus:SI (match_dup 4) (match_dup 5)))
5496 (clobber (reg:CC CC_REGNUM))])
5498 [(set (reg:CCL1 CC_REGNUM)
5499 (compare:CCL1 (plus:SI (match_dup 7) (match_dup 8))
5501 (set (match_dup 6) (plus:SI (match_dup 7) (match_dup 8)))])
5503 (if_then_else (ltu (reg:CCL1 CC_REGNUM) (const_int 0))
5505 (label_ref (match_dup 9))))
5507 [(set (match_dup 3) (plus:SI (match_dup 3) (const_int 1)))
5508 (clobber (reg:CC CC_REGNUM))])
5510 "operands[3] = operand_subword (operands[0], 0, 0, DImode);
5511 operands[4] = operand_subword (operands[1], 0, 0, DImode);
5512 operands[5] = operand_subword (operands[2], 0, 0, DImode);
5513 operands[6] = operand_subword (operands[0], 1, 0, DImode);
5514 operands[7] = operand_subword (operands[1], 1, 0, DImode);
5515 operands[8] = operand_subword (operands[2], 1, 0, DImode);
5516 operands[9] = gen_label_rtx ();")
5519 ; addsi3 instruction pattern(s).
5522 (define_expand "addsi3"
5524 [(set (match_operand:SI 0 "nonimmediate_operand" "")
5525 (plus:SI (match_operand:SI 1 "nonimmediate_operand" "")
5526 (match_operand:SI 2 "general_operand" "")))
5527 (clobber (reg:CC CC_REGNUM))])]
5531 (define_insn "*addsi3_sign"
5532 [(set (match_operand:SI 0 "register_operand" "=d,d")
5533 (plus:SI (sign_extend:SI (match_operand:HI 2 "memory_operand" "R,T"))
5534 (match_operand:SI 1 "register_operand" "0,0")))
5535 (clobber (reg:CC CC_REGNUM))]
5540 [(set_attr "op_type" "RX,RXY")
5541 (set_attr "cpu_facility" "*,longdisp")
5542 (set_attr "z196prop" "z196_cracked,z196_cracked")])
5545 ; add(di|si)3 instruction pattern(s).
5548 ; ark, agrk, ar, ahi, ahik, aghik, alfi, slfi, a, ay, agr, aghi, algfi, slgfi, ag, asi, agsi
5549 (define_insn "*add<mode>3"
5550 [(set (match_operand:GPR 0 "nonimmediate_operand" "=d,d,d,d, d, d,d,d,S")
5551 (plus:GPR (match_operand:GPR 1 "nonimmediate_operand" "%0,d,0,d, 0, 0,0,0,0")
5552 (match_operand:GPR 2 "general_operand" " d,d,K,K,Op,On,R,T,C") ) )
5553 (clobber (reg:CC CC_REGNUM))]
5565 [(set_attr "op_type" "RR<E>,RRF,RI,RIE,RIL,RIL,RX<Y>,RXY,SIY")
5566 (set_attr "cpu_facility" "*,z196,*,z196,extimm,extimm,*,longdisp,z10")
5567 (set_attr "z10prop" "z10_super_E1,*,z10_super_E1,*,z10_super_E1,z10_super_E1,
5568 z10_super_E1,z10_super_E1,z10_super_E1")])
5570 ; alr, alfi, slfi, al, aly, alrk, alhsik, algr, algfi, slgfi, alg, alsi, algsi, algrk, alghsik
5571 (define_insn "*add<mode>3_carry1_cc"
5572 [(set (reg CC_REGNUM)
5573 (compare (plus:GPR (match_operand:GPR 1 "nonimmediate_operand" "%0,d, 0, 0,d,0,0,0")
5574 (match_operand:GPR 2 "general_operand" " d,d,Op,On,K,R,T,C"))
5576 (set (match_operand:GPR 0 "nonimmediate_operand" "=d,d, d, d,d,d,d,d")
5577 (plus:GPR (match_dup 1) (match_dup 2)))]
5578 "s390_match_ccmode (insn, CCL1mode)"
5584 al<g>hsik\t%0,%1,%h2
5588 [(set_attr "op_type" "RR<E>,RRF,RIL,RIL,RIE,RX<Y>,RXY,SIY")
5589 (set_attr "cpu_facility" "*,z196,extimm,extimm,z196,*,longdisp,z10")
5590 (set_attr "z10prop" "z10_super_E1,*,z10_super_E1,z10_super_E1,*,
5591 z10_super_E1,z10_super_E1,z10_super_E1")])
5593 ; alr, al, aly, algr, alg, alrk, algrk
5594 (define_insn "*add<mode>3_carry1_cconly"
5595 [(set (reg CC_REGNUM)
5596 (compare (plus:GPR (match_operand:GPR 1 "nonimmediate_operand" "%0,d,0,0")
5597 (match_operand:GPR 2 "general_operand" "d,d,R,T"))
5599 (clobber (match_scratch:GPR 0 "=d,d,d,d"))]
5600 "s390_match_ccmode (insn, CCL1mode)"
5606 [(set_attr "op_type" "RR<E>,RRF,RX<Y>,RXY")
5607 (set_attr "cpu_facility" "*,z196,*,longdisp")
5608 (set_attr "z10prop" "z10_super_E1,*,z10_super_E1,z10_super_E1")])
5610 ; alr, alfi, slfi, al, aly, algr, algfi, slgfi, alg, alsi, algsi, alrk, algrk, alhsik, alghsik
5611 (define_insn "*add<mode>3_carry2_cc"
5612 [(set (reg CC_REGNUM)
5613 (compare (plus:GPR (match_operand:GPR 1 "nonimmediate_operand" "%0,d, 0, 0,d,0,0,0")
5614 (match_operand:GPR 2 "general_operand" " d,d,Op,On,K,R,T,C"))
5616 (set (match_operand:GPR 0 "nonimmediate_operand" "=d,d, d, d,d,d,d,S")
5617 (plus:GPR (match_dup 1) (match_dup 2)))]
5618 "s390_match_ccmode (insn, CCL1mode)"
5624 al<g>hsik\t%0,%1,%h2
5628 [(set_attr "op_type" "RR<E>,RRF,RIL,RIL,RIE,RX<Y>,RXY,SIY")
5629 (set_attr "cpu_facility" "*,z196,extimm,extimm,z196,*,longdisp,z10")
5630 (set_attr "z10prop" "z10_super_E1,*,z10_super_E1,z10_super_E1,*,
5631 z10_super_E1,z10_super_E1,z10_super_E1")])
5633 ; alr, al, aly, algr, alg, alrk, algrk
5634 (define_insn "*add<mode>3_carry2_cconly"
5635 [(set (reg CC_REGNUM)
5636 (compare (plus:GPR (match_operand:GPR 1 "nonimmediate_operand" "%0,d,0,0")
5637 (match_operand:GPR 2 "general_operand" "d,d,R,T"))
5639 (clobber (match_scratch:GPR 0 "=d,d,d,d"))]
5640 "s390_match_ccmode (insn, CCL1mode)"
5646 [(set_attr "op_type" "RR<E>,RRF,RX<Y>,RXY")
5647 (set_attr "cpu_facility" "*,z196,*,longdisp")
5648 (set_attr "z10prop" "z10_super_E1,*,z10_super_E1,z10_super_E1")])
5650 ; alr, alfi, slfi, al, aly, algr, algfi, slgfi, alg, alsi, algsi, alrk, algrk, alhsik, alghsik
5651 (define_insn "*add<mode>3_cc"
5652 [(set (reg CC_REGNUM)
5653 (compare (plus:GPR (match_operand:GPR 1 "nonimmediate_operand" "%0,d, 0, 0,d,0,0,0")
5654 (match_operand:GPR 2 "general_operand" " d,d,Op,On,K,R,T,C"))
5656 (set (match_operand:GPR 0 "nonimmediate_operand" "=d,d, d, d,d,d,d,S")
5657 (plus:GPR (match_dup 1) (match_dup 2)))]
5658 "s390_match_ccmode (insn, CCLmode)"
5664 al<g>hsik\t%0,%1,%h2
5668 [(set_attr "op_type" "RR<E>,RRF,RIL,RIL,RIE,RX<Y>,RXY,SIY")
5669 (set_attr "cpu_facility" "*,z196,extimm,extimm,z196,*,longdisp,z10")
5670 (set_attr "z10prop" "z10_super_E1,*,z10_super_E1,z10_super_E1,
5671 *,z10_super_E1,z10_super_E1,z10_super_E1")])
5673 ; alr, al, aly, algr, alg, alrk, algrk
5674 (define_insn "*add<mode>3_cconly"
5675 [(set (reg CC_REGNUM)
5676 (compare (plus:GPR (match_operand:GPR 1 "nonimmediate_operand" "%0,d,0,0")
5677 (match_operand:GPR 2 "general_operand" "d,d,R,T"))
5679 (clobber (match_scratch:GPR 0 "=d,d,d,d"))]
5680 "s390_match_ccmode (insn, CCLmode)"
5686 [(set_attr "op_type" "RR<E>,RRF,RX<Y>,RXY")
5687 (set_attr "cpu_facility" "*,z196,*,longdisp")
5688 (set_attr "z10prop" "z10_super_E1,*,z10_super_E1,z10_super_E1")])
5690 ; alr, al, aly, algr, alg, alrk, algrk
5691 (define_insn "*add<mode>3_cconly2"
5692 [(set (reg CC_REGNUM)
5693 (compare (match_operand:GPR 1 "nonimmediate_operand" "%0,d,0,0")
5694 (neg:GPR (match_operand:GPR 2 "general_operand" "d,d,R,T"))))
5695 (clobber (match_scratch:GPR 0 "=d,d,d,d"))]
5696 "s390_match_ccmode(insn, CCLmode)"
5702 [(set_attr "op_type" "RR<E>,RRF,RX<Y>,RXY")
5703 (set_attr "cpu_facility" "*,z196,*,longdisp")
5704 (set_attr "z10prop" "z10_super_E1,*,z10_super_E1,z10_super_E1")])
5706 ; ahi, afi, aghi, agfi, asi, agsi
5707 (define_insn "*add<mode>3_imm_cc"
5708 [(set (reg CC_REGNUM)
5709 (compare (plus:GPR (match_operand:GPR 1 "nonimmediate_operand" " 0, d,0, 0")
5710 (match_operand:GPR 2 "const_int_operand" " K, K,Os,C"))
5712 (set (match_operand:GPR 0 "nonimmediate_operand" "=d, d,d, S")
5713 (plus:GPR (match_dup 1) (match_dup 2)))]
5714 "s390_match_ccmode (insn, CCAmode)
5715 && (CONST_OK_FOR_CONSTRAINT_P (INTVAL (operands[2]), 'K', \"K\")
5716 || (CONST_OK_FOR_CONSTRAINT_P (INTVAL (operands[2]), 'O', \"Os\")
5717 /* Avoid INT32_MIN on 32 bit. */
5718 && (!TARGET_ZARCH || INTVAL (operands[2]) != -0x7fffffff - 1)))"
5724 [(set_attr "op_type" "RI,RIE,RIL,SIY")
5725 (set_attr "cpu_facility" "*,z196,extimm,z10")
5726 (set_attr "z10prop" "z10_super_E1,*,z10_super_E1,z10_super_E1")])
5729 ; add(tf|df|sf|td|dd)3 instruction pattern(s).
5732 ; axbr, adbr, aebr, axb, adb, aeb, adtr, axtr
5733 ; FIXME: wfadb does not clobber cc
5734 (define_insn "add<mode>3"
5735 [(set (match_operand:FP 0 "register_operand" "=f,f,f,v")
5736 (plus:FP (match_operand:FP 1 "nonimmediate_operand" "%f,0,0,v")
5737 (match_operand:FP 2 "general_operand" "f,f,R,v")))
5738 (clobber (reg:CC CC_REGNUM))]
5745 [(set_attr "op_type" "RRF,RRE,RXE,VRR")
5746 (set_attr "type" "fsimp<mode>")
5747 (set_attr "cpu_facility" "*,*,*,vec")
5748 (set_attr "enabled" "<nBFP>,<nDFP>,<DSF>,<DFDI>")])
5750 ; axbr, adbr, aebr, axb, adb, aeb, adtr, axtr
5751 (define_insn "*add<mode>3_cc"
5752 [(set (reg CC_REGNUM)
5753 (compare (plus:FP (match_operand:FP 1 "nonimmediate_operand" "%f,0,0")
5754 (match_operand:FP 2 "general_operand" "f,f,R"))
5755 (match_operand:FP 3 "const0_operand" "")))
5756 (set (match_operand:FP 0 "register_operand" "=f,f,f")
5757 (plus:FP (match_dup 1) (match_dup 2)))]
5758 "s390_match_ccmode (insn, CCSmode) && TARGET_HARD_FLOAT"
5763 [(set_attr "op_type" "RRF,RRE,RXE")
5764 (set_attr "type" "fsimp<mode>")
5765 (set_attr "enabled" "<nBFP>,<nDFP>,<DSF>")])
5767 ; axbr, adbr, aebr, axb, adb, aeb, adtr, axtr
5768 (define_insn "*add<mode>3_cconly"
5769 [(set (reg CC_REGNUM)
5770 (compare (plus:FP (match_operand:FP 1 "nonimmediate_operand" "%f,0,0")
5771 (match_operand:FP 2 "general_operand" "f,f,R"))
5772 (match_operand:FP 3 "const0_operand" "")))
5773 (clobber (match_scratch:FP 0 "=f,f,f"))]
5774 "s390_match_ccmode (insn, CCSmode) && TARGET_HARD_FLOAT"
5779 [(set_attr "op_type" "RRF,RRE,RXE")
5780 (set_attr "type" "fsimp<mode>")
5781 (set_attr "enabled" "<nBFP>,<nDFP>,<DSF>")])
5784 ; Pointer add instruction patterns
5787 ; This will match "*la_64"
5788 (define_expand "addptrdi3"
5789 [(set (match_operand:DI 0 "register_operand" "")
5790 (plus:DI (match_operand:DI 1 "register_operand" "")
5791 (match_operand:DI 2 "nonmemory_operand" "")))]
5794 if (GET_CODE (operands[2]) == CONST_INT)
5796 HOST_WIDE_INT c = INTVAL (operands[2]);
5798 if (!CONST_OK_FOR_CONSTRAINT_P (c, 'K', "K")
5799 && !CONST_OK_FOR_CONSTRAINT_P (c, 'O', "Os"))
5801 operands[2] = force_const_mem (DImode, operands[2]);
5802 operands[2] = force_reg (DImode, operands[2]);
5804 else if (!DISP_IN_RANGE (INTVAL (operands[2])))
5805 operands[2] = force_reg (DImode, operands[2]);
5809 ; For 31 bit we have to prevent the generated pattern from matching
5810 ; normal ADDs since la only does a 31 bit add. This is supposed to
5811 ; match "force_la_31".
5812 (define_expand "addptrsi3"
5814 [(set (match_operand:SI 0 "register_operand" "")
5815 (plus:SI (match_operand:SI 1 "register_operand" "")
5816 (match_operand:SI 2 "nonmemory_operand" "")))
5817 (use (const_int 0))])]
5820 if (GET_CODE (operands[2]) == CONST_INT)
5822 HOST_WIDE_INT c = INTVAL (operands[2]);
5824 if (!CONST_OK_FOR_CONSTRAINT_P (c, 'K', "K")
5825 && !CONST_OK_FOR_CONSTRAINT_P (c, 'O', "Os"))
5827 operands[2] = force_const_mem (SImode, operands[2]);
5828 operands[2] = force_reg (SImode, operands[2]);
5830 else if (!DISP_IN_RANGE (INTVAL (operands[2])))
5831 operands[2] = force_reg (SImode, operands[2]);
5836 ;;- Subtract instructions.
5840 ; subti3 instruction pattern(s).
5843 (define_expand "subti3"
5845 [(set (match_operand:TI 0 "register_operand" "")
5846 (minus:TI (match_operand:TI 1 "register_operand" "")
5847 (match_operand:TI 2 "general_operand" "") ) )
5848 (clobber (reg:CC CC_REGNUM))])]
5851 /* For z13 we have vsq which doesn't set CC. */
5854 emit_insn (gen_rtx_SET (operands[0],
5855 gen_rtx_MINUS (TImode,
5857 copy_to_mode_reg (TImode, operands[2]))));
5862 (define_insn_and_split "*subti3"
5863 [(set (match_operand:TI 0 "register_operand" "=&d")
5864 (minus:TI (match_operand:TI 1 "register_operand" "0")
5865 (match_operand:TI 2 "general_operand" "do") ) )
5866 (clobber (reg:CC CC_REGNUM))]
5869 "&& reload_completed"
5871 [(set (reg:CCL2 CC_REGNUM)
5872 (compare:CCL2 (minus:DI (match_dup 7) (match_dup 8))
5874 (set (match_dup 6) (minus:DI (match_dup 7) (match_dup 8)))])
5876 [(set (match_dup 3) (minus:DI (minus:DI (match_dup 4) (match_dup 5))
5877 (gtu:DI (reg:CCL2 CC_REGNUM) (const_int 0))))
5878 (clobber (reg:CC CC_REGNUM))])]
5879 "operands[3] = operand_subword (operands[0], 0, 0, TImode);
5880 operands[4] = operand_subword (operands[1], 0, 0, TImode);
5881 operands[5] = operand_subword (operands[2], 0, 0, TImode);
5882 operands[6] = operand_subword (operands[0], 1, 0, TImode);
5883 operands[7] = operand_subword (operands[1], 1, 0, TImode);
5884 operands[8] = operand_subword (operands[2], 1, 0, TImode);"
5885 [(set_attr "op_type" "*")
5886 (set_attr "cpu_facility" "*")])
5889 ; subdi3 instruction pattern(s).
5892 (define_expand "subdi3"
5894 [(set (match_operand:DI 0 "register_operand" "")
5895 (minus:DI (match_operand:DI 1 "register_operand" "")
5896 (match_operand:DI 2 "general_operand" "")))
5897 (clobber (reg:CC CC_REGNUM))])]
5901 (define_insn "*subdi3_sign"
5902 [(set (match_operand:DI 0 "register_operand" "=d,d")
5903 (minus:DI (match_operand:DI 1 "register_operand" "0,0")
5904 (sign_extend:DI (match_operand:SI 2 "general_operand" "d,T"))))
5905 (clobber (reg:CC CC_REGNUM))]
5910 [(set_attr "op_type" "RRE,RXY")
5911 (set_attr "z10prop" "z10_c,*")
5912 (set_attr "z196prop" "z196_cracked")])
5914 (define_insn "*subdi3_zero_cc"
5915 [(set (reg CC_REGNUM)
5916 (compare (minus:DI (match_operand:DI 1 "register_operand" "0,0")
5917 (zero_extend:DI (match_operand:SI 2 "general_operand" "d,T")))
5919 (set (match_operand:DI 0 "register_operand" "=d,d")
5920 (minus:DI (match_dup 1) (zero_extend:DI (match_dup 2))))]
5921 "s390_match_ccmode (insn, CCLmode) && TARGET_ZARCH"
5925 [(set_attr "op_type" "RRE,RXY")
5926 (set_attr "z10prop" "z10_super_c_E1,z10_super_E1")])
5928 (define_insn "*subdi3_zero_cconly"
5929 [(set (reg CC_REGNUM)
5930 (compare (minus:DI (match_operand:DI 1 "register_operand" "0,0")
5931 (zero_extend:DI (match_operand:SI 2 "general_operand" "d,T")))
5933 (clobber (match_scratch:DI 0 "=d,d"))]
5934 "s390_match_ccmode (insn, CCLmode) && TARGET_ZARCH"
5938 [(set_attr "op_type" "RRE,RXY")
5939 (set_attr "z10prop" "z10_super_c_E1,z10_super_E1")])
5941 (define_insn "*subdi3_zero"
5942 [(set (match_operand:DI 0 "register_operand" "=d,d")
5943 (minus:DI (match_operand:DI 1 "register_operand" "0,0")
5944 (zero_extend:DI (match_operand:SI 2 "general_operand" "d,T"))))
5945 (clobber (reg:CC CC_REGNUM))]
5950 [(set_attr "op_type" "RRE,RXY")
5951 (set_attr "z10prop" "z10_super_c_E1,z10_super_E1")])
5953 (define_insn_and_split "*subdi3_31z"
5954 [(set (match_operand:DI 0 "register_operand" "=&d")
5955 (minus:DI (match_operand:DI 1 "register_operand" "0")
5956 (match_operand:DI 2 "general_operand" "do") ) )
5957 (clobber (reg:CC CC_REGNUM))]
5958 "!TARGET_ZARCH && TARGET_CPU_ZARCH"
5960 "&& reload_completed"
5962 [(set (reg:CCL2 CC_REGNUM)
5963 (compare:CCL2 (minus:SI (match_dup 7) (match_dup 8))
5965 (set (match_dup 6) (minus:SI (match_dup 7) (match_dup 8)))])
5967 [(set (match_dup 3) (minus:SI (minus:SI (match_dup 4) (match_dup 5))
5968 (gtu:SI (reg:CCL2 CC_REGNUM) (const_int 0))))
5969 (clobber (reg:CC CC_REGNUM))])]
5970 "operands[3] = operand_subword (operands[0], 0, 0, DImode);
5971 operands[4] = operand_subword (operands[1], 0, 0, DImode);
5972 operands[5] = operand_subword (operands[2], 0, 0, DImode);
5973 operands[6] = operand_subword (operands[0], 1, 0, DImode);
5974 operands[7] = operand_subword (operands[1], 1, 0, DImode);
5975 operands[8] = operand_subword (operands[2], 1, 0, DImode);")
5977 (define_insn_and_split "*subdi3_31"
5978 [(set (match_operand:DI 0 "register_operand" "=&d")
5979 (minus:DI (match_operand:DI 1 "register_operand" "0")
5980 (match_operand:DI 2 "general_operand" "do") ) )
5981 (clobber (reg:CC CC_REGNUM))]
5984 "&& reload_completed"
5986 [(set (match_dup 3) (minus:SI (match_dup 4) (match_dup 5)))
5987 (clobber (reg:CC CC_REGNUM))])
5989 [(set (reg:CCL2 CC_REGNUM)
5990 (compare:CCL2 (minus:SI (match_dup 7) (match_dup 8))
5992 (set (match_dup 6) (minus:SI (match_dup 7) (match_dup 8)))])
5994 (if_then_else (gtu (reg:CCL2 CC_REGNUM) (const_int 0))
5996 (label_ref (match_dup 9))))
5998 [(set (match_dup 3) (plus:SI (match_dup 3) (const_int -1)))
5999 (clobber (reg:CC CC_REGNUM))])
6001 "operands[3] = operand_subword (operands[0], 0, 0, DImode);
6002 operands[4] = operand_subword (operands[1], 0, 0, DImode);
6003 operands[5] = operand_subword (operands[2], 0, 0, DImode);
6004 operands[6] = operand_subword (operands[0], 1, 0, DImode);
6005 operands[7] = operand_subword (operands[1], 1, 0, DImode);
6006 operands[8] = operand_subword (operands[2], 1, 0, DImode);
6007 operands[9] = gen_label_rtx ();")
6010 ; subsi3 instruction pattern(s).
6013 (define_expand "subsi3"
6015 [(set (match_operand:SI 0 "register_operand" "")
6016 (minus:SI (match_operand:SI 1 "register_operand" "")
6017 (match_operand:SI 2 "general_operand" "")))
6018 (clobber (reg:CC CC_REGNUM))])]
6022 (define_insn "*subsi3_sign"
6023 [(set (match_operand:SI 0 "register_operand" "=d,d")
6024 (minus:SI (match_operand:SI 1 "register_operand" "0,0")
6025 (sign_extend:SI (match_operand:HI 2 "memory_operand" "R,T"))))
6026 (clobber (reg:CC CC_REGNUM))]
6031 [(set_attr "op_type" "RX,RXY")
6032 (set_attr "cpu_facility" "*,longdisp")
6033 (set_attr "z196prop" "z196_cracked,z196_cracked")])
6036 ; sub(di|si)3 instruction pattern(s).
6039 ; sr, s, sy, sgr, sg, srk, sgrk
6040 (define_insn "*sub<mode>3"
6041 [(set (match_operand:GPR 0 "register_operand" "=d,d,d,d")
6042 (minus:GPR (match_operand:GPR 1 "register_operand" "0,d,0,0")
6043 (match_operand:GPR 2 "general_operand" "d,d,R,T") ) )
6044 (clobber (reg:CC CC_REGNUM))]
6051 [(set_attr "op_type" "RR<E>,RRF,RX<Y>,RXY")
6052 (set_attr "cpu_facility" "*,z196,*,longdisp")
6053 (set_attr "z10prop" "z10_super_c_E1,*,z10_super_E1,z10_super_E1")])
6055 ; slr, sl, sly, slgr, slg, slrk, slgrk
6056 (define_insn "*sub<mode>3_borrow_cc"
6057 [(set (reg CC_REGNUM)
6058 (compare (minus:GPR (match_operand:GPR 1 "register_operand" "0,d,0,0")
6059 (match_operand:GPR 2 "general_operand" "d,d,R,T"))
6061 (set (match_operand:GPR 0 "register_operand" "=d,d,d,d")
6062 (minus:GPR (match_dup 1) (match_dup 2)))]
6063 "s390_match_ccmode (insn, CCL2mode)"
6069 [(set_attr "op_type" "RR<E>,RRF,RX<Y>,RXY")
6070 (set_attr "cpu_facility" "*,z196,*,longdisp")
6071 (set_attr "z10prop" "z10_super_c_E1,*,z10_super_E1,z10_super_E1")])
6073 ; slr, sl, sly, slgr, slg, slrk, slgrk
6074 (define_insn "*sub<mode>3_borrow_cconly"
6075 [(set (reg CC_REGNUM)
6076 (compare (minus:GPR (match_operand:GPR 1 "register_operand" "0,d,0,0")
6077 (match_operand:GPR 2 "general_operand" "d,d,R,T"))
6079 (clobber (match_scratch:GPR 0 "=d,d,d,d"))]
6080 "s390_match_ccmode (insn, CCL2mode)"
6086 [(set_attr "op_type" "RR<E>,RRF,RX<Y>,RXY")
6087 (set_attr "cpu_facility" "*,z196,*,longdisp")
6088 (set_attr "z10prop" "z10_super_c_E1,*,z10_super_E1,z10_super_E1")])
6090 ; slr, sl, sly, slgr, slg, slrk, slgrk
6091 (define_insn "*sub<mode>3_cc"
6092 [(set (reg CC_REGNUM)
6093 (compare (minus:GPR (match_operand:GPR 1 "register_operand" "0,d,0,0")
6094 (match_operand:GPR 2 "general_operand" "d,d,R,T"))
6096 (set (match_operand:GPR 0 "register_operand" "=d,d,d,d")
6097 (minus:GPR (match_dup 1) (match_dup 2)))]
6098 "s390_match_ccmode (insn, CCLmode)"
6104 [(set_attr "op_type" "RR<E>,RRF,RX<Y>,RXY")
6105 (set_attr "cpu_facility" "*,z196,*,longdisp")
6106 (set_attr "z10prop" "z10_super_c_E1,*,z10_super_E1,z10_super_E1")])
6108 ; slr, sl, sly, slgr, slg, slrk, slgrk
6109 (define_insn "*sub<mode>3_cc2"
6110 [(set (reg CC_REGNUM)
6111 (compare (match_operand:GPR 1 "register_operand" "0,d,0,0")
6112 (match_operand:GPR 2 "general_operand" "d,d,R,T")))
6113 (set (match_operand:GPR 0 "register_operand" "=d,d,d,d")
6114 (minus:GPR (match_dup 1) (match_dup 2)))]
6115 "s390_match_ccmode (insn, CCL3mode)"
6121 [(set_attr "op_type" "RR<E>,RRF,RX<Y>,RXY")
6122 (set_attr "cpu_facility" "*,z196,*,longdisp")
6123 (set_attr "z10prop" "z10_super_c_E1,*,z10_super_E1,z10_super_E1")])
6125 ; slr, sl, sly, slgr, slg, slrk, slgrk
6126 (define_insn "*sub<mode>3_cconly"
6127 [(set (reg CC_REGNUM)
6128 (compare (minus:GPR (match_operand:GPR 1 "register_operand" "0,d,0,0")
6129 (match_operand:GPR 2 "general_operand" "d,d,R,T"))
6131 (clobber (match_scratch:GPR 0 "=d,d,d,d"))]
6132 "s390_match_ccmode (insn, CCLmode)"
6138 [(set_attr "op_type" "RR<E>,RRF,RX<Y>,RXY")
6139 (set_attr "cpu_facility" "*,z196,*,longdisp")
6140 (set_attr "z10prop" "z10_super_c_E1,*,z10_super_E1,z10_super_E1")])
6143 ; slr, sl, sly, slgr, slg, slrk, slgrk
6144 (define_insn "*sub<mode>3_cconly2"
6145 [(set (reg CC_REGNUM)
6146 (compare (match_operand:GPR 1 "register_operand" "0,d,0,0")
6147 (match_operand:GPR 2 "general_operand" "d,d,R,T")))
6148 (clobber (match_scratch:GPR 0 "=d,d,d,d"))]
6149 "s390_match_ccmode (insn, CCL3mode)"
6155 [(set_attr "op_type" "RR<E>,RRF,RX<Y>,RXY")
6156 (set_attr "cpu_facility" "*,z196,*,longdisp")
6157 (set_attr "z10prop" "z10_super_c_E1,*,z10_super_E1,z10_super_E1")])
6161 ; sub(tf|df|sf|td|dd)3 instruction pattern(s).
6164 ; sxbr, sdbr, sebr, sdb, seb, sxtr, sdtr
6165 (define_insn "sub<mode>3"
6166 [(set (match_operand:FP 0 "register_operand" "=f,f,f,v")
6167 (minus:FP (match_operand:FP 1 "register_operand" "f,0,0,v")
6168 (match_operand:FP 2 "general_operand" "f,f,R,v")))
6169 (clobber (reg:CC CC_REGNUM))]
6176 [(set_attr "op_type" "RRF,RRE,RXE,VRR")
6177 (set_attr "type" "fsimp<mode>")
6178 (set_attr "cpu_facility" "*,*,*,vec")
6179 (set_attr "enabled" "<nBFP>,<nDFP>,<DSF>,<DFDI>")])
6181 ; sxbr, sdbr, sebr, sdb, seb, sxtr, sdtr
6182 (define_insn "*sub<mode>3_cc"
6183 [(set (reg CC_REGNUM)
6184 (compare (minus:FP (match_operand:FP 1 "nonimmediate_operand" "f,0,0")
6185 (match_operand:FP 2 "general_operand" "f,f,R"))
6186 (match_operand:FP 3 "const0_operand" "")))
6187 (set (match_operand:FP 0 "register_operand" "=f,f,f")
6188 (minus:FP (match_dup 1) (match_dup 2)))]
6189 "s390_match_ccmode (insn, CCSmode) && TARGET_HARD_FLOAT"
6194 [(set_attr "op_type" "RRF,RRE,RXE")
6195 (set_attr "type" "fsimp<mode>")
6196 (set_attr "enabled" "<nBFP>,<nDFP>,<DSF>")])
6198 ; sxbr, sdbr, sebr, sdb, seb, sxtr, sdtr
6199 (define_insn "*sub<mode>3_cconly"
6200 [(set (reg CC_REGNUM)
6201 (compare (minus:FP (match_operand:FP 1 "nonimmediate_operand" "f,0,0")
6202 (match_operand:FP 2 "general_operand" "f,f,R"))
6203 (match_operand:FP 3 "const0_operand" "")))
6204 (clobber (match_scratch:FP 0 "=f,f,f"))]
6205 "s390_match_ccmode (insn, CCSmode) && TARGET_HARD_FLOAT"
6210 [(set_attr "op_type" "RRF,RRE,RXE")
6211 (set_attr "type" "fsimp<mode>")
6212 (set_attr "enabled" "<nBFP>,<nDFP>,<DSF>")])
6216 ;;- Conditional add/subtract instructions.
6220 ; add(di|si)cc instruction pattern(s).
6223 ; the following 4 patterns are used when the result of an add with
6224 ; carry is checked for an overflow condition
6226 ; op1 + op2 + c < op1
6228 ; alcr, alc, alcgr, alcg
6229 (define_insn "*add<mode>3_alc_carry1_cc"
6230 [(set (reg CC_REGNUM)
6232 (plus:GPR (plus:GPR (match_operand:GPR 3 "s390_alc_comparison" "")
6233 (match_operand:GPR 1 "nonimmediate_operand" "%0,0"))
6234 (match_operand:GPR 2 "general_operand" "d,T"))
6236 (set (match_operand:GPR 0 "register_operand" "=d,d")
6237 (plus:GPR (plus:GPR (match_dup 3) (match_dup 1)) (match_dup 2)))]
6238 "s390_match_ccmode (insn, CCL1mode) && TARGET_CPU_ZARCH"
6242 [(set_attr "op_type" "RRE,RXY")
6243 (set_attr "z196prop" "z196_alone,z196_alone")])
6245 ; alcr, alc, alcgr, alcg
6246 (define_insn "*add<mode>3_alc_carry1_cconly"
6247 [(set (reg CC_REGNUM)
6249 (plus:GPR (plus:GPR (match_operand:GPR 3 "s390_alc_comparison" "")
6250 (match_operand:GPR 1 "nonimmediate_operand" "%0,0"))
6251 (match_operand:GPR 2 "general_operand" "d,T"))
6253 (clobber (match_scratch:GPR 0 "=d,d"))]
6254 "s390_match_ccmode (insn, CCL1mode) && TARGET_CPU_ZARCH"
6258 [(set_attr "op_type" "RRE,RXY")
6259 (set_attr "z196prop" "z196_alone,z196_alone")])
6261 ; op1 + op2 + c < op2
6263 ; alcr, alc, alcgr, alcg
6264 (define_insn "*add<mode>3_alc_carry2_cc"
6265 [(set (reg CC_REGNUM)
6267 (plus:GPR (plus:GPR (match_operand:GPR 3 "s390_alc_comparison" "")
6268 (match_operand:GPR 1 "nonimmediate_operand" "%0,0"))
6269 (match_operand:GPR 2 "general_operand" "d,T"))
6271 (set (match_operand:GPR 0 "register_operand" "=d,d")
6272 (plus:GPR (plus:GPR (match_dup 3) (match_dup 1)) (match_dup 2)))]
6273 "s390_match_ccmode (insn, CCL1mode) && TARGET_CPU_ZARCH"
6277 [(set_attr "op_type" "RRE,RXY")])
6279 ; alcr, alc, alcgr, alcg
6280 (define_insn "*add<mode>3_alc_carry2_cconly"
6281 [(set (reg CC_REGNUM)
6283 (plus:GPR (plus:GPR (match_operand:GPR 3 "s390_alc_comparison" "")
6284 (match_operand:GPR 1 "nonimmediate_operand" "%0,0"))
6285 (match_operand:GPR 2 "general_operand" "d,T"))
6287 (clobber (match_scratch:GPR 0 "=d,d"))]
6288 "s390_match_ccmode (insn, CCL1mode) && TARGET_CPU_ZARCH"
6292 [(set_attr "op_type" "RRE,RXY")])
6294 ; alcr, alc, alcgr, alcg
6295 (define_insn "*add<mode>3_alc_cc"
6296 [(set (reg CC_REGNUM)
6298 (plus:GPR (plus:GPR (match_operand:GPR 3 "s390_alc_comparison" "")
6299 (match_operand:GPR 1 "nonimmediate_operand" "%0,0"))
6300 (match_operand:GPR 2 "general_operand" "d,T"))
6302 (set (match_operand:GPR 0 "register_operand" "=d,d")
6303 (plus:GPR (plus:GPR (match_dup 3) (match_dup 1)) (match_dup 2)))]
6304 "s390_match_ccmode (insn, CCLmode) && TARGET_CPU_ZARCH"
6308 [(set_attr "op_type" "RRE,RXY")])
6310 ; alcr, alc, alcgr, alcg
6311 (define_insn "*add<mode>3_alc"
6312 [(set (match_operand:GPR 0 "register_operand" "=d,d")
6313 (plus:GPR (plus:GPR (match_operand:GPR 3 "s390_alc_comparison" "")
6314 (match_operand:GPR 1 "nonimmediate_operand" "%0,0"))
6315 (match_operand:GPR 2 "general_operand" "d,T")))
6316 (clobber (reg:CC CC_REGNUM))]
6321 [(set_attr "op_type" "RRE,RXY")])
6323 ; slbr, slb, slbgr, slbg
6324 (define_insn "*sub<mode>3_slb_cc"
6325 [(set (reg CC_REGNUM)
6327 (minus:GPR (minus:GPR (match_operand:GPR 1 "nonimmediate_operand" "0,0")
6328 (match_operand:GPR 2 "general_operand" "d,T"))
6329 (match_operand:GPR 3 "s390_slb_comparison" ""))
6331 (set (match_operand:GPR 0 "register_operand" "=d,d")
6332 (minus:GPR (minus:GPR (match_dup 1) (match_dup 2)) (match_dup 3)))]
6333 "s390_match_ccmode (insn, CCLmode) && TARGET_CPU_ZARCH"
6337 [(set_attr "op_type" "RRE,RXY")
6338 (set_attr "z10prop" "z10_c,*")])
6340 ; slbr, slb, slbgr, slbg
6341 (define_insn "*sub<mode>3_slb"
6342 [(set (match_operand:GPR 0 "register_operand" "=d,d")
6343 (minus:GPR (minus:GPR (match_operand:GPR 1 "nonimmediate_operand" "0,0")
6344 (match_operand:GPR 2 "general_operand" "d,T"))
6345 (match_operand:GPR 3 "s390_slb_comparison" "")))
6346 (clobber (reg:CC CC_REGNUM))]
6351 [(set_attr "op_type" "RRE,RXY")
6352 (set_attr "z10prop" "z10_c,*")])
6354 (define_expand "add<mode>cc"
6355 [(match_operand:GPR 0 "register_operand" "")
6356 (match_operand 1 "comparison_operator" "")
6357 (match_operand:GPR 2 "register_operand" "")
6358 (match_operand:GPR 3 "const_int_operand" "")]
6360 "if (!s390_expand_addcc (GET_CODE (operands[1]),
6361 XEXP (operands[1], 0), XEXP (operands[1], 1),
6362 operands[0], operands[2],
6363 operands[3])) FAIL; DONE;")
6366 ; scond instruction pattern(s).
6369 (define_insn_and_split "*scond<mode>"
6370 [(set (match_operand:GPR 0 "register_operand" "=&d")
6371 (match_operand:GPR 1 "s390_alc_comparison" ""))
6372 (clobber (reg:CC CC_REGNUM))]
6375 "&& reload_completed"
6376 [(set (match_dup 0) (const_int 0))
6378 [(set (match_dup 0) (plus:GPR (plus:GPR (match_dup 1) (match_dup 0))
6380 (clobber (reg:CC CC_REGNUM))])]
6383 (define_insn_and_split "*scond<mode>_neg"
6384 [(set (match_operand:GPR 0 "register_operand" "=&d")
6385 (match_operand:GPR 1 "s390_slb_comparison" ""))
6386 (clobber (reg:CC CC_REGNUM))]
6389 "&& reload_completed"
6390 [(set (match_dup 0) (const_int 0))
6392 [(set (match_dup 0) (minus:GPR (minus:GPR (match_dup 0) (match_dup 0))
6394 (clobber (reg:CC CC_REGNUM))])
6396 [(set (match_dup 0) (neg:GPR (match_dup 0)))
6397 (clobber (reg:CC CC_REGNUM))])]
6401 (define_expand "cstore<mode>4"
6402 [(set (match_operand:SI 0 "register_operand" "")
6403 (match_operator:SI 1 "s390_scond_operator"
6404 [(match_operand:GPR 2 "register_operand" "")
6405 (match_operand:GPR 3 "general_operand" "")]))]
6407 "if (!s390_expand_addcc (GET_CODE (operands[1]), operands[2], operands[3],
6408 operands[0], const0_rtx, const1_rtx)) FAIL; DONE;")
6410 (define_expand "cstorecc4"
6412 [(set (match_operand:SI 0 "register_operand" "")
6413 (match_operator:SI 1 "s390_eqne_operator"
6414 [(match_operand:CCZ1 2 "register_operand")
6415 (match_operand 3 "const0_operand")]))
6416 (clobber (reg:CC CC_REGNUM))])]
6418 "emit_insn (gen_sne (operands[0], operands[2]));
6419 if (GET_CODE (operands[1]) == EQ)
6420 emit_insn (gen_xorsi3 (operands[0], operands[0], const1_rtx));
6423 (define_insn_and_split "sne"
6424 [(set (match_operand:SI 0 "register_operand" "=d")
6425 (ne:SI (match_operand:CCZ1 1 "register_operand" "0")
6427 (clobber (reg:CC CC_REGNUM))]
6432 [(set (match_dup 0) (ashiftrt:SI (match_dup 0) (const_int 28)))
6433 (clobber (reg:CC CC_REGNUM))])])
6437 ;; - Conditional move instructions (introduced with z196)
6440 (define_expand "mov<mode>cc"
6441 [(set (match_operand:GPR 0 "nonimmediate_operand" "")
6442 (if_then_else:GPR (match_operand 1 "comparison_operator" "")
6443 (match_operand:GPR 2 "nonimmediate_operand" "")
6444 (match_operand:GPR 3 "nonimmediate_operand" "")))]
6447 /* Emit the comparison insn in case we do not already have a comparison result. */
6448 if (!s390_comparison (operands[1], VOIDmode))
6449 operands[1] = s390_emit_compare (GET_CODE (operands[1]),
6450 XEXP (operands[1], 0),
6451 XEXP (operands[1], 1));
6454 ; locr, loc, stoc, locgr, locg, stocg, lochi, locghi
6455 (define_insn_and_split "*mov<mode>cc"
6456 [(set (match_operand:GPR 0 "nonimmediate_operand" "=d,d,d,d,d,d,S,S,&d")
6458 (match_operator 1 "s390_comparison"
6459 [(match_operand 2 "cc_reg_operand" " c,c,c,c,c,c,c,c,c")
6460 (match_operand 5 "const_int_operand" "")])
6461 (match_operand:GPR 3 "loc_operand" " d,0,S,0,K,0,d,0,S")
6462 (match_operand:GPR 4 "loc_operand" " 0,d,0,S,0,K,0,d,S")))]
6474 "&& reload_completed
6475 && MEM_P (operands[3]) && MEM_P (operands[4])"
6478 (match_op_dup 1 [(match_dup 2) (const_int 0)])
6483 (match_op_dup 1 [(match_dup 2) (const_int 0)])
6487 [(set_attr "op_type" "RRF,RRF,RSY,RSY,RIE,RIE,RSY,RSY,*")
6488 (set_attr "cpu_facility" "*,*,*,*,z13,z13,*,*,*")])
6491 ;;- Multiply instructions.
6495 ; muldi3 instruction pattern(s).
6498 (define_insn "*muldi3_sign"
6499 [(set (match_operand:DI 0 "register_operand" "=d,d")
6500 (mult:DI (sign_extend:DI (match_operand:SI 2 "general_operand" "d,T"))
6501 (match_operand:DI 1 "register_operand" "0,0")))]
6506 [(set_attr "op_type" "RRE,RXY")
6507 (set_attr "type" "imuldi")])
6509 (define_insn "muldi3"
6510 [(set (match_operand:DI 0 "register_operand" "=d,d,d,d")
6511 (mult:DI (match_operand:DI 1 "nonimmediate_operand" "%0,0,0,0")
6512 (match_operand:DI 2 "general_operand" "d,K,T,Os")))]
6519 [(set_attr "op_type" "RRE,RI,RXY,RIL")
6520 (set_attr "type" "imuldi")
6521 (set_attr "cpu_facility" "*,*,*,z10")])
6524 ; mulsi3 instruction pattern(s).
6527 (define_insn "*mulsi3_sign"
6528 [(set (match_operand:SI 0 "register_operand" "=d,d")
6529 (mult:SI (sign_extend:SI (match_operand:HI 2 "memory_operand" "R,T"))
6530 (match_operand:SI 1 "register_operand" "0,0")))]
6535 [(set_attr "op_type" "RX,RXY")
6536 (set_attr "type" "imulhi")
6537 (set_attr "cpu_facility" "*,z10")])
6539 (define_insn "mulsi3"
6540 [(set (match_operand:SI 0 "register_operand" "=d,d,d,d,d")
6541 (mult:SI (match_operand:SI 1 "nonimmediate_operand" "%0,0,0,0,0")
6542 (match_operand:SI 2 "general_operand" "d,K,R,T,Os")))]
6550 [(set_attr "op_type" "RRE,RI,RX,RXY,RIL")
6551 (set_attr "type" "imulsi,imulhi,imulsi,imulsi,imulsi")
6552 (set_attr "cpu_facility" "*,*,*,longdisp,z10")])
6555 ; mulsidi3 instruction pattern(s).
6558 (define_insn "mulsidi3"
6559 [(set (match_operand:DI 0 "register_operand" "=d,d,d")
6560 (mult:DI (sign_extend:DI
6561 (match_operand:SI 1 "register_operand" "%0,0,0"))
6563 (match_operand:SI 2 "nonimmediate_operand" "d,R,T"))))]
6569 [(set_attr "op_type" "RR,RX,RXY")
6570 (set_attr "type" "imulsi")
6571 (set_attr "cpu_facility" "*,*,z10")])
6574 ; umul instruction pattern(s).
6577 ; mlr, ml, mlgr, mlg
6578 (define_insn "umul<dwh><mode>3"
6579 [(set (match_operand:DW 0 "register_operand" "=d,d")
6580 (mult:DW (zero_extend:DW
6581 (match_operand:<DWH> 1 "register_operand" "%0,0"))
6583 (match_operand:<DWH> 2 "nonimmediate_operand" " d,T"))))]
6588 [(set_attr "op_type" "RRE,RXY")
6589 (set_attr "type" "imul<dwh>")])
6592 ; mul(tf|df|sf|td|dd)3 instruction pattern(s).
6595 ; mxbr, mdbr, meebr, mxb, mxb, meeb, mdtr, mxtr
6596 (define_insn "mul<mode>3"
6597 [(set (match_operand:FP 0 "register_operand" "=f,f,f,v")
6598 (mult:FP (match_operand:FP 1 "nonimmediate_operand" "%f,0,0,v")
6599 (match_operand:FP 2 "general_operand" "f,f,R,v")))]
6606 [(set_attr "op_type" "RRF,RRE,RXE,VRR")
6607 (set_attr "type" "fmul<mode>")
6608 (set_attr "cpu_facility" "*,*,*,vec")
6609 (set_attr "enabled" "<nBFP>,<nDFP>,<DSF>,<DFDI>")])
6611 ; madbr, maebr, maxb, madb, maeb
6612 (define_insn "fma<mode>4"
6613 [(set (match_operand:DSF 0 "register_operand" "=f,f,v")
6614 (fma:DSF (match_operand:DSF 1 "nonimmediate_operand" "%f,f,v")
6615 (match_operand:DSF 2 "nonimmediate_operand" "f,R,v")
6616 (match_operand:DSF 3 "register_operand" "0,0,v")))]
6621 wfmadb\t%v0,%v1,%v2,%v3"
6622 [(set_attr "op_type" "RRE,RXE,VRR")
6623 (set_attr "type" "fmadd<mode>")
6624 (set_attr "cpu_facility" "*,*,vec")
6625 (set_attr "enabled" "*,*,<DFDI>")])
6627 ; msxbr, msdbr, msebr, msxb, msdb, mseb
6628 (define_insn "fms<mode>4"
6629 [(set (match_operand:DSF 0 "register_operand" "=f,f,v")
6630 (fma:DSF (match_operand:DSF 1 "nonimmediate_operand" "%f,f,v")
6631 (match_operand:DSF 2 "nonimmediate_operand" "f,R,v")
6632 (neg:DSF (match_operand:DSF 3 "register_operand" "0,0,v"))))]
6637 wfmsdb\t%v0,%v1,%v2,%v3"
6638 [(set_attr "op_type" "RRE,RXE,VRR")
6639 (set_attr "type" "fmadd<mode>")
6640 (set_attr "cpu_facility" "*,*,vec")
6641 (set_attr "enabled" "*,*,<DFDI>")])
6644 ;;- Divide and modulo instructions.
6648 ; divmoddi4 instruction pattern(s).
6651 (define_expand "divmoddi4"
6652 [(parallel [(set (match_operand:DI 0 "general_operand" "")
6653 (div:DI (match_operand:DI 1 "register_operand" "")
6654 (match_operand:DI 2 "general_operand" "")))
6655 (set (match_operand:DI 3 "general_operand" "")
6656 (mod:DI (match_dup 1) (match_dup 2)))])
6657 (clobber (match_dup 4))]
6660 rtx div_equal, mod_equal;
6663 div_equal = gen_rtx_DIV (DImode, operands[1], operands[2]);
6664 mod_equal = gen_rtx_MOD (DImode, operands[1], operands[2]);
6666 operands[4] = gen_reg_rtx(TImode);
6667 emit_insn (gen_divmodtidi3 (operands[4], operands[1], operands[2]));
6669 insn = emit_move_insn (operands[0], gen_lowpart (DImode, operands[4]));
6670 set_unique_reg_note (insn, REG_EQUAL, div_equal);
6672 insn = emit_move_insn (operands[3], gen_highpart (DImode, operands[4]));
6673 set_unique_reg_note (insn, REG_EQUAL, mod_equal);
6678 (define_insn "divmodtidi3"
6679 [(set (match_operand:TI 0 "register_operand" "=d,d")
6683 (mod:DI (match_operand:DI 1 "register_operand" "0,0")
6684 (match_operand:DI 2 "general_operand" "d,T")))
6686 (zero_extend:TI (div:DI (match_dup 1) (match_dup 2)))))]
6691 [(set_attr "op_type" "RRE,RXY")
6692 (set_attr "type" "idiv")])
6694 (define_insn "divmodtisi3"
6695 [(set (match_operand:TI 0 "register_operand" "=d,d")
6699 (mod:DI (match_operand:DI 1 "register_operand" "0,0")
6701 (match_operand:SI 2 "nonimmediate_operand" "d,T"))))
6704 (div:DI (match_dup 1) (sign_extend:DI (match_dup 2))))))]
6709 [(set_attr "op_type" "RRE,RXY")
6710 (set_attr "type" "idiv")])
6713 ; udivmoddi4 instruction pattern(s).
6716 (define_expand "udivmoddi4"
6717 [(parallel [(set (match_operand:DI 0 "general_operand" "")
6718 (udiv:DI (match_operand:DI 1 "general_operand" "")
6719 (match_operand:DI 2 "nonimmediate_operand" "")))
6720 (set (match_operand:DI 3 "general_operand" "")
6721 (umod:DI (match_dup 1) (match_dup 2)))])
6722 (clobber (match_dup 4))]
6725 rtx div_equal, mod_equal, equal;
6728 div_equal = gen_rtx_UDIV (DImode, operands[1], operands[2]);
6729 mod_equal = gen_rtx_UMOD (DImode, operands[1], operands[2]);
6730 equal = gen_rtx_IOR (TImode,
6731 gen_rtx_ASHIFT (TImode,
6732 gen_rtx_ZERO_EXTEND (TImode, mod_equal),
6734 gen_rtx_ZERO_EXTEND (TImode, div_equal));
6736 operands[4] = gen_reg_rtx(TImode);
6737 emit_clobber (operands[4]);
6738 emit_move_insn (gen_lowpart (DImode, operands[4]), operands[1]);
6739 emit_move_insn (gen_highpart (DImode, operands[4]), const0_rtx);
6741 insn = emit_insn (gen_udivmodtidi3 (operands[4], operands[4], operands[2]));
6742 set_unique_reg_note (insn, REG_EQUAL, equal);
6744 insn = emit_move_insn (operands[0], gen_lowpart (DImode, operands[4]));
6745 set_unique_reg_note (insn, REG_EQUAL, div_equal);
6747 insn = emit_move_insn (operands[3], gen_highpart (DImode, operands[4]));
6748 set_unique_reg_note (insn, REG_EQUAL, mod_equal);
6753 (define_insn "udivmodtidi3"
6754 [(set (match_operand:TI 0 "register_operand" "=d,d")
6759 (umod:TI (match_operand:TI 1 "register_operand" "0,0")
6761 (match_operand:DI 2 "nonimmediate_operand" "d,T")))))
6765 (udiv:TI (match_dup 1) (zero_extend:TI (match_dup 2)))))))]
6770 [(set_attr "op_type" "RRE,RXY")
6771 (set_attr "type" "idiv")])
6774 ; divmodsi4 instruction pattern(s).
6777 (define_expand "divmodsi4"
6778 [(parallel [(set (match_operand:SI 0 "general_operand" "")
6779 (div:SI (match_operand:SI 1 "general_operand" "")
6780 (match_operand:SI 2 "nonimmediate_operand" "")))
6781 (set (match_operand:SI 3 "general_operand" "")
6782 (mod:SI (match_dup 1) (match_dup 2)))])
6783 (clobber (match_dup 4))]
6786 rtx div_equal, mod_equal, equal;
6789 div_equal = gen_rtx_DIV (SImode, operands[1], operands[2]);
6790 mod_equal = gen_rtx_MOD (SImode, operands[1], operands[2]);
6791 equal = gen_rtx_IOR (DImode,
6792 gen_rtx_ASHIFT (DImode,
6793 gen_rtx_ZERO_EXTEND (DImode, mod_equal),
6795 gen_rtx_ZERO_EXTEND (DImode, div_equal));
6797 operands[4] = gen_reg_rtx(DImode);
6798 emit_insn (gen_extendsidi2 (operands[4], operands[1]));
6800 insn = emit_insn (gen_divmoddisi3 (operands[4], operands[4], operands[2]));
6801 set_unique_reg_note (insn, REG_EQUAL, equal);
6803 insn = emit_move_insn (operands[0], gen_lowpart (SImode, operands[4]));
6804 set_unique_reg_note (insn, REG_EQUAL, div_equal);
6806 insn = emit_move_insn (operands[3], gen_highpart (SImode, operands[4]));
6807 set_unique_reg_note (insn, REG_EQUAL, mod_equal);
6812 (define_insn "divmoddisi3"
6813 [(set (match_operand:DI 0 "register_operand" "=d,d")
6818 (mod:DI (match_operand:DI 1 "register_operand" "0,0")
6820 (match_operand:SI 2 "nonimmediate_operand" "d,R")))))
6824 (div:DI (match_dup 1) (sign_extend:DI (match_dup 2)))))))]
6829 [(set_attr "op_type" "RR,RX")
6830 (set_attr "type" "idiv")])
6833 ; udivsi3 and umodsi3 instruction pattern(s).
6836 (define_expand "udivmodsi4"
6837 [(parallel [(set (match_operand:SI 0 "general_operand" "")
6838 (udiv:SI (match_operand:SI 1 "general_operand" "")
6839 (match_operand:SI 2 "nonimmediate_operand" "")))
6840 (set (match_operand:SI 3 "general_operand" "")
6841 (umod:SI (match_dup 1) (match_dup 2)))])
6842 (clobber (match_dup 4))]
6843 "!TARGET_ZARCH && TARGET_CPU_ZARCH"
6845 rtx div_equal, mod_equal, equal;
6848 div_equal = gen_rtx_UDIV (SImode, operands[1], operands[2]);
6849 mod_equal = gen_rtx_UMOD (SImode, operands[1], operands[2]);
6850 equal = gen_rtx_IOR (DImode,
6851 gen_rtx_ASHIFT (DImode,
6852 gen_rtx_ZERO_EXTEND (DImode, mod_equal),
6854 gen_rtx_ZERO_EXTEND (DImode, div_equal));
6856 operands[4] = gen_reg_rtx(DImode);
6857 emit_clobber (operands[4]);
6858 emit_move_insn (gen_lowpart (SImode, operands[4]), operands[1]);
6859 emit_move_insn (gen_highpart (SImode, operands[4]), const0_rtx);
6861 insn = emit_insn (gen_udivmoddisi3 (operands[4], operands[4], operands[2]));
6862 set_unique_reg_note (insn, REG_EQUAL, equal);
6864 insn = emit_move_insn (operands[0], gen_lowpart (SImode, operands[4]));
6865 set_unique_reg_note (insn, REG_EQUAL, div_equal);
6867 insn = emit_move_insn (operands[3], gen_highpart (SImode, operands[4]));
6868 set_unique_reg_note (insn, REG_EQUAL, mod_equal);
6873 (define_insn "udivmoddisi3"
6874 [(set (match_operand:DI 0 "register_operand" "=d,d")
6879 (umod:DI (match_operand:DI 1 "register_operand" "0,0")
6881 (match_operand:SI 2 "nonimmediate_operand" "d,T")))))
6885 (udiv:DI (match_dup 1) (zero_extend:DI (match_dup 2)))))))]
6886 "!TARGET_ZARCH && TARGET_CPU_ZARCH"
6890 [(set_attr "op_type" "RRE,RXY")
6891 (set_attr "type" "idiv")])
6893 (define_expand "udivsi3"
6894 [(set (match_operand:SI 0 "register_operand" "=d")
6895 (udiv:SI (match_operand:SI 1 "general_operand" "")
6896 (match_operand:SI 2 "general_operand" "")))
6897 (clobber (match_dup 3))]
6898 "!TARGET_ZARCH && !TARGET_CPU_ZARCH"
6900 rtx udiv_equal, umod_equal, equal;
6903 udiv_equal = gen_rtx_UDIV (SImode, operands[1], operands[2]);
6904 umod_equal = gen_rtx_UMOD (SImode, operands[1], operands[2]);
6905 equal = gen_rtx_IOR (DImode,
6906 gen_rtx_ASHIFT (DImode,
6907 gen_rtx_ZERO_EXTEND (DImode, umod_equal),
6909 gen_rtx_ZERO_EXTEND (DImode, udiv_equal));
6911 operands[3] = gen_reg_rtx (DImode);
6913 if (CONSTANT_P (operands[2]))
6915 if (GET_CODE (operands[2]) == CONST_INT && INTVAL (operands[2]) < 0)
6917 rtx_code_label *label1 = gen_label_rtx ();
6919 operands[1] = make_safe_from (operands[1], operands[0]);
6920 emit_move_insn (operands[0], const0_rtx);
6921 emit_cmp_and_jump_insns (operands[1], operands[2], LT, NULL_RTX,
6923 emit_move_insn (operands[0], const1_rtx);
6924 emit_label (label1);
6928 operands[2] = force_reg (SImode, operands[2]);
6929 operands[2] = make_safe_from (operands[2], operands[0]);
6931 emit_insn (gen_zero_extendsidi2 (operands[3], operands[1]));
6932 insn = emit_insn (gen_divmoddisi3 (operands[3], operands[3],
6934 set_unique_reg_note (insn, REG_EQUAL, equal);
6936 insn = emit_move_insn (operands[0],
6937 gen_lowpart (SImode, operands[3]));
6938 set_unique_reg_note (insn, REG_EQUAL, udiv_equal);
6943 rtx_code_label *label1 = gen_label_rtx ();
6944 rtx_code_label *label2 = gen_label_rtx ();
6945 rtx_code_label *label3 = gen_label_rtx ();
6947 operands[1] = force_reg (SImode, operands[1]);
6948 operands[1] = make_safe_from (operands[1], operands[0]);
6949 operands[2] = force_reg (SImode, operands[2]);
6950 operands[2] = make_safe_from (operands[2], operands[0]);
6952 emit_move_insn (operands[0], const0_rtx);
6953 emit_cmp_and_jump_insns (operands[2], operands[1], GT, NULL_RTX,
6955 emit_cmp_and_jump_insns (operands[2], const0_rtx, LT, NULL_RTX,
6957 emit_cmp_and_jump_insns (operands[2], const1_rtx, EQ, NULL_RTX,
6959 emit_insn (gen_zero_extendsidi2 (operands[3], operands[1]));
6960 insn = emit_insn (gen_divmoddisi3 (operands[3], operands[3],
6962 set_unique_reg_note (insn, REG_EQUAL, equal);
6964 insn = emit_move_insn (operands[0],
6965 gen_lowpart (SImode, operands[3]));
6966 set_unique_reg_note (insn, REG_EQUAL, udiv_equal);
6969 emit_label (label1);
6970 emit_move_insn (operands[0], operands[1]);
6972 emit_label (label2);
6973 emit_move_insn (operands[0], const1_rtx);
6974 emit_label (label3);
6976 emit_move_insn (operands[0], operands[0]);
6980 (define_expand "umodsi3"
6981 [(set (match_operand:SI 0 "register_operand" "=d")
6982 (umod:SI (match_operand:SI 1 "nonimmediate_operand" "")
6983 (match_operand:SI 2 "nonimmediate_operand" "")))
6984 (clobber (match_dup 3))]
6985 "!TARGET_ZARCH && !TARGET_CPU_ZARCH"
6987 rtx udiv_equal, umod_equal, equal;
6990 udiv_equal = gen_rtx_UDIV (SImode, operands[1], operands[2]);
6991 umod_equal = gen_rtx_UMOD (SImode, operands[1], operands[2]);
6992 equal = gen_rtx_IOR (DImode,
6993 gen_rtx_ASHIFT (DImode,
6994 gen_rtx_ZERO_EXTEND (DImode, umod_equal),
6996 gen_rtx_ZERO_EXTEND (DImode, udiv_equal));
6998 operands[3] = gen_reg_rtx (DImode);
7000 if (CONSTANT_P (operands[2]))
7002 if (GET_CODE (operands[2]) == CONST_INT && INTVAL (operands[2]) <= 0)
7004 rtx_code_label *label1 = gen_label_rtx ();
7006 operands[1] = make_safe_from (operands[1], operands[0]);
7007 emit_move_insn (operands[0], operands[1]);
7008 emit_cmp_and_jump_insns (operands[0], operands[2], LT, NULL_RTX,
7010 emit_insn (gen_abssi2 (operands[0], operands[2]));
7011 emit_insn (gen_addsi3 (operands[0], operands[0], operands[1]));
7012 emit_label (label1);
7016 operands[2] = force_reg (SImode, operands[2]);
7017 operands[2] = make_safe_from (operands[2], operands[0]);
7019 emit_insn (gen_zero_extendsidi2 (operands[3], operands[1]));
7020 insn = emit_insn (gen_divmoddisi3 (operands[3], operands[3],
7022 set_unique_reg_note (insn, REG_EQUAL, equal);
7024 insn = emit_move_insn (operands[0],
7025 gen_highpart (SImode, operands[3]));
7026 set_unique_reg_note (insn, REG_EQUAL, umod_equal);
7031 rtx_code_label *label1 = gen_label_rtx ();
7032 rtx_code_label *label2 = gen_label_rtx ();
7033 rtx_code_label *label3 = gen_label_rtx ();
7035 operands[1] = force_reg (SImode, operands[1]);
7036 operands[1] = make_safe_from (operands[1], operands[0]);
7037 operands[2] = force_reg (SImode, operands[2]);
7038 operands[2] = make_safe_from (operands[2], operands[0]);
7040 emit_move_insn(operands[0], operands[1]);
7041 emit_cmp_and_jump_insns (operands[2], operands[1], GT, NULL_RTX,
7043 emit_cmp_and_jump_insns (operands[2], const0_rtx, LT, NULL_RTX,
7045 emit_cmp_and_jump_insns (operands[2], const1_rtx, EQ, NULL_RTX,
7047 emit_insn (gen_zero_extendsidi2 (operands[3], operands[1]));
7048 insn = emit_insn (gen_divmoddisi3 (operands[3], operands[3],
7050 set_unique_reg_note (insn, REG_EQUAL, equal);
7052 insn = emit_move_insn (operands[0],
7053 gen_highpart (SImode, operands[3]));
7054 set_unique_reg_note (insn, REG_EQUAL, umod_equal);
7057 emit_label (label1);
7058 emit_move_insn (operands[0], const0_rtx);
7060 emit_label (label2);
7061 emit_insn (gen_subsi3 (operands[0], operands[0], operands[2]));
7062 emit_label (label3);
7068 ; div(df|sf)3 instruction pattern(s).
7071 ; dxbr, ddbr, debr, dxb, ddb, deb, ddtr, dxtr
7072 (define_insn "div<mode>3"
7073 [(set (match_operand:FP 0 "register_operand" "=f,f,f,v")
7074 (div:FP (match_operand:FP 1 "register_operand" "f,0,0,v")
7075 (match_operand:FP 2 "general_operand" "f,f,R,v")))]
7082 [(set_attr "op_type" "RRF,RRE,RXE,VRR")
7083 (set_attr "type" "fdiv<mode>")
7084 (set_attr "cpu_facility" "*,*,*,vec")
7085 (set_attr "enabled" "<nBFP>,<nDFP>,<DSF>,<DFDI>")])
7089 ;;- And instructions.
7092 (define_expand "and<mode>3"
7093 [(set (match_operand:INT 0 "nonimmediate_operand" "")
7094 (and:INT (match_operand:INT 1 "nonimmediate_operand" "")
7095 (match_operand:INT 2 "general_operand" "")))
7096 (clobber (reg:CC CC_REGNUM))]
7098 "s390_expand_logical_operator (AND, <MODE>mode, operands); DONE;")
7101 ; anddi3 instruction pattern(s).
7104 (define_insn "*anddi3_cc"
7105 [(set (reg CC_REGNUM)
7107 (and:DI (match_operand:DI 1 "nonimmediate_operand" "%0,d,0, d")
7108 (match_operand:DI 2 "general_operand" " d,d,T,NxxDw"))
7110 (set (match_operand:DI 0 "register_operand" "=d,d,d, d")
7111 (and:DI (match_dup 1) (match_dup 2)))]
7112 "TARGET_ZARCH && s390_match_ccmode(insn, CCTmode)"
7117 risbg\t%0,%1,%s2,128+%e2,0"
7118 [(set_attr "op_type" "RRE,RRF,RXY,RIE")
7119 (set_attr "cpu_facility" "*,z196,*,z10")
7120 (set_attr "z10prop" "z10_super_E1,*,z10_super_E1,z10_super_E1")])
7122 (define_insn "*anddi3_cconly"
7123 [(set (reg CC_REGNUM)
7125 (and:DI (match_operand:DI 1 "nonimmediate_operand" "%0,d,0, d")
7126 (match_operand:DI 2 "general_operand" " d,d,T,NxxDw"))
7128 (clobber (match_scratch:DI 0 "=d,d,d, d"))]
7130 && s390_match_ccmode(insn, CCTmode)
7131 /* Do not steal TM patterns. */
7132 && s390_single_part (operands[2], DImode, HImode, 0) < 0"
7137 risbg\t%0,%1,%s2,128+%e2,0"
7138 [(set_attr "op_type" "RRE,RRF,RXY,RIE")
7139 (set_attr "cpu_facility" "*,z196,*,z10")
7140 (set_attr "z10prop" "z10_super_E1,*,z10_super_E1,z10_super_E1")])
7142 (define_insn "*anddi3"
7143 [(set (match_operand:DI 0 "nonimmediate_operand"
7144 "=d,d, d, d, d, d, d, d,d,d,d, d, AQ,Q")
7146 (match_operand:DI 1 "nonimmediate_operand"
7147 "%d,o, 0, 0, 0, 0, 0, 0,0,d,0, d, 0,0")
7148 (match_operand:DI 2 "general_operand"
7149 "M, M,N0HDF,N1HDF,N2HDF,N3HDF,N0SDF,N1SDF,d,d,T,NxxDw,NxQDF,Q")))
7150 (clobber (reg:CC CC_REGNUM))]
7151 "TARGET_ZARCH && s390_logical_operator_ok_p (operands)"
7164 risbg\t%0,%1,%s2,128+%e2,0
7167 [(set_attr "op_type" "RRE,RXE,RI,RI,RI,RI,RIL,RIL,RRE,RRF,RXY,RIE,SI,SS")
7168 (set_attr "cpu_facility" "*,*,*,*,*,*,extimm,extimm,*,z196,*,z10,*,*")
7169 (set_attr "z10prop" "*,
7185 [(set (match_operand:DI 0 "s_operand" "")
7186 (and:DI (match_dup 0) (match_operand:DI 1 "immediate_operand" "")))
7187 (clobber (reg:CC CC_REGNUM))]
7190 [(set (match_dup 0) (and:QI (match_dup 0) (match_dup 1)))
7191 (clobber (reg:CC CC_REGNUM))])]
7192 "s390_narrow_logical_operator (AND, &operands[0], &operands[1]);")
7194 ;; These two are what combine generates for (ashift (zero_extract)).
7195 (define_insn "*extzv_<mode>_srl<clobbercc_or_nocc>"
7196 [(set (match_operand:GPR 0 "register_operand" "=d")
7197 (and:GPR (lshiftrt:GPR
7198 (match_operand:GPR 1 "register_operand" "d")
7199 (match_operand:GPR 2 "nonzero_shift_count_operand" ""))
7200 (match_operand:GPR 3 "contiguous_bitmask_nowrap_operand" "")))]
7201 "<z10_or_zEC12_cond>
7202 /* Note that even for the SImode pattern, the rotate is always DImode. */
7203 && s390_extzv_shift_ok (<bitsize>, -INTVAL (operands[2]),
7204 INTVAL (operands[3]))"
7205 "<risbg_n>\t%0,%1,%<bfstart>3,128+%<bfend>3,64-%2"
7206 [(set_attr "op_type" "RIE")
7207 (set_attr "z10prop" "z10_super_E1")])
7209 (define_insn "*extzv_<mode>_sll<clobbercc_or_nocc>"
7210 [(set (match_operand:GPR 0 "register_operand" "=d")
7211 (and:GPR (ashift:GPR
7212 (match_operand:GPR 1 "register_operand" "d")
7213 (match_operand:GPR 2 "nonzero_shift_count_operand" ""))
7214 (match_operand:GPR 3 "contiguous_bitmask_nowrap_operand" "")))]
7215 "<z10_or_zEC12_cond>
7216 && s390_extzv_shift_ok (<bitsize>, INTVAL (operands[2]),
7217 INTVAL (operands[3]))"
7218 "<risbg_n>\t%0,%1,%<bfstart>3,128+%<bfend>3,%2"
7219 [(set_attr "op_type" "RIE")
7220 (set_attr "z10prop" "z10_super_E1")])
7224 ; andsi3 instruction pattern(s).
7227 (define_insn "*andsi3_cc"
7228 [(set (reg CC_REGNUM)
7231 (match_operand:SI 1 "nonimmediate_operand" "%0,0,d,0,0, d")
7232 (match_operand:SI 2 "general_operand" "Os,d,d,R,T,NxxSq"))
7234 (set (match_operand:SI 0 "register_operand" "=d,d,d,d,d, d")
7235 (and:SI (match_dup 1) (match_dup 2)))]
7236 "s390_match_ccmode(insn, CCTmode)"
7243 risbg\t%0,%1,%t2,128+%f2,0"
7244 [(set_attr "op_type" "RIL,RR,RRF,RX,RXY,RIE")
7245 (set_attr "cpu_facility" "*,*,z196,*,longdisp,z10")
7246 (set_attr "z10prop" "z10_super_E1,z10_super_E1,*,
7247 z10_super_E1,z10_super_E1,z10_super_E1")])
7249 (define_insn "*andsi3_cconly"
7250 [(set (reg CC_REGNUM)
7253 (match_operand:SI 1 "nonimmediate_operand" "%0,0,d,0,0, d")
7254 (match_operand:SI 2 "general_operand" "Os,d,d,R,T,NxxSq"))
7256 (clobber (match_scratch:SI 0 "=d,d,d,d,d, d"))]
7257 "s390_match_ccmode(insn, CCTmode)
7258 /* Do not steal TM patterns. */
7259 && s390_single_part (operands[2], SImode, HImode, 0) < 0"
7266 risbg\t%0,%1,%t2,128+%f2,0"
7267 [(set_attr "op_type" "RIL,RR,RRF,RX,RXY,RIE")
7268 (set_attr "cpu_facility" "*,*,z196,*,longdisp,z10")
7269 (set_attr "z10prop" "z10_super_E1,z10_super_E1,*,
7270 z10_super_E1,z10_super_E1,z10_super_E1")])
7272 (define_insn "*andsi3_zarch"
7273 [(set (match_operand:SI 0 "nonimmediate_operand"
7274 "=d,d, d, d, d,d,d,d,d, d, AQ,Q")
7275 (and:SI (match_operand:SI 1 "nonimmediate_operand"
7276 "%d,o, 0, 0, 0,0,d,0,0, d, 0,0")
7277 (match_operand:SI 2 "general_operand"
7278 " M,M,N0HSF,N1HSF,Os,d,d,R,T,NxxSw,NxQSF,Q")))
7279 (clobber (reg:CC CC_REGNUM))]
7280 "TARGET_ZARCH && s390_logical_operator_ok_p (operands)"
7291 risbg\t%0,%1,%t2,128+%f2,0
7294 [(set_attr "op_type" "RRE,RXE,RI,RI,RIL,RR,RRF,RX,RXY,RIE,SI,SS")
7295 (set_attr "cpu_facility" "*,*,*,*,*,*,z196,*,longdisp,z10,*,*")
7296 (set_attr "z10prop" "*,
7309 (define_insn "*andsi3_esa"
7310 [(set (match_operand:SI 0 "nonimmediate_operand" "=d,d, AQ,Q")
7311 (and:SI (match_operand:SI 1 "nonimmediate_operand" "%0,0, 0,0")
7312 (match_operand:SI 2 "general_operand" " d,R,NxQSF,Q")))
7313 (clobber (reg:CC CC_REGNUM))]
7314 "!TARGET_ZARCH && s390_logical_operator_ok_p (operands)"
7320 [(set_attr "op_type" "RR,RX,SI,SS")
7321 (set_attr "z10prop" "z10_super_E1,z10_super_E1,*,*")])
7325 [(set (match_operand:SI 0 "s_operand" "")
7326 (and:SI (match_dup 0) (match_operand:SI 1 "immediate_operand" "")))
7327 (clobber (reg:CC CC_REGNUM))]
7330 [(set (match_dup 0) (and:QI (match_dup 0) (match_dup 1)))
7331 (clobber (reg:CC CC_REGNUM))])]
7332 "s390_narrow_logical_operator (AND, &operands[0], &operands[1]);")
7335 ; andhi3 instruction pattern(s).
7338 (define_insn "*andhi3_zarch"
7339 [(set (match_operand:HI 0 "nonimmediate_operand" "=d,d,d, AQ,Q")
7340 (and:HI (match_operand:HI 1 "nonimmediate_operand" "%0,d,0, 0,0")
7341 (match_operand:HI 2 "general_operand" " d,d,n,NxQHF,Q")))
7342 (clobber (reg:CC CC_REGNUM))]
7343 "TARGET_ZARCH && s390_logical_operator_ok_p (operands)"
7350 [(set_attr "op_type" "RR,RRF,RI,SI,SS")
7351 (set_attr "cpu_facility" "*,z196,*,*,*")
7352 (set_attr "z10prop" "z10_super_E1,*,z10_super_E1,*,*")
7355 (define_insn "*andhi3_esa"
7356 [(set (match_operand:HI 0 "nonimmediate_operand" "=d,AQ,Q")
7357 (and:HI (match_operand:HI 1 "nonimmediate_operand" "%0,0,0")
7358 (match_operand:HI 2 "general_operand" "d,NxQHF,Q")))
7359 (clobber (reg:CC CC_REGNUM))]
7360 "!TARGET_ZARCH && s390_logical_operator_ok_p (operands)"
7365 [(set_attr "op_type" "RR,SI,SS")
7366 (set_attr "z10prop" "z10_super_E1,*,*")
7370 [(set (match_operand:HI 0 "s_operand" "")
7371 (and:HI (match_dup 0) (match_operand:HI 1 "immediate_operand" "")))
7372 (clobber (reg:CC CC_REGNUM))]
7375 [(set (match_dup 0) (and:QI (match_dup 0) (match_dup 1)))
7376 (clobber (reg:CC CC_REGNUM))])]
7377 "s390_narrow_logical_operator (AND, &operands[0], &operands[1]);")
7380 ; andqi3 instruction pattern(s).
7383 (define_insn "*andqi3_zarch"
7384 [(set (match_operand:QI 0 "nonimmediate_operand" "=d,d,d,Q,S,Q")
7385 (and:QI (match_operand:QI 1 "nonimmediate_operand" "%0,d,0,0,0,0")
7386 (match_operand:QI 2 "general_operand" " d,d,n,n,n,Q")))
7387 (clobber (reg:CC CC_REGNUM))]
7388 "TARGET_ZARCH && s390_logical_operator_ok_p (operands)"
7396 [(set_attr "op_type" "RR,RRF,RI,SI,SIY,SS")
7397 (set_attr "cpu_facility" "*,z196,*,*,longdisp,*")
7398 (set_attr "z10prop" "z10_super_E1,*,z10_super_E1,z10_super,z10_super,*")])
7400 (define_insn "*andqi3_esa"
7401 [(set (match_operand:QI 0 "nonimmediate_operand" "=d,Q,Q")
7402 (and:QI (match_operand:QI 1 "nonimmediate_operand" "%0,0,0")
7403 (match_operand:QI 2 "general_operand" "d,n,Q")))
7404 (clobber (reg:CC CC_REGNUM))]
7405 "!TARGET_ZARCH && s390_logical_operator_ok_p (operands)"
7410 [(set_attr "op_type" "RR,SI,SS")
7411 (set_attr "z10prop" "z10_super_E1,z10_super,*")])
7414 ; And with complement
7416 ; c = ~b & a = (b & a) ^ a
7418 (define_insn_and_split "*andc_split_<mode>"
7419 [(set (match_operand:GPR 0 "nonimmediate_operand" "")
7420 (and:GPR (not:GPR (match_operand:GPR 1 "nonimmediate_operand" ""))
7421 (match_operand:GPR 2 "general_operand" "")))
7422 (clobber (reg:CC CC_REGNUM))]
7424 && (GET_CODE (operands[0]) != MEM
7425 /* Ensure that s390_logical_operator_ok_p will succeed even
7426 on the split xor if (b & a) is stored into a pseudo. */
7427 || rtx_equal_p (operands[0], operands[2]))"
7432 [(set (match_dup 3) (and:GPR (match_dup 1) (match_dup 2)))
7433 (clobber (reg:CC CC_REGNUM))])
7435 [(set (match_dup 0) (xor:GPR (match_dup 3) (match_dup 2)))
7436 (clobber (reg:CC CC_REGNUM))])]
7438 if (reg_overlap_mentioned_p (operands[0], operands[2]))
7439 operands[3] = gen_reg_rtx (<MODE>mode);
7441 operands[3] = operands[0];
7445 ; Block and (NC) patterns.
7449 [(set (match_operand:BLK 0 "memory_operand" "=Q")
7450 (and:BLK (match_dup 0)
7451 (match_operand:BLK 1 "memory_operand" "Q")))
7452 (use (match_operand 2 "const_int_operand" "n"))
7453 (clobber (reg:CC CC_REGNUM))]
7454 "INTVAL (operands[2]) >= 1 && INTVAL (operands[2]) <= 256"
7455 "nc\t%O0(%2,%R0),%S1"
7456 [(set_attr "op_type" "SS")
7457 (set_attr "z196prop" "z196_cracked")])
7460 [(set (match_operand 0 "memory_operand" "")
7462 (match_operand 1 "memory_operand" "")))
7463 (clobber (reg:CC CC_REGNUM))]
7465 && GET_MODE (operands[0]) == GET_MODE (operands[1])
7466 && GET_MODE_SIZE (GET_MODE (operands[0])) > 0"
7468 [(set (match_dup 0) (and:BLK (match_dup 0) (match_dup 1)))
7470 (clobber (reg:CC CC_REGNUM))])]
7472 operands[2] = GEN_INT (GET_MODE_SIZE (GET_MODE (operands[0])));
7473 operands[0] = adjust_address (operands[0], BLKmode, 0);
7474 operands[1] = adjust_address (operands[1], BLKmode, 0);
7479 [(set (match_operand:BLK 0 "memory_operand" "")
7480 (and:BLK (match_dup 0)
7481 (match_operand:BLK 1 "memory_operand" "")))
7482 (use (match_operand 2 "const_int_operand" ""))
7483 (clobber (reg:CC CC_REGNUM))])
7485 [(set (match_operand:BLK 3 "memory_operand" "")
7486 (and:BLK (match_dup 3)
7487 (match_operand:BLK 4 "memory_operand" "")))
7488 (use (match_operand 5 "const_int_operand" ""))
7489 (clobber (reg:CC CC_REGNUM))])]
7490 "s390_offset_p (operands[0], operands[3], operands[2])
7491 && s390_offset_p (operands[1], operands[4], operands[2])
7492 && !s390_overlap_p (operands[0], operands[1],
7493 INTVAL (operands[2]) + INTVAL (operands[5]))
7494 && INTVAL (operands[2]) + INTVAL (operands[5]) <= 256"
7496 [(set (match_dup 6) (and:BLK (match_dup 6) (match_dup 7)))
7498 (clobber (reg:CC CC_REGNUM))])]
7499 "operands[6] = gen_rtx_MEM (BLKmode, XEXP (operands[0], 0));
7500 operands[7] = gen_rtx_MEM (BLKmode, XEXP (operands[1], 0));
7501 operands[8] = GEN_INT (INTVAL (operands[2]) + INTVAL (operands[5]));")
7505 ;;- Bit set (inclusive or) instructions.
7508 (define_expand "ior<mode>3"
7509 [(set (match_operand:INT 0 "nonimmediate_operand" "")
7510 (ior:INT (match_operand:INT 1 "nonimmediate_operand" "")
7511 (match_operand:INT 2 "general_operand" "")))
7512 (clobber (reg:CC CC_REGNUM))]
7514 "s390_expand_logical_operator (IOR, <MODE>mode, operands); DONE;")
7517 ; iordi3 instruction pattern(s).
7520 (define_insn "*iordi3_cc"
7521 [(set (reg CC_REGNUM)
7522 (compare (ior:DI (match_operand:DI 1 "nonimmediate_operand" "%0,d,0")
7523 (match_operand:DI 2 "general_operand" " d,d,T"))
7525 (set (match_operand:DI 0 "register_operand" "=d,d,d")
7526 (ior:DI (match_dup 1) (match_dup 2)))]
7527 "s390_match_ccmode(insn, CCTmode) && TARGET_ZARCH"
7532 [(set_attr "op_type" "RRE,RRF,RXY")
7533 (set_attr "cpu_facility" "*,z196,*")
7534 (set_attr "z10prop" "z10_super_E1,*,z10_super_E1")])
7536 (define_insn "*iordi3_cconly"
7537 [(set (reg CC_REGNUM)
7538 (compare (ior:DI (match_operand:DI 1 "nonimmediate_operand" "%0,d,0")
7539 (match_operand:DI 2 "general_operand" " d,d,T"))
7541 (clobber (match_scratch:DI 0 "=d,d,d"))]
7542 "s390_match_ccmode(insn, CCTmode) && TARGET_ZARCH"
7547 [(set_attr "op_type" "RRE,RRF,RXY")
7548 (set_attr "cpu_facility" "*,z196,*")
7549 (set_attr "z10prop" "z10_super_E1,*,z10_super_E1")])
7551 (define_insn "*iordi3"
7552 [(set (match_operand:DI 0 "nonimmediate_operand"
7553 "=d, d, d, d, d, d,d,d,d, AQ,Q")
7554 (ior:DI (match_operand:DI 1 "nonimmediate_operand"
7555 " %0, 0, 0, 0, 0, 0,0,d,0, 0,0")
7556 (match_operand:DI 2 "general_operand"
7557 "N0HD0,N1HD0,N2HD0,N3HD0,N0SD0,N1SD0,d,d,T,NxQD0,Q")))
7558 (clobber (reg:CC CC_REGNUM))]
7559 "TARGET_ZARCH && s390_logical_operator_ok_p (operands)"
7572 [(set_attr "op_type" "RI,RI,RI,RI,RIL,RIL,RRE,RRF,RXY,SI,SS")
7573 (set_attr "cpu_facility" "*,*,*,*,extimm,extimm,*,z196,*,*,*")
7574 (set_attr "z10prop" "z10_super_E1,
7587 [(set (match_operand:DI 0 "s_operand" "")
7588 (ior:DI (match_dup 0) (match_operand:DI 1 "immediate_operand" "")))
7589 (clobber (reg:CC CC_REGNUM))]
7592 [(set (match_dup 0) (ior:QI (match_dup 0) (match_dup 1)))
7593 (clobber (reg:CC CC_REGNUM))])]
7594 "s390_narrow_logical_operator (IOR, &operands[0], &operands[1]);")
7597 ; iorsi3 instruction pattern(s).
7600 (define_insn "*iorsi3_cc"
7601 [(set (reg CC_REGNUM)
7602 (compare (ior:SI (match_operand:SI 1 "nonimmediate_operand" "%0,0,d,0,0")
7603 (match_operand:SI 2 "general_operand" "Os,d,d,R,T"))
7605 (set (match_operand:SI 0 "register_operand" "=d,d,d,d,d")
7606 (ior:SI (match_dup 1) (match_dup 2)))]
7607 "s390_match_ccmode(insn, CCTmode)"
7614 [(set_attr "op_type" "RIL,RR,RRF,RX,RXY")
7615 (set_attr "cpu_facility" "*,*,z196,*,longdisp")
7616 (set_attr "z10prop" "z10_super_E1,z10_super_E1,*,z10_super_E1,z10_super_E1")])
7618 (define_insn "*iorsi3_cconly"
7619 [(set (reg CC_REGNUM)
7620 (compare (ior:SI (match_operand:SI 1 "nonimmediate_operand" "%0,0,d,0,0")
7621 (match_operand:SI 2 "general_operand" "Os,d,d,R,T"))
7623 (clobber (match_scratch:SI 0 "=d,d,d,d,d"))]
7624 "s390_match_ccmode(insn, CCTmode)"
7631 [(set_attr "op_type" "RIL,RR,RRF,RX,RXY")
7632 (set_attr "cpu_facility" "*,*,z196,*,longdisp")
7633 (set_attr "z10prop" "z10_super_E1,z10_super_E1,*,z10_super_E1,z10_super_E1")])
7635 (define_insn "*iorsi3_zarch"
7636 [(set (match_operand:SI 0 "nonimmediate_operand" "=d, d, d,d,d,d,d, AQ,Q")
7637 (ior:SI (match_operand:SI 1 "nonimmediate_operand" "%0, 0, 0,0,d,0,0, 0,0")
7638 (match_operand:SI 2 "general_operand" "N0HS0,N1HS0,Os,d,d,R,T,NxQS0,Q")))
7639 (clobber (reg:CC CC_REGNUM))]
7640 "TARGET_ZARCH && s390_logical_operator_ok_p (operands)"
7651 [(set_attr "op_type" "RI,RI,RIL,RR,RRF,RX,RXY,SI,SS")
7652 (set_attr "cpu_facility" "*,*,*,*,z196,*,longdisp,*,*")
7653 (set_attr "z10prop" "z10_super_E1,
7663 (define_insn "*iorsi3_esa"
7664 [(set (match_operand:SI 0 "nonimmediate_operand" "=d,d,AQ,Q")
7665 (ior:SI (match_operand:SI 1 "nonimmediate_operand" "%0,0,0,0")
7666 (match_operand:SI 2 "general_operand" "d,R,NxQS0,Q")))
7667 (clobber (reg:CC CC_REGNUM))]
7668 "!TARGET_ZARCH && s390_logical_operator_ok_p (operands)"
7674 [(set_attr "op_type" "RR,RX,SI,SS")
7675 (set_attr "z10prop" "z10_super_E1,z10_super_E1,*,*")])
7678 [(set (match_operand:SI 0 "s_operand" "")
7679 (ior:SI (match_dup 0) (match_operand:SI 1 "immediate_operand" "")))
7680 (clobber (reg:CC CC_REGNUM))]
7683 [(set (match_dup 0) (ior:QI (match_dup 0) (match_dup 1)))
7684 (clobber (reg:CC CC_REGNUM))])]
7685 "s390_narrow_logical_operator (IOR, &operands[0], &operands[1]);")
7688 ; iorhi3 instruction pattern(s).
7691 (define_insn "*iorhi3_zarch"
7692 [(set (match_operand:HI 0 "nonimmediate_operand" "=d,d,d, AQ,Q")
7693 (ior:HI (match_operand:HI 1 "nonimmediate_operand" "%0,d,0, 0,0")
7694 (match_operand:HI 2 "general_operand" " d,d,n,NxQH0,Q")))
7695 (clobber (reg:CC CC_REGNUM))]
7696 "TARGET_ZARCH && s390_logical_operator_ok_p (operands)"
7703 [(set_attr "op_type" "RR,RRF,RI,SI,SS")
7704 (set_attr "cpu_facility" "*,z196,*,*,*")
7705 (set_attr "z10prop" "z10_super_E1,*,z10_super_E1,*,*")])
7707 (define_insn "*iorhi3_esa"
7708 [(set (match_operand:HI 0 "nonimmediate_operand" "=d,AQ,Q")
7709 (ior:HI (match_operand:HI 1 "nonimmediate_operand" "%0,0,0")
7710 (match_operand:HI 2 "general_operand" "d,NxQH0,Q")))
7711 (clobber (reg:CC CC_REGNUM))]
7712 "!TARGET_ZARCH && s390_logical_operator_ok_p (operands)"
7717 [(set_attr "op_type" "RR,SI,SS")
7718 (set_attr "z10prop" "z10_super_E1,*,*")])
7721 [(set (match_operand:HI 0 "s_operand" "")
7722 (ior:HI (match_dup 0) (match_operand:HI 1 "immediate_operand" "")))
7723 (clobber (reg:CC CC_REGNUM))]
7726 [(set (match_dup 0) (ior:QI (match_dup 0) (match_dup 1)))
7727 (clobber (reg:CC CC_REGNUM))])]
7728 "s390_narrow_logical_operator (IOR, &operands[0], &operands[1]);")
7731 ; iorqi3 instruction pattern(s).
7734 (define_insn "*iorqi3_zarch"
7735 [(set (match_operand:QI 0 "nonimmediate_operand" "=d,d,d,Q,S,Q")
7736 (ior:QI (match_operand:QI 1 "nonimmediate_operand" "%0,d,0,0,0,0")
7737 (match_operand:QI 2 "general_operand" " d,d,n,n,n,Q")))
7738 (clobber (reg:CC CC_REGNUM))]
7739 "TARGET_ZARCH && s390_logical_operator_ok_p (operands)"
7747 [(set_attr "op_type" "RR,RRF,RI,SI,SIY,SS")
7748 (set_attr "cpu_facility" "*,z196,*,*,longdisp,*")
7749 (set_attr "z10prop" "z10_super_E1,*,z10_super_E1,
7750 z10_super,z10_super,*")])
7752 (define_insn "*iorqi3_esa"
7753 [(set (match_operand:QI 0 "nonimmediate_operand" "=d,Q,Q")
7754 (ior:QI (match_operand:QI 1 "nonimmediate_operand" "%0,0,0")
7755 (match_operand:QI 2 "general_operand" "d,n,Q")))
7756 (clobber (reg:CC CC_REGNUM))]
7757 "!TARGET_ZARCH && s390_logical_operator_ok_p (operands)"
7762 [(set_attr "op_type" "RR,SI,SS")
7763 (set_attr "z10prop" "z10_super_E1,z10_super,*")])
7766 ; Block inclusive or (OC) patterns.
7770 [(set (match_operand:BLK 0 "memory_operand" "=Q")
7771 (ior:BLK (match_dup 0)
7772 (match_operand:BLK 1 "memory_operand" "Q")))
7773 (use (match_operand 2 "const_int_operand" "n"))
7774 (clobber (reg:CC CC_REGNUM))]
7775 "INTVAL (operands[2]) >= 1 && INTVAL (operands[2]) <= 256"
7776 "oc\t%O0(%2,%R0),%S1"
7777 [(set_attr "op_type" "SS")
7778 (set_attr "z196prop" "z196_cracked")])
7781 [(set (match_operand 0 "memory_operand" "")
7783 (match_operand 1 "memory_operand" "")))
7784 (clobber (reg:CC CC_REGNUM))]
7786 && GET_MODE (operands[0]) == GET_MODE (operands[1])
7787 && GET_MODE_SIZE (GET_MODE (operands[0])) > 0"
7789 [(set (match_dup 0) (ior:BLK (match_dup 0) (match_dup 1)))
7791 (clobber (reg:CC CC_REGNUM))])]
7793 operands[2] = GEN_INT (GET_MODE_SIZE (GET_MODE (operands[0])));
7794 operands[0] = adjust_address (operands[0], BLKmode, 0);
7795 operands[1] = adjust_address (operands[1], BLKmode, 0);
7800 [(set (match_operand:BLK 0 "memory_operand" "")
7801 (ior:BLK (match_dup 0)
7802 (match_operand:BLK 1 "memory_operand" "")))
7803 (use (match_operand 2 "const_int_operand" ""))
7804 (clobber (reg:CC CC_REGNUM))])
7806 [(set (match_operand:BLK 3 "memory_operand" "")
7807 (ior:BLK (match_dup 3)
7808 (match_operand:BLK 4 "memory_operand" "")))
7809 (use (match_operand 5 "const_int_operand" ""))
7810 (clobber (reg:CC CC_REGNUM))])]
7811 "s390_offset_p (operands[0], operands[3], operands[2])
7812 && s390_offset_p (operands[1], operands[4], operands[2])
7813 && !s390_overlap_p (operands[0], operands[1],
7814 INTVAL (operands[2]) + INTVAL (operands[5]))
7815 && INTVAL (operands[2]) + INTVAL (operands[5]) <= 256"
7817 [(set (match_dup 6) (ior:BLK (match_dup 6) (match_dup 7)))
7819 (clobber (reg:CC CC_REGNUM))])]
7820 "operands[6] = gen_rtx_MEM (BLKmode, XEXP (operands[0], 0));
7821 operands[7] = gen_rtx_MEM (BLKmode, XEXP (operands[1], 0));
7822 operands[8] = GEN_INT (INTVAL (operands[2]) + INTVAL (operands[5]));")
7826 ;;- Xor instructions.
7829 (define_expand "xor<mode>3"
7830 [(set (match_operand:INT 0 "nonimmediate_operand" "")
7831 (xor:INT (match_operand:INT 1 "nonimmediate_operand" "")
7832 (match_operand:INT 2 "general_operand" "")))
7833 (clobber (reg:CC CC_REGNUM))]
7835 "s390_expand_logical_operator (XOR, <MODE>mode, operands); DONE;")
7837 ; Combine replaces (xor (x) (const_int -1)) with (not (x)) when doing
7838 ; simplifications. So its better to have something matching.
7840 [(set (match_operand:INT 0 "nonimmediate_operand" "")
7841 (not:INT (match_operand:INT 1 "nonimmediate_operand" "")))]
7844 [(set (match_dup 0) (xor:INT (match_dup 1) (match_dup 2)))
7845 (clobber (reg:CC CC_REGNUM))])]
7847 operands[2] = constm1_rtx;
7848 if (!s390_logical_operator_ok_p (operands))
7853 ; xordi3 instruction pattern(s).
7856 (define_insn "*xordi3_cc"
7857 [(set (reg CC_REGNUM)
7858 (compare (xor:DI (match_operand:DI 1 "nonimmediate_operand" "%0,d,0")
7859 (match_operand:DI 2 "general_operand" " d,d,T"))
7861 (set (match_operand:DI 0 "register_operand" "=d,d,d")
7862 (xor:DI (match_dup 1) (match_dup 2)))]
7863 "s390_match_ccmode(insn, CCTmode) && TARGET_ZARCH"
7868 [(set_attr "op_type" "RRE,RRF,RXY")
7869 (set_attr "cpu_facility" "*,z196,*")
7870 (set_attr "z10prop" "z10_super_E1,*,z10_super_E1")])
7872 (define_insn "*xordi3_cconly"
7873 [(set (reg CC_REGNUM)
7874 (compare (xor:DI (match_operand:DI 1 "nonimmediate_operand" "%0,d,0")
7875 (match_operand:DI 2 "general_operand" " d,d,T"))
7877 (clobber (match_scratch:DI 0 "=d,d,d"))]
7878 "s390_match_ccmode(insn, CCTmode) && TARGET_ZARCH"
7883 [(set_attr "op_type" "RRE,RRF,RXY")
7884 (set_attr "cpu_facility" "*,z196,*")
7885 (set_attr "z10prop" "z10_super_E1,*,z10_super_E1")])
7887 (define_insn "*xordi3"
7888 [(set (match_operand:DI 0 "nonimmediate_operand" "=d, d,d,d,d, AQ,Q")
7889 (xor:DI (match_operand:DI 1 "nonimmediate_operand" "%0, 0,0,d,0, 0,0")
7890 (match_operand:DI 2 "general_operand" "N0SD0,N1SD0,d,d,T,NxQD0,Q")))
7891 (clobber (reg:CC CC_REGNUM))]
7892 "TARGET_ZARCH && s390_logical_operator_ok_p (operands)"
7901 [(set_attr "op_type" "RIL,RIL,RRE,RRF,RXY,SI,SS")
7902 (set_attr "cpu_facility" "extimm,extimm,*,z196,*,*,*")
7903 (set_attr "z10prop" "z10_super_E1,z10_super_E1,z10_super_E1,
7904 *,z10_super_E1,*,*")])
7907 [(set (match_operand:DI 0 "s_operand" "")
7908 (xor:DI (match_dup 0) (match_operand:DI 1 "immediate_operand" "")))
7909 (clobber (reg:CC CC_REGNUM))]
7912 [(set (match_dup 0) (xor:QI (match_dup 0) (match_dup 1)))
7913 (clobber (reg:CC CC_REGNUM))])]
7914 "s390_narrow_logical_operator (XOR, &operands[0], &operands[1]);")
7917 ; xorsi3 instruction pattern(s).
7920 (define_insn "*xorsi3_cc"
7921 [(set (reg CC_REGNUM)
7922 (compare (xor:SI (match_operand:SI 1 "nonimmediate_operand" "%0,0,d,0,0")
7923 (match_operand:SI 2 "general_operand" "Os,d,d,R,T"))
7925 (set (match_operand:SI 0 "register_operand" "=d,d,d,d,d")
7926 (xor:SI (match_dup 1) (match_dup 2)))]
7927 "s390_match_ccmode(insn, CCTmode)"
7934 [(set_attr "op_type" "RIL,RR,RRF,RX,RXY")
7935 (set_attr "cpu_facility" "*,*,z196,*,longdisp")
7936 (set_attr "z10prop" "z10_super_E1,z10_super_E1,*,
7937 z10_super_E1,z10_super_E1")])
7939 (define_insn "*xorsi3_cconly"
7940 [(set (reg CC_REGNUM)
7941 (compare (xor:SI (match_operand:SI 1 "nonimmediate_operand" "%0,0,d,0,0")
7942 (match_operand:SI 2 "general_operand" "Os,d,d,R,T"))
7944 (clobber (match_scratch:SI 0 "=d,d,d,d,d"))]
7945 "s390_match_ccmode(insn, CCTmode)"
7952 [(set_attr "op_type" "RIL,RR,RRF,RX,RXY")
7953 (set_attr "cpu_facility" "*,*,z196,*,longdisp")
7954 (set_attr "z10prop" "z10_super_E1,z10_super_E1,*,
7955 z10_super_E1,z10_super_E1")])
7957 (define_insn "*xorsi3"
7958 [(set (match_operand:SI 0 "nonimmediate_operand" "=d,d,d,d,d, AQ,Q")
7959 (xor:SI (match_operand:SI 1 "nonimmediate_operand" "%0,0,d,0,0, 0,0")
7960 (match_operand:SI 2 "general_operand" "Os,d,d,R,T,NxQS0,Q")))
7961 (clobber (reg:CC CC_REGNUM))]
7962 "s390_logical_operator_ok_p (operands)"
7971 [(set_attr "op_type" "RIL,RR,RRF,RX,RXY,SI,SS")
7972 (set_attr "cpu_facility" "*,*,z196,*,longdisp,*,*")
7973 (set_attr "z10prop" "z10_super_E1,z10_super_E1,*,
7974 z10_super_E1,z10_super_E1,*,*")])
7977 [(set (match_operand:SI 0 "s_operand" "")
7978 (xor:SI (match_dup 0) (match_operand:SI 1 "immediate_operand" "")))
7979 (clobber (reg:CC CC_REGNUM))]
7982 [(set (match_dup 0) (xor:QI (match_dup 0) (match_dup 1)))
7983 (clobber (reg:CC CC_REGNUM))])]
7984 "s390_narrow_logical_operator (XOR, &operands[0], &operands[1]);")
7987 ; xorhi3 instruction pattern(s).
7990 (define_insn "*xorhi3"
7991 [(set (match_operand:HI 0 "nonimmediate_operand" "=d,d,d, AQ,Q")
7992 (xor:HI (match_operand:HI 1 "nonimmediate_operand" "%0,0,d, 0,0")
7993 (match_operand:HI 2 "general_operand" "Os,d,d,NxQH0,Q")))
7994 (clobber (reg:CC CC_REGNUM))]
7995 "s390_logical_operator_ok_p (operands)"
8002 [(set_attr "op_type" "RIL,RR,RRF,SI,SS")
8003 (set_attr "cpu_facility" "*,*,z196,*,*")
8004 (set_attr "z10prop" "z10_super_E1,z10_super_E1,*,*,*")])
8007 [(set (match_operand:HI 0 "s_operand" "")
8008 (xor:HI (match_dup 0) (match_operand:HI 1 "immediate_operand" "")))
8009 (clobber (reg:CC CC_REGNUM))]
8012 [(set (match_dup 0) (xor:QI (match_dup 0) (match_dup 1)))
8013 (clobber (reg:CC CC_REGNUM))])]
8014 "s390_narrow_logical_operator (XOR, &operands[0], &operands[1]);")
8017 ; xorqi3 instruction pattern(s).
8020 (define_insn "*xorqi3"
8021 [(set (match_operand:QI 0 "nonimmediate_operand" "=d,d,d,Q,S,Q")
8022 (xor:QI (match_operand:QI 1 "nonimmediate_operand" "%0,0,d,0,0,0")
8023 (match_operand:QI 2 "general_operand" "Os,d,d,n,n,Q")))
8024 (clobber (reg:CC CC_REGNUM))]
8025 "s390_logical_operator_ok_p (operands)"
8033 [(set_attr "op_type" "RIL,RR,RRF,SI,SIY,SS")
8034 (set_attr "cpu_facility" "*,*,z196,*,longdisp,*")
8035 (set_attr "z10prop" "z10_super_E1,z10_super_E1,*,z10_super,z10_super,*")])
8039 ; Block exclusive or (XC) patterns.
8043 [(set (match_operand:BLK 0 "memory_operand" "=Q")
8044 (xor:BLK (match_dup 0)
8045 (match_operand:BLK 1 "memory_operand" "Q")))
8046 (use (match_operand 2 "const_int_operand" "n"))
8047 (clobber (reg:CC CC_REGNUM))]
8048 "INTVAL (operands[2]) >= 1 && INTVAL (operands[2]) <= 256"
8049 "xc\t%O0(%2,%R0),%S1"
8050 [(set_attr "op_type" "SS")])
8053 [(set (match_operand 0 "memory_operand" "")
8055 (match_operand 1 "memory_operand" "")))
8056 (clobber (reg:CC CC_REGNUM))]
8058 && GET_MODE (operands[0]) == GET_MODE (operands[1])
8059 && GET_MODE_SIZE (GET_MODE (operands[0])) > 0"
8061 [(set (match_dup 0) (xor:BLK (match_dup 0) (match_dup 1)))
8063 (clobber (reg:CC CC_REGNUM))])]
8065 operands[2] = GEN_INT (GET_MODE_SIZE (GET_MODE (operands[0])));
8066 operands[0] = adjust_address (operands[0], BLKmode, 0);
8067 operands[1] = adjust_address (operands[1], BLKmode, 0);
8072 [(set (match_operand:BLK 0 "memory_operand" "")
8073 (xor:BLK (match_dup 0)
8074 (match_operand:BLK 1 "memory_operand" "")))
8075 (use (match_operand 2 "const_int_operand" ""))
8076 (clobber (reg:CC CC_REGNUM))])
8078 [(set (match_operand:BLK 3 "memory_operand" "")
8079 (xor:BLK (match_dup 3)
8080 (match_operand:BLK 4 "memory_operand" "")))
8081 (use (match_operand 5 "const_int_operand" ""))
8082 (clobber (reg:CC CC_REGNUM))])]
8083 "s390_offset_p (operands[0], operands[3], operands[2])
8084 && s390_offset_p (operands[1], operands[4], operands[2])
8085 && !s390_overlap_p (operands[0], operands[1],
8086 INTVAL (operands[2]) + INTVAL (operands[5]))
8087 && INTVAL (operands[2]) + INTVAL (operands[5]) <= 256"
8089 [(set (match_dup 6) (xor:BLK (match_dup 6) (match_dup 7)))
8091 (clobber (reg:CC CC_REGNUM))])]
8092 "operands[6] = gen_rtx_MEM (BLKmode, XEXP (operands[0], 0));
8093 operands[7] = gen_rtx_MEM (BLKmode, XEXP (operands[1], 0));
8094 operands[8] = GEN_INT (INTVAL (operands[2]) + INTVAL (operands[5]));")
8097 ; Block xor (XC) patterns with src == dest.
8100 (define_insn "*xc_zero"
8101 [(set (match_operand:BLK 0 "memory_operand" "=Q")
8103 (use (match_operand 1 "const_int_operand" "n"))
8104 (clobber (reg:CC CC_REGNUM))]
8105 "INTVAL (operands[1]) >= 1 && INTVAL (operands[1]) <= 256"
8106 "xc\t%O0(%1,%R0),%S0"
8107 [(set_attr "op_type" "SS")
8108 (set_attr "z196prop" "z196_cracked")])
8112 [(set (match_operand:BLK 0 "memory_operand" "")
8114 (use (match_operand 1 "const_int_operand" ""))
8115 (clobber (reg:CC CC_REGNUM))])
8117 [(set (match_operand:BLK 2 "memory_operand" "")
8119 (use (match_operand 3 "const_int_operand" ""))
8120 (clobber (reg:CC CC_REGNUM))])]
8121 "s390_offset_p (operands[0], operands[2], operands[1])
8122 && INTVAL (operands[1]) + INTVAL (operands[3]) <= 256"
8124 [(set (match_dup 4) (const_int 0))
8126 (clobber (reg:CC CC_REGNUM))])]
8127 "operands[4] = gen_rtx_MEM (BLKmode, XEXP (operands[0], 0));
8128 operands[5] = GEN_INT (INTVAL (operands[1]) + INTVAL (operands[3]));")
8132 ;;- Negate instructions.
8136 ; neg(di|si)2 instruction pattern(s).
8139 (define_expand "neg<mode>2"
8141 [(set (match_operand:DSI 0 "register_operand" "=d")
8142 (neg:DSI (match_operand:DSI 1 "register_operand" "d")))
8143 (clobber (reg:CC CC_REGNUM))])]
8147 (define_insn "*negdi2_sign_cc"
8148 [(set (reg CC_REGNUM)
8149 (compare (neg:DI (ashiftrt:DI (ashift:DI (subreg:DI
8150 (match_operand:SI 1 "register_operand" "d") 0)
8151 (const_int 32)) (const_int 32)))
8153 (set (match_operand:DI 0 "register_operand" "=d")
8154 (neg:DI (sign_extend:DI (match_dup 1))))]
8155 "TARGET_ZARCH && s390_match_ccmode (insn, CCAmode)"
8157 [(set_attr "op_type" "RRE")
8158 (set_attr "z10prop" "z10_c")])
8160 (define_insn "*negdi2_sign"
8161 [(set (match_operand:DI 0 "register_operand" "=d")
8162 (neg:DI (sign_extend:DI (match_operand:SI 1 "register_operand" "d"))))
8163 (clobber (reg:CC CC_REGNUM))]
8166 [(set_attr "op_type" "RRE")
8167 (set_attr "z10prop" "z10_c")])
8170 (define_insn "*neg<mode>2_cc"
8171 [(set (reg CC_REGNUM)
8172 (compare (neg:GPR (match_operand:GPR 1 "register_operand" "d"))
8174 (set (match_operand:GPR 0 "register_operand" "=d")
8175 (neg:GPR (match_dup 1)))]
8176 "s390_match_ccmode (insn, CCAmode)"
8178 [(set_attr "op_type" "RR<E>")
8179 (set_attr "z10prop" "z10_super_c_E1")])
8182 (define_insn "*neg<mode>2_cconly"
8183 [(set (reg CC_REGNUM)
8184 (compare (neg:GPR (match_operand:GPR 1 "register_operand" "d"))
8186 (clobber (match_scratch:GPR 0 "=d"))]
8187 "s390_match_ccmode (insn, CCAmode)"
8189 [(set_attr "op_type" "RR<E>")
8190 (set_attr "z10prop" "z10_super_c_E1")])
8193 (define_insn "*neg<mode>2"
8194 [(set (match_operand:GPR 0 "register_operand" "=d")
8195 (neg:GPR (match_operand:GPR 1 "register_operand" "d")))
8196 (clobber (reg:CC CC_REGNUM))]
8199 [(set_attr "op_type" "RR<E>")
8200 (set_attr "z10prop" "z10_super_c_E1")])
8202 (define_insn "*negdi2_31"
8203 [(set (match_operand:DI 0 "register_operand" "=d")
8204 (neg:DI (match_operand:DI 1 "register_operand" "d")))
8205 (clobber (reg:CC CC_REGNUM))]
8209 ; Split a DImode NEG on 31bit into 2 SImode NEGs
8211 ; Doing the twos complement separately on the SImode parts does an
8212 ; unwanted +1 on the high part which needs to be subtracted afterwards
8213 ; ... unless the +1 on the low part created an overflow.
8216 [(set (match_operand:DI 0 "register_operand" "")
8217 (neg:DI (match_operand:DI 1 "register_operand" "")))
8218 (clobber (reg:CC CC_REGNUM))]
8220 && (REGNO (operands[0]) == REGNO (operands[1])
8221 || s390_split_ok_p (operands[0], operands[1], DImode, 0))
8222 && reload_completed"
8224 [(set (match_dup 2) (neg:SI (match_dup 3)))
8225 (clobber (reg:CC CC_REGNUM))])
8227 [(set (reg:CCAP CC_REGNUM)
8228 (compare:CCAP (neg:SI (match_dup 5)) (const_int 0)))
8229 (set (match_dup 4) (neg:SI (match_dup 5)))])
8231 (if_then_else (ne (reg:CCAP CC_REGNUM) (const_int 0))
8233 (label_ref (match_dup 6))))
8235 [(set (match_dup 2) (plus:SI (match_dup 2) (const_int -1)))
8236 (clobber (reg:CC CC_REGNUM))])
8238 "operands[2] = operand_subword (operands[0], 0, 0, DImode);
8239 operands[3] = operand_subword (operands[1], 0, 0, DImode);
8240 operands[4] = operand_subword (operands[0], 1, 0, DImode);
8241 operands[5] = operand_subword (operands[1], 1, 0, DImode);
8242 operands[6] = gen_label_rtx ();")
8244 ; Like above but first make a copy of the low part of the src operand
8245 ; since it might overlap with the high part of the destination.
8248 [(set (match_operand:DI 0 "register_operand" "")
8249 (neg:DI (match_operand:DI 1 "register_operand" "")))
8250 (clobber (reg:CC CC_REGNUM))]
8252 && s390_split_ok_p (operands[0], operands[1], DImode, 1)
8253 && reload_completed"
8254 [; Make a backup of op5 first
8255 (set (match_dup 4) (match_dup 5))
8256 ; Setting op2 here might clobber op5
8258 [(set (match_dup 2) (neg:SI (match_dup 3)))
8259 (clobber (reg:CC CC_REGNUM))])
8261 [(set (reg:CCAP CC_REGNUM)
8262 (compare:CCAP (neg:SI (match_dup 4)) (const_int 0)))
8263 (set (match_dup 4) (neg:SI (match_dup 4)))])
8265 (if_then_else (ne (reg:CCAP CC_REGNUM) (const_int 0))
8267 (label_ref (match_dup 6))))
8269 [(set (match_dup 2) (plus:SI (match_dup 2) (const_int -1)))
8270 (clobber (reg:CC CC_REGNUM))])
8272 "operands[2] = operand_subword (operands[0], 0, 0, DImode);
8273 operands[3] = operand_subword (operands[1], 0, 0, DImode);
8274 operands[4] = operand_subword (operands[0], 1, 0, DImode);
8275 operands[5] = operand_subword (operands[1], 1, 0, DImode);
8276 operands[6] = gen_label_rtx ();")
8279 ; neg(df|sf)2 instruction pattern(s).
8282 (define_expand "neg<mode>2"
8284 [(set (match_operand:BFP 0 "register_operand" "=f")
8285 (neg:BFP (match_operand:BFP 1 "register_operand" "f")))
8286 (clobber (reg:CC CC_REGNUM))])]
8290 ; lcxbr, lcdbr, lcebr
8291 (define_insn "*neg<mode>2_cc"
8292 [(set (reg CC_REGNUM)
8293 (compare (neg:BFP (match_operand:BFP 1 "register_operand" "f"))
8294 (match_operand:BFP 2 "const0_operand" "")))
8295 (set (match_operand:BFP 0 "register_operand" "=f")
8296 (neg:BFP (match_dup 1)))]
8297 "s390_match_ccmode (insn, CCSmode) && TARGET_HARD_FLOAT"
8299 [(set_attr "op_type" "RRE")
8300 (set_attr "type" "fsimp<mode>")])
8302 ; lcxbr, lcdbr, lcebr
8303 (define_insn "*neg<mode>2_cconly"
8304 [(set (reg CC_REGNUM)
8305 (compare (neg:BFP (match_operand:BFP 1 "register_operand" "f"))
8306 (match_operand:BFP 2 "const0_operand" "")))
8307 (clobber (match_scratch:BFP 0 "=f"))]
8308 "s390_match_ccmode (insn, CCSmode) && TARGET_HARD_FLOAT"
8310 [(set_attr "op_type" "RRE")
8311 (set_attr "type" "fsimp<mode>")])
8314 (define_insn "*neg<mode>2_nocc"
8315 [(set (match_operand:FP 0 "register_operand" "=f")
8316 (neg:FP (match_operand:FP 1 "register_operand" "<fT0>")))]
8319 [(set_attr "op_type" "RRE")
8320 (set_attr "type" "fsimp<mode>")])
8322 ; lcxbr, lcdbr, lcebr
8323 ; FIXME: wflcdb does not clobber cc
8324 (define_insn "*neg<mode>2"
8325 [(set (match_operand:BFP 0 "register_operand" "=f,v")
8326 (neg:BFP (match_operand:BFP 1 "register_operand" "f,v")))
8327 (clobber (reg:CC CC_REGNUM))]
8332 [(set_attr "op_type" "RRE,VRR")
8333 (set_attr "cpu_facility" "*,vec")
8334 (set_attr "type" "fsimp<mode>,*")
8335 (set_attr "enabled" "*,<DFDI>")])
8339 ;;- Absolute value instructions.
8343 ; abs(di|si)2 instruction pattern(s).
8346 (define_insn "*absdi2_sign_cc"
8347 [(set (reg CC_REGNUM)
8348 (compare (abs:DI (ashiftrt:DI (ashift:DI (subreg:DI
8349 (match_operand:SI 1 "register_operand" "d") 0)
8350 (const_int 32)) (const_int 32)))
8352 (set (match_operand:DI 0 "register_operand" "=d")
8353 (abs:DI (sign_extend:DI (match_dup 1))))]
8354 "TARGET_ZARCH && s390_match_ccmode (insn, CCAmode)"
8356 [(set_attr "op_type" "RRE")
8357 (set_attr "z10prop" "z10_c")])
8359 (define_insn "*absdi2_sign"
8360 [(set (match_operand:DI 0 "register_operand" "=d")
8361 (abs:DI (sign_extend:DI (match_operand:SI 1 "register_operand" "d"))))
8362 (clobber (reg:CC CC_REGNUM))]
8365 [(set_attr "op_type" "RRE")
8366 (set_attr "z10prop" "z10_c")])
8369 (define_insn "*abs<mode>2_cc"
8370 [(set (reg CC_REGNUM)
8371 (compare (abs:GPR (match_operand:DI 1 "register_operand" "d"))
8373 (set (match_operand:GPR 0 "register_operand" "=d")
8374 (abs:GPR (match_dup 1)))]
8375 "s390_match_ccmode (insn, CCAmode)"
8377 [(set_attr "op_type" "RR<E>")
8378 (set_attr "z10prop" "z10_c")])
8381 (define_insn "*abs<mode>2_cconly"
8382 [(set (reg CC_REGNUM)
8383 (compare (abs:GPR (match_operand:GPR 1 "register_operand" "d"))
8385 (clobber (match_scratch:GPR 0 "=d"))]
8386 "s390_match_ccmode (insn, CCAmode)"
8388 [(set_attr "op_type" "RR<E>")
8389 (set_attr "z10prop" "z10_c")])
8392 (define_insn "abs<mode>2"
8393 [(set (match_operand:GPR 0 "register_operand" "=d")
8394 (abs:GPR (match_operand:GPR 1 "register_operand" "d")))
8395 (clobber (reg:CC CC_REGNUM))]
8398 [(set_attr "op_type" "RR<E>")
8399 (set_attr "z10prop" "z10_c")])
8402 ; abs(df|sf)2 instruction pattern(s).
8405 (define_expand "abs<mode>2"
8407 [(set (match_operand:BFP 0 "register_operand" "=f")
8408 (abs:BFP (match_operand:BFP 1 "register_operand" "f")))
8409 (clobber (reg:CC CC_REGNUM))])]
8413 ; lpxbr, lpdbr, lpebr
8414 (define_insn "*abs<mode>2_cc"
8415 [(set (reg CC_REGNUM)
8416 (compare (abs:BFP (match_operand:BFP 1 "register_operand" "f"))
8417 (match_operand:BFP 2 "const0_operand" "")))
8418 (set (match_operand:BFP 0 "register_operand" "=f")
8419 (abs:BFP (match_dup 1)))]
8420 "s390_match_ccmode (insn, CCSmode) && TARGET_HARD_FLOAT"
8422 [(set_attr "op_type" "RRE")
8423 (set_attr "type" "fsimp<mode>")])
8425 ; lpxbr, lpdbr, lpebr
8426 (define_insn "*abs<mode>2_cconly"
8427 [(set (reg CC_REGNUM)
8428 (compare (abs:BFP (match_operand:BFP 1 "register_operand" "f"))
8429 (match_operand:BFP 2 "const0_operand" "")))
8430 (clobber (match_scratch:BFP 0 "=f"))]
8431 "s390_match_ccmode (insn, CCSmode) && TARGET_HARD_FLOAT"
8433 [(set_attr "op_type" "RRE")
8434 (set_attr "type" "fsimp<mode>")])
8437 (define_insn "*abs<mode>2_nocc"
8438 [(set (match_operand:FP 0 "register_operand" "=f")
8439 (abs:FP (match_operand:FP 1 "register_operand" "<fT0>")))]
8442 [(set_attr "op_type" "RRE")
8443 (set_attr "type" "fsimp<mode>")])
8445 ; lpxbr, lpdbr, lpebr
8446 ; FIXME: wflpdb does not clobber cc
8447 (define_insn "*abs<mode>2"
8448 [(set (match_operand:BFP 0 "register_operand" "=f,v")
8449 (abs:BFP (match_operand:BFP 1 "register_operand" "f,v")))
8450 (clobber (reg:CC CC_REGNUM))]
8455 [(set_attr "op_type" "RRE,VRR")
8456 (set_attr "cpu_facility" "*,vec")
8457 (set_attr "type" "fsimp<mode>,*")
8458 (set_attr "enabled" "*,<DFDI>")])
8462 ;;- Negated absolute value instructions
8469 (define_insn "*negabsdi2_sign_cc"
8470 [(set (reg CC_REGNUM)
8471 (compare (neg:DI (abs:DI (ashiftrt:DI (ashift:DI (subreg:DI
8472 (match_operand:SI 1 "register_operand" "d") 0)
8473 (const_int 32)) (const_int 32))))
8475 (set (match_operand:DI 0 "register_operand" "=d")
8476 (neg:DI (abs:DI (sign_extend:DI (match_dup 1)))))]
8477 "TARGET_ZARCH && s390_match_ccmode (insn, CCAmode)"
8479 [(set_attr "op_type" "RRE")
8480 (set_attr "z10prop" "z10_c")])
8482 (define_insn "*negabsdi2_sign"
8483 [(set (match_operand:DI 0 "register_operand" "=d")
8484 (neg:DI (abs:DI (sign_extend:DI
8485 (match_operand:SI 1 "register_operand" "d")))))
8486 (clobber (reg:CC CC_REGNUM))]
8489 [(set_attr "op_type" "RRE")
8490 (set_attr "z10prop" "z10_c")])
8493 (define_insn "*negabs<mode>2_cc"
8494 [(set (reg CC_REGNUM)
8495 (compare (neg:GPR (abs:GPR (match_operand:GPR 1 "register_operand" "d")))
8497 (set (match_operand:GPR 0 "register_operand" "=d")
8498 (neg:GPR (abs:GPR (match_dup 1))))]
8499 "s390_match_ccmode (insn, CCAmode)"
8501 [(set_attr "op_type" "RR<E>")
8502 (set_attr "z10prop" "z10_c")])
8505 (define_insn "*negabs<mode>2_cconly"
8506 [(set (reg CC_REGNUM)
8507 (compare (neg:GPR (abs:GPR (match_operand:GPR 1 "register_operand" "d")))
8509 (clobber (match_scratch:GPR 0 "=d"))]
8510 "s390_match_ccmode (insn, CCAmode)"
8512 [(set_attr "op_type" "RR<E>")
8513 (set_attr "z10prop" "z10_c")])
8516 (define_insn "*negabs<mode>2"
8517 [(set (match_operand:GPR 0 "register_operand" "=d")
8518 (neg:GPR (abs:GPR (match_operand:GPR 1 "register_operand" "d"))))
8519 (clobber (reg:CC CC_REGNUM))]
8522 [(set_attr "op_type" "RR<E>")
8523 (set_attr "z10prop" "z10_c")])
8529 ; lnxbr, lndbr, lnebr
8530 (define_insn "*negabs<mode>2_cc"
8531 [(set (reg CC_REGNUM)
8532 (compare (neg:BFP (abs:BFP (match_operand:BFP 1 "register_operand" "f")))
8533 (match_operand:BFP 2 "const0_operand" "")))
8534 (set (match_operand:BFP 0 "register_operand" "=f")
8535 (neg:BFP (abs:BFP (match_dup 1))))]
8536 "s390_match_ccmode (insn, CCSmode) && TARGET_HARD_FLOAT"
8538 [(set_attr "op_type" "RRE")
8539 (set_attr "type" "fsimp<mode>")])
8541 ; lnxbr, lndbr, lnebr
8542 (define_insn "*negabs<mode>2_cconly"
8543 [(set (reg CC_REGNUM)
8544 (compare (neg:BFP (abs:BFP (match_operand:BFP 1 "register_operand" "f")))
8545 (match_operand:BFP 2 "const0_operand" "")))
8546 (clobber (match_scratch:BFP 0 "=f"))]
8547 "s390_match_ccmode (insn, CCSmode) && TARGET_HARD_FLOAT"
8549 [(set_attr "op_type" "RRE")
8550 (set_attr "type" "fsimp<mode>")])
8553 (define_insn "*negabs<mode>2_nocc"
8554 [(set (match_operand:FP 0 "register_operand" "=f")
8555 (neg:FP (abs:FP (match_operand:BFP 1 "register_operand" "<fT0>"))))]
8558 [(set_attr "op_type" "RRE")
8559 (set_attr "type" "fsimp<mode>")])
8561 ; lnxbr, lndbr, lnebr
8562 ; FIXME: wflndb does not clobber cc
8563 (define_insn "*negabs<mode>2"
8564 [(set (match_operand:BFP 0 "register_operand" "=f,v")
8565 (neg:BFP (abs:BFP (match_operand:BFP 1 "register_operand" "f,v"))))
8566 (clobber (reg:CC CC_REGNUM))]
8571 [(set_attr "op_type" "RRE,VRR")
8572 (set_attr "cpu_facility" "*,vec")
8573 (set_attr "type" "fsimp<mode>,*")
8574 (set_attr "enabled" "*,<DFDI>")])
8577 ;;- Square root instructions.
8581 ; sqrt(df|sf)2 instruction pattern(s).
8584 ; sqxbr, sqdbr, sqebr, sqdb, sqeb
8585 (define_insn "sqrt<mode>2"
8586 [(set (match_operand:BFP 0 "register_operand" "=f,f,v")
8587 (sqrt:BFP (match_operand:BFP 1 "general_operand" "f,R,v")))]
8593 [(set_attr "op_type" "RRE,RXE,VRR")
8594 (set_attr "type" "fsqrt<mode>")
8595 (set_attr "cpu_facility" "*,*,vec")
8596 (set_attr "enabled" "*,<DSF>,<DFDI>")])
8600 ;;- One complement instructions.
8604 ; one_cmpl(di|si|hi|qi)2 instruction pattern(s).
8607 (define_expand "one_cmpl<mode>2"
8609 [(set (match_operand:INT 0 "register_operand" "")
8610 (xor:INT (match_operand:INT 1 "register_operand" "")
8612 (clobber (reg:CC CC_REGNUM))])]
8618 ;; Find leftmost bit instructions.
8621 (define_expand "clzdi2"
8622 [(set (match_operand:DI 0 "register_operand" "=d")
8623 (clz:DI (match_operand:DI 1 "register_operand" "d")))]
8624 "TARGET_EXTIMM && TARGET_ZARCH"
8628 rtx wide_reg = gen_reg_rtx (TImode);
8629 rtx msb = gen_rtx_CONST_INT (DImode, HOST_WIDE_INT_1U << 63);
8631 clz_equal = gen_rtx_CLZ (DImode, operands[1]);
8633 emit_insn (gen_clztidi2 (wide_reg, operands[1], msb));
8635 insn = emit_move_insn (operands[0], gen_highpart (DImode, wide_reg));
8636 set_unique_reg_note (insn, REG_EQUAL, clz_equal);
8641 (define_insn "clztidi2"
8642 [(set (match_operand:TI 0 "register_operand" "=d")
8646 (xor:DI (match_operand:DI 1 "register_operand" "d")
8647 (lshiftrt (match_operand:DI 2 "const_int_operand" "")
8648 (subreg:SI (clz:DI (match_dup 1)) 4))))
8651 (zero_extend:TI (clz:DI (match_dup 1)))))
8652 (clobber (reg:CC CC_REGNUM))]
8653 "UINTVAL (operands[2]) == HOST_WIDE_INT_1U << 63
8654 && TARGET_EXTIMM && TARGET_ZARCH"
8656 [(set_attr "op_type" "RRE")])
8660 ;;- Rotate instructions.
8664 ; rotl(di|si)3 instruction pattern(s).
8667 (define_expand "rotl<mode>3"
8668 [(set (match_operand:GPR 0 "register_operand" "")
8669 (rotate:GPR (match_operand:GPR 1 "register_operand" "")
8670 (match_operand:SI 2 "nonmemory_operand" "")))]
8675 (define_insn "*rotl<mode>3<addr_style_op><masked_op>"
8676 [(set (match_operand:GPR 0 "register_operand" "=d")
8677 (rotate:GPR (match_operand:GPR 1 "register_operand" "d")
8678 (match_operand:SI 2 "nonmemory_operand" "an")))]
8680 "rll<g>\t%0,%1,<addr_style_op_ops>"
8681 [(set_attr "op_type" "RSE")
8682 (set_attr "atype" "reg")
8683 (set_attr "z10prop" "z10_super_E1")])
8687 ;;- Shift instructions.
8691 ; (ashl|lshr)(di|si)3 instruction pattern(s).
8692 ; Left shifts and logical right shifts
8694 (define_expand "<shift><mode>3"
8695 [(set (match_operand:DSI 0 "register_operand" "")
8696 (SHIFT:DSI (match_operand:DSI 1 "register_operand" "")
8697 (match_operand:SI 2 "nonmemory_operand" "")))]
8701 ; ESA 64 bit register pair shift with reg or imm shift count
8703 (define_insn "*<shift>di3_31<addr_style_op><masked_op>"
8704 [(set (match_operand:DI 0 "register_operand" "=d")
8705 (SHIFT:DI (match_operand:DI 1 "register_operand" "0")
8706 (match_operand:SI 2 "nonmemory_operand" "an")))]
8708 "s<lr>dl\t%0,<addr_style_op_ops>"
8709 [(set_attr "op_type" "RS")
8710 (set_attr "atype" "reg")
8711 (set_attr "z196prop" "z196_cracked")])
8714 ; 64 bit register shift with reg or imm shift count
8715 ; sll, srl, sllg, srlg, sllk, srlk
8716 (define_insn "*<shift><mode>3<addr_style_op><masked_op>"
8717 [(set (match_operand:GPR 0 "register_operand" "=d, d")
8718 (SHIFT:GPR (match_operand:GPR 1 "register_operand" "<d0>, d")
8719 (match_operand:SI 2 "nonmemory_operand" "an,an")))]
8722 s<lr>l<g>\t%0,<1><addr_style_op_ops>
8723 s<lr>l<gk>\t%0,%1,<addr_style_op_ops>"
8724 [(set_attr "op_type" "RS<E>,RSY")
8725 (set_attr "atype" "reg,reg")
8726 (set_attr "cpu_facility" "*,z196")
8727 (set_attr "z10prop" "z10_super_E1,*")])
8730 ; ashr(di|si)3 instruction pattern(s).
8731 ; Arithmetic right shifts
8733 (define_expand "ashr<mode>3"
8735 [(set (match_operand:DSI 0 "register_operand" "")
8736 (ashiftrt:DSI (match_operand:DSI 1 "register_operand" "")
8737 (match_operand:SI 2 "nonmemory_operand" "")))
8738 (clobber (reg:CC CC_REGNUM))])]
8742 ; FIXME: The number of alternatives is doubled here to match the fix
8743 ; number of 2 in the subst pattern for the (clobber (match_scratch...
8744 ; The right fix should be to support match_scratch in the output
8745 ; pattern of a define_subst.
8746 (define_insn "*ashrdi3_31<addr_style_op_cc><masked_op_cc><setcc><cconly>"
8747 [(set (match_operand:DI 0 "register_operand" "=d, d")
8748 (ashiftrt:DI (match_operand:DI 1 "register_operand" "0, 0")
8749 (match_operand:SI 2 "nonmemory_operand" "an,an")))
8750 (clobber (reg:CC CC_REGNUM))]
8753 srda\t%0,<addr_style_op_cc_ops>
8754 srda\t%0,<addr_style_op_cc_ops>"
8755 [(set_attr "op_type" "RS")
8756 (set_attr "atype" "reg")])
8760 (define_insn "*ashr<mode>3<addr_style_op_cc><masked_op_cc><setcc><cconly>"
8761 [(set (match_operand:GPR 0 "register_operand" "=d, d")
8762 (ashiftrt:GPR (match_operand:GPR 1 "register_operand" "<d0>, d")
8763 (match_operand:SI 2 "nonmemory_operand" "an,an")))
8764 (clobber (reg:CC CC_REGNUM))]
8767 sra<g>\t%0,<1><addr_style_op_cc_ops>
8768 sra<gk>\t%0,%1,<addr_style_op_cc_ops>"
8769 [(set_attr "op_type" "RS<E>,RSY")
8770 (set_attr "atype" "reg")
8771 (set_attr "cpu_facility" "*,z196")
8772 (set_attr "z10prop" "z10_super_E1,*")])
8776 ;; Branch instruction patterns.
8779 (define_expand "cbranch<mode>4"
8781 (if_then_else (match_operator 0 "comparison_operator"
8782 [(match_operand:GPR 1 "register_operand" "")
8783 (match_operand:GPR 2 "general_operand" "")])
8784 (label_ref (match_operand 3 "" ""))
8787 "s390_emit_jump (operands[3],
8788 s390_emit_compare (GET_CODE (operands[0]), operands[1], operands[2]));
8791 (define_expand "cbranch<mode>4"
8793 (if_then_else (match_operator 0 "comparison_operator"
8794 [(match_operand:FP 1 "register_operand" "")
8795 (match_operand:FP 2 "general_operand" "")])
8796 (label_ref (match_operand 3 "" ""))
8799 "s390_emit_jump (operands[3],
8800 s390_emit_compare (GET_CODE (operands[0]), operands[1], operands[2]));
8803 (define_expand "cbranchcc4"
8805 (if_then_else (match_operator 0 "s390_comparison"
8806 [(match_operand 1 "cc_reg_operand" "")
8807 (match_operand 2 "const_int_operand" "")])
8808 (label_ref (match_operand 3 "" ""))
8815 ;;- Conditional jump instructions.
8818 (define_insn "*cjump_64"
8821 (match_operator 1 "s390_comparison" [(reg CC_REGNUM)
8822 (match_operand 2 "const_int_operand" "")])
8823 (label_ref (match_operand 0 "" ""))
8827 if (get_attr_length (insn) == 4)
8830 return "jg%C1\t%l0";
8832 [(set_attr "op_type" "RI")
8833 (set_attr "type" "branch")
8834 (set (attr "length")
8835 (if_then_else (lt (abs (minus (pc) (match_dup 0))) (const_int 60000))
8836 (const_int 4) (const_int 6)))])
8838 (define_insn "*cjump_31"
8841 (match_operator 1 "s390_comparison" [(reg CC_REGNUM)
8842 (match_operand 2 "const_int_operand" "")])
8843 (label_ref (match_operand 0 "" ""))
8847 gcc_assert (get_attr_length (insn) == 4);
8850 [(set_attr "op_type" "RI")
8851 (set_attr "type" "branch")
8852 (set (attr "length")
8853 (if_then_else (not (match_test "flag_pic"))
8854 (if_then_else (lt (abs (minus (pc) (match_dup 0))) (const_int 60000))
8855 (const_int 4) (const_int 6))
8856 (if_then_else (lt (abs (minus (pc) (match_dup 0))) (const_int 60000))
8857 (const_int 4) (const_int 8))))])
8859 (define_insn "*cjump_long"
8862 (match_operator 1 "s390_comparison" [(reg CC_REGNUM) (const_int 0)])
8863 (match_operand 0 "address_operand" "ZQZR")
8867 if (get_attr_op_type (insn) == OP_TYPE_RR)
8872 [(set (attr "op_type")
8873 (if_then_else (match_operand 0 "register_operand" "")
8874 (const_string "RR") (const_string "RX")))
8875 (set_attr "type" "branch")
8876 (set_attr "atype" "agen")])
8878 ;; A conditional return instruction.
8879 (define_insn "*c<code>"
8882 (match_operator 0 "s390_comparison" [(reg CC_REGNUM) (const_int 0)])
8885 "s390_can_use_<code>_insn ()"
8887 [(set_attr "op_type" "RR")
8888 (set_attr "type" "jsr")
8889 (set_attr "atype" "agen")])
8892 ;;- Negated conditional jump instructions.
8895 (define_insn "*icjump_64"
8898 (match_operator 1 "s390_comparison" [(reg CC_REGNUM) (const_int 0)])
8900 (label_ref (match_operand 0 "" ""))))]
8903 if (get_attr_length (insn) == 4)
8906 return "jg%D1\t%l0";
8908 [(set_attr "op_type" "RI")
8909 (set_attr "type" "branch")
8910 (set (attr "length")
8911 (if_then_else (lt (abs (minus (pc) (match_dup 0))) (const_int 60000))
8912 (const_int 4) (const_int 6)))])
8914 (define_insn "*icjump_31"
8917 (match_operator 1 "s390_comparison" [(reg CC_REGNUM) (const_int 0)])
8919 (label_ref (match_operand 0 "" ""))))]
8922 gcc_assert (get_attr_length (insn) == 4);
8925 [(set_attr "op_type" "RI")
8926 (set_attr "type" "branch")
8927 (set (attr "length")
8928 (if_then_else (not (match_test "flag_pic"))
8929 (if_then_else (lt (abs (minus (pc) (match_dup 0))) (const_int 60000))
8930 (const_int 4) (const_int 6))
8931 (if_then_else (lt (abs (minus (pc) (match_dup 0))) (const_int 60000))
8932 (const_int 4) (const_int 8))))])
8934 (define_insn "*icjump_long"
8937 (match_operator 1 "s390_comparison" [(reg CC_REGNUM) (const_int 0)])
8939 (match_operand 0 "address_operand" "ZQZR")))]
8942 if (get_attr_op_type (insn) == OP_TYPE_RR)
8947 [(set (attr "op_type")
8948 (if_then_else (match_operand 0 "register_operand" "")
8949 (const_string "RR") (const_string "RX")))
8950 (set_attr "type" "branch")
8951 (set_attr "atype" "agen")])
8954 ;;- Trap instructions.
8958 [(trap_if (const_int 1) (const_int 0))]
8961 [(set_attr "op_type" "RI")
8962 (set_attr "type" "branch")])
8964 (define_expand "ctrap<mode>4"
8965 [(trap_if (match_operator 0 "comparison_operator"
8966 [(match_operand:GPR 1 "register_operand" "")
8967 (match_operand:GPR 2 "general_operand" "")])
8968 (match_operand 3 "const0_operand" ""))]
8971 rtx cond = s390_emit_compare (GET_CODE (operands[0]),
8972 operands[1], operands[2]);
8973 emit_insn (gen_condtrap (cond, XEXP (cond, 0)));
8977 (define_expand "ctrap<mode>4"
8978 [(trap_if (match_operator 0 "comparison_operator"
8979 [(match_operand:FP 1 "register_operand" "")
8980 (match_operand:FP 2 "general_operand" "")])
8981 (match_operand 3 "const0_operand" ""))]
8984 rtx cond = s390_emit_compare (GET_CODE (operands[0]),
8985 operands[1], operands[2]);
8986 emit_insn (gen_condtrap (cond, XEXP (cond, 0)));
8990 (define_insn "condtrap"
8991 [(trap_if (match_operator 0 "s390_comparison"
8992 [(match_operand 1 "cc_reg_operand" "c")
8997 [(set_attr "op_type" "RI")
8998 (set_attr "type" "branch")])
9000 ; crt, cgrt, cit, cgit
9001 (define_insn "*cmp_and_trap_signed_int<mode>"
9002 [(trap_if (match_operator 0 "s390_signed_integer_comparison"
9003 [(match_operand:GPR 1 "register_operand" "d,d")
9004 (match_operand:GPR 2 "nonmemory_operand" "d,K")])
9010 [(set_attr "op_type" "RRF,RIE")
9011 (set_attr "type" "branch")
9012 (set_attr "z10prop" "z10_super_c,z10_super")])
9014 ; clrt, clgrt, clfit, clgit, clt, clgt
9015 (define_insn "*cmp_and_trap_unsigned_int<mode>"
9016 [(trap_if (match_operator 0 "s390_unsigned_integer_comparison"
9017 [(match_operand:GPR 1 "register_operand" "d,d,d")
9018 (match_operand:GPR 2 "general_operand" "d,D,T")])
9025 [(set_attr "op_type" "RRF,RIE,RSY")
9026 (set_attr "type" "branch")
9027 (set_attr "z10prop" "z10_super_c,z10_super,*")
9028 (set_attr "cpu_facility" "z10,z10,zEC12")])
9031 (define_insn "*load_and_trap<mode>"
9032 [(trap_if (eq (match_operand:GPR 0 "memory_operand" "T")
9035 (set (match_operand:GPR 1 "register_operand" "=d")
9039 [(set_attr "op_type" "RXY")])
9043 ;;- Loop instructions.
9045 ;; This is all complicated by the fact that since this is a jump insn
9046 ;; we must handle our own output reloads.
9050 ; This splitter will be matched by combine and has to add the 2 moves
9051 ; necessary to load the compare and the increment values into a
9052 ; register pair as needed by brxle.
9054 (define_insn_and_split "*brx_stage1_<GPR:mode>"
9057 (match_operator 6 "s390_brx_operator"
9058 [(plus:GPR (match_operand:GPR 1 "register_operand" "")
9059 (match_operand:GPR 2 "general_operand" ""))
9060 (match_operand:GPR 3 "register_operand" "")])
9061 (label_ref (match_operand 0 "" ""))
9063 (set (match_operand:GPR 4 "nonimmediate_operand" "")
9064 (plus:GPR (match_dup 1) (match_dup 2)))
9065 (clobber (match_scratch:GPR 5 ""))]
9068 "!reload_completed && !reload_in_progress"
9069 [(set (match_dup 7) (match_dup 2)) ; the increment
9070 (set (match_dup 8) (match_dup 3)) ; the comparison value
9071 (parallel [(set (pc)
9074 [(plus:GPR (match_dup 1) (match_dup 7))
9076 (label_ref (match_dup 0))
9079 (plus:GPR (match_dup 1) (match_dup 7)))
9080 (clobber (match_dup 5))
9081 (clobber (reg:CC CC_REGNUM))])]
9083 rtx dreg = gen_reg_rtx (word_mode == DImode ? TImode : DImode);
9084 operands[7] = gen_lowpart (<GPR:MODE>mode,
9085 gen_highpart (word_mode, dreg));
9086 operands[8] = gen_lowpart (<GPR:MODE>mode,
9087 gen_lowpart (word_mode, dreg));
9092 (define_insn_and_split "*brxg_64bit"
9095 (match_operator 5 "s390_brx_operator"
9096 [(plus:DI (match_operand:DI 1 "register_operand" "d,d,d")
9097 (subreg:DI (match_operand:TI 2 "register_operand" "d,d,d") 0))
9098 (subreg:DI (match_dup 2) 8)])
9099 (label_ref (match_operand 0 "" ""))
9101 (set (match_operand:DI 3 "nonimmediate_operand" "=1,?X,?X")
9102 (plus:DI (match_dup 1)
9103 (subreg:DI (match_dup 2) 0)))
9104 (clobber (match_scratch:DI 4 "=X,&1,&?d"))
9105 (clobber (reg:CC CC_REGNUM))]
9108 if (which_alternative != 0)
9110 else if (get_attr_length (insn) == 6)
9111 return "brx%E5g\t%1,%2,%l0";
9113 return "agr\t%1,%2\;cgr\t%1,%M2\;jg%C5\t%l0";
9115 "&& reload_completed
9116 && (!REG_P (operands[3])
9117 || !rtx_equal_p (operands[1], operands[3]))"
9118 [(set (match_dup 4) (match_dup 1))
9119 (parallel [(set (match_dup 4) (plus:DI (match_dup 4) (subreg:DI (match_dup 2) 0)))
9120 (clobber (reg:CC CC_REGNUM))])
9121 (set (reg:CCS CC_REGNUM) (compare:CCS (match_dup 4) (subreg:DI (match_dup 2) 8)))
9122 (set (match_dup 3) (match_dup 4))
9123 (set (pc) (if_then_else (match_op_dup 5 [(reg:CCS CC_REGNUM) (const_int 0)])
9124 (label_ref (match_dup 0))
9127 [(set_attr "op_type" "RIE")
9128 (set_attr "type" "branch")
9129 (set (attr "length")
9130 (if_then_else (lt (abs (minus (pc) (match_dup 0))) (const_int 60000))
9131 (const_int 6) (const_int 16)))])
9135 (define_insn_and_split "*brx_64bit"
9138 (match_operator 5 "s390_brx_operator"
9139 [(plus:SI (match_operand:SI 1 "register_operand" "d,d,d")
9140 (subreg:SI (match_operand:TI 2 "register_operand" "d,d,d") 4))
9141 (subreg:SI (match_dup 2) 12)])
9142 (label_ref (match_operand 0 "" ""))
9144 (set (match_operand:SI 3 "nonimmediate_operand" "=1,?X,?X")
9145 (plus:SI (match_dup 1)
9146 (subreg:SI (match_dup 2) 4)))
9147 (clobber (match_scratch:SI 4 "=X,&1,&?d"))
9148 (clobber (reg:CC CC_REGNUM))]
9151 if (which_alternative != 0)
9153 else if (get_attr_length (insn) == 6)
9154 return "brx%C5\t%1,%2,%l0";
9156 return "ar\t%1,%2\;cr\t%1,%M2\;jg%C5\t%l0";
9158 "&& reload_completed
9159 && (!REG_P (operands[3])
9160 || !rtx_equal_p (operands[1], operands[3]))"
9161 [(set (match_dup 4) (match_dup 1))
9162 (parallel [(set (match_dup 4) (plus:SI (match_dup 4) (subreg:SI (match_dup 2) 4)))
9163 (clobber (reg:CC CC_REGNUM))])
9164 (set (reg:CCS CC_REGNUM) (compare:CCS (match_dup 4) (subreg:SI (match_dup 2) 12)))
9165 (set (match_dup 3) (match_dup 4))
9166 (set (pc) (if_then_else (match_op_dup 5 [(reg:CCS CC_REGNUM) (const_int 0)])
9167 (label_ref (match_dup 0))
9170 [(set_attr "op_type" "RSI")
9171 (set_attr "type" "branch")
9172 (set (attr "length")
9173 (if_then_else (lt (abs (minus (pc) (match_dup 0))) (const_int 60000))
9174 (const_int 6) (const_int 14)))])
9178 (define_insn_and_split "*brx_31bit"
9181 (match_operator 5 "s390_brx_operator"
9182 [(plus:SI (match_operand:SI 1 "register_operand" "d,d,d")
9183 (subreg:SI (match_operand:DI 2 "register_operand" "d,d,d") 0))
9184 (subreg:SI (match_dup 2) 4)])
9185 (label_ref (match_operand 0 "" ""))
9187 (set (match_operand:SI 3 "nonimmediate_operand" "=1,?X,?X")
9188 (plus:SI (match_dup 1)
9189 (subreg:SI (match_dup 2) 0)))
9190 (clobber (match_scratch:SI 4 "=X,&1,&?d"))
9191 (clobber (reg:CC CC_REGNUM))]
9192 "!TARGET_ZARCH && TARGET_CPU_ZARCH"
9194 if (which_alternative != 0)
9196 else if (get_attr_length (insn) == 6)
9197 return "brx%C5\t%1,%2,%l0";
9199 return "ar\t%1,%2\;cr\t%1,%M2\;jg%C5\t%l0";
9201 "&& reload_completed
9202 && (!REG_P (operands[3])
9203 || !rtx_equal_p (operands[1], operands[3]))"
9204 [(set (match_dup 4) (match_dup 1))
9205 (parallel [(set (match_dup 4) (plus:SI (match_dup 4) (subreg:SI (match_dup 2) 0)))
9206 (clobber (reg:CC CC_REGNUM))])
9207 (set (reg:CCS CC_REGNUM) (compare:CCS (match_dup 4) (subreg:SI (match_dup 2) 4)))
9208 (set (match_dup 3) (match_dup 4))
9209 (set (pc) (if_then_else (match_op_dup 5 [(reg:CCS CC_REGNUM) (const_int 0)])
9210 (label_ref (match_dup 0))
9213 [(set_attr "op_type" "RSI")
9214 (set_attr "type" "branch")
9215 (set (attr "length")
9216 (if_then_else (lt (abs (minus (pc) (match_dup 0))) (const_int 60000))
9217 (const_int 6) (const_int 14)))])
9222 (define_expand "doloop_end"
9223 [(use (match_operand 0 "" "")) ; loop pseudo
9224 (use (match_operand 1 "" ""))] ; label
9227 if (GET_MODE (operands[0]) == SImode && !TARGET_CPU_ZARCH)
9228 emit_jump_insn (gen_doloop_si31 (operands[1], operands[0], operands[0]));
9229 else if (GET_MODE (operands[0]) == SImode && TARGET_CPU_ZARCH)
9230 emit_jump_insn (gen_doloop_si64 (operands[1], operands[0], operands[0]));
9231 else if (GET_MODE (operands[0]) == DImode && TARGET_ZARCH)
9232 emit_jump_insn (gen_doloop_di (operands[1], operands[0], operands[0]));
9239 (define_insn_and_split "doloop_si64"
9242 (ne (match_operand:SI 1 "register_operand" "d,d,d")
9244 (label_ref (match_operand 0 "" ""))
9246 (set (match_operand:SI 2 "nonimmediate_operand" "=1,?X,?X")
9247 (plus:SI (match_dup 1) (const_int -1)))
9248 (clobber (match_scratch:SI 3 "=X,&1,&?d"))
9249 (clobber (reg:CC CC_REGNUM))]
9252 if (which_alternative != 0)
9254 else if (get_attr_length (insn) == 4)
9255 return "brct\t%1,%l0";
9257 return "ahi\t%1,-1\;jgne\t%l0";
9259 "&& reload_completed
9260 && (! REG_P (operands[2])
9261 || ! rtx_equal_p (operands[1], operands[2]))"
9262 [(set (match_dup 3) (match_dup 1))
9263 (parallel [(set (reg:CCAN CC_REGNUM)
9264 (compare:CCAN (plus:SI (match_dup 3) (const_int -1))
9266 (set (match_dup 3) (plus:SI (match_dup 3) (const_int -1)))])
9267 (set (match_dup 2) (match_dup 3))
9268 (set (pc) (if_then_else (ne (reg:CCAN CC_REGNUM) (const_int 0))
9269 (label_ref (match_dup 0))
9272 [(set_attr "op_type" "RI")
9273 ; Strictly speaking, the z10 properties are valid for brct only, however, it does not
9274 ; hurt us in the (rare) case of ahi.
9275 (set_attr "z10prop" "z10_super_E1")
9276 (set_attr "type" "branch")
9277 (set (attr "length")
9278 (if_then_else (lt (abs (minus (pc) (match_dup 0))) (const_int 60000))
9279 (const_int 4) (const_int 10)))])
9281 (define_insn_and_split "doloop_si31"
9284 (ne (match_operand:SI 1 "register_operand" "d,d,d")
9286 (label_ref (match_operand 0 "" ""))
9288 (set (match_operand:SI 2 "nonimmediate_operand" "=1,?X,?X")
9289 (plus:SI (match_dup 1) (const_int -1)))
9290 (clobber (match_scratch:SI 3 "=X,&1,&?d"))
9291 (clobber (reg:CC CC_REGNUM))]
9294 if (which_alternative != 0)
9296 else if (get_attr_length (insn) == 4)
9297 return "brct\t%1,%l0";
9301 "&& reload_completed
9302 && (! REG_P (operands[2])
9303 || ! rtx_equal_p (operands[1], operands[2]))"
9304 [(set (match_dup 3) (match_dup 1))
9305 (parallel [(set (reg:CCAN CC_REGNUM)
9306 (compare:CCAN (plus:SI (match_dup 3) (const_int -1))
9308 (set (match_dup 3) (plus:SI (match_dup 3) (const_int -1)))])
9309 (set (match_dup 2) (match_dup 3))
9310 (set (pc) (if_then_else (ne (reg:CCAN CC_REGNUM) (const_int 0))
9311 (label_ref (match_dup 0))
9314 [(set_attr "op_type" "RI")
9315 ; Strictly speaking, the z10 properties are valid for brct only, however, it does not
9316 ; hurt us in the (rare) case of ahi.
9317 (set_attr "z10prop" "z10_super_E1")
9318 (set_attr "type" "branch")
9319 (set (attr "length")
9320 (if_then_else (not (match_test "flag_pic"))
9321 (if_then_else (lt (abs (minus (pc) (match_dup 0))) (const_int 60000))
9322 (const_int 4) (const_int 6))
9323 (if_then_else (lt (abs (minus (pc) (match_dup 0))) (const_int 60000))
9324 (const_int 4) (const_int 8))))])
9326 (define_insn "*doloop_si_long"
9329 (ne (match_operand:SI 1 "register_operand" "d")
9331 (match_operand 0 "address_operand" "ZR")
9333 (set (match_operand:SI 2 "register_operand" "=1")
9334 (plus:SI (match_dup 1) (const_int -1)))
9335 (clobber (match_scratch:SI 3 "=X"))
9336 (clobber (reg:CC CC_REGNUM))]
9339 if (get_attr_op_type (insn) == OP_TYPE_RR)
9340 return "bctr\t%1,%0";
9342 return "bct\t%1,%a0";
9344 [(set (attr "op_type")
9345 (if_then_else (match_operand 0 "register_operand" "")
9346 (const_string "RR") (const_string "RX")))
9347 (set_attr "type" "branch")
9348 (set_attr "atype" "agen")
9349 (set_attr "z10prop" "z10_c")
9350 (set_attr "z196prop" "z196_cracked")])
9352 (define_insn_and_split "doloop_di"
9355 (ne (match_operand:DI 1 "register_operand" "d,d,d")
9357 (label_ref (match_operand 0 "" ""))
9359 (set (match_operand:DI 2 "nonimmediate_operand" "=1,?X,?X")
9360 (plus:DI (match_dup 1) (const_int -1)))
9361 (clobber (match_scratch:DI 3 "=X,&1,&?d"))
9362 (clobber (reg:CC CC_REGNUM))]
9365 if (which_alternative != 0)
9367 else if (get_attr_length (insn) == 4)
9368 return "brctg\t%1,%l0";
9370 return "aghi\t%1,-1\;jgne\t%l0";
9372 "&& reload_completed
9373 && (! REG_P (operands[2])
9374 || ! rtx_equal_p (operands[1], operands[2]))"
9375 [(set (match_dup 3) (match_dup 1))
9376 (parallel [(set (reg:CCAN CC_REGNUM)
9377 (compare:CCAN (plus:DI (match_dup 3) (const_int -1))
9379 (set (match_dup 3) (plus:DI (match_dup 3) (const_int -1)))])
9380 (set (match_dup 2) (match_dup 3))
9381 (set (pc) (if_then_else (ne (reg:CCAN CC_REGNUM) (const_int 0))
9382 (label_ref (match_dup 0))
9385 [(set_attr "op_type" "RI")
9386 ; Strictly speaking, the z10 properties are valid for brct only, however, it does not
9387 ; hurt us in the (rare) case of ahi.
9388 (set_attr "z10prop" "z10_super_E1")
9389 (set_attr "type" "branch")
9390 (set (attr "length")
9391 (if_then_else (lt (abs (minus (pc) (match_dup 0))) (const_int 60000))
9392 (const_int 4) (const_int 10)))])
9395 ;;- Unconditional jump instructions.
9399 ; jump instruction pattern(s).
9402 (define_expand "jump"
9403 [(match_operand 0 "" "")]
9405 "s390_emit_jump (operands[0], NULL_RTX); DONE;")
9407 (define_insn "*jump64"
9408 [(set (pc) (label_ref (match_operand 0 "" "")))]
9411 if (get_attr_length (insn) == 4)
9416 [(set_attr "op_type" "RI")
9417 (set_attr "type" "branch")
9418 (set (attr "length")
9419 (if_then_else (lt (abs (minus (pc) (match_dup 0))) (const_int 60000))
9420 (const_int 4) (const_int 6)))])
9422 (define_insn "*jump31"
9423 [(set (pc) (label_ref (match_operand 0 "" "")))]
9426 gcc_assert (get_attr_length (insn) == 4);
9429 [(set_attr "op_type" "RI")
9430 (set_attr "type" "branch")
9431 (set (attr "length")
9432 (if_then_else (not (match_test "flag_pic"))
9433 (if_then_else (lt (abs (minus (pc) (match_dup 0))) (const_int 60000))
9434 (const_int 4) (const_int 6))
9435 (if_then_else (lt (abs (minus (pc) (match_dup 0))) (const_int 60000))
9436 (const_int 4) (const_int 8))))])
9439 ; indirect-jump instruction pattern(s).
9442 (define_insn "indirect_jump"
9443 [(set (pc) (match_operand 0 "address_operand" "ZR"))]
9446 if (get_attr_op_type (insn) == OP_TYPE_RR)
9451 [(set (attr "op_type")
9452 (if_then_else (match_operand 0 "register_operand" "")
9453 (const_string "RR") (const_string "RX")))
9454 (set_attr "type" "branch")
9455 (set_attr "atype" "agen")])
9458 ; casesi instruction pattern(s).
9461 (define_insn "casesi_jump"
9462 [(set (pc) (match_operand 0 "address_operand" "ZR"))
9463 (use (label_ref (match_operand 1 "" "")))]
9466 if (get_attr_op_type (insn) == OP_TYPE_RR)
9471 [(set (attr "op_type")
9472 (if_then_else (match_operand 0 "register_operand" "")
9473 (const_string "RR") (const_string "RX")))
9474 (set_attr "type" "branch")
9475 (set_attr "atype" "agen")])
9477 (define_expand "casesi"
9478 [(match_operand:SI 0 "general_operand" "")
9479 (match_operand:SI 1 "general_operand" "")
9480 (match_operand:SI 2 "general_operand" "")
9481 (label_ref (match_operand 3 "" ""))
9482 (label_ref (match_operand 4 "" ""))]
9485 rtx index = gen_reg_rtx (SImode);
9486 rtx base = gen_reg_rtx (Pmode);
9487 rtx target = gen_reg_rtx (Pmode);
9489 emit_move_insn (index, operands[0]);
9490 emit_insn (gen_subsi3 (index, index, operands[1]));
9491 emit_cmp_and_jump_insns (index, operands[2], GTU, NULL_RTX, SImode, 1,
9494 if (Pmode != SImode)
9495 index = convert_to_mode (Pmode, index, 1);
9496 if (GET_CODE (index) != REG)
9497 index = copy_to_mode_reg (Pmode, index);
9500 emit_insn (gen_ashldi3 (index, index, GEN_INT (3)));
9502 emit_insn (gen_ashlsi3 (index, index, const2_rtx));
9504 emit_move_insn (base, gen_rtx_LABEL_REF (Pmode, operands[3]));
9506 index = gen_const_mem (Pmode, gen_rtx_PLUS (Pmode, base, index));
9507 emit_move_insn (target, index);
9510 target = gen_rtx_PLUS (Pmode, base, target);
9511 emit_jump_insn (gen_casesi_jump (target, operands[3]));
9518 ;;- Jump to subroutine.
9523 ; untyped call instruction pattern(s).
9526 ;; Call subroutine returning any type.
9527 (define_expand "untyped_call"
9528 [(parallel [(call (match_operand 0 "" "")
9530 (match_operand 1 "" "")
9531 (match_operand 2 "" "")])]
9536 emit_call_insn (gen_call (operands[0], const0_rtx, const0_rtx));
9538 for (i = 0; i < XVECLEN (operands[2], 0); i++)
9540 rtx set = XVECEXP (operands[2], 0, i);
9541 emit_move_insn (SET_DEST (set), SET_SRC (set));
9544 /* The optimizer does not know that the call sets the function value
9545 registers we stored in the result block. We avoid problems by
9546 claiming that all hard registers are used and clobbered at this
9548 emit_insn (gen_blockage ());
9553 ;; UNSPEC_VOLATILE is considered to use and clobber all hard registers and
9554 ;; all of memory. This blocks insns from being moved across this point.
9556 (define_insn "blockage"
9557 [(unspec_volatile [(const_int 0)] UNSPECV_BLOCKAGE)]
9560 [(set_attr "type" "none")
9561 (set_attr "length" "0")])
9567 (define_expand "sibcall"
9568 [(call (match_operand 0 "" "")
9569 (match_operand 1 "" ""))]
9572 s390_emit_call (XEXP (operands[0], 0), NULL_RTX, NULL_RTX, NULL_RTX);
9576 (define_insn "*sibcall_br"
9577 [(call (mem:QI (reg SIBCALL_REGNUM))
9578 (match_operand 0 "const_int_operand" "n"))]
9579 "SIBLING_CALL_P (insn)
9580 && GET_MODE (XEXP (XEXP (PATTERN (insn), 0), 0)) == Pmode"
9582 [(set_attr "op_type" "RR")
9583 (set_attr "type" "branch")
9584 (set_attr "atype" "agen")])
9586 (define_insn "*sibcall_brc"
9587 [(call (mem:QI (match_operand 0 "bras_sym_operand" "X"))
9588 (match_operand 1 "const_int_operand" "n"))]
9589 "SIBLING_CALL_P (insn) && TARGET_SMALL_EXEC"
9591 [(set_attr "op_type" "RI")
9592 (set_attr "type" "branch")])
9594 (define_insn "*sibcall_brcl"
9595 [(call (mem:QI (match_operand 0 "bras_sym_operand" "X"))
9596 (match_operand 1 "const_int_operand" "n"))]
9597 "SIBLING_CALL_P (insn) && TARGET_CPU_ZARCH"
9599 [(set_attr "op_type" "RIL")
9600 (set_attr "type" "branch")])
9603 ; sibcall_value patterns
9606 (define_expand "sibcall_value"
9607 [(set (match_operand 0 "" "")
9608 (call (match_operand 1 "" "")
9609 (match_operand 2 "" "")))]
9612 s390_emit_call (XEXP (operands[1], 0), NULL_RTX, operands[0], NULL_RTX);
9616 (define_insn "*sibcall_value_br"
9617 [(set (match_operand 0 "" "")
9618 (call (mem:QI (reg SIBCALL_REGNUM))
9619 (match_operand 1 "const_int_operand" "n")))]
9620 "SIBLING_CALL_P (insn)
9621 && GET_MODE (XEXP (XEXP (XEXP (PATTERN (insn), 1), 0), 0)) == Pmode"
9623 [(set_attr "op_type" "RR")
9624 (set_attr "type" "branch")
9625 (set_attr "atype" "agen")])
9627 (define_insn "*sibcall_value_brc"
9628 [(set (match_operand 0 "" "")
9629 (call (mem:QI (match_operand 1 "bras_sym_operand" "X"))
9630 (match_operand 2 "const_int_operand" "n")))]
9631 "SIBLING_CALL_P (insn) && TARGET_SMALL_EXEC"
9633 [(set_attr "op_type" "RI")
9634 (set_attr "type" "branch")])
9636 (define_insn "*sibcall_value_brcl"
9637 [(set (match_operand 0 "" "")
9638 (call (mem:QI (match_operand 1 "bras_sym_operand" "X"))
9639 (match_operand 2 "const_int_operand" "n")))]
9640 "SIBLING_CALL_P (insn) && TARGET_CPU_ZARCH"
9642 [(set_attr "op_type" "RIL")
9643 (set_attr "type" "branch")])
9647 ; call instruction pattern(s).
9650 (define_expand "call"
9651 [(call (match_operand 0 "" "")
9652 (match_operand 1 "" ""))
9653 (use (match_operand 2 "" ""))]
9656 s390_emit_call (XEXP (operands[0], 0), NULL_RTX, NULL_RTX,
9657 gen_rtx_REG (Pmode, RETURN_REGNUM));
9661 (define_insn "*bras"
9662 [(call (mem:QI (match_operand 0 "bras_sym_operand" "X"))
9663 (match_operand 1 "const_int_operand" "n"))
9664 (clobber (match_operand 2 "register_operand" "=r"))]
9665 "!SIBLING_CALL_P (insn)
9666 && TARGET_SMALL_EXEC
9667 && GET_MODE (operands[2]) == Pmode"
9669 [(set_attr "op_type" "RI")
9670 (set_attr "type" "jsr")
9671 (set_attr "z196prop" "z196_cracked")])
9673 (define_insn "*brasl"
9674 [(call (mem:QI (match_operand 0 "bras_sym_operand" "X"))
9675 (match_operand 1 "const_int_operand" "n"))
9676 (clobber (match_operand 2 "register_operand" "=r"))]
9677 "!SIBLING_CALL_P (insn)
9679 && GET_MODE (operands[2]) == Pmode"
9681 [(set_attr "op_type" "RIL")
9682 (set_attr "type" "jsr")
9683 (set_attr "z196prop" "z196_cracked")])
9685 (define_insn "*basr"
9686 [(call (mem:QI (match_operand 0 "address_operand" "ZR"))
9687 (match_operand 1 "const_int_operand" "n"))
9688 (clobber (match_operand 2 "register_operand" "=r"))]
9689 "!SIBLING_CALL_P (insn) && GET_MODE (operands[2]) == Pmode"
9691 if (get_attr_op_type (insn) == OP_TYPE_RR)
9692 return "basr\t%2,%0";
9694 return "bas\t%2,%a0";
9696 [(set (attr "op_type")
9697 (if_then_else (match_operand 0 "register_operand" "")
9698 (const_string "RR") (const_string "RX")))
9699 (set_attr "type" "jsr")
9700 (set_attr "atype" "agen")
9701 (set_attr "z196prop" "z196_cracked")])
9704 ; call_value instruction pattern(s).
9707 (define_expand "call_value"
9708 [(set (match_operand 0 "" "")
9709 (call (match_operand 1 "" "")
9710 (match_operand 2 "" "")))
9711 (use (match_operand 3 "" ""))]
9714 s390_emit_call (XEXP (operands[1], 0), NULL_RTX, operands[0],
9715 gen_rtx_REG (Pmode, RETURN_REGNUM));
9719 (define_insn "*bras_r"
9720 [(set (match_operand 0 "" "")
9721 (call (mem:QI (match_operand 1 "bras_sym_operand" "X"))
9722 (match_operand:SI 2 "const_int_operand" "n")))
9723 (clobber (match_operand 3 "register_operand" "=r"))]
9724 "!SIBLING_CALL_P (insn)
9725 && TARGET_SMALL_EXEC
9726 && GET_MODE (operands[3]) == Pmode"
9728 [(set_attr "op_type" "RI")
9729 (set_attr "type" "jsr")
9730 (set_attr "z196prop" "z196_cracked")])
9732 (define_insn "*brasl_r"
9733 [(set (match_operand 0 "" "")
9734 (call (mem:QI (match_operand 1 "bras_sym_operand" "X"))
9735 (match_operand 2 "const_int_operand" "n")))
9736 (clobber (match_operand 3 "register_operand" "=r"))]
9737 "!SIBLING_CALL_P (insn)
9739 && GET_MODE (operands[3]) == Pmode"
9741 [(set_attr "op_type" "RIL")
9742 (set_attr "type" "jsr")
9743 (set_attr "z196prop" "z196_cracked")])
9745 (define_insn "*basr_r"
9746 [(set (match_operand 0 "" "")
9747 (call (mem:QI (match_operand 1 "address_operand" "ZR"))
9748 (match_operand 2 "const_int_operand" "n")))
9749 (clobber (match_operand 3 "register_operand" "=r"))]
9750 "!SIBLING_CALL_P (insn) && GET_MODE (operands[3]) == Pmode"
9752 if (get_attr_op_type (insn) == OP_TYPE_RR)
9753 return "basr\t%3,%1";
9755 return "bas\t%3,%a1";
9757 [(set (attr "op_type")
9758 (if_then_else (match_operand 1 "register_operand" "")
9759 (const_string "RR") (const_string "RX")))
9760 (set_attr "type" "jsr")
9761 (set_attr "atype" "agen")
9762 (set_attr "z196prop" "z196_cracked")])
9765 ;;- Thread-local storage support.
9768 (define_expand "get_thread_pointer<mode>"
9769 [(set (match_operand:P 0 "nonimmediate_operand" "") (reg:P TP_REGNUM))]
9773 (define_expand "set_thread_pointer<mode>"
9774 [(set (reg:P TP_REGNUM) (match_operand:P 0 "nonimmediate_operand" ""))
9775 (set (reg:P TP_REGNUM) (unspec_volatile:P [(reg:P TP_REGNUM)] UNSPECV_SET_TP))]
9779 (define_insn "*set_tp"
9780 [(set (reg TP_REGNUM) (unspec_volatile [(reg TP_REGNUM)] UNSPECV_SET_TP))]
9783 [(set_attr "type" "none")
9784 (set_attr "length" "0")])
9786 (define_insn "*tls_load_64"
9787 [(set (match_operand:DI 0 "register_operand" "=d")
9788 (unspec:DI [(match_operand:DI 1 "memory_operand" "T")
9789 (match_operand:DI 2 "" "")]
9793 [(set_attr "op_type" "RXE")
9794 (set_attr "z10prop" "z10_fwd_A3")])
9796 (define_insn "*tls_load_31"
9797 [(set (match_operand:SI 0 "register_operand" "=d,d")
9798 (unspec:SI [(match_operand:SI 1 "memory_operand" "R,T")
9799 (match_operand:SI 2 "" "")]
9805 [(set_attr "op_type" "RX,RXY")
9806 (set_attr "type" "load")
9807 (set_attr "cpu_facility" "*,longdisp")
9808 (set_attr "z10prop" "z10_fwd_A3,z10_fwd_A3")])
9810 (define_insn "*bras_tls"
9811 [(set (match_operand 0 "" "")
9812 (call (mem:QI (match_operand 1 "bras_sym_operand" "X"))
9813 (match_operand 2 "const_int_operand" "n")))
9814 (clobber (match_operand 3 "register_operand" "=r"))
9815 (use (match_operand 4 "" ""))]
9816 "!SIBLING_CALL_P (insn)
9817 && TARGET_SMALL_EXEC
9818 && GET_MODE (operands[3]) == Pmode"
9820 [(set_attr "op_type" "RI")
9821 (set_attr "type" "jsr")
9822 (set_attr "z196prop" "z196_cracked")])
9824 (define_insn "*brasl_tls"
9825 [(set (match_operand 0 "" "")
9826 (call (mem:QI (match_operand 1 "bras_sym_operand" "X"))
9827 (match_operand 2 "const_int_operand" "n")))
9828 (clobber (match_operand 3 "register_operand" "=r"))
9829 (use (match_operand 4 "" ""))]
9830 "!SIBLING_CALL_P (insn)
9832 && GET_MODE (operands[3]) == Pmode"
9834 [(set_attr "op_type" "RIL")
9835 (set_attr "type" "jsr")
9836 (set_attr "z196prop" "z196_cracked")])
9838 (define_insn "*basr_tls"
9839 [(set (match_operand 0 "" "")
9840 (call (mem:QI (match_operand 1 "address_operand" "ZR"))
9841 (match_operand 2 "const_int_operand" "n")))
9842 (clobber (match_operand 3 "register_operand" "=r"))
9843 (use (match_operand 4 "" ""))]
9844 "!SIBLING_CALL_P (insn) && GET_MODE (operands[3]) == Pmode"
9846 if (get_attr_op_type (insn) == OP_TYPE_RR)
9847 return "basr\t%3,%1%J4";
9849 return "bas\t%3,%a1%J4";
9851 [(set (attr "op_type")
9852 (if_then_else (match_operand 1 "register_operand" "")
9853 (const_string "RR") (const_string "RX")))
9854 (set_attr "type" "jsr")
9855 (set_attr "atype" "agen")
9856 (set_attr "z196prop" "z196_cracked")])
9859 ;;- Atomic operations
9863 ; memory barrier patterns.
9866 (define_expand "mem_signal_fence"
9867 [(match_operand:SI 0 "const_int_operand")] ;; model
9870 /* The s390 memory model is strong enough not to require any
9871 barrier in order to synchronize a thread with itself. */
9875 (define_expand "mem_thread_fence"
9876 [(match_operand:SI 0 "const_int_operand")] ;; model
9879 /* Unless this is a SEQ_CST fence, the s390 memory model is strong
9880 enough not to require barriers of any kind. */
9881 if (is_mm_seq_cst (memmodel_from_int (INTVAL (operands[0]))))
9883 rtx mem = gen_rtx_MEM (BLKmode, gen_rtx_SCRATCH (Pmode));
9884 MEM_VOLATILE_P (mem) = 1;
9885 emit_insn (gen_mem_thread_fence_1 (mem));
9890 ; Although bcr is superscalar on Z10, this variant will never
9891 ; become part of an execution group.
9892 ; With z196 we can make use of the fast-BCR-serialization facility.
9893 ; This allows for a slightly faster sync which is sufficient for our
9895 (define_insn "mem_thread_fence_1"
9896 [(set (match_operand:BLK 0 "" "")
9897 (unspec:BLK [(match_dup 0)] UNSPEC_MB))]
9905 [(set_attr "op_type" "RR")
9906 (set_attr "mnemonic" "bcr_flush")
9907 (set_attr "z196prop" "z196_alone")])
9910 ; atomic load/store operations
9913 ; Atomic loads need not examine the memory model at all.
9914 (define_expand "atomic_load<mode>"
9915 [(match_operand:DINT 0 "register_operand") ;; output
9916 (match_operand:DINT 1 "memory_operand") ;; memory
9917 (match_operand:SI 2 "const_int_operand")] ;; model
9920 if (MEM_ALIGN (operands[1]) < GET_MODE_BITSIZE (GET_MODE (operands[1])))
9923 if (<MODE>mode == TImode)
9924 emit_insn (gen_atomic_loadti_1 (operands[0], operands[1]));
9925 else if (<MODE>mode == DImode && !TARGET_ZARCH)
9926 emit_insn (gen_atomic_loaddi_1 (operands[0], operands[1]));
9928 emit_move_insn (operands[0], operands[1]);
9932 ; Different from movdi_31 in that we want no splitters.
9933 (define_insn "atomic_loaddi_1"
9934 [(set (match_operand:DI 0 "register_operand" "=d,d,!*f,!*f")
9935 (unspec:DI [(match_operand:DI 1 "memory_operand" "Q,S,R,T")]
9943 [(set_attr "op_type" "RS,RSY,RS,RSY")
9944 (set_attr "cpu_facility" "*,longdisp,*,longdisp")
9945 (set_attr "type" "lm,lm,floaddf,floaddf")])
9947 (define_insn "atomic_loadti_1"
9948 [(set (match_operand:TI 0 "register_operand" "=r")
9949 (unspec:TI [(match_operand:TI 1 "memory_operand" "T")]
9953 [(set_attr "op_type" "RXY")
9954 (set_attr "type" "other")])
9956 ; Atomic stores must(?) enforce sequential consistency.
9957 (define_expand "atomic_store<mode>"
9958 [(match_operand:DINT 0 "memory_operand") ;; memory
9959 (match_operand:DINT 1 "register_operand") ;; input
9960 (match_operand:SI 2 "const_int_operand")] ;; model
9963 enum memmodel model = memmodel_from_int (INTVAL (operands[2]));
9965 if (MEM_ALIGN (operands[0]) < GET_MODE_BITSIZE (GET_MODE (operands[0])))
9968 if (<MODE>mode == TImode)
9969 emit_insn (gen_atomic_storeti_1 (operands[0], operands[1]));
9970 else if (<MODE>mode == DImode && !TARGET_ZARCH)
9971 emit_insn (gen_atomic_storedi_1 (operands[0], operands[1]));
9973 emit_move_insn (operands[0], operands[1]);
9974 if (is_mm_seq_cst (model))
9975 emit_insn (gen_mem_thread_fence (operands[2]));
9979 ; Different from movdi_31 in that we want no splitters.
9980 (define_insn "atomic_storedi_1"
9981 [(set (match_operand:DI 0 "memory_operand" "=Q,S,R,T")
9982 (unspec:DI [(match_operand:DI 1 "register_operand" "d,d,!*f,!*f")]
9990 [(set_attr "op_type" "RS,RSY,RS,RSY")
9991 (set_attr "cpu_facility" "*,longdisp,*,longdisp")
9992 (set_attr "type" "stm,stm,fstoredf,fstoredf")])
9994 (define_insn "atomic_storeti_1"
9995 [(set (match_operand:TI 0 "memory_operand" "=T")
9996 (unspec:TI [(match_operand:TI 1 "register_operand" "r")]
10000 [(set_attr "op_type" "RXY")
10001 (set_attr "type" "other")])
10004 ; compare and swap patterns.
10007 (define_expand "atomic_compare_and_swap<mode>"
10008 [(match_operand:SI 0 "register_operand") ;; bool success output
10009 (match_operand:DGPR 1 "nonimmediate_operand");; oldval output
10010 (match_operand:DGPR 2 "memory_operand") ;; memory
10011 (match_operand:DGPR 3 "register_operand") ;; expected intput
10012 (match_operand:DGPR 4 "register_operand") ;; newval intput
10013 (match_operand:SI 5 "const_int_operand") ;; is_weak
10014 (match_operand:SI 6 "const_int_operand") ;; success model
10015 (match_operand:SI 7 "const_int_operand")] ;; failure model
10018 rtx cc, cmp, output = operands[1];
10020 if (!register_operand (output, <MODE>mode))
10021 output = gen_reg_rtx (<MODE>mode);
10023 if (MEM_ALIGN (operands[2]) < GET_MODE_BITSIZE (GET_MODE (operands[2])))
10026 emit_insn (gen_atomic_compare_and_swap<mode>_internal
10027 (output, operands[2], operands[3], operands[4]));
10029 /* We deliberately accept non-register operands in the predicate
10030 to ensure the write back to the output operand happens *before*
10031 the store-flags code below. This makes it easier for combine
10032 to merge the store-flags code with a potential test-and-branch
10033 pattern following (immediately!) afterwards. */
10034 if (output != operands[1])
10035 emit_move_insn (operands[1], output);
10037 cc = gen_rtx_REG (CCZ1mode, CC_REGNUM);
10038 cmp = gen_rtx_EQ (SImode, cc, const0_rtx);
10039 emit_insn (gen_cstorecc4 (operands[0], cmp, cc, const0_rtx));
10043 (define_expand "atomic_compare_and_swap<mode>"
10044 [(match_operand:SI 0 "register_operand") ;; bool success output
10045 (match_operand:HQI 1 "nonimmediate_operand") ;; oldval output
10046 (match_operand:HQI 2 "memory_operand") ;; memory
10047 (match_operand:HQI 3 "general_operand") ;; expected intput
10048 (match_operand:HQI 4 "general_operand") ;; newval intput
10049 (match_operand:SI 5 "const_int_operand") ;; is_weak
10050 (match_operand:SI 6 "const_int_operand") ;; success model
10051 (match_operand:SI 7 "const_int_operand")] ;; failure model
10054 s390_expand_cs_hqi (<MODE>mode, operands[0], operands[1], operands[2],
10055 operands[3], operands[4], INTVAL (operands[5]));
10059 (define_expand "atomic_compare_and_swap<mode>_internal"
10061 [(set (match_operand:DGPR 0 "register_operand")
10062 (match_operand:DGPR 1 "memory_operand"))
10064 (unspec_volatile:DGPR
10066 (match_operand:DGPR 2 "register_operand")
10067 (match_operand:DGPR 3 "register_operand")]
10069 (set (reg:CCZ1 CC_REGNUM)
10070 (compare:CCZ1 (match_dup 1) (match_dup 2)))])]
10074 (define_insn "*atomic_compare_and_swap<mode>_1"
10075 [(set (match_operand:TDI 0 "register_operand" "=r")
10076 (match_operand:TDI 1 "memory_operand" "+S"))
10078 (unspec_volatile:TDI
10080 (match_operand:TDI 2 "register_operand" "0")
10081 (match_operand:TDI 3 "register_operand" "r")]
10083 (set (reg:CCZ1 CC_REGNUM)
10084 (compare:CCZ1 (match_dup 1) (match_dup 2)))]
10086 "c<td>sg\t%0,%3,%S1"
10087 [(set_attr "op_type" "RSY")
10088 (set_attr "type" "sem")])
10091 (define_insn "*atomic_compare_and_swapdi_2"
10092 [(set (match_operand:DI 0 "register_operand" "=r,r")
10093 (match_operand:DI 1 "memory_operand" "+Q,S"))
10095 (unspec_volatile:DI
10097 (match_operand:DI 2 "register_operand" "0,0")
10098 (match_operand:DI 3 "register_operand" "r,r")]
10100 (set (reg:CCZ1 CC_REGNUM)
10101 (compare:CCZ1 (match_dup 1) (match_dup 2)))]
10106 [(set_attr "op_type" "RS,RSY")
10107 (set_attr "cpu_facility" "*,longdisp")
10108 (set_attr "type" "sem")])
10111 (define_insn "*atomic_compare_and_swapsi_3"
10112 [(set (match_operand:SI 0 "register_operand" "=r,r")
10113 (match_operand:SI 1 "memory_operand" "+Q,S"))
10115 (unspec_volatile:SI
10117 (match_operand:SI 2 "register_operand" "0,0")
10118 (match_operand:SI 3 "register_operand" "r,r")]
10120 (set (reg:CCZ1 CC_REGNUM)
10121 (compare:CCZ1 (match_dup 1) (match_dup 2)))]
10126 [(set_attr "op_type" "RS,RSY")
10127 (set_attr "cpu_facility" "*,longdisp")
10128 (set_attr "type" "sem")])
10131 ; Other atomic instruction patterns.
10134 ; z196 load and add, xor, or and and instructions
10136 (define_expand "atomic_fetch_<atomic><mode>"
10137 [(match_operand:GPR 0 "register_operand") ;; val out
10139 (match_operand:GPR 1 "memory_operand") ;; memory
10140 (match_operand:GPR 2 "register_operand")) ;; val in
10141 (match_operand:SI 3 "const_int_operand")] ;; model
10144 if (MEM_ALIGN (operands[1]) < GET_MODE_BITSIZE (GET_MODE (operands[1])))
10147 emit_insn (gen_atomic_fetch_<atomic><mode>_iaf
10148 (operands[0], operands[1], operands[2]));
10152 ; lan, lang, lao, laog, lax, laxg, laa, laag
10153 (define_insn "atomic_fetch_<atomic><mode>_iaf"
10154 [(set (match_operand:GPR 0 "register_operand" "=d")
10155 (match_operand:GPR 1 "memory_operand" "+S"))
10157 (unspec_volatile:GPR
10158 [(ATOMIC_Z196:GPR (match_dup 1)
10159 (match_operand:GPR 2 "general_operand" "d"))]
10160 UNSPECV_ATOMIC_OP))
10161 (clobber (reg:CC CC_REGNUM))]
10163 "la<noxa><g>\t%0,%2,%1"
10164 [(set_attr "op_type" "RSY")
10165 (set_attr "type" "sem")])
10167 ;; For SImode and larger, the optabs.c code will do just fine in
10168 ;; expanding a compare-and-swap loop. For QI/HImode, we can do
10169 ;; better by expanding our own loop.
10171 (define_expand "atomic_<atomic><mode>"
10173 (match_operand:HQI 0 "memory_operand") ;; memory
10174 (match_operand:HQI 1 "general_operand")) ;; val in
10175 (match_operand:SI 2 "const_int_operand")] ;; model
10178 s390_expand_atomic (<MODE>mode, <CODE>, NULL_RTX, operands[0],
10179 operands[1], false);
10183 (define_expand "atomic_fetch_<atomic><mode>"
10184 [(match_operand:HQI 0 "register_operand") ;; val out
10186 (match_operand:HQI 1 "memory_operand") ;; memory
10187 (match_operand:HQI 2 "general_operand")) ;; val in
10188 (match_operand:SI 3 "const_int_operand")] ;; model
10191 s390_expand_atomic (<MODE>mode, <CODE>, operands[0], operands[1],
10192 operands[2], false);
10196 (define_expand "atomic_<atomic>_fetch<mode>"
10197 [(match_operand:HQI 0 "register_operand") ;; val out
10199 (match_operand:HQI 1 "memory_operand") ;; memory
10200 (match_operand:HQI 2 "general_operand")) ;; val in
10201 (match_operand:SI 3 "const_int_operand")] ;; model
10204 s390_expand_atomic (<MODE>mode, <CODE>, operands[0], operands[1],
10205 operands[2], true);
10209 (define_expand "atomic_exchange<mode>"
10210 [(match_operand:HQI 0 "register_operand") ;; val out
10211 (match_operand:HQI 1 "memory_operand") ;; memory
10212 (match_operand:HQI 2 "general_operand") ;; val in
10213 (match_operand:SI 3 "const_int_operand")] ;; model
10216 s390_expand_atomic (<MODE>mode, SET, operands[0], operands[1],
10217 operands[2], false);
10222 ;;- Miscellaneous instructions.
10226 ; allocate stack instruction pattern(s).
10229 (define_expand "allocate_stack"
10230 [(match_operand 0 "general_operand" "")
10231 (match_operand 1 "general_operand" "")]
10234 rtx temp = gen_reg_rtx (Pmode);
10236 emit_move_insn (temp, s390_back_chain_rtx ());
10237 anti_adjust_stack (operands[1]);
10238 emit_move_insn (s390_back_chain_rtx (), temp);
10240 emit_move_insn (operands[0], virtual_stack_dynamic_rtx);
10246 ; setjmp instruction pattern.
10249 (define_expand "builtin_setjmp_receiver"
10250 [(match_operand 0 "" "")]
10253 emit_insn (s390_load_got ());
10254 emit_use (pic_offset_table_rtx);
10258 ;; These patterns say how to save and restore the stack pointer. We need not
10259 ;; save the stack pointer at function level since we are careful to
10260 ;; preserve the backchain. At block level, we have to restore the backchain
10261 ;; when we restore the stack pointer.
10263 ;; For nonlocal gotos, we must save both the stack pointer and its
10264 ;; backchain and restore both. Note that in the nonlocal case, the
10265 ;; save area is a memory location.
10267 (define_expand "save_stack_function"
10268 [(match_operand 0 "general_operand" "")
10269 (match_operand 1 "general_operand" "")]
10273 (define_expand "restore_stack_function"
10274 [(match_operand 0 "general_operand" "")
10275 (match_operand 1 "general_operand" "")]
10279 (define_expand "restore_stack_block"
10280 [(match_operand 0 "register_operand" "")
10281 (match_operand 1 "register_operand" "")]
10284 rtx temp = gen_reg_rtx (Pmode);
10286 emit_move_insn (temp, s390_back_chain_rtx ());
10287 emit_move_insn (operands[0], operands[1]);
10288 emit_move_insn (s390_back_chain_rtx (), temp);
10293 (define_expand "save_stack_nonlocal"
10294 [(match_operand 0 "memory_operand" "")
10295 (match_operand 1 "register_operand" "")]
10298 rtx base = gen_rtx_REG (Pmode, BASE_REGNUM);
10300 /* Copy the backchain to the first word, sp to the second and the
10301 literal pool base to the third. */
10303 rtx save_bc = adjust_address (operands[0], Pmode, 0);
10304 rtx save_sp = adjust_address (operands[0], Pmode, GET_MODE_SIZE (Pmode));
10305 rtx save_bp = adjust_address (operands[0], Pmode, 2 * GET_MODE_SIZE (Pmode));
10307 if (TARGET_BACKCHAIN)
10308 emit_move_insn (save_bc, force_reg (Pmode, s390_back_chain_rtx ()));
10310 emit_move_insn (save_sp, operands[1]);
10311 emit_move_insn (save_bp, base);
10316 (define_expand "restore_stack_nonlocal"
10317 [(match_operand 0 "register_operand" "")
10318 (match_operand 1 "memory_operand" "")]
10321 rtx base = gen_rtx_REG (Pmode, BASE_REGNUM);
10322 rtx temp = NULL_RTX;
10324 /* Restore the backchain from the first word, sp from the second and the
10325 literal pool base from the third. */
10327 rtx save_bc = adjust_address (operands[1], Pmode, 0);
10328 rtx save_sp = adjust_address (operands[1], Pmode, GET_MODE_SIZE (Pmode));
10329 rtx save_bp = adjust_address (operands[1], Pmode, 2 * GET_MODE_SIZE (Pmode));
10331 if (TARGET_BACKCHAIN)
10332 temp = force_reg (Pmode, save_bc);
10334 emit_move_insn (base, save_bp);
10335 emit_move_insn (operands[0], save_sp);
10338 emit_move_insn (s390_back_chain_rtx (), temp);
10344 (define_expand "exception_receiver"
10348 s390_set_has_landing_pad_p (true);
10353 ; nop instruction pattern(s).
10360 [(set_attr "op_type" "RR")
10361 (set_attr "z10prop" "z10_fr_E1")])
10363 (define_insn "nop1"
10367 [(set_attr "op_type" "RR")])
10369 ;;- Undeletable nops (used for hotpatching)
10371 (define_insn "nop_2_byte"
10372 [(unspec_volatile [(const_int 0)] UNSPECV_NOP_2_BYTE)]
10375 [(set_attr "op_type" "RR")])
10377 (define_insn "nop_4_byte"
10378 [(unspec_volatile [(const_int 0)] UNSPECV_NOP_4_BYTE)]
10381 [(set_attr "op_type" "RX")])
10383 (define_insn "nop_6_byte"
10384 [(unspec_volatile [(const_int 0)] UNSPECV_NOP_6_BYTE)]
10387 [(set_attr "op_type" "RIL")])
10391 ; Special literal pool access instruction pattern(s).
10394 (define_insn "*pool_entry"
10395 [(unspec_volatile [(match_operand 0 "consttable_operand" "X")]
10396 UNSPECV_POOL_ENTRY)]
10399 machine_mode mode = GET_MODE (PATTERN (insn));
10400 unsigned int align = GET_MODE_BITSIZE (mode);
10401 s390_output_pool_entry (operands[0], mode, align);
10404 [(set (attr "length")
10405 (symbol_ref "GET_MODE_SIZE (GET_MODE (PATTERN (insn)))"))])
10407 (define_insn "pool_align"
10408 [(unspec_volatile [(match_operand 0 "const_int_operand" "n")]
10409 UNSPECV_POOL_ALIGN)]
10412 [(set (attr "length") (symbol_ref "INTVAL (operands[0])"))])
10414 (define_insn "pool_section_start"
10415 [(unspec_volatile [(const_int 1)] UNSPECV_POOL_SECTION)]
10418 switch_to_section (targetm.asm_out.function_rodata_section
10419 (current_function_decl));
10422 [(set_attr "length" "0")])
10424 (define_insn "pool_section_end"
10425 [(unspec_volatile [(const_int 0)] UNSPECV_POOL_SECTION)]
10428 switch_to_section (current_function_section ());
10431 [(set_attr "length" "0")])
10433 (define_insn "main_base_31_small"
10434 [(set (match_operand 0 "register_operand" "=a")
10435 (unspec [(label_ref (match_operand 1 "" ""))] UNSPEC_MAIN_BASE))]
10436 "!TARGET_CPU_ZARCH && GET_MODE (operands[0]) == Pmode"
10438 [(set_attr "op_type" "RR")
10439 (set_attr "type" "la")
10440 (set_attr "z196prop" "z196_cracked")])
10442 (define_insn "main_base_31_large"
10443 [(set (match_operand 0 "register_operand" "=a")
10444 (unspec [(label_ref (match_operand 1 "" ""))] UNSPEC_MAIN_BASE))
10445 (set (pc) (label_ref (match_operand 2 "" "")))]
10446 "!TARGET_CPU_ZARCH && GET_MODE (operands[0]) == Pmode"
10448 [(set_attr "op_type" "RI")
10449 (set_attr "z196prop" "z196_cracked")])
10451 (define_insn "main_base_64"
10452 [(set (match_operand 0 "register_operand" "=a")
10453 (unspec [(label_ref (match_operand 1 "" ""))] UNSPEC_MAIN_BASE))]
10454 "TARGET_CPU_ZARCH && GET_MODE (operands[0]) == Pmode"
10456 [(set_attr "op_type" "RIL")
10457 (set_attr "type" "larl")
10458 (set_attr "z10prop" "z10_fwd_A1")])
10460 (define_insn "main_pool"
10461 [(set (match_operand 0 "register_operand" "=a")
10462 (unspec_volatile [(const_int 0)] UNSPECV_MAIN_POOL))]
10463 "GET_MODE (operands[0]) == Pmode"
10465 gcc_unreachable ();
10467 [(set (attr "type")
10468 (if_then_else (match_test "TARGET_CPU_ZARCH")
10469 (const_string "larl") (const_string "la")))])
10471 (define_insn "reload_base_31"
10472 [(set (match_operand 0 "register_operand" "=a")
10473 (unspec [(label_ref (match_operand 1 "" ""))] UNSPEC_RELOAD_BASE))]
10474 "!TARGET_CPU_ZARCH && GET_MODE (operands[0]) == Pmode"
10475 "basr\t%0,0\;la\t%0,%1-.(%0)"
10476 [(set_attr "length" "6")
10477 (set_attr "type" "la")
10478 (set_attr "z196prop" "z196_cracked")])
10480 (define_insn "reload_base_64"
10481 [(set (match_operand 0 "register_operand" "=a")
10482 (unspec [(label_ref (match_operand 1 "" ""))] UNSPEC_RELOAD_BASE))]
10483 "TARGET_CPU_ZARCH && GET_MODE (operands[0]) == Pmode"
10485 [(set_attr "op_type" "RIL")
10486 (set_attr "type" "larl")
10487 (set_attr "z10prop" "z10_fwd_A1")])
10489 (define_insn "pool"
10490 [(unspec_volatile [(match_operand 0 "const_int_operand" "n")] UNSPECV_POOL)]
10493 gcc_unreachable ();
10495 [(set (attr "length") (symbol_ref "INTVAL (operands[0])"))])
10498 ;; Insns related to generating the function prologue and epilogue.
10502 (define_expand "prologue"
10503 [(use (const_int 0))]
10505 "s390_emit_prologue (); DONE;")
10507 (define_expand "epilogue"
10508 [(use (const_int 1))]
10510 "s390_emit_epilogue (false); DONE;")
10512 (define_expand "sibcall_epilogue"
10513 [(use (const_int 0))]
10515 "s390_emit_epilogue (true); DONE;")
10517 ;; A direct return instruction, without using an epilogue.
10518 (define_insn "<code>"
10520 "s390_can_use_<code>_insn ()"
10522 [(set_attr "op_type" "RR")
10523 (set_attr "type" "jsr")
10524 (set_attr "atype" "agen")])
10526 (define_insn "*return"
10528 (use (match_operand 0 "register_operand" "a"))]
10529 "GET_MODE (operands[0]) == Pmode"
10531 [(set_attr "op_type" "RR")
10532 (set_attr "type" "jsr")
10533 (set_attr "atype" "agen")])
10536 ;; Instruction definition to extend a 31-bit pointer into a 64-bit
10537 ;; pointer. This is used for compatibility.
10539 (define_expand "ptr_extend"
10540 [(set (match_operand:DI 0 "register_operand" "=r")
10541 (match_operand:SI 1 "register_operand" "r"))]
10544 emit_insn (gen_anddi3 (operands[0],
10545 gen_lowpart (DImode, operands[1]),
10546 GEN_INT (0x7fffffff)));
10550 ;; Instruction definition to expand eh_return macro to support
10551 ;; swapping in special linkage return addresses.
10553 (define_expand "eh_return"
10554 [(use (match_operand 0 "register_operand" ""))]
10557 s390_emit_tpf_eh_return (operands[0]);
10562 ; Stack Protector Patterns
10565 (define_expand "stack_protect_set"
10566 [(set (match_operand 0 "memory_operand" "")
10567 (match_operand 1 "memory_operand" ""))]
10570 #ifdef TARGET_THREAD_SSP_OFFSET
10572 = gen_rtx_MEM (Pmode, gen_rtx_PLUS (Pmode, s390_get_thread_pointer (),
10573 GEN_INT (TARGET_THREAD_SSP_OFFSET)));
10576 emit_insn (gen_stack_protect_setdi (operands[0], operands[1]));
10578 emit_insn (gen_stack_protect_setsi (operands[0], operands[1]));
10583 (define_insn "stack_protect_set<mode>"
10584 [(set (match_operand:DSI 0 "memory_operand" "=Q")
10585 (unspec:DSI [(match_operand:DSI 1 "memory_operand" "Q")] UNSPEC_SP_SET))]
10587 "mvc\t%O0(%G0,%R0),%S1"
10588 [(set_attr "op_type" "SS")])
10590 (define_expand "stack_protect_test"
10591 [(set (reg:CC CC_REGNUM)
10592 (compare (match_operand 0 "memory_operand" "")
10593 (match_operand 1 "memory_operand" "")))
10594 (match_operand 2 "" "")]
10598 #ifdef TARGET_THREAD_SSP_OFFSET
10600 = gen_rtx_MEM (Pmode, gen_rtx_PLUS (Pmode, s390_get_thread_pointer (),
10601 GEN_INT (TARGET_THREAD_SSP_OFFSET)));
10604 emit_insn (gen_stack_protect_testdi (operands[0], operands[1]));
10606 emit_insn (gen_stack_protect_testsi (operands[0], operands[1]));
10608 cc_reg = gen_rtx_REG (CCZmode, CC_REGNUM);
10609 test = gen_rtx_EQ (VOIDmode, cc_reg, const0_rtx);
10610 emit_jump_insn (gen_cbranchcc4 (test, cc_reg, const0_rtx, operands[2]));
10614 (define_insn "stack_protect_test<mode>"
10615 [(set (reg:CCZ CC_REGNUM)
10616 (unspec:CCZ [(match_operand:DSI 0 "memory_operand" "Q")
10617 (match_operand:DSI 1 "memory_operand" "Q")] UNSPEC_SP_TEST))]
10619 "clc\t%O0(%G0,%R0),%S1"
10620 [(set_attr "op_type" "SS")])
10622 ; This is used in s390_emit_prologue in order to prevent insns
10623 ; adjusting the stack pointer to be moved over insns writing stack
10624 ; slots using a copy of the stack pointer in a different register.
10625 (define_insn "stack_tie"
10626 [(set (match_operand:BLK 0 "memory_operand" "+m")
10627 (unspec:BLK [(match_dup 0)] UNSPEC_TIE))]
10630 [(set_attr "length" "0")])
10633 (define_insn "stack_restore_from_fpr"
10634 [(set (reg:DI STACK_REGNUM)
10635 (match_operand:DI 0 "register_operand" "f"))
10636 (clobber (mem:BLK (scratch)))]
10639 [(set_attr "op_type" "RRE")])
10642 ; Data prefetch patterns
10645 (define_insn "prefetch"
10646 [(prefetch (match_operand 0 "address_operand" "ZT,X")
10647 (match_operand:SI 1 "const_int_operand" " n,n")
10648 (match_operand:SI 2 "const_int_operand" " n,n"))]
10651 switch (which_alternative)
10654 return INTVAL (operands[1]) == 1 ? "pfd\t2,%a0" : "pfd\t1,%a0";
10656 if (larl_operand (operands[0], Pmode))
10657 return INTVAL (operands[1]) == 1 ? "pfdrl\t2,%a0" : "pfdrl\t1,%a0";
10661 /* This might be reached for symbolic operands with an odd
10662 addend. We simply omit the prefetch for such rare cases. */
10667 [(set_attr "type" "load,larl")
10668 (set_attr "op_type" "RXY,RIL")
10669 (set_attr "z10prop" "z10_super")
10670 (set_attr "z196prop" "z196_alone")])
10674 ; Byte swap instructions
10677 ; FIXME: There is also mvcin but we cannot use it since src and target
10679 ; lrvr, lrv, strv, lrvgr, lrvg, strvg
10680 (define_insn "bswap<mode>2"
10681 [(set (match_operand:GPR 0 "nonimmediate_operand" "=d,d,T")
10682 (bswap:GPR (match_operand:GPR 1 "nonimmediate_operand" " d,T,d")))]
10688 [(set_attr "type" "*,load,store")
10689 (set_attr "op_type" "RRE,RXY,RXY")
10690 (set_attr "z10prop" "z10_super")])
10692 (define_insn "bswaphi2"
10693 [(set (match_operand:HI 0 "nonimmediate_operand" "=d,d,T")
10694 (bswap:HI (match_operand:HI 1 "nonimmediate_operand" " d,T,d")))]
10700 [(set_attr "type" "*,load,store")
10701 (set_attr "op_type" "RRE,RXY,RXY")
10702 (set_attr "z10prop" "z10_super")])
10705 [(set (match_operand:HI 0 "register_operand" "")
10706 (bswap:HI (match_operand:HI 1 "register_operand" "")))]
10708 [(set (match_dup 2) (bswap:SI (match_dup 3)))
10709 (set (match_dup 2) (lshiftrt:SI (match_dup 2) (const_int 16)))]
10711 operands[2] = simplify_gen_subreg (SImode, operands[0], HImode, 0);
10712 operands[3] = simplify_gen_subreg (SImode, operands[1], HImode, 0);
10717 ; Population count instruction
10720 ; The S/390 popcount instruction counts the bits of op1 in 8 byte
10721 ; portions and stores the result in the corresponding bytes in op0.
10722 (define_insn "*popcount<mode>"
10723 [(set (match_operand:INT 0 "register_operand" "=d")
10724 (unspec:INT [(match_operand:INT 1 "register_operand" "d")] UNSPEC_POPCNT))
10725 (clobber (reg:CC CC_REGNUM))]
10728 [(set_attr "op_type" "RRE")])
10730 (define_expand "popcountdi2"
10732 (parallel [(set (match_operand:DI 0 "register_operand" "")
10733 (unspec:DI [(match_operand:DI 1 "register_operand")]
10735 (clobber (reg:CC CC_REGNUM))])
10736 ; sllg op2, op0, 32
10737 (set (match_dup 2) (ashift:DI (match_dup 0) (const_int 32)))
10739 (parallel [(set (match_dup 0) (plus:DI (match_dup 0) (match_dup 2)))
10740 (clobber (reg:CC CC_REGNUM))])
10741 ; sllg op2, op0, 16
10743 (ashift:DI (match_dup 0) (const_int 16)))
10745 (parallel [(set (match_dup 0) (plus:DI (match_dup 0) (match_dup 2)))
10746 (clobber (reg:CC CC_REGNUM))])
10748 (set (match_dup 2) (ashift:DI (match_dup 0) (const_int 8)))
10750 (parallel [(set (match_dup 0) (plus:DI (match_dup 0) (match_dup 2)))
10751 (clobber (reg:CC CC_REGNUM))])
10752 ; srlg op0, op0, 56
10753 (set (match_dup 0) (lshiftrt:DI (match_dup 0) (const_int 56)))]
10754 "TARGET_Z196 && TARGET_64BIT"
10755 "operands[2] = gen_reg_rtx (DImode);")
10757 (define_expand "popcountsi2"
10759 (parallel [(set (match_operand:SI 0 "register_operand" "")
10760 (unspec:SI [(match_operand:SI 1 "register_operand")]
10762 (clobber (reg:CC CC_REGNUM))])
10763 ; sllk op2, op0, 16
10765 (ashift:SI (match_dup 0) (const_int 16)))
10767 (parallel [(set (match_dup 0) (plus:SI (match_dup 0) (match_dup 2)))
10768 (clobber (reg:CC CC_REGNUM))])
10770 (set (match_dup 2) (ashift:SI (match_dup 0) (const_int 8)))
10772 (parallel [(set (match_dup 0) (plus:SI (match_dup 0) (match_dup 2)))
10773 (clobber (reg:CC CC_REGNUM))])
10775 (set (match_dup 0) (lshiftrt:SI (match_dup 0) (const_int 24)))]
10777 "operands[2] = gen_reg_rtx (SImode);")
10779 (define_expand "popcounthi2"
10781 (parallel [(set (match_operand:HI 0 "register_operand" "")
10782 (unspec:HI [(match_operand:HI 1 "register_operand")]
10784 (clobber (reg:CC CC_REGNUM))])
10787 (ashift:SI (match_dup 0) (const_int 8)))
10789 (parallel [(set (match_dup 0) (plus:SI (match_dup 0) (match_dup 2)))
10790 (clobber (reg:CC CC_REGNUM))])
10792 (set (match_dup 0) (lshiftrt:HI (match_dup 0) (const_int 8)))]
10794 "operands[2] = gen_reg_rtx (SImode);")
10796 (define_expand "popcountqi2"
10798 (parallel [(set (match_operand:QI 0 "register_operand" "")
10799 (unspec:QI [(match_operand:QI 1 "register_operand")]
10801 (clobber (reg:CC CC_REGNUM))])]
10806 ;;- Copy sign instructions
10809 (define_insn "copysign<mode>3"
10810 [(set (match_operand:FP 0 "register_operand" "=f")
10811 (unspec:FP [(match_operand:FP 1 "register_operand" "<fT0>")
10812 (match_operand:FP 2 "register_operand" "f")]
10816 [(set_attr "op_type" "RRF")
10817 (set_attr "type" "fsimp<mode>")])
10821 ;;- Transactional execution instructions
10824 ; This splitter helps combine to make use of CC directly when
10825 ; comparing the integer result of a tbegin builtin with a constant.
10826 ; The unspec is already removed by canonicalize_comparison. So this
10827 ; splitters only job is to turn the PARALLEL into separate insns
10828 ; again. Unfortunately this only works with the very first cc/int
10829 ; compare since combine is not able to deal with data flow across
10830 ; basic block boundaries.
10832 ; It needs to be an insn pattern as well since combine does not apply
10833 ; the splitter directly. Combine would only use it if it actually
10834 ; would reduce the number of instructions.
10835 (define_insn_and_split "*ccraw_to_int"
10838 (match_operator 0 "s390_eqne_operator"
10839 [(reg:CCRAW CC_REGNUM)
10840 (match_operand 1 "const_int_operand" "")])
10841 (label_ref (match_operand 2 "" ""))
10843 (set (match_operand:SI 3 "register_operand" "=d")
10844 (unspec:SI [(reg:CCRAW CC_REGNUM)] UNSPEC_CC_TO_INT))]
10848 [(set (match_dup 3)
10849 (unspec:SI [(reg:CCRAW CC_REGNUM)] UNSPEC_CC_TO_INT))
10851 (if_then_else (match_op_dup 0 [(reg:CCRAW CC_REGNUM) (match_dup 1)])
10852 (label_ref (match_dup 2))
10856 ; Non-constrained transaction begin
10858 (define_expand "tbegin"
10859 [(match_operand:SI 0 "register_operand" "")
10860 (match_operand:BLK 1 "memory_operand" "")]
10863 s390_expand_tbegin (operands[0], operands[1], NULL_RTX, true);
10867 (define_expand "tbegin_nofloat"
10868 [(match_operand:SI 0 "register_operand" "")
10869 (match_operand:BLK 1 "memory_operand" "")]
10872 s390_expand_tbegin (operands[0], operands[1], NULL_RTX, false);
10876 (define_expand "tbegin_retry"
10877 [(match_operand:SI 0 "register_operand" "")
10878 (match_operand:BLK 1 "memory_operand" "")
10879 (match_operand:SI 2 "general_operand" "")]
10882 s390_expand_tbegin (operands[0], operands[1], operands[2], true);
10886 (define_expand "tbegin_retry_nofloat"
10887 [(match_operand:SI 0 "register_operand" "")
10888 (match_operand:BLK 1 "memory_operand" "")
10889 (match_operand:SI 2 "general_operand" "")]
10892 s390_expand_tbegin (operands[0], operands[1], operands[2], false);
10896 ; Clobber VRs since they don't get restored
10897 (define_insn "tbegin_1_z13"
10898 [(set (reg:CCRAW CC_REGNUM)
10899 (unspec_volatile:CCRAW [(match_operand 0 "const_int_operand" "D")]
10901 (set (match_operand:BLK 1 "memory_operand" "=Q")
10902 (unspec_volatile:BLK [(match_dup 0)] UNSPECV_TBEGIN_TDB))
10903 (clobber (reg:TI 16)) (clobber (reg:TI 38))
10904 (clobber (reg:TI 17)) (clobber (reg:TI 39))
10905 (clobber (reg:TI 18)) (clobber (reg:TI 40))
10906 (clobber (reg:TI 19)) (clobber (reg:TI 41))
10907 (clobber (reg:TI 20)) (clobber (reg:TI 42))
10908 (clobber (reg:TI 21)) (clobber (reg:TI 43))
10909 (clobber (reg:TI 22)) (clobber (reg:TI 44))
10910 (clobber (reg:TI 23)) (clobber (reg:TI 45))
10911 (clobber (reg:TI 24)) (clobber (reg:TI 46))
10912 (clobber (reg:TI 25)) (clobber (reg:TI 47))
10913 (clobber (reg:TI 26)) (clobber (reg:TI 48))
10914 (clobber (reg:TI 27)) (clobber (reg:TI 49))
10915 (clobber (reg:TI 28)) (clobber (reg:TI 50))
10916 (clobber (reg:TI 29)) (clobber (reg:TI 51))
10917 (clobber (reg:TI 30)) (clobber (reg:TI 52))
10918 (clobber (reg:TI 31)) (clobber (reg:TI 53))]
10919 ; CONST_OK_FOR_CONSTRAINT_P does not work with D constraint since D is
10920 ; not supposed to be used for immediates (see genpreds.c).
10921 "TARGET_VX && INTVAL (operands[0]) >= 0 && INTVAL (operands[0]) <= 0xffff"
10923 [(set_attr "op_type" "SIL")])
10925 (define_insn "tbegin_1"
10926 [(set (reg:CCRAW CC_REGNUM)
10927 (unspec_volatile:CCRAW [(match_operand 0 "const_int_operand" "D")]
10929 (set (match_operand:BLK 1 "memory_operand" "=Q")
10930 (unspec_volatile:BLK [(match_dup 0)] UNSPECV_TBEGIN_TDB))
10931 (clobber (reg:DF 16))
10932 (clobber (reg:DF 17))
10933 (clobber (reg:DF 18))
10934 (clobber (reg:DF 19))
10935 (clobber (reg:DF 20))
10936 (clobber (reg:DF 21))
10937 (clobber (reg:DF 22))
10938 (clobber (reg:DF 23))
10939 (clobber (reg:DF 24))
10940 (clobber (reg:DF 25))
10941 (clobber (reg:DF 26))
10942 (clobber (reg:DF 27))
10943 (clobber (reg:DF 28))
10944 (clobber (reg:DF 29))
10945 (clobber (reg:DF 30))
10946 (clobber (reg:DF 31))]
10947 ; CONST_OK_FOR_CONSTRAINT_P does not work with D constraint since D is
10948 ; not supposed to be used for immediates (see genpreds.c).
10949 "TARGET_HTM && INTVAL (operands[0]) >= 0 && INTVAL (operands[0]) <= 0xffff"
10951 [(set_attr "op_type" "SIL")])
10953 ; Same as above but without the FPR clobbers
10954 (define_insn "tbegin_nofloat_1"
10955 [(set (reg:CCRAW CC_REGNUM)
10956 (unspec_volatile:CCRAW [(match_operand 0 "const_int_operand" "D")]
10958 (set (match_operand:BLK 1 "memory_operand" "=Q")
10959 (unspec_volatile:BLK [(match_dup 0)] UNSPECV_TBEGIN_TDB))]
10960 "TARGET_HTM && INTVAL (operands[0]) >= 0 && INTVAL (operands[0]) <= 0xffff"
10962 [(set_attr "op_type" "SIL")])
10965 ; Constrained transaction begin
10967 (define_expand "tbeginc"
10968 [(set (reg:CCRAW CC_REGNUM)
10969 (unspec_volatile:CCRAW [(const_int TBEGINC_MASK)]
10974 (define_insn "*tbeginc_1"
10975 [(set (reg:CCRAW CC_REGNUM)
10976 (unspec_volatile:CCRAW [(match_operand 0 "const_int_operand" " D")]
10978 "TARGET_HTM && INTVAL (operands[0]) >= 0 && INTVAL (operands[0]) <= 0xffff"
10980 [(set_attr "op_type" "SIL")])
10984 (define_expand "tend"
10985 [(set (reg:CCRAW CC_REGNUM)
10986 (unspec_volatile:CCRAW [(const_int 0)] UNSPECV_TEND))
10987 (set (match_operand:SI 0 "register_operand" "")
10988 (unspec:SI [(reg:CCRAW CC_REGNUM)] UNSPEC_CC_TO_INT))]
10992 (define_insn "*tend_1"
10993 [(set (reg:CCRAW CC_REGNUM)
10994 (unspec_volatile:CCRAW [(const_int 0)] UNSPECV_TEND))]
10997 [(set_attr "op_type" "S")])
10999 ; Transaction abort
11001 (define_expand "tabort"
11002 [(unspec_volatile [(match_operand:SI 0 "nonmemory_operand" "")]
11004 "TARGET_HTM && operands != NULL"
11006 if (CONST_INT_P (operands[0])
11007 && INTVAL (operands[0]) >= 0 && INTVAL (operands[0]) <= 255)
11009 error ("invalid transaction abort code: " HOST_WIDE_INT_PRINT_DEC
11010 ". Values in range 0 through 255 are reserved.",
11011 INTVAL (operands[0]));
11016 (define_insn "*tabort_1"
11017 [(unspec_volatile [(match_operand:SI 0 "nonmemory_operand" "aJ")]
11019 "TARGET_HTM && operands != NULL"
11021 [(set_attr "op_type" "S")])
11023 (define_insn "*tabort_1_plus"
11024 [(unspec_volatile [(plus:SI (match_operand:SI 0 "register_operand" "a")
11025 (match_operand:SI 1 "const_int_operand" "J"))]
11027 "TARGET_HTM && operands != NULL
11028 && CONST_OK_FOR_CONSTRAINT_P (INTVAL (operands[1]), 'J', \"J\")"
11030 [(set_attr "op_type" "S")])
11032 ; Transaction extract nesting depth
11034 (define_insn "etnd"
11035 [(set (match_operand:SI 0 "register_operand" "=d")
11036 (unspec_volatile:SI [(const_int 0)] UNSPECV_ETND))]
11039 [(set_attr "op_type" "RRE")])
11041 ; Non-transactional store
11043 (define_insn "ntstg"
11044 [(set (match_operand:DI 0 "memory_operand" "=T")
11045 (unspec_volatile:DI [(match_operand:DI 1 "register_operand" "d")]
11049 [(set_attr "op_type" "RXY")])
11051 ; Transaction perform processor assist
11053 (define_expand "tx_assist"
11054 [(unspec_volatile [(match_operand:SI 0 "register_operand" "")
11055 (reg:SI GPR0_REGNUM)
11061 (define_insn "*ppa"
11062 [(unspec_volatile [(match_operand:SI 0 "register_operand" "d")
11063 (match_operand:SI 1 "register_operand" "d")
11064 (match_operand 2 "const_int_operand" "I")]
11066 "TARGET_HTM && INTVAL (operands[2]) < 16"
11068 [(set_attr "op_type" "RRF")])
11071 ; Set and get floating point control register
11073 (define_insn "sfpc"
11074 [(unspec_volatile [(match_operand:SI 0 "register_operand" "d")]
11076 "TARGET_HARD_FLOAT"
11079 (define_insn "efpc"
11080 [(set (match_operand:SI 0 "register_operand" "=d")
11081 (unspec_volatile:SI [(const_int 0)] UNSPECV_EFPC))]
11082 "TARGET_HARD_FLOAT"
11086 ; Load count to block boundary
11088 (define_insn "lcbb"
11089 [(set (match_operand:SI 0 "register_operand" "=d")
11090 (unspec:SI [(match_operand 1 "address_operand" "ZR")
11091 (match_operand:SI 2 "immediate_operand" "C")] UNSPEC_LCBB))
11092 (clobber (reg:CC CC_REGNUM))]
11095 [(set_attr "op_type" "VRX")])
11097 ; Handle -fsplit-stack.
11099 (define_expand "split_stack_prologue"
11103 s390_expand_split_stack_prologue ();
11107 ;; If there are operand 0 bytes available on the stack, jump to
11110 (define_expand "split_stack_space_check"
11111 [(set (pc) (if_then_else
11112 (ltu (minus (reg 15)
11113 (match_operand 0 "register_operand"))
11114 (unspec [(const_int 0)] UNSPEC_STACK_CHECK))
11115 (label_ref (match_operand 1))
11119 /* Offset from thread pointer to __private_ss. */
11120 int psso = TARGET_64BIT ? 0x38 : 0x20;
11121 rtx tp = s390_get_thread_pointer ();
11122 rtx guard = gen_rtx_MEM (Pmode, plus_constant (Pmode, tp, psso));
11123 rtx reg = gen_reg_rtx (Pmode);
11126 emit_insn (gen_subdi3 (reg, stack_pointer_rtx, operands[0]));
11128 emit_insn (gen_subsi3 (reg, stack_pointer_rtx, operands[0]));
11129 cc = s390_emit_compare (GT, reg, guard);
11130 s390_emit_jump (operands[1], cc);
11135 ;; __morestack parameter block for split stack prologue. Parameters are:
11136 ;; parameter block label, label to be called by __morestack, frame size,
11137 ;; stack parameter size.
11139 (define_insn "split_stack_data"
11140 [(unspec_volatile [(match_operand 0 "" "X")
11141 (match_operand 1 "" "X")
11142 (match_operand 2 "const_int_operand" "X")
11143 (match_operand 3 "const_int_operand" "X")]
11144 UNSPECV_SPLIT_STACK_DATA)]
11147 switch_to_section (targetm.asm_out.function_rodata_section
11148 (current_function_decl));
11151 output_asm_insn (".align\t8", operands);
11153 output_asm_insn (".align\t4", operands);
11154 (*targetm.asm_out.internal_label) (asm_out_file, "L",
11155 CODE_LABEL_NUMBER (operands[0]));
11158 output_asm_insn (".quad\t%2", operands);
11159 output_asm_insn (".quad\t%3", operands);
11160 output_asm_insn (".quad\t%1-%0", operands);
11164 output_asm_insn (".long\t%2", operands);
11165 output_asm_insn (".long\t%3", operands);
11166 output_asm_insn (".long\t%1-%0", operands);
11169 switch_to_section (current_function_section ());
11172 [(set_attr "length" "0")])
11175 ;; A jg with minimal fuss for use in split stack prologue.
11177 (define_expand "split_stack_call"
11178 [(match_operand 0 "bras_sym_operand" "X")
11179 (match_operand 1 "" "")]
11183 emit_jump_insn (gen_split_stack_call_di (operands[0], operands[1]));
11185 emit_jump_insn (gen_split_stack_call_si (operands[0], operands[1]));
11189 (define_insn "split_stack_call_<mode>"
11190 [(set (pc) (label_ref (match_operand 1 "" "")))
11191 (set (reg:P 1) (unspec_volatile [(match_operand 0 "bras_sym_operand" "X")
11193 UNSPECV_SPLIT_STACK_CALL))]
11196 [(set_attr "op_type" "RIL")
11197 (set_attr "type" "branch")])
11199 ;; Also a conditional one.
11201 (define_expand "split_stack_cond_call"
11202 [(match_operand 0 "bras_sym_operand" "X")
11203 (match_operand 1 "" "")
11204 (match_operand 2 "" "")]
11208 emit_jump_insn (gen_split_stack_cond_call_di (operands[0], operands[1], operands[2]));
11210 emit_jump_insn (gen_split_stack_cond_call_si (operands[0], operands[1], operands[2]));
11214 (define_insn "split_stack_cond_call_<mode>"
11217 (match_operand 1 "" "")
11218 (label_ref (match_operand 2 "" ""))
11220 (set (reg:P 1) (unspec_volatile [(match_operand 0 "bras_sym_operand" "X")
11222 UNSPECV_SPLIT_STACK_CALL))]
11225 [(set_attr "op_type" "RIL")
11226 (set_attr "type" "branch")])
11228 (define_insn "osc_break"
11229 [(unspec_volatile [(const_int 0)] UNSPECV_OSC_BREAK)]
11232 [(set_attr "op_type" "RR")])