Sync usage with man page.
[netbsd-mini2440.git] / gnu / dist / gcc4 / gcc / config / s390 / s390.md
blob910fd2bab608f0d38e00ed68b3f6bef4f2cac71a
1 ;;- Machine description for GNU compiler -- S/390 / zSeries version.
2 ;;  Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006
3 ;;  Free Software Foundation, Inc.
4 ;;  Contributed by Hartmut Penner (hpenner@de.ibm.com) and
5 ;;                 Ulrich Weigand (uweigand@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 2, or (at your option) any later
12 ;; version.
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
17 ;; for more details.
19 ;; You should have received a copy of the GNU General Public License
20 ;; along with GCC; see the file COPYING.  If not, write to the Free
21 ;; Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
22 ;; 02110-1301, USA.
25 ;; Special constraints for s/390 machine description:
27 ;;    a -- Any address register from 1 to 15.
28 ;;    c -- Condition code register 33.
29 ;;    d -- Any register from 0 to 15.
30 ;;    f -- Floating point registers.
31 ;;    t -- Access registers 36 and 37.
32 ;;    G -- Const double zero operand
33 ;;    I -- An 8-bit constant (0..255).
34 ;;    J -- A 12-bit constant (0..4095).
35 ;;    K -- A 16-bit constant (-32768..32767).
36 ;;    L -- Value appropriate as displacement.
37 ;;         (0..4095) for short displacement
38 ;;         (-524288..524287) for long displacement
39 ;;    M -- Constant integer with a value of 0x7fffffff.
40 ;;    N -- Multiple letter constraint followed by 4 parameter letters.
41 ;;         0..9,x:  number of the part counting from most to least significant
42 ;;         H,Q:     mode of the part
43 ;;         D,S,H:   mode of the containing operand
44 ;;         0,F:     value of the other parts (F - all bits set)
46 ;;         The constraint matches if the specified part of a constant
47 ;;         has a value different from its other parts.  If the letter x
48 ;;         is specified instead of a part number, the constraint matches
49 ;;         if there is any single part with non-default value.
50 ;;    O -- Multiple letter constraint followed by 1 parameter.
51 ;;         s:  Signed extended immediate value (-2G .. 2G-1).
52 ;;         p:  Positive extended immediate value (0 .. 4G-1).
53 ;;         n:  Negative extended immediate value (-4G+1 .. -1).
54 ;;         These constraints do not accept any operand if the machine does
55 ;;         not provide the extended-immediate facility.
56 ;;    P -- Any integer constant that can be loaded without literal pool.
57 ;;    Q -- Memory reference without index register and with short displacement.
58 ;;    R -- Memory reference with index register and short displacement.
59 ;;    S -- Memory reference without index register but with long displacement.
60 ;;    T -- Memory reference with index register and long displacement.
61 ;;    A -- Multiple letter constraint followed by Q, R, S, or T:
62 ;;         Offsettable memory reference of type specified by second letter.
63 ;;    B -- Multiple letter constraint followed by Q, R, S, or T:
64 ;;         Memory reference of the type specified by second letter that
65 ;;         does *not* refer to a literal pool entry.
66 ;;    U -- Pointer with short displacement.
67 ;;    W -- Pointer with long displacement.
68 ;;    Y -- Shift count operand.
70 ;; Special formats used for outputting 390 instructions.
72 ;;     %C: print opcode suffix for branch condition.
73 ;;     %D: print opcode suffix for inverse branch condition.
74 ;;     %J: print tls_load/tls_gdcall/tls_ldcall suffix
75 ;;     %G: print the size of the operand in bytes.
76 ;;     %O: print only the displacement of a memory reference.
77 ;;     %R: print only the base register of a memory reference.
78 ;;     %S: print S-type memory reference (base+displacement).
79 ;;     %N: print the second word of a DImode operand.
80 ;;     %M: print the second word of a TImode operand.
81 ;;     %Y: print shift count operand.
82 ;;  
83 ;;     %b: print integer X as if it's an unsigned byte.
84 ;;     %x: print integer X as if it's an unsigned halfword.
85 ;;     %h: print integer X as if it's a signed halfword.
86 ;;     %i: print the first nonzero HImode part of X.
87 ;;     %j: print the first HImode part unequal to -1 of X.
88 ;;     %k: print the first nonzero SImode part of X.
89 ;;     %m: print the first SImode part unequal to -1 of X.
90 ;;     %o: print integer X as if it's an unsigned 32bit word.
92 ;; We have a special constraint for pattern matching.
94 ;;   s_operand -- Matches a valid S operand in a RS, SI or SS type instruction.
98 ;; UNSPEC usage
101 (define_constants
102   [; Miscellaneous
103    (UNSPEC_ROUND                1)
104    (UNSPEC_CMPINT               2)
105    (UNSPEC_ICM                  10)
107    ; GOT/PLT and lt-relative accesses
108    (UNSPEC_LTREL_OFFSET         100)
109    (UNSPEC_LTREL_BASE           101)
110    (UNSPEC_GOTENT               110)
111    (UNSPEC_GOT                  111)
112    (UNSPEC_GOTOFF               112)
113    (UNSPEC_PLT                  113)
114    (UNSPEC_PLTOFF               114)
116    ; Literal pool
117    (UNSPEC_RELOAD_BASE          210)
118    (UNSPEC_MAIN_BASE            211)
119    (UNSPEC_LTREF                212)
120    (UNSPEC_INSN                 213)
121    (UNSPEC_EXECUTE              214)
123    ; TLS relocation specifiers
124    (UNSPEC_TLSGD                500)
125    (UNSPEC_TLSLDM               501)
126    (UNSPEC_NTPOFF               502)
127    (UNSPEC_DTPOFF               503)
128    (UNSPEC_GOTNTPOFF            504)
129    (UNSPEC_INDNTPOFF            505)
131    ; TLS support
132    (UNSPEC_TLSLDM_NTPOFF        511)
133    (UNSPEC_TLS_LOAD             512)
135    ; String Functions
136    (UNSPEC_SRST                 600)
137    (UNSPEC_MVST                 601)
138    
139    ; Stack Smashing Protector
140    (UNSPEC_SP_SET               700)
141    (UNSPEC_SP_TEST              701)
142  ])
145 ;; UNSPEC_VOLATILE usage
148 (define_constants
149   [; Blockage
150    (UNSPECV_BLOCKAGE            0)
152    ; TPF Support
153    (UNSPECV_TPF_PROLOGUE        20)
154    (UNSPECV_TPF_EPILOGUE        21)
156    ; Literal pool
157    (UNSPECV_POOL                200)
158    (UNSPECV_POOL_SECTION        201)
159    (UNSPECV_POOL_ALIGN          202)
160    (UNSPECV_POOL_ENTRY          203)
161    (UNSPECV_MAIN_POOL           300)
163    ; TLS support
164    (UNSPECV_SET_TP              500)
166    ; Atomic Support
167    (UNSPECV_MB                  700)
168    (UNSPECV_CAS                 701)
169   ])
172 ;; Registers
175 (define_constants
176   [
177    ; Sibling call register.
178    (SIBCALL_REGNUM               1)
179    ; Literal pool base register.
180    (BASE_REGNUM                 13)
181    ; Return address register.
182    (RETURN_REGNUM               14)
183    ; Condition code register.
184    (CC_REGNUM                   33)
185    ; Thread local storage pointer register. 
186    (TP_REGNUM                   36)
187   ])
190 ;; Instruction operand type as used in the Principles of Operation.
191 ;; Used to determine defaults for length and other attribute values.
193 (define_attr "op_type"
194   "NN,E,RR,RRE,RX,RS,RSI,RI,SI,S,SS,SSE,RXE,RSE,RIL,RIE,RXY,RSY,SIY"
195   (const_string "NN"))
197 ;; Instruction type attribute used for scheduling.
199 (define_attr "type" "none,integer,load,lr,la,larl,lm,stm,
200                      cs,vs,store,sem,idiv,
201                      imulhi,imulsi,imuldi,
202                      branch,jsr,fsimptf,fsimpdf,fsimpsf,
203                      floadtf,floaddf,floadsf,fstoredf,fstoresf,
204                      fmultf,fmuldf,fmulsf,fdivtf,fdivdf,fdivsf,
205                      ftoi,itof,fsqrttf,fsqrtdf,fsqrtsf,
206                      ftrunctf,ftruncdf,other"
207   (cond [(eq_attr "op_type" "NN")  (const_string "other")
208          (eq_attr "op_type" "SS")  (const_string "cs")]
209     (const_string "integer")))
211 ;; Another attribute used for scheduling purposes:
212 ;;   agen: Instruction uses the address generation unit
213 ;;   reg: Instruction does not use the agen unit
215 (define_attr "atype" "agen,reg"
216   (cond [(eq_attr "op_type" "E")   (const_string "reg")
217          (eq_attr "op_type" "RR")  (const_string "reg")
218          (eq_attr "op_type" "RX")  (const_string "agen")
219          (eq_attr "op_type" "RI")  (const_string "reg")
220          (eq_attr "op_type" "RRE") (const_string "reg")
221          (eq_attr "op_type" "RS")  (const_string "agen")
222          (eq_attr "op_type" "RSI") (const_string "agen")
223          (eq_attr "op_type" "S")   (const_string "agen")
224          (eq_attr "op_type" "SI")  (const_string "agen")
225          (eq_attr "op_type" "SS")  (const_string "agen")
226          (eq_attr "op_type" "SSE") (const_string "agen")
227          (eq_attr "op_type" "RXE") (const_string "agen")
228          (eq_attr "op_type" "RSE") (const_string "agen")
229          (eq_attr "op_type" "RIL") (const_string "agen")
230          (eq_attr "op_type" "RXY") (const_string "agen")
231          (eq_attr "op_type" "RSY") (const_string "agen")
232          (eq_attr "op_type" "SIY") (const_string "agen")]
233     (const_string "agen")))
235 ;; Length in bytes.
237 (define_attr "length" ""
238   (cond [(eq_attr "op_type" "E")   (const_int 2)
239          (eq_attr "op_type" "RR")  (const_int 2)
240          (eq_attr "op_type" "RX")  (const_int 4)
241          (eq_attr "op_type" "RI")  (const_int 4)
242          (eq_attr "op_type" "RRE") (const_int 4)
243          (eq_attr "op_type" "RS")  (const_int 4)
244          (eq_attr "op_type" "RSI") (const_int 4)
245          (eq_attr "op_type" "S")   (const_int 4)
246          (eq_attr "op_type" "SI")  (const_int 4)
247          (eq_attr "op_type" "SS")  (const_int 6)
248          (eq_attr "op_type" "SSE") (const_int 6)
249          (eq_attr "op_type" "RXE") (const_int 6)
250          (eq_attr "op_type" "RSE") (const_int 6)
251          (eq_attr "op_type" "RIL") (const_int 6)
252          (eq_attr "op_type" "RXY") (const_int 6)
253          (eq_attr "op_type" "RSY") (const_int 6)
254          (eq_attr "op_type" "SIY") (const_int 6)]
255     (const_int 6)))
258 ;; Processor type.  This attribute must exactly match the processor_type
259 ;; enumeration in s390.h.  The current machine description does not
260 ;; distinguish between g5 and g6, but there are differences between the two
261 ;; CPUs could in theory be modeled.
263 (define_attr "cpu" "g5,g6,z900,z990,z9_109"
264   (const (symbol_ref "s390_tune")))
266 ;; Pipeline description for z900.  For lack of anything better,
267 ;; this description is also used for the g5 and g6.
268 (include "2064.md")
270 ;; Pipeline description for z990. 
271 (include "2084.md")
273 ;; Predicates
274 (include "predicates.md")
276 ;; Other includes
277 (include "tpf.md")
279 ;; Macros
281 ;; This mode macro allows floating point patterns to be generated from the
282 ;; same template.
283 (define_mode_macro FPR [TF DF SF])
284 (define_mode_macro DSF [DF SF])
286 ;; These mode macros allow 31-bit and 64-bit TDSI patterns to be generated
287 ;; from the same template.
288 (define_mode_macro TDSI [(TI "TARGET_64BIT") DI SI])
290 ;; These mode macros allow 31-bit and 64-bit GPR patterns to be generated
291 ;; from the same template.
292 (define_mode_macro GPR [(DI "TARGET_64BIT") SI])
293 (define_mode_macro DSI [DI SI])
295 ;; This mode macro allows :P to be used for patterns that operate on
296 ;; pointer-sized quantities.  Exactly one of the two alternatives will match.
297 (define_mode_macro DP  [(TI "TARGET_64BIT") (DI "!TARGET_64BIT")])
298 (define_mode_macro P [(DI "TARGET_64BIT") (SI "!TARGET_64BIT")])
300 ;; This mode macro allows the QI and HI patterns to be defined from
301 ;; the same template.
302 (define_mode_macro HQI [HI QI])
304 ;; This mode macro allows the integer patterns to be defined from the
305 ;; same template.
306 (define_mode_macro INT [(DI "TARGET_64BIT") SI HI QI])
308 ;; This macro allows to unify all 'bCOND' expander patterns.
309 (define_code_macro COMPARE [eq ne gt gtu lt ltu ge geu le leu unordered 
310                             ordered uneq unlt ungt unle unge ltgt])
312 ;; This macro allows to unify all 'sCOND' patterns.
313 (define_code_macro SCOND [ltu gtu leu geu])
315 ;; This macro allows some 'ashift' and 'lshiftrt' pattern to be defined from
316 ;; the same template.
317 (define_code_macro SHIFT [ashift lshiftrt])
319 ;; These macros allow to combine most atomic operations.
320 (define_code_macro ATOMIC [and ior xor plus minus mult])
321 (define_code_attr atomic [(and "and") (ior "ior") (xor "xor") 
322                           (plus "add") (minus "sub") (mult "nand")])
325 ;; In FPR templates, a string like "lt<de>br" will expand to "ltxbr" in TFmode,
326 ;; "ltdbr" in DFmode, and "ltebr" in SFmode.
327 (define_mode_attr xde [(TF "x") (DF "d") (SF "e")])
329 ;; In FPR templates, a string like "m<dee>br" will expand to "mxbr" in TFmode,
330 ;; "mdbr" in DFmode, and "meebr" in SFmode.
331 (define_mode_attr xdee [(TF "x") (DF "d") (SF "ee")])
333 ;; In FPR templates, "<RRe>" will expand to "RRE" in TFmode and "RR" otherwise.
334 ;; Likewise for "<RXe>".
335 (define_mode_attr RRe [(TF "RRE") (DF "RR") (SF "RR")])
336 (define_mode_attr RXe [(TF "RXE") (DF "RX") (SF "RX")])
338 ;; In FPR templates, "<Rf>" will expand to "f" in TFmode and "R" otherwise.
339 ;; This is used to disable the memory alternative in TFmode patterns.
340 (define_mode_attr Rf [(TF "f") (DF "R") (SF "R")])
342 ;; In SHIFT templates, a string like "s<lr>dl" will expand to "sldl" in 
343 ;; 'ashift' and "srdl" in 'lshiftrt'.
344 (define_code_attr lr [(ashift "l") (lshiftrt "r")])
346 ;; In SHIFT templates, this attribute holds the correct standard name for the
347 ;; pattern itself and the corresponding function calls. 
348 (define_code_attr shift [(ashift "ashl") (lshiftrt "lshr")])
350 ;; This attribute handles differences in the instruction 'type' and will result
351 ;; in "RRE" for DImode and "RR" for SImode.
352 (define_mode_attr E [(DI "E") (SI "")])
354 ;; This attribute handles differences in the instruction 'type' and will result
355 ;; in "RSE" for TImode and "RS" for DImode.
356 (define_mode_attr TE [(TI "E") (DI "")])
358 ;; In GPR templates, a string like "lc<g>r" will expand to "lcgr" in DImode
359 ;; and "lcr" in SImode.
360 (define_mode_attr g [(DI "g") (SI "")])
362 ;; In DP templates, a string like "cds<g>" will expand to "cdsg" in TImode
363 ;; and "cds" in DImode.
364 (define_mode_attr tg [(TI "g") (DI "")])
366 ;; In GPR templates, a string like "c<gf>dbr" will expand to "cgdbr" in DImode
367 ;; and "cfdbr" in SImode.
368 (define_mode_attr gf [(DI "g") (SI "f")])
370 ;; ICM mask required to load MODE value into the lowest subreg
371 ;; of a SImode register.
372 (define_mode_attr icm_lo [(HI "3") (QI "1")])
374 ;; In HQI templates, a string like "llg<hc>" will expand to "llgh" in
375 ;; HImode and "llgc" in QImode.
376 (define_mode_attr hc [(HI "h") (QI "c")])
378 ;; In P templates, the mode <DBL> will expand to "TI" in DImode and "DI"
379 ;; in SImode.
380 (define_mode_attr DBL [(DI "TI") (SI "DI")])
382 ;; Maximum unsigned integer that fits in MODE.
383 (define_mode_attr max_uint [(HI "65535") (QI "255")])
387 ;;- Compare instructions.
390 (define_expand "cmp<mode>"
391   [(set (reg:CC CC_REGNUM)
392         (compare:CC (match_operand:GPR 0 "register_operand" "")
393                     (match_operand:GPR 1 "general_operand" "")))]
394   ""
396   s390_compare_op0 = operands[0];
397   s390_compare_op1 = operands[1];
398   DONE;
401 (define_expand "cmp<mode>"
402   [(set (reg:CC CC_REGNUM)
403         (compare:CC (match_operand:FPR 0 "register_operand" "")
404                     (match_operand:FPR 1 "general_operand" "")))]
405   "TARGET_HARD_FLOAT"
407   s390_compare_op0 = operands[0];
408   s390_compare_op1 = operands[1];
409   DONE;
413 ; Test-under-Mask instructions
415 (define_insn "*tmqi_mem"
416   [(set (reg CC_REGNUM)
417         (compare (and:QI (match_operand:QI 0 "memory_operand" "Q,S")
418                          (match_operand:QI 1 "immediate_operand" "n,n"))
419                  (match_operand:QI 2 "immediate_operand" "n,n")))]
420   "s390_match_ccmode (insn, s390_tm_ccmode (operands[1], operands[2], false))"
421   "@
422    tm\t%S0,%b1
423    tmy\t%S0,%b1"
424   [(set_attr "op_type" "SI,SIY")])
426 (define_insn "*tmdi_reg"
427   [(set (reg CC_REGNUM)
428         (compare (and:DI (match_operand:DI 0 "nonimmediate_operand" "d,d,d,d")
429                          (match_operand:DI 1 "immediate_operand"
430                                              "N0HD0,N1HD0,N2HD0,N3HD0"))
431                  (match_operand:DI 2 "immediate_operand" "n,n,n,n")))]
432   "TARGET_64BIT
433    && s390_match_ccmode (insn, s390_tm_ccmode (operands[1], operands[2], true))
434    && s390_single_part (operands[1], DImode, HImode, 0) >= 0"
435   "@
436    tmhh\t%0,%i1
437    tmhl\t%0,%i1
438    tmlh\t%0,%i1
439    tmll\t%0,%i1"
440   [(set_attr "op_type" "RI")])
442 (define_insn "*tmsi_reg"
443   [(set (reg CC_REGNUM)
444         (compare (and:SI (match_operand:SI 0 "nonimmediate_operand" "d,d")
445                          (match_operand:SI 1 "immediate_operand" "N0HS0,N1HS0"))
446                  (match_operand:SI 2 "immediate_operand" "n,n")))]
447   "s390_match_ccmode (insn, s390_tm_ccmode (operands[1], operands[2], true))
448    && s390_single_part (operands[1], SImode, HImode, 0) >= 0"
449   "@
450    tmh\t%0,%i1
451    tml\t%0,%i1"
452   [(set_attr "op_type" "RI")])
454 (define_insn "*tm<mode>_full"
455   [(set (reg CC_REGNUM)
456         (compare (match_operand:HQI 0 "register_operand" "d")
457                  (match_operand:HQI 1 "immediate_operand" "n")))]
458   "s390_match_ccmode (insn, s390_tm_ccmode (constm1_rtx, operands[1], true))"
459   "tml\t%0,<max_uint>"
460   [(set_attr "op_type" "RI")])
463 ; Load-and-Test instructions
465 (define_insn "*tstdi_sign"
466   [(set (reg CC_REGNUM)
467         (compare (ashiftrt:DI (ashift:DI (subreg:DI (match_operand:SI 0 "register_operand" "d") 0)
468                                          (const_int 32)) (const_int 32))
469                  (match_operand:DI 1 "const0_operand" "")))
470    (set (match_operand:DI 2 "register_operand" "=d")
471         (sign_extend:DI (match_dup 0)))]
472   "s390_match_ccmode(insn, CCSmode) && TARGET_64BIT"
473   "ltgfr\t%2,%0"
474   [(set_attr "op_type" "RRE")])
476 (define_insn "*tstdi_extimm"
477   [(set (reg CC_REGNUM)
478         (compare (match_operand:DI 0 "nonimmediate_operand" "d,m")
479                  (match_operand:DI 1 "const0_operand" "")))
480    (set (match_operand:DI 2 "register_operand" "=d,d")
481         (match_dup 0))]
482   "s390_match_ccmode(insn, CCSmode) && TARGET_64BIT && TARGET_EXTIMM"
483   "@
484    ltgr\t%2,%0
485    ltg\t%2,%0"
486   [(set_attr "op_type" "RRE,RXY")])
488 (define_insn "*tstdi_cconly_extimm"
489   [(set (reg CC_REGNUM)
490         (compare (match_operand:DI 0 "nonimmediate_operand" "d,m")
491                  (match_operand:DI 1 "const0_operand" "")))
492    (clobber (match_scratch:DI 2 "=X,d"))]
493   "s390_match_ccmode(insn, CCSmode) && TARGET_64BIT && TARGET_EXTIMM"
494   "@
495    ltgr\t%0,%0
496    ltg\t%2,%0"
497   [(set_attr "op_type" "RRE,RXY")])
499 (define_insn "*tstdi"
500   [(set (reg CC_REGNUM)
501         (compare (match_operand:DI 0 "register_operand" "d")
502                  (match_operand:DI 1 "const0_operand" "")))
503    (set (match_operand:DI 2 "register_operand" "=d")
504         (match_dup 0))]
505   "s390_match_ccmode(insn, CCSmode) && TARGET_64BIT && !TARGET_EXTIMM"
506   "ltgr\t%2,%0"
507   [(set_attr "op_type" "RRE")])
509 (define_insn "*tstdi_cconly"
510   [(set (reg CC_REGNUM)
511         (compare (match_operand:DI 0 "register_operand" "d")
512                  (match_operand:DI 1 "const0_operand" "")))]
513   "s390_match_ccmode(insn, CCSmode) && TARGET_64BIT"
514   "ltgr\t%0,%0"
515   [(set_attr "op_type" "RRE")])
517 (define_insn "*tstdi_cconly_31"
518   [(set (reg CC_REGNUM)
519         (compare (match_operand:DI 0 "register_operand" "d")
520                  (match_operand:DI 1 "const0_operand" "")))]
521   "s390_match_ccmode(insn, CCSmode) && !TARGET_64BIT"
522   "srda\t%0,0"
523   [(set_attr "op_type" "RS")
524    (set_attr "atype"   "reg")])
526 (define_insn "*tstsi_extimm"
527   [(set (reg CC_REGNUM)
528         (compare (match_operand:SI 0 "nonimmediate_operand" "d,m")
529                  (match_operand:SI 1 "const0_operand" "")))
530    (set (match_operand:SI 2 "register_operand" "=d,d")
531         (match_dup 0))]
532   "s390_match_ccmode(insn, CCSmode) && TARGET_EXTIMM"
533   "@
534    ltr\t%2,%0
535    lt\t%2,%0"
536   [(set_attr "op_type" "RR,RXY")])
538 (define_insn "*tstsi_cconly_extimm"
539   [(set (reg CC_REGNUM)
540         (compare (match_operand:SI 0 "nonimmediate_operand" "d,m")
541                  (match_operand:SI 1 "const0_operand" "")))
542    (clobber (match_scratch:SI 2 "=X,d"))]
543   "s390_match_ccmode(insn, CCSmode) && TARGET_EXTIMM"
544   "@
545    ltr\t%0,%0
546    lt\t%2,%0"
547   [(set_attr "op_type" "RR,RXY")])
549 (define_insn "*tstsi"
550   [(set (reg CC_REGNUM)
551         (compare (match_operand:SI 0 "nonimmediate_operand" "d,Q,S")
552                  (match_operand:SI 1 "const0_operand" "")))
553    (set (match_operand:SI 2 "register_operand" "=d,d,d")
554         (match_dup 0))]
555   "s390_match_ccmode(insn, CCSmode) && !TARGET_EXTIMM"
556   "@
557    ltr\t%2,%0
558    icm\t%2,15,%S0
559    icmy\t%2,15,%S0"
560   [(set_attr "op_type" "RR,RS,RSY")])
562 (define_insn "*tstsi_cconly"
563   [(set (reg CC_REGNUM)
564         (compare (match_operand:SI 0 "nonimmediate_operand" "d,Q,S")
565                  (match_operand:SI 1 "const0_operand" "")))
566    (clobber (match_scratch:SI 2 "=X,d,d"))]
567   "s390_match_ccmode(insn, CCSmode)"
568   "@
569    ltr\t%0,%0
570    icm\t%2,15,%S0
571    icmy\t%2,15,%S0"
572   [(set_attr "op_type" "RR,RS,RSY")])
574 (define_insn "*tstsi_cconly2"
575   [(set (reg CC_REGNUM)
576         (compare (match_operand:SI 0 "register_operand" "d")
577                  (match_operand:SI 1 "const0_operand" "")))]
578   "s390_match_ccmode(insn, CCSmode)"
579   "ltr\t%0,%0"
580   [(set_attr "op_type" "RR")])
582 (define_insn "*tst<mode>CCT"
583   [(set (reg CC_REGNUM)
584         (compare (match_operand:HQI 0 "nonimmediate_operand" "?Q,?S,d")
585                  (match_operand:HQI 1 "const0_operand" "")))
586    (set (match_operand:HQI 2 "register_operand" "=d,d,0")
587         (match_dup 0))]
588   "s390_match_ccmode(insn, CCTmode)"
589   "@
590    icm\t%2,<icm_lo>,%S0
591    icmy\t%2,<icm_lo>,%S0
592    tml\t%0,<max_uint>"
593   [(set_attr "op_type" "RS,RSY,RI")])
595 (define_insn "*tsthiCCT_cconly"
596   [(set (reg CC_REGNUM)
597         (compare (match_operand:HI 0 "nonimmediate_operand" "Q,S,d")
598                  (match_operand:HI 1 "const0_operand" "")))
599    (clobber (match_scratch:HI 2 "=d,d,X"))]
600   "s390_match_ccmode(insn, CCTmode)"
601   "@
602    icm\t%2,3,%S0
603    icmy\t%2,3,%S0
604    tml\t%0,65535"
605   [(set_attr "op_type" "RS,RSY,RI")])
607 (define_insn "*tstqiCCT_cconly"
608   [(set (reg CC_REGNUM)
609         (compare (match_operand:QI 0 "nonimmediate_operand" "?Q,?S,d")
610                  (match_operand:QI 1 "const0_operand" "")))]
611   "s390_match_ccmode(insn, CCTmode)"
612   "@
613    cli\t%S0,0
614    cliy\t%S0,0
615    tml\t%0,255"
616   [(set_attr "op_type" "SI,SIY,RI")])
618 (define_insn "*tst<mode>"
619   [(set (reg CC_REGNUM)
620         (compare (match_operand:HQI 0 "s_operand" "Q,S")
621                  (match_operand:HQI 1 "const0_operand" "")))
622    (set (match_operand:HQI 2 "register_operand" "=d,d")
623         (match_dup 0))]
624   "s390_match_ccmode(insn, CCSmode)"
625   "@
626    icm\t%2,<icm_lo>,%S0
627    icmy\t%2,<icm_lo>,%S0"
628   [(set_attr "op_type" "RS,RSY")])
630 (define_insn "*tst<mode>_cconly"
631   [(set (reg CC_REGNUM)
632         (compare (match_operand:HQI 0 "s_operand" "Q,S")
633                  (match_operand:HQI 1 "const0_operand" "")))
634    (clobber (match_scratch:HQI 2 "=d,d"))]
635   "s390_match_ccmode(insn, CCSmode)"
636   "@
637    icm\t%2,<icm_lo>,%S0
638    icmy\t%2,<icm_lo>,%S0"
639   [(set_attr "op_type" "RS,RSY")])
642 ; Compare (equality) instructions
644 (define_insn "*cmpdi_cct"
645   [(set (reg CC_REGNUM)
646         (compare (match_operand:DI 0 "nonimmediate_operand" "%d,d,d,d,Q")
647                  (match_operand:DI 1 "general_operand" "d,K,Os,m,BQ")))]
648   "s390_match_ccmode (insn, CCTmode) && TARGET_64BIT"
649   "@
650    cgr\t%0,%1
651    cghi\t%0,%h1
652    cgfi\t%0,%1
653    cg\t%0,%1
654    #"
655   [(set_attr "op_type" "RRE,RI,RIL,RXY,SS")])
657 (define_insn "*cmpsi_cct"
658   [(set (reg CC_REGNUM)
659         (compare (match_operand:SI 0 "nonimmediate_operand" "%d,d,d,d,d,Q")
660                  (match_operand:SI 1 "general_operand" "d,K,Os,R,T,BQ")))]
661   "s390_match_ccmode (insn, CCTmode)"
662   "@
663    cr\t%0,%1
664    chi\t%0,%h1
665    cfi\t%0,%1
666    c\t%0,%1
667    cy\t%0,%1
668    #"
669   [(set_attr "op_type" "RR,RI,RIL,RX,RXY,SS")])
672 ; Compare (signed) instructions
674 (define_insn "*cmpdi_ccs_sign"
675   [(set (reg CC_REGNUM)
676         (compare (sign_extend:DI (match_operand:SI 1 "nonimmediate_operand" "d,m"))
677                  (match_operand:DI 0 "register_operand" "d,d")))]
678   "s390_match_ccmode(insn, CCSRmode) && TARGET_64BIT"
679   "@
680    cgfr\t%0,%1
681    cgf\t%0,%1"
682   [(set_attr "op_type" "RRE,RXY")])
684 (define_insn "*cmpdi_ccs"
685   [(set (reg CC_REGNUM)
686         (compare (match_operand:DI 0 "register_operand" "d,d,d,d")
687                  (match_operand:DI 1 "general_operand" "d,K,Os,m")))]
688   "s390_match_ccmode(insn, CCSmode) && TARGET_64BIT"
689   "@
690    cgr\t%0,%1
691    cghi\t%0,%h1
692    cgfi\t%0,%1
693    cg\t%0,%1"
694   [(set_attr "op_type" "RRE,RI,RIL,RXY")])
696 (define_insn "*cmpsi_ccs_sign"
697   [(set (reg CC_REGNUM)
698         (compare (sign_extend:SI (match_operand:HI 1 "memory_operand" "R,T"))
699                  (match_operand:SI 0 "register_operand" "d,d")))]
700   "s390_match_ccmode(insn, CCSRmode)"
701   "@
702    ch\t%0,%1
703    chy\t%0,%1"
704   [(set_attr "op_type" "RX,RXY")])
706 (define_insn "*cmpsi_ccs"
707   [(set (reg CC_REGNUM)
708         (compare (match_operand:SI 0 "register_operand" "d,d,d,d,d")
709                  (match_operand:SI 1 "general_operand" "d,K,Os,R,T")))]
710   "s390_match_ccmode(insn, CCSmode)"
711   "@
712    cr\t%0,%1
713    chi\t%0,%h1
714    cfi\t%0,%1
715    c\t%0,%1
716    cy\t%0,%1"
717   [(set_attr "op_type" "RR,RI,RIL,RX,RXY")])
720 ; Compare (unsigned) instructions
722 (define_insn "*cmpdi_ccu_zero"
723   [(set (reg CC_REGNUM)
724         (compare (zero_extend:DI (match_operand:SI 1 "nonimmediate_operand" "d,m"))
725                  (match_operand:DI 0 "register_operand" "d,d")))]
726   "s390_match_ccmode (insn, CCURmode) && TARGET_64BIT"
727   "@
728    clgfr\t%0,%1
729    clgf\t%0,%1"
730   [(set_attr "op_type" "RRE,RXY")])
732 (define_insn "*cmpdi_ccu"
733   [(set (reg CC_REGNUM)
734         (compare (match_operand:DI 0 "nonimmediate_operand" "d,d,d,Q,BQ")
735                  (match_operand:DI 1 "general_operand" "d,Op,m,BQ,Q")))]
736   "s390_match_ccmode (insn, CCUmode) && TARGET_64BIT"
737   "@
738    clgr\t%0,%1
739    clgfi\t%0,%1
740    clg\t%0,%1
741    #
742    #"
743   [(set_attr "op_type" "RRE,RIL,RXY,SS,SS")])
745 (define_insn "*cmpsi_ccu"
746   [(set (reg CC_REGNUM)
747         (compare (match_operand:SI 0 "nonimmediate_operand" "d,d,d,d,Q,BQ")
748                  (match_operand:SI 1 "general_operand" "d,Os,R,T,BQ,Q")))]
749   "s390_match_ccmode (insn, CCUmode)"
750   "@
751    clr\t%0,%1
752    clfi\t%0,%o1
753    cl\t%0,%1
754    cly\t%0,%1
755    #
756    #"
757   [(set_attr "op_type" "RR,RIL,RX,RXY,SS,SS")])
759 (define_insn "*cmphi_ccu"
760   [(set (reg CC_REGNUM)
761         (compare (match_operand:HI 0 "nonimmediate_operand" "d,d,Q,BQ")
762                  (match_operand:HI 1 "general_operand" "Q,S,BQ,Q")))]
763   "s390_match_ccmode (insn, CCUmode)
764    && !register_operand (operands[1], HImode)"
765   "@
766    clm\t%0,3,%S1
767    clmy\t%0,3,%S1
768    #
769    #"
770   [(set_attr "op_type" "RS,RSY,SS,SS")])
772 (define_insn "*cmpqi_ccu"
773   [(set (reg CC_REGNUM)
774         (compare (match_operand:QI 0 "nonimmediate_operand" "d,d,Q,S,Q,BQ")
775                  (match_operand:QI 1 "general_operand" "Q,S,n,n,BQ,Q")))]
776   "s390_match_ccmode (insn, CCUmode)
777    && !register_operand (operands[1], QImode)"
778   "@
779    clm\t%0,1,%S1
780    clmy\t%0,1,%S1
781    cli\t%S0,%b1
782    cliy\t%S0,%b1
783    #
784    #"
785   [(set_attr "op_type" "RS,RSY,SI,SIY,SS,SS")])
788 ; Block compare (CLC) instruction patterns.
790 (define_insn "*clc"
791   [(set (reg CC_REGNUM)
792         (compare (match_operand:BLK 0 "memory_operand" "Q")
793                  (match_operand:BLK 1 "memory_operand" "Q")))
794    (use (match_operand 2 "const_int_operand" "n"))]
795   "s390_match_ccmode (insn, CCUmode)
796    && INTVAL (operands[2]) >= 1 && INTVAL (operands[2]) <= 256"
797   "clc\t%O0(%2,%R0),%S1"
798   [(set_attr "op_type" "SS")])
800 (define_split
801   [(set (reg CC_REGNUM)
802         (compare (match_operand 0 "memory_operand" "")
803                  (match_operand 1 "memory_operand" "")))]
804   "reload_completed
805    && s390_match_ccmode (insn, CCUmode)
806    && GET_MODE (operands[0]) == GET_MODE (operands[1])
807    && GET_MODE_SIZE (GET_MODE (operands[0])) > 0"
808   [(parallel
809     [(set (match_dup 0) (match_dup 1))
810      (use (match_dup 2))])]
812   operands[2] = GEN_INT (GET_MODE_SIZE (GET_MODE (operands[0])));
813   operands[0] = adjust_address (operands[0], BLKmode, 0);
814   operands[1] = adjust_address (operands[1], BLKmode, 0);
816   operands[1] = gen_rtx_COMPARE (GET_MODE (SET_DEST (PATTERN (curr_insn))),
817                                  operands[0], operands[1]);
818   operands[0] = SET_DEST (PATTERN (curr_insn));
822 ; (DF|SF) instructions
824 (define_insn "*cmp<mode>_ccs_0"
825   [(set (reg CC_REGNUM)
826         (compare (match_operand:FPR 0 "register_operand" "f")
827                  (match_operand:FPR 1 "const0_operand" "")))]
828   "s390_match_ccmode(insn, CCSmode) && TARGET_HARD_FLOAT && TARGET_IEEE_FLOAT"
829   "lt<xde>br\t%0,%0"
830    [(set_attr "op_type" "RRE")
831     (set_attr "type"  "fsimp<mode>")])
833 (define_insn "*cmp<mode>_ccs_0_ibm"
834   [(set (reg CC_REGNUM)
835         (compare (match_operand:FPR 0 "register_operand" "f")
836                  (match_operand:FPR 1 "const0_operand" "")))]
837   "s390_match_ccmode(insn, CCSmode) && TARGET_HARD_FLOAT && TARGET_IBM_FLOAT"
838   "lt<xde>r\t%0,%0"
839    [(set_attr "op_type" "<RRe>")
840     (set_attr "type"  "fsimp<mode>")])
842 (define_insn "*cmp<mode>_ccs"
843   [(set (reg CC_REGNUM)
844         (compare (match_operand:FPR 0 "register_operand" "f,f")
845                  (match_operand:FPR 1 "general_operand" "f,<Rf>")))]
846   "s390_match_ccmode(insn, CCSmode) && TARGET_HARD_FLOAT && TARGET_IEEE_FLOAT"
847   "@
848    c<xde>br\t%0,%1
849    c<xde>b\t%0,%1"
850    [(set_attr "op_type" "RRE,RXE")
851     (set_attr "type"  "fsimp<mode>")])
853 (define_insn "*cmp<mode>_ccs_ibm"
854   [(set (reg CC_REGNUM)
855         (compare (match_operand:FPR 0 "register_operand" "f,f")
856                  (match_operand:FPR 1 "general_operand" "f,<Rf>")))]
857   "s390_match_ccmode(insn, CCSmode) && TARGET_HARD_FLOAT && TARGET_IBM_FLOAT"
858   "@
859    c<xde>r\t%0,%1
860    c<xde>\t%0,%1"
861    [(set_attr "op_type" "<RRe>,<RXe>")
862     (set_attr "type"  "fsimp<mode>")])
866 ;;- Move instructions.
870 ; movti instruction pattern(s).
873 (define_insn "movti"
874   [(set (match_operand:TI 0 "nonimmediate_operand" "=d,QS,d,o,Q")
875         (match_operand:TI 1 "general_operand" "QS,d,dPm,d,Q"))]
876   "TARGET_64BIT"
877   "@
878    lmg\t%0,%N0,%S1
879    stmg\t%1,%N1,%S0
880    #
881    #
882    #"
883   [(set_attr "op_type" "RSY,RSY,*,*,SS")
884    (set_attr "type" "lm,stm,*,*,*")])
886 (define_split
887   [(set (match_operand:TI 0 "nonimmediate_operand" "")
888         (match_operand:TI 1 "general_operand" ""))]
889   "TARGET_64BIT && reload_completed
890    && s390_split_ok_p (operands[0], operands[1], TImode, 0)"
891   [(set (match_dup 2) (match_dup 4))
892    (set (match_dup 3) (match_dup 5))]
894   operands[2] = operand_subword (operands[0], 0, 0, TImode);
895   operands[3] = operand_subword (operands[0], 1, 0, TImode);
896   operands[4] = operand_subword (operands[1], 0, 0, TImode);
897   operands[5] = operand_subword (operands[1], 1, 0, TImode);
900 (define_split
901   [(set (match_operand:TI 0 "nonimmediate_operand" "")
902         (match_operand:TI 1 "general_operand" ""))]
903   "TARGET_64BIT && reload_completed
904    && s390_split_ok_p (operands[0], operands[1], TImode, 1)"
905   [(set (match_dup 2) (match_dup 4))
906    (set (match_dup 3) (match_dup 5))]
908   operands[2] = operand_subword (operands[0], 1, 0, TImode);
909   operands[3] = operand_subword (operands[0], 0, 0, TImode);
910   operands[4] = operand_subword (operands[1], 1, 0, TImode);
911   operands[5] = operand_subword (operands[1], 0, 0, TImode);
914 (define_split
915   [(set (match_operand:TI 0 "register_operand" "")
916         (match_operand:TI 1 "memory_operand" ""))]
917   "TARGET_64BIT && reload_completed
918    && !s_operand (operands[1], VOIDmode)"
919   [(set (match_dup 0) (match_dup 1))]
921   rtx addr = operand_subword (operands[0], 1, 0, TImode);
922   s390_load_address (addr, XEXP (operands[1], 0));
923   operands[1] = replace_equiv_address (operands[1], addr);
926 (define_expand "reload_outti"
927   [(parallel [(match_operand:TI 0 "" "")
928               (match_operand:TI 1 "register_operand" "d")
929               (match_operand:DI 2 "register_operand" "=&a")])]
930   "TARGET_64BIT"
932   gcc_assert (MEM_P (operands[0]));
933   s390_load_address (operands[2], find_replacement (&XEXP (operands[0], 0)));
934   operands[0] = replace_equiv_address (operands[0], operands[2]);
935   emit_move_insn (operands[0], operands[1]);
936   DONE;
940 ; movdi instruction pattern(s).
943 (define_expand "movdi"
944   [(set (match_operand:DI 0 "general_operand" "")
945         (match_operand:DI 1 "general_operand" ""))]
946   ""
948   /* Handle symbolic constants.  */
949   if (TARGET_64BIT
950       && (SYMBOLIC_CONST (operands[1])
951           || (GET_CODE (operands[1]) == PLUS
952               && XEXP (operands[1], 0) == pic_offset_table_rtx
953               && SYMBOLIC_CONST (XEXP (operands[1], 1)))))
954     emit_symbolic_move (operands);
957 (define_insn "*movdi_larl"
958   [(set (match_operand:DI 0 "register_operand" "=d")
959         (match_operand:DI 1 "larl_operand" "X"))]
960   "TARGET_64BIT
961    && !FP_REG_P (operands[0])"
962   "larl\t%0,%1"
963    [(set_attr "op_type" "RIL")
964     (set_attr "type"    "larl")])
966 (define_insn "*movdi_64extimm"
967   [(set (match_operand:DI 0 "nonimmediate_operand"
968                             "=d,d,d,d,d,d,d,d,d,d,d,m,!*f,!*f,!*f,!R,!T,d,t,Q,t,?Q")
969         (match_operand:DI 1 "general_operand"
970                             "K,N0HD0,N1HD0,N2HD0,N3HD0,Os,N0SD0,N1SD0,L,d,m,d,*f,R,T,*f,*f,t,d,t,Q,?Q"))]
971   "TARGET_64BIT && TARGET_EXTIMM"
972   "@
973    lghi\t%0,%h1
974    llihh\t%0,%i1
975    llihl\t%0,%i1
976    llilh\t%0,%i1
977    llill\t%0,%i1
978    lgfi\t%0,%1
979    llihf\t%0,%k1
980    llilf\t%0,%k1
981    lay\t%0,%a1
982    lgr\t%0,%1
983    lg\t%0,%1
984    stg\t%1,%0
985    ldr\t%0,%1
986    ld\t%0,%1
987    ldy\t%0,%1
988    std\t%1,%0
989    stdy\t%1,%0
990    #
991    #
992    stam\t%1,%N1,%S0
993    lam\t%0,%N0,%S1
994    #"
995   [(set_attr "op_type" "RI,RI,RI,RI,RI,RIL,RIL,RIL,RXY,RRE,RXY,RXY,
996                         RR,RX,RXY,RX,RXY,*,*,RS,RS,SS")
997    (set_attr "type" "*,*,*,*,*,*,*,*,la,lr,load,store,
998                      floaddf,floaddf,floaddf,fstoredf,fstoredf,*,*,*,*,*")])
1000 (define_insn "*movdi_64"
1001   [(set (match_operand:DI 0 "nonimmediate_operand"
1002                             "=d,d,d,d,d,d,d,d,m,!*f,!*f,!*f,!R,!T,d,t,Q,t,?Q")
1003         (match_operand:DI 1 "general_operand"
1004                             "K,N0HD0,N1HD0,N2HD0,N3HD0,L,d,m,d,*f,R,T,*f,*f,t,d,t,Q,?Q"))]
1005   "TARGET_64BIT && !TARGET_EXTIMM"
1006   "@
1007    lghi\t%0,%h1
1008    llihh\t%0,%i1
1009    llihl\t%0,%i1
1010    llilh\t%0,%i1
1011    llill\t%0,%i1
1012    lay\t%0,%a1
1013    lgr\t%0,%1
1014    lg\t%0,%1
1015    stg\t%1,%0
1016    ldr\t%0,%1
1017    ld\t%0,%1
1018    ldy\t%0,%1
1019    std\t%1,%0
1020    stdy\t%1,%0
1021    #
1022    #
1023    stam\t%1,%N1,%S0
1024    lam\t%0,%N0,%S1
1025    #"
1026   [(set_attr "op_type" "RI,RI,RI,RI,RI,RXY,RRE,RXY,RXY,
1027                         RR,RX,RXY,RX,RXY,*,*,RS,RS,SS")
1028    (set_attr "type" "*,*,*,*,*,la,lr,load,store,
1029                      floaddf,floaddf,floaddf,fstoredf,fstoredf,*,*,*,*,*")])
1031 (define_split
1032   [(set (match_operand:DI 0 "register_operand" "")
1033         (match_operand:DI 1 "register_operand" ""))]
1034   "TARGET_64BIT && ACCESS_REG_P (operands[1])"
1035   [(set (match_dup 2) (match_dup 3))
1036    (set (match_dup 0) (ashift:DI (match_dup 0) (const_int 32)))
1037    (set (strict_low_part (match_dup 2)) (match_dup 4))]
1038   "operands[2] = gen_lowpart (SImode, operands[0]);
1039    s390_split_access_reg (operands[1], &operands[4], &operands[3]);")
1041 (define_split
1042   [(set (match_operand:DI 0 "register_operand" "")
1043         (match_operand:DI 1 "register_operand" ""))]
1044   "TARGET_64BIT && ACCESS_REG_P (operands[0])
1045    && dead_or_set_p (insn, operands[1])"
1046   [(set (match_dup 3) (match_dup 2))
1047    (set (match_dup 1) (lshiftrt:DI (match_dup 1) (const_int 32)))
1048    (set (match_dup 4) (match_dup 2))]
1049   "operands[2] = gen_lowpart (SImode, operands[1]);
1050    s390_split_access_reg (operands[0], &operands[3], &operands[4]);")
1052 (define_split
1053   [(set (match_operand:DI 0 "register_operand" "")
1054         (match_operand:DI 1 "register_operand" ""))]
1055   "TARGET_64BIT && ACCESS_REG_P (operands[0])
1056    && !dead_or_set_p (insn, operands[1])"
1057   [(set (match_dup 3) (match_dup 2))
1058    (set (match_dup 1) (rotate:DI (match_dup 1) (const_int 32)))
1059    (set (match_dup 4) (match_dup 2))
1060    (set (match_dup 1) (rotate:DI (match_dup 1) (const_int 32)))]
1061   "operands[2] = gen_lowpart (SImode, operands[1]);
1062    s390_split_access_reg (operands[0], &operands[3], &operands[4]);")
1064 (define_insn "*movdi_31"
1065   [(set (match_operand:DI 0 "nonimmediate_operand" "=d,d,Q,S,d,o,!*f,!*f,!*f,!R,!T,Q")
1066         (match_operand:DI 1 "general_operand" "Q,S,d,d,dPm,d,*f,R,T,*f,*f,Q"))]
1067   "!TARGET_64BIT"
1068   "@
1069    lm\t%0,%N0,%S1
1070    lmy\t%0,%N0,%S1
1071    stm\t%1,%N1,%S0
1072    stmy\t%1,%N1,%S0
1073    #
1074    #
1075    ldr\t%0,%1
1076    ld\t%0,%1
1077    ldy\t%0,%1
1078    std\t%1,%0
1079    stdy\t%1,%0
1080    #"
1081   [(set_attr "op_type" "RS,RSY,RS,RSY,*,*,RR,RX,RXY,RX,RXY,SS")
1082    (set_attr "type" "lm,lm,stm,stm,*,*,floaddf,floaddf,floaddf,fstoredf,fstoredf,*")])
1084 (define_split
1085   [(set (match_operand:DI 0 "nonimmediate_operand" "")
1086         (match_operand:DI 1 "general_operand" ""))]
1087   "!TARGET_64BIT && reload_completed
1088    && s390_split_ok_p (operands[0], operands[1], DImode, 0)"
1089   [(set (match_dup 2) (match_dup 4))
1090    (set (match_dup 3) (match_dup 5))]
1092   operands[2] = operand_subword (operands[0], 0, 0, DImode);
1093   operands[3] = operand_subword (operands[0], 1, 0, DImode);
1094   operands[4] = operand_subword (operands[1], 0, 0, DImode);
1095   operands[5] = operand_subword (operands[1], 1, 0, DImode);
1098 (define_split
1099   [(set (match_operand:DI 0 "nonimmediate_operand" "")
1100         (match_operand:DI 1 "general_operand" ""))]
1101   "!TARGET_64BIT && reload_completed
1102    && s390_split_ok_p (operands[0], operands[1], DImode, 1)"
1103   [(set (match_dup 2) (match_dup 4))
1104    (set (match_dup 3) (match_dup 5))]
1106   operands[2] = operand_subword (operands[0], 1, 0, DImode);
1107   operands[3] = operand_subword (operands[0], 0, 0, DImode);
1108   operands[4] = operand_subword (operands[1], 1, 0, DImode);
1109   operands[5] = operand_subword (operands[1], 0, 0, DImode);
1112 (define_split
1113   [(set (match_operand:DI 0 "register_operand" "")
1114         (match_operand:DI 1 "memory_operand" ""))]
1115   "!TARGET_64BIT && reload_completed
1116    && !FP_REG_P (operands[0])
1117    && !s_operand (operands[1], VOIDmode)"
1118   [(set (match_dup 0) (match_dup 1))]
1120   rtx addr = operand_subword (operands[0], 1, 0, DImode);
1121   s390_load_address (addr, XEXP (operands[1], 0));
1122   operands[1] = replace_equiv_address (operands[1], addr);
1125 (define_expand "reload_outdi"
1126   [(parallel [(match_operand:DI 0 "" "")
1127               (match_operand:DI 1 "register_operand" "d")
1128               (match_operand:SI 2 "register_operand" "=&a")])]
1129   "!TARGET_64BIT"
1131   gcc_assert (MEM_P (operands[0]));
1132   s390_load_address (operands[2], find_replacement (&XEXP (operands[0], 0)));
1133   operands[0] = replace_equiv_address (operands[0], operands[2]);
1134   emit_move_insn (operands[0], operands[1]);
1135   DONE;
1138 (define_peephole2
1139   [(set (match_operand:DI 0 "register_operand" "")
1140         (mem:DI (match_operand 1 "address_operand" "")))]
1141   "TARGET_64BIT
1142    && !FP_REG_P (operands[0])
1143    && GET_CODE (operands[1]) == SYMBOL_REF
1144    && CONSTANT_POOL_ADDRESS_P (operands[1])
1145    && get_pool_mode (operands[1]) == DImode
1146    && legitimate_reload_constant_p (get_pool_constant (operands[1]))"
1147   [(set (match_dup 0) (match_dup 2))]
1148   "operands[2] = get_pool_constant (operands[1]);")
1150 (define_insn "*la_64"
1151   [(set (match_operand:DI 0 "register_operand" "=d,d")
1152         (match_operand:QI 1 "address_operand" "U,W"))]
1153   "TARGET_64BIT"
1154   "@
1155    la\t%0,%a1
1156    lay\t%0,%a1"
1157   [(set_attr "op_type" "RX,RXY")
1158    (set_attr "type"    "la")])
1160 (define_peephole2
1161   [(parallel
1162     [(set (match_operand:DI 0 "register_operand" "")
1163           (match_operand:QI 1 "address_operand" ""))
1164      (clobber (reg:CC CC_REGNUM))])]
1165   "TARGET_64BIT
1166    && preferred_la_operand_p (operands[1], const0_rtx)"
1167   [(set (match_dup 0) (match_dup 1))]
1168   "")
1170 (define_peephole2
1171   [(set (match_operand:DI 0 "register_operand" "")
1172         (match_operand:DI 1 "register_operand" ""))
1173    (parallel
1174     [(set (match_dup 0)
1175           (plus:DI (match_dup 0)
1176                    (match_operand:DI 2 "nonmemory_operand" "")))
1177      (clobber (reg:CC CC_REGNUM))])]
1178   "TARGET_64BIT
1179    && !reg_overlap_mentioned_p (operands[0], operands[2])
1180    && preferred_la_operand_p (operands[1], operands[2])"
1181   [(set (match_dup 0) (plus:DI (match_dup 1) (match_dup 2)))]
1182   "")
1184 (define_expand "reload_indi"
1185   [(parallel [(match_operand:DI 0 "register_operand" "=a")
1186               (match_operand:DI 1 "s390_plus_operand" "")
1187               (match_operand:DI 2 "register_operand" "=&a")])]
1188   "TARGET_64BIT"
1190   s390_expand_plus_operand (operands[0], operands[1], operands[2]);
1191   DONE;
1195 ; movsi instruction pattern(s).
1198 (define_expand "movsi"
1199   [(set (match_operand:SI 0 "general_operand" "")
1200         (match_operand:SI 1 "general_operand" ""))]
1201   ""
1203   /* Handle symbolic constants.  */
1204   if (!TARGET_64BIT
1205       && (SYMBOLIC_CONST (operands[1])
1206           || (GET_CODE (operands[1]) == PLUS
1207               && XEXP (operands[1], 0) == pic_offset_table_rtx
1208               && SYMBOLIC_CONST (XEXP(operands[1], 1)))))
1209     emit_symbolic_move (operands);
1212 (define_insn "*movsi_larl"
1213   [(set (match_operand:SI 0 "register_operand" "=d")
1214         (match_operand:SI 1 "larl_operand" "X"))]
1215   "!TARGET_64BIT && TARGET_CPU_ZARCH
1216    && !FP_REG_P (operands[0])"
1217   "larl\t%0,%1"
1218    [(set_attr "op_type" "RIL")
1219     (set_attr "type"    "larl")])
1221 (define_insn "*movsi_zarch"
1222   [(set (match_operand:SI 0 "nonimmediate_operand"
1223                             "=d,d,d,d,d,d,d,d,R,T,!*f,!*f,!*f,!R,!T,d,t,Q,t,?Q")
1224         (match_operand:SI 1 "general_operand"
1225                             "K,N0HS0,N1HS0,Os,L,d,R,T,d,d,*f,R,T,*f,*f,t,d,t,Q,?Q"))]
1226   "TARGET_ZARCH"
1227   "@
1228    lhi\t%0,%h1
1229    llilh\t%0,%i1
1230    llill\t%0,%i1
1231    iilf\t%0,%o1
1232    lay\t%0,%a1
1233    lr\t%0,%1
1234    l\t%0,%1
1235    ly\t%0,%1
1236    st\t%1,%0
1237    sty\t%1,%0
1238    ler\t%0,%1
1239    le\t%0,%1
1240    ley\t%0,%1
1241    ste\t%1,%0
1242    stey\t%1,%0
1243    ear\t%0,%1
1244    sar\t%0,%1
1245    stam\t%1,%1,%S0
1246    lam\t%0,%0,%S1
1247    #"
1248   [(set_attr "op_type" "RI,RI,RI,RIL,RXY,RR,RX,RXY,RX,RXY,
1249                         RR,RX,RXY,RX,RXY,RRE,RRE,RS,RS,SS")
1250    (set_attr "type" "*,*,*,*,la,lr,load,load,store,store,
1251                      floadsf,floadsf,floadsf,fstoresf,fstoresf,*,*,*,*,*")])
1253 (define_insn "*movsi_esa"
1254   [(set (match_operand:SI 0 "nonimmediate_operand" "=d,d,d,R,!*f,!*f,!R,d,t,Q,t,?Q")
1255         (match_operand:SI 1 "general_operand" "K,d,R,d,*f,R,*f,t,d,t,Q,?Q"))]
1256   "!TARGET_ZARCH"
1257   "@
1258    lhi\t%0,%h1
1259    lr\t%0,%1
1260    l\t%0,%1
1261    st\t%1,%0
1262    ler\t%0,%1
1263    le\t%0,%1
1264    ste\t%1,%0
1265    ear\t%0,%1
1266    sar\t%0,%1
1267    stam\t%1,%1,%S0
1268    lam\t%0,%0,%S1
1269    #"
1270   [(set_attr "op_type" "RI,RR,RX,RX,RR,RX,RX,RRE,RRE,RS,RS,SS")
1271    (set_attr "type" "*,lr,load,store,floadsf,floadsf,fstoresf,*,*,*,*,*")])
1273 (define_peephole2
1274   [(set (match_operand:SI 0 "register_operand" "")
1275         (mem:SI (match_operand 1 "address_operand" "")))]
1276   "!FP_REG_P (operands[0])
1277    && GET_CODE (operands[1]) == SYMBOL_REF
1278    && CONSTANT_POOL_ADDRESS_P (operands[1])
1279    && get_pool_mode (operands[1]) == SImode
1280    && legitimate_reload_constant_p (get_pool_constant (operands[1]))"
1281   [(set (match_dup 0) (match_dup 2))]
1282   "operands[2] = get_pool_constant (operands[1]);")
1284 (define_insn "*la_31"
1285   [(set (match_operand:SI 0 "register_operand" "=d,d")
1286         (match_operand:QI 1 "address_operand" "U,W"))]
1287   "!TARGET_64BIT && legitimate_la_operand_p (operands[1])"
1288   "@
1289    la\t%0,%a1
1290    lay\t%0,%a1"
1291   [(set_attr "op_type"  "RX,RXY")
1292    (set_attr "type"     "la")])
1294 (define_peephole2
1295   [(parallel
1296     [(set (match_operand:SI 0 "register_operand" "")
1297           (match_operand:QI 1 "address_operand" ""))
1298      (clobber (reg:CC CC_REGNUM))])]
1299   "!TARGET_64BIT
1300    && preferred_la_operand_p (operands[1], const0_rtx)"
1301   [(set (match_dup 0) (match_dup 1))]
1302   "")
1304 (define_peephole2
1305   [(set (match_operand:SI 0 "register_operand" "")
1306         (match_operand:SI 1 "register_operand" ""))
1307    (parallel
1308     [(set (match_dup 0)
1309           (plus:SI (match_dup 0)
1310                    (match_operand:SI 2 "nonmemory_operand" "")))
1311      (clobber (reg:CC CC_REGNUM))])]
1312   "!TARGET_64BIT
1313    && !reg_overlap_mentioned_p (operands[0], operands[2])
1314    && preferred_la_operand_p (operands[1], operands[2])"
1315   [(set (match_dup 0) (plus:SI (match_dup 1) (match_dup 2)))]
1316   "")
1318 (define_insn "*la_31_and"
1319   [(set (match_operand:SI 0 "register_operand" "=d,d")
1320         (and:SI (match_operand:QI 1 "address_operand" "U,W")
1321                 (const_int 2147483647)))]
1322   "!TARGET_64BIT"
1323   "@
1324    la\t%0,%a1
1325    lay\t%0,%a1"
1326   [(set_attr "op_type"  "RX,RXY")
1327    (set_attr "type"     "la")])
1329 (define_insn_and_split "*la_31_and_cc"
1330   [(set (match_operand:SI 0 "register_operand" "=d")
1331         (and:SI (match_operand:QI 1 "address_operand" "p")
1332                 (const_int 2147483647)))
1333    (clobber (reg:CC CC_REGNUM))]
1334   "!TARGET_64BIT"
1335   "#"
1336   "&& reload_completed"
1337   [(set (match_dup 0)
1338         (and:SI (match_dup 1) (const_int 2147483647)))]
1339   ""
1340   [(set_attr "op_type"  "RX")
1341    (set_attr "type"     "la")])
1343 (define_insn "force_la_31"
1344   [(set (match_operand:SI 0 "register_operand" "=d,d")
1345         (match_operand:QI 1 "address_operand" "U,W"))
1346    (use (const_int 0))]
1347   "!TARGET_64BIT"
1348   "@
1349    la\t%0,%a1
1350    lay\t%0,%a1"
1351   [(set_attr "op_type"  "RX")
1352    (set_attr "type"     "la")])
1354 (define_expand "reload_insi"
1355   [(parallel [(match_operand:SI 0 "register_operand" "=a")
1356               (match_operand:SI 1 "s390_plus_operand" "")
1357               (match_operand:SI 2 "register_operand" "=&a")])]
1358   "!TARGET_64BIT"
1360   s390_expand_plus_operand (operands[0], operands[1], operands[2]);
1361   DONE;
1365 ; movhi instruction pattern(s).
1368 (define_expand "movhi"
1369   [(set (match_operand:HI 0 "nonimmediate_operand" "")
1370         (match_operand:HI 1 "general_operand" ""))]
1371   ""
1373   /* Make it explicit that loading a register from memory
1374      always sign-extends (at least) to SImode.  */
1375   if (optimize && !no_new_pseudos
1376       && register_operand (operands[0], VOIDmode)
1377       && GET_CODE (operands[1]) == MEM)
1378     {
1379       rtx tmp = gen_reg_rtx (SImode);
1380       rtx ext = gen_rtx_SIGN_EXTEND (SImode, operands[1]);
1381       emit_insn (gen_rtx_SET (VOIDmode, tmp, ext));
1382       operands[1] = gen_lowpart (HImode, tmp);
1383     }
1386 (define_insn "*movhi"
1387   [(set (match_operand:HI 0 "nonimmediate_operand" "=d,d,d,d,R,T,?Q")
1388         (match_operand:HI 1 "general_operand" "d,n,R,T,d,d,?Q"))]
1389   ""
1390   "@
1391    lr\t%0,%1
1392    lhi\t%0,%h1
1393    lh\t%0,%1
1394    lhy\t%0,%1
1395    sth\t%1,%0
1396    sthy\t%1,%0
1397    #"
1398   [(set_attr "op_type" "RR,RI,RX,RXY,RX,RXY,SS")
1399    (set_attr "type" "lr,*,*,*,store,store,*")])
1401 (define_peephole2
1402   [(set (match_operand:HI 0 "register_operand" "")
1403         (mem:HI (match_operand 1 "address_operand" "")))]
1404   "GET_CODE (operands[1]) == SYMBOL_REF
1405    && CONSTANT_POOL_ADDRESS_P (operands[1])
1406    && get_pool_mode (operands[1]) == HImode
1407    && GET_CODE (get_pool_constant (operands[1])) == CONST_INT"
1408   [(set (match_dup 0) (match_dup 2))]
1409   "operands[2] = get_pool_constant (operands[1]);")
1412 ; movqi instruction pattern(s).
1415 (define_expand "movqi"
1416   [(set (match_operand:QI 0 "nonimmediate_operand" "")
1417         (match_operand:QI 1 "general_operand" ""))]
1418   ""
1420   /* On z/Architecture, zero-extending from memory to register
1421      is just as fast as a QImode load.  */
1422   if (TARGET_ZARCH && optimize && !no_new_pseudos
1423       && register_operand (operands[0], VOIDmode)
1424       && GET_CODE (operands[1]) == MEM)
1425     {
1426       rtx tmp = gen_reg_rtx (word_mode);
1427       rtx ext = gen_rtx_ZERO_EXTEND (word_mode, operands[1]);
1428       emit_insn (gen_rtx_SET (VOIDmode, tmp, ext));
1429       operands[1] = gen_lowpart (QImode, tmp);
1430     }
1433 (define_insn "*movqi"
1434   [(set (match_operand:QI 0 "nonimmediate_operand" "=d,d,d,d,R,T,Q,S,?Q")
1435         (match_operand:QI 1 "general_operand" "d,n,R,T,d,d,n,n,?Q"))]
1436   ""
1437   "@
1438    lr\t%0,%1
1439    lhi\t%0,%b1
1440    ic\t%0,%1
1441    icy\t%0,%1
1442    stc\t%1,%0
1443    stcy\t%1,%0
1444    mvi\t%S0,%b1
1445    mviy\t%S0,%b1
1446    #"
1447   [(set_attr "op_type" "RR,RI,RX,RXY,RX,RXY,SI,SIY,SS")
1448    (set_attr "type" "lr,*,*,*,store,store,store,store,*")])
1450 (define_peephole2
1451   [(set (match_operand:QI 0 "nonimmediate_operand" "")
1452         (mem:QI (match_operand 1 "address_operand" "")))]
1453   "GET_CODE (operands[1]) == SYMBOL_REF
1454    && CONSTANT_POOL_ADDRESS_P (operands[1])
1455    && get_pool_mode (operands[1]) == QImode
1456    && GET_CODE (get_pool_constant (operands[1])) == CONST_INT"
1457   [(set (match_dup 0) (match_dup 2))]
1458   "operands[2] = get_pool_constant (operands[1]);")
1461 ; movstrictqi instruction pattern(s).
1464 (define_insn "*movstrictqi"
1465   [(set (strict_low_part (match_operand:QI 0 "register_operand" "+d,d"))
1466                          (match_operand:QI 1 "memory_operand" "R,T"))]
1467   ""
1468   "@
1469    ic\t%0,%1
1470    icy\t%0,%1"
1471   [(set_attr "op_type"  "RX,RXY")])
1474 ; movstricthi instruction pattern(s).
1477 (define_insn "*movstricthi"
1478   [(set (strict_low_part (match_operand:HI 0 "register_operand" "+d,d"))
1479                          (match_operand:HI 1 "memory_operand" "Q,S"))
1480    (clobber (reg:CC CC_REGNUM))]
1481   ""
1482   "@
1483    icm\t%0,3,%S1
1484    icmy\t%0,3,%S1"
1485   [(set_attr "op_type" "RS,RSY")])
1488 ; movstrictsi instruction pattern(s).
1491 (define_insn "movstrictsi"
1492   [(set (strict_low_part (match_operand:SI 0 "register_operand" "+d,d,d,d"))
1493                          (match_operand:SI 1 "general_operand" "d,R,T,t"))]
1494   "TARGET_64BIT"
1495   "@
1496    lr\t%0,%1
1497    l\t%0,%1
1498    ly\t%0,%1
1499    ear\t%0,%1"
1500   [(set_attr "op_type" "RR,RX,RXY,RRE")
1501    (set_attr "type" "lr,load,load,*")])
1504 ; movtf instruction pattern(s).
1507 (define_expand "movtf"
1508   [(set (match_operand:TF 0 "nonimmediate_operand" "")
1509         (match_operand:TF 1 "general_operand"       ""))]
1510   ""
1511   "")
1513 (define_insn "*movtf_64"
1514   [(set (match_operand:TF 0 "nonimmediate_operand" "=f,f,f,o,d,QS,d,o,Q")
1515         (match_operand:TF 1 "general_operand"       "G,f,o,f,QS,d,dm,d,Q"))]
1516   "TARGET_64BIT"
1517   "@
1518    lzxr\t%0
1519    lxr\t%0,%1
1520    #
1521    #
1522    lmg\t%0,%N0,%S1
1523    stmg\t%1,%N1,%S0
1524    #
1525    #
1526    #"
1527   [(set_attr "op_type" "RRE,RRE,*,*,RSY,RSY,*,*,*")
1528    (set_attr "type"    "fsimptf,fsimptf,*,*,lm,stm,*,*,*")])
1530 (define_insn "*movtf_31"
1531   [(set (match_operand:TF 0 "nonimmediate_operand" "=f,f,f,o,Q")
1532         (match_operand:TF 1 "general_operand"       "G,f,o,f,Q"))]
1533   "!TARGET_64BIT"
1534   "@
1535    lzxr\t%0
1536    lxr\t%0,%1
1537    #
1538    #
1539    #"
1540   [(set_attr "op_type" "RRE,RRE,*,*,*")
1541    (set_attr "type"    "fsimptf,fsimptf,*,*,*")])
1543 ; TFmode in GPRs splitters
1545 (define_split
1546   [(set (match_operand:TF 0 "nonimmediate_operand" "")
1547         (match_operand:TF 1 "general_operand" ""))]
1548   "TARGET_64BIT && reload_completed
1549    && s390_split_ok_p (operands[0], operands[1], TFmode, 0)"
1550   [(set (match_dup 2) (match_dup 4))
1551    (set (match_dup 3) (match_dup 5))]
1553   operands[2] = operand_subword (operands[0], 0, 0, TFmode);
1554   operands[3] = operand_subword (operands[0], 1, 0, TFmode);
1555   operands[4] = operand_subword (operands[1], 0, 0, TFmode);
1556   operands[5] = operand_subword (operands[1], 1, 0, TFmode);
1559 (define_split
1560   [(set (match_operand:TF 0 "nonimmediate_operand" "")
1561         (match_operand:TF 1 "general_operand" ""))]
1562   "TARGET_64BIT && reload_completed
1563    && s390_split_ok_p (operands[0], operands[1], TFmode, 1)"
1564   [(set (match_dup 2) (match_dup 4))
1565    (set (match_dup 3) (match_dup 5))]
1567   operands[2] = operand_subword (operands[0], 1, 0, TFmode);
1568   operands[3] = operand_subword (operands[0], 0, 0, TFmode);
1569   operands[4] = operand_subword (operands[1], 1, 0, TFmode);
1570   operands[5] = operand_subword (operands[1], 0, 0, TFmode);
1573 (define_split
1574   [(set (match_operand:TF 0 "register_operand" "")
1575         (match_operand:TF 1 "memory_operand" ""))]
1576   "TARGET_64BIT && reload_completed
1577    && !FP_REG_P (operands[0])
1578    && !s_operand (operands[1], VOIDmode)"
1579   [(set (match_dup 0) (match_dup 1))]
1581   rtx addr = operand_subword (operands[0], 1, 0, TFmode);
1582   s390_load_address (addr, XEXP (operands[1], 0));
1583   operands[1] = replace_equiv_address (operands[1], addr);
1586 ; TFmode in FPRs splitters
1588 (define_split
1589   [(set (match_operand:TF 0 "register_operand" "")
1590         (match_operand:TF 1 "memory_operand" ""))]
1591   "reload_completed && offsettable_memref_p (operands[1]) 
1592    && FP_REG_P (operands[0])"
1593   [(set (match_dup 2) (match_dup 4))
1594    (set (match_dup 3) (match_dup 5))]
1596   operands[2] = simplify_gen_subreg (DFmode, operands[0], TFmode, 0);
1597   operands[3] = simplify_gen_subreg (DFmode, operands[0], TFmode, 8);
1598   operands[4] = adjust_address_nv (operands[1], DFmode, 0);
1599   operands[5] = adjust_address_nv (operands[1], DFmode, 8);
1602 (define_split
1603   [(set (match_operand:TF 0 "memory_operand" "")
1604         (match_operand:TF 1 "register_operand" ""))]
1605   "reload_completed && offsettable_memref_p (operands[0])
1606    && FP_REG_P (operands[1])"
1607   [(set (match_dup 2) (match_dup 4))
1608    (set (match_dup 3) (match_dup 5))]
1610   operands[2] = adjust_address_nv (operands[0], DFmode, 0);
1611   operands[3] = adjust_address_nv (operands[0], DFmode, 8);
1612   operands[4] = simplify_gen_subreg (DFmode, operands[1], TFmode, 0);
1613   operands[5] = simplify_gen_subreg (DFmode, operands[1], TFmode, 8);
1616 (define_expand "reload_outtf"
1617   [(parallel [(match_operand:TF 0 "" "")
1618               (match_operand:TF 1 "register_operand" "f")
1619               (match_operand:SI 2 "register_operand" "=&a")])]
1620   ""
1622   rtx addr = gen_lowpart (Pmode, operands[2]);
1624   gcc_assert (MEM_P (operands[0]));
1625   s390_load_address (addr, find_replacement (&XEXP (operands[0], 0)));
1626   operands[0] = replace_equiv_address (operands[0], addr);
1627   emit_move_insn (operands[0], operands[1]);
1628   DONE;
1631 (define_expand "reload_intf"
1632   [(parallel [(match_operand:TF 0 "register_operand" "=f")
1633               (match_operand:TF 1 "" "")
1634               (match_operand:SI 2 "register_operand" "=&a")])]
1635   ""
1637   rtx addr = gen_lowpart (Pmode, operands[2]);
1639   gcc_assert (MEM_P (operands[1]));
1640   s390_load_address (addr, find_replacement (&XEXP (operands[1], 0)));
1641   operands[1] = replace_equiv_address (operands[1], addr);
1642   emit_move_insn (operands[0], operands[1]);
1643   DONE;
1647 ; movdf instruction pattern(s).
1650 (define_expand "movdf"
1651   [(set (match_operand:DF 0 "nonimmediate_operand" "")
1652         (match_operand:DF 1 "general_operand"  ""))]
1653   ""
1654   "")
1656 (define_insn "*movdf_64"
1657   [(set (match_operand:DF 0 "nonimmediate_operand" "=f,f,f,f,R,T,d,d,m,?Q")
1658         (match_operand:DF 1 "general_operand" "G,f,R,T,f,f,d,m,d,?Q"))]
1659   "TARGET_64BIT"
1660   "@
1661    lzdr\t%0
1662    ldr\t%0,%1
1663    ld\t%0,%1
1664    ldy\t%0,%1
1665    std\t%1,%0
1666    stdy\t%1,%0
1667    lgr\t%0,%1
1668    lg\t%0,%1
1669    stg\t%1,%0
1670    #"
1671   [(set_attr "op_type" "RRE,RR,RX,RXY,RX,RXY,RRE,RXY,RXY,SS")
1672    (set_attr "type" "fsimpdf,floaddf,floaddf,floaddf,fstoredf,fstoredf,lr,load,store,*")])
1674 (define_insn "*movdf_31"
1675   [(set (match_operand:DF 0 "nonimmediate_operand" "=f,f,f,f,R,T,d,d,Q,S,d,o,Q")
1676         (match_operand:DF 1 "general_operand" "G,f,R,T,f,f,Q,S,d,d,dPm,d,Q"))]
1677   "!TARGET_64BIT"
1678   "@
1679    lzdr\t%0
1680    ldr\t%0,%1
1681    ld\t%0,%1
1682    ldy\t%0,%1
1683    std\t%1,%0
1684    stdy\t%1,%0
1685    lm\t%0,%N0,%S1
1686    lmy\t%0,%N0,%S1
1687    stm\t%1,%N1,%S0
1688    stmy\t%1,%N1,%S0
1689    #
1690    #
1691    #"
1692   [(set_attr "op_type" "RRE,RR,RX,RXY,RX,RXY,RS,RSY,RS,RSY,*,*,SS")
1693    (set_attr "type" "fsimpdf,floaddf,floaddf,floaddf,fstoredf,fstoredf,\
1694                      lm,lm,stm,stm,*,*,*")])
1696 (define_split
1697   [(set (match_operand:DF 0 "nonimmediate_operand" "")
1698         (match_operand:DF 1 "general_operand" ""))]
1699   "!TARGET_64BIT && reload_completed
1700    && s390_split_ok_p (operands[0], operands[1], DFmode, 0)"
1701   [(set (match_dup 2) (match_dup 4))
1702    (set (match_dup 3) (match_dup 5))]
1704   operands[2] = operand_subword (operands[0], 0, 0, DFmode);
1705   operands[3] = operand_subword (operands[0], 1, 0, DFmode);
1706   operands[4] = operand_subword (operands[1], 0, 0, DFmode);
1707   operands[5] = operand_subword (operands[1], 1, 0, DFmode);
1710 (define_split
1711   [(set (match_operand:DF 0 "nonimmediate_operand" "")
1712         (match_operand:DF 1 "general_operand" ""))]
1713   "!TARGET_64BIT && reload_completed
1714    && s390_split_ok_p (operands[0], operands[1], DFmode, 1)"
1715   [(set (match_dup 2) (match_dup 4))
1716    (set (match_dup 3) (match_dup 5))]
1718   operands[2] = operand_subword (operands[0], 1, 0, DFmode);
1719   operands[3] = operand_subword (operands[0], 0, 0, DFmode);
1720   operands[4] = operand_subword (operands[1], 1, 0, DFmode);
1721   operands[5] = operand_subword (operands[1], 0, 0, DFmode);
1724 (define_split
1725   [(set (match_operand:DF 0 "register_operand" "")
1726         (match_operand:DF 1 "memory_operand" ""))]
1727   "!TARGET_64BIT && reload_completed
1728    && !FP_REG_P (operands[0])
1729    && !s_operand (operands[1], VOIDmode)"
1730   [(set (match_dup 0) (match_dup 1))]
1732   rtx addr = operand_subword (operands[0], 1, 0, DFmode);
1733   s390_load_address (addr, XEXP (operands[1], 0));
1734   operands[1] = replace_equiv_address (operands[1], addr);
1737 (define_expand "reload_outdf"
1738   [(parallel [(match_operand:DF 0 "" "")
1739               (match_operand:DF 1 "register_operand" "d")
1740               (match_operand:SI 2 "register_operand" "=&a")])]
1741   "!TARGET_64BIT"
1743   gcc_assert (MEM_P (operands[0]));
1744   s390_load_address (operands[2], find_replacement (&XEXP (operands[0], 0)));
1745   operands[0] = replace_equiv_address (operands[0], operands[2]);
1746   emit_move_insn (operands[0], operands[1]);
1747   DONE;
1751 ; movsf instruction pattern(s).
1754 (define_insn "movsf"
1755   [(set (match_operand:SF 0 "nonimmediate_operand" "=f,f,f,f,R,T,d,d,d,R,T,?Q")
1756         (match_operand:SF 1 "general_operand" "G,f,R,T,f,f,d,R,T,d,d,?Q"))]
1757   ""
1758   "@
1759    lzer\t%0
1760    ler\t%0,%1
1761    le\t%0,%1
1762    ley\t%0,%1
1763    ste\t%1,%0
1764    stey\t%1,%0
1765    lr\t%0,%1
1766    l\t%0,%1
1767    ly\t%0,%1
1768    st\t%1,%0
1769    sty\t%1,%0
1770    #"
1771   [(set_attr "op_type" "RRE,RR,RX,RXY,RX,RXY,RR,RX,RXY,RX,RXY,SS")
1772    (set_attr "type" "fsimpsf,floadsf,floadsf,floadsf,fstoresf,fstoresf,
1773                      lr,load,load,store,store,*")])
1776 ; movcc instruction pattern
1779 (define_insn "movcc"
1780   [(set (match_operand:CC 0 "nonimmediate_operand" "=d,c,d,d,d,R,T")
1781         (match_operand:CC 1 "nonimmediate_operand" "d,d,c,R,T,d,d"))]
1782   ""
1783   "@
1784    lr\t%0,%1
1785    tmh\t%1,12288
1786    ipm\t%0
1787    st\t%0,%1
1788    sty\t%0,%1
1789    l\t%1,%0
1790    ly\t%1,%0"
1791   [(set_attr "op_type" "RR,RI,RRE,RX,RXY,RX,RXY")
1792    (set_attr "type" "lr,*,*,store,store,load,load")])
1795 ; Block move (MVC) patterns.
1798 (define_insn "*mvc"
1799   [(set (match_operand:BLK 0 "memory_operand" "=Q")
1800         (match_operand:BLK 1 "memory_operand" "Q"))
1801    (use (match_operand 2 "const_int_operand" "n"))]
1802   "INTVAL (operands[2]) >= 1 && INTVAL (operands[2]) <= 256"
1803   "mvc\t%O0(%2,%R0),%S1"
1804   [(set_attr "op_type" "SS")])
1806 (define_split
1807   [(set (match_operand 0 "memory_operand" "")
1808         (match_operand 1 "memory_operand" ""))]
1809   "reload_completed
1810    && GET_MODE (operands[0]) == GET_MODE (operands[1])
1811    && GET_MODE_SIZE (GET_MODE (operands[0])) > 0"
1812   [(parallel
1813     [(set (match_dup 0) (match_dup 1))
1814      (use (match_dup 2))])]
1816   operands[2] = GEN_INT (GET_MODE_SIZE (GET_MODE (operands[0])));
1817   operands[0] = adjust_address (operands[0], BLKmode, 0);
1818   operands[1] = adjust_address (operands[1], BLKmode, 0);
1821 (define_peephole2
1822   [(parallel
1823     [(set (match_operand:BLK 0 "memory_operand" "")
1824           (match_operand:BLK 1 "memory_operand" ""))
1825      (use (match_operand 2 "const_int_operand" ""))])
1826    (parallel
1827     [(set (match_operand:BLK 3 "memory_operand" "")
1828           (match_operand:BLK 4 "memory_operand" ""))
1829      (use (match_operand 5 "const_int_operand" ""))])]
1830   "s390_offset_p (operands[0], operands[3], operands[2])
1831    && s390_offset_p (operands[1], operands[4], operands[2])
1832    && !s390_overlap_p (operands[0], operands[1], 
1833                        INTVAL (operands[2]) + INTVAL (operands[5]))
1834    && INTVAL (operands[2]) + INTVAL (operands[5]) <= 256"
1835   [(parallel
1836     [(set (match_dup 6) (match_dup 7))
1837      (use (match_dup 8))])]
1838   "operands[6] = gen_rtx_MEM (BLKmode, XEXP (operands[0], 0));
1839    operands[7] = gen_rtx_MEM (BLKmode, XEXP (operands[1], 0));
1840    operands[8] = GEN_INT (INTVAL (operands[2]) + INTVAL (operands[5]));")
1844 ; load_multiple pattern(s).
1846 ; ??? Due to reload problems with replacing registers inside match_parallel
1847 ; we currently support load_multiple/store_multiple only after reload.
1850 (define_expand "load_multiple"
1851   [(match_par_dup 3 [(set (match_operand 0 "" "")
1852                           (match_operand 1 "" ""))
1853                      (use (match_operand 2 "" ""))])]
1854   "reload_completed"
1856   enum machine_mode mode;
1857   int regno;
1858   int count;
1859   rtx from;
1860   int i, off;
1862   /* Support only loading a constant number of fixed-point registers from
1863      memory and only bother with this if more than two */
1864   if (GET_CODE (operands[2]) != CONST_INT
1865       || INTVAL (operands[2]) < 2
1866       || INTVAL (operands[2]) > 16
1867       || GET_CODE (operands[1]) != MEM
1868       || GET_CODE (operands[0]) != REG
1869       || REGNO (operands[0]) >= 16)
1870     FAIL;
1872   count = INTVAL (operands[2]);
1873   regno = REGNO (operands[0]);
1874   mode = GET_MODE (operands[0]);
1875   if (mode != SImode && mode != word_mode)
1876     FAIL;
1878   operands[3] = gen_rtx_PARALLEL (VOIDmode, rtvec_alloc (count));
1879   if (no_new_pseudos)
1880     {
1881       if (GET_CODE (XEXP (operands[1], 0)) == REG)
1882         {
1883           from = XEXP (operands[1], 0);
1884           off = 0;
1885         }
1886       else if (GET_CODE (XEXP (operands[1], 0)) == PLUS
1887                && GET_CODE (XEXP (XEXP (operands[1], 0), 0)) == REG
1888                && GET_CODE (XEXP (XEXP (operands[1], 0), 1)) == CONST_INT)
1889         {
1890           from = XEXP (XEXP (operands[1], 0), 0);
1891           off = INTVAL (XEXP (XEXP (operands[1], 0), 1));
1892         }
1893       else
1894         FAIL;
1895     }
1896   else
1897     {
1898       from = force_reg (Pmode, XEXP (operands[1], 0));
1899       off = 0;
1900     }
1902   for (i = 0; i < count; i++)
1903     XVECEXP (operands[3], 0, i)
1904       = gen_rtx_SET (VOIDmode, gen_rtx_REG (mode, regno + i),
1905                      change_address (operands[1], mode,
1906                        plus_constant (from, off + i * GET_MODE_SIZE (mode))));
1909 (define_insn "*load_multiple_di"
1910   [(match_parallel 0 "load_multiple_operation"
1911                    [(set (match_operand:DI 1 "register_operand" "=r")
1912                          (match_operand:DI 2 "s_operand" "QS"))])]
1913   "reload_completed && word_mode == DImode"
1915   int words = XVECLEN (operands[0], 0);
1916   operands[0] = gen_rtx_REG (DImode, REGNO (operands[1]) + words - 1);
1917   return "lmg\t%1,%0,%S2";
1919    [(set_attr "op_type" "RSY")
1920     (set_attr "type"    "lm")])
1922 (define_insn "*load_multiple_si"
1923   [(match_parallel 0 "load_multiple_operation"
1924                    [(set (match_operand:SI 1 "register_operand" "=r,r")
1925                          (match_operand:SI 2 "s_operand" "Q,S"))])]
1926   "reload_completed"
1928   int words = XVECLEN (operands[0], 0);
1929   operands[0] = gen_rtx_REG (SImode, REGNO (operands[1]) + words - 1);
1930   return which_alternative == 0 ? "lm\t%1,%0,%S2" : "lmy\t%1,%0,%S2";
1932    [(set_attr "op_type" "RS,RSY")
1933     (set_attr "type"    "lm")])
1936 ; store multiple pattern(s).
1939 (define_expand "store_multiple"
1940   [(match_par_dup 3 [(set (match_operand 0 "" "")
1941                           (match_operand 1 "" ""))
1942                      (use (match_operand 2 "" ""))])]
1943   "reload_completed"
1945   enum machine_mode mode;
1946   int regno;
1947   int count;
1948   rtx to;
1949   int i, off;
1951   /* Support only storing a constant number of fixed-point registers to
1952      memory and only bother with this if more than two.  */
1953   if (GET_CODE (operands[2]) != CONST_INT
1954       || INTVAL (operands[2]) < 2
1955       || INTVAL (operands[2]) > 16
1956       || GET_CODE (operands[0]) != MEM
1957       || GET_CODE (operands[1]) != REG
1958       || REGNO (operands[1]) >= 16)
1959     FAIL;
1961   count = INTVAL (operands[2]);
1962   regno = REGNO (operands[1]);
1963   mode = GET_MODE (operands[1]);
1964   if (mode != SImode && mode != word_mode)
1965     FAIL;
1967   operands[3] = gen_rtx_PARALLEL (VOIDmode, rtvec_alloc (count));
1969   if (no_new_pseudos)
1970     {
1971       if (GET_CODE (XEXP (operands[0], 0)) == REG)
1972         {
1973           to = XEXP (operands[0], 0);
1974           off = 0;
1975         }
1976       else if (GET_CODE (XEXP (operands[0], 0)) == PLUS
1977                && GET_CODE (XEXP (XEXP (operands[0], 0), 0)) == REG
1978                && GET_CODE (XEXP (XEXP (operands[0], 0), 1)) == CONST_INT)
1979         {
1980           to = XEXP (XEXP (operands[0], 0), 0);
1981           off = INTVAL (XEXP (XEXP (operands[0], 0), 1));
1982         }
1983       else
1984         FAIL;
1985     }
1986   else
1987     {
1988       to = force_reg (Pmode, XEXP (operands[0], 0));
1989       off = 0;
1990     }
1992   for (i = 0; i < count; i++)
1993     XVECEXP (operands[3], 0, i)
1994       = gen_rtx_SET (VOIDmode,
1995                      change_address (operands[0], mode,
1996                        plus_constant (to, off + i * GET_MODE_SIZE (mode))),
1997                      gen_rtx_REG (mode, regno + i));
2000 (define_insn "*store_multiple_di"
2001   [(match_parallel 0 "store_multiple_operation"
2002                    [(set (match_operand:DI 1 "s_operand" "=QS")
2003                          (match_operand:DI 2 "register_operand" "r"))])]
2004   "reload_completed && word_mode == DImode"
2006   int words = XVECLEN (operands[0], 0);
2007   operands[0] = gen_rtx_REG (DImode, REGNO (operands[2]) + words - 1);
2008   return "stmg\t%2,%0,%S1";
2010    [(set_attr "op_type" "RSY")
2011     (set_attr "type"    "stm")])
2014 (define_insn "*store_multiple_si"
2015   [(match_parallel 0 "store_multiple_operation"
2016                    [(set (match_operand:SI 1 "s_operand" "=Q,S")
2017                          (match_operand:SI 2 "register_operand" "r,r"))])]
2018   "reload_completed"
2020   int words = XVECLEN (operands[0], 0);
2021   operands[0] = gen_rtx_REG (SImode, REGNO (operands[2]) + words - 1);
2022   return which_alternative == 0 ? "stm\t%2,%0,%S1" : "stmy\t%2,%0,%S1";
2024    [(set_attr "op_type" "RS,RSY")
2025     (set_attr "type"    "stm")])
2028 ;; String instructions.
2031 (define_insn "*execute"
2032   [(match_parallel 0 ""
2033     [(unspec [(match_operand 1 "register_operand" "a")
2034               (match_operand:BLK 2 "memory_operand" "R")
2035               (match_operand 3 "" "")] UNSPEC_EXECUTE)])]
2036   "GET_MODE_CLASS (GET_MODE (operands[1])) == MODE_INT
2037    && GET_MODE_SIZE (GET_MODE (operands[1])) <= UNITS_PER_WORD"
2038   "ex\t%1,%2"
2039   [(set_attr "op_type" "RX")
2040    (set_attr "type" "cs")])
2044 ; strlenM instruction pattern(s).
2047 (define_expand "strlen<mode>"
2048   [(set (reg:SI 0) (match_operand:SI 2 "immediate_operand" ""))
2049    (parallel
2050     [(set (match_dup 4)
2051           (unspec:P [(const_int 0)
2052                       (match_operand:BLK 1 "memory_operand" "")
2053                       (reg:SI 0)
2054                       (match_operand 3 "immediate_operand" "")] UNSPEC_SRST))
2055      (clobber (scratch:P))
2056      (clobber (reg:CC CC_REGNUM))])
2057    (parallel
2058     [(set (match_operand:P 0 "register_operand" "")
2059           (minus:P (match_dup 4) (match_dup 5)))
2060      (clobber (reg:CC CC_REGNUM))])]
2061   ""
2063   operands[4] = gen_reg_rtx (Pmode);
2064   operands[5] = gen_reg_rtx (Pmode);
2065   emit_move_insn (operands[5], force_operand (XEXP (operands[1], 0), NULL_RTX));
2066   operands[1] = replace_equiv_address (operands[1], operands[5]);
2069 (define_insn "*strlen<mode>"
2070   [(set (match_operand:P 0 "register_operand" "=a")
2071         (unspec:P [(match_operand:P 2 "general_operand" "0")
2072                     (mem:BLK (match_operand:P 3 "register_operand" "1"))
2073                     (reg:SI 0)
2074                     (match_operand 4 "immediate_operand" "")] UNSPEC_SRST))
2075    (clobber (match_scratch:P 1 "=a"))
2076    (clobber (reg:CC CC_REGNUM))]
2077   ""
2078   "srst\t%0,%1\;jo\t.-4"
2079   [(set_attr "length" "8")
2080    (set_attr "type" "vs")])
2083 ; cmpstrM instruction pattern(s).
2086 (define_expand "cmpstrsi"
2087   [(set (reg:SI 0) (const_int 0))
2088    (parallel
2089     [(clobber (match_operand 3 "" ""))
2090      (clobber (match_dup 4))
2091      (set (reg:CCU CC_REGNUM)
2092           (compare:CCU (match_operand:BLK 1 "memory_operand" "")
2093                        (match_operand:BLK 2 "memory_operand" "")))
2094      (use (reg:SI 0))])
2095    (parallel
2096     [(set (match_operand:SI 0 "register_operand" "=d")
2097           (unspec:SI [(reg:CCU CC_REGNUM)] UNSPEC_CMPINT))
2098      (clobber (reg:CC CC_REGNUM))])]
2099   ""
2101   /* As the result of CMPINT is inverted compared to what we need,
2102      we have to swap the operands.  */
2103   rtx op1 = operands[2];
2104   rtx op2 = operands[1];
2105   rtx addr1 = gen_reg_rtx (Pmode);
2106   rtx addr2 = gen_reg_rtx (Pmode);
2108   emit_move_insn (addr1, force_operand (XEXP (op1, 0), NULL_RTX));
2109   emit_move_insn (addr2, force_operand (XEXP (op2, 0), NULL_RTX));
2110   operands[1] = replace_equiv_address_nv (op1, addr1);
2111   operands[2] = replace_equiv_address_nv (op2, addr2);
2112   operands[3] = addr1;
2113   operands[4] = addr2;
2116 (define_insn "*cmpstr<mode>"
2117   [(clobber (match_operand:P 0 "register_operand" "=d"))
2118    (clobber (match_operand:P 1 "register_operand" "=d"))
2119    (set (reg:CCU CC_REGNUM)
2120         (compare:CCU (mem:BLK (match_operand:P 2 "register_operand" "0"))
2121                      (mem:BLK (match_operand:P 3 "register_operand" "1"))))
2122    (use (reg:SI 0))]
2123   ""
2124   "clst\t%0,%1\;jo\t.-4"
2125   [(set_attr "length" "8")
2126    (set_attr "type" "vs")])
2129 ; movstr instruction pattern.
2132 (define_expand "movstr"
2133   [(set (reg:SI 0) (const_int 0))
2134    (parallel 
2135     [(clobber (match_dup 3))
2136      (set (match_operand:BLK 1 "memory_operand" "")
2137           (match_operand:BLK 2 "memory_operand" ""))
2138      (set (match_operand 0 "register_operand" "")
2139           (unspec [(match_dup 1) 
2140                    (match_dup 2)
2141                    (reg:SI 0)] UNSPEC_MVST))
2142      (clobber (reg:CC CC_REGNUM))])]
2143   ""
2145   rtx addr1 = gen_reg_rtx (Pmode);
2146   rtx addr2 = gen_reg_rtx (Pmode);
2148   emit_move_insn (addr1, force_operand (XEXP (operands[1], 0), NULL_RTX));
2149   emit_move_insn (addr2, force_operand (XEXP (operands[2], 0), NULL_RTX));
2150   operands[1] = replace_equiv_address_nv (operands[1], addr1);
2151   operands[2] = replace_equiv_address_nv (operands[2], addr2);
2152   operands[3] = addr2;
2155 (define_insn "*movstr"
2156   [(clobber (match_operand:P 2 "register_operand" "=d"))
2157    (set (mem:BLK (match_operand:P 1 "register_operand" "0"))
2158         (mem:BLK (match_operand:P 3 "register_operand" "2")))
2159    (set (match_operand:P 0 "register_operand" "=d")
2160         (unspec [(mem:BLK (match_dup 1)) 
2161                  (mem:BLK (match_dup 3))
2162                  (reg:SI 0)] UNSPEC_MVST))
2163    (clobber (reg:CC CC_REGNUM))]
2164   ""
2165   "mvst\t%1,%2\;jo\t.-4"
2166   [(set_attr "length" "8")
2167    (set_attr "type" "vs")])
2168   
2171 ; movmemM instruction pattern(s).
2174 (define_expand "movmem<mode>"
2175   [(set (match_operand:BLK 0 "memory_operand" "")
2176         (match_operand:BLK 1 "memory_operand" ""))
2177    (use (match_operand:GPR 2 "general_operand" ""))
2178    (match_operand 3 "" "")]
2179   ""
2180   "s390_expand_movmem (operands[0], operands[1], operands[2]); DONE;")
2182 ; Move a block that is up to 256 bytes in length.
2183 ; The block length is taken as (operands[2] % 256) + 1.
2185 (define_expand "movmem_short"
2186   [(parallel
2187     [(set (match_operand:BLK 0 "memory_operand" "")
2188           (match_operand:BLK 1 "memory_operand" ""))
2189      (use (match_operand 2 "nonmemory_operand" ""))
2190      (use (const:BLK (unspec:BLK [(const_int 0)] UNSPEC_INSN)))
2191      (clobber (match_dup 3))])]
2192   ""
2193   "operands[3] = gen_rtx_SCRATCH (Pmode);")
2195 (define_insn "*movmem_short"
2196   [(set (match_operand:BLK 0 "memory_operand" "=Q,Q,Q")
2197         (match_operand:BLK 1 "memory_operand" "Q,Q,Q"))
2198    (use (match_operand 2 "nonmemory_operand" "n,a,a"))
2199    (use (match_operand 3 "immediate_operand" "X,R,X"))
2200    (clobber (match_scratch 4 "=X,X,&a"))]
2201   "(GET_MODE (operands[2]) == Pmode || GET_MODE (operands[2]) == VOIDmode)
2202    && GET_MODE (operands[4]) == Pmode"
2203   "#"
2204   [(set_attr "type" "cs")])
2206 (define_split
2207   [(set (match_operand:BLK 0 "memory_operand" "")
2208         (match_operand:BLK 1 "memory_operand" ""))
2209    (use (match_operand 2 "const_int_operand" ""))
2210    (use (match_operand 3 "immediate_operand" ""))
2211    (clobber (scratch))]
2212   "reload_completed"
2213   [(parallel
2214     [(set (match_dup 0) (match_dup 1))
2215      (use (match_dup 2))])]
2216   "operands[2] = GEN_INT ((INTVAL (operands[2]) & 0xff) + 1);")
2218 (define_split
2219   [(set (match_operand:BLK 0 "memory_operand" "")
2220         (match_operand:BLK 1 "memory_operand" ""))
2221    (use (match_operand 2 "register_operand" ""))
2222    (use (match_operand 3 "memory_operand" ""))
2223    (clobber (scratch))]
2224   "reload_completed"
2225   [(parallel
2226     [(unspec [(match_dup 2) (match_dup 3)
2227               (const_int 0)] UNSPEC_EXECUTE)
2228      (set (match_dup 0) (match_dup 1))
2229      (use (const_int 1))])]
2230   "")
2232 (define_split
2233   [(set (match_operand:BLK 0 "memory_operand" "")
2234         (match_operand:BLK 1 "memory_operand" ""))
2235    (use (match_operand 2 "register_operand" ""))
2236    (use (const:BLK (unspec:BLK [(const_int 0)] UNSPEC_INSN)))
2237    (clobber (match_operand 3 "register_operand" ""))]
2238   "reload_completed && TARGET_CPU_ZARCH"
2239   [(set (match_dup 3) (label_ref (match_dup 4)))
2240    (parallel
2241     [(unspec [(match_dup 2) (mem:BLK (match_dup 3)) 
2242               (label_ref (match_dup 4))] UNSPEC_EXECUTE)
2243      (set (match_dup 0) (match_dup 1))
2244      (use (const_int 1))])]
2245   "operands[4] = gen_label_rtx ();")
2247 ; Move a block of arbitrary length.
2249 (define_expand "movmem_long"
2250   [(parallel
2251     [(clobber (match_dup 2))
2252      (clobber (match_dup 3))
2253      (set (match_operand:BLK 0 "memory_operand" "")
2254           (match_operand:BLK 1 "memory_operand" ""))
2255      (use (match_operand 2 "general_operand" ""))
2256      (use (match_dup 3))
2257      (clobber (reg:CC CC_REGNUM))])]
2258   ""
2260   enum machine_mode dword_mode = word_mode == DImode ? TImode : DImode;
2261   rtx reg0 = gen_reg_rtx (dword_mode);
2262   rtx reg1 = gen_reg_rtx (dword_mode);
2263   rtx addr0 = gen_lowpart (Pmode, gen_highpart (word_mode, reg0));
2264   rtx addr1 = gen_lowpart (Pmode, gen_highpart (word_mode, reg1));
2265   rtx len0 = gen_lowpart (Pmode, reg0);
2266   rtx len1 = gen_lowpart (Pmode, reg1);
2268   emit_insn (gen_rtx_CLOBBER (VOIDmode, reg0));
2269   emit_move_insn (addr0, force_operand (XEXP (operands[0], 0), NULL_RTX));
2270   emit_move_insn (len0, operands[2]);
2272   emit_insn (gen_rtx_CLOBBER (VOIDmode, reg1));
2273   emit_move_insn (addr1, force_operand (XEXP (operands[1], 0), NULL_RTX));
2274   emit_move_insn (len1, operands[2]);
2276   operands[0] = replace_equiv_address_nv (operands[0], addr0);
2277   operands[1] = replace_equiv_address_nv (operands[1], addr1);
2278   operands[2] = reg0;
2279   operands[3] = reg1;
2282 (define_insn "*movmem_long"
2283   [(clobber (match_operand:<DBL> 0 "register_operand" "=d"))
2284    (clobber (match_operand:<DBL> 1 "register_operand" "=d"))
2285    (set (mem:BLK (subreg:P (match_operand:<DBL> 2 "register_operand" "0") 0))
2286         (mem:BLK (subreg:P (match_operand:<DBL> 3 "register_operand" "1") 0)))
2287    (use (match_dup 2))
2288    (use (match_dup 3))
2289    (clobber (reg:CC CC_REGNUM))]
2290   ""
2291   "mvcle\t%0,%1,0\;jo\t.-4"
2292   [(set_attr "length" "8")
2293    (set_attr "type" "vs")])
2296 ; setmemM instruction pattern(s).
2299 (define_expand "setmem<mode>"
2300   [(set (match_operand:BLK 0 "memory_operand" "")
2301         (match_operand:QI 2 "general_operand" ""))
2302    (use (match_operand:GPR 1 "general_operand" ""))
2303    (match_operand 3 "" "")]
2304   ""
2305   "s390_expand_setmem (operands[0], operands[1], operands[2]); DONE;")
2307 ; Clear a block that is up to 256 bytes in length.
2308 ; The block length is taken as (operands[1] % 256) + 1.
2310 (define_expand "clrmem_short"
2311   [(parallel
2312     [(set (match_operand:BLK 0 "memory_operand" "")
2313           (const_int 0))
2314      (use (match_operand 1 "nonmemory_operand" ""))
2315      (use (const:BLK (unspec:BLK [(const_int 0)] UNSPEC_INSN)))
2316      (clobber (match_dup 2))
2317      (clobber (reg:CC CC_REGNUM))])]
2318   ""
2319   "operands[2] = gen_rtx_SCRATCH (Pmode);")
2321 (define_insn "*clrmem_short"
2322   [(set (match_operand:BLK 0 "memory_operand" "=Q,Q,Q")
2323         (const_int 0))
2324    (use (match_operand 1 "nonmemory_operand" "n,a,a"))
2325    (use (match_operand 2 "immediate_operand" "X,R,X"))
2326    (clobber (match_scratch 3 "=X,X,&a"))
2327    (clobber (reg:CC CC_REGNUM))]
2328   "(GET_MODE (operands[1]) == Pmode || GET_MODE (operands[1]) == VOIDmode)
2329    && GET_MODE (operands[3]) == Pmode"
2330   "#"
2331   [(set_attr "type" "cs")])
2333 (define_split
2334   [(set (match_operand:BLK 0 "memory_operand" "")
2335         (const_int 0))
2336    (use (match_operand 1 "const_int_operand" ""))
2337    (use (match_operand 2 "immediate_operand" ""))
2338    (clobber (scratch))
2339    (clobber (reg:CC CC_REGNUM))]
2340   "reload_completed"
2341   [(parallel
2342     [(set (match_dup 0) (const_int 0))
2343      (use (match_dup 1))
2344      (clobber (reg:CC CC_REGNUM))])]
2345   "operands[1] = GEN_INT ((INTVAL (operands[1]) & 0xff) + 1);")
2347 (define_split
2348   [(set (match_operand:BLK 0 "memory_operand" "")
2349         (const_int 0))
2350    (use (match_operand 1 "register_operand" ""))
2351    (use (match_operand 2 "memory_operand" ""))
2352    (clobber (scratch))
2353    (clobber (reg:CC CC_REGNUM))]
2354   "reload_completed"
2355   [(parallel
2356     [(unspec [(match_dup 1) (match_dup 2)
2357               (const_int 0)] UNSPEC_EXECUTE)
2358      (set (match_dup 0) (const_int 0))
2359      (use (const_int 1))
2360      (clobber (reg:CC CC_REGNUM))])]
2361   "")
2363 (define_split
2364   [(set (match_operand:BLK 0 "memory_operand" "")
2365         (const_int 0))
2366    (use (match_operand 1 "register_operand" ""))
2367    (use (const:BLK (unspec:BLK [(const_int 0)] UNSPEC_INSN)))
2368    (clobber (match_operand 2 "register_operand" ""))
2369    (clobber (reg:CC CC_REGNUM))]
2370   "reload_completed && TARGET_CPU_ZARCH"
2371   [(set (match_dup 2) (label_ref (match_dup 3)))
2372    (parallel
2373     [(unspec [(match_dup 1) (mem:BLK (match_dup 2)) 
2374               (label_ref (match_dup 3))] UNSPEC_EXECUTE)
2375      (set (match_dup 0) (const_int 0))
2376      (use (const_int 1))
2377      (clobber (reg:CC CC_REGNUM))])]
2378   "operands[3] = gen_label_rtx ();")
2380 ; Initialize a block of arbitrary length with (operands[2] % 256). 
2382 (define_expand "setmem_long"
2383   [(parallel
2384     [(clobber (match_dup 1))
2385      (set (match_operand:BLK 0 "memory_operand" "")
2386           (match_operand 2 "shift_count_or_setmem_operand" ""))
2387      (use (match_operand 1 "general_operand" ""))
2388      (use (match_dup 3))
2389      (clobber (reg:CC CC_REGNUM))])]
2390   ""
2392   enum machine_mode dword_mode = word_mode == DImode ? TImode : DImode;
2393   rtx reg0 = gen_reg_rtx (dword_mode);
2394   rtx reg1 = gen_reg_rtx (dword_mode);
2395   rtx addr0 = gen_lowpart (Pmode, gen_highpart (word_mode, reg0));
2396   rtx len0 = gen_lowpart (Pmode, reg0);
2398   emit_insn (gen_rtx_CLOBBER (VOIDmode, reg0));
2399   emit_move_insn (addr0, force_operand (XEXP (operands[0], 0), NULL_RTX));
2400   emit_move_insn (len0, operands[1]);
2402   emit_move_insn (reg1, const0_rtx);
2404   operands[0] = replace_equiv_address_nv (operands[0], addr0);
2405   operands[1] = reg0;
2406   operands[3] = reg1;
2409 (define_insn "*setmem_long"
2410   [(clobber (match_operand:<DBL> 0 "register_operand" "=d"))
2411    (set (mem:BLK (subreg:P (match_operand:<DBL> 3 "register_operand" "0") 0))
2412         (match_operand 2 "shift_count_or_setmem_operand" "Y"))
2413    (use (match_dup 3))
2414    (use (match_operand:<DBL> 1 "register_operand" "d"))
2415    (clobber (reg:CC CC_REGNUM))]
2416   ""
2417   "mvcle\t%0,%1,%Y2\;jo\t.-4"
2418   [(set_attr "length" "8")
2419    (set_attr "type" "vs")])
2421 (define_insn "*setmem_long_and"
2422   [(clobber (match_operand:<DBL> 0 "register_operand" "=d"))
2423    (set (mem:BLK (subreg:P (match_operand:<DBL> 3 "register_operand" "0") 0))
2424         (and (match_operand 2 "shift_count_or_setmem_operand" "Y")
2425              (match_operand 4 "const_int_operand"             "n")))
2426    (use (match_dup 3))
2427    (use (match_operand:<DBL> 1 "register_operand" "d"))
2428    (clobber (reg:CC CC_REGNUM))]
2429   "(INTVAL (operands[4]) & 255) == 255"
2430   "mvcle\t%0,%1,%Y2\;jo\t.-4"
2431   [(set_attr "length" "8")
2432    (set_attr "type" "vs")])
2434 ; cmpmemM instruction pattern(s).
2437 (define_expand "cmpmemsi"
2438   [(set (match_operand:SI 0 "register_operand" "")
2439         (compare:SI (match_operand:BLK 1 "memory_operand" "")
2440                     (match_operand:BLK 2 "memory_operand" "") ) )
2441    (use (match_operand:SI 3 "general_operand" ""))
2442    (use (match_operand:SI 4 "" ""))]
2443   ""
2444   "s390_expand_cmpmem (operands[0], operands[1],
2445                        operands[2], operands[3]); DONE;")
2447 ; Compare a block that is up to 256 bytes in length.
2448 ; The block length is taken as (operands[2] % 256) + 1.
2450 (define_expand "cmpmem_short"
2451   [(parallel
2452     [(set (reg:CCU CC_REGNUM)
2453           (compare:CCU (match_operand:BLK 0 "memory_operand" "")
2454                        (match_operand:BLK 1 "memory_operand" "")))
2455      (use (match_operand 2 "nonmemory_operand" ""))
2456      (use (const:BLK (unspec:BLK [(const_int 0)] UNSPEC_INSN)))
2457      (clobber (match_dup 3))])]
2458   ""
2459   "operands[3] = gen_rtx_SCRATCH (Pmode);")
2461 (define_insn "*cmpmem_short"
2462   [(set (reg:CCU CC_REGNUM)
2463         (compare:CCU (match_operand:BLK 0 "memory_operand" "Q,Q,Q")
2464                      (match_operand:BLK 1 "memory_operand" "Q,Q,Q")))
2465    (use (match_operand 2 "nonmemory_operand" "n,a,a"))
2466    (use (match_operand 3 "immediate_operand" "X,R,X"))
2467    (clobber (match_scratch 4 "=X,X,&a"))]
2468   "(GET_MODE (operands[2]) == Pmode || GET_MODE (operands[2]) == VOIDmode)
2469    && GET_MODE (operands[4]) == Pmode"
2470   "#"
2471   [(set_attr "type" "cs")])
2473 (define_split
2474   [(set (reg:CCU CC_REGNUM)
2475         (compare:CCU (match_operand:BLK 0 "memory_operand" "")
2476                      (match_operand:BLK 1 "memory_operand" "")))
2477    (use (match_operand 2 "const_int_operand" ""))
2478    (use (match_operand 3 "immediate_operand" ""))
2479    (clobber (scratch))]
2480   "reload_completed"
2481   [(parallel
2482     [(set (reg:CCU CC_REGNUM) (compare:CCU (match_dup 0) (match_dup 1)))
2483      (use (match_dup 2))])]
2484   "operands[2] = GEN_INT ((INTVAL (operands[2]) & 0xff) + 1);")
2486 (define_split
2487   [(set (reg:CCU CC_REGNUM)
2488         (compare:CCU (match_operand:BLK 0 "memory_operand" "")
2489                      (match_operand:BLK 1 "memory_operand" "")))
2490    (use (match_operand 2 "register_operand" ""))
2491    (use (match_operand 3 "memory_operand" ""))
2492    (clobber (scratch))]
2493   "reload_completed"
2494   [(parallel
2495     [(unspec [(match_dup 2) (match_dup 3)
2496               (const_int 0)] UNSPEC_EXECUTE)
2497      (set (reg:CCU CC_REGNUM) (compare:CCU (match_dup 0) (match_dup 1)))
2498      (use (const_int 1))])]
2499   "")
2501 (define_split
2502   [(set (reg:CCU CC_REGNUM)
2503         (compare:CCU (match_operand:BLK 0 "memory_operand" "")
2504                      (match_operand:BLK 1 "memory_operand" "")))
2505    (use (match_operand 2 "register_operand" ""))
2506    (use (const:BLK (unspec:BLK [(const_int 0)] UNSPEC_INSN)))
2507    (clobber (match_operand 3 "register_operand" ""))]
2508   "reload_completed && TARGET_CPU_ZARCH"
2509   [(set (match_dup 3) (label_ref (match_dup 4)))
2510    (parallel
2511     [(unspec [(match_dup 2) (mem:BLK (match_dup 3)) 
2512               (label_ref (match_dup 4))] UNSPEC_EXECUTE)
2513      (set (reg:CCU CC_REGNUM) (compare:CCU (match_dup 0) (match_dup 1)))
2514      (use (const_int 1))])]
2515   "operands[4] = gen_label_rtx ();")
2517 ; Compare a block of arbitrary length.
2519 (define_expand "cmpmem_long"
2520   [(parallel
2521     [(clobber (match_dup 2))
2522      (clobber (match_dup 3))
2523      (set (reg:CCU CC_REGNUM)
2524           (compare:CCU (match_operand:BLK 0 "memory_operand" "")
2525                        (match_operand:BLK 1 "memory_operand" "")))
2526      (use (match_operand 2 "general_operand" ""))
2527      (use (match_dup 3))])]
2528   ""
2530   enum machine_mode dword_mode = word_mode == DImode ? TImode : DImode;
2531   rtx reg0 = gen_reg_rtx (dword_mode);
2532   rtx reg1 = gen_reg_rtx (dword_mode);
2533   rtx addr0 = gen_lowpart (Pmode, gen_highpart (word_mode, reg0));
2534   rtx addr1 = gen_lowpart (Pmode, gen_highpart (word_mode, reg1));
2535   rtx len0 = gen_lowpart (Pmode, reg0);
2536   rtx len1 = gen_lowpart (Pmode, reg1);
2538   emit_insn (gen_rtx_CLOBBER (VOIDmode, reg0));
2539   emit_move_insn (addr0, force_operand (XEXP (operands[0], 0), NULL_RTX));
2540   emit_move_insn (len0, operands[2]);
2542   emit_insn (gen_rtx_CLOBBER (VOIDmode, reg1));
2543   emit_move_insn (addr1, force_operand (XEXP (operands[1], 0), NULL_RTX));
2544   emit_move_insn (len1, operands[2]);
2546   operands[0] = replace_equiv_address_nv (operands[0], addr0);
2547   operands[1] = replace_equiv_address_nv (operands[1], addr1);
2548   operands[2] = reg0;
2549   operands[3] = reg1;
2552 (define_insn "*cmpmem_long"
2553   [(clobber (match_operand:<DBL> 0 "register_operand" "=d"))
2554    (clobber (match_operand:<DBL> 1 "register_operand" "=d"))
2555    (set (reg:CCU CC_REGNUM)
2556         (compare:CCU (mem:BLK (subreg:P (match_operand:<DBL> 2 "register_operand" "0") 0))
2557                      (mem:BLK (subreg:P (match_operand:<DBL> 3 "register_operand" "1") 0))))
2558    (use (match_dup 2))
2559    (use (match_dup 3))]
2560   ""
2561   "clcle\t%0,%1,0\;jo\t.-4"
2562   [(set_attr "length" "8")
2563    (set_attr "type" "vs")])
2565 ; Convert CCUmode condition code to integer.
2566 ; Result is zero if EQ, positive if LTU, negative if GTU.
2568 (define_insn_and_split "cmpint"
2569   [(set (match_operand:SI 0 "register_operand" "=d")
2570         (unspec:SI [(match_operand:CCU 1 "register_operand" "0")]
2571                    UNSPEC_CMPINT))
2572    (clobber (reg:CC CC_REGNUM))]
2573   ""
2574   "#"
2575   "reload_completed"
2576   [(set (match_dup 0) (ashift:SI (match_dup 0) (const_int 2)))
2577    (parallel
2578     [(set (match_dup 0) (ashiftrt:SI (match_dup 0) (const_int 30)))
2579      (clobber (reg:CC CC_REGNUM))])])
2581 (define_insn_and_split "*cmpint_cc"
2582   [(set (reg CC_REGNUM)
2583         (compare (unspec:SI [(match_operand:CCU 1 "register_operand" "0")]
2584                             UNSPEC_CMPINT)
2585                  (const_int 0)))
2586    (set (match_operand:SI 0 "register_operand" "=d")
2587         (unspec:SI [(match_dup 1)] UNSPEC_CMPINT))]
2588   "s390_match_ccmode (insn, CCSmode)"
2589   "#"
2590   "&& reload_completed"
2591   [(set (match_dup 0) (ashift:SI (match_dup 0) (const_int 2)))
2592    (parallel
2593     [(set (match_dup 2) (match_dup 3))
2594      (set (match_dup 0) (ashiftrt:SI (match_dup 0) (const_int 30)))])]
2596   rtx result = gen_rtx_ASHIFTRT (SImode, operands[0], GEN_INT (30));
2597   operands[2] = SET_DEST (XVECEXP (PATTERN (curr_insn), 0, 0));
2598   operands[3] = gen_rtx_COMPARE (GET_MODE (operands[2]), result, const0_rtx);
2601 (define_insn_and_split "*cmpint_sign"
2602   [(set (match_operand:DI 0 "register_operand" "=d")
2603         (sign_extend:DI (unspec:SI [(match_operand:CCU 1 "register_operand" "0")]
2604                                    UNSPEC_CMPINT)))
2605    (clobber (reg:CC CC_REGNUM))]
2606   "TARGET_64BIT"
2607   "#"
2608   "&& reload_completed"
2609   [(set (match_dup 0) (ashift:DI (match_dup 0) (const_int 34)))
2610    (parallel
2611     [(set (match_dup 0) (ashiftrt:DI (match_dup 0) (const_int 62)))
2612      (clobber (reg:CC CC_REGNUM))])])
2614 (define_insn_and_split "*cmpint_sign_cc"
2615   [(set (reg CC_REGNUM)
2616         (compare (ashiftrt:DI (ashift:DI (subreg:DI 
2617                    (unspec:SI [(match_operand:CCU 1 "register_operand" "0")]
2618                               UNSPEC_CMPINT) 0)
2619                    (const_int 32)) (const_int 32))
2620                  (const_int 0)))
2621    (set (match_operand:DI 0 "register_operand" "=d")
2622         (sign_extend:DI (unspec:SI [(match_dup 1)] UNSPEC_CMPINT)))]
2623   "s390_match_ccmode (insn, CCSmode) && TARGET_64BIT"
2624   "#"
2625   "&& reload_completed"
2626   [(set (match_dup 0) (ashift:DI (match_dup 0) (const_int 34)))
2627    (parallel
2628     [(set (match_dup 2) (match_dup 3))
2629      (set (match_dup 0) (ashiftrt:DI (match_dup 0) (const_int 62)))])]
2631   rtx result = gen_rtx_ASHIFTRT (DImode, operands[0], GEN_INT (62));
2632   operands[2] = SET_DEST (XVECEXP (PATTERN (curr_insn), 0, 0));
2633   operands[3] = gen_rtx_COMPARE (GET_MODE (operands[2]), result, const0_rtx);
2638 ;;- Conversion instructions.
2641 (define_insn "*sethighpartsi"
2642   [(set (match_operand:SI 0 "register_operand" "=d,d")
2643         (unspec:SI [(match_operand:BLK 1 "s_operand" "Q,S")
2644                     (match_operand 2 "const_int_operand" "n,n")] UNSPEC_ICM))
2645    (clobber (reg:CC CC_REGNUM))]
2646   ""
2647   "@
2648    icm\t%0,%2,%S1
2649    icmy\t%0,%2,%S1"
2650   [(set_attr "op_type" "RS,RSY")])
2652 (define_insn "*sethighpartdi_64"
2653   [(set (match_operand:DI 0 "register_operand" "=d")
2654         (unspec:DI [(match_operand:BLK 1 "s_operand" "QS")
2655                     (match_operand 2 "const_int_operand" "n")] UNSPEC_ICM))
2656    (clobber (reg:CC CC_REGNUM))]
2657   "TARGET_64BIT"
2658   "icmh\t%0,%2,%S1"
2659   [(set_attr "op_type" "RSY")])
2661 (define_insn "*sethighpartdi_31"
2662   [(set (match_operand:DI 0 "register_operand" "=d,d")
2663         (unspec:DI [(match_operand:BLK 1 "s_operand" "Q,S")
2664                     (match_operand 2 "const_int_operand" "n,n")] UNSPEC_ICM))
2665    (clobber (reg:CC CC_REGNUM))]
2666   "!TARGET_64BIT"
2667   "@
2668    icm\t%0,%2,%S1
2669    icmy\t%0,%2,%S1"
2670   [(set_attr "op_type" "RS,RSY")])
2672 (define_insn_and_split "*extzv<mode>"
2673   [(set (match_operand:GPR 0 "register_operand" "=d")
2674         (zero_extract:GPR (match_operand:QI 1 "s_operand" "QS")
2675                           (match_operand 2 "const_int_operand" "n")
2676                           (const_int 0)))
2677    (clobber (reg:CC CC_REGNUM))]
2678   "INTVAL (operands[2]) > 0
2679    && INTVAL (operands[2]) <= GET_MODE_BITSIZE (SImode)"
2680   "#"
2681   "&& reload_completed"
2682   [(parallel
2683     [(set (match_dup 0) (unspec:GPR [(match_dup 1) (match_dup 3)] UNSPEC_ICM))
2684      (clobber (reg:CC CC_REGNUM))])
2685    (set (match_dup 0) (lshiftrt:GPR (match_dup 0) (match_dup 2)))]
2687   int bitsize = INTVAL (operands[2]);
2688   int size = (bitsize - 1) / BITS_PER_UNIT + 1; /* round up */
2689   int mask = ((1ul << size) - 1) << (GET_MODE_SIZE (SImode) - size);
2691   operands[1] = adjust_address (operands[1], BLKmode, 0);
2692   set_mem_size (operands[1], GEN_INT (size));
2693   operands[2] = GEN_INT (GET_MODE_BITSIZE (<MODE>mode) - bitsize);
2694   operands[3] = GEN_INT (mask);
2697 (define_insn_and_split "*extv<mode>"
2698   [(set (match_operand:GPR 0 "register_operand" "=d")
2699         (sign_extract:GPR (match_operand:QI 1 "s_operand" "QS")
2700                           (match_operand 2 "const_int_operand" "n")
2701                           (const_int 0)))
2702    (clobber (reg:CC CC_REGNUM))]
2703   "INTVAL (operands[2]) > 0
2704    && INTVAL (operands[2]) <= GET_MODE_BITSIZE (SImode)"
2705   "#"
2706   "&& reload_completed"
2707   [(parallel
2708     [(set (match_dup 0) (unspec:GPR [(match_dup 1) (match_dup 3)] UNSPEC_ICM))
2709      (clobber (reg:CC CC_REGNUM))])
2710    (parallel
2711     [(set (match_dup 0) (ashiftrt:GPR (match_dup 0) (match_dup 2)))
2712      (clobber (reg:CC CC_REGNUM))])]
2714   int bitsize = INTVAL (operands[2]);
2715   int size = (bitsize - 1) / BITS_PER_UNIT + 1; /* round up */
2716   int mask = ((1ul << size) - 1) << (GET_MODE_SIZE (SImode) - size);
2718   operands[1] = adjust_address (operands[1], BLKmode, 0);
2719   set_mem_size (operands[1], GEN_INT (size));
2720   operands[2] = GEN_INT (GET_MODE_BITSIZE (<MODE>mode) - bitsize);
2721   operands[3] = GEN_INT (mask);
2725 ; insv instruction patterns
2728 (define_expand "insv"
2729   [(set (zero_extract (match_operand 0 "nonimmediate_operand" "")
2730                       (match_operand 1 "const_int_operand" "")
2731                       (match_operand 2 "const_int_operand" ""))
2732         (match_operand 3 "general_operand" ""))]
2733   ""
2735   if (s390_expand_insv (operands[0], operands[1], operands[2], operands[3]))
2736     DONE;
2737   FAIL;
2740 (define_insn "*insv<mode>_mem_reg"
2741   [(set (zero_extract:P (match_operand:QI 0 "memory_operand" "+Q,S")
2742                         (match_operand 1 "const_int_operand" "n,n")
2743                         (const_int 0))
2744         (match_operand:P 2 "register_operand" "d,d"))]
2745   "INTVAL (operands[1]) > 0
2746    && INTVAL (operands[1]) <= GET_MODE_BITSIZE (SImode)
2747    && INTVAL (operands[1]) % BITS_PER_UNIT == 0"
2749     int size = INTVAL (operands[1]) / BITS_PER_UNIT;
2751     operands[1] = GEN_INT ((1ul << size) - 1);
2752     return (which_alternative == 0) ? "stcm\t%2,%1,%S0" 
2753                                     : "stcmy\t%2,%1,%S0";
2755   [(set_attr "op_type" "RS,RSY")])
2757 (define_insn "*insvdi_mem_reghigh"
2758   [(set (zero_extract:DI (match_operand:QI 0 "memory_operand" "+QS")
2759                          (match_operand 1 "const_int_operand" "n")
2760                          (const_int 0))
2761         (lshiftrt:DI (match_operand:DI 2 "register_operand" "d")
2762                      (const_int 32)))]
2763   "TARGET_64BIT
2764    && INTVAL (operands[1]) > 0
2765    && INTVAL (operands[1]) <= GET_MODE_BITSIZE (SImode)
2766    && INTVAL (operands[1]) % BITS_PER_UNIT == 0"
2768     int size = INTVAL (operands[1]) / BITS_PER_UNIT;
2770     operands[1] = GEN_INT ((1ul << size) - 1);
2771     return "stcmh\t%2,%1,%S0";
2773 [(set_attr "op_type" "RSY")])
2775 (define_insn "*insv<mode>_reg_imm"
2776   [(set (zero_extract:P (match_operand:P 0 "register_operand" "+d")
2777                         (const_int 16)
2778                         (match_operand 1 "const_int_operand" "n"))
2779         (match_operand 2 "const_int_operand" "n"))]
2780   "TARGET_ZARCH
2781    && INTVAL (operands[1]) >= 0
2782    && INTVAL (operands[1]) < BITS_PER_WORD
2783    && INTVAL (operands[1]) % 16 == 0"
2785   switch (BITS_PER_WORD - INTVAL (operands[1]))
2786     {
2787       case 64: return "iihh\t%0,%x2"; break;
2788       case 48: return "iihl\t%0,%x2"; break;
2789       case 32: return "iilh\t%0,%x2"; break;
2790       case 16: return "iill\t%0,%x2"; break;
2791       default: gcc_unreachable();
2792     }
2794   [(set_attr "op_type" "RI")])
2796 (define_insn "*insv<mode>_reg_extimm"
2797   [(set (zero_extract:P (match_operand:P 0 "register_operand" "+d")
2798                         (const_int 32)
2799                         (match_operand 1 "const_int_operand" "n"))
2800         (match_operand 2 "const_int_operand" "n"))]
2801   "TARGET_EXTIMM
2802    && INTVAL (operands[1]) >= 0
2803    && INTVAL (operands[1]) < BITS_PER_WORD
2804    && INTVAL (operands[1]) % 32 == 0"
2806   switch (BITS_PER_WORD - INTVAL (operands[1]))
2807     {
2808       case 64: return "iihf\t%0,%o2"; break;
2809       case 32: return "iilf\t%0,%o2"; break;
2810       default: gcc_unreachable();
2811     }
2813   [(set_attr "op_type" "RIL")])
2816 ; extendsidi2 instruction pattern(s).
2819 (define_expand "extendsidi2"
2820   [(set (match_operand:DI 0 "register_operand" "")
2821         (sign_extend:DI (match_operand:SI 1 "nonimmediate_operand" "")))]
2822   ""
2824   if (!TARGET_64BIT)
2825     {
2826       emit_insn (gen_rtx_CLOBBER (VOIDmode, operands[0]));
2827       emit_move_insn (gen_highpart (SImode, operands[0]), operands[1]);
2828       emit_move_insn (gen_lowpart (SImode, operands[0]), const0_rtx);
2829       emit_insn (gen_ashrdi3 (operands[0], operands[0], GEN_INT (32)));
2830       DONE;
2831     }
2834 (define_insn "*extendsidi2"
2835   [(set (match_operand:DI 0 "register_operand" "=d,d")
2836         (sign_extend:DI (match_operand:SI 1 "nonimmediate_operand" "d,m")))]
2837   "TARGET_64BIT"
2838   "@
2839    lgfr\t%0,%1
2840    lgf\t%0,%1"
2841   [(set_attr "op_type" "RRE,RXY")])
2844 ; extend(hi|qi)di2 instruction pattern(s).
2847 (define_expand "extend<mode>di2"
2848   [(set (match_operand:DI 0 "register_operand" "")
2849         (sign_extend:DI (match_operand:HQI 1 "nonimmediate_operand" "")))]
2850   ""
2852   if (!TARGET_64BIT)
2853     {
2854       rtx tmp = gen_reg_rtx (SImode);
2855       emit_insn (gen_extend<mode>si2 (tmp, operands[1]));
2856       emit_insn (gen_extendsidi2 (operands[0], tmp));
2857       DONE;
2858     }
2859   else if (!TARGET_EXTIMM)
2860     {
2861       rtx bitcount = GEN_INT (GET_MODE_BITSIZE (DImode) - 
2862                               GET_MODE_BITSIZE (<MODE>mode));
2863       operands[1] = gen_lowpart (DImode, operands[1]);
2864       emit_insn (gen_ashldi3 (operands[0], operands[1], bitcount));
2865       emit_insn (gen_ashrdi3 (operands[0], operands[0], bitcount));
2866       DONE;
2867     }
2870 (define_insn "*extendhidi2_extimm"
2871   [(set (match_operand:DI 0 "register_operand" "=d,d")
2872         (sign_extend:DI (match_operand:HI 1 "nonimmediate_operand" "d,m")))]
2873   "TARGET_64BIT && TARGET_EXTIMM"
2874   "@
2875    lghr\t%0,%1
2876    lgh\t%0,%1"
2877   [(set_attr "op_type" "RRE,RXY")])
2879 (define_insn "*extendhidi2"
2880   [(set (match_operand:DI 0 "register_operand" "=d")
2881         (sign_extend:DI (match_operand:HI 1 "memory_operand" "m")))]
2882   "TARGET_64BIT"
2883   "lgh\t%0,%1"
2884   [(set_attr "op_type" "RXY")])
2886 (define_insn "*extendqidi2_extimm"
2887   [(set (match_operand:DI 0 "register_operand" "=d,d")
2888         (sign_extend:DI (match_operand:QI 1 "nonimmediate_operand" "d,m")))]
2889   "TARGET_64BIT && TARGET_EXTIMM"
2890   "@
2891    lgbr\t%0,%1
2892    lgb\t%0,%1"
2893   [(set_attr "op_type" "RRE,RXY")])
2895 (define_insn "*extendqidi2"
2896   [(set (match_operand:DI 0 "register_operand" "=d")
2897         (sign_extend:DI (match_operand:QI 1 "memory_operand" "m")))]
2898   "TARGET_64BIT && TARGET_LONG_DISPLACEMENT"
2899   "lgb\t%0,%1"
2900   [(set_attr "op_type" "RXY")])
2902 (define_insn_and_split "*extendqidi2_short_displ"
2903   [(set (match_operand:DI 0 "register_operand" "=d")
2904         (sign_extend:DI (match_operand:QI 1 "s_operand" "Q")))
2905    (clobber (reg:CC CC_REGNUM))]
2906   "TARGET_64BIT && !TARGET_LONG_DISPLACEMENT"
2907   "#"
2908   "&& reload_completed"
2909   [(parallel
2910     [(set (match_dup 0) (unspec:DI [(match_dup 1) (const_int 8)] UNSPEC_ICM))
2911      (clobber (reg:CC CC_REGNUM))])
2912    (parallel
2913     [(set (match_dup 0) (ashiftrt:DI (match_dup 0) (const_int 56)))
2914      (clobber (reg:CC CC_REGNUM))])]
2916   operands[1] = adjust_address (operands[1], BLKmode, 0);
2917   set_mem_size (operands[1], GEN_INT (GET_MODE_SIZE (QImode)));
2921 ; extend(hi|qi)si2 instruction pattern(s).
2924 (define_expand "extend<mode>si2"
2925   [(set (match_operand:SI 0 "register_operand" "")
2926         (sign_extend:SI (match_operand:HQI 1 "nonimmediate_operand" "")))]
2927   ""
2929  if (!TARGET_EXTIMM)
2930    {
2931      rtx bitcount = GEN_INT (GET_MODE_BITSIZE(SImode) - 
2932                              GET_MODE_BITSIZE(<MODE>mode));
2933      operands[1] = gen_lowpart (SImode, operands[1]);
2934      emit_insn (gen_ashlsi3 (operands[0], operands[1], bitcount));
2935      emit_insn (gen_ashrsi3 (operands[0], operands[0], bitcount));
2936      DONE;
2937    }
2940 (define_insn "*extendhisi2_extimm"
2941   [(set (match_operand:SI 0 "register_operand" "=d,d,d")
2942         (sign_extend:SI (match_operand:HI 1 "nonimmediate_operand" "d,R,T")))]
2943   "TARGET_EXTIMM"
2944   "@
2945    lhr\t%0,%1
2946    lh\t%0,%1
2947    lhy\t%0,%1"
2948   [(set_attr "op_type" "RRE,RX,RXY")])
2950 (define_insn "*extendhisi2"
2951   [(set (match_operand:SI 0 "register_operand" "=d,d")
2952         (sign_extend:SI (match_operand:HI 1 "memory_operand" "R,T")))]
2953   "!TARGET_EXTIMM"
2954   "@
2955    lh\t%0,%1
2956    lhy\t%0,%1"
2957   [(set_attr "op_type" "RX,RXY")])
2959 (define_insn "*extendqisi2_extimm"
2960   [(set (match_operand:SI 0 "register_operand" "=d,d")
2961         (sign_extend:SI (match_operand:QI 1 "nonimmediate_operand" "d,m")))]
2962   "TARGET_EXTIMM"
2963   "@
2964    lbr\t%0,%1
2965    lb\t%0,%1"
2966   [(set_attr "op_type" "RRE,RXY")])
2968 (define_insn "*extendqisi2"
2969   [(set (match_operand:SI 0 "register_operand" "=d")
2970         (sign_extend:SI (match_operand:QI 1 "memory_operand" "m")))]
2971   "TARGET_LONG_DISPLACEMENT && !TARGET_EXTIMM"
2972   "lb\t%0,%1"
2973   [(set_attr "op_type" "RXY")])
2975 (define_insn_and_split "*extendqisi2_short_displ"
2976   [(set (match_operand:SI 0 "register_operand" "=d")
2977         (sign_extend:SI (match_operand:QI 1 "s_operand" "Q")))
2978    (clobber (reg:CC CC_REGNUM))]
2979   "!TARGET_LONG_DISPLACEMENT"
2980   "#"
2981   "&& reload_completed"
2982   [(parallel
2983     [(set (match_dup 0) (unspec:SI [(match_dup 1) (const_int 8)] UNSPEC_ICM))
2984      (clobber (reg:CC CC_REGNUM))])
2985    (parallel
2986     [(set (match_dup 0) (ashiftrt:SI (match_dup 0) (const_int 24)))
2987      (clobber (reg:CC CC_REGNUM))])]
2989   operands[1] = adjust_address (operands[1], BLKmode, 0);
2990   set_mem_size (operands[1], GEN_INT (GET_MODE_SIZE (QImode)));
2994 ; extendqihi2 instruction pattern(s).
2999 ; zero_extendsidi2 instruction pattern(s).
3002 (define_expand "zero_extendsidi2"
3003   [(set (match_operand:DI 0 "register_operand" "")
3004         (zero_extend:DI (match_operand:SI 1 "nonimmediate_operand" "")))]
3005   ""
3007   if (!TARGET_64BIT)
3008     {
3009       emit_insn (gen_rtx_CLOBBER (VOIDmode, operands[0]));
3010       emit_move_insn (gen_lowpart (SImode, operands[0]), operands[1]);
3011       emit_move_insn (gen_highpart (SImode, operands[0]), const0_rtx);
3012       DONE;
3013     }
3016 (define_insn "*zero_extendsidi2"
3017   [(set (match_operand:DI 0 "register_operand" "=d,d")
3018         (zero_extend:DI (match_operand:SI 1 "nonimmediate_operand" "d,m")))]
3019   "TARGET_64BIT"
3020   "@
3021    llgfr\t%0,%1
3022    llgf\t%0,%1"
3023   [(set_attr "op_type" "RRE,RXY")])
3026 ; zero_extend(hi|qi)di2 instruction pattern(s).
3029 (define_expand "zero_extend<mode>di2"
3030   [(set (match_operand:DI 0 "register_operand" "")
3031         (zero_extend:DI (match_operand:HQI 1 "nonimmediate_operand" "")))]
3032   ""
3034   if (!TARGET_64BIT)
3035     {
3036       rtx tmp = gen_reg_rtx (SImode);
3037       emit_insn (gen_zero_extend<mode>si2 (tmp, operands[1]));
3038       emit_insn (gen_zero_extendsidi2 (operands[0], tmp));
3039       DONE;
3040     }
3041   else if (!TARGET_EXTIMM)
3042     {
3043       rtx bitcount = GEN_INT (GET_MODE_BITSIZE(DImode) - 
3044                               GET_MODE_BITSIZE(<MODE>mode));
3045       operands[1] = gen_lowpart (DImode, operands[1]);
3046       emit_insn (gen_ashldi3 (operands[0], operands[1], bitcount));
3047       emit_insn (gen_lshrdi3 (operands[0], operands[0], bitcount));
3048       DONE;
3049     }
3052 (define_insn "*zero_extend<mode>di2_extimm"
3053   [(set (match_operand:DI 0 "register_operand" "=d,d")
3054         (zero_extend:DI (match_operand:HQI 1 "nonimmediate_operand" "d,m")))]
3055   "TARGET_64BIT && TARGET_EXTIMM"
3056   "@
3057    llg<hc>r\t%0,%1
3058    llg<hc>\t%0,%1"
3059   [(set_attr "op_type" "RRE,RXY")])
3061 (define_insn "*zero_extend<mode>di2"
3062   [(set (match_operand:DI 0 "register_operand" "=d")
3063         (zero_extend:DI (match_operand:HQI 1 "memory_operand" "m")))]
3064   "TARGET_64BIT  && !TARGET_EXTIMM"
3065   "llg<hc>\t%0,%1"
3066   [(set_attr "op_type" "RXY")])
3069 ; LLGT-type instructions (zero-extend from 31 bit to 64 bit).
3072 (define_insn "*llgt_sidi"
3073   [(set (match_operand:DI 0 "register_operand" "=d")
3074         (and:DI (subreg:DI (match_operand:SI 1 "memory_operand" "m") 0)
3075                 (const_int 2147483647)))]
3076   "TARGET_64BIT"
3077   "llgt\t%0,%1"
3078   [(set_attr "op_type"  "RXE")])
3080 (define_insn_and_split "*llgt_sidi_split"
3081   [(set (match_operand:DI 0 "register_operand" "=d")
3082         (and:DI (subreg:DI (match_operand:SI 1 "memory_operand" "m") 0)
3083                 (const_int 2147483647)))
3084    (clobber (reg:CC CC_REGNUM))]
3085   "TARGET_64BIT"
3086   "#"
3087   "&& reload_completed"
3088   [(set (match_dup 0)
3089         (and:DI (subreg:DI (match_dup 1) 0)
3090                 (const_int 2147483647)))]
3091   "")
3093 (define_insn "*llgt_sisi"
3094   [(set (match_operand:SI 0 "register_operand" "=d,d")
3095         (and:SI (match_operand:SI 1 "nonimmediate_operand" "d,m")
3096                 (const_int 2147483647)))]
3097   "TARGET_ZARCH"
3098   "@
3099    llgtr\t%0,%1
3100    llgt\t%0,%1"
3101   [(set_attr "op_type"  "RRE,RXE")])
3103 (define_insn "*llgt_didi"
3104   [(set (match_operand:DI 0 "register_operand" "=d,d")
3105         (and:DI (match_operand:DI 1 "nonimmediate_operand" "d,o")
3106                 (const_int 2147483647)))]
3107   "TARGET_64BIT"
3108   "@
3109    llgtr\t%0,%1
3110    llgt\t%0,%N1"
3111   [(set_attr "op_type"  "RRE,RXE")])
3113 (define_split
3114   [(set (match_operand:GPR 0 "register_operand" "")
3115         (and:GPR (match_operand:GPR 1 "nonimmediate_operand" "")
3116                  (const_int 2147483647)))
3117    (clobber (reg:CC CC_REGNUM))]
3118   "TARGET_ZARCH && reload_completed"
3119   [(set (match_dup 0)
3120         (and:GPR (match_dup 1)
3121                  (const_int 2147483647)))]
3122   "")
3125 ; zero_extend(hi|qi)si2 instruction pattern(s).
3128 (define_expand "zero_extend<mode>si2"
3129   [(set (match_operand:SI 0 "register_operand" "")
3130         (zero_extend:SI (match_operand:HQI 1 "nonimmediate_operand" "")))]
3131   ""
3133   if (!TARGET_EXTIMM)
3134     {
3135       operands[1] = gen_lowpart (SImode, operands[1]);
3136       emit_insn (gen_andsi3 (operands[0], operands[1], 
3137                    GEN_INT ((1 << GET_MODE_BITSIZE(<MODE>mode)) - 1)));
3138       DONE;
3142 (define_insn "*zero_extend<mode>si2_extimm"
3143   [(set (match_operand:SI 0 "register_operand" "=d,d")
3144         (zero_extend:SI (match_operand:HQI 1 "nonimmediate_operand" "d,m")))]
3145   "TARGET_EXTIMM"
3146   "@
3147    ll<hc>r\t%0,%1
3148    ll<hc>\t%0,%1"
3149   [(set_attr "op_type" "RRE,RXY")])
3151 (define_insn "*zero_extend<mode>si2_64"
3152   [(set (match_operand:SI 0 "register_operand" "=d")
3153         (zero_extend:SI (match_operand:HQI 1 "memory_operand" "m")))]
3154   "TARGET_ZARCH && !TARGET_EXTIMM"
3155   "llg<hc>\t%0,%1"
3156   [(set_attr "op_type" "RXY")])
3158 (define_insn_and_split "*zero_extendhisi2_31"
3159   [(set (match_operand:SI 0 "register_operand" "=&d")
3160         (zero_extend:SI (match_operand:HI 1 "s_operand" "QS")))
3161    (clobber (reg:CC CC_REGNUM))]
3162   "!TARGET_ZARCH"
3163   "#"
3164   "&& reload_completed"
3165   [(set (match_dup 0) (const_int 0))
3166    (parallel
3167     [(set (strict_low_part (match_dup 2)) (match_dup 1))
3168      (clobber (reg:CC CC_REGNUM))])]
3169   "operands[2] = gen_lowpart (HImode, operands[0]);")
3171 (define_insn_and_split "*zero_extendqisi2_31"
3172   [(set (match_operand:SI 0 "register_operand" "=&d")
3173         (zero_extend:SI (match_operand:QI 1 "memory_operand" "m")))]
3174   "!TARGET_ZARCH"
3175   "#"
3176   "&& reload_completed"
3177   [(set (match_dup 0) (const_int 0))
3178    (set (strict_low_part (match_dup 2)) (match_dup 1))]
3179   "operands[2] = gen_lowpart (QImode, operands[0]);")
3182 ; zero_extendqihi2 instruction pattern(s).
3185 (define_expand "zero_extendqihi2"
3186   [(set (match_operand:HI 0 "register_operand" "")
3187         (zero_extend:HI (match_operand:QI 1 "register_operand" "")))]
3188   "TARGET_ZARCH && !TARGET_EXTIMM"
3190   operands[1] = gen_lowpart (HImode, operands[1]);
3191   emit_insn (gen_andhi3 (operands[0], operands[1], GEN_INT (0xff)));
3192   DONE;
3195 (define_insn "*zero_extendqihi2_64"
3196   [(set (match_operand:HI 0 "register_operand" "=d")
3197         (zero_extend:HI (match_operand:QI 1 "memory_operand" "m")))]
3198   "TARGET_ZARCH && !TARGET_EXTIMM"
3199   "llgc\t%0,%1"
3200   [(set_attr "op_type" "RXY")])
3202 (define_insn_and_split "*zero_extendqihi2_31"
3203   [(set (match_operand:HI 0 "register_operand" "=&d")
3204         (zero_extend:HI (match_operand:QI 1 "memory_operand" "m")))]
3205   "!TARGET_ZARCH"
3206   "#"
3207   "&& reload_completed"
3208   [(set (match_dup 0) (const_int 0))
3209    (set (strict_low_part (match_dup 2)) (match_dup 1))]
3210   "operands[2] = gen_lowpart (QImode, operands[0]);")
3214 ; fixuns_trunc(sf|df)(si|di)2 and fix_trunc(sf|df)(si|di)2 instruction pattern(s).
3217 (define_expand "fixuns_trunc<FPR:mode><GPR:mode>2"
3218   [(set (match_operand:GPR 0 "register_operand" "")
3219         (unsigned_fix:GPR (match_operand:FPR 1 "register_operand" "")))]
3220   "TARGET_HARD_FLOAT && TARGET_IEEE_FLOAT"
3222   rtx label1 = gen_label_rtx ();
3223   rtx label2 = gen_label_rtx ();
3224   rtx temp = gen_reg_rtx (<FPR:MODE>mode);
3225   REAL_VALUE_TYPE cmp, sub;
3226   
3227   operands[1] = force_reg (<FPR:MODE>mode, operands[1]);
3228   real_2expN (&cmp, GET_MODE_BITSIZE(<GPR:MODE>mode) - 1);
3229   real_2expN (&sub, GET_MODE_BITSIZE(<GPR:MODE>mode));
3230   
3231   emit_insn (gen_cmp<FPR:mode> (operands[1],
3232         CONST_DOUBLE_FROM_REAL_VALUE (cmp, <FPR:MODE>mode)));
3233   emit_jump_insn (gen_blt (label1));
3234   emit_insn (gen_sub<FPR:mode>3 (temp, operands[1],
3235         CONST_DOUBLE_FROM_REAL_VALUE (sub, <FPR:MODE>mode)));
3236   emit_insn (gen_fix_trunc<FPR:mode><GPR:mode>2_ieee (operands[0], temp,
3237         GEN_INT(7)));
3238   emit_jump (label2);
3240   emit_label (label1);
3241   emit_insn (gen_fix_trunc<FPR:mode><GPR:mode>2_ieee (operands[0],
3242         operands[1], GEN_INT(5)));
3243   emit_label (label2);
3244   DONE;
3247 (define_expand "fix_trunc<mode>di2"
3248   [(set (match_operand:DI 0 "register_operand" "")
3249         (fix:DI (match_operand:DSF 1 "nonimmediate_operand" "")))]
3250   "TARGET_64BIT && TARGET_HARD_FLOAT && TARGET_IEEE_FLOAT"
3252   operands[1] = force_reg (<MODE>mode, operands[1]);
3253   emit_insn (gen_fix_trunc<mode>di2_ieee (operands[0], operands[1],
3254       GEN_INT(5)));
3255   DONE;
3258 (define_insn "fix_trunc<FPR:mode><GPR:mode>2_ieee"
3259   [(set (match_operand:GPR 0 "register_operand" "=d")
3260         (fix:GPR (match_operand:FPR 1 "register_operand" "f")))
3261    (unspec:GPR [(match_operand:GPR 2 "immediate_operand" "K")] UNSPEC_ROUND)
3262    (clobber (reg:CC CC_REGNUM))]
3263   "TARGET_HARD_FLOAT && TARGET_IEEE_FLOAT"
3264   "c<GPR:gf><FPR:xde>br\t%0,%h2,%1"
3265   [(set_attr "op_type" "RRE")
3266    (set_attr "type"    "ftoi")])
3269 ; fix_trunctf(si|di)2 instruction pattern(s).
3272 (define_expand "fix_trunctf<mode>2"
3273   [(parallel [(set (match_operand:GPR 0 "register_operand" "")
3274                    (fix:GPR (match_operand:TF 1 "register_operand" "")))
3275               (unspec:GPR [(const_int 5)] UNSPEC_ROUND)
3276               (clobber (reg:CC CC_REGNUM))])]
3277   "TARGET_HARD_FLOAT && TARGET_IEEE_FLOAT"
3278   "")
3281 ; fix_truncdfsi2 instruction pattern(s).
3284 (define_expand "fix_truncdfsi2"
3285   [(set (match_operand:SI 0 "register_operand" "")
3286         (fix:SI (match_operand:DF 1 "nonimmediate_operand" "")))]
3287   "TARGET_HARD_FLOAT"
3289   if (TARGET_IBM_FLOAT)
3290     {
3291       /* This is the algorithm from POP chapter A.5.7.2.  */
3293       rtx temp   = assign_stack_local (BLKmode, 8, BITS_PER_WORD);
3294       rtx two31r = s390_gen_rtx_const_DI (0x4f000000, 0x08000000);
3295       rtx two32  = s390_gen_rtx_const_DI (0x4e000001, 0x00000000);
3297       operands[1] = force_reg (DFmode, operands[1]);
3298       emit_insn (gen_fix_truncdfsi2_ibm (operands[0], operands[1],
3299                                          two31r, two32, temp));
3300     }
3301   else
3302     {
3303       operands[1] = force_reg (DFmode, operands[1]);
3304       emit_insn (gen_fix_truncdfsi2_ieee (operands[0], operands[1], GEN_INT (5)));
3305     }
3307   DONE;
3310 (define_insn "fix_truncdfsi2_ibm"
3311   [(set (match_operand:SI 0 "register_operand" "=d")
3312         (fix:SI (match_operand:DF 1 "nonimmediate_operand" "+f")))
3313    (use (match_operand:DI 2 "immediate_operand" "m"))
3314    (use (match_operand:DI 3 "immediate_operand" "m"))
3315    (use (match_operand:BLK 4 "memory_operand" "m"))
3316    (clobber (reg:CC CC_REGNUM))]
3317   "TARGET_HARD_FLOAT && TARGET_IBM_FLOAT"
3319    output_asm_insn ("sd\t%1,%2", operands);
3320    output_asm_insn ("aw\t%1,%3", operands);
3321    output_asm_insn ("std\t%1,%4", operands);
3322    output_asm_insn ("xi\t%N4,128", operands);
3323    return "l\t%0,%N4";
3325   [(set_attr "length" "20")])
3328 ; fix_truncsfsi2 instruction pattern(s).
3331 (define_expand "fix_truncsfsi2"
3332   [(set (match_operand:SI 0 "register_operand" "")
3333         (fix:SI (match_operand:SF 1 "nonimmediate_operand" "")))]
3334   "TARGET_HARD_FLOAT"
3336   if (TARGET_IBM_FLOAT)
3337     {
3338       /* Convert to DFmode and then use the POP algorithm.  */
3339       rtx temp = gen_reg_rtx (DFmode);
3340       emit_insn (gen_extendsfdf2 (temp, operands[1]));
3341       emit_insn (gen_fix_truncdfsi2 (operands[0], temp));
3342     }
3343   else
3344     {
3345       operands[1] = force_reg (SFmode, operands[1]);
3346       emit_insn (gen_fix_truncsfsi2_ieee (operands[0], operands[1], GEN_INT (5)));
3347     }
3349   DONE;
3353 ; float(si|di)(tf|df|sf)2 instruction pattern(s).
3356 (define_insn "floatdi<mode>2"
3357   [(set (match_operand:FPR 0 "register_operand" "=f")
3358         (float:FPR (match_operand:DI 1 "register_operand" "d")))]
3359   "TARGET_64BIT && TARGET_HARD_FLOAT && TARGET_IEEE_FLOAT"
3360   "c<xde>gbr\t%0,%1"
3361   [(set_attr "op_type" "RRE")
3362    (set_attr "type"    "itof" )])
3364 (define_insn "floatsi<mode>2_ieee"
3365   [(set (match_operand:FPR 0 "register_operand" "=f")
3366         (float:FPR (match_operand:SI 1 "register_operand" "d")))]
3367   "TARGET_HARD_FLOAT && TARGET_IEEE_FLOAT"
3368   "c<xde>fbr\t%0,%1"
3369   [(set_attr "op_type" "RRE")
3370    (set_attr "type"   "itof" )])
3374 ; floatsi(tf|df)2 instruction pattern(s).
3377 (define_expand "floatsitf2"
3378   [(set (match_operand:TF 0 "register_operand" "")
3379         (float:TF (match_operand:SI 1 "register_operand" "")))]
3380   "TARGET_HARD_FLOAT && TARGET_IEEE_FLOAT"
3381   "")
3383 (define_expand "floatsidf2"
3384   [(set (match_operand:DF 0 "register_operand" "")
3385         (float:DF (match_operand:SI 1 "register_operand" "")))]
3386   "TARGET_HARD_FLOAT"
3388   if (TARGET_IBM_FLOAT)
3389     {
3390       /* This is the algorithm from POP chapter A.5.7.1.  */
3392       rtx temp  = assign_stack_local (BLKmode, 8, BITS_PER_WORD);
3393       rtx two31 = s390_gen_rtx_const_DI (0x4e000000, 0x80000000);
3395       emit_insn (gen_floatsidf2_ibm (operands[0], operands[1], two31, temp));
3396       DONE;
3397     }
3400 (define_insn "floatsidf2_ibm"
3401   [(set (match_operand:DF 0 "register_operand" "=f")
3402         (float:DF (match_operand:SI 1 "register_operand" "d")))
3403    (use (match_operand:DI 2 "immediate_operand" "m"))
3404    (use (match_operand:BLK 3 "memory_operand" "m"))
3405    (clobber (reg:CC CC_REGNUM))]
3406   "TARGET_HARD_FLOAT && TARGET_IBM_FLOAT"
3408    output_asm_insn ("st\t%1,%N3", operands);
3409    output_asm_insn ("xi\t%N3,128", operands);
3410    output_asm_insn ("mvc\t%O3(4,%R3),%2", operands);
3411    output_asm_insn ("ld\t%0,%3", operands);
3412    return "sd\t%0,%2";
3414   [(set_attr "length" "20")])
3417 ; floatsisf2 instruction pattern(s).
3420 (define_expand "floatsisf2"
3421   [(set (match_operand:SF 0 "register_operand" "")
3422         (float:SF (match_operand:SI 1 "register_operand" "")))]
3423   "TARGET_HARD_FLOAT"
3425   if (TARGET_IBM_FLOAT)
3426     {
3427       /* Use the POP algorithm to convert to DFmode and then truncate.  */
3428       rtx temp = gen_reg_rtx (DFmode);
3429       emit_insn (gen_floatsidf2 (temp, operands[1]));
3430       emit_insn (gen_truncdfsf2 (operands[0], temp));
3431       DONE;
3432     }
3436 ; truncdfsf2 instruction pattern(s).
3439 (define_expand "truncdfsf2"
3440   [(set (match_operand:SF 0 "register_operand" "")
3441         (float_truncate:SF (match_operand:DF 1 "register_operand" "")))]
3442   "TARGET_HARD_FLOAT"
3443   "")
3445 (define_insn "truncdfsf2_ieee"
3446   [(set (match_operand:SF 0 "register_operand" "=f")
3447         (float_truncate:SF (match_operand:DF 1 "register_operand" "f")))]
3448   "TARGET_HARD_FLOAT && TARGET_IEEE_FLOAT"
3449   "ledbr\t%0,%1"
3450   [(set_attr "op_type"  "RRE")
3451    (set_attr "type"   "ftruncdf")])
3453 (define_insn "truncdfsf2_ibm"
3454   [(set (match_operand:SF 0 "register_operand" "=f,f")
3455         (float_truncate:SF (match_operand:DF 1 "nonimmediate_operand" "f,R")))]
3456   "TARGET_HARD_FLOAT && TARGET_IBM_FLOAT"
3457   "@
3458    ler\t%0,%1
3459    le\t%0,%1"
3460   [(set_attr "op_type"  "RR,RX")
3461    (set_attr "type"   "floadsf")])
3464 ; trunctfdf2 instruction pattern(s).
3467 (define_expand "trunctfdf2"
3468   [(parallel 
3469     [(set (match_operand:DF 0 "register_operand" "")
3470           (float_truncate:DF (match_operand:TF 1 "register_operand" "")))
3471      (clobber (match_scratch:TF 2 "=f"))])]
3472   "TARGET_HARD_FLOAT"
3473   "")
3475 (define_insn "*trunctfdf2_ieee"
3476   [(set (match_operand:DF 0 "register_operand" "=f")
3477         (float_truncate:DF (match_operand:TF 1 "register_operand" "f")))
3478    (clobber (match_scratch:TF 2 "=f"))]
3479   "TARGET_HARD_FLOAT && TARGET_IEEE_FLOAT"
3480   "ldxbr\t%2,%1\;ldr\t%0,%2"
3481   [(set_attr "length" "6")
3482    (set_attr "type"   "ftrunctf")])   
3484 (define_insn "*trunctfdf2_ibm"
3485   [(set (match_operand:DF 0 "register_operand" "=f")
3486         (float_truncate:DF (match_operand:TF 1 "register_operand" "f")))
3487    (clobber (match_scratch:TF 2 "=f"))]
3488   "TARGET_HARD_FLOAT && TARGET_IBM_FLOAT"
3489   "ldxr\t%2,%1\;ldr\t%0,%2"
3490   [(set_attr "length"  "4")
3491    (set_attr "type"   "ftrunctf")])
3494 ; trunctfsf2 instruction pattern(s).
3497 (define_expand "trunctfsf2"
3498   [(parallel 
3499     [(set (match_operand:SF 0 "register_operand" "=f")
3500           (float_truncate:SF (match_operand:TF 1 "register_operand" "f")))
3501      (clobber (match_scratch:TF 2 "=f"))])]
3502   "TARGET_HARD_FLOAT"
3503   "")
3505 (define_insn "*trunctfsf2_ieee"
3506   [(set (match_operand:SF 0 "register_operand" "=f")
3507         (float_truncate:SF (match_operand:TF 1 "register_operand" "f")))
3508    (clobber (match_scratch:TF 2 "=f"))]
3509   "TARGET_HARD_FLOAT && TARGET_IEEE_FLOAT"
3510   "lexbr\t%2,%1\;ler\t%0,%2"
3511   [(set_attr "length"  "6")
3512    (set_attr "type"   "ftrunctf")])
3514 (define_insn "*trunctfsf2_ibm"
3515   [(set (match_operand:SF 0 "register_operand" "=f")
3516         (float_truncate:SF (match_operand:TF 1 "register_operand" "f")))
3517    (clobber (match_scratch:TF 2 "=f"))]
3518   "TARGET_HARD_FLOAT && TARGET_IBM_FLOAT"
3519   "lexr\t%2,%1\;ler\t%0,%2"
3520   [(set_attr "length"  "6")
3521    (set_attr "type"   "ftrunctf")])
3524 ; extendsfdf2 instruction pattern(s).
3527 (define_expand "extendsfdf2"
3528   [(set (match_operand:DF 0 "register_operand" "")
3529         (float_extend:DF (match_operand:SF 1 "nonimmediate_operand" "")))]
3530   "TARGET_HARD_FLOAT"
3532   if (TARGET_IBM_FLOAT)
3533     {
3534       emit_insn (gen_extendsfdf2_ibm (operands[0], operands[1]));
3535       DONE;
3536     }
3539 (define_insn "extendsfdf2_ieee"
3540   [(set (match_operand:DF 0 "register_operand" "=f,f")
3541         (float_extend:DF (match_operand:SF 1 "nonimmediate_operand"  "f,R")))]
3542   "TARGET_HARD_FLOAT && TARGET_IEEE_FLOAT"
3543   "@
3544    ldebr\t%0,%1
3545    ldeb\t%0,%1"
3546   [(set_attr "op_type"  "RRE,RXE")
3547    (set_attr "type"   "fsimpsf, floadsf")])
3549 (define_insn "extendsfdf2_ibm"
3550   [(set (match_operand:DF 0 "register_operand" "=f,f")
3551         (float_extend:DF (match_operand:SF 1 "nonimmediate_operand" "f,R")))
3552    (clobber (reg:CC CC_REGNUM))]
3553   "TARGET_HARD_FLOAT && TARGET_IBM_FLOAT"
3554   "@
3555    sdr\t%0,%0\;ler\t%0,%1
3556    sdr\t%0,%0\;le\t%0,%1"
3557   [(set_attr "length"   "4,6")
3558    (set_attr "type"     "floadsf")])
3561 ; extenddftf2 instruction pattern(s).
3564 (define_expand "extenddftf2"
3565   [(set (match_operand:TF 0 "register_operand" "")
3566         (float_extend:TF (match_operand:DF 1 "nonimmediate_operand" "")))]
3567   "TARGET_HARD_FLOAT"
3568   "")
3570 (define_insn "*extenddftf2_ieee"
3571   [(set (match_operand:TF 0 "register_operand" "=f,f")
3572         (float_extend:TF (match_operand:DF 1 "nonimmediate_operand" "f,R")))]
3573   "TARGET_HARD_FLOAT && TARGET_IEEE_FLOAT"
3574   "@
3575    lxdbr\t%0,%1
3576    lxdb\t%0,%1"
3577   [(set_attr "op_type"  "RRE,RXE")
3578    (set_attr "type"   "fsimptf, floadtf")])
3580 (define_insn "*extenddftf2_ibm"
3581   [(set (match_operand:TF 0 "register_operand" "=f,f")
3582         (float_extend:TF (match_operand:DF 1 "nonimmediate_operand" "f,R")))]
3583   "TARGET_HARD_FLOAT && TARGET_IBM_FLOAT"
3584   "@
3585    lxdr\t%0,%1
3586    lxd\t%0,%1"
3587   [(set_attr "op_type"  "RRE,RXE")
3588    (set_attr "type"   "fsimptf, floadtf")])
3591 ; extendsftf2 instruction pattern(s).
3594 (define_expand "extendsftf2"
3595   [(set (match_operand:TF 0 "register_operand" "")
3596         (float_extend:TF (match_operand:SF 1 "nonimmediate_operand" "")))]
3597   "TARGET_HARD_FLOAT"
3598   "")
3600 (define_insn "*extendsftf2_ieee"
3601   [(set (match_operand:TF 0 "register_operand" "=f,f")
3602         (float_extend:TF (match_operand:SF 1 "nonimmediate_operand" "f,R")))]
3603   "TARGET_HARD_FLOAT && TARGET_IEEE_FLOAT"
3604   "@
3605    lxebr\t%0,%1
3606    lxeb\t%0,%1"
3607   [(set_attr "op_type"  "RRE,RXE")
3608    (set_attr "type"   "fsimptf, floadtf")])
3610 (define_insn "*extendsftf2_ibm"
3611   [(set (match_operand:TF 0 "register_operand" "=f,f")
3612         (float_extend:TF (match_operand:SF 1 "nonimmediate_operand" "f,R")))]
3613   "TARGET_HARD_FLOAT && TARGET_IBM_FLOAT"
3614   "@
3615    lxer\t%0,%1
3616    lxe\t%0,%1"
3617   [(set_attr "op_type"  "RRE,RXE")
3618    (set_attr "type"   "fsimptf, floadtf")])
3622 ;; ARITHMETIC OPERATIONS
3624 ;  arithmetic operations set the ConditionCode,
3625 ;  because of unpredictable Bits in Register for Halfword and Byte
3626 ;  the ConditionCode can be set wrong in operations for Halfword and Byte
3629 ;;- Add instructions.
3633 ; addti3 instruction pattern(s).
3636 (define_insn_and_split "addti3"
3637   [(set (match_operand:TI 0 "register_operand" "=&d")
3638         (plus:TI (match_operand:TI 1 "nonimmediate_operand" "%0")
3639                  (match_operand:TI 2 "general_operand" "do") ) )
3640    (clobber (reg:CC CC_REGNUM))]
3641   "TARGET_64BIT"
3642   "#"
3643   "&& reload_completed"
3644   [(parallel
3645     [(set (reg:CCL1 CC_REGNUM)
3646           (compare:CCL1 (plus:DI (match_dup 7) (match_dup 8))
3647                         (match_dup 7)))
3648      (set (match_dup 6) (plus:DI (match_dup 7) (match_dup 8)))])
3649    (parallel
3650     [(set (match_dup 3) (plus:DI (plus:DI (match_dup 4) (match_dup 5))
3651                                  (ltu:DI (reg:CCL1 CC_REGNUM) (const_int 0))))
3652      (clobber (reg:CC CC_REGNUM))])]
3653   "operands[3] = operand_subword (operands[0], 0, 0, TImode);
3654    operands[4] = operand_subword (operands[1], 0, 0, TImode);
3655    operands[5] = operand_subword (operands[2], 0, 0, TImode);
3656    operands[6] = operand_subword (operands[0], 1, 0, TImode);
3657    operands[7] = operand_subword (operands[1], 1, 0, TImode);
3658    operands[8] = operand_subword (operands[2], 1, 0, TImode);")
3661 ; adddi3 instruction pattern(s).
3664 (define_insn "*adddi3_sign"
3665   [(set (match_operand:DI 0 "register_operand" "=d,d")
3666         (plus:DI (sign_extend:DI (match_operand:SI 2 "general_operand" "d,m"))
3667                  (match_operand:DI 1 "register_operand" "0,0")))
3668    (clobber (reg:CC CC_REGNUM))]
3669   "TARGET_64BIT"
3670   "@
3671    agfr\t%0,%2
3672    agf\t%0,%2"
3673   [(set_attr "op_type"  "RRE,RXY")])
3675 (define_insn "*adddi3_zero_cc"
3676   [(set (reg CC_REGNUM)
3677         (compare (plus:DI (zero_extend:DI (match_operand:SI 2 "general_operand" "d,m"))
3678                           (match_operand:DI 1 "register_operand" "0,0"))
3679                  (const_int 0)))
3680    (set (match_operand:DI 0 "register_operand" "=d,d")
3681         (plus:DI (zero_extend:DI (match_dup 2)) (match_dup 1)))]
3682   "s390_match_ccmode (insn, CCLmode) && TARGET_64BIT"
3683   "@
3684    algfr\t%0,%2
3685    algf\t%0,%2"
3686   [(set_attr "op_type"  "RRE,RXY")])
3688 (define_insn "*adddi3_zero_cconly"
3689   [(set (reg CC_REGNUM)
3690         (compare (plus:DI (zero_extend:DI (match_operand:SI 2 "general_operand" "d,m"))
3691                           (match_operand:DI 1 "register_operand" "0,0"))
3692                  (const_int 0)))
3693    (clobber (match_scratch:DI 0 "=d,d"))]
3694   "s390_match_ccmode (insn, CCLmode) && TARGET_64BIT"
3695   "@
3696    algfr\t%0,%2
3697    algf\t%0,%2"
3698   [(set_attr "op_type"  "RRE,RXY")])
3700 (define_insn "*adddi3_zero"
3701   [(set (match_operand:DI 0 "register_operand" "=d,d")
3702         (plus:DI (zero_extend:DI (match_operand:SI 2 "general_operand" "d,m"))
3703                  (match_operand:DI 1 "register_operand" "0,0")))
3704    (clobber (reg:CC CC_REGNUM))]
3705   "TARGET_64BIT"
3706   "@
3707    algfr\t%0,%2
3708    algf\t%0,%2"
3709   [(set_attr "op_type"  "RRE,RXY")])
3711 (define_insn "*adddi3_imm_cc"
3712   [(set (reg CC_REGNUM)
3713         (compare (plus:DI (match_operand:DI 1 "nonimmediate_operand" "0,0")
3714                           (match_operand:DI 2 "const_int_operand" "K,Os"))
3715                  (const_int 0)))
3716    (set (match_operand:DI 0 "register_operand" "=d,d")
3717         (plus:DI (match_dup 1) (match_dup 2)))]
3718   "TARGET_64BIT
3719    && s390_match_ccmode (insn, CCAmode)
3720    && (CONST_OK_FOR_CONSTRAINT_P (INTVAL (operands[2]), 'K', \"K\")
3721        || CONST_OK_FOR_CONSTRAINT_P (INTVAL (operands[2]), 'O', \"Os\"))"
3722   "@
3723    aghi\t%0,%h2
3724    agfi\t%0,%2"
3725   [(set_attr "op_type"  "RI,RIL")])
3727 (define_insn "*adddi3_carry1_cc"
3728   [(set (reg CC_REGNUM)
3729         (compare (plus:DI (match_operand:DI 1 "nonimmediate_operand" "%0,0,0,0")
3730                           (match_operand:DI 2 "general_operand" "d,Op,On,m"))
3731                  (match_dup 1)))
3732    (set (match_operand:DI 0 "register_operand" "=d,d,d,d")
3733         (plus:DI (match_dup 1) (match_dup 2)))]
3734   "s390_match_ccmode (insn, CCL1mode) && TARGET_64BIT"
3735   "@
3736    algr\t%0,%2
3737    algfi\t%0,%2
3738    slgfi\t%0,%n2
3739    alg\t%0,%2"
3740   [(set_attr "op_type"  "RRE,RIL,RIL,RXY")])
3742 (define_insn "*adddi3_carry1_cconly"
3743   [(set (reg CC_REGNUM)
3744         (compare (plus:DI (match_operand:DI 1 "nonimmediate_operand" "%0,0")
3745                           (match_operand:DI 2 "general_operand" "d,m"))
3746                  (match_dup 1)))
3747    (clobber (match_scratch:DI 0 "=d,d"))]
3748   "s390_match_ccmode (insn, CCL1mode) && TARGET_64BIT"
3749   "@
3750    algr\t%0,%2
3751    alg\t%0,%2"
3752   [(set_attr "op_type"  "RRE,RXY")])
3754 (define_insn "*adddi3_carry2_cc"
3755   [(set (reg CC_REGNUM)
3756         (compare (plus:DI (match_operand:DI 1 "nonimmediate_operand" "%0,0,0,0")
3757                           (match_operand:DI 2 "general_operand" "d,Op,On,m"))
3758                  (match_dup 2)))
3759    (set (match_operand:DI 0 "register_operand" "=d,d,d,d")
3760         (plus:DI (match_dup 1) (match_dup 2)))]
3761   "s390_match_ccmode (insn, CCL1mode) && TARGET_64BIT"
3762   "@
3763    algr\t%0,%2
3764    algfi\t%0,%2
3765    slgfi\t%0,%n2
3766    alg\t%0,%2"
3767   [(set_attr "op_type"  "RRE,RIL,RIL,RXY")])
3769 (define_insn "*adddi3_carry2_cconly"
3770   [(set (reg CC_REGNUM)
3771         (compare (plus:DI (match_operand:DI 1 "nonimmediate_operand" "%0,0")
3772                           (match_operand:DI 2 "general_operand" "d,m"))
3773                  (match_dup 2)))
3774    (clobber (match_scratch:DI 0 "=d,d"))]
3775   "s390_match_ccmode (insn, CCL1mode) && TARGET_64BIT"
3776   "@
3777    algr\t%0,%2
3778    alg\t%0,%2"
3779   [(set_attr "op_type"  "RRE,RXY")])
3781 (define_insn "*adddi3_cc"
3782   [(set (reg CC_REGNUM)
3783         (compare (plus:DI (match_operand:DI 1 "nonimmediate_operand" "%0,0,0,0")
3784                           (match_operand:DI 2 "general_operand" "d,Op,On,m"))
3785                  (const_int 0)))
3786    (set (match_operand:DI 0 "register_operand" "=d,d,d,d")
3787         (plus:DI (match_dup 1) (match_dup 2)))]
3788   "s390_match_ccmode (insn, CCLmode) && TARGET_64BIT"
3789   "@
3790    algr\t%0,%2
3791    algfi\t%0,%2
3792    slgfi\t%0,%n2
3793    alg\t%0,%2"
3794   [(set_attr "op_type"  "RRE,RIL,RIL,RXY")])
3796 (define_insn "*adddi3_cconly"
3797   [(set (reg CC_REGNUM)
3798         (compare (plus:DI (match_operand:DI 1 "nonimmediate_operand" "%0,0")
3799                           (match_operand:DI 2 "general_operand" "d,m"))
3800                  (const_int 0)))
3801    (clobber (match_scratch:DI 0 "=d,d"))]
3802   "s390_match_ccmode (insn, CCLmode) && TARGET_64BIT"
3803   "@
3804    algr\t%0,%2
3805    alg\t%0,%2"
3806   [(set_attr "op_type"  "RRE,RXY")])
3808 (define_insn "*adddi3_cconly2"
3809   [(set (reg CC_REGNUM)
3810         (compare (match_operand:DI 1 "nonimmediate_operand" "%0,0")
3811                  (neg:SI (match_operand:DI 2 "general_operand" "d,m"))))
3812    (clobber (match_scratch:DI 0 "=d,d"))]
3813   "s390_match_ccmode(insn, CCLmode) && TARGET_64BIT"
3814   "@
3815    algr\t%0,%2
3816    alg\t%0,%2"
3817   [(set_attr "op_type"  "RRE,RXY")])
3819 (define_insn "*adddi3_64"
3820   [(set (match_operand:DI 0 "register_operand" "=d,d,d,d,d")
3821         (plus:DI (match_operand:DI 1 "nonimmediate_operand" "%0,0,0,0,0")
3822                  (match_operand:DI 2 "general_operand" "d,K,Op,On,m") ) )
3823    (clobber (reg:CC CC_REGNUM))]
3824   "TARGET_64BIT"
3825   "@
3826    agr\t%0,%2
3827    aghi\t%0,%h2
3828    algfi\t%0,%2
3829    slgfi\t%0,%n2
3830    ag\t%0,%2"
3831   [(set_attr "op_type"  "RRE,RI,RIL,RIL,RXY")])
3833 (define_insn_and_split "*adddi3_31z"
3834   [(set (match_operand:DI 0 "register_operand" "=&d")
3835         (plus:DI (match_operand:DI 1 "nonimmediate_operand" "%0")
3836                  (match_operand:DI 2 "general_operand" "do") ) )
3837    (clobber (reg:CC CC_REGNUM))]
3838   "!TARGET_64BIT && TARGET_CPU_ZARCH"
3839   "#"
3840   "&& reload_completed"
3841   [(parallel
3842     [(set (reg:CCL1 CC_REGNUM)
3843           (compare:CCL1 (plus:SI (match_dup 7) (match_dup 8))
3844                         (match_dup 7)))
3845      (set (match_dup 6) (plus:SI (match_dup 7) (match_dup 8)))])
3846    (parallel
3847     [(set (match_dup 3) (plus:SI (plus:SI (match_dup 4) (match_dup 5))
3848                                  (ltu:SI (reg:CCL1 CC_REGNUM) (const_int 0))))
3849      (clobber (reg:CC CC_REGNUM))])]
3850   "operands[3] = operand_subword (operands[0], 0, 0, DImode);
3851    operands[4] = operand_subword (operands[1], 0, 0, DImode);
3852    operands[5] = operand_subword (operands[2], 0, 0, DImode);
3853    operands[6] = operand_subword (operands[0], 1, 0, DImode);
3854    operands[7] = operand_subword (operands[1], 1, 0, DImode);
3855    operands[8] = operand_subword (operands[2], 1, 0, DImode);")
3857 (define_insn_and_split "*adddi3_31"
3858   [(set (match_operand:DI 0 "register_operand" "=&d")
3859         (plus:DI (match_operand:DI 1 "nonimmediate_operand" "%0")
3860                  (match_operand:DI 2 "general_operand" "do") ) )
3861    (clobber (reg:CC CC_REGNUM))]
3862   "!TARGET_CPU_ZARCH"
3863   "#"
3864   "&& reload_completed"
3865   [(parallel
3866     [(set (match_dup 3) (plus:SI (match_dup 4) (match_dup 5)))
3867      (clobber (reg:CC CC_REGNUM))])
3868    (parallel
3869     [(set (reg:CCL1 CC_REGNUM)
3870           (compare:CCL1 (plus:SI (match_dup 7) (match_dup 8))
3871                         (match_dup 7)))
3872      (set (match_dup 6) (plus:SI (match_dup 7) (match_dup 8)))])
3873    (set (pc)
3874         (if_then_else (ltu (reg:CCL1 CC_REGNUM) (const_int 0))
3875                       (pc)
3876                       (label_ref (match_dup 9))))
3877    (parallel
3878     [(set (match_dup 3) (plus:SI (match_dup 3) (const_int 1)))
3879      (clobber (reg:CC CC_REGNUM))])
3880    (match_dup 9)]
3881   "operands[3] = operand_subword (operands[0], 0, 0, DImode);
3882    operands[4] = operand_subword (operands[1], 0, 0, DImode);
3883    operands[5] = operand_subword (operands[2], 0, 0, DImode);
3884    operands[6] = operand_subword (operands[0], 1, 0, DImode);
3885    operands[7] = operand_subword (operands[1], 1, 0, DImode);
3886    operands[8] = operand_subword (operands[2], 1, 0, DImode);
3887    operands[9] = gen_label_rtx ();")
3889 (define_expand "adddi3"
3890   [(parallel
3891     [(set (match_operand:DI 0 "register_operand" "")
3892           (plus:DI (match_operand:DI 1 "nonimmediate_operand" "")
3893                    (match_operand:DI 2 "general_operand" "")))
3894      (clobber (reg:CC CC_REGNUM))])]
3895   ""
3896   "")
3899 ; addsi3 instruction pattern(s).
3902 (define_insn "*addsi3_imm_cc"
3903   [(set (reg CC_REGNUM)
3904         (compare (plus:SI (match_operand:SI 1 "nonimmediate_operand" "0,0")
3905                           (match_operand:SI 2 "const_int_operand" "K,Os"))
3906                  (const_int 0)))
3907    (set (match_operand:SI 0 "register_operand" "=d,d")
3908         (plus:SI (match_dup 1) (match_dup 2)))]
3909   "s390_match_ccmode (insn, CCAmode)
3910    && (CONST_OK_FOR_CONSTRAINT_P (INTVAL (operands[2]), 'K', \"K\")
3911        || CONST_OK_FOR_CONSTRAINT_P (INTVAL (operands[2]), 'O', \"Os\"))
3912    && INTVAL (operands[2]) != -((HOST_WIDE_INT)1 << 31)"
3913   "@
3914    ahi\t%0,%h2
3915    afi\t%0,%2"
3916   [(set_attr "op_type"  "RI,RIL")])
3918 (define_insn "*addsi3_carry1_cc"
3919   [(set (reg CC_REGNUM)
3920         (compare (plus:SI (match_operand:SI 1 "nonimmediate_operand" "%0,0,0,0")
3921                           (match_operand:SI 2 "general_operand" "d,Os,R,T"))
3922                  (match_dup 1)))
3923    (set (match_operand:SI 0 "register_operand" "=d,d,d,d")
3924         (plus:SI (match_dup 1) (match_dup 2)))]
3925   "s390_match_ccmode (insn, CCL1mode)"
3926   "@
3927    alr\t%0,%2
3928    alfi\t%0,%o2
3929    al\t%0,%2
3930    aly\t%0,%2"
3931   [(set_attr "op_type"  "RR,RIL,RX,RXY")])
3933 (define_insn "*addsi3_carry1_cconly"
3934   [(set (reg CC_REGNUM)
3935         (compare (plus:SI (match_operand:SI 1 "nonimmediate_operand" "%0,0,0")
3936                           (match_operand:SI 2 "general_operand" "d,R,T"))
3937                  (match_dup 1)))
3938    (clobber (match_scratch:SI 0 "=d,d,d"))]
3939   "s390_match_ccmode (insn, CCL1mode)"
3940   "@
3941    alr\t%0,%2
3942    al\t%0,%2
3943    aly\t%0,%2"
3944   [(set_attr "op_type"  "RR,RX,RXY")])
3946 (define_insn "*addsi3_carry2_cc"
3947   [(set (reg CC_REGNUM)
3948         (compare (plus:SI (match_operand:SI 1 "nonimmediate_operand" "%0,0,0,0")
3949                           (match_operand:SI 2 "general_operand" "d,Os,R,T"))
3950                  (match_dup 2)))
3951    (set (match_operand:SI 0 "register_operand" "=d,d,d,d")
3952         (plus:SI (match_dup 1) (match_dup 2)))]
3953   "s390_match_ccmode (insn, CCL1mode)"
3954   "@
3955    alr\t%0,%2
3956    alfi\t%0,%o2
3957    al\t%0,%2
3958    aly\t%0,%2"
3959   [(set_attr "op_type"  "RR,RIL,RX,RXY")])
3961 (define_insn "*addsi3_carry2_cconly"
3962   [(set (reg CC_REGNUM)
3963         (compare (plus:SI (match_operand:SI 1 "nonimmediate_operand" "%0,0,0")
3964                           (match_operand:SI 2 "general_operand" "d,R,T"))
3965                  (match_dup 2)))
3966    (clobber (match_scratch:SI 0 "=d,d,d"))]
3967   "s390_match_ccmode (insn, CCL1mode)"
3968   "@
3969    alr\t%0,%2
3970    al\t%0,%2
3971    aly\t%0,%2"
3972   [(set_attr "op_type"  "RR,RX,RXY")])
3974 (define_insn "*addsi3_cc"
3975   [(set (reg CC_REGNUM)
3976         (compare (plus:SI (match_operand:SI 1 "nonimmediate_operand" "%0,0,0,0")
3977                           (match_operand:SI 2 "general_operand" "d,Os,R,T"))
3978                  (const_int 0)))
3979    (set (match_operand:SI 0 "register_operand" "=d,d,d,d")
3980         (plus:SI (match_dup 1) (match_dup 2)))]
3981   "s390_match_ccmode (insn, CCLmode)"
3982   "@
3983    alr\t%0,%2
3984    alfi\t%0,%o2
3985    al\t%0,%2
3986    aly\t%0,%2"
3987   [(set_attr "op_type"  "RR,RIL,RX,RXY")])
3989 (define_insn "*addsi3_cconly"
3990   [(set (reg CC_REGNUM)
3991         (compare (plus:SI (match_operand:SI 1 "nonimmediate_operand" "%0,0,0")
3992                           (match_operand:SI 2 "general_operand" "d,R,T"))
3993                  (const_int 0)))
3994    (clobber (match_scratch:SI 0 "=d,d,d"))]
3995   "s390_match_ccmode (insn, CCLmode)"
3996   "@
3997    alr\t%0,%2
3998    al\t%0,%2
3999    aly\t%0,%2"
4000   [(set_attr "op_type"  "RR,RX,RXY")])
4002 (define_insn "*addsi3_cconly2"
4003   [(set (reg CC_REGNUM)
4004         (compare (match_operand:SI 1 "nonimmediate_operand" "%0,0,0")
4005                  (neg:SI (match_operand:SI 2 "general_operand" "d,R,T"))))
4006    (clobber (match_scratch:SI 0 "=d,d,d"))]
4007   "s390_match_ccmode (insn, CCLmode)"
4008   "@
4009    alr\t%0,%2
4010    al\t%0,%2
4011    aly\t%0,%2"
4012   [(set_attr "op_type"  "RR,RX,RXY")])
4014 (define_insn "*addsi3_sign"
4015   [(set (match_operand:SI 0 "register_operand" "=d,d")
4016         (plus:SI (sign_extend:SI (match_operand:HI 2 "memory_operand" "R,T"))
4017                  (match_operand:SI 1 "register_operand" "0,0")))
4018    (clobber (reg:CC CC_REGNUM))]
4019   ""
4020   "@
4021    ah\t%0,%2
4022    ahy\t%0,%2"
4023   [(set_attr "op_type"  "RX,RXY")])
4025 (define_insn "addsi3"
4026   [(set (match_operand:SI 0 "register_operand" "=d,d,d,d,d")
4027         (plus:SI (match_operand:SI 1 "nonimmediate_operand" "%0,0,0,0,0")
4028                  (match_operand:SI 2 "general_operand" "d,K,Os,R,T")))
4029    (clobber (reg:CC CC_REGNUM))]
4030   ""
4031   "@
4032    ar\t%0,%2
4033    ahi\t%0,%h2
4034    afi\t%0,%2
4035    a\t%0,%2
4036    ay\t%0,%2"
4037   [(set_attr "op_type"  "RR,RI,RIL,RX,RXY")])
4040 ; add(df|sf)3 instruction pattern(s).
4043 (define_expand "add<mode>3"
4044   [(parallel
4045     [(set (match_operand:FPR 0 "register_operand" "=f,f")
4046           (plus:FPR (match_operand:FPR 1 "nonimmediate_operand" "%0,0")
4047                     (match_operand:FPR 2 "general_operand" "f,<Rf>")))
4048      (clobber (reg:CC CC_REGNUM))])]
4049   "TARGET_HARD_FLOAT"
4050   "")
4052 (define_insn "*add<mode>3"
4053   [(set (match_operand:FPR 0 "register_operand" "=f,f")
4054         (plus:FPR (match_operand:FPR 1 "nonimmediate_operand" "%0,0")
4055                   (match_operand:FPR 2 "general_operand" "f,<Rf>")))
4056    (clobber (reg:CC CC_REGNUM))]
4057   "TARGET_HARD_FLOAT && TARGET_IEEE_FLOAT"
4058   "@
4059    a<xde>br\t%0,%2
4060    a<xde>b\t%0,%2"
4061   [(set_attr "op_type"  "RRE,RXE")
4062    (set_attr "type"     "fsimp<mode>")])
4064 (define_insn "*add<mode>3_cc"
4065   [(set (reg CC_REGNUM)
4066         (compare (plus:FPR (match_operand:FPR 1 "nonimmediate_operand" "%0,0")
4067                            (match_operand:FPR 2 "general_operand" "f,<Rf>"))
4068                  (match_operand:FPR 3 "const0_operand" "")))
4069    (set (match_operand:FPR 0 "register_operand" "=f,f")
4070         (plus:FPR (match_dup 1) (match_dup 2)))]
4071   "s390_match_ccmode (insn, CCSmode) && TARGET_HARD_FLOAT && TARGET_IEEE_FLOAT"
4072   "@
4073    a<xde>br\t%0,%2
4074    a<xde>b\t%0,%2"
4075   [(set_attr "op_type"  "RRE,RXE")
4076    (set_attr "type"     "fsimp<mode>")])
4078 (define_insn "*add<mode>3_cconly"
4079   [(set (reg CC_REGNUM)
4080         (compare (plus:FPR (match_operand:FPR 1 "nonimmediate_operand" "%0,0")
4081                            (match_operand:FPR 2 "general_operand" "f,<Rf>"))
4082                  (match_operand:FPR 3 "const0_operand" "")))
4083    (clobber (match_scratch:FPR 0 "=f,f"))]
4084   "s390_match_ccmode (insn, CCSmode) && TARGET_HARD_FLOAT && TARGET_IEEE_FLOAT"
4085   "@
4086    a<xde>br\t%0,%2
4087    a<xde>b\t%0,%2"
4088   [(set_attr "op_type"  "RRE,RXE")
4089    (set_attr "type"     "fsimp<mode>")])
4091 (define_insn "*add<mode>3_ibm"
4092   [(set (match_operand:FPR 0 "register_operand" "=f,f")
4093         (plus:FPR (match_operand:FPR 1 "nonimmediate_operand" "%0,0")
4094                   (match_operand:FPR 2 "general_operand" "f,<Rf>")))
4095    (clobber (reg:CC CC_REGNUM))]
4096   "TARGET_HARD_FLOAT && TARGET_IBM_FLOAT"
4097   "@
4098    a<xde>r\t%0,%2
4099    a<xde>\t%0,%2"
4100   [(set_attr "op_type"  "<RRe>,<RXe>")
4101    (set_attr "type"     "fsimp<mode>")])
4105 ;;- Subtract instructions.
4109 ; subti3 instruction pattern(s).
4112 (define_insn_and_split "subti3"
4113   [(set (match_operand:TI 0 "register_operand" "=&d")
4114         (minus:TI (match_operand:TI 1 "register_operand" "0")
4115                   (match_operand:TI 2 "general_operand" "do") ) )
4116    (clobber (reg:CC CC_REGNUM))]
4117   "TARGET_64BIT"
4118   "#"
4119   "&& reload_completed"
4120   [(parallel
4121     [(set (reg:CCL2 CC_REGNUM)
4122           (compare:CCL2 (minus:DI (match_dup 7) (match_dup 8))
4123                         (match_dup 7)))
4124      (set (match_dup 6) (minus:DI (match_dup 7) (match_dup 8)))])
4125    (parallel
4126     [(set (match_dup 3) (minus:DI (minus:DI (match_dup 4) (match_dup 5))
4127                                   (gtu:DI (reg:CCL2 CC_REGNUM) (const_int 0))))
4128      (clobber (reg:CC CC_REGNUM))])]
4129   "operands[3] = operand_subword (operands[0], 0, 0, TImode);
4130    operands[4] = operand_subword (operands[1], 0, 0, TImode);
4131    operands[5] = operand_subword (operands[2], 0, 0, TImode);
4132    operands[6] = operand_subword (operands[0], 1, 0, TImode);
4133    operands[7] = operand_subword (operands[1], 1, 0, TImode);
4134    operands[8] = operand_subword (operands[2], 1, 0, TImode);")
4137 ; subdi3 instruction pattern(s).
4140 (define_insn "*subdi3_sign"
4141   [(set (match_operand:DI 0 "register_operand" "=d,d")
4142         (minus:DI (match_operand:DI 1 "register_operand" "0,0")
4143                   (sign_extend:DI (match_operand:SI 2 "general_operand" "d,m"))))
4144    (clobber (reg:CC CC_REGNUM))]
4145   "TARGET_64BIT"
4146   "@
4147    sgfr\t%0,%2
4148    sgf\t%0,%2"
4149   [(set_attr "op_type"  "RRE,RXY")])
4151 (define_insn "*subdi3_zero_cc"
4152   [(set (reg CC_REGNUM)
4153         (compare (minus:DI (match_operand:DI 1 "register_operand" "0,0")
4154                            (zero_extend:DI (match_operand:SI 2 "general_operand" "d,m")))
4155                  (const_int 0)))
4156    (set (match_operand:DI 0 "register_operand" "=d,d")
4157         (minus:DI (match_dup 1) (zero_extend:DI (match_dup 2))))]
4158   "s390_match_ccmode (insn, CCLmode) && TARGET_64BIT"
4159   "@
4160    slgfr\t%0,%2
4161    slgf\t%0,%2"
4162   [(set_attr "op_type"  "RRE,RXY")])
4164 (define_insn "*subdi3_zero_cconly"
4165   [(set (reg CC_REGNUM)
4166         (compare (minus:DI (match_operand:DI 1 "register_operand" "0,0")
4167                            (zero_extend:DI (match_operand:SI 2 "general_operand" "d,m")))
4168                  (const_int 0)))
4169    (clobber (match_scratch:DI 0 "=d,d"))]
4170   "s390_match_ccmode (insn, CCLmode) && TARGET_64BIT"
4171   "@
4172    slgfr\t%0,%2
4173    slgf\t%0,%2"
4174   [(set_attr "op_type"  "RRE,RXY")])
4176 (define_insn "*subdi3_zero"
4177   [(set (match_operand:DI 0 "register_operand" "=d,d")
4178         (minus:DI (match_operand:DI 1 "register_operand" "0,0")
4179                   (zero_extend:DI (match_operand:SI 2 "general_operand" "d,m"))))
4180    (clobber (reg:CC CC_REGNUM))]
4181   "TARGET_64BIT"
4182   "@
4183    slgfr\t%0,%2
4184    slgf\t%0,%2"
4185   [(set_attr "op_type"  "RRE,RXY")])
4187 (define_insn "*subdi3_borrow_cc"
4188   [(set (reg CC_REGNUM)
4189         (compare (minus:DI (match_operand:DI 1 "register_operand" "0,0")
4190                            (match_operand:DI 2 "general_operand" "d,m"))
4191                  (match_dup 1)))
4192    (set (match_operand:DI 0 "register_operand" "=d,d")
4193         (minus:DI (match_dup 1) (match_dup 2)))]
4194   "s390_match_ccmode (insn, CCL2mode) && TARGET_64BIT"
4195   "@
4196    slgr\t%0,%2
4197    slg\t%0,%2"
4198   [(set_attr "op_type"  "RRE,RXY")])
4200 (define_insn "*subdi3_borrow_cconly"
4201   [(set (reg CC_REGNUM)
4202         (compare (minus:DI (match_operand:DI 1 "register_operand" "0,0")
4203                            (match_operand:DI 2 "general_operand" "d,m"))
4204                  (match_dup 1)))
4205    (clobber (match_scratch:DI 0 "=d,d"))]
4206   "s390_match_ccmode (insn, CCL2mode) && TARGET_64BIT"
4207   "@
4208    slgr\t%0,%2
4209    slg\t%0,%2"
4210   [(set_attr "op_type"  "RRE,RXY")])
4212 (define_insn "*subdi3_cc"
4213   [(set (reg CC_REGNUM)
4214         (compare (minus:DI (match_operand:DI 1 "register_operand" "0,0")
4215                            (match_operand:DI 2 "general_operand" "d,m"))
4216                  (const_int 0)))
4217    (set (match_operand:DI 0 "register_operand" "=d,d")
4218         (minus:DI (match_dup 1) (match_dup 2)))]
4219   "s390_match_ccmode (insn, CCLmode) && TARGET_64BIT"
4220   "@
4221    slgr\t%0,%2
4222    slg\t%0,%2"
4223   [(set_attr "op_type"  "RRE,RXY")])
4225 (define_insn "*subdi3_cc2"
4226   [(set (reg CC_REGNUM)
4227         (compare (match_operand:DI 1 "register_operand" "0,0")
4228                  (match_operand:DI 2 "general_operand" "d,m")))
4229    (set (match_operand:DI 0 "register_operand" "=d,d")
4230         (minus:DI (match_dup 1) (match_dup 2)))]
4231   "s390_match_ccmode (insn, CCL3mode) && TARGET_64BIT"
4232   "@
4233    slgr\t%0,%2
4234    slg\t%0,%2"
4235   [(set_attr "op_type"  "RRE,RXY")])
4237 (define_insn "*subdi3_cconly"
4238   [(set (reg CC_REGNUM)
4239         (compare (minus:DI (match_operand:DI 1 "register_operand" "0,0")
4240                            (match_operand:DI 2 "general_operand" "d,m"))
4241                  (const_int 0)))
4242    (clobber (match_scratch:DI 0 "=d,d"))]
4243   "s390_match_ccmode (insn, CCLmode) && TARGET_64BIT"
4244   "@
4245    slgr\t%0,%2
4246    slg\t%0,%2"
4247   [(set_attr "op_type"  "RRE,RXY")])
4249 (define_insn "*subdi3_cconly2"
4250   [(set (reg CC_REGNUM)
4251         (compare (match_operand:DI 1 "register_operand" "0,0")
4252                  (match_operand:DI 2 "general_operand" "d,m")))
4253    (clobber (match_scratch:DI 0 "=d,d"))]
4254   "s390_match_ccmode (insn, CCL3mode) && TARGET_64BIT"
4255   "@
4256    slgr\t%0,%2
4257    slg\t%0,%2"
4258   [(set_attr "op_type"  "RRE,RXY")])
4260 (define_insn "*subdi3_64"
4261   [(set (match_operand:DI 0 "register_operand" "=d,d")
4262         (minus:DI (match_operand:DI 1 "register_operand" "0,0")
4263                   (match_operand:DI 2 "general_operand" "d,m") ) )
4264    (clobber (reg:CC CC_REGNUM))]
4265   "TARGET_64BIT"
4266   "@
4267    sgr\t%0,%2
4268    sg\t%0,%2"
4269   [(set_attr "op_type"  "RRE,RRE")])
4271 (define_insn_and_split "*subdi3_31z"
4272   [(set (match_operand:DI 0 "register_operand" "=&d")
4273         (minus:DI (match_operand:DI 1 "register_operand" "0")
4274                   (match_operand:DI 2 "general_operand" "do") ) )
4275    (clobber (reg:CC CC_REGNUM))]
4276   "!TARGET_64BIT && TARGET_CPU_ZARCH"
4277   "#"
4278   "&& reload_completed"
4279   [(parallel
4280     [(set (reg:CCL2 CC_REGNUM)
4281           (compare:CCL2 (minus:SI (match_dup 7) (match_dup 8))
4282                         (match_dup 7)))
4283      (set (match_dup 6) (minus:SI (match_dup 7) (match_dup 8)))])
4284    (parallel
4285     [(set (match_dup 3) (minus:SI (minus:SI (match_dup 4) (match_dup 5))
4286                                   (gtu:SI (reg:CCL2 CC_REGNUM) (const_int 0))))
4287      (clobber (reg:CC CC_REGNUM))])]
4288   "operands[3] = operand_subword (operands[0], 0, 0, DImode);
4289    operands[4] = operand_subword (operands[1], 0, 0, DImode);
4290    operands[5] = operand_subword (operands[2], 0, 0, DImode);
4291    operands[6] = operand_subword (operands[0], 1, 0, DImode);
4292    operands[7] = operand_subword (operands[1], 1, 0, DImode);
4293    operands[8] = operand_subword (operands[2], 1, 0, DImode);")
4295 (define_insn_and_split "*subdi3_31"
4296   [(set (match_operand:DI 0 "register_operand" "=&d")
4297         (minus:DI (match_operand:DI 1 "register_operand" "0")
4298                   (match_operand:DI 2 "general_operand" "do") ) )
4299    (clobber (reg:CC CC_REGNUM))]
4300   "!TARGET_CPU_ZARCH"
4301   "#"
4302   "&& reload_completed"
4303   [(parallel
4304     [(set (match_dup 3) (minus:SI (match_dup 4) (match_dup 5)))
4305      (clobber (reg:CC CC_REGNUM))])
4306    (parallel
4307     [(set (reg:CCL2 CC_REGNUM)
4308           (compare:CCL2 (minus:SI (match_dup 7) (match_dup 8))
4309                         (match_dup 7)))
4310      (set (match_dup 6) (minus:SI (match_dup 7) (match_dup 8)))])
4311    (set (pc)
4312         (if_then_else (gtu (reg:CCL2 CC_REGNUM) (const_int 0))
4313                       (pc)
4314                       (label_ref (match_dup 9))))
4315    (parallel
4316     [(set (match_dup 3) (plus:SI (match_dup 3) (const_int -1)))
4317      (clobber (reg:CC CC_REGNUM))])
4318    (match_dup 9)]
4319   "operands[3] = operand_subword (operands[0], 0, 0, DImode);
4320    operands[4] = operand_subword (operands[1], 0, 0, DImode);
4321    operands[5] = operand_subword (operands[2], 0, 0, DImode);
4322    operands[6] = operand_subword (operands[0], 1, 0, DImode);
4323    operands[7] = operand_subword (operands[1], 1, 0, DImode);
4324    operands[8] = operand_subword (operands[2], 1, 0, DImode);
4325    operands[9] = gen_label_rtx ();")
4327 (define_expand "subdi3"
4328   [(parallel
4329     [(set (match_operand:DI 0 "register_operand" "")
4330           (minus:DI (match_operand:DI 1 "register_operand" "")
4331                     (match_operand:DI 2 "general_operand" "")))
4332      (clobber (reg:CC CC_REGNUM))])]
4333   ""
4334   "")
4337 ; subsi3 instruction pattern(s).
4340 (define_insn "*subsi3_borrow_cc"
4341   [(set (reg CC_REGNUM)
4342         (compare (minus:SI (match_operand:SI 1 "register_operand" "0,0,0")
4343                            (match_operand:SI 2 "general_operand" "d,R,T"))
4344                  (match_dup 1)))
4345    (set (match_operand:SI 0 "register_operand" "=d,d,d")
4346         (minus:SI (match_dup 1) (match_dup 2)))]
4347   "s390_match_ccmode (insn, CCL2mode)"
4348   "@
4349    slr\t%0,%2
4350    sl\t%0,%2
4351    sly\t%0,%2"
4352   [(set_attr "op_type"  "RR,RX,RXY")])
4354 (define_insn "*subsi3_borrow_cconly"
4355   [(set (reg CC_REGNUM)
4356         (compare (minus:SI (match_operand:SI 1 "register_operand" "0,0,0")
4357                            (match_operand:SI 2 "general_operand" "d,R,T"))
4358                  (match_dup 1)))
4359    (clobber (match_scratch:SI 0 "=d,d,d"))]
4360   "s390_match_ccmode (insn, CCL2mode)"
4361   "@
4362    slr\t%0,%2
4363    sl\t%0,%2
4364    sly\t%0,%2"
4365   [(set_attr "op_type"  "RR,RX,RXY")])
4367 (define_insn "*subsi3_cc"
4368   [(set (reg CC_REGNUM)
4369         (compare (minus:SI (match_operand:SI 1 "register_operand" "0,0,0")
4370                            (match_operand:SI 2 "general_operand" "d,R,T"))
4371                  (const_int 0)))
4372    (set (match_operand:SI 0 "register_operand" "=d,d,d")
4373         (minus:SI (match_dup 1) (match_dup 2)))]
4374   "s390_match_ccmode (insn, CCLmode)"
4375   "@
4376    slr\t%0,%2
4377    sl\t%0,%2
4378    sly\t%0,%2"
4379   [(set_attr "op_type"  "RR,RX,RXY")])
4381 (define_insn "*subsi3_cc2"
4382   [(set (reg CC_REGNUM)
4383         (compare (match_operand:SI 1 "register_operand" "0,0,0")
4384                  (match_operand:SI 2 "general_operand" "d,R,T")))
4385    (set (match_operand:SI 0 "register_operand" "=d,d,d")
4386         (minus:SI (match_dup 1) (match_dup 2)))]
4387   "s390_match_ccmode (insn, CCL3mode)"
4388   "@
4389    slr\t%0,%2
4390    sl\t%0,%2
4391    sly\t%0,%2"
4392   [(set_attr "op_type"  "RR,RX,RXY")])
4394 (define_insn "*subsi3_cconly"
4395   [(set (reg CC_REGNUM)
4396         (compare (minus:SI (match_operand:SI 1 "register_operand" "0,0,0")
4397                            (match_operand:SI 2 "general_operand" "d,R,T"))
4398                  (const_int 0)))
4399    (clobber (match_scratch:SI 0 "=d,d,d"))]
4400   "s390_match_ccmode (insn, CCLmode)"
4401   "@
4402    slr\t%0,%2
4403    sl\t%0,%2
4404    sly\t%0,%2"
4405   [(set_attr "op_type"  "RR,RX,RXY")])
4407 (define_insn "*subsi3_cconly2"
4408   [(set (reg CC_REGNUM)
4409         (compare (match_operand:SI 1 "register_operand" "0,0,0")
4410                  (match_operand:SI 2 "general_operand" "d,R,T")))
4411    (clobber (match_scratch:SI 0 "=d,d,d"))]
4412   "s390_match_ccmode (insn, CCL3mode)"
4413   "@
4414    slr\t%0,%2
4415    sl\t%0,%2
4416    sly\t%0,%2"
4417   [(set_attr "op_type"  "RR,RX,RXY")])
4419 (define_insn "*subsi3_sign"
4420   [(set (match_operand:SI 0 "register_operand" "=d,d")
4421         (minus:SI (match_operand:SI 1 "register_operand" "0,0")
4422                   (sign_extend:SI (match_operand:HI 2 "memory_operand" "R,T"))))
4423    (clobber (reg:CC CC_REGNUM))]
4424   ""
4425   "@
4426    sh\t%0,%2
4427    shy\t%0,%2"
4428   [(set_attr "op_type"  "RX,RXY")])
4430 (define_insn "subsi3"
4431   [(set (match_operand:SI 0 "register_operand" "=d,d,d")
4432         (minus:SI (match_operand:SI 1 "register_operand" "0,0,0")
4433                   (match_operand:SI 2 "general_operand" "d,R,T")))
4434    (clobber (reg:CC CC_REGNUM))]
4435   ""
4436   "@
4437    sr\t%0,%2
4438    s\t%0,%2
4439    sy\t%0,%2"
4440   [(set_attr "op_type"  "RR,RX,RXY")])
4444 ; sub(df|sf)3 instruction pattern(s).
4447 (define_expand "sub<mode>3"
4448   [(parallel
4449     [(set (match_operand:FPR 0 "register_operand" "=f,f")
4450           (minus:FPR (match_operand:FPR 1 "register_operand" "0,0")
4451                      (match_operand:FPR 2 "general_operand" "f,R")))
4452      (clobber (reg:CC CC_REGNUM))])]
4453   "TARGET_HARD_FLOAT"
4454   "")
4456 (define_insn "*sub<mode>3"
4457   [(set (match_operand:FPR 0 "register_operand" "=f,f")
4458         (minus:FPR (match_operand:FPR 1 "register_operand" "0,0")
4459                    (match_operand:FPR 2 "general_operand" "f,<Rf>")))
4460    (clobber (reg:CC CC_REGNUM))]
4461   "TARGET_HARD_FLOAT && TARGET_IEEE_FLOAT"
4462   "@
4463    s<xde>br\t%0,%2
4464    s<xde>b\t%0,%2"
4465   [(set_attr "op_type"  "RRE,RXE")
4466    (set_attr "type"     "fsimp<mode>")])
4468 (define_insn "*sub<mode>3_cc"
4469   [(set (reg CC_REGNUM)
4470         (compare (minus:FPR (match_operand:FPR 1 "nonimmediate_operand" "0,0")
4471                             (match_operand:FPR 2 "general_operand" "f,<Rf>"))
4472                  (match_operand:FPR 3 "const0_operand" "")))
4473    (set (match_operand:FPR 0 "register_operand" "=f,f")
4474         (minus:FPR (match_dup 1) (match_dup 2)))]
4475   "s390_match_ccmode (insn, CCSmode) && TARGET_HARD_FLOAT && TARGET_IEEE_FLOAT"
4476   "@
4477    s<xde>br\t%0,%2
4478    s<xde>b\t%0,%2"
4479   [(set_attr "op_type"  "RRE,RXE")
4480    (set_attr "type"     "fsimp<mode>")])
4482 (define_insn "*sub<mode>3_cconly"
4483   [(set (reg CC_REGNUM)
4484         (compare (minus:FPR (match_operand:FPR 1 "nonimmediate_operand" "0,0")
4485                             (match_operand:FPR 2 "general_operand" "f,<Rf>"))
4486                  (match_operand:FPR 3 "const0_operand" "")))
4487    (clobber (match_scratch:FPR 0 "=f,f"))]
4488   "s390_match_ccmode (insn, CCSmode) && TARGET_HARD_FLOAT && TARGET_IEEE_FLOAT"
4489   "@
4490    s<xde>br\t%0,%2
4491    s<xde>b\t%0,%2"
4492   [(set_attr "op_type"  "RRE,RXE")
4493    (set_attr "type"     "fsimp<mode>")])
4495 (define_insn "*sub<mode>3_ibm"
4496   [(set (match_operand:FPR 0 "register_operand" "=f,f")
4497         (minus:FPR (match_operand:FPR 1 "register_operand" "0,0")
4498                    (match_operand:FPR 2 "general_operand" "f,<Rf>")))
4499    (clobber (reg:CC CC_REGNUM))]
4500   "TARGET_HARD_FLOAT && TARGET_IBM_FLOAT"
4501   "@
4502    s<xde>r\t%0,%2
4503    s<xde>\t%0,%2"
4504   [(set_attr "op_type"  "<RRe>,<RXe>")
4505    (set_attr "type"     "fsimp<mode>")])
4509 ;;- Conditional add/subtract instructions.
4513 ; add(di|si)cc instruction pattern(s).
4516 (define_insn "*add<mode>3_alc_cc"
4517   [(set (reg CC_REGNUM)
4518         (compare
4519           (plus:GPR (plus:GPR (match_operand:GPR 1 "nonimmediate_operand" "%0,0")
4520                               (match_operand:GPR 2 "general_operand" "d,m"))
4521                     (match_operand:GPR 3 "s390_alc_comparison" ""))
4522           (const_int 0)))
4523    (set (match_operand:GPR 0 "register_operand" "=d,d")
4524         (plus:GPR (plus:GPR (match_dup 1) (match_dup 2)) (match_dup 3)))]
4525   "s390_match_ccmode (insn, CCLmode) && TARGET_CPU_ZARCH"
4526   "@
4527    alc<g>r\t%0,%2
4528    alc<g>\t%0,%2"
4529   [(set_attr "op_type"  "RRE,RXY")])
4531 (define_insn "*add<mode>3_alc"
4532   [(set (match_operand:GPR 0 "register_operand" "=d,d")
4533         (plus:GPR (plus:GPR (match_operand:GPR 1 "nonimmediate_operand" "%0,0")
4534                             (match_operand:GPR 2 "general_operand" "d,m"))
4535                   (match_operand:GPR 3 "s390_alc_comparison" "")))
4536    (clobber (reg:CC CC_REGNUM))]
4537   "TARGET_CPU_ZARCH"
4538   "@
4539    alc<g>r\t%0,%2
4540    alc<g>\t%0,%2"
4541   [(set_attr "op_type"  "RRE,RXY")])
4543 (define_insn "*sub<mode>3_slb_cc"
4544   [(set (reg CC_REGNUM)
4545         (compare
4546           (minus:GPR (minus:GPR (match_operand:GPR 1 "nonimmediate_operand" "0,0")
4547                                 (match_operand:GPR 2 "general_operand" "d,m"))
4548                      (match_operand:GPR 3 "s390_slb_comparison" ""))
4549           (const_int 0)))
4550    (set (match_operand:GPR 0 "register_operand" "=d,d")
4551         (minus:GPR (minus:GPR (match_dup 1) (match_dup 2)) (match_dup 3)))]
4552   "s390_match_ccmode (insn, CCLmode) && TARGET_CPU_ZARCH"
4553   "@
4554    slb<g>r\t%0,%2
4555    slb<g>\t%0,%2"
4556   [(set_attr "op_type"  "RRE,RXY")])
4558 (define_insn "*sub<mode>3_slb"
4559   [(set (match_operand:GPR 0 "register_operand" "=d,d")
4560         (minus:GPR (minus:GPR (match_operand:GPR 1 "nonimmediate_operand" "0,0")
4561                               (match_operand:GPR 2 "general_operand" "d,m"))
4562                    (match_operand:GPR 3 "s390_slb_comparison" "")))
4563    (clobber (reg:CC CC_REGNUM))]
4564   "TARGET_CPU_ZARCH"
4565   "@
4566    slb<g>r\t%0,%2
4567    slb<g>\t%0,%2"
4568   [(set_attr "op_type"  "RRE,RXY")])
4570 (define_expand "add<mode>cc"
4571   [(match_operand:GPR 0 "register_operand" "")
4572    (match_operand 1 "comparison_operator" "")
4573    (match_operand:GPR 2 "register_operand" "")
4574    (match_operand:GPR 3 "const_int_operand" "")]
4575   "TARGET_CPU_ZARCH"
4576   "if (!s390_expand_addcc (GET_CODE (operands[1]), 
4577                            s390_compare_op0, s390_compare_op1, 
4578                            operands[0], operands[2], 
4579                            operands[3])) FAIL; DONE;")
4582 ; scond instruction pattern(s).
4585 (define_insn_and_split "*scond<mode>"
4586   [(set (match_operand:GPR 0 "register_operand" "=&d")
4587         (match_operand:GPR 1 "s390_alc_comparison" ""))
4588    (clobber (reg:CC CC_REGNUM))]
4589   "TARGET_CPU_ZARCH"
4590   "#"
4591   "&& reload_completed"
4592   [(set (match_dup 0) (const_int 0))
4593    (parallel
4594     [(set (match_dup 0) (plus:GPR (plus:GPR (match_dup 0) (match_dup 0))
4595                                   (match_dup 1)))
4596      (clobber (reg:CC CC_REGNUM))])]
4597   "")
4599 (define_insn_and_split "*scond<mode>_neg"
4600   [(set (match_operand:GPR 0 "register_operand" "=&d")
4601         (match_operand:GPR 1 "s390_slb_comparison" ""))
4602    (clobber (reg:CC CC_REGNUM))]
4603   "TARGET_CPU_ZARCH"
4604   "#"
4605   "&& reload_completed"
4606   [(set (match_dup 0) (const_int 0))
4607    (parallel
4608     [(set (match_dup 0) (minus:GPR (minus:GPR (match_dup 0) (match_dup 0))
4609                                    (match_dup 1)))
4610      (clobber (reg:CC CC_REGNUM))])
4611    (parallel
4612     [(set (match_dup 0) (neg:GPR (match_dup 0)))
4613      (clobber (reg:CC CC_REGNUM))])]
4614   "")
4617 (define_expand "s<code>"
4618   [(set (match_operand:SI 0 "register_operand" "")
4619         (SCOND (match_dup 0)
4620                (match_dup 0)))]
4621   "TARGET_CPU_ZARCH"
4622   "if (!s390_expand_addcc (<CODE>, s390_compare_op0, s390_compare_op1,
4623                            operands[0], const0_rtx, const1_rtx)) FAIL; DONE;")
4625 (define_expand "seq"
4626   [(parallel
4627     [(set (match_operand:SI 0 "register_operand" "=d")
4628           (match_dup 1))
4629      (clobber (reg:CC CC_REGNUM))])
4630    (parallel
4631     [(set (match_dup 0) (xor:SI (match_dup 0) (const_int 1)))
4632      (clobber (reg:CC CC_REGNUM))])]
4633   ""
4635   if (!s390_compare_emitted || GET_MODE (s390_compare_emitted) != CCZ1mode)
4636     FAIL;
4637   operands[1] = s390_emit_compare (NE, s390_compare_op0, s390_compare_op1);
4638   PUT_MODE (operands[1], SImode);
4641 (define_insn_and_split "*sne"
4642   [(set (match_operand:SI 0 "register_operand" "=d")
4643         (ne:SI (match_operand:CCZ1 1 "register_operand" "0") 
4644                (const_int 0)))
4645    (clobber (reg:CC CC_REGNUM))]
4646   ""
4647   "#"
4648   "reload_completed"
4649   [(parallel
4650     [(set (match_dup 0) (ashiftrt:SI (match_dup 0) (const_int 28)))
4651      (clobber (reg:CC CC_REGNUM))])])
4655 ;;- Multiply instructions.
4659 ; muldi3 instruction pattern(s).
4662 (define_insn "*muldi3_sign"
4663   [(set (match_operand:DI 0 "register_operand" "=d,d")
4664         (mult:DI (sign_extend:DI (match_operand:SI 2 "nonimmediate_operand" "d,m"))
4665                  (match_operand:DI 1 "register_operand" "0,0")))]
4666   "TARGET_64BIT"
4667   "@
4668    msgfr\t%0,%2
4669    msgf\t%0,%2"
4670   [(set_attr "op_type"  "RRE,RXY")
4671    (set_attr "type"     "imuldi")])
4673 (define_insn "muldi3"
4674   [(set (match_operand:DI 0 "register_operand" "=d,d,d")
4675         (mult:DI (match_operand:DI 1 "nonimmediate_operand" "%0,0,0")
4676                  (match_operand:DI 2 "general_operand" "d,K,m")))]
4677   "TARGET_64BIT"
4678   "@
4679    msgr\t%0,%2
4680    mghi\t%0,%h2
4681    msg\t%0,%2"
4682   [(set_attr "op_type"  "RRE,RI,RXY")
4683    (set_attr "type"     "imuldi")])
4686 ; mulsi3 instruction pattern(s).
4689 (define_insn "*mulsi3_sign"
4690   [(set (match_operand:SI 0 "register_operand" "=d")
4691         (mult:SI (sign_extend:SI (match_operand:HI 2 "memory_operand" "R"))
4692                  (match_operand:SI 1 "register_operand" "0")))]
4693   ""
4694   "mh\t%0,%2"
4695   [(set_attr "op_type"  "RX")
4696    (set_attr "type"     "imulhi")])
4698 (define_insn "mulsi3"
4699   [(set (match_operand:SI 0 "register_operand" "=d,d,d,d")
4700         (mult:SI  (match_operand:SI 1 "nonimmediate_operand" "%0,0,0,0")
4701                   (match_operand:SI 2 "general_operand" "d,K,R,T")))]
4702   ""
4703   "@
4704    msr\t%0,%2
4705    mhi\t%0,%h2
4706    ms\t%0,%2
4707    msy\t%0,%2"
4708   [(set_attr "op_type"  "RRE,RI,RX,RXY")
4709    (set_attr "type"     "imulsi,imulhi,imulsi,imulsi")])
4712 ; mulsidi3 instruction pattern(s).
4715 (define_insn "mulsidi3"
4716   [(set (match_operand:DI 0 "register_operand" "=d,d")
4717         (mult:DI (sign_extend:DI
4718                    (match_operand:SI 1 "register_operand" "%0,0"))
4719                  (sign_extend:DI
4720                    (match_operand:SI 2 "nonimmediate_operand" "d,R"))))]
4721   "!TARGET_64BIT"
4722   "@
4723    mr\t%0,%2
4724    m\t%0,%2"
4725   [(set_attr "op_type"  "RR,RX")
4726    (set_attr "type"     "imulsi")])
4729 ; umulsidi3 instruction pattern(s).
4732 (define_insn "umulsidi3"
4733   [(set (match_operand:DI 0 "register_operand" "=d,d")
4734         (mult:DI (zero_extend:DI
4735                    (match_operand:SI 1 "register_operand" "%0,0"))
4736                  (zero_extend:DI
4737                    (match_operand:SI 2 "nonimmediate_operand" "d,m"))))]
4738   "!TARGET_64BIT && TARGET_CPU_ZARCH"
4739   "@
4740    mlr\t%0,%2
4741    ml\t%0,%2"
4742   [(set_attr "op_type"  "RRE,RXY")
4743    (set_attr "type"     "imulsi")])
4746 ; mul(df|sf)3 instruction pattern(s).
4749 (define_expand "mul<mode>3"
4750   [(set (match_operand:FPR 0 "register_operand" "=f,f")
4751         (mult:FPR (match_operand:FPR 1 "nonimmediate_operand" "%0,0")
4752                   (match_operand:FPR 2 "general_operand" "f,<Rf>")))]
4753   "TARGET_HARD_FLOAT"
4754   "")
4756 (define_insn "*mul<mode>3"
4757   [(set (match_operand:FPR 0 "register_operand" "=f,f")
4758         (mult:FPR (match_operand:FPR 1 "nonimmediate_operand" "%0,0")
4759                   (match_operand:FPR 2 "general_operand" "f,<Rf>")))]
4760   "TARGET_HARD_FLOAT && TARGET_IEEE_FLOAT"
4761   "@
4762    m<xdee>br\t%0,%2
4763    m<xdee>b\t%0,%2"
4764   [(set_attr "op_type"  "RRE,RXE")
4765    (set_attr "type"     "fmul<mode>")])
4767 (define_insn "*mul<mode>3_ibm"
4768   [(set (match_operand:FPR 0 "register_operand" "=f,f")
4769         (mult:FPR (match_operand:FPR 1 "nonimmediate_operand" "%0,0")
4770                   (match_operand:FPR 2 "general_operand" "f,<Rf>")))]
4771   "TARGET_HARD_FLOAT && TARGET_IBM_FLOAT"
4772   "@
4773    m<xde>r\t%0,%2
4774    m<xde>\t%0,%2"
4775   [(set_attr "op_type"  "<RRe>,<RXe>")
4776    (set_attr "type"     "fmul<mode>")])
4778 (define_insn "*fmadd<mode>"
4779   [(set (match_operand:DSF 0 "register_operand" "=f,f")
4780         (plus:DSF (mult:DSF (match_operand:DSF 1 "register_operand" "%f,f")
4781                             (match_operand:DSF 2 "nonimmediate_operand"  "f,R"))
4782                  (match_operand:DSF 3 "register_operand" "0,0")))]
4783   "TARGET_HARD_FLOAT && TARGET_IEEE_FLOAT && TARGET_FUSED_MADD"
4784   "@
4785    ma<xde>br\t%0,%1,%2
4786    ma<xde>b\t%0,%1,%2"
4787   [(set_attr "op_type"  "RRE,RXE")
4788    (set_attr "type"     "fmul<mode>")])
4790 (define_insn "*fmsub<mode>"
4791   [(set (match_operand:DSF 0 "register_operand" "=f,f")
4792         (minus:DSF (mult:DSF (match_operand:DSF 1 "register_operand" "f,f")
4793                              (match_operand:DSF 2 "nonimmediate_operand"  "f,R"))
4794                  (match_operand:DSF 3 "register_operand" "0,0")))]
4795   "TARGET_HARD_FLOAT && TARGET_IEEE_FLOAT && TARGET_FUSED_MADD"
4796   "@
4797    ms<xde>br\t%0,%1,%2
4798    ms<xde>b\t%0,%1,%2"
4799   [(set_attr "op_type"  "RRE,RXE")
4800    (set_attr "type"     "fmul<mode>")])
4803 ;;- Divide and modulo instructions.
4807 ; divmoddi4 instruction pattern(s).
4810 (define_expand "divmoddi4"
4811   [(parallel [(set (match_operand:DI 0 "general_operand" "")
4812                    (div:DI (match_operand:DI 1 "register_operand" "")
4813                            (match_operand:DI 2 "general_operand" "")))
4814               (set (match_operand:DI 3 "general_operand" "")
4815                    (mod:DI (match_dup 1) (match_dup 2)))])
4816    (clobber (match_dup 4))]
4817   "TARGET_64BIT"
4819   rtx insn, div_equal, mod_equal;
4821   div_equal = gen_rtx_DIV (DImode, operands[1], operands[2]);
4822   mod_equal = gen_rtx_MOD (DImode, operands[1], operands[2]);
4824   operands[4] = gen_reg_rtx(TImode);
4825   emit_insn (gen_divmodtidi3 (operands[4], operands[1], operands[2]));
4827   insn = emit_move_insn (operands[0], gen_lowpart (DImode, operands[4]));
4828   REG_NOTES (insn) =
4829         gen_rtx_EXPR_LIST (REG_EQUAL, div_equal, REG_NOTES (insn));
4831   insn = emit_move_insn (operands[3], gen_highpart (DImode, operands[4]));
4832   REG_NOTES (insn) =
4833         gen_rtx_EXPR_LIST (REG_EQUAL, mod_equal, REG_NOTES (insn));
4835   DONE;
4838 (define_insn "divmodtidi3"
4839   [(set (match_operand:TI 0 "register_operand" "=d,d")
4840         (ior:TI
4841           (ashift:TI
4842             (zero_extend:TI
4843               (mod:DI (match_operand:DI 1 "register_operand" "0,0")
4844                       (match_operand:DI 2 "general_operand" "d,m")))
4845             (const_int 64))
4846           (zero_extend:TI (div:DI (match_dup 1) (match_dup 2)))))]
4847   "TARGET_64BIT"
4848   "@
4849    dsgr\t%0,%2
4850    dsg\t%0,%2"
4851   [(set_attr "op_type"  "RRE,RXY")
4852    (set_attr "type"     "idiv")])
4854 (define_insn "divmodtisi3"
4855   [(set (match_operand:TI 0 "register_operand" "=d,d")
4856         (ior:TI
4857           (ashift:TI
4858             (zero_extend:TI
4859               (mod:DI (match_operand:DI 1 "register_operand" "0,0")
4860                       (sign_extend:DI
4861                         (match_operand:SI 2 "nonimmediate_operand" "d,m"))))
4862             (const_int 64))
4863           (zero_extend:TI
4864             (div:DI (match_dup 1) (sign_extend:DI (match_dup 2))))))]
4865   "TARGET_64BIT"
4866   "@
4867    dsgfr\t%0,%2
4868    dsgf\t%0,%2"
4869   [(set_attr "op_type"  "RRE,RXY")
4870    (set_attr "type"     "idiv")])
4873 ; udivmoddi4 instruction pattern(s).
4876 (define_expand "udivmoddi4"
4877   [(parallel [(set (match_operand:DI 0 "general_operand" "")
4878                    (udiv:DI (match_operand:DI 1 "general_operand" "")
4879                             (match_operand:DI 2 "nonimmediate_operand" "")))
4880               (set (match_operand:DI 3 "general_operand" "")
4881                    (umod:DI (match_dup 1) (match_dup 2)))])
4882    (clobber (match_dup 4))]
4883   "TARGET_64BIT"
4885   rtx insn, div_equal, mod_equal, equal;
4887   div_equal = gen_rtx_UDIV (DImode, operands[1], operands[2]);
4888   mod_equal = gen_rtx_UMOD (DImode, operands[1], operands[2]);
4889   equal = gen_rtx_IOR (TImode,
4890                        gen_rtx_ASHIFT (TImode,
4891                                        gen_rtx_ZERO_EXTEND (TImode, mod_equal),
4892                                        GEN_INT (64)),
4893                        gen_rtx_ZERO_EXTEND (TImode, div_equal));
4895   operands[4] = gen_reg_rtx(TImode);
4896   emit_insn (gen_rtx_CLOBBER (VOIDmode, operands[4]));
4897   emit_move_insn (gen_lowpart (DImode, operands[4]), operands[1]);
4898   emit_move_insn (gen_highpart (DImode, operands[4]), const0_rtx);
4899   insn = emit_insn (gen_udivmodtidi3 (operands[4], operands[4], operands[2]));
4900   REG_NOTES (insn) =
4901         gen_rtx_EXPR_LIST (REG_EQUAL, equal, REG_NOTES (insn));
4903   insn = emit_move_insn (operands[0], gen_lowpart (DImode, operands[4]));
4904   REG_NOTES (insn) =
4905         gen_rtx_EXPR_LIST (REG_EQUAL, div_equal, REG_NOTES (insn));
4907   insn = emit_move_insn (operands[3], gen_highpart (DImode, operands[4]));
4908   REG_NOTES (insn) =
4909         gen_rtx_EXPR_LIST (REG_EQUAL, mod_equal, REG_NOTES (insn));
4911   DONE;
4914 (define_insn "udivmodtidi3"
4915   [(set (match_operand:TI 0 "register_operand" "=d,d")
4916         (ior:TI
4917           (ashift:TI
4918             (zero_extend:TI
4919               (truncate:DI
4920                 (umod:TI (match_operand:TI 1 "register_operand" "0,0")
4921                          (zero_extend:TI
4922                            (match_operand:DI 2 "nonimmediate_operand" "d,m")))))
4923             (const_int 64))
4924           (zero_extend:TI
4925             (truncate:DI
4926               (udiv:TI (match_dup 1) (zero_extend:TI (match_dup 2)))))))]
4927   "TARGET_64BIT"
4928   "@
4929    dlgr\t%0,%2
4930    dlg\t%0,%2"
4931   [(set_attr "op_type"  "RRE,RXY")
4932    (set_attr "type"     "idiv")])
4935 ; divmodsi4 instruction pattern(s).
4938 (define_expand "divmodsi4"
4939   [(parallel [(set (match_operand:SI 0 "general_operand" "")
4940                    (div:SI (match_operand:SI 1 "general_operand" "")
4941                            (match_operand:SI 2 "nonimmediate_operand" "")))
4942               (set (match_operand:SI 3 "general_operand" "")
4943                    (mod:SI (match_dup 1) (match_dup 2)))])
4944    (clobber (match_dup 4))]
4945   "!TARGET_64BIT"
4947   rtx insn, div_equal, mod_equal, equal;
4949   div_equal = gen_rtx_DIV (SImode, operands[1], operands[2]);
4950   mod_equal = gen_rtx_MOD (SImode, operands[1], operands[2]);
4951   equal = gen_rtx_IOR (DImode,
4952                        gen_rtx_ASHIFT (DImode,
4953                                        gen_rtx_ZERO_EXTEND (DImode, mod_equal),
4954                                        GEN_INT (32)),
4955                        gen_rtx_ZERO_EXTEND (DImode, div_equal));
4957   operands[4] = gen_reg_rtx(DImode);
4958   emit_insn (gen_extendsidi2 (operands[4], operands[1]));
4959   insn = emit_insn (gen_divmoddisi3 (operands[4], operands[4], operands[2]));
4960   REG_NOTES (insn) =
4961         gen_rtx_EXPR_LIST (REG_EQUAL, equal, REG_NOTES (insn));
4963   insn = emit_move_insn (operands[0], gen_lowpart (SImode, operands[4]));
4964   REG_NOTES (insn) =
4965         gen_rtx_EXPR_LIST (REG_EQUAL, div_equal, REG_NOTES (insn));
4967   insn = emit_move_insn (operands[3], gen_highpart (SImode, operands[4]));
4968   REG_NOTES (insn) =
4969         gen_rtx_EXPR_LIST (REG_EQUAL, mod_equal, REG_NOTES (insn));
4971   DONE;
4974 (define_insn "divmoddisi3"
4975   [(set (match_operand:DI 0 "register_operand" "=d,d")
4976         (ior:DI
4977           (ashift:DI
4978             (zero_extend:DI
4979               (truncate:SI
4980                 (mod:DI (match_operand:DI 1 "register_operand" "0,0")
4981                         (sign_extend:DI
4982                           (match_operand:SI 2 "nonimmediate_operand" "d,R")))))
4983             (const_int 32))
4984           (zero_extend:DI
4985             (truncate:SI
4986               (div:DI (match_dup 1) (sign_extend:DI (match_dup 2)))))))]
4987   "!TARGET_64BIT"
4988   "@
4989    dr\t%0,%2
4990    d\t%0,%2"
4991   [(set_attr "op_type"  "RR,RX")
4992    (set_attr "type"     "idiv")])
4995 ; udivsi3 and umodsi3 instruction pattern(s).
4998 (define_expand "udivmodsi4"
4999   [(parallel [(set (match_operand:SI 0 "general_operand" "")
5000                    (udiv:SI (match_operand:SI 1 "general_operand" "")
5001                             (match_operand:SI 2 "nonimmediate_operand" "")))
5002               (set (match_operand:SI 3 "general_operand" "")
5003                    (umod:SI (match_dup 1) (match_dup 2)))])
5004    (clobber (match_dup 4))]
5005   "!TARGET_64BIT && TARGET_CPU_ZARCH"
5007   rtx insn, div_equal, mod_equal, equal;
5009   div_equal = gen_rtx_UDIV (SImode, operands[1], operands[2]);
5010   mod_equal = gen_rtx_UMOD (SImode, operands[1], operands[2]);
5011   equal = gen_rtx_IOR (DImode,
5012                        gen_rtx_ASHIFT (DImode,
5013                                        gen_rtx_ZERO_EXTEND (DImode, mod_equal),
5014                                        GEN_INT (32)),
5015                        gen_rtx_ZERO_EXTEND (DImode, div_equal));
5017   operands[4] = gen_reg_rtx(DImode);
5018   emit_insn (gen_rtx_CLOBBER (VOIDmode, operands[4]));
5019   emit_move_insn (gen_lowpart (SImode, operands[4]), operands[1]);
5020   emit_move_insn (gen_highpart (SImode, operands[4]), const0_rtx);
5021   insn = emit_insn (gen_udivmoddisi3 (operands[4], operands[4], operands[2]));
5022   REG_NOTES (insn) =
5023         gen_rtx_EXPR_LIST (REG_EQUAL, equal, REG_NOTES (insn));
5025   insn = emit_move_insn (operands[0], gen_lowpart (SImode, operands[4]));
5026   REG_NOTES (insn) =
5027         gen_rtx_EXPR_LIST (REG_EQUAL, div_equal, REG_NOTES (insn));
5029   insn = emit_move_insn (operands[3], gen_highpart (SImode, operands[4]));
5030   REG_NOTES (insn) =
5031         gen_rtx_EXPR_LIST (REG_EQUAL, mod_equal, REG_NOTES (insn));
5033   DONE;
5036 (define_insn "udivmoddisi3"
5037   [(set (match_operand:DI 0 "register_operand" "=d,d")
5038         (ior:DI
5039           (ashift:DI
5040             (zero_extend:DI
5041               (truncate:SI
5042                 (umod:DI (match_operand:DI 1 "register_operand" "0,0")
5043                          (zero_extend:DI
5044                            (match_operand:SI 2 "nonimmediate_operand" "d,m")))))
5045             (const_int 32))
5046           (zero_extend:DI
5047             (truncate:SI
5048               (udiv:DI (match_dup 1) (zero_extend:DI (match_dup 2)))))))]
5049   "!TARGET_64BIT && TARGET_CPU_ZARCH"
5050   "@
5051    dlr\t%0,%2
5052    dl\t%0,%2"
5053   [(set_attr "op_type"  "RRE,RXY")
5054    (set_attr "type"     "idiv")])
5056 (define_expand "udivsi3"
5057   [(set (match_operand:SI 0 "register_operand" "=d")
5058         (udiv:SI (match_operand:SI 1 "general_operand" "")
5059                  (match_operand:SI 2 "general_operand" "")))
5060    (clobber (match_dup 3))]
5061   "!TARGET_64BIT && !TARGET_CPU_ZARCH"
5063   rtx insn, udiv_equal, umod_equal, equal;
5065   udiv_equal = gen_rtx_UDIV (SImode, operands[1], operands[2]);
5066   umod_equal = gen_rtx_UMOD (SImode, operands[1], operands[2]);
5067   equal = gen_rtx_IOR (DImode,
5068                        gen_rtx_ASHIFT (DImode,
5069                                        gen_rtx_ZERO_EXTEND (DImode, umod_equal),
5070                                        GEN_INT (32)),
5071                        gen_rtx_ZERO_EXTEND (DImode, udiv_equal));
5073   operands[3] = gen_reg_rtx (DImode);
5075   if (CONSTANT_P (operands[2]))
5076     {
5077       if (GET_CODE (operands[2]) == CONST_INT && INTVAL (operands[2]) < 0)
5078         {
5079           rtx label1 = gen_label_rtx ();
5081           operands[1] = make_safe_from (operands[1], operands[0]);
5082           emit_move_insn (operands[0], const0_rtx);
5083           emit_insn (gen_cmpsi (operands[1], operands[2]));
5084           emit_jump_insn (gen_bltu (label1));
5085           emit_move_insn (operands[0], const1_rtx);
5086           emit_label (label1);
5087         }
5088       else
5089         {
5090           operands[2] = force_reg (SImode, operands[2]);
5091           operands[2] = make_safe_from (operands[2], operands[0]);
5093           emit_insn (gen_zero_extendsidi2 (operands[3], operands[1]));
5094           insn = emit_insn (gen_divmoddisi3 (operands[3], operands[3],
5095                                              operands[2]));
5096           REG_NOTES (insn) =
5097             gen_rtx_EXPR_LIST (REG_EQUAL, equal, REG_NOTES (insn));
5099           insn = emit_move_insn (operands[0],
5100                                  gen_lowpart (SImode, operands[3]));
5101           REG_NOTES (insn) =
5102             gen_rtx_EXPR_LIST (REG_EQUAL,
5103                                udiv_equal, REG_NOTES (insn));
5104         }
5105     }
5106   else
5107     {
5108       rtx label1 = gen_label_rtx ();
5109       rtx label2 = gen_label_rtx ();
5110       rtx label3 = gen_label_rtx ();
5112       operands[1] = force_reg (SImode, operands[1]);
5113       operands[1] = make_safe_from (operands[1], operands[0]);
5114       operands[2] = force_reg (SImode, operands[2]);
5115       operands[2] = make_safe_from (operands[2], operands[0]);
5117       emit_move_insn (operands[0], const0_rtx);
5118       emit_insn (gen_cmpsi (operands[2], operands[1]));
5119       emit_jump_insn (gen_bgtu (label3));
5120       emit_insn (gen_cmpsi (operands[2], const0_rtx));
5121       emit_jump_insn (gen_blt (label2));
5122       emit_insn (gen_cmpsi (operands[2], const1_rtx));
5123       emit_jump_insn (gen_beq (label1));
5124       emit_insn (gen_zero_extendsidi2 (operands[3], operands[1]));
5125       insn = emit_insn (gen_divmoddisi3 (operands[3], operands[3],
5126                                          operands[2]));
5127       REG_NOTES (insn) =
5128       gen_rtx_EXPR_LIST (REG_EQUAL, equal, REG_NOTES (insn));
5130       insn = emit_move_insn (operands[0],
5131                              gen_lowpart (SImode, operands[3]));
5132       REG_NOTES (insn) =
5133       gen_rtx_EXPR_LIST (REG_EQUAL,
5134                                udiv_equal, REG_NOTES (insn));
5135       emit_jump (label3);
5136       emit_label (label1);
5137       emit_move_insn (operands[0], operands[1]);
5138       emit_jump (label3);
5139       emit_label (label2);
5140       emit_move_insn (operands[0], const1_rtx);
5141       emit_label (label3);
5142     }
5143   emit_move_insn (operands[0], operands[0]);
5144   DONE;
5147 (define_expand "umodsi3"
5148   [(set (match_operand:SI 0 "register_operand" "=d")
5149         (umod:SI (match_operand:SI 1 "nonimmediate_operand" "")
5150                  (match_operand:SI 2 "nonimmediate_operand" "")))
5151    (clobber (match_dup 3))]
5152   "!TARGET_64BIT && !TARGET_CPU_ZARCH"
5154   rtx insn, udiv_equal, umod_equal, equal;
5156   udiv_equal = gen_rtx_UDIV (SImode, operands[1], operands[2]);
5157   umod_equal = gen_rtx_UMOD (SImode, operands[1], operands[2]);
5158   equal = gen_rtx_IOR (DImode,
5159                        gen_rtx_ASHIFT (DImode,
5160                                        gen_rtx_ZERO_EXTEND (DImode, umod_equal),
5161                                        GEN_INT (32)),
5162                        gen_rtx_ZERO_EXTEND (DImode, udiv_equal));
5164   operands[3] = gen_reg_rtx (DImode);
5166   if (CONSTANT_P (operands[2]))
5167     {
5168       if (GET_CODE (operands[2]) == CONST_INT && INTVAL (operands[2]) <= 0)
5169         {
5170           rtx label1 = gen_label_rtx ();
5172           operands[1] = make_safe_from (operands[1], operands[0]);
5173           emit_move_insn (operands[0], operands[1]);
5174           emit_insn (gen_cmpsi (operands[0], operands[2]));
5175           emit_jump_insn (gen_bltu (label1));
5176           emit_insn (gen_abssi2 (operands[0], operands[2]));
5177           emit_insn (gen_addsi3 (operands[0], operands[0], operands[1]));
5178           emit_label (label1);
5179         }
5180       else
5181         {
5182           operands[2] = force_reg (SImode, operands[2]);
5183           operands[2] = make_safe_from (operands[2], operands[0]);
5185           emit_insn (gen_zero_extendsidi2 (operands[3], operands[1]));
5186           insn = emit_insn (gen_divmoddisi3 (operands[3], operands[3],
5187                                              operands[2]));
5188           REG_NOTES (insn) =
5189             gen_rtx_EXPR_LIST (REG_EQUAL, equal, REG_NOTES (insn));
5191           insn = emit_move_insn (operands[0],
5192                                  gen_highpart (SImode, operands[3]));
5193           REG_NOTES (insn) =
5194             gen_rtx_EXPR_LIST (REG_EQUAL,
5195                                umod_equal, REG_NOTES (insn));
5196         }
5197     }
5198   else
5199     {
5200       rtx label1 = gen_label_rtx ();
5201       rtx label2 = gen_label_rtx ();
5202       rtx label3 = gen_label_rtx ();
5204       operands[1] = force_reg (SImode, operands[1]);
5205       operands[1] = make_safe_from (operands[1], operands[0]);
5206       operands[2] = force_reg (SImode, operands[2]);
5207       operands[2] = make_safe_from (operands[2], operands[0]);
5209       emit_move_insn(operands[0], operands[1]);
5210       emit_insn (gen_cmpsi (operands[2], operands[1]));
5211       emit_jump_insn (gen_bgtu (label3));
5212       emit_insn (gen_cmpsi (operands[2], const0_rtx));
5213       emit_jump_insn (gen_blt (label2));
5214       emit_insn (gen_cmpsi (operands[2], const1_rtx));
5215       emit_jump_insn (gen_beq (label1));
5216       emit_insn (gen_zero_extendsidi2 (operands[3], operands[1]));
5217       insn = emit_insn (gen_divmoddisi3 (operands[3], operands[3],
5218                                          operands[2]));
5219       REG_NOTES (insn) =
5220       gen_rtx_EXPR_LIST (REG_EQUAL, equal, REG_NOTES (insn));
5222       insn = emit_move_insn (operands[0],
5223                              gen_highpart (SImode, operands[3]));
5224       REG_NOTES (insn) =
5225       gen_rtx_EXPR_LIST (REG_EQUAL,
5226                          umod_equal, REG_NOTES (insn));
5227       emit_jump (label3);
5228       emit_label (label1);
5229       emit_move_insn (operands[0], const0_rtx);
5230       emit_jump (label3);
5231       emit_label (label2);
5232       emit_insn (gen_subsi3 (operands[0], operands[0], operands[2]));
5233       emit_label (label3);
5234     }
5235   DONE;
5239 ; div(df|sf)3 instruction pattern(s).
5242 (define_expand "div<mode>3"
5243   [(set (match_operand:FPR 0 "register_operand" "=f,f")
5244         (div:FPR (match_operand:FPR 1 "register_operand" "0,0")
5245                  (match_operand:FPR 2 "general_operand" "f,<Rf>")))]
5246   "TARGET_HARD_FLOAT"
5247   "")
5249 (define_insn "*div<mode>3"
5250   [(set (match_operand:FPR 0 "register_operand" "=f,f")
5251         (div:FPR (match_operand:FPR 1 "register_operand" "0,0")
5252                  (match_operand:FPR 2 "general_operand" "f,<Rf>")))]
5253   "TARGET_HARD_FLOAT && TARGET_IEEE_FLOAT"
5254   "@
5255    d<xde>br\t%0,%2
5256    d<xde>b\t%0,%2"
5257   [(set_attr "op_type"  "RRE,RXE")
5258    (set_attr "type"     "fdiv<mode>")])
5260 (define_insn "*div<mode>3_ibm"
5261   [(set (match_operand:FPR 0 "register_operand" "=f,f")
5262         (div:FPR (match_operand:FPR 1 "register_operand" "0,0")
5263                  (match_operand:FPR 2 "general_operand" "f,<Rf>")))]
5264   "TARGET_HARD_FLOAT && TARGET_IBM_FLOAT"
5265   "@
5266    d<xde>r\t%0,%2
5267    d<xde>\t%0,%2"
5268   [(set_attr "op_type"  "<RRe>,<RXe>")
5269    (set_attr "type"     "fdiv<mode>")])
5273 ;;- And instructions.
5276 (define_expand "and<mode>3"
5277   [(set (match_operand:INT 0 "nonimmediate_operand" "")
5278         (and:INT (match_operand:INT 1 "nonimmediate_operand" "")
5279                  (match_operand:INT 2 "general_operand" "")))
5280    (clobber (reg:CC CC_REGNUM))]
5281   ""
5282   "s390_expand_logical_operator (AND, <MODE>mode, operands); DONE;")
5285 ; anddi3 instruction pattern(s).
5288 (define_insn "*anddi3_cc"
5289   [(set (reg CC_REGNUM)
5290         (compare (and:DI (match_operand:DI 1 "nonimmediate_operand" "%0,0")
5291                          (match_operand:DI 2 "general_operand" "d,m"))
5292                  (const_int 0)))
5293    (set (match_operand:DI 0 "register_operand" "=d,d")
5294         (and:DI (match_dup 1) (match_dup 2)))]
5295   "s390_match_ccmode(insn, CCTmode) && TARGET_64BIT"
5296   "@
5297    ngr\t%0,%2
5298    ng\t%0,%2"
5299   [(set_attr "op_type"  "RRE,RXY")])
5301 (define_insn "*anddi3_cconly"
5302   [(set (reg CC_REGNUM)
5303         (compare (and:DI (match_operand:DI 1 "nonimmediate_operand" "%0,0")
5304                          (match_operand:DI 2 "general_operand" "d,m"))
5305                  (const_int 0)))
5306    (clobber (match_scratch:DI 0 "=d,d"))]
5307   "s390_match_ccmode(insn, CCTmode) && TARGET_64BIT
5308    /* Do not steal TM patterns.  */
5309    && s390_single_part (operands[2], DImode, HImode, 0) < 0"
5310   "@
5311    ngr\t%0,%2
5312    ng\t%0,%2"
5313   [(set_attr "op_type"  "RRE,RXY")])
5315 (define_insn "*anddi3_extimm"
5316   [(set (match_operand:DI 0 "nonimmediate_operand" "=d,d,d,d,d,d,d,d,d,d,AQ,Q")
5317         (and:DI (match_operand:DI 1 "nonimmediate_operand"
5318                                     "%d,o,0,0,0,0,0,0,0,0,0,0")
5319                 (match_operand:DI 2 "general_operand"
5320                                     "M,M,N0HDF,N1HDF,N2HDF,N3HDF,N0SDF,N1SDF,d,m,NxQDF,Q")))
5321    (clobber (reg:CC CC_REGNUM))]
5322   "TARGET_64BIT && TARGET_EXTIMM && s390_logical_operator_ok_p (operands)"
5323   "@
5324    #
5325    #
5326    nihh\t%0,%j2
5327    nihl\t%0,%j2
5328    nilh\t%0,%j2
5329    nill\t%0,%j2
5330    nihf\t%0,%m2
5331    nilf\t%0,%m2
5332    ngr\t%0,%2
5333    ng\t%0,%2
5334    #
5335    #"
5336   [(set_attr "op_type" "RRE,RXE,RI,RI,RI,RI,RIL,RIL,RRE,RXY,SI,SS")])
5338 (define_insn "*anddi3"
5339   [(set (match_operand:DI 0 "nonimmediate_operand" "=d,d,d,d,d,d,d,d,AQ,Q")
5340         (and:DI (match_operand:DI 1 "nonimmediate_operand"
5341                                     "%d,o,0,0,0,0,0,0,0,0")
5342                 (match_operand:DI 2 "general_operand"
5343                                     "M,M,N0HDF,N1HDF,N2HDF,N3HDF,d,m,NxQDF,Q")))
5344    (clobber (reg:CC CC_REGNUM))]
5345   "TARGET_64BIT && !TARGET_EXTIMM && s390_logical_operator_ok_p (operands)"
5346   "@
5347    #
5348    #
5349    nihh\t%0,%j2
5350    nihl\t%0,%j2
5351    nilh\t%0,%j2
5352    nill\t%0,%j2
5353    ngr\t%0,%2
5354    ng\t%0,%2
5355    #
5356    #"
5357   [(set_attr "op_type" "RRE,RXE,RI,RI,RI,RI,RRE,RXY,SI,SS")])
5359 (define_split
5360   [(set (match_operand:DI 0 "s_operand" "")
5361         (and:DI (match_dup 0) (match_operand:DI 1 "immediate_operand" "")))
5362    (clobber (reg:CC CC_REGNUM))]
5363   "reload_completed"
5364   [(parallel
5365     [(set (match_dup 0) (and:QI (match_dup 0) (match_dup 1)))
5366      (clobber (reg:CC CC_REGNUM))])]
5367   "s390_narrow_logical_operator (AND, &operands[0], &operands[1]);")
5371 ; andsi3 instruction pattern(s).
5374 (define_insn "*andsi3_cc"
5375   [(set (reg CC_REGNUM)
5376         (compare (and:SI (match_operand:SI 1 "nonimmediate_operand" "%0,0,0,0")
5377                          (match_operand:SI 2 "general_operand" "Os,d,R,T"))
5378                  (const_int 0)))
5379    (set (match_operand:SI 0 "register_operand" "=d,d,d,d")
5380         (and:SI (match_dup 1) (match_dup 2)))]
5381   "s390_match_ccmode(insn, CCTmode)"
5382   "@
5383    nilf\t%0,%o2
5384    nr\t%0,%2
5385    n\t%0,%2
5386    ny\t%0,%2"
5387   [(set_attr "op_type"  "RIL,RR,RX,RXY")])
5389 (define_insn "*andsi3_cconly"
5390   [(set (reg CC_REGNUM)
5391         (compare (and:SI (match_operand:SI 1 "nonimmediate_operand" "%0,0,0,0")
5392                          (match_operand:SI 2 "general_operand" "Os,d,R,T"))
5393                  (const_int 0)))
5394    (clobber (match_scratch:SI 0 "=d,d,d,d"))]
5395   "s390_match_ccmode(insn, CCTmode)
5396    /* Do not steal TM patterns.  */
5397    && s390_single_part (operands[2], SImode, HImode, 0) < 0"
5398   "@
5399    nilf\t%0,%o2
5400    nr\t%0,%2
5401    n\t%0,%2
5402    ny\t%0,%2"
5403   [(set_attr "op_type"  "RIL,RR,RX,RXY")])
5405 (define_insn "*andsi3_zarch"
5406   [(set (match_operand:SI 0 "nonimmediate_operand" "=d,d,d,d,d,d,d,d,AQ,Q")
5407         (and:SI (match_operand:SI 1 "nonimmediate_operand"
5408                                     "%d,o,0,0,0,0,0,0,0,0")
5409                 (match_operand:SI 2 "general_operand"
5410                                     "M,M,N0HSF,N1HSF,Os,d,R,T,NxQSF,Q")))
5411    (clobber (reg:CC CC_REGNUM))]
5412   "TARGET_ZARCH && s390_logical_operator_ok_p (operands)"
5413   "@
5414    #
5415    #
5416    nilh\t%0,%j2
5417    nill\t%0,%j2
5418    nilf\t%0,%o2
5419    nr\t%0,%2
5420    n\t%0,%2
5421    ny\t%0,%2
5422    #
5423    #"
5424   [(set_attr "op_type"  "RRE,RXE,RI,RI,RIL,RR,RX,RXY,SI,SS")])
5426 (define_insn "*andsi3_esa"
5427   [(set (match_operand:SI 0 "nonimmediate_operand" "=d,d,AQ,Q")
5428         (and:SI (match_operand:SI 1 "nonimmediate_operand" "%0,0,0,0")
5429                 (match_operand:SI 2 "general_operand" "d,R,NxQSF,Q")))
5430    (clobber (reg:CC CC_REGNUM))]
5431   "!TARGET_ZARCH && s390_logical_operator_ok_p (operands)"
5432   "@
5433    nr\t%0,%2
5434    n\t%0,%2
5435    #
5436    #"
5437   [(set_attr "op_type"  "RR,RX,SI,SS")])
5439 (define_split
5440   [(set (match_operand:SI 0 "s_operand" "")
5441         (and:SI (match_dup 0) (match_operand:SI 1 "immediate_operand" "")))
5442    (clobber (reg:CC CC_REGNUM))]
5443   "reload_completed"
5444   [(parallel
5445     [(set (match_dup 0) (and:QI (match_dup 0) (match_dup 1)))
5446      (clobber (reg:CC CC_REGNUM))])]
5447   "s390_narrow_logical_operator (AND, &operands[0], &operands[1]);")
5450 ; andhi3 instruction pattern(s).
5453 (define_insn "*andhi3_zarch"
5454   [(set (match_operand:HI 0 "nonimmediate_operand" "=d,d,AQ,Q")
5455         (and:HI (match_operand:HI 1 "nonimmediate_operand" "%0,0,0,0")
5456                 (match_operand:HI 2 "general_operand" "d,n,NxQHF,Q")))
5457    (clobber (reg:CC CC_REGNUM))]
5458   "TARGET_ZARCH && s390_logical_operator_ok_p (operands)"
5459   "@
5460    nr\t%0,%2
5461    nill\t%0,%x2
5462    #
5463    #"
5464   [(set_attr "op_type"  "RR,RI,SI,SS")])
5466 (define_insn "*andhi3_esa"
5467   [(set (match_operand:HI 0 "nonimmediate_operand" "=d,AQ,Q")
5468         (and:HI (match_operand:HI 1 "nonimmediate_operand" "%0,0,0")
5469                 (match_operand:HI 2 "general_operand" "d,NxQHF,Q")))
5470    (clobber (reg:CC CC_REGNUM))]
5471   "!TARGET_ZARCH && s390_logical_operator_ok_p (operands)"
5472   "@
5473    nr\t%0,%2
5474    #
5475    #"
5476   [(set_attr "op_type"  "RR,SI,SS")])
5478 (define_split
5479   [(set (match_operand:HI 0 "s_operand" "")
5480         (and:HI (match_dup 0) (match_operand:HI 1 "immediate_operand" "")))
5481    (clobber (reg:CC CC_REGNUM))]
5482   "reload_completed"
5483   [(parallel
5484     [(set (match_dup 0) (and:QI (match_dup 0) (match_dup 1)))
5485      (clobber (reg:CC CC_REGNUM))])]
5486   "s390_narrow_logical_operator (AND, &operands[0], &operands[1]);")
5489 ; andqi3 instruction pattern(s).
5492 (define_insn "*andqi3_zarch"
5493   [(set (match_operand:QI 0 "nonimmediate_operand" "=d,d,Q,S,Q")
5494         (and:QI (match_operand:QI 1 "nonimmediate_operand" "%0,0,0,0,0")
5495                 (match_operand:QI 2 "general_operand" "d,n,n,n,Q")))
5496    (clobber (reg:CC CC_REGNUM))]
5497   "TARGET_ZARCH && s390_logical_operator_ok_p (operands)"
5498   "@
5499    nr\t%0,%2
5500    nill\t%0,%b2
5501    ni\t%S0,%b2
5502    niy\t%S0,%b2
5503    #"
5504   [(set_attr "op_type"  "RR,RI,SI,SIY,SS")])
5506 (define_insn "*andqi3_esa"
5507   [(set (match_operand:QI 0 "nonimmediate_operand" "=d,Q,Q")
5508         (and:QI (match_operand:QI 1 "nonimmediate_operand" "%0,0,0")
5509                 (match_operand:QI 2 "general_operand" "d,n,Q")))
5510    (clobber (reg:CC CC_REGNUM))]
5511   "!TARGET_ZARCH && s390_logical_operator_ok_p (operands)"
5512   "@
5513    nr\t%0,%2
5514    ni\t%S0,%b2
5515    #"
5516   [(set_attr "op_type"  "RR,SI,SS")])
5519 ; Block and (NC) patterns.
5522 (define_insn "*nc"
5523   [(set (match_operand:BLK 0 "memory_operand" "=Q")
5524         (and:BLK (match_dup 0)
5525                  (match_operand:BLK 1 "memory_operand" "Q")))
5526    (use (match_operand 2 "const_int_operand" "n"))
5527    (clobber (reg:CC CC_REGNUM))]
5528   "INTVAL (operands[2]) >= 1 && INTVAL (operands[2]) <= 256"
5529   "nc\t%O0(%2,%R0),%S1"
5530   [(set_attr "op_type" "SS")])
5532 (define_split
5533   [(set (match_operand 0 "memory_operand" "")
5534         (and (match_dup 0)
5535              (match_operand 1 "memory_operand" "")))
5536    (clobber (reg:CC CC_REGNUM))]
5537   "reload_completed
5538    && GET_MODE (operands[0]) == GET_MODE (operands[1])
5539    && GET_MODE_SIZE (GET_MODE (operands[0])) > 0"
5540   [(parallel
5541     [(set (match_dup 0) (and:BLK (match_dup 0) (match_dup 1)))
5542      (use (match_dup 2))
5543      (clobber (reg:CC CC_REGNUM))])]
5545   operands[2] = GEN_INT (GET_MODE_SIZE (GET_MODE (operands[0])));
5546   operands[0] = adjust_address (operands[0], BLKmode, 0);
5547   operands[1] = adjust_address (operands[1], BLKmode, 0);
5550 (define_peephole2
5551   [(parallel
5552     [(set (match_operand:BLK 0 "memory_operand" "")
5553           (and:BLK (match_dup 0)
5554                    (match_operand:BLK 1 "memory_operand" "")))
5555      (use (match_operand 2 "const_int_operand" ""))
5556      (clobber (reg:CC CC_REGNUM))])
5557    (parallel
5558     [(set (match_operand:BLK 3 "memory_operand" "")
5559           (and:BLK (match_dup 3)
5560                    (match_operand:BLK 4 "memory_operand" "")))
5561      (use (match_operand 5 "const_int_operand" ""))
5562      (clobber (reg:CC CC_REGNUM))])]
5563   "s390_offset_p (operands[0], operands[3], operands[2])
5564    && s390_offset_p (operands[1], operands[4], operands[2])
5565    && !s390_overlap_p (operands[0], operands[1], 
5566                        INTVAL (operands[2]) + INTVAL (operands[5]))
5567    && INTVAL (operands[2]) + INTVAL (operands[5]) <= 256"
5568   [(parallel
5569     [(set (match_dup 6) (and:BLK (match_dup 6) (match_dup 7)))
5570      (use (match_dup 8))
5571      (clobber (reg:CC CC_REGNUM))])]
5572   "operands[6] = gen_rtx_MEM (BLKmode, XEXP (operands[0], 0));
5573    operands[7] = gen_rtx_MEM (BLKmode, XEXP (operands[1], 0));
5574    operands[8] = GEN_INT (INTVAL (operands[2]) + INTVAL (operands[5]));")
5578 ;;- Bit set (inclusive or) instructions.
5581 (define_expand "ior<mode>3"
5582   [(set (match_operand:INT 0 "nonimmediate_operand" "")
5583         (ior:INT (match_operand:INT 1 "nonimmediate_operand" "")
5584                  (match_operand:INT 2 "general_operand" "")))
5585    (clobber (reg:CC CC_REGNUM))]
5586   ""
5587   "s390_expand_logical_operator (IOR, <MODE>mode, operands); DONE;")
5590 ; iordi3 instruction pattern(s).
5593 (define_insn "*iordi3_cc"
5594   [(set (reg CC_REGNUM)
5595         (compare (ior:DI (match_operand:DI 1 "nonimmediate_operand" "%0,0")
5596                          (match_operand:DI 2 "general_operand" "d,m"))
5597                  (const_int 0)))
5598    (set (match_operand:DI 0 "register_operand" "=d,d")
5599         (ior:DI (match_dup 1) (match_dup 2)))]
5600   "s390_match_ccmode(insn, CCTmode) && TARGET_64BIT"
5601   "@
5602    ogr\t%0,%2
5603    og\t%0,%2"
5604   [(set_attr "op_type"  "RRE,RXY")])
5606 (define_insn "*iordi3_cconly"
5607   [(set (reg CC_REGNUM)
5608         (compare (ior:DI (match_operand:DI 1 "nonimmediate_operand" "%0,0")
5609                          (match_operand:DI 2 "general_operand" "d,m"))
5610                  (const_int 0)))
5611    (clobber (match_scratch:DI 0 "=d,d"))]
5612   "s390_match_ccmode(insn, CCTmode) && TARGET_64BIT"
5613   "@
5614    ogr\t%0,%2
5615    og\t%0,%2"
5616   [(set_attr "op_type"  "RRE,RXY")])
5618 (define_insn "*iordi3_extimm"
5619   [(set (match_operand:DI 0 "nonimmediate_operand" "=d,d,d,d,d,d,d,d,AQ,Q")
5620         (ior:DI (match_operand:DI 1 "nonimmediate_operand" "%0,0,0,0,0,0,0,0,0,0")
5621                 (match_operand:DI 2 "general_operand"
5622                                     "N0HD0,N1HD0,N2HD0,N3HD0,N0SD0,N1SD0,d,m,NxQD0,Q")))
5623    (clobber (reg:CC CC_REGNUM))]
5624   "TARGET_64BIT && TARGET_EXTIMM && s390_logical_operator_ok_p (operands)"
5625   "@
5626    oihh\t%0,%i2
5627    oihl\t%0,%i2
5628    oilh\t%0,%i2
5629    oill\t%0,%i2
5630    oihf\t%0,%k2
5631    oilf\t%0,%k2
5632    ogr\t%0,%2
5633    og\t%0,%2
5634    #
5635    #"
5636   [(set_attr "op_type"  "RI,RI,RI,RI,RIL,RIL,RRE,RXY,SI,SS")])
5638 (define_insn "*iordi3"
5639   [(set (match_operand:DI 0 "nonimmediate_operand" "=d,d,d,d,d,d,AQ,Q")
5640         (ior:DI (match_operand:DI 1 "nonimmediate_operand" "%0,0,0,0,0,0,0,0")
5641                 (match_operand:DI 2 "general_operand"
5642                                     "N0HD0,N1HD0,N2HD0,N3HD0,d,m,NxQD0,Q")))
5643    (clobber (reg:CC CC_REGNUM))]
5644   "TARGET_64BIT && !TARGET_EXTIMM && s390_logical_operator_ok_p (operands)"
5645   "@
5646    oihh\t%0,%i2
5647    oihl\t%0,%i2
5648    oilh\t%0,%i2
5649    oill\t%0,%i2
5650    ogr\t%0,%2
5651    og\t%0,%2
5652    #
5653    #"
5654   [(set_attr "op_type"  "RI,RI,RI,RI,RRE,RXY,SI,SS")])
5656 (define_split
5657   [(set (match_operand:DI 0 "s_operand" "")
5658         (ior:DI (match_dup 0) (match_operand:DI 1 "immediate_operand" "")))
5659    (clobber (reg:CC CC_REGNUM))]
5660   "reload_completed"
5661   [(parallel
5662     [(set (match_dup 0) (ior:QI (match_dup 0) (match_dup 1)))
5663      (clobber (reg:CC CC_REGNUM))])]
5664   "s390_narrow_logical_operator (IOR, &operands[0], &operands[1]);")
5667 ; iorsi3 instruction pattern(s).
5670 (define_insn "*iorsi3_cc"
5671   [(set (reg CC_REGNUM)
5672         (compare (ior:SI (match_operand:SI 1 "nonimmediate_operand" "%0,0,0,0")
5673                          (match_operand:SI 2 "general_operand" "Os,d,R,T"))
5674                  (const_int 0)))
5675    (set (match_operand:SI 0 "register_operand" "=d,d,d,d")
5676         (ior:SI (match_dup 1) (match_dup 2)))]
5677   "s390_match_ccmode(insn, CCTmode)"
5678   "@
5679    oilf\t%0,%o2
5680    or\t%0,%2
5681    o\t%0,%2
5682    oy\t%0,%2"
5683   [(set_attr "op_type"  "RIL,RR,RX,RXY")])
5685 (define_insn "*iorsi3_cconly"
5686   [(set (reg CC_REGNUM)
5687         (compare (ior:SI (match_operand:SI 1 "nonimmediate_operand" "%0,0,0,0")
5688                          (match_operand:SI 2 "general_operand" "Os,d,R,T"))
5689                  (const_int 0)))
5690    (clobber (match_scratch:SI 0 "=d,d,d,d"))]
5691   "s390_match_ccmode(insn, CCTmode)"
5692   "@
5693    oilf\t%0,%o2
5694    or\t%0,%2
5695    o\t%0,%2
5696    oy\t%0,%2"
5697   [(set_attr "op_type"  "RIL,RR,RX,RXY")])
5699 (define_insn "*iorsi3_zarch"
5700   [(set (match_operand:SI 0 "nonimmediate_operand" "=d,d,d,d,d,d,AQ,Q")
5701         (ior:SI (match_operand:SI 1 "nonimmediate_operand" "%0,0,0,0,0,0,0,0")
5702                 (match_operand:SI 2 "general_operand" "N0HS0,N1HS0,Os,d,R,T,NxQS0,Q")))
5703    (clobber (reg:CC CC_REGNUM))]
5704   "TARGET_ZARCH && s390_logical_operator_ok_p (operands)"
5705   "@
5706    oilh\t%0,%i2
5707    oill\t%0,%i2
5708    oilf\t%0,%o2
5709    or\t%0,%2
5710    o\t%0,%2
5711    oy\t%0,%2
5712    #
5713    #"
5714   [(set_attr "op_type"  "RI,RI,RIL,RR,RX,RXY,SI,SS")])
5716 (define_insn "*iorsi3_esa"
5717   [(set (match_operand:SI 0 "nonimmediate_operand" "=d,d,AQ,Q")
5718         (ior:SI (match_operand:SI 1 "nonimmediate_operand" "%0,0,0,0")
5719                 (match_operand:SI 2 "general_operand" "d,R,NxQS0,Q")))
5720    (clobber (reg:CC CC_REGNUM))]
5721   "!TARGET_ZARCH && s390_logical_operator_ok_p (operands)"
5722   "@
5723    or\t%0,%2
5724    o\t%0,%2
5725    #
5726    #"
5727   [(set_attr "op_type"  "RR,RX,SI,SS")])
5729 (define_split
5730   [(set (match_operand:SI 0 "s_operand" "")
5731         (ior:SI (match_dup 0) (match_operand:SI 1 "immediate_operand" "")))
5732    (clobber (reg:CC CC_REGNUM))]
5733   "reload_completed"
5734   [(parallel
5735     [(set (match_dup 0) (ior:QI (match_dup 0) (match_dup 1)))
5736      (clobber (reg:CC CC_REGNUM))])]
5737   "s390_narrow_logical_operator (IOR, &operands[0], &operands[1]);")
5740 ; iorhi3 instruction pattern(s).
5743 (define_insn "*iorhi3_zarch"
5744   [(set (match_operand:HI 0 "nonimmediate_operand" "=d,d,AQ,Q")
5745         (ior:HI (match_operand:HI 1 "nonimmediate_operand" "%0,0,0,0")
5746                 (match_operand:HI 2 "general_operand" "d,n,NxQH0,Q")))
5747    (clobber (reg:CC CC_REGNUM))]
5748   "TARGET_ZARCH && s390_logical_operator_ok_p (operands)"
5749   "@
5750    or\t%0,%2
5751    oill\t%0,%x2
5752    #
5753    #"
5754   [(set_attr "op_type"  "RR,RI,SI,SS")])
5756 (define_insn "*iorhi3_esa"
5757   [(set (match_operand:HI 0 "nonimmediate_operand" "=d,AQ,Q")
5758         (ior:HI (match_operand:HI 1 "nonimmediate_operand" "%0,0,0")
5759                 (match_operand:HI 2 "general_operand" "d,NxQH0,Q")))
5760    (clobber (reg:CC CC_REGNUM))]
5761   "!TARGET_ZARCH && s390_logical_operator_ok_p (operands)"
5762   "@
5763    or\t%0,%2
5764    #
5765    #"
5766   [(set_attr "op_type"  "RR,SI,SS")])
5768 (define_split
5769   [(set (match_operand:HI 0 "s_operand" "")
5770         (ior:HI (match_dup 0) (match_operand:HI 1 "immediate_operand" "")))
5771    (clobber (reg:CC CC_REGNUM))]
5772   "reload_completed"
5773   [(parallel
5774     [(set (match_dup 0) (ior:QI (match_dup 0) (match_dup 1)))
5775      (clobber (reg:CC CC_REGNUM))])]
5776   "s390_narrow_logical_operator (IOR, &operands[0], &operands[1]);")
5779 ; iorqi3 instruction pattern(s).
5782 (define_insn "*iorqi3_zarch"
5783   [(set (match_operand:QI 0 "nonimmediate_operand" "=d,d,Q,S,Q")
5784         (ior:QI (match_operand:QI 1 "nonimmediate_operand" "%0,0,0,0,0")
5785                 (match_operand:QI 2 "general_operand" "d,n,n,n,Q")))
5786    (clobber (reg:CC CC_REGNUM))]
5787   "TARGET_ZARCH && s390_logical_operator_ok_p (operands)"
5788   "@
5789    or\t%0,%2
5790    oill\t%0,%b2
5791    oi\t%S0,%b2
5792    oiy\t%S0,%b2
5793    #"
5794   [(set_attr "op_type"  "RR,RI,SI,SIY,SS")])
5796 (define_insn "*iorqi3_esa"
5797   [(set (match_operand:QI 0 "nonimmediate_operand" "=d,Q,Q")
5798         (ior:QI (match_operand:QI 1 "nonimmediate_operand" "%0,0,0")
5799                 (match_operand:QI 2 "general_operand" "d,n,Q")))
5800    (clobber (reg:CC CC_REGNUM))]
5801   "!TARGET_ZARCH && s390_logical_operator_ok_p (operands)"
5802   "@
5803    or\t%0,%2
5804    oi\t%S0,%b2
5805    #"
5806   [(set_attr "op_type"  "RR,SI,SS")])
5809 ; Block inclusive or (OC) patterns.
5812 (define_insn "*oc"
5813   [(set (match_operand:BLK 0 "memory_operand" "=Q")
5814         (ior:BLK (match_dup 0)
5815                  (match_operand:BLK 1 "memory_operand" "Q")))
5816    (use (match_operand 2 "const_int_operand" "n"))
5817    (clobber (reg:CC CC_REGNUM))]
5818   "INTVAL (operands[2]) >= 1 && INTVAL (operands[2]) <= 256"
5819   "oc\t%O0(%2,%R0),%S1"
5820   [(set_attr "op_type" "SS")])
5822 (define_split
5823   [(set (match_operand 0 "memory_operand" "")
5824         (ior (match_dup 0)
5825              (match_operand 1 "memory_operand" "")))
5826    (clobber (reg:CC CC_REGNUM))]
5827   "reload_completed
5828    && GET_MODE (operands[0]) == GET_MODE (operands[1])
5829    && GET_MODE_SIZE (GET_MODE (operands[0])) > 0"
5830   [(parallel
5831     [(set (match_dup 0) (ior:BLK (match_dup 0) (match_dup 1)))
5832      (use (match_dup 2))
5833      (clobber (reg:CC CC_REGNUM))])]
5835   operands[2] = GEN_INT (GET_MODE_SIZE (GET_MODE (operands[0])));
5836   operands[0] = adjust_address (operands[0], BLKmode, 0);
5837   operands[1] = adjust_address (operands[1], BLKmode, 0);
5840 (define_peephole2
5841   [(parallel
5842     [(set (match_operand:BLK 0 "memory_operand" "")
5843           (ior:BLK (match_dup 0)
5844                    (match_operand:BLK 1 "memory_operand" "")))
5845      (use (match_operand 2 "const_int_operand" ""))
5846      (clobber (reg:CC CC_REGNUM))])
5847    (parallel
5848     [(set (match_operand:BLK 3 "memory_operand" "")
5849           (ior:BLK (match_dup 3)
5850                    (match_operand:BLK 4 "memory_operand" "")))
5851      (use (match_operand 5 "const_int_operand" ""))
5852      (clobber (reg:CC CC_REGNUM))])]
5853   "s390_offset_p (operands[0], operands[3], operands[2])
5854    && s390_offset_p (operands[1], operands[4], operands[2])
5855    && !s390_overlap_p (operands[0], operands[1], 
5856                        INTVAL (operands[2]) + INTVAL (operands[5]))
5857    && INTVAL (operands[2]) + INTVAL (operands[5]) <= 256"
5858   [(parallel
5859     [(set (match_dup 6) (ior:BLK (match_dup 6) (match_dup 7)))
5860      (use (match_dup 8))
5861      (clobber (reg:CC CC_REGNUM))])]
5862   "operands[6] = gen_rtx_MEM (BLKmode, XEXP (operands[0], 0));
5863    operands[7] = gen_rtx_MEM (BLKmode, XEXP (operands[1], 0));
5864    operands[8] = GEN_INT (INTVAL (operands[2]) + INTVAL (operands[5]));")
5868 ;;- Xor instructions.
5871 (define_expand "xor<mode>3"
5872   [(set (match_operand:INT 0 "nonimmediate_operand" "")
5873         (xor:INT (match_operand:INT 1 "nonimmediate_operand" "")
5874                  (match_operand:INT 2 "general_operand" "")))
5875    (clobber (reg:CC CC_REGNUM))]
5876   ""
5877   "s390_expand_logical_operator (XOR, <MODE>mode, operands); DONE;")
5880 ; xordi3 instruction pattern(s).
5883 (define_insn "*xordi3_cc"
5884   [(set (reg CC_REGNUM)
5885         (compare (xor:DI (match_operand:DI 1 "nonimmediate_operand" "%0,0")
5886                          (match_operand:DI 2 "general_operand" "d,m"))
5887                  (const_int 0)))
5888    (set (match_operand:DI 0 "register_operand" "=d,d")
5889         (xor:DI (match_dup 1) (match_dup 2)))]
5890   "s390_match_ccmode(insn, CCTmode) && TARGET_64BIT"
5891   "@
5892    xgr\t%0,%2
5893    xg\t%0,%2"
5894   [(set_attr "op_type"  "RRE,RXY")])
5896 (define_insn "*xordi3_cconly"
5897   [(set (reg CC_REGNUM)
5898         (compare (xor:DI (match_operand:DI 1 "nonimmediate_operand" "%0,0")
5899                          (match_operand:DI 2 "general_operand" "d,m"))
5900                  (const_int 0)))
5901    (clobber (match_scratch:DI 0 "=d,d"))]
5902   "s390_match_ccmode(insn, CCTmode) && TARGET_64BIT"
5903   "@
5904    xgr\t%0,%2
5905    xg\t%0,%2"
5906   [(set_attr "op_type"  "RRE,RXY")])
5908 (define_insn "*xordi3_extimm"
5909   [(set (match_operand:DI 0 "nonimmediate_operand" "=d,d,d,d,AQ,Q")
5910         (xor:DI (match_operand:DI 1 "nonimmediate_operand" "%0,0,0,0,0,0")
5911                 (match_operand:DI 2 "general_operand" "N0SD0,N1SD0,d,m,NxQD0,Q")))
5912    (clobber (reg:CC CC_REGNUM))]
5913   "TARGET_64BIT && TARGET_EXTIMM && s390_logical_operator_ok_p (operands)"
5914   "@
5915    xihf\t%0,%k2
5916    xilf\t%0,%k2
5917    xgr\t%0,%2
5918    xg\t%0,%2
5919    #
5920    #"
5921   [(set_attr "op_type"  "RIL,RIL,RRE,RXY,SI,SS")])
5923 (define_insn "*xordi3"
5924   [(set (match_operand:DI 0 "nonimmediate_operand" "=d,d,AQ,Q")
5925         (xor:DI (match_operand:DI 1 "nonimmediate_operand" "%0,0,0,0")
5926                 (match_operand:DI 2 "general_operand" "d,m,NxQD0,Q")))
5927    (clobber (reg:CC CC_REGNUM))]
5928   "TARGET_64BIT && !TARGET_EXTIMM && s390_logical_operator_ok_p (operands)"
5929   "@
5930    xgr\t%0,%2
5931    xg\t%0,%2
5932    #
5933    #"
5934   [(set_attr "op_type"  "RRE,RXY,SI,SS")])
5936 (define_split
5937   [(set (match_operand:DI 0 "s_operand" "")
5938         (xor:DI (match_dup 0) (match_operand:DI 1 "immediate_operand" "")))
5939    (clobber (reg:CC CC_REGNUM))]
5940   "reload_completed"
5941   [(parallel
5942     [(set (match_dup 0) (xor:QI (match_dup 0) (match_dup 1)))
5943      (clobber (reg:CC CC_REGNUM))])]
5944   "s390_narrow_logical_operator (XOR, &operands[0], &operands[1]);")
5947 ; xorsi3 instruction pattern(s).
5950 (define_insn "*xorsi3_cc"
5951   [(set (reg CC_REGNUM)
5952         (compare (xor:SI (match_operand:SI 1 "nonimmediate_operand" "%0,0,0,0")
5953                          (match_operand:SI 2 "general_operand" "Os,d,R,T"))
5954                  (const_int 0)))
5955    (set (match_operand:SI 0 "register_operand" "=d,d,d,d")
5956         (xor:SI (match_dup 1) (match_dup 2)))]
5957   "s390_match_ccmode(insn, CCTmode)"
5958   "@
5959    xilf\t%0,%o2
5960    xr\t%0,%2
5961    x\t%0,%2
5962    xy\t%0,%2"
5963   [(set_attr "op_type"  "RIL,RR,RX,RXY")])
5965 (define_insn "*xorsi3_cconly"
5966   [(set (reg CC_REGNUM)
5967         (compare (xor:SI (match_operand:SI 1 "nonimmediate_operand" "%0,0,0,0")
5968                          (match_operand:SI 2 "general_operand" "Os,d,R,T"))
5969                  (const_int 0)))
5970    (clobber (match_scratch:SI 0 "=d,d,d,d"))]
5971   "s390_match_ccmode(insn, CCTmode)"
5972   "@
5973    xilf\t%0,%o2
5974    xr\t%0,%2
5975    x\t%0,%2
5976    xy\t%0,%2"
5977   [(set_attr "op_type"  "RIL,RR,RX,RXY")])
5979 (define_insn "*xorsi3"
5980   [(set (match_operand:SI 0 "nonimmediate_operand" "=d,d,d,d,AQ,Q")
5981         (xor:SI (match_operand:SI 1 "nonimmediate_operand" "%0,0,0,0,0,0")
5982                 (match_operand:SI 2 "general_operand" "Os,d,R,T,NxQS0,Q")))
5983    (clobber (reg:CC CC_REGNUM))]
5984   "s390_logical_operator_ok_p (operands)"
5985   "@
5986    xilf\t%0,%o2
5987    xr\t%0,%2
5988    x\t%0,%2
5989    xy\t%0,%2
5990    #
5991    #"
5992   [(set_attr "op_type"  "RIL,RR,RX,RXY,SI,SS")])
5994 (define_split
5995   [(set (match_operand:SI 0 "s_operand" "")
5996         (xor:SI (match_dup 0) (match_operand:SI 1 "immediate_operand" "")))
5997    (clobber (reg:CC CC_REGNUM))]
5998   "reload_completed"
5999   [(parallel
6000     [(set (match_dup 0) (xor:QI (match_dup 0) (match_dup 1)))
6001      (clobber (reg:CC CC_REGNUM))])]
6002   "s390_narrow_logical_operator (XOR, &operands[0], &operands[1]);")
6005 ; xorhi3 instruction pattern(s).
6008 (define_insn "*xorhi3"
6009   [(set (match_operand:HI 0 "nonimmediate_operand" "=d,d,AQ,Q")
6010         (xor:HI (match_operand:HI 1 "nonimmediate_operand" "%0,0,0,0")
6011                 (match_operand:HI 2 "general_operand" "Os,d,NxQH0,Q")))
6012    (clobber (reg:CC CC_REGNUM))]
6013   "s390_logical_operator_ok_p (operands)"
6014   "@
6015    xilf\t%0,%x2
6016    xr\t%0,%2
6017    #
6018    #"
6019   [(set_attr "op_type"  "RIL,RR,SI,SS")])
6021 (define_split
6022   [(set (match_operand:HI 0 "s_operand" "")
6023         (xor:HI (match_dup 0) (match_operand:HI 1 "immediate_operand" "")))
6024    (clobber (reg:CC CC_REGNUM))]
6025   "reload_completed"
6026   [(parallel
6027     [(set (match_dup 0) (xor:QI (match_dup 0) (match_dup 1)))
6028      (clobber (reg:CC CC_REGNUM))])]
6029   "s390_narrow_logical_operator (XOR, &operands[0], &operands[1]);")
6032 ; xorqi3 instruction pattern(s).
6035 (define_insn "*xorqi3"
6036   [(set (match_operand:QI 0 "nonimmediate_operand" "=d,d,Q,S,Q")
6037         (xor:QI (match_operand:QI 1 "nonimmediate_operand" "%0,0,0,0,0")
6038                 (match_operand:QI 2 "general_operand" "Os,d,n,n,Q")))
6039    (clobber (reg:CC CC_REGNUM))]
6040   "s390_logical_operator_ok_p (operands)"
6041   "@
6042    xilf\t%0,%b2
6043    xr\t%0,%2
6044    xi\t%S0,%b2
6045    xiy\t%S0,%b2
6046    #"
6047   [(set_attr "op_type"  "RIL,RR,SI,SIY,SS")])
6050 ; Block exclusive or (XC) patterns.
6053 (define_insn "*xc"
6054   [(set (match_operand:BLK 0 "memory_operand" "=Q")
6055         (xor:BLK (match_dup 0)
6056                  (match_operand:BLK 1 "memory_operand" "Q")))
6057    (use (match_operand 2 "const_int_operand" "n"))
6058    (clobber (reg:CC CC_REGNUM))]
6059   "INTVAL (operands[2]) >= 1 && INTVAL (operands[2]) <= 256"
6060   "xc\t%O0(%2,%R0),%S1"
6061   [(set_attr "op_type" "SS")])
6063 (define_split
6064   [(set (match_operand 0 "memory_operand" "")
6065         (xor (match_dup 0)
6066              (match_operand 1 "memory_operand" "")))
6067    (clobber (reg:CC CC_REGNUM))]
6068   "reload_completed
6069    && GET_MODE (operands[0]) == GET_MODE (operands[1])
6070    && GET_MODE_SIZE (GET_MODE (operands[0])) > 0"
6071   [(parallel
6072     [(set (match_dup 0) (xor:BLK (match_dup 0) (match_dup 1)))
6073      (use (match_dup 2))
6074      (clobber (reg:CC CC_REGNUM))])]
6076   operands[2] = GEN_INT (GET_MODE_SIZE (GET_MODE (operands[0])));
6077   operands[0] = adjust_address (operands[0], BLKmode, 0);
6078   operands[1] = adjust_address (operands[1], BLKmode, 0);
6081 (define_peephole2
6082   [(parallel
6083     [(set (match_operand:BLK 0 "memory_operand" "")
6084           (xor:BLK (match_dup 0)
6085                    (match_operand:BLK 1 "memory_operand" "")))
6086      (use (match_operand 2 "const_int_operand" ""))
6087      (clobber (reg:CC CC_REGNUM))])
6088    (parallel
6089     [(set (match_operand:BLK 3 "memory_operand" "")
6090           (xor:BLK (match_dup 3)
6091                    (match_operand:BLK 4 "memory_operand" "")))
6092      (use (match_operand 5 "const_int_operand" ""))
6093      (clobber (reg:CC CC_REGNUM))])]
6094   "s390_offset_p (operands[0], operands[3], operands[2])
6095    && s390_offset_p (operands[1], operands[4], operands[2])
6096    && !s390_overlap_p (operands[0], operands[1], 
6097                        INTVAL (operands[2]) + INTVAL (operands[5]))
6098    && INTVAL (operands[2]) + INTVAL (operands[5]) <= 256"
6099   [(parallel
6100     [(set (match_dup 6) (xor:BLK (match_dup 6) (match_dup 7)))
6101      (use (match_dup 8))
6102      (clobber (reg:CC CC_REGNUM))])]
6103   "operands[6] = gen_rtx_MEM (BLKmode, XEXP (operands[0], 0));
6104    operands[7] = gen_rtx_MEM (BLKmode, XEXP (operands[1], 0));
6105    operands[8] = GEN_INT (INTVAL (operands[2]) + INTVAL (operands[5]));")
6108 ; Block xor (XC) patterns with src == dest.
6111 (define_insn "*xc_zero"
6112   [(set (match_operand:BLK 0 "memory_operand" "=Q")
6113         (const_int 0))
6114    (use (match_operand 1 "const_int_operand" "n"))
6115    (clobber (reg:CC CC_REGNUM))]
6116   "INTVAL (operands[1]) >= 1 && INTVAL (operands[1]) <= 256"
6117   "xc\t%O0(%1,%R0),%S0"
6118   [(set_attr "op_type" "SS")])
6120 (define_peephole2
6121   [(parallel
6122     [(set (match_operand:BLK 0 "memory_operand" "")
6123           (const_int 0))
6124      (use (match_operand 1 "const_int_operand" ""))
6125      (clobber (reg:CC CC_REGNUM))])
6126    (parallel
6127     [(set (match_operand:BLK 2 "memory_operand" "")
6128           (const_int 0))
6129      (use (match_operand 3 "const_int_operand" ""))
6130      (clobber (reg:CC CC_REGNUM))])]
6131   "s390_offset_p (operands[0], operands[2], operands[1])
6132    && INTVAL (operands[1]) + INTVAL (operands[3]) <= 256"
6133   [(parallel
6134     [(set (match_dup 4) (const_int 0))
6135      (use (match_dup 5))
6136      (clobber (reg:CC CC_REGNUM))])]
6137   "operands[4] = gen_rtx_MEM (BLKmode, XEXP (operands[0], 0));
6138    operands[5] = GEN_INT (INTVAL (operands[1]) + INTVAL (operands[3]));")
6142 ;;- Negate instructions.
6146 ; neg(di|si)2 instruction pattern(s).
6149 (define_expand "neg<mode>2"
6150   [(parallel
6151     [(set (match_operand:DSI 0 "register_operand" "=d")
6152           (neg:DSI (match_operand:DSI 1 "register_operand" "d")))
6153      (clobber (reg:CC CC_REGNUM))])]
6154   ""
6155   "")
6157 (define_insn "*negdi2_sign_cc"
6158   [(set (reg CC_REGNUM)
6159         (compare (neg:DI (ashiftrt:DI (ashift:DI (subreg:DI
6160                            (match_operand:SI 1 "register_operand" "d") 0)
6161                            (const_int 32)) (const_int 32)))
6162                  (const_int 0)))
6163    (set (match_operand:DI 0 "register_operand" "=d")
6164         (neg:DI (sign_extend:DI (match_dup 1))))]
6165   "TARGET_64BIT && s390_match_ccmode (insn, CCAmode)"
6166   "lcgfr\t%0,%1"
6167   [(set_attr "op_type"  "RRE")])
6168   
6169 (define_insn "*negdi2_sign"
6170   [(set (match_operand:DI 0 "register_operand" "=d")
6171         (neg:DI (sign_extend:DI (match_operand:SI 1 "register_operand" "d"))))
6172    (clobber (reg:CC CC_REGNUM))]
6173   "TARGET_64BIT"
6174   "lcgfr\t%0,%1"
6175   [(set_attr "op_type"  "RRE")])
6177 (define_insn "*neg<mode>2_cc"
6178   [(set (reg CC_REGNUM)
6179         (compare (neg:GPR (match_operand:GPR 1 "register_operand" "d"))
6180                  (const_int 0)))
6181    (set (match_operand:GPR 0 "register_operand" "=d")
6182         (neg:GPR (match_dup 1)))]
6183   "s390_match_ccmode (insn, CCAmode)"
6184   "lc<g>r\t%0,%1"
6185   [(set_attr "op_type"  "RR<E>")])
6186   
6187 (define_insn "*neg<mode>2_cconly"
6188   [(set (reg CC_REGNUM)
6189         (compare (neg:GPR (match_operand:GPR 1 "register_operand" "d"))
6190                  (const_int 0)))
6191    (clobber (match_scratch:GPR 0 "=d"))]
6192   "s390_match_ccmode (insn, CCAmode)"
6193   "lc<g>r\t%0,%1"
6194   [(set_attr "op_type"  "RR<E>")])
6195   
6196 (define_insn "*neg<mode>2"
6197   [(set (match_operand:GPR 0 "register_operand" "=d")
6198         (neg:GPR (match_operand:GPR 1 "register_operand" "d")))
6199    (clobber (reg:CC CC_REGNUM))]
6200   ""
6201   "lc<g>r\t%0,%1"
6202   [(set_attr "op_type"  "RR<E>")])
6204 (define_insn_and_split "*negdi2_31"
6205   [(set (match_operand:DI 0 "register_operand" "=d")
6206         (neg:DI (match_operand:DI 1 "register_operand" "d")))
6207    (clobber (reg:CC CC_REGNUM))]
6208   "!TARGET_64BIT"
6209   "#"
6210   "&& reload_completed"
6211   [(parallel
6212     [(set (match_dup 2) (neg:SI (match_dup 3)))
6213      (clobber (reg:CC CC_REGNUM))])
6214    (parallel
6215     [(set (reg:CCAP CC_REGNUM)
6216           (compare:CCAP (neg:SI (match_dup 5)) (const_int 0)))
6217      (set (match_dup 4) (neg:SI (match_dup 5)))])
6218    (set (pc)
6219         (if_then_else (ne (reg:CCAP CC_REGNUM) (const_int 0))
6220                       (pc)
6221                       (label_ref (match_dup 6))))
6222    (parallel
6223     [(set (match_dup 2) (plus:SI (match_dup 2) (const_int -1)))
6224      (clobber (reg:CC CC_REGNUM))])
6225    (match_dup 6)]
6226   "operands[2] = operand_subword (operands[0], 0, 0, DImode);
6227    operands[3] = operand_subword (operands[1], 0, 0, DImode);
6228    operands[4] = operand_subword (operands[0], 1, 0, DImode);
6229    operands[5] = operand_subword (operands[1], 1, 0, DImode);
6230    operands[6] = gen_label_rtx ();")
6233 ; neg(df|sf)2 instruction pattern(s).
6236 (define_expand "neg<mode>2"
6237   [(parallel
6238     [(set (match_operand:FPR 0 "register_operand" "=f")
6239           (neg:FPR (match_operand:FPR 1 "register_operand" "f")))
6240      (clobber (reg:CC CC_REGNUM))])]
6241   "TARGET_HARD_FLOAT"
6242   "")
6244 (define_insn "*neg<mode>2_cc"
6245   [(set (reg CC_REGNUM)
6246         (compare (neg:FPR (match_operand:FPR 1 "register_operand" "f"))
6247                  (match_operand:FPR 2 "const0_operand" "")))
6248    (set (match_operand:FPR 0 "register_operand" "=f")
6249         (neg:FPR (match_dup 1)))]
6250   "s390_match_ccmode (insn, CCSmode) && TARGET_HARD_FLOAT && TARGET_IEEE_FLOAT"
6251   "lc<xde>br\t%0,%1"
6252   [(set_attr "op_type"  "RRE")
6253    (set_attr "type"     "fsimp<mode>")])
6254   
6255 (define_insn "*neg<mode>2_cconly"
6256   [(set (reg CC_REGNUM)
6257         (compare (neg:FPR (match_operand:FPR 1 "register_operand" "f"))
6258                  (match_operand:FPR 2 "const0_operand" "")))
6259    (clobber (match_scratch:FPR 0 "=f"))]
6260   "s390_match_ccmode (insn, CCSmode) && TARGET_HARD_FLOAT && TARGET_IEEE_FLOAT"
6261   "lc<xde>br\t%0,%1"
6262   [(set_attr "op_type"  "RRE")
6263    (set_attr "type"     "fsimp<mode>")])
6264   
6265 (define_insn "*neg<mode>2"
6266   [(set (match_operand:FPR 0 "register_operand" "=f")
6267         (neg:FPR (match_operand:FPR 1 "register_operand" "f")))
6268    (clobber (reg:CC CC_REGNUM))]
6269   "TARGET_HARD_FLOAT && TARGET_IEEE_FLOAT"
6270   "lc<xde>br\t%0,%1"
6271   [(set_attr "op_type"  "RRE")
6272    (set_attr "type"     "fsimp<mode>")])
6274 (define_insn "*neg<mode>2_ibm"
6275   [(set (match_operand:FPR 0 "register_operand" "=f")
6276         (neg:FPR (match_operand:FPR 1 "register_operand" "f")))
6277    (clobber (reg:CC CC_REGNUM))]
6278   "TARGET_HARD_FLOAT && TARGET_IBM_FLOAT"
6279   "lc<xde>r\t%0,%1"
6280   [(set_attr "op_type"  "<RRe>")
6281    (set_attr "type"     "fsimp<mode>")])
6285 ;;- Absolute value instructions.
6289 ; abs(di|si)2 instruction pattern(s).
6292 (define_insn "*absdi2_sign_cc"
6293   [(set (reg CC_REGNUM)
6294         (compare (abs:DI (ashiftrt:DI (ashift:DI (subreg:DI
6295                            (match_operand:SI 1 "register_operand" "d") 0)
6296                            (const_int 32)) (const_int 32)))
6297                  (const_int 0)))
6298    (set (match_operand:DI 0 "register_operand" "=d")
6299         (abs:DI (sign_extend:DI (match_dup 1))))]
6300   "TARGET_64BIT && s390_match_ccmode (insn, CCAmode)"
6301   "lpgfr\t%0,%1"
6302   [(set_attr "op_type"  "RRE")])
6304 (define_insn "*absdi2_sign"
6305   [(set (match_operand:DI 0 "register_operand" "=d")
6306         (abs:DI (sign_extend:DI (match_operand:SI 1 "register_operand" "d"))))
6307    (clobber (reg:CC CC_REGNUM))]
6308   "TARGET_64BIT"
6309   "lpgfr\t%0,%1"
6310   [(set_attr "op_type"  "RRE")])
6312 (define_insn "*abs<mode>2_cc"
6313   [(set (reg CC_REGNUM)
6314         (compare (abs:GPR (match_operand:DI 1 "register_operand" "d"))
6315                  (const_int 0)))
6316    (set (match_operand:GPR 0 "register_operand" "=d")
6317         (abs:GPR (match_dup 1)))]
6318   "s390_match_ccmode (insn, CCAmode)"
6319   "lp<g>r\t%0,%1"
6320   [(set_attr "op_type"  "RR<E>")])
6321   
6322 (define_insn "*abs<mode>2_cconly"
6323   [(set (reg CC_REGNUM)
6324         (compare (abs:GPR (match_operand:GPR 1 "register_operand" "d"))
6325                  (const_int 0)))
6326    (clobber (match_scratch:GPR 0 "=d"))]
6327   "s390_match_ccmode (insn, CCAmode)"
6328   "lp<g>r\t%0,%1"
6329   [(set_attr "op_type"  "RR<E>")])
6330   
6331 (define_insn "abs<mode>2"
6332   [(set (match_operand:GPR 0 "register_operand" "=d")
6333         (abs:GPR (match_operand:GPR 1 "register_operand" "d")))
6334    (clobber (reg:CC CC_REGNUM))]
6335   ""
6336   "lp<g>r\t%0,%1"
6337   [(set_attr "op_type"  "RR<E>")])
6340 ; abs(df|sf)2 instruction pattern(s).
6343 (define_expand "abs<mode>2"
6344   [(parallel
6345     [(set (match_operand:FPR 0 "register_operand" "=f")
6346           (abs:FPR (match_operand:FPR 1 "register_operand" "f")))
6347      (clobber (reg:CC CC_REGNUM))])]
6348   "TARGET_HARD_FLOAT"
6349   "")
6351 (define_insn "*abs<mode>2_cc"
6352   [(set (reg CC_REGNUM)
6353         (compare (abs:FPR (match_operand:FPR 1 "register_operand" "f"))
6354                  (match_operand:FPR 2 "const0_operand" "")))
6355    (set (match_operand:FPR 0 "register_operand" "=f")
6356         (abs:FPR (match_dup 1)))]
6357   "s390_match_ccmode (insn, CCSmode) && TARGET_HARD_FLOAT && TARGET_IEEE_FLOAT"
6358   "lp<xde>br\t%0,%1"
6359   [(set_attr "op_type"  "RRE")
6360    (set_attr "type"     "fsimp<mode>")])
6361   
6362 (define_insn "*abs<mode>2_cconly"
6363   [(set (reg CC_REGNUM)
6364         (compare (abs:FPR (match_operand:FPR 1 "register_operand" "f"))
6365                  (match_operand:FPR 2 "const0_operand" "")))
6366    (clobber (match_scratch:FPR 0 "=f"))]
6367   "s390_match_ccmode (insn, CCSmode) && TARGET_HARD_FLOAT && TARGET_IEEE_FLOAT"
6368   "lp<xde>br\t%0,%1"
6369   [(set_attr "op_type"  "RRE")
6370    (set_attr "type"     "fsimp<mode>")])
6371   
6372 (define_insn "*abs<mode>2"
6373   [(set (match_operand:FPR 0 "register_operand" "=f")
6374         (abs:FPR (match_operand:FPR 1 "register_operand" "f")))
6375    (clobber (reg:CC CC_REGNUM))]
6376   "TARGET_HARD_FLOAT && TARGET_IEEE_FLOAT"
6377   "lp<xde>br\t%0,%1"
6378   [(set_attr "op_type"  "RRE")
6379    (set_attr "type"     "fsimp<mode>")])
6381 (define_insn "*abs<mode>2_ibm"
6382   [(set (match_operand:FPR 0 "register_operand" "=f")
6383         (abs:FPR (match_operand:FPR 1 "register_operand" "f")))
6384    (clobber (reg:CC CC_REGNUM))]
6385   "TARGET_HARD_FLOAT && TARGET_IBM_FLOAT"
6386   "lp<xde>r\t%0,%1"
6387   [(set_attr "op_type"  "<RRe>")
6388    (set_attr "type"     "fsimp<mode>")])
6391 ;;- Negated absolute value instructions
6395 ; Integer
6398 (define_insn "*negabsdi2_sign_cc"
6399   [(set (reg CC_REGNUM)
6400         (compare (neg:DI (abs:DI (ashiftrt:DI (ashift:DI (subreg:DI
6401                            (match_operand:SI 1 "register_operand" "d") 0)
6402                            (const_int 32)) (const_int 32))))
6403                  (const_int 0)))
6404    (set (match_operand:DI 0 "register_operand" "=d")
6405         (neg:DI (abs:DI (sign_extend:DI (match_dup 1)))))]
6406   "TARGET_64BIT && s390_match_ccmode (insn, CCAmode)"
6407   "lngfr\t%0,%1"
6408   [(set_attr "op_type"  "RRE")])
6410 (define_insn "*negabsdi2_sign"
6411   [(set (match_operand:DI 0 "register_operand" "=d")
6412         (neg:DI (abs:DI (sign_extend:DI
6413                           (match_operand:SI 1 "register_operand" "d")))))
6414    (clobber (reg:CC CC_REGNUM))]
6415   "TARGET_64BIT"
6416   "lngfr\t%0,%1"
6417   [(set_attr "op_type" "RRE")])
6419 (define_insn "*negabs<mode>2_cc"
6420   [(set (reg CC_REGNUM)
6421         (compare (neg:GPR (abs:GPR (match_operand:GPR 1 "register_operand" "d")))
6422                  (const_int 0)))
6423    (set (match_operand:GPR 0 "register_operand" "=d")
6424         (neg:GPR (abs:GPR (match_dup 1))))]
6425   "s390_match_ccmode (insn, CCAmode)"
6426   "ln<g>r\t%0,%1"
6427   [(set_attr "op_type"  "RR<E>")])
6428   
6429 (define_insn "*negabs<mode>2_cconly"
6430   [(set (reg CC_REGNUM)
6431         (compare (neg:GPR (abs:GPR (match_operand:GPR 1 "register_operand" "d")))
6432                  (const_int 0)))
6433    (clobber (match_scratch:GPR 0 "=d"))]
6434   "s390_match_ccmode (insn, CCAmode)"
6435   "ln<g>r\t%0,%1"
6436   [(set_attr "op_type"  "RR<E>")])
6437   
6438 (define_insn "*negabs<mode>2"
6439   [(set (match_operand:GPR 0 "register_operand" "=d")
6440         (neg:GPR (abs:GPR (match_operand:GPR 1 "register_operand" "d"))))
6441    (clobber (reg:CC CC_REGNUM))]
6442   ""
6443   "ln<g>r\t%0,%1"
6444   [(set_attr "op_type" "RR<E>")])
6447 ; Floating point
6450 (define_insn "*negabs<mode>2_cc"
6451   [(set (reg CC_REGNUM)
6452         (compare (neg:FPR (abs:FPR (match_operand:FPR 1 "register_operand" "f")))
6453                  (match_operand:FPR 2 "const0_operand" "")))
6454    (set (match_operand:FPR 0 "register_operand" "=f")
6455         (neg:FPR (abs:FPR (match_dup 1))))]
6456   "s390_match_ccmode (insn, CCSmode) && TARGET_HARD_FLOAT && TARGET_IEEE_FLOAT"
6457   "ln<xde>br\t%0,%1"
6458   [(set_attr "op_type"  "RRE")
6459    (set_attr "type"     "fsimp<mode>")])
6460   
6461 (define_insn "*negabs<mode>2_cconly"
6462   [(set (reg CC_REGNUM)
6463         (compare (neg:FPR (abs:FPR (match_operand:FPR 1 "register_operand" "f")))
6464                  (match_operand:FPR 2 "const0_operand" "")))
6465    (clobber (match_scratch:FPR 0 "=f"))]
6466   "s390_match_ccmode (insn, CCSmode) && TARGET_HARD_FLOAT && TARGET_IEEE_FLOAT"
6467   "ln<xde>br\t%0,%1"
6468   [(set_attr "op_type"  "RRE")
6469    (set_attr "type"     "fsimp<mode>")])
6470   
6471 (define_insn "*negabs<mode>2"
6472   [(set (match_operand:FPR 0 "register_operand" "=f")
6473         (neg:FPR (abs:FPR (match_operand:FPR 1 "register_operand" "f"))))
6474    (clobber (reg:CC CC_REGNUM))]
6475   "TARGET_HARD_FLOAT && TARGET_IEEE_FLOAT"
6476   "ln<xde>br\t%0,%1"
6477   [(set_attr "op_type"  "RRE")
6478    (set_attr "type"     "fsimp<mode>")])
6481 ;;- Square root instructions.
6485 ; sqrt(df|sf)2 instruction pattern(s).
6488 (define_insn "sqrt<mode>2"
6489   [(set (match_operand:FPR 0 "register_operand" "=f,f")
6490         (sqrt:FPR (match_operand:FPR 1 "general_operand" "f,<Rf>")))]
6491   "TARGET_HARD_FLOAT && TARGET_IEEE_FLOAT"
6492   "@
6493    sq<xde>br\t%0,%1
6494    sq<xde>b\t%0,%1"
6495   [(set_attr "op_type" "RRE,RXE")
6496    (set_attr "type" "fsqrt<mode>")])
6500 ;;- One complement instructions.
6504 ; one_cmpl(di|si|hi|qi)2 instruction pattern(s).
6507 (define_expand "one_cmpl<mode>2"
6508   [(parallel
6509     [(set (match_operand:INT 0 "register_operand" "")
6510           (xor:INT (match_operand:INT 1 "register_operand" "")
6511                    (const_int -1)))
6512      (clobber (reg:CC CC_REGNUM))])]
6513   ""
6514   "")
6518 ;; Find leftmost bit instructions.
6521 (define_expand "clzdi2"
6522   [(set (match_operand:DI 0 "register_operand" "=d")
6523         (clz:DI (match_operand:DI 1 "register_operand" "d")))]
6524   "TARGET_EXTIMM && TARGET_64BIT"
6526   rtx insn, clz_equal;
6527   rtx wide_reg = gen_reg_rtx (TImode);
6528   rtx msb = gen_rtx_CONST_INT (DImode, (unsigned HOST_WIDE_INT) 1 << 63);
6530   clz_equal = gen_rtx_CLZ (DImode, operands[1]);
6532   emit_insn (gen_clztidi2 (wide_reg, operands[1], msb));
6534   insn = emit_move_insn (operands[0], gen_highpart (DImode, wide_reg));  
6535   REG_NOTES (insn) =
6536         gen_rtx_EXPR_LIST (REG_EQUAL, clz_equal, REG_NOTES (insn));
6538   DONE;
6541 (define_insn "clztidi2"
6542   [(set (match_operand:TI 0 "register_operand" "=d")
6543         (ior:TI
6544           (ashift:TI 
6545             (zero_extend:TI 
6546               (xor:DI (match_operand:DI 1 "register_operand" "d")
6547                       (lshiftrt (match_operand:DI 2 "const_int_operand" "")
6548                                 (subreg:SI (clz:DI (match_dup 1)) 4))))
6549             
6550             (const_int 64))
6551           (zero_extend:TI (clz:DI (match_dup 1)))))
6552    (clobber (reg:CC CC_REGNUM))]
6553   "(unsigned HOST_WIDE_INT) INTVAL (operands[2]) 
6554    == (unsigned HOST_WIDE_INT) 1 << 63
6555    && TARGET_EXTIMM && TARGET_64BIT"
6556   "flogr\t%0,%1"
6557   [(set_attr "op_type"  "RRE")])
6561 ;;- Rotate instructions.
6565 ; rotl(di|si)3 instruction pattern(s).
6568 (define_insn "rotl<mode>3"
6569   [(set (match_operand:GPR 0 "register_operand" "=d")
6570         (rotate:GPR (match_operand:GPR 1 "register_operand" "d")
6571                     (match_operand:SI 2 "shift_count_or_setmem_operand" "Y")))]
6572   "TARGET_CPU_ZARCH"
6573   "rll<g>\t%0,%1,%Y2"
6574   [(set_attr "op_type"  "RSE")
6575    (set_attr "atype"    "reg")])
6577 (define_insn "*rotl<mode>3_and"
6578   [(set (match_operand:GPR 0 "register_operand" "=d")
6579         (rotate:GPR (match_operand:GPR 1 "register_operand" "d")
6580                     (and:SI (match_operand:SI 2 "shift_count_or_setmem_operand" "Y")
6581                             (match_operand:SI 3 "const_int_operand"   "n"))))]
6582   "TARGET_CPU_ZARCH && (INTVAL (operands[3]) & 63) == 63"
6583   "rll<g>\t%0,%1,%Y2"
6584   [(set_attr "op_type"  "RSE")
6585    (set_attr "atype"    "reg")])
6589 ;;- Shift instructions.
6593 ; (ashl|lshr)di3 instruction pattern(s).
6596 (define_expand "<shift>di3"
6597   [(set (match_operand:DI 0 "register_operand" "")
6598         (SHIFT:DI (match_operand:DI 1 "register_operand" "")
6599                   (match_operand:SI 2 "shift_count_or_setmem_operand" "")))]
6600   ""
6601   "")
6603 (define_insn "*<shift>di3_31"
6604   [(set (match_operand:DI 0 "register_operand" "=d")
6605         (SHIFT:DI (match_operand:DI 1 "register_operand" "0")
6606                   (match_operand:SI 2 "shift_count_or_setmem_operand" "Y")))]
6607   "!TARGET_64BIT"
6608   "s<lr>dl\t%0,%Y2"
6609   [(set_attr "op_type"  "RS")
6610    (set_attr "atype"    "reg")])
6612 (define_insn "*<shift>di3_64"
6613   [(set (match_operand:DI 0 "register_operand" "=d")
6614         (SHIFT:DI (match_operand:DI 1 "register_operand" "d")
6615                   (match_operand:SI 2 "shift_count_or_setmem_operand" "Y")))]
6616   "TARGET_64BIT"
6617   "s<lr>lg\t%0,%1,%Y2"
6618   [(set_attr "op_type"  "RSE")
6619    (set_attr "atype"    "reg")])
6621 (define_insn "*<shift>di3_31_and"
6622   [(set (match_operand:DI 0 "register_operand" "=d")
6623         (SHIFT:DI (match_operand:DI 1 "register_operand" "0")
6624                   (and:SI (match_operand:SI 2 "shift_count_or_setmem_operand" "Y")
6625                           (match_operand:SI 3 "const_int_operand"   "n"))))]
6626   "!TARGET_64BIT && (INTVAL (operands[3]) & 63) == 63"
6627   "s<lr>dl\t%0,%Y2"
6628   [(set_attr "op_type"  "RS")
6629    (set_attr "atype"    "reg")])
6631 (define_insn "*<shift>di3_64_and"
6632   [(set (match_operand:DI 0 "register_operand" "=d")
6633         (SHIFT:DI (match_operand:DI 1 "register_operand" "d")
6634                   (and:SI (match_operand:SI 2 "shift_count_or_setmem_operand" "Y")
6635                           (match_operand:SI 3 "const_int_operand"   "n"))))]
6636   "TARGET_64BIT && (INTVAL (operands[3]) & 63) == 63"
6637   "s<lr>lg\t%0,%1,%Y2"
6638   [(set_attr "op_type"  "RSE")
6639    (set_attr "atype"    "reg")])
6642 ; ashrdi3 instruction pattern(s).
6645 (define_expand "ashrdi3"
6646   [(parallel
6647     [(set (match_operand:DI 0 "register_operand" "")
6648           (ashiftrt:DI (match_operand:DI 1 "register_operand" "")
6649                        (match_operand:SI 2 "shift_count_or_setmem_operand" "")))
6650      (clobber (reg:CC CC_REGNUM))])]
6651   ""
6652   "")
6654 (define_insn "*ashrdi3_cc_31"
6655   [(set (reg CC_REGNUM)
6656         (compare (ashiftrt:DI (match_operand:DI 1 "register_operand" "0")
6657                               (match_operand:SI 2 "shift_count_or_setmem_operand" "Y"))
6658                  (const_int 0)))
6659    (set (match_operand:DI 0 "register_operand" "=d")
6660         (ashiftrt:DI (match_dup 1) (match_dup 2)))]
6661   "!TARGET_64BIT && s390_match_ccmode(insn, CCSmode)"
6662   "srda\t%0,%Y2"
6663   [(set_attr "op_type"  "RS")
6664    (set_attr "atype"    "reg")])
6666 (define_insn "*ashrdi3_cconly_31"
6667   [(set (reg CC_REGNUM)
6668         (compare (ashiftrt:DI (match_operand:DI 1 "register_operand" "0")
6669                               (match_operand:SI 2 "shift_count_or_setmem_operand" "Y"))
6670                  (const_int 0)))
6671    (clobber (match_scratch:DI 0 "=d"))]
6672   "!TARGET_64BIT && s390_match_ccmode(insn, CCSmode)"
6673   "srda\t%0,%Y2"
6674   [(set_attr "op_type"  "RS")
6675    (set_attr "atype"    "reg")])
6677 (define_insn "*ashrdi3_31"
6678   [(set (match_operand:DI 0 "register_operand" "=d")
6679         (ashiftrt:DI (match_operand:DI 1 "register_operand" "0")
6680                      (match_operand:SI 2 "shift_count_or_setmem_operand" "Y")))
6681    (clobber (reg:CC CC_REGNUM))]
6682   "!TARGET_64BIT"
6683   "srda\t%0,%Y2"
6684   [(set_attr "op_type"  "RS")
6685    (set_attr "atype"    "reg")])
6687 (define_insn "*ashrdi3_cc_64"
6688   [(set (reg CC_REGNUM)
6689         (compare (ashiftrt:DI (match_operand:DI 1 "register_operand" "d")
6690                               (match_operand:SI 2 "shift_count_or_setmem_operand" "Y"))
6691                  (const_int 0)))
6692    (set (match_operand:DI 0 "register_operand" "=d")
6693         (ashiftrt:DI (match_dup 1) (match_dup 2)))]
6694   "s390_match_ccmode(insn, CCSmode) && TARGET_64BIT"
6695   "srag\t%0,%1,%Y2"
6696   [(set_attr "op_type"  "RSE")
6697    (set_attr "atype"    "reg")])
6699 (define_insn "*ashrdi3_cconly_64"
6700   [(set (reg CC_REGNUM)
6701         (compare (ashiftrt:DI (match_operand:DI 1 "register_operand" "d")
6702                               (match_operand:SI 2 "shift_count_or_setmem_operand" "Y"))
6703                  (const_int 0)))
6704    (clobber (match_scratch:DI 0 "=d"))]
6705   "s390_match_ccmode(insn, CCSmode) && TARGET_64BIT"
6706   "srag\t%0,%1,%Y2"
6707   [(set_attr "op_type"  "RSE")
6708    (set_attr "atype"    "reg")])
6710 (define_insn "*ashrdi3_64"
6711   [(set (match_operand:DI 0 "register_operand" "=d")
6712         (ashiftrt:DI (match_operand:DI 1 "register_operand" "d")
6713                      (match_operand:SI 2 "shift_count_or_setmem_operand" "Y")))
6714    (clobber (reg:CC CC_REGNUM))]
6715   "TARGET_64BIT"
6716   "srag\t%0,%1,%Y2"
6717   [(set_attr "op_type"  "RSE")
6718    (set_attr "atype"    "reg")])
6721 ; shift pattern with implicit ANDs
6723 (define_insn "*ashrdi3_cc_31_and"
6724   [(set (reg CC_REGNUM)
6725         (compare (ashiftrt:DI (match_operand:DI 1 "register_operand" "0")
6726                               (and:SI (match_operand:SI 2 "shift_count_or_setmem_operand" "Y")
6727                                       (match_operand:SI 3 "const_int_operand"   "n")))
6728                  (const_int 0)))
6729    (set (match_operand:DI 0 "register_operand" "=d")
6730         (ashiftrt:DI (match_dup 1) (and:SI (match_dup 2) (match_dup 3))))]
6731   "!TARGET_64BIT && s390_match_ccmode(insn, CCSmode)
6732    && (INTVAL (operands[3]) & 63) == 63"
6733   "srda\t%0,%Y2"
6734   [(set_attr "op_type"  "RS")
6735    (set_attr "atype"    "reg")])
6737 (define_insn "*ashrdi3_cconly_31_and"
6738   [(set (reg CC_REGNUM)
6739         (compare (ashiftrt:DI (match_operand:DI 1 "register_operand" "0")
6740                               (and:SI (match_operand:SI 2 "shift_count_or_setmem_operand" "Y")
6741                                       (match_operand:SI 3 "const_int_operand"   "n")))
6742                  (const_int 0)))
6743    (clobber (match_scratch:DI 0 "=d"))]
6744   "!TARGET_64BIT && s390_match_ccmode(insn, CCSmode)
6745    && (INTVAL (operands[3]) & 63) == 63"
6746   "srda\t%0,%Y2"
6747   [(set_attr "op_type"  "RS")
6748    (set_attr "atype"    "reg")])
6750 (define_insn "*ashrdi3_31_and"
6751   [(set (match_operand:DI 0 "register_operand" "=d")
6752         (ashiftrt:DI (match_operand:DI 1 "register_operand" "0")
6753                      (and:SI (match_operand:SI 2 "shift_count_or_setmem_operand" "Y")
6754                              (match_operand:SI 3 "const_int_operand"   "n"))))
6755    (clobber (reg:CC CC_REGNUM))]
6756   "!TARGET_64BIT && (INTVAL (operands[3]) & 63) == 63"
6757   "srda\t%0,%Y2"
6758   [(set_attr "op_type"  "RS")
6759    (set_attr "atype"    "reg")])
6761 (define_insn "*ashrdi3_cc_64_and"
6762   [(set (reg CC_REGNUM)
6763         (compare (ashiftrt:DI (match_operand:DI 1 "register_operand" "d")
6764                               (and:SI (match_operand:SI 2 "shift_count_or_setmem_operand" "Y")
6765                                       (match_operand:SI 3 "const_int_operand"   "n")))
6766                  (const_int 0)))
6767    (set (match_operand:DI 0 "register_operand" "=d")
6768         (ashiftrt:DI (match_dup 1) (and:SI (match_dup 2) (match_dup 3))))]
6769   "TARGET_64BIT && s390_match_ccmode(insn, CCSmode)
6770    && (INTVAL (operands[3]) & 63) == 63"
6771   "srag\t%0,%1,%Y2"
6772   [(set_attr "op_type"  "RSE")
6773    (set_attr "atype"    "reg")])
6775 (define_insn "*ashrdi3_cconly_64_and"
6776   [(set (reg CC_REGNUM)
6777         (compare (ashiftrt:DI (match_operand:DI 1 "register_operand" "d")
6778                               (and:SI (match_operand:SI 2 "shift_count_or_setmem_operand" "Y")
6779                                       (match_operand:SI 3 "const_int_operand"   "n")))
6780                  (const_int 0)))
6781    (clobber (match_scratch:DI 0 "=d"))]
6782   "TARGET_64BIT && s390_match_ccmode(insn, CCSmode)
6783    && (INTVAL (operands[3]) & 63) == 63"
6784   "srag\t%0,%1,%Y2"
6785   [(set_attr "op_type"  "RSE")
6786    (set_attr "atype"    "reg")])
6788 (define_insn "*ashrdi3_64_and"
6789   [(set (match_operand:DI 0 "register_operand" "=d")
6790         (ashiftrt:DI (match_operand:DI 1 "register_operand" "d")
6791                      (and:SI (match_operand:SI 2 "shift_count_or_setmem_operand" "Y")
6792                              (match_operand:SI 3 "const_int_operand"   "n"))))
6793    (clobber (reg:CC CC_REGNUM))]
6794   "TARGET_64BIT && (INTVAL (operands[3]) & 63) == 63"
6795   "srag\t%0,%1,%Y2"
6796   [(set_attr "op_type"  "RSE")
6797    (set_attr "atype"    "reg")])
6800 ; (ashl|lshr)si3 instruction pattern(s).
6803 (define_insn "<shift>si3"
6804   [(set (match_operand:SI 0 "register_operand" "=d")
6805         (SHIFT:SI (match_operand:SI 1 "register_operand" "0")
6806                   (match_operand:SI 2 "shift_count_or_setmem_operand" "Y")))]
6807   ""
6808   "s<lr>l\t%0,%Y2"
6809   [(set_attr "op_type"  "RS")
6810    (set_attr "atype"    "reg")])
6812 (define_insn "*<shift>si3_and"
6813   [(set (match_operand:SI 0 "register_operand" "=d")
6814         (SHIFT:SI (match_operand:SI 1 "register_operand" "0")
6815                   (and:SI (match_operand:SI 2 "shift_count_or_setmem_operand" "Y")
6816                           (match_operand:SI 3 "const_int_operand"   "n"))))]
6817   "(INTVAL (operands[3]) & 63) == 63"
6818   "s<lr>l\t%0,%Y2"
6819   [(set_attr "op_type"  "RS")
6820    (set_attr "atype"    "reg")])
6823 ; ashrsi3 instruction pattern(s).
6826 (define_insn "*ashrsi3_cc"
6827   [(set (reg CC_REGNUM)
6828         (compare (ashiftrt:SI (match_operand:SI 1 "register_operand" "0")
6829                               (match_operand:SI 2 "shift_count_or_setmem_operand" "Y"))
6830                  (const_int 0)))
6831    (set (match_operand:SI 0 "register_operand" "=d")
6832         (ashiftrt:SI (match_dup 1) (match_dup 2)))]
6833   "s390_match_ccmode(insn, CCSmode)"
6834   "sra\t%0,%Y2"
6835   [(set_attr "op_type"  "RS")
6836    (set_attr "atype"    "reg")])
6839 (define_insn "*ashrsi3_cconly"
6840   [(set (reg CC_REGNUM)
6841         (compare (ashiftrt:SI (match_operand:SI 1 "register_operand" "0")
6842                               (match_operand:SI 2 "shift_count_or_setmem_operand" "Y"))
6843                  (const_int 0)))
6844    (clobber (match_scratch:SI 0 "=d"))]
6845   "s390_match_ccmode(insn, CCSmode)"
6846   "sra\t%0,%Y2"
6847   [(set_attr "op_type"  "RS")
6848    (set_attr "atype"    "reg")])
6850 (define_insn "ashrsi3"
6851   [(set (match_operand:SI 0 "register_operand" "=d")
6852         (ashiftrt:SI (match_operand:SI 1 "register_operand" "0")
6853                      (match_operand:SI 2 "shift_count_or_setmem_operand" "Y")))
6854    (clobber (reg:CC CC_REGNUM))]
6855   ""
6856   "sra\t%0,%Y2"
6857   [(set_attr "op_type"  "RS")
6858    (set_attr "atype"    "reg")])
6860 ; with implicit ANDs
6862 (define_insn "*ashrsi3_cc_and"
6863   [(set (reg CC_REGNUM)
6864         (compare (ashiftrt:SI (match_operand:SI 1 "register_operand" "0")
6865                               (and:SI (match_operand:SI 2 "shift_count_or_setmem_operand" "Y")
6866                                       (match_operand:SI 3 "const_int_operand"   "n")))
6867                  (const_int 0)))
6868    (set (match_operand:SI 0 "register_operand" "=d")
6869         (ashiftrt:SI (match_dup 1) (and:SI (match_dup 2) (match_dup 3))))]
6870   "s390_match_ccmode(insn, CCSmode) && (INTVAL (operands[3]) & 63) == 63"
6871   "sra\t%0,%Y2"
6872   [(set_attr "op_type"  "RS")
6873    (set_attr "atype"    "reg")])
6876 (define_insn "*ashrsi3_cconly_and"
6877   [(set (reg CC_REGNUM)
6878         (compare (ashiftrt:SI (match_operand:SI 1 "register_operand" "0")
6879                               (and:SI (match_operand:SI 2 "shift_count_or_setmem_operand" "Y")
6880                                       (match_operand:SI 3 "const_int_operand"   "n")))
6881                  (const_int 0)))
6882    (clobber (match_scratch:SI 0 "=d"))]
6883   "s390_match_ccmode(insn, CCSmode) && (INTVAL (operands[3]) & 63) == 63"
6884   "sra\t%0,%Y2"
6885   [(set_attr "op_type"  "RS")
6886    (set_attr "atype"    "reg")])
6888 (define_insn "*ashrsi3_and"
6889   [(set (match_operand:SI 0 "register_operand" "=d")
6890         (ashiftrt:SI (match_operand:SI 1 "register_operand" "0")
6891                      (and:SI (match_operand:SI 2 "shift_count_or_setmem_operand" "Y")
6892                              (match_operand:SI 3 "const_int_operand"   "n"))))
6893    (clobber (reg:CC CC_REGNUM))]
6894   "(INTVAL (operands[3]) & 63) == 63"
6895   "sra\t%0,%Y2"
6896   [(set_attr "op_type"  "RS")
6897    (set_attr "atype"    "reg")])
6901 ;; Branch instruction patterns.
6904 (define_expand "b<code>"
6905   [(set (pc)
6906         (if_then_else (COMPARE (match_operand 0 "" "")
6907                                (const_int 0))
6908                       (match_dup 0)
6909                       (pc)))]
6910   ""
6911   "s390_emit_jump (operands[0],
6912     s390_emit_compare (<CODE>, s390_compare_op0, s390_compare_op1)); DONE;")
6916 ;;- Conditional jump instructions.
6919 (define_insn "*cjump_64"
6920   [(set (pc)
6921         (if_then_else
6922           (match_operator 1 "s390_comparison" [(reg CC_REGNUM) (const_int 0)])
6923           (label_ref (match_operand 0 "" ""))
6924           (pc)))]
6925   "TARGET_CPU_ZARCH"
6927   if (get_attr_length (insn) == 4)
6928     return "j%C1\t%l0";
6929   else
6930     return "jg%C1\t%l0";
6932   [(set_attr "op_type" "RI")
6933    (set_attr "type"    "branch")
6934    (set (attr "length")
6935         (if_then_else (lt (abs (minus (pc) (match_dup 0))) (const_int 60000))
6936                       (const_int 4) (const_int 6)))])
6938 (define_insn "*cjump_31"
6939   [(set (pc)
6940         (if_then_else
6941           (match_operator 1 "s390_comparison" [(reg CC_REGNUM) (const_int 0)])
6942           (label_ref (match_operand 0 "" ""))
6943           (pc)))]
6944   "!TARGET_CPU_ZARCH"
6946   gcc_assert (get_attr_length (insn) == 4);
6947   return "j%C1\t%l0";
6949   [(set_attr "op_type" "RI")
6950    (set_attr "type"    "branch")
6951    (set (attr "length")
6952         (if_then_else (eq (symbol_ref "flag_pic") (const_int 0))
6953           (if_then_else (lt (abs (minus (pc) (match_dup 0))) (const_int 60000))
6954                         (const_int 4) (const_int 6))
6955           (if_then_else (lt (abs (minus (pc) (match_dup 0))) (const_int 60000))
6956                         (const_int 4) (const_int 8))))])
6958 (define_insn "*cjump_long"
6959   [(set (pc)
6960         (if_then_else
6961           (match_operator 1 "s390_comparison" [(reg CC_REGNUM) (const_int 0)])
6962           (match_operand 0 "address_operand" "U")
6963           (pc)))]
6964   ""
6966   if (get_attr_op_type (insn) == OP_TYPE_RR)
6967     return "b%C1r\t%0";
6968   else
6969     return "b%C1\t%a0";
6971   [(set (attr "op_type")
6972         (if_then_else (match_operand 0 "register_operand" "")
6973                       (const_string "RR") (const_string "RX")))
6974    (set_attr "type"  "branch")
6975    (set_attr "atype" "agen")])
6979 ;;- Negated conditional jump instructions.
6982 (define_insn "*icjump_64"
6983   [(set (pc)
6984         (if_then_else
6985           (match_operator 1 "s390_comparison" [(reg CC_REGNUM) (const_int 0)])
6986           (pc)
6987           (label_ref (match_operand 0 "" ""))))]
6988   "TARGET_CPU_ZARCH"
6990   if (get_attr_length (insn) == 4)
6991     return "j%D1\t%l0";
6992   else
6993     return "jg%D1\t%l0";
6995   [(set_attr "op_type" "RI")
6996    (set_attr "type"    "branch")
6997    (set (attr "length")
6998         (if_then_else (lt (abs (minus (pc) (match_dup 0))) (const_int 60000))
6999                       (const_int 4) (const_int 6)))])
7001 (define_insn "*icjump_31"
7002   [(set (pc)
7003         (if_then_else
7004           (match_operator 1 "s390_comparison" [(reg CC_REGNUM) (const_int 0)])
7005           (pc)
7006           (label_ref (match_operand 0 "" ""))))]
7007   "!TARGET_CPU_ZARCH"
7009   gcc_assert (get_attr_length (insn) == 4);
7010   return "j%D1\t%l0";
7012   [(set_attr "op_type" "RI")
7013    (set_attr "type"    "branch")
7014    (set (attr "length")
7015         (if_then_else (eq (symbol_ref "flag_pic") (const_int 0))
7016           (if_then_else (lt (abs (minus (pc) (match_dup 0))) (const_int 60000))
7017                         (const_int 4) (const_int 6))
7018           (if_then_else (lt (abs (minus (pc) (match_dup 0))) (const_int 60000))
7019                         (const_int 4) (const_int 8))))])
7021 (define_insn "*icjump_long"
7022   [(set (pc)
7023         (if_then_else
7024           (match_operator 1 "s390_comparison" [(reg CC_REGNUM) (const_int 0)])
7025           (pc)
7026           (match_operand 0 "address_operand" "U")))]
7027   ""
7029   if (get_attr_op_type (insn) == OP_TYPE_RR)
7030     return "b%D1r\t%0";
7031   else
7032     return "b%D1\t%a0";
7034   [(set (attr "op_type")
7035         (if_then_else (match_operand 0 "register_operand" "")
7036                       (const_string "RR") (const_string "RX")))
7037    (set_attr "type"  "branch")
7038    (set_attr "atype" "agen")])
7041 ;;- Trap instructions.
7044 (define_insn "trap"
7045   [(trap_if (const_int 1) (const_int 0))]
7046   ""
7047   "j\t.+2"
7048   [(set_attr "op_type" "RI")
7049    (set_attr "type"  "branch")])
7051 (define_expand "conditional_trap"
7052   [(trap_if (match_operand 0 "comparison_operator" "")
7053             (match_operand 1 "general_operand" ""))]
7054   ""
7056   if (operands[1] != const0_rtx) FAIL;
7057   operands[0] = s390_emit_compare (GET_CODE (operands[0]), 
7058                                    s390_compare_op0, s390_compare_op1);
7061 (define_insn "*trap"
7062   [(trap_if (match_operator 0 "s390_comparison" [(reg CC_REGNUM) (const_int 0)])
7063             (const_int 0))]
7064   ""
7065   "j%C0\t.+2";
7066   [(set_attr "op_type" "RI")
7067    (set_attr "type"  "branch")])
7070 ;;- Loop instructions.
7072 ;;  This is all complicated by the fact that since this is a jump insn
7073 ;;  we must handle our own output reloads.
7075 (define_expand "doloop_end"
7076   [(use (match_operand 0 "" ""))        ; loop pseudo
7077    (use (match_operand 1 "" ""))        ; iterations; zero if unknown
7078    (use (match_operand 2 "" ""))        ; max iterations
7079    (use (match_operand 3 "" ""))        ; loop level
7080    (use (match_operand 4 "" ""))]       ; label
7081   ""
7083   if (GET_MODE (operands[0]) == SImode && !TARGET_CPU_ZARCH)
7084     emit_jump_insn (gen_doloop_si31 (operands[4], operands[0], operands[0]));
7085   else if (GET_MODE (operands[0]) == SImode && TARGET_CPU_ZARCH)
7086     emit_jump_insn (gen_doloop_si64 (operands[4], operands[0], operands[0]));
7087   else if (GET_MODE (operands[0]) == DImode && TARGET_64BIT)
7088     emit_jump_insn (gen_doloop_di (operands[4], operands[0], operands[0]));
7089   else
7090     FAIL;
7092   DONE;
7095 (define_insn_and_split "doloop_si64"
7096   [(set (pc)
7097         (if_then_else
7098           (ne (match_operand:SI 1 "register_operand" "d,d")
7099               (const_int 1))
7100           (label_ref (match_operand 0 "" ""))
7101           (pc)))
7102    (set (match_operand:SI 2 "nonimmediate_operand" "=1,?*m*d")
7103         (plus:SI (match_dup 1) (const_int -1)))
7104    (clobber (match_scratch:SI 3 "=X,&1"))
7105    (clobber (reg:CC CC_REGNUM))]
7106   "TARGET_CPU_ZARCH"
7108   if (which_alternative != 0)
7109     return "#";
7110   else if (get_attr_length (insn) == 4)
7111     return "brct\t%1,%l0";
7112   else
7113     return "ahi\t%1,-1\;jgne\t%l0";
7115   "&& reload_completed
7116    && (! REG_P (operands[2])
7117        || ! rtx_equal_p (operands[1], operands[2]))"
7118   [(parallel [(set (reg:CCAN CC_REGNUM)
7119                    (compare:CCAN (plus:SI (match_dup 3) (const_int -1))
7120                                  (const_int 0)))
7121               (set (match_dup 3) (plus:SI (match_dup 3) (const_int -1)))])
7122    (set (match_dup 2) (match_dup 3))
7123    (set (pc) (if_then_else (ne (reg:CCAN CC_REGNUM) (const_int 0))
7124                            (label_ref (match_dup 0))
7125                            (pc)))]
7126   ""
7127   [(set_attr "op_type"  "RI")
7128    (set_attr "type"  "branch")
7129    (set (attr "length")
7130         (if_then_else (lt (abs (minus (pc) (match_dup 0))) (const_int 60000))
7131                       (const_int 4) (const_int 10)))])
7133 (define_insn_and_split "doloop_si31"
7134   [(set (pc)
7135         (if_then_else
7136           (ne (match_operand:SI 1 "register_operand" "d,d")
7137               (const_int 1))
7138           (label_ref (match_operand 0 "" ""))
7139           (pc)))
7140    (set (match_operand:SI 2 "nonimmediate_operand" "=1,?*m*d")
7141         (plus:SI (match_dup 1) (const_int -1)))
7142    (clobber (match_scratch:SI 3 "=X,&1"))
7143    (clobber (reg:CC CC_REGNUM))]
7144   "!TARGET_CPU_ZARCH"
7146   if (which_alternative != 0)
7147     return "#";
7148   else if (get_attr_length (insn) == 4)
7149     return "brct\t%1,%l0";
7150   else
7151     gcc_unreachable ();
7153   "&& reload_completed
7154    && (! REG_P (operands[2])
7155        || ! rtx_equal_p (operands[1], operands[2]))"
7156   [(parallel [(set (reg:CCAN CC_REGNUM)
7157                    (compare:CCAN (plus:SI (match_dup 3) (const_int -1))
7158                                  (const_int 0)))
7159               (set (match_dup 3) (plus:SI (match_dup 3) (const_int -1)))])
7160    (set (match_dup 2) (match_dup 3))
7161    (set (pc) (if_then_else (ne (reg:CCAN CC_REGNUM) (const_int 0))
7162                            (label_ref (match_dup 0))
7163                            (pc)))]
7164   ""
7165   [(set_attr "op_type"  "RI")
7166    (set_attr "type"  "branch")
7167    (set (attr "length")
7168         (if_then_else (eq (symbol_ref "flag_pic") (const_int 0))
7169           (if_then_else (lt (abs (minus (pc) (match_dup 0))) (const_int 60000))
7170                         (const_int 4) (const_int 6))
7171           (if_then_else (lt (abs (minus (pc) (match_dup 0))) (const_int 60000))
7172                         (const_int 4) (const_int 8))))])
7174 (define_insn "*doloop_si_long"
7175   [(set (pc)
7176         (if_then_else
7177           (ne (match_operand:SI 1 "register_operand" "d,d")
7178               (const_int 1))
7179           (match_operand 0 "address_operand" "U,U")
7180           (pc)))
7181    (set (match_operand:SI 2 "register_operand" "=1,?*m*d")
7182         (plus:SI (match_dup 1) (const_int -1)))
7183    (clobber (match_scratch:SI 3 "=X,&1"))
7184    (clobber (reg:CC CC_REGNUM))]
7185   "!TARGET_CPU_ZARCH"
7187   if (get_attr_op_type (insn) == OP_TYPE_RR)
7188     return "bctr\t%1,%0";
7189   else
7190     return "bct\t%1,%a0";
7192   [(set (attr "op_type")
7193         (if_then_else (match_operand 0 "register_operand" "")
7194                       (const_string "RR") (const_string "RX")))
7195    (set_attr "type"  "branch")
7196    (set_attr "atype" "agen")])
7198 (define_insn_and_split "doloop_di"
7199   [(set (pc)
7200         (if_then_else
7201           (ne (match_operand:DI 1 "register_operand" "d,d")
7202               (const_int 1))
7203           (label_ref (match_operand 0 "" ""))
7204           (pc)))
7205    (set (match_operand:DI 2 "nonimmediate_operand" "=1,?*m*d")
7206         (plus:DI (match_dup 1) (const_int -1)))
7207    (clobber (match_scratch:DI 3 "=X,&1"))
7208    (clobber (reg:CC CC_REGNUM))]
7209   "TARGET_64BIT"
7211   if (which_alternative != 0)
7212     return "#";
7213   else if (get_attr_length (insn) == 4)
7214     return "brctg\t%1,%l0";
7215   else
7216     return "aghi\t%1,-1\;jgne\t%l0";
7218   "&& reload_completed
7219    && (! REG_P (operands[2])
7220        || ! rtx_equal_p (operands[1], operands[2]))"
7221   [(parallel [(set (reg:CCAN CC_REGNUM)
7222                    (compare:CCAN (plus:DI (match_dup 3) (const_int -1))
7223                                  (const_int 0)))
7224               (set (match_dup 3) (plus:DI (match_dup 3) (const_int -1)))])
7225    (set (match_dup 2) (match_dup 3))
7226    (set (pc) (if_then_else (ne (reg:CCAN CC_REGNUM) (const_int 0))
7227                            (label_ref (match_dup 0))
7228                            (pc)))]
7229   ""
7230   [(set_attr "op_type"  "RI")
7231    (set_attr "type"  "branch")
7232    (set (attr "length")
7233         (if_then_else (lt (abs (minus (pc) (match_dup 0))) (const_int 60000))
7234                       (const_int 4) (const_int 10)))])
7237 ;;- Unconditional jump instructions.
7241 ; jump instruction pattern(s).
7244 (define_expand "jump"
7245   [(match_operand 0 "" "")]
7246   ""
7247   "s390_emit_jump (operands[0], NULL_RTX); DONE;")
7249 (define_insn "*jump64"
7250   [(set (pc) (label_ref (match_operand 0 "" "")))]
7251   "TARGET_CPU_ZARCH"
7253   if (get_attr_length (insn) == 4)
7254     return "j\t%l0";
7255   else
7256     return "jg\t%l0";
7258   [(set_attr "op_type" "RI")
7259    (set_attr "type"  "branch")
7260    (set (attr "length")
7261         (if_then_else (lt (abs (minus (pc) (match_dup 0))) (const_int 60000))
7262                       (const_int 4) (const_int 6)))])
7264 (define_insn "*jump31"
7265   [(set (pc) (label_ref (match_operand 0 "" "")))]
7266   "!TARGET_CPU_ZARCH"
7268   gcc_assert (get_attr_length (insn) == 4);
7269   return "j\t%l0";
7271   [(set_attr "op_type" "RI")
7272    (set_attr "type"  "branch")
7273    (set (attr "length")
7274         (if_then_else (eq (symbol_ref "flag_pic") (const_int 0))
7275           (if_then_else (lt (abs (minus (pc) (match_dup 0))) (const_int 60000))
7276                         (const_int 4) (const_int 6))
7277           (if_then_else (lt (abs (minus (pc) (match_dup 0))) (const_int 60000))
7278                         (const_int 4) (const_int 8))))])
7281 ; indirect-jump instruction pattern(s).
7284 (define_insn "indirect_jump"
7285  [(set (pc) (match_operand 0 "address_operand" "U"))]
7286   ""
7288   if (get_attr_op_type (insn) == OP_TYPE_RR)
7289     return "br\t%0";
7290   else
7291     return "b\t%a0";
7293   [(set (attr "op_type")
7294         (if_then_else (match_operand 0 "register_operand" "")
7295                       (const_string "RR") (const_string "RX")))
7296    (set_attr "type"  "branch")
7297    (set_attr "atype" "agen")])
7300 ; casesi instruction pattern(s).
7303 (define_insn "casesi_jump"
7304  [(set (pc) (match_operand 0 "address_operand" "U"))
7305    (use (label_ref (match_operand 1 "" "")))]
7306   ""
7308   if (get_attr_op_type (insn) == OP_TYPE_RR)
7309     return "br\t%0";
7310   else
7311     return "b\t%a0";
7313   [(set (attr "op_type")
7314         (if_then_else (match_operand 0 "register_operand" "")
7315                       (const_string "RR") (const_string "RX")))
7316    (set_attr "type"  "branch")
7317    (set_attr "atype" "agen")])
7319 (define_expand "casesi"
7320   [(match_operand:SI 0 "general_operand" "")
7321    (match_operand:SI 1 "general_operand" "")
7322    (match_operand:SI 2 "general_operand" "")
7323    (label_ref (match_operand 3 "" ""))
7324    (label_ref (match_operand 4 "" ""))]
7325   ""
7327    rtx index  = gen_reg_rtx (SImode);
7328    rtx base   = gen_reg_rtx (Pmode);
7329    rtx target = gen_reg_rtx (Pmode);
7331    emit_move_insn (index, operands[0]);
7332    emit_insn (gen_subsi3 (index, index, operands[1]));
7333    emit_cmp_and_jump_insns (index, operands[2], GTU, NULL_RTX, SImode, 1,
7334                             operands[4]);
7336    if (Pmode != SImode)
7337      index = convert_to_mode (Pmode, index, 1);
7338    if (GET_CODE (index) != REG)
7339      index = copy_to_mode_reg (Pmode, index);
7341    if (TARGET_64BIT)
7342        emit_insn (gen_ashldi3 (index, index, GEN_INT (3)));
7343    else
7344        emit_insn (gen_ashlsi3 (index, index, const2_rtx));
7346    emit_move_insn (base, gen_rtx_LABEL_REF (Pmode, operands[3]));
7348    index = gen_const_mem (Pmode, gen_rtx_PLUS (Pmode, base, index));
7349    emit_move_insn (target, index);
7351    if (flag_pic)
7352      target = gen_rtx_PLUS (Pmode, base, target);
7353    emit_jump_insn (gen_casesi_jump (target, operands[3]));
7355    DONE;
7360 ;;- Jump to subroutine.
7365 ; untyped call instruction pattern(s).
7368 ;; Call subroutine returning any type.
7369 (define_expand "untyped_call"
7370   [(parallel [(call (match_operand 0 "" "")
7371                     (const_int 0))
7372               (match_operand 1 "" "")
7373               (match_operand 2 "" "")])]
7374   ""
7376   int i;
7378   emit_call_insn (gen_call (operands[0], const0_rtx, const0_rtx));
7380   for (i = 0; i < XVECLEN (operands[2], 0); i++)
7381     {
7382       rtx set = XVECEXP (operands[2], 0, i);
7383       emit_move_insn (SET_DEST (set), SET_SRC (set));
7384     }
7386   /* The optimizer does not know that the call sets the function value
7387      registers we stored in the result block.  We avoid problems by
7388      claiming that all hard registers are used and clobbered at this
7389      point.  */
7390   emit_insn (gen_blockage ());
7392   DONE;
7395 ;; UNSPEC_VOLATILE is considered to use and clobber all hard registers and
7396 ;; all of memory.  This blocks insns from being moved across this point.
7398 (define_insn "blockage"
7399   [(unspec_volatile [(const_int 0)] UNSPECV_BLOCKAGE)]
7400   ""
7401   ""
7402   [(set_attr "type"    "none")
7403    (set_attr "length"  "0")])
7406 ; sibcall patterns
7409 (define_expand "sibcall"
7410   [(call (match_operand 0 "" "")
7411          (match_operand 1 "" ""))]
7412   ""
7414   s390_emit_call (XEXP (operands[0], 0), NULL_RTX, NULL_RTX, NULL_RTX);
7415   DONE;
7418 (define_insn "*sibcall_br"
7419   [(call (mem:QI (reg SIBCALL_REGNUM))
7420          (match_operand 0 "const_int_operand" "n"))]
7421   "SIBLING_CALL_P (insn)
7422    && GET_MODE (XEXP (XEXP (PATTERN (insn), 0), 0)) == Pmode"
7423   "br\t%%r1"
7424   [(set_attr "op_type" "RR")
7425    (set_attr "type"  "branch")
7426    (set_attr "atype" "agen")])
7428 (define_insn "*sibcall_brc"
7429   [(call (mem:QI (match_operand 0 "bras_sym_operand" "X"))
7430          (match_operand 1 "const_int_operand" "n"))]
7431   "SIBLING_CALL_P (insn) && TARGET_SMALL_EXEC"
7432   "j\t%0"
7433   [(set_attr "op_type" "RI")
7434    (set_attr "type"    "branch")])
7436 (define_insn "*sibcall_brcl"
7437   [(call (mem:QI (match_operand 0 "bras_sym_operand" "X"))
7438          (match_operand 1 "const_int_operand" "n"))]
7439   "SIBLING_CALL_P (insn) && TARGET_CPU_ZARCH"
7440   "jg\t%0"
7441   [(set_attr "op_type" "RIL")
7442    (set_attr "type"    "branch")])
7445 ; sibcall_value patterns
7448 (define_expand "sibcall_value"
7449   [(set (match_operand 0 "" "")
7450         (call (match_operand 1 "" "")
7451               (match_operand 2 "" "")))]
7452   ""
7454   s390_emit_call (XEXP (operands[1], 0), NULL_RTX, operands[0], NULL_RTX);
7455   DONE;
7458 (define_insn "*sibcall_value_br"
7459   [(set (match_operand 0 "" "")
7460         (call (mem:QI (reg SIBCALL_REGNUM))
7461               (match_operand 1 "const_int_operand" "n")))]
7462   "SIBLING_CALL_P (insn)
7463    && GET_MODE (XEXP (XEXP (XEXP (PATTERN (insn), 1), 0), 0)) == Pmode"
7464   "br\t%%r1"
7465   [(set_attr "op_type" "RR")
7466    (set_attr "type"  "branch")
7467    (set_attr "atype" "agen")])
7469 (define_insn "*sibcall_value_brc"
7470   [(set (match_operand 0 "" "")
7471         (call (mem:QI (match_operand 1 "bras_sym_operand" "X"))
7472               (match_operand 2 "const_int_operand" "n")))]
7473   "SIBLING_CALL_P (insn) && TARGET_SMALL_EXEC"
7474   "j\t%1"
7475   [(set_attr "op_type" "RI")
7476    (set_attr "type"    "branch")])
7478 (define_insn "*sibcall_value_brcl"
7479   [(set (match_operand 0 "" "")
7480         (call (mem:QI (match_operand 1 "bras_sym_operand" "X"))
7481               (match_operand 2 "const_int_operand" "n")))]
7482   "SIBLING_CALL_P (insn) && TARGET_CPU_ZARCH"
7483   "jg\t%1"
7484   [(set_attr "op_type" "RIL")
7485    (set_attr "type"    "branch")])
7489 ; call instruction pattern(s).
7492 (define_expand "call"
7493   [(call (match_operand 0 "" "")
7494          (match_operand 1 "" ""))
7495    (use (match_operand 2 "" ""))]
7496   ""
7498   s390_emit_call (XEXP (operands[0], 0), NULL_RTX, NULL_RTX,
7499                   gen_rtx_REG (Pmode, RETURN_REGNUM));
7500   DONE;
7503 (define_insn "*bras"
7504   [(call (mem:QI (match_operand 0 "bras_sym_operand" "X"))
7505          (match_operand 1 "const_int_operand" "n"))
7506    (clobber (match_operand 2 "register_operand" "=r"))]
7507   "!SIBLING_CALL_P (insn)
7508    && TARGET_SMALL_EXEC
7509    && GET_MODE (operands[2]) == Pmode"
7510   "bras\t%2,%0"
7511   [(set_attr "op_type" "RI")
7512    (set_attr "type"    "jsr")])
7514 (define_insn "*brasl"
7515   [(call (mem:QI (match_operand 0 "bras_sym_operand" "X"))
7516          (match_operand 1 "const_int_operand" "n"))
7517    (clobber (match_operand 2 "register_operand" "=r"))]
7518   "!SIBLING_CALL_P (insn)
7519    && TARGET_CPU_ZARCH
7520    && GET_MODE (operands[2]) == Pmode"
7521   "brasl\t%2,%0"
7522   [(set_attr "op_type" "RIL")
7523    (set_attr "type"    "jsr")])
7525 (define_insn "*basr"
7526   [(call (mem:QI (match_operand 0 "address_operand" "U"))
7527          (match_operand 1 "const_int_operand" "n"))
7528    (clobber (match_operand 2 "register_operand" "=r"))]
7529   "!SIBLING_CALL_P (insn) && GET_MODE (operands[2]) == Pmode"
7531   if (get_attr_op_type (insn) == OP_TYPE_RR)
7532     return "basr\t%2,%0";
7533   else
7534     return "bas\t%2,%a0";
7536   [(set (attr "op_type")
7537         (if_then_else (match_operand 0 "register_operand" "")
7538                       (const_string "RR") (const_string "RX")))
7539    (set_attr "type"  "jsr")
7540    (set_attr "atype" "agen")])
7543 ; call_value instruction pattern(s).
7546 (define_expand "call_value"
7547   [(set (match_operand 0 "" "")
7548         (call (match_operand 1 "" "")
7549               (match_operand 2 "" "")))
7550    (use (match_operand 3 "" ""))]
7551   ""
7553   s390_emit_call (XEXP (operands[1], 0), NULL_RTX, operands[0],
7554                   gen_rtx_REG (Pmode, RETURN_REGNUM));
7555   DONE;
7558 (define_insn "*bras_r"
7559   [(set (match_operand 0 "" "")
7560         (call (mem:QI (match_operand 1 "bras_sym_operand" "X"))
7561               (match_operand:SI 2 "const_int_operand" "n")))
7562    (clobber (match_operand 3 "register_operand" "=r"))]
7563   "!SIBLING_CALL_P (insn)
7564    && TARGET_SMALL_EXEC
7565    && GET_MODE (operands[3]) == Pmode"
7566   "bras\t%3,%1"
7567   [(set_attr "op_type" "RI")
7568    (set_attr "type"    "jsr")])
7570 (define_insn "*brasl_r"
7571   [(set (match_operand 0 "" "")
7572         (call (mem:QI (match_operand 1 "bras_sym_operand" "X"))
7573               (match_operand 2 "const_int_operand" "n")))
7574    (clobber (match_operand 3 "register_operand" "=r"))]
7575   "!SIBLING_CALL_P (insn)
7576    && TARGET_CPU_ZARCH
7577    && GET_MODE (operands[3]) == Pmode"
7578   "brasl\t%3,%1"
7579   [(set_attr "op_type" "RIL")
7580    (set_attr "type"    "jsr")])
7582 (define_insn "*basr_r"
7583   [(set (match_operand 0 "" "")
7584         (call (mem:QI (match_operand 1 "address_operand" "U"))
7585               (match_operand 2 "const_int_operand" "n")))
7586    (clobber (match_operand 3 "register_operand" "=r"))]
7587   "!SIBLING_CALL_P (insn) && GET_MODE (operands[3]) == Pmode"
7589   if (get_attr_op_type (insn) == OP_TYPE_RR)
7590     return "basr\t%3,%1";
7591   else
7592     return "bas\t%3,%a1";
7594   [(set (attr "op_type")
7595         (if_then_else (match_operand 1 "register_operand" "")
7596                       (const_string "RR") (const_string "RX")))
7597    (set_attr "type"  "jsr")
7598    (set_attr "atype" "agen")])
7601 ;;- Thread-local storage support.
7604 (define_expand "get_tp_64"
7605   [(set (match_operand:DI 0 "nonimmediate_operand" "") (reg:DI TP_REGNUM))]
7606   "TARGET_64BIT"
7607   "")
7609 (define_expand "get_tp_31"
7610   [(set (match_operand:SI 0 "nonimmediate_operand" "") (reg:SI TP_REGNUM))]
7611   "!TARGET_64BIT"
7612   "")
7614 (define_expand "set_tp_64"
7615   [(set (reg:DI TP_REGNUM) (match_operand:DI 0 "nonimmediate_operand" ""))
7616    (set (reg:DI TP_REGNUM) (unspec_volatile:DI [(reg:DI TP_REGNUM)] UNSPECV_SET_TP))]
7617   "TARGET_64BIT"
7618   "")
7620 (define_expand "set_tp_31"
7621   [(set (reg:SI TP_REGNUM) (match_operand:SI 0 "nonimmediate_operand" ""))
7622    (set (reg:SI TP_REGNUM) (unspec_volatile:SI [(reg:SI TP_REGNUM)] UNSPECV_SET_TP))]
7623   "!TARGET_64BIT"
7624   "")
7626 (define_insn "*set_tp"
7627   [(set (reg TP_REGNUM) (unspec_volatile [(reg TP_REGNUM)] UNSPECV_SET_TP))]
7628   ""
7629   ""
7630   [(set_attr "type" "none")
7631    (set_attr "length" "0")])
7633 (define_insn "*tls_load_64"
7634   [(set (match_operand:DI 0 "register_operand" "=d")
7635         (unspec:DI [(match_operand:DI 1 "memory_operand" "m")
7636                     (match_operand:DI 2 "" "")]
7637                    UNSPEC_TLS_LOAD))]
7638   "TARGET_64BIT"
7639   "lg\t%0,%1%J2"
7640   [(set_attr "op_type" "RXE")])
7642 (define_insn "*tls_load_31"
7643   [(set (match_operand:SI 0 "register_operand" "=d,d")
7644         (unspec:SI [(match_operand:SI 1 "memory_operand" "R,T")
7645                     (match_operand:SI 2 "" "")]
7646                    UNSPEC_TLS_LOAD))]
7647   "!TARGET_64BIT"
7648   "@
7649    l\t%0,%1%J2
7650    ly\t%0,%1%J2"
7651   [(set_attr "op_type" "RX,RXY")])
7653 (define_insn "*bras_tls"
7654   [(set (match_operand 0 "" "")
7655         (call (mem:QI (match_operand 1 "bras_sym_operand" "X"))
7656               (match_operand 2 "const_int_operand" "n")))
7657    (clobber (match_operand 3 "register_operand" "=r"))
7658    (use (match_operand 4 "" ""))]
7659   "!SIBLING_CALL_P (insn)
7660    && TARGET_SMALL_EXEC
7661    && GET_MODE (operands[3]) == Pmode"
7662   "bras\t%3,%1%J4"
7663   [(set_attr "op_type" "RI")
7664    (set_attr "type"    "jsr")])
7666 (define_insn "*brasl_tls"
7667   [(set (match_operand 0 "" "")
7668         (call (mem:QI (match_operand 1 "bras_sym_operand" "X"))
7669               (match_operand 2 "const_int_operand" "n")))
7670    (clobber (match_operand 3 "register_operand" "=r"))
7671    (use (match_operand 4 "" ""))]
7672   "!SIBLING_CALL_P (insn)
7673    && TARGET_CPU_ZARCH
7674    && GET_MODE (operands[3]) == Pmode"
7675   "brasl\t%3,%1%J4"
7676   [(set_attr "op_type" "RIL")
7677    (set_attr "type"    "jsr")])
7679 (define_insn "*basr_tls"
7680   [(set (match_operand 0 "" "")
7681         (call (mem:QI (match_operand 1 "address_operand" "U"))
7682               (match_operand 2 "const_int_operand" "n")))
7683    (clobber (match_operand 3 "register_operand" "=r"))
7684    (use (match_operand 4 "" ""))]
7685   "!SIBLING_CALL_P (insn) && GET_MODE (operands[3]) == Pmode"
7687   if (get_attr_op_type (insn) == OP_TYPE_RR)
7688     return "basr\t%3,%1%J4";
7689   else
7690     return "bas\t%3,%a1%J4";
7692   [(set (attr "op_type")
7693         (if_then_else (match_operand 1 "register_operand" "")
7694                       (const_string "RR") (const_string "RX")))
7695    (set_attr "type"  "jsr")
7696    (set_attr "atype" "agen")])
7699 ;;- Atomic operations
7703 ; memory barrier pattern.
7706 (define_expand "memory_barrier"
7707   [(set (mem:BLK (match_dup 0))
7708         (unspec_volatile:BLK [(mem:BLK (match_dup 0))] UNSPECV_MB))]
7709   ""
7711   operands[0] = gen_rtx_MEM (BLKmode, gen_rtx_SCRATCH (DImode));
7712   MEM_VOLATILE_P (operands[0]) = 1;
7715 (define_insn "*memory_barrier"
7716   [(set (match_operand:BLK 0 "" "")
7717         (unspec_volatile:BLK [(match_operand:BLK 1 "" "")] UNSPECV_MB))]
7718   ""
7719   "bcr\t15,0"
7720   [(set_attr "op_type" "RR")])
7723 ; compare and swap patterns.
7726 (define_expand "sync_compare_and_swap<mode>"
7727   [(parallel
7728     [(set (match_operand:TDSI 0 "register_operand" "")
7729           (match_operand:TDSI 1 "memory_operand" ""))
7730      (set (match_dup 1)
7731           (unspec_volatile:TDSI
7732             [(match_dup 1)
7733              (match_operand:TDSI 2 "register_operand" "")
7734              (match_operand:TDSI 3 "register_operand" "")]
7735             UNSPECV_CAS))
7736      (set (reg:CCZ1 CC_REGNUM)
7737           (compare:CCZ1 (match_dup 1) (match_dup 2)))])]
7738   "")
7740 (define_expand "sync_compare_and_swap<mode>"
7741   [(parallel
7742     [(set (match_operand:HQI 0 "register_operand" "")
7743           (match_operand:HQI 1 "memory_operand" ""))
7744      (set (match_dup 1)
7745           (unspec_volatile:HQI
7746             [(match_dup 1)
7747              (match_operand:HQI 2 "general_operand" "")
7748              (match_operand:HQI 3 "general_operand" "")]
7749             UNSPECV_CAS))
7750      (set (reg:CCZ1 CC_REGNUM)
7751           (compare:CCZ1 (match_dup 1) (match_dup 2)))])]
7752   ""
7753   "s390_expand_cs_hqi (<MODE>mode, operands[0], operands[1], 
7754                        operands[2], operands[3]); DONE;")
7756 (define_expand "sync_compare_and_swap_cc<mode>"
7757   [(parallel
7758     [(set (match_operand:TDSI 0 "register_operand" "")
7759           (match_operand:TDSI 1 "memory_operand" ""))
7760      (set (match_dup 1)
7761           (unspec_volatile:TDSI
7762             [(match_dup 1)
7763              (match_operand:TDSI 2 "register_operand" "")
7764              (match_operand:TDSI 3 "register_operand" "")]
7765             UNSPECV_CAS))
7766      (set (match_dup 4)
7767           (compare:CCZ1 (match_dup 1) (match_dup 2)))])]
7768   ""
7770   /* Emulate compare.  */
7771   operands[4] = gen_rtx_REG (CCZ1mode, CC_REGNUM);
7772   s390_compare_op0 = operands[1];
7773   s390_compare_op1 = operands[2];
7774   s390_compare_emitted = operands[4];
7777 (define_insn "*sync_compare_and_swap<mode>"
7778   [(set (match_operand:DP 0 "register_operand" "=r")
7779         (match_operand:DP 1 "memory_operand" "+Q"))
7780    (set (match_dup 1)
7781         (unspec_volatile:DP
7782           [(match_dup 1)
7783            (match_operand:DP 2 "register_operand" "0")
7784            (match_operand:DP 3 "register_operand" "r")]
7785           UNSPECV_CAS))
7786    (set (reg:CCZ1 CC_REGNUM)
7787         (compare:CCZ1 (match_dup 1) (match_dup 2)))]
7788   ""
7789   "cds<tg>\t%0,%3,%S1"
7790   [(set_attr "op_type" "RS<TE>")
7791    (set_attr "type"   "sem")])
7793 (define_insn "*sync_compare_and_swap<mode>"
7794   [(set (match_operand:GPR 0 "register_operand" "=r")
7795         (match_operand:GPR 1 "memory_operand" "+Q"))
7796    (set (match_dup 1)
7797         (unspec_volatile:GPR
7798           [(match_dup 1)
7799            (match_operand:GPR 2 "register_operand" "0")
7800            (match_operand:GPR 3 "register_operand" "r")]
7801           UNSPECV_CAS))
7802    (set (reg:CCZ1 CC_REGNUM)
7803         (compare:CCZ1 (match_dup 1) (match_dup 2)))]
7804   "" 
7805   "cs<g>\t%0,%3,%S1"
7806   [(set_attr "op_type" "RS<E>")
7807    (set_attr "type"   "sem")])
7811 ; Other atomic instruction patterns.
7814 (define_expand "sync_lock_test_and_set<mode>"
7815   [(match_operand:HQI 0 "register_operand")
7816    (match_operand:HQI 1 "memory_operand")
7817    (match_operand:HQI 2 "general_operand")]
7818   ""
7819   "s390_expand_atomic (<MODE>mode, SET, operands[0], operands[1], 
7820                        operands[2], false); DONE;")
7822 (define_expand "sync_<atomic><mode>"
7823   [(set (match_operand:HQI 0 "memory_operand")
7824         (ATOMIC:HQI (match_dup 0)
7825                     (match_operand:HQI 1 "general_operand")))]
7826   ""
7827   "s390_expand_atomic (<MODE>mode, <CODE>, NULL_RTX, operands[0], 
7828                        operands[1], false); DONE;")
7830 (define_expand "sync_old_<atomic><mode>"
7831   [(set (match_operand:HQI 0 "register_operand")
7832         (match_operand:HQI 1 "memory_operand"))
7833    (set (match_dup 1)
7834         (ATOMIC:HQI (match_dup 1)
7835                     (match_operand:HQI 2 "general_operand")))]
7836   ""
7837   "s390_expand_atomic (<MODE>mode, <CODE>, operands[0], operands[1], 
7838                        operands[2], false); DONE;")
7840 (define_expand "sync_new_<atomic><mode>"
7841   [(set (match_operand:HQI 0 "register_operand")
7842         (ATOMIC:HQI (match_operand:HQI 1 "memory_operand")
7843                     (match_operand:HQI 2 "general_operand"))) 
7844    (set (match_dup 1) (ATOMIC:HQI (match_dup 1) (match_dup 2)))]
7845   ""
7846   "s390_expand_atomic (<MODE>mode, <CODE>, operands[0], operands[1], 
7847                        operands[2], true); DONE;")
7850 ;;- Miscellaneous instructions.
7854 ; allocate stack instruction pattern(s).
7857 (define_expand "allocate_stack"
7858   [(match_operand 0 "general_operand" "")
7859    (match_operand 1 "general_operand" "")]
7860  "TARGET_BACKCHAIN"
7862   rtx temp = gen_reg_rtx (Pmode);
7864   emit_move_insn (temp, s390_back_chain_rtx ());
7865   anti_adjust_stack (operands[1]);
7866   emit_move_insn (s390_back_chain_rtx (), temp);
7868   emit_move_insn (operands[0], virtual_stack_dynamic_rtx);
7869   DONE;
7874 ; setjmp instruction pattern.
7877 (define_expand "builtin_setjmp_receiver"
7878   [(match_operand 0 "" "")]
7879   "flag_pic"
7881   emit_insn (s390_load_got ());
7882   emit_insn (gen_rtx_USE (VOIDmode, pic_offset_table_rtx));
7883   DONE;
7886 ;; These patterns say how to save and restore the stack pointer.  We need not
7887 ;; save the stack pointer at function level since we are careful to
7888 ;; preserve the backchain.  At block level, we have to restore the backchain
7889 ;; when we restore the stack pointer.
7891 ;; For nonlocal gotos, we must save both the stack pointer and its
7892 ;; backchain and restore both.  Note that in the nonlocal case, the
7893 ;; save area is a memory location.
7895 (define_expand "save_stack_function"
7896   [(match_operand 0 "general_operand" "")
7897    (match_operand 1 "general_operand" "")]
7898   ""
7899   "DONE;")
7901 (define_expand "restore_stack_function"
7902   [(match_operand 0 "general_operand" "")
7903    (match_operand 1 "general_operand" "")]
7904   ""
7905   "DONE;")
7907 (define_expand "restore_stack_block"
7908   [(match_operand 0 "register_operand" "")
7909    (match_operand 1 "register_operand" "")]
7910   "TARGET_BACKCHAIN"
7912   rtx temp = gen_reg_rtx (Pmode);
7914   emit_move_insn (temp, s390_back_chain_rtx ());
7915   emit_move_insn (operands[0], operands[1]);
7916   emit_move_insn (s390_back_chain_rtx (), temp);
7918   DONE;
7921 (define_expand "save_stack_nonlocal"
7922   [(match_operand 0 "memory_operand" "")
7923    (match_operand 1 "register_operand" "")]
7924   ""
7926   enum machine_mode mode = TARGET_64BIT ? OImode : TImode;
7927   rtx base = gen_rtx_REG (Pmode, BASE_REGNUM);
7929   /* Copy the backchain to the first word, sp to the second and the
7930      literal pool base to the third.  */
7932   if (TARGET_BACKCHAIN)
7933     {
7934       rtx temp = force_reg (Pmode, s390_back_chain_rtx ());
7935       emit_move_insn (operand_subword (operands[0], 0, 0, mode), temp);
7936     }
7938   emit_move_insn (operand_subword (operands[0], 1, 0, mode), operands[1]);
7939   emit_move_insn (operand_subword (operands[0], 2, 0, mode), base);
7941   DONE;
7944 (define_expand "restore_stack_nonlocal"
7945   [(match_operand 0 "register_operand" "")
7946    (match_operand 1 "memory_operand" "")]
7947   ""
7949   enum machine_mode mode = TARGET_64BIT ? OImode : TImode;
7950   rtx base = gen_rtx_REG (Pmode, BASE_REGNUM);
7951   rtx temp = NULL_RTX;
7953   /* Restore the backchain from the first word, sp from the second and the
7954      literal pool base from the third.  */
7956   if (TARGET_BACKCHAIN)
7957     temp = force_reg (Pmode, operand_subword (operands[1], 0, 0, mode));
7958     
7959   emit_move_insn (base, operand_subword (operands[1], 2, 0, mode));
7960   emit_move_insn (operands[0], operand_subword (operands[1], 1, 0, mode));
7962   if (temp)
7963     emit_move_insn (s390_back_chain_rtx (), temp);
7965   emit_insn (gen_rtx_USE (VOIDmode, base));
7966   DONE;
7969 (define_expand "exception_receiver"
7970   [(const_int 0)]
7971   ""
7973   s390_set_has_landing_pad_p (true);
7974   DONE;
7978 ; nop instruction pattern(s).
7981 (define_insn "nop"
7982   [(const_int 0)]
7983   ""
7984   "lr\t0,0"
7985   [(set_attr "op_type" "RR")])
7989 ; Special literal pool access instruction pattern(s).
7992 (define_insn "*pool_entry"
7993   [(unspec_volatile [(match_operand 0 "consttable_operand" "X")]
7994                     UNSPECV_POOL_ENTRY)]
7995   ""
7997   enum machine_mode mode = GET_MODE (PATTERN (insn));
7998   unsigned int align = GET_MODE_BITSIZE (mode);
7999   s390_output_pool_entry (operands[0], mode, align);
8000   return "";
8002   [(set (attr "length")
8003         (symbol_ref "GET_MODE_SIZE (GET_MODE (PATTERN (insn)))"))])
8005 (define_insn "pool_align"
8006   [(unspec_volatile [(match_operand 0 "const_int_operand" "n")]
8007                     UNSPECV_POOL_ALIGN)]
8008   ""
8009   ".align\t%0"
8010   [(set (attr "length") (symbol_ref "INTVAL (operands[0])"))])
8012 (define_insn "pool_section_start"
8013   [(unspec_volatile [(const_int 1)] UNSPECV_POOL_SECTION)]
8014   ""
8015   ".section\t.rodata"
8016   [(set_attr "length" "0")])
8018 (define_insn "pool_section_end"
8019   [(unspec_volatile [(const_int 0)] UNSPECV_POOL_SECTION)]
8020   ""
8021   ".previous"
8022   [(set_attr "length" "0")])
8024 (define_insn "main_base_31_small"
8025   [(set (match_operand 0 "register_operand" "=a")
8026         (unspec [(label_ref (match_operand 1 "" ""))] UNSPEC_MAIN_BASE))]
8027   "!TARGET_CPU_ZARCH && GET_MODE (operands[0]) == Pmode"
8028   "basr\t%0,0"
8029   [(set_attr "op_type" "RR")
8030    (set_attr "type"    "la")])
8032 (define_insn "main_base_31_large"
8033   [(set (match_operand 0 "register_operand" "=a")
8034         (unspec [(label_ref (match_operand 1 "" ""))] UNSPEC_MAIN_BASE))
8035    (set (pc) (label_ref (match_operand 2 "" "")))]
8036   "!TARGET_CPU_ZARCH && GET_MODE (operands[0]) == Pmode"
8037   "bras\t%0,%2"
8038   [(set_attr "op_type" "RI")])
8040 (define_insn "main_base_64"
8041   [(set (match_operand 0 "register_operand" "=a")
8042         (unspec [(label_ref (match_operand 1 "" ""))] UNSPEC_MAIN_BASE))]
8043   "TARGET_CPU_ZARCH && GET_MODE (operands[0]) == Pmode"
8044   "larl\t%0,%1"
8045   [(set_attr "op_type" "RIL")
8046    (set_attr "type"    "larl")])
8048 (define_insn "main_pool"
8049   [(set (match_operand 0 "register_operand" "=a")
8050         (unspec_volatile [(const_int 0)] UNSPECV_MAIN_POOL))]
8051   "GET_MODE (operands[0]) == Pmode"
8053   gcc_unreachable ();
8055   [(set (attr "type") 
8056         (if_then_else (ne (symbol_ref "TARGET_CPU_ZARCH") (const_int 0))
8057                       (const_string "larl") (const_string "la")))])
8059 (define_insn "reload_base_31"
8060   [(set (match_operand 0 "register_operand" "=a")
8061         (unspec [(label_ref (match_operand 1 "" ""))] UNSPEC_RELOAD_BASE))]
8062   "!TARGET_CPU_ZARCH && GET_MODE (operands[0]) == Pmode"
8063   "basr\t%0,0\;la\t%0,%1-.(%0)"
8064   [(set_attr "length" "6")
8065    (set_attr "type" "la")])
8067 (define_insn "reload_base_64"
8068   [(set (match_operand 0 "register_operand" "=a")
8069         (unspec [(label_ref (match_operand 1 "" ""))] UNSPEC_RELOAD_BASE))]
8070   "TARGET_CPU_ZARCH && GET_MODE (operands[0]) == Pmode"
8071   "larl\t%0,%1"
8072   [(set_attr "op_type" "RIL")
8073    (set_attr "type"    "larl")])
8075 (define_insn "pool"
8076   [(unspec_volatile [(match_operand 0 "const_int_operand" "n")] UNSPECV_POOL)]
8077   ""
8079   gcc_unreachable ();
8081   [(set (attr "length") (symbol_ref "INTVAL (operands[0])"))])
8084 ;; Insns related to generating the function prologue and epilogue.
8088 (define_expand "prologue"
8089   [(use (const_int 0))]
8090   ""
8091   "s390_emit_prologue (); DONE;")
8093 (define_expand "epilogue"
8094   [(use (const_int 1))]
8095   ""
8096   "s390_emit_epilogue (false); DONE;")
8098 (define_expand "sibcall_epilogue"
8099   [(use (const_int 0))]
8100   ""
8101   "s390_emit_epilogue (true); DONE;")
8103 (define_insn "*return"
8104   [(return)
8105    (use (match_operand 0 "register_operand" "a"))]
8106   "GET_MODE (operands[0]) == Pmode"
8107   "br\t%0"
8108   [(set_attr "op_type" "RR")
8109    (set_attr "type"    "jsr")
8110    (set_attr "atype"   "agen")])
8113 ;; Instruction definition to extend a 31-bit pointer into a 64-bit
8114 ;; pointer. This is used for compatibility.
8116 (define_expand "ptr_extend"
8117   [(set (match_operand:DI 0 "register_operand" "=r")
8118         (match_operand:SI 1 "register_operand" "r"))]
8119   "TARGET_64BIT"
8121   emit_insn (gen_anddi3 (operands[0],
8122                          gen_lowpart (DImode, operands[1]),
8123                          GEN_INT (0x7fffffff)));
8124   DONE;
8127 ;; Instruction definition to expand eh_return macro to support
8128 ;; swapping in special linkage return addresses.
8130 (define_expand "eh_return"
8131   [(use (match_operand 0 "register_operand" ""))]
8132   "TARGET_TPF"
8134   s390_emit_tpf_eh_return (operands[0]);
8135   DONE;
8139 ; Stack Protector Patterns
8142 (define_expand "stack_protect_set"
8143   [(set (match_operand 0 "memory_operand" "")
8144         (match_operand 1 "memory_operand" ""))]
8145   ""
8147 #ifdef TARGET_THREAD_SSP_OFFSET
8148   operands[1]
8149     = gen_rtx_MEM (Pmode, gen_rtx_PLUS (Pmode, s390_get_thread_pointer (),
8150                                         GEN_INT (TARGET_THREAD_SSP_OFFSET)));
8151 #endif
8152   if (TARGET_64BIT)
8153     emit_insn (gen_stack_protect_setdi (operands[0], operands[1]));
8154   else
8155     emit_insn (gen_stack_protect_setsi (operands[0], operands[1]));
8157   DONE;
8160 (define_insn "stack_protect_set<mode>"
8161   [(set (match_operand:DSI 0 "memory_operand" "=Q")
8162         (unspec:DSI [(match_operand:DSI 1 "memory_operand" "Q")] UNSPEC_SP_SET))]
8163   ""
8164   "mvc\t%O0(%G0,%R0),%S1"
8165   [(set_attr "op_type" "SS")])
8167 (define_expand "stack_protect_test"
8168   [(set (reg:CC CC_REGNUM)
8169         (compare (match_operand 0 "memory_operand" "")
8170                  (match_operand 1 "memory_operand" "")))
8171    (match_operand 2 "" "")]
8172   ""
8174 #ifdef TARGET_THREAD_SSP_OFFSET
8175   operands[1]
8176     = gen_rtx_MEM (Pmode, gen_rtx_PLUS (Pmode, s390_get_thread_pointer (),
8177                                         GEN_INT (TARGET_THREAD_SSP_OFFSET)));
8178 #endif
8179   s390_compare_op0 = operands[0];
8180   s390_compare_op1 = operands[1];
8181   s390_compare_emitted = gen_rtx_REG (CCZmode, CC_REGNUM);
8183   if (TARGET_64BIT)
8184     emit_insn (gen_stack_protect_testdi (operands[0], operands[1]));
8185   else
8186     emit_insn (gen_stack_protect_testsi (operands[0], operands[1]));
8188   emit_jump_insn (gen_beq (operands[2]));
8190   DONE;
8193 (define_insn "stack_protect_test<mode>"
8194   [(set (reg:CCZ CC_REGNUM)
8195         (unspec:CCZ [(match_operand:DSI 0 "memory_operand" "Q")
8196                      (match_operand:DSI 1 "memory_operand" "Q")] UNSPEC_SP_TEST))]
8197   ""
8198   "clc\t%O0(%G0,%R0),%S1"
8199   [(set_attr "op_type" "SS")])