re PR rtl-optimization/60501 (LRA emits add patterns which might clobber cc)
[gcc.git] / gcc / config / s390 / s390.md
1 ;;- Machine description for GNU compiler -- S/390 / zSeries version.
2 ;; Copyright (C) 1999-2014 Free Software Foundation, Inc.
3 ;; Contributed by Hartmut Penner (hpenner@de.ibm.com) and
4 ;; Ulrich Weigand (uweigand@de.ibm.com) and
5 ;; Andreas Krebbel (Andreas.Krebbel@de.ibm.com)
6
7 ;; This file is part of GCC.
8
9 ;; GCC is free software; you can redistribute it and/or modify it under
10 ;; the terms of the GNU General Public License as published by the Free
11 ;; Software Foundation; either version 3, or (at your option) any later
12 ;; version.
13
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.
18
19 ;; You should have received a copy of the GNU General Public License
20 ;; along with GCC; see the file COPYING3. If not see
21 ;; <http://www.gnu.org/licenses/>.
22
23 ;;
24 ;; See constraints.md for a description of constraints specific to s390.
25 ;;
26
27 ;; Special formats used for outputting 390 instructions.
28 ;;
29 ;; %C: print opcode suffix for branch condition.
30 ;; %D: print opcode suffix for inverse branch condition.
31 ;; %J: print tls_load/tls_gdcall/tls_ldcall suffix
32 ;; %G: print the size of the operand in bytes.
33 ;; %O: print only the displacement of a memory reference.
34 ;; %R: print only the base register of a memory reference.
35 ;; %S: print S-type memory reference (base+displacement).
36 ;; %N: print the second word of a DImode operand.
37 ;; %M: print the second word of a TImode operand.
38 ;; %Y: print shift count operand.
39 ;;
40 ;; %b: print integer X as if it's an unsigned byte.
41 ;; %c: print integer X as if it's an signed byte.
42 ;; %x: print integer X as if it's an unsigned halfword.
43 ;; %h: print integer X as if it's a signed halfword.
44 ;; %i: print the first nonzero HImode part of X.
45 ;; %j: print the first HImode part unequal to -1 of X.
46 ;; %k: print the first nonzero SImode part of X.
47 ;; %m: print the first SImode part unequal to -1 of X.
48 ;; %o: print integer X as if it's an unsigned 32bit word.
49 ;;
50 ;; We have a special constraint for pattern matching.
51 ;;
52 ;; s_operand -- Matches a valid S operand in a RS, SI or SS type instruction.
53 ;;
54
55 ;;
56 ;; UNSPEC usage
57 ;;
58
59 (define_c_enum "unspec" [
60 ; Miscellaneous
61 UNSPEC_ROUND
62 UNSPEC_ICM
63 UNSPEC_TIE
64
65 ; Convert CC into a str comparison result and copy it into an
66 ; integer register
67 ; cc0->0, cc1->1, cc2->-1, (cc3->-1)
68 UNSPEC_STRCMPCC_TO_INT
69
70 ; Copy CC as is into the lower 2 bits of an integer register
71 UNSPEC_CC_TO_INT
72
73 ; GOT/PLT and lt-relative accesses
74 UNSPEC_LTREL_OFFSET
75 UNSPEC_LTREL_BASE
76 UNSPEC_POOL_OFFSET
77 UNSPEC_GOTENT
78 UNSPEC_GOT
79 UNSPEC_GOTOFF
80 UNSPEC_PLT
81 UNSPEC_PLTOFF
82
83 ; Literal pool
84 UNSPEC_RELOAD_BASE
85 UNSPEC_MAIN_BASE
86 UNSPEC_LTREF
87 UNSPEC_INSN
88 UNSPEC_EXECUTE
89
90 ; Atomic Support
91 UNSPEC_MB
92 UNSPEC_MOVA
93
94 ; TLS relocation specifiers
95 UNSPEC_TLSGD
96 UNSPEC_TLSLDM
97 UNSPEC_NTPOFF
98 UNSPEC_DTPOFF
99 UNSPEC_GOTNTPOFF
100 UNSPEC_INDNTPOFF
101
102 ; TLS support
103 UNSPEC_TLSLDM_NTPOFF
104 UNSPEC_TLS_LOAD
105
106 ; String Functions
107 UNSPEC_SRST
108 UNSPEC_MVST
109
110 ; Stack Smashing Protector
111 UNSPEC_SP_SET
112 UNSPEC_SP_TEST
113
114 ; Test Data Class (TDC)
115 UNSPEC_TDC_INSN
116
117 ; Population Count
118 UNSPEC_POPCNT
119 UNSPEC_COPYSIGN
120
121 ; Load FP Integer
122 UNSPEC_FPINT_FLOOR
123 UNSPEC_FPINT_BTRUNC
124 UNSPEC_FPINT_ROUND
125 UNSPEC_FPINT_CEIL
126 UNSPEC_FPINT_NEARBYINT
127 UNSPEC_FPINT_RINT
128 ])
129
130 ;;
131 ;; UNSPEC_VOLATILE usage
132 ;;
133
134 (define_c_enum "unspecv" [
135 ; Blockage
136 UNSPECV_BLOCKAGE
137
138 ; TPF Support
139 UNSPECV_TPF_PROLOGUE
140 UNSPECV_TPF_EPILOGUE
141
142 ; Literal pool
143 UNSPECV_POOL
144 UNSPECV_POOL_SECTION
145 UNSPECV_POOL_ALIGN
146 UNSPECV_POOL_ENTRY
147 UNSPECV_MAIN_POOL
148
149 ; TLS support
150 UNSPECV_SET_TP
151
152 ; Atomic Support
153 UNSPECV_CAS
154 UNSPECV_ATOMIC_OP
155
156 ; Transactional Execution support
157 UNSPECV_TBEGIN
158 UNSPECV_TBEGIN_TDB
159 UNSPECV_TBEGINC
160 UNSPECV_TEND
161 UNSPECV_TABORT
162 UNSPECV_ETND
163 UNSPECV_NTSTG
164 UNSPECV_PPA
165 ])
166
167 ;;
168 ;; Registers
169 ;;
170
171 ; Registers with special meaning
172
173 (define_constants
174 [
175 ; Sibling call register.
176 (SIBCALL_REGNUM 1)
177 ; Literal pool base register.
178 (BASE_REGNUM 13)
179 ; Return address register.
180 (RETURN_REGNUM 14)
181 ; Condition code register.
182 (CC_REGNUM 33)
183 ; Thread local storage pointer register.
184 (TP_REGNUM 36)
185 ])
186
187 ; Hardware register names
188
189 (define_constants
190 [
191 ; General purpose registers
192 (GPR0_REGNUM 0)
193 ; Floating point registers.
194 (FPR0_REGNUM 16)
195 (FPR1_REGNUM 20)
196 (FPR2_REGNUM 17)
197 (FPR3_REGNUM 21)
198 (FPR4_REGNUM 18)
199 (FPR5_REGNUM 22)
200 (FPR6_REGNUM 19)
201 (FPR7_REGNUM 23)
202 (FPR8_REGNUM 24)
203 (FPR9_REGNUM 28)
204 (FPR10_REGNUM 25)
205 (FPR11_REGNUM 29)
206 (FPR12_REGNUM 26)
207 (FPR13_REGNUM 30)
208 (FPR14_REGNUM 27)
209 (FPR15_REGNUM 31)
210 ])
211
212 ;;
213 ;; PFPO GPR0 argument format
214 ;;
215
216 (define_constants
217 [
218 ; PFPO operation type
219 (PFPO_CONVERT 0x1000000)
220 ; PFPO operand types
221 (PFPO_OP_TYPE_SF 0x5)
222 (PFPO_OP_TYPE_DF 0x6)
223 (PFPO_OP_TYPE_TF 0x7)
224 (PFPO_OP_TYPE_SD 0x8)
225 (PFPO_OP_TYPE_DD 0x9)
226 (PFPO_OP_TYPE_TD 0xa)
227 ; Bitposition of operand types
228 (PFPO_OP0_TYPE_SHIFT 16)
229 (PFPO_OP1_TYPE_SHIFT 8)
230 ])
231
232 ; Immediate operands for tbegin and tbeginc
233 (define_constants [(TBEGIN_MASK 65292)]) ; 0xff0c
234 (define_constants [(TBEGINC_MASK 65288)]) ; 0xff08
235
236 ;; Instruction operand type as used in the Principles of Operation.
237 ;; Used to determine defaults for length and other attribute values.
238
239 (define_attr "op_type"
240 "NN,E,RR,RRE,RX,RS,RSI,RI,SI,S,SS,SSE,RXE,RSE,RIL,RIE,RXY,RSY,SIY,RRF,RRR,SIL,RRS,RIS"
241 (const_string "NN"))
242
243 ;; Instruction type attribute used for scheduling.
244
245 (define_attr "type" "none,integer,load,lr,la,larl,lm,stm,
246 cs,vs,store,sem,idiv,
247 imulhi,imulsi,imuldi,
248 branch,jsr,fsimptf,fsimpdf,fsimpsf,fhex,
249 floadtf,floaddf,floadsf,fstoredf,fstoresf,
250 fmultf,fmuldf,fmulsf,fdivtf,fdivdf,fdivsf,
251 ftoi,fsqrttf,fsqrtdf,fsqrtsf,
252 fmadddf,fmaddsf,
253 ftrunctf,ftruncdf, ftruncsd, ftruncdd,
254 itoftf, itofdf, itofsf, itofdd, itoftd,
255 fdivdd, fdivtd, floaddd, floadsd, fmuldd, fmultd,
256 fsimpdd, fsimpsd, fsimptd, fstoredd, fstoresd,
257 ftoidfp, other"
258 (cond [(eq_attr "op_type" "NN") (const_string "other")
259 (eq_attr "op_type" "SS") (const_string "cs")]
260 (const_string "integer")))
261
262 ;; Another attribute used for scheduling purposes:
263 ;; agen: Instruction uses the address generation unit
264 ;; reg: Instruction does not use the agen unit
265
266 (define_attr "atype" "agen,reg"
267 (if_then_else (eq_attr "op_type" "E,RR,RI,RRE,RSI,RIL,RIE,RRF,RRR")
268 (const_string "reg")
269 (const_string "agen")))
270
271 ;; Properties concerning Z10 execution grouping and value forwarding.
272 ;; z10_super: instruction is superscalar.
273 ;; z10_super_c: instruction is superscalar and meets the condition of z10_c.
274 ;; z10_fwd: The instruction reads the value of an operand and stores it into a
275 ;; target register. It can forward this value to a second instruction that reads
276 ;; the same register if that second instruction is issued in the same group.
277 ;; z10_rec: The instruction is in the T pipeline and reads a register. If the
278 ;; instruction in the S pipe writes to the register, then the T instruction
279 ;; can immediately read the new value.
280 ;; z10_fr: union of Z10_fwd and z10_rec.
281 ;; z10_c: second operand of instruction is a register and read with complemented bits.
282 ;;
283 ;; An additional suffix A1, A3, or E1 indicates the respective AGI bypass.
284
285
286 (define_attr "z10prop" "none,
287 z10_super, z10_super_E1, z10_super_A1, z10_super_c, z10_super_c_E1,
288 z10_fwd, z10_fwd_A1, z10_fwd_A3, z10_fwd_E1,
289 z10_rec,
290 z10_fr, z10_fr_A3, z10_fr_E1,
291 z10_c"
292 (const_string "none"))
293
294 ;; Properties concerning Z196 decoding
295 ;; z196_alone: must group alone
296 ;; z196_end: ends a group
297 ;; z196_cracked: instruction is cracked or expanded
298 (define_attr "z196prop" "none,
299 z196_alone, z196_ends,
300 z196_cracked"
301 (const_string "none"))
302
303 (define_attr "mnemonic" "bcr_flush,unknown" (const_string "unknown"))
304
305 ;; Length in bytes.
306
307 (define_attr "length" ""
308 (cond [(eq_attr "op_type" "E,RR") (const_int 2)
309 (eq_attr "op_type" "RX,RI,RRE,RS,RSI,S,SI,RRF,RRR") (const_int 4)]
310 (const_int 6)))
311
312
313 ;; Processor type. This attribute must exactly match the processor_type
314 ;; enumeration in s390.h. The current machine description does not
315 ;; distinguish between g5 and g6, but there are differences between the two
316 ;; CPUs could in theory be modeled.
317
318 (define_attr "cpu" "g5,g6,z900,z990,z9_109,z9_ec,z10,z196,zEC12"
319 (const (symbol_ref "s390_tune_attr")))
320
321 (define_attr "cpu_facility"
322 "standard,ieee,zarch,cpu_zarch,longdisp,extimm,dfp,z10,z196,zEC12"
323 (const_string "standard"))
324
325 (define_attr "enabled" ""
326 (cond [(eq_attr "cpu_facility" "standard")
327 (const_int 1)
328
329 (and (eq_attr "cpu_facility" "ieee")
330 (match_test "TARGET_CPU_IEEE_FLOAT"))
331 (const_int 1)
332
333 (and (eq_attr "cpu_facility" "zarch")
334 (match_test "TARGET_ZARCH"))
335 (const_int 1)
336
337 (and (eq_attr "cpu_facility" "longdisp")
338 (match_test "TARGET_LONG_DISPLACEMENT"))
339 (const_int 1)
340
341 (and (eq_attr "cpu_facility" "extimm")
342 (match_test "TARGET_EXTIMM"))
343 (const_int 1)
344
345 (and (eq_attr "cpu_facility" "dfp")
346 (match_test "TARGET_DFP"))
347 (const_int 1)
348
349 (and (eq_attr "cpu_facility" "cpu_zarch")
350 (match_test "TARGET_CPU_ZARCH"))
351 (const_int 1)
352
353 (and (eq_attr "cpu_facility" "z10")
354 (match_test "TARGET_Z10"))
355 (const_int 1)
356
357 (and (eq_attr "cpu_facility" "z196")
358 (match_test "TARGET_Z196"))
359 (const_int 1)
360
361 (and (eq_attr "cpu_facility" "zEC12")
362 (match_test "TARGET_ZEC12"))
363 (const_int 1)]
364 (const_int 0)))
365
366 ;; Pipeline description for z900. For lack of anything better,
367 ;; this description is also used for the g5 and g6.
368 (include "2064.md")
369
370 ;; Pipeline description for z990, z9-109 and z9-ec.
371 (include "2084.md")
372
373 ;; Pipeline description for z10
374 (include "2097.md")
375
376 ;; Pipeline description for z196
377 (include "2817.md")
378
379 ;; Pipeline description for zEC12
380 (include "2827.md")
381
382 ;; Predicates
383 (include "predicates.md")
384
385 ;; Constraint definitions
386 (include "constraints.md")
387
388 ;; Other includes
389 (include "tpf.md")
390
391 ;; Iterators
392
393 ;; These mode iterators allow floating point patterns to be generated from the
394 ;; same template.
395 (define_mode_iterator FP_ALL [TF DF SF (TD "TARGET_HARD_DFP") (DD "TARGET_HARD_DFP")
396 (SD "TARGET_HARD_DFP")])
397 (define_mode_iterator FP [TF DF SF (TD "TARGET_HARD_DFP") (DD "TARGET_HARD_DFP")])
398 (define_mode_iterator FPALL [TF DF SF TD DD SD])
399 (define_mode_iterator BFP [TF DF SF])
400 (define_mode_iterator DFP [TD DD])
401 (define_mode_iterator DFP_ALL [TD DD SD])
402 (define_mode_iterator DSF [DF SF])
403 (define_mode_iterator SD_SF [SF SD])
404 (define_mode_iterator DD_DF [DF DD])
405 (define_mode_iterator TD_TF [TF TD])
406
407 ;; These mode iterators allow 31-bit and 64-bit GPR patterns to be generated
408 ;; from the same template.
409 (define_mode_iterator GPR [(DI "TARGET_ZARCH") SI])
410 (define_mode_iterator DGPR [(TI "TARGET_ZARCH") DI SI])
411 (define_mode_iterator DSI [DI SI])
412 (define_mode_iterator TDI [TI DI])
413
414 ;; These mode iterators allow :P to be used for patterns that operate on
415 ;; pointer-sized quantities. Exactly one of the two alternatives will match.
416 (define_mode_iterator P [(DI "TARGET_64BIT") (SI "!TARGET_64BIT")])
417
418 ;; These macros refer to the actual word_mode of the configuration.
419 ;; This is equal to Pmode except on 31-bit machines in zarch mode.
420 (define_mode_iterator DW [(TI "TARGET_ZARCH") (DI "!TARGET_ZARCH")])
421 (define_mode_iterator W [(DI "TARGET_ZARCH") (SI "!TARGET_ZARCH")])
422
423 ;; Used by the umul pattern to express modes having half the size.
424 (define_mode_attr DWH [(TI "DI") (DI "SI")])
425 (define_mode_attr dwh [(TI "di") (DI "si")])
426
427 ;; This mode iterator allows the QI and HI patterns to be defined from
428 ;; the same template.
429 (define_mode_iterator HQI [HI QI])
430
431 ;; This mode iterator allows the integer patterns to be defined from the
432 ;; same template.
433 (define_mode_iterator INT [(DI "TARGET_ZARCH") SI HI QI])
434 (define_mode_iterator INTALL [TI DI SI HI QI])
435 (define_mode_iterator DINT [(TI "TARGET_ZARCH") DI SI HI QI])
436
437 ;; This iterator allows some 'ashift' and 'lshiftrt' pattern to be defined from
438 ;; the same template.
439 (define_code_iterator SHIFT [ashift lshiftrt])
440
441 ;; This iterator allows r[ox]sbg to be defined with the same template
442 (define_code_iterator IXOR [ior xor])
443
444 ;; This iterator is used to expand the patterns for the nearest
445 ;; integer functions.
446 (define_int_iterator FPINT [UNSPEC_FPINT_FLOOR UNSPEC_FPINT_BTRUNC
447 UNSPEC_FPINT_ROUND UNSPEC_FPINT_CEIL
448 UNSPEC_FPINT_NEARBYINT])
449 (define_int_attr fpint_name [(UNSPEC_FPINT_FLOOR "floor")
450 (UNSPEC_FPINT_BTRUNC "btrunc")
451 (UNSPEC_FPINT_ROUND "round")
452 (UNSPEC_FPINT_CEIL "ceil")
453 (UNSPEC_FPINT_NEARBYINT "nearbyint")])
454 (define_int_attr fpint_roundingmode [(UNSPEC_FPINT_FLOOR "7")
455 (UNSPEC_FPINT_BTRUNC "5")
456 (UNSPEC_FPINT_ROUND "1")
457 (UNSPEC_FPINT_CEIL "6")
458 (UNSPEC_FPINT_NEARBYINT "0")])
459
460 ;; This iterator and attribute allow to combine most atomic operations.
461 (define_code_iterator ATOMIC [and ior xor plus minus mult])
462 (define_code_iterator ATOMIC_Z196 [and ior xor plus])
463 (define_code_attr atomic [(and "and") (ior "ior") (xor "xor")
464 (plus "add") (minus "sub") (mult "nand")])
465 (define_code_attr noxa [(and "n") (ior "o") (xor "x") (plus "a")])
466
467 ;; In FP templates, a string like "lt<de>br" will expand to "ltxbr" in
468 ;; TF/TDmode, "ltdbr" in DF/DDmode, and "ltebr" in SF/SDmode.
469 (define_mode_attr xde [(TF "x") (DF "d") (SF "e") (TD "x") (DD "d") (SD "e")])
470
471 ;; In FP templates, a <dee> in "m<dee><bt>r" will expand to "mx<bt>r" in
472 ;; TF/TDmode, "md<bt>r" in DF/DDmode, "mee<bt>r" in SFmode and "me<bt>r in
473 ;; SDmode.
474 (define_mode_attr xdee [(TF "x") (DF "d") (SF "ee") (TD "x") (DD "d") (SD "e")])
475
476 ;; In FP templates, "<RRe>" will expand to "RRE" in TFmode and "RR" otherwise.
477 ;; Likewise for "<RXe>".
478 (define_mode_attr RRe [(TF "RRE") (DF "RR") (SF "RR")])
479 (define_mode_attr RXe [(TF "RXE") (DF "RX") (SF "RX")])
480
481 ;; The decimal floating point variants of add, sub, div and mul support 3
482 ;; fp register operands. The following attributes allow to merge the bfp and
483 ;; dfp variants in a single insn definition.
484
485 ;; This attribute is used to set op_type accordingly.
486 (define_mode_attr RRer [(TF "RRE") (DF "RRE") (SF "RRE") (TD "RRR")
487 (DD "RRR") (SD "RRR")])
488
489 ;; This attribute is used in the operand constraint list in order to have the
490 ;; first and the second operand match for bfp modes.
491 (define_mode_attr f0 [(TF "0") (DF "0") (SF "0") (TD "f") (DD "f") (DD "f")])
492
493 ;; This attribute is used in the operand list of the instruction to have an
494 ;; additional operand for the dfp instructions.
495 (define_mode_attr op1 [(TF "") (DF "") (SF "")
496 (TD "%1,") (DD "%1,") (SD "%1,")])
497
498
499 ;; This attribute is used in the operand constraint list
500 ;; for instructions dealing with the sign bit of 32 or 64bit fp values.
501 ;; TFmode values are represented by a fp register pair. Since the
502 ;; sign bit instructions only handle single source and target fp registers
503 ;; these instructions can only be used for TFmode values if the source and
504 ;; target operand uses the same fp register.
505 (define_mode_attr fT0 [(TF "0") (DF "f") (SF "f")])
506
507 ;; In FP templates, "<Rf>" will expand to "f" in TFmode and "R" otherwise.
508 ;; This is used to disable the memory alternative in TFmode patterns.
509 (define_mode_attr Rf [(TF "f") (DF "R") (SF "R") (TD "f") (DD "f") (SD "f")])
510
511 ;; This attribute adds b for bfp instructions and t for dfp instructions and is used
512 ;; within instruction mnemonics.
513 (define_mode_attr bt [(TF "b") (DF "b") (SF "b") (TD "t") (DD "t") (SD "t")])
514
515 ;; This attribute is used within instruction mnemonics. It evaluates to d for dfp
516 ;; modes and to an empty string for bfp modes.
517 (define_mode_attr _d [(TF "") (DF "") (SF "") (TD "d") (DD "d") (SD "d")])
518
519 ;; In GPR and P templates, a constraint like "<d0>" will expand to "d" in DImode
520 ;; and "0" in SImode. This allows to combine instructions of which the 31bit
521 ;; version only operates on one register.
522 (define_mode_attr d0 [(DI "d") (SI "0")])
523
524 ;; In combination with d0 this allows to combine instructions of which the 31bit
525 ;; version only operates on one register. The DImode version needs an additional
526 ;; register for the assembler output.
527 (define_mode_attr 1 [(DI "%1,") (SI "")])
528
529 ;; In SHIFT templates, a string like "s<lr>dl" will expand to "sldl" in
530 ;; 'ashift' and "srdl" in 'lshiftrt'.
531 (define_code_attr lr [(ashift "l") (lshiftrt "r")])
532
533 ;; In SHIFT templates, this attribute holds the correct standard name for the
534 ;; pattern itself and the corresponding function calls.
535 (define_code_attr shift [(ashift "ashl") (lshiftrt "lshr")])
536
537 ;; This attribute handles differences in the instruction 'type' and will result
538 ;; in "RRE" for DImode and "RR" for SImode.
539 (define_mode_attr E [(DI "E") (SI "")])
540
541 ;; This attribute handles differences in the instruction 'type' and makes RX<Y>
542 ;; to result in "RXY" for DImode and "RX" for SImode.
543 (define_mode_attr Y [(DI "Y") (SI "")])
544
545 ;; This attribute handles differences in the instruction 'type' and will result
546 ;; in "RSE" for TImode and "RS" for DImode.
547 (define_mode_attr TE [(TI "E") (DI "")])
548
549 ;; In GPR templates, a string like "lc<g>r" will expand to "lcgr" in DImode
550 ;; and "lcr" in SImode.
551 (define_mode_attr g [(DI "g") (SI "")])
552
553 ;; In GPR templates, a string like "sl<y>" will expand to "slg" in DImode
554 ;; and "sly" in SImode. This is useful because on 64bit the ..g instructions
555 ;; were enhanced with long displacements whereas 31bit instructions got a ..y
556 ;; variant for long displacements.
557 (define_mode_attr y [(DI "g") (SI "y")])
558
559 ;; In DW templates, a string like "cds<g>" will expand to "cdsg" in TImode
560 ;; and "cds" in DImode.
561 (define_mode_attr tg [(TI "g") (DI "")])
562
563 ;; In TDI templates, a string like "c<d>sg".
564 (define_mode_attr td [(TI "d") (DI "")])
565
566 ;; In GPR templates, a string like "c<gf>dbr" will expand to "cgdbr" in DImode
567 ;; and "cfdbr" in SImode.
568 (define_mode_attr gf [(DI "g") (SI "f")])
569
570 ;; In GPR templates, a string like sll<gk> will expand to sllg for DI
571 ;; and sllk for SI. This way it is possible to merge the new z196 SI
572 ;; 3 operands shift instructions into the existing patterns.
573 (define_mode_attr gk [(DI "g") (SI "k")])
574
575 ;; ICM mask required to load MODE value into the lowest subreg
576 ;; of a SImode register.
577 (define_mode_attr icm_lo [(HI "3") (QI "1")])
578
579 ;; In HQI templates, a string like "llg<hc>" will expand to "llgh" in
580 ;; HImode and "llgc" in QImode.
581 (define_mode_attr hc [(HI "h") (QI "c")])
582
583 ;; In P templates, the mode <DBL> will expand to "TI" in DImode and "DI"
584 ;; in SImode.
585 (define_mode_attr DBL [(DI "TI") (SI "DI")])
586
587 ;; This attribute expands to DF for TFmode and to DD for TDmode . It is
588 ;; used for Txmode splitters splitting a Txmode copy into 2 Dxmode copies.
589 (define_mode_attr HALF_TMODE [(TF "DF") (TD "DD")])
590
591 ;; Maximum unsigned integer that fits in MODE.
592 (define_mode_attr max_uint [(HI "65535") (QI "255")])
593
594 ;; Start and end field computations for RISBG et al.
595 (define_mode_attr bfstart [(DI "s") (SI "t")])
596 (define_mode_attr bfend [(DI "e") (SI "f")])
597
598 ;; In place of GET_MODE_BITSIZE (<MODE>mode)
599 (define_mode_attr bitsize [(DI "64") (SI "32") (HI "16") (QI "8")])
600
601 ;; Allow return and simple_return to be defined from a single template.
602 (define_code_iterator ANY_RETURN [return simple_return])
603
604 ;;
605 ;;- Compare instructions.
606 ;;
607
608 ; Test-under-Mask instructions
609
610 (define_insn "*tmqi_mem"
611 [(set (reg CC_REGNUM)
612 (compare (and:QI (match_operand:QI 0 "memory_operand" "Q,S")
613 (match_operand:QI 1 "immediate_operand" "n,n"))
614 (match_operand:QI 2 "immediate_operand" "n,n")))]
615 "s390_match_ccmode (insn, s390_tm_ccmode (operands[1], operands[2], false))"
616 "@
617 tm\t%S0,%b1
618 tmy\t%S0,%b1"
619 [(set_attr "op_type" "SI,SIY")
620 (set_attr "z10prop" "z10_super,z10_super")])
621
622 (define_insn "*tmdi_reg"
623 [(set (reg CC_REGNUM)
624 (compare (and:DI (match_operand:DI 0 "nonimmediate_operand" "d,d,d,d")
625 (match_operand:DI 1 "immediate_operand"
626 "N0HD0,N1HD0,N2HD0,N3HD0"))
627 (match_operand:DI 2 "immediate_operand" "n,n,n,n")))]
628 "TARGET_ZARCH
629 && s390_match_ccmode (insn, s390_tm_ccmode (operands[1], operands[2], true))
630 && s390_single_part (operands[1], DImode, HImode, 0) >= 0"
631 "@
632 tmhh\t%0,%i1
633 tmhl\t%0,%i1
634 tmlh\t%0,%i1
635 tmll\t%0,%i1"
636 [(set_attr "op_type" "RI")
637 (set_attr "z10prop" "z10_super,z10_super,z10_super,z10_super")])
638
639 (define_insn "*tmsi_reg"
640 [(set (reg CC_REGNUM)
641 (compare (and:SI (match_operand:SI 0 "nonimmediate_operand" "d,d")
642 (match_operand:SI 1 "immediate_operand" "N0HS0,N1HS0"))
643 (match_operand:SI 2 "immediate_operand" "n,n")))]
644 "s390_match_ccmode (insn, s390_tm_ccmode (operands[1], operands[2], true))
645 && s390_single_part (operands[1], SImode, HImode, 0) >= 0"
646 "@
647 tmh\t%0,%i1
648 tml\t%0,%i1"
649 [(set_attr "op_type" "RI")
650 (set_attr "z10prop" "z10_super,z10_super")])
651
652 (define_insn "*tm<mode>_full"
653 [(set (reg CC_REGNUM)
654 (compare (match_operand:HQI 0 "register_operand" "d")
655 (match_operand:HQI 1 "immediate_operand" "n")))]
656 "s390_match_ccmode (insn, s390_tm_ccmode (constm1_rtx, operands[1], true))"
657 "tml\t%0,<max_uint>"
658 [(set_attr "op_type" "RI")
659 (set_attr "z10prop" "z10_super")])
660
661
662 ;
663 ; Load-and-Test instructions
664 ;
665
666 ; tst(di|si) instruction pattern(s).
667
668 (define_insn "*tstdi_sign"
669 [(set (reg CC_REGNUM)
670 (compare
671 (ashiftrt:DI
672 (ashift:DI
673 (subreg:DI (match_operand:SI 0 "nonimmediate_operand" "d,RT") 0)
674 (const_int 32)) (const_int 32))
675 (match_operand:DI 1 "const0_operand" "")))
676 (set (match_operand:DI 2 "register_operand" "=d,d")
677 (sign_extend:DI (match_dup 0)))]
678 "s390_match_ccmode(insn, CCSmode) && TARGET_ZARCH"
679 "ltgfr\t%2,%0
680 ltgf\t%2,%0"
681 [(set_attr "op_type" "RRE,RXY")
682 (set_attr "cpu_facility" "*,z10")
683 (set_attr "z10prop" "z10_super_E1,z10_super_E1") ])
684
685 ; ltr, lt, ltgr, ltg
686 (define_insn "*tst<mode>_extimm"
687 [(set (reg CC_REGNUM)
688 (compare (match_operand:GPR 0 "nonimmediate_operand" "d,RT")
689 (match_operand:GPR 1 "const0_operand" "")))
690 (set (match_operand:GPR 2 "register_operand" "=d,d")
691 (match_dup 0))]
692 "s390_match_ccmode(insn, CCSmode) && TARGET_EXTIMM"
693 "@
694 lt<g>r\t%2,%0
695 lt<g>\t%2,%0"
696 [(set_attr "op_type" "RR<E>,RXY")
697 (set_attr "z10prop" "z10_fr_E1,z10_fwd_A3") ])
698
699 ; ltr, lt, ltgr, ltg
700 (define_insn "*tst<mode>_cconly_extimm"
701 [(set (reg CC_REGNUM)
702 (compare (match_operand:GPR 0 "nonimmediate_operand" "d,RT")
703 (match_operand:GPR 1 "const0_operand" "")))
704 (clobber (match_scratch:GPR 2 "=X,d"))]
705 "s390_match_ccmode(insn, CCSmode) && TARGET_EXTIMM"
706 "@
707 lt<g>r\t%0,%0
708 lt<g>\t%2,%0"
709 [(set_attr "op_type" "RR<E>,RXY")
710 (set_attr "z10prop" "z10_fr_E1,z10_fwd_A3")])
711
712 (define_insn "*tstdi"
713 [(set (reg CC_REGNUM)
714 (compare (match_operand:DI 0 "register_operand" "d")
715 (match_operand:DI 1 "const0_operand" "")))
716 (set (match_operand:DI 2 "register_operand" "=d")
717 (match_dup 0))]
718 "s390_match_ccmode(insn, CCSmode) && TARGET_ZARCH && !TARGET_EXTIMM"
719 "ltgr\t%2,%0"
720 [(set_attr "op_type" "RRE")
721 (set_attr "z10prop" "z10_fr_E1")])
722
723 (define_insn "*tstsi"
724 [(set (reg CC_REGNUM)
725 (compare (match_operand:SI 0 "nonimmediate_operand" "d,Q,S")
726 (match_operand:SI 1 "const0_operand" "")))
727 (set (match_operand:SI 2 "register_operand" "=d,d,d")
728 (match_dup 0))]
729 "s390_match_ccmode(insn, CCSmode) && !TARGET_EXTIMM"
730 "@
731 ltr\t%2,%0
732 icm\t%2,15,%S0
733 icmy\t%2,15,%S0"
734 [(set_attr "op_type" "RR,RS,RSY")
735 (set_attr "z10prop" "z10_fr_E1,z10_super_E1,z10_super_E1")])
736
737 (define_insn "*tstsi_cconly"
738 [(set (reg CC_REGNUM)
739 (compare (match_operand:SI 0 "nonimmediate_operand" "d,Q,S")
740 (match_operand:SI 1 "const0_operand" "")))
741 (clobber (match_scratch:SI 2 "=X,d,d"))]
742 "s390_match_ccmode(insn, CCSmode)"
743 "@
744 ltr\t%0,%0
745 icm\t%2,15,%S0
746 icmy\t%2,15,%S0"
747 [(set_attr "op_type" "RR,RS,RSY")
748 (set_attr "z10prop" "z10_fr_E1,z10_super_E1,z10_super_E1")])
749
750 (define_insn "*tstdi_cconly_31"
751 [(set (reg CC_REGNUM)
752 (compare (match_operand:DI 0 "register_operand" "d")
753 (match_operand:DI 1 "const0_operand" "")))]
754 "s390_match_ccmode(insn, CCSmode) && !TARGET_ZARCH"
755 "srda\t%0,0"
756 [(set_attr "op_type" "RS")
757 (set_attr "atype" "reg")])
758
759 ; ltr, ltgr
760 (define_insn "*tst<mode>_cconly2"
761 [(set (reg CC_REGNUM)
762 (compare (match_operand:GPR 0 "register_operand" "d")
763 (match_operand:GPR 1 "const0_operand" "")))]
764 "s390_match_ccmode(insn, CCSmode)"
765 "lt<g>r\t%0,%0"
766 [(set_attr "op_type" "RR<E>")
767 (set_attr "z10prop" "z10_fr_E1")])
768
769 ; tst(hi|qi) instruction pattern(s).
770
771 (define_insn "*tst<mode>CCT"
772 [(set (reg CC_REGNUM)
773 (compare (match_operand:HQI 0 "nonimmediate_operand" "?Q,?S,d")
774 (match_operand:HQI 1 "const0_operand" "")))
775 (set (match_operand:HQI 2 "register_operand" "=d,d,0")
776 (match_dup 0))]
777 "s390_match_ccmode(insn, CCTmode)"
778 "@
779 icm\t%2,<icm_lo>,%S0
780 icmy\t%2,<icm_lo>,%S0
781 tml\t%0,<max_uint>"
782 [(set_attr "op_type" "RS,RSY,RI")
783 (set_attr "z10prop" "z10_super_E1,z10_super_E1,z10_super")])
784
785 (define_insn "*tsthiCCT_cconly"
786 [(set (reg CC_REGNUM)
787 (compare (match_operand:HI 0 "nonimmediate_operand" "Q,S,d")
788 (match_operand:HI 1 "const0_operand" "")))
789 (clobber (match_scratch:HI 2 "=d,d,X"))]
790 "s390_match_ccmode(insn, CCTmode)"
791 "@
792 icm\t%2,3,%S0
793 icmy\t%2,3,%S0
794 tml\t%0,65535"
795 [(set_attr "op_type" "RS,RSY,RI")
796 (set_attr "z10prop" "z10_super_E1,z10_super_E1,z10_super")])
797
798 (define_insn "*tstqiCCT_cconly"
799 [(set (reg CC_REGNUM)
800 (compare (match_operand:QI 0 "nonimmediate_operand" "?Q,?S,d")
801 (match_operand:QI 1 "const0_operand" "")))]
802 "s390_match_ccmode(insn, CCTmode)"
803 "@
804 cli\t%S0,0
805 cliy\t%S0,0
806 tml\t%0,255"
807 [(set_attr "op_type" "SI,SIY,RI")
808 (set_attr "z10prop" "z10_super,z10_super,z10_super")])
809
810 (define_insn "*tst<mode>"
811 [(set (reg CC_REGNUM)
812 (compare (match_operand:HQI 0 "s_operand" "Q,S")
813 (match_operand:HQI 1 "const0_operand" "")))
814 (set (match_operand:HQI 2 "register_operand" "=d,d")
815 (match_dup 0))]
816 "s390_match_ccmode(insn, CCSmode)"
817 "@
818 icm\t%2,<icm_lo>,%S0
819 icmy\t%2,<icm_lo>,%S0"
820 [(set_attr "op_type" "RS,RSY")
821 (set_attr "z10prop" "z10_super_E1,z10_super_E1")])
822
823 (define_insn "*tst<mode>_cconly"
824 [(set (reg CC_REGNUM)
825 (compare (match_operand:HQI 0 "s_operand" "Q,S")
826 (match_operand:HQI 1 "const0_operand" "")))
827 (clobber (match_scratch:HQI 2 "=d,d"))]
828 "s390_match_ccmode(insn, CCSmode)"
829 "@
830 icm\t%2,<icm_lo>,%S0
831 icmy\t%2,<icm_lo>,%S0"
832 [(set_attr "op_type" "RS,RSY")
833 (set_attr "z10prop" "z10_super_E1,z10_super_E1")])
834
835
836 ; Compare (equality) instructions
837
838 (define_insn "*cmpdi_cct"
839 [(set (reg CC_REGNUM)
840 (compare (match_operand:DI 0 "nonimmediate_operand" "%d,d,d,d,Q")
841 (match_operand:DI 1 "general_operand" "d,K,Os,RT,BQ")))]
842 "s390_match_ccmode (insn, CCTmode) && TARGET_ZARCH"
843 "@
844 cgr\t%0,%1
845 cghi\t%0,%h1
846 cgfi\t%0,%1
847 cg\t%0,%1
848 #"
849 [(set_attr "op_type" "RRE,RI,RIL,RXY,SS")
850 (set_attr "z10prop" "z10_super_c,z10_super,z10_super,z10_super,*")])
851
852 (define_insn "*cmpsi_cct"
853 [(set (reg CC_REGNUM)
854 (compare (match_operand:SI 0 "nonimmediate_operand" "%d,d,d,d,d,Q")
855 (match_operand:SI 1 "general_operand" "d,K,Os,R,T,BQ")))]
856 "s390_match_ccmode (insn, CCTmode)"
857 "@
858 cr\t%0,%1
859 chi\t%0,%h1
860 cfi\t%0,%1
861 c\t%0,%1
862 cy\t%0,%1
863 #"
864 [(set_attr "op_type" "RR,RI,RIL,RX,RXY,SS")
865 (set_attr "z10prop" "z10_super_c,z10_super,z10_super,z10_super,z10_super,*")])
866
867 ; Compare (signed) instructions
868
869 (define_insn "*cmpdi_ccs_sign"
870 [(set (reg CC_REGNUM)
871 (compare (sign_extend:DI (match_operand:SI 1 "nonimmediate_operand"
872 "d,RT,b"))
873 (match_operand:DI 0 "register_operand" "d, d,d")))]
874 "s390_match_ccmode(insn, CCSRmode) && TARGET_ZARCH"
875 "@
876 cgfr\t%0,%1
877 cgf\t%0,%1
878 cgfrl\t%0,%1"
879 [(set_attr "op_type" "RRE,RXY,RIL")
880 (set_attr "z10prop" "z10_c,*,*")
881 (set_attr "type" "*,*,larl")])
882
883
884
885 (define_insn "*cmpsi_ccs_sign"
886 [(set (reg CC_REGNUM)
887 (compare (sign_extend:SI (match_operand:HI 1 "memory_operand" "R,T,b"))
888 (match_operand:SI 0 "register_operand" "d,d,d")))]
889 "s390_match_ccmode(insn, CCSRmode)"
890 "@
891 ch\t%0,%1
892 chy\t%0,%1
893 chrl\t%0,%1"
894 [(set_attr "op_type" "RX,RXY,RIL")
895 (set_attr "cpu_facility" "*,*,z10")
896 (set_attr "type" "*,*,larl")
897 (set_attr "z196prop" "z196_cracked,z196_cracked,z196_cracked")])
898
899 (define_insn "*cmphi_ccs_z10"
900 [(set (reg CC_REGNUM)
901 (compare (match_operand:HI 0 "s_operand" "Q")
902 (match_operand:HI 1 "immediate_operand" "K")))]
903 "s390_match_ccmode(insn, CCSmode) && TARGET_Z10"
904 "chhsi\t%0,%1"
905 [(set_attr "op_type" "SIL")
906 (set_attr "z196prop" "z196_cracked")])
907
908 (define_insn "*cmpdi_ccs_signhi_rl"
909 [(set (reg CC_REGNUM)
910 (compare (sign_extend:DI (match_operand:HI 1 "memory_operand" "RT,b"))
911 (match_operand:GPR 0 "register_operand" "d,d")))]
912 "s390_match_ccmode(insn, CCSRmode) && TARGET_Z10"
913 "@
914 cgh\t%0,%1
915 cghrl\t%0,%1"
916 [(set_attr "op_type" "RXY,RIL")
917 (set_attr "type" "*,larl")])
918
919 ; cr, chi, cfi, c, cy, cgr, cghi, cgfi, cg, chsi, cghsi, crl, cgrl
920 (define_insn "*cmp<mode>_ccs"
921 [(set (reg CC_REGNUM)
922 (compare (match_operand:GPR 0 "nonimmediate_operand"
923 "d,d,Q, d,d,d,d")
924 (match_operand:GPR 1 "general_operand"
925 "d,K,K,Os,R,T,b")))]
926 "s390_match_ccmode(insn, CCSmode)"
927 "@
928 c<g>r\t%0,%1
929 c<g>hi\t%0,%h1
930 c<g>hsi\t%0,%h1
931 c<g>fi\t%0,%1
932 c<g>\t%0,%1
933 c<y>\t%0,%1
934 c<g>rl\t%0,%1"
935 [(set_attr "op_type" "RR<E>,RI,SIL,RIL,RX<Y>,RXY,RIL")
936 (set_attr "cpu_facility" "*,*,z10,extimm,*,*,z10")
937 (set_attr "type" "*,*,*,*,*,*,larl")
938 (set_attr "z10prop" "z10_super_c,z10_super,z10_super,z10_super,z10_super,z10_super,z10_super")])
939
940
941 ; Compare (unsigned) instructions
942
943 (define_insn "*cmpsi_ccu_zerohi_rlsi"
944 [(set (reg CC_REGNUM)
945 (compare (zero_extend:SI (mem:HI (match_operand:SI 1
946 "larl_operand" "X")))
947 (match_operand:SI 0 "register_operand" "d")))]
948 "s390_match_ccmode(insn, CCURmode) && TARGET_Z10"
949 "clhrl\t%0,%1"
950 [(set_attr "op_type" "RIL")
951 (set_attr "type" "larl")
952 (set_attr "z10prop" "z10_super")])
953
954 ; clhrl, clghrl
955 (define_insn "*cmp<GPR:mode>_ccu_zerohi_rldi"
956 [(set (reg CC_REGNUM)
957 (compare (zero_extend:GPR (mem:HI (match_operand:DI 1
958 "larl_operand" "X")))
959 (match_operand:GPR 0 "register_operand" "d")))]
960 "s390_match_ccmode(insn, CCURmode) && TARGET_Z10"
961 "cl<g>hrl\t%0,%1"
962 [(set_attr "op_type" "RIL")
963 (set_attr "type" "larl")
964 (set_attr "z10prop" "z10_super")])
965
966 (define_insn "*cmpdi_ccu_zero"
967 [(set (reg CC_REGNUM)
968 (compare (zero_extend:DI (match_operand:SI 1 "nonimmediate_operand"
969 "d,RT,b"))
970 (match_operand:DI 0 "register_operand" "d, d,d")))]
971 "s390_match_ccmode (insn, CCURmode) && TARGET_ZARCH"
972 "@
973 clgfr\t%0,%1
974 clgf\t%0,%1
975 clgfrl\t%0,%1"
976 [(set_attr "op_type" "RRE,RXY,RIL")
977 (set_attr "cpu_facility" "*,*,z10")
978 (set_attr "type" "*,*,larl")
979 (set_attr "z10prop" "z10_super_c,z10_super_E1,z10_super")])
980
981 (define_insn "*cmpdi_ccu"
982 [(set (reg CC_REGNUM)
983 (compare (match_operand:DI 0 "nonimmediate_operand"
984 "d, d,d,Q, d, Q,BQ")
985 (match_operand:DI 1 "general_operand"
986 "d,Op,b,D,RT,BQ,Q")))]
987 "s390_match_ccmode (insn, CCUmode) && TARGET_ZARCH"
988 "@
989 clgr\t%0,%1
990 clgfi\t%0,%1
991 clgrl\t%0,%1
992 clghsi\t%0,%x1
993 clg\t%0,%1
994 #
995 #"
996 [(set_attr "op_type" "RRE,RIL,RIL,SIL,RXY,SS,SS")
997 (set_attr "cpu_facility" "*,extimm,z10,z10,*,*,*")
998 (set_attr "type" "*,*,larl,*,*,*,*")
999 (set_attr "z10prop" "z10_super_c,z10_super,z10_super,z10_super,z10_super,*,*")])
1000
1001 (define_insn "*cmpsi_ccu"
1002 [(set (reg CC_REGNUM)
1003 (compare (match_operand:SI 0 "nonimmediate_operand" "d, d,d,Q,d,d, Q,BQ")
1004 (match_operand:SI 1 "general_operand" "d,Os,b,D,R,T,BQ, Q")))]
1005 "s390_match_ccmode (insn, CCUmode)"
1006 "@
1007 clr\t%0,%1
1008 clfi\t%0,%o1
1009 clrl\t%0,%1
1010 clfhsi\t%0,%x1
1011 cl\t%0,%1
1012 cly\t%0,%1
1013 #
1014 #"
1015 [(set_attr "op_type" "RR,RIL,RIL,SIL,RX,RXY,SS,SS")
1016 (set_attr "cpu_facility" "*,extimm,z10,z10,*,*,*,*")
1017 (set_attr "type" "*,*,larl,*,*,*,*,*")
1018 (set_attr "z10prop" "z10_super_c,z10_super,z10_super,z10_super,z10_super,z10_super,*,*")])
1019
1020 (define_insn "*cmphi_ccu"
1021 [(set (reg CC_REGNUM)
1022 (compare (match_operand:HI 0 "nonimmediate_operand" "d,d,Q,Q,BQ")
1023 (match_operand:HI 1 "general_operand" "Q,S,D,BQ,Q")))]
1024 "s390_match_ccmode (insn, CCUmode)
1025 && !register_operand (operands[1], HImode)"
1026 "@
1027 clm\t%0,3,%S1
1028 clmy\t%0,3,%S1
1029 clhhsi\t%0,%1
1030 #
1031 #"
1032 [(set_attr "op_type" "RS,RSY,SIL,SS,SS")
1033 (set_attr "cpu_facility" "*,*,z10,*,*")
1034 (set_attr "z10prop" "*,*,z10_super,*,*")])
1035
1036 (define_insn "*cmpqi_ccu"
1037 [(set (reg CC_REGNUM)
1038 (compare (match_operand:QI 0 "nonimmediate_operand" "d,d,Q,S,Q,BQ")
1039 (match_operand:QI 1 "general_operand" "Q,S,n,n,BQ,Q")))]
1040 "s390_match_ccmode (insn, CCUmode)
1041 && !register_operand (operands[1], QImode)"
1042 "@
1043 clm\t%0,1,%S1
1044 clmy\t%0,1,%S1
1045 cli\t%S0,%b1
1046 cliy\t%S0,%b1
1047 #
1048 #"
1049 [(set_attr "op_type" "RS,RSY,SI,SIY,SS,SS")
1050 (set_attr "z10prop" "*,*,z10_super,z10_super,*,*")])
1051
1052
1053 ; Block compare (CLC) instruction patterns.
1054
1055 (define_insn "*clc"
1056 [(set (reg CC_REGNUM)
1057 (compare (match_operand:BLK 0 "memory_operand" "Q")
1058 (match_operand:BLK 1 "memory_operand" "Q")))
1059 (use (match_operand 2 "const_int_operand" "n"))]
1060 "s390_match_ccmode (insn, CCUmode)
1061 && INTVAL (operands[2]) >= 1 && INTVAL (operands[2]) <= 256"
1062 "clc\t%O0(%2,%R0),%S1"
1063 [(set_attr "op_type" "SS")])
1064
1065 (define_split
1066 [(set (reg CC_REGNUM)
1067 (compare (match_operand 0 "memory_operand" "")
1068 (match_operand 1 "memory_operand" "")))]
1069 "reload_completed
1070 && s390_match_ccmode (insn, CCUmode)
1071 && GET_MODE (operands[0]) == GET_MODE (operands[1])
1072 && GET_MODE_SIZE (GET_MODE (operands[0])) > 0"
1073 [(parallel
1074 [(set (match_dup 0) (match_dup 1))
1075 (use (match_dup 2))])]
1076 {
1077 operands[2] = GEN_INT (GET_MODE_SIZE (GET_MODE (operands[0])));
1078 operands[0] = adjust_address (operands[0], BLKmode, 0);
1079 operands[1] = adjust_address (operands[1], BLKmode, 0);
1080
1081 operands[1] = gen_rtx_COMPARE (GET_MODE (SET_DEST (PATTERN (curr_insn))),
1082 operands[0], operands[1]);
1083 operands[0] = SET_DEST (PATTERN (curr_insn));
1084 })
1085
1086
1087 ; (TF|DF|SF|TD|DD|SD) instructions
1088
1089 ; ltxbr, ltdbr, ltebr, ltxtr, ltdtr
1090 (define_insn "*cmp<mode>_ccs_0"
1091 [(set (reg CC_REGNUM)
1092 (compare (match_operand:FP 0 "register_operand" "f")
1093 (match_operand:FP 1 "const0_operand" "")))]
1094 "s390_match_ccmode(insn, CCSmode) && TARGET_HARD_FLOAT"
1095 "lt<xde><bt>r\t%0,%0"
1096 [(set_attr "op_type" "RRE")
1097 (set_attr "type" "fsimp<mode>")])
1098
1099 ; cxtr, cxbr, cdtr, cdbr, cebr, cdb, ceb
1100 (define_insn "*cmp<mode>_ccs"
1101 [(set (reg CC_REGNUM)
1102 (compare (match_operand:FP 0 "register_operand" "f,f")
1103 (match_operand:FP 1 "general_operand" "f,<Rf>")))]
1104 "s390_match_ccmode(insn, CCSmode) && TARGET_HARD_FLOAT"
1105 "@
1106 c<xde><bt>r\t%0,%1
1107 c<xde>b\t%0,%1"
1108 [(set_attr "op_type" "RRE,RXE")
1109 (set_attr "type" "fsimp<mode>")])
1110
1111
1112 ; Compare and Branch instructions
1113
1114 ; cij, cgij, crj, cgrj, cfi, cgfi, cr, cgr
1115 ; The following instructions do a complementary access of their second
1116 ; operand (z01 only): crj_c, cgrjc, cr, cgr
1117 (define_insn "*cmp_and_br_signed_<mode>"
1118 [(set (pc)
1119 (if_then_else (match_operator 0 "s390_signed_integer_comparison"
1120 [(match_operand:GPR 1 "register_operand" "d,d")
1121 (match_operand:GPR 2 "nonmemory_operand" "d,C")])
1122 (label_ref (match_operand 3 "" ""))
1123 (pc)))
1124 (clobber (reg:CC CC_REGNUM))]
1125 "TARGET_Z10 && !TARGET_AVOID_CMP_AND_BRANCH"
1126 {
1127 if (get_attr_length (insn) == 6)
1128 return which_alternative ?
1129 "c<g>ij%C0\t%1,%c2,%l3" : "c<g>rj%C0\t%1,%2,%l3";
1130 else
1131 return which_alternative ?
1132 "c<g>fi\t%1,%c2\;jg%C0\t%l3" : "c<g>r\t%1,%2\;jg%C0\t%l3";
1133 }
1134 [(set_attr "op_type" "RIE")
1135 (set_attr "type" "branch")
1136 (set_attr "z10prop" "z10_super_c,z10_super")
1137 (set (attr "length")
1138 (if_then_else (lt (abs (minus (pc) (match_dup 3))) (const_int 60000))
1139 (const_int 6) (const_int 12)))]) ; 8 byte for cr/jg
1140 ; 10 byte for cgr/jg
1141
1142 ; clij, clgij, clrj, clgrj, clfi, clgfi, clr, clgr
1143 ; The following instructions do a complementary access of their second
1144 ; operand (z10 only): clrj, clgrj, clr, clgr
1145 (define_insn "*cmp_and_br_unsigned_<mode>"
1146 [(set (pc)
1147 (if_then_else (match_operator 0 "s390_unsigned_integer_comparison"
1148 [(match_operand:GPR 1 "register_operand" "d,d")
1149 (match_operand:GPR 2 "nonmemory_operand" "d,I")])
1150 (label_ref (match_operand 3 "" ""))
1151 (pc)))
1152 (clobber (reg:CC CC_REGNUM))]
1153 "TARGET_Z10 && !TARGET_AVOID_CMP_AND_BRANCH"
1154 {
1155 if (get_attr_length (insn) == 6)
1156 return which_alternative ?
1157 "cl<g>ij%C0\t%1,%b2,%l3" : "cl<g>rj%C0\t%1,%2,%l3";
1158 else
1159 return which_alternative ?
1160 "cl<g>fi\t%1,%b2\;jg%C0\t%l3" : "cl<g>r\t%1,%2\;jg%C0\t%l3";
1161 }
1162 [(set_attr "op_type" "RIE")
1163 (set_attr "type" "branch")
1164 (set_attr "z10prop" "z10_super_c,z10_super")
1165 (set (attr "length")
1166 (if_then_else (lt (abs (minus (pc) (match_dup 3))) (const_int 60000))
1167 (const_int 6) (const_int 12)))]) ; 8 byte for clr/jg
1168 ; 10 byte for clgr/jg
1169
1170 ; And now the same two patterns as above but with a negated CC mask.
1171
1172 ; cij, cgij, crj, cgrj, cfi, cgfi, cr, cgr
1173 ; The following instructions do a complementary access of their second
1174 ; operand (z01 only): crj_c, cgrjc, cr, cgr
1175 (define_insn "*icmp_and_br_signed_<mode>"
1176 [(set (pc)
1177 (if_then_else (match_operator 0 "s390_signed_integer_comparison"
1178 [(match_operand:GPR 1 "register_operand" "d,d")
1179 (match_operand:GPR 2 "nonmemory_operand" "d,C")])
1180 (pc)
1181 (label_ref (match_operand 3 "" ""))))
1182 (clobber (reg:CC CC_REGNUM))]
1183 "TARGET_Z10 && !TARGET_AVOID_CMP_AND_BRANCH"
1184 {
1185 if (get_attr_length (insn) == 6)
1186 return which_alternative ?
1187 "c<g>ij%D0\t%1,%c2,%l3" : "c<g>rj%D0\t%1,%2,%l3";
1188 else
1189 return which_alternative ?
1190 "c<g>fi\t%1,%c2\;jg%D0\t%l3" : "c<g>r\t%1,%2\;jg%D0\t%l3";
1191 }
1192 [(set_attr "op_type" "RIE")
1193 (set_attr "type" "branch")
1194 (set_attr "z10prop" "z10_super_c,z10_super")
1195 (set (attr "length")
1196 (if_then_else (lt (abs (minus (pc) (match_dup 3))) (const_int 60000))
1197 (const_int 6) (const_int 12)))]) ; 8 byte for cr/jg
1198 ; 10 byte for cgr/jg
1199
1200 ; clij, clgij, clrj, clgrj, clfi, clgfi, clr, clgr
1201 ; The following instructions do a complementary access of their second
1202 ; operand (z10 only): clrj, clgrj, clr, clgr
1203 (define_insn "*icmp_and_br_unsigned_<mode>"
1204 [(set (pc)
1205 (if_then_else (match_operator 0 "s390_unsigned_integer_comparison"
1206 [(match_operand:GPR 1 "register_operand" "d,d")
1207 (match_operand:GPR 2 "nonmemory_operand" "d,I")])
1208 (pc)
1209 (label_ref (match_operand 3 "" ""))))
1210 (clobber (reg:CC CC_REGNUM))]
1211 "TARGET_Z10 && !TARGET_AVOID_CMP_AND_BRANCH"
1212 {
1213 if (get_attr_length (insn) == 6)
1214 return which_alternative ?
1215 "cl<g>ij%D0\t%1,%b2,%l3" : "cl<g>rj%D0\t%1,%2,%l3";
1216 else
1217 return which_alternative ?
1218 "cl<g>fi\t%1,%b2\;jg%D0\t%l3" : "cl<g>r\t%1,%2\;jg%D0\t%l3";
1219 }
1220 [(set_attr "op_type" "RIE")
1221 (set_attr "type" "branch")
1222 (set_attr "z10prop" "z10_super_c,z10_super")
1223 (set (attr "length")
1224 (if_then_else (lt (abs (minus (pc) (match_dup 3))) (const_int 60000))
1225 (const_int 6) (const_int 12)))]) ; 8 byte for clr/jg
1226 ; 10 byte for clgr/jg
1227
1228 ;;
1229 ;;- Move instructions.
1230 ;;
1231
1232 ;
1233 ; movti instruction pattern(s).
1234 ;
1235
1236 (define_insn "movti"
1237 [(set (match_operand:TI 0 "nonimmediate_operand" "=d,QS,d,o")
1238 (match_operand:TI 1 "general_operand" "QS,d,dPRT,d"))]
1239 "TARGET_ZARCH"
1240 "@
1241 lmg\t%0,%N0,%S1
1242 stmg\t%1,%N1,%S0
1243 #
1244 #"
1245 [(set_attr "op_type" "RSY,RSY,*,*")
1246 (set_attr "type" "lm,stm,*,*")])
1247
1248 (define_split
1249 [(set (match_operand:TI 0 "nonimmediate_operand" "")
1250 (match_operand:TI 1 "general_operand" ""))]
1251 "TARGET_ZARCH && reload_completed
1252 && s390_split_ok_p (operands[0], operands[1], TImode, 0)"
1253 [(set (match_dup 2) (match_dup 4))
1254 (set (match_dup 3) (match_dup 5))]
1255 {
1256 operands[2] = operand_subword (operands[0], 0, 0, TImode);
1257 operands[3] = operand_subword (operands[0], 1, 0, TImode);
1258 operands[4] = operand_subword (operands[1], 0, 0, TImode);
1259 operands[5] = operand_subword (operands[1], 1, 0, TImode);
1260 })
1261
1262 (define_split
1263 [(set (match_operand:TI 0 "nonimmediate_operand" "")
1264 (match_operand:TI 1 "general_operand" ""))]
1265 "TARGET_ZARCH && reload_completed
1266 && s390_split_ok_p (operands[0], operands[1], TImode, 1)"
1267 [(set (match_dup 2) (match_dup 4))
1268 (set (match_dup 3) (match_dup 5))]
1269 {
1270 operands[2] = operand_subword (operands[0], 1, 0, TImode);
1271 operands[3] = operand_subword (operands[0], 0, 0, TImode);
1272 operands[4] = operand_subword (operands[1], 1, 0, TImode);
1273 operands[5] = operand_subword (operands[1], 0, 0, TImode);
1274 })
1275
1276 (define_split
1277 [(set (match_operand:TI 0 "register_operand" "")
1278 (match_operand:TI 1 "memory_operand" ""))]
1279 "TARGET_ZARCH && reload_completed
1280 && !s_operand (operands[1], VOIDmode)"
1281 [(set (match_dup 0) (match_dup 1))]
1282 {
1283 rtx addr = operand_subword (operands[0], 1, 0, TImode);
1284 addr = gen_lowpart (Pmode, addr);
1285 s390_load_address (addr, XEXP (operands[1], 0));
1286 operands[1] = replace_equiv_address (operands[1], addr);
1287 })
1288
1289
1290 ;
1291 ; Patterns used for secondary reloads
1292 ;
1293
1294 ; z10 provides move instructions accepting larl memory operands.
1295 ; Unfortunately there is no such variant for QI, TI and FP mode moves.
1296 ; These patterns are also used for unaligned SI and DI accesses.
1297
1298 (define_expand "reload<INTALL:mode><P:mode>_tomem_z10"
1299 [(parallel [(match_operand:INTALL 0 "memory_operand" "")
1300 (match_operand:INTALL 1 "register_operand" "=d")
1301 (match_operand:P 2 "register_operand" "=&a")])]
1302 "TARGET_Z10"
1303 {
1304 s390_reload_symref_address (operands[1], operands[0], operands[2], 1);
1305 DONE;
1306 })
1307
1308 (define_expand "reload<INTALL:mode><P:mode>_toreg_z10"
1309 [(parallel [(match_operand:INTALL 0 "register_operand" "=d")
1310 (match_operand:INTALL 1 "memory_operand" "")
1311 (match_operand:P 2 "register_operand" "=a")])]
1312 "TARGET_Z10"
1313 {
1314 s390_reload_symref_address (operands[0], operands[1], operands[2], 0);
1315 DONE;
1316 })
1317
1318 (define_expand "reload<FPALL:mode><P:mode>_tomem_z10"
1319 [(parallel [(match_operand:FPALL 0 "memory_operand" "")
1320 (match_operand:FPALL 1 "register_operand" "=d")
1321 (match_operand:P 2 "register_operand" "=&a")])]
1322 "TARGET_Z10"
1323 {
1324 s390_reload_symref_address (operands[1], operands[0], operands[2], 1);
1325 DONE;
1326 })
1327
1328 (define_expand "reload<FPALL:mode><P:mode>_toreg_z10"
1329 [(parallel [(match_operand:FPALL 0 "register_operand" "=d")
1330 (match_operand:FPALL 1 "memory_operand" "")
1331 (match_operand:P 2 "register_operand" "=a")])]
1332 "TARGET_Z10"
1333 {
1334 s390_reload_symref_address (operands[0], operands[1], operands[2], 0);
1335 DONE;
1336 })
1337
1338 (define_expand "reload<P:mode>_larl_odd_addend_z10"
1339 [(parallel [(match_operand:P 0 "register_operand" "=d")
1340 (match_operand:P 1 "larl_operand" "")
1341 (match_operand:P 2 "register_operand" "=a")])]
1342 "TARGET_Z10"
1343 {
1344 s390_reload_larl_operand (operands[0], operands[1], operands[2]);
1345 DONE;
1346 })
1347
1348 ; Handles loading a PLUS (load address) expression
1349
1350 (define_expand "reload<mode>_plus"
1351 [(parallel [(match_operand:P 0 "register_operand" "=a")
1352 (match_operand:P 1 "s390_plus_operand" "")
1353 (match_operand:P 2 "register_operand" "=&a")])]
1354 ""
1355 {
1356 s390_expand_plus_operand (operands[0], operands[1], operands[2]);
1357 DONE;
1358 })
1359
1360 ; Handles assessing a non-offsetable memory address
1361
1362 (define_expand "reload<mode>_nonoffmem_in"
1363 [(parallel [(match_operand 0 "register_operand" "")
1364 (match_operand 1 "" "")
1365 (match_operand:P 2 "register_operand" "=&a")])]
1366 ""
1367 {
1368 gcc_assert (MEM_P (operands[1]));
1369 s390_load_address (operands[2], find_replacement (&XEXP (operands[1], 0)));
1370 operands[1] = replace_equiv_address (operands[1], operands[2]);
1371 emit_move_insn (operands[0], operands[1]);
1372 DONE;
1373 })
1374
1375 (define_expand "reload<mode>_nonoffmem_out"
1376 [(parallel [(match_operand 0 "" "")
1377 (match_operand 1 "register_operand" "")
1378 (match_operand:P 2 "register_operand" "=&a")])]
1379 ""
1380 {
1381 gcc_assert (MEM_P (operands[0]));
1382 s390_load_address (operands[2], find_replacement (&XEXP (operands[0], 0)));
1383 operands[0] = replace_equiv_address (operands[0], operands[2]);
1384 emit_move_insn (operands[0], operands[1]);
1385 DONE;
1386 })
1387
1388 (define_expand "reload<mode>_PIC_addr"
1389 [(parallel [(match_operand 0 "register_operand" "=d")
1390 (match_operand 1 "larl_operand" "")
1391 (match_operand:P 2 "register_operand" "=a")])]
1392 ""
1393 {
1394 rtx new_rtx = legitimize_pic_address (operands[1], operands[2]);
1395 emit_move_insn (operands[0], new_rtx);
1396 })
1397
1398 ;
1399 ; movdi instruction pattern(s).
1400 ;
1401
1402 (define_expand "movdi"
1403 [(set (match_operand:DI 0 "general_operand" "")
1404 (match_operand:DI 1 "general_operand" ""))]
1405 ""
1406 {
1407 /* Handle symbolic constants. */
1408 if (TARGET_64BIT
1409 && (SYMBOLIC_CONST (operands[1])
1410 || (GET_CODE (operands[1]) == PLUS
1411 && XEXP (operands[1], 0) == pic_offset_table_rtx
1412 && SYMBOLIC_CONST (XEXP (operands[1], 1)))))
1413 emit_symbolic_move (operands);
1414 })
1415
1416 (define_insn "*movdi_larl"
1417 [(set (match_operand:DI 0 "register_operand" "=d")
1418 (match_operand:DI 1 "larl_operand" "X"))]
1419 "TARGET_64BIT
1420 && !FP_REG_P (operands[0])"
1421 "larl\t%0,%1"
1422 [(set_attr "op_type" "RIL")
1423 (set_attr "type" "larl")
1424 (set_attr "z10prop" "z10_super_A1")])
1425
1426 (define_insn "*movdi_64"
1427 [(set (match_operand:DI 0 "nonimmediate_operand"
1428 "=d,d,d,d,d,d,d,d,f,d,d,d,d,d,
1429 RT,!*f,!*f,!*f,!R,!T,b,Q,d,t,Q,t")
1430 (match_operand:DI 1 "general_operand"
1431 "K,N0HD0,N1HD0,N2HD0,N3HD0,Os,N0SD0,N1SD0,d,f,L,b,d,RT,
1432 d,*f,R,T,*f,*f,d,K,t,d,t,Q"))]
1433 "TARGET_ZARCH"
1434 "@
1435 lghi\t%0,%h1
1436 llihh\t%0,%i1
1437 llihl\t%0,%i1
1438 llilh\t%0,%i1
1439 llill\t%0,%i1
1440 lgfi\t%0,%1
1441 llihf\t%0,%k1
1442 llilf\t%0,%k1
1443 ldgr\t%0,%1
1444 lgdr\t%0,%1
1445 lay\t%0,%a1
1446 lgrl\t%0,%1
1447 lgr\t%0,%1
1448 lg\t%0,%1
1449 stg\t%1,%0
1450 ldr\t%0,%1
1451 ld\t%0,%1
1452 ldy\t%0,%1
1453 std\t%1,%0
1454 stdy\t%1,%0
1455 stgrl\t%1,%0
1456 mvghi\t%0,%1
1457 #
1458 #
1459 stam\t%1,%N1,%S0
1460 lam\t%0,%N0,%S1"
1461 [(set_attr "op_type" "RI,RI,RI,RI,RI,RIL,RIL,RIL,RRE,RRE,RXY,RIL,RRE,RXY,
1462 RXY,RR,RX,RXY,RX,RXY,RIL,SIL,*,*,RS,RS")
1463 (set_attr "type" "*,*,*,*,*,*,*,*,floaddf,floaddf,la,larl,lr,load,store,
1464 floaddf,floaddf,floaddf,fstoredf,fstoredf,larl,*,*,*,
1465 *,*")
1466 (set_attr "cpu_facility" "*,*,*,*,*,extimm,extimm,extimm,dfp,dfp,longdisp,
1467 z10,*,*,*,*,*,longdisp,*,longdisp,
1468 z10,z10,*,*,*,*")
1469 (set_attr "z10prop" "z10_fwd_A1,
1470 z10_fwd_E1,
1471 z10_fwd_E1,
1472 z10_fwd_E1,
1473 z10_fwd_E1,
1474 z10_fwd_A1,
1475 z10_fwd_E1,
1476 z10_fwd_E1,
1477 *,
1478 *,
1479 z10_fwd_A1,
1480 z10_fwd_A3,
1481 z10_fr_E1,
1482 z10_fwd_A3,
1483 z10_rec,
1484 *,
1485 *,
1486 *,
1487 *,
1488 *,
1489 z10_rec,
1490 z10_super,
1491 *,
1492 *,
1493 *,
1494 *")
1495 ])
1496
1497 (define_split
1498 [(set (match_operand:DI 0 "register_operand" "")
1499 (match_operand:DI 1 "register_operand" ""))]
1500 "TARGET_ZARCH && ACCESS_REG_P (operands[1])"
1501 [(set (match_dup 2) (match_dup 3))
1502 (set (match_dup 0) (ashift:DI (match_dup 0) (const_int 32)))
1503 (set (strict_low_part (match_dup 2)) (match_dup 4))]
1504 "operands[2] = gen_lowpart (SImode, operands[0]);
1505 s390_split_access_reg (operands[1], &operands[4], &operands[3]);")
1506
1507 (define_split
1508 [(set (match_operand:DI 0 "register_operand" "")
1509 (match_operand:DI 1 "register_operand" ""))]
1510 "TARGET_ZARCH && ACCESS_REG_P (operands[0])
1511 && dead_or_set_p (insn, operands[1])"
1512 [(set (match_dup 3) (match_dup 2))
1513 (set (match_dup 1) (lshiftrt:DI (match_dup 1) (const_int 32)))
1514 (set (match_dup 4) (match_dup 2))]
1515 "operands[2] = gen_lowpart (SImode, operands[1]);
1516 s390_split_access_reg (operands[0], &operands[3], &operands[4]);")
1517
1518 (define_split
1519 [(set (match_operand:DI 0 "register_operand" "")
1520 (match_operand:DI 1 "register_operand" ""))]
1521 "TARGET_ZARCH && ACCESS_REG_P (operands[0])
1522 && !dead_or_set_p (insn, operands[1])"
1523 [(set (match_dup 3) (match_dup 2))
1524 (set (match_dup 1) (rotate:DI (match_dup 1) (const_int 32)))
1525 (set (match_dup 4) (match_dup 2))
1526 (set (match_dup 1) (rotate:DI (match_dup 1) (const_int 32)))]
1527 "operands[2] = gen_lowpart (SImode, operands[1]);
1528 s390_split_access_reg (operands[0], &operands[3], &operands[4]);")
1529
1530 (define_insn "*movdi_31"
1531 [(set (match_operand:DI 0 "nonimmediate_operand"
1532 "=d,d,Q,S,d ,o,!*f,!*f,!*f,!R,!T,d")
1533 (match_operand:DI 1 "general_operand"
1534 " Q,S,d,d,dPRT,d, *f, R, T,*f,*f,b"))]
1535 "!TARGET_ZARCH"
1536 "@
1537 lm\t%0,%N0,%S1
1538 lmy\t%0,%N0,%S1
1539 stm\t%1,%N1,%S0
1540 stmy\t%1,%N1,%S0
1541 #
1542 #
1543 ldr\t%0,%1
1544 ld\t%0,%1
1545 ldy\t%0,%1
1546 std\t%1,%0
1547 stdy\t%1,%0
1548 #"
1549 [(set_attr "op_type" "RS,RSY,RS,RSY,*,*,RR,RX,RXY,RX,RXY,*")
1550 (set_attr "type" "lm,lm,stm,stm,*,*,floaddf,floaddf,floaddf,fstoredf,fstoredf,*")
1551 (set_attr "cpu_facility" "*,*,*,*,*,*,*,*,*,*,*,z10")])
1552
1553 ; For a load from a symbol ref we can use one of the target registers
1554 ; together with larl to load the address.
1555 (define_split
1556 [(set (match_operand:DI 0 "register_operand" "")
1557 (match_operand:DI 1 "memory_operand" ""))]
1558 "!TARGET_ZARCH && reload_completed && TARGET_Z10
1559 && larl_operand (XEXP (operands[1], 0), SImode)"
1560 [(set (match_dup 2) (match_dup 3))
1561 (set (match_dup 0) (match_dup 1))]
1562 {
1563 operands[2] = operand_subword (operands[0], 1, 0, DImode);
1564 operands[3] = XEXP (operands[1], 0);
1565 operands[1] = replace_equiv_address (operands[1], operands[2]);
1566 })
1567
1568 (define_split
1569 [(set (match_operand:DI 0 "nonimmediate_operand" "")
1570 (match_operand:DI 1 "general_operand" ""))]
1571 "!TARGET_ZARCH && reload_completed
1572 && s390_split_ok_p (operands[0], operands[1], DImode, 0)"
1573 [(set (match_dup 2) (match_dup 4))
1574 (set (match_dup 3) (match_dup 5))]
1575 {
1576 operands[2] = operand_subword (operands[0], 0, 0, DImode);
1577 operands[3] = operand_subword (operands[0], 1, 0, DImode);
1578 operands[4] = operand_subword (operands[1], 0, 0, DImode);
1579 operands[5] = operand_subword (operands[1], 1, 0, DImode);
1580 })
1581
1582 (define_split
1583 [(set (match_operand:DI 0 "nonimmediate_operand" "")
1584 (match_operand:DI 1 "general_operand" ""))]
1585 "!TARGET_ZARCH && reload_completed
1586 && s390_split_ok_p (operands[0], operands[1], DImode, 1)"
1587 [(set (match_dup 2) (match_dup 4))
1588 (set (match_dup 3) (match_dup 5))]
1589 {
1590 operands[2] = operand_subword (operands[0], 1, 0, DImode);
1591 operands[3] = operand_subword (operands[0], 0, 0, DImode);
1592 operands[4] = operand_subword (operands[1], 1, 0, DImode);
1593 operands[5] = operand_subword (operands[1], 0, 0, DImode);
1594 })
1595
1596 (define_split
1597 [(set (match_operand:DI 0 "register_operand" "")
1598 (match_operand:DI 1 "memory_operand" ""))]
1599 "!TARGET_ZARCH && reload_completed
1600 && !FP_REG_P (operands[0])
1601 && !s_operand (operands[1], VOIDmode)"
1602 [(set (match_dup 0) (match_dup 1))]
1603 {
1604 rtx addr = operand_subword (operands[0], 1, 0, DImode);
1605 s390_load_address (addr, XEXP (operands[1], 0));
1606 operands[1] = replace_equiv_address (operands[1], addr);
1607 })
1608
1609 (define_peephole2
1610 [(set (match_operand:DI 0 "register_operand" "")
1611 (mem:DI (match_operand 1 "address_operand" "")))]
1612 "TARGET_ZARCH
1613 && !FP_REG_P (operands[0])
1614 && GET_CODE (operands[1]) == SYMBOL_REF
1615 && CONSTANT_POOL_ADDRESS_P (operands[1])
1616 && get_pool_mode (operands[1]) == DImode
1617 && legitimate_reload_constant_p (get_pool_constant (operands[1]))"
1618 [(set (match_dup 0) (match_dup 2))]
1619 "operands[2] = get_pool_constant (operands[1]);")
1620
1621 (define_insn "*la_64"
1622 [(set (match_operand:DI 0 "register_operand" "=d,d")
1623 (match_operand:QI 1 "address_operand" "ZQZR,ZSZT"))]
1624 "TARGET_64BIT"
1625 "@
1626 la\t%0,%a1
1627 lay\t%0,%a1"
1628 [(set_attr "op_type" "RX,RXY")
1629 (set_attr "type" "la")
1630 (set_attr "z10prop" "z10_fwd_A1,z10_fwd_A1")])
1631
1632 (define_peephole2
1633 [(parallel
1634 [(set (match_operand:DI 0 "register_operand" "")
1635 (match_operand:QI 1 "address_operand" ""))
1636 (clobber (reg:CC CC_REGNUM))])]
1637 "TARGET_64BIT
1638 && preferred_la_operand_p (operands[1], const0_rtx)"
1639 [(set (match_dup 0) (match_dup 1))]
1640 "")
1641
1642 (define_peephole2
1643 [(set (match_operand:DI 0 "register_operand" "")
1644 (match_operand:DI 1 "register_operand" ""))
1645 (parallel
1646 [(set (match_dup 0)
1647 (plus:DI (match_dup 0)
1648 (match_operand:DI 2 "nonmemory_operand" "")))
1649 (clobber (reg:CC CC_REGNUM))])]
1650 "TARGET_64BIT
1651 && !reg_overlap_mentioned_p (operands[0], operands[2])
1652 && preferred_la_operand_p (operands[1], operands[2])"
1653 [(set (match_dup 0) (plus:DI (match_dup 1) (match_dup 2)))]
1654 "")
1655
1656 ;
1657 ; movsi instruction pattern(s).
1658 ;
1659
1660 (define_expand "movsi"
1661 [(set (match_operand:SI 0 "general_operand" "")
1662 (match_operand:SI 1 "general_operand" ""))]
1663 ""
1664 {
1665 /* Handle symbolic constants. */
1666 if (!TARGET_64BIT
1667 && (SYMBOLIC_CONST (operands[1])
1668 || (GET_CODE (operands[1]) == PLUS
1669 && XEXP (operands[1], 0) == pic_offset_table_rtx
1670 && SYMBOLIC_CONST (XEXP(operands[1], 1)))))
1671 emit_symbolic_move (operands);
1672 })
1673
1674 (define_insn "*movsi_larl"
1675 [(set (match_operand:SI 0 "register_operand" "=d")
1676 (match_operand:SI 1 "larl_operand" "X"))]
1677 "!TARGET_64BIT && TARGET_CPU_ZARCH
1678 && !FP_REG_P (operands[0])"
1679 "larl\t%0,%1"
1680 [(set_attr "op_type" "RIL")
1681 (set_attr "type" "larl")
1682 (set_attr "z10prop" "z10_fwd_A1")])
1683
1684 (define_insn "*movsi_zarch"
1685 [(set (match_operand:SI 0 "nonimmediate_operand"
1686 "=d,d,d,d,d,d,d,d,d,R,T,!*f,!*f,!*f,!R,!T,d,t,Q,b,Q,t")
1687 (match_operand:SI 1 "general_operand"
1688 "K,N0HS0,N1HS0,Os,L,b,d,R,T,d,d,*f,R,T,*f,*f,t,d,t,d,K,Q"))]
1689 "TARGET_ZARCH"
1690 "@
1691 lhi\t%0,%h1
1692 llilh\t%0,%i1
1693 llill\t%0,%i1
1694 iilf\t%0,%o1
1695 lay\t%0,%a1
1696 lrl\t%0,%1
1697 lr\t%0,%1
1698 l\t%0,%1
1699 ly\t%0,%1
1700 st\t%1,%0
1701 sty\t%1,%0
1702 ler\t%0,%1
1703 le\t%0,%1
1704 ley\t%0,%1
1705 ste\t%1,%0
1706 stey\t%1,%0
1707 ear\t%0,%1
1708 sar\t%0,%1
1709 stam\t%1,%1,%S0
1710 strl\t%1,%0
1711 mvhi\t%0,%1
1712 lam\t%0,%0,%S1"
1713 [(set_attr "op_type" "RI,RI,RI,RIL,RXY,RIL,RR,RX,RXY,RX,RXY,
1714 RR,RX,RXY,RX,RXY,RRE,RRE,RS,RIL,SIL,RS")
1715 (set_attr "type" "*,
1716 *,
1717 *,
1718 *,
1719 la,
1720 larl,
1721 lr,
1722 load,
1723 load,
1724 store,
1725 store,
1726 floadsf,
1727 floadsf,
1728 floadsf,
1729 fstoresf,
1730 fstoresf,
1731 *,
1732 *,
1733 *,
1734 larl,
1735 *,
1736 *")
1737 (set_attr "cpu_facility" "*,*,*,extimm,longdisp,z10,*,*,longdisp,*,longdisp,
1738 *,*,longdisp,*,longdisp,*,*,*,z10,z10,*")
1739 (set_attr "z10prop" "z10_fwd_A1,
1740 z10_fwd_E1,
1741 z10_fwd_E1,
1742 z10_fwd_A1,
1743 z10_fwd_A1,
1744 z10_fwd_A3,
1745 z10_fr_E1,
1746 z10_fwd_A3,
1747 z10_fwd_A3,
1748 z10_rec,
1749 z10_rec,
1750 *,
1751 *,
1752 *,
1753 *,
1754 *,
1755 z10_super_E1,
1756 z10_super,
1757 *,
1758 z10_rec,
1759 z10_super,
1760 *")])
1761
1762 (define_insn "*movsi_esa"
1763 [(set (match_operand:SI 0 "nonimmediate_operand" "=d,d,d,R,!*f,!*f,!R,d,t,Q,t")
1764 (match_operand:SI 1 "general_operand" "K,d,R,d,*f,R,*f,t,d,t,Q"))]
1765 "!TARGET_ZARCH"
1766 "@
1767 lhi\t%0,%h1
1768 lr\t%0,%1
1769 l\t%0,%1
1770 st\t%1,%0
1771 ler\t%0,%1
1772 le\t%0,%1
1773 ste\t%1,%0
1774 ear\t%0,%1
1775 sar\t%0,%1
1776 stam\t%1,%1,%S0
1777 lam\t%0,%0,%S1"
1778 [(set_attr "op_type" "RI,RR,RX,RX,RR,RX,RX,RRE,RRE,RS,RS")
1779 (set_attr "type" "*,lr,load,store,floadsf,floadsf,fstoresf,*,*,*,*")
1780 (set_attr "z10prop" "z10_fwd_A1,
1781 z10_fr_E1,
1782 z10_fwd_A3,
1783 z10_rec,
1784 *,
1785 *,
1786 *,
1787 z10_super_E1,
1788 z10_super,
1789 *,
1790 *")
1791 ])
1792
1793 (define_peephole2
1794 [(set (match_operand:SI 0 "register_operand" "")
1795 (mem:SI (match_operand 1 "address_operand" "")))]
1796 "!FP_REG_P (operands[0])
1797 && GET_CODE (operands[1]) == SYMBOL_REF
1798 && CONSTANT_POOL_ADDRESS_P (operands[1])
1799 && get_pool_mode (operands[1]) == SImode
1800 && legitimate_reload_constant_p (get_pool_constant (operands[1]))"
1801 [(set (match_dup 0) (match_dup 2))]
1802 "operands[2] = get_pool_constant (operands[1]);")
1803
1804 (define_insn "*la_31"
1805 [(set (match_operand:SI 0 "register_operand" "=d,d")
1806 (match_operand:QI 1 "address_operand" "ZQZR,ZSZT"))]
1807 "!TARGET_64BIT && legitimate_la_operand_p (operands[1])"
1808 "@
1809 la\t%0,%a1
1810 lay\t%0,%a1"
1811 [(set_attr "op_type" "RX,RXY")
1812 (set_attr "type" "la")
1813 (set_attr "z10prop" "z10_fwd_A1,z10_fwd_A1")])
1814
1815 (define_peephole2
1816 [(parallel
1817 [(set (match_operand:SI 0 "register_operand" "")
1818 (match_operand:QI 1 "address_operand" ""))
1819 (clobber (reg:CC CC_REGNUM))])]
1820 "!TARGET_64BIT
1821 && preferred_la_operand_p (operands[1], const0_rtx)"
1822 [(set (match_dup 0) (match_dup 1))]
1823 "")
1824
1825 (define_peephole2
1826 [(set (match_operand:SI 0 "register_operand" "")
1827 (match_operand:SI 1 "register_operand" ""))
1828 (parallel
1829 [(set (match_dup 0)
1830 (plus:SI (match_dup 0)
1831 (match_operand:SI 2 "nonmemory_operand" "")))
1832 (clobber (reg:CC CC_REGNUM))])]
1833 "!TARGET_64BIT
1834 && !reg_overlap_mentioned_p (operands[0], operands[2])
1835 && preferred_la_operand_p (operands[1], operands[2])"
1836 [(set (match_dup 0) (plus:SI (match_dup 1) (match_dup 2)))]
1837 "")
1838
1839 (define_insn "*la_31_and"
1840 [(set (match_operand:SI 0 "register_operand" "=d,d")
1841 (and:SI (match_operand:QI 1 "address_operand" "ZQZR,ZSZT")
1842 (const_int 2147483647)))]
1843 "!TARGET_64BIT"
1844 "@
1845 la\t%0,%a1
1846 lay\t%0,%a1"
1847 [(set_attr "op_type" "RX,RXY")
1848 (set_attr "type" "la")
1849 (set_attr "z10prop" "z10_fwd_A1,z10_fwd_A1")])
1850
1851 (define_insn_and_split "*la_31_and_cc"
1852 [(set (match_operand:SI 0 "register_operand" "=d")
1853 (and:SI (match_operand:QI 1 "address_operand" "p")
1854 (const_int 2147483647)))
1855 (clobber (reg:CC CC_REGNUM))]
1856 "!TARGET_64BIT"
1857 "#"
1858 "&& reload_completed"
1859 [(set (match_dup 0)
1860 (and:SI (match_dup 1) (const_int 2147483647)))]
1861 ""
1862 [(set_attr "op_type" "RX")
1863 (set_attr "type" "la")])
1864
1865 (define_insn "force_la_31"
1866 [(set (match_operand:SI 0 "register_operand" "=d,d")
1867 (match_operand:QI 1 "address_operand" "ZQZR,ZSZT"))
1868 (use (const_int 0))]
1869 "!TARGET_64BIT"
1870 "@
1871 la\t%0,%a1
1872 lay\t%0,%a1"
1873 [(set_attr "op_type" "RX")
1874 (set_attr "type" "la")
1875 (set_attr "z10prop" "z10_fwd_A1,z10_fwd_A1")])
1876
1877 ;
1878 ; movhi instruction pattern(s).
1879 ;
1880
1881 (define_expand "movhi"
1882 [(set (match_operand:HI 0 "nonimmediate_operand" "")
1883 (match_operand:HI 1 "general_operand" ""))]
1884 ""
1885 {
1886 /* Make it explicit that loading a register from memory
1887 always sign-extends (at least) to SImode. */
1888 if (optimize && can_create_pseudo_p ()
1889 && register_operand (operands[0], VOIDmode)
1890 && GET_CODE (operands[1]) == MEM)
1891 {
1892 rtx tmp = gen_reg_rtx (SImode);
1893 rtx ext = gen_rtx_SIGN_EXTEND (SImode, operands[1]);
1894 emit_insn (gen_rtx_SET (VOIDmode, tmp, ext));
1895 operands[1] = gen_lowpart (HImode, tmp);
1896 }
1897 })
1898
1899 (define_insn "*movhi"
1900 [(set (match_operand:HI 0 "nonimmediate_operand" "=d,d,d,d,d,R,T,b,Q")
1901 (match_operand:HI 1 "general_operand" " d,n,R,T,b,d,d,d,K"))]
1902 ""
1903 "@
1904 lr\t%0,%1
1905 lhi\t%0,%h1
1906 lh\t%0,%1
1907 lhy\t%0,%1
1908 lhrl\t%0,%1
1909 sth\t%1,%0
1910 sthy\t%1,%0
1911 sthrl\t%1,%0
1912 mvhhi\t%0,%1"
1913 [(set_attr "op_type" "RR,RI,RX,RXY,RIL,RX,RXY,RIL,SIL")
1914 (set_attr "type" "lr,*,*,*,larl,store,store,store,*")
1915 (set_attr "cpu_facility" "*,*,*,*,z10,*,*,z10,z10")
1916 (set_attr "z10prop" "z10_fr_E1,
1917 z10_fwd_A1,
1918 z10_super_E1,
1919 z10_super_E1,
1920 z10_super_E1,
1921 z10_rec,
1922 z10_rec,
1923 z10_rec,
1924 z10_super")])
1925
1926 (define_peephole2
1927 [(set (match_operand:HI 0 "register_operand" "")
1928 (mem:HI (match_operand 1 "address_operand" "")))]
1929 "GET_CODE (operands[1]) == SYMBOL_REF
1930 && CONSTANT_POOL_ADDRESS_P (operands[1])
1931 && get_pool_mode (operands[1]) == HImode
1932 && GET_CODE (get_pool_constant (operands[1])) == CONST_INT"
1933 [(set (match_dup 0) (match_dup 2))]
1934 "operands[2] = get_pool_constant (operands[1]);")
1935
1936 ;
1937 ; movqi instruction pattern(s).
1938 ;
1939
1940 (define_expand "movqi"
1941 [(set (match_operand:QI 0 "nonimmediate_operand" "")
1942 (match_operand:QI 1 "general_operand" ""))]
1943 ""
1944 {
1945 /* On z/Architecture, zero-extending from memory to register
1946 is just as fast as a QImode load. */
1947 if (TARGET_ZARCH && optimize && can_create_pseudo_p ()
1948 && register_operand (operands[0], VOIDmode)
1949 && GET_CODE (operands[1]) == MEM)
1950 {
1951 rtx tmp = gen_reg_rtx (DImode);
1952 rtx ext = gen_rtx_ZERO_EXTEND (DImode, operands[1]);
1953 emit_insn (gen_rtx_SET (VOIDmode, tmp, ext));
1954 operands[1] = gen_lowpart (QImode, tmp);
1955 }
1956 })
1957
1958 (define_insn "*movqi"
1959 [(set (match_operand:QI 0 "nonimmediate_operand" "=d,d,d,d,R,T,Q,S,?Q")
1960 (match_operand:QI 1 "general_operand" " d,n,R,T,d,d,n,n,?Q"))]
1961 ""
1962 "@
1963 lr\t%0,%1
1964 lhi\t%0,%b1
1965 ic\t%0,%1
1966 icy\t%0,%1
1967 stc\t%1,%0
1968 stcy\t%1,%0
1969 mvi\t%S0,%b1
1970 mviy\t%S0,%b1
1971 #"
1972 [(set_attr "op_type" "RR,RI,RX,RXY,RX,RXY,SI,SIY,SS")
1973 (set_attr "type" "lr,*,*,*,store,store,store,store,*")
1974 (set_attr "z10prop" "z10_fr_E1,
1975 z10_fwd_A1,
1976 z10_super_E1,
1977 z10_super_E1,
1978 z10_rec,
1979 z10_rec,
1980 z10_super,
1981 z10_super,
1982 *")])
1983
1984 (define_peephole2
1985 [(set (match_operand:QI 0 "nonimmediate_operand" "")
1986 (mem:QI (match_operand 1 "address_operand" "")))]
1987 "GET_CODE (operands[1]) == SYMBOL_REF
1988 && CONSTANT_POOL_ADDRESS_P (operands[1])
1989 && get_pool_mode (operands[1]) == QImode
1990 && GET_CODE (get_pool_constant (operands[1])) == CONST_INT"
1991 [(set (match_dup 0) (match_dup 2))]
1992 "operands[2] = get_pool_constant (operands[1]);")
1993
1994 ;
1995 ; movstrictqi instruction pattern(s).
1996 ;
1997
1998 (define_insn "*movstrictqi"
1999 [(set (strict_low_part (match_operand:QI 0 "register_operand" "+d,d"))
2000 (match_operand:QI 1 "memory_operand" "R,T"))]
2001 ""
2002 "@
2003 ic\t%0,%1
2004 icy\t%0,%1"
2005 [(set_attr "op_type" "RX,RXY")
2006 (set_attr "z10prop" "z10_super_E1,z10_super_E1")])
2007
2008 ;
2009 ; movstricthi instruction pattern(s).
2010 ;
2011
2012 (define_insn "*movstricthi"
2013 [(set (strict_low_part (match_operand:HI 0 "register_operand" "+d,d"))
2014 (match_operand:HI 1 "memory_operand" "Q,S"))
2015 (clobber (reg:CC CC_REGNUM))]
2016 ""
2017 "@
2018 icm\t%0,3,%S1
2019 icmy\t%0,3,%S1"
2020 [(set_attr "op_type" "RS,RSY")
2021 (set_attr "z10prop" "z10_super_E1,z10_super_E1")])
2022
2023 ;
2024 ; movstrictsi instruction pattern(s).
2025 ;
2026
2027 (define_insn "movstrictsi"
2028 [(set (strict_low_part (match_operand:SI 0 "register_operand" "+d,d,d,d"))
2029 (match_operand:SI 1 "general_operand" "d,R,T,t"))]
2030 "TARGET_ZARCH"
2031 "@
2032 lr\t%0,%1
2033 l\t%0,%1
2034 ly\t%0,%1
2035 ear\t%0,%1"
2036 [(set_attr "op_type" "RR,RX,RXY,RRE")
2037 (set_attr "type" "lr,load,load,*")
2038 (set_attr "z10prop" "z10_fr_E1,z10_fwd_A3,z10_fwd_A3,z10_super_E1")])
2039
2040 ;
2041 ; mov(tf|td) instruction pattern(s).
2042 ;
2043
2044 (define_expand "mov<mode>"
2045 [(set (match_operand:TD_TF 0 "nonimmediate_operand" "")
2046 (match_operand:TD_TF 1 "general_operand" ""))]
2047 ""
2048 "")
2049
2050 (define_insn "*mov<mode>_64"
2051 [(set (match_operand:TD_TF 0 "nonimmediate_operand" "=f,f,f,o, d,QS, d,o")
2052 (match_operand:TD_TF 1 "general_operand" " G,f,o,f,QS, d,dRT,d"))]
2053 "TARGET_ZARCH"
2054 "@
2055 lzxr\t%0
2056 lxr\t%0,%1
2057 #
2058 #
2059 lmg\t%0,%N0,%S1
2060 stmg\t%1,%N1,%S0
2061 #
2062 #"
2063 [(set_attr "op_type" "RRE,RRE,*,*,RSY,RSY,*,*")
2064 (set_attr "type" "fsimptf,fsimptf,*,*,lm,stm,*,*")
2065 (set_attr "cpu_facility" "z196,*,*,*,*,*,*,*")])
2066
2067 (define_insn "*mov<mode>_31"
2068 [(set (match_operand:TD_TF 0 "nonimmediate_operand" "=f,f,f,o")
2069 (match_operand:TD_TF 1 "general_operand" " G,f,o,f"))]
2070 "!TARGET_ZARCH"
2071 "@
2072 lzxr\t%0
2073 lxr\t%0,%1
2074 #
2075 #"
2076 [(set_attr "op_type" "RRE,RRE,*,*")
2077 (set_attr "type" "fsimptf,fsimptf,*,*")
2078 (set_attr "cpu_facility" "z196,*,*,*")])
2079
2080 ; TFmode in GPRs splitters
2081
2082 (define_split
2083 [(set (match_operand:TD_TF 0 "nonimmediate_operand" "")
2084 (match_operand:TD_TF 1 "general_operand" ""))]
2085 "TARGET_ZARCH && reload_completed
2086 && s390_split_ok_p (operands[0], operands[1], <MODE>mode, 0)"
2087 [(set (match_dup 2) (match_dup 4))
2088 (set (match_dup 3) (match_dup 5))]
2089 {
2090 operands[2] = operand_subword (operands[0], 0, 0, <MODE>mode);
2091 operands[3] = operand_subword (operands[0], 1, 0, <MODE>mode);
2092 operands[4] = operand_subword (operands[1], 0, 0, <MODE>mode);
2093 operands[5] = operand_subword (operands[1], 1, 0, <MODE>mode);
2094 })
2095
2096 (define_split
2097 [(set (match_operand:TD_TF 0 "nonimmediate_operand" "")
2098 (match_operand:TD_TF 1 "general_operand" ""))]
2099 "TARGET_ZARCH && reload_completed
2100 && s390_split_ok_p (operands[0], operands[1], <MODE>mode, 1)"
2101 [(set (match_dup 2) (match_dup 4))
2102 (set (match_dup 3) (match_dup 5))]
2103 {
2104 operands[2] = operand_subword (operands[0], 1, 0, <MODE>mode);
2105 operands[3] = operand_subword (operands[0], 0, 0, <MODE>mode);
2106 operands[4] = operand_subword (operands[1], 1, 0, <MODE>mode);
2107 operands[5] = operand_subword (operands[1], 0, 0, <MODE>mode);
2108 })
2109
2110 (define_split
2111 [(set (match_operand:TD_TF 0 "register_operand" "")
2112 (match_operand:TD_TF 1 "memory_operand" ""))]
2113 "TARGET_ZARCH && reload_completed
2114 && !FP_REG_P (operands[0])
2115 && !s_operand (operands[1], VOIDmode)"
2116 [(set (match_dup 0) (match_dup 1))]
2117 {
2118 rtx addr = operand_subword (operands[0], 1, 0, <MODE>mode);
2119 addr = gen_lowpart (Pmode, addr);
2120 s390_load_address (addr, XEXP (operands[1], 0));
2121 operands[1] = replace_equiv_address (operands[1], addr);
2122 })
2123
2124 ; TFmode in BFPs splitters
2125
2126 (define_split
2127 [(set (match_operand:TD_TF 0 "register_operand" "")
2128 (match_operand:TD_TF 1 "memory_operand" ""))]
2129 "reload_completed && offsettable_memref_p (operands[1])
2130 && FP_REG_P (operands[0])"
2131 [(set (match_dup 2) (match_dup 4))
2132 (set (match_dup 3) (match_dup 5))]
2133 {
2134 operands[2] = simplify_gen_subreg (<HALF_TMODE>mode, operands[0],
2135 <MODE>mode, 0);
2136 operands[3] = simplify_gen_subreg (<HALF_TMODE>mode, operands[0],
2137 <MODE>mode, 8);
2138 operands[4] = adjust_address_nv (operands[1], <HALF_TMODE>mode, 0);
2139 operands[5] = adjust_address_nv (operands[1], <HALF_TMODE>mode, 8);
2140 })
2141
2142 (define_split
2143 [(set (match_operand:TD_TF 0 "memory_operand" "")
2144 (match_operand:TD_TF 1 "register_operand" ""))]
2145 "reload_completed && offsettable_memref_p (operands[0])
2146 && FP_REG_P (operands[1])"
2147 [(set (match_dup 2) (match_dup 4))
2148 (set (match_dup 3) (match_dup 5))]
2149 {
2150 operands[2] = adjust_address_nv (operands[0], <HALF_TMODE>mode, 0);
2151 operands[3] = adjust_address_nv (operands[0], <HALF_TMODE>mode, 8);
2152 operands[4] = simplify_gen_subreg (<HALF_TMODE>mode, operands[1],
2153 <MODE>mode, 0);
2154 operands[5] = simplify_gen_subreg (<HALF_TMODE>mode, operands[1],
2155 <MODE>mode, 8);
2156 })
2157
2158 ;
2159 ; mov(df|dd) instruction pattern(s).
2160 ;
2161
2162 (define_expand "mov<mode>"
2163 [(set (match_operand:DD_DF 0 "nonimmediate_operand" "")
2164 (match_operand:DD_DF 1 "general_operand" ""))]
2165 ""
2166 "")
2167
2168 (define_insn "*mov<mode>_64dfp"
2169 [(set (match_operand:DD_DF 0 "nonimmediate_operand"
2170 "=f,f,f,d,f,f,R,T,d,d, d,RT")
2171 (match_operand:DD_DF 1 "general_operand"
2172 " G,f,d,f,R,T,f,f,G,d,RT, d"))]
2173 "TARGET_DFP"
2174 "@
2175 lzdr\t%0
2176 ldr\t%0,%1
2177 ldgr\t%0,%1
2178 lgdr\t%0,%1
2179 ld\t%0,%1
2180 ldy\t%0,%1
2181 std\t%1,%0
2182 stdy\t%1,%0
2183 lghi\t%0,0
2184 lgr\t%0,%1
2185 lg\t%0,%1
2186 stg\t%1,%0"
2187 [(set_attr "op_type" "RRE,RR,RRE,RRE,RX,RXY,RX,RXY,RI,RRE,RXY,RXY")
2188 (set_attr "type" "fsimpdf,floaddf,floaddf,floaddf,floaddf,floaddf,
2189 fstoredf,fstoredf,*,lr,load,store")
2190 (set_attr "z10prop" "*,*,*,*,*,*,*,*,z10_fwd_A1,z10_fr_E1,z10_fwd_A3,z10_rec")
2191 (set_attr "cpu_facility" "z196,*,*,*,*,*,*,*,*,*,*,*")])
2192
2193 (define_insn "*mov<mode>_64"
2194 [(set (match_operand:DD_DF 0 "nonimmediate_operand" "=f,f,f,f,R,T,d,d, d,RT")
2195 (match_operand:DD_DF 1 "general_operand" " G,f,R,T,f,f,G,d,RT, d"))]
2196 "TARGET_ZARCH"
2197 "@
2198 lzdr\t%0
2199 ldr\t%0,%1
2200 ld\t%0,%1
2201 ldy\t%0,%1
2202 std\t%1,%0
2203 stdy\t%1,%0
2204 lghi\t%0,0
2205 lgr\t%0,%1
2206 lg\t%0,%1
2207 stg\t%1,%0"
2208 [(set_attr "op_type" "RRE,RR,RX,RXY,RX,RXY,RI,RRE,RXY,RXY")
2209 (set_attr "type" "fsimpdf,fload<mode>,fload<mode>,fload<mode>,
2210 fstore<mode>,fstore<mode>,*,lr,load,store")
2211 (set_attr "z10prop" "*,*,*,*,*,*,z10_fwd_A1,z10_fr_E1,z10_fwd_A3,z10_rec")
2212 (set_attr "cpu_facility" "z196,*,*,*,*,*,*,*,*,*")])
2213
2214 (define_insn "*mov<mode>_31"
2215 [(set (match_operand:DD_DF 0 "nonimmediate_operand"
2216 "=f,f,f,f,R,T,d,d,Q,S, d,o")
2217 (match_operand:DD_DF 1 "general_operand"
2218 " G,f,R,T,f,f,Q,S,d,d,dPRT,d"))]
2219 "!TARGET_ZARCH"
2220 "@
2221 lzdr\t%0
2222 ldr\t%0,%1
2223 ld\t%0,%1
2224 ldy\t%0,%1
2225 std\t%1,%0
2226 stdy\t%1,%0
2227 lm\t%0,%N0,%S1
2228 lmy\t%0,%N0,%S1
2229 stm\t%1,%N1,%S0
2230 stmy\t%1,%N1,%S0
2231 #
2232 #"
2233 [(set_attr "op_type" "RRE,RR,RX,RXY,RX,RXY,RS,RSY,RS,RSY,*,*")
2234 (set_attr "type" "fsimpdf,fload<mode>,fload<mode>,fload<mode>,
2235 fstore<mode>,fstore<mode>,lm,lm,stm,stm,*,*")
2236 (set_attr "cpu_facility" "z196,*,*,*,*,*,*,*,*,*,*,*")])
2237
2238 (define_split
2239 [(set (match_operand:DD_DF 0 "nonimmediate_operand" "")
2240 (match_operand:DD_DF 1 "general_operand" ""))]
2241 "!TARGET_ZARCH && reload_completed
2242 && s390_split_ok_p (operands[0], operands[1], <MODE>mode, 0)"
2243 [(set (match_dup 2) (match_dup 4))
2244 (set (match_dup 3) (match_dup 5))]
2245 {
2246 operands[2] = operand_subword (operands[0], 0, 0, <MODE>mode);
2247 operands[3] = operand_subword (operands[0], 1, 0, <MODE>mode);
2248 operands[4] = operand_subword (operands[1], 0, 0, <MODE>mode);
2249 operands[5] = operand_subword (operands[1], 1, 0, <MODE>mode);
2250 })
2251
2252 (define_split
2253 [(set (match_operand:DD_DF 0 "nonimmediate_operand" "")
2254 (match_operand:DD_DF 1 "general_operand" ""))]
2255 "!TARGET_ZARCH && reload_completed
2256 && s390_split_ok_p (operands[0], operands[1], <MODE>mode, 1)"
2257 [(set (match_dup 2) (match_dup 4))
2258 (set (match_dup 3) (match_dup 5))]
2259 {
2260 operands[2] = operand_subword (operands[0], 1, 0, <MODE>mode);
2261 operands[3] = operand_subword (operands[0], 0, 0, <MODE>mode);
2262 operands[4] = operand_subword (operands[1], 1, 0, <MODE>mode);
2263 operands[5] = operand_subword (operands[1], 0, 0, <MODE>mode);
2264 })
2265
2266 (define_split
2267 [(set (match_operand:DD_DF 0 "register_operand" "")
2268 (match_operand:DD_DF 1 "memory_operand" ""))]
2269 "!TARGET_ZARCH && reload_completed
2270 && !FP_REG_P (operands[0])
2271 && !s_operand (operands[1], VOIDmode)"
2272 [(set (match_dup 0) (match_dup 1))]
2273 {
2274 rtx addr = operand_subword (operands[0], 1, 0, <MODE>mode);
2275 s390_load_address (addr, XEXP (operands[1], 0));
2276 operands[1] = replace_equiv_address (operands[1], addr);
2277 })
2278
2279 ;
2280 ; mov(sf|sd) instruction pattern(s).
2281 ;
2282
2283 (define_insn "mov<mode>"
2284 [(set (match_operand:SD_SF 0 "nonimmediate_operand"
2285 "=f,f,f,f,R,T,d,d,d,d,R,T")
2286 (match_operand:SD_SF 1 "general_operand"
2287 " G,f,R,T,f,f,G,d,R,T,d,d"))]
2288 ""
2289 "@
2290 lzer\t%0
2291 ler\t%0,%1
2292 le\t%0,%1
2293 ley\t%0,%1
2294 ste\t%1,%0
2295 stey\t%1,%0
2296 lhi\t%0,0
2297 lr\t%0,%1
2298 l\t%0,%1
2299 ly\t%0,%1
2300 st\t%1,%0
2301 sty\t%1,%0"
2302 [(set_attr "op_type" "RRE,RR,RX,RXY,RX,RXY,RI,RR,RX,RXY,RX,RXY")
2303 (set_attr "type" "fsimpsf,fload<mode>,fload<mode>,fload<mode>,
2304 fstore<mode>,fstore<mode>,*,lr,load,load,store,store")
2305 (set_attr "z10prop" "*,*,*,*,*,*,z10_fwd_A1,z10_fr_E1,z10_fwd_A3,z10_fwd_A3,z10_rec,z10_rec")
2306 (set_attr "cpu_facility" "z196,*,*,*,*,*,*,*,*,*,*,*")])
2307
2308 ;
2309 ; movcc instruction pattern
2310 ;
2311
2312 (define_insn "movcc"
2313 [(set (match_operand:CC 0 "nonimmediate_operand" "=d,c,d,d,d,R,T")
2314 (match_operand:CC 1 "nonimmediate_operand" " d,d,c,R,T,d,d"))]
2315 ""
2316 "@
2317 lr\t%0,%1
2318 tmh\t%1,12288
2319 ipm\t%0
2320 l\t%0,%1
2321 ly\t%0,%1
2322 st\t%1,%0
2323 sty\t%1,%0"
2324 [(set_attr "op_type" "RR,RI,RRE,RX,RXY,RX,RXY")
2325 (set_attr "type" "lr,*,*,load,load,store,store")
2326 (set_attr "z10prop" "z10_fr_E1,z10_super,*,z10_fwd_A3,z10_fwd_A3,z10_rec,z10_rec")
2327 (set_attr "z196prop" "*,*,z196_ends,*,*,*,*")])
2328
2329 ;
2330 ; Block move (MVC) patterns.
2331 ;
2332
2333 (define_insn "*mvc"
2334 [(set (match_operand:BLK 0 "memory_operand" "=Q")
2335 (match_operand:BLK 1 "memory_operand" "Q"))
2336 (use (match_operand 2 "const_int_operand" "n"))]
2337 "INTVAL (operands[2]) >= 1 && INTVAL (operands[2]) <= 256"
2338 "mvc\t%O0(%2,%R0),%S1"
2339 [(set_attr "op_type" "SS")])
2340
2341 ; This splitter converts a QI to QI mode copy into a BLK mode copy in
2342 ; order to have it implemented with mvc.
2343
2344 (define_split
2345 [(set (match_operand:QI 0 "memory_operand" "")
2346 (match_operand:QI 1 "memory_operand" ""))]
2347 "reload_completed"
2348 [(parallel
2349 [(set (match_dup 0) (match_dup 1))
2350 (use (const_int 1))])]
2351 {
2352 operands[0] = adjust_address (operands[0], BLKmode, 0);
2353 operands[1] = adjust_address (operands[1], BLKmode, 0);
2354 })
2355
2356
2357 (define_peephole2
2358 [(parallel
2359 [(set (match_operand:BLK 0 "memory_operand" "")
2360 (match_operand:BLK 1 "memory_operand" ""))
2361 (use (match_operand 2 "const_int_operand" ""))])
2362 (parallel
2363 [(set (match_operand:BLK 3 "memory_operand" "")
2364 (match_operand:BLK 4 "memory_operand" ""))
2365 (use (match_operand 5 "const_int_operand" ""))])]
2366 "s390_offset_p (operands[0], operands[3], operands[2])
2367 && s390_offset_p (operands[1], operands[4], operands[2])
2368 && !s390_overlap_p (operands[0], operands[1],
2369 INTVAL (operands[2]) + INTVAL (operands[5]))
2370 && INTVAL (operands[2]) + INTVAL (operands[5]) <= 256"
2371 [(parallel
2372 [(set (match_dup 6) (match_dup 7))
2373 (use (match_dup 8))])]
2374 "operands[6] = gen_rtx_MEM (BLKmode, XEXP (operands[0], 0));
2375 operands[7] = gen_rtx_MEM (BLKmode, XEXP (operands[1], 0));
2376 operands[8] = GEN_INT (INTVAL (operands[2]) + INTVAL (operands[5]));")
2377
2378
2379 ;
2380 ; load_multiple pattern(s).
2381 ;
2382 ; ??? Due to reload problems with replacing registers inside match_parallel
2383 ; we currently support load_multiple/store_multiple only after reload.
2384 ;
2385
2386 (define_expand "load_multiple"
2387 [(match_par_dup 3 [(set (match_operand 0 "" "")
2388 (match_operand 1 "" ""))
2389 (use (match_operand 2 "" ""))])]
2390 "reload_completed"
2391 {
2392 enum machine_mode mode;
2393 int regno;
2394 int count;
2395 rtx from;
2396 int i, off;
2397
2398 /* Support only loading a constant number of fixed-point registers from
2399 memory and only bother with this if more than two */
2400 if (GET_CODE (operands[2]) != CONST_INT
2401 || INTVAL (operands[2]) < 2
2402 || INTVAL (operands[2]) > 16
2403 || GET_CODE (operands[1]) != MEM
2404 || GET_CODE (operands[0]) != REG
2405 || REGNO (operands[0]) >= 16)
2406 FAIL;
2407
2408 count = INTVAL (operands[2]);
2409 regno = REGNO (operands[0]);
2410 mode = GET_MODE (operands[0]);
2411 if (mode != SImode && (!TARGET_ZARCH || mode != DImode))
2412 FAIL;
2413
2414 operands[3] = gen_rtx_PARALLEL (VOIDmode, rtvec_alloc (count));
2415 if (!can_create_pseudo_p ())
2416 {
2417 if (GET_CODE (XEXP (operands[1], 0)) == REG)
2418 {
2419 from = XEXP (operands[1], 0);
2420 off = 0;
2421 }
2422 else if (GET_CODE (XEXP (operands[1], 0)) == PLUS
2423 && GET_CODE (XEXP (XEXP (operands[1], 0), 0)) == REG
2424 && GET_CODE (XEXP (XEXP (operands[1], 0), 1)) == CONST_INT)
2425 {
2426 from = XEXP (XEXP (operands[1], 0), 0);
2427 off = INTVAL (XEXP (XEXP (operands[1], 0), 1));
2428 }
2429 else
2430 FAIL;
2431 }
2432 else
2433 {
2434 from = force_reg (Pmode, XEXP (operands[1], 0));
2435 off = 0;
2436 }
2437
2438 for (i = 0; i < count; i++)
2439 XVECEXP (operands[3], 0, i)
2440 = gen_rtx_SET (VOIDmode, gen_rtx_REG (mode, regno + i),
2441 change_address (operands[1], mode,
2442 plus_constant (Pmode, from,
2443 off + i * GET_MODE_SIZE (mode))));
2444 })
2445
2446 (define_insn "*load_multiple_di"
2447 [(match_parallel 0 "load_multiple_operation"
2448 [(set (match_operand:DI 1 "register_operand" "=r")
2449 (match_operand:DI 2 "s_operand" "QS"))])]
2450 "reload_completed && TARGET_ZARCH"
2451 {
2452 int words = XVECLEN (operands[0], 0);
2453 operands[0] = gen_rtx_REG (DImode, REGNO (operands[1]) + words - 1);
2454 return "lmg\t%1,%0,%S2";
2455 }
2456 [(set_attr "op_type" "RSY")
2457 (set_attr "type" "lm")])
2458
2459 (define_insn "*load_multiple_si"
2460 [(match_parallel 0 "load_multiple_operation"
2461 [(set (match_operand:SI 1 "register_operand" "=r,r")
2462 (match_operand:SI 2 "s_operand" "Q,S"))])]
2463 "reload_completed"
2464 {
2465 int words = XVECLEN (operands[0], 0);
2466 operands[0] = gen_rtx_REG (SImode, REGNO (operands[1]) + words - 1);
2467 return which_alternative == 0 ? "lm\t%1,%0,%S2" : "lmy\t%1,%0,%S2";
2468 }
2469 [(set_attr "op_type" "RS,RSY")
2470 (set_attr "type" "lm")])
2471
2472 ;
2473 ; store multiple pattern(s).
2474 ;
2475
2476 (define_expand "store_multiple"
2477 [(match_par_dup 3 [(set (match_operand 0 "" "")
2478 (match_operand 1 "" ""))
2479 (use (match_operand 2 "" ""))])]
2480 "reload_completed"
2481 {
2482 enum machine_mode mode;
2483 int regno;
2484 int count;
2485 rtx to;
2486 int i, off;
2487
2488 /* Support only storing a constant number of fixed-point registers to
2489 memory and only bother with this if more than two. */
2490 if (GET_CODE (operands[2]) != CONST_INT
2491 || INTVAL (operands[2]) < 2
2492 || INTVAL (operands[2]) > 16
2493 || GET_CODE (operands[0]) != MEM
2494 || GET_CODE (operands[1]) != REG
2495 || REGNO (operands[1]) >= 16)
2496 FAIL;
2497
2498 count = INTVAL (operands[2]);
2499 regno = REGNO (operands[1]);
2500 mode = GET_MODE (operands[1]);
2501 if (mode != SImode && (!TARGET_ZARCH || mode != DImode))
2502 FAIL;
2503
2504 operands[3] = gen_rtx_PARALLEL (VOIDmode, rtvec_alloc (count));
2505
2506 if (!can_create_pseudo_p ())
2507 {
2508 if (GET_CODE (XEXP (operands[0], 0)) == REG)
2509 {
2510 to = XEXP (operands[0], 0);
2511 off = 0;
2512 }
2513 else if (GET_CODE (XEXP (operands[0], 0)) == PLUS
2514 && GET_CODE (XEXP (XEXP (operands[0], 0), 0)) == REG
2515 && GET_CODE (XEXP (XEXP (operands[0], 0), 1)) == CONST_INT)
2516 {
2517 to = XEXP (XEXP (operands[0], 0), 0);
2518 off = INTVAL (XEXP (XEXP (operands[0], 0), 1));
2519 }
2520 else
2521 FAIL;
2522 }
2523 else
2524 {
2525 to = force_reg (Pmode, XEXP (operands[0], 0));
2526 off = 0;
2527 }
2528
2529 for (i = 0; i < count; i++)
2530 XVECEXP (operands[3], 0, i)
2531 = gen_rtx_SET (VOIDmode,
2532 change_address (operands[0], mode,
2533 plus_constant (Pmode, to,
2534 off + i * GET_MODE_SIZE (mode))),
2535 gen_rtx_REG (mode, regno + i));
2536 })
2537
2538 (define_insn "*store_multiple_di"
2539 [(match_parallel 0 "store_multiple_operation"
2540 [(set (match_operand:DI 1 "s_operand" "=QS")
2541 (match_operand:DI 2 "register_operand" "r"))])]
2542 "reload_completed && TARGET_ZARCH"
2543 {
2544 int words = XVECLEN (operands[0], 0);
2545 operands[0] = gen_rtx_REG (DImode, REGNO (operands[2]) + words - 1);
2546 return "stmg\t%2,%0,%S1";
2547 }
2548 [(set_attr "op_type" "RSY")
2549 (set_attr "type" "stm")])
2550
2551
2552 (define_insn "*store_multiple_si"
2553 [(match_parallel 0 "store_multiple_operation"
2554 [(set (match_operand:SI 1 "s_operand" "=Q,S")
2555 (match_operand:SI 2 "register_operand" "r,r"))])]
2556 "reload_completed"
2557 {
2558 int words = XVECLEN (operands[0], 0);
2559 operands[0] = gen_rtx_REG (SImode, REGNO (operands[2]) + words - 1);
2560 return which_alternative == 0 ? "stm\t%2,%0,%S1" : "stmy\t%2,%0,%S1";
2561 }
2562 [(set_attr "op_type" "RS,RSY")
2563 (set_attr "type" "stm")])
2564
2565 ;;
2566 ;; String instructions.
2567 ;;
2568
2569 (define_insn "*execute_rl"
2570 [(match_parallel 0 "execute_operation"
2571 [(unspec [(match_operand 1 "register_operand" "a")
2572 (match_operand 2 "" "")
2573 (match_operand:SI 3 "larl_operand" "X")] UNSPEC_EXECUTE)])]
2574 "TARGET_Z10 && GET_MODE_CLASS (GET_MODE (operands[1])) == MODE_INT
2575 && GET_MODE_SIZE (GET_MODE (operands[1])) <= UNITS_PER_WORD"
2576 "exrl\t%1,%3"
2577 [(set_attr "op_type" "RIL")
2578 (set_attr "type" "cs")])
2579
2580 (define_insn "*execute"
2581 [(match_parallel 0 "execute_operation"
2582 [(unspec [(match_operand 1 "register_operand" "a")
2583 (match_operand:BLK 2 "memory_operand" "R")
2584 (match_operand 3 "" "")] UNSPEC_EXECUTE)])]
2585 "GET_MODE_CLASS (GET_MODE (operands[1])) == MODE_INT
2586 && GET_MODE_SIZE (GET_MODE (operands[1])) <= UNITS_PER_WORD"
2587 "ex\t%1,%2"
2588 [(set_attr "op_type" "RX")
2589 (set_attr "type" "cs")])
2590
2591
2592 ;
2593 ; strlenM instruction pattern(s).
2594 ;
2595
2596 (define_expand "strlen<mode>"
2597 [(set (reg:SI 0) (match_operand:SI 2 "immediate_operand" ""))
2598 (parallel
2599 [(set (match_dup 4)
2600 (unspec:P [(const_int 0)
2601 (match_operand:BLK 1 "memory_operand" "")
2602 (reg:SI 0)
2603 (match_operand 3 "immediate_operand" "")] UNSPEC_SRST))
2604 (clobber (scratch:P))
2605 (clobber (reg:CC CC_REGNUM))])
2606 (parallel
2607 [(set (match_operand:P 0 "register_operand" "")
2608 (minus:P (match_dup 4) (match_dup 5)))
2609 (clobber (reg:CC CC_REGNUM))])]
2610 ""
2611 {
2612 operands[4] = gen_reg_rtx (Pmode);
2613 operands[5] = gen_reg_rtx (Pmode);
2614 emit_move_insn (operands[5], force_operand (XEXP (operands[1], 0), NULL_RTX));
2615 operands[1] = replace_equiv_address (operands[1], operands[5]);
2616 })
2617
2618 (define_insn "*strlen<mode>"
2619 [(set (match_operand:P 0 "register_operand" "=a")
2620 (unspec:P [(match_operand:P 2 "general_operand" "0")
2621 (mem:BLK (match_operand:P 3 "register_operand" "1"))
2622 (reg:SI 0)
2623 (match_operand 4 "immediate_operand" "")] UNSPEC_SRST))
2624 (clobber (match_scratch:P 1 "=a"))
2625 (clobber (reg:CC CC_REGNUM))]
2626 ""
2627 "srst\t%0,%1\;jo\t.-4"
2628 [(set_attr "length" "8")
2629 (set_attr "type" "vs")])
2630
2631 ;
2632 ; cmpstrM instruction pattern(s).
2633 ;
2634
2635 (define_expand "cmpstrsi"
2636 [(set (reg:SI 0) (const_int 0))
2637 (parallel
2638 [(clobber (match_operand 3 "" ""))
2639 (clobber (match_dup 4))
2640 (set (reg:CCU CC_REGNUM)
2641 (compare:CCU (match_operand:BLK 1 "memory_operand" "")
2642 (match_operand:BLK 2 "memory_operand" "")))
2643 (use (reg:SI 0))])
2644 (parallel
2645 [(set (match_operand:SI 0 "register_operand" "=d")
2646 (unspec:SI [(reg:CCU CC_REGNUM)] UNSPEC_STRCMPCC_TO_INT))
2647 (clobber (reg:CC CC_REGNUM))])]
2648 ""
2649 {
2650 /* As the result of CMPINT is inverted compared to what we need,
2651 we have to swap the operands. */
2652 rtx op1 = operands[2];
2653 rtx op2 = operands[1];
2654 rtx addr1 = gen_reg_rtx (Pmode);
2655 rtx addr2 = gen_reg_rtx (Pmode);
2656
2657 emit_move_insn (addr1, force_operand (XEXP (op1, 0), NULL_RTX));
2658 emit_move_insn (addr2, force_operand (XEXP (op2, 0), NULL_RTX));
2659 operands[1] = replace_equiv_address_nv (op1, addr1);
2660 operands[2] = replace_equiv_address_nv (op2, addr2);
2661 operands[3] = addr1;
2662 operands[4] = addr2;
2663 })
2664
2665 (define_insn "*cmpstr<mode>"
2666 [(clobber (match_operand:P 0 "register_operand" "=d"))
2667 (clobber (match_operand:P 1 "register_operand" "=d"))
2668 (set (reg:CCU CC_REGNUM)
2669 (compare:CCU (mem:BLK (match_operand:P 2 "register_operand" "0"))
2670 (mem:BLK (match_operand:P 3 "register_operand" "1"))))
2671 (use (reg:SI 0))]
2672 ""
2673 "clst\t%0,%1\;jo\t.-4"
2674 [(set_attr "length" "8")
2675 (set_attr "type" "vs")])
2676
2677 ;
2678 ; movstr instruction pattern.
2679 ;
2680
2681 (define_expand "movstr"
2682 [(set (reg:SI 0) (const_int 0))
2683 (parallel
2684 [(clobber (match_dup 3))
2685 (set (match_operand:BLK 1 "memory_operand" "")
2686 (match_operand:BLK 2 "memory_operand" ""))
2687 (set (match_operand 0 "register_operand" "")
2688 (unspec [(match_dup 1)
2689 (match_dup 2)
2690 (reg:SI 0)] UNSPEC_MVST))
2691 (clobber (reg:CC CC_REGNUM))])]
2692 ""
2693 {
2694 rtx addr1 = gen_reg_rtx (Pmode);
2695 rtx addr2 = gen_reg_rtx (Pmode);
2696
2697 emit_move_insn (addr1, force_operand (XEXP (operands[1], 0), NULL_RTX));
2698 emit_move_insn (addr2, force_operand (XEXP (operands[2], 0), NULL_RTX));
2699 operands[1] = replace_equiv_address_nv (operands[1], addr1);
2700 operands[2] = replace_equiv_address_nv (operands[2], addr2);
2701 operands[3] = addr2;
2702 })
2703
2704 (define_insn "*movstr"
2705 [(clobber (match_operand:P 2 "register_operand" "=d"))
2706 (set (mem:BLK (match_operand:P 1 "register_operand" "0"))
2707 (mem:BLK (match_operand:P 3 "register_operand" "2")))
2708 (set (match_operand:P 0 "register_operand" "=d")
2709 (unspec [(mem:BLK (match_dup 1))
2710 (mem:BLK (match_dup 3))
2711 (reg:SI 0)] UNSPEC_MVST))
2712 (clobber (reg:CC CC_REGNUM))]
2713 ""
2714 "mvst\t%1,%2\;jo\t.-4"
2715 [(set_attr "length" "8")
2716 (set_attr "type" "vs")])
2717
2718
2719 ;
2720 ; movmemM instruction pattern(s).
2721 ;
2722
2723 (define_expand "movmem<mode>"
2724 [(set (match_operand:BLK 0 "memory_operand" "") ; destination
2725 (match_operand:BLK 1 "memory_operand" "")) ; source
2726 (use (match_operand:GPR 2 "general_operand" "")) ; count
2727 (match_operand 3 "" "")]
2728 ""
2729 {
2730 if (s390_expand_movmem (operands[0], operands[1], operands[2]))
2731 DONE;
2732 else
2733 FAIL;
2734 })
2735
2736 ; Move a block that is up to 256 bytes in length.
2737 ; The block length is taken as (operands[2] % 256) + 1.
2738
2739 (define_expand "movmem_short"
2740 [(parallel
2741 [(set (match_operand:BLK 0 "memory_operand" "")
2742 (match_operand:BLK 1 "memory_operand" ""))
2743 (use (match_operand 2 "nonmemory_operand" ""))
2744 (use (const:BLK (unspec:BLK [(const_int 0)] UNSPEC_INSN)))
2745 (clobber (match_dup 3))])]
2746 ""
2747 "operands[3] = gen_rtx_SCRATCH (Pmode);")
2748
2749 (define_insn "*movmem_short"
2750 [(set (match_operand:BLK 0 "memory_operand" "=Q,Q,Q,Q")
2751 (match_operand:BLK 1 "memory_operand" "Q,Q,Q,Q"))
2752 (use (match_operand 2 "nonmemory_operand" "n,a,a,a"))
2753 (use (match_operand 3 "immediate_operand" "X,R,X,X"))
2754 (clobber (match_scratch:P 4 "=X,X,X,&a"))]
2755 "(GET_MODE (operands[2]) == Pmode || GET_MODE (operands[2]) == VOIDmode)"
2756 "#"
2757 [(set_attr "type" "cs")
2758 (set_attr "cpu_facility" "*,*,z10,cpu_zarch")])
2759
2760 (define_split
2761 [(set (match_operand:BLK 0 "memory_operand" "")
2762 (match_operand:BLK 1 "memory_operand" ""))
2763 (use (match_operand 2 "const_int_operand" ""))
2764 (use (match_operand 3 "immediate_operand" ""))
2765 (clobber (scratch))]
2766 "reload_completed"
2767 [(parallel
2768 [(set (match_dup 0) (match_dup 1))
2769 (use (match_dup 2))])]
2770 "operands[2] = GEN_INT ((INTVAL (operands[2]) & 0xff) + 1);")
2771
2772 (define_split
2773 [(set (match_operand:BLK 0 "memory_operand" "")
2774 (match_operand:BLK 1 "memory_operand" ""))
2775 (use (match_operand 2 "register_operand" ""))
2776 (use (match_operand 3 "memory_operand" ""))
2777 (clobber (scratch))]
2778 "reload_completed"
2779 [(parallel
2780 [(unspec [(match_dup 2) (match_dup 3)
2781 (const_int 0)] UNSPEC_EXECUTE)
2782 (set (match_dup 0) (match_dup 1))
2783 (use (const_int 1))])]
2784 "")
2785
2786 (define_split
2787 [(set (match_operand:BLK 0 "memory_operand" "")
2788 (match_operand:BLK 1 "memory_operand" ""))
2789 (use (match_operand 2 "register_operand" ""))
2790 (use (const:BLK (unspec:BLK [(const_int 0)] UNSPEC_INSN)))
2791 (clobber (scratch))]
2792 "TARGET_Z10 && reload_completed"
2793 [(parallel
2794 [(unspec [(match_dup 2) (const_int 0)
2795 (label_ref (match_dup 3))] UNSPEC_EXECUTE)
2796 (set (match_dup 0) (match_dup 1))
2797 (use (const_int 1))])]
2798 "operands[3] = gen_label_rtx ();")
2799
2800 (define_split
2801 [(set (match_operand:BLK 0 "memory_operand" "")
2802 (match_operand:BLK 1 "memory_operand" ""))
2803 (use (match_operand 2 "register_operand" ""))
2804 (use (const:BLK (unspec:BLK [(const_int 0)] UNSPEC_INSN)))
2805 (clobber (match_operand 3 "register_operand" ""))]
2806 "reload_completed && TARGET_CPU_ZARCH"
2807 [(set (match_dup 3) (label_ref (match_dup 4)))
2808 (parallel
2809 [(unspec [(match_dup 2) (mem:BLK (match_dup 3))
2810 (label_ref (match_dup 4))] UNSPEC_EXECUTE)
2811 (set (match_dup 0) (match_dup 1))
2812 (use (const_int 1))])]
2813 "operands[4] = gen_label_rtx ();")
2814
2815 ; Move a block of arbitrary length.
2816
2817 (define_expand "movmem_long"
2818 [(parallel
2819 [(clobber (match_dup 2))
2820 (clobber (match_dup 3))
2821 (set (match_operand:BLK 0 "memory_operand" "")
2822 (match_operand:BLK 1 "memory_operand" ""))
2823 (use (match_operand 2 "general_operand" ""))
2824 (use (match_dup 3))
2825 (clobber (reg:CC CC_REGNUM))])]
2826 ""
2827 {
2828 enum machine_mode sreg_mode = TARGET_ZARCH ? DImode : SImode;
2829 enum machine_mode dreg_mode = TARGET_ZARCH ? TImode : DImode;
2830 rtx reg0 = gen_reg_rtx (dreg_mode);
2831 rtx reg1 = gen_reg_rtx (dreg_mode);
2832 rtx addr0 = gen_lowpart (Pmode, gen_highpart (sreg_mode, reg0));
2833 rtx addr1 = gen_lowpart (Pmode, gen_highpart (sreg_mode, reg1));
2834 rtx len0 = gen_lowpart (Pmode, reg0);
2835 rtx len1 = gen_lowpart (Pmode, reg1);
2836
2837 emit_clobber (reg0);
2838 emit_move_insn (addr0, force_operand (XEXP (operands[0], 0), NULL_RTX));
2839 emit_move_insn (len0, operands[2]);
2840
2841 emit_clobber (reg1);
2842 emit_move_insn (addr1, force_operand (XEXP (operands[1], 0), NULL_RTX));
2843 emit_move_insn (len1, operands[2]);
2844
2845 operands[0] = replace_equiv_address_nv (operands[0], addr0);
2846 operands[1] = replace_equiv_address_nv (operands[1], addr1);
2847 operands[2] = reg0;
2848 operands[3] = reg1;
2849 })
2850
2851 (define_insn "*movmem_long"
2852 [(clobber (match_operand:<DBL> 0 "register_operand" "=d"))
2853 (clobber (match_operand:<DBL> 1 "register_operand" "=d"))
2854 (set (mem:BLK (subreg:P (match_operand:<DBL> 2 "register_operand" "0") 0))
2855 (mem:BLK (subreg:P (match_operand:<DBL> 3 "register_operand" "1") 0)))
2856 (use (match_dup 2))
2857 (use (match_dup 3))
2858 (clobber (reg:CC CC_REGNUM))]
2859 "TARGET_64BIT || !TARGET_ZARCH"
2860 "mvcle\t%0,%1,0\;jo\t.-4"
2861 [(set_attr "length" "8")
2862 (set_attr "type" "vs")])
2863
2864 (define_insn "*movmem_long_31z"
2865 [(clobber (match_operand:TI 0 "register_operand" "=d"))
2866 (clobber (match_operand:TI 1 "register_operand" "=d"))
2867 (set (mem:BLK (subreg:SI (match_operand:TI 2 "register_operand" "0") 4))
2868 (mem:BLK (subreg:SI (match_operand:TI 3 "register_operand" "1") 4)))
2869 (use (match_dup 2))
2870 (use (match_dup 3))
2871 (clobber (reg:CC CC_REGNUM))]
2872 "!TARGET_64BIT && TARGET_ZARCH"
2873 "mvcle\t%0,%1,0\;jo\t.-4"
2874 [(set_attr "length" "8")
2875 (set_attr "type" "vs")])
2876
2877
2878 ;
2879 ; Test data class.
2880 ;
2881
2882 (define_expand "signbit<mode>2"
2883 [(set (reg:CCZ CC_REGNUM)
2884 (unspec:CCZ [(match_operand:FP_ALL 1 "register_operand" "f")
2885 (match_dup 2)]
2886 UNSPEC_TDC_INSN))
2887 (set (match_operand:SI 0 "register_operand" "=d")
2888 (unspec:SI [(reg:CCZ CC_REGNUM)] UNSPEC_CC_TO_INT))]
2889 "TARGET_HARD_FLOAT"
2890 {
2891 operands[2] = GEN_INT (S390_TDC_SIGNBIT_SET);
2892 })
2893
2894 (define_expand "isinf<mode>2"
2895 [(set (reg:CCZ CC_REGNUM)
2896 (unspec:CCZ [(match_operand:FP_ALL 1 "register_operand" "f")
2897 (match_dup 2)]
2898 UNSPEC_TDC_INSN))
2899 (set (match_operand:SI 0 "register_operand" "=d")
2900 (unspec:SI [(reg:CCZ CC_REGNUM)] UNSPEC_CC_TO_INT))]
2901 "TARGET_HARD_FLOAT"
2902 {
2903 operands[2] = GEN_INT (S390_TDC_INFINITY);
2904 })
2905
2906 (define_insn_and_split "*cc_to_int"
2907 [(set (match_operand:SI 0 "register_operand" "=d")
2908 (unspec:SI [(match_operand 1 "register_operand" "0")]
2909 UNSPEC_CC_TO_INT))]
2910 "operands != NULL"
2911 "#"
2912 "reload_completed"
2913 [(set (match_dup 0) (lshiftrt:SI (match_dup 0) (const_int 28)))])
2914
2915 ; This insn is used to generate all variants of the Test Data Class
2916 ; instruction, namely tcxb, tcdb, and tceb. The insn's first operand
2917 ; is the register to be tested and the second one is the bit mask
2918 ; specifying the required test(s).
2919 ;
2920 ; tcxb, tcdb, tceb, tdcxt, tdcdt, tdcet
2921 (define_insn "*TDC_insn_<mode>"
2922 [(set (reg:CCZ CC_REGNUM)
2923 (unspec:CCZ [(match_operand:FP_ALL 0 "register_operand" "f")
2924 (match_operand:SI 1 "const_int_operand")] UNSPEC_TDC_INSN))]
2925 "TARGET_HARD_FLOAT"
2926 "t<_d>c<xde><bt>\t%0,%1"
2927 [(set_attr "op_type" "RXE")
2928 (set_attr "type" "fsimp<mode>")])
2929
2930
2931
2932 ;
2933 ; setmemM instruction pattern(s).
2934 ;
2935
2936 (define_expand "setmem<mode>"
2937 [(set (match_operand:BLK 0 "memory_operand" "")
2938 (match_operand:QI 2 "general_operand" ""))
2939 (use (match_operand:GPR 1 "general_operand" ""))
2940 (match_operand 3 "" "")]
2941 ""
2942 "s390_expand_setmem (operands[0], operands[1], operands[2]); DONE;")
2943
2944 ; Clear a block that is up to 256 bytes in length.
2945 ; The block length is taken as (operands[1] % 256) + 1.
2946
2947 (define_expand "clrmem_short"
2948 [(parallel
2949 [(set (match_operand:BLK 0 "memory_operand" "")
2950 (const_int 0))
2951 (use (match_operand 1 "nonmemory_operand" ""))
2952 (use (const:BLK (unspec:BLK [(const_int 0)] UNSPEC_INSN)))
2953 (clobber (match_dup 2))
2954 (clobber (reg:CC CC_REGNUM))])]
2955 ""
2956 "operands[2] = gen_rtx_SCRATCH (Pmode);")
2957
2958 (define_insn "*clrmem_short"
2959 [(set (match_operand:BLK 0 "memory_operand" "=Q,Q,Q,Q")
2960 (const_int 0))
2961 (use (match_operand 1 "nonmemory_operand" "n,a,a,a"))
2962 (use (match_operand 2 "immediate_operand" "X,R,X,X"))
2963 (clobber (match_scratch:P 3 "=X,X,X,&a"))
2964 (clobber (reg:CC CC_REGNUM))]
2965 "(GET_MODE (operands[1]) == Pmode || GET_MODE (operands[1]) == VOIDmode)"
2966 "#"
2967 [(set_attr "type" "cs")
2968 (set_attr "cpu_facility" "*,*,z10,cpu_zarch")])
2969
2970 (define_split
2971 [(set (match_operand:BLK 0 "memory_operand" "")
2972 (const_int 0))
2973 (use (match_operand 1 "const_int_operand" ""))
2974 (use (match_operand 2 "immediate_operand" ""))
2975 (clobber (scratch))
2976 (clobber (reg:CC CC_REGNUM))]
2977 "reload_completed"
2978 [(parallel
2979 [(set (match_dup 0) (const_int 0))
2980 (use (match_dup 1))
2981 (clobber (reg:CC CC_REGNUM))])]
2982 "operands[1] = GEN_INT ((INTVAL (operands[1]) & 0xff) + 1);")
2983
2984 (define_split
2985 [(set (match_operand:BLK 0 "memory_operand" "")
2986 (const_int 0))
2987 (use (match_operand 1 "register_operand" ""))
2988 (use (match_operand 2 "memory_operand" ""))
2989 (clobber (scratch))
2990 (clobber (reg:CC CC_REGNUM))]
2991 "reload_completed"
2992 [(parallel
2993 [(unspec [(match_dup 1) (match_dup 2)
2994 (const_int 0)] UNSPEC_EXECUTE)
2995 (set (match_dup 0) (const_int 0))
2996 (use (const_int 1))
2997 (clobber (reg:CC CC_REGNUM))])]
2998 "")
2999
3000 (define_split
3001 [(set (match_operand:BLK 0 "memory_operand" "")
3002 (const_int 0))
3003 (use (match_operand 1 "register_operand" ""))
3004 (use (const:BLK (unspec:BLK [(const_int 0)] UNSPEC_INSN)))
3005 (clobber (scratch))
3006 (clobber (reg:CC CC_REGNUM))]
3007 "TARGET_Z10 && reload_completed"
3008 [(parallel
3009 [(unspec [(match_dup 1) (const_int 0)
3010 (label_ref (match_dup 3))] UNSPEC_EXECUTE)
3011 (set (match_dup 0) (const_int 0))
3012 (use (const_int 1))
3013 (clobber (reg:CC CC_REGNUM))])]
3014 "operands[3] = gen_label_rtx ();")
3015
3016 (define_split
3017 [(set (match_operand:BLK 0 "memory_operand" "")
3018 (const_int 0))
3019 (use (match_operand 1 "register_operand" ""))
3020 (use (const:BLK (unspec:BLK [(const_int 0)] UNSPEC_INSN)))
3021 (clobber (match_operand 2 "register_operand" ""))
3022 (clobber (reg:CC CC_REGNUM))]
3023 "reload_completed && TARGET_CPU_ZARCH"
3024 [(set (match_dup 2) (label_ref (match_dup 3)))
3025 (parallel
3026 [(unspec [(match_dup 1) (mem:BLK (match_dup 2))
3027 (label_ref (match_dup 3))] UNSPEC_EXECUTE)
3028 (set (match_dup 0) (const_int 0))
3029 (use (const_int 1))
3030 (clobber (reg:CC CC_REGNUM))])]
3031 "operands[3] = gen_label_rtx ();")
3032
3033 ; Initialize a block of arbitrary length with (operands[2] % 256).
3034
3035 (define_expand "setmem_long"
3036 [(parallel
3037 [(clobber (match_dup 1))
3038 (set (match_operand:BLK 0 "memory_operand" "")
3039 (match_operand 2 "shift_count_or_setmem_operand" ""))
3040 (use (match_operand 1 "general_operand" ""))
3041 (use (match_dup 3))
3042 (clobber (reg:CC CC_REGNUM))])]
3043 ""
3044 {
3045 enum machine_mode sreg_mode = TARGET_ZARCH ? DImode : SImode;
3046 enum machine_mode dreg_mode = TARGET_ZARCH ? TImode : DImode;
3047 rtx reg0 = gen_reg_rtx (dreg_mode);
3048 rtx reg1 = gen_reg_rtx (dreg_mode);
3049 rtx addr0 = gen_lowpart (Pmode, gen_highpart (sreg_mode, reg0));
3050 rtx len0 = gen_lowpart (Pmode, reg0);
3051
3052 emit_clobber (reg0);
3053 emit_move_insn (addr0, force_operand (XEXP (operands[0], 0), NULL_RTX));
3054 emit_move_insn (len0, operands[1]);
3055
3056 emit_move_insn (reg1, const0_rtx);
3057
3058 operands[0] = replace_equiv_address_nv (operands[0], addr0);
3059 operands[1] = reg0;
3060 operands[3] = reg1;
3061 })
3062
3063 (define_insn "*setmem_long"
3064 [(clobber (match_operand:<DBL> 0 "register_operand" "=d"))
3065 (set (mem:BLK (subreg:P (match_operand:<DBL> 3 "register_operand" "0") 0))
3066 (match_operand 2 "shift_count_or_setmem_operand" "Y"))
3067 (use (match_dup 3))
3068 (use (match_operand:<DBL> 1 "register_operand" "d"))
3069 (clobber (reg:CC CC_REGNUM))]
3070 "TARGET_64BIT || !TARGET_ZARCH"
3071 "mvcle\t%0,%1,%Y2\;jo\t.-4"
3072 [(set_attr "length" "8")
3073 (set_attr "type" "vs")])
3074
3075 (define_insn "*setmem_long_and"
3076 [(clobber (match_operand:<DBL> 0 "register_operand" "=d"))
3077 (set (mem:BLK (subreg:P (match_operand:<DBL> 3 "register_operand" "0") 0))
3078 (and (match_operand 2 "shift_count_or_setmem_operand" "Y")
3079 (match_operand 4 "const_int_operand" "n")))
3080 (use (match_dup 3))
3081 (use (match_operand:<DBL> 1 "register_operand" "d"))
3082 (clobber (reg:CC CC_REGNUM))]
3083 "(TARGET_64BIT || !TARGET_ZARCH) &&
3084 (INTVAL (operands[4]) & 255) == 255"
3085 "mvcle\t%0,%1,%Y2\;jo\t.-4"
3086 [(set_attr "length" "8")
3087 (set_attr "type" "vs")])
3088
3089 (define_insn "*setmem_long_31z"
3090 [(clobber (match_operand:TI 0 "register_operand" "=d"))
3091 (set (mem:BLK (subreg:SI (match_operand:TI 3 "register_operand" "0") 4))
3092 (match_operand 2 "shift_count_or_setmem_operand" "Y"))
3093 (use (match_dup 3))
3094 (use (match_operand:TI 1 "register_operand" "d"))
3095 (clobber (reg:CC CC_REGNUM))]
3096 "!TARGET_64BIT && TARGET_ZARCH"
3097 "mvcle\t%0,%1,%Y2\;jo\t.-4"
3098 [(set_attr "length" "8")
3099 (set_attr "type" "vs")])
3100
3101 ;
3102 ; cmpmemM instruction pattern(s).
3103 ;
3104
3105 (define_expand "cmpmemsi"
3106 [(set (match_operand:SI 0 "register_operand" "")
3107 (compare:SI (match_operand:BLK 1 "memory_operand" "")
3108 (match_operand:BLK 2 "memory_operand" "") ) )
3109 (use (match_operand:SI 3 "general_operand" ""))
3110 (use (match_operand:SI 4 "" ""))]
3111 ""
3112 {
3113 if (s390_expand_cmpmem (operands[0], operands[1],
3114 operands[2], operands[3]))
3115 DONE;
3116 else
3117 FAIL;
3118 })
3119
3120 ; Compare a block that is up to 256 bytes in length.
3121 ; The block length is taken as (operands[2] % 256) + 1.
3122
3123 (define_expand "cmpmem_short"
3124 [(parallel
3125 [(set (reg:CCU CC_REGNUM)
3126 (compare:CCU (match_operand:BLK 0 "memory_operand" "")
3127 (match_operand:BLK 1 "memory_operand" "")))
3128 (use (match_operand 2 "nonmemory_operand" ""))
3129 (use (const:BLK (unspec:BLK [(const_int 0)] UNSPEC_INSN)))
3130 (clobber (match_dup 3))])]
3131 ""
3132 "operands[3] = gen_rtx_SCRATCH (Pmode);")
3133
3134 (define_insn "*cmpmem_short"
3135 [(set (reg:CCU CC_REGNUM)
3136 (compare:CCU (match_operand:BLK 0 "memory_operand" "Q,Q,Q,Q")
3137 (match_operand:BLK 1 "memory_operand" "Q,Q,Q,Q")))
3138 (use (match_operand 2 "nonmemory_operand" "n,a,a,a"))
3139 (use (match_operand 3 "immediate_operand" "X,R,X,X"))
3140 (clobber (match_scratch:P 4 "=X,X,X,&a"))]
3141 "(GET_MODE (operands[2]) == Pmode || GET_MODE (operands[2]) == VOIDmode)"
3142 "#"
3143 [(set_attr "type" "cs")
3144 (set_attr "cpu_facility" "*,*,z10,cpu_zarch")])
3145
3146 (define_split
3147 [(set (reg:CCU CC_REGNUM)
3148 (compare:CCU (match_operand:BLK 0 "memory_operand" "")
3149 (match_operand:BLK 1 "memory_operand" "")))
3150 (use (match_operand 2 "const_int_operand" ""))
3151 (use (match_operand 3 "immediate_operand" ""))
3152 (clobber (scratch))]
3153 "reload_completed"
3154 [(parallel
3155 [(set (reg:CCU CC_REGNUM) (compare:CCU (match_dup 0) (match_dup 1)))
3156 (use (match_dup 2))])]
3157 "operands[2] = GEN_INT ((INTVAL (operands[2]) & 0xff) + 1);")
3158
3159 (define_split
3160 [(set (reg:CCU CC_REGNUM)
3161 (compare:CCU (match_operand:BLK 0 "memory_operand" "")
3162 (match_operand:BLK 1 "memory_operand" "")))
3163 (use (match_operand 2 "register_operand" ""))
3164 (use (match_operand 3 "memory_operand" ""))
3165 (clobber (scratch))]
3166 "reload_completed"
3167 [(parallel
3168 [(unspec [(match_dup 2) (match_dup 3)
3169 (const_int 0)] UNSPEC_EXECUTE)
3170 (set (reg:CCU CC_REGNUM) (compare:CCU (match_dup 0) (match_dup 1)))
3171 (use (const_int 1))])]
3172 "")
3173
3174 (define_split
3175 [(set (reg:CCU CC_REGNUM)
3176 (compare:CCU (match_operand:BLK 0 "memory_operand" "")
3177 (match_operand:BLK 1 "memory_operand" "")))
3178 (use (match_operand 2 "register_operand" ""))
3179 (use (const:BLK (unspec:BLK [(const_int 0)] UNSPEC_INSN)))
3180 (clobber (scratch))]
3181 "TARGET_Z10 && reload_completed"
3182 [(parallel
3183 [(unspec [(match_dup 2) (const_int 0)
3184 (label_ref (match_dup 4))] UNSPEC_EXECUTE)
3185 (set (reg:CCU CC_REGNUM) (compare:CCU (match_dup 0) (match_dup 1)))
3186 (use (const_int 1))])]
3187 "operands[4] = gen_label_rtx ();")
3188
3189 (define_split
3190 [(set (reg:CCU CC_REGNUM)
3191 (compare:CCU (match_operand:BLK 0 "memory_operand" "")
3192 (match_operand:BLK 1 "memory_operand" "")))
3193 (use (match_operand 2 "register_operand" ""))
3194 (use (const:BLK (unspec:BLK [(const_int 0)] UNSPEC_INSN)))
3195 (clobber (match_operand 3 "register_operand" ""))]
3196 "reload_completed && TARGET_CPU_ZARCH"
3197 [(set (match_dup 3) (label_ref (match_dup 4)))
3198 (parallel
3199 [(unspec [(match_dup 2) (mem:BLK (match_dup 3))
3200 (label_ref (match_dup 4))] UNSPEC_EXECUTE)
3201 (set (reg:CCU CC_REGNUM) (compare:CCU (match_dup 0) (match_dup 1)))
3202 (use (const_int 1))])]
3203 "operands[4] = gen_label_rtx ();")
3204
3205 ; Compare a block of arbitrary length.
3206
3207 (define_expand "cmpmem_long"
3208 [(parallel
3209 [(clobber (match_dup 2))
3210 (clobber (match_dup 3))
3211 (set (reg:CCU CC_REGNUM)
3212 (compare:CCU (match_operand:BLK 0 "memory_operand" "")
3213 (match_operand:BLK 1 "memory_operand" "")))
3214 (use (match_operand 2 "general_operand" ""))
3215 (use (match_dup 3))])]
3216 ""
3217 {
3218 enum machine_mode sreg_mode = TARGET_ZARCH ? DImode : SImode;
3219 enum machine_mode dreg_mode = TARGET_ZARCH ? TImode : DImode;
3220 rtx reg0 = gen_reg_rtx (dreg_mode);
3221 rtx reg1 = gen_reg_rtx (dreg_mode);
3222 rtx addr0 = gen_lowpart (Pmode, gen_highpart (sreg_mode, reg0));
3223 rtx addr1 = gen_lowpart (Pmode, gen_highpart (sreg_mode, reg1));
3224 rtx len0 = gen_lowpart (Pmode, reg0);
3225 rtx len1 = gen_lowpart (Pmode, reg1);
3226
3227 emit_clobber (reg0);
3228 emit_move_insn (addr0, force_operand (XEXP (operands[0], 0), NULL_RTX));
3229 emit_move_insn (len0, operands[2]);
3230
3231 emit_clobber (reg1);
3232 emit_move_insn (addr1, force_operand (XEXP (operands[1], 0), NULL_RTX));
3233 emit_move_insn (len1, operands[2]);
3234
3235 operands[0] = replace_equiv_address_nv (operands[0], addr0);
3236 operands[1] = replace_equiv_address_nv (operands[1], addr1);
3237 operands[2] = reg0;
3238 operands[3] = reg1;
3239 })
3240
3241 (define_insn "*cmpmem_long"
3242 [(clobber (match_operand:<DBL> 0 "register_operand" "=d"))
3243 (clobber (match_operand:<DBL> 1 "register_operand" "=d"))
3244 (set (reg:CCU CC_REGNUM)
3245 (compare:CCU (mem:BLK (subreg:P (match_operand:<DBL> 2 "register_operand" "0") 0))
3246 (mem:BLK (subreg:P (match_operand:<DBL> 3 "register_operand" "1") 0))))
3247 (use (match_dup 2))
3248 (use (match_dup 3))]
3249 "TARGET_64BIT || !TARGET_ZARCH"
3250 "clcle\t%0,%1,0\;jo\t.-4"
3251 [(set_attr "length" "8")
3252 (set_attr "type" "vs")])
3253
3254 (define_insn "*cmpmem_long_31z"
3255 [(clobber (match_operand:TI 0 "register_operand" "=d"))
3256 (clobber (match_operand:TI 1 "register_operand" "=d"))
3257 (set (reg:CCU CC_REGNUM)
3258 (compare:CCU (mem:BLK (subreg:SI (match_operand:TI 2 "register_operand" "0") 4))
3259 (mem:BLK (subreg:SI (match_operand:TI 3 "register_operand" "1") 4))))
3260 (use (match_dup 2))
3261 (use (match_dup 3))]
3262 "!TARGET_64BIT && TARGET_ZARCH"
3263 "clcle\t%0,%1,0\;jo\t.-4"
3264 [(set_attr "op_type" "NN")
3265 (set_attr "type" "vs")
3266 (set_attr "length" "8")])
3267
3268 ; Convert CCUmode condition code to integer.
3269 ; Result is zero if EQ, positive if LTU, negative if GTU.
3270
3271 (define_insn_and_split "cmpint"
3272 [(set (match_operand:SI 0 "register_operand" "=d")
3273 (unspec:SI [(match_operand:CCU 1 "register_operand" "0")]
3274 UNSPEC_STRCMPCC_TO_INT))
3275 (clobber (reg:CC CC_REGNUM))]
3276 ""
3277 "#"
3278 "reload_completed"
3279 [(set (match_dup 0) (ashift:SI (match_dup 0) (const_int 2)))
3280 (parallel
3281 [(set (match_dup 0) (ashiftrt:SI (match_dup 0) (const_int 30)))
3282 (clobber (reg:CC CC_REGNUM))])])
3283
3284 (define_insn_and_split "*cmpint_cc"
3285 [(set (reg CC_REGNUM)
3286 (compare (unspec:SI [(match_operand:CCU 1 "register_operand" "0")]
3287 UNSPEC_STRCMPCC_TO_INT)
3288 (const_int 0)))
3289 (set (match_operand:SI 0 "register_operand" "=d")
3290 (unspec:SI [(match_dup 1)] UNSPEC_STRCMPCC_TO_INT))]
3291 "s390_match_ccmode (insn, CCSmode)"
3292 "#"
3293 "&& reload_completed"
3294 [(set (match_dup 0) (ashift:SI (match_dup 0) (const_int 2)))
3295 (parallel
3296 [(set (match_dup 2) (match_dup 3))
3297 (set (match_dup 0) (ashiftrt:SI (match_dup 0) (const_int 30)))])]
3298 {
3299 rtx result = gen_rtx_ASHIFTRT (SImode, operands[0], GEN_INT (30));
3300 operands[2] = SET_DEST (XVECEXP (PATTERN (curr_insn), 0, 0));
3301 operands[3] = gen_rtx_COMPARE (GET_MODE (operands[2]), result, const0_rtx);
3302 })
3303
3304 (define_insn_and_split "*cmpint_sign"
3305 [(set (match_operand:DI 0 "register_operand" "=d")
3306 (sign_extend:DI (unspec:SI [(match_operand:CCU 1 "register_operand" "0")]
3307 UNSPEC_STRCMPCC_TO_INT)))
3308 (clobber (reg:CC CC_REGNUM))]
3309 "TARGET_ZARCH"
3310 "#"
3311 "&& reload_completed"
3312 [(set (match_dup 0) (ashift:DI (match_dup 0) (const_int 34)))
3313 (parallel
3314 [(set (match_dup 0) (ashiftrt:DI (match_dup 0) (const_int 62)))
3315 (clobber (reg:CC CC_REGNUM))])])
3316
3317 (define_insn_and_split "*cmpint_sign_cc"
3318 [(set (reg CC_REGNUM)
3319 (compare (ashiftrt:DI (ashift:DI (subreg:DI
3320 (unspec:SI [(match_operand:CCU 1 "register_operand" "0")]
3321 UNSPEC_STRCMPCC_TO_INT) 0)
3322 (const_int 32)) (const_int 32))
3323 (const_int 0)))
3324 (set (match_operand:DI 0 "register_operand" "=d")
3325 (sign_extend:DI (unspec:SI [(match_dup 1)] UNSPEC_STRCMPCC_TO_INT)))]
3326 "s390_match_ccmode (insn, CCSmode) && TARGET_ZARCH"
3327 "#"
3328 "&& reload_completed"
3329 [(set (match_dup 0) (ashift:DI (match_dup 0) (const_int 34)))
3330 (parallel
3331 [(set (match_dup 2) (match_dup 3))
3332 (set (match_dup 0) (ashiftrt:DI (match_dup 0) (const_int 62)))])]
3333 {
3334 rtx result = gen_rtx_ASHIFTRT (DImode, operands[0], GEN_INT (62));
3335 operands[2] = SET_DEST (XVECEXP (PATTERN (curr_insn), 0, 0));
3336 operands[3] = gen_rtx_COMPARE (GET_MODE (operands[2]), result, const0_rtx);
3337 })
3338
3339
3340 ;;
3341 ;;- Conversion instructions.
3342 ;;
3343
3344 (define_insn "*sethighpartsi"
3345 [(set (match_operand:SI 0 "register_operand" "=d,d")
3346 (unspec:SI [(match_operand:BLK 1 "s_operand" "Q,S")
3347 (match_operand 2 "const_int_operand" "n,n")] UNSPEC_ICM))
3348 (clobber (reg:CC CC_REGNUM))]
3349 ""
3350 "@
3351 icm\t%0,%2,%S1
3352 icmy\t%0,%2,%S1"
3353 [(set_attr "op_type" "RS,RSY")
3354 (set_attr "z10prop" "z10_super_E1,z10_super_E1")])
3355
3356 (define_insn "*sethighpartdi_64"
3357 [(set (match_operand:DI 0 "register_operand" "=d")
3358 (unspec:DI [(match_operand:BLK 1 "s_operand" "QS")
3359 (match_operand 2 "const_int_operand" "n")] UNSPEC_ICM))
3360 (clobber (reg:CC CC_REGNUM))]
3361 "TARGET_ZARCH"
3362 "icmh\t%0,%2,%S1"
3363 [(set_attr "op_type" "RSY")
3364 (set_attr "z10prop" "z10_super")])
3365
3366 (define_insn "*sethighpartdi_31"
3367 [(set (match_operand:DI 0 "register_operand" "=d,d")
3368 (unspec:DI [(match_operand:BLK 1 "s_operand" "Q,S")
3369 (match_operand 2 "const_int_operand" "n,n")] UNSPEC_ICM))
3370 (clobber (reg:CC CC_REGNUM))]
3371 "!TARGET_ZARCH"
3372 "@
3373 icm\t%0,%2,%S1
3374 icmy\t%0,%2,%S1"
3375 [(set_attr "op_type" "RS,RSY")
3376 (set_attr "z10prop" "z10_super_E1,z10_super_E1")])
3377
3378 ;
3379 ; extv instruction patterns
3380 ;
3381
3382 ; FIXME: This expander needs to be converted from DI to GPR as well
3383 ; after resolving some issues with it.
3384
3385 (define_expand "extzv"
3386 [(parallel
3387 [(set (match_operand:DI 0 "register_operand" "=d")
3388 (zero_extract:DI
3389 (match_operand:DI 1 "register_operand" "d")
3390 (match_operand 2 "const_int_operand" "") ; size
3391 (match_operand 3 "const_int_operand" ""))) ; start
3392 (clobber (reg:CC CC_REGNUM))])]
3393 "TARGET_Z10"
3394 {
3395 /* Starting with zEC12 there is risbgn not clobbering CC. */
3396 if (TARGET_ZEC12)
3397 {
3398 emit_move_insn (operands[0],
3399 gen_rtx_ZERO_EXTRACT (DImode,
3400 operands[1],
3401 operands[2],
3402 operands[3]));
3403 DONE;
3404 }
3405 })
3406
3407 (define_insn "*extzv<mode>_zEC12"
3408 [(set (match_operand:GPR 0 "register_operand" "=d")
3409 (zero_extract:GPR
3410 (match_operand:GPR 1 "register_operand" "d")
3411 (match_operand 2 "const_int_operand" "") ; size
3412 (match_operand 3 "const_int_operand" "")))] ; start]
3413 "TARGET_ZEC12"
3414 "risbgn\t%0,%1,64-%2,128+63,<bitsize>+%3+%2" ; dst, src, start, end, shift
3415 [(set_attr "op_type" "RIE")])
3416
3417 (define_insn "*extzv<mode>_z10"
3418 [(set (match_operand:GPR 0 "register_operand" "=d")
3419 (zero_extract:GPR
3420 (match_operand:GPR 1 "register_operand" "d")
3421 (match_operand 2 "const_int_operand" "") ; size
3422 (match_operand 3 "const_int_operand" ""))) ; start
3423 (clobber (reg:CC CC_REGNUM))]
3424 "TARGET_Z10"
3425 "risbg\t%0,%1,64-%2,128+63,<bitsize>+%3+%2" ; dst, src, start, end, shift
3426 [(set_attr "op_type" "RIE")
3427 (set_attr "z10prop" "z10_super_E1")])
3428
3429 (define_insn_and_split "*pre_z10_extzv<mode>"
3430 [(set (match_operand:GPR 0 "register_operand" "=d")
3431 (zero_extract:GPR (match_operand:QI 1 "s_operand" "QS")
3432 (match_operand 2 "nonzero_shift_count_operand" "")
3433 (const_int 0)))
3434 (clobber (reg:CC CC_REGNUM))]
3435 "!TARGET_Z10"
3436 "#"
3437 "&& reload_completed"
3438 [(parallel
3439 [(set (match_dup 0) (unspec:GPR [(match_dup 1) (match_dup 3)] UNSPEC_ICM))
3440 (clobber (reg:CC CC_REGNUM))])
3441 (set (match_dup 0) (lshiftrt:GPR (match_dup 0) (match_dup 2)))]
3442 {
3443 int bitsize = INTVAL (operands[2]);
3444 int size = (bitsize - 1) / BITS_PER_UNIT + 1; /* round up */
3445 int mask = ((1ul << size) - 1) << (GET_MODE_SIZE (SImode) - size);
3446
3447 operands[1] = adjust_address (operands[1], BLKmode, 0);
3448 set_mem_size (operands[1], size);
3449 operands[2] = GEN_INT (<GPR:bitsize> - bitsize);
3450 operands[3] = GEN_INT (mask);
3451 })
3452
3453 (define_insn_and_split "*pre_z10_extv<mode>"
3454 [(set (match_operand:GPR 0 "register_operand" "=d")
3455 (sign_extract:GPR (match_operand:QI 1 "s_operand" "QS")
3456 (match_operand 2 "nonzero_shift_count_operand" "")
3457 (const_int 0)))
3458 (clobber (reg:CC CC_REGNUM))]
3459 ""
3460 "#"
3461 "&& reload_completed"
3462 [(parallel
3463 [(set (match_dup 0) (unspec:GPR [(match_dup 1) (match_dup 3)] UNSPEC_ICM))
3464 (clobber (reg:CC CC_REGNUM))])
3465 (parallel
3466 [(set (match_dup 0) (ashiftrt:GPR (match_dup 0) (match_dup 2)))
3467 (clobber (reg:CC CC_REGNUM))])]
3468 {
3469 int bitsize = INTVAL (operands[2]);
3470 int size = (bitsize - 1) / BITS_PER_UNIT + 1; /* round up */
3471 int mask = ((1ul << size) - 1) << (GET_MODE_SIZE (SImode) - size);
3472
3473 operands[1] = adjust_address (operands[1], BLKmode, 0);
3474 set_mem_size (operands[1], size);
3475 operands[2] = GEN_INT (<GPR:bitsize> - bitsize);
3476 operands[3] = GEN_INT (mask);
3477 })
3478
3479 ;
3480 ; insv instruction patterns
3481 ;
3482
3483 (define_expand "insv"
3484 [(set (zero_extract (match_operand 0 "nonimmediate_operand" "")
3485 (match_operand 1 "const_int_operand" "")
3486 (match_operand 2 "const_int_operand" ""))
3487 (match_operand 3 "general_operand" ""))]
3488 ""
3489 {
3490 if (s390_expand_insv (operands[0], operands[1], operands[2], operands[3]))
3491 DONE;
3492 FAIL;
3493 })
3494
3495
3496 ; The normal RTL expansion will never generate a zero_extract where
3497 ; the location operand isn't word mode. However, we do this in the
3498 ; back-end when generating atomic operations. See s390_two_part_insv.
3499 (define_insn "*insv<mode>_zEC12"
3500 [(set (zero_extract:GPR (match_operand:GPR 0 "nonimmediate_operand" "+d")
3501 (match_operand 1 "const_int_operand" "I") ; size
3502 (match_operand 2 "const_int_operand" "I")) ; pos
3503 (match_operand:GPR 3 "nonimmediate_operand" "d"))]
3504 "TARGET_ZEC12
3505 && (INTVAL (operands[1]) + INTVAL (operands[2])) <= <bitsize>"
3506 "risbgn\t%0,%3,64-<bitsize>+%2,64-<bitsize>+%2+%1-1,<bitsize>-%2-%1"
3507 [(set_attr "op_type" "RIE")])
3508
3509 (define_insn "*insv<mode>_z10"
3510 [(set (zero_extract:GPR (match_operand:GPR 0 "nonimmediate_operand" "+d")
3511 (match_operand 1 "const_int_operand" "I") ; size
3512 (match_operand 2 "const_int_operand" "I")) ; pos
3513 (match_operand:GPR 3 "nonimmediate_operand" "d"))
3514 (clobber (reg:CC CC_REGNUM))]
3515 "TARGET_Z10
3516 && (INTVAL (operands[1]) + INTVAL (operands[2])) <= <bitsize>"
3517 "risbg\t%0,%3,64-<bitsize>+%2,64-<bitsize>+%2+%1-1,<bitsize>-%2-%1"
3518 [(set_attr "op_type" "RIE")
3519 (set_attr "z10prop" "z10_super_E1")])
3520
3521 ; and op1 with a mask being 1 for the selected bits and 0 for the rest
3522 ; and op3=op0 with a mask being 0 for the selected bits and 1 for the rest
3523 (define_insn "*insv<mode>_zEC12_noshift"
3524 [(set (match_operand:GPR 0 "nonimmediate_operand" "=d")
3525 (ior:GPR (and:GPR (match_operand:GPR 1 "nonimmediate_operand" "d")
3526 (match_operand:GPR 2 "contiguous_bitmask_operand" ""))
3527 (and:GPR (match_operand:GPR 3 "nonimmediate_operand" "0")
3528 (match_operand:GPR 4 "const_int_operand" ""))))]
3529 "TARGET_ZEC12 && INTVAL (operands[2]) == ~INTVAL (operands[4])"
3530 "risbgn\t%0,%1,%<bfstart>2,%<bfend>2,0"
3531 [(set_attr "op_type" "RIE")])
3532
3533 (define_insn "*insv<mode>_z10_noshift"
3534 [(set (match_operand:GPR 0 "nonimmediate_operand" "=d")
3535 (ior:GPR (and:GPR (match_operand:GPR 1 "nonimmediate_operand" "d")
3536 (match_operand:GPR 2 "contiguous_bitmask_operand" ""))
3537 (and:GPR (match_operand:GPR 3 "nonimmediate_operand" "0")
3538 (match_operand:GPR 4 "const_int_operand" ""))))
3539 (clobber (reg:CC CC_REGNUM))]
3540 "TARGET_Z10 && INTVAL (operands[2]) == ~INTVAL (operands[4])"
3541 "risbg\t%0,%1,%<bfstart>2,%<bfend>2,0"
3542 [(set_attr "op_type" "RIE")
3543 (set_attr "z10prop" "z10_super_E1")])
3544
3545 (define_insn "*r<noxa>sbg_<mode>_noshift"
3546 [(set (match_operand:GPR 0 "nonimmediate_operand" "=d")
3547 (IXOR:GPR
3548 (and:GPR (match_operand:GPR 1 "nonimmediate_operand" "d")
3549 (match_operand:GPR 2 "contiguous_bitmask_operand" ""))
3550 (match_operand:GPR 3 "nonimmediate_operand" "0")))
3551 (clobber (reg:CC CC_REGNUM))]
3552 "TARGET_Z10"
3553 "r<noxa>sbg\t%0,%1,%<bfstart>2,%<bfend>2,0"
3554 [(set_attr "op_type" "RIE")])
3555
3556 (define_insn "*r<noxa>sbg_di_rotl"
3557 [(set (match_operand:DI 0 "nonimmediate_operand" "=d")
3558 (IXOR:DI
3559 (and:DI
3560 (rotate:DI
3561 (match_operand:DI 1 "nonimmediate_operand" "d")
3562 (match_operand:DI 3 "const_int_operand" ""))
3563 (match_operand:DI 2 "contiguous_bitmask_operand" ""))
3564 (match_operand:DI 4 "nonimmediate_operand" "0")))
3565 (clobber (reg:CC CC_REGNUM))]
3566 "TARGET_Z10"
3567 "r<noxa>sbg\t%0,%1,%<bfstart>2,%<bfend>2,%b3"
3568 [(set_attr "op_type" "RIE")])
3569
3570 (define_insn "*r<noxa>sbg_<mode>_srl"
3571 [(set (match_operand:GPR 0 "nonimmediate_operand" "=d")
3572 (IXOR:GPR
3573 (and:GPR
3574 (lshiftrt:GPR
3575 (match_operand:GPR 1 "nonimmediate_operand" "d")
3576 (match_operand:GPR 3 "nonzero_shift_count_operand" ""))
3577 (match_operand:GPR 2 "contiguous_bitmask_operand" ""))
3578 (match_operand:GPR 4 "nonimmediate_operand" "0")))
3579 (clobber (reg:CC CC_REGNUM))]
3580 "TARGET_Z10
3581 && s390_extzv_shift_ok (<bitsize>, 64 - INTVAL (operands[3]),
3582 INTVAL (operands[2]))"
3583 "r<noxa>sbg\t%0,%1,%<bfstart>2,%<bfend>2,64-%3"
3584 [(set_attr "op_type" "RIE")])
3585
3586 (define_insn "*r<noxa>sbg_<mode>_sll"
3587 [(set (match_operand:GPR 0 "nonimmediate_operand" "=d")
3588 (IXOR:GPR
3589 (and:GPR
3590 (ashift:GPR
3591 (match_operand:GPR 1 "nonimmediate_operand" "d")
3592 (match_operand:GPR 3 "nonzero_shift_count_operand" ""))
3593 (match_operand:GPR 2 "contiguous_bitmask_operand" ""))
3594 (match_operand:GPR 4 "nonimmediate_operand" "0")))
3595 (clobber (reg:CC CC_REGNUM))]
3596 "TARGET_Z10
3597 && s390_extzv_shift_ok (<bitsize>, INTVAL (operands[3]),
3598 INTVAL (operands[2]))"
3599 "r<noxa>sbg\t%0,%1,%<bfstart>2,%<bfend>2,%3"
3600 [(set_attr "op_type" "RIE")])
3601
3602 ;; These two are generated by combine for s.bf &= val.
3603 ;; ??? For bitfields smaller than 32-bits, we wind up with SImode
3604 ;; shifts and ands, which results in some truly awful patterns
3605 ;; including subregs of operations. Rather unnecessisarily, IMO.
3606 ;; Instead of
3607 ;;
3608 ;; (set (zero_extract:DI (reg/v:DI 50 [ s ])
3609 ;; (const_int 24 [0x18])
3610 ;; (const_int 0 [0]))
3611 ;; (subreg:DI (and:SI (subreg:SI (lshiftrt:DI (reg/v:DI 50 [ s ])
3612 ;; (const_int 40 [0x28])) 4)
3613 ;; (reg:SI 4 %r4 [ y+4 ])) 0))
3614 ;;
3615 ;; we should instead generate
3616 ;;
3617 ;; (set (zero_extract:DI (reg/v:DI 50 [ s ])
3618 ;; (const_int 24 [0x18])
3619 ;; (const_int 0 [0]))
3620 ;; (and:DI (lshiftrt:DI (reg/v:DI 50 [ s ])
3621 ;; (const_int 40 [0x28]))
3622 ;; (subreg:DI (reg:SI 4 %r4 [ y+4 ]) 0)))
3623 ;;
3624 ;; by noticing that we can push down the outer paradoxical subreg
3625 ;; into the operation.
3626
3627 (define_insn "*insv_rnsbg_noshift"
3628 [(set (zero_extract:DI
3629 (match_operand:DI 0 "nonimmediate_operand" "+d")
3630 (match_operand 1 "const_int_operand" "")
3631 (match_operand 2 "const_int_operand" ""))
3632 (and:DI
3633 (match_dup 0)
3634 (match_operand:DI 3 "nonimmediate_operand" "d")))
3635 (clobber (reg:CC CC_REGNUM))]
3636 "TARGET_Z10
3637 && INTVAL (operands[1]) + INTVAL (operands[2]) == 64"
3638 "rnsbg\t%0,%3,%2,63,0"
3639 [(set_attr "op_type" "RIE")])
3640
3641 (define_insn "*insv_rnsbg_srl"
3642 [(set (zero_extract:DI
3643 (match_operand:DI 0 "nonimmediate_operand" "+d")
3644 (match_operand 1 "const_int_operand" "")
3645 (match_operand 2 "const_int_operand" ""))
3646 (and:DI
3647 (lshiftrt:DI
3648 (match_dup 0)
3649 (match_operand 3 "const_int_operand" ""))
3650 (match_operand:DI 4 "nonimmediate_operand" "d")))
3651 (clobber (reg:CC CC_REGNUM))]
3652 "TARGET_Z10
3653 && INTVAL (operands[3]) == 64 - INTVAL (operands[1]) - INTVAL (operands[2])"
3654 "rnsbg\t%0,%4,%2,%2+%1-1,%3"
3655 [(set_attr "op_type" "RIE")])
3656
3657 (define_insn "*insv<mode>_mem_reg"
3658 [(set (zero_extract:W (match_operand:QI 0 "memory_operand" "+Q,S")
3659 (match_operand 1 "const_int_operand" "n,n")
3660 (const_int 0))
3661 (match_operand:W 2 "register_operand" "d,d"))]
3662 "INTVAL (operands[1]) > 0
3663 && INTVAL (operands[1]) <= GET_MODE_BITSIZE (SImode)
3664 && INTVAL (operands[1]) % BITS_PER_UNIT == 0"
3665 {
3666 int size = INTVAL (operands[1]) / BITS_PER_UNIT;
3667
3668 operands[1] = GEN_INT ((1ul << size) - 1);
3669 return (which_alternative == 0) ? "stcm\t%2,%1,%S0"
3670 : "stcmy\t%2,%1,%S0";
3671 }
3672 [(set_attr "op_type" "RS,RSY")
3673 (set_attr "z10prop" "z10_super,z10_super")])
3674
3675 (define_insn "*insvdi_mem_reghigh"
3676 [(set (zero_extract:DI (match_operand:QI 0 "memory_operand" "+QS")
3677 (match_operand 1 "const_int_operand" "n")
3678 (const_int 0))
3679 (lshiftrt:DI (match_operand:DI 2 "register_operand" "d")
3680 (const_int 32)))]
3681 "TARGET_ZARCH
3682 && INTVAL (operands[1]) > 0
3683 && INTVAL (operands[1]) <= GET_MODE_BITSIZE (SImode)
3684 && INTVAL (operands[1]) % BITS_PER_UNIT == 0"
3685 {
3686 int size = INTVAL (operands[1]) / BITS_PER_UNIT;
3687
3688 operands[1] = GEN_INT ((1ul << size) - 1);
3689 return "stcmh\t%2,%1,%S0";
3690 }
3691 [(set_attr "op_type" "RSY")
3692 (set_attr "z10prop" "z10_super")])
3693
3694 (define_insn "*insvdi_reg_imm"
3695 [(set (zero_extract:DI (match_operand:DI 0 "register_operand" "+d")
3696 (const_int 16)
3697 (match_operand 1 "const_int_operand" "n"))
3698 (match_operand:DI 2 "const_int_operand" "n"))]
3699 "TARGET_ZARCH
3700 && INTVAL (operands[1]) >= 0
3701 && INTVAL (operands[1]) < BITS_PER_WORD
3702 && INTVAL (operands[1]) % 16 == 0"
3703 {
3704 switch (BITS_PER_WORD - INTVAL (operands[1]))
3705 {
3706 case 64: return "iihh\t%0,%x2"; break;
3707 case 48: return "iihl\t%0,%x2"; break;
3708 case 32: return "iilh\t%0,%x2"; break;
3709 case 16: return "iill\t%0,%x2"; break;
3710 default: gcc_unreachable();
3711 }
3712 }
3713 [(set_attr "op_type" "RI")
3714 (set_attr "z10prop" "z10_super_E1")])
3715
3716 ; Update the left-most 32 bit of a DI.
3717 (define_insn "*insv_h_di_reg_extimm"
3718 [(set (zero_extract:DI (match_operand:DI 0 "register_operand" "+d")
3719 (const_int 32)
3720 (const_int 0))
3721 (match_operand:DI 1 "const_int_operand" "n"))]
3722 "TARGET_EXTIMM"
3723 "iihf\t%0,%o1"
3724 [(set_attr "op_type" "RIL")
3725 (set_attr "z10prop" "z10_fwd_E1")])
3726
3727 ; Update the right-most 32 bit of a DI.
3728 (define_insn "*insv_l_di_reg_extimm"
3729 [(set (zero_extract:DI (match_operand:DI 0 "register_operand" "+d")
3730 (const_int 32)
3731 (const_int 32))
3732 (match_operand:DI 1 "const_int_operand" "n"))]
3733 "TARGET_EXTIMM"
3734 "iilf\t%0,%o1"
3735 [(set_attr "op_type" "RIL")
3736 (set_attr "z10prop" "z10_fwd_A1")])
3737
3738 ;
3739 ; extendsidi2 instruction pattern(s).
3740 ;
3741
3742 (define_expand "extendsidi2"
3743 [(set (match_operand:DI 0 "register_operand" "")
3744 (sign_extend:DI (match_operand:SI 1 "nonimmediate_operand" "")))]
3745 ""
3746 {
3747 if (!TARGET_ZARCH)
3748 {
3749 emit_clobber (operands[0]);
3750 emit_move_insn (gen_highpart (SImode, operands[0]), operands[1]);
3751 emit_move_insn (gen_lowpart (SImode, operands[0]), const0_rtx);
3752 emit_insn (gen_ashrdi3 (operands[0], operands[0], GEN_INT (32)));
3753 DONE;
3754 }
3755 })
3756
3757 (define_insn "*extendsidi2"
3758 [(set (match_operand:DI 0 "register_operand" "=d,d,d")
3759 (sign_extend:DI (match_operand:SI 1 "nonimmediate_operand" "d,RT,b")))]
3760 "TARGET_ZARCH"
3761 "@
3762 lgfr\t%0,%1
3763 lgf\t%0,%1
3764 lgfrl\t%0,%1"
3765 [(set_attr "op_type" "RRE,RXY,RIL")
3766 (set_attr "type" "*,*,larl")
3767 (set_attr "cpu_facility" "*,*,z10")
3768 (set_attr "z10prop" "z10_super_E1,z10_super_E1,z10_super_E1")])
3769
3770 ;
3771 ; extend(hi|qi)(si|di)2 instruction pattern(s).
3772 ;
3773
3774 (define_expand "extend<HQI:mode><DSI:mode>2"
3775 [(set (match_operand:DSI 0 "register_operand" "")
3776 (sign_extend:DSI (match_operand:HQI 1 "nonimmediate_operand" "")))]
3777 ""
3778 {
3779 if (<DSI:MODE>mode == DImode && !TARGET_ZARCH)
3780 {
3781 rtx tmp = gen_reg_rtx (SImode);
3782 emit_insn (gen_extend<HQI:mode>si2 (tmp, operands[1]));
3783 emit_insn (gen_extendsidi2 (operands[0], tmp));
3784 DONE;
3785 }
3786 else if (!TARGET_EXTIMM)
3787 {
3788 rtx bitcount = GEN_INT (<DSI:bitsize> - <HQI:bitsize>);
3789
3790 operands[1] = gen_lowpart (<DSI:MODE>mode, operands[1]);
3791 emit_insn (gen_ashl<DSI:mode>3 (operands[0], operands[1], bitcount));
3792 emit_insn (gen_ashr<DSI:mode>3 (operands[0], operands[0], bitcount));
3793 DONE;
3794 }
3795 })
3796
3797 ;
3798 ; extendhidi2 instruction pattern(s).
3799 ;
3800
3801 (define_insn "*extendhidi2_extimm"
3802 [(set (match_operand:DI 0 "register_operand" "=d,d,d")
3803 (sign_extend:DI (match_operand:HI 1 "general_operand" "d,RT,b")))]
3804 "TARGET_ZARCH && TARGET_EXTIMM"
3805 "@
3806 lghr\t%0,%1
3807 lgh\t%0,%1
3808 lghrl\t%0,%1"
3809 [(set_attr "op_type" "RRE,RXY,RIL")
3810 (set_attr "type" "*,*,larl")
3811 (set_attr "cpu_facility" "extimm,extimm,z10")
3812 (set_attr "z10prop" "z10_super_E1,z10_super_E1,z10_super_E1")])
3813
3814 (define_insn "*extendhidi2"
3815 [(set (match_operand:DI 0 "register_operand" "=d")
3816 (sign_extend:DI (match_operand:HI 1 "memory_operand" "RT")))]
3817 "TARGET_ZARCH"
3818 "lgh\t%0,%1"
3819 [(set_attr "op_type" "RXY")
3820 (set_attr "z10prop" "z10_super_E1")])
3821
3822 ;
3823 ; extendhisi2 instruction pattern(s).
3824 ;
3825
3826 (define_insn "*extendhisi2_extimm"
3827 [(set (match_operand:SI 0 "register_operand" "=d,d,d,d")
3828 (sign_extend:SI (match_operand:HI 1 "nonimmediate_operand" " d,R,T,b")))]
3829 "TARGET_EXTIMM"
3830 "@
3831 lhr\t%0,%1
3832 lh\t%0,%1
3833 lhy\t%0,%1
3834 lhrl\t%0,%1"
3835 [(set_attr "op_type" "RRE,RX,RXY,RIL")
3836 (set_attr "type" "*,*,*,larl")
3837 (set_attr "cpu_facility" "extimm,extimm,extimm,z10")
3838 (set_attr "z10prop" "z10_super_E1,z10_super_E1,z10_super_E1,z10_super_E1")])
3839
3840 (define_insn "*extendhisi2"
3841 [(set (match_operand:SI 0 "register_operand" "=d,d")
3842 (sign_extend:SI (match_operand:HI 1 "memory_operand" "R,T")))]
3843 "!TARGET_EXTIMM"
3844 "@
3845 lh\t%0,%1
3846 lhy\t%0,%1"
3847 [(set_attr "op_type" "RX,RXY")
3848 (set_attr "z10prop" "z10_super_E1,z10_super_E1")])
3849
3850 ;
3851 ; extendqi(si|di)2 instruction pattern(s).
3852 ;
3853
3854 ; lbr, lgbr, lb, lgb
3855 (define_insn "*extendqi<mode>2_extimm"
3856 [(set (match_operand:GPR 0 "register_operand" "=d,d")
3857 (sign_extend:GPR (match_operand:QI 1 "nonimmediate_operand" "d,RT")))]
3858 "TARGET_EXTIMM"
3859 "@
3860 l<g>br\t%0,%1
3861 l<g>b\t%0,%1"
3862 [(set_attr "op_type" "RRE,RXY")
3863 (set_attr "z10prop" "z10_super_E1,z10_super_E1")])
3864
3865 ; lb, lgb
3866 (define_insn "*extendqi<mode>2"
3867 [(set (match_operand:GPR 0 "register_operand" "=d")
3868 (sign_extend:GPR (match_operand:QI 1 "memory_operand" "RT")))]
3869 "!TARGET_EXTIMM && TARGET_LONG_DISPLACEMENT"
3870 "l<g>b\t%0,%1"
3871 [(set_attr "op_type" "RXY")
3872 (set_attr "z10prop" "z10_super_E1")])
3873
3874 (define_insn_and_split "*extendqi<mode>2_short_displ"
3875 [(set (match_operand:GPR 0 "register_operand" "=d")
3876 (sign_extend:GPR (match_operand:QI 1 "s_operand" "Q")))
3877 (clobber (reg:CC CC_REGNUM))]
3878 "!TARGET_EXTIMM && !TARGET_LONG_DISPLACEMENT"
3879 "#"
3880 "&& reload_completed"
3881 [(parallel
3882 [(set (match_dup 0) (unspec:GPR [(match_dup 1) (const_int 8)] UNSPEC_ICM))
3883 (clobber (reg:CC CC_REGNUM))])
3884 (parallel
3885 [(set (match_dup 0) (ashiftrt:GPR (match_dup 0) (match_dup 2)))
3886 (clobber (reg:CC CC_REGNUM))])]
3887 {
3888 operands[1] = adjust_address (operands[1], BLKmode, 0);
3889 set_mem_size (operands[1], GET_MODE_SIZE (QImode));
3890 operands[2] = GEN_INT (<GPR:bitsize> - BITS_PER_UNIT);
3891 })
3892
3893 ;
3894 ; zero_extendsidi2 instruction pattern(s).
3895 ;
3896
3897 (define_expand "zero_extendsidi2"
3898 [(set (match_operand:DI 0 "register_operand" "")
3899 (zero_extend:DI (match_operand:SI 1 "nonimmediate_operand" "")))]
3900 ""
3901 {
3902 if (!TARGET_ZARCH)
3903 {
3904 emit_clobber (operands[0]);
3905 emit_move_insn (gen_lowpart (SImode, operands[0]), operands[1]);
3906 emit_move_insn (gen_highpart (SImode, operands[0]), const0_rtx);
3907 DONE;
3908 }
3909 })
3910
3911 (define_insn "*zero_extendsidi2"
3912 [(set (match_operand:DI 0 "register_operand" "=d,d,d")
3913 (zero_extend:DI (match_operand:SI 1 "nonimmediate_operand" "d,RT,b")))]
3914 "TARGET_ZARCH"
3915 "@
3916 llgfr\t%0,%1
3917 llgf\t%0,%1
3918 llgfrl\t%0,%1"
3919 [(set_attr "op_type" "RRE,RXY,RIL")
3920 (set_attr "type" "*,*,larl")
3921 (set_attr "cpu_facility" "*,*,z10")
3922 (set_attr "z10prop" "z10_fwd_E1,z10_fwd_A3,z10_fwd_A3")])
3923
3924 ;
3925 ; LLGT-type instructions (zero-extend from 31 bit to 64 bit).
3926 ;
3927
3928 (define_insn "*llgt_sidi"
3929 [(set (match_operand:DI 0 "register_operand" "=d")
3930 (and:DI (subreg:DI (match_operand:SI 1 "memory_operand" "RT") 0)
3931 (const_int 2147483647)))]
3932 "TARGET_ZARCH"
3933 "llgt\t%0,%1"
3934 [(set_attr "op_type" "RXE")
3935 (set_attr "z10prop" "z10_super_E1")])
3936
3937 (define_insn_and_split "*llgt_sidi_split"
3938 [(set (match_operand:DI 0 "register_operand" "=d")
3939 (and:DI (subreg:DI (match_operand:SI 1 "memory_operand" "RT") 0)
3940 (const_int 2147483647)))
3941 (clobber (reg:CC CC_REGNUM))]
3942 "TARGET_ZARCH"
3943 "#"
3944 "&& reload_completed"
3945 [(set (match_dup 0)
3946 (and:DI (subreg:DI (match_dup 1) 0)
3947 (const_int 2147483647)))]
3948 "")
3949
3950 (define_insn "*llgt_sisi"
3951 [(set (match_operand:SI 0 "register_operand" "=d,d")
3952 (and:SI (match_operand:SI 1 "nonimmediate_operand" "d,RT")
3953 (const_int 2147483647)))]
3954 "TARGET_ZARCH"
3955 "@
3956 llgtr\t%0,%1
3957 llgt\t%0,%1"
3958 [(set_attr "op_type" "RRE,RXE")
3959 (set_attr "z10prop" "z10_super_E1,z10_super_E1")])
3960
3961 (define_insn "*llgt_didi"
3962 [(set (match_operand:DI 0 "register_operand" "=d,d")
3963 (and:DI (match_operand:DI 1 "nonimmediate_operand" "d,o")
3964 (const_int 2147483647)))]
3965 "TARGET_ZARCH"
3966 "@
3967 llgtr\t%0,%1
3968 llgt\t%0,%N1"
3969 [(set_attr "op_type" "RRE,RXE")
3970 (set_attr "z10prop" "z10_super_E1,z10_super_E1")])
3971
3972 (define_split
3973 [(set (match_operand:DSI 0 "register_operand" "")
3974 (and:DSI (match_operand:DSI 1 "nonimmediate_operand" "")
3975 (const_int 2147483647)))
3976 (clobber (reg:CC CC_REGNUM))]
3977 "TARGET_ZARCH && reload_completed"
3978 [(set (match_dup 0)
3979 (and:DSI (match_dup 1)
3980 (const_int 2147483647)))]
3981 "")
3982
3983 ;
3984 ; zero_extend(hi|qi)(si|di)2 instruction pattern(s).
3985 ;
3986
3987 (define_expand "zero_extend<mode>di2"
3988 [(set (match_operand:DI 0 "register_operand" "")
3989 (zero_extend:DI (match_operand:HQI 1 "nonimmediate_operand" "")))]
3990 ""
3991 {
3992 if (!TARGET_ZARCH)
3993 {
3994 rtx tmp = gen_reg_rtx (SImode);
3995 emit_insn (gen_zero_extend<mode>si2 (tmp, operands[1]));
3996 emit_insn (gen_zero_extendsidi2 (operands[0], tmp));
3997 DONE;
3998 }
3999 else if (!TARGET_EXTIMM)
4000 {
4001 rtx bitcount = GEN_INT (64 - <HQI:bitsize>);
4002 operands[1] = gen_lowpart (DImode, operands[1]);
4003 emit_insn (gen_ashldi3 (operands[0], operands[1], bitcount));
4004 emit_insn (gen_lshrdi3 (operands[0], operands[0], bitcount));
4005 DONE;
4006 }
4007 })
4008
4009 (define_expand "zero_extend<mode>si2"
4010 [(set (match_operand:SI 0 "register_operand" "")
4011 (zero_extend:SI (match_operand:HQI 1 "nonimmediate_operand" "")))]
4012 ""
4013 {
4014 if (!TARGET_EXTIMM)
4015 {
4016 operands[1] = gen_lowpart (SImode, operands[1]);
4017 emit_insn (gen_andsi3 (operands[0], operands[1],
4018 GEN_INT ((1 << <HQI:bitsize>) - 1)));
4019 DONE;
4020 }
4021 })
4022
4023 ; llhrl, llghrl
4024 (define_insn "*zero_extendhi<mode>2_z10"
4025 [(set (match_operand:GPR 0 "register_operand" "=d,d,d")
4026 (zero_extend:GPR (match_operand:HI 1 "nonimmediate_operand" "d,RT,b")))]
4027 "TARGET_Z10"
4028 "@
4029 ll<g>hr\t%0,%1
4030 ll<g>h\t%0,%1
4031 ll<g>hrl\t%0,%1"
4032 [(set_attr "op_type" "RXY,RRE,RIL")
4033 (set_attr "type" "*,*,larl")
4034 (set_attr "cpu_facility" "*,*,z10")
4035 (set_attr "z10prop" "z10_super_E1,z10_fwd_A3,z10_fwd_A3")])
4036
4037 ; llhr, llcr, llghr, llgcr, llh, llc, llgh, llgc
4038 (define_insn "*zero_extend<HQI:mode><GPR:mode>2_extimm"
4039 [(set (match_operand:GPR 0 "register_operand" "=d,d")
4040 (zero_extend:GPR (match_operand:HQI 1 "nonimmediate_operand" "d,RT")))]
4041 "TARGET_EXTIMM"
4042 "@
4043 ll<g><hc>r\t%0,%1
4044 ll<g><hc>\t%0,%1"
4045 [(set_attr "op_type" "RRE,RXY")
4046 (set_attr "z10prop" "z10_super_E1,z10_fwd_A3")])
4047
4048 ; llgh, llgc
4049 (define_insn "*zero_extend<HQI:mode><GPR:mode>2"
4050 [(set (match_operand:GPR 0 "register_operand" "=d")
4051 (zero_extend:GPR (match_operand:HQI 1 "memory_operand" "RT")))]
4052 "TARGET_ZARCH && !TARGET_EXTIMM"
4053 "llg<hc>\t%0,%1"
4054 [(set_attr "op_type" "RXY")
4055 (set_attr "z10prop" "z10_fwd_A3")])
4056
4057 (define_insn_and_split "*zero_extendhisi2_31"
4058 [(set (match_operand:SI 0 "register_operand" "=&d")
4059 (zero_extend:SI (match_operand:HI 1 "s_operand" "QS")))
4060 (clobber (reg:CC CC_REGNUM))]
4061 "!TARGET_ZARCH"
4062 "#"
4063 "&& reload_completed"
4064 [(set (match_dup 0) (const_int 0))
4065 (parallel
4066 [(set (strict_low_part (match_dup 2)) (match_dup 1))
4067 (clobber (reg:CC CC_REGNUM))])]
4068 "operands[2] = gen_lowpart (HImode, operands[0]);")
4069
4070 (define_insn_and_split "*zero_extendqisi2_31"
4071 [(set (match_operand:SI 0 "register_operand" "=&d")
4072 (zero_extend:SI (match_operand:QI 1 "memory_operand" "RT")))]
4073 "!TARGET_ZARCH"
4074 "#"
4075 "&& reload_completed"
4076 [(set (match_dup 0) (const_int 0))
4077 (set (strict_low_part (match_dup 2)) (match_dup 1))]
4078 "operands[2] = gen_lowpart (QImode, operands[0]);")
4079
4080 ;
4081 ; zero_extendqihi2 instruction pattern(s).
4082 ;
4083
4084 (define_expand "zero_extendqihi2"
4085 [(set (match_operand:HI 0 "register_operand" "")
4086 (zero_extend:HI (match_operand:QI 1 "register_operand" "")))]
4087 "TARGET_ZARCH && !TARGET_EXTIMM"
4088 {
4089 operands[1] = gen_lowpart (HImode, operands[1]);
4090 emit_insn (gen_andhi3 (operands[0], operands[1], GEN_INT (0xff)));
4091 DONE;
4092 })
4093
4094 (define_insn "*zero_extendqihi2_64"
4095 [(set (match_operand:HI 0 "register_operand" "=d")
4096 (zero_extend:HI (match_operand:QI 1 "memory_operand" "RT")))]
4097 "TARGET_ZARCH && !TARGET_EXTIMM"
4098 "llgc\t%0,%1"
4099 [(set_attr "op_type" "RXY")
4100 (set_attr "z10prop" "z10_fwd_A3")])
4101
4102 (define_insn_and_split "*zero_extendqihi2_31"
4103 [(set (match_operand:HI 0 "register_operand" "=&d")
4104 (zero_extend:HI (match_operand:QI 1 "memory_operand" "RT")))]
4105 "!TARGET_ZARCH"
4106 "#"
4107 "&& reload_completed"
4108 [(set (match_dup 0) (const_int 0))
4109 (set (strict_low_part (match_dup 2)) (match_dup 1))]
4110 "operands[2] = gen_lowpart (QImode, operands[0]);")
4111
4112 ;
4113 ; fixuns_trunc(dd|td)di2 instruction pattern(s).
4114 ;
4115
4116 (define_expand "fixuns_truncdddi2"
4117 [(parallel
4118 [(set (match_operand:DI 0 "register_operand" "")
4119 (unsigned_fix:DI (match_operand:DD 1 "register_operand" "")))
4120 (unspec:DI [(const_int 5)] UNSPEC_ROUND)
4121 (clobber (reg:CC CC_REGNUM))])]
4122
4123 "TARGET_HARD_DFP"
4124 {
4125 if (!TARGET_Z196)
4126 {
4127 rtx label1 = gen_label_rtx ();
4128 rtx label2 = gen_label_rtx ();
4129 rtx temp = gen_reg_rtx (TDmode);
4130 REAL_VALUE_TYPE cmp, sub;
4131
4132 decimal_real_from_string (&cmp, "9223372036854775808.0"); /* 2^63 */
4133 decimal_real_from_string (&sub, "18446744073709551616.0"); /* 2^64 */
4134
4135 /* 2^63 can't be represented as 64bit DFP number with full precision. The
4136 solution is doing the check and the subtraction in TD mode and using a
4137 TD -> DI convert afterwards. */
4138 emit_insn (gen_extendddtd2 (temp, operands[1]));
4139 temp = force_reg (TDmode, temp);
4140 emit_cmp_and_jump_insns (temp,
4141 CONST_DOUBLE_FROM_REAL_VALUE (cmp, TDmode),
4142 LT, NULL_RTX, VOIDmode, 0, label1);
4143 emit_insn (gen_subtd3 (temp, temp,
4144 CONST_DOUBLE_FROM_REAL_VALUE (sub, TDmode)));
4145 emit_insn (gen_fix_trunctddi2_dfp (operands[0], temp, GEN_INT (11)));
4146 emit_jump (label2);
4147
4148 emit_label (label1);
4149 emit_insn (gen_fix_truncdddi2_dfp (operands[0], operands[1], GEN_INT (9)));
4150 emit_label (label2);
4151 DONE;
4152 }
4153 })
4154
4155 (define_expand "fixuns_trunctddi2"
4156 [(parallel
4157 [(set (match_operand:DI 0 "register_operand" "")
4158 (unsigned_fix:DI (match_operand:TD 1 "register_operand" "")))
4159 (unspec:DI [(const_int 5)] UNSPEC_ROUND)
4160 (clobber (reg:CC CC_REGNUM))])]
4161
4162 "TARGET_HARD_DFP"
4163 {
4164 if (!TARGET_Z196)
4165 {
4166 rtx label1 = gen_label_rtx ();
4167 rtx label2 = gen_label_rtx ();
4168 rtx temp = gen_reg_rtx (TDmode);
4169 REAL_VALUE_TYPE cmp, sub;
4170
4171 operands[1] = force_reg (TDmode, operands[1]);
4172 decimal_real_from_string (&cmp, "9223372036854775808.0"); /* 2^63 */
4173 decimal_real_from_string (&sub, "18446744073709551616.0"); /* 2^64 */
4174
4175 emit_cmp_and_jump_insns (operands[1],
4176 CONST_DOUBLE_FROM_REAL_VALUE (cmp, TDmode),
4177 LT, NULL_RTX, VOIDmode, 0, label1);
4178 emit_insn (gen_subtd3 (temp, operands[1],
4179 CONST_DOUBLE_FROM_REAL_VALUE (sub, TDmode)));
4180 emit_insn (gen_fix_trunctddi2_dfp (operands[0], temp, GEN_INT (11)));
4181 emit_jump (label2);
4182
4183 emit_label (label1);
4184 emit_insn (gen_fix_trunctddi2_dfp (operands[0], operands[1], GEN_INT (9)));
4185 emit_label (label2);
4186 DONE;
4187 }
4188 })
4189
4190 ;
4191 ; fixuns_trunc(sf|df|tf)(si|di)2 and fix_trunc(sf|df|tf)(si|di)2
4192 ; instruction pattern(s).
4193 ;
4194
4195 (define_expand "fixuns_trunc<BFP:mode><GPR:mode>2"
4196 [(parallel
4197 [(set (match_operand:GPR 0 "register_operand" "")
4198 (unsigned_fix:GPR (match_operand:BFP 1 "register_operand" "")))
4199 (unspec:GPR [(const_int 5)] UNSPEC_ROUND)
4200 (clobber (reg:CC CC_REGNUM))])]
4201 "TARGET_HARD_FLOAT"
4202 {
4203 if (!TARGET_Z196)
4204 {
4205 rtx label1 = gen_label_rtx ();
4206 rtx label2 = gen_label_rtx ();
4207 rtx temp = gen_reg_rtx (<BFP:MODE>mode);
4208 REAL_VALUE_TYPE cmp, sub;
4209
4210 operands[1] = force_reg (<BFP:MODE>mode, operands[1]);
4211 real_2expN (&cmp, <GPR:bitsize> - 1, <BFP:MODE>mode);
4212 real_2expN (&sub, <GPR:bitsize>, <BFP:MODE>mode);
4213
4214 emit_cmp_and_jump_insns (operands[1],
4215 CONST_DOUBLE_FROM_REAL_VALUE (cmp, <BFP:MODE>mode),
4216 LT, NULL_RTX, VOIDmode, 0, label1);
4217 emit_insn (gen_sub<BFP:mode>3 (temp, operands[1],
4218 CONST_DOUBLE_FROM_REAL_VALUE (sub, <BFP:MODE>mode)));
4219 emit_insn (gen_fix_trunc<BFP:mode><GPR:mode>2_bfp (operands[0], temp,
4220 GEN_INT (7)));
4221 emit_jump (label2);
4222
4223 emit_label (label1);
4224 emit_insn (gen_fix_trunc<BFP:mode><GPR:mode>2_bfp (operands[0],
4225 operands[1], GEN_INT (5)));
4226 emit_label (label2);
4227 DONE;
4228 }
4229 })
4230
4231 ; fixuns_trunc(td|dd)si2 expander
4232 (define_expand "fixuns_trunc<mode>si2"
4233 [(parallel
4234 [(set (match_operand:SI 0 "register_operand" "")
4235 (unsigned_fix:SI (match_operand:DFP 1 "register_operand" "")))
4236 (unspec:SI [(const_int 5)] UNSPEC_ROUND)
4237 (clobber (reg:CC CC_REGNUM))])]
4238 "TARGET_Z196 && TARGET_HARD_DFP"
4239 "")
4240
4241 ; fixuns_trunc(tf|df|sf|td|dd)(di|si)2 instruction patterns.
4242
4243 ; clfebr, clfdbr, clfxbr, clgebr, clgdbr, clgxbr
4244 ; clfdtr, clfxtr, clgdtr, clgxtr
4245 (define_insn "*fixuns_trunc<FP:mode><GPR:mode>2_z196"
4246 [(set (match_operand:GPR 0 "register_operand" "=r")
4247 (unsigned_fix:GPR (match_operand:FP 1 "register_operand" "f")))
4248 (unspec:GPR [(match_operand:GPR 2 "immediate_operand" "K")] UNSPEC_ROUND)
4249 (clobber (reg:CC CC_REGNUM))]
4250 "TARGET_Z196"
4251 "cl<GPR:gf><FP:xde><FP:bt>r\t%0,%h2,%1,0"
4252 [(set_attr "op_type" "RRF")
4253 (set_attr "type" "ftoi")])
4254
4255 (define_expand "fix_trunc<DSF:mode><GPR:mode>2"
4256 [(set (match_operand:GPR 0 "register_operand" "")
4257 (fix:GPR (match_operand:DSF 1 "register_operand" "")))]
4258 "TARGET_HARD_FLOAT"
4259 {
4260 emit_insn (gen_fix_trunc<DSF:mode><GPR:mode>2_bfp (operands[0], operands[1],
4261 GEN_INT (5)));
4262 DONE;
4263 })
4264
4265 ; cgxbr, cgdbr, cgebr, cfxbr, cfdbr, cfebr
4266 (define_insn "fix_trunc<BFP:mode><GPR:mode>2_bfp"
4267 [(set (match_operand:GPR 0 "register_operand" "=d")
4268 (fix:GPR (match_operand:BFP 1 "register_operand" "f")))
4269 (unspec:GPR [(match_operand:GPR 2 "immediate_operand" "K")] UNSPEC_ROUND)
4270 (clobber (reg:CC CC_REGNUM))]
4271 "TARGET_HARD_FLOAT"
4272 "c<GPR:gf><BFP:xde>br\t%0,%h2,%1"
4273 [(set_attr "op_type" "RRE")
4274 (set_attr "type" "ftoi")])
4275
4276
4277 ;
4278 ; fix_trunc(td|dd)di2 instruction pattern(s).
4279 ;
4280
4281 (define_expand "fix_trunc<mode>di2"
4282 [(set (match_operand:DI 0 "register_operand" "")
4283 (fix:DI (match_operand:DFP 1 "nonimmediate_operand" "")))]
4284 "TARGET_ZARCH && TARGET_HARD_DFP"
4285 {
4286 operands[1] = force_reg (<MODE>mode, operands[1]);
4287 emit_insn (gen_fix_trunc<mode>di2_dfp (operands[0], operands[1],
4288 GEN_INT (9)));
4289 DONE;
4290 })
4291
4292 ; cgxtr, cgdtr
4293 (define_insn "fix_trunc<DFP:mode>di2_dfp"
4294 [(set (match_operand:DI 0 "register_operand" "=d")
4295 (fix:DI (match_operand:DFP 1 "register_operand" "f")))
4296 (unspec:DI [(match_operand:DI 2 "immediate_operand" "K")] UNSPEC_ROUND)
4297 (clobber (reg:CC CC_REGNUM))]
4298 "TARGET_ZARCH && TARGET_HARD_DFP"
4299 "cg<DFP:xde>tr\t%0,%h2,%1"
4300 [(set_attr "op_type" "RRF")
4301 (set_attr "type" "ftoidfp")])
4302
4303
4304 ;
4305 ; fix_trunctf(si|di)2 instruction pattern(s).
4306 ;
4307
4308 (define_expand "fix_trunctf<mode>2"
4309 [(parallel [(set (match_operand:GPR 0 "register_operand" "")
4310 (fix:GPR (match_operand:TF 1 "register_operand" "")))
4311 (unspec:GPR [(const_int 5)] UNSPEC_ROUND)
4312 (clobber (reg:CC CC_REGNUM))])]
4313 "TARGET_HARD_FLOAT"
4314 "")
4315
4316
4317 ;
4318 ; float(si|di)(tf|df|sf|td|dd)2 instruction pattern(s).
4319 ;
4320
4321 ; cxgbr, cdgbr, cegbr, cxgtr, cdgtr
4322 (define_insn "floatdi<mode>2"
4323 [(set (match_operand:FP 0 "register_operand" "=f")
4324 (float:FP (match_operand:DI 1 "register_operand" "d")))]
4325 "TARGET_ZARCH && TARGET_HARD_FLOAT"
4326 "c<xde>g<bt>r\t%0,%1"
4327 [(set_attr "op_type" "RRE")
4328 (set_attr "type" "itof<mode>" )])
4329
4330 ; cxfbr, cdfbr, cefbr
4331 (define_insn "floatsi<mode>2"
4332 [(set (match_operand:BFP 0 "register_operand" "=f")
4333 (float:BFP (match_operand:SI 1 "register_operand" "d")))]
4334 "TARGET_HARD_FLOAT"
4335 "c<xde>fbr\t%0,%1"
4336 [(set_attr "op_type" "RRE")
4337 (set_attr "type" "itof<mode>" )])
4338
4339 ; cxftr, cdftr
4340 (define_insn "floatsi<mode>2"
4341 [(set (match_operand:DFP 0 "register_operand" "=f")
4342 (float:DFP (match_operand:SI 1 "register_operand" "d")))]
4343 "TARGET_Z196 && TARGET_HARD_FLOAT"
4344 "c<xde>ftr\t%0,0,%1,0"
4345 [(set_attr "op_type" "RRE")
4346 (set_attr "type" "itof<mode>" )])
4347
4348 ;
4349 ; floatuns(si|di)(tf|df|sf|td|dd)2 instruction pattern(s).
4350 ;
4351
4352 ; cxlgbr, cdlgbr, celgbr, cxlgtr, cdlgtr
4353 ; cxlfbr, cdlfbr, celfbr, cxlftr, cdlftr
4354 (define_insn "floatuns<GPR:mode><FP:mode>2"
4355 [(set (match_operand:FP 0 "register_operand" "=f")
4356 (unsigned_float:FP (match_operand:GPR 1 "register_operand" "d")))]
4357 "TARGET_Z196 && TARGET_HARD_FLOAT"
4358 "c<FP:xde>l<GPR:gf><FP:bt>r\t%0,0,%1,0"
4359 [(set_attr "op_type" "RRE")
4360 (set_attr "type" "itof<FP:mode>" )])
4361
4362 ;
4363 ; truncdfsf2 instruction pattern(s).
4364 ;
4365
4366 (define_insn "truncdfsf2"
4367 [(set (match_operand:SF 0 "register_operand" "=f")
4368 (float_truncate:SF (match_operand:DF 1 "register_operand" "f")))]
4369 "TARGET_HARD_FLOAT"
4370 "ledbr\t%0,%1"
4371 [(set_attr "op_type" "RRE")
4372 (set_attr "type" "ftruncdf")])
4373
4374 ;
4375 ; trunctf(df|sf)2 instruction pattern(s).
4376 ;
4377
4378 ; ldxbr, lexbr
4379 (define_insn "trunctf<mode>2"
4380 [(set (match_operand:DSF 0 "register_operand" "=f")
4381 (float_truncate:DSF (match_operand:TF 1 "register_operand" "f")))
4382 (clobber (match_scratch:TF 2 "=f"))]
4383 "TARGET_HARD_FLOAT"
4384 "l<xde>xbr\t%2,%1\;l<xde>r\t%0,%2"
4385 [(set_attr "length" "6")
4386 (set_attr "type" "ftrunctf")])
4387
4388 ;
4389 ; trunctddd2 and truncddsd2 instruction pattern(s).
4390 ;
4391
4392 (define_insn "trunctddd2"
4393 [(set (match_operand:DD 0 "register_operand" "=f")
4394 (float_truncate:DD (match_operand:TD 1 "register_operand" "f")))
4395 (clobber (match_scratch:TD 2 "=f"))]
4396 "TARGET_HARD_DFP"
4397 "ldxtr\t%2,0,%1,0\;ldr\t%0,%2"
4398 [(set_attr "length" "6")
4399 (set_attr "type" "ftruncdd")])
4400
4401 (define_insn "truncddsd2"
4402 [(set (match_operand:SD 0 "register_operand" "=f")
4403 (float_truncate:SD (match_operand:DD 1 "register_operand" "f")))]
4404 "TARGET_HARD_DFP"
4405 "ledtr\t%0,0,%1,0"
4406 [(set_attr "op_type" "RRF")
4407 (set_attr "type" "ftruncsd")])
4408
4409 ;
4410 ; extend(sf|df)(df|tf)2 instruction pattern(s).
4411 ;
4412
4413 ; ldebr, ldeb, lxdbr, lxdb, lxebr, lxeb
4414 (define_insn "extend<DSF:mode><BFP:mode>2"
4415 [(set (match_operand:BFP 0 "register_operand" "=f,f")
4416 (float_extend:BFP (match_operand:DSF 1 "nonimmediate_operand" "f,R")))]
4417 "TARGET_HARD_FLOAT
4418 && GET_MODE_SIZE (<BFP:MODE>mode) > GET_MODE_SIZE (<DSF:MODE>mode)"
4419 "@
4420 l<BFP:xde><DSF:xde>br\t%0,%1
4421 l<BFP:xde><DSF:xde>b\t%0,%1"
4422 [(set_attr "op_type" "RRE,RXE")
4423 (set_attr "type" "fsimp<BFP:mode>, fload<BFP:mode>")])
4424
4425 ;
4426 ; extendddtd2 and extendsddd2 instruction pattern(s).
4427 ;
4428
4429 (define_insn "extendddtd2"
4430 [(set (match_operand:TD 0 "register_operand" "=f")
4431 (float_extend:TD (match_operand:DD 1 "register_operand" "f")))]
4432 "TARGET_HARD_DFP"
4433 "lxdtr\t%0,%1,0"
4434 [(set_attr "op_type" "RRF")
4435 (set_attr "type" "fsimptf")])
4436
4437 (define_insn "extendsddd2"
4438 [(set (match_operand:DD 0 "register_operand" "=f")
4439 (float_extend:DD (match_operand:SD 1 "register_operand" "f")))]
4440 "TARGET_HARD_DFP"
4441 "ldetr\t%0,%1,0"
4442 [(set_attr "op_type" "RRF")
4443 (set_attr "type" "fsimptf")])
4444
4445 ; Binary Floating Point - load fp integer
4446
4447 ; Expanders for: floor, btrunc, round, ceil, and nearbyint
4448 ; For all of them the inexact exceptions are suppressed.
4449
4450 ; fiebra, fidbra, fixbra
4451 (define_insn "<FPINT:fpint_name><BFP:mode>2"
4452 [(set (match_operand:BFP 0 "register_operand" "=f")
4453 (unspec:BFP [(match_operand:BFP 1 "register_operand" "f")]
4454 FPINT))]
4455 "TARGET_Z196"
4456 "fi<BFP:xde>bra\t%0,<FPINT:fpint_roundingmode>,%1,4"
4457 [(set_attr "op_type" "RRF")
4458 (set_attr "type" "fsimp<BFP:mode>")])
4459
4460 ; rint is supposed to raise an inexact exception so we can use the
4461 ; older instructions.
4462
4463 ; fiebr, fidbr, fixbr
4464 (define_insn "rint<BFP:mode>2"
4465 [(set (match_operand:BFP 0 "register_operand" "=f")
4466 (unspec:BFP [(match_operand:BFP 1 "register_operand" "f")]
4467 UNSPEC_FPINT_RINT))]
4468 ""
4469 "fi<BFP:xde>br\t%0,0,%1"
4470 [(set_attr "op_type" "RRF")
4471 (set_attr "type" "fsimp<BFP:mode>")])
4472
4473
4474 ; Decimal Floating Point - load fp integer
4475
4476 ; fidtr, fixtr
4477 (define_insn "<FPINT:fpint_name><DFP:mode>2"
4478 [(set (match_operand:DFP 0 "register_operand" "=f")
4479 (unspec:DFP [(match_operand:DFP 1 "register_operand" "f")]
4480 FPINT))]
4481 "TARGET_HARD_DFP"
4482 "fi<DFP:xde>tr\t%0,<FPINT:fpint_roundingmode>,%1,4"
4483 [(set_attr "op_type" "RRF")
4484 (set_attr "type" "fsimp<DFP:mode>")])
4485
4486 ; fidtr, fixtr
4487 (define_insn "rint<DFP:mode>2"
4488 [(set (match_operand:DFP 0 "register_operand" "=f")
4489 (unspec:DFP [(match_operand:DFP 1 "register_operand" "f")]
4490 UNSPEC_FPINT_RINT))]
4491 "TARGET_HARD_DFP"
4492 "fi<DFP:xde>tr\t%0,0,%1,0"
4493 [(set_attr "op_type" "RRF")
4494 (set_attr "type" "fsimp<DFP:mode>")])
4495
4496 ;
4497 ; Binary <-> Decimal floating point trunc patterns
4498 ;
4499
4500 (define_insn "*trunc<BFP:mode><DFP_ALL:mode>2"
4501 [(set (reg:DFP_ALL FPR0_REGNUM)
4502 (float_truncate:DFP_ALL (reg:BFP FPR4_REGNUM)))
4503 (use (reg:SI GPR0_REGNUM))
4504 (clobber (reg:CC CC_REGNUM))]
4505 "TARGET_HARD_DFP"
4506 "pfpo")
4507
4508 (define_insn "*trunc<DFP_ALL:mode><BFP:mode>2"
4509 [(set (reg:BFP FPR0_REGNUM)
4510 (float_truncate:BFP (reg:DFP_ALL FPR4_REGNUM)))
4511 (use (reg:SI GPR0_REGNUM))
4512 (clobber (reg:CC CC_REGNUM))]
4513 "TARGET_HARD_DFP"
4514 "pfpo")
4515
4516 (define_expand "trunc<BFP:mode><DFP_ALL:mode>2"
4517 [(set (reg:BFP FPR4_REGNUM) (match_operand:BFP 1 "nonimmediate_operand" ""))
4518 (set (reg:SI GPR0_REGNUM) (match_dup 2))
4519 (parallel
4520 [(set (reg:DFP_ALL FPR0_REGNUM)
4521 (float_truncate:DFP_ALL (reg:BFP FPR4_REGNUM)))
4522 (use (reg:SI GPR0_REGNUM))
4523 (clobber (reg:CC CC_REGNUM))])
4524 (set (match_operand:DFP_ALL 0 "nonimmediate_operand" "")
4525 (reg:DFP_ALL FPR0_REGNUM))]
4526 "TARGET_HARD_DFP
4527 && GET_MODE_SIZE (<BFP:MODE>mode) > GET_MODE_SIZE (<DFP_ALL:MODE>mode)"
4528 {
4529 HOST_WIDE_INT flags;
4530
4531 flags = (PFPO_CONVERT |
4532 PFPO_OP_TYPE_<DFP_ALL:MODE> << PFPO_OP0_TYPE_SHIFT |
4533 PFPO_OP_TYPE_<BFP:MODE> << PFPO_OP1_TYPE_SHIFT);
4534
4535 operands[2] = GEN_INT (flags);
4536 })
4537
4538 (define_expand "trunc<DFP_ALL:mode><BFP:mode>2"
4539 [(set (reg:DFP_ALL FPR4_REGNUM)
4540 (match_operand:DFP_ALL 1 "nonimmediate_operand" ""))
4541 (set (reg:SI GPR0_REGNUM) (match_dup 2))
4542 (parallel
4543 [(set (reg:BFP FPR0_REGNUM) (float_truncate:BFP (reg:DFP_ALL FPR4_REGNUM)))
4544 (use (reg:SI GPR0_REGNUM))
4545 (clobber (reg:CC CC_REGNUM))])
4546 (set (match_operand:BFP 0 "nonimmediate_operand" "") (reg:BFP FPR0_REGNUM))]
4547 "TARGET_HARD_DFP
4548 && GET_MODE_SIZE (<DFP_ALL:MODE>mode) >= GET_MODE_SIZE (<BFP:MODE>mode)"
4549 {
4550 HOST_WIDE_INT flags;
4551
4552 flags = (PFPO_CONVERT |
4553 PFPO_OP_TYPE_<BFP:MODE> << PFPO_OP0_TYPE_SHIFT |
4554 PFPO_OP_TYPE_<DFP_ALL:MODE> << PFPO_OP1_TYPE_SHIFT);
4555
4556 operands[2] = GEN_INT (flags);
4557 })
4558
4559 ;
4560 ; Binary <-> Decimal floating point extend patterns
4561 ;
4562
4563 (define_insn "*extend<BFP:mode><DFP_ALL:mode>2"
4564 [(set (reg:DFP_ALL FPR0_REGNUM) (float_extend:DFP_ALL (reg:BFP FPR4_REGNUM)))
4565 (use (reg:SI GPR0_REGNUM))
4566 (clobber (reg:CC CC_REGNUM))]
4567 "TARGET_HARD_DFP"
4568 "pfpo")
4569
4570 (define_insn "*extend<DFP_ALL:mode><BFP:mode>2"
4571 [(set (reg:BFP FPR0_REGNUM) (float_extend:BFP (reg:DFP_ALL FPR4_REGNUM)))
4572 (use (reg:SI GPR0_REGNUM))
4573 (clobber (reg:CC CC_REGNUM))]
4574 "TARGET_HARD_DFP"
4575 "pfpo")
4576
4577 (define_expand "extend<BFP:mode><DFP_ALL:mode>2"
4578 [(set (reg:BFP FPR4_REGNUM) (match_operand:BFP 1 "nonimmediate_operand" ""))
4579 (set (reg:SI GPR0_REGNUM) (match_dup 2))
4580 (parallel
4581 [(set (reg:DFP_ALL FPR0_REGNUM)
4582 (float_extend:DFP_ALL (reg:BFP FPR4_REGNUM)))
4583 (use (reg:SI GPR0_REGNUM))
4584 (clobber (reg:CC CC_REGNUM))])
4585 (set (match_operand:DFP_ALL 0 "nonimmediate_operand" "")
4586 (reg:DFP_ALL FPR0_REGNUM))]
4587 "TARGET_HARD_DFP
4588 && GET_MODE_SIZE (<BFP:MODE>mode) <= GET_MODE_SIZE (<DFP_ALL:MODE>mode)"
4589 {
4590 HOST_WIDE_INT flags;
4591
4592 flags = (PFPO_CONVERT |
4593 PFPO_OP_TYPE_<DFP_ALL:MODE> << PFPO_OP0_TYPE_SHIFT |
4594 PFPO_OP_TYPE_<BFP:MODE> << PFPO_OP1_TYPE_SHIFT);
4595
4596 operands[2] = GEN_INT (flags);
4597 })
4598
4599 (define_expand "extend<DFP_ALL:mode><BFP:mode>2"
4600 [(set (reg:DFP_ALL FPR4_REGNUM)
4601 (match_operand:DFP_ALL 1 "nonimmediate_operand" ""))
4602 (set (reg:SI GPR0_REGNUM) (match_dup 2))
4603 (parallel
4604 [(set (reg:BFP FPR0_REGNUM) (float_extend:BFP (reg:DFP_ALL FPR4_REGNUM)))
4605 (use (reg:SI GPR0_REGNUM))
4606 (clobber (reg:CC CC_REGNUM))])
4607 (set (match_operand:BFP 0 "nonimmediate_operand" "") (reg:BFP FPR0_REGNUM))]
4608 "TARGET_HARD_DFP
4609 && GET_MODE_SIZE (<DFP_ALL:MODE>mode) < GET_MODE_SIZE (<BFP:MODE>mode)"
4610 {
4611 HOST_WIDE_INT flags;
4612
4613 flags = (PFPO_CONVERT |
4614 PFPO_OP_TYPE_<BFP:MODE> << PFPO_OP0_TYPE_SHIFT |
4615 PFPO_OP_TYPE_<DFP_ALL:MODE> << PFPO_OP1_TYPE_SHIFT);
4616
4617 operands[2] = GEN_INT (flags);
4618 })
4619
4620
4621 ;;
4622 ;; ARITHMETIC OPERATIONS
4623 ;;
4624 ; arithmetic operations set the ConditionCode,
4625 ; because of unpredictable Bits in Register for Halfword and Byte
4626 ; the ConditionCode can be set wrong in operations for Halfword and Byte
4627
4628 ;;
4629 ;;- Add instructions.
4630 ;;
4631
4632 ;
4633 ; addti3 instruction pattern(s).
4634 ;
4635
4636 (define_insn_and_split "addti3"
4637 [(set (match_operand:TI 0 "register_operand" "=&d")
4638 (plus:TI (match_operand:TI 1 "nonimmediate_operand" "%0")
4639 (match_operand:TI 2 "general_operand" "do") ) )
4640 (clobber (reg:CC CC_REGNUM))]
4641 "TARGET_ZARCH"
4642 "#"
4643 "&& reload_completed"
4644 [(parallel
4645 [(set (reg:CCL1 CC_REGNUM)
4646 (compare:CCL1 (plus:DI (match_dup 7) (match_dup 8))
4647 (match_dup 7)))
4648 (set (match_dup 6) (plus:DI (match_dup 7) (match_dup 8)))])
4649 (parallel
4650 [(set (match_dup 3) (plus:DI
4651 (plus:DI (ltu:DI (reg:CCL1 CC_REGNUM) (const_int 0))
4652 (match_dup 4)) (match_dup 5)))
4653 (clobber (reg:CC CC_REGNUM))])]
4654 "operands[3] = operand_subword (operands[0], 0, 0, TImode);
4655 operands[4] = operand_subword (operands[1], 0, 0, TImode);
4656 operands[5] = operand_subword (operands[2], 0, 0, TImode);
4657 operands[6] = operand_subword (operands[0], 1, 0, TImode);
4658 operands[7] = operand_subword (operands[1], 1, 0, TImode);
4659 operands[8] = operand_subword (operands[2], 1, 0, TImode);")
4660
4661 ;
4662 ; adddi3 instruction pattern(s).
4663 ;
4664
4665 (define_expand "adddi3"
4666 [(parallel
4667 [(set (match_operand:DI 0 "nonimmediate_operand" "")
4668 (plus:DI (match_operand:DI 1 "nonimmediate_operand" "")
4669 (match_operand:DI 2 "general_operand" "")))
4670 (clobber (reg:CC CC_REGNUM))])]
4671 ""
4672 "")
4673
4674 (define_insn "*adddi3_sign"
4675 [(set (match_operand:DI 0 "register_operand" "=d,d")
4676 (plus:DI (sign_extend:DI (match_operand:SI 2 "general_operand" "d,RT"))
4677 (match_operand:DI 1 "register_operand" "0,0")))
4678 (clobber (reg:CC CC_REGNUM))]
4679 "TARGET_ZARCH"
4680 "@
4681 agfr\t%0,%2
4682 agf\t%0,%2"
4683 [(set_attr "op_type" "RRE,RXY")
4684 (set_attr "z196prop" "z196_cracked,z196_cracked")])
4685
4686 (define_insn "*adddi3_zero_cc"
4687 [(set (reg CC_REGNUM)
4688 (compare (plus:DI (zero_extend:DI (match_operand:SI 2 "general_operand" "d,RT"))
4689 (match_operand:DI 1 "register_operand" "0,0"))
4690 (const_int 0)))
4691 (set (match_operand:DI 0 "register_operand" "=d,d")
4692 (plus:DI (zero_extend:DI (match_dup 2)) (match_dup 1)))]
4693 "s390_match_ccmode (insn, CCLmode) && TARGET_ZARCH"
4694 "@
4695 algfr\t%0,%2
4696 algf\t%0,%2"
4697 [(set_attr "op_type" "RRE,RXY")
4698 (set_attr "z10prop" "z10_super_E1,z10_super_E1")])
4699
4700 (define_insn "*adddi3_zero_cconly"
4701 [(set (reg CC_REGNUM)
4702 (compare (plus:DI (zero_extend:DI (match_operand:SI 2 "general_operand" "d,RT"))
4703 (match_operand:DI 1 "register_operand" "0,0"))
4704 (const_int 0)))
4705 (clobber (match_scratch:DI 0 "=d,d"))]
4706 "s390_match_ccmode (insn, CCLmode) && TARGET_ZARCH"
4707 "@
4708 algfr\t%0,%2
4709 algf\t%0,%2"
4710 [(set_attr "op_type" "RRE,RXY")
4711 (set_attr "z10prop" "z10_super_E1,z10_super_E1")])
4712
4713 (define_insn "*adddi3_zero"
4714 [(set (match_operand:DI 0 "register_operand" "=d,d")
4715 (plus:DI (zero_extend:DI (match_operand:SI 2 "general_operand" "d,RT"))
4716 (match_operand:DI 1 "register_operand" "0,0")))
4717 (clobber (reg:CC CC_REGNUM))]
4718 "TARGET_ZARCH"
4719 "@
4720 algfr\t%0,%2
4721 algf\t%0,%2"
4722 [(set_attr "op_type" "RRE,RXY")
4723 (set_attr "z10prop" "z10_super_E1,z10_super_E1")])
4724
4725 (define_insn_and_split "*adddi3_31z"
4726 [(set (match_operand:DI 0 "nonimmediate_operand" "=&d")
4727 (plus:DI (match_operand:DI 1 "nonimmediate_operand" "%0")
4728 (match_operand:DI 2 "general_operand" "do") ) )
4729 (clobber (reg:CC CC_REGNUM))]
4730 "!TARGET_ZARCH && TARGET_CPU_ZARCH"
4731 "#"
4732 "&& reload_completed"
4733 [(parallel
4734 [(set (reg:CCL1 CC_REGNUM)
4735 (compare:CCL1 (plus:SI (match_dup 7) (match_dup 8))
4736 (match_dup 7)))
4737 (set (match_dup 6) (plus:SI (match_dup 7) (match_dup 8)))])
4738 (parallel
4739 [(set (match_dup 3) (plus:SI
4740 (plus:SI (ltu:SI (reg:CCL1 CC_REGNUM) (const_int 0))
4741 (match_dup 4)) (match_dup 5)))
4742 (clobber (reg:CC CC_REGNUM))])]
4743 "operands[3] = operand_subword (operands[0], 0, 0, DImode);
4744 operands[4] = operand_subword (operands[1], 0, 0, DImode);
4745 operands[5] = operand_subword (operands[2], 0, 0, DImode);
4746 operands[6] = operand_subword (operands[0], 1, 0, DImode);
4747 operands[7] = operand_subword (operands[1], 1, 0, DImode);
4748 operands[8] = operand_subword (operands[2], 1, 0, DImode);")
4749
4750 (define_insn_and_split "*adddi3_31"
4751 [(set (match_operand:DI 0 "nonimmediate_operand" "=&d")
4752 (plus:DI (match_operand:DI 1 "nonimmediate_operand" "%0")
4753 (match_operand:DI 2 "general_operand" "do") ) )
4754 (clobber (reg:CC CC_REGNUM))]
4755 "!TARGET_CPU_ZARCH"
4756 "#"
4757 "&& reload_completed"
4758 [(parallel
4759 [(set (match_dup 3) (plus:SI (match_dup 4) (match_dup 5)))
4760 (clobber (reg:CC CC_REGNUM))])
4761 (parallel
4762 [(set (reg:CCL1 CC_REGNUM)
4763 (compare:CCL1 (plus:SI (match_dup 7) (match_dup 8))
4764 (match_dup 7)))
4765 (set (match_dup 6) (plus:SI (match_dup 7) (match_dup 8)))])
4766 (set (pc)
4767 (if_then_else (ltu (reg:CCL1 CC_REGNUM) (const_int 0))
4768 (pc)
4769 (label_ref (match_dup 9))))
4770 (parallel
4771 [(set (match_dup 3) (plus:SI (match_dup 3) (const_int 1)))
4772 (clobber (reg:CC CC_REGNUM))])
4773 (match_dup 9)]
4774 "operands[3] = operand_subword (operands[0], 0, 0, DImode);
4775 operands[4] = operand_subword (operands[1], 0, 0, DImode);
4776 operands[5] = operand_subword (operands[2], 0, 0, DImode);
4777 operands[6] = operand_subword (operands[0], 1, 0, DImode);
4778 operands[7] = operand_subword (operands[1], 1, 0, DImode);
4779 operands[8] = operand_subword (operands[2], 1, 0, DImode);
4780 operands[9] = gen_label_rtx ();")
4781
4782 ;
4783 ; addsi3 instruction pattern(s).
4784 ;
4785
4786 (define_expand "addsi3"
4787 [(parallel
4788 [(set (match_operand:SI 0 "nonimmediate_operand" "")
4789 (plus:SI (match_operand:SI 1 "nonimmediate_operand" "")
4790 (match_operand:SI 2 "general_operand" "")))
4791 (clobber (reg:CC CC_REGNUM))])]
4792 ""
4793 "")
4794
4795 (define_insn "*addsi3_sign"
4796 [(set (match_operand:SI 0 "register_operand" "=d,d")
4797 (plus:SI (sign_extend:SI (match_operand:HI 2 "memory_operand" "R,T"))
4798 (match_operand:SI 1 "register_operand" "0,0")))
4799 (clobber (reg:CC CC_REGNUM))]
4800 ""
4801 "@
4802 ah\t%0,%2
4803 ahy\t%0,%2"
4804 [(set_attr "op_type" "RX,RXY")
4805 (set_attr "z196prop" "z196_cracked,z196_cracked")])
4806
4807 ;
4808 ; add(di|si)3 instruction pattern(s).
4809 ;
4810
4811 ; ark, agrk, ar, ahi, ahik, aghik, alfi, slfi, a, ay, agr, aghi, algfi, slgfi, ag, asi, agsi
4812 (define_insn "*add<mode>3"
4813 [(set (match_operand:GPR 0 "nonimmediate_operand" "=d,d,d,d, d, d,d,d,QS")
4814 (plus:GPR (match_operand:GPR 1 "nonimmediate_operand" "%0,d,0,d, 0, 0,0,0, 0")
4815 (match_operand:GPR 2 "general_operand" " d,d,K,K,Op,On,R,T, C") ) )
4816 (clobber (reg:CC CC_REGNUM))]
4817 ""
4818 "@
4819 a<g>r\t%0,%2
4820 a<g>rk\t%0,%1,%2
4821 a<g>hi\t%0,%h2
4822 a<g>hik\t%0,%1,%h2
4823 al<g>fi\t%0,%2
4824 sl<g>fi\t%0,%n2
4825 a<g>\t%0,%2
4826 a<y>\t%0,%2
4827 a<g>si\t%0,%c2"
4828 [(set_attr "op_type" "RR<E>,RRF,RI,RIE,RIL,RIL,RX<Y>,RXY,SIY")
4829 (set_attr "cpu_facility" "*,z196,*,z196,extimm,extimm,*,*,z10")
4830 (set_attr "z10prop" "z10_super_E1,*,z10_super_E1,*,z10_super_E1,z10_super_E1,
4831 z10_super_E1,z10_super_E1,z10_super_E1")])
4832
4833 ; alr, alfi, slfi, al, aly, alrk, alhsik, algr, algfi, slgfi, alg, alsi, algsi, algrk, alghsik
4834 (define_insn "*add<mode>3_carry1_cc"
4835 [(set (reg CC_REGNUM)
4836 (compare (plus:GPR (match_operand:GPR 1 "nonimmediate_operand" "%0,d, 0, 0,d,0,0,0")
4837 (match_operand:GPR 2 "general_operand" " d,d,Op,On,K,R,T,C"))
4838 (match_dup 1)))
4839 (set (match_operand:GPR 0 "nonimmediate_operand" "=d,d, d, d,d,d,d,d")
4840 (plus:GPR (match_dup 1) (match_dup 2)))]
4841 "s390_match_ccmode (insn, CCL1mode)"
4842 "@
4843 al<g>r\t%0,%2
4844 al<g>rk\t%0,%1,%2
4845 al<g>fi\t%0,%2
4846 sl<g>fi\t%0,%n2
4847 al<g>hsik\t%0,%1,%h2
4848 al<g>\t%0,%2
4849 al<y>\t%0,%2
4850 al<g>si\t%0,%c2"
4851 [(set_attr "op_type" "RR<E>,RRF,RIL,RIL,RIE,RX<Y>,RXY,SIY")
4852 (set_attr "cpu_facility" "*,z196,extimm,extimm,z196,*,*,z10")
4853 (set_attr "z10prop" "z10_super_E1,*,z10_super_E1,z10_super_E1,*,
4854 z10_super_E1,z10_super_E1,z10_super_E1")])
4855
4856 ; alr, al, aly, algr, alg, alrk, algrk
4857 (define_insn "*add<mode>3_carry1_cconly"
4858 [(set (reg CC_REGNUM)
4859 (compare (plus:GPR (match_operand:GPR 1 "nonimmediate_operand" "%0,d,0,0")
4860 (match_operand:GPR 2 "general_operand" "d,d,R,T"))
4861 (match_dup 1)))
4862 (clobber (match_scratch:GPR 0 "=d,d,d,d"))]
4863 "s390_match_ccmode (insn, CCL1mode)"
4864 "@
4865 al<g>r\t%0,%2
4866 al<g>rk\t%0,%1,%2
4867 al<g>\t%0,%2
4868 al<y>\t%0,%2"
4869 [(set_attr "op_type" "RR<E>,RRF,RX<Y>,RXY")
4870 (set_attr "cpu_facility" "*,z196,*,*")
4871 (set_attr "z10prop" "z10_super_E1,*,z10_super_E1,z10_super_E1")])
4872
4873 ; alr, alfi, slfi, al, aly, algr, algfi, slgfi, alg, alsi, algsi, alrk, algrk, alhsik, alghsik
4874 (define_insn "*add<mode>3_carry2_cc"
4875 [(set (reg CC_REGNUM)
4876 (compare (plus:GPR (match_operand:GPR 1 "nonimmediate_operand" "%0,d, 0, 0,d,0,0, 0")
4877 (match_operand:GPR 2 "general_operand" " d,d,Op,On,K,R,T, C"))
4878 (match_dup 2)))
4879 (set (match_operand:GPR 0 "nonimmediate_operand" "=d,d, d, d,d,d,d,RS")
4880 (plus:GPR (match_dup 1) (match_dup 2)))]
4881 "s390_match_ccmode (insn, CCL1mode)"
4882 "@
4883 al<g>r\t%0,%2
4884 al<g>rk\t%0,%1,%2
4885 al<g>fi\t%0,%2
4886 sl<g>fi\t%0,%n2
4887 al<g>hsik\t%0,%1,%h2
4888 al<g>\t%0,%2
4889 al<y>\t%0,%2
4890 al<g>si\t%0,%c2"
4891 [(set_attr "op_type" "RR<E>,RRF,RIL,RIL,RIE,RX<Y>,RXY,SIY")
4892 (set_attr "cpu_facility" "*,z196,extimm,extimm,z196,*,*,z10")
4893 (set_attr "z10prop" "z10_super_E1,*,z10_super_E1,z10_super_E1,*,
4894 z10_super_E1,z10_super_E1,z10_super_E1")])
4895
4896 ; alr, al, aly, algr, alg, alrk, algrk
4897 (define_insn "*add<mode>3_carry2_cconly"
4898 [(set (reg CC_REGNUM)
4899 (compare (plus:GPR (match_operand:GPR 1 "nonimmediate_operand" "%0,d,0,0")
4900 (match_operand:GPR 2 "general_operand" "d,d,R,T"))
4901 (match_dup 2)))
4902 (clobber (match_scratch:GPR 0 "=d,d,d,d"))]
4903 "s390_match_ccmode (insn, CCL1mode)"
4904 "@
4905 al<g>r\t%0,%2
4906 al<g>rk\t%0,%1,%2
4907 al<g>\t%0,%2
4908 al<y>\t%0,%2"
4909 [(set_attr "op_type" "RR<E>,RRF,RX<Y>,RXY")
4910 (set_attr "cpu_facility" "*,z196,*,*")
4911 (set_attr "z10prop" "z10_super_E1,*,z10_super_E1,z10_super_E1")])
4912
4913 ; alr, alfi, slfi, al, aly, algr, algfi, slgfi, alg, alsi, algsi, alrk, algrk, alhsik, alghsik
4914 (define_insn "*add<mode>3_cc"
4915 [(set (reg CC_REGNUM)
4916 (compare (plus:GPR (match_operand:GPR 1 "nonimmediate_operand" "%0,d, 0, 0,d,0,0, 0")
4917 (match_operand:GPR 2 "general_operand" " d,d,Op,On,K,R,T, C"))
4918 (const_int 0)))
4919 (set (match_operand:GPR 0 "nonimmediate_operand" "=d,d, d, d,d,d,d,RS")
4920 (plus:GPR (match_dup 1) (match_dup 2)))]
4921 "s390_match_ccmode (insn, CCLmode)"
4922 "@
4923 al<g>r\t%0,%2
4924 al<g>rk\t%0,%1,%2
4925 al<g>fi\t%0,%2
4926 sl<g>fi\t%0,%n2
4927 al<g>hsik\t%0,%1,%h2
4928 al<g>\t%0,%2
4929 al<y>\t%0,%2
4930 al<g>si\t%0,%c2"
4931 [(set_attr "op_type" "RR<E>,RRF,RIL,RIL,RIE,RX<Y>,RXY,SIY")
4932 (set_attr "cpu_facility" "*,z196,extimm,extimm,z196,*,*,z10")
4933 (set_attr "z10prop" "z10_super_E1,*,z10_super_E1,z10_super_E1,
4934 *,z10_super_E1,z10_super_E1,z10_super_E1")])
4935
4936 ; alr, al, aly, algr, alg, alrk, algrk
4937 (define_insn "*add<mode>3_cconly"
4938 [(set (reg CC_REGNUM)
4939 (compare (plus:GPR (match_operand:GPR 1 "nonimmediate_operand" "%0,d,0,0")
4940 (match_operand:GPR 2 "general_operand" "d,d,R,T"))
4941 (const_int 0)))
4942 (clobber (match_scratch:GPR 0 "=d,d,d,d"))]
4943 "s390_match_ccmode (insn, CCLmode)"
4944 "@
4945 al<g>r\t%0,%2
4946 al<g>rk\t%0,%1,%2
4947 al<g>\t%0,%2
4948 al<y>\t%0,%2"
4949 [(set_attr "op_type" "RR<E>,RRF,RX<Y>,RXY")
4950 (set_attr "cpu_facility" "*,z196,*,*")
4951 (set_attr "z10prop" "z10_super_E1,*,z10_super_E1,z10_super_E1")])
4952
4953 ; alr, al, aly, algr, alg, alrk, algrk
4954 (define_insn "*add<mode>3_cconly2"
4955 [(set (reg CC_REGNUM)
4956 (compare (match_operand:GPR 1 "nonimmediate_operand" "%0,d,0,0")
4957 (neg:GPR (match_operand:GPR 2 "general_operand" "d,d,R,T"))))
4958 (clobber (match_scratch:GPR 0 "=d,d,d,d"))]
4959 "s390_match_ccmode(insn, CCLmode)"
4960 "@
4961 al<g>r\t%0,%2
4962 al<g>rk\t%0,%1,%2
4963 al<g>\t%0,%2
4964 al<y>\t%0,%2"
4965 [(set_attr "op_type" "RR<E>,RRF,RX<Y>,RXY")
4966 (set_attr "cpu_facility" "*,z196,*,*")
4967 (set_attr "z10prop" "z10_super_E1,*,z10_super_E1,z10_super_E1")])
4968
4969 ; ahi, afi, aghi, agfi, asi, agsi
4970 (define_insn "*add<mode>3_imm_cc"
4971 [(set (reg CC_REGNUM)
4972 (compare (plus:GPR (match_operand:GPR 1 "nonimmediate_operand" " 0, d,0, 0")
4973 (match_operand:GPR 2 "const_int_operand" " K, K,Os, C"))
4974 (const_int 0)))
4975 (set (match_operand:GPR 0 "nonimmediate_operand" "=d, d,d,QS")
4976 (plus:GPR (match_dup 1) (match_dup 2)))]
4977 "s390_match_ccmode (insn, CCAmode)
4978 && (CONST_OK_FOR_CONSTRAINT_P (INTVAL (operands[2]), 'K', \"K\")
4979 || (CONST_OK_FOR_CONSTRAINT_P (INTVAL (operands[2]), 'O', \"Os\")
4980 /* Avoid INT32_MIN on 32 bit. */
4981 && (!TARGET_ZARCH || INTVAL (operands[2]) != -0x7fffffff - 1)))"
4982 "@
4983 a<g>hi\t%0,%h2
4984 a<g>hik\t%0,%1,%h2
4985 a<g>fi\t%0,%2
4986 a<g>si\t%0,%c2"
4987 [(set_attr "op_type" "RI,RIE,RIL,SIY")
4988 (set_attr "cpu_facility" "*,z196,extimm,z10")
4989 (set_attr "z10prop" "z10_super_E1,*,z10_super_E1,z10_super_E1")])
4990
4991 ;
4992 ; add(tf|df|sf|td|dd)3 instruction pattern(s).
4993 ;
4994
4995 ; axbr, adbr, aebr, axb, adb, aeb, adtr, axtr
4996 (define_insn "add<mode>3"
4997 [(set (match_operand:FP 0 "register_operand" "=f, f")
4998 (plus:FP (match_operand:FP 1 "nonimmediate_operand" "%<f0>,0")
4999 (match_operand:FP 2 "general_operand" " f,<Rf>")))
5000 (clobber (reg:CC CC_REGNUM))]
5001 "TARGET_HARD_FLOAT"
5002 "@
5003 a<xde><bt>r\t%0,<op1>%2
5004 a<xde>b\t%0,%2"
5005 [(set_attr "op_type" "<RRer>,RXE")
5006 (set_attr "type" "fsimp<mode>")])
5007
5008 ; axbr, adbr, aebr, axb, adb, aeb, adtr, axtr
5009 (define_insn "*add<mode>3_cc"
5010 [(set (reg CC_REGNUM)
5011 (compare (plus:FP (match_operand:FP 1 "nonimmediate_operand" "%<f0>,0")
5012 (match_operand:FP 2 "general_operand" " f,<Rf>"))
5013 (match_operand:FP 3 "const0_operand" "")))
5014 (set (match_operand:FP 0 "register_operand" "=f,f")
5015 (plus:FP (match_dup 1) (match_dup 2)))]
5016 "s390_match_ccmode (insn, CCSmode) && TARGET_HARD_FLOAT"
5017 "@
5018 a<xde><bt>r\t%0,<op1>%2
5019 a<xde>b\t%0,%2"
5020 [(set_attr "op_type" "<RRer>,RXE")
5021 (set_attr "type" "fsimp<mode>")])
5022
5023 ; axbr, adbr, aebr, axb, adb, aeb, adtr, axtr
5024 (define_insn "*add<mode>3_cconly"
5025 [(set (reg CC_REGNUM)
5026 (compare (plus:FP (match_operand:FP 1 "nonimmediate_operand" "%<f0>,0")
5027 (match_operand:FP 2 "general_operand" " f,<Rf>"))
5028 (match_operand:FP 3 "const0_operand" "")))
5029 (clobber (match_scratch:FP 0 "=f,f"))]
5030 "s390_match_ccmode (insn, CCSmode) && TARGET_HARD_FLOAT"
5031 "@
5032 a<xde><bt>r\t%0,<op1>%2
5033 a<xde>b\t%0,%2"
5034 [(set_attr "op_type" "<RRer>,RXE")
5035 (set_attr "type" "fsimp<mode>")])
5036
5037 ;
5038 ; Pointer add instruction patterns
5039 ;
5040
5041 ; This will match "*la_64"
5042 (define_expand "addptrdi3"
5043 [(set (match_operand:DI 0 "register_operand" "")
5044 (plus:DI (match_operand:DI 1 "register_operand" "")
5045 (match_operand:DI 2 "nonmemory_operand" "")))]
5046 "TARGET_64BIT"
5047 {
5048 HOST_WIDE_INT c = INTVAL (operands[2]);
5049
5050 if (GET_CODE (operands[2]) == CONST_INT)
5051 {
5052 if (!CONST_OK_FOR_CONSTRAINT_P (c, 'K', "K")
5053 && !CONST_OK_FOR_CONSTRAINT_P (c, 'O', "Os"))
5054 {
5055 operands[2] = force_const_mem (DImode, operands[2]);
5056 operands[2] = force_reg (DImode, operands[2]);
5057 }
5058 else if (!DISP_IN_RANGE (INTVAL (operands[2])))
5059 operands[2] = force_reg (DImode, operands[2]);
5060 }
5061 })
5062
5063 ; For 31 bit we have to prevent the generated pattern from matching
5064 ; normal ADDs since la only does a 31 bit add. This is supposed to
5065 ; match "force_la_31".
5066 (define_expand "addptrsi3"
5067 [(parallel
5068 [(set (match_operand:SI 0 "register_operand" "")
5069 (plus:SI (match_operand:SI 1 "register_operand" "")
5070 (match_operand:SI 2 "nonmemory_operand" "")))
5071 (use (const_int 0))])]
5072 "!TARGET_64BIT"
5073 {
5074 HOST_WIDE_INT c = INTVAL (operands[2]);
5075
5076 if (GET_CODE (operands[2]) == CONST_INT)
5077 {
5078 if (!CONST_OK_FOR_CONSTRAINT_P (c, 'K', "K")
5079 && !CONST_OK_FOR_CONSTRAINT_P (c, 'O', "Os"))
5080 {
5081 operands[2] = force_const_mem (SImode, operands[2]);
5082 operands[2] = force_reg (SImode, operands[2]);
5083 }
5084 else if (!DISP_IN_RANGE (INTVAL (operands[2])))
5085 operands[2] = force_reg (SImode, operands[2]);
5086 }
5087 })
5088
5089 ;;
5090 ;;- Subtract instructions.
5091 ;;
5092
5093 ;
5094 ; subti3 instruction pattern(s).
5095 ;
5096
5097 (define_insn_and_split "subti3"
5098 [(set (match_operand:TI 0 "register_operand" "=&d")
5099 (minus:TI (match_operand:TI 1 "register_operand" "0")
5100 (match_operand:TI 2 "general_operand" "do") ) )
5101 (clobber (reg:CC CC_REGNUM))]
5102 "TARGET_ZARCH"
5103 "#"
5104 "&& reload_completed"
5105 [(parallel
5106 [(set (reg:CCL2 CC_REGNUM)
5107 (compare:CCL2 (minus:DI (match_dup 7) (match_dup 8))
5108 (match_dup 7)))
5109 (set (match_dup 6) (minus:DI (match_dup 7) (match_dup 8)))])
5110 (parallel
5111 [(set (match_dup 3) (minus:DI (minus:DI (match_dup 4) (match_dup 5))
5112 (gtu:DI (reg:CCL2 CC_REGNUM) (const_int 0))))
5113 (clobber (reg:CC CC_REGNUM))])]
5114 "operands[3] = operand_subword (operands[0], 0, 0, TImode);
5115 operands[4] = operand_subword (operands[1], 0, 0, TImode);
5116 operands[5] = operand_subword (operands[2], 0, 0, TImode);
5117 operands[6] = operand_subword (operands[0], 1, 0, TImode);
5118 operands[7] = operand_subword (operands[1], 1, 0, TImode);
5119 operands[8] = operand_subword (operands[2], 1, 0, TImode);")
5120
5121 ;
5122 ; subdi3 instruction pattern(s).
5123 ;
5124
5125 (define_expand "subdi3"
5126 [(parallel
5127 [(set (match_operand:DI 0 "register_operand" "")
5128 (minus:DI (match_operand:DI 1 "register_operand" "")
5129 (match_operand:DI 2 "general_operand" "")))
5130 (clobber (reg:CC CC_REGNUM))])]
5131 ""
5132 "")
5133
5134 (define_insn "*subdi3_sign"
5135 [(set (match_operand:DI 0 "register_operand" "=d,d")
5136 (minus:DI (match_operand:DI 1 "register_operand" "0,0")
5137 (sign_extend:DI (match_operand:SI 2 "general_operand" "d,RT"))))
5138 (clobber (reg:CC CC_REGNUM))]
5139 "TARGET_ZARCH"
5140 "@
5141 sgfr\t%0,%2
5142 sgf\t%0,%2"
5143 [(set_attr "op_type" "RRE,RXY")
5144 (set_attr "z10prop" "z10_c,*")
5145 (set_attr "z196prop" "z196_cracked")])
5146
5147 (define_insn "*subdi3_zero_cc"
5148 [(set (reg CC_REGNUM)
5149 (compare (minus:DI (match_operand:DI 1 "register_operand" "0,0")
5150 (zero_extend:DI (match_operand:SI 2 "general_operand" "d,RT")))
5151 (const_int 0)))
5152 (set (match_operand:DI 0 "register_operand" "=d,d")
5153 (minus:DI (match_dup 1) (zero_extend:DI (match_dup 2))))]
5154 "s390_match_ccmode (insn, CCLmode) && TARGET_ZARCH"
5155 "@
5156 slgfr\t%0,%2
5157 slgf\t%0,%2"
5158 [(set_attr "op_type" "RRE,RXY")
5159 (set_attr "z10prop" "z10_super_c_E1,z10_super_E1")])
5160
5161 (define_insn "*subdi3_zero_cconly"
5162 [(set (reg CC_REGNUM)
5163 (compare (minus:DI (match_operand:DI 1 "register_operand" "0,0")
5164 (zero_extend:DI (match_operand:SI 2 "general_operand" "d,RT")))
5165 (const_int 0)))
5166 (clobber (match_scratch:DI 0 "=d,d"))]
5167 "s390_match_ccmode (insn, CCLmode) && TARGET_ZARCH"
5168 "@
5169 slgfr\t%0,%2
5170 slgf\t%0,%2"
5171 [(set_attr "op_type" "RRE,RXY")
5172 (set_attr "z10prop" "z10_super_c_E1,z10_super_E1")])
5173
5174 (define_insn "*subdi3_zero"
5175 [(set (match_operand:DI 0 "register_operand" "=d,d")
5176 (minus:DI (match_operand:DI 1 "register_operand" "0,0")
5177 (zero_extend:DI (match_operand:SI 2 "general_operand" "d,RT"))))
5178 (clobber (reg:CC CC_REGNUM))]
5179 "TARGET_ZARCH"
5180 "@
5181 slgfr\t%0,%2
5182 slgf\t%0,%2"
5183 [(set_attr "op_type" "RRE,RXY")
5184 (set_attr "z10prop" "z10_super_c_E1,z10_super_E1")])
5185
5186 (define_insn_and_split "*subdi3_31z"
5187 [(set (match_operand:DI 0 "register_operand" "=&d")
5188 (minus:DI (match_operand:DI 1 "register_operand" "0")
5189 (match_operand:DI 2 "general_operand" "do") ) )
5190 (clobber (reg:CC CC_REGNUM))]
5191 "!TARGET_ZARCH && TARGET_CPU_ZARCH"
5192 "#"
5193 "&& reload_completed"
5194 [(parallel
5195 [(set (reg:CCL2 CC_REGNUM)
5196 (compare:CCL2 (minus:SI (match_dup 7) (match_dup 8))
5197 (match_dup 7)))
5198 (set (match_dup 6) (minus:SI (match_dup 7) (match_dup 8)))])
5199 (parallel
5200 [(set (match_dup 3) (minus:SI (minus:SI (match_dup 4) (match_dup 5))
5201 (gtu:SI (reg:CCL2 CC_REGNUM) (const_int 0))))
5202 (clobber (reg:CC CC_REGNUM))])]
5203 "operands[3] = operand_subword (operands[0], 0, 0, DImode);
5204 operands[4] = operand_subword (operands[1], 0, 0, DImode);
5205 operands[5] = operand_subword (operands[2], 0, 0, DImode);
5206 operands[6] = operand_subword (operands[0], 1, 0, DImode);
5207 operands[7] = operand_subword (operands[1], 1, 0, DImode);
5208 operands[8] = operand_subword (operands[2], 1, 0, DImode);")
5209
5210 (define_insn_and_split "*subdi3_31"
5211 [(set (match_operand:DI 0 "register_operand" "=&d")
5212 (minus:DI (match_operand:DI 1 "register_operand" "0")
5213 (match_operand:DI 2 "general_operand" "do") ) )
5214 (clobber (reg:CC CC_REGNUM))]
5215 "!TARGET_CPU_ZARCH"
5216 "#"
5217 "&& reload_completed"
5218 [(parallel
5219 [(set (match_dup 3) (minus:SI (match_dup 4) (match_dup 5)))
5220 (clobber (reg:CC CC_REGNUM))])
5221 (parallel
5222 [(set (reg:CCL2 CC_REGNUM)
5223 (compare:CCL2 (minus:SI (match_dup 7) (match_dup 8))
5224 (match_dup 7)))
5225 (set (match_dup 6) (minus:SI (match_dup 7) (match_dup 8)))])
5226 (set (pc)
5227 (if_then_else (gtu (reg:CCL2 CC_REGNUM) (const_int 0))
5228 (pc)
5229 (label_ref (match_dup 9))))
5230 (parallel
5231 [(set (match_dup 3) (plus:SI (match_dup 3) (const_int -1)))
5232 (clobber (reg:CC CC_REGNUM))])
5233 (match_dup 9)]
5234 "operands[3] = operand_subword (operands[0], 0, 0, DImode);
5235 operands[4] = operand_subword (operands[1], 0, 0, DImode);
5236 operands[5] = operand_subword (operands[2], 0, 0, DImode);
5237 operands[6] = operand_subword (operands[0], 1, 0, DImode);
5238 operands[7] = operand_subword (operands[1], 1, 0, DImode);
5239 operands[8] = operand_subword (operands[2], 1, 0, DImode);
5240 operands[9] = gen_label_rtx ();")
5241
5242 ;
5243 ; subsi3 instruction pattern(s).
5244 ;
5245
5246 (define_expand "subsi3"
5247 [(parallel
5248 [(set (match_operand:SI 0 "register_operand" "")
5249 (minus:SI (match_operand:SI 1 "register_operand" "")
5250 (match_operand:SI 2 "general_operand" "")))
5251 (clobber (reg:CC CC_REGNUM))])]
5252 ""
5253 "")
5254
5255 (define_insn "*subsi3_sign"
5256 [(set (match_operand:SI 0 "register_operand" "=d,d")
5257 (minus:SI (match_operand:SI 1 "register_operand" "0,0")
5258 (sign_extend:SI (match_operand:HI 2 "memory_operand" "R,T"))))
5259 (clobber (reg:CC CC_REGNUM))]
5260 ""
5261 "@
5262 sh\t%0,%2
5263 shy\t%0,%2"
5264 [(set_attr "op_type" "RX,RXY")
5265 (set_attr "z196prop" "z196_cracked,z196_cracked")])
5266
5267 ;
5268 ; sub(di|si)3 instruction pattern(s).
5269 ;
5270
5271 ; sr, s, sy, sgr, sg, srk, sgrk
5272 (define_insn "*sub<mode>3"
5273 [(set (match_operand:GPR 0 "register_operand" "=d,d,d,d")
5274 (minus:GPR (match_operand:GPR 1 "register_operand" "0,d,0,0")
5275 (match_operand:GPR 2 "general_operand" "d,d,R,T") ) )
5276 (clobber (reg:CC CC_REGNUM))]
5277 ""
5278 "@
5279 s<g>r\t%0,%2
5280 s<g>rk\t%0,%1,%2
5281 s<g>\t%0,%2
5282 s<y>\t%0,%2"
5283 [(set_attr "op_type" "RR<E>,RRF,RX<Y>,RXY")
5284 (set_attr "cpu_facility" "*,z196,*,*")
5285 (set_attr "z10prop" "z10_super_c_E1,*,z10_super_E1,z10_super_E1")])
5286
5287 ; slr, sl, sly, slgr, slg, slrk, slgrk
5288 (define_insn "*sub<mode>3_borrow_cc"
5289 [(set (reg CC_REGNUM)
5290 (compare (minus:GPR (match_operand:GPR 1 "register_operand" "0,d,0,0")
5291 (match_operand:GPR 2 "general_operand" "d,d,R,T"))
5292 (match_dup 1)))
5293 (set (match_operand:GPR 0 "register_operand" "=d,d,d,d")
5294 (minus:GPR (match_dup 1) (match_dup 2)))]
5295 "s390_match_ccmode (insn, CCL2mode)"
5296 "@
5297 sl<g>r\t%0,%2
5298 sl<g>rk\t%0,%1,%2
5299 sl<g>\t%0,%2
5300 sl<y>\t%0,%2"
5301 [(set_attr "op_type" "RR<E>,RRF,RX<Y>,RXY")
5302 (set_attr "cpu_facility" "*,z196,*,*")
5303 (set_attr "z10prop" "z10_super_c_E1,*,z10_super_E1,z10_super_E1")])
5304
5305 ; slr, sl, sly, slgr, slg, slrk, slgrk
5306 (define_insn "*sub<mode>3_borrow_cconly"
5307 [(set (reg CC_REGNUM)
5308 (compare (minus:GPR (match_operand:GPR 1 "register_operand" "0,d,0,0")
5309 (match_operand:GPR 2 "general_operand" "d,d,R,T"))
5310 (match_dup 1)))
5311 (clobber (match_scratch:GPR 0 "=d,d,d,d"))]
5312 "s390_match_ccmode (insn, CCL2mode)"
5313 "@
5314 sl<g>r\t%0,%2
5315 sl<g>rk\t%0,%1,%2
5316 sl<g>\t%0,%2
5317 sl<y>\t%0,%2"
5318 [(set_attr "op_type" "RR<E>,RRF,RX<Y>,RXY")
5319 (set_attr "cpu_facility" "*,z196,*,*")
5320 (set_attr "z10prop" "z10_super_c_E1,*,z10_super_E1,z10_super_E1")])
5321
5322 ; slr, sl, sly, slgr, slg, slrk, slgrk
5323 (define_insn "*sub<mode>3_cc"
5324 [(set (reg CC_REGNUM)
5325 (compare (minus:GPR (match_operand:GPR 1 "register_operand" "0,d,0,0")
5326 (match_operand:GPR 2 "general_operand" "d,d,R,T"))
5327 (const_int 0)))
5328 (set (match_operand:GPR 0 "register_operand" "=d,d,d,d")
5329 (minus:GPR (match_dup 1) (match_dup 2)))]
5330 "s390_match_ccmode (insn, CCLmode)"
5331 "@
5332 sl<g>r\t%0,%2
5333 sl<g>rk\t%0,%1,%2
5334 sl<g>\t%0,%2
5335 sl<y>\t%0,%2"
5336 [(set_attr "op_type" "RR<E>,RRF,RX<Y>,RXY")
5337 (set_attr "cpu_facility" "*,z196,*,*")
5338 (set_attr "z10prop" "z10_super_c_E1,*,z10_super_E1,z10_super_E1")])
5339
5340 ; slr, sl, sly, slgr, slg, slrk, slgrk
5341 (define_insn "*sub<mode>3_cc2"
5342 [(set (reg CC_REGNUM)
5343 (compare (match_operand:GPR 1 "register_operand" "0,d,0,0")
5344 (match_operand:GPR 2 "general_operand" "d,d,R,T")))
5345 (set (match_operand:GPR 0 "register_operand" "=d,d,d,d")
5346 (minus:GPR (match_dup 1) (match_dup 2)))]
5347 "s390_match_ccmode (insn, CCL3mode)"
5348 "@
5349 sl<g>r\t%0,%2
5350 sl<g>rk\t%0,%1,%2
5351 sl<g>\t%0,%2
5352 sl<y>\t%0,%2"
5353 [(set_attr "op_type" "RR<E>,RRF,RX<Y>,RXY")
5354 (set_attr "cpu_facility" "*,z196,*,*")
5355 (set_attr "z10prop" "z10_super_c_E1,*,z10_super_E1,z10_super_E1")])
5356
5357 ; slr, sl, sly, slgr, slg, slrk, slgrk
5358 (define_insn "*sub<mode>3_cconly"
5359 [(set (reg CC_REGNUM)
5360 (compare (minus:GPR (match_operand:GPR 1 "register_operand" "0,d,0,0")
5361 (match_operand:GPR 2 "general_operand" "d,d,R,T"))
5362 (const_int 0)))
5363 (clobber (match_scratch:GPR 0 "=d,d,d,d"))]
5364 "s390_match_ccmode (insn, CCLmode)"
5365 "@
5366 sl<g>r\t%0,%2
5367 sl<g>rk\t%0,%1,%2
5368 sl<g>\t%0,%2
5369 sl<y>\t%0,%2"
5370 [(set_attr "op_type" "RR<E>,RRF,RX<Y>,RXY")
5371 (set_attr "cpu_facility" "*,z196,*,*")
5372 (set_attr "z10prop" "z10_super_c_E1,*,z10_super_E1,z10_super_E1")])
5373
5374
5375 ; slr, sl, sly, slgr, slg, slrk, slgrk
5376 (define_insn "*sub<mode>3_cconly2"
5377 [(set (reg CC_REGNUM)
5378 (compare (match_operand:GPR 1 "register_operand" "0,d,0,0")
5379 (match_operand:GPR 2 "general_operand" "d,d,R,T")))
5380 (clobber (match_scratch:GPR 0 "=d,d,d,d"))]
5381 "s390_match_ccmode (insn, CCL3mode)"
5382 "@
5383 sl<g>r\t%0,%2
5384 sl<g>rk\t%0,%1,%2
5385 sl<g>\t%0,%2
5386 sl<y>\t%0,%2"
5387 [(set_attr "op_type" "RR<E>,RRF,RX<Y>,RXY")
5388 (set_attr "cpu_facility" "*,z196,*,*")
5389 (set_attr "z10prop" "z10_super_c_E1,*,z10_super_E1,z10_super_E1")])
5390
5391
5392 ;
5393 ; sub(tf|df|sf|td|dd)3 instruction pattern(s).
5394 ;
5395
5396 ; sxbr, sdbr, sebr, sdb, seb, sxtr, sdtr
5397 (define_insn "sub<mode>3"
5398 [(set (match_operand:FP 0 "register_operand" "=f, f")
5399 (minus:FP (match_operand:FP 1 "register_operand" "<f0>,0")
5400 (match_operand:FP 2 "general_operand" "f,<Rf>")))
5401 (clobber (reg:CC CC_REGNUM))]
5402 "TARGET_HARD_FLOAT"
5403 "@
5404 s<xde><bt>r\t%0,<op1>%2
5405 s<xde>b\t%0,%2"
5406 [(set_attr "op_type" "<RRer>,RXE")
5407 (set_attr "type" "fsimp<mode>")])
5408
5409 ; sxbr, sdbr, sebr, sdb, seb, sxtr, sdtr
5410 (define_insn "*sub<mode>3_cc"
5411 [(set (reg CC_REGNUM)
5412 (compare (minus:FP (match_operand:FP 1 "nonimmediate_operand" "<f0>,0")
5413 (match_operand:FP 2 "general_operand" "f,<Rf>"))
5414 (match_operand:FP 3 "const0_operand" "")))
5415 (set (match_operand:FP 0 "register_operand" "=f,f")
5416 (minus:FP (match_dup 1) (match_dup 2)))]
5417 "s390_match_ccmode (insn, CCSmode) && TARGET_HARD_FLOAT"
5418 "@
5419 s<xde><bt>r\t%0,<op1>%2
5420 s<xde>b\t%0,%2"
5421 [(set_attr "op_type" "<RRer>,RXE")
5422 (set_attr "type" "fsimp<mode>")])
5423
5424 ; sxbr, sdbr, sebr, sdb, seb, sxtr, sdtr
5425 (define_insn "*sub<mode>3_cconly"
5426 [(set (reg CC_REGNUM)
5427 (compare (minus:FP (match_operand:FP 1 "nonimmediate_operand" "<f0>,0")
5428 (match_operand:FP 2 "general_operand" "f,<Rf>"))
5429 (match_operand:FP 3 "const0_operand" "")))
5430 (clobber (match_scratch:FP 0 "=f,f"))]
5431 "s390_match_ccmode (insn, CCSmode) && TARGET_HARD_FLOAT"
5432 "@
5433 s<xde><bt>r\t%0,<op1>%2
5434 s<xde>b\t%0,%2"
5435 [(set_attr "op_type" "<RRer>,RXE")
5436 (set_attr "type" "fsimp<mode>")])
5437
5438
5439 ;;
5440 ;;- Conditional add/subtract instructions.
5441 ;;
5442
5443 ;
5444 ; add(di|si)cc instruction pattern(s).
5445 ;
5446
5447 ; the following 4 patterns are used when the result of an add with
5448 ; carry is checked for an overflow condition
5449
5450 ; op1 + op2 + c < op1
5451
5452 ; alcr, alc, alcgr, alcg
5453 (define_insn "*add<mode>3_alc_carry1_cc"
5454 [(set (reg CC_REGNUM)
5455 (compare
5456 (plus:GPR (plus:GPR (match_operand:GPR 3 "s390_alc_comparison" "")
5457 (match_operand:GPR 1 "nonimmediate_operand" "%0,0"))
5458 (match_operand:GPR 2 "general_operand" "d,RT"))
5459 (match_dup 1)))
5460 (set (match_operand:GPR 0 "register_operand" "=d,d")
5461 (plus:GPR (plus:GPR (match_dup 3) (match_dup 1)) (match_dup 2)))]
5462 "s390_match_ccmode (insn, CCL1mode) && TARGET_CPU_ZARCH"
5463 "@
5464 alc<g>r\t%0,%2
5465 alc<g>\t%0,%2"
5466 [(set_attr "op_type" "RRE,RXY")
5467 (set_attr "z196prop" "z196_alone,z196_alone")])
5468
5469 ; alcr, alc, alcgr, alcg
5470 (define_insn "*add<mode>3_alc_carry1_cconly"
5471 [(set (reg CC_REGNUM)
5472 (compare
5473 (plus:GPR (plus:GPR (match_operand:GPR 3 "s390_alc_comparison" "")
5474 (match_operand:GPR 1 "nonimmediate_operand" "%0,0"))
5475 (match_operand:GPR 2 "general_operand" "d,RT"))
5476 (match_dup 1)))
5477 (clobber (match_scratch:GPR 0 "=d,d"))]
5478 "s390_match_ccmode (insn, CCL1mode) && TARGET_CPU_ZARCH"
5479 "@
5480 alc<g>r\t%0,%2
5481 alc<g>\t%0,%2"
5482 [(set_attr "op_type" "RRE,RXY")
5483 (set_attr "z196prop" "z196_alone,z196_alone")])
5484
5485 ; op1 + op2 + c < op2
5486
5487 ; alcr, alc, alcgr, alcg
5488 (define_insn "*add<mode>3_alc_carry2_cc"
5489 [(set (reg CC_REGNUM)
5490 (compare
5491 (plus:GPR (plus:GPR (match_operand:GPR 3 "s390_alc_comparison" "")
5492 (match_operand:GPR 1 "nonimmediate_operand" "%0,0"))
5493 (match_operand:GPR 2 "general_operand" "d,RT"))
5494 (match_dup 2)))
5495 (set (match_operand:GPR 0 "register_operand" "=d,d")
5496 (plus:GPR (plus:GPR (match_dup 3) (match_dup 1)) (match_dup 2)))]
5497 "s390_match_ccmode (insn, CCL1mode) && TARGET_CPU_ZARCH"
5498 "@
5499 alc<g>r\t%0,%2
5500 alc<g>\t%0,%2"
5501 [(set_attr "op_type" "RRE,RXY")])
5502
5503 ; alcr, alc, alcgr, alcg
5504 (define_insn "*add<mode>3_alc_carry2_cconly"
5505 [(set (reg CC_REGNUM)
5506 (compare
5507 (plus:GPR (plus:GPR (match_operand:GPR 3 "s390_alc_comparison" "")
5508 (match_operand:GPR 1 "nonimmediate_operand" "%0,0"))
5509 (match_operand:GPR 2 "general_operand" "d,RT"))
5510 (match_dup 2)))
5511 (clobber (match_scratch:GPR 0 "=d,d"))]
5512 "s390_match_ccmode (insn, CCL1mode) && TARGET_CPU_ZARCH"
5513 "@
5514 alc<g>r\t%0,%2
5515 alc<g>\t%0,%2"
5516 [(set_attr "op_type" "RRE,RXY")])
5517
5518 ; alcr, alc, alcgr, alcg
5519 (define_insn "*add<mode>3_alc_cc"
5520 [(set (reg CC_REGNUM)
5521 (compare
5522 (plus:GPR (plus:GPR (match_operand:GPR 3 "s390_alc_comparison" "")
5523 (match_operand:GPR 1 "nonimmediate_operand" "%0,0"))
5524 (match_operand:GPR 2 "general_operand" "d,RT"))
5525 (const_int 0)))
5526 (set (match_operand:GPR 0 "register_operand" "=d,d")
5527 (plus:GPR (plus:GPR (match_dup 3) (match_dup 1)) (match_dup 2)))]
5528 "s390_match_ccmode (insn, CCLmode) && TARGET_CPU_ZARCH"
5529 "@
5530 alc<g>r\t%0,%2
5531 alc<g>\t%0,%2"
5532 [(set_attr "op_type" "RRE,RXY")])
5533
5534 ; alcr, alc, alcgr, alcg
5535 (define_insn "*add<mode>3_alc"
5536 [(set (match_operand:GPR 0 "register_operand" "=d,d")
5537 (plus:GPR (plus:GPR (match_operand:GPR 3 "s390_alc_comparison" "")
5538 (match_operand:GPR 1 "nonimmediate_operand" "%0,0"))
5539 (match_operand:GPR 2 "general_operand" "d,RT")))
5540 (clobber (reg:CC CC_REGNUM))]
5541 "TARGET_CPU_ZARCH"
5542 "@
5543 alc<g>r\t%0,%2
5544 alc<g>\t%0,%2"
5545 [(set_attr "op_type" "RRE,RXY")])
5546
5547 ; slbr, slb, slbgr, slbg
5548 (define_insn "*sub<mode>3_slb_cc"
5549 [(set (reg CC_REGNUM)
5550 (compare
5551 (minus:GPR (minus:GPR (match_operand:GPR 1 "nonimmediate_operand" "0,0")
5552 (match_operand:GPR 2 "general_operand" "d,RT"))
5553 (match_operand:GPR 3 "s390_slb_comparison" ""))
5554 (const_int 0)))
5555 (set (match_operand:GPR 0 "register_operand" "=d,d")
5556 (minus:GPR (minus:GPR (match_dup 1) (match_dup 2)) (match_dup 3)))]
5557 "s390_match_ccmode (insn, CCLmode) && TARGET_CPU_ZARCH"
5558 "@
5559 slb<g>r\t%0,%2
5560 slb<g>\t%0,%2"
5561 [(set_attr "op_type" "RRE,RXY")
5562 (set_attr "z10prop" "z10_c,*")])
5563
5564 ; slbr, slb, slbgr, slbg
5565 (define_insn "*sub<mode>3_slb"
5566 [(set (match_operand:GPR 0 "register_operand" "=d,d")
5567 (minus:GPR (minus:GPR (match_operand:GPR 1 "nonimmediate_operand" "0,0")
5568 (match_operand:GPR 2 "general_operand" "d,RT"))
5569 (match_operand:GPR 3 "s390_slb_comparison" "")))
5570 (clobber (reg:CC CC_REGNUM))]
5571 "TARGET_CPU_ZARCH"
5572 "@
5573 slb<g>r\t%0,%2
5574 slb<g>\t%0,%2"
5575 [(set_attr "op_type" "RRE,RXY")
5576 (set_attr "z10prop" "z10_c,*")])
5577
5578 (define_expand "add<mode>cc"
5579 [(match_operand:GPR 0 "register_operand" "")
5580 (match_operand 1 "comparison_operator" "")
5581 (match_operand:GPR 2 "register_operand" "")
5582 (match_operand:GPR 3 "const_int_operand" "")]
5583 "TARGET_CPU_ZARCH"
5584 "if (!s390_expand_addcc (GET_CODE (operands[1]),
5585 XEXP (operands[1], 0), XEXP (operands[1], 1),
5586 operands[0], operands[2],
5587 operands[3])) FAIL; DONE;")
5588
5589 ;
5590 ; scond instruction pattern(s).
5591 ;
5592
5593 (define_insn_and_split "*scond<mode>"
5594 [(set (match_operand:GPR 0 "register_operand" "=&d")
5595 (match_operand:GPR 1 "s390_alc_comparison" ""))
5596 (clobber (reg:CC CC_REGNUM))]
5597 "TARGET_CPU_ZARCH"
5598 "#"
5599 "&& reload_completed"
5600 [(set (match_dup 0) (const_int 0))
5601 (parallel
5602 [(set (match_dup 0) (plus:GPR (plus:GPR (match_dup 1) (match_dup 0))
5603 (match_dup 0)))
5604 (clobber (reg:CC CC_REGNUM))])]
5605 "")
5606
5607 (define_insn_and_split "*scond<mode>_neg"
5608 [(set (match_operand:GPR 0 "register_operand" "=&d")
5609 (match_operand:GPR 1 "s390_slb_comparison" ""))
5610 (clobber (reg:CC CC_REGNUM))]
5611 "TARGET_CPU_ZARCH"
5612 "#"
5613 "&& reload_completed"
5614 [(set (match_dup 0) (const_int 0))
5615 (parallel
5616 [(set (match_dup 0) (minus:GPR (minus:GPR (match_dup 0) (match_dup 0))
5617 (match_dup 1)))
5618 (clobber (reg:CC CC_REGNUM))])
5619 (parallel
5620 [(set (match_dup 0) (neg:GPR (match_dup 0)))
5621 (clobber (reg:CC CC_REGNUM))])]
5622 "")
5623
5624
5625 (define_expand "cstore<mode>4"
5626 [(set (match_operand:SI 0 "register_operand" "")
5627 (match_operator:SI 1 "s390_scond_operator"
5628 [(match_operand:GPR 2 "register_operand" "")
5629 (match_operand:GPR 3 "general_operand" "")]))]
5630 "TARGET_CPU_ZARCH"
5631 "if (!s390_expand_addcc (GET_CODE (operands[1]), operands[2], operands[3],
5632 operands[0], const0_rtx, const1_rtx)) FAIL; DONE;")
5633
5634 (define_expand "cstorecc4"
5635 [(parallel
5636 [(set (match_operand:SI 0 "register_operand" "")
5637 (match_operator:SI 1 "s390_eqne_operator"
5638 [(match_operand:CCZ1 2 "register_operand")
5639 (match_operand 3 "const0_operand")]))
5640 (clobber (reg:CC CC_REGNUM))])]
5641 ""
5642 "emit_insn (gen_sne (operands[0], operands[2]));
5643 if (GET_CODE (operands[1]) == EQ)
5644 emit_insn (gen_xorsi3 (operands[0], operands[0], const1_rtx));
5645 DONE;")
5646
5647 (define_insn_and_split "sne"
5648 [(set (match_operand:SI 0 "register_operand" "=d")
5649 (ne:SI (match_operand:CCZ1 1 "register_operand" "0")
5650 (const_int 0)))
5651 (clobber (reg:CC CC_REGNUM))]
5652 ""
5653 "#"
5654 "reload_completed"
5655 [(parallel
5656 [(set (match_dup 0) (ashiftrt:SI (match_dup 0) (const_int 28)))
5657 (clobber (reg:CC CC_REGNUM))])])
5658
5659
5660 ;;
5661 ;; - Conditional move instructions (introduced with z196)
5662 ;;
5663
5664 (define_expand "mov<mode>cc"
5665 [(set (match_operand:GPR 0 "nonimmediate_operand" "")
5666 (if_then_else:GPR (match_operand 1 "comparison_operator" "")
5667 (match_operand:GPR 2 "nonimmediate_operand" "")
5668 (match_operand:GPR 3 "nonimmediate_operand" "")))]
5669 "TARGET_Z196"
5670 "operands[1] = s390_emit_compare (GET_CODE (operands[1]),
5671 XEXP (operands[1], 0), XEXP (operands[1], 1));")
5672
5673 ; locr, loc, stoc, locgr, locg, stocg
5674 (define_insn_and_split "*mov<mode>cc"
5675 [(set (match_operand:GPR 0 "nonimmediate_operand" "=d,d, d, d,QS,QS,&d")
5676 (if_then_else:GPR
5677 (match_operator 1 "s390_comparison"
5678 [(match_operand 2 "cc_reg_operand" " c,c, c, c, c, c, c")
5679 (match_operand 5 "const_int_operand" "")])
5680 (match_operand:GPR 3 "nonimmediate_operand" " d,0,QS, 0, d, 0,QS")
5681 (match_operand:GPR 4 "nonimmediate_operand" " 0,d, 0,QS, 0, d,QS")))]
5682 "TARGET_Z196"
5683 "@
5684 loc<g>r%C1\t%0,%3
5685 loc<g>r%D1\t%0,%4
5686 loc<g>%C1\t%0,%3
5687 loc<g>%D1\t%0,%4
5688 stoc<g>%C1\t%3,%0
5689 stoc<g>%D1\t%4,%0
5690 #"
5691 "&& reload_completed
5692 && MEM_P (operands[3]) && MEM_P (operands[4])"
5693 [(set (match_dup 0)
5694 (if_then_else:GPR
5695 (match_op_dup 1 [(match_dup 2) (const_int 0)])
5696 (match_dup 3)
5697 (match_dup 0)))
5698 (set (match_dup 0)
5699 (if_then_else:GPR
5700 (match_op_dup 1 [(match_dup 2) (const_int 0)])
5701 (match_dup 0)
5702 (match_dup 4)))]
5703 ""
5704 [(set_attr "op_type" "RRF,RRF,RSY,RSY,RSY,RSY,*")])
5705
5706 ;;
5707 ;;- Multiply instructions.
5708 ;;
5709
5710 ;
5711 ; muldi3 instruction pattern(s).
5712 ;
5713
5714 (define_insn "*muldi3_sign"
5715 [(set (match_operand:DI 0 "register_operand" "=d,d")
5716 (mult:DI (sign_extend:DI (match_operand:SI 2 "general_operand" "d,RT"))
5717 (match_operand:DI 1 "register_operand" "0,0")))]
5718 "TARGET_ZARCH"
5719 "@
5720 msgfr\t%0,%2
5721 msgf\t%0,%2"
5722 [(set_attr "op_type" "RRE,RXY")
5723 (set_attr "type" "imuldi")])
5724
5725 (define_insn "muldi3"
5726 [(set (match_operand:DI 0 "register_operand" "=d,d,d,d")
5727 (mult:DI (match_operand:DI 1 "nonimmediate_operand" "%0,0,0,0")
5728 (match_operand:DI 2 "general_operand" "d,K,RT,Os")))]
5729 "TARGET_ZARCH"
5730 "@
5731 msgr\t%0,%2
5732 mghi\t%0,%h2
5733 msg\t%0,%2
5734 msgfi\t%0,%2"
5735 [(set_attr "op_type" "RRE,RI,RXY,RIL")
5736 (set_attr "type" "imuldi")
5737 (set_attr "cpu_facility" "*,*,*,z10")])
5738
5739 ;
5740 ; mulsi3 instruction pattern(s).
5741 ;
5742
5743 (define_insn "*mulsi3_sign"
5744 [(set (match_operand:SI 0 "register_operand" "=d,d")
5745 (mult:SI (sign_extend:SI (match_operand:HI 2 "memory_operand" "R,T"))
5746 (match_operand:SI 1 "register_operand" "0,0")))]
5747 ""
5748 "@
5749 mh\t%0,%2
5750 mhy\t%0,%2"
5751 [(set_attr "op_type" "RX,RXY")
5752 (set_attr "type" "imulhi")
5753 (set_attr "cpu_facility" "*,z10")])
5754
5755 (define_insn "mulsi3"
5756 [(set (match_operand:SI 0 "register_operand" "=d,d,d,d,d")
5757 (mult:SI (match_operand:SI 1 "nonimmediate_operand" "%0,0,0,0,0")
5758 (match_operand:SI 2 "general_operand" "d,K,R,T,Os")))]
5759 ""
5760 "@
5761 msr\t%0,%2
5762 mhi\t%0,%h2
5763 ms\t%0,%2
5764 msy\t%0,%2
5765 msfi\t%0,%2"
5766 [(set_attr "op_type" "RRE,RI,RX,RXY,RIL")
5767 (set_attr "type" "imulsi,imulhi,imulsi,imulsi,imulsi")
5768 (set_attr "cpu_facility" "*,*,*,*,z10")])
5769
5770 ;
5771 ; mulsidi3 instruction pattern(s).
5772 ;
5773
5774 (define_insn "mulsidi3"
5775 [(set (match_operand:DI 0 "register_operand" "=d,d,d")
5776 (mult:DI (sign_extend:DI
5777 (match_operand:SI 1 "register_operand" "%0,0,0"))
5778 (sign_extend:DI
5779 (match_operand:SI 2 "nonimmediate_operand" "d,R,T"))))]
5780 "!TARGET_ZARCH"
5781 "@
5782 mr\t%0,%2
5783 m\t%0,%2
5784 mfy\t%0,%2"
5785 [(set_attr "op_type" "RR,RX,RXY")
5786 (set_attr "type" "imulsi")
5787 (set_attr "cpu_facility" "*,*,z10")])
5788
5789 ;
5790 ; umul instruction pattern(s).
5791 ;
5792
5793 ; mlr, ml, mlgr, mlg
5794 (define_insn "umul<dwh><mode>3"
5795 [(set (match_operand:DW 0 "register_operand" "=d, d")
5796 (mult:DW (zero_extend:DW
5797 (match_operand:<DWH> 1 "register_operand" "%0, 0"))
5798 (zero_extend:DW
5799 (match_operand:<DWH> 2 "nonimmediate_operand" " d,RT"))))]
5800 "TARGET_CPU_ZARCH"
5801 "@
5802 ml<tg>r\t%0,%2
5803 ml<tg>\t%0,%2"
5804 [(set_attr "op_type" "RRE,RXY")
5805 (set_attr "type" "imul<dwh>")])
5806
5807 ;
5808 ; mul(tf|df|sf|td|dd)3 instruction pattern(s).
5809 ;
5810
5811 ; mxbr, mdbr, meebr, mxb, mxb, meeb, mdtr, mxtr
5812 (define_insn "mul<mode>3"
5813 [(set (match_operand:FP 0 "register_operand" "=f,f")
5814 (mult:FP (match_operand:FP 1 "nonimmediate_operand" "%<f0>,0")
5815 (match_operand:FP 2 "general_operand" "f,<Rf>")))]
5816 "TARGET_HARD_FLOAT"
5817 "@
5818 m<xdee><bt>r\t%0,<op1>%2
5819 m<xdee>b\t%0,%2"
5820 [(set_attr "op_type" "<RRer>,RXE")
5821 (set_attr "type" "fmul<mode>")])
5822
5823 ; madbr, maebr, maxb, madb, maeb
5824 (define_insn "fma<mode>4"
5825 [(set (match_operand:DSF 0 "register_operand" "=f,f")
5826 (fma:DSF (match_operand:DSF 1 "nonimmediate_operand" "%f,f")
5827 (match_operand:DSF 2 "nonimmediate_operand" "f,R")
5828 (match_operand:DSF 3 "register_operand" "0,0")))]
5829 "TARGET_HARD_FLOAT"
5830 "@
5831 ma<xde>br\t%0,%1,%2
5832 ma<xde>b\t%0,%1,%2"
5833 [(set_attr "op_type" "RRE,RXE")
5834 (set_attr "type" "fmadd<mode>")])
5835
5836 ; msxbr, msdbr, msebr, msxb, msdb, mseb
5837 (define_insn "fms<mode>4"
5838 [(set (match_operand:DSF 0 "register_operand" "=f,f")
5839 (fma:DSF (match_operand:DSF 1 "nonimmediate_operand" "%f,f")
5840 (match_operand:DSF 2 "nonimmediate_operand" "f,R")
5841 (neg:DSF (match_operand:DSF 3 "register_operand" "0,0"))))]
5842 "TARGET_HARD_FLOAT"
5843 "@
5844 ms<xde>br\t%0,%1,%2
5845 ms<xde>b\t%0,%1,%2"
5846 [(set_attr "op_type" "RRE,RXE")
5847 (set_attr "type" "fmadd<mode>")])
5848
5849 ;;
5850 ;;- Divide and modulo instructions.
5851 ;;
5852
5853 ;
5854 ; divmoddi4 instruction pattern(s).
5855 ;
5856
5857 (define_expand "divmoddi4"
5858 [(parallel [(set (match_operand:DI 0 "general_operand" "")
5859 (div:DI (match_operand:DI 1 "register_operand" "")
5860 (match_operand:DI 2 "general_operand" "")))
5861 (set (match_operand:DI 3 "general_operand" "")
5862 (mod:DI (match_dup 1) (match_dup 2)))])
5863 (clobber (match_dup 4))]
5864 "TARGET_ZARCH"
5865 {
5866 rtx insn, div_equal, mod_equal;
5867
5868 div_equal = gen_rtx_DIV (DImode, operands[1], operands[2]);
5869 mod_equal = gen_rtx_MOD (DImode, operands[1], operands[2]);
5870
5871 operands[4] = gen_reg_rtx(TImode);
5872 emit_insn (gen_divmodtidi3 (operands[4], operands[1], operands[2]));
5873
5874 insn = emit_move_insn (operands[0], gen_lowpart (DImode, operands[4]));
5875 set_unique_reg_note (insn, REG_EQUAL, div_equal);
5876
5877 insn = emit_move_insn (operands[3], gen_highpart (DImode, operands[4]));
5878 set_unique_reg_note (insn, REG_EQUAL, mod_equal);
5879
5880 DONE;
5881 })
5882
5883 (define_insn "divmodtidi3"
5884 [(set (match_operand:TI 0 "register_operand" "=d,d")
5885 (ior:TI
5886 (ashift:TI
5887 (zero_extend:TI
5888 (mod:DI (match_operand:DI 1 "register_operand" "0,0")
5889 (match_operand:DI 2 "general_operand" "d,RT")))
5890 (const_int 64))
5891 (zero_extend:TI (div:DI (match_dup 1) (match_dup 2)))))]
5892 "TARGET_ZARCH"
5893 "@
5894 dsgr\t%0,%2
5895 dsg\t%0,%2"
5896 [(set_attr "op_type" "RRE,RXY")
5897 (set_attr "type" "idiv")])
5898
5899 (define_insn "divmodtisi3"
5900 [(set (match_operand:TI 0 "register_operand" "=d,d")
5901 (ior:TI
5902 (ashift:TI
5903 (zero_extend:TI
5904 (mod:DI (match_operand:DI 1 "register_operand" "0,0")
5905 (sign_extend:DI
5906 (match_operand:SI 2 "nonimmediate_operand" "d,RT"))))
5907 (const_int 64))
5908 (zero_extend:TI
5909 (div:DI (match_dup 1) (sign_extend:DI (match_dup 2))))))]
5910 "TARGET_ZARCH"
5911 "@
5912 dsgfr\t%0,%2
5913 dsgf\t%0,%2"
5914 [(set_attr "op_type" "RRE,RXY")
5915 (set_attr "type" "idiv")])
5916
5917 ;
5918 ; udivmoddi4 instruction pattern(s).
5919 ;
5920
5921 (define_expand "udivmoddi4"
5922 [(parallel [(set (match_operand:DI 0 "general_operand" "")
5923 (udiv:DI (match_operand:DI 1 "general_operand" "")
5924 (match_operand:DI 2 "nonimmediate_operand" "")))
5925 (set (match_operand:DI 3 "general_operand" "")
5926 (umod:DI (match_dup 1) (match_dup 2)))])
5927 (clobber (match_dup 4))]
5928 "TARGET_ZARCH"
5929 {
5930 rtx insn, div_equal, mod_equal, equal;
5931
5932 div_equal = gen_rtx_UDIV (DImode, operands[1], operands[2]);
5933 mod_equal = gen_rtx_UMOD (DImode, operands[1], operands[2]);
5934 equal = gen_rtx_IOR (TImode,
5935 gen_rtx_ASHIFT (TImode,
5936 gen_rtx_ZERO_EXTEND (TImode, mod_equal),
5937 GEN_INT (64)),
5938 gen_rtx_ZERO_EXTEND (TImode, div_equal));
5939
5940 operands[4] = gen_reg_rtx(TImode);
5941 emit_clobber (operands[4]);
5942 emit_move_insn (gen_lowpart (DImode, operands[4]), operands[1]);
5943 emit_move_insn (gen_highpart (DImode, operands[4]), const0_rtx);
5944
5945 insn = emit_insn (gen_udivmodtidi3 (operands[4], operands[4], operands[2]));
5946 set_unique_reg_note (insn, REG_EQUAL, equal);
5947
5948 insn = emit_move_insn (operands[0], gen_lowpart (DImode, operands[4]));
5949 set_unique_reg_note (insn, REG_EQUAL, div_equal);
5950
5951 insn = emit_move_insn (operands[3], gen_highpart (DImode, operands[4]));
5952 set_unique_reg_note (insn, REG_EQUAL, mod_equal);
5953
5954 DONE;
5955 })
5956
5957 (define_insn "udivmodtidi3"
5958 [(set (match_operand:TI 0 "register_operand" "=d,d")
5959 (ior:TI
5960 (ashift:TI
5961 (zero_extend:TI
5962 (truncate:DI
5963 (umod:TI (match_operand:TI 1 "register_operand" "0,0")
5964 (zero_extend:TI
5965 (match_operand:DI 2 "nonimmediate_operand" "d,RT")))))
5966 (const_int 64))
5967 (zero_extend:TI
5968 (truncate:DI
5969 (udiv:TI (match_dup 1) (zero_extend:TI (match_dup 2)))))))]
5970 "TARGET_ZARCH"
5971 "@
5972 dlgr\t%0,%2
5973 dlg\t%0,%2"
5974 [(set_attr "op_type" "RRE,RXY")
5975 (set_attr "type" "idiv")])
5976
5977 ;
5978 ; divmodsi4 instruction pattern(s).
5979 ;
5980
5981 (define_expand "divmodsi4"
5982 [(parallel [(set (match_operand:SI 0 "general_operand" "")
5983 (div:SI (match_operand:SI 1 "general_operand" "")
5984 (match_operand:SI 2 "nonimmediate_operand" "")))
5985 (set (match_operand:SI 3 "general_operand" "")
5986 (mod:SI (match_dup 1) (match_dup 2)))])
5987 (clobber (match_dup 4))]
5988 "!TARGET_ZARCH"
5989 {
5990 rtx insn, div_equal, mod_equal, equal;
5991
5992 div_equal = gen_rtx_DIV (SImode, operands[1], operands[2]);
5993 mod_equal = gen_rtx_MOD (SImode, operands[1], operands[2]);
5994 equal = gen_rtx_IOR (DImode,
5995 gen_rtx_ASHIFT (DImode,
5996 gen_rtx_ZERO_EXTEND (DImode, mod_equal),
5997 GEN_INT (32)),
5998 gen_rtx_ZERO_EXTEND (DImode, div_equal));
5999
6000 operands[4] = gen_reg_rtx(DImode);
6001 emit_insn (gen_extendsidi2 (operands[4], operands[1]));
6002
6003 insn = emit_insn (gen_divmoddisi3 (operands[4], operands[4], operands[2]));
6004 set_unique_reg_note (insn, REG_EQUAL, equal);
6005
6006 insn = emit_move_insn (operands[0], gen_lowpart (SImode, operands[4]));
6007 set_unique_reg_note (insn, REG_EQUAL, div_equal);
6008
6009 insn = emit_move_insn (operands[3], gen_highpart (SImode, operands[4]));
6010 set_unique_reg_note (insn, REG_EQUAL, mod_equal);
6011
6012 DONE;
6013 })
6014
6015 (define_insn "divmoddisi3"
6016 [(set (match_operand:DI 0 "register_operand" "=d,d")
6017 (ior:DI
6018 (ashift:DI
6019 (zero_extend:DI
6020 (truncate:SI
6021 (mod:DI (match_operand:DI 1 "register_operand" "0,0")
6022 (sign_extend:DI
6023 (match_operand:SI 2 "nonimmediate_operand" "d,R")))))
6024 (const_int 32))
6025 (zero_extend:DI
6026 (truncate:SI
6027 (div:DI (match_dup 1) (sign_extend:DI (match_dup 2)))))))]
6028 "!TARGET_ZARCH"
6029 "@
6030 dr\t%0,%2
6031 d\t%0,%2"
6032 [(set_attr "op_type" "RR,RX")
6033 (set_attr "type" "idiv")])
6034
6035 ;
6036 ; udivsi3 and umodsi3 instruction pattern(s).
6037 ;
6038
6039 (define_expand "udivmodsi4"
6040 [(parallel [(set (match_operand:SI 0 "general_operand" "")
6041 (udiv:SI (match_operand:SI 1 "general_operand" "")
6042 (match_operand:SI 2 "nonimmediate_operand" "")))
6043 (set (match_operand:SI 3 "general_operand" "")
6044 (umod:SI (match_dup 1) (match_dup 2)))])
6045 (clobber (match_dup 4))]
6046 "!TARGET_ZARCH && TARGET_CPU_ZARCH"
6047 {
6048 rtx insn, div_equal, mod_equal, equal;
6049
6050 div_equal = gen_rtx_UDIV (SImode, operands[1], operands[2]);
6051 mod_equal = gen_rtx_UMOD (SImode, operands[1], operands[2]);
6052 equal = gen_rtx_IOR (DImode,
6053 gen_rtx_ASHIFT (DImode,
6054 gen_rtx_ZERO_EXTEND (DImode, mod_equal),
6055 GEN_INT (32)),
6056 gen_rtx_ZERO_EXTEND (DImode, div_equal));
6057
6058 operands[4] = gen_reg_rtx(DImode);
6059 emit_clobber (operands[4]);
6060 emit_move_insn (gen_lowpart (SImode, operands[4]), operands[1]);
6061 emit_move_insn (gen_highpart (SImode, operands[4]), const0_rtx);
6062
6063 insn = emit_insn (gen_udivmoddisi3 (operands[4], operands[4], operands[2]));
6064 set_unique_reg_note (insn, REG_EQUAL, equal);
6065
6066 insn = emit_move_insn (operands[0], gen_lowpart (SImode, operands[4]));
6067 set_unique_reg_note (insn, REG_EQUAL, div_equal);
6068
6069 insn = emit_move_insn (operands[3], gen_highpart (SImode, operands[4]));
6070 set_unique_reg_note (insn, REG_EQUAL, mod_equal);
6071
6072 DONE;
6073 })
6074
6075 (define_insn "udivmoddisi3"
6076 [(set (match_operand:DI 0 "register_operand" "=d,d")
6077 (ior:DI
6078 (ashift:DI
6079 (zero_extend:DI
6080 (truncate:SI
6081 (umod:DI (match_operand:DI 1 "register_operand" "0,0")
6082 (zero_extend:DI
6083 (match_operand:SI 2 "nonimmediate_operand" "d,RT")))))
6084 (const_int 32))
6085 (zero_extend:DI
6086 (truncate:SI
6087 (udiv:DI (match_dup 1) (zero_extend:DI (match_dup 2)))))))]
6088 "!TARGET_ZARCH && TARGET_CPU_ZARCH"
6089 "@
6090 dlr\t%0,%2
6091 dl\t%0,%2"
6092 [(set_attr "op_type" "RRE,RXY")
6093 (set_attr "type" "idiv")])
6094
6095 (define_expand "udivsi3"
6096 [(set (match_operand:SI 0 "register_operand" "=d")
6097 (udiv:SI (match_operand:SI 1 "general_operand" "")
6098 (match_operand:SI 2 "general_operand" "")))
6099 (clobber (match_dup 3))]
6100 "!TARGET_ZARCH && !TARGET_CPU_ZARCH"
6101 {
6102 rtx insn, udiv_equal, umod_equal, equal;
6103
6104 udiv_equal = gen_rtx_UDIV (SImode, operands[1], operands[2]);
6105 umod_equal = gen_rtx_UMOD (SImode, operands[1], operands[2]);
6106 equal = gen_rtx_IOR (DImode,
6107 gen_rtx_ASHIFT (DImode,
6108 gen_rtx_ZERO_EXTEND (DImode, umod_equal),
6109 GEN_INT (32)),
6110 gen_rtx_ZERO_EXTEND (DImode, udiv_equal));
6111
6112 operands[3] = gen_reg_rtx (DImode);
6113
6114 if (CONSTANT_P (operands[2]))
6115 {
6116 if (GET_CODE (operands[2]) == CONST_INT && INTVAL (operands[2]) < 0)
6117 {
6118 rtx label1 = gen_label_rtx ();
6119
6120 operands[1] = make_safe_from (operands[1], operands[0]);
6121 emit_move_insn (operands[0], const0_rtx);
6122 emit_cmp_and_jump_insns (operands[1], operands[2], LT, NULL_RTX,
6123 SImode, 1, label1);
6124 emit_move_insn (operands[0], const1_rtx);
6125 emit_label (label1);
6126 }
6127 else
6128 {
6129 operands[2] = force_reg (SImode, operands[2]);
6130 operands[2] = make_safe_from (operands[2], operands[0]);
6131
6132 emit_insn (gen_zero_extendsidi2 (operands[3], operands[1]));
6133 insn = emit_insn (gen_divmoddisi3 (operands[3], operands[3],
6134 operands[2]));
6135 set_unique_reg_note (insn, REG_EQUAL, equal);
6136
6137 insn = emit_move_insn (operands[0],
6138 gen_lowpart (SImode, operands[3]));
6139 set_unique_reg_note (insn, REG_EQUAL, udiv_equal);
6140 }
6141 }
6142 else
6143 {
6144 rtx label1 = gen_label_rtx ();
6145 rtx label2 = gen_label_rtx ();
6146 rtx label3 = gen_label_rtx ();
6147
6148 operands[1] = force_reg (SImode, operands[1]);
6149 operands[1] = make_safe_from (operands[1], operands[0]);
6150 operands[2] = force_reg (SImode, operands[2]);
6151 operands[2] = make_safe_from (operands[2], operands[0]);
6152
6153 emit_move_insn (operands[0], const0_rtx);
6154 emit_cmp_and_jump_insns (operands[2], operands[1], GT, NULL_RTX,
6155 SImode, 1, label3);
6156 emit_cmp_and_jump_insns (operands[2], const0_rtx, LT, NULL_RTX,
6157 SImode, 0, label2);
6158 emit_cmp_and_jump_insns (operands[2], const1_rtx, EQ, NULL_RTX,
6159 SImode, 0, label1);
6160 emit_insn (gen_zero_extendsidi2 (operands[3], operands[1]));
6161 insn = emit_insn (gen_divmoddisi3 (operands[3], operands[3],
6162 operands[2]));
6163 set_unique_reg_note (insn, REG_EQUAL, equal);
6164
6165 insn = emit_move_insn (operands[0],
6166 gen_lowpart (SImode, operands[3]));
6167 set_unique_reg_note (insn, REG_EQUAL, udiv_equal);
6168
6169 emit_jump (label3);
6170 emit_label (label1);
6171 emit_move_insn (operands[0], operands[1]);
6172 emit_jump (label3);
6173 emit_label (label2);
6174 emit_move_insn (operands[0], const1_rtx);
6175 emit_label (label3);
6176 }
6177 emit_move_insn (operands[0], operands[0]);
6178 DONE;
6179 })
6180
6181 (define_expand "umodsi3"
6182 [(set (match_operand:SI 0 "register_operand" "=d")
6183 (umod:SI (match_operand:SI 1 "nonimmediate_operand" "")
6184 (match_operand:SI 2 "nonimmediate_operand" "")))
6185 (clobber (match_dup 3))]
6186 "!TARGET_ZARCH && !TARGET_CPU_ZARCH"
6187 {
6188 rtx insn, udiv_equal, umod_equal, equal;
6189
6190 udiv_equal = gen_rtx_UDIV (SImode, operands[1], operands[2]);
6191 umod_equal = gen_rtx_UMOD (SImode, operands[1], operands[2]);
6192 equal = gen_rtx_IOR (DImode,
6193 gen_rtx_ASHIFT (DImode,
6194 gen_rtx_ZERO_EXTEND (DImode, umod_equal),
6195 GEN_INT (32)),
6196 gen_rtx_ZERO_EXTEND (DImode, udiv_equal));
6197
6198 operands[3] = gen_reg_rtx (DImode);
6199
6200 if (CONSTANT_P (operands[2]))
6201 {
6202 if (GET_CODE (operands[2]) == CONST_INT && INTVAL (operands[2]) <= 0)
6203 {
6204 rtx label1 = gen_label_rtx ();
6205
6206 operands[1] = make_safe_from (operands[1], operands[0]);
6207 emit_move_insn (operands[0], operands[1]);
6208 emit_cmp_and_jump_insns (operands[0], operands[2], LT, NULL_RTX,
6209 SImode, 1, label1);
6210 emit_insn (gen_abssi2 (operands[0], operands[2]));
6211 emit_insn (gen_addsi3 (operands[0], operands[0], operands[1]));
6212 emit_label (label1);
6213 }
6214 else
6215 {
6216 operands[2] = force_reg (SImode, operands[2]);
6217 operands[2] = make_safe_from (operands[2], operands[0]);
6218
6219 emit_insn (gen_zero_extendsidi2 (operands[3], operands[1]));
6220 insn = emit_insn (gen_divmoddisi3 (operands[3], operands[3],
6221 operands[2]));
6222 set_unique_reg_note (insn, REG_EQUAL, equal);
6223
6224 insn = emit_move_insn (operands[0],
6225 gen_highpart (SImode, operands[3]));
6226 set_unique_reg_note (insn, REG_EQUAL, umod_equal);
6227 }
6228 }
6229 else
6230 {
6231 rtx label1 = gen_label_rtx ();
6232 rtx label2 = gen_label_rtx ();
6233 rtx label3 = gen_label_rtx ();
6234
6235 operands[1] = force_reg (SImode, operands[1]);
6236 operands[1] = make_safe_from (operands[1], operands[0]);
6237 operands[2] = force_reg (SImode, operands[2]);
6238 operands[2] = make_safe_from (operands[2], operands[0]);
6239
6240 emit_move_insn(operands[0], operands[1]);
6241 emit_cmp_and_jump_insns (operands[2], operands[1], GT, NULL_RTX,
6242 SImode, 1, label3);
6243 emit_cmp_and_jump_insns (operands[2], const0_rtx, LT, NULL_RTX,
6244 SImode, 0, label2);
6245 emit_cmp_and_jump_insns (operands[2], const1_rtx, EQ, NULL_RTX,
6246 SImode, 0, label1);
6247 emit_insn (gen_zero_extendsidi2 (operands[3], operands[1]));
6248 insn = emit_insn (gen_divmoddisi3 (operands[3], operands[3],
6249 operands[2]));
6250 set_unique_reg_note (insn, REG_EQUAL, equal);
6251
6252 insn = emit_move_insn (operands[0],
6253 gen_highpart (SImode, operands[3]));
6254 set_unique_reg_note (insn, REG_EQUAL, umod_equal);
6255
6256 emit_jump (label3);
6257 emit_label (label1);
6258 emit_move_insn (operands[0], const0_rtx);
6259 emit_jump (label3);
6260 emit_label (label2);
6261 emit_insn (gen_subsi3 (operands[0], operands[0], operands[2]));
6262 emit_label (label3);
6263 }
6264 DONE;
6265 })
6266
6267 ;
6268 ; div(df|sf)3 instruction pattern(s).
6269 ;
6270
6271 ; dxbr, ddbr, debr, dxb, ddb, deb, ddtr, dxtr
6272 (define_insn "div<mode>3"
6273 [(set (match_operand:FP 0 "register_operand" "=f,f")
6274 (div:FP (match_operand:FP 1 "register_operand" "<f0>,0")
6275 (match_operand:FP 2 "general_operand" "f,<Rf>")))]
6276 "TARGET_HARD_FLOAT"
6277 "@
6278 d<xde><bt>r\t%0,<op1>%2
6279 d<xde>b\t%0,%2"
6280 [(set_attr "op_type" "<RRer>,RXE")
6281 (set_attr "type" "fdiv<mode>")])
6282
6283
6284 ;;
6285 ;;- And instructions.
6286 ;;
6287
6288 (define_expand "and<mode>3"
6289 [(set (match_operand:INT 0 "nonimmediate_operand" "")
6290 (and:INT (match_operand:INT 1 "nonimmediate_operand" "")
6291 (match_operand:INT 2 "general_operand" "")))
6292 (clobber (reg:CC CC_REGNUM))]
6293 ""
6294 "s390_expand_logical_operator (AND, <MODE>mode, operands); DONE;")
6295
6296 ;
6297 ; anddi3 instruction pattern(s).
6298 ;
6299
6300 (define_insn "*anddi3_cc"
6301 [(set (reg CC_REGNUM)
6302 (compare
6303 (and:DI (match_operand:DI 1 "nonimmediate_operand" "%0,d, 0, d")
6304 (match_operand:DI 2 "general_operand" " d,d,RT,NxxDq"))
6305 (const_int 0)))
6306 (set (match_operand:DI 0 "register_operand" "=d,d, d, d")
6307 (and:DI (match_dup 1) (match_dup 2)))]
6308 "TARGET_ZARCH && s390_match_ccmode(insn, CCTmode)"
6309 "@
6310 ngr\t%0,%2
6311 ngrk\t%0,%1,%2
6312 ng\t%0,%2
6313 risbg\t%0,%1,%s2,128+%e2,0"
6314 [(set_attr "op_type" "RRE,RRF,RXY,RIE")
6315 (set_attr "cpu_facility" "*,z196,*,z10")
6316 (set_attr "z10prop" "z10_super_E1,*,z10_super_E1,z10_super_E1")])
6317
6318 (define_insn "*anddi3_cconly"
6319 [(set (reg CC_REGNUM)
6320 (compare
6321 (and:DI (match_operand:DI 1 "nonimmediate_operand" "%0,d, 0, d")
6322 (match_operand:DI 2 "general_operand" " d,d,RT,NxxDq"))
6323 (const_int 0)))
6324 (clobber (match_scratch:DI 0 "=d,d, d, d"))]
6325 "TARGET_ZARCH
6326 && s390_match_ccmode(insn, CCTmode)
6327 /* Do not steal TM patterns. */
6328 && s390_single_part (operands[2], DImode, HImode, 0) < 0"
6329 "@
6330 ngr\t%0,%2
6331 ngrk\t%0,%1,%2
6332 ng\t%0,%2
6333 risbg\t%0,%1,%s2,128+%e2,0"
6334 [(set_attr "op_type" "RRE,RRF,RXY,RIE")
6335 (set_attr "cpu_facility" "*,z196,*,z10")
6336 (set_attr "z10prop" "z10_super_E1,*,z10_super_E1,z10_super_E1")])
6337
6338 (define_insn "*anddi3"
6339 [(set (match_operand:DI 0 "nonimmediate_operand"
6340 "=d,d, d, d, d, d, d, d,d,d, d, d, AQ,Q")
6341 (and:DI
6342 (match_operand:DI 1 "nonimmediate_operand"
6343 "%d,o, 0, 0, 0, 0, 0, 0,0,d, 0, d, 0,0")
6344 (match_operand:DI 2 "general_operand"
6345 "M, M,N0HDF,N1HDF,N2HDF,N3HDF,N0SDF,N1SDF,d,d,RT,NxxDq,NxQDF,Q")))
6346 (clobber (reg:CC CC_REGNUM))]
6347 "TARGET_ZARCH && s390_logical_operator_ok_p (operands)"
6348 "@
6349 #
6350 #
6351 nihh\t%0,%j2
6352 nihl\t%0,%j2
6353 nilh\t%0,%j2
6354 nill\t%0,%j2
6355 nihf\t%0,%m2
6356 nilf\t%0,%m2
6357 ngr\t%0,%2
6358 ngrk\t%0,%1,%2
6359 ng\t%0,%2
6360 risbg\t%0,%1,%s2,128+%e2,0
6361 #
6362 #"
6363 [(set_attr "op_type" "RRE,RXE,RI,RI,RI,RI,RIL,RIL,RRE,RRF,RXY,RIE,SI,SS")
6364 (set_attr "cpu_facility" "*,*,*,*,*,*,extimm,extimm,*,z196,*,z10,*,*")
6365 (set_attr "z10prop" "*,
6366 *,
6367 z10_super_E1,
6368 z10_super_E1,
6369 z10_super_E1,
6370 z10_super_E1,
6371 z10_super_E1,
6372 z10_super_E1,
6373 z10_super_E1,
6374 *,
6375 z10_super_E1,
6376 z10_super_E1,
6377 *,
6378 *")])
6379
6380 (define_split
6381 [(set (match_operand:DI 0 "s_operand" "")
6382 (and:DI (match_dup 0) (match_operand:DI 1 "immediate_operand" "")))
6383 (clobber (reg:CC CC_REGNUM))]
6384 "reload_completed"
6385 [(parallel
6386 [(set (match_dup 0) (and:QI (match_dup 0) (match_dup 1)))
6387 (clobber (reg:CC CC_REGNUM))])]
6388 "s390_narrow_logical_operator (AND, &operands[0], &operands[1]);")
6389
6390 ;; These two are what combine generates for (ashift (zero_extract)).
6391 (define_insn "*extzv_<mode>_srl"
6392 [(set (match_operand:GPR 0 "register_operand" "=d")
6393 (and:GPR (lshiftrt:GPR
6394 (match_operand:GPR 1 "register_operand" "d")
6395 (match_operand:GPR 2 "nonzero_shift_count_operand" ""))
6396 (match_operand:GPR 3 "contiguous_bitmask_operand" "")))
6397 (clobber (reg:CC CC_REGNUM))]
6398 "TARGET_Z10
6399 /* Note that even for the SImode pattern, the rotate is always DImode. */
6400 && s390_extzv_shift_ok (<bitsize>, -INTVAL (operands[2]),
6401 INTVAL (operands[3]))"
6402 "risbg\t%0,%1,%<bfstart>3,128+%<bfend>3,64-%2"
6403 [(set_attr "op_type" "RIE")
6404 (set_attr "z10prop" "z10_super_E1")])
6405
6406 (define_insn "*extzv_<mode>_sll"
6407 [(set (match_operand:GPR 0 "register_operand" "=d")
6408 (and:GPR (ashift:GPR
6409 (match_operand:GPR 1 "register_operand" "d")
6410 (match_operand:GPR 2 "nonzero_shift_count_operand" ""))
6411 (match_operand:GPR 3 "contiguous_bitmask_operand" "")))
6412 (clobber (reg:CC CC_REGNUM))]
6413 "TARGET_Z10
6414 && s390_extzv_shift_ok (<bitsize>, INTVAL (operands[2]),
6415 INTVAL (operands[3]))"
6416 "risbg\t%0,%1,%<bfstart>3,128+%<bfend>3,%2"
6417 [(set_attr "op_type" "RIE")
6418 (set_attr "z10prop" "z10_super_E1")])
6419
6420
6421 ;
6422 ; andsi3 instruction pattern(s).
6423 ;
6424
6425 (define_insn "*andsi3_cc"
6426 [(set (reg CC_REGNUM)
6427 (compare
6428 (and:SI
6429 (match_operand:SI 1 "nonimmediate_operand" "%0,0,d,0,0, d")
6430 (match_operand:SI 2 "general_operand" "Os,d,d,R,T,NxxSq"))
6431 (const_int 0)))
6432 (set (match_operand:SI 0 "register_operand" "=d,d,d,d,d, d")
6433 (and:SI (match_dup 1) (match_dup 2)))]
6434 "s390_match_ccmode(insn, CCTmode)"
6435 "@
6436 nilf\t%0,%o2
6437 nr\t%0,%2
6438 nrk\t%0,%1,%2
6439 n\t%0,%2
6440 ny\t%0,%2
6441 risbg\t%0,%1,%t2,128+%f2,0"
6442 [(set_attr "op_type" "RIL,RR,RRF,RX,RXY,RIE")
6443 (set_attr "cpu_facility" "*,*,z196,*,*,z10")
6444 (set_attr "z10prop" "z10_super_E1,z10_super_E1,*,
6445 z10_super_E1,z10_super_E1,z10_super_E1")])
6446
6447 (define_insn "*andsi3_cconly"
6448 [(set (reg CC_REGNUM)
6449 (compare
6450 (and:SI
6451 (match_operand:SI 1 "nonimmediate_operand" "%0,0,d,0,0, d")
6452 (match_operand:SI 2 "general_operand" "Os,d,d,R,T,NxxSq"))
6453 (const_int 0)))
6454 (clobber (match_scratch:SI 0 "=d,d,d,d,d, d"))]
6455 "s390_match_ccmode(insn, CCTmode)
6456 /* Do not steal TM patterns. */
6457 && s390_single_part (operands[2], SImode, HImode, 0) < 0"
6458 "@
6459 nilf\t%0,%o2
6460 nr\t%0,%2
6461 nrk\t%0,%1,%2
6462 n\t%0,%2
6463 ny\t%0,%2
6464 risbg\t%0,%1,%t2,128+%f2,0"
6465 [(set_attr "op_type" "RIL,RR,RRF,RX,RXY,RIE")
6466 (set_attr "cpu_facility" "*,*,z196,*,*,z10")
6467 (set_attr "z10prop" "z10_super_E1,z10_super_E1,*,
6468 z10_super_E1,z10_super_E1,z10_super_E1")])
6469
6470 (define_insn "*andsi3_zarch"
6471 [(set (match_operand:SI 0 "nonimmediate_operand"
6472 "=d,d, d, d, d,d,d,d,d, d, AQ,Q")
6473 (and:SI (match_operand:SI 1 "nonimmediate_operand"
6474 "%d,o, 0, 0, 0,0,d,0,0, d, 0,0")
6475 (match_operand:SI 2 "general_operand"
6476 " M,M,N0HSF,N1HSF,Os,d,d,R,T,NxxSq,NxQSF,Q")))
6477 (clobber (reg:CC CC_REGNUM))]
6478 "TARGET_ZARCH && s390_logical_operator_ok_p (operands)"
6479 "@
6480 #
6481 #
6482 nilh\t%0,%j2
6483 nill\t%0,%j2
6484 nilf\t%0,%o2
6485 nr\t%0,%2
6486 nrk\t%0,%1,%2
6487 n\t%0,%2
6488 ny\t%0,%2
6489 risbg\t%0,%1,%t2,128+%f2,0
6490 #
6491 #"
6492 [(set_attr "op_type" "RRE,RXE,RI,RI,RIL,RR,RRF,RX,RXY,RIE,SI,SS")
6493 (set_attr "cpu_facility" "*,*,*,*,*,*,z196,*,*,z10,*,*")
6494 (set_attr "z10prop" "*,
6495 *,
6496 z10_super_E1,
6497 z10_super_E1,
6498 z10_super_E1,
6499 z10_super_E1,
6500 *,
6501 z10_super_E1,
6502 z10_super_E1,
6503 z10_super_E1,
6504 *,
6505 *")])
6506
6507 (define_insn "*andsi3_esa"
6508 [(set (match_operand:SI 0 "nonimmediate_operand" "=d,d, AQ,Q")
6509 (and:SI (match_operand:SI 1 "nonimmediate_operand" "%0,0, 0,0")
6510 (match_operand:SI 2 "general_operand" " d,R,NxQSF,Q")))
6511 (clobber (reg:CC CC_REGNUM))]
6512 "!TARGET_ZARCH && s390_logical_operator_ok_p (operands)"
6513 "@
6514 nr\t%0,%2
6515 n\t%0,%2
6516 #
6517 #"
6518 [(set_attr "op_type" "RR,RX,SI,SS")
6519 (set_attr "z10prop" "z10_super_E1,z10_super_E1,*,*")])
6520
6521
6522 (define_split
6523 [(set (match_operand:SI 0 "s_operand" "")
6524 (and:SI (match_dup 0) (match_operand:SI 1 "immediate_operand" "")))
6525 (clobber (reg:CC CC_REGNUM))]
6526 "reload_completed"
6527 [(parallel
6528 [(set (match_dup 0) (and:QI (match_dup 0) (match_dup 1)))
6529 (clobber (reg:CC CC_REGNUM))])]
6530 "s390_narrow_logical_operator (AND, &operands[0], &operands[1]);")
6531
6532 ;
6533 ; andhi3 instruction pattern(s).
6534 ;
6535
6536 (define_insn "*andhi3_zarch"
6537 [(set (match_operand:HI 0 "nonimmediate_operand" "=d,d,d, AQ,Q")
6538 (and:HI (match_operand:HI 1 "nonimmediate_operand" "%0,d,0, 0,0")
6539 (match_operand:HI 2 "general_operand" " d,d,n,NxQHF,Q")))
6540 (clobber (reg:CC CC_REGNUM))]
6541 "TARGET_ZARCH && s390_logical_operator_ok_p (operands)"
6542 "@
6543 nr\t%0,%2
6544 nrk\t%0,%1,%2
6545 nill\t%0,%x2
6546 #
6547 #"
6548 [(set_attr "op_type" "RR,RRF,RI,SI,SS")
6549 (set_attr "cpu_facility" "*,z196,*,*,*")
6550 (set_attr "z10prop" "z10_super_E1,*,z10_super_E1,*,*")
6551 ])
6552
6553 (define_insn "*andhi3_esa"
6554 [(set (match_operand:HI 0 "nonimmediate_operand" "=d,AQ,Q")
6555 (and:HI (match_operand:HI 1 "nonimmediate_operand" "%0,0,0")
6556 (match_operand:HI 2 "general_operand" "d,NxQHF,Q")))
6557 (clobber (reg:CC CC_REGNUM))]
6558 "!TARGET_ZARCH && s390_logical_operator_ok_p (operands)"
6559 "@
6560 nr\t%0,%2
6561 #
6562 #"
6563 [(set_attr "op_type" "RR,SI,SS")
6564 (set_attr "z10prop" "z10_super_E1,*,*")
6565 ])
6566
6567 (define_split
6568 [(set (match_operand:HI 0 "s_operand" "")
6569 (and:HI (match_dup 0) (match_operand:HI 1 "immediate_operand" "")))
6570 (clobber (reg:CC CC_REGNUM))]
6571 "reload_completed"
6572 [(parallel
6573 [(set (match_dup 0) (and:QI (match_dup 0) (match_dup 1)))
6574 (clobber (reg:CC CC_REGNUM))])]
6575 "s390_narrow_logical_operator (AND, &operands[0], &operands[1]);")
6576
6577 ;
6578 ; andqi3 instruction pattern(s).
6579 ;
6580
6581 (define_insn "*andqi3_zarch"
6582 [(set (match_operand:QI 0 "nonimmediate_operand" "=d,d,d,Q,S,Q")
6583 (and:QI (match_operand:QI 1 "nonimmediate_operand" "%0,d,0,0,0,0")
6584 (match_operand:QI 2 "general_operand" " d,d,n,n,n,Q")))
6585 (clobber (reg:CC CC_REGNUM))]
6586 "TARGET_ZARCH && s390_logical_operator_ok_p (operands)"
6587 "@
6588 nr\t%0,%2
6589 nrk\t%0,%1,%2
6590 nill\t%0,%b2
6591 ni\t%S0,%b2
6592 niy\t%S0,%b2
6593 #"
6594 [(set_attr "op_type" "RR,RRF,RI,SI,SIY,SS")
6595 (set_attr "cpu_facility" "*,z196,*,*,*,*")
6596 (set_attr "z10prop" "z10_super_E1,*,z10_super_E1,z10_super,z10_super,*")])
6597
6598 (define_insn "*andqi3_esa"
6599 [(set (match_operand:QI 0 "nonimmediate_operand" "=d,Q,Q")
6600 (and:QI (match_operand:QI 1 "nonimmediate_operand" "%0,0,0")
6601 (match_operand:QI 2 "general_operand" "d,n,Q")))
6602 (clobber (reg:CC CC_REGNUM))]
6603 "!TARGET_ZARCH && s390_logical_operator_ok_p (operands)"
6604 "@
6605 nr\t%0,%2
6606 ni\t%S0,%b2
6607 #"
6608 [(set_attr "op_type" "RR,SI,SS")
6609 (set_attr "z10prop" "z10_super_E1,z10_super,*")])
6610
6611 ;
6612 ; Block and (NC) patterns.
6613 ;
6614
6615 (define_insn "*nc"
6616 [(set (match_operand:BLK 0 "memory_operand" "=Q")
6617 (and:BLK (match_dup 0)
6618 (match_operand:BLK 1 "memory_operand" "Q")))
6619 (use (match_operand 2 "const_int_operand" "n"))
6620 (clobber (reg:CC CC_REGNUM))]
6621 "INTVAL (operands[2]) >= 1 && INTVAL (operands[2]) <= 256"
6622 "nc\t%O0(%2,%R0),%S1"
6623 [(set_attr "op_type" "SS")
6624 (set_attr "z196prop" "z196_cracked")])
6625
6626 (define_split
6627 [(set (match_operand 0 "memory_operand" "")
6628 (and (match_dup 0)
6629 (match_operand 1 "memory_operand" "")))
6630 (clobber (reg:CC CC_REGNUM))]
6631 "reload_completed
6632 && GET_MODE (operands[0]) == GET_MODE (operands[1])
6633 && GET_MODE_SIZE (GET_MODE (operands[0])) > 0"
6634 [(parallel
6635 [(set (match_dup 0) (and:BLK (match_dup 0) (match_dup 1)))
6636 (use (match_dup 2))
6637 (clobber (reg:CC CC_REGNUM))])]
6638 {
6639 operands[2] = GEN_INT (GET_MODE_SIZE (GET_MODE (operands[0])));
6640 operands[0] = adjust_address (operands[0], BLKmode, 0);
6641 operands[1] = adjust_address (operands[1], BLKmode, 0);
6642 })
6643
6644 (define_peephole2
6645 [(parallel
6646 [(set (match_operand:BLK 0 "memory_operand" "")
6647 (and:BLK (match_dup 0)
6648 (match_operand:BLK 1 "memory_operand" "")))
6649 (use (match_operand 2 "const_int_operand" ""))
6650 (clobber (reg:CC CC_REGNUM))])
6651 (parallel
6652 [(set (match_operand:BLK 3 "memory_operand" "")
6653 (and:BLK (match_dup 3)
6654 (match_operand:BLK 4 "memory_operand" "")))
6655 (use (match_operand 5 "const_int_operand" ""))
6656 (clobber (reg:CC CC_REGNUM))])]
6657 "s390_offset_p (operands[0], operands[3], operands[2])
6658 && s390_offset_p (operands[1], operands[4], operands[2])
6659 && !s390_overlap_p (operands[0], operands[1],
6660 INTVAL (operands[2]) + INTVAL (operands[5]))
6661 && INTVAL (operands[2]) + INTVAL (operands[5]) <= 256"
6662 [(parallel
6663 [(set (match_dup 6) (and:BLK (match_dup 6) (match_dup 7)))
6664 (use (match_dup 8))
6665 (clobber (reg:CC CC_REGNUM))])]
6666 "operands[6] = gen_rtx_MEM (BLKmode, XEXP (operands[0], 0));
6667 operands[7] = gen_rtx_MEM (BLKmode, XEXP (operands[1], 0));
6668 operands[8] = GEN_INT (INTVAL (operands[2]) + INTVAL (operands[5]));")
6669
6670
6671 ;;
6672 ;;- Bit set (inclusive or) instructions.
6673 ;;
6674
6675 (define_expand "ior<mode>3"
6676 [(set (match_operand:INT 0 "nonimmediate_operand" "")
6677 (ior:INT (match_operand:INT 1 "nonimmediate_operand" "")
6678 (match_operand:INT 2 "general_operand" "")))
6679 (clobber (reg:CC CC_REGNUM))]
6680 ""
6681 "s390_expand_logical_operator (IOR, <MODE>mode, operands); DONE;")
6682
6683 ;
6684 ; iordi3 instruction pattern(s).
6685 ;
6686
6687 (define_insn "*iordi3_cc"
6688 [(set (reg CC_REGNUM)
6689 (compare (ior:DI (match_operand:DI 1 "nonimmediate_operand" "%0,d, 0")
6690 (match_operand:DI 2 "general_operand" " d,d,RT"))
6691 (const_int 0)))
6692 (set (match_operand:DI 0 "register_operand" "=d,d, d")
6693 (ior:DI (match_dup 1) (match_dup 2)))]
6694 "s390_match_ccmode(insn, CCTmode) && TARGET_ZARCH"
6695 "@
6696 ogr\t%0,%2
6697 ogrk\t%0,%1,%2
6698 og\t%0,%2"
6699 [(set_attr "op_type" "RRE,RRF,RXY")
6700 (set_attr "cpu_facility" "*,z196,*")
6701 (set_attr "z10prop" "z10_super_E1,*,z10_super_E1")])
6702
6703 (define_insn "*iordi3_cconly"
6704 [(set (reg CC_REGNUM)
6705 (compare (ior:DI (match_operand:DI 1 "nonimmediate_operand" "%0,d,0")
6706 (match_operand:DI 2 "general_operand" " d,d,RT"))
6707 (const_int 0)))
6708 (clobber (match_scratch:DI 0 "=d,d,d"))]
6709 "s390_match_ccmode(insn, CCTmode) && TARGET_ZARCH"
6710 "@
6711 ogr\t%0,%2
6712 ogrk\t%0,%1,%2
6713 og\t%0,%2"
6714 [(set_attr "op_type" "RRE,RRF,RXY")
6715 (set_attr "cpu_facility" "*,z196,*")
6716 (set_attr "z10prop" "z10_super_E1,*,z10_super_E1")])
6717
6718 (define_insn "*iordi3"
6719 [(set (match_operand:DI 0 "nonimmediate_operand"
6720 "=d, d, d, d, d, d,d,d, d, AQ,Q")
6721 (ior:DI (match_operand:DI 1 "nonimmediate_operand"
6722 " %0, 0, 0, 0, 0, 0,0,d, 0, 0,0")
6723 (match_operand:DI 2 "general_operand"
6724 "N0HD0,N1HD0,N2HD0,N3HD0,N0SD0,N1SD0,d,d,RT,NxQD0,Q")))
6725 (clobber (reg:CC CC_REGNUM))]
6726 "TARGET_ZARCH && s390_logical_operator_ok_p (operands)"
6727 "@
6728 oihh\t%0,%i2
6729 oihl\t%0,%i2
6730 oilh\t%0,%i2
6731 oill\t%0,%i2
6732 oihf\t%0,%k2
6733 oilf\t%0,%k2
6734 ogr\t%0,%2
6735 ogrk\t%0,%1,%2
6736 og\t%0,%2
6737 #
6738 #"
6739 [(set_attr "op_type" "RI,RI,RI,RI,RIL,RIL,RRE,RRF,RXY,SI,SS")
6740 (set_attr "cpu_facility" "*,*,*,*,extimm,extimm,*,z196,*,*,*")
6741 (set_attr "z10prop" "z10_super_E1,
6742 z10_super_E1,
6743 z10_super_E1,
6744 z10_super_E1,
6745 z10_super_E1,
6746 z10_super_E1,
6747 z10_super_E1,
6748 *,
6749 z10_super_E1,
6750 *,
6751 *")])
6752
6753 (define_split
6754 [(set (match_operand:DI 0 "s_operand" "")
6755 (ior:DI (match_dup 0) (match_operand:DI 1 "immediate_operand" "")))
6756 (clobber (reg:CC CC_REGNUM))]
6757 "reload_completed"
6758 [(parallel
6759 [(set (match_dup 0) (ior:QI (match_dup 0) (match_dup 1)))
6760 (clobber (reg:CC CC_REGNUM))])]
6761 "s390_narrow_logical_operator (IOR, &operands[0], &operands[1]);")
6762
6763 ;
6764 ; iorsi3 instruction pattern(s).
6765 ;
6766
6767 (define_insn "*iorsi3_cc"
6768 [(set (reg CC_REGNUM)
6769 (compare (ior:SI (match_operand:SI 1 "nonimmediate_operand" "%0,0,d,0,0")
6770 (match_operand:SI 2 "general_operand" "Os,d,d,R,T"))
6771 (const_int 0)))
6772 (set (match_operand:SI 0 "register_operand" "=d,d,d,d,d")
6773 (ior:SI (match_dup 1) (match_dup 2)))]
6774 "s390_match_ccmode(insn, CCTmode)"
6775 "@
6776 oilf\t%0,%o2
6777 or\t%0,%2
6778 ork\t%0,%1,%2
6779 o\t%0,%2
6780 oy\t%0,%2"
6781 [(set_attr "op_type" "RIL,RR,RRF,RX,RXY")
6782 (set_attr "cpu_facility" "*,*,z196,*,*")
6783 (set_attr "z10prop" "z10_super_E1,z10_super_E1,*,z10_super_E1,z10_super_E1")])
6784
6785 (define_insn "*iorsi3_cconly"
6786 [(set (reg CC_REGNUM)
6787 (compare (ior:SI (match_operand:SI 1 "nonimmediate_operand" "%0,0,d,0,0")
6788 (match_operand:SI 2 "general_operand" "Os,d,d,R,T"))
6789 (const_int 0)))
6790 (clobber (match_scratch:SI 0 "=d,d,d,d,d"))]
6791 "s390_match_ccmode(insn, CCTmode)"
6792 "@
6793 oilf\t%0,%o2
6794 or\t%0,%2
6795 ork\t%0,%1,%2
6796 o\t%0,%2
6797 oy\t%0,%2"
6798 [(set_attr "op_type" "RIL,RR,RRF,RX,RXY")
6799 (set_attr "cpu_facility" "*,*,z196,*,*")
6800 (set_attr "z10prop" "z10_super_E1,z10_super_E1,*,z10_super_E1,z10_super_E1")])
6801
6802 (define_insn "*iorsi3_zarch"
6803 [(set (match_operand:SI 0 "nonimmediate_operand" "=d, d, d,d,d,d,d, AQ,Q")
6804 (ior:SI (match_operand:SI 1 "nonimmediate_operand" "%0, 0, 0,0,d,0,0, 0,0")
6805 (match_operand:SI 2 "general_operand" "N0HS0,N1HS0,Os,d,d,R,T,NxQS0,Q")))
6806 (clobber (reg:CC CC_REGNUM))]
6807 "TARGET_ZARCH && s390_logical_operator_ok_p (operands)"
6808 "@
6809 oilh\t%0,%i2
6810 oill\t%0,%i2
6811 oilf\t%0,%o2
6812 or\t%0,%2
6813 ork\t%0,%1,%2
6814 o\t%0,%2
6815 oy\t%0,%2
6816 #
6817 #"
6818 [(set_attr "op_type" "RI,RI,RIL,RR,RRF,RX,RXY,SI,SS")
6819 (set_attr "cpu_facility" "*,*,*,*,z196,*,*,*,*")
6820 (set_attr "z10prop" "z10_super_E1,
6821 z10_super_E1,
6822 z10_super_E1,
6823 z10_super_E1,
6824 *,
6825 z10_super_E1,
6826 z10_super_E1,
6827 *,
6828 *")])
6829
6830 (define_insn "*iorsi3_esa"
6831 [(set (match_operand:SI 0 "nonimmediate_operand" "=d,d,AQ,Q")
6832 (ior:SI (match_operand:SI 1 "nonimmediate_operand" "%0,0,0,0")
6833 (match_operand:SI 2 "general_operand" "d,R,NxQS0,Q")))
6834 (clobber (reg:CC CC_REGNUM))]
6835 "!TARGET_ZARCH && s390_logical_operator_ok_p (operands)"
6836 "@
6837 or\t%0,%2
6838 o\t%0,%2
6839 #
6840 #"
6841 [(set_attr "op_type" "RR,RX,SI,SS")
6842 (set_attr "z10prop" "z10_super_E1,z10_super_E1,*,*")])
6843
6844 (define_split
6845 [(set (match_operand:SI 0 "s_operand" "")
6846 (ior:SI (match_dup 0) (match_operand:SI 1 "immediate_operand" "")))
6847 (clobber (reg:CC CC_REGNUM))]
6848 "reload_completed"
6849 [(parallel
6850 [(set (match_dup 0) (ior:QI (match_dup 0) (match_dup 1)))
6851 (clobber (reg:CC CC_REGNUM))])]
6852 "s390_narrow_logical_operator (IOR, &operands[0], &operands[1]);")
6853
6854 ;
6855 ; iorhi3 instruction pattern(s).
6856 ;
6857
6858 (define_insn "*iorhi3_zarch"
6859 [(set (match_operand:HI 0 "nonimmediate_operand" "=d,d,d, AQ,Q")
6860 (ior:HI (match_operand:HI 1 "nonimmediate_operand" "%0,d,0, 0,0")
6861 (match_operand:HI 2 "general_operand" " d,d,n,NxQH0,Q")))
6862 (clobber (reg:CC CC_REGNUM))]
6863 "TARGET_ZARCH && s390_logical_operator_ok_p (operands)"
6864 "@
6865 or\t%0,%2
6866 ork\t%0,%1,%2
6867 oill\t%0,%x2
6868 #
6869 #"
6870 [(set_attr "op_type" "RR,RRF,RI,SI,SS")
6871 (set_attr "cpu_facility" "*,z196,*,*,*")
6872 (set_attr "z10prop" "z10_super_E1,*,z10_super_E1,*,*")])
6873
6874 (define_insn "*iorhi3_esa"
6875 [(set (match_operand:HI 0 "nonimmediate_operand" "=d,AQ,Q")
6876 (ior:HI (match_operand:HI 1 "nonimmediate_operand" "%0,0,0")
6877 (match_operand:HI 2 "general_operand" "d,NxQH0,Q")))
6878 (clobber (reg:CC CC_REGNUM))]
6879 "!TARGET_ZARCH && s390_logical_operator_ok_p (operands)"
6880 "@
6881 or\t%0,%2
6882 #
6883 #"
6884 [(set_attr "op_type" "RR,SI,SS")
6885 (set_attr "z10prop" "z10_super_E1,*,*")])
6886
6887 (define_split
6888 [(set (match_operand:HI 0 "s_operand" "")
6889 (ior:HI (match_dup 0) (match_operand:HI 1 "immediate_operand" "")))
6890 (clobber (reg:CC CC_REGNUM))]
6891 "reload_completed"
6892 [(parallel
6893 [(set (match_dup 0) (ior:QI (match_dup 0) (match_dup 1)))
6894 (clobber (reg:CC CC_REGNUM))])]
6895 "s390_narrow_logical_operator (IOR, &operands[0], &operands[1]);")
6896
6897 ;
6898 ; iorqi3 instruction pattern(s).
6899 ;
6900
6901 (define_insn "*iorqi3_zarch"
6902 [(set (match_operand:QI 0 "nonimmediate_operand" "=d,d,d,Q,S,Q")
6903 (ior:QI (match_operand:QI 1 "nonimmediate_operand" "%0,d,0,0,0,0")
6904 (match_operand:QI 2 "general_operand" " d,d,n,n,n,Q")))
6905 (clobber (reg:CC CC_REGNUM))]
6906 "TARGET_ZARCH && s390_logical_operator_ok_p (operands)"
6907 "@
6908 or\t%0,%2
6909 ork\t%0,%1,%2
6910 oill\t%0,%b2
6911 oi\t%S0,%b2
6912 oiy\t%S0,%b2
6913 #"
6914 [(set_attr "op_type" "RR,RRF,RI,SI,SIY,SS")
6915 (set_attr "cpu_facility" "*,z196,*,*,*,*")
6916 (set_attr "z10prop" "z10_super_E1,*,z10_super_E1,
6917 z10_super,z10_super,*")])
6918
6919 (define_insn "*iorqi3_esa"
6920 [(set (match_operand:QI 0 "nonimmediate_operand" "=d,Q,Q")
6921 (ior:QI (match_operand:QI 1 "nonimmediate_operand" "%0,0,0")
6922 (match_operand:QI 2 "general_operand" "d,n,Q")))
6923 (clobber (reg:CC CC_REGNUM))]
6924 "!TARGET_ZARCH && s390_logical_operator_ok_p (operands)"
6925 "@
6926 or\t%0,%2
6927 oi\t%S0,%b2
6928 #"
6929 [(set_attr "op_type" "RR,SI,SS")
6930 (set_attr "z10prop" "z10_super_E1,z10_super,*")])
6931
6932 ;
6933 ; Block inclusive or (OC) patterns.
6934 ;
6935
6936 (define_insn "*oc"
6937 [(set (match_operand:BLK 0 "memory_operand" "=Q")
6938 (ior:BLK (match_dup 0)
6939 (match_operand:BLK 1 "memory_operand" "Q")))
6940 (use (match_operand 2 "const_int_operand" "n"))
6941 (clobber (reg:CC CC_REGNUM))]
6942 "INTVAL (operands[2]) >= 1 && INTVAL (operands[2]) <= 256"
6943 "oc\t%O0(%2,%R0),%S1"
6944 [(set_attr "op_type" "SS")
6945 (set_attr "z196prop" "z196_cracked")])
6946
6947 (define_split
6948 [(set (match_operand 0 "memory_operand" "")
6949 (ior (match_dup 0)
6950 (match_operand 1 "memory_operand" "")))
6951 (clobber (reg:CC CC_REGNUM))]
6952 "reload_completed
6953 && GET_MODE (operands[0]) == GET_MODE (operands[1])
6954 && GET_MODE_SIZE (GET_MODE (operands[0])) > 0"
6955 [(parallel
6956 [(set (match_dup 0) (ior:BLK (match_dup 0) (match_dup 1)))
6957 (use (match_dup 2))
6958 (clobber (reg:CC CC_REGNUM))])]
6959 {
6960 operands[2] = GEN_INT (GET_MODE_SIZE (GET_MODE (operands[0])));
6961 operands[0] = adjust_address (operands[0], BLKmode, 0);
6962 operands[1] = adjust_address (operands[1], BLKmode, 0);
6963 })
6964
6965 (define_peephole2
6966 [(parallel
6967 [(set (match_operand:BLK 0 "memory_operand" "")
6968 (ior:BLK (match_dup 0)
6969 (match_operand:BLK 1 "memory_operand" "")))
6970 (use (match_operand 2 "const_int_operand" ""))
6971 (clobber (reg:CC CC_REGNUM))])
6972 (parallel
6973 [(set (match_operand:BLK 3 "memory_operand" "")
6974 (ior:BLK (match_dup 3)
6975 (match_operand:BLK 4 "memory_operand" "")))
6976 (use (match_operand 5 "const_int_operand" ""))
6977 (clobber (reg:CC CC_REGNUM))])]
6978 "s390_offset_p (operands[0], operands[3], operands[2])
6979 && s390_offset_p (operands[1], operands[4], operands[2])
6980 && !s390_overlap_p (operands[0], operands[1],
6981 INTVAL (operands[2]) + INTVAL (operands[5]))
6982 && INTVAL (operands[2]) + INTVAL (operands[5]) <= 256"
6983 [(parallel
6984 [(set (match_dup 6) (ior:BLK (match_dup 6) (match_dup 7)))
6985 (use (match_dup 8))
6986 (clobber (reg:CC CC_REGNUM))])]
6987 "operands[6] = gen_rtx_MEM (BLKmode, XEXP (operands[0], 0));
6988 operands[7] = gen_rtx_MEM (BLKmode, XEXP (operands[1], 0));
6989 operands[8] = GEN_INT (INTVAL (operands[2]) + INTVAL (operands[5]));")
6990
6991
6992 ;;
6993 ;;- Xor instructions.
6994 ;;
6995
6996 (define_expand "xor<mode>3"
6997 [(set (match_operand:INT 0 "nonimmediate_operand" "")
6998 (xor:INT (match_operand:INT 1 "nonimmediate_operand" "")
6999 (match_operand:INT 2 "general_operand" "")))
7000 (clobber (reg:CC CC_REGNUM))]
7001 ""
7002 "s390_expand_logical_operator (XOR, <MODE>mode, operands); DONE;")
7003
7004 ;
7005 ; xordi3 instruction pattern(s).
7006 ;
7007
7008 (define_insn "*xordi3_cc"
7009 [(set (reg CC_REGNUM)
7010 (compare (xor:DI (match_operand:DI 1 "nonimmediate_operand" "%0,d, 0")
7011 (match_operand:DI 2 "general_operand" " d,d,RT"))
7012 (const_int 0)))
7013 (set (match_operand:DI 0 "register_operand" "=d,d, d")
7014 (xor:DI (match_dup 1) (match_dup 2)))]
7015 "s390_match_ccmode(insn, CCTmode) && TARGET_ZARCH"
7016 "@
7017 xgr\t%0,%2
7018 xgrk\t%0,%1,%2
7019 xg\t%0,%2"
7020 [(set_attr "op_type" "RRE,RRF,RXY")
7021 (set_attr "cpu_facility" "*,z196,*")
7022 (set_attr "z10prop" "z10_super_E1,*,z10_super_E1")])
7023
7024 (define_insn "*xordi3_cconly"
7025 [(set (reg CC_REGNUM)
7026 (compare (xor:DI (match_operand:DI 1 "nonimmediate_operand" "%0,d, 0")
7027 (match_operand:DI 2 "general_operand" " d,d,RT"))
7028 (const_int 0)))
7029 (clobber (match_scratch:DI 0 "=d,d, d"))]
7030 "s390_match_ccmode(insn, CCTmode) && TARGET_ZARCH"
7031 "@
7032 xgr\t%0,%2
7033 xgrk\t%0,%1,%2
7034 xg\t%0,%2"
7035 [(set_attr "op_type" "RRE,RRF,RXY")
7036 (set_attr "cpu_facility" "*,z196,*")
7037 (set_attr "z10prop" "z10_super_E1,*,z10_super_E1")])
7038
7039 (define_insn "*xordi3"
7040 [(set (match_operand:DI 0 "nonimmediate_operand" "=d, d,d,d, d, AQ,Q")
7041 (xor:DI (match_operand:DI 1 "nonimmediate_operand" "%0, 0,0,d, 0, 0,0")
7042 (match_operand:DI 2 "general_operand" "N0SD0,N1SD0,d,d,RT,NxQD0,Q")))
7043 (clobber (reg:CC CC_REGNUM))]
7044 "TARGET_ZARCH && s390_logical_operator_ok_p (operands)"
7045 "@
7046 xihf\t%0,%k2
7047 xilf\t%0,%k2
7048 xgr\t%0,%2
7049 xgrk\t%0,%1,%2
7050 xg\t%0,%2
7051 #
7052 #"
7053 [(set_attr "op_type" "RIL,RIL,RRE,RRF,RXY,SI,SS")
7054 (set_attr "cpu_facility" "extimm,extimm,*,z196,*,*,*")
7055 (set_attr "z10prop" "z10_super_E1,z10_super_E1,z10_super_E1,
7056 *,z10_super_E1,*,*")])
7057
7058 (define_split
7059 [(set (match_operand:DI 0 "s_operand" "")
7060 (xor:DI (match_dup 0) (match_operand:DI 1 "immediate_operand" "")))
7061 (clobber (reg:CC CC_REGNUM))]
7062 "reload_completed"
7063 [(parallel
7064 [(set (match_dup 0) (xor:QI (match_dup 0) (match_dup 1)))
7065 (clobber (reg:CC CC_REGNUM))])]
7066 "s390_narrow_logical_operator (XOR, &operands[0], &operands[1]);")
7067
7068 ;
7069 ; xorsi3 instruction pattern(s).
7070 ;
7071
7072 (define_insn "*xorsi3_cc"
7073 [(set (reg CC_REGNUM)
7074 (compare (xor:SI (match_operand:SI 1 "nonimmediate_operand" "%0,0,d,0,0")
7075 (match_operand:SI 2 "general_operand" "Os,d,d,R,T"))
7076 (const_int 0)))
7077 (set (match_operand:SI 0 "register_operand" "=d,d,d,d,d")
7078 (xor:SI (match_dup 1) (match_dup 2)))]
7079 "s390_match_ccmode(insn, CCTmode)"
7080 "@
7081 xilf\t%0,%o2
7082 xr\t%0,%2
7083 xrk\t%0,%1,%2
7084 x\t%0,%2
7085 xy\t%0,%2"
7086 [(set_attr "op_type" "RIL,RR,RRF,RX,RXY")
7087 (set_attr "cpu_facility" "*,*,z196,*,*")
7088 (set_attr "z10prop" "z10_super_E1,z10_super_E1,*,
7089 z10_super_E1,z10_super_E1")])
7090
7091 (define_insn "*xorsi3_cconly"
7092 [(set (reg CC_REGNUM)
7093 (compare (xor:SI (match_operand:SI 1 "nonimmediate_operand" "%0,0,d,0,0")
7094 (match_operand:SI 2 "general_operand" "Os,d,d,R,T"))
7095 (const_int 0)))
7096 (clobber (match_scratch:SI 0 "=d,d,d,d,d"))]
7097 "s390_match_ccmode(insn, CCTmode)"
7098 "@
7099 xilf\t%0,%o2
7100 xr\t%0,%2
7101 xrk\t%0,%1,%2
7102 x\t%0,%2
7103 xy\t%0,%2"
7104 [(set_attr "op_type" "RIL,RR,RRF,RX,RXY")
7105 (set_attr "cpu_facility" "*,*,z196,*,*")
7106 (set_attr "z10prop" "z10_super_E1,z10_super_E1,*,
7107 z10_super_E1,z10_super_E1")])
7108
7109 (define_insn "*xorsi3"
7110 [(set (match_operand:SI 0 "nonimmediate_operand" "=d,d,d,d,d, AQ,Q")
7111 (xor:SI (match_operand:SI 1 "nonimmediate_operand" "%0,0,d,0,0, 0,0")
7112 (match_operand:SI 2 "general_operand" "Os,d,d,R,T,NxQS0,Q")))
7113 (clobber (reg:CC CC_REGNUM))]
7114 "s390_logical_operator_ok_p (operands)"
7115 "@
7116 xilf\t%0,%o2
7117 xr\t%0,%2
7118 xrk\t%0,%1,%2
7119 x\t%0,%2
7120 xy\t%0,%2
7121 #
7122 #"
7123 [(set_attr "op_type" "RIL,RR,RRF,RX,RXY,SI,SS")
7124 (set_attr "cpu_facility" "*,*,z196,*,*,*,*")
7125 (set_attr "z10prop" "z10_super_E1,z10_super_E1,*,
7126 z10_super_E1,z10_super_E1,*,*")])
7127
7128 (define_split
7129 [(set (match_operand:SI 0 "s_operand" "")
7130 (xor:SI (match_dup 0) (match_operand:SI 1 "immediate_operand" "")))
7131 (clobber (reg:CC CC_REGNUM))]
7132 "reload_completed"
7133 [(parallel
7134 [(set (match_dup 0) (xor:QI (match_dup 0) (match_dup 1)))
7135 (clobber (reg:CC CC_REGNUM))])]
7136 "s390_narrow_logical_operator (XOR, &operands[0], &operands[1]);")
7137
7138 ;
7139 ; xorhi3 instruction pattern(s).
7140 ;
7141
7142 (define_insn "*xorhi3"
7143 [(set (match_operand:HI 0 "nonimmediate_operand" "=d,d,d, AQ,Q")
7144 (xor:HI (match_operand:HI 1 "nonimmediate_operand" "%0,0,d, 0,0")
7145 (match_operand:HI 2 "general_operand" "Os,d,d,NxQH0,Q")))
7146 (clobber (reg:CC CC_REGNUM))]
7147 "s390_logical_operator_ok_p (operands)"
7148 "@
7149 xilf\t%0,%x2
7150 xr\t%0,%2
7151 xrk\t%0,%1,%2
7152 #
7153 #"
7154 [(set_attr "op_type" "RIL,RR,RRF,SI,SS")
7155 (set_attr "cpu_facility" "*,*,z196,*,*")
7156 (set_attr "z10prop" "z10_super_E1,z10_super_E1,*,*,*")])
7157
7158 (define_split
7159 [(set (match_operand:HI 0 "s_operand" "")
7160 (xor:HI (match_dup 0) (match_operand:HI 1 "immediate_operand" "")))
7161 (clobber (reg:CC CC_REGNUM))]
7162 "reload_completed"
7163 [(parallel
7164 [(set (match_dup 0) (xor:QI (match_dup 0) (match_dup 1)))
7165 (clobber (reg:CC CC_REGNUM))])]
7166 "s390_narrow_logical_operator (XOR, &operands[0], &operands[1]);")
7167
7168 ;
7169 ; xorqi3 instruction pattern(s).
7170 ;
7171
7172 (define_insn "*xorqi3"
7173 [(set (match_operand:QI 0 "nonimmediate_operand" "=d,d,d,Q,S,Q")
7174 (xor:QI (match_operand:QI 1 "nonimmediate_operand" "%0,0,d,0,0,0")
7175 (match_operand:QI 2 "general_operand" "Os,d,d,n,n,Q")))
7176 (clobber (reg:CC CC_REGNUM))]
7177 "s390_logical_operator_ok_p (operands)"
7178 "@
7179 xilf\t%0,%b2
7180 xr\t%0,%2
7181 xrk\t%0,%1,%2
7182 xi\t%S0,%b2
7183 xiy\t%S0,%b2
7184 #"
7185 [(set_attr "op_type" "RIL,RR,RRF,SI,SIY,SS")
7186 (set_attr "cpu_facility" "*,*,z196,*,*,*")
7187 (set_attr "z10prop" "z10_super_E1,z10_super_E1,*,z10_super,z10_super,*")])
7188
7189
7190 ;
7191 ; Block exclusive or (XC) patterns.
7192 ;
7193
7194 (define_insn "*xc"
7195 [(set (match_operand:BLK 0 "memory_operand" "=Q")
7196 (xor:BLK (match_dup 0)
7197 (match_operand:BLK 1 "memory_operand" "Q")))
7198 (use (match_operand 2 "const_int_operand" "n"))
7199 (clobber (reg:CC CC_REGNUM))]
7200 "INTVAL (operands[2]) >= 1 && INTVAL (operands[2]) <= 256"
7201 "xc\t%O0(%2,%R0),%S1"
7202 [(set_attr "op_type" "SS")])
7203
7204 (define_split
7205 [(set (match_operand 0 "memory_operand" "")
7206 (xor (match_dup 0)
7207 (match_operand 1 "memory_operand" "")))
7208 (clobber (reg:CC CC_REGNUM))]
7209 "reload_completed
7210 && GET_MODE (operands[0]) == GET_MODE (operands[1])
7211 && GET_MODE_SIZE (GET_MODE (operands[0])) > 0"
7212 [(parallel
7213 [(set (match_dup 0) (xor:BLK (match_dup 0) (match_dup 1)))
7214 (use (match_dup 2))
7215 (clobber (reg:CC CC_REGNUM))])]
7216 {
7217 operands[2] = GEN_INT (GET_MODE_SIZE (GET_MODE (operands[0])));
7218 operands[0] = adjust_address (operands[0], BLKmode, 0);
7219 operands[1] = adjust_address (operands[1], BLKmode, 0);
7220 })
7221
7222 (define_peephole2
7223 [(parallel
7224 [(set (match_operand:BLK 0 "memory_operand" "")
7225 (xor:BLK (match_dup 0)
7226 (match_operand:BLK 1 "memory_operand" "")))
7227 (use (match_operand 2 "const_int_operand" ""))
7228 (clobber (reg:CC CC_REGNUM))])
7229 (parallel
7230 [(set (match_operand:BLK 3 "memory_operand" "")
7231 (xor:BLK (match_dup 3)
7232 (match_operand:BLK 4 "memory_operand" "")))
7233 (use (match_operand 5 "const_int_operand" ""))
7234 (clobber (reg:CC CC_REGNUM))])]
7235 "s390_offset_p (operands[0], operands[3], operands[2])
7236 && s390_offset_p (operands[1], operands[4], operands[2])
7237 && !s390_overlap_p (operands[0], operands[1],
7238 INTVAL (operands[2]) + INTVAL (operands[5]))
7239 && INTVAL (operands[2]) + INTVAL (operands[5]) <= 256"
7240 [(parallel
7241 [(set (match_dup 6) (xor:BLK (match_dup 6) (match_dup 7)))
7242 (use (match_dup 8))
7243 (clobber (reg:CC CC_REGNUM))])]
7244 "operands[6] = gen_rtx_MEM (BLKmode, XEXP (operands[0], 0));
7245 operands[7] = gen_rtx_MEM (BLKmode, XEXP (operands[1], 0));
7246 operands[8] = GEN_INT (INTVAL (operands[2]) + INTVAL (operands[5]));")
7247
7248 ;
7249 ; Block xor (XC) patterns with src == dest.
7250 ;
7251
7252 (define_insn "*xc_zero"
7253 [(set (match_operand:BLK 0 "memory_operand" "=Q")
7254 (const_int 0))
7255 (use (match_operand 1 "const_int_operand" "n"))
7256 (clobber (reg:CC CC_REGNUM))]
7257 "INTVAL (operands[1]) >= 1 && INTVAL (operands[1]) <= 256"
7258 "xc\t%O0(%1,%R0),%S0"
7259 [(set_attr "op_type" "SS")
7260 (set_attr "z196prop" "z196_cracked")])
7261
7262 (define_peephole2
7263 [(parallel
7264 [(set (match_operand:BLK 0 "memory_operand" "")
7265 (const_int 0))
7266 (use (match_operand 1 "const_int_operand" ""))
7267 (clobber (reg:CC CC_REGNUM))])
7268 (parallel
7269 [(set (match_operand:BLK 2 "memory_operand" "")
7270 (const_int 0))
7271 (use (match_operand 3 "const_int_operand" ""))
7272 (clobber (reg:CC CC_REGNUM))])]
7273 "s390_offset_p (operands[0], operands[2], operands[1])
7274 && INTVAL (operands[1]) + INTVAL (operands[3]) <= 256"
7275 [(parallel
7276 [(set (match_dup 4) (const_int 0))
7277 (use (match_dup 5))
7278 (clobber (reg:CC CC_REGNUM))])]
7279 "operands[4] = gen_rtx_MEM (BLKmode, XEXP (operands[0], 0));
7280 operands[5] = GEN_INT (INTVAL (operands[1]) + INTVAL (operands[3]));")
7281
7282
7283 ;;
7284 ;;- Negate instructions.
7285 ;;
7286
7287 ;
7288 ; neg(di|si)2 instruction pattern(s).
7289 ;
7290
7291 (define_expand "neg<mode>2"
7292 [(parallel
7293 [(set (match_operand:DSI 0 "register_operand" "=d")
7294 (neg:DSI (match_operand:DSI 1 "register_operand" "d")))
7295 (clobber (reg:CC CC_REGNUM))])]
7296 ""
7297 "")
7298
7299 (define_insn "*negdi2_sign_cc"
7300 [(set (reg CC_REGNUM)
7301 (compare (neg:DI (ashiftrt:DI (ashift:DI (subreg:DI
7302 (match_operand:SI 1 "register_operand" "d") 0)
7303 (const_int 32)) (const_int 32)))
7304 (const_int 0)))
7305 (set (match_operand:DI 0 "register_operand" "=d")
7306 (neg:DI (sign_extend:DI (match_dup 1))))]
7307 "TARGET_ZARCH && s390_match_ccmode (insn, CCAmode)"
7308 "lcgfr\t%0,%1"
7309 [(set_attr "op_type" "RRE")
7310 (set_attr "z10prop" "z10_c")])
7311
7312 (define_insn "*negdi2_sign"
7313 [(set (match_operand:DI 0 "register_operand" "=d")
7314 (neg:DI (sign_extend:DI (match_operand:SI 1 "register_operand" "d"))))
7315 (clobber (reg:CC CC_REGNUM))]
7316 "TARGET_ZARCH"
7317 "lcgfr\t%0,%1"
7318 [(set_attr "op_type" "RRE")
7319 (set_attr "z10prop" "z10_c")])
7320
7321 ; lcr, lcgr
7322 (define_insn "*neg<mode>2_cc"
7323 [(set (reg CC_REGNUM)
7324 (compare (neg:GPR (match_operand:GPR 1 "register_operand" "d"))
7325 (const_int 0)))
7326 (set (match_operand:GPR 0 "register_operand" "=d")
7327 (neg:GPR (match_dup 1)))]
7328 "s390_match_ccmode (insn, CCAmode)"
7329 "lc<g>r\t%0,%1"
7330 [(set_attr "op_type" "RR<E>")
7331 (set_attr "z10prop" "z10_super_c_E1")])
7332
7333 ; lcr, lcgr
7334 (define_insn "*neg<mode>2_cconly"
7335 [(set (reg CC_REGNUM)
7336 (compare (neg:GPR (match_operand:GPR 1 "register_operand" "d"))
7337 (const_int 0)))
7338 (clobber (match_scratch:GPR 0 "=d"))]
7339 "s390_match_ccmode (insn, CCAmode)"
7340 "lc<g>r\t%0,%1"
7341 [(set_attr "op_type" "RR<E>")
7342 (set_attr "z10prop" "z10_super_c_E1")])
7343
7344 ; lcr, lcgr
7345 (define_insn "*neg<mode>2"
7346 [(set (match_operand:GPR 0 "register_operand" "=d")
7347 (neg:GPR (match_operand:GPR 1 "register_operand" "d")))
7348 (clobber (reg:CC CC_REGNUM))]
7349 ""
7350 "lc<g>r\t%0,%1"
7351 [(set_attr "op_type" "RR<E>")
7352 (set_attr "z10prop" "z10_super_c_E1")])
7353
7354 (define_insn_and_split "*negdi2_31"
7355 [(set (match_operand:DI 0 "register_operand" "=d")
7356 (neg:DI (match_operand:DI 1 "register_operand" "d")))
7357 (clobber (reg:CC CC_REGNUM))]
7358 "!TARGET_ZARCH"
7359 "#"
7360 "&& reload_completed"
7361 [(parallel
7362 [(set (match_dup 2) (neg:SI (match_dup 3)))
7363 (clobber (reg:CC CC_REGNUM))])
7364 (parallel
7365 [(set (reg:CCAP CC_REGNUM)
7366 (compare:CCAP (neg:SI (match_dup 5)) (const_int 0)))
7367 (set (match_dup 4) (neg:SI (match_dup 5)))])
7368 (set (pc)
7369 (if_then_else (ne (reg:CCAP CC_REGNUM) (const_int 0))
7370 (pc)
7371 (label_ref (match_dup 6))))
7372 (parallel
7373 [(set (match_dup 2) (plus:SI (match_dup 2) (const_int -1)))
7374 (clobber (reg:CC CC_REGNUM))])
7375 (match_dup 6)]
7376 "operands[2] = operand_subword (operands[0], 0, 0, DImode);
7377 operands[3] = operand_subword (operands[1], 0, 0, DImode);
7378 operands[4] = operand_subword (operands[0], 1, 0, DImode);
7379 operands[5] = operand_subword (operands[1], 1, 0, DImode);
7380 operands[6] = gen_label_rtx ();")
7381
7382 ;
7383 ; neg(df|sf)2 instruction pattern(s).
7384 ;
7385
7386 (define_expand "neg<mode>2"
7387 [(parallel
7388 [(set (match_operand:BFP 0 "register_operand" "=f")
7389 (neg:BFP (match_operand:BFP 1 "register_operand" "f")))
7390 (clobber (reg:CC CC_REGNUM))])]
7391 "TARGET_HARD_FLOAT"
7392 "")
7393
7394 ; lcxbr, lcdbr, lcebr
7395 (define_insn "*neg<mode>2_cc"
7396 [(set (reg CC_REGNUM)
7397 (compare (neg:BFP (match_operand:BFP 1 "register_operand" "f"))
7398 (match_operand:BFP 2 "const0_operand" "")))
7399 (set (match_operand:BFP 0 "register_operand" "=f")
7400 (neg:BFP (match_dup 1)))]
7401 "s390_match_ccmode (insn, CCSmode) && TARGET_HARD_FLOAT"
7402 "lc<xde>br\t%0,%1"
7403 [(set_attr "op_type" "RRE")
7404 (set_attr "type" "fsimp<mode>")])
7405
7406 ; lcxbr, lcdbr, lcebr
7407 (define_insn "*neg<mode>2_cconly"
7408 [(set (reg CC_REGNUM)
7409 (compare (neg:BFP (match_operand:BFP 1 "register_operand" "f"))
7410 (match_operand:BFP 2 "const0_operand" "")))
7411 (clobber (match_scratch:BFP 0 "=f"))]
7412 "s390_match_ccmode (insn, CCSmode) && TARGET_HARD_FLOAT"
7413 "lc<xde>br\t%0,%1"
7414 [(set_attr "op_type" "RRE")
7415 (set_attr "type" "fsimp<mode>")])
7416
7417 ; lcdfr
7418 (define_insn "*neg<mode>2_nocc"
7419 [(set (match_operand:FP 0 "register_operand" "=f")
7420 (neg:FP (match_operand:FP 1 "register_operand" "<fT0>")))]
7421 "TARGET_DFP"
7422 "lcdfr\t%0,%1"
7423 [(set_attr "op_type" "RRE")
7424 (set_attr "type" "fsimp<mode>")])
7425
7426 ; lcxbr, lcdbr, lcebr
7427 (define_insn "*neg<mode>2"
7428 [(set (match_operand:BFP 0 "register_operand" "=f")
7429 (neg:BFP (match_operand:BFP 1 "register_operand" "f")))
7430 (clobber (reg:CC CC_REGNUM))]
7431 "TARGET_HARD_FLOAT"
7432 "lc<xde>br\t%0,%1"
7433 [(set_attr "op_type" "RRE")
7434 (set_attr "type" "fsimp<mode>")])
7435
7436
7437 ;;
7438 ;;- Absolute value instructions.
7439 ;;
7440
7441 ;
7442 ; abs(di|si)2 instruction pattern(s).
7443 ;
7444
7445 (define_insn "*absdi2_sign_cc"
7446 [(set (reg CC_REGNUM)
7447 (compare (abs:DI (ashiftrt:DI (ashift:DI (subreg:DI
7448 (match_operand:SI 1 "register_operand" "d") 0)
7449 (const_int 32)) (const_int 32)))
7450 (const_int 0)))
7451 (set (match_operand:DI 0 "register_operand" "=d")
7452 (abs:DI (sign_extend:DI (match_dup 1))))]
7453 "TARGET_ZARCH && s390_match_ccmode (insn, CCAmode)"
7454 "lpgfr\t%0,%1"
7455 [(set_attr "op_type" "RRE")
7456 (set_attr "z10prop" "z10_c")])
7457
7458 (define_insn "*absdi2_sign"
7459 [(set (match_operand:DI 0 "register_operand" "=d")
7460 (abs:DI (sign_extend:DI (match_operand:SI 1 "register_operand" "d"))))
7461 (clobber (reg:CC CC_REGNUM))]
7462 "TARGET_ZARCH"
7463 "lpgfr\t%0,%1"
7464 [(set_attr "op_type" "RRE")
7465 (set_attr "z10prop" "z10_c")])
7466
7467 ; lpr, lpgr
7468 (define_insn "*abs<mode>2_cc"
7469 [(set (reg CC_REGNUM)
7470 (compare (abs:GPR (match_operand:DI 1 "register_operand" "d"))
7471 (const_int 0)))
7472 (set (match_operand:GPR 0 "register_operand" "=d")
7473 (abs:GPR (match_dup 1)))]
7474 "s390_match_ccmode (insn, CCAmode)"
7475 "lp<g>r\t%0,%1"
7476 [(set_attr "op_type" "RR<E>")
7477 (set_attr "z10prop" "z10_c")])
7478
7479 ; lpr, lpgr
7480 (define_insn "*abs<mode>2_cconly"
7481 [(set (reg CC_REGNUM)
7482 (compare (abs:GPR (match_operand:GPR 1 "register_operand" "d"))
7483 (const_int 0)))
7484 (clobber (match_scratch:GPR 0 "=d"))]
7485 "s390_match_ccmode (insn, CCAmode)"
7486 "lp<g>r\t%0,%1"
7487 [(set_attr "op_type" "RR<E>")
7488 (set_attr "z10prop" "z10_c")])
7489
7490 ; lpr, lpgr
7491 (define_insn "abs<mode>2"
7492 [(set (match_operand:GPR 0 "register_operand" "=d")
7493 (abs:GPR (match_operand:GPR 1 "register_operand" "d")))
7494 (clobber (reg:CC CC_REGNUM))]
7495 ""
7496 "lp<g>r\t%0,%1"
7497 [(set_attr "op_type" "RR<E>")
7498 (set_attr "z10prop" "z10_c")])
7499
7500 ;
7501 ; abs(df|sf)2 instruction pattern(s).
7502 ;
7503
7504 (define_expand "abs<mode>2"
7505 [(parallel
7506 [(set (match_operand:BFP 0 "register_operand" "=f")
7507 (abs:BFP (match_operand:BFP 1 "register_operand" "f")))
7508 (clobber (reg:CC CC_REGNUM))])]
7509 "TARGET_HARD_FLOAT"
7510 "")
7511
7512 ; lpxbr, lpdbr, lpebr
7513 (define_insn "*abs<mode>2_cc"
7514 [(set (reg CC_REGNUM)
7515 (compare (abs:BFP (match_operand:BFP 1 "register_operand" "f"))
7516 (match_operand:BFP 2 "const0_operand" "")))
7517 (set (match_operand:BFP 0 "register_operand" "=f")
7518 (abs:BFP (match_dup 1)))]
7519 "s390_match_ccmode (insn, CCSmode) && TARGET_HARD_FLOAT"
7520 "lp<xde>br\t%0,%1"
7521 [(set_attr "op_type" "RRE")
7522 (set_attr "type" "fsimp<mode>")])
7523
7524 ; lpxbr, lpdbr, lpebr
7525 (define_insn "*abs<mode>2_cconly"
7526 [(set (reg CC_REGNUM)
7527 (compare (abs:BFP (match_operand:BFP 1 "register_operand" "f"))
7528 (match_operand:BFP 2 "const0_operand" "")))
7529 (clobber (match_scratch:BFP 0 "=f"))]
7530 "s390_match_ccmode (insn, CCSmode) && TARGET_HARD_FLOAT"
7531 "lp<xde>br\t%0,%1"
7532 [(set_attr "op_type" "RRE")
7533 (set_attr "type" "fsimp<mode>")])
7534
7535 ; lpdfr
7536 (define_insn "*abs<mode>2_nocc"
7537 [(set (match_operand:FP 0 "register_operand" "=f")
7538 (abs:FP (match_operand:FP 1 "register_operand" "<fT0>")))]
7539 "TARGET_DFP"
7540 "lpdfr\t%0,%1"
7541 [(set_attr "op_type" "RRE")
7542 (set_attr "type" "fsimp<mode>")])
7543
7544 ; lpxbr, lpdbr, lpebr
7545 (define_insn "*abs<mode>2"
7546 [(set (match_operand:BFP 0 "register_operand" "=f")
7547 (abs:BFP (match_operand:BFP 1 "register_operand" "f")))
7548 (clobber (reg:CC CC_REGNUM))]
7549 "TARGET_HARD_FLOAT"
7550 "lp<xde>br\t%0,%1"
7551 [(set_attr "op_type" "RRE")
7552 (set_attr "type" "fsimp<mode>")])
7553
7554
7555 ;;
7556 ;;- Negated absolute value instructions
7557 ;;
7558
7559 ;
7560 ; Integer
7561 ;
7562
7563 (define_insn "*negabsdi2_sign_cc"
7564 [(set (reg CC_REGNUM)
7565 (compare (neg:DI (abs:DI (ashiftrt:DI (ashift:DI (subreg:DI
7566 (match_operand:SI 1 "register_operand" "d") 0)
7567 (const_int 32)) (const_int 32))))
7568 (const_int 0)))
7569 (set (match_operand:DI 0 "register_operand" "=d")
7570 (neg:DI (abs:DI (sign_extend:DI (match_dup 1)))))]
7571 "TARGET_ZARCH && s390_match_ccmode (insn, CCAmode)"
7572 "lngfr\t%0,%1"
7573 [(set_attr "op_type" "RRE")
7574 (set_attr "z10prop" "z10_c")])
7575
7576 (define_insn "*negabsdi2_sign"
7577 [(set (match_operand:DI 0 "register_operand" "=d")
7578 (neg:DI (abs:DI (sign_extend:DI
7579 (match_operand:SI 1 "register_operand" "d")))))
7580 (clobber (reg:CC CC_REGNUM))]
7581 "TARGET_ZARCH"
7582 "lngfr\t%0,%1"
7583 [(set_attr "op_type" "RRE")
7584 (set_attr "z10prop" "z10_c")])
7585
7586 ; lnr, lngr
7587 (define_insn "*negabs<mode>2_cc"
7588 [(set (reg CC_REGNUM)
7589 (compare (neg:GPR (abs:GPR (match_operand:GPR 1 "register_operand" "d")))
7590 (const_int 0)))
7591 (set (match_operand:GPR 0 "register_operand" "=d")
7592 (neg:GPR (abs:GPR (match_dup 1))))]
7593 "s390_match_ccmode (insn, CCAmode)"
7594 "ln<g>r\t%0,%1"
7595 [(set_attr "op_type" "RR<E>")
7596 (set_attr "z10prop" "z10_c")])
7597
7598 ; lnr, lngr
7599 (define_insn "*negabs<mode>2_cconly"
7600 [(set (reg CC_REGNUM)
7601 (compare (neg:GPR (abs:GPR (match_operand:GPR 1 "register_operand" "d")))
7602 (const_int 0)))
7603 (clobber (match_scratch:GPR 0 "=d"))]
7604 "s390_match_ccmode (insn, CCAmode)"
7605 "ln<g>r\t%0,%1"
7606 [(set_attr "op_type" "RR<E>")
7607 (set_attr "z10prop" "z10_c")])
7608
7609 ; lnr, lngr
7610 (define_insn "*negabs<mode>2"
7611 [(set (match_operand:GPR 0 "register_operand" "=d")
7612 (neg:GPR (abs:GPR (match_operand:GPR 1 "register_operand" "d"))))
7613 (clobber (reg:CC CC_REGNUM))]
7614 ""
7615 "ln<g>r\t%0,%1"
7616 [(set_attr "op_type" "RR<E>")
7617 (set_attr "z10prop" "z10_c")])
7618
7619 ;
7620 ; Floating point
7621 ;
7622
7623 ; lnxbr, lndbr, lnebr
7624 (define_insn "*negabs<mode>2_cc"
7625 [(set (reg CC_REGNUM)
7626 (compare (neg:BFP (abs:BFP (match_operand:BFP 1 "register_operand" "f")))
7627 (match_operand:BFP 2 "const0_operand" "")))
7628 (set (match_operand:BFP 0 "register_operand" "=f")
7629 (neg:BFP (abs:BFP (match_dup 1))))]
7630 "s390_match_ccmode (insn, CCSmode) && TARGET_HARD_FLOAT"
7631 "ln<xde>br\t%0,%1"
7632 [(set_attr "op_type" "RRE")
7633 (set_attr "type" "fsimp<mode>")])
7634
7635 ; lnxbr, lndbr, lnebr
7636 (define_insn "*negabs<mode>2_cconly"
7637 [(set (reg CC_REGNUM)
7638 (compare (neg:BFP (abs:BFP (match_operand:BFP 1 "register_operand" "f")))
7639 (match_operand:BFP 2 "const0_operand" "")))
7640 (clobber (match_scratch:BFP 0 "=f"))]
7641 "s390_match_ccmode (insn, CCSmode) && TARGET_HARD_FLOAT"
7642 "ln<xde>br\t%0,%1"
7643 [(set_attr "op_type" "RRE")
7644 (set_attr "type" "fsimp<mode>")])
7645
7646 ; lndfr
7647 (define_insn "*negabs<mode>2_nocc"
7648 [(set (match_operand:FP 0 "register_operand" "=f")
7649 (neg:FP (abs:FP (match_operand:BFP 1 "register_operand" "<fT0>"))))]
7650 "TARGET_DFP"
7651 "lndfr\t%0,%1"
7652 [(set_attr "op_type" "RRE")
7653 (set_attr "type" "fsimp<mode>")])
7654
7655 ; lnxbr, lndbr, lnebr
7656 (define_insn "*negabs<mode>2"
7657 [(set (match_operand:BFP 0 "register_operand" "=f")
7658 (neg:BFP (abs:BFP (match_operand:BFP 1 "register_operand" "f"))))
7659 (clobber (reg:CC CC_REGNUM))]
7660 "TARGET_HARD_FLOAT"
7661 "ln<xde>br\t%0,%1"
7662 [(set_attr "op_type" "RRE")
7663 (set_attr "type" "fsimp<mode>")])
7664
7665 ;;
7666 ;;- Square root instructions.
7667 ;;
7668
7669 ;
7670 ; sqrt(df|sf)2 instruction pattern(s).
7671 ;
7672
7673 ; sqxbr, sqdbr, sqebr, sqdb, sqeb
7674 (define_insn "sqrt<mode>2"
7675 [(set (match_operand:BFP 0 "register_operand" "=f,f")
7676 (sqrt:BFP (match_operand:BFP 1 "general_operand" "f,<Rf>")))]
7677 "TARGET_HARD_FLOAT"
7678 "@
7679 sq<xde>br\t%0,%1
7680 sq<xde>b\t%0,%1"
7681 [(set_attr "op_type" "RRE,RXE")
7682 (set_attr "type" "fsqrt<mode>")])
7683
7684
7685 ;;
7686 ;;- One complement instructions.
7687 ;;
7688
7689 ;
7690 ; one_cmpl(di|si|hi|qi)2 instruction pattern(s).
7691 ;
7692
7693 (define_expand "one_cmpl<mode>2"
7694 [(parallel
7695 [(set (match_operand:INT 0 "register_operand" "")
7696 (xor:INT (match_operand:INT 1 "register_operand" "")
7697 (const_int -1)))
7698 (clobber (reg:CC CC_REGNUM))])]
7699 ""
7700 "")
7701
7702
7703 ;;
7704 ;; Find leftmost bit instructions.
7705 ;;
7706
7707 (define_expand "clzdi2"
7708 [(set (match_operand:DI 0 "register_operand" "=d")
7709 (clz:DI (match_operand:DI 1 "register_operand" "d")))]
7710 "TARGET_EXTIMM && TARGET_ZARCH"
7711 {
7712 rtx insn, clz_equal;
7713 rtx wide_reg = gen_reg_rtx (TImode);
7714 rtx msb = gen_rtx_CONST_INT (DImode, (unsigned HOST_WIDE_INT) 1 << 63);
7715
7716 clz_equal = gen_rtx_CLZ (DImode, operands[1]);
7717
7718 emit_insn (gen_clztidi2 (wide_reg, operands[1], msb));
7719
7720 insn = emit_move_insn (operands[0], gen_highpart (DImode, wide_reg));
7721 set_unique_reg_note (insn, REG_EQUAL, clz_equal);
7722
7723 DONE;
7724 })
7725
7726 (define_insn "clztidi2"
7727 [(set (match_operand:TI 0 "register_operand" "=d")
7728 (ior:TI
7729 (ashift:TI
7730 (zero_extend:TI
7731 (xor:DI (match_operand:DI 1 "register_operand" "d")
7732 (lshiftrt (match_operand:DI 2 "const_int_operand" "")
7733 (subreg:SI (clz:DI (match_dup 1)) 4))))
7734
7735 (const_int 64))
7736 (zero_extend:TI (clz:DI (match_dup 1)))))
7737 (clobber (reg:CC CC_REGNUM))]
7738 "(unsigned HOST_WIDE_INT) INTVAL (operands[2])
7739 == (unsigned HOST_WIDE_INT) 1 << 63
7740 && TARGET_EXTIMM && TARGET_ZARCH"
7741 "flogr\t%0,%1"
7742 [(set_attr "op_type" "RRE")])
7743
7744
7745 ;;
7746 ;;- Rotate instructions.
7747 ;;
7748
7749 ;
7750 ; rotl(di|si)3 instruction pattern(s).
7751 ;
7752
7753 ; rll, rllg
7754 (define_insn "rotl<mode>3"
7755 [(set (match_operand:GPR 0 "register_operand" "=d")
7756 (rotate:GPR (match_operand:GPR 1 "register_operand" "d")
7757 (match_operand:SI 2 "shift_count_or_setmem_operand" "Y")))]
7758 "TARGET_CPU_ZARCH"
7759 "rll<g>\t%0,%1,%Y2"
7760 [(set_attr "op_type" "RSE")
7761 (set_attr "atype" "reg")
7762 (set_attr "z10prop" "z10_super_E1")])
7763
7764 ; rll, rllg
7765 (define_insn "*rotl<mode>3_and"
7766 [(set (match_operand:GPR 0 "register_operand" "=d")
7767 (rotate:GPR (match_operand:GPR 1 "register_operand" "d")
7768 (and:SI (match_operand:SI 2 "shift_count_or_setmem_operand" "Y")
7769 (match_operand:SI 3 "const_int_operand" "n"))))]
7770 "TARGET_CPU_ZARCH && (INTVAL (operands[3]) & 63) == 63"
7771 "rll<g>\t%0,%1,%Y2"
7772 [(set_attr "op_type" "RSE")
7773 (set_attr "atype" "reg")
7774 (set_attr "z10prop" "z10_super_E1")])
7775
7776
7777 ;;
7778 ;;- Shift instructions.
7779 ;;
7780
7781 ;
7782 ; (ashl|lshr)(di|si)3 instruction pattern(s).
7783 ; Left shifts and logical right shifts
7784
7785 (define_expand "<shift><mode>3"
7786 [(set (match_operand:DSI 0 "register_operand" "")
7787 (SHIFT:DSI (match_operand:DSI 1 "register_operand" "")
7788 (match_operand:SI 2 "shift_count_or_setmem_operand" "")))]
7789 ""
7790 "")
7791
7792 ; sldl, srdl
7793 (define_insn "*<shift>di3_31"
7794 [(set (match_operand:DI 0 "register_operand" "=d")
7795 (SHIFT:DI (match_operand:DI 1 "register_operand" "0")
7796 (match_operand:SI 2 "shift_count_or_setmem_operand" "Y")))]
7797 "!TARGET_ZARCH"
7798 "s<lr>dl\t%0,%Y2"
7799 [(set_attr "op_type" "RS")
7800 (set_attr "atype" "reg")
7801 (set_attr "z196prop" "z196_cracked")])
7802
7803 ; sll, srl, sllg, srlg, sllk, srlk
7804 (define_insn "*<shift><mode>3"
7805 [(set (match_operand:GPR 0 "register_operand" "=d,d")
7806 (SHIFT:GPR (match_operand:GPR 1 "register_operand" "<d0>,d")
7807 (match_operand:SI 2 "shift_count_or_setmem_operand" "Y,Y")))]
7808 ""
7809 "@
7810 s<lr>l<g>\t%0,<1>%Y2
7811 s<lr>l<gk>\t%0,%1,%Y2"
7812 [(set_attr "op_type" "RS<E>,RSY")
7813 (set_attr "atype" "reg,reg")
7814 (set_attr "cpu_facility" "*,z196")
7815 (set_attr "z10prop" "z10_super_E1,*")])
7816
7817 ; sldl, srdl
7818 (define_insn "*<shift>di3_31_and"
7819 [(set (match_operand:DI 0 "register_operand" "=d")
7820 (SHIFT:DI (match_operand:DI 1 "register_operand" "0")
7821 (and:SI (match_operand:SI 2 "shift_count_or_setmem_operand" "Y")
7822 (match_operand:SI 3 "const_int_operand" "n"))))]
7823 "!TARGET_ZARCH && (INTVAL (operands[3]) & 63) == 63"
7824 "s<lr>dl\t%0,%Y2"
7825 [(set_attr "op_type" "RS")
7826 (set_attr "atype" "reg")])
7827
7828 ; sll, srl, sllg, srlg, sllk, srlk
7829 (define_insn "*<shift><mode>3_and"
7830 [(set (match_operand:GPR 0 "register_operand" "=d,d")
7831 (SHIFT:GPR (match_operand:GPR 1 "register_operand" "<d0>,d")
7832 (and:SI (match_operand:SI 2 "shift_count_or_setmem_operand" "Y,Y")
7833 (match_operand:SI 3 "const_int_operand" "n,n"))))]
7834 "(INTVAL (operands[3]) & 63) == 63"
7835 "@
7836 s<lr>l<g>\t%0,<1>%Y2
7837 s<lr>l<gk>\t%0,%1,%Y2"
7838 [(set_attr "op_type" "RS<E>,RSY")
7839 (set_attr "atype" "reg,reg")
7840 (set_attr "cpu_facility" "*,z196")
7841 (set_attr "z10prop" "z10_super_E1,*")])
7842
7843 ;
7844 ; ashr(di|si)3 instruction pattern(s).
7845 ; Arithmetic right shifts
7846
7847 (define_expand "ashr<mode>3"
7848 [(parallel
7849 [(set (match_operand:DSI 0 "register_operand" "")
7850 (ashiftrt:DSI (match_operand:DSI 1 "register_operand" "")
7851 (match_operand:SI 2 "shift_count_or_setmem_operand" "")))
7852 (clobber (reg:CC CC_REGNUM))])]
7853 ""
7854 "")
7855
7856 (define_insn "*ashrdi3_cc_31"
7857 [(set (reg CC_REGNUM)
7858 (compare (ashiftrt:DI (match_operand:DI 1 "register_operand" "0")
7859 (match_operand:SI 2 "shift_count_or_setmem_operand" "Y"))
7860 (const_int 0)))
7861 (set (match_operand:DI 0 "register_operand" "=d")
7862 (ashiftrt:DI (match_dup 1) (match_dup 2)))]
7863 "!TARGET_ZARCH && s390_match_ccmode(insn, CCSmode)"
7864 "srda\t%0,%Y2"
7865 [(set_attr "op_type" "RS")
7866 (set_attr "atype" "reg")])
7867
7868 (define_insn "*ashrdi3_cconly_31"
7869 [(set (reg CC_REGNUM)
7870 (compare (ashiftrt:DI (match_operand:DI 1 "register_operand" "0")
7871 (match_operand:SI 2 "shift_count_or_setmem_operand" "Y"))
7872 (const_int 0)))
7873 (clobber (match_scratch:DI 0 "=d"))]
7874 "!TARGET_ZARCH && s390_match_ccmode(insn, CCSmode)"
7875 "srda\t%0,%Y2"
7876 [(set_attr "op_type" "RS")
7877 (set_attr "atype" "reg")])
7878
7879 (define_insn "*ashrdi3_31"
7880 [(set (match_operand:DI 0 "register_operand" "=d")
7881 (ashiftrt:DI (match_operand:DI 1 "register_operand" "0")
7882 (match_operand:SI 2 "shift_count_or_setmem_operand" "Y")))
7883 (clobber (reg:CC CC_REGNUM))]
7884 "!TARGET_ZARCH"
7885 "srda\t%0,%Y2"
7886 [(set_attr "op_type" "RS")
7887 (set_attr "atype" "reg")])
7888
7889 ; sra, srag, srak
7890 (define_insn "*ashr<mode>3_cc"
7891 [(set (reg CC_REGNUM)
7892 (compare (ashiftrt:GPR (match_operand:GPR 1 "register_operand" "<d0>,d")
7893 (match_operand:SI 2 "shift_count_or_setmem_operand" "Y,Y"))
7894 (const_int 0)))
7895 (set (match_operand:GPR 0 "register_operand" "=d,d")
7896 (ashiftrt:GPR (match_dup 1) (match_dup 2)))]
7897 "s390_match_ccmode(insn, CCSmode)"
7898 "@
7899 sra<g>\t%0,<1>%Y2
7900 sra<gk>\t%0,%1,%Y2"
7901 [(set_attr "op_type" "RS<E>,RSY")
7902 (set_attr "atype" "reg,reg")
7903 (set_attr "cpu_facility" "*,z196")
7904 (set_attr "z10prop" "z10_super_E1,*")])
7905
7906 ; sra, srag, srak
7907 (define_insn "*ashr<mode>3_cconly"
7908 [(set (reg CC_REGNUM)
7909 (compare (ashiftrt:GPR (match_operand:GPR 1 "register_operand" "<d0>,d")
7910 (match_operand:SI 2 "shift_count_or_setmem_operand" "Y,Y"))
7911 (const_int 0)))
7912 (clobber (match_scratch:GPR 0 "=d,d"))]
7913 "s390_match_ccmode(insn, CCSmode)"
7914 "@
7915 sra<g>\t%0,<1>%Y2
7916 sra<gk>\t%0,%1,%Y2"
7917 [(set_attr "op_type" "RS<E>,RSY")
7918 (set_attr "atype" "reg,reg")
7919 (set_attr "cpu_facility" "*,z196")
7920 (set_attr "z10prop" "z10_super_E1,*")])
7921
7922 ; sra, srag
7923 (define_insn "*ashr<mode>3"
7924 [(set (match_operand:GPR 0 "register_operand" "=d,d")
7925 (ashiftrt:GPR (match_operand:GPR 1 "register_operand" "<d0>,d")
7926 (match_operand:SI 2 "shift_count_or_setmem_operand" "Y,Y")))
7927 (clobber (reg:CC CC_REGNUM))]
7928 ""
7929 "@
7930 sra<g>\t%0,<1>%Y2
7931 sra<gk>\t%0,%1,%Y2"
7932 [(set_attr "op_type" "RS<E>,RSY")
7933 (set_attr "atype" "reg,reg")
7934 (set_attr "cpu_facility" "*,z196")
7935 (set_attr "z10prop" "z10_super_E1,*")])
7936
7937
7938 ; shift pattern with implicit ANDs
7939
7940 (define_insn "*ashrdi3_cc_31_and"
7941 [(set (reg CC_REGNUM)
7942 (compare (ashiftrt:DI (match_operand:DI 1 "register_operand" "0")
7943 (and:SI (match_operand:SI 2 "shift_count_or_setmem_operand" "Y")
7944 (match_operand:SI 3 "const_int_operand" "n")))
7945 (const_int 0)))
7946 (set (match_operand:DI 0 "register_operand" "=d")
7947 (ashiftrt:DI (match_dup 1) (and:SI (match_dup 2) (match_dup 3))))]
7948 "!TARGET_ZARCH && s390_match_ccmode(insn, CCSmode)
7949 && (INTVAL (operands[3]) & 63) == 63"
7950 "srda\t%0,%Y2"
7951 [(set_attr "op_type" "RS")
7952 (set_attr "atype" "reg")])
7953
7954 (define_insn "*ashrdi3_cconly_31_and"
7955 [(set (reg CC_REGNUM)
7956 (compare (ashiftrt:DI (match_operand:DI 1 "register_operand" "0")
7957 (and:SI (match_operand:SI 2 "shift_count_or_setmem_operand" "Y")
7958 (match_operand:SI 3 "const_int_operand" "n")))
7959 (const_int 0)))
7960 (clobber (match_scratch:DI 0 "=d"))]
7961 "!TARGET_ZARCH && s390_match_ccmode(insn, CCSmode)
7962 && (INTVAL (operands[3]) & 63) == 63"
7963 "srda\t%0,%Y2"
7964 [(set_attr "op_type" "RS")
7965 (set_attr "atype" "reg")])
7966
7967 (define_insn "*ashrdi3_31_and"
7968 [(set (match_operand:DI 0 "register_operand" "=d")
7969 (ashiftrt:DI (match_operand:DI 1 "register_operand" "0")
7970 (and:SI (match_operand:SI 2 "shift_count_or_setmem_operand" "Y")
7971 (match_operand:SI 3 "const_int_operand" "n"))))
7972 (clobber (reg:CC CC_REGNUM))]
7973 "!TARGET_ZARCH && (INTVAL (operands[3]) & 63) == 63"
7974 "srda\t%0,%Y2"
7975 [(set_attr "op_type" "RS")
7976 (set_attr "atype" "reg")])
7977
7978 ; sra, srag, srak
7979 (define_insn "*ashr<mode>3_cc_and"
7980 [(set (reg CC_REGNUM)
7981 (compare (ashiftrt:GPR (match_operand:GPR 1 "register_operand" "<d0>,d")
7982 (and:SI (match_operand:SI 2 "shift_count_or_setmem_operand" "Y,Y")
7983 (match_operand:SI 3 "const_int_operand" "n,n")))
7984 (const_int 0)))
7985 (set (match_operand:GPR 0 "register_operand" "=d,d")
7986 (ashiftrt:GPR (match_dup 1) (and:SI (match_dup 2) (match_dup 3))))]
7987 "s390_match_ccmode(insn, CCSmode) && (INTVAL (operands[3]) & 63) == 63"
7988 "@
7989 sra<g>\t%0,<1>%Y2
7990 sra<gk>\t%0,%1,%Y2"
7991 [(set_attr "op_type" "RS<E>,RSY")
7992 (set_attr "atype" "reg,reg")
7993 (set_attr "cpu_facility" "*,z196")
7994 (set_attr "z10prop" "z10_super_E1,*")])
7995
7996 ; sra, srag, srak
7997 (define_insn "*ashr<mode>3_cconly_and"
7998 [(set (reg CC_REGNUM)
7999 (compare (ashiftrt:GPR (match_operand:GPR 1 "register_operand" "<d0>,d")
8000 (and:SI (match_operand:SI 2 "shift_count_or_setmem_operand" "Y,Y")
8001 (match_operand:SI 3 "const_int_operand" "n,n")))
8002 (const_int 0)))
8003 (clobber (match_scratch:GPR 0 "=d,d"))]
8004 "s390_match_ccmode(insn, CCSmode) && (INTVAL (operands[3]) & 63) == 63"
8005 "@
8006 sra<g>\t%0,<1>%Y2
8007 sra<gk>\t%0,%1,%Y2"
8008 [(set_attr "op_type" "RS<E>,RSY")
8009 (set_attr "atype" "reg,reg")
8010 (set_attr "cpu_facility" "*,z196")
8011 (set_attr "z10prop" "z10_super_E1,*")])
8012
8013 ; sra, srag, srak
8014 (define_insn "*ashr<mode>3_and"
8015 [(set (match_operand:GPR 0 "register_operand" "=d,d")
8016 (ashiftrt:GPR (match_operand:GPR 1 "register_operand" "<d0>,d")
8017 (and:SI (match_operand:SI 2 "shift_count_or_setmem_operand" "Y,Y")
8018 (match_operand:SI 3 "const_int_operand" "n,n"))))
8019 (clobber (reg:CC CC_REGNUM))]
8020 "(INTVAL (operands[3]) & 63) == 63"
8021 "@
8022 sra<g>\t%0,<1>%Y2
8023 sra<gk>\t%0,%1,%Y2"
8024 [(set_attr "op_type" "RS<E>,RSY")
8025 (set_attr "atype" "reg,reg")
8026 (set_attr "cpu_facility" "*,z196")
8027 (set_attr "z10prop" "z10_super_E1,*")])
8028
8029
8030 ;;
8031 ;; Branch instruction patterns.
8032 ;;
8033
8034 (define_expand "cbranch<mode>4"
8035 [(set (pc)
8036 (if_then_else (match_operator 0 "comparison_operator"
8037 [(match_operand:GPR 1 "register_operand" "")
8038 (match_operand:GPR 2 "general_operand" "")])
8039 (label_ref (match_operand 3 "" ""))
8040 (pc)))]
8041 ""
8042 "s390_emit_jump (operands[3],
8043 s390_emit_compare (GET_CODE (operands[0]), operands[1], operands[2]));
8044 DONE;")
8045
8046 (define_expand "cbranch<mode>4"
8047 [(set (pc)
8048 (if_then_else (match_operator 0 "comparison_operator"
8049 [(match_operand:FP 1 "register_operand" "")
8050 (match_operand:FP 2 "general_operand" "")])
8051 (label_ref (match_operand 3 "" ""))
8052 (pc)))]
8053 "TARGET_HARD_FLOAT"
8054 "s390_emit_jump (operands[3],
8055 s390_emit_compare (GET_CODE (operands[0]), operands[1], operands[2]));
8056 DONE;")
8057
8058 (define_expand "cbranchcc4"
8059 [(set (pc)
8060 (if_then_else (match_operator 0 "s390_eqne_operator"
8061 [(match_operand 1 "cc_reg_operand" "")
8062 (match_operand 2 "const0_operand" "")])
8063 (label_ref (match_operand 3 "" ""))
8064 (pc)))]
8065 "TARGET_HARD_FLOAT"
8066 "s390_emit_jump (operands[3],
8067 s390_emit_compare (GET_CODE (operands[0]), operands[1], operands[2]));
8068 DONE;")
8069
8070
8071
8072 ;;
8073 ;;- Conditional jump instructions.
8074 ;;
8075
8076 (define_insn "*cjump_64"
8077 [(set (pc)
8078 (if_then_else
8079 (match_operator 1 "s390_comparison" [(reg CC_REGNUM)
8080 (match_operand 2 "const_int_operand" "")])
8081 (label_ref (match_operand 0 "" ""))
8082 (pc)))]
8083 "TARGET_CPU_ZARCH"
8084 {
8085 if (get_attr_length (insn) == 4)
8086 return "j%C1\t%l0";
8087 else
8088 return "jg%C1\t%l0";
8089 }
8090 [(set_attr "op_type" "RI")
8091 (set_attr "type" "branch")
8092 (set (attr "length")
8093 (if_then_else (lt (abs (minus (pc) (match_dup 0))) (const_int 60000))
8094 (const_int 4) (const_int 6)))])
8095
8096 (define_insn "*cjump_31"
8097 [(set (pc)
8098 (if_then_else
8099 (match_operator 1 "s390_comparison" [(reg CC_REGNUM)
8100 (match_operand 2 "const_int_operand" "")])
8101 (label_ref (match_operand 0 "" ""))
8102 (pc)))]
8103 "!TARGET_CPU_ZARCH"
8104 {
8105 gcc_assert (get_attr_length (insn) == 4);
8106 return "j%C1\t%l0";
8107 }
8108 [(set_attr "op_type" "RI")
8109 (set_attr "type" "branch")
8110 (set (attr "length")
8111 (if_then_else (not (match_test "flag_pic"))
8112 (if_then_else (lt (abs (minus (pc) (match_dup 0))) (const_int 60000))
8113 (const_int 4) (const_int 6))
8114 (if_then_else (lt (abs (minus (pc) (match_dup 0))) (const_int 60000))
8115 (const_int 4) (const_int 8))))])
8116
8117 (define_insn "*cjump_long"
8118 [(set (pc)
8119 (if_then_else
8120 (match_operator 1 "s390_comparison" [(reg CC_REGNUM) (const_int 0)])
8121 (match_operand 0 "address_operand" "ZQZR")
8122 (pc)))]
8123 ""
8124 {
8125 if (get_attr_op_type (insn) == OP_TYPE_RR)
8126 return "b%C1r\t%0";
8127 else
8128 return "b%C1\t%a0";
8129 }
8130 [(set (attr "op_type")
8131 (if_then_else (match_operand 0 "register_operand" "")
8132 (const_string "RR") (const_string "RX")))
8133 (set_attr "type" "branch")
8134 (set_attr "atype" "agen")])
8135
8136 ;; A conditional return instruction.
8137 (define_insn "*c<code>"
8138 [(set (pc)
8139 (if_then_else
8140 (match_operator 0 "s390_comparison" [(reg CC_REGNUM) (const_int 0)])
8141 (ANY_RETURN)
8142 (pc)))]
8143 "s390_can_use_<code>_insn ()"
8144 "b%C0r\t%%r14"
8145 [(set_attr "op_type" "RR")
8146 (set_attr "type" "jsr")
8147 (set_attr "atype" "agen")])
8148
8149 ;;
8150 ;;- Negated conditional jump instructions.
8151 ;;
8152
8153 (define_insn "*icjump_64"
8154 [(set (pc)
8155 (if_then_else
8156 (match_operator 1 "s390_comparison" [(reg CC_REGNUM) (const_int 0)])
8157 (pc)
8158 (label_ref (match_operand 0 "" ""))))]
8159 "TARGET_CPU_ZARCH"
8160 {
8161 if (get_attr_length (insn) == 4)
8162 return "j%D1\t%l0";
8163 else
8164 return "jg%D1\t%l0";
8165 }
8166 [(set_attr "op_type" "RI")
8167 (set_attr "type" "branch")
8168 (set (attr "length")
8169 (if_then_else (lt (abs (minus (pc) (match_dup 0))) (const_int 60000))
8170 (const_int 4) (const_int 6)))])
8171
8172 (define_insn "*icjump_31"
8173 [(set (pc)
8174 (if_then_else
8175 (match_operator 1 "s390_comparison" [(reg CC_REGNUM) (const_int 0)])
8176 (pc)
8177 (label_ref (match_operand 0 "" ""))))]
8178 "!TARGET_CPU_ZARCH"
8179 {
8180 gcc_assert (get_attr_length (insn) == 4);
8181 return "j%D1\t%l0";
8182 }
8183 [(set_attr "op_type" "RI")
8184 (set_attr "type" "branch")
8185 (set (attr "length")
8186 (if_then_else (not (match_test "flag_pic"))
8187 (if_then_else (lt (abs (minus (pc) (match_dup 0))) (const_int 60000))
8188 (const_int 4) (const_int 6))
8189 (if_then_else (lt (abs (minus (pc) (match_dup 0))) (const_int 60000))
8190 (const_int 4) (const_int 8))))])
8191
8192 (define_insn "*icjump_long"
8193 [(set (pc)
8194 (if_then_else
8195 (match_operator 1 "s390_comparison" [(reg CC_REGNUM) (const_int 0)])
8196 (pc)
8197 (match_operand 0 "address_operand" "ZQZR")))]
8198 ""
8199 {
8200 if (get_attr_op_type (insn) == OP_TYPE_RR)
8201 return "b%D1r\t%0";
8202 else
8203 return "b%D1\t%a0";
8204 }
8205 [(set (attr "op_type")
8206 (if_then_else (match_operand 0 "register_operand" "")
8207 (const_string "RR") (const_string "RX")))
8208 (set_attr "type" "branch")
8209 (set_attr "atype" "agen")])
8210
8211 ;;
8212 ;;- Trap instructions.
8213 ;;
8214
8215 (define_insn "trap"
8216 [(trap_if (const_int 1) (const_int 0))]
8217 ""
8218 "j\t.+2"
8219 [(set_attr "op_type" "RI")
8220 (set_attr "type" "branch")])
8221
8222 (define_expand "ctrap<mode>4"
8223 [(trap_if (match_operator 0 "comparison_operator"
8224 [(match_operand:GPR 1 "register_operand" "")
8225 (match_operand:GPR 2 "general_operand" "")])
8226 (match_operand 3 "const0_operand" ""))]
8227 ""
8228 {
8229 rtx cond = s390_emit_compare (GET_CODE (operands[0]),
8230 operands[1], operands[2]);
8231 emit_insn (gen_condtrap (cond, XEXP (cond, 0)));
8232 DONE;
8233 })
8234
8235 (define_expand "ctrap<mode>4"
8236 [(trap_if (match_operator 0 "comparison_operator"
8237 [(match_operand:FP 1 "register_operand" "")
8238 (match_operand:FP 2 "general_operand" "")])
8239 (match_operand 3 "const0_operand" ""))]
8240 ""
8241 {
8242 rtx cond = s390_emit_compare (GET_CODE (operands[0]),
8243 operands[1], operands[2]);
8244 emit_insn (gen_condtrap (cond, XEXP (cond, 0)));
8245 DONE;
8246 })
8247
8248 (define_insn "condtrap"
8249 [(trap_if (match_operator 0 "s390_comparison"
8250 [(match_operand 1 "cc_reg_operand" "c")
8251 (const_int 0)])
8252 (const_int 0))]
8253 ""
8254 "j%C0\t.+2";
8255 [(set_attr "op_type" "RI")
8256 (set_attr "type" "branch")])
8257
8258 ; crt, cgrt, cit, cgit
8259 (define_insn "*cmp_and_trap_signed_int<mode>"
8260 [(trap_if (match_operator 0 "s390_signed_integer_comparison"
8261 [(match_operand:GPR 1 "register_operand" "d,d")
8262 (match_operand:GPR 2 "nonmemory_operand" "d,K")])
8263 (const_int 0))]
8264 "TARGET_Z10"
8265 "@
8266 c<g>rt%C0\t%1,%2
8267 c<g>it%C0\t%1,%h2"
8268 [(set_attr "op_type" "RRF,RIE")
8269 (set_attr "type" "branch")
8270 (set_attr "z10prop" "z10_super_c,z10_super")])
8271
8272 ; clrt, clgrt, clfit, clgit, clt, clgt
8273 (define_insn "*cmp_and_trap_unsigned_int<mode>"
8274 [(trap_if (match_operator 0 "s390_unsigned_integer_comparison"
8275 [(match_operand:GPR 1 "register_operand" "d,d, d")
8276 (match_operand:GPR 2 "general_operand" "d,D,RT")])
8277 (const_int 0))]
8278 "TARGET_Z10"
8279 "@
8280 cl<g>rt%C0\t%1,%2
8281 cl<gf>it%C0\t%1,%x2
8282 cl<g>t%C0\t%1,%2"
8283 [(set_attr "op_type" "RRF,RIE,RSY")
8284 (set_attr "type" "branch")
8285 (set_attr "z10prop" "z10_super_c,z10_super,*")
8286 (set_attr "cpu_facility" "z10,z10,zEC12")])
8287
8288 ; lat, lgat
8289 (define_insn "*load_and_trap<mode>"
8290 [(trap_if (eq (match_operand:GPR 0 "memory_operand" "RT")
8291 (const_int 0))
8292 (const_int 0))
8293 (set (match_operand:GPR 1 "register_operand" "=d")
8294 (match_dup 0))]
8295 "TARGET_ZEC12"
8296 "l<g>at\t%1,%0"
8297 [(set_attr "op_type" "RXY")])
8298
8299
8300 ;;
8301 ;;- Loop instructions.
8302 ;;
8303 ;; This is all complicated by the fact that since this is a jump insn
8304 ;; we must handle our own output reloads.
8305
8306 ;; branch on index
8307
8308 ; This splitter will be matched by combine and has to add the 2 moves
8309 ; necessary to load the compare and the increment values into a
8310 ; register pair as needed by brxle.
8311
8312 (define_insn_and_split "*brx_stage1_<GPR:mode>"
8313 [(set (pc)
8314 (if_then_else
8315 (match_operator 6 "s390_brx_operator"
8316 [(plus:GPR (match_operand:GPR 1 "register_operand" "")
8317 (match_operand:GPR 2 "general_operand" ""))
8318 (match_operand:GPR 3 "register_operand" "")])
8319 (label_ref (match_operand 0 "" ""))
8320 (pc)))
8321 (set (match_operand:GPR 4 "nonimmediate_operand" "")
8322 (plus:GPR (match_dup 1) (match_dup 2)))
8323 (clobber (match_scratch:GPR 5 ""))]
8324 "TARGET_CPU_ZARCH"
8325 "#"
8326 "!reload_completed && !reload_in_progress"
8327 [(set (match_dup 7) (match_dup 2)) ; the increment
8328 (set (match_dup 8) (match_dup 3)) ; the comparison value
8329 (parallel [(set (pc)
8330 (if_then_else
8331 (match_op_dup 6
8332 [(plus:GPR (match_dup 1) (match_dup 7))
8333 (match_dup 8)])
8334 (label_ref (match_dup 0))
8335 (pc)))
8336 (set (match_dup 4)
8337 (plus:GPR (match_dup 1) (match_dup 7)))
8338 (clobber (match_dup 5))
8339 (clobber (reg:CC CC_REGNUM))])]
8340 {
8341 rtx dreg = gen_reg_rtx (word_mode == DImode ? TImode : DImode);
8342 operands[7] = gen_lowpart (<GPR:MODE>mode,
8343 gen_highpart (word_mode, dreg));
8344 operands[8] = gen_lowpart (<GPR:MODE>mode,
8345 gen_lowpart (word_mode, dreg));
8346 })
8347
8348 ; brxlg, brxhg
8349
8350 (define_insn_and_split "*brxg_64bit"
8351 [(set (pc)
8352 (if_then_else
8353 (match_operator 5 "s390_brx_operator"
8354 [(plus:DI (match_operand:DI 1 "register_operand" "d,d,d")
8355 (subreg:DI (match_operand:TI 2 "register_operand" "d,d,d") 0))
8356 (subreg:DI (match_dup 2) 8)])
8357 (label_ref (match_operand 0 "" ""))
8358 (pc)))
8359 (set (match_operand:DI 3 "nonimmediate_operand" "=1,?X,?X")
8360 (plus:DI (match_dup 1)
8361 (subreg:DI (match_dup 2) 0)))
8362 (clobber (match_scratch:DI 4 "=X,&1,&?d"))
8363 (clobber (reg:CC CC_REGNUM))]
8364 "TARGET_ZARCH"
8365 {
8366 if (which_alternative != 0)
8367 return "#";
8368 else if (get_attr_length (insn) == 6)
8369 return "brx%E5g\t%1,%2,%l0";
8370 else
8371 return "agr\t%1,%2\;cgr\t%1,%M2\;jg%C5\t%l0";
8372 }
8373 "&& reload_completed
8374 && (!REG_P (operands[3])
8375 || !rtx_equal_p (operands[1], operands[3]))"
8376 [(set (match_dup 4) (match_dup 1))
8377 (parallel [(set (match_dup 4) (plus:DI (match_dup 4) (subreg:DI (match_dup 2) 0)))
8378 (clobber (reg:CC CC_REGNUM))])
8379 (set (reg:CCS CC_REGNUM) (compare:CCS (match_dup 4) (subreg:DI (match_dup 2) 8)))
8380 (set (match_dup 3) (match_dup 4))
8381 (set (pc) (if_then_else (match_op_dup 5 [(reg:CCS CC_REGNUM) (const_int 0)])
8382 (label_ref (match_dup 0))
8383 (pc)))]
8384 ""
8385 [(set_attr "op_type" "RIE")
8386 (set_attr "type" "branch")
8387 (set (attr "length")
8388 (if_then_else (lt (abs (minus (pc) (match_dup 0))) (const_int 60000))
8389 (const_int 6) (const_int 16)))])
8390
8391 ; brxle, brxh
8392
8393 (define_insn_and_split "*brx_64bit"
8394 [(set (pc)
8395 (if_then_else
8396 (match_operator 5 "s390_brx_operator"
8397 [(plus:SI (match_operand:SI 1 "register_operand" "d,d,d")
8398 (subreg:SI (match_operand:TI 2 "register_operand" "d,d,d") 4))
8399 (subreg:SI (match_dup 2) 12)])
8400 (label_ref (match_operand 0 "" ""))
8401 (pc)))
8402 (set (match_operand:SI 3 "nonimmediate_operand" "=1,?X,?X")
8403 (plus:SI (match_dup 1)
8404 (subreg:SI (match_dup 2) 4)))
8405 (clobber (match_scratch:SI 4 "=X,&1,&?d"))
8406 (clobber (reg:CC CC_REGNUM))]
8407 "TARGET_ZARCH"
8408 {
8409 if (which_alternative != 0)
8410 return "#";
8411 else if (get_attr_length (insn) == 6)
8412 return "brx%C5\t%1,%2,%l0";
8413 else
8414 return "ar\t%1,%2\;cr\t%1,%M2\;jg%C5\t%l0";
8415 }
8416 "&& reload_completed
8417 && (!REG_P (operands[3])
8418 || !rtx_equal_p (operands[1], operands[3]))"
8419 [(set (match_dup 4) (match_dup 1))
8420 (parallel [(set (match_dup 4) (plus:SI (match_dup 4) (subreg:SI (match_dup 2) 4)))
8421 (clobber (reg:CC CC_REGNUM))])
8422 (set (reg:CCS CC_REGNUM) (compare:CCS (match_dup 4) (subreg:SI (match_dup 2) 12)))
8423 (set (match_dup 3) (match_dup 4))
8424 (set (pc) (if_then_else (match_op_dup 5 [(reg:CCS CC_REGNUM) (const_int 0)])
8425 (label_ref (match_dup 0))
8426 (pc)))]
8427 ""
8428 [(set_attr "op_type" "RSI")
8429 (set_attr "type" "branch")
8430 (set (attr "length")
8431 (if_then_else (lt (abs (minus (pc) (match_dup 0))) (const_int 60000))
8432 (const_int 6) (const_int 14)))])
8433
8434 ; brxle, brxh
8435
8436 (define_insn_and_split "*brx_31bit"
8437 [(set (pc)
8438 (if_then_else
8439 (match_operator 5 "s390_brx_operator"
8440 [(plus:SI (match_operand:SI 1 "register_operand" "d,d,d")
8441 (subreg:SI (match_operand:DI 2 "register_operand" "d,d,d") 0))
8442 (subreg:SI (match_dup 2) 4)])
8443 (label_ref (match_operand 0 "" ""))
8444 (pc)))
8445 (set (match_operand:SI 3 "nonimmediate_operand" "=1,?X,?X")
8446 (plus:SI (match_dup 1)
8447 (subreg:SI (match_dup 2) 0)))
8448 (clobber (match_scratch:SI 4 "=X,&1,&?d"))
8449 (clobber (reg:CC CC_REGNUM))]
8450 "!TARGET_ZARCH && TARGET_CPU_ZARCH"
8451 {
8452 if (which_alternative != 0)
8453 return "#";
8454 else if (get_attr_length (insn) == 6)
8455 return "brx%C5\t%1,%2,%l0";
8456 else
8457 return "ar\t%1,%2\;cr\t%1,%M2\;jg%C5\t%l0";
8458 }
8459 "&& reload_completed
8460 && (!REG_P (operands[3])
8461 || !rtx_equal_p (operands[1], operands[3]))"
8462 [(set (match_dup 4) (match_dup 1))
8463 (parallel [(set (match_dup 4) (plus:SI (match_dup 4) (subreg:SI (match_dup 2) 0)))
8464 (clobber (reg:CC CC_REGNUM))])
8465 (set (reg:CCS CC_REGNUM) (compare:CCS (match_dup 4) (subreg:SI (match_dup 2) 4)))
8466 (set (match_dup 3) (match_dup 4))
8467 (set (pc) (if_then_else (match_op_dup 5 [(reg:CCS CC_REGNUM) (const_int 0)])
8468 (label_ref (match_dup 0))
8469 (pc)))]
8470 ""
8471 [(set_attr "op_type" "RSI")
8472 (set_attr "type" "branch")
8473 (set (attr "length")
8474 (if_then_else (lt (abs (minus (pc) (match_dup 0))) (const_int 60000))
8475 (const_int 6) (const_int 14)))])
8476
8477
8478 ;; branch on count
8479
8480 (define_expand "doloop_end"
8481 [(use (match_operand 0 "" "")) ; loop pseudo
8482 (use (match_operand 1 "" ""))] ; label
8483 ""
8484 {
8485 if (GET_MODE (operands[0]) == SImode && !TARGET_CPU_ZARCH)
8486 emit_jump_insn (gen_doloop_si31 (operands[1], operands[0], operands[0]));
8487 else if (GET_MODE (operands[0]) == SImode && TARGET_CPU_ZARCH)
8488 emit_jump_insn (gen_doloop_si64 (operands[1], operands[0], operands[0]));
8489 else if (GET_MODE (operands[0]) == DImode && TARGET_ZARCH)
8490 emit_jump_insn (gen_doloop_di (operands[1], operands[0], operands[0]));
8491 else
8492 FAIL;
8493
8494 DONE;
8495 })
8496
8497 (define_insn_and_split "doloop_si64"
8498 [(set (pc)
8499 (if_then_else
8500 (ne (match_operand:SI 1 "register_operand" "d,d,d")
8501 (const_int 1))
8502 (label_ref (match_operand 0 "" ""))
8503 (pc)))
8504 (set (match_operand:SI 2 "nonimmediate_operand" "=1,?X,?X")
8505 (plus:SI (match_dup 1) (const_int -1)))
8506 (clobber (match_scratch:SI 3 "=X,&1,&?d"))
8507 (clobber (reg:CC CC_REGNUM))]
8508 "TARGET_CPU_ZARCH"
8509 {
8510 if (which_alternative != 0)
8511 return "#";
8512 else if (get_attr_length (insn) == 4)
8513 return "brct\t%1,%l0";
8514 else
8515 return "ahi\t%1,-1\;jgne\t%l0";
8516 }
8517 "&& reload_completed
8518 && (! REG_P (operands[2])
8519 || ! rtx_equal_p (operands[1], operands[2]))"
8520 [(set (match_dup 3) (match_dup 1))
8521 (parallel [(set (reg:CCAN CC_REGNUM)
8522 (compare:CCAN (plus:SI (match_dup 3) (const_int -1))
8523 (const_int 0)))
8524 (set (match_dup 3) (plus:SI (match_dup 3) (const_int -1)))])
8525 (set (match_dup 2) (match_dup 3))
8526 (set (pc) (if_then_else (ne (reg:CCAN CC_REGNUM) (const_int 0))
8527 (label_ref (match_dup 0))
8528 (pc)))]
8529 ""
8530 [(set_attr "op_type" "RI")
8531 ; Strictly speaking, the z10 properties are valid for brct only, however, it does not
8532 ; hurt us in the (rare) case of ahi.
8533 (set_attr "z10prop" "z10_super_E1")
8534 (set_attr "type" "branch")
8535 (set (attr "length")
8536 (if_then_else (lt (abs (minus (pc) (match_dup 0))) (const_int 60000))
8537 (const_int 4) (const_int 10)))])
8538
8539 (define_insn_and_split "doloop_si31"
8540 [(set (pc)
8541 (if_then_else
8542 (ne (match_operand:SI 1 "register_operand" "d,d,d")
8543 (const_int 1))
8544 (label_ref (match_operand 0 "" ""))
8545 (pc)))
8546 (set (match_operand:SI 2 "nonimmediate_operand" "=1,?X,?X")
8547 (plus:SI (match_dup 1) (const_int -1)))
8548 (clobber (match_scratch:SI 3 "=X,&1,&?d"))
8549 (clobber (reg:CC CC_REGNUM))]
8550 "!TARGET_CPU_ZARCH"
8551 {
8552 if (which_alternative != 0)
8553 return "#";
8554 else if (get_attr_length (insn) == 4)
8555 return "brct\t%1,%l0";
8556 else
8557 gcc_unreachable ();
8558 }
8559 "&& reload_completed
8560 && (! REG_P (operands[2])
8561 || ! rtx_equal_p (operands[1], operands[2]))"
8562 [(set (match_dup 3) (match_dup 1))
8563 (parallel [(set (reg:CCAN CC_REGNUM)
8564 (compare:CCAN (plus:SI (match_dup 3) (const_int -1))
8565 (const_int 0)))
8566 (set (match_dup 3) (plus:SI (match_dup 3) (const_int -1)))])
8567 (set (match_dup 2) (match_dup 3))
8568 (set (pc) (if_then_else (ne (reg:CCAN CC_REGNUM) (const_int 0))
8569 (label_ref (match_dup 0))
8570 (pc)))]
8571 ""
8572 [(set_attr "op_type" "RI")
8573 ; Strictly speaking, the z10 properties are valid for brct only, however, it does not
8574 ; hurt us in the (rare) case of ahi.
8575 (set_attr "z10prop" "z10_super_E1")
8576 (set_attr "type" "branch")
8577 (set (attr "length")
8578 (if_then_else (not (match_test "flag_pic"))
8579 (if_then_else (lt (abs (minus (pc) (match_dup 0))) (const_int 60000))
8580 (const_int 4) (const_int 6))
8581 (if_then_else (lt (abs (minus (pc) (match_dup 0))) (const_int 60000))
8582 (const_int 4) (const_int 8))))])
8583
8584 (define_insn "*doloop_si_long"
8585 [(set (pc)
8586 (if_then_else
8587 (ne (match_operand:SI 1 "register_operand" "d")
8588 (const_int 1))
8589 (match_operand 0 "address_operand" "ZQZR")
8590 (pc)))
8591 (set (match_operand:SI 2 "register_operand" "=1")
8592 (plus:SI (match_dup 1) (const_int -1)))
8593 (clobber (match_scratch:SI 3 "=X"))
8594 (clobber (reg:CC CC_REGNUM))]
8595 "!TARGET_CPU_ZARCH"
8596 {
8597 if (get_attr_op_type (insn) == OP_TYPE_RR)
8598 return "bctr\t%1,%0";
8599 else
8600 return "bct\t%1,%a0";
8601 }
8602 [(set (attr "op_type")
8603 (if_then_else (match_operand 0 "register_operand" "")
8604 (const_string "RR") (const_string "RX")))
8605 (set_attr "type" "branch")
8606 (set_attr "atype" "agen")
8607 (set_attr "z10prop" "z10_c")
8608 (set_attr "z196prop" "z196_cracked")])
8609
8610 (define_insn_and_split "doloop_di"
8611 [(set (pc)
8612 (if_then_else
8613 (ne (match_operand:DI 1 "register_operand" "d,d,d")
8614 (const_int 1))
8615 (label_ref (match_operand 0 "" ""))
8616 (pc)))
8617 (set (match_operand:DI 2 "nonimmediate_operand" "=1,?X,?X")
8618 (plus:DI (match_dup 1) (const_int -1)))
8619 (clobber (match_scratch:DI 3 "=X,&1,&?d"))
8620 (clobber (reg:CC CC_REGNUM))]
8621 "TARGET_ZARCH"
8622 {
8623 if (which_alternative != 0)
8624 return "#";
8625 else if (get_attr_length (insn) == 4)
8626 return "brctg\t%1,%l0";
8627 else
8628 return "aghi\t%1,-1\;jgne\t%l0";
8629 }
8630 "&& reload_completed
8631 && (! REG_P (operands[2])
8632 || ! rtx_equal_p (operands[1], operands[2]))"
8633 [(set (match_dup 3) (match_dup 1))
8634 (parallel [(set (reg:CCAN CC_REGNUM)
8635 (compare:CCAN (plus:DI (match_dup 3) (const_int -1))
8636 (const_int 0)))
8637 (set (match_dup 3) (plus:DI (match_dup 3) (const_int -1)))])
8638 (set (match_dup 2) (match_dup 3))
8639 (set (pc) (if_then_else (ne (reg:CCAN CC_REGNUM) (const_int 0))
8640 (label_ref (match_dup 0))
8641 (pc)))]
8642 ""
8643 [(set_attr "op_type" "RI")
8644 ; Strictly speaking, the z10 properties are valid for brct only, however, it does not
8645 ; hurt us in the (rare) case of ahi.
8646 (set_attr "z10prop" "z10_super_E1")
8647 (set_attr "type" "branch")
8648 (set (attr "length")
8649 (if_then_else (lt (abs (minus (pc) (match_dup 0))) (const_int 60000))
8650 (const_int 4) (const_int 10)))])
8651
8652 ;;
8653 ;;- Unconditional jump instructions.
8654 ;;
8655
8656 ;
8657 ; jump instruction pattern(s).
8658 ;
8659
8660 (define_expand "jump"
8661 [(match_operand 0 "" "")]
8662 ""
8663 "s390_emit_jump (operands[0], NULL_RTX); DONE;")
8664
8665 (define_insn "*jump64"
8666 [(set (pc) (label_ref (match_operand 0 "" "")))]
8667 "TARGET_CPU_ZARCH"
8668 {
8669 if (get_attr_length (insn) == 4)
8670 return "j\t%l0";
8671 else
8672 return "jg\t%l0";
8673 }
8674 [(set_attr "op_type" "RI")
8675 (set_attr "type" "branch")
8676 (set (attr "length")
8677 (if_then_else (lt (abs (minus (pc) (match_dup 0))) (const_int 60000))
8678 (const_int 4) (const_int 6)))])
8679
8680 (define_insn "*jump31"
8681 [(set (pc) (label_ref (match_operand 0 "" "")))]
8682 "!TARGET_CPU_ZARCH"
8683 {
8684 gcc_assert (get_attr_length (insn) == 4);
8685 return "j\t%l0";
8686 }
8687 [(set_attr "op_type" "RI")
8688 (set_attr "type" "branch")
8689 (set (attr "length")
8690 (if_then_else (not (match_test "flag_pic"))
8691 (if_then_else (lt (abs (minus (pc) (match_dup 0))) (const_int 60000))
8692 (const_int 4) (const_int 6))
8693 (if_then_else (lt (abs (minus (pc) (match_dup 0))) (const_int 60000))
8694 (const_int 4) (const_int 8))))])
8695
8696 ;
8697 ; indirect-jump instruction pattern(s).
8698 ;
8699
8700 (define_insn "indirect_jump"
8701 [(set (pc) (match_operand 0 "address_operand" "ZQZR"))]
8702 ""
8703 {
8704 if (get_attr_op_type (insn) == OP_TYPE_RR)
8705 return "br\t%0";
8706 else
8707 return "b\t%a0";
8708 }
8709 [(set (attr "op_type")
8710 (if_then_else (match_operand 0 "register_operand" "")
8711 (const_string "RR") (const_string "RX")))
8712 (set_attr "type" "branch")
8713 (set_attr "atype" "agen")])
8714
8715 ;
8716 ; casesi instruction pattern(s).
8717 ;
8718
8719 (define_insn "casesi_jump"
8720 [(set (pc) (match_operand 0 "address_operand" "ZQZR"))
8721 (use (label_ref (match_operand 1 "" "")))]
8722 ""
8723 {
8724 if (get_attr_op_type (insn) == OP_TYPE_RR)
8725 return "br\t%0";
8726 else
8727 return "b\t%a0";
8728 }
8729 [(set (attr "op_type")
8730 (if_then_else (match_operand 0 "register_operand" "")
8731 (const_string "RR") (const_string "RX")))
8732 (set_attr "type" "branch")
8733 (set_attr "atype" "agen")])
8734
8735 (define_expand "casesi"
8736 [(match_operand:SI 0 "general_operand" "")
8737 (match_operand:SI 1 "general_operand" "")
8738 (match_operand:SI 2 "general_operand" "")
8739 (label_ref (match_operand 3 "" ""))
8740 (label_ref (match_operand 4 "" ""))]
8741 ""
8742 {
8743 rtx index = gen_reg_rtx (SImode);
8744 rtx base = gen_reg_rtx (Pmode);
8745 rtx target = gen_reg_rtx (Pmode);
8746
8747 emit_move_insn (index, operands[0]);
8748 emit_insn (gen_subsi3 (index, index, operands[1]));
8749 emit_cmp_and_jump_insns (index, operands[2], GTU, NULL_RTX, SImode, 1,
8750 operands[4]);
8751
8752 if (Pmode != SImode)
8753 index = convert_to_mode (Pmode, index, 1);
8754 if (GET_CODE (index) != REG)
8755 index = copy_to_mode_reg (Pmode, index);
8756
8757 if (TARGET_64BIT)
8758 emit_insn (gen_ashldi3 (index, index, GEN_INT (3)));
8759 else
8760 emit_insn (gen_ashlsi3 (index, index, const2_rtx));
8761
8762 emit_move_insn (base, gen_rtx_LABEL_REF (Pmode, operands[3]));
8763
8764 index = gen_const_mem (Pmode, gen_rtx_PLUS (Pmode, base, index));
8765 emit_move_insn (target, index);
8766
8767 if (flag_pic)
8768 target = gen_rtx_PLUS (Pmode, base, target);
8769 emit_jump_insn (gen_casesi_jump (target, operands[3]));
8770
8771 DONE;
8772 })
8773
8774
8775 ;;
8776 ;;- Jump to subroutine.
8777 ;;
8778 ;;
8779
8780 ;
8781 ; untyped call instruction pattern(s).
8782 ;
8783
8784 ;; Call subroutine returning any type.
8785 (define_expand "untyped_call"
8786 [(parallel [(call (match_operand 0 "" "")
8787 (const_int 0))
8788 (match_operand 1 "" "")
8789 (match_operand 2 "" "")])]
8790 ""
8791 {
8792 int i;
8793
8794 emit_call_insn (gen_call (operands[0], const0_rtx, const0_rtx));
8795
8796 for (i = 0; i < XVECLEN (operands[2], 0); i++)
8797 {
8798 rtx set = XVECEXP (operands[2], 0, i);
8799 emit_move_insn (SET_DEST (set), SET_SRC (set));
8800 }
8801
8802 /* The optimizer does not know that the call sets the function value
8803 registers we stored in the result block. We avoid problems by
8804 claiming that all hard registers are used and clobbered at this
8805 point. */
8806 emit_insn (gen_blockage ());
8807
8808 DONE;
8809 })
8810
8811 ;; UNSPEC_VOLATILE is considered to use and clobber all hard registers and
8812 ;; all of memory. This blocks insns from being moved across this point.
8813
8814 (define_insn "blockage"
8815 [(unspec_volatile [(const_int 0)] UNSPECV_BLOCKAGE)]
8816 ""
8817 ""
8818 [(set_attr "type" "none")
8819 (set_attr "length" "0")])
8820
8821 ;
8822 ; sibcall patterns
8823 ;
8824
8825 (define_expand "sibcall"
8826 [(call (match_operand 0 "" "")
8827 (match_operand 1 "" ""))]
8828 ""
8829 {
8830 s390_emit_call (XEXP (operands[0], 0), NULL_RTX, NULL_RTX, NULL_RTX);
8831 DONE;
8832 })
8833
8834 (define_insn "*sibcall_br"
8835 [(call (mem:QI (reg SIBCALL_REGNUM))
8836 (match_operand 0 "const_int_operand" "n"))]
8837 "SIBLING_CALL_P (insn)
8838 && GET_MODE (XEXP (XEXP (PATTERN (insn), 0), 0)) == Pmode"
8839 "br\t%%r1"
8840 [(set_attr "op_type" "RR")
8841 (set_attr "type" "branch")
8842 (set_attr "atype" "agen")])
8843
8844 (define_insn "*sibcall_brc"
8845 [(call (mem:QI (match_operand 0 "bras_sym_operand" "X"))
8846 (match_operand 1 "const_int_operand" "n"))]
8847 "SIBLING_CALL_P (insn) && TARGET_SMALL_EXEC"
8848 "j\t%0"
8849 [(set_attr "op_type" "RI")
8850 (set_attr "type" "branch")])
8851
8852 (define_insn "*sibcall_brcl"
8853 [(call (mem:QI (match_operand 0 "bras_sym_operand" "X"))
8854 (match_operand 1 "const_int_operand" "n"))]
8855 "SIBLING_CALL_P (insn) && TARGET_CPU_ZARCH"
8856 "jg\t%0"
8857 [(set_attr "op_type" "RIL")
8858 (set_attr "type" "branch")])
8859
8860 ;
8861 ; sibcall_value patterns
8862 ;
8863
8864 (define_expand "sibcall_value"
8865 [(set (match_operand 0 "" "")
8866 (call (match_operand 1 "" "")
8867 (match_operand 2 "" "")))]
8868 ""
8869 {
8870 s390_emit_call (XEXP (operands[1], 0), NULL_RTX, operands[0], NULL_RTX);
8871 DONE;
8872 })
8873
8874 (define_insn "*sibcall_value_br"
8875 [(set (match_operand 0 "" "")
8876 (call (mem:QI (reg SIBCALL_REGNUM))
8877 (match_operand 1 "const_int_operand" "n")))]
8878 "SIBLING_CALL_P (insn)
8879 && GET_MODE (XEXP (XEXP (XEXP (PATTERN (insn), 1), 0), 0)) == Pmode"
8880 "br\t%%r1"
8881 [(set_attr "op_type" "RR")
8882 (set_attr "type" "branch")
8883 (set_attr "atype" "agen")])
8884
8885 (define_insn "*sibcall_value_brc"
8886 [(set (match_operand 0 "" "")
8887 (call (mem:QI (match_operand 1 "bras_sym_operand" "X"))
8888 (match_operand 2 "const_int_operand" "n")))]
8889 "SIBLING_CALL_P (insn) && TARGET_SMALL_EXEC"
8890 "j\t%1"
8891 [(set_attr "op_type" "RI")
8892 (set_attr "type" "branch")])
8893
8894 (define_insn "*sibcall_value_brcl"
8895 [(set (match_operand 0 "" "")
8896 (call (mem:QI (match_operand 1 "bras_sym_operand" "X"))
8897 (match_operand 2 "const_int_operand" "n")))]
8898 "SIBLING_CALL_P (insn) && TARGET_CPU_ZARCH"
8899 "jg\t%1"
8900 [(set_attr "op_type" "RIL")
8901 (set_attr "type" "branch")])
8902
8903
8904 ;
8905 ; call instruction pattern(s).
8906 ;
8907
8908 (define_expand "call"
8909 [(call (match_operand 0 "" "")
8910 (match_operand 1 "" ""))
8911 (use (match_operand 2 "" ""))]
8912 ""
8913 {
8914 s390_emit_call (XEXP (operands[0], 0), NULL_RTX, NULL_RTX,
8915 gen_rtx_REG (Pmode, RETURN_REGNUM));
8916 DONE;
8917 })
8918
8919 (define_insn "*bras"
8920 [(call (mem:QI (match_operand 0 "bras_sym_operand" "X"))
8921 (match_operand 1 "const_int_operand" "n"))
8922 (clobber (match_operand 2 "register_operand" "=r"))]
8923 "!SIBLING_CALL_P (insn)
8924 && TARGET_SMALL_EXEC
8925 && GET_MODE (operands[2]) == Pmode"
8926 "bras\t%2,%0"
8927 [(set_attr "op_type" "RI")
8928 (set_attr "type" "jsr")
8929 (set_attr "z196prop" "z196_cracked")])
8930
8931 (define_insn "*brasl"
8932 [(call (mem:QI (match_operand 0 "bras_sym_operand" "X"))
8933 (match_operand 1 "const_int_operand" "n"))
8934 (clobber (match_operand 2 "register_operand" "=r"))]
8935 "!SIBLING_CALL_P (insn)
8936 && TARGET_CPU_ZARCH
8937 && GET_MODE (operands[2]) == Pmode"
8938 "brasl\t%2,%0"
8939 [(set_attr "op_type" "RIL")
8940 (set_attr "type" "jsr")
8941 (set_attr "z196prop" "z196_cracked")])
8942
8943 (define_insn "*basr"
8944 [(call (mem:QI (match_operand 0 "address_operand" "ZQZR"))
8945 (match_operand 1 "const_int_operand" "n"))
8946 (clobber (match_operand 2 "register_operand" "=r"))]
8947 "!SIBLING_CALL_P (insn) && GET_MODE (operands[2]) == Pmode"
8948 {
8949 if (get_attr_op_type (insn) == OP_TYPE_RR)
8950 return "basr\t%2,%0";
8951 else
8952 return "bas\t%2,%a0";
8953 }
8954 [(set (attr "op_type")
8955 (if_then_else (match_operand 0 "register_operand" "")
8956 (const_string "RR") (const_string "RX")))
8957 (set_attr "type" "jsr")
8958 (set_attr "atype" "agen")
8959 (set_attr "z196prop" "z196_cracked")])
8960
8961 ;
8962 ; call_value instruction pattern(s).
8963 ;
8964
8965 (define_expand "call_value"
8966 [(set (match_operand 0 "" "")
8967 (call (match_operand 1 "" "")
8968 (match_operand 2 "" "")))
8969 (use (match_operand 3 "" ""))]
8970 ""
8971 {
8972 s390_emit_call (XEXP (operands[1], 0), NULL_RTX, operands[0],
8973 gen_rtx_REG (Pmode, RETURN_REGNUM));
8974 DONE;
8975 })
8976
8977 (define_insn "*bras_r"
8978 [(set (match_operand 0 "" "")
8979 (call (mem:QI (match_operand 1 "bras_sym_operand" "X"))
8980 (match_operand:SI 2 "const_int_operand" "n")))
8981 (clobber (match_operand 3 "register_operand" "=r"))]
8982 "!SIBLING_CALL_P (insn)
8983 && TARGET_SMALL_EXEC
8984 && GET_MODE (operands[3]) == Pmode"
8985 "bras\t%3,%1"
8986 [(set_attr "op_type" "RI")
8987 (set_attr "type" "jsr")
8988 (set_attr "z196prop" "z196_cracked")])
8989
8990 (define_insn "*brasl_r"
8991 [(set (match_operand 0 "" "")
8992 (call (mem:QI (match_operand 1 "bras_sym_operand" "X"))
8993 (match_operand 2 "const_int_operand" "n")))
8994 (clobber (match_operand 3 "register_operand" "=r"))]
8995 "!SIBLING_CALL_P (insn)
8996 && TARGET_CPU_ZARCH
8997 && GET_MODE (operands[3]) == Pmode"
8998 "brasl\t%3,%1"
8999 [(set_attr "op_type" "RIL")
9000 (set_attr "type" "jsr")
9001 (set_attr "z196prop" "z196_cracked")])
9002
9003 (define_insn "*basr_r"
9004 [(set (match_operand 0 "" "")
9005 (call (mem:QI (match_operand 1 "address_operand" "ZQZR"))
9006 (match_operand 2 "const_int_operand" "n")))
9007 (clobber (match_operand 3 "register_operand" "=r"))]
9008 "!SIBLING_CALL_P (insn) && GET_MODE (operands[3]) == Pmode"
9009 {
9010 if (get_attr_op_type (insn) == OP_TYPE_RR)
9011 return "basr\t%3,%1";
9012 else
9013 return "bas\t%3,%a1";
9014 }
9015 [(set (attr "op_type")
9016 (if_then_else (match_operand 1 "register_operand" "")
9017 (const_string "RR") (const_string "RX")))
9018 (set_attr "type" "jsr")
9019 (set_attr "atype" "agen")
9020 (set_attr "z196prop" "z196_cracked")])
9021
9022 ;;
9023 ;;- Thread-local storage support.
9024 ;;
9025
9026 (define_expand "get_thread_pointer<mode>"
9027 [(set (match_operand:P 0 "nonimmediate_operand" "") (reg:P TP_REGNUM))]
9028 ""
9029 "")
9030
9031 (define_expand "set_thread_pointer<mode>"
9032 [(set (reg:P TP_REGNUM) (match_operand:P 0 "nonimmediate_operand" ""))
9033 (set (reg:P TP_REGNUM) (unspec_volatile:P [(reg:P TP_REGNUM)] UNSPECV_SET_TP))]
9034 ""
9035 "")
9036
9037 (define_insn "*set_tp"
9038 [(set (reg TP_REGNUM) (unspec_volatile [(reg TP_REGNUM)] UNSPECV_SET_TP))]
9039 ""
9040 ""
9041 [(set_attr "type" "none")
9042 (set_attr "length" "0")])
9043
9044 (define_insn "*tls_load_64"
9045 [(set (match_operand:DI 0 "register_operand" "=d")
9046 (unspec:DI [(match_operand:DI 1 "memory_operand" "RT")
9047 (match_operand:DI 2 "" "")]
9048 UNSPEC_TLS_LOAD))]
9049 "TARGET_64BIT"
9050 "lg\t%0,%1%J2"
9051 [(set_attr "op_type" "RXE")
9052 (set_attr "z10prop" "z10_fwd_A3")])
9053
9054 (define_insn "*tls_load_31"
9055 [(set (match_operand:SI 0 "register_operand" "=d,d")
9056 (unspec:SI [(match_operand:SI 1 "memory_operand" "R,T")
9057 (match_operand:SI 2 "" "")]
9058 UNSPEC_TLS_LOAD))]
9059 "!TARGET_64BIT"
9060 "@
9061 l\t%0,%1%J2
9062 ly\t%0,%1%J2"
9063 [(set_attr "op_type" "RX,RXY")
9064 (set_attr "type" "load")
9065 (set_attr "z10prop" "z10_fwd_A3,z10_fwd_A3")])
9066
9067 (define_insn "*bras_tls"
9068 [(set (match_operand 0 "" "")
9069 (call (mem:QI (match_operand 1 "bras_sym_operand" "X"))
9070 (match_operand 2 "const_int_operand" "n")))
9071 (clobber (match_operand 3 "register_operand" "=r"))
9072 (use (match_operand 4 "" ""))]
9073 "!SIBLING_CALL_P (insn)
9074 && TARGET_SMALL_EXEC
9075 && GET_MODE (operands[3]) == Pmode"
9076 "bras\t%3,%1%J4"
9077 [(set_attr "op_type" "RI")
9078 (set_attr "type" "jsr")
9079 (set_attr "z196prop" "z196_cracked")])
9080
9081 (define_insn "*brasl_tls"
9082 [(set (match_operand 0 "" "")
9083 (call (mem:QI (match_operand 1 "bras_sym_operand" "X"))
9084 (match_operand 2 "const_int_operand" "n")))
9085 (clobber (match_operand 3 "register_operand" "=r"))
9086 (use (match_operand 4 "" ""))]
9087 "!SIBLING_CALL_P (insn)
9088 && TARGET_CPU_ZARCH
9089 && GET_MODE (operands[3]) == Pmode"
9090 "brasl\t%3,%1%J4"
9091 [(set_attr "op_type" "RIL")
9092 (set_attr "type" "jsr")
9093 (set_attr "z196prop" "z196_cracked")])
9094
9095 (define_insn "*basr_tls"
9096 [(set (match_operand 0 "" "")
9097 (call (mem:QI (match_operand 1 "address_operand" "ZQZR"))
9098 (match_operand 2 "const_int_operand" "n")))
9099 (clobber (match_operand 3 "register_operand" "=r"))
9100 (use (match_operand 4 "" ""))]
9101 "!SIBLING_CALL_P (insn) && GET_MODE (operands[3]) == Pmode"
9102 {
9103 if (get_attr_op_type (insn) == OP_TYPE_RR)
9104 return "basr\t%3,%1%J4";
9105 else
9106 return "bas\t%3,%a1%J4";
9107 }
9108 [(set (attr "op_type")
9109 (if_then_else (match_operand 1 "register_operand" "")
9110 (const_string "RR") (const_string "RX")))
9111 (set_attr "type" "jsr")
9112 (set_attr "atype" "agen")
9113 (set_attr "z196prop" "z196_cracked")])
9114
9115 ;;
9116 ;;- Atomic operations
9117 ;;
9118
9119 ;
9120 ; memory barrier patterns.
9121 ;
9122
9123 (define_expand "mem_signal_fence"
9124 [(match_operand:SI 0 "const_int_operand")] ;; model
9125 ""
9126 {
9127 /* The s390 memory model is strong enough not to require any
9128 barrier in order to synchronize a thread with itself. */
9129 DONE;
9130 })
9131
9132 (define_expand "mem_thread_fence"
9133 [(match_operand:SI 0 "const_int_operand")] ;; model
9134 ""
9135 {
9136 /* Unless this is a SEQ_CST fence, the s390 memory model is strong
9137 enough not to require barriers of any kind. */
9138 if (INTVAL (operands[0]) == MEMMODEL_SEQ_CST)
9139 {
9140 rtx mem = gen_rtx_MEM (BLKmode, gen_rtx_SCRATCH (Pmode));
9141 MEM_VOLATILE_P (mem) = 1;
9142 emit_insn (gen_mem_thread_fence_1 (mem));
9143 }
9144 DONE;
9145 })
9146
9147 ; Although bcr is superscalar on Z10, this variant will never
9148 ; become part of an execution group.
9149 ; With z196 we can make use of the fast-BCR-serialization facility.
9150 ; This allows for a slightly faster sync which is sufficient for our
9151 ; purposes.
9152 (define_insn "mem_thread_fence_1"
9153 [(set (match_operand:BLK 0 "" "")
9154 (unspec:BLK [(match_dup 0)] UNSPEC_MB))]
9155 ""
9156 {
9157 if (TARGET_Z196)
9158 return "bcr\t14,0";
9159 else
9160 return "bcr\t15,0";
9161 }
9162 [(set_attr "op_type" "RR")
9163 (set_attr "mnemonic" "bcr_flush")
9164 (set_attr "z196prop" "z196_alone")])
9165
9166 ;
9167 ; atomic load/store operations
9168 ;
9169
9170 ; Atomic loads need not examine the memory model at all.
9171 (define_expand "atomic_load<mode>"
9172 [(match_operand:DINT 0 "register_operand") ;; output
9173 (match_operand:DINT 1 "memory_operand") ;; memory
9174 (match_operand:SI 2 "const_int_operand")] ;; model
9175 ""
9176 {
9177 if (MEM_ALIGN (operands[1]) < GET_MODE_BITSIZE (GET_MODE (operands[1])))
9178 FAIL;
9179
9180 if (<MODE>mode == TImode)
9181 emit_insn (gen_atomic_loadti_1 (operands[0], operands[1]));
9182 else if (<MODE>mode == DImode && !TARGET_ZARCH)
9183 emit_insn (gen_atomic_loaddi_1 (operands[0], operands[1]));
9184 else
9185 emit_move_insn (operands[0], operands[1]);
9186 DONE;
9187 })
9188
9189 ; Different from movdi_31 in that we want no splitters.
9190 (define_insn "atomic_loaddi_1"
9191 [(set (match_operand:DI 0 "register_operand" "=d,d,!*f,!*f")
9192 (unspec:DI [(match_operand:DI 1 "memory_operand" "Q,S,R,T")]
9193 UNSPEC_MOVA))]
9194 "!TARGET_ZARCH"
9195 "@
9196 lm\t%0,%M0,%S1
9197 lmy\t%0,%M0,%S1
9198 ld\t%0,%1
9199 ldy\t%0,%1"
9200 [(set_attr "op_type" "RS,RSY,RS,RSY")
9201 (set_attr "type" "lm,lm,floaddf,floaddf")])
9202
9203 (define_insn "atomic_loadti_1"
9204 [(set (match_operand:TI 0 "register_operand" "=r")
9205 (unspec:TI [(match_operand:TI 1 "memory_operand" "RT")]
9206 UNSPEC_MOVA))]
9207 "TARGET_ZARCH"
9208 "lpq\t%0,%1"
9209 [(set_attr "op_type" "RXY")
9210 (set_attr "type" "other")])
9211
9212 ; Atomic stores must(?) enforce sequential consistency.
9213 (define_expand "atomic_store<mode>"
9214 [(match_operand:DINT 0 "memory_operand") ;; memory
9215 (match_operand:DINT 1 "register_operand") ;; input
9216 (match_operand:SI 2 "const_int_operand")] ;; model
9217 ""
9218 {
9219 enum memmodel model = (enum memmodel) INTVAL (operands[2]);
9220
9221 if (MEM_ALIGN (operands[0]) < GET_MODE_BITSIZE (GET_MODE (operands[0])))
9222 FAIL;
9223
9224 if (<MODE>mode == TImode)
9225 emit_insn (gen_atomic_storeti_1 (operands[0], operands[1]));
9226 else if (<MODE>mode == DImode && !TARGET_ZARCH)
9227 emit_insn (gen_atomic_storedi_1 (operands[0], operands[1]));
9228 else
9229 emit_move_insn (operands[0], operands[1]);
9230 if (model == MEMMODEL_SEQ_CST)
9231 emit_insn (gen_mem_thread_fence (operands[2]));
9232 DONE;
9233 })
9234
9235 ; Different from movdi_31 in that we want no splitters.
9236 (define_insn "atomic_storedi_1"
9237 [(set (match_operand:DI 0 "memory_operand" "=Q,S,R,T")
9238 (unspec:DI [(match_operand:DI 1 "register_operand" "d,d,!*f,!*f")]
9239 UNSPEC_MOVA))]
9240 "!TARGET_ZARCH"
9241 "@
9242 stm\t%1,%N1,%S0
9243 stmy\t%1,%N1,%S0
9244 std %1,%0
9245 stdy %1,%0"
9246 [(set_attr "op_type" "RS,RSY,RS,RSY")
9247 (set_attr "type" "stm,stm,fstoredf,fstoredf")])
9248
9249 (define_insn "atomic_storeti_1"
9250 [(set (match_operand:TI 0 "memory_operand" "=RT")
9251 (unspec:TI [(match_operand:TI 1 "register_operand" "r")]
9252 UNSPEC_MOVA))]
9253 "TARGET_ZARCH"
9254 "stpq\t%1,%0"
9255 [(set_attr "op_type" "RXY")
9256 (set_attr "type" "other")])
9257
9258 ;
9259 ; compare and swap patterns.
9260 ;
9261
9262 (define_expand "atomic_compare_and_swap<mode>"
9263 [(match_operand:SI 0 "register_operand") ;; bool success output
9264 (match_operand:DGPR 1 "nonimmediate_operand");; oldval output
9265 (match_operand:DGPR 2 "memory_operand") ;; memory
9266 (match_operand:DGPR 3 "register_operand") ;; expected intput
9267 (match_operand:DGPR 4 "register_operand") ;; newval intput
9268 (match_operand:SI 5 "const_int_operand") ;; is_weak
9269 (match_operand:SI 6 "const_int_operand") ;; success model
9270 (match_operand:SI 7 "const_int_operand")] ;; failure model
9271 ""
9272 {
9273 rtx cc, cmp, output = operands[1];
9274
9275 if (!register_operand (output, <MODE>mode))
9276 output = gen_reg_rtx (<MODE>mode);
9277
9278 if (MEM_ALIGN (operands[2]) < GET_MODE_BITSIZE (GET_MODE (operands[2])))
9279 FAIL;
9280
9281 emit_insn (gen_atomic_compare_and_swap<mode>_internal
9282 (output, operands[2], operands[3], operands[4]));
9283
9284 /* We deliberately accept non-register operands in the predicate
9285 to ensure the write back to the output operand happens *before*
9286 the store-flags code below. This makes it easier for combine
9287 to merge the store-flags code with a potential test-and-branch
9288 pattern following (immediately!) afterwards. */
9289 if (output != operands[1])
9290 emit_move_insn (operands[1], output);
9291
9292 cc = gen_rtx_REG (CCZ1mode, CC_REGNUM);
9293 cmp = gen_rtx_EQ (SImode, cc, const0_rtx);
9294 emit_insn (gen_cstorecc4 (operands[0], cmp, cc, const0_rtx));
9295 DONE;
9296 })
9297
9298 (define_expand "atomic_compare_and_swap<mode>"
9299 [(match_operand:SI 0 "register_operand") ;; bool success output
9300 (match_operand:HQI 1 "nonimmediate_operand") ;; oldval output
9301 (match_operand:HQI 2 "memory_operand") ;; memory
9302 (match_operand:HQI 3 "general_operand") ;; expected intput
9303 (match_operand:HQI 4 "general_operand") ;; newval intput
9304 (match_operand:SI 5 "const_int_operand") ;; is_weak
9305 (match_operand:SI 6 "const_int_operand") ;; success model
9306 (match_operand:SI 7 "const_int_operand")] ;; failure model
9307 ""
9308 {
9309 s390_expand_cs_hqi (<MODE>mode, operands[0], operands[1], operands[2],
9310 operands[3], operands[4], INTVAL (operands[5]));
9311 DONE;
9312 })
9313
9314 (define_expand "atomic_compare_and_swap<mode>_internal"
9315 [(parallel
9316 [(set (match_operand:DGPR 0 "register_operand")
9317 (match_operand:DGPR 1 "memory_operand"))
9318 (set (match_dup 1)
9319 (unspec_volatile:DGPR
9320 [(match_dup 1)
9321 (match_operand:DGPR 2 "register_operand")
9322 (match_operand:DGPR 3 "register_operand")]
9323 UNSPECV_CAS))
9324 (set (reg:CCZ1 CC_REGNUM)
9325 (compare:CCZ1 (match_dup 1) (match_dup 2)))])]
9326 "")
9327
9328 ; cdsg, csg
9329 (define_insn "*atomic_compare_and_swap<mode>_1"
9330 [(set (match_operand:TDI 0 "register_operand" "=r")
9331 (match_operand:TDI 1 "memory_operand" "+QS"))
9332 (set (match_dup 1)
9333 (unspec_volatile:TDI
9334 [(match_dup 1)
9335 (match_operand:TDI 2 "register_operand" "0")
9336 (match_operand:TDI 3 "register_operand" "r")]
9337 UNSPECV_CAS))
9338 (set (reg:CCZ1 CC_REGNUM)
9339 (compare:CCZ1 (match_dup 1) (match_dup 2)))]
9340 "TARGET_ZARCH"
9341 "c<td>sg\t%0,%3,%S1"
9342 [(set_attr "op_type" "RSY")
9343 (set_attr "type" "sem")])
9344
9345 ; cds, cdsy
9346 (define_insn "*atomic_compare_and_swapdi_2"
9347 [(set (match_operand:DI 0 "register_operand" "=r,r")
9348 (match_operand:DI 1 "memory_operand" "+Q,S"))
9349 (set (match_dup 1)
9350 (unspec_volatile:DI
9351 [(match_dup 1)
9352 (match_operand:DI 2 "register_operand" "0,0")
9353 (match_operand:DI 3 "register_operand" "r,r")]
9354 UNSPECV_CAS))
9355 (set (reg:CCZ1 CC_REGNUM)
9356 (compare:CCZ1 (match_dup 1) (match_dup 2)))]
9357 "!TARGET_ZARCH"
9358 "@
9359 cds\t%0,%3,%S1
9360 cdsy\t%0,%3,%S1"
9361 [(set_attr "op_type" "RS,RSY")
9362 (set_attr "type" "sem")])
9363
9364 ; cs, csy
9365 (define_insn "*atomic_compare_and_swapsi_3"
9366 [(set (match_operand:SI 0 "register_operand" "=r,r")
9367 (match_operand:SI 1 "memory_operand" "+Q,S"))
9368 (set (match_dup 1)
9369 (unspec_volatile:SI
9370 [(match_dup 1)
9371 (match_operand:SI 2 "register_operand" "0,0")
9372 (match_operand:SI 3 "register_operand" "r,r")]
9373 UNSPECV_CAS))
9374 (set (reg:CCZ1 CC_REGNUM)
9375 (compare:CCZ1 (match_dup 1) (match_dup 2)))]
9376 ""
9377 "@
9378 cs\t%0,%3,%S1
9379 csy\t%0,%3,%S1"
9380 [(set_attr "op_type" "RS,RSY")
9381 (set_attr "type" "sem")])
9382
9383 ;
9384 ; Other atomic instruction patterns.
9385 ;
9386
9387 ; z196 load and add, xor, or and and instructions
9388
9389 (define_expand "atomic_fetch_<atomic><mode>"
9390 [(match_operand:GPR 0 "register_operand") ;; val out
9391 (ATOMIC_Z196:GPR
9392 (match_operand:GPR 1 "memory_operand") ;; memory
9393 (match_operand:GPR 2 "register_operand")) ;; val in
9394 (match_operand:SI 3 "const_int_operand")] ;; model
9395 "TARGET_Z196"
9396 {
9397 if (MEM_ALIGN (operands[1]) < GET_MODE_BITSIZE (GET_MODE (operands[1])))
9398 FAIL;
9399
9400 emit_insn (gen_atomic_fetch_<atomic><mode>_iaf
9401 (operands[0], operands[1], operands[2]));
9402 DONE;
9403 })
9404
9405 ; lan, lang, lao, laog, lax, laxg, laa, laag
9406 (define_insn "atomic_fetch_<atomic><mode>_iaf"
9407 [(set (match_operand:GPR 0 "register_operand" "=d")
9408 (match_operand:GPR 1 "memory_operand" "+QS"))
9409 (set (match_dup 1)
9410 (unspec_volatile:GPR
9411 [(ATOMIC_Z196:GPR (match_dup 1)
9412 (match_operand:GPR 2 "general_operand" "d"))]
9413 UNSPECV_ATOMIC_OP))
9414 (clobber (reg:CC CC_REGNUM))]
9415 "TARGET_Z196"
9416 "la<noxa><g>\t%0,%2,%1"
9417 [(set_attr "op_type" "RSY")
9418 (set_attr "type" "sem")])
9419
9420 ;; For SImode and larger, the optabs.c code will do just fine in
9421 ;; expanding a compare-and-swap loop. For QI/HImode, we can do
9422 ;; better by expanding our own loop.
9423
9424 (define_expand "atomic_<atomic><mode>"
9425 [(ATOMIC:HQI
9426 (match_operand:HQI 0 "memory_operand") ;; memory
9427 (match_operand:HQI 1 "general_operand")) ;; val in
9428 (match_operand:SI 2 "const_int_operand")] ;; model
9429 ""
9430 {
9431 s390_expand_atomic (<MODE>mode, <CODE>, NULL_RTX, operands[0],
9432 operands[1], false);
9433 DONE;
9434 })
9435
9436 (define_expand "atomic_fetch_<atomic><mode>"
9437 [(match_operand:HQI 0 "register_operand") ;; val out
9438 (ATOMIC:HQI
9439 (match_operand:HQI 1 "memory_operand") ;; memory
9440 (match_operand:HQI 2 "general_operand")) ;; val in
9441 (match_operand:SI 3 "const_int_operand")] ;; model
9442 ""
9443 {
9444 s390_expand_atomic (<MODE>mode, <CODE>, operands[0], operands[1],
9445 operands[2], false);
9446 DONE;
9447 })
9448
9449 (define_expand "atomic_<atomic>_fetch<mode>"
9450 [(match_operand:HQI 0 "register_operand") ;; val out
9451 (ATOMIC:HQI
9452 (match_operand:HQI 1 "memory_operand") ;; memory
9453 (match_operand:HQI 2 "general_operand")) ;; val in
9454 (match_operand:SI 3 "const_int_operand")] ;; model
9455 ""
9456 {
9457 s390_expand_atomic (<MODE>mode, <CODE>, operands[0], operands[1],
9458 operands[2], true);
9459 DONE;
9460 })
9461
9462 (define_expand "atomic_exchange<mode>"
9463 [(match_operand:HQI 0 "register_operand") ;; val out
9464 (match_operand:HQI 1 "memory_operand") ;; memory
9465 (match_operand:HQI 2 "general_operand") ;; val in
9466 (match_operand:SI 3 "const_int_operand")] ;; model
9467 ""
9468 {
9469 s390_expand_atomic (<MODE>mode, SET, operands[0], operands[1],
9470 operands[2], false);
9471 DONE;
9472 })
9473
9474 ;;
9475 ;;- Miscellaneous instructions.
9476 ;;
9477
9478 ;
9479 ; allocate stack instruction pattern(s).
9480 ;
9481
9482 (define_expand "allocate_stack"
9483 [(match_operand 0 "general_operand" "")
9484 (match_operand 1 "general_operand" "")]
9485 "TARGET_BACKCHAIN"
9486 {
9487 rtx temp = gen_reg_rtx (Pmode);
9488
9489 emit_move_insn (temp, s390_back_chain_rtx ());
9490 anti_adjust_stack (operands[1]);
9491 emit_move_insn (s390_back_chain_rtx (), temp);
9492
9493 emit_move_insn (operands[0], virtual_stack_dynamic_rtx);
9494 DONE;
9495 })
9496
9497
9498 ;
9499 ; setjmp instruction pattern.
9500 ;
9501
9502 (define_expand "builtin_setjmp_receiver"
9503 [(match_operand 0 "" "")]
9504 "flag_pic"
9505 {
9506 emit_insn (s390_load_got ());
9507 emit_use (pic_offset_table_rtx);
9508 DONE;
9509 })
9510
9511 ;; These patterns say how to save and restore the stack pointer. We need not
9512 ;; save the stack pointer at function level since we are careful to
9513 ;; preserve the backchain. At block level, we have to restore the backchain
9514 ;; when we restore the stack pointer.
9515 ;;
9516 ;; For nonlocal gotos, we must save both the stack pointer and its
9517 ;; backchain and restore both. Note that in the nonlocal case, the
9518 ;; save area is a memory location.
9519
9520 (define_expand "save_stack_function"
9521 [(match_operand 0 "general_operand" "")
9522 (match_operand 1 "general_operand" "")]
9523 ""
9524 "DONE;")
9525
9526 (define_expand "restore_stack_function"
9527 [(match_operand 0 "general_operand" "")
9528 (match_operand 1 "general_operand" "")]
9529 ""
9530 "DONE;")
9531
9532 (define_expand "restore_stack_block"
9533 [(match_operand 0 "register_operand" "")
9534 (match_operand 1 "register_operand" "")]
9535 "TARGET_BACKCHAIN"
9536 {
9537 rtx temp = gen_reg_rtx (Pmode);
9538
9539 emit_move_insn (temp, s390_back_chain_rtx ());
9540 emit_move_insn (operands[0], operands[1]);
9541 emit_move_insn (s390_back_chain_rtx (), temp);
9542
9543 DONE;
9544 })
9545
9546 (define_expand "save_stack_nonlocal"
9547 [(match_operand 0 "memory_operand" "")
9548 (match_operand 1 "register_operand" "")]
9549 ""
9550 {
9551 rtx base = gen_rtx_REG (Pmode, BASE_REGNUM);
9552
9553 /* Copy the backchain to the first word, sp to the second and the
9554 literal pool base to the third. */
9555
9556 rtx save_bc = adjust_address (operands[0], Pmode, 0);
9557 rtx save_sp = adjust_address (operands[0], Pmode, GET_MODE_SIZE (Pmode));
9558 rtx save_bp = adjust_address (operands[0], Pmode, 2 * GET_MODE_SIZE (Pmode));
9559
9560 if (TARGET_BACKCHAIN)
9561 emit_move_insn (save_bc, force_reg (Pmode, s390_back_chain_rtx ()));
9562
9563 emit_move_insn (save_sp, operands[1]);
9564 emit_move_insn (save_bp, base);
9565
9566 DONE;
9567 })
9568
9569 (define_expand "restore_stack_nonlocal"
9570 [(match_operand 0 "register_operand" "")
9571 (match_operand 1 "memory_operand" "")]
9572 ""
9573 {
9574 rtx base = gen_rtx_REG (Pmode, BASE_REGNUM);
9575 rtx temp = NULL_RTX;
9576
9577 /* Restore the backchain from the first word, sp from the second and the
9578 literal pool base from the third. */
9579
9580 rtx save_bc = adjust_address (operands[1], Pmode, 0);
9581 rtx save_sp = adjust_address (operands[1], Pmode, GET_MODE_SIZE (Pmode));
9582 rtx save_bp = adjust_address (operands[1], Pmode, 2 * GET_MODE_SIZE (Pmode));
9583
9584 if (TARGET_BACKCHAIN)
9585 temp = force_reg (Pmode, save_bc);
9586
9587 emit_move_insn (base, save_bp);
9588 emit_move_insn (operands[0], save_sp);
9589
9590 if (temp)
9591 emit_move_insn (s390_back_chain_rtx (), temp);
9592
9593 emit_use (base);
9594 DONE;
9595 })
9596
9597 (define_expand "exception_receiver"
9598 [(const_int 0)]
9599 ""
9600 {
9601 s390_set_has_landing_pad_p (true);
9602 DONE;
9603 })
9604
9605 ;
9606 ; nop instruction pattern(s).
9607 ;
9608
9609 (define_insn "nop"
9610 [(const_int 0)]
9611 ""
9612 "lr\t0,0"
9613 [(set_attr "op_type" "RR")
9614 (set_attr "z10prop" "z10_fr_E1")])
9615
9616 (define_insn "nop1"
9617 [(const_int 1)]
9618 ""
9619 "lr\t1,1"
9620 [(set_attr "op_type" "RR")])
9621
9622
9623 ;
9624 ; Special literal pool access instruction pattern(s).
9625 ;
9626
9627 (define_insn "*pool_entry"
9628 [(unspec_volatile [(match_operand 0 "consttable_operand" "X")]
9629 UNSPECV_POOL_ENTRY)]
9630 ""
9631 {
9632 enum machine_mode mode = GET_MODE (PATTERN (insn));
9633 unsigned int align = GET_MODE_BITSIZE (mode);
9634 s390_output_pool_entry (operands[0], mode, align);
9635 return "";
9636 }
9637 [(set (attr "length")
9638 (symbol_ref "GET_MODE_SIZE (GET_MODE (PATTERN (insn)))"))])
9639
9640 (define_insn "pool_align"
9641 [(unspec_volatile [(match_operand 0 "const_int_operand" "n")]
9642 UNSPECV_POOL_ALIGN)]
9643 ""
9644 ".align\t%0"
9645 [(set (attr "length") (symbol_ref "INTVAL (operands[0])"))])
9646
9647 (define_insn "pool_section_start"
9648 [(unspec_volatile [(const_int 1)] UNSPECV_POOL_SECTION)]
9649 ""
9650 ".section\t.rodata"
9651 [(set_attr "length" "0")])
9652
9653 (define_insn "pool_section_end"
9654 [(unspec_volatile [(const_int 0)] UNSPECV_POOL_SECTION)]
9655 ""
9656 ".previous"
9657 [(set_attr "length" "0")])
9658
9659 (define_insn "main_base_31_small"
9660 [(set (match_operand 0 "register_operand" "=a")
9661 (unspec [(label_ref (match_operand 1 "" ""))] UNSPEC_MAIN_BASE))]
9662 "!TARGET_CPU_ZARCH && GET_MODE (operands[0]) == Pmode"
9663 "basr\t%0,0"
9664 [(set_attr "op_type" "RR")
9665 (set_attr "type" "la")
9666 (set_attr "z196prop" "z196_cracked")])
9667
9668 (define_insn "main_base_31_large"
9669 [(set (match_operand 0 "register_operand" "=a")
9670 (unspec [(label_ref (match_operand 1 "" ""))] UNSPEC_MAIN_BASE))
9671 (set (pc) (label_ref (match_operand 2 "" "")))]
9672 "!TARGET_CPU_ZARCH && GET_MODE (operands[0]) == Pmode"
9673 "bras\t%0,%2"
9674 [(set_attr "op_type" "RI")
9675 (set_attr "z196prop" "z196_cracked")])
9676
9677 (define_insn "main_base_64"
9678 [(set (match_operand 0 "register_operand" "=a")
9679 (unspec [(label_ref (match_operand 1 "" ""))] UNSPEC_MAIN_BASE))]
9680 "TARGET_CPU_ZARCH && GET_MODE (operands[0]) == Pmode"
9681 "larl\t%0,%1"
9682 [(set_attr "op_type" "RIL")
9683 (set_attr "type" "larl")
9684 (set_attr "z10prop" "z10_fwd_A1")])
9685
9686 (define_insn "main_pool"
9687 [(set (match_operand 0 "register_operand" "=a")
9688 (unspec_volatile [(const_int 0)] UNSPECV_MAIN_POOL))]
9689 "GET_MODE (operands[0]) == Pmode"
9690 {
9691 gcc_unreachable ();
9692 }
9693 [(set (attr "type")
9694 (if_then_else (match_test "TARGET_CPU_ZARCH")
9695 (const_string "larl") (const_string "la")))])
9696
9697 (define_insn "reload_base_31"
9698 [(set (match_operand 0 "register_operand" "=a")
9699 (unspec [(label_ref (match_operand 1 "" ""))] UNSPEC_RELOAD_BASE))]
9700 "!TARGET_CPU_ZARCH && GET_MODE (operands[0]) == Pmode"
9701 "basr\t%0,0\;la\t%0,%1-.(%0)"
9702 [(set_attr "length" "6")
9703 (set_attr "type" "la")
9704 (set_attr "z196prop" "z196_cracked")])
9705
9706 (define_insn "reload_base_64"
9707 [(set (match_operand 0 "register_operand" "=a")
9708 (unspec [(label_ref (match_operand 1 "" ""))] UNSPEC_RELOAD_BASE))]
9709 "TARGET_CPU_ZARCH && GET_MODE (operands[0]) == Pmode"
9710 "larl\t%0,%1"
9711 [(set_attr "op_type" "RIL")
9712 (set_attr "type" "larl")
9713 (set_attr "z10prop" "z10_fwd_A1")])
9714
9715 (define_insn "pool"
9716 [(unspec_volatile [(match_operand 0 "const_int_operand" "n")] UNSPECV_POOL)]
9717 ""
9718 {
9719 gcc_unreachable ();
9720 }
9721 [(set (attr "length") (symbol_ref "INTVAL (operands[0])"))])
9722
9723 ;;
9724 ;; Insns related to generating the function prologue and epilogue.
9725 ;;
9726
9727
9728 (define_expand "prologue"
9729 [(use (const_int 0))]
9730 ""
9731 "s390_emit_prologue (); DONE;")
9732
9733 (define_expand "epilogue"
9734 [(use (const_int 1))]
9735 ""
9736 "s390_emit_epilogue (false); DONE;")
9737
9738 (define_expand "sibcall_epilogue"
9739 [(use (const_int 0))]
9740 ""
9741 "s390_emit_epilogue (true); DONE;")
9742
9743 ;; A direct return instruction, without using an epilogue.
9744 (define_insn "<code>"
9745 [(ANY_RETURN)]
9746 "s390_can_use_<code>_insn ()"
9747 "br\t%%r14"
9748 [(set_attr "op_type" "RR")
9749 (set_attr "type" "jsr")
9750 (set_attr "atype" "agen")])
9751
9752 (define_insn "*return"
9753 [(return)
9754 (use (match_operand 0 "register_operand" "a"))]
9755 "GET_MODE (operands[0]) == Pmode"
9756 "br\t%0"
9757 [(set_attr "op_type" "RR")
9758 (set_attr "type" "jsr")
9759 (set_attr "atype" "agen")])
9760
9761
9762 ;; Instruction definition to extend a 31-bit pointer into a 64-bit
9763 ;; pointer. This is used for compatibility.
9764
9765 (define_expand "ptr_extend"
9766 [(set (match_operand:DI 0 "register_operand" "=r")
9767 (match_operand:SI 1 "register_operand" "r"))]
9768 "TARGET_64BIT"
9769 {
9770 emit_insn (gen_anddi3 (operands[0],
9771 gen_lowpart (DImode, operands[1]),
9772 GEN_INT (0x7fffffff)));
9773 DONE;
9774 })
9775
9776 ;; Instruction definition to expand eh_return macro to support
9777 ;; swapping in special linkage return addresses.
9778
9779 (define_expand "eh_return"
9780 [(use (match_operand 0 "register_operand" ""))]
9781 "TARGET_TPF"
9782 {
9783 s390_emit_tpf_eh_return (operands[0]);
9784 DONE;
9785 })
9786
9787 ;
9788 ; Stack Protector Patterns
9789 ;
9790
9791 (define_expand "stack_protect_set"
9792 [(set (match_operand 0 "memory_operand" "")
9793 (match_operand 1 "memory_operand" ""))]
9794 ""
9795 {
9796 #ifdef TARGET_THREAD_SSP_OFFSET
9797 operands[1]
9798 = gen_rtx_MEM (Pmode, gen_rtx_PLUS (Pmode, s390_get_thread_pointer (),
9799 GEN_INT (TARGET_THREAD_SSP_OFFSET)));
9800 #endif
9801 if (TARGET_64BIT)
9802 emit_insn (gen_stack_protect_setdi (operands[0], operands[1]));
9803 else
9804 emit_insn (gen_stack_protect_setsi (operands[0], operands[1]));
9805
9806 DONE;
9807 })
9808
9809 (define_insn "stack_protect_set<mode>"
9810 [(set (match_operand:DSI 0 "memory_operand" "=Q")
9811 (unspec:DSI [(match_operand:DSI 1 "memory_operand" "Q")] UNSPEC_SP_SET))]
9812 ""
9813 "mvc\t%O0(%G0,%R0),%S1"
9814 [(set_attr "op_type" "SS")])
9815
9816 (define_expand "stack_protect_test"
9817 [(set (reg:CC CC_REGNUM)
9818 (compare (match_operand 0 "memory_operand" "")
9819 (match_operand 1 "memory_operand" "")))
9820 (match_operand 2 "" "")]
9821 ""
9822 {
9823 rtx cc_reg, test;
9824 #ifdef TARGET_THREAD_SSP_OFFSET
9825 operands[1]
9826 = gen_rtx_MEM (Pmode, gen_rtx_PLUS (Pmode, s390_get_thread_pointer (),
9827 GEN_INT (TARGET_THREAD_SSP_OFFSET)));
9828 #endif
9829 if (TARGET_64BIT)
9830 emit_insn (gen_stack_protect_testdi (operands[0], operands[1]));
9831 else
9832 emit_insn (gen_stack_protect_testsi (operands[0], operands[1]));
9833
9834 cc_reg = gen_rtx_REG (CCZmode, CC_REGNUM);
9835 test = gen_rtx_EQ (VOIDmode, cc_reg, const0_rtx);
9836 emit_jump_insn (gen_cbranchcc4 (test, cc_reg, const0_rtx, operands[2]));
9837 DONE;
9838 })
9839
9840 (define_insn "stack_protect_test<mode>"
9841 [(set (reg:CCZ CC_REGNUM)
9842 (unspec:CCZ [(match_operand:DSI 0 "memory_operand" "Q")
9843 (match_operand:DSI 1 "memory_operand" "Q")] UNSPEC_SP_TEST))]
9844 ""
9845 "clc\t%O0(%G0,%R0),%S1"
9846 [(set_attr "op_type" "SS")])
9847
9848 ; This is used in s390_emit_prologue in order to prevent insns
9849 ; adjusting the stack pointer to be moved over insns writing stack
9850 ; slots using a copy of the stack pointer in a different register.
9851 (define_insn "stack_tie"
9852 [(set (match_operand:BLK 0 "memory_operand" "+m")
9853 (unspec:BLK [(match_dup 0)] UNSPEC_TIE))]
9854 ""
9855 ""
9856 [(set_attr "length" "0")])
9857
9858
9859 ;
9860 ; Data prefetch patterns
9861 ;
9862
9863 (define_insn "prefetch"
9864 [(prefetch (match_operand 0 "address_operand" "ZQZRZSZT,X")
9865 (match_operand:SI 1 "const_int_operand" " n,n")
9866 (match_operand:SI 2 "const_int_operand" " n,n"))]
9867 "TARGET_Z10"
9868 {
9869 switch (which_alternative)
9870 {
9871 case 0:
9872 return INTVAL (operands[1]) == 1 ? "pfd\t2,%a0" : "pfd\t1,%a0";
9873 case 1:
9874 if (larl_operand (operands[0], Pmode))
9875 return INTVAL (operands[1]) == 1 ? "pfdrl\t2,%a0" : "pfdrl\t1,%a0";
9876 default:
9877
9878 /* This might be reached for symbolic operands with an odd
9879 addend. We simply omit the prefetch for such rare cases. */
9880
9881 return "";
9882 }
9883 }
9884 [(set_attr "type" "load,larl")
9885 (set_attr "op_type" "RXY,RIL")
9886 (set_attr "z10prop" "z10_super")
9887 (set_attr "z196prop" "z196_alone")])
9888
9889
9890 ;
9891 ; Byte swap instructions
9892 ;
9893
9894 (define_insn "bswap<mode>2"
9895 [(set (match_operand:GPR 0 "register_operand" "=d, d")
9896 (bswap:GPR (match_operand:GPR 1 "nonimmediate_operand" " d,RT")))]
9897 "TARGET_CPU_ZARCH"
9898 "@
9899 lrv<g>r\t%0,%1
9900 lrv<g>\t%0,%1"
9901 [(set_attr "type" "*,load")
9902 (set_attr "op_type" "RRE,RXY")
9903 (set_attr "z10prop" "z10_super")])
9904
9905
9906 ;
9907 ; Population count instruction
9908 ;
9909
9910 ; The S/390 popcount instruction counts the bits of op1 in 8 byte
9911 ; portions and stores the result in the corresponding bytes in op0.
9912 (define_insn "*popcount<mode>"
9913 [(set (match_operand:INT 0 "register_operand" "=d")
9914 (unspec:INT [(match_operand:INT 1 "register_operand" "d")] UNSPEC_POPCNT))
9915 (clobber (reg:CC CC_REGNUM))]
9916 "TARGET_Z196"
9917 "popcnt\t%0,%1"
9918 [(set_attr "op_type" "RRE")])
9919
9920 (define_expand "popcountdi2"
9921 [; popcnt op0, op1
9922 (parallel [(set (match_operand:DI 0 "register_operand" "")
9923 (unspec:DI [(match_operand:DI 1 "register_operand")]
9924 UNSPEC_POPCNT))
9925 (clobber (reg:CC CC_REGNUM))])
9926 ; sllg op2, op0, 32
9927 (set (match_dup 2) (ashift:DI (match_dup 0) (const_int 32)))
9928 ; agr op0, op2
9929 (parallel [(set (match_dup 0) (plus:DI (match_dup 0) (match_dup 2)))
9930 (clobber (reg:CC CC_REGNUM))])
9931 ; sllg op2, op0, 16
9932 (set (match_dup 2)
9933 (ashift:DI (match_dup 0) (const_int 16)))
9934 ; agr op0, op2
9935 (parallel [(set (match_dup 0) (plus:DI (match_dup 0) (match_dup 2)))
9936 (clobber (reg:CC CC_REGNUM))])
9937 ; sllg op2, op0, 8
9938 (set (match_dup 2) (ashift:DI (match_dup 0) (const_int 8)))
9939 ; agr op0, op2
9940 (parallel [(set (match_dup 0) (plus:DI (match_dup 0) (match_dup 2)))
9941 (clobber (reg:CC CC_REGNUM))])
9942 ; srlg op0, op0, 56
9943 (set (match_dup 0) (lshiftrt:DI (match_dup 0) (const_int 56)))]
9944 "TARGET_Z196 && TARGET_64BIT"
9945 "operands[2] = gen_reg_rtx (DImode);")
9946
9947 (define_expand "popcountsi2"
9948 [; popcnt op0, op1
9949 (parallel [(set (match_operand:SI 0 "register_operand" "")
9950 (unspec:SI [(match_operand:SI 1 "register_operand")]
9951 UNSPEC_POPCNT))
9952 (clobber (reg:CC CC_REGNUM))])
9953 ; sllk op2, op0, 16
9954 (set (match_dup 2)
9955 (ashift:SI (match_dup 0) (const_int 16)))
9956 ; ar op0, op2
9957 (parallel [(set (match_dup 0) (plus:SI (match_dup 0) (match_dup 2)))
9958 (clobber (reg:CC CC_REGNUM))])
9959 ; sllk op2, op0, 8
9960 (set (match_dup 2) (ashift:SI (match_dup 0) (const_int 8)))
9961 ; ar op0, op2
9962 (parallel [(set (match_dup 0) (plus:SI (match_dup 0) (match_dup 2)))
9963 (clobber (reg:CC CC_REGNUM))])
9964 ; srl op0, op0, 24
9965 (set (match_dup 0) (lshiftrt:SI (match_dup 0) (const_int 24)))]
9966 "TARGET_Z196"
9967 "operands[2] = gen_reg_rtx (SImode);")
9968
9969 (define_expand "popcounthi2"
9970 [; popcnt op0, op1
9971 (parallel [(set (match_operand:HI 0 "register_operand" "")
9972 (unspec:HI [(match_operand:HI 1 "register_operand")]
9973 UNSPEC_POPCNT))
9974 (clobber (reg:CC CC_REGNUM))])
9975 ; sllk op2, op0, 8
9976 (set (match_dup 2)
9977 (ashift:SI (match_dup 0) (const_int 8)))
9978 ; ar op0, op2
9979 (parallel [(set (match_dup 0) (plus:SI (match_dup 0) (match_dup 2)))
9980 (clobber (reg:CC CC_REGNUM))])
9981 ; srl op0, op0, 8
9982 (set (match_dup 0) (lshiftrt:HI (match_dup 0) (const_int 8)))]
9983 "TARGET_Z196"
9984 "operands[2] = gen_reg_rtx (SImode);")
9985
9986 (define_expand "popcountqi2"
9987 [; popcnt op0, op1
9988 (parallel [(set (match_operand:QI 0 "register_operand" "")
9989 (unspec:QI [(match_operand:QI 1 "register_operand")]
9990 UNSPEC_POPCNT))
9991 (clobber (reg:CC CC_REGNUM))])]
9992 "TARGET_Z196"
9993 "")
9994
9995 ;;
9996 ;;- Copy sign instructions
9997 ;;
9998
9999 (define_insn "copysign<mode>3"
10000 [(set (match_operand:FP 0 "register_operand" "=f")
10001 (unspec:FP [(match_operand:FP 1 "register_operand" "<fT0>")
10002 (match_operand:FP 2 "register_operand" "f")]
10003 UNSPEC_COPYSIGN))]
10004 "TARGET_Z196"
10005 "cpsdr\t%0,%2,%1"
10006 [(set_attr "op_type" "RRF")
10007 (set_attr "type" "fsimp<mode>")])
10008
10009
10010 ;;
10011 ;;- Transactional execution instructions
10012 ;;
10013
10014 ; This splitter helps combine to make use of CC directly when
10015 ; comparing the integer result of a tbegin builtin with a constant.
10016 ; The unspec is already removed by canonicalize_comparison. So this
10017 ; splitters only job is to turn the PARALLEL into separate insns
10018 ; again. Unfortunately this only works with the very first cc/int
10019 ; compare since combine is not able to deal with data flow across
10020 ; basic block boundaries.
10021
10022 ; It needs to be an insn pattern as well since combine does not apply
10023 ; the splitter directly. Combine would only use it if it actually
10024 ; would reduce the number of instructions.
10025 (define_insn_and_split "*ccraw_to_int"
10026 [(set (pc)
10027 (if_then_else
10028 (match_operator 0 "s390_eqne_operator"
10029 [(reg:CCRAW CC_REGNUM)
10030 (match_operand 1 "const_int_operand" "")])
10031 (label_ref (match_operand 2 "" ""))
10032 (pc)))
10033 (set (match_operand:SI 3 "register_operand" "=d")
10034 (unspec:SI [(reg:CCRAW CC_REGNUM)] UNSPEC_CC_TO_INT))]
10035 ""
10036 "#"
10037 ""
10038 [(set (match_dup 3)
10039 (unspec:SI [(reg:CCRAW CC_REGNUM)] UNSPEC_CC_TO_INT))
10040 (set (pc)
10041 (if_then_else (match_op_dup 0 [(reg:CCRAW CC_REGNUM) (match_dup 1)])
10042 (label_ref (match_dup 2))
10043 (pc)))]
10044 "")
10045
10046 ; Non-constrained transaction begin
10047
10048 (define_expand "tbegin"
10049 [(match_operand:SI 0 "register_operand" "")
10050 (match_operand:BLK 1 "memory_operand" "")]
10051 "TARGET_HTM"
10052 {
10053 s390_expand_tbegin (operands[0], operands[1], NULL_RTX, true);
10054 DONE;
10055 })
10056
10057 (define_expand "tbegin_nofloat"
10058 [(match_operand:SI 0 "register_operand" "")
10059 (match_operand:BLK 1 "memory_operand" "")]
10060 "TARGET_HTM"
10061 {
10062 s390_expand_tbegin (operands[0], operands[1], NULL_RTX, false);
10063 DONE;
10064 })
10065
10066 (define_expand "tbegin_retry"
10067 [(match_operand:SI 0 "register_operand" "")
10068 (match_operand:BLK 1 "memory_operand" "")
10069 (match_operand:SI 2 "general_operand" "")]
10070 "TARGET_HTM"
10071 {
10072 s390_expand_tbegin (operands[0], operands[1], operands[2], true);
10073 DONE;
10074 })
10075
10076 (define_expand "tbegin_retry_nofloat"
10077 [(match_operand:SI 0 "register_operand" "")
10078 (match_operand:BLK 1 "memory_operand" "")
10079 (match_operand:SI 2 "general_operand" "")]
10080 "TARGET_HTM"
10081 {
10082 s390_expand_tbegin (operands[0], operands[1], operands[2], false);
10083 DONE;
10084 })
10085
10086 (define_insn "tbegin_1"
10087 [(set (reg:CCRAW CC_REGNUM)
10088 (unspec_volatile:CCRAW [(match_operand 0 "const_int_operand" "D")]
10089 UNSPECV_TBEGIN))
10090 (set (match_operand:BLK 1 "memory_operand" "=Q")
10091 (unspec_volatile:BLK [(match_dup 0)] UNSPECV_TBEGIN_TDB))
10092 (clobber (reg:DF 16))
10093 (clobber (reg:DF 17))
10094 (clobber (reg:DF 18))
10095 (clobber (reg:DF 19))
10096 (clobber (reg:DF 20))
10097 (clobber (reg:DF 21))
10098 (clobber (reg:DF 22))
10099 (clobber (reg:DF 23))
10100 (clobber (reg:DF 24))
10101 (clobber (reg:DF 25))
10102 (clobber (reg:DF 26))
10103 (clobber (reg:DF 27))
10104 (clobber (reg:DF 28))
10105 (clobber (reg:DF 29))
10106 (clobber (reg:DF 30))
10107 (clobber (reg:DF 31))]
10108 ; CONST_OK_FOR_CONSTRAINT_P does not work with D constraint since D is
10109 ; not supposed to be used for immediates (see genpreds.c).
10110 "TARGET_HTM && INTVAL (operands[0]) >= 0 && INTVAL (operands[0]) <= 0xffff"
10111 "tbegin\t%1,%x0"
10112 [(set_attr "op_type" "SIL")])
10113
10114 ; Same as above but without the FPR clobbers
10115 (define_insn "tbegin_nofloat_1"
10116 [(set (reg:CCRAW CC_REGNUM)
10117 (unspec_volatile:CCRAW [(match_operand 0 "const_int_operand" "D")]
10118 UNSPECV_TBEGIN))
10119 (set (match_operand:BLK 1 "memory_operand" "=Q")
10120 (unspec_volatile:BLK [(match_dup 0)] UNSPECV_TBEGIN_TDB))]
10121 "TARGET_HTM && INTVAL (operands[0]) >= 0 && INTVAL (operands[0]) <= 0xffff"
10122 "tbegin\t%1,%x0"
10123 [(set_attr "op_type" "SIL")])
10124
10125
10126 ; Constrained transaction begin
10127
10128 (define_expand "tbeginc"
10129 [(set (reg:CCRAW CC_REGNUM)
10130 (unspec_volatile:CCRAW [(const_int TBEGINC_MASK)]
10131 UNSPECV_TBEGINC))]
10132 "TARGET_HTM"
10133 "")
10134
10135 (define_insn "*tbeginc_1"
10136 [(set (reg:CCRAW CC_REGNUM)
10137 (unspec_volatile:CCRAW [(match_operand 0 "const_int_operand" " D")]
10138 UNSPECV_TBEGINC))]
10139 "TARGET_HTM && INTVAL (operands[0]) >= 0 && INTVAL (operands[0]) <= 0xffff"
10140 "tbeginc\t0,%x0"
10141 [(set_attr "op_type" "SIL")])
10142
10143 ; Transaction end
10144
10145 (define_expand "tend"
10146 [(set (reg:CCRAW CC_REGNUM)
10147 (unspec_volatile:CCRAW [(const_int 0)] UNSPECV_TEND))
10148 (set (match_operand:SI 0 "register_operand" "")
10149 (unspec:SI [(reg:CCRAW CC_REGNUM)] UNSPEC_CC_TO_INT))]
10150 "TARGET_HTM"
10151 "")
10152
10153 (define_insn "*tend_1"
10154 [(set (reg:CCRAW CC_REGNUM)
10155 (unspec_volatile:CCRAW [(const_int 0)] UNSPECV_TEND))]
10156 "TARGET_HTM"
10157 "tend"
10158 [(set_attr "op_type" "S")])
10159
10160 ; Transaction abort
10161
10162 (define_expand "tabort"
10163 [(unspec_volatile [(match_operand:SI 0 "shift_count_or_setmem_operand" "")]
10164 UNSPECV_TABORT)]
10165 "TARGET_HTM && operands != NULL"
10166 {
10167 if (CONST_INT_P (operands[0])
10168 && INTVAL (operands[0]) >= 0 && INTVAL (operands[0]) <= 255)
10169 {
10170 error ("Invalid transaction abort code: " HOST_WIDE_INT_PRINT_DEC
10171 ". Values in range 0 through 255 are reserved.",
10172 INTVAL (operands[0]));
10173 FAIL;
10174 }
10175 })
10176
10177 (define_insn "*tabort_1"
10178 [(unspec_volatile [(match_operand:SI 0 "shift_count_or_setmem_operand" "Y")]
10179 UNSPECV_TABORT)]
10180 "TARGET_HTM && operands != NULL"
10181 "tabort\t%Y0"
10182 [(set_attr "op_type" "S")])
10183
10184 ; Transaction extract nesting depth
10185
10186 (define_insn "etnd"
10187 [(set (match_operand:SI 0 "register_operand" "=d")
10188 (unspec_volatile:SI [(const_int 0)] UNSPECV_ETND))]
10189 "TARGET_HTM"
10190 "etnd\t%0"
10191 [(set_attr "op_type" "RRE")])
10192
10193 ; Non-transactional store
10194
10195 (define_insn "ntstg"
10196 [(set (match_operand:DI 0 "memory_operand" "=RT")
10197 (unspec_volatile:DI [(match_operand:DI 1 "register_operand" "d")]
10198 UNSPECV_NTSTG))]
10199 "TARGET_HTM"
10200 "ntstg\t%1,%0"
10201 [(set_attr "op_type" "RXY")])
10202
10203 ; Transaction perform processor assist
10204
10205 (define_expand "tx_assist"
10206 [(unspec_volatile [(match_operand:SI 0 "register_operand" "")
10207 (reg:SI GPR0_REGNUM)
10208 (const_int 1)]
10209 UNSPECV_PPA)]
10210 "TARGET_HTM"
10211 "")
10212
10213 (define_insn "*ppa"
10214 [(unspec_volatile [(match_operand:SI 0 "register_operand" "d")
10215 (match_operand:SI 1 "register_operand" "d")
10216 (match_operand 2 "const_int_operand" "I")]
10217 UNSPECV_PPA)]
10218 "TARGET_HTM && INTVAL (operands[2]) < 16"
10219 "ppa\t%0,%1,%2"
10220 [(set_attr "op_type" "RRF")])