s390.md: Add a splitter for NOT rtx.
[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 ; Combine replaces (xor (x) (const_int -1)) with (not (x)) when doing
7005 ; simplifications. So its better to have something matching.
7006 (define_split
7007 [(set (match_operand:INT 0 "nonimmediate_operand" "")
7008 (not:INT (match_operand:INT 1 "nonimmediate_operand" "")))]
7009 ""
7010 [(parallel
7011 [(set (match_dup 0) (xor:INT (match_dup 1) (match_dup 2)))
7012 (clobber (reg:CC CC_REGNUM))])]
7013 {
7014 operands[2] = constm1_rtx;
7015 if (!s390_logical_operator_ok_p (operands))
7016 FAIL;
7017 })
7018
7019 ;
7020 ; xordi3 instruction pattern(s).
7021 ;
7022
7023 (define_insn "*xordi3_cc"
7024 [(set (reg CC_REGNUM)
7025 (compare (xor:DI (match_operand:DI 1 "nonimmediate_operand" "%0,d, 0")
7026 (match_operand:DI 2 "general_operand" " d,d,RT"))
7027 (const_int 0)))
7028 (set (match_operand:DI 0 "register_operand" "=d,d, d")
7029 (xor:DI (match_dup 1) (match_dup 2)))]
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_cconly"
7040 [(set (reg CC_REGNUM)
7041 (compare (xor:DI (match_operand:DI 1 "nonimmediate_operand" "%0,d, 0")
7042 (match_operand:DI 2 "general_operand" " d,d,RT"))
7043 (const_int 0)))
7044 (clobber (match_scratch:DI 0 "=d,d, d"))]
7045 "s390_match_ccmode(insn, CCTmode) && TARGET_ZARCH"
7046 "@
7047 xgr\t%0,%2
7048 xgrk\t%0,%1,%2
7049 xg\t%0,%2"
7050 [(set_attr "op_type" "RRE,RRF,RXY")
7051 (set_attr "cpu_facility" "*,z196,*")
7052 (set_attr "z10prop" "z10_super_E1,*,z10_super_E1")])
7053
7054 (define_insn "*xordi3"
7055 [(set (match_operand:DI 0 "nonimmediate_operand" "=d, d,d,d, d, AQ,Q")
7056 (xor:DI (match_operand:DI 1 "nonimmediate_operand" "%0, 0,0,d, 0, 0,0")
7057 (match_operand:DI 2 "general_operand" "N0SD0,N1SD0,d,d,RT,NxQD0,Q")))
7058 (clobber (reg:CC CC_REGNUM))]
7059 "TARGET_ZARCH && s390_logical_operator_ok_p (operands)"
7060 "@
7061 xihf\t%0,%k2
7062 xilf\t%0,%k2
7063 xgr\t%0,%2
7064 xgrk\t%0,%1,%2
7065 xg\t%0,%2
7066 #
7067 #"
7068 [(set_attr "op_type" "RIL,RIL,RRE,RRF,RXY,SI,SS")
7069 (set_attr "cpu_facility" "extimm,extimm,*,z196,*,*,*")
7070 (set_attr "z10prop" "z10_super_E1,z10_super_E1,z10_super_E1,
7071 *,z10_super_E1,*,*")])
7072
7073 (define_split
7074 [(set (match_operand:DI 0 "s_operand" "")
7075 (xor:DI (match_dup 0) (match_operand:DI 1 "immediate_operand" "")))
7076 (clobber (reg:CC CC_REGNUM))]
7077 "reload_completed"
7078 [(parallel
7079 [(set (match_dup 0) (xor:QI (match_dup 0) (match_dup 1)))
7080 (clobber (reg:CC CC_REGNUM))])]
7081 "s390_narrow_logical_operator (XOR, &operands[0], &operands[1]);")
7082
7083 ;
7084 ; xorsi3 instruction pattern(s).
7085 ;
7086
7087 (define_insn "*xorsi3_cc"
7088 [(set (reg CC_REGNUM)
7089 (compare (xor:SI (match_operand:SI 1 "nonimmediate_operand" "%0,0,d,0,0")
7090 (match_operand:SI 2 "general_operand" "Os,d,d,R,T"))
7091 (const_int 0)))
7092 (set (match_operand:SI 0 "register_operand" "=d,d,d,d,d")
7093 (xor:SI (match_dup 1) (match_dup 2)))]
7094 "s390_match_ccmode(insn, CCTmode)"
7095 "@
7096 xilf\t%0,%o2
7097 xr\t%0,%2
7098 xrk\t%0,%1,%2
7099 x\t%0,%2
7100 xy\t%0,%2"
7101 [(set_attr "op_type" "RIL,RR,RRF,RX,RXY")
7102 (set_attr "cpu_facility" "*,*,z196,*,*")
7103 (set_attr "z10prop" "z10_super_E1,z10_super_E1,*,
7104 z10_super_E1,z10_super_E1")])
7105
7106 (define_insn "*xorsi3_cconly"
7107 [(set (reg CC_REGNUM)
7108 (compare (xor:SI (match_operand:SI 1 "nonimmediate_operand" "%0,0,d,0,0")
7109 (match_operand:SI 2 "general_operand" "Os,d,d,R,T"))
7110 (const_int 0)))
7111 (clobber (match_scratch:SI 0 "=d,d,d,d,d"))]
7112 "s390_match_ccmode(insn, CCTmode)"
7113 "@
7114 xilf\t%0,%o2
7115 xr\t%0,%2
7116 xrk\t%0,%1,%2
7117 x\t%0,%2
7118 xy\t%0,%2"
7119 [(set_attr "op_type" "RIL,RR,RRF,RX,RXY")
7120 (set_attr "cpu_facility" "*,*,z196,*,*")
7121 (set_attr "z10prop" "z10_super_E1,z10_super_E1,*,
7122 z10_super_E1,z10_super_E1")])
7123
7124 (define_insn "*xorsi3"
7125 [(set (match_operand:SI 0 "nonimmediate_operand" "=d,d,d,d,d, AQ,Q")
7126 (xor:SI (match_operand:SI 1 "nonimmediate_operand" "%0,0,d,0,0, 0,0")
7127 (match_operand:SI 2 "general_operand" "Os,d,d,R,T,NxQS0,Q")))
7128 (clobber (reg:CC CC_REGNUM))]
7129 "s390_logical_operator_ok_p (operands)"
7130 "@
7131 xilf\t%0,%o2
7132 xr\t%0,%2
7133 xrk\t%0,%1,%2
7134 x\t%0,%2
7135 xy\t%0,%2
7136 #
7137 #"
7138 [(set_attr "op_type" "RIL,RR,RRF,RX,RXY,SI,SS")
7139 (set_attr "cpu_facility" "*,*,z196,*,*,*,*")
7140 (set_attr "z10prop" "z10_super_E1,z10_super_E1,*,
7141 z10_super_E1,z10_super_E1,*,*")])
7142
7143 (define_split
7144 [(set (match_operand:SI 0 "s_operand" "")
7145 (xor:SI (match_dup 0) (match_operand:SI 1 "immediate_operand" "")))
7146 (clobber (reg:CC CC_REGNUM))]
7147 "reload_completed"
7148 [(parallel
7149 [(set (match_dup 0) (xor:QI (match_dup 0) (match_dup 1)))
7150 (clobber (reg:CC CC_REGNUM))])]
7151 "s390_narrow_logical_operator (XOR, &operands[0], &operands[1]);")
7152
7153 ;
7154 ; xorhi3 instruction pattern(s).
7155 ;
7156
7157 (define_insn "*xorhi3"
7158 [(set (match_operand:HI 0 "nonimmediate_operand" "=d,d,d, AQ,Q")
7159 (xor:HI (match_operand:HI 1 "nonimmediate_operand" "%0,0,d, 0,0")
7160 (match_operand:HI 2 "general_operand" "Os,d,d,NxQH0,Q")))
7161 (clobber (reg:CC CC_REGNUM))]
7162 "s390_logical_operator_ok_p (operands)"
7163 "@
7164 xilf\t%0,%x2
7165 xr\t%0,%2
7166 xrk\t%0,%1,%2
7167 #
7168 #"
7169 [(set_attr "op_type" "RIL,RR,RRF,SI,SS")
7170 (set_attr "cpu_facility" "*,*,z196,*,*")
7171 (set_attr "z10prop" "z10_super_E1,z10_super_E1,*,*,*")])
7172
7173 (define_split
7174 [(set (match_operand:HI 0 "s_operand" "")
7175 (xor:HI (match_dup 0) (match_operand:HI 1 "immediate_operand" "")))
7176 (clobber (reg:CC CC_REGNUM))]
7177 "reload_completed"
7178 [(parallel
7179 [(set (match_dup 0) (xor:QI (match_dup 0) (match_dup 1)))
7180 (clobber (reg:CC CC_REGNUM))])]
7181 "s390_narrow_logical_operator (XOR, &operands[0], &operands[1]);")
7182
7183 ;
7184 ; xorqi3 instruction pattern(s).
7185 ;
7186
7187 (define_insn "*xorqi3"
7188 [(set (match_operand:QI 0 "nonimmediate_operand" "=d,d,d,Q,S,Q")
7189 (xor:QI (match_operand:QI 1 "nonimmediate_operand" "%0,0,d,0,0,0")
7190 (match_operand:QI 2 "general_operand" "Os,d,d,n,n,Q")))
7191 (clobber (reg:CC CC_REGNUM))]
7192 "s390_logical_operator_ok_p (operands)"
7193 "@
7194 xilf\t%0,%b2
7195 xr\t%0,%2
7196 xrk\t%0,%1,%2
7197 xi\t%S0,%b2
7198 xiy\t%S0,%b2
7199 #"
7200 [(set_attr "op_type" "RIL,RR,RRF,SI,SIY,SS")
7201 (set_attr "cpu_facility" "*,*,z196,*,*,*")
7202 (set_attr "z10prop" "z10_super_E1,z10_super_E1,*,z10_super,z10_super,*")])
7203
7204
7205 ;
7206 ; Block exclusive or (XC) patterns.
7207 ;
7208
7209 (define_insn "*xc"
7210 [(set (match_operand:BLK 0 "memory_operand" "=Q")
7211 (xor:BLK (match_dup 0)
7212 (match_operand:BLK 1 "memory_operand" "Q")))
7213 (use (match_operand 2 "const_int_operand" "n"))
7214 (clobber (reg:CC CC_REGNUM))]
7215 "INTVAL (operands[2]) >= 1 && INTVAL (operands[2]) <= 256"
7216 "xc\t%O0(%2,%R0),%S1"
7217 [(set_attr "op_type" "SS")])
7218
7219 (define_split
7220 [(set (match_operand 0 "memory_operand" "")
7221 (xor (match_dup 0)
7222 (match_operand 1 "memory_operand" "")))
7223 (clobber (reg:CC CC_REGNUM))]
7224 "reload_completed
7225 && GET_MODE (operands[0]) == GET_MODE (operands[1])
7226 && GET_MODE_SIZE (GET_MODE (operands[0])) > 0"
7227 [(parallel
7228 [(set (match_dup 0) (xor:BLK (match_dup 0) (match_dup 1)))
7229 (use (match_dup 2))
7230 (clobber (reg:CC CC_REGNUM))])]
7231 {
7232 operands[2] = GEN_INT (GET_MODE_SIZE (GET_MODE (operands[0])));
7233 operands[0] = adjust_address (operands[0], BLKmode, 0);
7234 operands[1] = adjust_address (operands[1], BLKmode, 0);
7235 })
7236
7237 (define_peephole2
7238 [(parallel
7239 [(set (match_operand:BLK 0 "memory_operand" "")
7240 (xor:BLK (match_dup 0)
7241 (match_operand:BLK 1 "memory_operand" "")))
7242 (use (match_operand 2 "const_int_operand" ""))
7243 (clobber (reg:CC CC_REGNUM))])
7244 (parallel
7245 [(set (match_operand:BLK 3 "memory_operand" "")
7246 (xor:BLK (match_dup 3)
7247 (match_operand:BLK 4 "memory_operand" "")))
7248 (use (match_operand 5 "const_int_operand" ""))
7249 (clobber (reg:CC CC_REGNUM))])]
7250 "s390_offset_p (operands[0], operands[3], operands[2])
7251 && s390_offset_p (operands[1], operands[4], operands[2])
7252 && !s390_overlap_p (operands[0], operands[1],
7253 INTVAL (operands[2]) + INTVAL (operands[5]))
7254 && INTVAL (operands[2]) + INTVAL (operands[5]) <= 256"
7255 [(parallel
7256 [(set (match_dup 6) (xor:BLK (match_dup 6) (match_dup 7)))
7257 (use (match_dup 8))
7258 (clobber (reg:CC CC_REGNUM))])]
7259 "operands[6] = gen_rtx_MEM (BLKmode, XEXP (operands[0], 0));
7260 operands[7] = gen_rtx_MEM (BLKmode, XEXP (operands[1], 0));
7261 operands[8] = GEN_INT (INTVAL (operands[2]) + INTVAL (operands[5]));")
7262
7263 ;
7264 ; Block xor (XC) patterns with src == dest.
7265 ;
7266
7267 (define_insn "*xc_zero"
7268 [(set (match_operand:BLK 0 "memory_operand" "=Q")
7269 (const_int 0))
7270 (use (match_operand 1 "const_int_operand" "n"))
7271 (clobber (reg:CC CC_REGNUM))]
7272 "INTVAL (operands[1]) >= 1 && INTVAL (operands[1]) <= 256"
7273 "xc\t%O0(%1,%R0),%S0"
7274 [(set_attr "op_type" "SS")
7275 (set_attr "z196prop" "z196_cracked")])
7276
7277 (define_peephole2
7278 [(parallel
7279 [(set (match_operand:BLK 0 "memory_operand" "")
7280 (const_int 0))
7281 (use (match_operand 1 "const_int_operand" ""))
7282 (clobber (reg:CC CC_REGNUM))])
7283 (parallel
7284 [(set (match_operand:BLK 2 "memory_operand" "")
7285 (const_int 0))
7286 (use (match_operand 3 "const_int_operand" ""))
7287 (clobber (reg:CC CC_REGNUM))])]
7288 "s390_offset_p (operands[0], operands[2], operands[1])
7289 && INTVAL (operands[1]) + INTVAL (operands[3]) <= 256"
7290 [(parallel
7291 [(set (match_dup 4) (const_int 0))
7292 (use (match_dup 5))
7293 (clobber (reg:CC CC_REGNUM))])]
7294 "operands[4] = gen_rtx_MEM (BLKmode, XEXP (operands[0], 0));
7295 operands[5] = GEN_INT (INTVAL (operands[1]) + INTVAL (operands[3]));")
7296
7297
7298 ;;
7299 ;;- Negate instructions.
7300 ;;
7301
7302 ;
7303 ; neg(di|si)2 instruction pattern(s).
7304 ;
7305
7306 (define_expand "neg<mode>2"
7307 [(parallel
7308 [(set (match_operand:DSI 0 "register_operand" "=d")
7309 (neg:DSI (match_operand:DSI 1 "register_operand" "d")))
7310 (clobber (reg:CC CC_REGNUM))])]
7311 ""
7312 "")
7313
7314 (define_insn "*negdi2_sign_cc"
7315 [(set (reg CC_REGNUM)
7316 (compare (neg:DI (ashiftrt:DI (ashift:DI (subreg:DI
7317 (match_operand:SI 1 "register_operand" "d") 0)
7318 (const_int 32)) (const_int 32)))
7319 (const_int 0)))
7320 (set (match_operand:DI 0 "register_operand" "=d")
7321 (neg:DI (sign_extend:DI (match_dup 1))))]
7322 "TARGET_ZARCH && s390_match_ccmode (insn, CCAmode)"
7323 "lcgfr\t%0,%1"
7324 [(set_attr "op_type" "RRE")
7325 (set_attr "z10prop" "z10_c")])
7326
7327 (define_insn "*negdi2_sign"
7328 [(set (match_operand:DI 0 "register_operand" "=d")
7329 (neg:DI (sign_extend:DI (match_operand:SI 1 "register_operand" "d"))))
7330 (clobber (reg:CC CC_REGNUM))]
7331 "TARGET_ZARCH"
7332 "lcgfr\t%0,%1"
7333 [(set_attr "op_type" "RRE")
7334 (set_attr "z10prop" "z10_c")])
7335
7336 ; lcr, lcgr
7337 (define_insn "*neg<mode>2_cc"
7338 [(set (reg CC_REGNUM)
7339 (compare (neg:GPR (match_operand:GPR 1 "register_operand" "d"))
7340 (const_int 0)))
7341 (set (match_operand:GPR 0 "register_operand" "=d")
7342 (neg:GPR (match_dup 1)))]
7343 "s390_match_ccmode (insn, CCAmode)"
7344 "lc<g>r\t%0,%1"
7345 [(set_attr "op_type" "RR<E>")
7346 (set_attr "z10prop" "z10_super_c_E1")])
7347
7348 ; lcr, lcgr
7349 (define_insn "*neg<mode>2_cconly"
7350 [(set (reg CC_REGNUM)
7351 (compare (neg:GPR (match_operand:GPR 1 "register_operand" "d"))
7352 (const_int 0)))
7353 (clobber (match_scratch:GPR 0 "=d"))]
7354 "s390_match_ccmode (insn, CCAmode)"
7355 "lc<g>r\t%0,%1"
7356 [(set_attr "op_type" "RR<E>")
7357 (set_attr "z10prop" "z10_super_c_E1")])
7358
7359 ; lcr, lcgr
7360 (define_insn "*neg<mode>2"
7361 [(set (match_operand:GPR 0 "register_operand" "=d")
7362 (neg:GPR (match_operand:GPR 1 "register_operand" "d")))
7363 (clobber (reg:CC CC_REGNUM))]
7364 ""
7365 "lc<g>r\t%0,%1"
7366 [(set_attr "op_type" "RR<E>")
7367 (set_attr "z10prop" "z10_super_c_E1")])
7368
7369 (define_insn_and_split "*negdi2_31"
7370 [(set (match_operand:DI 0 "register_operand" "=d")
7371 (neg:DI (match_operand:DI 1 "register_operand" "d")))
7372 (clobber (reg:CC CC_REGNUM))]
7373 "!TARGET_ZARCH"
7374 "#"
7375 "&& reload_completed"
7376 [(parallel
7377 [(set (match_dup 2) (neg:SI (match_dup 3)))
7378 (clobber (reg:CC CC_REGNUM))])
7379 (parallel
7380 [(set (reg:CCAP CC_REGNUM)
7381 (compare:CCAP (neg:SI (match_dup 5)) (const_int 0)))
7382 (set (match_dup 4) (neg:SI (match_dup 5)))])
7383 (set (pc)
7384 (if_then_else (ne (reg:CCAP CC_REGNUM) (const_int 0))
7385 (pc)
7386 (label_ref (match_dup 6))))
7387 (parallel
7388 [(set (match_dup 2) (plus:SI (match_dup 2) (const_int -1)))
7389 (clobber (reg:CC CC_REGNUM))])
7390 (match_dup 6)]
7391 "operands[2] = operand_subword (operands[0], 0, 0, DImode);
7392 operands[3] = operand_subword (operands[1], 0, 0, DImode);
7393 operands[4] = operand_subword (operands[0], 1, 0, DImode);
7394 operands[5] = operand_subword (operands[1], 1, 0, DImode);
7395 operands[6] = gen_label_rtx ();")
7396
7397 ;
7398 ; neg(df|sf)2 instruction pattern(s).
7399 ;
7400
7401 (define_expand "neg<mode>2"
7402 [(parallel
7403 [(set (match_operand:BFP 0 "register_operand" "=f")
7404 (neg:BFP (match_operand:BFP 1 "register_operand" "f")))
7405 (clobber (reg:CC CC_REGNUM))])]
7406 "TARGET_HARD_FLOAT"
7407 "")
7408
7409 ; lcxbr, lcdbr, lcebr
7410 (define_insn "*neg<mode>2_cc"
7411 [(set (reg CC_REGNUM)
7412 (compare (neg:BFP (match_operand:BFP 1 "register_operand" "f"))
7413 (match_operand:BFP 2 "const0_operand" "")))
7414 (set (match_operand:BFP 0 "register_operand" "=f")
7415 (neg:BFP (match_dup 1)))]
7416 "s390_match_ccmode (insn, CCSmode) && TARGET_HARD_FLOAT"
7417 "lc<xde>br\t%0,%1"
7418 [(set_attr "op_type" "RRE")
7419 (set_attr "type" "fsimp<mode>")])
7420
7421 ; lcxbr, lcdbr, lcebr
7422 (define_insn "*neg<mode>2_cconly"
7423 [(set (reg CC_REGNUM)
7424 (compare (neg:BFP (match_operand:BFP 1 "register_operand" "f"))
7425 (match_operand:BFP 2 "const0_operand" "")))
7426 (clobber (match_scratch:BFP 0 "=f"))]
7427 "s390_match_ccmode (insn, CCSmode) && TARGET_HARD_FLOAT"
7428 "lc<xde>br\t%0,%1"
7429 [(set_attr "op_type" "RRE")
7430 (set_attr "type" "fsimp<mode>")])
7431
7432 ; lcdfr
7433 (define_insn "*neg<mode>2_nocc"
7434 [(set (match_operand:FP 0 "register_operand" "=f")
7435 (neg:FP (match_operand:FP 1 "register_operand" "<fT0>")))]
7436 "TARGET_DFP"
7437 "lcdfr\t%0,%1"
7438 [(set_attr "op_type" "RRE")
7439 (set_attr "type" "fsimp<mode>")])
7440
7441 ; lcxbr, lcdbr, lcebr
7442 (define_insn "*neg<mode>2"
7443 [(set (match_operand:BFP 0 "register_operand" "=f")
7444 (neg:BFP (match_operand:BFP 1 "register_operand" "f")))
7445 (clobber (reg:CC CC_REGNUM))]
7446 "TARGET_HARD_FLOAT"
7447 "lc<xde>br\t%0,%1"
7448 [(set_attr "op_type" "RRE")
7449 (set_attr "type" "fsimp<mode>")])
7450
7451
7452 ;;
7453 ;;- Absolute value instructions.
7454 ;;
7455
7456 ;
7457 ; abs(di|si)2 instruction pattern(s).
7458 ;
7459
7460 (define_insn "*absdi2_sign_cc"
7461 [(set (reg CC_REGNUM)
7462 (compare (abs:DI (ashiftrt:DI (ashift:DI (subreg:DI
7463 (match_operand:SI 1 "register_operand" "d") 0)
7464 (const_int 32)) (const_int 32)))
7465 (const_int 0)))
7466 (set (match_operand:DI 0 "register_operand" "=d")
7467 (abs:DI (sign_extend:DI (match_dup 1))))]
7468 "TARGET_ZARCH && s390_match_ccmode (insn, CCAmode)"
7469 "lpgfr\t%0,%1"
7470 [(set_attr "op_type" "RRE")
7471 (set_attr "z10prop" "z10_c")])
7472
7473 (define_insn "*absdi2_sign"
7474 [(set (match_operand:DI 0 "register_operand" "=d")
7475 (abs:DI (sign_extend:DI (match_operand:SI 1 "register_operand" "d"))))
7476 (clobber (reg:CC CC_REGNUM))]
7477 "TARGET_ZARCH"
7478 "lpgfr\t%0,%1"
7479 [(set_attr "op_type" "RRE")
7480 (set_attr "z10prop" "z10_c")])
7481
7482 ; lpr, lpgr
7483 (define_insn "*abs<mode>2_cc"
7484 [(set (reg CC_REGNUM)
7485 (compare (abs:GPR (match_operand:DI 1 "register_operand" "d"))
7486 (const_int 0)))
7487 (set (match_operand:GPR 0 "register_operand" "=d")
7488 (abs:GPR (match_dup 1)))]
7489 "s390_match_ccmode (insn, CCAmode)"
7490 "lp<g>r\t%0,%1"
7491 [(set_attr "op_type" "RR<E>")
7492 (set_attr "z10prop" "z10_c")])
7493
7494 ; lpr, lpgr
7495 (define_insn "*abs<mode>2_cconly"
7496 [(set (reg CC_REGNUM)
7497 (compare (abs:GPR (match_operand:GPR 1 "register_operand" "d"))
7498 (const_int 0)))
7499 (clobber (match_scratch:GPR 0 "=d"))]
7500 "s390_match_ccmode (insn, CCAmode)"
7501 "lp<g>r\t%0,%1"
7502 [(set_attr "op_type" "RR<E>")
7503 (set_attr "z10prop" "z10_c")])
7504
7505 ; lpr, lpgr
7506 (define_insn "abs<mode>2"
7507 [(set (match_operand:GPR 0 "register_operand" "=d")
7508 (abs:GPR (match_operand:GPR 1 "register_operand" "d")))
7509 (clobber (reg:CC CC_REGNUM))]
7510 ""
7511 "lp<g>r\t%0,%1"
7512 [(set_attr "op_type" "RR<E>")
7513 (set_attr "z10prop" "z10_c")])
7514
7515 ;
7516 ; abs(df|sf)2 instruction pattern(s).
7517 ;
7518
7519 (define_expand "abs<mode>2"
7520 [(parallel
7521 [(set (match_operand:BFP 0 "register_operand" "=f")
7522 (abs:BFP (match_operand:BFP 1 "register_operand" "f")))
7523 (clobber (reg:CC CC_REGNUM))])]
7524 "TARGET_HARD_FLOAT"
7525 "")
7526
7527 ; lpxbr, lpdbr, lpebr
7528 (define_insn "*abs<mode>2_cc"
7529 [(set (reg CC_REGNUM)
7530 (compare (abs:BFP (match_operand:BFP 1 "register_operand" "f"))
7531 (match_operand:BFP 2 "const0_operand" "")))
7532 (set (match_operand:BFP 0 "register_operand" "=f")
7533 (abs:BFP (match_dup 1)))]
7534 "s390_match_ccmode (insn, CCSmode) && TARGET_HARD_FLOAT"
7535 "lp<xde>br\t%0,%1"
7536 [(set_attr "op_type" "RRE")
7537 (set_attr "type" "fsimp<mode>")])
7538
7539 ; lpxbr, lpdbr, lpebr
7540 (define_insn "*abs<mode>2_cconly"
7541 [(set (reg CC_REGNUM)
7542 (compare (abs:BFP (match_operand:BFP 1 "register_operand" "f"))
7543 (match_operand:BFP 2 "const0_operand" "")))
7544 (clobber (match_scratch:BFP 0 "=f"))]
7545 "s390_match_ccmode (insn, CCSmode) && TARGET_HARD_FLOAT"
7546 "lp<xde>br\t%0,%1"
7547 [(set_attr "op_type" "RRE")
7548 (set_attr "type" "fsimp<mode>")])
7549
7550 ; lpdfr
7551 (define_insn "*abs<mode>2_nocc"
7552 [(set (match_operand:FP 0 "register_operand" "=f")
7553 (abs:FP (match_operand:FP 1 "register_operand" "<fT0>")))]
7554 "TARGET_DFP"
7555 "lpdfr\t%0,%1"
7556 [(set_attr "op_type" "RRE")
7557 (set_attr "type" "fsimp<mode>")])
7558
7559 ; lpxbr, lpdbr, lpebr
7560 (define_insn "*abs<mode>2"
7561 [(set (match_operand:BFP 0 "register_operand" "=f")
7562 (abs:BFP (match_operand:BFP 1 "register_operand" "f")))
7563 (clobber (reg:CC CC_REGNUM))]
7564 "TARGET_HARD_FLOAT"
7565 "lp<xde>br\t%0,%1"
7566 [(set_attr "op_type" "RRE")
7567 (set_attr "type" "fsimp<mode>")])
7568
7569
7570 ;;
7571 ;;- Negated absolute value instructions
7572 ;;
7573
7574 ;
7575 ; Integer
7576 ;
7577
7578 (define_insn "*negabsdi2_sign_cc"
7579 [(set (reg CC_REGNUM)
7580 (compare (neg:DI (abs:DI (ashiftrt:DI (ashift:DI (subreg:DI
7581 (match_operand:SI 1 "register_operand" "d") 0)
7582 (const_int 32)) (const_int 32))))
7583 (const_int 0)))
7584 (set (match_operand:DI 0 "register_operand" "=d")
7585 (neg:DI (abs:DI (sign_extend:DI (match_dup 1)))))]
7586 "TARGET_ZARCH && s390_match_ccmode (insn, CCAmode)"
7587 "lngfr\t%0,%1"
7588 [(set_attr "op_type" "RRE")
7589 (set_attr "z10prop" "z10_c")])
7590
7591 (define_insn "*negabsdi2_sign"
7592 [(set (match_operand:DI 0 "register_operand" "=d")
7593 (neg:DI (abs:DI (sign_extend:DI
7594 (match_operand:SI 1 "register_operand" "d")))))
7595 (clobber (reg:CC CC_REGNUM))]
7596 "TARGET_ZARCH"
7597 "lngfr\t%0,%1"
7598 [(set_attr "op_type" "RRE")
7599 (set_attr "z10prop" "z10_c")])
7600
7601 ; lnr, lngr
7602 (define_insn "*negabs<mode>2_cc"
7603 [(set (reg CC_REGNUM)
7604 (compare (neg:GPR (abs:GPR (match_operand:GPR 1 "register_operand" "d")))
7605 (const_int 0)))
7606 (set (match_operand:GPR 0 "register_operand" "=d")
7607 (neg:GPR (abs:GPR (match_dup 1))))]
7608 "s390_match_ccmode (insn, CCAmode)"
7609 "ln<g>r\t%0,%1"
7610 [(set_attr "op_type" "RR<E>")
7611 (set_attr "z10prop" "z10_c")])
7612
7613 ; lnr, lngr
7614 (define_insn "*negabs<mode>2_cconly"
7615 [(set (reg CC_REGNUM)
7616 (compare (neg:GPR (abs:GPR (match_operand:GPR 1 "register_operand" "d")))
7617 (const_int 0)))
7618 (clobber (match_scratch:GPR 0 "=d"))]
7619 "s390_match_ccmode (insn, CCAmode)"
7620 "ln<g>r\t%0,%1"
7621 [(set_attr "op_type" "RR<E>")
7622 (set_attr "z10prop" "z10_c")])
7623
7624 ; lnr, lngr
7625 (define_insn "*negabs<mode>2"
7626 [(set (match_operand:GPR 0 "register_operand" "=d")
7627 (neg:GPR (abs:GPR (match_operand:GPR 1 "register_operand" "d"))))
7628 (clobber (reg:CC CC_REGNUM))]
7629 ""
7630 "ln<g>r\t%0,%1"
7631 [(set_attr "op_type" "RR<E>")
7632 (set_attr "z10prop" "z10_c")])
7633
7634 ;
7635 ; Floating point
7636 ;
7637
7638 ; lnxbr, lndbr, lnebr
7639 (define_insn "*negabs<mode>2_cc"
7640 [(set (reg CC_REGNUM)
7641 (compare (neg:BFP (abs:BFP (match_operand:BFP 1 "register_operand" "f")))
7642 (match_operand:BFP 2 "const0_operand" "")))
7643 (set (match_operand:BFP 0 "register_operand" "=f")
7644 (neg:BFP (abs:BFP (match_dup 1))))]
7645 "s390_match_ccmode (insn, CCSmode) && TARGET_HARD_FLOAT"
7646 "ln<xde>br\t%0,%1"
7647 [(set_attr "op_type" "RRE")
7648 (set_attr "type" "fsimp<mode>")])
7649
7650 ; lnxbr, lndbr, lnebr
7651 (define_insn "*negabs<mode>2_cconly"
7652 [(set (reg CC_REGNUM)
7653 (compare (neg:BFP (abs:BFP (match_operand:BFP 1 "register_operand" "f")))
7654 (match_operand:BFP 2 "const0_operand" "")))
7655 (clobber (match_scratch:BFP 0 "=f"))]
7656 "s390_match_ccmode (insn, CCSmode) && TARGET_HARD_FLOAT"
7657 "ln<xde>br\t%0,%1"
7658 [(set_attr "op_type" "RRE")
7659 (set_attr "type" "fsimp<mode>")])
7660
7661 ; lndfr
7662 (define_insn "*negabs<mode>2_nocc"
7663 [(set (match_operand:FP 0 "register_operand" "=f")
7664 (neg:FP (abs:FP (match_operand:BFP 1 "register_operand" "<fT0>"))))]
7665 "TARGET_DFP"
7666 "lndfr\t%0,%1"
7667 [(set_attr "op_type" "RRE")
7668 (set_attr "type" "fsimp<mode>")])
7669
7670 ; lnxbr, lndbr, lnebr
7671 (define_insn "*negabs<mode>2"
7672 [(set (match_operand:BFP 0 "register_operand" "=f")
7673 (neg:BFP (abs:BFP (match_operand:BFP 1 "register_operand" "f"))))
7674 (clobber (reg:CC CC_REGNUM))]
7675 "TARGET_HARD_FLOAT"
7676 "ln<xde>br\t%0,%1"
7677 [(set_attr "op_type" "RRE")
7678 (set_attr "type" "fsimp<mode>")])
7679
7680 ;;
7681 ;;- Square root instructions.
7682 ;;
7683
7684 ;
7685 ; sqrt(df|sf)2 instruction pattern(s).
7686 ;
7687
7688 ; sqxbr, sqdbr, sqebr, sqdb, sqeb
7689 (define_insn "sqrt<mode>2"
7690 [(set (match_operand:BFP 0 "register_operand" "=f,f")
7691 (sqrt:BFP (match_operand:BFP 1 "general_operand" "f,<Rf>")))]
7692 "TARGET_HARD_FLOAT"
7693 "@
7694 sq<xde>br\t%0,%1
7695 sq<xde>b\t%0,%1"
7696 [(set_attr "op_type" "RRE,RXE")
7697 (set_attr "type" "fsqrt<mode>")])
7698
7699
7700 ;;
7701 ;;- One complement instructions.
7702 ;;
7703
7704 ;
7705 ; one_cmpl(di|si|hi|qi)2 instruction pattern(s).
7706 ;
7707
7708 (define_expand "one_cmpl<mode>2"
7709 [(parallel
7710 [(set (match_operand:INT 0 "register_operand" "")
7711 (xor:INT (match_operand:INT 1 "register_operand" "")
7712 (const_int -1)))
7713 (clobber (reg:CC CC_REGNUM))])]
7714 ""
7715 "")
7716
7717
7718 ;;
7719 ;; Find leftmost bit instructions.
7720 ;;
7721
7722 (define_expand "clzdi2"
7723 [(set (match_operand:DI 0 "register_operand" "=d")
7724 (clz:DI (match_operand:DI 1 "register_operand" "d")))]
7725 "TARGET_EXTIMM && TARGET_ZARCH"
7726 {
7727 rtx insn, clz_equal;
7728 rtx wide_reg = gen_reg_rtx (TImode);
7729 rtx msb = gen_rtx_CONST_INT (DImode, (unsigned HOST_WIDE_INT) 1 << 63);
7730
7731 clz_equal = gen_rtx_CLZ (DImode, operands[1]);
7732
7733 emit_insn (gen_clztidi2 (wide_reg, operands[1], msb));
7734
7735 insn = emit_move_insn (operands[0], gen_highpart (DImode, wide_reg));
7736 set_unique_reg_note (insn, REG_EQUAL, clz_equal);
7737
7738 DONE;
7739 })
7740
7741 (define_insn "clztidi2"
7742 [(set (match_operand:TI 0 "register_operand" "=d")
7743 (ior:TI
7744 (ashift:TI
7745 (zero_extend:TI
7746 (xor:DI (match_operand:DI 1 "register_operand" "d")
7747 (lshiftrt (match_operand:DI 2 "const_int_operand" "")
7748 (subreg:SI (clz:DI (match_dup 1)) 4))))
7749
7750 (const_int 64))
7751 (zero_extend:TI (clz:DI (match_dup 1)))))
7752 (clobber (reg:CC CC_REGNUM))]
7753 "(unsigned HOST_WIDE_INT) INTVAL (operands[2])
7754 == (unsigned HOST_WIDE_INT) 1 << 63
7755 && TARGET_EXTIMM && TARGET_ZARCH"
7756 "flogr\t%0,%1"
7757 [(set_attr "op_type" "RRE")])
7758
7759
7760 ;;
7761 ;;- Rotate instructions.
7762 ;;
7763
7764 ;
7765 ; rotl(di|si)3 instruction pattern(s).
7766 ;
7767
7768 ; rll, rllg
7769 (define_insn "rotl<mode>3"
7770 [(set (match_operand:GPR 0 "register_operand" "=d")
7771 (rotate:GPR (match_operand:GPR 1 "register_operand" "d")
7772 (match_operand:SI 2 "shift_count_or_setmem_operand" "Y")))]
7773 "TARGET_CPU_ZARCH"
7774 "rll<g>\t%0,%1,%Y2"
7775 [(set_attr "op_type" "RSE")
7776 (set_attr "atype" "reg")
7777 (set_attr "z10prop" "z10_super_E1")])
7778
7779 ; rll, rllg
7780 (define_insn "*rotl<mode>3_and"
7781 [(set (match_operand:GPR 0 "register_operand" "=d")
7782 (rotate:GPR (match_operand:GPR 1 "register_operand" "d")
7783 (and:SI (match_operand:SI 2 "shift_count_or_setmem_operand" "Y")
7784 (match_operand:SI 3 "const_int_operand" "n"))))]
7785 "TARGET_CPU_ZARCH && (INTVAL (operands[3]) & 63) == 63"
7786 "rll<g>\t%0,%1,%Y2"
7787 [(set_attr "op_type" "RSE")
7788 (set_attr "atype" "reg")
7789 (set_attr "z10prop" "z10_super_E1")])
7790
7791
7792 ;;
7793 ;;- Shift instructions.
7794 ;;
7795
7796 ;
7797 ; (ashl|lshr)(di|si)3 instruction pattern(s).
7798 ; Left shifts and logical right shifts
7799
7800 (define_expand "<shift><mode>3"
7801 [(set (match_operand:DSI 0 "register_operand" "")
7802 (SHIFT:DSI (match_operand:DSI 1 "register_operand" "")
7803 (match_operand:SI 2 "shift_count_or_setmem_operand" "")))]
7804 ""
7805 "")
7806
7807 ; sldl, srdl
7808 (define_insn "*<shift>di3_31"
7809 [(set (match_operand:DI 0 "register_operand" "=d")
7810 (SHIFT:DI (match_operand:DI 1 "register_operand" "0")
7811 (match_operand:SI 2 "shift_count_or_setmem_operand" "Y")))]
7812 "!TARGET_ZARCH"
7813 "s<lr>dl\t%0,%Y2"
7814 [(set_attr "op_type" "RS")
7815 (set_attr "atype" "reg")
7816 (set_attr "z196prop" "z196_cracked")])
7817
7818 ; sll, srl, sllg, srlg, sllk, srlk
7819 (define_insn "*<shift><mode>3"
7820 [(set (match_operand:GPR 0 "register_operand" "=d,d")
7821 (SHIFT:GPR (match_operand:GPR 1 "register_operand" "<d0>,d")
7822 (match_operand:SI 2 "shift_count_or_setmem_operand" "Y,Y")))]
7823 ""
7824 "@
7825 s<lr>l<g>\t%0,<1>%Y2
7826 s<lr>l<gk>\t%0,%1,%Y2"
7827 [(set_attr "op_type" "RS<E>,RSY")
7828 (set_attr "atype" "reg,reg")
7829 (set_attr "cpu_facility" "*,z196")
7830 (set_attr "z10prop" "z10_super_E1,*")])
7831
7832 ; sldl, srdl
7833 (define_insn "*<shift>di3_31_and"
7834 [(set (match_operand:DI 0 "register_operand" "=d")
7835 (SHIFT:DI (match_operand:DI 1 "register_operand" "0")
7836 (and:SI (match_operand:SI 2 "shift_count_or_setmem_operand" "Y")
7837 (match_operand:SI 3 "const_int_operand" "n"))))]
7838 "!TARGET_ZARCH && (INTVAL (operands[3]) & 63) == 63"
7839 "s<lr>dl\t%0,%Y2"
7840 [(set_attr "op_type" "RS")
7841 (set_attr "atype" "reg")])
7842
7843 ; sll, srl, sllg, srlg, sllk, srlk
7844 (define_insn "*<shift><mode>3_and"
7845 [(set (match_operand:GPR 0 "register_operand" "=d,d")
7846 (SHIFT:GPR (match_operand:GPR 1 "register_operand" "<d0>,d")
7847 (and:SI (match_operand:SI 2 "shift_count_or_setmem_operand" "Y,Y")
7848 (match_operand:SI 3 "const_int_operand" "n,n"))))]
7849 "(INTVAL (operands[3]) & 63) == 63"
7850 "@
7851 s<lr>l<g>\t%0,<1>%Y2
7852 s<lr>l<gk>\t%0,%1,%Y2"
7853 [(set_attr "op_type" "RS<E>,RSY")
7854 (set_attr "atype" "reg,reg")
7855 (set_attr "cpu_facility" "*,z196")
7856 (set_attr "z10prop" "z10_super_E1,*")])
7857
7858 ;
7859 ; ashr(di|si)3 instruction pattern(s).
7860 ; Arithmetic right shifts
7861
7862 (define_expand "ashr<mode>3"
7863 [(parallel
7864 [(set (match_operand:DSI 0 "register_operand" "")
7865 (ashiftrt:DSI (match_operand:DSI 1 "register_operand" "")
7866 (match_operand:SI 2 "shift_count_or_setmem_operand" "")))
7867 (clobber (reg:CC CC_REGNUM))])]
7868 ""
7869 "")
7870
7871 (define_insn "*ashrdi3_cc_31"
7872 [(set (reg CC_REGNUM)
7873 (compare (ashiftrt:DI (match_operand:DI 1 "register_operand" "0")
7874 (match_operand:SI 2 "shift_count_or_setmem_operand" "Y"))
7875 (const_int 0)))
7876 (set (match_operand:DI 0 "register_operand" "=d")
7877 (ashiftrt:DI (match_dup 1) (match_dup 2)))]
7878 "!TARGET_ZARCH && s390_match_ccmode(insn, CCSmode)"
7879 "srda\t%0,%Y2"
7880 [(set_attr "op_type" "RS")
7881 (set_attr "atype" "reg")])
7882
7883 (define_insn "*ashrdi3_cconly_31"
7884 [(set (reg CC_REGNUM)
7885 (compare (ashiftrt:DI (match_operand:DI 1 "register_operand" "0")
7886 (match_operand:SI 2 "shift_count_or_setmem_operand" "Y"))
7887 (const_int 0)))
7888 (clobber (match_scratch:DI 0 "=d"))]
7889 "!TARGET_ZARCH && s390_match_ccmode(insn, CCSmode)"
7890 "srda\t%0,%Y2"
7891 [(set_attr "op_type" "RS")
7892 (set_attr "atype" "reg")])
7893
7894 (define_insn "*ashrdi3_31"
7895 [(set (match_operand:DI 0 "register_operand" "=d")
7896 (ashiftrt:DI (match_operand:DI 1 "register_operand" "0")
7897 (match_operand:SI 2 "shift_count_or_setmem_operand" "Y")))
7898 (clobber (reg:CC CC_REGNUM))]
7899 "!TARGET_ZARCH"
7900 "srda\t%0,%Y2"
7901 [(set_attr "op_type" "RS")
7902 (set_attr "atype" "reg")])
7903
7904 ; sra, srag, srak
7905 (define_insn "*ashr<mode>3_cc"
7906 [(set (reg CC_REGNUM)
7907 (compare (ashiftrt:GPR (match_operand:GPR 1 "register_operand" "<d0>,d")
7908 (match_operand:SI 2 "shift_count_or_setmem_operand" "Y,Y"))
7909 (const_int 0)))
7910 (set (match_operand:GPR 0 "register_operand" "=d,d")
7911 (ashiftrt:GPR (match_dup 1) (match_dup 2)))]
7912 "s390_match_ccmode(insn, CCSmode)"
7913 "@
7914 sra<g>\t%0,<1>%Y2
7915 sra<gk>\t%0,%1,%Y2"
7916 [(set_attr "op_type" "RS<E>,RSY")
7917 (set_attr "atype" "reg,reg")
7918 (set_attr "cpu_facility" "*,z196")
7919 (set_attr "z10prop" "z10_super_E1,*")])
7920
7921 ; sra, srag, srak
7922 (define_insn "*ashr<mode>3_cconly"
7923 [(set (reg CC_REGNUM)
7924 (compare (ashiftrt:GPR (match_operand:GPR 1 "register_operand" "<d0>,d")
7925 (match_operand:SI 2 "shift_count_or_setmem_operand" "Y,Y"))
7926 (const_int 0)))
7927 (clobber (match_scratch:GPR 0 "=d,d"))]
7928 "s390_match_ccmode(insn, CCSmode)"
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 ; sra, srag
7938 (define_insn "*ashr<mode>3"
7939 [(set (match_operand:GPR 0 "register_operand" "=d,d")
7940 (ashiftrt:GPR (match_operand:GPR 1 "register_operand" "<d0>,d")
7941 (match_operand:SI 2 "shift_count_or_setmem_operand" "Y,Y")))
7942 (clobber (reg:CC CC_REGNUM))]
7943 ""
7944 "@
7945 sra<g>\t%0,<1>%Y2
7946 sra<gk>\t%0,%1,%Y2"
7947 [(set_attr "op_type" "RS<E>,RSY")
7948 (set_attr "atype" "reg,reg")
7949 (set_attr "cpu_facility" "*,z196")
7950 (set_attr "z10prop" "z10_super_E1,*")])
7951
7952
7953 ; shift pattern with implicit ANDs
7954
7955 (define_insn "*ashrdi3_cc_31_and"
7956 [(set (reg CC_REGNUM)
7957 (compare (ashiftrt:DI (match_operand:DI 1 "register_operand" "0")
7958 (and:SI (match_operand:SI 2 "shift_count_or_setmem_operand" "Y")
7959 (match_operand:SI 3 "const_int_operand" "n")))
7960 (const_int 0)))
7961 (set (match_operand:DI 0 "register_operand" "=d")
7962 (ashiftrt:DI (match_dup 1) (and:SI (match_dup 2) (match_dup 3))))]
7963 "!TARGET_ZARCH && s390_match_ccmode(insn, CCSmode)
7964 && (INTVAL (operands[3]) & 63) == 63"
7965 "srda\t%0,%Y2"
7966 [(set_attr "op_type" "RS")
7967 (set_attr "atype" "reg")])
7968
7969 (define_insn "*ashrdi3_cconly_31_and"
7970 [(set (reg CC_REGNUM)
7971 (compare (ashiftrt:DI (match_operand:DI 1 "register_operand" "0")
7972 (and:SI (match_operand:SI 2 "shift_count_or_setmem_operand" "Y")
7973 (match_operand:SI 3 "const_int_operand" "n")))
7974 (const_int 0)))
7975 (clobber (match_scratch:DI 0 "=d"))]
7976 "!TARGET_ZARCH && s390_match_ccmode(insn, CCSmode)
7977 && (INTVAL (operands[3]) & 63) == 63"
7978 "srda\t%0,%Y2"
7979 [(set_attr "op_type" "RS")
7980 (set_attr "atype" "reg")])
7981
7982 (define_insn "*ashrdi3_31_and"
7983 [(set (match_operand:DI 0 "register_operand" "=d")
7984 (ashiftrt:DI (match_operand:DI 1 "register_operand" "0")
7985 (and:SI (match_operand:SI 2 "shift_count_or_setmem_operand" "Y")
7986 (match_operand:SI 3 "const_int_operand" "n"))))
7987 (clobber (reg:CC CC_REGNUM))]
7988 "!TARGET_ZARCH && (INTVAL (operands[3]) & 63) == 63"
7989 "srda\t%0,%Y2"
7990 [(set_attr "op_type" "RS")
7991 (set_attr "atype" "reg")])
7992
7993 ; sra, srag, srak
7994 (define_insn "*ashr<mode>3_cc_and"
7995 [(set (reg CC_REGNUM)
7996 (compare (ashiftrt:GPR (match_operand:GPR 1 "register_operand" "<d0>,d")
7997 (and:SI (match_operand:SI 2 "shift_count_or_setmem_operand" "Y,Y")
7998 (match_operand:SI 3 "const_int_operand" "n,n")))
7999 (const_int 0)))
8000 (set (match_operand:GPR 0 "register_operand" "=d,d")
8001 (ashiftrt:GPR (match_dup 1) (and:SI (match_dup 2) (match_dup 3))))]
8002 "s390_match_ccmode(insn, CCSmode) && (INTVAL (operands[3]) & 63) == 63"
8003 "@
8004 sra<g>\t%0,<1>%Y2
8005 sra<gk>\t%0,%1,%Y2"
8006 [(set_attr "op_type" "RS<E>,RSY")
8007 (set_attr "atype" "reg,reg")
8008 (set_attr "cpu_facility" "*,z196")
8009 (set_attr "z10prop" "z10_super_E1,*")])
8010
8011 ; sra, srag, srak
8012 (define_insn "*ashr<mode>3_cconly_and"
8013 [(set (reg CC_REGNUM)
8014 (compare (ashiftrt:GPR (match_operand:GPR 1 "register_operand" "<d0>,d")
8015 (and:SI (match_operand:SI 2 "shift_count_or_setmem_operand" "Y,Y")
8016 (match_operand:SI 3 "const_int_operand" "n,n")))
8017 (const_int 0)))
8018 (clobber (match_scratch:GPR 0 "=d,d"))]
8019 "s390_match_ccmode(insn, CCSmode) && (INTVAL (operands[3]) & 63) == 63"
8020 "@
8021 sra<g>\t%0,<1>%Y2
8022 sra<gk>\t%0,%1,%Y2"
8023 [(set_attr "op_type" "RS<E>,RSY")
8024 (set_attr "atype" "reg,reg")
8025 (set_attr "cpu_facility" "*,z196")
8026 (set_attr "z10prop" "z10_super_E1,*")])
8027
8028 ; sra, srag, srak
8029 (define_insn "*ashr<mode>3_and"
8030 [(set (match_operand:GPR 0 "register_operand" "=d,d")
8031 (ashiftrt:GPR (match_operand:GPR 1 "register_operand" "<d0>,d")
8032 (and:SI (match_operand:SI 2 "shift_count_or_setmem_operand" "Y,Y")
8033 (match_operand:SI 3 "const_int_operand" "n,n"))))
8034 (clobber (reg:CC CC_REGNUM))]
8035 "(INTVAL (operands[3]) & 63) == 63"
8036 "@
8037 sra<g>\t%0,<1>%Y2
8038 sra<gk>\t%0,%1,%Y2"
8039 [(set_attr "op_type" "RS<E>,RSY")
8040 (set_attr "atype" "reg,reg")
8041 (set_attr "cpu_facility" "*,z196")
8042 (set_attr "z10prop" "z10_super_E1,*")])
8043
8044
8045 ;;
8046 ;; Branch instruction patterns.
8047 ;;
8048
8049 (define_expand "cbranch<mode>4"
8050 [(set (pc)
8051 (if_then_else (match_operator 0 "comparison_operator"
8052 [(match_operand:GPR 1 "register_operand" "")
8053 (match_operand:GPR 2 "general_operand" "")])
8054 (label_ref (match_operand 3 "" ""))
8055 (pc)))]
8056 ""
8057 "s390_emit_jump (operands[3],
8058 s390_emit_compare (GET_CODE (operands[0]), operands[1], operands[2]));
8059 DONE;")
8060
8061 (define_expand "cbranch<mode>4"
8062 [(set (pc)
8063 (if_then_else (match_operator 0 "comparison_operator"
8064 [(match_operand:FP 1 "register_operand" "")
8065 (match_operand:FP 2 "general_operand" "")])
8066 (label_ref (match_operand 3 "" ""))
8067 (pc)))]
8068 "TARGET_HARD_FLOAT"
8069 "s390_emit_jump (operands[3],
8070 s390_emit_compare (GET_CODE (operands[0]), operands[1], operands[2]));
8071 DONE;")
8072
8073 (define_expand "cbranchcc4"
8074 [(set (pc)
8075 (if_then_else (match_operator 0 "s390_eqne_operator"
8076 [(match_operand 1 "cc_reg_operand" "")
8077 (match_operand 2 "const0_operand" "")])
8078 (label_ref (match_operand 3 "" ""))
8079 (pc)))]
8080 "TARGET_HARD_FLOAT"
8081 "s390_emit_jump (operands[3],
8082 s390_emit_compare (GET_CODE (operands[0]), operands[1], operands[2]));
8083 DONE;")
8084
8085
8086
8087 ;;
8088 ;;- Conditional jump instructions.
8089 ;;
8090
8091 (define_insn "*cjump_64"
8092 [(set (pc)
8093 (if_then_else
8094 (match_operator 1 "s390_comparison" [(reg CC_REGNUM)
8095 (match_operand 2 "const_int_operand" "")])
8096 (label_ref (match_operand 0 "" ""))
8097 (pc)))]
8098 "TARGET_CPU_ZARCH"
8099 {
8100 if (get_attr_length (insn) == 4)
8101 return "j%C1\t%l0";
8102 else
8103 return "jg%C1\t%l0";
8104 }
8105 [(set_attr "op_type" "RI")
8106 (set_attr "type" "branch")
8107 (set (attr "length")
8108 (if_then_else (lt (abs (minus (pc) (match_dup 0))) (const_int 60000))
8109 (const_int 4) (const_int 6)))])
8110
8111 (define_insn "*cjump_31"
8112 [(set (pc)
8113 (if_then_else
8114 (match_operator 1 "s390_comparison" [(reg CC_REGNUM)
8115 (match_operand 2 "const_int_operand" "")])
8116 (label_ref (match_operand 0 "" ""))
8117 (pc)))]
8118 "!TARGET_CPU_ZARCH"
8119 {
8120 gcc_assert (get_attr_length (insn) == 4);
8121 return "j%C1\t%l0";
8122 }
8123 [(set_attr "op_type" "RI")
8124 (set_attr "type" "branch")
8125 (set (attr "length")
8126 (if_then_else (not (match_test "flag_pic"))
8127 (if_then_else (lt (abs (minus (pc) (match_dup 0))) (const_int 60000))
8128 (const_int 4) (const_int 6))
8129 (if_then_else (lt (abs (minus (pc) (match_dup 0))) (const_int 60000))
8130 (const_int 4) (const_int 8))))])
8131
8132 (define_insn "*cjump_long"
8133 [(set (pc)
8134 (if_then_else
8135 (match_operator 1 "s390_comparison" [(reg CC_REGNUM) (const_int 0)])
8136 (match_operand 0 "address_operand" "ZQZR")
8137 (pc)))]
8138 ""
8139 {
8140 if (get_attr_op_type (insn) == OP_TYPE_RR)
8141 return "b%C1r\t%0";
8142 else
8143 return "b%C1\t%a0";
8144 }
8145 [(set (attr "op_type")
8146 (if_then_else (match_operand 0 "register_operand" "")
8147 (const_string "RR") (const_string "RX")))
8148 (set_attr "type" "branch")
8149 (set_attr "atype" "agen")])
8150
8151 ;; A conditional return instruction.
8152 (define_insn "*c<code>"
8153 [(set (pc)
8154 (if_then_else
8155 (match_operator 0 "s390_comparison" [(reg CC_REGNUM) (const_int 0)])
8156 (ANY_RETURN)
8157 (pc)))]
8158 "s390_can_use_<code>_insn ()"
8159 "b%C0r\t%%r14"
8160 [(set_attr "op_type" "RR")
8161 (set_attr "type" "jsr")
8162 (set_attr "atype" "agen")])
8163
8164 ;;
8165 ;;- Negated conditional jump instructions.
8166 ;;
8167
8168 (define_insn "*icjump_64"
8169 [(set (pc)
8170 (if_then_else
8171 (match_operator 1 "s390_comparison" [(reg CC_REGNUM) (const_int 0)])
8172 (pc)
8173 (label_ref (match_operand 0 "" ""))))]
8174 "TARGET_CPU_ZARCH"
8175 {
8176 if (get_attr_length (insn) == 4)
8177 return "j%D1\t%l0";
8178 else
8179 return "jg%D1\t%l0";
8180 }
8181 [(set_attr "op_type" "RI")
8182 (set_attr "type" "branch")
8183 (set (attr "length")
8184 (if_then_else (lt (abs (minus (pc) (match_dup 0))) (const_int 60000))
8185 (const_int 4) (const_int 6)))])
8186
8187 (define_insn "*icjump_31"
8188 [(set (pc)
8189 (if_then_else
8190 (match_operator 1 "s390_comparison" [(reg CC_REGNUM) (const_int 0)])
8191 (pc)
8192 (label_ref (match_operand 0 "" ""))))]
8193 "!TARGET_CPU_ZARCH"
8194 {
8195 gcc_assert (get_attr_length (insn) == 4);
8196 return "j%D1\t%l0";
8197 }
8198 [(set_attr "op_type" "RI")
8199 (set_attr "type" "branch")
8200 (set (attr "length")
8201 (if_then_else (not (match_test "flag_pic"))
8202 (if_then_else (lt (abs (minus (pc) (match_dup 0))) (const_int 60000))
8203 (const_int 4) (const_int 6))
8204 (if_then_else (lt (abs (minus (pc) (match_dup 0))) (const_int 60000))
8205 (const_int 4) (const_int 8))))])
8206
8207 (define_insn "*icjump_long"
8208 [(set (pc)
8209 (if_then_else
8210 (match_operator 1 "s390_comparison" [(reg CC_REGNUM) (const_int 0)])
8211 (pc)
8212 (match_operand 0 "address_operand" "ZQZR")))]
8213 ""
8214 {
8215 if (get_attr_op_type (insn) == OP_TYPE_RR)
8216 return "b%D1r\t%0";
8217 else
8218 return "b%D1\t%a0";
8219 }
8220 [(set (attr "op_type")
8221 (if_then_else (match_operand 0 "register_operand" "")
8222 (const_string "RR") (const_string "RX")))
8223 (set_attr "type" "branch")
8224 (set_attr "atype" "agen")])
8225
8226 ;;
8227 ;;- Trap instructions.
8228 ;;
8229
8230 (define_insn "trap"
8231 [(trap_if (const_int 1) (const_int 0))]
8232 ""
8233 "j\t.+2"
8234 [(set_attr "op_type" "RI")
8235 (set_attr "type" "branch")])
8236
8237 (define_expand "ctrap<mode>4"
8238 [(trap_if (match_operator 0 "comparison_operator"
8239 [(match_operand:GPR 1 "register_operand" "")
8240 (match_operand:GPR 2 "general_operand" "")])
8241 (match_operand 3 "const0_operand" ""))]
8242 ""
8243 {
8244 rtx cond = s390_emit_compare (GET_CODE (operands[0]),
8245 operands[1], operands[2]);
8246 emit_insn (gen_condtrap (cond, XEXP (cond, 0)));
8247 DONE;
8248 })
8249
8250 (define_expand "ctrap<mode>4"
8251 [(trap_if (match_operator 0 "comparison_operator"
8252 [(match_operand:FP 1 "register_operand" "")
8253 (match_operand:FP 2 "general_operand" "")])
8254 (match_operand 3 "const0_operand" ""))]
8255 ""
8256 {
8257 rtx cond = s390_emit_compare (GET_CODE (operands[0]),
8258 operands[1], operands[2]);
8259 emit_insn (gen_condtrap (cond, XEXP (cond, 0)));
8260 DONE;
8261 })
8262
8263 (define_insn "condtrap"
8264 [(trap_if (match_operator 0 "s390_comparison"
8265 [(match_operand 1 "cc_reg_operand" "c")
8266 (const_int 0)])
8267 (const_int 0))]
8268 ""
8269 "j%C0\t.+2";
8270 [(set_attr "op_type" "RI")
8271 (set_attr "type" "branch")])
8272
8273 ; crt, cgrt, cit, cgit
8274 (define_insn "*cmp_and_trap_signed_int<mode>"
8275 [(trap_if (match_operator 0 "s390_signed_integer_comparison"
8276 [(match_operand:GPR 1 "register_operand" "d,d")
8277 (match_operand:GPR 2 "nonmemory_operand" "d,K")])
8278 (const_int 0))]
8279 "TARGET_Z10"
8280 "@
8281 c<g>rt%C0\t%1,%2
8282 c<g>it%C0\t%1,%h2"
8283 [(set_attr "op_type" "RRF,RIE")
8284 (set_attr "type" "branch")
8285 (set_attr "z10prop" "z10_super_c,z10_super")])
8286
8287 ; clrt, clgrt, clfit, clgit, clt, clgt
8288 (define_insn "*cmp_and_trap_unsigned_int<mode>"
8289 [(trap_if (match_operator 0 "s390_unsigned_integer_comparison"
8290 [(match_operand:GPR 1 "register_operand" "d,d, d")
8291 (match_operand:GPR 2 "general_operand" "d,D,RT")])
8292 (const_int 0))]
8293 "TARGET_Z10"
8294 "@
8295 cl<g>rt%C0\t%1,%2
8296 cl<gf>it%C0\t%1,%x2
8297 cl<g>t%C0\t%1,%2"
8298 [(set_attr "op_type" "RRF,RIE,RSY")
8299 (set_attr "type" "branch")
8300 (set_attr "z10prop" "z10_super_c,z10_super,*")
8301 (set_attr "cpu_facility" "z10,z10,zEC12")])
8302
8303 ; lat, lgat
8304 (define_insn "*load_and_trap<mode>"
8305 [(trap_if (eq (match_operand:GPR 0 "memory_operand" "RT")
8306 (const_int 0))
8307 (const_int 0))
8308 (set (match_operand:GPR 1 "register_operand" "=d")
8309 (match_dup 0))]
8310 "TARGET_ZEC12"
8311 "l<g>at\t%1,%0"
8312 [(set_attr "op_type" "RXY")])
8313
8314
8315 ;;
8316 ;;- Loop instructions.
8317 ;;
8318 ;; This is all complicated by the fact that since this is a jump insn
8319 ;; we must handle our own output reloads.
8320
8321 ;; branch on index
8322
8323 ; This splitter will be matched by combine and has to add the 2 moves
8324 ; necessary to load the compare and the increment values into a
8325 ; register pair as needed by brxle.
8326
8327 (define_insn_and_split "*brx_stage1_<GPR:mode>"
8328 [(set (pc)
8329 (if_then_else
8330 (match_operator 6 "s390_brx_operator"
8331 [(plus:GPR (match_operand:GPR 1 "register_operand" "")
8332 (match_operand:GPR 2 "general_operand" ""))
8333 (match_operand:GPR 3 "register_operand" "")])
8334 (label_ref (match_operand 0 "" ""))
8335 (pc)))
8336 (set (match_operand:GPR 4 "nonimmediate_operand" "")
8337 (plus:GPR (match_dup 1) (match_dup 2)))
8338 (clobber (match_scratch:GPR 5 ""))]
8339 "TARGET_CPU_ZARCH"
8340 "#"
8341 "!reload_completed && !reload_in_progress"
8342 [(set (match_dup 7) (match_dup 2)) ; the increment
8343 (set (match_dup 8) (match_dup 3)) ; the comparison value
8344 (parallel [(set (pc)
8345 (if_then_else
8346 (match_op_dup 6
8347 [(plus:GPR (match_dup 1) (match_dup 7))
8348 (match_dup 8)])
8349 (label_ref (match_dup 0))
8350 (pc)))
8351 (set (match_dup 4)
8352 (plus:GPR (match_dup 1) (match_dup 7)))
8353 (clobber (match_dup 5))
8354 (clobber (reg:CC CC_REGNUM))])]
8355 {
8356 rtx dreg = gen_reg_rtx (word_mode == DImode ? TImode : DImode);
8357 operands[7] = gen_lowpart (<GPR:MODE>mode,
8358 gen_highpart (word_mode, dreg));
8359 operands[8] = gen_lowpart (<GPR:MODE>mode,
8360 gen_lowpart (word_mode, dreg));
8361 })
8362
8363 ; brxlg, brxhg
8364
8365 (define_insn_and_split "*brxg_64bit"
8366 [(set (pc)
8367 (if_then_else
8368 (match_operator 5 "s390_brx_operator"
8369 [(plus:DI (match_operand:DI 1 "register_operand" "d,d,d")
8370 (subreg:DI (match_operand:TI 2 "register_operand" "d,d,d") 0))
8371 (subreg:DI (match_dup 2) 8)])
8372 (label_ref (match_operand 0 "" ""))
8373 (pc)))
8374 (set (match_operand:DI 3 "nonimmediate_operand" "=1,?X,?X")
8375 (plus:DI (match_dup 1)
8376 (subreg:DI (match_dup 2) 0)))
8377 (clobber (match_scratch:DI 4 "=X,&1,&?d"))
8378 (clobber (reg:CC CC_REGNUM))]
8379 "TARGET_ZARCH"
8380 {
8381 if (which_alternative != 0)
8382 return "#";
8383 else if (get_attr_length (insn) == 6)
8384 return "brx%E5g\t%1,%2,%l0";
8385 else
8386 return "agr\t%1,%2\;cgr\t%1,%M2\;jg%C5\t%l0";
8387 }
8388 "&& reload_completed
8389 && (!REG_P (operands[3])
8390 || !rtx_equal_p (operands[1], operands[3]))"
8391 [(set (match_dup 4) (match_dup 1))
8392 (parallel [(set (match_dup 4) (plus:DI (match_dup 4) (subreg:DI (match_dup 2) 0)))
8393 (clobber (reg:CC CC_REGNUM))])
8394 (set (reg:CCS CC_REGNUM) (compare:CCS (match_dup 4) (subreg:DI (match_dup 2) 8)))
8395 (set (match_dup 3) (match_dup 4))
8396 (set (pc) (if_then_else (match_op_dup 5 [(reg:CCS CC_REGNUM) (const_int 0)])
8397 (label_ref (match_dup 0))
8398 (pc)))]
8399 ""
8400 [(set_attr "op_type" "RIE")
8401 (set_attr "type" "branch")
8402 (set (attr "length")
8403 (if_then_else (lt (abs (minus (pc) (match_dup 0))) (const_int 60000))
8404 (const_int 6) (const_int 16)))])
8405
8406 ; brxle, brxh
8407
8408 (define_insn_and_split "*brx_64bit"
8409 [(set (pc)
8410 (if_then_else
8411 (match_operator 5 "s390_brx_operator"
8412 [(plus:SI (match_operand:SI 1 "register_operand" "d,d,d")
8413 (subreg:SI (match_operand:TI 2 "register_operand" "d,d,d") 4))
8414 (subreg:SI (match_dup 2) 12)])
8415 (label_ref (match_operand 0 "" ""))
8416 (pc)))
8417 (set (match_operand:SI 3 "nonimmediate_operand" "=1,?X,?X")
8418 (plus:SI (match_dup 1)
8419 (subreg:SI (match_dup 2) 4)))
8420 (clobber (match_scratch:SI 4 "=X,&1,&?d"))
8421 (clobber (reg:CC CC_REGNUM))]
8422 "TARGET_ZARCH"
8423 {
8424 if (which_alternative != 0)
8425 return "#";
8426 else if (get_attr_length (insn) == 6)
8427 return "brx%C5\t%1,%2,%l0";
8428 else
8429 return "ar\t%1,%2\;cr\t%1,%M2\;jg%C5\t%l0";
8430 }
8431 "&& reload_completed
8432 && (!REG_P (operands[3])
8433 || !rtx_equal_p (operands[1], operands[3]))"
8434 [(set (match_dup 4) (match_dup 1))
8435 (parallel [(set (match_dup 4) (plus:SI (match_dup 4) (subreg:SI (match_dup 2) 4)))
8436 (clobber (reg:CC CC_REGNUM))])
8437 (set (reg:CCS CC_REGNUM) (compare:CCS (match_dup 4) (subreg:SI (match_dup 2) 12)))
8438 (set (match_dup 3) (match_dup 4))
8439 (set (pc) (if_then_else (match_op_dup 5 [(reg:CCS CC_REGNUM) (const_int 0)])
8440 (label_ref (match_dup 0))
8441 (pc)))]
8442 ""
8443 [(set_attr "op_type" "RSI")
8444 (set_attr "type" "branch")
8445 (set (attr "length")
8446 (if_then_else (lt (abs (minus (pc) (match_dup 0))) (const_int 60000))
8447 (const_int 6) (const_int 14)))])
8448
8449 ; brxle, brxh
8450
8451 (define_insn_and_split "*brx_31bit"
8452 [(set (pc)
8453 (if_then_else
8454 (match_operator 5 "s390_brx_operator"
8455 [(plus:SI (match_operand:SI 1 "register_operand" "d,d,d")
8456 (subreg:SI (match_operand:DI 2 "register_operand" "d,d,d") 0))
8457 (subreg:SI (match_dup 2) 4)])
8458 (label_ref (match_operand 0 "" ""))
8459 (pc)))
8460 (set (match_operand:SI 3 "nonimmediate_operand" "=1,?X,?X")
8461 (plus:SI (match_dup 1)
8462 (subreg:SI (match_dup 2) 0)))
8463 (clobber (match_scratch:SI 4 "=X,&1,&?d"))
8464 (clobber (reg:CC CC_REGNUM))]
8465 "!TARGET_ZARCH && TARGET_CPU_ZARCH"
8466 {
8467 if (which_alternative != 0)
8468 return "#";
8469 else if (get_attr_length (insn) == 6)
8470 return "brx%C5\t%1,%2,%l0";
8471 else
8472 return "ar\t%1,%2\;cr\t%1,%M2\;jg%C5\t%l0";
8473 }
8474 "&& reload_completed
8475 && (!REG_P (operands[3])
8476 || !rtx_equal_p (operands[1], operands[3]))"
8477 [(set (match_dup 4) (match_dup 1))
8478 (parallel [(set (match_dup 4) (plus:SI (match_dup 4) (subreg:SI (match_dup 2) 0)))
8479 (clobber (reg:CC CC_REGNUM))])
8480 (set (reg:CCS CC_REGNUM) (compare:CCS (match_dup 4) (subreg:SI (match_dup 2) 4)))
8481 (set (match_dup 3) (match_dup 4))
8482 (set (pc) (if_then_else (match_op_dup 5 [(reg:CCS CC_REGNUM) (const_int 0)])
8483 (label_ref (match_dup 0))
8484 (pc)))]
8485 ""
8486 [(set_attr "op_type" "RSI")
8487 (set_attr "type" "branch")
8488 (set (attr "length")
8489 (if_then_else (lt (abs (minus (pc) (match_dup 0))) (const_int 60000))
8490 (const_int 6) (const_int 14)))])
8491
8492
8493 ;; branch on count
8494
8495 (define_expand "doloop_end"
8496 [(use (match_operand 0 "" "")) ; loop pseudo
8497 (use (match_operand 1 "" ""))] ; label
8498 ""
8499 {
8500 if (GET_MODE (operands[0]) == SImode && !TARGET_CPU_ZARCH)
8501 emit_jump_insn (gen_doloop_si31 (operands[1], operands[0], operands[0]));
8502 else if (GET_MODE (operands[0]) == SImode && TARGET_CPU_ZARCH)
8503 emit_jump_insn (gen_doloop_si64 (operands[1], operands[0], operands[0]));
8504 else if (GET_MODE (operands[0]) == DImode && TARGET_ZARCH)
8505 emit_jump_insn (gen_doloop_di (operands[1], operands[0], operands[0]));
8506 else
8507 FAIL;
8508
8509 DONE;
8510 })
8511
8512 (define_insn_and_split "doloop_si64"
8513 [(set (pc)
8514 (if_then_else
8515 (ne (match_operand:SI 1 "register_operand" "d,d,d")
8516 (const_int 1))
8517 (label_ref (match_operand 0 "" ""))
8518 (pc)))
8519 (set (match_operand:SI 2 "nonimmediate_operand" "=1,?X,?X")
8520 (plus:SI (match_dup 1) (const_int -1)))
8521 (clobber (match_scratch:SI 3 "=X,&1,&?d"))
8522 (clobber (reg:CC CC_REGNUM))]
8523 "TARGET_CPU_ZARCH"
8524 {
8525 if (which_alternative != 0)
8526 return "#";
8527 else if (get_attr_length (insn) == 4)
8528 return "brct\t%1,%l0";
8529 else
8530 return "ahi\t%1,-1\;jgne\t%l0";
8531 }
8532 "&& reload_completed
8533 && (! REG_P (operands[2])
8534 || ! rtx_equal_p (operands[1], operands[2]))"
8535 [(set (match_dup 3) (match_dup 1))
8536 (parallel [(set (reg:CCAN CC_REGNUM)
8537 (compare:CCAN (plus:SI (match_dup 3) (const_int -1))
8538 (const_int 0)))
8539 (set (match_dup 3) (plus:SI (match_dup 3) (const_int -1)))])
8540 (set (match_dup 2) (match_dup 3))
8541 (set (pc) (if_then_else (ne (reg:CCAN CC_REGNUM) (const_int 0))
8542 (label_ref (match_dup 0))
8543 (pc)))]
8544 ""
8545 [(set_attr "op_type" "RI")
8546 ; Strictly speaking, the z10 properties are valid for brct only, however, it does not
8547 ; hurt us in the (rare) case of ahi.
8548 (set_attr "z10prop" "z10_super_E1")
8549 (set_attr "type" "branch")
8550 (set (attr "length")
8551 (if_then_else (lt (abs (minus (pc) (match_dup 0))) (const_int 60000))
8552 (const_int 4) (const_int 10)))])
8553
8554 (define_insn_and_split "doloop_si31"
8555 [(set (pc)
8556 (if_then_else
8557 (ne (match_operand:SI 1 "register_operand" "d,d,d")
8558 (const_int 1))
8559 (label_ref (match_operand 0 "" ""))
8560 (pc)))
8561 (set (match_operand:SI 2 "nonimmediate_operand" "=1,?X,?X")
8562 (plus:SI (match_dup 1) (const_int -1)))
8563 (clobber (match_scratch:SI 3 "=X,&1,&?d"))
8564 (clobber (reg:CC CC_REGNUM))]
8565 "!TARGET_CPU_ZARCH"
8566 {
8567 if (which_alternative != 0)
8568 return "#";
8569 else if (get_attr_length (insn) == 4)
8570 return "brct\t%1,%l0";
8571 else
8572 gcc_unreachable ();
8573 }
8574 "&& reload_completed
8575 && (! REG_P (operands[2])
8576 || ! rtx_equal_p (operands[1], operands[2]))"
8577 [(set (match_dup 3) (match_dup 1))
8578 (parallel [(set (reg:CCAN CC_REGNUM)
8579 (compare:CCAN (plus:SI (match_dup 3) (const_int -1))
8580 (const_int 0)))
8581 (set (match_dup 3) (plus:SI (match_dup 3) (const_int -1)))])
8582 (set (match_dup 2) (match_dup 3))
8583 (set (pc) (if_then_else (ne (reg:CCAN CC_REGNUM) (const_int 0))
8584 (label_ref (match_dup 0))
8585 (pc)))]
8586 ""
8587 [(set_attr "op_type" "RI")
8588 ; Strictly speaking, the z10 properties are valid for brct only, however, it does not
8589 ; hurt us in the (rare) case of ahi.
8590 (set_attr "z10prop" "z10_super_E1")
8591 (set_attr "type" "branch")
8592 (set (attr "length")
8593 (if_then_else (not (match_test "flag_pic"))
8594 (if_then_else (lt (abs (minus (pc) (match_dup 0))) (const_int 60000))
8595 (const_int 4) (const_int 6))
8596 (if_then_else (lt (abs (minus (pc) (match_dup 0))) (const_int 60000))
8597 (const_int 4) (const_int 8))))])
8598
8599 (define_insn "*doloop_si_long"
8600 [(set (pc)
8601 (if_then_else
8602 (ne (match_operand:SI 1 "register_operand" "d")
8603 (const_int 1))
8604 (match_operand 0 "address_operand" "ZQZR")
8605 (pc)))
8606 (set (match_operand:SI 2 "register_operand" "=1")
8607 (plus:SI (match_dup 1) (const_int -1)))
8608 (clobber (match_scratch:SI 3 "=X"))
8609 (clobber (reg:CC CC_REGNUM))]
8610 "!TARGET_CPU_ZARCH"
8611 {
8612 if (get_attr_op_type (insn) == OP_TYPE_RR)
8613 return "bctr\t%1,%0";
8614 else
8615 return "bct\t%1,%a0";
8616 }
8617 [(set (attr "op_type")
8618 (if_then_else (match_operand 0 "register_operand" "")
8619 (const_string "RR") (const_string "RX")))
8620 (set_attr "type" "branch")
8621 (set_attr "atype" "agen")
8622 (set_attr "z10prop" "z10_c")
8623 (set_attr "z196prop" "z196_cracked")])
8624
8625 (define_insn_and_split "doloop_di"
8626 [(set (pc)
8627 (if_then_else
8628 (ne (match_operand:DI 1 "register_operand" "d,d,d")
8629 (const_int 1))
8630 (label_ref (match_operand 0 "" ""))
8631 (pc)))
8632 (set (match_operand:DI 2 "nonimmediate_operand" "=1,?X,?X")
8633 (plus:DI (match_dup 1) (const_int -1)))
8634 (clobber (match_scratch:DI 3 "=X,&1,&?d"))
8635 (clobber (reg:CC CC_REGNUM))]
8636 "TARGET_ZARCH"
8637 {
8638 if (which_alternative != 0)
8639 return "#";
8640 else if (get_attr_length (insn) == 4)
8641 return "brctg\t%1,%l0";
8642 else
8643 return "aghi\t%1,-1\;jgne\t%l0";
8644 }
8645 "&& reload_completed
8646 && (! REG_P (operands[2])
8647 || ! rtx_equal_p (operands[1], operands[2]))"
8648 [(set (match_dup 3) (match_dup 1))
8649 (parallel [(set (reg:CCAN CC_REGNUM)
8650 (compare:CCAN (plus:DI (match_dup 3) (const_int -1))
8651 (const_int 0)))
8652 (set (match_dup 3) (plus:DI (match_dup 3) (const_int -1)))])
8653 (set (match_dup 2) (match_dup 3))
8654 (set (pc) (if_then_else (ne (reg:CCAN CC_REGNUM) (const_int 0))
8655 (label_ref (match_dup 0))
8656 (pc)))]
8657 ""
8658 [(set_attr "op_type" "RI")
8659 ; Strictly speaking, the z10 properties are valid for brct only, however, it does not
8660 ; hurt us in the (rare) case of ahi.
8661 (set_attr "z10prop" "z10_super_E1")
8662 (set_attr "type" "branch")
8663 (set (attr "length")
8664 (if_then_else (lt (abs (minus (pc) (match_dup 0))) (const_int 60000))
8665 (const_int 4) (const_int 10)))])
8666
8667 ;;
8668 ;;- Unconditional jump instructions.
8669 ;;
8670
8671 ;
8672 ; jump instruction pattern(s).
8673 ;
8674
8675 (define_expand "jump"
8676 [(match_operand 0 "" "")]
8677 ""
8678 "s390_emit_jump (operands[0], NULL_RTX); DONE;")
8679
8680 (define_insn "*jump64"
8681 [(set (pc) (label_ref (match_operand 0 "" "")))]
8682 "TARGET_CPU_ZARCH"
8683 {
8684 if (get_attr_length (insn) == 4)
8685 return "j\t%l0";
8686 else
8687 return "jg\t%l0";
8688 }
8689 [(set_attr "op_type" "RI")
8690 (set_attr "type" "branch")
8691 (set (attr "length")
8692 (if_then_else (lt (abs (minus (pc) (match_dup 0))) (const_int 60000))
8693 (const_int 4) (const_int 6)))])
8694
8695 (define_insn "*jump31"
8696 [(set (pc) (label_ref (match_operand 0 "" "")))]
8697 "!TARGET_CPU_ZARCH"
8698 {
8699 gcc_assert (get_attr_length (insn) == 4);
8700 return "j\t%l0";
8701 }
8702 [(set_attr "op_type" "RI")
8703 (set_attr "type" "branch")
8704 (set (attr "length")
8705 (if_then_else (not (match_test "flag_pic"))
8706 (if_then_else (lt (abs (minus (pc) (match_dup 0))) (const_int 60000))
8707 (const_int 4) (const_int 6))
8708 (if_then_else (lt (abs (minus (pc) (match_dup 0))) (const_int 60000))
8709 (const_int 4) (const_int 8))))])
8710
8711 ;
8712 ; indirect-jump instruction pattern(s).
8713 ;
8714
8715 (define_insn "indirect_jump"
8716 [(set (pc) (match_operand 0 "address_operand" "ZQZR"))]
8717 ""
8718 {
8719 if (get_attr_op_type (insn) == OP_TYPE_RR)
8720 return "br\t%0";
8721 else
8722 return "b\t%a0";
8723 }
8724 [(set (attr "op_type")
8725 (if_then_else (match_operand 0 "register_operand" "")
8726 (const_string "RR") (const_string "RX")))
8727 (set_attr "type" "branch")
8728 (set_attr "atype" "agen")])
8729
8730 ;
8731 ; casesi instruction pattern(s).
8732 ;
8733
8734 (define_insn "casesi_jump"
8735 [(set (pc) (match_operand 0 "address_operand" "ZQZR"))
8736 (use (label_ref (match_operand 1 "" "")))]
8737 ""
8738 {
8739 if (get_attr_op_type (insn) == OP_TYPE_RR)
8740 return "br\t%0";
8741 else
8742 return "b\t%a0";
8743 }
8744 [(set (attr "op_type")
8745 (if_then_else (match_operand 0 "register_operand" "")
8746 (const_string "RR") (const_string "RX")))
8747 (set_attr "type" "branch")
8748 (set_attr "atype" "agen")])
8749
8750 (define_expand "casesi"
8751 [(match_operand:SI 0 "general_operand" "")
8752 (match_operand:SI 1 "general_operand" "")
8753 (match_operand:SI 2 "general_operand" "")
8754 (label_ref (match_operand 3 "" ""))
8755 (label_ref (match_operand 4 "" ""))]
8756 ""
8757 {
8758 rtx index = gen_reg_rtx (SImode);
8759 rtx base = gen_reg_rtx (Pmode);
8760 rtx target = gen_reg_rtx (Pmode);
8761
8762 emit_move_insn (index, operands[0]);
8763 emit_insn (gen_subsi3 (index, index, operands[1]));
8764 emit_cmp_and_jump_insns (index, operands[2], GTU, NULL_RTX, SImode, 1,
8765 operands[4]);
8766
8767 if (Pmode != SImode)
8768 index = convert_to_mode (Pmode, index, 1);
8769 if (GET_CODE (index) != REG)
8770 index = copy_to_mode_reg (Pmode, index);
8771
8772 if (TARGET_64BIT)
8773 emit_insn (gen_ashldi3 (index, index, GEN_INT (3)));
8774 else
8775 emit_insn (gen_ashlsi3 (index, index, const2_rtx));
8776
8777 emit_move_insn (base, gen_rtx_LABEL_REF (Pmode, operands[3]));
8778
8779 index = gen_const_mem (Pmode, gen_rtx_PLUS (Pmode, base, index));
8780 emit_move_insn (target, index);
8781
8782 if (flag_pic)
8783 target = gen_rtx_PLUS (Pmode, base, target);
8784 emit_jump_insn (gen_casesi_jump (target, operands[3]));
8785
8786 DONE;
8787 })
8788
8789
8790 ;;
8791 ;;- Jump to subroutine.
8792 ;;
8793 ;;
8794
8795 ;
8796 ; untyped call instruction pattern(s).
8797 ;
8798
8799 ;; Call subroutine returning any type.
8800 (define_expand "untyped_call"
8801 [(parallel [(call (match_operand 0 "" "")
8802 (const_int 0))
8803 (match_operand 1 "" "")
8804 (match_operand 2 "" "")])]
8805 ""
8806 {
8807 int i;
8808
8809 emit_call_insn (gen_call (operands[0], const0_rtx, const0_rtx));
8810
8811 for (i = 0; i < XVECLEN (operands[2], 0); i++)
8812 {
8813 rtx set = XVECEXP (operands[2], 0, i);
8814 emit_move_insn (SET_DEST (set), SET_SRC (set));
8815 }
8816
8817 /* The optimizer does not know that the call sets the function value
8818 registers we stored in the result block. We avoid problems by
8819 claiming that all hard registers are used and clobbered at this
8820 point. */
8821 emit_insn (gen_blockage ());
8822
8823 DONE;
8824 })
8825
8826 ;; UNSPEC_VOLATILE is considered to use and clobber all hard registers and
8827 ;; all of memory. This blocks insns from being moved across this point.
8828
8829 (define_insn "blockage"
8830 [(unspec_volatile [(const_int 0)] UNSPECV_BLOCKAGE)]
8831 ""
8832 ""
8833 [(set_attr "type" "none")
8834 (set_attr "length" "0")])
8835
8836 ;
8837 ; sibcall patterns
8838 ;
8839
8840 (define_expand "sibcall"
8841 [(call (match_operand 0 "" "")
8842 (match_operand 1 "" ""))]
8843 ""
8844 {
8845 s390_emit_call (XEXP (operands[0], 0), NULL_RTX, NULL_RTX, NULL_RTX);
8846 DONE;
8847 })
8848
8849 (define_insn "*sibcall_br"
8850 [(call (mem:QI (reg SIBCALL_REGNUM))
8851 (match_operand 0 "const_int_operand" "n"))]
8852 "SIBLING_CALL_P (insn)
8853 && GET_MODE (XEXP (XEXP (PATTERN (insn), 0), 0)) == Pmode"
8854 "br\t%%r1"
8855 [(set_attr "op_type" "RR")
8856 (set_attr "type" "branch")
8857 (set_attr "atype" "agen")])
8858
8859 (define_insn "*sibcall_brc"
8860 [(call (mem:QI (match_operand 0 "bras_sym_operand" "X"))
8861 (match_operand 1 "const_int_operand" "n"))]
8862 "SIBLING_CALL_P (insn) && TARGET_SMALL_EXEC"
8863 "j\t%0"
8864 [(set_attr "op_type" "RI")
8865 (set_attr "type" "branch")])
8866
8867 (define_insn "*sibcall_brcl"
8868 [(call (mem:QI (match_operand 0 "bras_sym_operand" "X"))
8869 (match_operand 1 "const_int_operand" "n"))]
8870 "SIBLING_CALL_P (insn) && TARGET_CPU_ZARCH"
8871 "jg\t%0"
8872 [(set_attr "op_type" "RIL")
8873 (set_attr "type" "branch")])
8874
8875 ;
8876 ; sibcall_value patterns
8877 ;
8878
8879 (define_expand "sibcall_value"
8880 [(set (match_operand 0 "" "")
8881 (call (match_operand 1 "" "")
8882 (match_operand 2 "" "")))]
8883 ""
8884 {
8885 s390_emit_call (XEXP (operands[1], 0), NULL_RTX, operands[0], NULL_RTX);
8886 DONE;
8887 })
8888
8889 (define_insn "*sibcall_value_br"
8890 [(set (match_operand 0 "" "")
8891 (call (mem:QI (reg SIBCALL_REGNUM))
8892 (match_operand 1 "const_int_operand" "n")))]
8893 "SIBLING_CALL_P (insn)
8894 && GET_MODE (XEXP (XEXP (XEXP (PATTERN (insn), 1), 0), 0)) == Pmode"
8895 "br\t%%r1"
8896 [(set_attr "op_type" "RR")
8897 (set_attr "type" "branch")
8898 (set_attr "atype" "agen")])
8899
8900 (define_insn "*sibcall_value_brc"
8901 [(set (match_operand 0 "" "")
8902 (call (mem:QI (match_operand 1 "bras_sym_operand" "X"))
8903 (match_operand 2 "const_int_operand" "n")))]
8904 "SIBLING_CALL_P (insn) && TARGET_SMALL_EXEC"
8905 "j\t%1"
8906 [(set_attr "op_type" "RI")
8907 (set_attr "type" "branch")])
8908
8909 (define_insn "*sibcall_value_brcl"
8910 [(set (match_operand 0 "" "")
8911 (call (mem:QI (match_operand 1 "bras_sym_operand" "X"))
8912 (match_operand 2 "const_int_operand" "n")))]
8913 "SIBLING_CALL_P (insn) && TARGET_CPU_ZARCH"
8914 "jg\t%1"
8915 [(set_attr "op_type" "RIL")
8916 (set_attr "type" "branch")])
8917
8918
8919 ;
8920 ; call instruction pattern(s).
8921 ;
8922
8923 (define_expand "call"
8924 [(call (match_operand 0 "" "")
8925 (match_operand 1 "" ""))
8926 (use (match_operand 2 "" ""))]
8927 ""
8928 {
8929 s390_emit_call (XEXP (operands[0], 0), NULL_RTX, NULL_RTX,
8930 gen_rtx_REG (Pmode, RETURN_REGNUM));
8931 DONE;
8932 })
8933
8934 (define_insn "*bras"
8935 [(call (mem:QI (match_operand 0 "bras_sym_operand" "X"))
8936 (match_operand 1 "const_int_operand" "n"))
8937 (clobber (match_operand 2 "register_operand" "=r"))]
8938 "!SIBLING_CALL_P (insn)
8939 && TARGET_SMALL_EXEC
8940 && GET_MODE (operands[2]) == Pmode"
8941 "bras\t%2,%0"
8942 [(set_attr "op_type" "RI")
8943 (set_attr "type" "jsr")
8944 (set_attr "z196prop" "z196_cracked")])
8945
8946 (define_insn "*brasl"
8947 [(call (mem:QI (match_operand 0 "bras_sym_operand" "X"))
8948 (match_operand 1 "const_int_operand" "n"))
8949 (clobber (match_operand 2 "register_operand" "=r"))]
8950 "!SIBLING_CALL_P (insn)
8951 && TARGET_CPU_ZARCH
8952 && GET_MODE (operands[2]) == Pmode"
8953 "brasl\t%2,%0"
8954 [(set_attr "op_type" "RIL")
8955 (set_attr "type" "jsr")
8956 (set_attr "z196prop" "z196_cracked")])
8957
8958 (define_insn "*basr"
8959 [(call (mem:QI (match_operand 0 "address_operand" "ZQZR"))
8960 (match_operand 1 "const_int_operand" "n"))
8961 (clobber (match_operand 2 "register_operand" "=r"))]
8962 "!SIBLING_CALL_P (insn) && GET_MODE (operands[2]) == Pmode"
8963 {
8964 if (get_attr_op_type (insn) == OP_TYPE_RR)
8965 return "basr\t%2,%0";
8966 else
8967 return "bas\t%2,%a0";
8968 }
8969 [(set (attr "op_type")
8970 (if_then_else (match_operand 0 "register_operand" "")
8971 (const_string "RR") (const_string "RX")))
8972 (set_attr "type" "jsr")
8973 (set_attr "atype" "agen")
8974 (set_attr "z196prop" "z196_cracked")])
8975
8976 ;
8977 ; call_value instruction pattern(s).
8978 ;
8979
8980 (define_expand "call_value"
8981 [(set (match_operand 0 "" "")
8982 (call (match_operand 1 "" "")
8983 (match_operand 2 "" "")))
8984 (use (match_operand 3 "" ""))]
8985 ""
8986 {
8987 s390_emit_call (XEXP (operands[1], 0), NULL_RTX, operands[0],
8988 gen_rtx_REG (Pmode, RETURN_REGNUM));
8989 DONE;
8990 })
8991
8992 (define_insn "*bras_r"
8993 [(set (match_operand 0 "" "")
8994 (call (mem:QI (match_operand 1 "bras_sym_operand" "X"))
8995 (match_operand:SI 2 "const_int_operand" "n")))
8996 (clobber (match_operand 3 "register_operand" "=r"))]
8997 "!SIBLING_CALL_P (insn)
8998 && TARGET_SMALL_EXEC
8999 && GET_MODE (operands[3]) == Pmode"
9000 "bras\t%3,%1"
9001 [(set_attr "op_type" "RI")
9002 (set_attr "type" "jsr")
9003 (set_attr "z196prop" "z196_cracked")])
9004
9005 (define_insn "*brasl_r"
9006 [(set (match_operand 0 "" "")
9007 (call (mem:QI (match_operand 1 "bras_sym_operand" "X"))
9008 (match_operand 2 "const_int_operand" "n")))
9009 (clobber (match_operand 3 "register_operand" "=r"))]
9010 "!SIBLING_CALL_P (insn)
9011 && TARGET_CPU_ZARCH
9012 && GET_MODE (operands[3]) == Pmode"
9013 "brasl\t%3,%1"
9014 [(set_attr "op_type" "RIL")
9015 (set_attr "type" "jsr")
9016 (set_attr "z196prop" "z196_cracked")])
9017
9018 (define_insn "*basr_r"
9019 [(set (match_operand 0 "" "")
9020 (call (mem:QI (match_operand 1 "address_operand" "ZQZR"))
9021 (match_operand 2 "const_int_operand" "n")))
9022 (clobber (match_operand 3 "register_operand" "=r"))]
9023 "!SIBLING_CALL_P (insn) && GET_MODE (operands[3]) == Pmode"
9024 {
9025 if (get_attr_op_type (insn) == OP_TYPE_RR)
9026 return "basr\t%3,%1";
9027 else
9028 return "bas\t%3,%a1";
9029 }
9030 [(set (attr "op_type")
9031 (if_then_else (match_operand 1 "register_operand" "")
9032 (const_string "RR") (const_string "RX")))
9033 (set_attr "type" "jsr")
9034 (set_attr "atype" "agen")
9035 (set_attr "z196prop" "z196_cracked")])
9036
9037 ;;
9038 ;;- Thread-local storage support.
9039 ;;
9040
9041 (define_expand "get_thread_pointer<mode>"
9042 [(set (match_operand:P 0 "nonimmediate_operand" "") (reg:P TP_REGNUM))]
9043 ""
9044 "")
9045
9046 (define_expand "set_thread_pointer<mode>"
9047 [(set (reg:P TP_REGNUM) (match_operand:P 0 "nonimmediate_operand" ""))
9048 (set (reg:P TP_REGNUM) (unspec_volatile:P [(reg:P TP_REGNUM)] UNSPECV_SET_TP))]
9049 ""
9050 "")
9051
9052 (define_insn "*set_tp"
9053 [(set (reg TP_REGNUM) (unspec_volatile [(reg TP_REGNUM)] UNSPECV_SET_TP))]
9054 ""
9055 ""
9056 [(set_attr "type" "none")
9057 (set_attr "length" "0")])
9058
9059 (define_insn "*tls_load_64"
9060 [(set (match_operand:DI 0 "register_operand" "=d")
9061 (unspec:DI [(match_operand:DI 1 "memory_operand" "RT")
9062 (match_operand:DI 2 "" "")]
9063 UNSPEC_TLS_LOAD))]
9064 "TARGET_64BIT"
9065 "lg\t%0,%1%J2"
9066 [(set_attr "op_type" "RXE")
9067 (set_attr "z10prop" "z10_fwd_A3")])
9068
9069 (define_insn "*tls_load_31"
9070 [(set (match_operand:SI 0 "register_operand" "=d,d")
9071 (unspec:SI [(match_operand:SI 1 "memory_operand" "R,T")
9072 (match_operand:SI 2 "" "")]
9073 UNSPEC_TLS_LOAD))]
9074 "!TARGET_64BIT"
9075 "@
9076 l\t%0,%1%J2
9077 ly\t%0,%1%J2"
9078 [(set_attr "op_type" "RX,RXY")
9079 (set_attr "type" "load")
9080 (set_attr "z10prop" "z10_fwd_A3,z10_fwd_A3")])
9081
9082 (define_insn "*bras_tls"
9083 [(set (match_operand 0 "" "")
9084 (call (mem:QI (match_operand 1 "bras_sym_operand" "X"))
9085 (match_operand 2 "const_int_operand" "n")))
9086 (clobber (match_operand 3 "register_operand" "=r"))
9087 (use (match_operand 4 "" ""))]
9088 "!SIBLING_CALL_P (insn)
9089 && TARGET_SMALL_EXEC
9090 && GET_MODE (operands[3]) == Pmode"
9091 "bras\t%3,%1%J4"
9092 [(set_attr "op_type" "RI")
9093 (set_attr "type" "jsr")
9094 (set_attr "z196prop" "z196_cracked")])
9095
9096 (define_insn "*brasl_tls"
9097 [(set (match_operand 0 "" "")
9098 (call (mem:QI (match_operand 1 "bras_sym_operand" "X"))
9099 (match_operand 2 "const_int_operand" "n")))
9100 (clobber (match_operand 3 "register_operand" "=r"))
9101 (use (match_operand 4 "" ""))]
9102 "!SIBLING_CALL_P (insn)
9103 && TARGET_CPU_ZARCH
9104 && GET_MODE (operands[3]) == Pmode"
9105 "brasl\t%3,%1%J4"
9106 [(set_attr "op_type" "RIL")
9107 (set_attr "type" "jsr")
9108 (set_attr "z196prop" "z196_cracked")])
9109
9110 (define_insn "*basr_tls"
9111 [(set (match_operand 0 "" "")
9112 (call (mem:QI (match_operand 1 "address_operand" "ZQZR"))
9113 (match_operand 2 "const_int_operand" "n")))
9114 (clobber (match_operand 3 "register_operand" "=r"))
9115 (use (match_operand 4 "" ""))]
9116 "!SIBLING_CALL_P (insn) && GET_MODE (operands[3]) == Pmode"
9117 {
9118 if (get_attr_op_type (insn) == OP_TYPE_RR)
9119 return "basr\t%3,%1%J4";
9120 else
9121 return "bas\t%3,%a1%J4";
9122 }
9123 [(set (attr "op_type")
9124 (if_then_else (match_operand 1 "register_operand" "")
9125 (const_string "RR") (const_string "RX")))
9126 (set_attr "type" "jsr")
9127 (set_attr "atype" "agen")
9128 (set_attr "z196prop" "z196_cracked")])
9129
9130 ;;
9131 ;;- Atomic operations
9132 ;;
9133
9134 ;
9135 ; memory barrier patterns.
9136 ;
9137
9138 (define_expand "mem_signal_fence"
9139 [(match_operand:SI 0 "const_int_operand")] ;; model
9140 ""
9141 {
9142 /* The s390 memory model is strong enough not to require any
9143 barrier in order to synchronize a thread with itself. */
9144 DONE;
9145 })
9146
9147 (define_expand "mem_thread_fence"
9148 [(match_operand:SI 0 "const_int_operand")] ;; model
9149 ""
9150 {
9151 /* Unless this is a SEQ_CST fence, the s390 memory model is strong
9152 enough not to require barriers of any kind. */
9153 if (INTVAL (operands[0]) == MEMMODEL_SEQ_CST)
9154 {
9155 rtx mem = gen_rtx_MEM (BLKmode, gen_rtx_SCRATCH (Pmode));
9156 MEM_VOLATILE_P (mem) = 1;
9157 emit_insn (gen_mem_thread_fence_1 (mem));
9158 }
9159 DONE;
9160 })
9161
9162 ; Although bcr is superscalar on Z10, this variant will never
9163 ; become part of an execution group.
9164 ; With z196 we can make use of the fast-BCR-serialization facility.
9165 ; This allows for a slightly faster sync which is sufficient for our
9166 ; purposes.
9167 (define_insn "mem_thread_fence_1"
9168 [(set (match_operand:BLK 0 "" "")
9169 (unspec:BLK [(match_dup 0)] UNSPEC_MB))]
9170 ""
9171 {
9172 if (TARGET_Z196)
9173 return "bcr\t14,0";
9174 else
9175 return "bcr\t15,0";
9176 }
9177 [(set_attr "op_type" "RR")
9178 (set_attr "mnemonic" "bcr_flush")
9179 (set_attr "z196prop" "z196_alone")])
9180
9181 ;
9182 ; atomic load/store operations
9183 ;
9184
9185 ; Atomic loads need not examine the memory model at all.
9186 (define_expand "atomic_load<mode>"
9187 [(match_operand:DINT 0 "register_operand") ;; output
9188 (match_operand:DINT 1 "memory_operand") ;; memory
9189 (match_operand:SI 2 "const_int_operand")] ;; model
9190 ""
9191 {
9192 if (MEM_ALIGN (operands[1]) < GET_MODE_BITSIZE (GET_MODE (operands[1])))
9193 FAIL;
9194
9195 if (<MODE>mode == TImode)
9196 emit_insn (gen_atomic_loadti_1 (operands[0], operands[1]));
9197 else if (<MODE>mode == DImode && !TARGET_ZARCH)
9198 emit_insn (gen_atomic_loaddi_1 (operands[0], operands[1]));
9199 else
9200 emit_move_insn (operands[0], operands[1]);
9201 DONE;
9202 })
9203
9204 ; Different from movdi_31 in that we want no splitters.
9205 (define_insn "atomic_loaddi_1"
9206 [(set (match_operand:DI 0 "register_operand" "=d,d,!*f,!*f")
9207 (unspec:DI [(match_operand:DI 1 "memory_operand" "Q,S,R,T")]
9208 UNSPEC_MOVA))]
9209 "!TARGET_ZARCH"
9210 "@
9211 lm\t%0,%M0,%S1
9212 lmy\t%0,%M0,%S1
9213 ld\t%0,%1
9214 ldy\t%0,%1"
9215 [(set_attr "op_type" "RS,RSY,RS,RSY")
9216 (set_attr "type" "lm,lm,floaddf,floaddf")])
9217
9218 (define_insn "atomic_loadti_1"
9219 [(set (match_operand:TI 0 "register_operand" "=r")
9220 (unspec:TI [(match_operand:TI 1 "memory_operand" "RT")]
9221 UNSPEC_MOVA))]
9222 "TARGET_ZARCH"
9223 "lpq\t%0,%1"
9224 [(set_attr "op_type" "RXY")
9225 (set_attr "type" "other")])
9226
9227 ; Atomic stores must(?) enforce sequential consistency.
9228 (define_expand "atomic_store<mode>"
9229 [(match_operand:DINT 0 "memory_operand") ;; memory
9230 (match_operand:DINT 1 "register_operand") ;; input
9231 (match_operand:SI 2 "const_int_operand")] ;; model
9232 ""
9233 {
9234 enum memmodel model = (enum memmodel) INTVAL (operands[2]);
9235
9236 if (MEM_ALIGN (operands[0]) < GET_MODE_BITSIZE (GET_MODE (operands[0])))
9237 FAIL;
9238
9239 if (<MODE>mode == TImode)
9240 emit_insn (gen_atomic_storeti_1 (operands[0], operands[1]));
9241 else if (<MODE>mode == DImode && !TARGET_ZARCH)
9242 emit_insn (gen_atomic_storedi_1 (operands[0], operands[1]));
9243 else
9244 emit_move_insn (operands[0], operands[1]);
9245 if (model == MEMMODEL_SEQ_CST)
9246 emit_insn (gen_mem_thread_fence (operands[2]));
9247 DONE;
9248 })
9249
9250 ; Different from movdi_31 in that we want no splitters.
9251 (define_insn "atomic_storedi_1"
9252 [(set (match_operand:DI 0 "memory_operand" "=Q,S,R,T")
9253 (unspec:DI [(match_operand:DI 1 "register_operand" "d,d,!*f,!*f")]
9254 UNSPEC_MOVA))]
9255 "!TARGET_ZARCH"
9256 "@
9257 stm\t%1,%N1,%S0
9258 stmy\t%1,%N1,%S0
9259 std %1,%0
9260 stdy %1,%0"
9261 [(set_attr "op_type" "RS,RSY,RS,RSY")
9262 (set_attr "type" "stm,stm,fstoredf,fstoredf")])
9263
9264 (define_insn "atomic_storeti_1"
9265 [(set (match_operand:TI 0 "memory_operand" "=RT")
9266 (unspec:TI [(match_operand:TI 1 "register_operand" "r")]
9267 UNSPEC_MOVA))]
9268 "TARGET_ZARCH"
9269 "stpq\t%1,%0"
9270 [(set_attr "op_type" "RXY")
9271 (set_attr "type" "other")])
9272
9273 ;
9274 ; compare and swap patterns.
9275 ;
9276
9277 (define_expand "atomic_compare_and_swap<mode>"
9278 [(match_operand:SI 0 "register_operand") ;; bool success output
9279 (match_operand:DGPR 1 "nonimmediate_operand");; oldval output
9280 (match_operand:DGPR 2 "memory_operand") ;; memory
9281 (match_operand:DGPR 3 "register_operand") ;; expected intput
9282 (match_operand:DGPR 4 "register_operand") ;; newval intput
9283 (match_operand:SI 5 "const_int_operand") ;; is_weak
9284 (match_operand:SI 6 "const_int_operand") ;; success model
9285 (match_operand:SI 7 "const_int_operand")] ;; failure model
9286 ""
9287 {
9288 rtx cc, cmp, output = operands[1];
9289
9290 if (!register_operand (output, <MODE>mode))
9291 output = gen_reg_rtx (<MODE>mode);
9292
9293 if (MEM_ALIGN (operands[2]) < GET_MODE_BITSIZE (GET_MODE (operands[2])))
9294 FAIL;
9295
9296 emit_insn (gen_atomic_compare_and_swap<mode>_internal
9297 (output, operands[2], operands[3], operands[4]));
9298
9299 /* We deliberately accept non-register operands in the predicate
9300 to ensure the write back to the output operand happens *before*
9301 the store-flags code below. This makes it easier for combine
9302 to merge the store-flags code with a potential test-and-branch
9303 pattern following (immediately!) afterwards. */
9304 if (output != operands[1])
9305 emit_move_insn (operands[1], output);
9306
9307 cc = gen_rtx_REG (CCZ1mode, CC_REGNUM);
9308 cmp = gen_rtx_EQ (SImode, cc, const0_rtx);
9309 emit_insn (gen_cstorecc4 (operands[0], cmp, cc, const0_rtx));
9310 DONE;
9311 })
9312
9313 (define_expand "atomic_compare_and_swap<mode>"
9314 [(match_operand:SI 0 "register_operand") ;; bool success output
9315 (match_operand:HQI 1 "nonimmediate_operand") ;; oldval output
9316 (match_operand:HQI 2 "memory_operand") ;; memory
9317 (match_operand:HQI 3 "general_operand") ;; expected intput
9318 (match_operand:HQI 4 "general_operand") ;; newval intput
9319 (match_operand:SI 5 "const_int_operand") ;; is_weak
9320 (match_operand:SI 6 "const_int_operand") ;; success model
9321 (match_operand:SI 7 "const_int_operand")] ;; failure model
9322 ""
9323 {
9324 s390_expand_cs_hqi (<MODE>mode, operands[0], operands[1], operands[2],
9325 operands[3], operands[4], INTVAL (operands[5]));
9326 DONE;
9327 })
9328
9329 (define_expand "atomic_compare_and_swap<mode>_internal"
9330 [(parallel
9331 [(set (match_operand:DGPR 0 "register_operand")
9332 (match_operand:DGPR 1 "memory_operand"))
9333 (set (match_dup 1)
9334 (unspec_volatile:DGPR
9335 [(match_dup 1)
9336 (match_operand:DGPR 2 "register_operand")
9337 (match_operand:DGPR 3 "register_operand")]
9338 UNSPECV_CAS))
9339 (set (reg:CCZ1 CC_REGNUM)
9340 (compare:CCZ1 (match_dup 1) (match_dup 2)))])]
9341 "")
9342
9343 ; cdsg, csg
9344 (define_insn "*atomic_compare_and_swap<mode>_1"
9345 [(set (match_operand:TDI 0 "register_operand" "=r")
9346 (match_operand:TDI 1 "memory_operand" "+QS"))
9347 (set (match_dup 1)
9348 (unspec_volatile:TDI
9349 [(match_dup 1)
9350 (match_operand:TDI 2 "register_operand" "0")
9351 (match_operand:TDI 3 "register_operand" "r")]
9352 UNSPECV_CAS))
9353 (set (reg:CCZ1 CC_REGNUM)
9354 (compare:CCZ1 (match_dup 1) (match_dup 2)))]
9355 "TARGET_ZARCH"
9356 "c<td>sg\t%0,%3,%S1"
9357 [(set_attr "op_type" "RSY")
9358 (set_attr "type" "sem")])
9359
9360 ; cds, cdsy
9361 (define_insn "*atomic_compare_and_swapdi_2"
9362 [(set (match_operand:DI 0 "register_operand" "=r,r")
9363 (match_operand:DI 1 "memory_operand" "+Q,S"))
9364 (set (match_dup 1)
9365 (unspec_volatile:DI
9366 [(match_dup 1)
9367 (match_operand:DI 2 "register_operand" "0,0")
9368 (match_operand:DI 3 "register_operand" "r,r")]
9369 UNSPECV_CAS))
9370 (set (reg:CCZ1 CC_REGNUM)
9371 (compare:CCZ1 (match_dup 1) (match_dup 2)))]
9372 "!TARGET_ZARCH"
9373 "@
9374 cds\t%0,%3,%S1
9375 cdsy\t%0,%3,%S1"
9376 [(set_attr "op_type" "RS,RSY")
9377 (set_attr "type" "sem")])
9378
9379 ; cs, csy
9380 (define_insn "*atomic_compare_and_swapsi_3"
9381 [(set (match_operand:SI 0 "register_operand" "=r,r")
9382 (match_operand:SI 1 "memory_operand" "+Q,S"))
9383 (set (match_dup 1)
9384 (unspec_volatile:SI
9385 [(match_dup 1)
9386 (match_operand:SI 2 "register_operand" "0,0")
9387 (match_operand:SI 3 "register_operand" "r,r")]
9388 UNSPECV_CAS))
9389 (set (reg:CCZ1 CC_REGNUM)
9390 (compare:CCZ1 (match_dup 1) (match_dup 2)))]
9391 ""
9392 "@
9393 cs\t%0,%3,%S1
9394 csy\t%0,%3,%S1"
9395 [(set_attr "op_type" "RS,RSY")
9396 (set_attr "type" "sem")])
9397
9398 ;
9399 ; Other atomic instruction patterns.
9400 ;
9401
9402 ; z196 load and add, xor, or and and instructions
9403
9404 (define_expand "atomic_fetch_<atomic><mode>"
9405 [(match_operand:GPR 0 "register_operand") ;; val out
9406 (ATOMIC_Z196:GPR
9407 (match_operand:GPR 1 "memory_operand") ;; memory
9408 (match_operand:GPR 2 "register_operand")) ;; val in
9409 (match_operand:SI 3 "const_int_operand")] ;; model
9410 "TARGET_Z196"
9411 {
9412 if (MEM_ALIGN (operands[1]) < GET_MODE_BITSIZE (GET_MODE (operands[1])))
9413 FAIL;
9414
9415 emit_insn (gen_atomic_fetch_<atomic><mode>_iaf
9416 (operands[0], operands[1], operands[2]));
9417 DONE;
9418 })
9419
9420 ; lan, lang, lao, laog, lax, laxg, laa, laag
9421 (define_insn "atomic_fetch_<atomic><mode>_iaf"
9422 [(set (match_operand:GPR 0 "register_operand" "=d")
9423 (match_operand:GPR 1 "memory_operand" "+QS"))
9424 (set (match_dup 1)
9425 (unspec_volatile:GPR
9426 [(ATOMIC_Z196:GPR (match_dup 1)
9427 (match_operand:GPR 2 "general_operand" "d"))]
9428 UNSPECV_ATOMIC_OP))
9429 (clobber (reg:CC CC_REGNUM))]
9430 "TARGET_Z196"
9431 "la<noxa><g>\t%0,%2,%1"
9432 [(set_attr "op_type" "RSY")
9433 (set_attr "type" "sem")])
9434
9435 ;; For SImode and larger, the optabs.c code will do just fine in
9436 ;; expanding a compare-and-swap loop. For QI/HImode, we can do
9437 ;; better by expanding our own loop.
9438
9439 (define_expand "atomic_<atomic><mode>"
9440 [(ATOMIC:HQI
9441 (match_operand:HQI 0 "memory_operand") ;; memory
9442 (match_operand:HQI 1 "general_operand")) ;; val in
9443 (match_operand:SI 2 "const_int_operand")] ;; model
9444 ""
9445 {
9446 s390_expand_atomic (<MODE>mode, <CODE>, NULL_RTX, operands[0],
9447 operands[1], false);
9448 DONE;
9449 })
9450
9451 (define_expand "atomic_fetch_<atomic><mode>"
9452 [(match_operand:HQI 0 "register_operand") ;; val out
9453 (ATOMIC:HQI
9454 (match_operand:HQI 1 "memory_operand") ;; memory
9455 (match_operand:HQI 2 "general_operand")) ;; val in
9456 (match_operand:SI 3 "const_int_operand")] ;; model
9457 ""
9458 {
9459 s390_expand_atomic (<MODE>mode, <CODE>, operands[0], operands[1],
9460 operands[2], false);
9461 DONE;
9462 })
9463
9464 (define_expand "atomic_<atomic>_fetch<mode>"
9465 [(match_operand:HQI 0 "register_operand") ;; val out
9466 (ATOMIC:HQI
9467 (match_operand:HQI 1 "memory_operand") ;; memory
9468 (match_operand:HQI 2 "general_operand")) ;; val in
9469 (match_operand:SI 3 "const_int_operand")] ;; model
9470 ""
9471 {
9472 s390_expand_atomic (<MODE>mode, <CODE>, operands[0], operands[1],
9473 operands[2], true);
9474 DONE;
9475 })
9476
9477 (define_expand "atomic_exchange<mode>"
9478 [(match_operand:HQI 0 "register_operand") ;; val out
9479 (match_operand:HQI 1 "memory_operand") ;; memory
9480 (match_operand:HQI 2 "general_operand") ;; val in
9481 (match_operand:SI 3 "const_int_operand")] ;; model
9482 ""
9483 {
9484 s390_expand_atomic (<MODE>mode, SET, operands[0], operands[1],
9485 operands[2], false);
9486 DONE;
9487 })
9488
9489 ;;
9490 ;;- Miscellaneous instructions.
9491 ;;
9492
9493 ;
9494 ; allocate stack instruction pattern(s).
9495 ;
9496
9497 (define_expand "allocate_stack"
9498 [(match_operand 0 "general_operand" "")
9499 (match_operand 1 "general_operand" "")]
9500 "TARGET_BACKCHAIN"
9501 {
9502 rtx temp = gen_reg_rtx (Pmode);
9503
9504 emit_move_insn (temp, s390_back_chain_rtx ());
9505 anti_adjust_stack (operands[1]);
9506 emit_move_insn (s390_back_chain_rtx (), temp);
9507
9508 emit_move_insn (operands[0], virtual_stack_dynamic_rtx);
9509 DONE;
9510 })
9511
9512
9513 ;
9514 ; setjmp instruction pattern.
9515 ;
9516
9517 (define_expand "builtin_setjmp_receiver"
9518 [(match_operand 0 "" "")]
9519 "flag_pic"
9520 {
9521 emit_insn (s390_load_got ());
9522 emit_use (pic_offset_table_rtx);
9523 DONE;
9524 })
9525
9526 ;; These patterns say how to save and restore the stack pointer. We need not
9527 ;; save the stack pointer at function level since we are careful to
9528 ;; preserve the backchain. At block level, we have to restore the backchain
9529 ;; when we restore the stack pointer.
9530 ;;
9531 ;; For nonlocal gotos, we must save both the stack pointer and its
9532 ;; backchain and restore both. Note that in the nonlocal case, the
9533 ;; save area is a memory location.
9534
9535 (define_expand "save_stack_function"
9536 [(match_operand 0 "general_operand" "")
9537 (match_operand 1 "general_operand" "")]
9538 ""
9539 "DONE;")
9540
9541 (define_expand "restore_stack_function"
9542 [(match_operand 0 "general_operand" "")
9543 (match_operand 1 "general_operand" "")]
9544 ""
9545 "DONE;")
9546
9547 (define_expand "restore_stack_block"
9548 [(match_operand 0 "register_operand" "")
9549 (match_operand 1 "register_operand" "")]
9550 "TARGET_BACKCHAIN"
9551 {
9552 rtx temp = gen_reg_rtx (Pmode);
9553
9554 emit_move_insn (temp, s390_back_chain_rtx ());
9555 emit_move_insn (operands[0], operands[1]);
9556 emit_move_insn (s390_back_chain_rtx (), temp);
9557
9558 DONE;
9559 })
9560
9561 (define_expand "save_stack_nonlocal"
9562 [(match_operand 0 "memory_operand" "")
9563 (match_operand 1 "register_operand" "")]
9564 ""
9565 {
9566 rtx base = gen_rtx_REG (Pmode, BASE_REGNUM);
9567
9568 /* Copy the backchain to the first word, sp to the second and the
9569 literal pool base to the third. */
9570
9571 rtx save_bc = adjust_address (operands[0], Pmode, 0);
9572 rtx save_sp = adjust_address (operands[0], Pmode, GET_MODE_SIZE (Pmode));
9573 rtx save_bp = adjust_address (operands[0], Pmode, 2 * GET_MODE_SIZE (Pmode));
9574
9575 if (TARGET_BACKCHAIN)
9576 emit_move_insn (save_bc, force_reg (Pmode, s390_back_chain_rtx ()));
9577
9578 emit_move_insn (save_sp, operands[1]);
9579 emit_move_insn (save_bp, base);
9580
9581 DONE;
9582 })
9583
9584 (define_expand "restore_stack_nonlocal"
9585 [(match_operand 0 "register_operand" "")
9586 (match_operand 1 "memory_operand" "")]
9587 ""
9588 {
9589 rtx base = gen_rtx_REG (Pmode, BASE_REGNUM);
9590 rtx temp = NULL_RTX;
9591
9592 /* Restore the backchain from the first word, sp from the second and the
9593 literal pool base from the third. */
9594
9595 rtx save_bc = adjust_address (operands[1], Pmode, 0);
9596 rtx save_sp = adjust_address (operands[1], Pmode, GET_MODE_SIZE (Pmode));
9597 rtx save_bp = adjust_address (operands[1], Pmode, 2 * GET_MODE_SIZE (Pmode));
9598
9599 if (TARGET_BACKCHAIN)
9600 temp = force_reg (Pmode, save_bc);
9601
9602 emit_move_insn (base, save_bp);
9603 emit_move_insn (operands[0], save_sp);
9604
9605 if (temp)
9606 emit_move_insn (s390_back_chain_rtx (), temp);
9607
9608 emit_use (base);
9609 DONE;
9610 })
9611
9612 (define_expand "exception_receiver"
9613 [(const_int 0)]
9614 ""
9615 {
9616 s390_set_has_landing_pad_p (true);
9617 DONE;
9618 })
9619
9620 ;
9621 ; nop instruction pattern(s).
9622 ;
9623
9624 (define_insn "nop"
9625 [(const_int 0)]
9626 ""
9627 "lr\t0,0"
9628 [(set_attr "op_type" "RR")
9629 (set_attr "z10prop" "z10_fr_E1")])
9630
9631 (define_insn "nop1"
9632 [(const_int 1)]
9633 ""
9634 "lr\t1,1"
9635 [(set_attr "op_type" "RR")])
9636
9637
9638 ;
9639 ; Special literal pool access instruction pattern(s).
9640 ;
9641
9642 (define_insn "*pool_entry"
9643 [(unspec_volatile [(match_operand 0 "consttable_operand" "X")]
9644 UNSPECV_POOL_ENTRY)]
9645 ""
9646 {
9647 enum machine_mode mode = GET_MODE (PATTERN (insn));
9648 unsigned int align = GET_MODE_BITSIZE (mode);
9649 s390_output_pool_entry (operands[0], mode, align);
9650 return "";
9651 }
9652 [(set (attr "length")
9653 (symbol_ref "GET_MODE_SIZE (GET_MODE (PATTERN (insn)))"))])
9654
9655 (define_insn "pool_align"
9656 [(unspec_volatile [(match_operand 0 "const_int_operand" "n")]
9657 UNSPECV_POOL_ALIGN)]
9658 ""
9659 ".align\t%0"
9660 [(set (attr "length") (symbol_ref "INTVAL (operands[0])"))])
9661
9662 (define_insn "pool_section_start"
9663 [(unspec_volatile [(const_int 1)] UNSPECV_POOL_SECTION)]
9664 ""
9665 ".section\t.rodata"
9666 [(set_attr "length" "0")])
9667
9668 (define_insn "pool_section_end"
9669 [(unspec_volatile [(const_int 0)] UNSPECV_POOL_SECTION)]
9670 ""
9671 ".previous"
9672 [(set_attr "length" "0")])
9673
9674 (define_insn "main_base_31_small"
9675 [(set (match_operand 0 "register_operand" "=a")
9676 (unspec [(label_ref (match_operand 1 "" ""))] UNSPEC_MAIN_BASE))]
9677 "!TARGET_CPU_ZARCH && GET_MODE (operands[0]) == Pmode"
9678 "basr\t%0,0"
9679 [(set_attr "op_type" "RR")
9680 (set_attr "type" "la")
9681 (set_attr "z196prop" "z196_cracked")])
9682
9683 (define_insn "main_base_31_large"
9684 [(set (match_operand 0 "register_operand" "=a")
9685 (unspec [(label_ref (match_operand 1 "" ""))] UNSPEC_MAIN_BASE))
9686 (set (pc) (label_ref (match_operand 2 "" "")))]
9687 "!TARGET_CPU_ZARCH && GET_MODE (operands[0]) == Pmode"
9688 "bras\t%0,%2"
9689 [(set_attr "op_type" "RI")
9690 (set_attr "z196prop" "z196_cracked")])
9691
9692 (define_insn "main_base_64"
9693 [(set (match_operand 0 "register_operand" "=a")
9694 (unspec [(label_ref (match_operand 1 "" ""))] UNSPEC_MAIN_BASE))]
9695 "TARGET_CPU_ZARCH && GET_MODE (operands[0]) == Pmode"
9696 "larl\t%0,%1"
9697 [(set_attr "op_type" "RIL")
9698 (set_attr "type" "larl")
9699 (set_attr "z10prop" "z10_fwd_A1")])
9700
9701 (define_insn "main_pool"
9702 [(set (match_operand 0 "register_operand" "=a")
9703 (unspec_volatile [(const_int 0)] UNSPECV_MAIN_POOL))]
9704 "GET_MODE (operands[0]) == Pmode"
9705 {
9706 gcc_unreachable ();
9707 }
9708 [(set (attr "type")
9709 (if_then_else (match_test "TARGET_CPU_ZARCH")
9710 (const_string "larl") (const_string "la")))])
9711
9712 (define_insn "reload_base_31"
9713 [(set (match_operand 0 "register_operand" "=a")
9714 (unspec [(label_ref (match_operand 1 "" ""))] UNSPEC_RELOAD_BASE))]
9715 "!TARGET_CPU_ZARCH && GET_MODE (operands[0]) == Pmode"
9716 "basr\t%0,0\;la\t%0,%1-.(%0)"
9717 [(set_attr "length" "6")
9718 (set_attr "type" "la")
9719 (set_attr "z196prop" "z196_cracked")])
9720
9721 (define_insn "reload_base_64"
9722 [(set (match_operand 0 "register_operand" "=a")
9723 (unspec [(label_ref (match_operand 1 "" ""))] UNSPEC_RELOAD_BASE))]
9724 "TARGET_CPU_ZARCH && GET_MODE (operands[0]) == Pmode"
9725 "larl\t%0,%1"
9726 [(set_attr "op_type" "RIL")
9727 (set_attr "type" "larl")
9728 (set_attr "z10prop" "z10_fwd_A1")])
9729
9730 (define_insn "pool"
9731 [(unspec_volatile [(match_operand 0 "const_int_operand" "n")] UNSPECV_POOL)]
9732 ""
9733 {
9734 gcc_unreachable ();
9735 }
9736 [(set (attr "length") (symbol_ref "INTVAL (operands[0])"))])
9737
9738 ;;
9739 ;; Insns related to generating the function prologue and epilogue.
9740 ;;
9741
9742
9743 (define_expand "prologue"
9744 [(use (const_int 0))]
9745 ""
9746 "s390_emit_prologue (); DONE;")
9747
9748 (define_expand "epilogue"
9749 [(use (const_int 1))]
9750 ""
9751 "s390_emit_epilogue (false); DONE;")
9752
9753 (define_expand "sibcall_epilogue"
9754 [(use (const_int 0))]
9755 ""
9756 "s390_emit_epilogue (true); DONE;")
9757
9758 ;; A direct return instruction, without using an epilogue.
9759 (define_insn "<code>"
9760 [(ANY_RETURN)]
9761 "s390_can_use_<code>_insn ()"
9762 "br\t%%r14"
9763 [(set_attr "op_type" "RR")
9764 (set_attr "type" "jsr")
9765 (set_attr "atype" "agen")])
9766
9767 (define_insn "*return"
9768 [(return)
9769 (use (match_operand 0 "register_operand" "a"))]
9770 "GET_MODE (operands[0]) == Pmode"
9771 "br\t%0"
9772 [(set_attr "op_type" "RR")
9773 (set_attr "type" "jsr")
9774 (set_attr "atype" "agen")])
9775
9776
9777 ;; Instruction definition to extend a 31-bit pointer into a 64-bit
9778 ;; pointer. This is used for compatibility.
9779
9780 (define_expand "ptr_extend"
9781 [(set (match_operand:DI 0 "register_operand" "=r")
9782 (match_operand:SI 1 "register_operand" "r"))]
9783 "TARGET_64BIT"
9784 {
9785 emit_insn (gen_anddi3 (operands[0],
9786 gen_lowpart (DImode, operands[1]),
9787 GEN_INT (0x7fffffff)));
9788 DONE;
9789 })
9790
9791 ;; Instruction definition to expand eh_return macro to support
9792 ;; swapping in special linkage return addresses.
9793
9794 (define_expand "eh_return"
9795 [(use (match_operand 0 "register_operand" ""))]
9796 "TARGET_TPF"
9797 {
9798 s390_emit_tpf_eh_return (operands[0]);
9799 DONE;
9800 })
9801
9802 ;
9803 ; Stack Protector Patterns
9804 ;
9805
9806 (define_expand "stack_protect_set"
9807 [(set (match_operand 0 "memory_operand" "")
9808 (match_operand 1 "memory_operand" ""))]
9809 ""
9810 {
9811 #ifdef TARGET_THREAD_SSP_OFFSET
9812 operands[1]
9813 = gen_rtx_MEM (Pmode, gen_rtx_PLUS (Pmode, s390_get_thread_pointer (),
9814 GEN_INT (TARGET_THREAD_SSP_OFFSET)));
9815 #endif
9816 if (TARGET_64BIT)
9817 emit_insn (gen_stack_protect_setdi (operands[0], operands[1]));
9818 else
9819 emit_insn (gen_stack_protect_setsi (operands[0], operands[1]));
9820
9821 DONE;
9822 })
9823
9824 (define_insn "stack_protect_set<mode>"
9825 [(set (match_operand:DSI 0 "memory_operand" "=Q")
9826 (unspec:DSI [(match_operand:DSI 1 "memory_operand" "Q")] UNSPEC_SP_SET))]
9827 ""
9828 "mvc\t%O0(%G0,%R0),%S1"
9829 [(set_attr "op_type" "SS")])
9830
9831 (define_expand "stack_protect_test"
9832 [(set (reg:CC CC_REGNUM)
9833 (compare (match_operand 0 "memory_operand" "")
9834 (match_operand 1 "memory_operand" "")))
9835 (match_operand 2 "" "")]
9836 ""
9837 {
9838 rtx cc_reg, test;
9839 #ifdef TARGET_THREAD_SSP_OFFSET
9840 operands[1]
9841 = gen_rtx_MEM (Pmode, gen_rtx_PLUS (Pmode, s390_get_thread_pointer (),
9842 GEN_INT (TARGET_THREAD_SSP_OFFSET)));
9843 #endif
9844 if (TARGET_64BIT)
9845 emit_insn (gen_stack_protect_testdi (operands[0], operands[1]));
9846 else
9847 emit_insn (gen_stack_protect_testsi (operands[0], operands[1]));
9848
9849 cc_reg = gen_rtx_REG (CCZmode, CC_REGNUM);
9850 test = gen_rtx_EQ (VOIDmode, cc_reg, const0_rtx);
9851 emit_jump_insn (gen_cbranchcc4 (test, cc_reg, const0_rtx, operands[2]));
9852 DONE;
9853 })
9854
9855 (define_insn "stack_protect_test<mode>"
9856 [(set (reg:CCZ CC_REGNUM)
9857 (unspec:CCZ [(match_operand:DSI 0 "memory_operand" "Q")
9858 (match_operand:DSI 1 "memory_operand" "Q")] UNSPEC_SP_TEST))]
9859 ""
9860 "clc\t%O0(%G0,%R0),%S1"
9861 [(set_attr "op_type" "SS")])
9862
9863 ; This is used in s390_emit_prologue in order to prevent insns
9864 ; adjusting the stack pointer to be moved over insns writing stack
9865 ; slots using a copy of the stack pointer in a different register.
9866 (define_insn "stack_tie"
9867 [(set (match_operand:BLK 0 "memory_operand" "+m")
9868 (unspec:BLK [(match_dup 0)] UNSPEC_TIE))]
9869 ""
9870 ""
9871 [(set_attr "length" "0")])
9872
9873
9874 ;
9875 ; Data prefetch patterns
9876 ;
9877
9878 (define_insn "prefetch"
9879 [(prefetch (match_operand 0 "address_operand" "ZQZRZSZT,X")
9880 (match_operand:SI 1 "const_int_operand" " n,n")
9881 (match_operand:SI 2 "const_int_operand" " n,n"))]
9882 "TARGET_Z10"
9883 {
9884 switch (which_alternative)
9885 {
9886 case 0:
9887 return INTVAL (operands[1]) == 1 ? "pfd\t2,%a0" : "pfd\t1,%a0";
9888 case 1:
9889 if (larl_operand (operands[0], Pmode))
9890 return INTVAL (operands[1]) == 1 ? "pfdrl\t2,%a0" : "pfdrl\t1,%a0";
9891 default:
9892
9893 /* This might be reached for symbolic operands with an odd
9894 addend. We simply omit the prefetch for such rare cases. */
9895
9896 return "";
9897 }
9898 }
9899 [(set_attr "type" "load,larl")
9900 (set_attr "op_type" "RXY,RIL")
9901 (set_attr "z10prop" "z10_super")
9902 (set_attr "z196prop" "z196_alone")])
9903
9904
9905 ;
9906 ; Byte swap instructions
9907 ;
9908
9909 (define_insn "bswap<mode>2"
9910 [(set (match_operand:GPR 0 "register_operand" "=d, d")
9911 (bswap:GPR (match_operand:GPR 1 "nonimmediate_operand" " d,RT")))]
9912 "TARGET_CPU_ZARCH"
9913 "@
9914 lrv<g>r\t%0,%1
9915 lrv<g>\t%0,%1"
9916 [(set_attr "type" "*,load")
9917 (set_attr "op_type" "RRE,RXY")
9918 (set_attr "z10prop" "z10_super")])
9919
9920
9921 ;
9922 ; Population count instruction
9923 ;
9924
9925 ; The S/390 popcount instruction counts the bits of op1 in 8 byte
9926 ; portions and stores the result in the corresponding bytes in op0.
9927 (define_insn "*popcount<mode>"
9928 [(set (match_operand:INT 0 "register_operand" "=d")
9929 (unspec:INT [(match_operand:INT 1 "register_operand" "d")] UNSPEC_POPCNT))
9930 (clobber (reg:CC CC_REGNUM))]
9931 "TARGET_Z196"
9932 "popcnt\t%0,%1"
9933 [(set_attr "op_type" "RRE")])
9934
9935 (define_expand "popcountdi2"
9936 [; popcnt op0, op1
9937 (parallel [(set (match_operand:DI 0 "register_operand" "")
9938 (unspec:DI [(match_operand:DI 1 "register_operand")]
9939 UNSPEC_POPCNT))
9940 (clobber (reg:CC CC_REGNUM))])
9941 ; sllg op2, op0, 32
9942 (set (match_dup 2) (ashift:DI (match_dup 0) (const_int 32)))
9943 ; agr op0, op2
9944 (parallel [(set (match_dup 0) (plus:DI (match_dup 0) (match_dup 2)))
9945 (clobber (reg:CC CC_REGNUM))])
9946 ; sllg op2, op0, 16
9947 (set (match_dup 2)
9948 (ashift:DI (match_dup 0) (const_int 16)))
9949 ; agr op0, op2
9950 (parallel [(set (match_dup 0) (plus:DI (match_dup 0) (match_dup 2)))
9951 (clobber (reg:CC CC_REGNUM))])
9952 ; sllg op2, op0, 8
9953 (set (match_dup 2) (ashift:DI (match_dup 0) (const_int 8)))
9954 ; agr op0, op2
9955 (parallel [(set (match_dup 0) (plus:DI (match_dup 0) (match_dup 2)))
9956 (clobber (reg:CC CC_REGNUM))])
9957 ; srlg op0, op0, 56
9958 (set (match_dup 0) (lshiftrt:DI (match_dup 0) (const_int 56)))]
9959 "TARGET_Z196 && TARGET_64BIT"
9960 "operands[2] = gen_reg_rtx (DImode);")
9961
9962 (define_expand "popcountsi2"
9963 [; popcnt op0, op1
9964 (parallel [(set (match_operand:SI 0 "register_operand" "")
9965 (unspec:SI [(match_operand:SI 1 "register_operand")]
9966 UNSPEC_POPCNT))
9967 (clobber (reg:CC CC_REGNUM))])
9968 ; sllk op2, op0, 16
9969 (set (match_dup 2)
9970 (ashift:SI (match_dup 0) (const_int 16)))
9971 ; ar op0, op2
9972 (parallel [(set (match_dup 0) (plus:SI (match_dup 0) (match_dup 2)))
9973 (clobber (reg:CC CC_REGNUM))])
9974 ; sllk op2, op0, 8
9975 (set (match_dup 2) (ashift:SI (match_dup 0) (const_int 8)))
9976 ; ar op0, op2
9977 (parallel [(set (match_dup 0) (plus:SI (match_dup 0) (match_dup 2)))
9978 (clobber (reg:CC CC_REGNUM))])
9979 ; srl op0, op0, 24
9980 (set (match_dup 0) (lshiftrt:SI (match_dup 0) (const_int 24)))]
9981 "TARGET_Z196"
9982 "operands[2] = gen_reg_rtx (SImode);")
9983
9984 (define_expand "popcounthi2"
9985 [; popcnt op0, op1
9986 (parallel [(set (match_operand:HI 0 "register_operand" "")
9987 (unspec:HI [(match_operand:HI 1 "register_operand")]
9988 UNSPEC_POPCNT))
9989 (clobber (reg:CC CC_REGNUM))])
9990 ; sllk op2, op0, 8
9991 (set (match_dup 2)
9992 (ashift:SI (match_dup 0) (const_int 8)))
9993 ; ar op0, op2
9994 (parallel [(set (match_dup 0) (plus:SI (match_dup 0) (match_dup 2)))
9995 (clobber (reg:CC CC_REGNUM))])
9996 ; srl op0, op0, 8
9997 (set (match_dup 0) (lshiftrt:HI (match_dup 0) (const_int 8)))]
9998 "TARGET_Z196"
9999 "operands[2] = gen_reg_rtx (SImode);")
10000
10001 (define_expand "popcountqi2"
10002 [; popcnt op0, op1
10003 (parallel [(set (match_operand:QI 0 "register_operand" "")
10004 (unspec:QI [(match_operand:QI 1 "register_operand")]
10005 UNSPEC_POPCNT))
10006 (clobber (reg:CC CC_REGNUM))])]
10007 "TARGET_Z196"
10008 "")
10009
10010 ;;
10011 ;;- Copy sign instructions
10012 ;;
10013
10014 (define_insn "copysign<mode>3"
10015 [(set (match_operand:FP 0 "register_operand" "=f")
10016 (unspec:FP [(match_operand:FP 1 "register_operand" "<fT0>")
10017 (match_operand:FP 2 "register_operand" "f")]
10018 UNSPEC_COPYSIGN))]
10019 "TARGET_Z196"
10020 "cpsdr\t%0,%2,%1"
10021 [(set_attr "op_type" "RRF")
10022 (set_attr "type" "fsimp<mode>")])
10023
10024
10025 ;;
10026 ;;- Transactional execution instructions
10027 ;;
10028
10029 ; This splitter helps combine to make use of CC directly when
10030 ; comparing the integer result of a tbegin builtin with a constant.
10031 ; The unspec is already removed by canonicalize_comparison. So this
10032 ; splitters only job is to turn the PARALLEL into separate insns
10033 ; again. Unfortunately this only works with the very first cc/int
10034 ; compare since combine is not able to deal with data flow across
10035 ; basic block boundaries.
10036
10037 ; It needs to be an insn pattern as well since combine does not apply
10038 ; the splitter directly. Combine would only use it if it actually
10039 ; would reduce the number of instructions.
10040 (define_insn_and_split "*ccraw_to_int"
10041 [(set (pc)
10042 (if_then_else
10043 (match_operator 0 "s390_eqne_operator"
10044 [(reg:CCRAW CC_REGNUM)
10045 (match_operand 1 "const_int_operand" "")])
10046 (label_ref (match_operand 2 "" ""))
10047 (pc)))
10048 (set (match_operand:SI 3 "register_operand" "=d")
10049 (unspec:SI [(reg:CCRAW CC_REGNUM)] UNSPEC_CC_TO_INT))]
10050 ""
10051 "#"
10052 ""
10053 [(set (match_dup 3)
10054 (unspec:SI [(reg:CCRAW CC_REGNUM)] UNSPEC_CC_TO_INT))
10055 (set (pc)
10056 (if_then_else (match_op_dup 0 [(reg:CCRAW CC_REGNUM) (match_dup 1)])
10057 (label_ref (match_dup 2))
10058 (pc)))]
10059 "")
10060
10061 ; Non-constrained transaction begin
10062
10063 (define_expand "tbegin"
10064 [(match_operand:SI 0 "register_operand" "")
10065 (match_operand:BLK 1 "memory_operand" "")]
10066 "TARGET_HTM"
10067 {
10068 s390_expand_tbegin (operands[0], operands[1], NULL_RTX, true);
10069 DONE;
10070 })
10071
10072 (define_expand "tbegin_nofloat"
10073 [(match_operand:SI 0 "register_operand" "")
10074 (match_operand:BLK 1 "memory_operand" "")]
10075 "TARGET_HTM"
10076 {
10077 s390_expand_tbegin (operands[0], operands[1], NULL_RTX, false);
10078 DONE;
10079 })
10080
10081 (define_expand "tbegin_retry"
10082 [(match_operand:SI 0 "register_operand" "")
10083 (match_operand:BLK 1 "memory_operand" "")
10084 (match_operand:SI 2 "general_operand" "")]
10085 "TARGET_HTM"
10086 {
10087 s390_expand_tbegin (operands[0], operands[1], operands[2], true);
10088 DONE;
10089 })
10090
10091 (define_expand "tbegin_retry_nofloat"
10092 [(match_operand:SI 0 "register_operand" "")
10093 (match_operand:BLK 1 "memory_operand" "")
10094 (match_operand:SI 2 "general_operand" "")]
10095 "TARGET_HTM"
10096 {
10097 s390_expand_tbegin (operands[0], operands[1], operands[2], false);
10098 DONE;
10099 })
10100
10101 (define_insn "tbegin_1"
10102 [(set (reg:CCRAW CC_REGNUM)
10103 (unspec_volatile:CCRAW [(match_operand 0 "const_int_operand" "D")]
10104 UNSPECV_TBEGIN))
10105 (set (match_operand:BLK 1 "memory_operand" "=Q")
10106 (unspec_volatile:BLK [(match_dup 0)] UNSPECV_TBEGIN_TDB))
10107 (clobber (reg:DF 16))
10108 (clobber (reg:DF 17))
10109 (clobber (reg:DF 18))
10110 (clobber (reg:DF 19))
10111 (clobber (reg:DF 20))
10112 (clobber (reg:DF 21))
10113 (clobber (reg:DF 22))
10114 (clobber (reg:DF 23))
10115 (clobber (reg:DF 24))
10116 (clobber (reg:DF 25))
10117 (clobber (reg:DF 26))
10118 (clobber (reg:DF 27))
10119 (clobber (reg:DF 28))
10120 (clobber (reg:DF 29))
10121 (clobber (reg:DF 30))
10122 (clobber (reg:DF 31))]
10123 ; CONST_OK_FOR_CONSTRAINT_P does not work with D constraint since D is
10124 ; not supposed to be used for immediates (see genpreds.c).
10125 "TARGET_HTM && INTVAL (operands[0]) >= 0 && INTVAL (operands[0]) <= 0xffff"
10126 "tbegin\t%1,%x0"
10127 [(set_attr "op_type" "SIL")])
10128
10129 ; Same as above but without the FPR clobbers
10130 (define_insn "tbegin_nofloat_1"
10131 [(set (reg:CCRAW CC_REGNUM)
10132 (unspec_volatile:CCRAW [(match_operand 0 "const_int_operand" "D")]
10133 UNSPECV_TBEGIN))
10134 (set (match_operand:BLK 1 "memory_operand" "=Q")
10135 (unspec_volatile:BLK [(match_dup 0)] UNSPECV_TBEGIN_TDB))]
10136 "TARGET_HTM && INTVAL (operands[0]) >= 0 && INTVAL (operands[0]) <= 0xffff"
10137 "tbegin\t%1,%x0"
10138 [(set_attr "op_type" "SIL")])
10139
10140
10141 ; Constrained transaction begin
10142
10143 (define_expand "tbeginc"
10144 [(set (reg:CCRAW CC_REGNUM)
10145 (unspec_volatile:CCRAW [(const_int TBEGINC_MASK)]
10146 UNSPECV_TBEGINC))]
10147 "TARGET_HTM"
10148 "")
10149
10150 (define_insn "*tbeginc_1"
10151 [(set (reg:CCRAW CC_REGNUM)
10152 (unspec_volatile:CCRAW [(match_operand 0 "const_int_operand" " D")]
10153 UNSPECV_TBEGINC))]
10154 "TARGET_HTM && INTVAL (operands[0]) >= 0 && INTVAL (operands[0]) <= 0xffff"
10155 "tbeginc\t0,%x0"
10156 [(set_attr "op_type" "SIL")])
10157
10158 ; Transaction end
10159
10160 (define_expand "tend"
10161 [(set (reg:CCRAW CC_REGNUM)
10162 (unspec_volatile:CCRAW [(const_int 0)] UNSPECV_TEND))
10163 (set (match_operand:SI 0 "register_operand" "")
10164 (unspec:SI [(reg:CCRAW CC_REGNUM)] UNSPEC_CC_TO_INT))]
10165 "TARGET_HTM"
10166 "")
10167
10168 (define_insn "*tend_1"
10169 [(set (reg:CCRAW CC_REGNUM)
10170 (unspec_volatile:CCRAW [(const_int 0)] UNSPECV_TEND))]
10171 "TARGET_HTM"
10172 "tend"
10173 [(set_attr "op_type" "S")])
10174
10175 ; Transaction abort
10176
10177 (define_expand "tabort"
10178 [(unspec_volatile [(match_operand:SI 0 "shift_count_or_setmem_operand" "")]
10179 UNSPECV_TABORT)]
10180 "TARGET_HTM && operands != NULL"
10181 {
10182 if (CONST_INT_P (operands[0])
10183 && INTVAL (operands[0]) >= 0 && INTVAL (operands[0]) <= 255)
10184 {
10185 error ("Invalid transaction abort code: " HOST_WIDE_INT_PRINT_DEC
10186 ". Values in range 0 through 255 are reserved.",
10187 INTVAL (operands[0]));
10188 FAIL;
10189 }
10190 })
10191
10192 (define_insn "*tabort_1"
10193 [(unspec_volatile [(match_operand:SI 0 "shift_count_or_setmem_operand" "Y")]
10194 UNSPECV_TABORT)]
10195 "TARGET_HTM && operands != NULL"
10196 "tabort\t%Y0"
10197 [(set_attr "op_type" "S")])
10198
10199 ; Transaction extract nesting depth
10200
10201 (define_insn "etnd"
10202 [(set (match_operand:SI 0 "register_operand" "=d")
10203 (unspec_volatile:SI [(const_int 0)] UNSPECV_ETND))]
10204 "TARGET_HTM"
10205 "etnd\t%0"
10206 [(set_attr "op_type" "RRE")])
10207
10208 ; Non-transactional store
10209
10210 (define_insn "ntstg"
10211 [(set (match_operand:DI 0 "memory_operand" "=RT")
10212 (unspec_volatile:DI [(match_operand:DI 1 "register_operand" "d")]
10213 UNSPECV_NTSTG))]
10214 "TARGET_HTM"
10215 "ntstg\t%1,%0"
10216 [(set_attr "op_type" "RXY")])
10217
10218 ; Transaction perform processor assist
10219
10220 (define_expand "tx_assist"
10221 [(unspec_volatile [(match_operand:SI 0 "register_operand" "")
10222 (reg:SI GPR0_REGNUM)
10223 (const_int 1)]
10224 UNSPECV_PPA)]
10225 "TARGET_HTM"
10226 "")
10227
10228 (define_insn "*ppa"
10229 [(unspec_volatile [(match_operand:SI 0 "register_operand" "d")
10230 (match_operand:SI 1 "register_operand" "d")
10231 (match_operand 2 "const_int_operand" "I")]
10232 UNSPECV_PPA)]
10233 "TARGET_HTM && INTVAL (operands[2]) < 16"
10234 "ppa\t%0,%1,%2"
10235 [(set_attr "op_type" "RRF")])