Merged r157653 through r157895 into branch.
[official-gcc.git] / gcc / config / s390 / s390.c
blobc2cf3d4a828d864192b3165097bbcd5cbf054ef6
1 /* Subroutines used for code generation on IBM S/390 and zSeries
2 Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006,
3 2007, 2008, 2009, 2010 Free Software Foundation, Inc.
4 Contributed by Hartmut Penner (hpenner@de.ibm.com) and
5 Ulrich Weigand (uweigand@de.ibm.com) and
6 Andreas Krebbel (Andreas.Krebbel@de.ibm.com).
8 This file is part of GCC.
10 GCC is free software; you can redistribute it and/or modify it under
11 the terms of the GNU General Public License as published by the Free
12 Software Foundation; either version 3, or (at your option) any later
13 version.
15 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
16 WARRANTY; without even the implied warranty of MERCHANTABILITY or
17 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
18 for more details.
20 You should have received a copy of the GNU General Public License
21 along with GCC; see the file COPYING3. If not see
22 <http://www.gnu.org/licenses/>. */
24 #include "config.h"
25 #include "system.h"
26 #include "coretypes.h"
27 #include "tm.h"
28 #include "rtl.h"
29 #include "tree.h"
30 #include "tm_p.h"
31 #include "regs.h"
32 #include "hard-reg-set.h"
33 #include "real.h"
34 #include "insn-config.h"
35 #include "conditions.h"
36 #include "output.h"
37 #include "insn-attr.h"
38 #include "flags.h"
39 #include "except.h"
40 #include "function.h"
41 #include "recog.h"
42 #include "expr.h"
43 #include "reload.h"
44 #include "toplev.h"
45 #include "basic-block.h"
46 #include "integrate.h"
47 #include "ggc.h"
48 #include "target.h"
49 #include "target-def.h"
50 #include "debug.h"
51 #include "langhooks.h"
52 #include "optabs.h"
53 #include "gimple.h"
54 #include "df.h"
55 #include "params.h"
58 /* Define the specific costs for a given cpu. */
60 struct processor_costs
62 /* multiplication */
63 const int m; /* cost of an M instruction. */
64 const int mghi; /* cost of an MGHI instruction. */
65 const int mh; /* cost of an MH instruction. */
66 const int mhi; /* cost of an MHI instruction. */
67 const int ml; /* cost of an ML instruction. */
68 const int mr; /* cost of an MR instruction. */
69 const int ms; /* cost of an MS instruction. */
70 const int msg; /* cost of an MSG instruction. */
71 const int msgf; /* cost of an MSGF instruction. */
72 const int msgfr; /* cost of an MSGFR instruction. */
73 const int msgr; /* cost of an MSGR instruction. */
74 const int msr; /* cost of an MSR instruction. */
75 const int mult_df; /* cost of multiplication in DFmode. */
76 const int mxbr;
77 /* square root */
78 const int sqxbr; /* cost of square root in TFmode. */
79 const int sqdbr; /* cost of square root in DFmode. */
80 const int sqebr; /* cost of square root in SFmode. */
81 /* multiply and add */
82 const int madbr; /* cost of multiply and add in DFmode. */
83 const int maebr; /* cost of multiply and add in SFmode. */
84 /* division */
85 const int dxbr;
86 const int ddbr;
87 const int debr;
88 const int dlgr;
89 const int dlr;
90 const int dr;
91 const int dsgfr;
92 const int dsgr;
95 const struct processor_costs *s390_cost;
97 static const
98 struct processor_costs z900_cost =
100 COSTS_N_INSNS (5), /* M */
101 COSTS_N_INSNS (10), /* MGHI */
102 COSTS_N_INSNS (5), /* MH */
103 COSTS_N_INSNS (4), /* MHI */
104 COSTS_N_INSNS (5), /* ML */
105 COSTS_N_INSNS (5), /* MR */
106 COSTS_N_INSNS (4), /* MS */
107 COSTS_N_INSNS (15), /* MSG */
108 COSTS_N_INSNS (7), /* MSGF */
109 COSTS_N_INSNS (7), /* MSGFR */
110 COSTS_N_INSNS (10), /* MSGR */
111 COSTS_N_INSNS (4), /* MSR */
112 COSTS_N_INSNS (7), /* multiplication in DFmode */
113 COSTS_N_INSNS (13), /* MXBR */
114 COSTS_N_INSNS (136), /* SQXBR */
115 COSTS_N_INSNS (44), /* SQDBR */
116 COSTS_N_INSNS (35), /* SQEBR */
117 COSTS_N_INSNS (18), /* MADBR */
118 COSTS_N_INSNS (13), /* MAEBR */
119 COSTS_N_INSNS (134), /* DXBR */
120 COSTS_N_INSNS (30), /* DDBR */
121 COSTS_N_INSNS (27), /* DEBR */
122 COSTS_N_INSNS (220), /* DLGR */
123 COSTS_N_INSNS (34), /* DLR */
124 COSTS_N_INSNS (34), /* DR */
125 COSTS_N_INSNS (32), /* DSGFR */
126 COSTS_N_INSNS (32), /* DSGR */
129 static const
130 struct processor_costs z990_cost =
132 COSTS_N_INSNS (4), /* M */
133 COSTS_N_INSNS (2), /* MGHI */
134 COSTS_N_INSNS (2), /* MH */
135 COSTS_N_INSNS (2), /* MHI */
136 COSTS_N_INSNS (4), /* ML */
137 COSTS_N_INSNS (4), /* MR */
138 COSTS_N_INSNS (5), /* MS */
139 COSTS_N_INSNS (6), /* MSG */
140 COSTS_N_INSNS (4), /* MSGF */
141 COSTS_N_INSNS (4), /* MSGFR */
142 COSTS_N_INSNS (4), /* MSGR */
143 COSTS_N_INSNS (4), /* MSR */
144 COSTS_N_INSNS (1), /* multiplication in DFmode */
145 COSTS_N_INSNS (28), /* MXBR */
146 COSTS_N_INSNS (130), /* SQXBR */
147 COSTS_N_INSNS (66), /* SQDBR */
148 COSTS_N_INSNS (38), /* SQEBR */
149 COSTS_N_INSNS (1), /* MADBR */
150 COSTS_N_INSNS (1), /* MAEBR */
151 COSTS_N_INSNS (60), /* DXBR */
152 COSTS_N_INSNS (40), /* DDBR */
153 COSTS_N_INSNS (26), /* DEBR */
154 COSTS_N_INSNS (176), /* DLGR */
155 COSTS_N_INSNS (31), /* DLR */
156 COSTS_N_INSNS (31), /* DR */
157 COSTS_N_INSNS (31), /* DSGFR */
158 COSTS_N_INSNS (31), /* DSGR */
161 static const
162 struct processor_costs z9_109_cost =
164 COSTS_N_INSNS (4), /* M */
165 COSTS_N_INSNS (2), /* MGHI */
166 COSTS_N_INSNS (2), /* MH */
167 COSTS_N_INSNS (2), /* MHI */
168 COSTS_N_INSNS (4), /* ML */
169 COSTS_N_INSNS (4), /* MR */
170 COSTS_N_INSNS (5), /* MS */
171 COSTS_N_INSNS (6), /* MSG */
172 COSTS_N_INSNS (4), /* MSGF */
173 COSTS_N_INSNS (4), /* MSGFR */
174 COSTS_N_INSNS (4), /* MSGR */
175 COSTS_N_INSNS (4), /* MSR */
176 COSTS_N_INSNS (1), /* multiplication in DFmode */
177 COSTS_N_INSNS (28), /* MXBR */
178 COSTS_N_INSNS (130), /* SQXBR */
179 COSTS_N_INSNS (66), /* SQDBR */
180 COSTS_N_INSNS (38), /* SQEBR */
181 COSTS_N_INSNS (1), /* MADBR */
182 COSTS_N_INSNS (1), /* MAEBR */
183 COSTS_N_INSNS (60), /* DXBR */
184 COSTS_N_INSNS (40), /* DDBR */
185 COSTS_N_INSNS (26), /* DEBR */
186 COSTS_N_INSNS (30), /* DLGR */
187 COSTS_N_INSNS (23), /* DLR */
188 COSTS_N_INSNS (23), /* DR */
189 COSTS_N_INSNS (24), /* DSGFR */
190 COSTS_N_INSNS (24), /* DSGR */
193 static const
194 struct processor_costs z10_cost =
196 COSTS_N_INSNS (10), /* M */
197 COSTS_N_INSNS (10), /* MGHI */
198 COSTS_N_INSNS (10), /* MH */
199 COSTS_N_INSNS (10), /* MHI */
200 COSTS_N_INSNS (10), /* ML */
201 COSTS_N_INSNS (10), /* MR */
202 COSTS_N_INSNS (10), /* MS */
203 COSTS_N_INSNS (10), /* MSG */
204 COSTS_N_INSNS (10), /* MSGF */
205 COSTS_N_INSNS (10), /* MSGFR */
206 COSTS_N_INSNS (10), /* MSGR */
207 COSTS_N_INSNS (10), /* MSR */
208 COSTS_N_INSNS (1) , /* multiplication in DFmode */
209 COSTS_N_INSNS (50), /* MXBR */
210 COSTS_N_INSNS (120), /* SQXBR */
211 COSTS_N_INSNS (52), /* SQDBR */
212 COSTS_N_INSNS (38), /* SQEBR */
213 COSTS_N_INSNS (1), /* MADBR */
214 COSTS_N_INSNS (1), /* MAEBR */
215 COSTS_N_INSNS (111), /* DXBR */
216 COSTS_N_INSNS (39), /* DDBR */
217 COSTS_N_INSNS (32), /* DEBR */
218 COSTS_N_INSNS (160), /* DLGR */
219 COSTS_N_INSNS (71), /* DLR */
220 COSTS_N_INSNS (71), /* DR */
221 COSTS_N_INSNS (71), /* DSGFR */
222 COSTS_N_INSNS (71), /* DSGR */
225 extern int reload_completed;
227 /* Kept up to date using the SCHED_VARIABLE_ISSUE hook. */
228 static rtx last_scheduled_insn;
230 /* Structure used to hold the components of a S/390 memory
231 address. A legitimate address on S/390 is of the general
232 form
233 base + index + displacement
234 where any of the components is optional.
236 base and index are registers of the class ADDR_REGS,
237 displacement is an unsigned 12-bit immediate constant. */
239 struct s390_address
241 rtx base;
242 rtx indx;
243 rtx disp;
244 bool pointer;
245 bool literal_pool;
248 /* Which cpu are we tuning for. */
249 enum processor_type s390_tune = PROCESSOR_max;
250 int s390_tune_flags;
251 /* Which instruction set architecture to use. */
252 enum processor_type s390_arch;
253 int s390_arch_flags;
255 HOST_WIDE_INT s390_warn_framesize = 0;
256 HOST_WIDE_INT s390_stack_size = 0;
257 HOST_WIDE_INT s390_stack_guard = 0;
259 /* The following structure is embedded in the machine
260 specific part of struct function. */
262 struct GTY (()) s390_frame_layout
264 /* Offset within stack frame. */
265 HOST_WIDE_INT gprs_offset;
266 HOST_WIDE_INT f0_offset;
267 HOST_WIDE_INT f4_offset;
268 HOST_WIDE_INT f8_offset;
269 HOST_WIDE_INT backchain_offset;
271 /* Number of first and last gpr where slots in the register
272 save area are reserved for. */
273 int first_save_gpr_slot;
274 int last_save_gpr_slot;
276 /* Number of first and last gpr to be saved, restored. */
277 int first_save_gpr;
278 int first_restore_gpr;
279 int last_save_gpr;
280 int last_restore_gpr;
282 /* Bits standing for floating point registers. Set, if the
283 respective register has to be saved. Starting with reg 16 (f0)
284 at the rightmost bit.
285 Bit 15 - 8 7 6 5 4 3 2 1 0
286 fpr 15 - 8 7 5 3 1 6 4 2 0
287 reg 31 - 24 23 22 21 20 19 18 17 16 */
288 unsigned int fpr_bitmap;
290 /* Number of floating point registers f8-f15 which must be saved. */
291 int high_fprs;
293 /* Set if return address needs to be saved.
294 This flag is set by s390_return_addr_rtx if it could not use
295 the initial value of r14 and therefore depends on r14 saved
296 to the stack. */
297 bool save_return_addr_p;
299 /* Size of stack frame. */
300 HOST_WIDE_INT frame_size;
303 /* Define the structure for the machine field in struct function. */
305 struct GTY(()) machine_function
307 struct s390_frame_layout frame_layout;
309 /* Literal pool base register. */
310 rtx base_reg;
312 /* True if we may need to perform branch splitting. */
313 bool split_branches_pending_p;
315 /* Some local-dynamic TLS symbol name. */
316 const char *some_ld_name;
318 bool has_landing_pad_p;
321 /* Few accessor macros for struct cfun->machine->s390_frame_layout. */
323 #define cfun_frame_layout (cfun->machine->frame_layout)
324 #define cfun_save_high_fprs_p (!!cfun_frame_layout.high_fprs)
325 #define cfun_gprs_save_area_size ((cfun_frame_layout.last_save_gpr_slot - \
326 cfun_frame_layout.first_save_gpr_slot + 1) * UNITS_PER_WORD)
327 #define cfun_set_fpr_bit(BITNUM) (cfun->machine->frame_layout.fpr_bitmap |= \
328 (1 << (BITNUM)))
329 #define cfun_fpr_bit_p(BITNUM) (!!(cfun->machine->frame_layout.fpr_bitmap & \
330 (1 << (BITNUM))))
332 /* Number of GPRs and FPRs used for argument passing. */
333 #define GP_ARG_NUM_REG 5
334 #define FP_ARG_NUM_REG (TARGET_64BIT? 4 : 2)
336 /* A couple of shortcuts. */
337 #define CONST_OK_FOR_J(x) \
338 CONST_OK_FOR_CONSTRAINT_P((x), 'J', "J")
339 #define CONST_OK_FOR_K(x) \
340 CONST_OK_FOR_CONSTRAINT_P((x), 'K', "K")
341 #define CONST_OK_FOR_Os(x) \
342 CONST_OK_FOR_CONSTRAINT_P((x), 'O', "Os")
343 #define CONST_OK_FOR_Op(x) \
344 CONST_OK_FOR_CONSTRAINT_P((x), 'O', "Op")
345 #define CONST_OK_FOR_On(x) \
346 CONST_OK_FOR_CONSTRAINT_P((x), 'O', "On")
348 #define REGNO_PAIR_OK(REGNO, MODE) \
349 (HARD_REGNO_NREGS ((REGNO), (MODE)) == 1 || !((REGNO) & 1))
351 /* That's the read ahead of the dynamic branch prediction unit in
352 bytes on a z10 CPU. */
353 #define Z10_PREDICT_DISTANCE 384
355 static enum machine_mode
356 s390_libgcc_cmp_return_mode (void)
358 return TARGET_64BIT ? DImode : SImode;
361 static enum machine_mode
362 s390_libgcc_shift_count_mode (void)
364 return TARGET_64BIT ? DImode : SImode;
367 /* Return true if the back end supports mode MODE. */
368 static bool
369 s390_scalar_mode_supported_p (enum machine_mode mode)
371 if (DECIMAL_FLOAT_MODE_P (mode))
372 return default_decimal_float_supported_p ();
373 else
374 return default_scalar_mode_supported_p (mode);
377 /* Set the has_landing_pad_p flag in struct machine_function to VALUE. */
379 void
380 s390_set_has_landing_pad_p (bool value)
382 cfun->machine->has_landing_pad_p = value;
385 /* If two condition code modes are compatible, return a condition code
386 mode which is compatible with both. Otherwise, return
387 VOIDmode. */
389 static enum machine_mode
390 s390_cc_modes_compatible (enum machine_mode m1, enum machine_mode m2)
392 if (m1 == m2)
393 return m1;
395 switch (m1)
397 case CCZmode:
398 if (m2 == CCUmode || m2 == CCTmode || m2 == CCZ1mode
399 || m2 == CCSmode || m2 == CCSRmode || m2 == CCURmode)
400 return m2;
401 return VOIDmode;
403 case CCSmode:
404 case CCUmode:
405 case CCTmode:
406 case CCSRmode:
407 case CCURmode:
408 case CCZ1mode:
409 if (m2 == CCZmode)
410 return m1;
412 return VOIDmode;
414 default:
415 return VOIDmode;
417 return VOIDmode;
420 /* Return true if SET either doesn't set the CC register, or else
421 the source and destination have matching CC modes and that
422 CC mode is at least as constrained as REQ_MODE. */
424 static bool
425 s390_match_ccmode_set (rtx set, enum machine_mode req_mode)
427 enum machine_mode set_mode;
429 gcc_assert (GET_CODE (set) == SET);
431 if (GET_CODE (SET_DEST (set)) != REG || !CC_REGNO_P (REGNO (SET_DEST (set))))
432 return 1;
434 set_mode = GET_MODE (SET_DEST (set));
435 switch (set_mode)
437 case CCSmode:
438 case CCSRmode:
439 case CCUmode:
440 case CCURmode:
441 case CCLmode:
442 case CCL1mode:
443 case CCL2mode:
444 case CCL3mode:
445 case CCT1mode:
446 case CCT2mode:
447 case CCT3mode:
448 if (req_mode != set_mode)
449 return 0;
450 break;
452 case CCZmode:
453 if (req_mode != CCSmode && req_mode != CCUmode && req_mode != CCTmode
454 && req_mode != CCSRmode && req_mode != CCURmode)
455 return 0;
456 break;
458 case CCAPmode:
459 case CCANmode:
460 if (req_mode != CCAmode)
461 return 0;
462 break;
464 default:
465 gcc_unreachable ();
468 return (GET_MODE (SET_SRC (set)) == set_mode);
471 /* Return true if every SET in INSN that sets the CC register
472 has source and destination with matching CC modes and that
473 CC mode is at least as constrained as REQ_MODE.
474 If REQ_MODE is VOIDmode, always return false. */
476 bool
477 s390_match_ccmode (rtx insn, enum machine_mode req_mode)
479 int i;
481 /* s390_tm_ccmode returns VOIDmode to indicate failure. */
482 if (req_mode == VOIDmode)
483 return false;
485 if (GET_CODE (PATTERN (insn)) == SET)
486 return s390_match_ccmode_set (PATTERN (insn), req_mode);
488 if (GET_CODE (PATTERN (insn)) == PARALLEL)
489 for (i = 0; i < XVECLEN (PATTERN (insn), 0); i++)
491 rtx set = XVECEXP (PATTERN (insn), 0, i);
492 if (GET_CODE (set) == SET)
493 if (!s390_match_ccmode_set (set, req_mode))
494 return false;
497 return true;
500 /* If a test-under-mask instruction can be used to implement
501 (compare (and ... OP1) OP2), return the CC mode required
502 to do that. Otherwise, return VOIDmode.
503 MIXED is true if the instruction can distinguish between
504 CC1 and CC2 for mixed selected bits (TMxx), it is false
505 if the instruction cannot (TM). */
507 enum machine_mode
508 s390_tm_ccmode (rtx op1, rtx op2, bool mixed)
510 int bit0, bit1;
512 /* ??? Fixme: should work on CONST_DOUBLE as well. */
513 if (GET_CODE (op1) != CONST_INT || GET_CODE (op2) != CONST_INT)
514 return VOIDmode;
516 /* Selected bits all zero: CC0.
517 e.g.: int a; if ((a & (16 + 128)) == 0) */
518 if (INTVAL (op2) == 0)
519 return CCTmode;
521 /* Selected bits all one: CC3.
522 e.g.: int a; if ((a & (16 + 128)) == 16 + 128) */
523 if (INTVAL (op2) == INTVAL (op1))
524 return CCT3mode;
526 /* Exactly two bits selected, mixed zeroes and ones: CC1 or CC2. e.g.:
527 int a;
528 if ((a & (16 + 128)) == 16) -> CCT1
529 if ((a & (16 + 128)) == 128) -> CCT2 */
530 if (mixed)
532 bit1 = exact_log2 (INTVAL (op2));
533 bit0 = exact_log2 (INTVAL (op1) ^ INTVAL (op2));
534 if (bit0 != -1 && bit1 != -1)
535 return bit0 > bit1 ? CCT1mode : CCT2mode;
538 return VOIDmode;
541 /* Given a comparison code OP (EQ, NE, etc.) and the operands
542 OP0 and OP1 of a COMPARE, return the mode to be used for the
543 comparison. */
545 enum machine_mode
546 s390_select_ccmode (enum rtx_code code, rtx op0, rtx op1)
548 switch (code)
550 case EQ:
551 case NE:
552 if ((GET_CODE (op0) == NEG || GET_CODE (op0) == ABS)
553 && GET_MODE_CLASS (GET_MODE (op0)) == MODE_INT)
554 return CCAPmode;
555 if (GET_CODE (op0) == PLUS && GET_CODE (XEXP (op0, 1)) == CONST_INT
556 && CONST_OK_FOR_K (INTVAL (XEXP (op0, 1))))
557 return CCAPmode;
558 if ((GET_CODE (op0) == PLUS || GET_CODE (op0) == MINUS
559 || GET_CODE (op1) == NEG)
560 && GET_MODE_CLASS (GET_MODE (op0)) == MODE_INT)
561 return CCLmode;
563 if (GET_CODE (op0) == AND)
565 /* Check whether we can potentially do it via TM. */
566 enum machine_mode ccmode;
567 ccmode = s390_tm_ccmode (XEXP (op0, 1), op1, 1);
568 if (ccmode != VOIDmode)
570 /* Relax CCTmode to CCZmode to allow fall-back to AND
571 if that turns out to be beneficial. */
572 return ccmode == CCTmode ? CCZmode : ccmode;
576 if (register_operand (op0, HImode)
577 && GET_CODE (op1) == CONST_INT
578 && (INTVAL (op1) == -1 || INTVAL (op1) == 65535))
579 return CCT3mode;
580 if (register_operand (op0, QImode)
581 && GET_CODE (op1) == CONST_INT
582 && (INTVAL (op1) == -1 || INTVAL (op1) == 255))
583 return CCT3mode;
585 return CCZmode;
587 case LE:
588 case LT:
589 case GE:
590 case GT:
591 /* The only overflow condition of NEG and ABS happens when
592 -INT_MAX is used as parameter, which stays negative. So
593 we have an overflow from a positive value to a negative.
594 Using CCAP mode the resulting cc can be used for comparisons. */
595 if ((GET_CODE (op0) == NEG || GET_CODE (op0) == ABS)
596 && GET_MODE_CLASS (GET_MODE (op0)) == MODE_INT)
597 return CCAPmode;
599 /* If constants are involved in an add instruction it is possible to use
600 the resulting cc for comparisons with zero. Knowing the sign of the
601 constant the overflow behavior gets predictable. e.g.:
602 int a, b; if ((b = a + c) > 0)
603 with c as a constant value: c < 0 -> CCAN and c >= 0 -> CCAP */
604 if (GET_CODE (op0) == PLUS && GET_CODE (XEXP (op0, 1)) == CONST_INT
605 && CONST_OK_FOR_K (INTVAL (XEXP (op0, 1))))
607 if (INTVAL (XEXP((op0), 1)) < 0)
608 return CCANmode;
609 else
610 return CCAPmode;
612 /* Fall through. */
613 case UNORDERED:
614 case ORDERED:
615 case UNEQ:
616 case UNLE:
617 case UNLT:
618 case UNGE:
619 case UNGT:
620 case LTGT:
621 if ((GET_CODE (op0) == SIGN_EXTEND || GET_CODE (op0) == ZERO_EXTEND)
622 && GET_CODE (op1) != CONST_INT)
623 return CCSRmode;
624 return CCSmode;
626 case LTU:
627 case GEU:
628 if (GET_CODE (op0) == PLUS
629 && GET_MODE_CLASS (GET_MODE (op0)) == MODE_INT)
630 return CCL1mode;
632 if ((GET_CODE (op0) == SIGN_EXTEND || GET_CODE (op0) == ZERO_EXTEND)
633 && GET_CODE (op1) != CONST_INT)
634 return CCURmode;
635 return CCUmode;
637 case LEU:
638 case GTU:
639 if (GET_CODE (op0) == MINUS
640 && GET_MODE_CLASS (GET_MODE (op0)) == MODE_INT)
641 return CCL2mode;
643 if ((GET_CODE (op0) == SIGN_EXTEND || GET_CODE (op0) == ZERO_EXTEND)
644 && GET_CODE (op1) != CONST_INT)
645 return CCURmode;
646 return CCUmode;
648 default:
649 gcc_unreachable ();
653 /* Replace the comparison OP0 CODE OP1 by a semantically equivalent one
654 that we can implement more efficiently. */
656 void
657 s390_canonicalize_comparison (enum rtx_code *code, rtx *op0, rtx *op1)
659 /* Convert ZERO_EXTRACT back to AND to enable TM patterns. */
660 if ((*code == EQ || *code == NE)
661 && *op1 == const0_rtx
662 && GET_CODE (*op0) == ZERO_EXTRACT
663 && GET_CODE (XEXP (*op0, 1)) == CONST_INT
664 && GET_CODE (XEXP (*op0, 2)) == CONST_INT
665 && SCALAR_INT_MODE_P (GET_MODE (XEXP (*op0, 0))))
667 rtx inner = XEXP (*op0, 0);
668 HOST_WIDE_INT modesize = GET_MODE_BITSIZE (GET_MODE (inner));
669 HOST_WIDE_INT len = INTVAL (XEXP (*op0, 1));
670 HOST_WIDE_INT pos = INTVAL (XEXP (*op0, 2));
672 if (len > 0 && len < modesize
673 && pos >= 0 && pos + len <= modesize
674 && modesize <= HOST_BITS_PER_WIDE_INT)
676 unsigned HOST_WIDE_INT block;
677 block = ((unsigned HOST_WIDE_INT) 1 << len) - 1;
678 block <<= modesize - pos - len;
680 *op0 = gen_rtx_AND (GET_MODE (inner), inner,
681 gen_int_mode (block, GET_MODE (inner)));
685 /* Narrow AND of memory against immediate to enable TM. */
686 if ((*code == EQ || *code == NE)
687 && *op1 == const0_rtx
688 && GET_CODE (*op0) == AND
689 && GET_CODE (XEXP (*op0, 1)) == CONST_INT
690 && SCALAR_INT_MODE_P (GET_MODE (XEXP (*op0, 0))))
692 rtx inner = XEXP (*op0, 0);
693 rtx mask = XEXP (*op0, 1);
695 /* Ignore paradoxical SUBREGs if all extra bits are masked out. */
696 if (GET_CODE (inner) == SUBREG
697 && SCALAR_INT_MODE_P (GET_MODE (SUBREG_REG (inner)))
698 && (GET_MODE_SIZE (GET_MODE (inner))
699 >= GET_MODE_SIZE (GET_MODE (SUBREG_REG (inner))))
700 && ((INTVAL (mask)
701 & GET_MODE_MASK (GET_MODE (inner))
702 & ~GET_MODE_MASK (GET_MODE (SUBREG_REG (inner))))
703 == 0))
704 inner = SUBREG_REG (inner);
706 /* Do not change volatile MEMs. */
707 if (MEM_P (inner) && !MEM_VOLATILE_P (inner))
709 int part = s390_single_part (XEXP (*op0, 1),
710 GET_MODE (inner), QImode, 0);
711 if (part >= 0)
713 mask = gen_int_mode (s390_extract_part (mask, QImode, 0), QImode);
714 inner = adjust_address_nv (inner, QImode, part);
715 *op0 = gen_rtx_AND (QImode, inner, mask);
720 /* Narrow comparisons against 0xffff to HImode if possible. */
721 if ((*code == EQ || *code == NE)
722 && GET_CODE (*op1) == CONST_INT
723 && INTVAL (*op1) == 0xffff
724 && SCALAR_INT_MODE_P (GET_MODE (*op0))
725 && (nonzero_bits (*op0, GET_MODE (*op0))
726 & ~(unsigned HOST_WIDE_INT) 0xffff) == 0)
728 *op0 = gen_lowpart (HImode, *op0);
729 *op1 = constm1_rtx;
732 /* Remove redundant UNSPEC_CCU_TO_INT conversions if possible. */
733 if (GET_CODE (*op0) == UNSPEC
734 && XINT (*op0, 1) == UNSPEC_CCU_TO_INT
735 && XVECLEN (*op0, 0) == 1
736 && GET_MODE (XVECEXP (*op0, 0, 0)) == CCUmode
737 && GET_CODE (XVECEXP (*op0, 0, 0)) == REG
738 && REGNO (XVECEXP (*op0, 0, 0)) == CC_REGNUM
739 && *op1 == const0_rtx)
741 enum rtx_code new_code = UNKNOWN;
742 switch (*code)
744 case EQ: new_code = EQ; break;
745 case NE: new_code = NE; break;
746 case LT: new_code = GTU; break;
747 case GT: new_code = LTU; break;
748 case LE: new_code = GEU; break;
749 case GE: new_code = LEU; break;
750 default: break;
753 if (new_code != UNKNOWN)
755 *op0 = XVECEXP (*op0, 0, 0);
756 *code = new_code;
760 /* Remove redundant UNSPEC_CCZ_TO_INT conversions if possible. */
761 if (GET_CODE (*op0) == UNSPEC
762 && XINT (*op0, 1) == UNSPEC_CCZ_TO_INT
763 && XVECLEN (*op0, 0) == 1
764 && GET_MODE (XVECEXP (*op0, 0, 0)) == CCZmode
765 && GET_CODE (XVECEXP (*op0, 0, 0)) == REG
766 && REGNO (XVECEXP (*op0, 0, 0)) == CC_REGNUM
767 && *op1 == const0_rtx)
769 enum rtx_code new_code = UNKNOWN;
770 switch (*code)
772 case EQ: new_code = EQ; break;
773 case NE: new_code = NE; break;
774 default: break;
777 if (new_code != UNKNOWN)
779 *op0 = XVECEXP (*op0, 0, 0);
780 *code = new_code;
784 /* Simplify cascaded EQ, NE with const0_rtx. */
785 if ((*code == NE || *code == EQ)
786 && (GET_CODE (*op0) == EQ || GET_CODE (*op0) == NE)
787 && GET_MODE (*op0) == SImode
788 && GET_MODE (XEXP (*op0, 0)) == CCZ1mode
789 && REG_P (XEXP (*op0, 0))
790 && XEXP (*op0, 1) == const0_rtx
791 && *op1 == const0_rtx)
793 if ((*code == EQ && GET_CODE (*op0) == NE)
794 || (*code == NE && GET_CODE (*op0) == EQ))
795 *code = EQ;
796 else
797 *code = NE;
798 *op0 = XEXP (*op0, 0);
801 /* Prefer register over memory as first operand. */
802 if (MEM_P (*op0) && REG_P (*op1))
804 rtx tem = *op0; *op0 = *op1; *op1 = tem;
805 *code = swap_condition (*code);
809 /* Emit a compare instruction suitable to implement the comparison
810 OP0 CODE OP1. Return the correct condition RTL to be placed in
811 the IF_THEN_ELSE of the conditional branch testing the result. */
814 s390_emit_compare (enum rtx_code code, rtx op0, rtx op1)
816 enum machine_mode mode = s390_select_ccmode (code, op0, op1);
817 rtx cc;
819 /* Do not output a redundant compare instruction if a compare_and_swap
820 pattern already computed the result and the machine modes are compatible. */
821 if (GET_MODE_CLASS (GET_MODE (op0)) == MODE_CC)
823 gcc_assert (s390_cc_modes_compatible (GET_MODE (op0), mode)
824 == GET_MODE (op0));
825 cc = op0;
827 else
829 cc = gen_rtx_REG (mode, CC_REGNUM);
830 emit_insn (gen_rtx_SET (VOIDmode, cc, gen_rtx_COMPARE (mode, op0, op1)));
833 return gen_rtx_fmt_ee (code, VOIDmode, cc, const0_rtx);
836 /* Emit a SImode compare and swap instruction setting MEM to NEW_RTX if OLD
837 matches CMP.
838 Return the correct condition RTL to be placed in the IF_THEN_ELSE of the
839 conditional branch testing the result. */
841 static rtx
842 s390_emit_compare_and_swap (enum rtx_code code, rtx old, rtx mem, rtx cmp, rtx new_rtx)
844 emit_insn (gen_sync_compare_and_swapsi (old, mem, cmp, new_rtx));
845 return s390_emit_compare (code, gen_rtx_REG (CCZ1mode, CC_REGNUM), const0_rtx);
848 /* Emit a jump instruction to TARGET. If COND is NULL_RTX, emit an
849 unconditional jump, else a conditional jump under condition COND. */
851 void
852 s390_emit_jump (rtx target, rtx cond)
854 rtx insn;
856 target = gen_rtx_LABEL_REF (VOIDmode, target);
857 if (cond)
858 target = gen_rtx_IF_THEN_ELSE (VOIDmode, cond, target, pc_rtx);
860 insn = gen_rtx_SET (VOIDmode, pc_rtx, target);
861 emit_jump_insn (insn);
864 /* Return branch condition mask to implement a branch
865 specified by CODE. Return -1 for invalid comparisons. */
868 s390_branch_condition_mask (rtx code)
870 const int CC0 = 1 << 3;
871 const int CC1 = 1 << 2;
872 const int CC2 = 1 << 1;
873 const int CC3 = 1 << 0;
875 gcc_assert (GET_CODE (XEXP (code, 0)) == REG);
876 gcc_assert (REGNO (XEXP (code, 0)) == CC_REGNUM);
877 gcc_assert (XEXP (code, 1) == const0_rtx);
879 switch (GET_MODE (XEXP (code, 0)))
881 case CCZmode:
882 case CCZ1mode:
883 switch (GET_CODE (code))
885 case EQ: return CC0;
886 case NE: return CC1 | CC2 | CC3;
887 default: return -1;
889 break;
891 case CCT1mode:
892 switch (GET_CODE (code))
894 case EQ: return CC1;
895 case NE: return CC0 | CC2 | CC3;
896 default: return -1;
898 break;
900 case CCT2mode:
901 switch (GET_CODE (code))
903 case EQ: return CC2;
904 case NE: return CC0 | CC1 | CC3;
905 default: return -1;
907 break;
909 case CCT3mode:
910 switch (GET_CODE (code))
912 case EQ: return CC3;
913 case NE: return CC0 | CC1 | CC2;
914 default: return -1;
916 break;
918 case CCLmode:
919 switch (GET_CODE (code))
921 case EQ: return CC0 | CC2;
922 case NE: return CC1 | CC3;
923 default: return -1;
925 break;
927 case CCL1mode:
928 switch (GET_CODE (code))
930 case LTU: return CC2 | CC3; /* carry */
931 case GEU: return CC0 | CC1; /* no carry */
932 default: return -1;
934 break;
936 case CCL2mode:
937 switch (GET_CODE (code))
939 case GTU: return CC0 | CC1; /* borrow */
940 case LEU: return CC2 | CC3; /* no borrow */
941 default: return -1;
943 break;
945 case CCL3mode:
946 switch (GET_CODE (code))
948 case EQ: return CC0 | CC2;
949 case NE: return CC1 | CC3;
950 case LTU: return CC1;
951 case GTU: return CC3;
952 case LEU: return CC1 | CC2;
953 case GEU: return CC2 | CC3;
954 default: return -1;
957 case CCUmode:
958 switch (GET_CODE (code))
960 case EQ: return CC0;
961 case NE: return CC1 | CC2 | CC3;
962 case LTU: return CC1;
963 case GTU: return CC2;
964 case LEU: return CC0 | CC1;
965 case GEU: return CC0 | CC2;
966 default: return -1;
968 break;
970 case CCURmode:
971 switch (GET_CODE (code))
973 case EQ: return CC0;
974 case NE: return CC2 | CC1 | CC3;
975 case LTU: return CC2;
976 case GTU: return CC1;
977 case LEU: return CC0 | CC2;
978 case GEU: return CC0 | CC1;
979 default: return -1;
981 break;
983 case CCAPmode:
984 switch (GET_CODE (code))
986 case EQ: return CC0;
987 case NE: return CC1 | CC2 | CC3;
988 case LT: return CC1 | CC3;
989 case GT: return CC2;
990 case LE: return CC0 | CC1 | CC3;
991 case GE: return CC0 | CC2;
992 default: return -1;
994 break;
996 case CCANmode:
997 switch (GET_CODE (code))
999 case EQ: return CC0;
1000 case NE: return CC1 | CC2 | CC3;
1001 case LT: return CC1;
1002 case GT: return CC2 | CC3;
1003 case LE: return CC0 | CC1;
1004 case GE: return CC0 | CC2 | CC3;
1005 default: return -1;
1007 break;
1009 case CCSmode:
1010 switch (GET_CODE (code))
1012 case EQ: return CC0;
1013 case NE: return CC1 | CC2 | CC3;
1014 case LT: return CC1;
1015 case GT: return CC2;
1016 case LE: return CC0 | CC1;
1017 case GE: return CC0 | CC2;
1018 case UNORDERED: return CC3;
1019 case ORDERED: return CC0 | CC1 | CC2;
1020 case UNEQ: return CC0 | CC3;
1021 case UNLT: return CC1 | CC3;
1022 case UNGT: return CC2 | CC3;
1023 case UNLE: return CC0 | CC1 | CC3;
1024 case UNGE: return CC0 | CC2 | CC3;
1025 case LTGT: return CC1 | CC2;
1026 default: return -1;
1028 break;
1030 case CCSRmode:
1031 switch (GET_CODE (code))
1033 case EQ: return CC0;
1034 case NE: return CC2 | CC1 | CC3;
1035 case LT: return CC2;
1036 case GT: return CC1;
1037 case LE: return CC0 | CC2;
1038 case GE: return CC0 | CC1;
1039 case UNORDERED: return CC3;
1040 case ORDERED: return CC0 | CC2 | CC1;
1041 case UNEQ: return CC0 | CC3;
1042 case UNLT: return CC2 | CC3;
1043 case UNGT: return CC1 | CC3;
1044 case UNLE: return CC0 | CC2 | CC3;
1045 case UNGE: return CC0 | CC1 | CC3;
1046 case LTGT: return CC2 | CC1;
1047 default: return -1;
1049 break;
1051 default:
1052 return -1;
1057 /* Return branch condition mask to implement a compare and branch
1058 specified by CODE. Return -1 for invalid comparisons. */
1061 s390_compare_and_branch_condition_mask (rtx code)
1063 const int CC0 = 1 << 3;
1064 const int CC1 = 1 << 2;
1065 const int CC2 = 1 << 1;
1067 switch (GET_CODE (code))
1069 case EQ:
1070 return CC0;
1071 case NE:
1072 return CC1 | CC2;
1073 case LT:
1074 case LTU:
1075 return CC1;
1076 case GT:
1077 case GTU:
1078 return CC2;
1079 case LE:
1080 case LEU:
1081 return CC0 | CC1;
1082 case GE:
1083 case GEU:
1084 return CC0 | CC2;
1085 default:
1086 gcc_unreachable ();
1088 return -1;
1091 /* If INV is false, return assembler mnemonic string to implement
1092 a branch specified by CODE. If INV is true, return mnemonic
1093 for the corresponding inverted branch. */
1095 static const char *
1096 s390_branch_condition_mnemonic (rtx code, int inv)
1098 int mask;
1100 static const char *const mnemonic[16] =
1102 NULL, "o", "h", "nle",
1103 "l", "nhe", "lh", "ne",
1104 "e", "nlh", "he", "nl",
1105 "le", "nh", "no", NULL
1108 if (GET_CODE (XEXP (code, 0)) == REG
1109 && REGNO (XEXP (code, 0)) == CC_REGNUM
1110 && XEXP (code, 1) == const0_rtx)
1111 mask = s390_branch_condition_mask (code);
1112 else
1113 mask = s390_compare_and_branch_condition_mask (code);
1115 gcc_assert (mask >= 0);
1117 if (inv)
1118 mask ^= 15;
1120 gcc_assert (mask >= 1 && mask <= 14);
1122 return mnemonic[mask];
1125 /* Return the part of op which has a value different from def.
1126 The size of the part is determined by mode.
1127 Use this function only if you already know that op really
1128 contains such a part. */
1130 unsigned HOST_WIDE_INT
1131 s390_extract_part (rtx op, enum machine_mode mode, int def)
1133 unsigned HOST_WIDE_INT value = 0;
1134 int max_parts = HOST_BITS_PER_WIDE_INT / GET_MODE_BITSIZE (mode);
1135 int part_bits = GET_MODE_BITSIZE (mode);
1136 unsigned HOST_WIDE_INT part_mask
1137 = ((unsigned HOST_WIDE_INT)1 << part_bits) - 1;
1138 int i;
1140 for (i = 0; i < max_parts; i++)
1142 if (i == 0)
1143 value = (unsigned HOST_WIDE_INT) INTVAL (op);
1144 else
1145 value >>= part_bits;
1147 if ((value & part_mask) != (def & part_mask))
1148 return value & part_mask;
1151 gcc_unreachable ();
1154 /* If OP is an integer constant of mode MODE with exactly one
1155 part of mode PART_MODE unequal to DEF, return the number of that
1156 part. Otherwise, return -1. */
1159 s390_single_part (rtx op,
1160 enum machine_mode mode,
1161 enum machine_mode part_mode,
1162 int def)
1164 unsigned HOST_WIDE_INT value = 0;
1165 int n_parts = GET_MODE_SIZE (mode) / GET_MODE_SIZE (part_mode);
1166 unsigned HOST_WIDE_INT part_mask
1167 = ((unsigned HOST_WIDE_INT)1 << GET_MODE_BITSIZE (part_mode)) - 1;
1168 int i, part = -1;
1170 if (GET_CODE (op) != CONST_INT)
1171 return -1;
1173 for (i = 0; i < n_parts; i++)
1175 if (i == 0)
1176 value = (unsigned HOST_WIDE_INT) INTVAL (op);
1177 else
1178 value >>= GET_MODE_BITSIZE (part_mode);
1180 if ((value & part_mask) != (def & part_mask))
1182 if (part != -1)
1183 return -1;
1184 else
1185 part = i;
1188 return part == -1 ? -1 : n_parts - 1 - part;
1191 /* Return true if IN contains a contiguous bitfield in the lower SIZE
1192 bits and no other bits are set in IN. POS and LENGTH can be used
1193 to obtain the start position and the length of the bitfield.
1195 POS gives the position of the first bit of the bitfield counting
1196 from the lowest order bit starting with zero. In order to use this
1197 value for S/390 instructions this has to be converted to "bits big
1198 endian" style. */
1200 bool
1201 s390_contiguous_bitmask_p (unsigned HOST_WIDE_INT in, int size,
1202 int *pos, int *length)
1204 int tmp_pos = 0;
1205 int tmp_length = 0;
1206 int i;
1207 unsigned HOST_WIDE_INT mask = 1ULL;
1208 bool contiguous = false;
1210 for (i = 0; i < size; mask <<= 1, i++)
1212 if (contiguous)
1214 if (mask & in)
1215 tmp_length++;
1216 else
1217 break;
1219 else
1221 if (mask & in)
1223 contiguous = true;
1224 tmp_length++;
1226 else
1227 tmp_pos++;
1231 if (!tmp_length)
1232 return false;
1234 /* Calculate a mask for all bits beyond the contiguous bits. */
1235 mask = (-1LL & ~(((1ULL << (tmp_length + tmp_pos - 1)) << 1) - 1));
1237 if (mask & in)
1238 return false;
1240 if (tmp_length + tmp_pos - 1 > size)
1241 return false;
1243 if (length)
1244 *length = tmp_length;
1246 if (pos)
1247 *pos = tmp_pos;
1249 return true;
1252 /* Check whether we can (and want to) split a double-word
1253 move in mode MODE from SRC to DST into two single-word
1254 moves, moving the subword FIRST_SUBWORD first. */
1256 bool
1257 s390_split_ok_p (rtx dst, rtx src, enum machine_mode mode, int first_subword)
1259 /* Floating point registers cannot be split. */
1260 if (FP_REG_P (src) || FP_REG_P (dst))
1261 return false;
1263 /* We don't need to split if operands are directly accessible. */
1264 if (s_operand (src, mode) || s_operand (dst, mode))
1265 return false;
1267 /* Non-offsettable memory references cannot be split. */
1268 if ((GET_CODE (src) == MEM && !offsettable_memref_p (src))
1269 || (GET_CODE (dst) == MEM && !offsettable_memref_p (dst)))
1270 return false;
1272 /* Moving the first subword must not clobber a register
1273 needed to move the second subword. */
1274 if (register_operand (dst, mode))
1276 rtx subreg = operand_subword (dst, first_subword, 0, mode);
1277 if (reg_overlap_mentioned_p (subreg, src))
1278 return false;
1281 return true;
1284 /* Return true if it can be proven that [MEM1, MEM1 + SIZE]
1285 and [MEM2, MEM2 + SIZE] do overlap and false
1286 otherwise. */
1288 bool
1289 s390_overlap_p (rtx mem1, rtx mem2, HOST_WIDE_INT size)
1291 rtx addr1, addr2, addr_delta;
1292 HOST_WIDE_INT delta;
1294 if (GET_CODE (mem1) != MEM || GET_CODE (mem2) != MEM)
1295 return true;
1297 if (size == 0)
1298 return false;
1300 addr1 = XEXP (mem1, 0);
1301 addr2 = XEXP (mem2, 0);
1303 addr_delta = simplify_binary_operation (MINUS, Pmode, addr2, addr1);
1305 /* This overlapping check is used by peepholes merging memory block operations.
1306 Overlapping operations would otherwise be recognized by the S/390 hardware
1307 and would fall back to a slower implementation. Allowing overlapping
1308 operations would lead to slow code but not to wrong code. Therefore we are
1309 somewhat optimistic if we cannot prove that the memory blocks are
1310 overlapping.
1311 That's why we return false here although this may accept operations on
1312 overlapping memory areas. */
1313 if (!addr_delta || GET_CODE (addr_delta) != CONST_INT)
1314 return false;
1316 delta = INTVAL (addr_delta);
1318 if (delta == 0
1319 || (delta > 0 && delta < size)
1320 || (delta < 0 && -delta < size))
1321 return true;
1323 return false;
1326 /* Check whether the address of memory reference MEM2 equals exactly
1327 the address of memory reference MEM1 plus DELTA. Return true if
1328 we can prove this to be the case, false otherwise. */
1330 bool
1331 s390_offset_p (rtx mem1, rtx mem2, rtx delta)
1333 rtx addr1, addr2, addr_delta;
1335 if (GET_CODE (mem1) != MEM || GET_CODE (mem2) != MEM)
1336 return false;
1338 addr1 = XEXP (mem1, 0);
1339 addr2 = XEXP (mem2, 0);
1341 addr_delta = simplify_binary_operation (MINUS, Pmode, addr2, addr1);
1342 if (!addr_delta || !rtx_equal_p (addr_delta, delta))
1343 return false;
1345 return true;
1348 /* Expand logical operator CODE in mode MODE with operands OPERANDS. */
1350 void
1351 s390_expand_logical_operator (enum rtx_code code, enum machine_mode mode,
1352 rtx *operands)
1354 enum machine_mode wmode = mode;
1355 rtx dst = operands[0];
1356 rtx src1 = operands[1];
1357 rtx src2 = operands[2];
1358 rtx op, clob, tem;
1360 /* If we cannot handle the operation directly, use a temp register. */
1361 if (!s390_logical_operator_ok_p (operands))
1362 dst = gen_reg_rtx (mode);
1364 /* QImode and HImode patterns make sense only if we have a destination
1365 in memory. Otherwise perform the operation in SImode. */
1366 if ((mode == QImode || mode == HImode) && GET_CODE (dst) != MEM)
1367 wmode = SImode;
1369 /* Widen operands if required. */
1370 if (mode != wmode)
1372 if (GET_CODE (dst) == SUBREG
1373 && (tem = simplify_subreg (wmode, dst, mode, 0)) != 0)
1374 dst = tem;
1375 else if (REG_P (dst))
1376 dst = gen_rtx_SUBREG (wmode, dst, 0);
1377 else
1378 dst = gen_reg_rtx (wmode);
1380 if (GET_CODE (src1) == SUBREG
1381 && (tem = simplify_subreg (wmode, src1, mode, 0)) != 0)
1382 src1 = tem;
1383 else if (GET_MODE (src1) != VOIDmode)
1384 src1 = gen_rtx_SUBREG (wmode, force_reg (mode, src1), 0);
1386 if (GET_CODE (src2) == SUBREG
1387 && (tem = simplify_subreg (wmode, src2, mode, 0)) != 0)
1388 src2 = tem;
1389 else if (GET_MODE (src2) != VOIDmode)
1390 src2 = gen_rtx_SUBREG (wmode, force_reg (mode, src2), 0);
1393 /* Emit the instruction. */
1394 op = gen_rtx_SET (VOIDmode, dst, gen_rtx_fmt_ee (code, wmode, src1, src2));
1395 clob = gen_rtx_CLOBBER (VOIDmode, gen_rtx_REG (CCmode, CC_REGNUM));
1396 emit_insn (gen_rtx_PARALLEL (VOIDmode, gen_rtvec (2, op, clob)));
1398 /* Fix up the destination if needed. */
1399 if (dst != operands[0])
1400 emit_move_insn (operands[0], gen_lowpart (mode, dst));
1403 /* Check whether OPERANDS are OK for a logical operation (AND, IOR, XOR). */
1405 bool
1406 s390_logical_operator_ok_p (rtx *operands)
1408 /* If the destination operand is in memory, it needs to coincide
1409 with one of the source operands. After reload, it has to be
1410 the first source operand. */
1411 if (GET_CODE (operands[0]) == MEM)
1412 return rtx_equal_p (operands[0], operands[1])
1413 || (!reload_completed && rtx_equal_p (operands[0], operands[2]));
1415 return true;
1418 /* Narrow logical operation CODE of memory operand MEMOP with immediate
1419 operand IMMOP to switch from SS to SI type instructions. */
1421 void
1422 s390_narrow_logical_operator (enum rtx_code code, rtx *memop, rtx *immop)
1424 int def = code == AND ? -1 : 0;
1425 HOST_WIDE_INT mask;
1426 int part;
1428 gcc_assert (GET_CODE (*memop) == MEM);
1429 gcc_assert (!MEM_VOLATILE_P (*memop));
1431 mask = s390_extract_part (*immop, QImode, def);
1432 part = s390_single_part (*immop, GET_MODE (*memop), QImode, def);
1433 gcc_assert (part >= 0);
1435 *memop = adjust_address (*memop, QImode, part);
1436 *immop = gen_int_mode (mask, QImode);
1440 /* How to allocate a 'struct machine_function'. */
1442 static struct machine_function *
1443 s390_init_machine_status (void)
1445 return GGC_CNEW (struct machine_function);
1448 /* Change optimizations to be performed, depending on the
1449 optimization level.
1451 LEVEL is the optimization level specified; 2 if `-O2' is
1452 specified, 1 if `-O' is specified, and 0 if neither is specified.
1454 SIZE is nonzero if `-Os' is specified and zero otherwise. */
1456 void
1457 optimization_options (int level ATTRIBUTE_UNUSED, int size ATTRIBUTE_UNUSED)
1459 /* ??? There are apparently still problems with -fcaller-saves. */
1460 flag_caller_saves = 0;
1462 /* By default, always emit DWARF-2 unwind info. This allows debugging
1463 without maintaining a stack frame back-chain. */
1464 flag_asynchronous_unwind_tables = 1;
1466 /* Use MVCLE instructions to decrease code size if requested. */
1467 if (size != 0)
1468 target_flags |= MASK_MVCLE;
1471 /* Return true if ARG is the name of a processor. Set *TYPE and *FLAGS
1472 to the associated processor_type and processor_flags if so. */
1474 static bool
1475 s390_handle_arch_option (const char *arg,
1476 enum processor_type *type,
1477 int *flags)
1479 static struct pta
1481 const char *const name; /* processor name or nickname. */
1482 const enum processor_type processor;
1483 const int flags; /* From enum processor_flags. */
1485 const processor_alias_table[] =
1487 {"g5", PROCESSOR_9672_G5, PF_IEEE_FLOAT},
1488 {"g6", PROCESSOR_9672_G6, PF_IEEE_FLOAT},
1489 {"z900", PROCESSOR_2064_Z900, PF_IEEE_FLOAT | PF_ZARCH},
1490 {"z990", PROCESSOR_2084_Z990, PF_IEEE_FLOAT | PF_ZARCH
1491 | PF_LONG_DISPLACEMENT},
1492 {"z9-109", PROCESSOR_2094_Z9_109, PF_IEEE_FLOAT | PF_ZARCH
1493 | PF_LONG_DISPLACEMENT | PF_EXTIMM},
1494 {"z9-ec", PROCESSOR_2094_Z9_109, PF_IEEE_FLOAT | PF_ZARCH
1495 | PF_LONG_DISPLACEMENT | PF_EXTIMM | PF_DFP },
1496 {"z10", PROCESSOR_2097_Z10, PF_IEEE_FLOAT | PF_ZARCH
1497 | PF_LONG_DISPLACEMENT | PF_EXTIMM | PF_DFP | PF_Z10},
1499 size_t i;
1501 for (i = 0; i < ARRAY_SIZE (processor_alias_table); i++)
1502 if (strcmp (arg, processor_alias_table[i].name) == 0)
1504 *type = processor_alias_table[i].processor;
1505 *flags = processor_alias_table[i].flags;
1506 return true;
1508 return false;
1511 /* Implement TARGET_HANDLE_OPTION. */
1513 static bool
1514 s390_handle_option (size_t code, const char *arg, int value ATTRIBUTE_UNUSED)
1516 switch (code)
1518 case OPT_march_:
1519 return s390_handle_arch_option (arg, &s390_arch, &s390_arch_flags);
1521 case OPT_mstack_guard_:
1522 if (sscanf (arg, HOST_WIDE_INT_PRINT_DEC, &s390_stack_guard) != 1)
1523 return false;
1524 if (exact_log2 (s390_stack_guard) == -1)
1525 error ("stack guard value must be an exact power of 2");
1526 return true;
1528 case OPT_mstack_size_:
1529 if (sscanf (arg, HOST_WIDE_INT_PRINT_DEC, &s390_stack_size) != 1)
1530 return false;
1531 if (exact_log2 (s390_stack_size) == -1)
1532 error ("stack size must be an exact power of 2");
1533 return true;
1535 case OPT_mtune_:
1536 return s390_handle_arch_option (arg, &s390_tune, &s390_tune_flags);
1538 case OPT_mwarn_framesize_:
1539 return sscanf (arg, HOST_WIDE_INT_PRINT_DEC, &s390_warn_framesize) == 1;
1541 default:
1542 return true;
1546 void
1547 override_options (void)
1549 /* Set up function hooks. */
1550 init_machine_status = s390_init_machine_status;
1552 /* Architecture mode defaults according to ABI. */
1553 if (!(target_flags_explicit & MASK_ZARCH))
1555 if (TARGET_64BIT)
1556 target_flags |= MASK_ZARCH;
1557 else
1558 target_flags &= ~MASK_ZARCH;
1561 /* Determine processor architectural level. */
1562 if (!s390_arch_string)
1564 s390_arch_string = TARGET_ZARCH? "z900" : "g5";
1565 s390_handle_arch_option (s390_arch_string, &s390_arch, &s390_arch_flags);
1568 /* Determine processor to tune for. */
1569 if (s390_tune == PROCESSOR_max)
1571 s390_tune = s390_arch;
1572 s390_tune_flags = s390_arch_flags;
1575 /* Sanity checks. */
1576 if (TARGET_ZARCH && !TARGET_CPU_ZARCH)
1577 error ("z/Architecture mode not supported on %s", s390_arch_string);
1578 if (TARGET_64BIT && !TARGET_ZARCH)
1579 error ("64-bit ABI not supported in ESA/390 mode");
1581 if (TARGET_HARD_DFP && !TARGET_DFP)
1583 if (target_flags_explicit & MASK_HARD_DFP)
1585 if (!TARGET_CPU_DFP)
1586 error ("Hardware decimal floating point instructions"
1587 " not available on %s", s390_arch_string);
1588 if (!TARGET_ZARCH)
1589 error ("Hardware decimal floating point instructions"
1590 " not available in ESA/390 mode");
1592 else
1593 target_flags &= ~MASK_HARD_DFP;
1596 if ((target_flags_explicit & MASK_SOFT_FLOAT) && TARGET_SOFT_FLOAT)
1598 if ((target_flags_explicit & MASK_HARD_DFP) && TARGET_HARD_DFP)
1599 error ("-mhard-dfp can't be used in conjunction with -msoft-float");
1601 target_flags &= ~MASK_HARD_DFP;
1604 /* Set processor cost function. */
1605 switch (s390_tune)
1607 case PROCESSOR_2084_Z990:
1608 s390_cost = &z990_cost;
1609 break;
1610 case PROCESSOR_2094_Z9_109:
1611 s390_cost = &z9_109_cost;
1612 break;
1613 case PROCESSOR_2097_Z10:
1614 s390_cost = &z10_cost;
1615 break;
1616 default:
1617 s390_cost = &z900_cost;
1620 if (TARGET_BACKCHAIN && TARGET_PACKED_STACK && TARGET_HARD_FLOAT)
1621 error ("-mbackchain -mpacked-stack -mhard-float are not supported "
1622 "in combination");
1624 if (s390_stack_size)
1626 if (s390_stack_guard >= s390_stack_size)
1627 error ("stack size must be greater than the stack guard value");
1628 else if (s390_stack_size > 1 << 16)
1629 error ("stack size must not be greater than 64k");
1631 else if (s390_stack_guard)
1632 error ("-mstack-guard implies use of -mstack-size");
1634 #ifdef TARGET_DEFAULT_LONG_DOUBLE_128
1635 if (!(target_flags_explicit & MASK_LONG_DOUBLE_128))
1636 target_flags |= MASK_LONG_DOUBLE_128;
1637 #endif
1639 if (s390_tune == PROCESSOR_2097_Z10
1640 && !PARAM_SET_P (PARAM_MAX_UNROLLED_INSNS))
1641 set_param_value ("max-unrolled-insns", 100);
1643 set_param_value ("max-pending-list-length", 256);
1647 /* Map for smallest class containing reg regno. */
1649 const enum reg_class regclass_map[FIRST_PSEUDO_REGISTER] =
1650 { GENERAL_REGS, ADDR_REGS, ADDR_REGS, ADDR_REGS,
1651 ADDR_REGS, ADDR_REGS, ADDR_REGS, ADDR_REGS,
1652 ADDR_REGS, ADDR_REGS, ADDR_REGS, ADDR_REGS,
1653 ADDR_REGS, ADDR_REGS, ADDR_REGS, ADDR_REGS,
1654 FP_REGS, FP_REGS, FP_REGS, FP_REGS,
1655 FP_REGS, FP_REGS, FP_REGS, FP_REGS,
1656 FP_REGS, FP_REGS, FP_REGS, FP_REGS,
1657 FP_REGS, FP_REGS, FP_REGS, FP_REGS,
1658 ADDR_REGS, CC_REGS, ADDR_REGS, ADDR_REGS,
1659 ACCESS_REGS, ACCESS_REGS
1662 /* Return attribute type of insn. */
1664 static enum attr_type
1665 s390_safe_attr_type (rtx insn)
1667 if (recog_memoized (insn) >= 0)
1668 return get_attr_type (insn);
1669 else
1670 return TYPE_NONE;
1673 /* Return true if DISP is a valid short displacement. */
1675 static bool
1676 s390_short_displacement (rtx disp)
1678 /* No displacement is OK. */
1679 if (!disp)
1680 return true;
1682 /* Without the long displacement facility we don't need to
1683 distingiush between long and short displacement. */
1684 if (!TARGET_LONG_DISPLACEMENT)
1685 return true;
1687 /* Integer displacement in range. */
1688 if (GET_CODE (disp) == CONST_INT)
1689 return INTVAL (disp) >= 0 && INTVAL (disp) < 4096;
1691 /* GOT offset is not OK, the GOT can be large. */
1692 if (GET_CODE (disp) == CONST
1693 && GET_CODE (XEXP (disp, 0)) == UNSPEC
1694 && (XINT (XEXP (disp, 0), 1) == UNSPEC_GOT
1695 || XINT (XEXP (disp, 0), 1) == UNSPEC_GOTNTPOFF))
1696 return false;
1698 /* All other symbolic constants are literal pool references,
1699 which are OK as the literal pool must be small. */
1700 if (GET_CODE (disp) == CONST)
1701 return true;
1703 return false;
1706 /* Decompose a RTL expression ADDR for a memory address into
1707 its components, returned in OUT.
1709 Returns false if ADDR is not a valid memory address, true
1710 otherwise. If OUT is NULL, don't return the components,
1711 but check for validity only.
1713 Note: Only addresses in canonical form are recognized.
1714 LEGITIMIZE_ADDRESS should convert non-canonical forms to the
1715 canonical form so that they will be recognized. */
1717 static int
1718 s390_decompose_address (rtx addr, struct s390_address *out)
1720 HOST_WIDE_INT offset = 0;
1721 rtx base = NULL_RTX;
1722 rtx indx = NULL_RTX;
1723 rtx disp = NULL_RTX;
1724 rtx orig_disp;
1725 bool pointer = false;
1726 bool base_ptr = false;
1727 bool indx_ptr = false;
1728 bool literal_pool = false;
1730 /* We may need to substitute the literal pool base register into the address
1731 below. However, at this point we do not know which register is going to
1732 be used as base, so we substitute the arg pointer register. This is going
1733 to be treated as holding a pointer below -- it shouldn't be used for any
1734 other purpose. */
1735 rtx fake_pool_base = gen_rtx_REG (Pmode, ARG_POINTER_REGNUM);
1737 /* Decompose address into base + index + displacement. */
1739 if (GET_CODE (addr) == REG || GET_CODE (addr) == UNSPEC)
1740 base = addr;
1742 else if (GET_CODE (addr) == PLUS)
1744 rtx op0 = XEXP (addr, 0);
1745 rtx op1 = XEXP (addr, 1);
1746 enum rtx_code code0 = GET_CODE (op0);
1747 enum rtx_code code1 = GET_CODE (op1);
1749 if (code0 == REG || code0 == UNSPEC)
1751 if (code1 == REG || code1 == UNSPEC)
1753 indx = op0; /* index + base */
1754 base = op1;
1757 else
1759 base = op0; /* base + displacement */
1760 disp = op1;
1764 else if (code0 == PLUS)
1766 indx = XEXP (op0, 0); /* index + base + disp */
1767 base = XEXP (op0, 1);
1768 disp = op1;
1771 else
1773 return false;
1777 else
1778 disp = addr; /* displacement */
1780 /* Extract integer part of displacement. */
1781 orig_disp = disp;
1782 if (disp)
1784 if (GET_CODE (disp) == CONST_INT)
1786 offset = INTVAL (disp);
1787 disp = NULL_RTX;
1789 else if (GET_CODE (disp) == CONST
1790 && GET_CODE (XEXP (disp, 0)) == PLUS
1791 && GET_CODE (XEXP (XEXP (disp, 0), 1)) == CONST_INT)
1793 offset = INTVAL (XEXP (XEXP (disp, 0), 1));
1794 disp = XEXP (XEXP (disp, 0), 0);
1798 /* Strip off CONST here to avoid special case tests later. */
1799 if (disp && GET_CODE (disp) == CONST)
1800 disp = XEXP (disp, 0);
1802 /* We can convert literal pool addresses to
1803 displacements by basing them off the base register. */
1804 if (disp && GET_CODE (disp) == SYMBOL_REF && CONSTANT_POOL_ADDRESS_P (disp))
1806 /* Either base or index must be free to hold the base register. */
1807 if (!base)
1808 base = fake_pool_base, literal_pool = true;
1809 else if (!indx)
1810 indx = fake_pool_base, literal_pool = true;
1811 else
1812 return false;
1814 /* Mark up the displacement. */
1815 disp = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, disp),
1816 UNSPEC_LTREL_OFFSET);
1819 /* Validate base register. */
1820 if (base)
1822 if (GET_CODE (base) == UNSPEC)
1823 switch (XINT (base, 1))
1825 case UNSPEC_LTREF:
1826 if (!disp)
1827 disp = gen_rtx_UNSPEC (Pmode,
1828 gen_rtvec (1, XVECEXP (base, 0, 0)),
1829 UNSPEC_LTREL_OFFSET);
1830 else
1831 return false;
1833 base = XVECEXP (base, 0, 1);
1834 break;
1836 case UNSPEC_LTREL_BASE:
1837 if (XVECLEN (base, 0) == 1)
1838 base = fake_pool_base, literal_pool = true;
1839 else
1840 base = XVECEXP (base, 0, 1);
1841 break;
1843 default:
1844 return false;
1847 if (!REG_P (base)
1848 || (GET_MODE (base) != SImode
1849 && GET_MODE (base) != Pmode))
1850 return false;
1852 if (REGNO (base) == STACK_POINTER_REGNUM
1853 || REGNO (base) == FRAME_POINTER_REGNUM
1854 || ((reload_completed || reload_in_progress)
1855 && frame_pointer_needed
1856 && REGNO (base) == HARD_FRAME_POINTER_REGNUM)
1857 || REGNO (base) == ARG_POINTER_REGNUM
1858 || (flag_pic
1859 && REGNO (base) == PIC_OFFSET_TABLE_REGNUM))
1860 pointer = base_ptr = true;
1862 if ((reload_completed || reload_in_progress)
1863 && base == cfun->machine->base_reg)
1864 pointer = base_ptr = literal_pool = true;
1867 /* Validate index register. */
1868 if (indx)
1870 if (GET_CODE (indx) == UNSPEC)
1871 switch (XINT (indx, 1))
1873 case UNSPEC_LTREF:
1874 if (!disp)
1875 disp = gen_rtx_UNSPEC (Pmode,
1876 gen_rtvec (1, XVECEXP (indx, 0, 0)),
1877 UNSPEC_LTREL_OFFSET);
1878 else
1879 return false;
1881 indx = XVECEXP (indx, 0, 1);
1882 break;
1884 case UNSPEC_LTREL_BASE:
1885 if (XVECLEN (indx, 0) == 1)
1886 indx = fake_pool_base, literal_pool = true;
1887 else
1888 indx = XVECEXP (indx, 0, 1);
1889 break;
1891 default:
1892 return false;
1895 if (!REG_P (indx)
1896 || (GET_MODE (indx) != SImode
1897 && GET_MODE (indx) != Pmode))
1898 return false;
1900 if (REGNO (indx) == STACK_POINTER_REGNUM
1901 || REGNO (indx) == FRAME_POINTER_REGNUM
1902 || ((reload_completed || reload_in_progress)
1903 && frame_pointer_needed
1904 && REGNO (indx) == HARD_FRAME_POINTER_REGNUM)
1905 || REGNO (indx) == ARG_POINTER_REGNUM
1906 || (flag_pic
1907 && REGNO (indx) == PIC_OFFSET_TABLE_REGNUM))
1908 pointer = indx_ptr = true;
1910 if ((reload_completed || reload_in_progress)
1911 && indx == cfun->machine->base_reg)
1912 pointer = indx_ptr = literal_pool = true;
1915 /* Prefer to use pointer as base, not index. */
1916 if (base && indx && !base_ptr
1917 && (indx_ptr || (!REG_POINTER (base) && REG_POINTER (indx))))
1919 rtx tmp = base;
1920 base = indx;
1921 indx = tmp;
1924 /* Validate displacement. */
1925 if (!disp)
1927 /* If virtual registers are involved, the displacement will change later
1928 anyway as the virtual registers get eliminated. This could make a
1929 valid displacement invalid, but it is more likely to make an invalid
1930 displacement valid, because we sometimes access the register save area
1931 via negative offsets to one of those registers.
1932 Thus we don't check the displacement for validity here. If after
1933 elimination the displacement turns out to be invalid after all,
1934 this is fixed up by reload in any case. */
1935 if (base != arg_pointer_rtx
1936 && indx != arg_pointer_rtx
1937 && base != return_address_pointer_rtx
1938 && indx != return_address_pointer_rtx
1939 && base != frame_pointer_rtx
1940 && indx != frame_pointer_rtx
1941 && base != virtual_stack_vars_rtx
1942 && indx != virtual_stack_vars_rtx)
1943 if (!DISP_IN_RANGE (offset))
1944 return false;
1946 else
1948 /* All the special cases are pointers. */
1949 pointer = true;
1951 /* In the small-PIC case, the linker converts @GOT
1952 and @GOTNTPOFF offsets to possible displacements. */
1953 if (GET_CODE (disp) == UNSPEC
1954 && (XINT (disp, 1) == UNSPEC_GOT
1955 || XINT (disp, 1) == UNSPEC_GOTNTPOFF)
1956 && flag_pic == 1)
1961 /* Accept pool label offsets. */
1962 else if (GET_CODE (disp) == UNSPEC
1963 && XINT (disp, 1) == UNSPEC_POOL_OFFSET)
1966 /* Accept literal pool references. */
1967 else if (GET_CODE (disp) == UNSPEC
1968 && XINT (disp, 1) == UNSPEC_LTREL_OFFSET)
1970 orig_disp = gen_rtx_CONST (Pmode, disp);
1971 if (offset)
1973 /* If we have an offset, make sure it does not
1974 exceed the size of the constant pool entry. */
1975 rtx sym = XVECEXP (disp, 0, 0);
1976 if (offset >= GET_MODE_SIZE (get_pool_mode (sym)))
1977 return false;
1979 orig_disp = plus_constant (orig_disp, offset);
1983 else
1984 return false;
1987 if (!base && !indx)
1988 pointer = true;
1990 if (out)
1992 out->base = base;
1993 out->indx = indx;
1994 out->disp = orig_disp;
1995 out->pointer = pointer;
1996 out->literal_pool = literal_pool;
1999 return true;
2002 /* Decompose a RTL expression OP for a shift count into its components,
2003 and return the base register in BASE and the offset in OFFSET.
2005 Return true if OP is a valid shift count, false if not. */
2007 bool
2008 s390_decompose_shift_count (rtx op, rtx *base, HOST_WIDE_INT *offset)
2010 HOST_WIDE_INT off = 0;
2012 /* We can have an integer constant, an address register,
2013 or a sum of the two. */
2014 if (GET_CODE (op) == CONST_INT)
2016 off = INTVAL (op);
2017 op = NULL_RTX;
2019 if (op && GET_CODE (op) == PLUS && GET_CODE (XEXP (op, 1)) == CONST_INT)
2021 off = INTVAL (XEXP (op, 1));
2022 op = XEXP (op, 0);
2024 while (op && GET_CODE (op) == SUBREG)
2025 op = SUBREG_REG (op);
2027 if (op && GET_CODE (op) != REG)
2028 return false;
2030 if (offset)
2031 *offset = off;
2032 if (base)
2033 *base = op;
2035 return true;
2039 /* Return true if CODE is a valid address without index. */
2041 bool
2042 s390_legitimate_address_without_index_p (rtx op)
2044 struct s390_address addr;
2046 if (!s390_decompose_address (XEXP (op, 0), &addr))
2047 return false;
2048 if (addr.indx)
2049 return false;
2051 return true;
2055 /* Return true if ADDR is of kind symbol_ref or symbol_ref + const_int
2056 and return these parts in SYMREF and ADDEND. You can pass NULL in
2057 SYMREF and/or ADDEND if you are not interested in these values. */
2059 static bool
2060 s390_symref_operand_p (rtx addr, rtx *symref, HOST_WIDE_INT *addend)
2062 HOST_WIDE_INT tmpaddend = 0;
2064 if (GET_CODE (addr) == CONST)
2065 addr = XEXP (addr, 0);
2067 if (GET_CODE (addr) == PLUS)
2069 if (GET_CODE (XEXP (addr, 0)) == SYMBOL_REF
2070 && CONST_INT_P (XEXP (addr, 1)))
2072 tmpaddend = INTVAL (XEXP (addr, 1));
2073 addr = XEXP (addr, 0);
2075 else
2076 return false;
2078 else
2079 if (GET_CODE (addr) != SYMBOL_REF)
2080 return false;
2082 if (symref)
2083 *symref = addr;
2084 if (addend)
2085 *addend = tmpaddend;
2087 return true;
2091 /* Return true if the address in OP is valid for constraint letter C
2092 if wrapped in a MEM rtx. Set LIT_POOL_OK to true if it literal
2093 pool MEMs should be accepted. Only the Q, R, S, T constraint
2094 letters are allowed for C. */
2096 static int
2097 s390_check_qrst_address (char c, rtx op, bool lit_pool_ok)
2099 struct s390_address addr;
2100 bool decomposed = false;
2102 /* This check makes sure that no symbolic address (except literal
2103 pool references) are accepted by the R or T constraints. */
2104 if (s390_symref_operand_p (op, NULL, NULL))
2106 if (!lit_pool_ok)
2107 return 0;
2108 if (!s390_decompose_address (op, &addr))
2109 return 0;
2110 if (!addr.literal_pool)
2111 return 0;
2112 decomposed = true;
2115 switch (c)
2117 case 'Q': /* no index short displacement */
2118 if (!decomposed && !s390_decompose_address (op, &addr))
2119 return 0;
2120 if (addr.indx)
2121 return 0;
2122 if (!s390_short_displacement (addr.disp))
2123 return 0;
2124 break;
2126 case 'R': /* with index short displacement */
2127 if (TARGET_LONG_DISPLACEMENT)
2129 if (!decomposed && !s390_decompose_address (op, &addr))
2130 return 0;
2131 if (!s390_short_displacement (addr.disp))
2132 return 0;
2134 /* Any invalid address here will be fixed up by reload,
2135 so accept it for the most generic constraint. */
2136 break;
2138 case 'S': /* no index long displacement */
2139 if (!TARGET_LONG_DISPLACEMENT)
2140 return 0;
2141 if (!decomposed && !s390_decompose_address (op, &addr))
2142 return 0;
2143 if (addr.indx)
2144 return 0;
2145 if (s390_short_displacement (addr.disp))
2146 return 0;
2147 break;
2149 case 'T': /* with index long displacement */
2150 if (!TARGET_LONG_DISPLACEMENT)
2151 return 0;
2152 /* Any invalid address here will be fixed up by reload,
2153 so accept it for the most generic constraint. */
2154 if ((decomposed || s390_decompose_address (op, &addr))
2155 && s390_short_displacement (addr.disp))
2156 return 0;
2157 break;
2158 default:
2159 return 0;
2161 return 1;
2165 /* Evaluates constraint strings described by the regular expression
2166 ([A|B|Z](Q|R|S|T))|U|W|Y and returns 1 if OP is a valid operand for
2167 the constraint given in STR, or 0 else. */
2170 s390_mem_constraint (const char *str, rtx op)
2172 char c = str[0];
2174 switch (c)
2176 case 'A':
2177 /* Check for offsettable variants of memory constraints. */
2178 if (!MEM_P (op) || MEM_VOLATILE_P (op))
2179 return 0;
2180 if ((reload_completed || reload_in_progress)
2181 ? !offsettable_memref_p (op) : !offsettable_nonstrict_memref_p (op))
2182 return 0;
2183 return s390_check_qrst_address (str[1], XEXP (op, 0), true);
2184 case 'B':
2185 /* Check for non-literal-pool variants of memory constraints. */
2186 if (!MEM_P (op))
2187 return 0;
2188 return s390_check_qrst_address (str[1], XEXP (op, 0), false);
2189 case 'Q':
2190 case 'R':
2191 case 'S':
2192 case 'T':
2193 if (GET_CODE (op) != MEM)
2194 return 0;
2195 return s390_check_qrst_address (c, XEXP (op, 0), true);
2196 case 'U':
2197 return (s390_check_qrst_address ('Q', op, true)
2198 || s390_check_qrst_address ('R', op, true));
2199 case 'W':
2200 return (s390_check_qrst_address ('S', op, true)
2201 || s390_check_qrst_address ('T', op, true));
2202 case 'Y':
2203 /* Simply check for the basic form of a shift count. Reload will
2204 take care of making sure we have a proper base register. */
2205 if (!s390_decompose_shift_count (op, NULL, NULL))
2206 return 0;
2207 break;
2208 case 'Z':
2209 return s390_check_qrst_address (str[1], op, true);
2210 default:
2211 return 0;
2213 return 1;
2217 /* Evaluates constraint strings starting with letter O. Input
2218 parameter C is the second letter following the "O" in the constraint
2219 string. Returns 1 if VALUE meets the respective constraint and 0
2220 otherwise. */
2223 s390_O_constraint_str (const char c, HOST_WIDE_INT value)
2225 if (!TARGET_EXTIMM)
2226 return 0;
2228 switch (c)
2230 case 's':
2231 return trunc_int_for_mode (value, SImode) == value;
2233 case 'p':
2234 return value == 0
2235 || s390_single_part (GEN_INT (value), DImode, SImode, 0) == 1;
2237 case 'n':
2238 return s390_single_part (GEN_INT (value - 1), DImode, SImode, -1) == 1;
2240 default:
2241 gcc_unreachable ();
2246 /* Evaluates constraint strings starting with letter N. Parameter STR
2247 contains the letters following letter "N" in the constraint string.
2248 Returns true if VALUE matches the constraint. */
2251 s390_N_constraint_str (const char *str, HOST_WIDE_INT value)
2253 enum machine_mode mode, part_mode;
2254 int def;
2255 int part, part_goal;
2258 if (str[0] == 'x')
2259 part_goal = -1;
2260 else
2261 part_goal = str[0] - '0';
2263 switch (str[1])
2265 case 'Q':
2266 part_mode = QImode;
2267 break;
2268 case 'H':
2269 part_mode = HImode;
2270 break;
2271 case 'S':
2272 part_mode = SImode;
2273 break;
2274 default:
2275 return 0;
2278 switch (str[2])
2280 case 'H':
2281 mode = HImode;
2282 break;
2283 case 'S':
2284 mode = SImode;
2285 break;
2286 case 'D':
2287 mode = DImode;
2288 break;
2289 default:
2290 return 0;
2293 switch (str[3])
2295 case '0':
2296 def = 0;
2297 break;
2298 case 'F':
2299 def = -1;
2300 break;
2301 default:
2302 return 0;
2305 if (GET_MODE_SIZE (mode) <= GET_MODE_SIZE (part_mode))
2306 return 0;
2308 part = s390_single_part (GEN_INT (value), mode, part_mode, def);
2309 if (part < 0)
2310 return 0;
2311 if (part_goal != -1 && part_goal != part)
2312 return 0;
2314 return 1;
2318 /* Returns true if the input parameter VALUE is a float zero. */
2321 s390_float_const_zero_p (rtx value)
2323 return (GET_MODE_CLASS (GET_MODE (value)) == MODE_FLOAT
2324 && value == CONST0_RTX (GET_MODE (value)));
2328 /* Compute a (partial) cost for rtx X. Return true if the complete
2329 cost has been computed, and false if subexpressions should be
2330 scanned. In either case, *TOTAL contains the cost result.
2331 CODE contains GET_CODE (x), OUTER_CODE contains the code
2332 of the superexpression of x. */
2334 static bool
2335 s390_rtx_costs (rtx x, int code, int outer_code, int *total,
2336 bool speed ATTRIBUTE_UNUSED)
2338 switch (code)
2340 case CONST:
2341 case CONST_INT:
2342 case LABEL_REF:
2343 case SYMBOL_REF:
2344 case CONST_DOUBLE:
2345 case MEM:
2346 *total = 0;
2347 return true;
2349 case ASHIFT:
2350 case ASHIFTRT:
2351 case LSHIFTRT:
2352 case ROTATE:
2353 case ROTATERT:
2354 case AND:
2355 case IOR:
2356 case XOR:
2357 case NEG:
2358 case NOT:
2359 *total = COSTS_N_INSNS (1);
2360 return false;
2362 case PLUS:
2363 case MINUS:
2364 /* Check for multiply and add. */
2365 if ((GET_MODE (x) == DFmode || GET_MODE (x) == SFmode)
2366 && GET_CODE (XEXP (x, 0)) == MULT
2367 && TARGET_HARD_FLOAT && TARGET_FUSED_MADD)
2369 /* This is the multiply and add case. */
2370 if (GET_MODE (x) == DFmode)
2371 *total = s390_cost->madbr;
2372 else
2373 *total = s390_cost->maebr;
2374 *total += (rtx_cost (XEXP (XEXP (x, 0), 0), MULT, speed)
2375 + rtx_cost (XEXP (XEXP (x, 0), 1), MULT, speed)
2376 + rtx_cost (XEXP (x, 1), (enum rtx_code) code, speed));
2377 return true; /* Do not do an additional recursive descent. */
2379 *total = COSTS_N_INSNS (1);
2380 return false;
2382 case MULT:
2383 switch (GET_MODE (x))
2385 case SImode:
2387 rtx left = XEXP (x, 0);
2388 rtx right = XEXP (x, 1);
2389 if (GET_CODE (right) == CONST_INT
2390 && CONST_OK_FOR_K (INTVAL (right)))
2391 *total = s390_cost->mhi;
2392 else if (GET_CODE (left) == SIGN_EXTEND)
2393 *total = s390_cost->mh;
2394 else
2395 *total = s390_cost->ms; /* msr, ms, msy */
2396 break;
2398 case DImode:
2400 rtx left = XEXP (x, 0);
2401 rtx right = XEXP (x, 1);
2402 if (TARGET_64BIT)
2404 if (GET_CODE (right) == CONST_INT
2405 && CONST_OK_FOR_K (INTVAL (right)))
2406 *total = s390_cost->mghi;
2407 else if (GET_CODE (left) == SIGN_EXTEND)
2408 *total = s390_cost->msgf;
2409 else
2410 *total = s390_cost->msg; /* msgr, msg */
2412 else /* TARGET_31BIT */
2414 if (GET_CODE (left) == SIGN_EXTEND
2415 && GET_CODE (right) == SIGN_EXTEND)
2416 /* mulsidi case: mr, m */
2417 *total = s390_cost->m;
2418 else if (GET_CODE (left) == ZERO_EXTEND
2419 && GET_CODE (right) == ZERO_EXTEND
2420 && TARGET_CPU_ZARCH)
2421 /* umulsidi case: ml, mlr */
2422 *total = s390_cost->ml;
2423 else
2424 /* Complex calculation is required. */
2425 *total = COSTS_N_INSNS (40);
2427 break;
2429 case SFmode:
2430 case DFmode:
2431 *total = s390_cost->mult_df;
2432 break;
2433 case TFmode:
2434 *total = s390_cost->mxbr;
2435 break;
2436 default:
2437 return false;
2439 return false;
2441 case UDIV:
2442 case UMOD:
2443 if (GET_MODE (x) == TImode) /* 128 bit division */
2444 *total = s390_cost->dlgr;
2445 else if (GET_MODE (x) == DImode)
2447 rtx right = XEXP (x, 1);
2448 if (GET_CODE (right) == ZERO_EXTEND) /* 64 by 32 bit division */
2449 *total = s390_cost->dlr;
2450 else /* 64 by 64 bit division */
2451 *total = s390_cost->dlgr;
2453 else if (GET_MODE (x) == SImode) /* 32 bit division */
2454 *total = s390_cost->dlr;
2455 return false;
2457 case DIV:
2458 case MOD:
2459 if (GET_MODE (x) == DImode)
2461 rtx right = XEXP (x, 1);
2462 if (GET_CODE (right) == ZERO_EXTEND) /* 64 by 32 bit division */
2463 if (TARGET_64BIT)
2464 *total = s390_cost->dsgfr;
2465 else
2466 *total = s390_cost->dr;
2467 else /* 64 by 64 bit division */
2468 *total = s390_cost->dsgr;
2470 else if (GET_MODE (x) == SImode) /* 32 bit division */
2471 *total = s390_cost->dlr;
2472 else if (GET_MODE (x) == SFmode)
2474 *total = s390_cost->debr;
2476 else if (GET_MODE (x) == DFmode)
2478 *total = s390_cost->ddbr;
2480 else if (GET_MODE (x) == TFmode)
2482 *total = s390_cost->dxbr;
2484 return false;
2486 case SQRT:
2487 if (GET_MODE (x) == SFmode)
2488 *total = s390_cost->sqebr;
2489 else if (GET_MODE (x) == DFmode)
2490 *total = s390_cost->sqdbr;
2491 else /* TFmode */
2492 *total = s390_cost->sqxbr;
2493 return false;
2495 case SIGN_EXTEND:
2496 case ZERO_EXTEND:
2497 if (outer_code == MULT || outer_code == DIV || outer_code == MOD
2498 || outer_code == PLUS || outer_code == MINUS
2499 || outer_code == COMPARE)
2500 *total = 0;
2501 return false;
2503 case COMPARE:
2504 *total = COSTS_N_INSNS (1);
2505 if (GET_CODE (XEXP (x, 0)) == AND
2506 && GET_CODE (XEXP (x, 1)) == CONST_INT
2507 && GET_CODE (XEXP (XEXP (x, 0), 1)) == CONST_INT)
2509 rtx op0 = XEXP (XEXP (x, 0), 0);
2510 rtx op1 = XEXP (XEXP (x, 0), 1);
2511 rtx op2 = XEXP (x, 1);
2513 if (memory_operand (op0, GET_MODE (op0))
2514 && s390_tm_ccmode (op1, op2, 0) != VOIDmode)
2515 return true;
2516 if (register_operand (op0, GET_MODE (op0))
2517 && s390_tm_ccmode (op1, op2, 1) != VOIDmode)
2518 return true;
2520 return false;
2522 default:
2523 return false;
2527 /* Return the cost of an address rtx ADDR. */
2529 static int
2530 s390_address_cost (rtx addr, bool speed ATTRIBUTE_UNUSED)
2532 struct s390_address ad;
2533 if (!s390_decompose_address (addr, &ad))
2534 return 1000;
2536 return ad.indx? COSTS_N_INSNS (1) + 1 : COSTS_N_INSNS (1);
2539 /* If OP is a SYMBOL_REF of a thread-local symbol, return its TLS mode,
2540 otherwise return 0. */
2543 tls_symbolic_operand (rtx op)
2545 if (GET_CODE (op) != SYMBOL_REF)
2546 return 0;
2547 return SYMBOL_REF_TLS_MODEL (op);
2550 /* Split DImode access register reference REG (on 64-bit) into its constituent
2551 low and high parts, and store them into LO and HI. Note that gen_lowpart/
2552 gen_highpart cannot be used as they assume all registers are word-sized,
2553 while our access registers have only half that size. */
2555 void
2556 s390_split_access_reg (rtx reg, rtx *lo, rtx *hi)
2558 gcc_assert (TARGET_64BIT);
2559 gcc_assert (ACCESS_REG_P (reg));
2560 gcc_assert (GET_MODE (reg) == DImode);
2561 gcc_assert (!(REGNO (reg) & 1));
2563 *lo = gen_rtx_REG (SImode, REGNO (reg) + 1);
2564 *hi = gen_rtx_REG (SImode, REGNO (reg));
2567 /* Return true if OP contains a symbol reference */
2569 bool
2570 symbolic_reference_mentioned_p (rtx op)
2572 const char *fmt;
2573 int i;
2575 if (GET_CODE (op) == SYMBOL_REF || GET_CODE (op) == LABEL_REF)
2576 return 1;
2578 fmt = GET_RTX_FORMAT (GET_CODE (op));
2579 for (i = GET_RTX_LENGTH (GET_CODE (op)) - 1; i >= 0; i--)
2581 if (fmt[i] == 'E')
2583 int j;
2585 for (j = XVECLEN (op, i) - 1; j >= 0; j--)
2586 if (symbolic_reference_mentioned_p (XVECEXP (op, i, j)))
2587 return 1;
2590 else if (fmt[i] == 'e' && symbolic_reference_mentioned_p (XEXP (op, i)))
2591 return 1;
2594 return 0;
2597 /* Return true if OP contains a reference to a thread-local symbol. */
2599 bool
2600 tls_symbolic_reference_mentioned_p (rtx op)
2602 const char *fmt;
2603 int i;
2605 if (GET_CODE (op) == SYMBOL_REF)
2606 return tls_symbolic_operand (op);
2608 fmt = GET_RTX_FORMAT (GET_CODE (op));
2609 for (i = GET_RTX_LENGTH (GET_CODE (op)) - 1; i >= 0; i--)
2611 if (fmt[i] == 'E')
2613 int j;
2615 for (j = XVECLEN (op, i) - 1; j >= 0; j--)
2616 if (tls_symbolic_reference_mentioned_p (XVECEXP (op, i, j)))
2617 return true;
2620 else if (fmt[i] == 'e' && tls_symbolic_reference_mentioned_p (XEXP (op, i)))
2621 return true;
2624 return false;
2628 /* Return true if OP is a legitimate general operand when
2629 generating PIC code. It is given that flag_pic is on
2630 and that OP satisfies CONSTANT_P or is a CONST_DOUBLE. */
2633 legitimate_pic_operand_p (rtx op)
2635 /* Accept all non-symbolic constants. */
2636 if (!SYMBOLIC_CONST (op))
2637 return 1;
2639 /* Reject everything else; must be handled
2640 via emit_symbolic_move. */
2641 return 0;
2644 /* Returns true if the constant value OP is a legitimate general operand.
2645 It is given that OP satisfies CONSTANT_P or is a CONST_DOUBLE. */
2648 legitimate_constant_p (rtx op)
2650 /* Accept all non-symbolic constants. */
2651 if (!SYMBOLIC_CONST (op))
2652 return 1;
2654 /* Accept immediate LARL operands. */
2655 if (TARGET_CPU_ZARCH && larl_operand (op, VOIDmode))
2656 return 1;
2658 /* Thread-local symbols are never legal constants. This is
2659 so that emit_call knows that computing such addresses
2660 might require a function call. */
2661 if (TLS_SYMBOLIC_CONST (op))
2662 return 0;
2664 /* In the PIC case, symbolic constants must *not* be
2665 forced into the literal pool. We accept them here,
2666 so that they will be handled by emit_symbolic_move. */
2667 if (flag_pic)
2668 return 1;
2670 /* All remaining non-PIC symbolic constants are
2671 forced into the literal pool. */
2672 return 0;
2675 /* Determine if it's legal to put X into the constant pool. This
2676 is not possible if X contains the address of a symbol that is
2677 not constant (TLS) or not known at final link time (PIC). */
2679 static bool
2680 s390_cannot_force_const_mem (rtx x)
2682 switch (GET_CODE (x))
2684 case CONST_INT:
2685 case CONST_DOUBLE:
2686 /* Accept all non-symbolic constants. */
2687 return false;
2689 case LABEL_REF:
2690 /* Labels are OK iff we are non-PIC. */
2691 return flag_pic != 0;
2693 case SYMBOL_REF:
2694 /* 'Naked' TLS symbol references are never OK,
2695 non-TLS symbols are OK iff we are non-PIC. */
2696 if (tls_symbolic_operand (x))
2697 return true;
2698 else
2699 return flag_pic != 0;
2701 case CONST:
2702 return s390_cannot_force_const_mem (XEXP (x, 0));
2703 case PLUS:
2704 case MINUS:
2705 return s390_cannot_force_const_mem (XEXP (x, 0))
2706 || s390_cannot_force_const_mem (XEXP (x, 1));
2708 case UNSPEC:
2709 switch (XINT (x, 1))
2711 /* Only lt-relative or GOT-relative UNSPECs are OK. */
2712 case UNSPEC_LTREL_OFFSET:
2713 case UNSPEC_GOT:
2714 case UNSPEC_GOTOFF:
2715 case UNSPEC_PLTOFF:
2716 case UNSPEC_TLSGD:
2717 case UNSPEC_TLSLDM:
2718 case UNSPEC_NTPOFF:
2719 case UNSPEC_DTPOFF:
2720 case UNSPEC_GOTNTPOFF:
2721 case UNSPEC_INDNTPOFF:
2722 return false;
2724 /* If the literal pool shares the code section, be put
2725 execute template placeholders into the pool as well. */
2726 case UNSPEC_INSN:
2727 return TARGET_CPU_ZARCH;
2729 default:
2730 return true;
2732 break;
2734 default:
2735 gcc_unreachable ();
2739 /* Returns true if the constant value OP is a legitimate general
2740 operand during and after reload. The difference to
2741 legitimate_constant_p is that this function will not accept
2742 a constant that would need to be forced to the literal pool
2743 before it can be used as operand. */
2745 bool
2746 legitimate_reload_constant_p (rtx op)
2748 /* Accept la(y) operands. */
2749 if (GET_CODE (op) == CONST_INT
2750 && DISP_IN_RANGE (INTVAL (op)))
2751 return true;
2753 /* Accept l(g)hi/l(g)fi operands. */
2754 if (GET_CODE (op) == CONST_INT
2755 && (CONST_OK_FOR_K (INTVAL (op)) || CONST_OK_FOR_Os (INTVAL (op))))
2756 return true;
2758 /* Accept lliXX operands. */
2759 if (TARGET_ZARCH
2760 && GET_CODE (op) == CONST_INT
2761 && trunc_int_for_mode (INTVAL (op), word_mode) == INTVAL (op)
2762 && s390_single_part (op, word_mode, HImode, 0) >= 0)
2763 return true;
2765 if (TARGET_EXTIMM
2766 && GET_CODE (op) == CONST_INT
2767 && trunc_int_for_mode (INTVAL (op), word_mode) == INTVAL (op)
2768 && s390_single_part (op, word_mode, SImode, 0) >= 0)
2769 return true;
2771 /* Accept larl operands. */
2772 if (TARGET_CPU_ZARCH
2773 && larl_operand (op, VOIDmode))
2774 return true;
2776 /* Accept lzXX operands. */
2777 if (GET_CODE (op) == CONST_DOUBLE
2778 && CONST_DOUBLE_OK_FOR_CONSTRAINT_P (op, 'G', "G"))
2779 return true;
2781 /* Accept double-word operands that can be split. */
2782 if (GET_CODE (op) == CONST_INT
2783 && trunc_int_for_mode (INTVAL (op), word_mode) != INTVAL (op))
2785 enum machine_mode dword_mode = word_mode == SImode ? DImode : TImode;
2786 rtx hi = operand_subword (op, 0, 0, dword_mode);
2787 rtx lo = operand_subword (op, 1, 0, dword_mode);
2788 return legitimate_reload_constant_p (hi)
2789 && legitimate_reload_constant_p (lo);
2792 /* Everything else cannot be handled without reload. */
2793 return false;
2796 /* Given an rtx OP being reloaded into a reg required to be in class RCLASS,
2797 return the class of reg to actually use. */
2799 enum reg_class
2800 s390_preferred_reload_class (rtx op, enum reg_class rclass)
2802 switch (GET_CODE (op))
2804 /* Constants we cannot reload must be forced into the
2805 literal pool. */
2807 case CONST_DOUBLE:
2808 case CONST_INT:
2809 if (legitimate_reload_constant_p (op))
2810 return rclass;
2811 else
2812 return NO_REGS;
2814 /* If a symbolic constant or a PLUS is reloaded,
2815 it is most likely being used as an address, so
2816 prefer ADDR_REGS. If 'class' is not a superset
2817 of ADDR_REGS, e.g. FP_REGS, reject this reload. */
2818 case PLUS:
2819 case LABEL_REF:
2820 case SYMBOL_REF:
2821 case CONST:
2822 if (reg_class_subset_p (ADDR_REGS, rclass))
2823 return ADDR_REGS;
2824 else
2825 return NO_REGS;
2827 default:
2828 break;
2831 return rclass;
2834 /* Return true if ADDR is SYMBOL_REF + addend with addend being a
2835 multiple of ALIGNMENT and the SYMBOL_REF being naturally
2836 aligned. */
2838 bool
2839 s390_check_symref_alignment (rtx addr, HOST_WIDE_INT alignment)
2841 HOST_WIDE_INT addend;
2842 rtx symref;
2844 if (!s390_symref_operand_p (addr, &symref, &addend))
2845 return false;
2847 return (!SYMBOL_REF_NOT_NATURALLY_ALIGNED_P (symref)
2848 && !(addend & (alignment - 1)));
2851 /* ADDR is moved into REG using larl. If ADDR isn't a valid larl
2852 operand SCRATCH is used to reload the even part of the address and
2853 adding one. */
2855 void
2856 s390_reload_larl_operand (rtx reg, rtx addr, rtx scratch)
2858 HOST_WIDE_INT addend;
2859 rtx symref;
2861 if (!s390_symref_operand_p (addr, &symref, &addend))
2862 gcc_unreachable ();
2864 if (!(addend & 1))
2865 /* Easy case. The addend is even so larl will do fine. */
2866 emit_move_insn (reg, addr);
2867 else
2869 /* We can leave the scratch register untouched if the target
2870 register is a valid base register. */
2871 if (REGNO (reg) < FIRST_PSEUDO_REGISTER
2872 && REGNO_REG_CLASS (REGNO (reg)) == ADDR_REGS)
2873 scratch = reg;
2875 gcc_assert (REGNO (scratch) < FIRST_PSEUDO_REGISTER);
2876 gcc_assert (REGNO_REG_CLASS (REGNO (scratch)) == ADDR_REGS);
2878 if (addend != 1)
2879 emit_move_insn (scratch,
2880 gen_rtx_CONST (Pmode,
2881 gen_rtx_PLUS (Pmode, symref,
2882 GEN_INT (addend - 1))));
2883 else
2884 emit_move_insn (scratch, symref);
2886 /* Increment the address using la in order to avoid clobbering cc. */
2887 emit_move_insn (reg, gen_rtx_PLUS (Pmode, scratch, const1_rtx));
2891 /* Generate what is necessary to move between REG and MEM using
2892 SCRATCH. The direction is given by TOMEM. */
2894 void
2895 s390_reload_symref_address (rtx reg, rtx mem, rtx scratch, bool tomem)
2897 /* Reload might have pulled a constant out of the literal pool.
2898 Force it back in. */
2899 if (CONST_INT_P (mem) || GET_CODE (mem) == CONST_DOUBLE
2900 || GET_CODE (mem) == CONST)
2901 mem = force_const_mem (GET_MODE (reg), mem);
2903 gcc_assert (MEM_P (mem));
2905 /* For a load from memory we can leave the scratch register
2906 untouched if the target register is a valid base register. */
2907 if (!tomem
2908 && REGNO (reg) < FIRST_PSEUDO_REGISTER
2909 && REGNO_REG_CLASS (REGNO (reg)) == ADDR_REGS
2910 && GET_MODE (reg) == GET_MODE (scratch))
2911 scratch = reg;
2913 /* Load address into scratch register. Since we can't have a
2914 secondary reload for a secondary reload we have to cover the case
2915 where larl would need a secondary reload here as well. */
2916 s390_reload_larl_operand (scratch, XEXP (mem, 0), scratch);
2918 /* Now we can use a standard load/store to do the move. */
2919 if (tomem)
2920 emit_move_insn (replace_equiv_address (mem, scratch), reg);
2921 else
2922 emit_move_insn (reg, replace_equiv_address (mem, scratch));
2925 /* Inform reload about cases where moving X with a mode MODE to a register in
2926 RCLASS requires an extra scratch or immediate register. Return the class
2927 needed for the immediate register. */
2929 static enum reg_class
2930 s390_secondary_reload (bool in_p, rtx x, enum reg_class rclass,
2931 enum machine_mode mode, secondary_reload_info *sri)
2933 /* Intermediate register needed. */
2934 if (reg_classes_intersect_p (CC_REGS, rclass))
2935 return GENERAL_REGS;
2937 if (TARGET_Z10)
2939 /* On z10 several optimizer steps may generate larl operands with
2940 an odd addend. */
2941 if (in_p
2942 && s390_symref_operand_p (x, NULL, NULL)
2943 && mode == Pmode
2944 && !s390_check_symref_alignment (x, 2))
2945 sri->icode = ((mode == DImode) ? CODE_FOR_reloaddi_larl_odd_addend_z10
2946 : CODE_FOR_reloadsi_larl_odd_addend_z10);
2948 /* On z10 we need a scratch register when moving QI, TI or floating
2949 point mode values from or to a memory location with a SYMBOL_REF
2950 or if the symref addend of a SI or DI move is not aligned to the
2951 width of the access. */
2952 if (MEM_P (x)
2953 && s390_symref_operand_p (XEXP (x, 0), NULL, NULL)
2954 && (mode == QImode || mode == TImode || FLOAT_MODE_P (mode)
2955 || (!TARGET_64BIT && mode == DImode)
2956 || ((mode == HImode || mode == SImode || mode == DImode)
2957 && (!s390_check_symref_alignment (XEXP (x, 0),
2958 GET_MODE_SIZE (mode))))))
2960 #define __SECONDARY_RELOAD_CASE(M,m) \
2961 case M##mode: \
2962 if (TARGET_64BIT) \
2963 sri->icode = in_p ? CODE_FOR_reload##m##di_toreg_z10 : \
2964 CODE_FOR_reload##m##di_tomem_z10; \
2965 else \
2966 sri->icode = in_p ? CODE_FOR_reload##m##si_toreg_z10 : \
2967 CODE_FOR_reload##m##si_tomem_z10; \
2968 break;
2970 switch (GET_MODE (x))
2972 __SECONDARY_RELOAD_CASE (QI, qi);
2973 __SECONDARY_RELOAD_CASE (HI, hi);
2974 __SECONDARY_RELOAD_CASE (SI, si);
2975 __SECONDARY_RELOAD_CASE (DI, di);
2976 __SECONDARY_RELOAD_CASE (TI, ti);
2977 __SECONDARY_RELOAD_CASE (SF, sf);
2978 __SECONDARY_RELOAD_CASE (DF, df);
2979 __SECONDARY_RELOAD_CASE (TF, tf);
2980 __SECONDARY_RELOAD_CASE (SD, sd);
2981 __SECONDARY_RELOAD_CASE (DD, dd);
2982 __SECONDARY_RELOAD_CASE (TD, td);
2984 default:
2985 gcc_unreachable ();
2987 #undef __SECONDARY_RELOAD_CASE
2991 /* We need a scratch register when loading a PLUS expression which
2992 is not a legitimate operand of the LOAD ADDRESS instruction. */
2993 if (in_p && s390_plus_operand (x, mode))
2994 sri->icode = (TARGET_64BIT ?
2995 CODE_FOR_reloaddi_plus : CODE_FOR_reloadsi_plus);
2997 /* Performing a multiword move from or to memory we have to make sure the
2998 second chunk in memory is addressable without causing a displacement
2999 overflow. If that would be the case we calculate the address in
3000 a scratch register. */
3001 if (MEM_P (x)
3002 && GET_CODE (XEXP (x, 0)) == PLUS
3003 && GET_CODE (XEXP (XEXP (x, 0), 1)) == CONST_INT
3004 && !DISP_IN_RANGE (INTVAL (XEXP (XEXP (x, 0), 1))
3005 + GET_MODE_SIZE (mode) - 1))
3007 /* For GENERAL_REGS a displacement overflow is no problem if occurring
3008 in a s_operand address since we may fallback to lm/stm. So we only
3009 have to care about overflows in the b+i+d case. */
3010 if ((reg_classes_intersect_p (GENERAL_REGS, rclass)
3011 && s390_class_max_nregs (GENERAL_REGS, mode) > 1
3012 && GET_CODE (XEXP (XEXP (x, 0), 0)) == PLUS)
3013 /* For FP_REGS no lm/stm is available so this check is triggered
3014 for displacement overflows in b+i+d and b+d like addresses. */
3015 || (reg_classes_intersect_p (FP_REGS, rclass)
3016 && s390_class_max_nregs (FP_REGS, mode) > 1))
3018 if (in_p)
3019 sri->icode = (TARGET_64BIT ?
3020 CODE_FOR_reloaddi_nonoffmem_in :
3021 CODE_FOR_reloadsi_nonoffmem_in);
3022 else
3023 sri->icode = (TARGET_64BIT ?
3024 CODE_FOR_reloaddi_nonoffmem_out :
3025 CODE_FOR_reloadsi_nonoffmem_out);
3029 /* A scratch address register is needed when a symbolic constant is
3030 copied to r0 compiling with -fPIC. In other cases the target
3031 register might be used as temporary (see legitimize_pic_address). */
3032 if (in_p && SYMBOLIC_CONST (x) && flag_pic == 2 && rclass != ADDR_REGS)
3033 sri->icode = (TARGET_64BIT ?
3034 CODE_FOR_reloaddi_PIC_addr :
3035 CODE_FOR_reloadsi_PIC_addr);
3037 /* Either scratch or no register needed. */
3038 return NO_REGS;
3041 /* Generate code to load SRC, which is PLUS that is not a
3042 legitimate operand for the LA instruction, into TARGET.
3043 SCRATCH may be used as scratch register. */
3045 void
3046 s390_expand_plus_operand (rtx target, rtx src,
3047 rtx scratch)
3049 rtx sum1, sum2;
3050 struct s390_address ad;
3052 /* src must be a PLUS; get its two operands. */
3053 gcc_assert (GET_CODE (src) == PLUS);
3054 gcc_assert (GET_MODE (src) == Pmode);
3056 /* Check if any of the two operands is already scheduled
3057 for replacement by reload. This can happen e.g. when
3058 float registers occur in an address. */
3059 sum1 = find_replacement (&XEXP (src, 0));
3060 sum2 = find_replacement (&XEXP (src, 1));
3061 src = gen_rtx_PLUS (Pmode, sum1, sum2);
3063 /* If the address is already strictly valid, there's nothing to do. */
3064 if (!s390_decompose_address (src, &ad)
3065 || (ad.base && !REGNO_OK_FOR_BASE_P (REGNO (ad.base)))
3066 || (ad.indx && !REGNO_OK_FOR_INDEX_P (REGNO (ad.indx))))
3068 /* Otherwise, one of the operands cannot be an address register;
3069 we reload its value into the scratch register. */
3070 if (true_regnum (sum1) < 1 || true_regnum (sum1) > 15)
3072 emit_move_insn (scratch, sum1);
3073 sum1 = scratch;
3075 if (true_regnum (sum2) < 1 || true_regnum (sum2) > 15)
3077 emit_move_insn (scratch, sum2);
3078 sum2 = scratch;
3081 /* According to the way these invalid addresses are generated
3082 in reload.c, it should never happen (at least on s390) that
3083 *neither* of the PLUS components, after find_replacements
3084 was applied, is an address register. */
3085 if (sum1 == scratch && sum2 == scratch)
3087 debug_rtx (src);
3088 gcc_unreachable ();
3091 src = gen_rtx_PLUS (Pmode, sum1, sum2);
3094 /* Emit the LOAD ADDRESS pattern. Note that reload of PLUS
3095 is only ever performed on addresses, so we can mark the
3096 sum as legitimate for LA in any case. */
3097 s390_load_address (target, src);
3101 /* Return true if ADDR is a valid memory address.
3102 STRICT specifies whether strict register checking applies. */
3104 static bool
3105 s390_legitimate_address_p (enum machine_mode mode, rtx addr, bool strict)
3107 struct s390_address ad;
3109 if (TARGET_Z10
3110 && larl_operand (addr, VOIDmode)
3111 && (mode == VOIDmode
3112 || s390_check_symref_alignment (addr, GET_MODE_SIZE (mode))))
3113 return true;
3115 if (!s390_decompose_address (addr, &ad))
3116 return false;
3118 if (strict)
3120 if (ad.base && !REGNO_OK_FOR_BASE_P (REGNO (ad.base)))
3121 return false;
3123 if (ad.indx && !REGNO_OK_FOR_INDEX_P (REGNO (ad.indx)))
3124 return false;
3126 else
3128 if (ad.base
3129 && !(REGNO (ad.base) >= FIRST_PSEUDO_REGISTER
3130 || REGNO_REG_CLASS (REGNO (ad.base)) == ADDR_REGS))
3131 return false;
3133 if (ad.indx
3134 && !(REGNO (ad.indx) >= FIRST_PSEUDO_REGISTER
3135 || REGNO_REG_CLASS (REGNO (ad.indx)) == ADDR_REGS))
3136 return false;
3138 return true;
3141 /* Return true if OP is a valid operand for the LA instruction.
3142 In 31-bit, we need to prove that the result is used as an
3143 address, as LA performs only a 31-bit addition. */
3145 bool
3146 legitimate_la_operand_p (rtx op)
3148 struct s390_address addr;
3149 if (!s390_decompose_address (op, &addr))
3150 return false;
3152 return (TARGET_64BIT || addr.pointer);
3155 /* Return true if it is valid *and* preferable to use LA to
3156 compute the sum of OP1 and OP2. */
3158 bool
3159 preferred_la_operand_p (rtx op1, rtx op2)
3161 struct s390_address addr;
3163 if (op2 != const0_rtx)
3164 op1 = gen_rtx_PLUS (Pmode, op1, op2);
3166 if (!s390_decompose_address (op1, &addr))
3167 return false;
3168 if (addr.base && !REGNO_OK_FOR_BASE_P (REGNO (addr.base)))
3169 return false;
3170 if (addr.indx && !REGNO_OK_FOR_INDEX_P (REGNO (addr.indx)))
3171 return false;
3173 if (!TARGET_64BIT && !addr.pointer)
3174 return false;
3176 if (addr.pointer)
3177 return true;
3179 if ((addr.base && REG_P (addr.base) && REG_POINTER (addr.base))
3180 || (addr.indx && REG_P (addr.indx) && REG_POINTER (addr.indx)))
3181 return true;
3183 return false;
3186 /* Emit a forced load-address operation to load SRC into DST.
3187 This will use the LOAD ADDRESS instruction even in situations
3188 where legitimate_la_operand_p (SRC) returns false. */
3190 void
3191 s390_load_address (rtx dst, rtx src)
3193 if (TARGET_64BIT)
3194 emit_move_insn (dst, src);
3195 else
3196 emit_insn (gen_force_la_31 (dst, src));
3199 /* Return a legitimate reference for ORIG (an address) using the
3200 register REG. If REG is 0, a new pseudo is generated.
3202 There are two types of references that must be handled:
3204 1. Global data references must load the address from the GOT, via
3205 the PIC reg. An insn is emitted to do this load, and the reg is
3206 returned.
3208 2. Static data references, constant pool addresses, and code labels
3209 compute the address as an offset from the GOT, whose base is in
3210 the PIC reg. Static data objects have SYMBOL_FLAG_LOCAL set to
3211 differentiate them from global data objects. The returned
3212 address is the PIC reg + an unspec constant.
3214 TARGET_LEGITIMIZE_ADDRESS_P rejects symbolic references unless the PIC
3215 reg also appears in the address. */
3218 legitimize_pic_address (rtx orig, rtx reg)
3220 rtx addr = orig;
3221 rtx new_rtx = orig;
3222 rtx base;
3224 gcc_assert (!TLS_SYMBOLIC_CONST (addr));
3226 if (GET_CODE (addr) == LABEL_REF
3227 || (GET_CODE (addr) == SYMBOL_REF && SYMBOL_REF_LOCAL_P (addr)))
3229 /* This is a local symbol. */
3230 if (TARGET_CPU_ZARCH && larl_operand (addr, VOIDmode))
3232 /* Access local symbols PC-relative via LARL.
3233 This is the same as in the non-PIC case, so it is
3234 handled automatically ... */
3236 else
3238 /* Access local symbols relative to the GOT. */
3240 rtx temp = reg? reg : gen_reg_rtx (Pmode);
3242 if (reload_in_progress || reload_completed)
3243 df_set_regs_ever_live (PIC_OFFSET_TABLE_REGNUM, true);
3245 addr = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, addr), UNSPEC_GOTOFF);
3246 addr = gen_rtx_CONST (Pmode, addr);
3247 addr = force_const_mem (Pmode, addr);
3248 emit_move_insn (temp, addr);
3250 new_rtx = gen_rtx_PLUS (Pmode, pic_offset_table_rtx, temp);
3251 if (reg != 0)
3253 s390_load_address (reg, new_rtx);
3254 new_rtx = reg;
3258 else if (GET_CODE (addr) == SYMBOL_REF)
3260 if (reg == 0)
3261 reg = gen_reg_rtx (Pmode);
3263 if (flag_pic == 1)
3265 /* Assume GOT offset < 4k. This is handled the same way
3266 in both 31- and 64-bit code (@GOT). */
3268 if (reload_in_progress || reload_completed)
3269 df_set_regs_ever_live (PIC_OFFSET_TABLE_REGNUM, true);
3271 new_rtx = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, addr), UNSPEC_GOT);
3272 new_rtx = gen_rtx_CONST (Pmode, new_rtx);
3273 new_rtx = gen_rtx_PLUS (Pmode, pic_offset_table_rtx, new_rtx);
3274 new_rtx = gen_const_mem (Pmode, new_rtx);
3275 emit_move_insn (reg, new_rtx);
3276 new_rtx = reg;
3278 else if (TARGET_CPU_ZARCH)
3280 /* If the GOT offset might be >= 4k, we determine the position
3281 of the GOT entry via a PC-relative LARL (@GOTENT). */
3283 rtx temp = reg ? reg : gen_reg_rtx (Pmode);
3285 gcc_assert (REGNO (temp) >= FIRST_PSEUDO_REGISTER
3286 || REGNO_REG_CLASS (REGNO (temp)) == ADDR_REGS);
3288 new_rtx = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, addr), UNSPEC_GOTENT);
3289 new_rtx = gen_rtx_CONST (Pmode, new_rtx);
3290 emit_move_insn (temp, new_rtx);
3292 new_rtx = gen_const_mem (Pmode, temp);
3293 emit_move_insn (reg, new_rtx);
3294 new_rtx = reg;
3296 else
3298 /* If the GOT offset might be >= 4k, we have to load it
3299 from the literal pool (@GOT). */
3301 rtx temp = reg ? reg : gen_reg_rtx (Pmode);
3303 gcc_assert (REGNO (temp) >= FIRST_PSEUDO_REGISTER
3304 || REGNO_REG_CLASS (REGNO (temp)) == ADDR_REGS);
3306 if (reload_in_progress || reload_completed)
3307 df_set_regs_ever_live (PIC_OFFSET_TABLE_REGNUM, true);
3309 addr = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, addr), UNSPEC_GOT);
3310 addr = gen_rtx_CONST (Pmode, addr);
3311 addr = force_const_mem (Pmode, addr);
3312 emit_move_insn (temp, addr);
3314 new_rtx = gen_rtx_PLUS (Pmode, pic_offset_table_rtx, temp);
3315 new_rtx = gen_const_mem (Pmode, new_rtx);
3316 emit_move_insn (reg, new_rtx);
3317 new_rtx = reg;
3320 else
3322 if (GET_CODE (addr) == CONST)
3324 addr = XEXP (addr, 0);
3325 if (GET_CODE (addr) == UNSPEC)
3327 gcc_assert (XVECLEN (addr, 0) == 1);
3328 switch (XINT (addr, 1))
3330 /* If someone moved a GOT-relative UNSPEC
3331 out of the literal pool, force them back in. */
3332 case UNSPEC_GOTOFF:
3333 case UNSPEC_PLTOFF:
3334 new_rtx = force_const_mem (Pmode, orig);
3335 break;
3337 /* @GOT is OK as is if small. */
3338 case UNSPEC_GOT:
3339 if (flag_pic == 2)
3340 new_rtx = force_const_mem (Pmode, orig);
3341 break;
3343 /* @GOTENT is OK as is. */
3344 case UNSPEC_GOTENT:
3345 break;
3347 /* @PLT is OK as is on 64-bit, must be converted to
3348 GOT-relative @PLTOFF on 31-bit. */
3349 case UNSPEC_PLT:
3350 if (!TARGET_CPU_ZARCH)
3352 rtx temp = reg? reg : gen_reg_rtx (Pmode);
3354 if (reload_in_progress || reload_completed)
3355 df_set_regs_ever_live (PIC_OFFSET_TABLE_REGNUM, true);
3357 addr = XVECEXP (addr, 0, 0);
3358 addr = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, addr),
3359 UNSPEC_PLTOFF);
3360 addr = gen_rtx_CONST (Pmode, addr);
3361 addr = force_const_mem (Pmode, addr);
3362 emit_move_insn (temp, addr);
3364 new_rtx = gen_rtx_PLUS (Pmode, pic_offset_table_rtx, temp);
3365 if (reg != 0)
3367 s390_load_address (reg, new_rtx);
3368 new_rtx = reg;
3371 break;
3373 /* Everything else cannot happen. */
3374 default:
3375 gcc_unreachable ();
3378 else
3379 gcc_assert (GET_CODE (addr) == PLUS);
3381 if (GET_CODE (addr) == PLUS)
3383 rtx op0 = XEXP (addr, 0), op1 = XEXP (addr, 1);
3385 gcc_assert (!TLS_SYMBOLIC_CONST (op0));
3386 gcc_assert (!TLS_SYMBOLIC_CONST (op1));
3388 /* Check first to see if this is a constant offset
3389 from a local symbol reference. */
3390 if ((GET_CODE (op0) == LABEL_REF
3391 || (GET_CODE (op0) == SYMBOL_REF && SYMBOL_REF_LOCAL_P (op0)))
3392 && GET_CODE (op1) == CONST_INT)
3394 if (TARGET_CPU_ZARCH
3395 && larl_operand (op0, VOIDmode)
3396 && INTVAL (op1) < (HOST_WIDE_INT)1 << 31
3397 && INTVAL (op1) >= -((HOST_WIDE_INT)1 << 31))
3399 if (INTVAL (op1) & 1)
3401 /* LARL can't handle odd offsets, so emit a
3402 pair of LARL and LA. */
3403 rtx temp = reg? reg : gen_reg_rtx (Pmode);
3405 if (!DISP_IN_RANGE (INTVAL (op1)))
3407 HOST_WIDE_INT even = INTVAL (op1) - 1;
3408 op0 = gen_rtx_PLUS (Pmode, op0, GEN_INT (even));
3409 op0 = gen_rtx_CONST (Pmode, op0);
3410 op1 = const1_rtx;
3413 emit_move_insn (temp, op0);
3414 new_rtx = gen_rtx_PLUS (Pmode, temp, op1);
3416 if (reg != 0)
3418 s390_load_address (reg, new_rtx);
3419 new_rtx = reg;
3422 else
3424 /* If the offset is even, we can just use LARL.
3425 This will happen automatically. */
3428 else
3430 /* Access local symbols relative to the GOT. */
3432 rtx temp = reg? reg : gen_reg_rtx (Pmode);
3434 if (reload_in_progress || reload_completed)
3435 df_set_regs_ever_live (PIC_OFFSET_TABLE_REGNUM, true);
3437 addr = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, op0),
3438 UNSPEC_GOTOFF);
3439 addr = gen_rtx_PLUS (Pmode, addr, op1);
3440 addr = gen_rtx_CONST (Pmode, addr);
3441 addr = force_const_mem (Pmode, addr);
3442 emit_move_insn (temp, addr);
3444 new_rtx = gen_rtx_PLUS (Pmode, pic_offset_table_rtx, temp);
3445 if (reg != 0)
3447 s390_load_address (reg, new_rtx);
3448 new_rtx = reg;
3453 /* Now, check whether it is a GOT relative symbol plus offset
3454 that was pulled out of the literal pool. Force it back in. */
3456 else if (GET_CODE (op0) == UNSPEC
3457 && GET_CODE (op1) == CONST_INT
3458 && XINT (op0, 1) == UNSPEC_GOTOFF)
3460 gcc_assert (XVECLEN (op0, 0) == 1);
3462 new_rtx = force_const_mem (Pmode, orig);
3465 /* Otherwise, compute the sum. */
3466 else
3468 base = legitimize_pic_address (XEXP (addr, 0), reg);
3469 new_rtx = legitimize_pic_address (XEXP (addr, 1),
3470 base == reg ? NULL_RTX : reg);
3471 if (GET_CODE (new_rtx) == CONST_INT)
3472 new_rtx = plus_constant (base, INTVAL (new_rtx));
3473 else
3475 if (GET_CODE (new_rtx) == PLUS && CONSTANT_P (XEXP (new_rtx, 1)))
3477 base = gen_rtx_PLUS (Pmode, base, XEXP (new_rtx, 0));
3478 new_rtx = XEXP (new_rtx, 1);
3480 new_rtx = gen_rtx_PLUS (Pmode, base, new_rtx);
3483 if (GET_CODE (new_rtx) == CONST)
3484 new_rtx = XEXP (new_rtx, 0);
3485 new_rtx = force_operand (new_rtx, 0);
3489 return new_rtx;
3492 /* Load the thread pointer into a register. */
3495 s390_get_thread_pointer (void)
3497 rtx tp = gen_reg_rtx (Pmode);
3499 emit_move_insn (tp, gen_rtx_REG (Pmode, TP_REGNUM));
3500 mark_reg_pointer (tp, BITS_PER_WORD);
3502 return tp;
3505 /* Emit a tls call insn. The call target is the SYMBOL_REF stored
3506 in s390_tls_symbol which always refers to __tls_get_offset.
3507 The returned offset is written to RESULT_REG and an USE rtx is
3508 generated for TLS_CALL. */
3510 static GTY(()) rtx s390_tls_symbol;
3512 static void
3513 s390_emit_tls_call_insn (rtx result_reg, rtx tls_call)
3515 rtx insn;
3517 gcc_assert (flag_pic);
3519 if (!s390_tls_symbol)
3520 s390_tls_symbol = gen_rtx_SYMBOL_REF (Pmode, "__tls_get_offset");
3522 insn = s390_emit_call (s390_tls_symbol, tls_call, result_reg,
3523 gen_rtx_REG (Pmode, RETURN_REGNUM));
3525 use_reg (&CALL_INSN_FUNCTION_USAGE (insn), result_reg);
3526 RTL_CONST_CALL_P (insn) = 1;
3529 /* ADDR contains a thread-local SYMBOL_REF. Generate code to compute
3530 this (thread-local) address. REG may be used as temporary. */
3532 static rtx
3533 legitimize_tls_address (rtx addr, rtx reg)
3535 rtx new_rtx, tls_call, temp, base, r2, insn;
3537 if (GET_CODE (addr) == SYMBOL_REF)
3538 switch (tls_symbolic_operand (addr))
3540 case TLS_MODEL_GLOBAL_DYNAMIC:
3541 start_sequence ();
3542 r2 = gen_rtx_REG (Pmode, 2);
3543 tls_call = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, addr), UNSPEC_TLSGD);
3544 new_rtx = gen_rtx_CONST (Pmode, tls_call);
3545 new_rtx = force_const_mem (Pmode, new_rtx);
3546 emit_move_insn (r2, new_rtx);
3547 s390_emit_tls_call_insn (r2, tls_call);
3548 insn = get_insns ();
3549 end_sequence ();
3551 new_rtx = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, addr), UNSPEC_NTPOFF);
3552 temp = gen_reg_rtx (Pmode);
3553 emit_libcall_block (insn, temp, r2, new_rtx);
3555 new_rtx = gen_rtx_PLUS (Pmode, s390_get_thread_pointer (), temp);
3556 if (reg != 0)
3558 s390_load_address (reg, new_rtx);
3559 new_rtx = reg;
3561 break;
3563 case TLS_MODEL_LOCAL_DYNAMIC:
3564 start_sequence ();
3565 r2 = gen_rtx_REG (Pmode, 2);
3566 tls_call = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, const0_rtx), UNSPEC_TLSLDM);
3567 new_rtx = gen_rtx_CONST (Pmode, tls_call);
3568 new_rtx = force_const_mem (Pmode, new_rtx);
3569 emit_move_insn (r2, new_rtx);
3570 s390_emit_tls_call_insn (r2, tls_call);
3571 insn = get_insns ();
3572 end_sequence ();
3574 new_rtx = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, const0_rtx), UNSPEC_TLSLDM_NTPOFF);
3575 temp = gen_reg_rtx (Pmode);
3576 emit_libcall_block (insn, temp, r2, new_rtx);
3578 new_rtx = gen_rtx_PLUS (Pmode, s390_get_thread_pointer (), temp);
3579 base = gen_reg_rtx (Pmode);
3580 s390_load_address (base, new_rtx);
3582 new_rtx = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, addr), UNSPEC_DTPOFF);
3583 new_rtx = gen_rtx_CONST (Pmode, new_rtx);
3584 new_rtx = force_const_mem (Pmode, new_rtx);
3585 temp = gen_reg_rtx (Pmode);
3586 emit_move_insn (temp, new_rtx);
3588 new_rtx = gen_rtx_PLUS (Pmode, base, temp);
3589 if (reg != 0)
3591 s390_load_address (reg, new_rtx);
3592 new_rtx = reg;
3594 break;
3596 case TLS_MODEL_INITIAL_EXEC:
3597 if (flag_pic == 1)
3599 /* Assume GOT offset < 4k. This is handled the same way
3600 in both 31- and 64-bit code. */
3602 if (reload_in_progress || reload_completed)
3603 df_set_regs_ever_live (PIC_OFFSET_TABLE_REGNUM, true);
3605 new_rtx = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, addr), UNSPEC_GOTNTPOFF);
3606 new_rtx = gen_rtx_CONST (Pmode, new_rtx);
3607 new_rtx = gen_rtx_PLUS (Pmode, pic_offset_table_rtx, new_rtx);
3608 new_rtx = gen_const_mem (Pmode, new_rtx);
3609 temp = gen_reg_rtx (Pmode);
3610 emit_move_insn (temp, new_rtx);
3612 else if (TARGET_CPU_ZARCH)
3614 /* If the GOT offset might be >= 4k, we determine the position
3615 of the GOT entry via a PC-relative LARL. */
3617 new_rtx = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, addr), UNSPEC_INDNTPOFF);
3618 new_rtx = gen_rtx_CONST (Pmode, new_rtx);
3619 temp = gen_reg_rtx (Pmode);
3620 emit_move_insn (temp, new_rtx);
3622 new_rtx = gen_const_mem (Pmode, temp);
3623 temp = gen_reg_rtx (Pmode);
3624 emit_move_insn (temp, new_rtx);
3626 else if (flag_pic)
3628 /* If the GOT offset might be >= 4k, we have to load it
3629 from the literal pool. */
3631 if (reload_in_progress || reload_completed)
3632 df_set_regs_ever_live (PIC_OFFSET_TABLE_REGNUM, true);
3634 new_rtx = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, addr), UNSPEC_GOTNTPOFF);
3635 new_rtx = gen_rtx_CONST (Pmode, new_rtx);
3636 new_rtx = force_const_mem (Pmode, new_rtx);
3637 temp = gen_reg_rtx (Pmode);
3638 emit_move_insn (temp, new_rtx);
3640 new_rtx = gen_rtx_PLUS (Pmode, pic_offset_table_rtx, temp);
3641 new_rtx = gen_const_mem (Pmode, new_rtx);
3643 new_rtx = gen_rtx_UNSPEC (Pmode, gen_rtvec (2, new_rtx, addr), UNSPEC_TLS_LOAD);
3644 temp = gen_reg_rtx (Pmode);
3645 emit_insn (gen_rtx_SET (Pmode, temp, new_rtx));
3647 else
3649 /* In position-dependent code, load the absolute address of
3650 the GOT entry from the literal pool. */
3652 new_rtx = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, addr), UNSPEC_INDNTPOFF);
3653 new_rtx = gen_rtx_CONST (Pmode, new_rtx);
3654 new_rtx = force_const_mem (Pmode, new_rtx);
3655 temp = gen_reg_rtx (Pmode);
3656 emit_move_insn (temp, new_rtx);
3658 new_rtx = temp;
3659 new_rtx = gen_const_mem (Pmode, new_rtx);
3660 new_rtx = gen_rtx_UNSPEC (Pmode, gen_rtvec (2, new_rtx, addr), UNSPEC_TLS_LOAD);
3661 temp = gen_reg_rtx (Pmode);
3662 emit_insn (gen_rtx_SET (Pmode, temp, new_rtx));
3665 new_rtx = gen_rtx_PLUS (Pmode, s390_get_thread_pointer (), temp);
3666 if (reg != 0)
3668 s390_load_address (reg, new_rtx);
3669 new_rtx = reg;
3671 break;
3673 case TLS_MODEL_LOCAL_EXEC:
3674 new_rtx = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, addr), UNSPEC_NTPOFF);
3675 new_rtx = gen_rtx_CONST (Pmode, new_rtx);
3676 new_rtx = force_const_mem (Pmode, new_rtx);
3677 temp = gen_reg_rtx (Pmode);
3678 emit_move_insn (temp, new_rtx);
3680 new_rtx = gen_rtx_PLUS (Pmode, s390_get_thread_pointer (), temp);
3681 if (reg != 0)
3683 s390_load_address (reg, new_rtx);
3684 new_rtx = reg;
3686 break;
3688 default:
3689 gcc_unreachable ();
3692 else if (GET_CODE (addr) == CONST && GET_CODE (XEXP (addr, 0)) == UNSPEC)
3694 switch (XINT (XEXP (addr, 0), 1))
3696 case UNSPEC_INDNTPOFF:
3697 gcc_assert (TARGET_CPU_ZARCH);
3698 new_rtx = addr;
3699 break;
3701 default:
3702 gcc_unreachable ();
3706 else if (GET_CODE (addr) == CONST && GET_CODE (XEXP (addr, 0)) == PLUS
3707 && GET_CODE (XEXP (XEXP (addr, 0), 1)) == CONST_INT)
3709 new_rtx = XEXP (XEXP (addr, 0), 0);
3710 if (GET_CODE (new_rtx) != SYMBOL_REF)
3711 new_rtx = gen_rtx_CONST (Pmode, new_rtx);
3713 new_rtx = legitimize_tls_address (new_rtx, reg);
3714 new_rtx = plus_constant (new_rtx, INTVAL (XEXP (XEXP (addr, 0), 1)));
3715 new_rtx = force_operand (new_rtx, 0);
3718 else
3719 gcc_unreachable (); /* for now ... */
3721 return new_rtx;
3724 /* Emit insns making the address in operands[1] valid for a standard
3725 move to operands[0]. operands[1] is replaced by an address which
3726 should be used instead of the former RTX to emit the move
3727 pattern. */
3729 void
3730 emit_symbolic_move (rtx *operands)
3732 rtx temp = !can_create_pseudo_p () ? operands[0] : gen_reg_rtx (Pmode);
3734 if (GET_CODE (operands[0]) == MEM)
3735 operands[1] = force_reg (Pmode, operands[1]);
3736 else if (TLS_SYMBOLIC_CONST (operands[1]))
3737 operands[1] = legitimize_tls_address (operands[1], temp);
3738 else if (flag_pic)
3739 operands[1] = legitimize_pic_address (operands[1], temp);
3742 /* Try machine-dependent ways of modifying an illegitimate address X
3743 to be legitimate. If we find one, return the new, valid address.
3745 OLDX is the address as it was before break_out_memory_refs was called.
3746 In some cases it is useful to look at this to decide what needs to be done.
3748 MODE is the mode of the operand pointed to by X.
3750 When -fpic is used, special handling is needed for symbolic references.
3751 See comments by legitimize_pic_address for details. */
3753 static rtx
3754 s390_legitimize_address (rtx x, rtx oldx ATTRIBUTE_UNUSED,
3755 enum machine_mode mode ATTRIBUTE_UNUSED)
3757 rtx constant_term = const0_rtx;
3759 if (TLS_SYMBOLIC_CONST (x))
3761 x = legitimize_tls_address (x, 0);
3763 if (s390_legitimate_address_p (mode, x, FALSE))
3764 return x;
3766 else if (GET_CODE (x) == PLUS
3767 && (TLS_SYMBOLIC_CONST (XEXP (x, 0))
3768 || TLS_SYMBOLIC_CONST (XEXP (x, 1))))
3770 return x;
3772 else if (flag_pic)
3774 if (SYMBOLIC_CONST (x)
3775 || (GET_CODE (x) == PLUS
3776 && (SYMBOLIC_CONST (XEXP (x, 0))
3777 || SYMBOLIC_CONST (XEXP (x, 1)))))
3778 x = legitimize_pic_address (x, 0);
3780 if (s390_legitimate_address_p (mode, x, FALSE))
3781 return x;
3784 x = eliminate_constant_term (x, &constant_term);
3786 /* Optimize loading of large displacements by splitting them
3787 into the multiple of 4K and the rest; this allows the
3788 former to be CSE'd if possible.
3790 Don't do this if the displacement is added to a register
3791 pointing into the stack frame, as the offsets will
3792 change later anyway. */
3794 if (GET_CODE (constant_term) == CONST_INT
3795 && !TARGET_LONG_DISPLACEMENT
3796 && !DISP_IN_RANGE (INTVAL (constant_term))
3797 && !(REG_P (x) && REGNO_PTR_FRAME_P (REGNO (x))))
3799 HOST_WIDE_INT lower = INTVAL (constant_term) & 0xfff;
3800 HOST_WIDE_INT upper = INTVAL (constant_term) ^ lower;
3802 rtx temp = gen_reg_rtx (Pmode);
3803 rtx val = force_operand (GEN_INT (upper), temp);
3804 if (val != temp)
3805 emit_move_insn (temp, val);
3807 x = gen_rtx_PLUS (Pmode, x, temp);
3808 constant_term = GEN_INT (lower);
3811 if (GET_CODE (x) == PLUS)
3813 if (GET_CODE (XEXP (x, 0)) == REG)
3815 rtx temp = gen_reg_rtx (Pmode);
3816 rtx val = force_operand (XEXP (x, 1), temp);
3817 if (val != temp)
3818 emit_move_insn (temp, val);
3820 x = gen_rtx_PLUS (Pmode, XEXP (x, 0), temp);
3823 else if (GET_CODE (XEXP (x, 1)) == REG)
3825 rtx temp = gen_reg_rtx (Pmode);
3826 rtx val = force_operand (XEXP (x, 0), temp);
3827 if (val != temp)
3828 emit_move_insn (temp, val);
3830 x = gen_rtx_PLUS (Pmode, temp, XEXP (x, 1));
3834 if (constant_term != const0_rtx)
3835 x = gen_rtx_PLUS (Pmode, x, constant_term);
3837 return x;
3840 /* Try a machine-dependent way of reloading an illegitimate address AD
3841 operand. If we find one, push the reload and and return the new address.
3843 MODE is the mode of the enclosing MEM. OPNUM is the operand number
3844 and TYPE is the reload type of the current reload. */
3847 legitimize_reload_address (rtx ad, enum machine_mode mode ATTRIBUTE_UNUSED,
3848 int opnum, int type)
3850 if (!optimize || TARGET_LONG_DISPLACEMENT)
3851 return NULL_RTX;
3853 if (GET_CODE (ad) == PLUS)
3855 rtx tem = simplify_binary_operation (PLUS, Pmode,
3856 XEXP (ad, 0), XEXP (ad, 1));
3857 if (tem)
3858 ad = tem;
3861 if (GET_CODE (ad) == PLUS
3862 && GET_CODE (XEXP (ad, 0)) == REG
3863 && GET_CODE (XEXP (ad, 1)) == CONST_INT
3864 && !DISP_IN_RANGE (INTVAL (XEXP (ad, 1))))
3866 HOST_WIDE_INT lower = INTVAL (XEXP (ad, 1)) & 0xfff;
3867 HOST_WIDE_INT upper = INTVAL (XEXP (ad, 1)) ^ lower;
3868 rtx cst, tem, new_rtx;
3870 cst = GEN_INT (upper);
3871 if (!legitimate_reload_constant_p (cst))
3872 cst = force_const_mem (Pmode, cst);
3874 tem = gen_rtx_PLUS (Pmode, XEXP (ad, 0), cst);
3875 new_rtx = gen_rtx_PLUS (Pmode, tem, GEN_INT (lower));
3877 push_reload (XEXP (tem, 1), 0, &XEXP (tem, 1), 0,
3878 BASE_REG_CLASS, Pmode, VOIDmode, 0, 0,
3879 opnum, (enum reload_type) type);
3880 return new_rtx;
3883 return NULL_RTX;
3886 /* Emit code to move LEN bytes from DST to SRC. */
3888 void
3889 s390_expand_movmem (rtx dst, rtx src, rtx len)
3891 if (GET_CODE (len) == CONST_INT && INTVAL (len) >= 0 && INTVAL (len) <= 256)
3893 if (INTVAL (len) > 0)
3894 emit_insn (gen_movmem_short (dst, src, GEN_INT (INTVAL (len) - 1)));
3897 else if (TARGET_MVCLE)
3899 emit_insn (gen_movmem_long (dst, src, convert_to_mode (Pmode, len, 1)));
3902 else
3904 rtx dst_addr, src_addr, count, blocks, temp;
3905 rtx loop_start_label = gen_label_rtx ();
3906 rtx loop_end_label = gen_label_rtx ();
3907 rtx end_label = gen_label_rtx ();
3908 enum machine_mode mode;
3910 mode = GET_MODE (len);
3911 if (mode == VOIDmode)
3912 mode = Pmode;
3914 dst_addr = gen_reg_rtx (Pmode);
3915 src_addr = gen_reg_rtx (Pmode);
3916 count = gen_reg_rtx (mode);
3917 blocks = gen_reg_rtx (mode);
3919 convert_move (count, len, 1);
3920 emit_cmp_and_jump_insns (count, const0_rtx,
3921 EQ, NULL_RTX, mode, 1, end_label);
3923 emit_move_insn (dst_addr, force_operand (XEXP (dst, 0), NULL_RTX));
3924 emit_move_insn (src_addr, force_operand (XEXP (src, 0), NULL_RTX));
3925 dst = change_address (dst, VOIDmode, dst_addr);
3926 src = change_address (src, VOIDmode, src_addr);
3928 temp = expand_binop (mode, add_optab, count, constm1_rtx, count, 1,
3929 OPTAB_DIRECT);
3930 if (temp != count)
3931 emit_move_insn (count, temp);
3933 temp = expand_binop (mode, lshr_optab, count, GEN_INT (8), blocks, 1,
3934 OPTAB_DIRECT);
3935 if (temp != blocks)
3936 emit_move_insn (blocks, temp);
3938 emit_cmp_and_jump_insns (blocks, const0_rtx,
3939 EQ, NULL_RTX, mode, 1, loop_end_label);
3941 emit_label (loop_start_label);
3943 emit_insn (gen_movmem_short (dst, src, GEN_INT (255)));
3944 s390_load_address (dst_addr,
3945 gen_rtx_PLUS (Pmode, dst_addr, GEN_INT (256)));
3946 s390_load_address (src_addr,
3947 gen_rtx_PLUS (Pmode, src_addr, GEN_INT (256)));
3949 temp = expand_binop (mode, add_optab, blocks, constm1_rtx, blocks, 1,
3950 OPTAB_DIRECT);
3951 if (temp != blocks)
3952 emit_move_insn (blocks, temp);
3954 emit_cmp_and_jump_insns (blocks, const0_rtx,
3955 EQ, NULL_RTX, mode, 1, loop_end_label);
3957 emit_jump (loop_start_label);
3958 emit_label (loop_end_label);
3960 emit_insn (gen_movmem_short (dst, src,
3961 convert_to_mode (Pmode, count, 1)));
3962 emit_label (end_label);
3966 /* Emit code to set LEN bytes at DST to VAL.
3967 Make use of clrmem if VAL is zero. */
3969 void
3970 s390_expand_setmem (rtx dst, rtx len, rtx val)
3972 if (GET_CODE (len) == CONST_INT && INTVAL (len) == 0)
3973 return;
3975 gcc_assert (GET_CODE (val) == CONST_INT || GET_MODE (val) == QImode);
3977 if (GET_CODE (len) == CONST_INT && INTVAL (len) > 0 && INTVAL (len) <= 257)
3979 if (val == const0_rtx && INTVAL (len) <= 256)
3980 emit_insn (gen_clrmem_short (dst, GEN_INT (INTVAL (len) - 1)));
3981 else
3983 /* Initialize memory by storing the first byte. */
3984 emit_move_insn (adjust_address (dst, QImode, 0), val);
3986 if (INTVAL (len) > 1)
3988 /* Initiate 1 byte overlap move.
3989 The first byte of DST is propagated through DSTP1.
3990 Prepare a movmem for: DST+1 = DST (length = LEN - 1).
3991 DST is set to size 1 so the rest of the memory location
3992 does not count as source operand. */
3993 rtx dstp1 = adjust_address (dst, VOIDmode, 1);
3994 set_mem_size (dst, const1_rtx);
3996 emit_insn (gen_movmem_short (dstp1, dst,
3997 GEN_INT (INTVAL (len) - 2)));
4002 else if (TARGET_MVCLE)
4004 val = force_not_mem (convert_modes (Pmode, QImode, val, 1));
4005 emit_insn (gen_setmem_long (dst, convert_to_mode (Pmode, len, 1), val));
4008 else
4010 rtx dst_addr, src_addr, count, blocks, temp, dstp1 = NULL_RTX;
4011 rtx loop_start_label = gen_label_rtx ();
4012 rtx loop_end_label = gen_label_rtx ();
4013 rtx end_label = gen_label_rtx ();
4014 enum machine_mode mode;
4016 mode = GET_MODE (len);
4017 if (mode == VOIDmode)
4018 mode = Pmode;
4020 dst_addr = gen_reg_rtx (Pmode);
4021 src_addr = gen_reg_rtx (Pmode);
4022 count = gen_reg_rtx (mode);
4023 blocks = gen_reg_rtx (mode);
4025 convert_move (count, len, 1);
4026 emit_cmp_and_jump_insns (count, const0_rtx,
4027 EQ, NULL_RTX, mode, 1, end_label);
4029 emit_move_insn (dst_addr, force_operand (XEXP (dst, 0), NULL_RTX));
4030 dst = change_address (dst, VOIDmode, dst_addr);
4032 if (val == const0_rtx)
4033 temp = expand_binop (mode, add_optab, count, constm1_rtx, count, 1,
4034 OPTAB_DIRECT);
4035 else
4037 dstp1 = adjust_address (dst, VOIDmode, 1);
4038 set_mem_size (dst, const1_rtx);
4040 /* Initialize memory by storing the first byte. */
4041 emit_move_insn (adjust_address (dst, QImode, 0), val);
4043 /* If count is 1 we are done. */
4044 emit_cmp_and_jump_insns (count, const1_rtx,
4045 EQ, NULL_RTX, mode, 1, end_label);
4047 temp = expand_binop (mode, add_optab, count, GEN_INT (-2), count, 1,
4048 OPTAB_DIRECT);
4050 if (temp != count)
4051 emit_move_insn (count, temp);
4053 temp = expand_binop (mode, lshr_optab, count, GEN_INT (8), blocks, 1,
4054 OPTAB_DIRECT);
4055 if (temp != blocks)
4056 emit_move_insn (blocks, temp);
4058 emit_cmp_and_jump_insns (blocks, const0_rtx,
4059 EQ, NULL_RTX, mode, 1, loop_end_label);
4061 emit_label (loop_start_label);
4063 if (val == const0_rtx)
4064 emit_insn (gen_clrmem_short (dst, GEN_INT (255)));
4065 else
4066 emit_insn (gen_movmem_short (dstp1, dst, GEN_INT (255)));
4067 s390_load_address (dst_addr,
4068 gen_rtx_PLUS (Pmode, dst_addr, GEN_INT (256)));
4070 temp = expand_binop (mode, add_optab, blocks, constm1_rtx, blocks, 1,
4071 OPTAB_DIRECT);
4072 if (temp != blocks)
4073 emit_move_insn (blocks, temp);
4075 emit_cmp_and_jump_insns (blocks, const0_rtx,
4076 EQ, NULL_RTX, mode, 1, loop_end_label);
4078 emit_jump (loop_start_label);
4079 emit_label (loop_end_label);
4081 if (val == const0_rtx)
4082 emit_insn (gen_clrmem_short (dst, convert_to_mode (Pmode, count, 1)));
4083 else
4084 emit_insn (gen_movmem_short (dstp1, dst, convert_to_mode (Pmode, count, 1)));
4085 emit_label (end_label);
4089 /* Emit code to compare LEN bytes at OP0 with those at OP1,
4090 and return the result in TARGET. */
4092 void
4093 s390_expand_cmpmem (rtx target, rtx op0, rtx op1, rtx len)
4095 rtx ccreg = gen_rtx_REG (CCUmode, CC_REGNUM);
4096 rtx tmp;
4098 /* As the result of CMPINT is inverted compared to what we need,
4099 we have to swap the operands. */
4100 tmp = op0; op0 = op1; op1 = tmp;
4102 if (GET_CODE (len) == CONST_INT && INTVAL (len) >= 0 && INTVAL (len) <= 256)
4104 if (INTVAL (len) > 0)
4106 emit_insn (gen_cmpmem_short (op0, op1, GEN_INT (INTVAL (len) - 1)));
4107 emit_insn (gen_cmpint (target, ccreg));
4109 else
4110 emit_move_insn (target, const0_rtx);
4112 else if (TARGET_MVCLE)
4114 emit_insn (gen_cmpmem_long (op0, op1, convert_to_mode (Pmode, len, 1)));
4115 emit_insn (gen_cmpint (target, ccreg));
4117 else
4119 rtx addr0, addr1, count, blocks, temp;
4120 rtx loop_start_label = gen_label_rtx ();
4121 rtx loop_end_label = gen_label_rtx ();
4122 rtx end_label = gen_label_rtx ();
4123 enum machine_mode mode;
4125 mode = GET_MODE (len);
4126 if (mode == VOIDmode)
4127 mode = Pmode;
4129 addr0 = gen_reg_rtx (Pmode);
4130 addr1 = gen_reg_rtx (Pmode);
4131 count = gen_reg_rtx (mode);
4132 blocks = gen_reg_rtx (mode);
4134 convert_move (count, len, 1);
4135 emit_cmp_and_jump_insns (count, const0_rtx,
4136 EQ, NULL_RTX, mode, 1, end_label);
4138 emit_move_insn (addr0, force_operand (XEXP (op0, 0), NULL_RTX));
4139 emit_move_insn (addr1, force_operand (XEXP (op1, 0), NULL_RTX));
4140 op0 = change_address (op0, VOIDmode, addr0);
4141 op1 = change_address (op1, VOIDmode, addr1);
4143 temp = expand_binop (mode, add_optab, count, constm1_rtx, count, 1,
4144 OPTAB_DIRECT);
4145 if (temp != count)
4146 emit_move_insn (count, temp);
4148 temp = expand_binop (mode, lshr_optab, count, GEN_INT (8), blocks, 1,
4149 OPTAB_DIRECT);
4150 if (temp != blocks)
4151 emit_move_insn (blocks, temp);
4153 emit_cmp_and_jump_insns (blocks, const0_rtx,
4154 EQ, NULL_RTX, mode, 1, loop_end_label);
4156 emit_label (loop_start_label);
4158 emit_insn (gen_cmpmem_short (op0, op1, GEN_INT (255)));
4159 temp = gen_rtx_NE (VOIDmode, ccreg, const0_rtx);
4160 temp = gen_rtx_IF_THEN_ELSE (VOIDmode, temp,
4161 gen_rtx_LABEL_REF (VOIDmode, end_label), pc_rtx);
4162 temp = gen_rtx_SET (VOIDmode, pc_rtx, temp);
4163 emit_jump_insn (temp);
4165 s390_load_address (addr0,
4166 gen_rtx_PLUS (Pmode, addr0, GEN_INT (256)));
4167 s390_load_address (addr1,
4168 gen_rtx_PLUS (Pmode, addr1, GEN_INT (256)));
4170 temp = expand_binop (mode, add_optab, blocks, constm1_rtx, blocks, 1,
4171 OPTAB_DIRECT);
4172 if (temp != blocks)
4173 emit_move_insn (blocks, temp);
4175 emit_cmp_and_jump_insns (blocks, const0_rtx,
4176 EQ, NULL_RTX, mode, 1, loop_end_label);
4178 emit_jump (loop_start_label);
4179 emit_label (loop_end_label);
4181 emit_insn (gen_cmpmem_short (op0, op1,
4182 convert_to_mode (Pmode, count, 1)));
4183 emit_label (end_label);
4185 emit_insn (gen_cmpint (target, ccreg));
4190 /* Expand conditional increment or decrement using alc/slb instructions.
4191 Should generate code setting DST to either SRC or SRC + INCREMENT,
4192 depending on the result of the comparison CMP_OP0 CMP_CODE CMP_OP1.
4193 Returns true if successful, false otherwise.
4195 That makes it possible to implement some if-constructs without jumps e.g.:
4196 (borrow = CC0 | CC1 and carry = CC2 | CC3)
4197 unsigned int a, b, c;
4198 if (a < b) c++; -> CCU b > a -> CC2; c += carry;
4199 if (a < b) c--; -> CCL3 a - b -> borrow; c -= borrow;
4200 if (a <= b) c++; -> CCL3 b - a -> borrow; c += carry;
4201 if (a <= b) c--; -> CCU a <= b -> borrow; c -= borrow;
4203 Checks for EQ and NE with a nonzero value need an additional xor e.g.:
4204 if (a == b) c++; -> CCL3 a ^= b; 0 - a -> borrow; c += carry;
4205 if (a == b) c--; -> CCU a ^= b; a <= 0 -> CC0 | CC1; c -= borrow;
4206 if (a != b) c++; -> CCU a ^= b; a > 0 -> CC2; c += carry;
4207 if (a != b) c--; -> CCL3 a ^= b; 0 - a -> borrow; c -= borrow; */
4209 bool
4210 s390_expand_addcc (enum rtx_code cmp_code, rtx cmp_op0, rtx cmp_op1,
4211 rtx dst, rtx src, rtx increment)
4213 enum machine_mode cmp_mode;
4214 enum machine_mode cc_mode;
4215 rtx op_res;
4216 rtx insn;
4217 rtvec p;
4218 int ret;
4220 if ((GET_MODE (cmp_op0) == SImode || GET_MODE (cmp_op0) == VOIDmode)
4221 && (GET_MODE (cmp_op1) == SImode || GET_MODE (cmp_op1) == VOIDmode))
4222 cmp_mode = SImode;
4223 else if ((GET_MODE (cmp_op0) == DImode || GET_MODE (cmp_op0) == VOIDmode)
4224 && (GET_MODE (cmp_op1) == DImode || GET_MODE (cmp_op1) == VOIDmode))
4225 cmp_mode = DImode;
4226 else
4227 return false;
4229 /* Try ADD LOGICAL WITH CARRY. */
4230 if (increment == const1_rtx)
4232 /* Determine CC mode to use. */
4233 if (cmp_code == EQ || cmp_code == NE)
4235 if (cmp_op1 != const0_rtx)
4237 cmp_op0 = expand_simple_binop (cmp_mode, XOR, cmp_op0, cmp_op1,
4238 NULL_RTX, 0, OPTAB_WIDEN);
4239 cmp_op1 = const0_rtx;
4242 cmp_code = cmp_code == EQ ? LEU : GTU;
4245 if (cmp_code == LTU || cmp_code == LEU)
4247 rtx tem = cmp_op0;
4248 cmp_op0 = cmp_op1;
4249 cmp_op1 = tem;
4250 cmp_code = swap_condition (cmp_code);
4253 switch (cmp_code)
4255 case GTU:
4256 cc_mode = CCUmode;
4257 break;
4259 case GEU:
4260 cc_mode = CCL3mode;
4261 break;
4263 default:
4264 return false;
4267 /* Emit comparison instruction pattern. */
4268 if (!register_operand (cmp_op0, cmp_mode))
4269 cmp_op0 = force_reg (cmp_mode, cmp_op0);
4271 insn = gen_rtx_SET (VOIDmode, gen_rtx_REG (cc_mode, CC_REGNUM),
4272 gen_rtx_COMPARE (cc_mode, cmp_op0, cmp_op1));
4273 /* We use insn_invalid_p here to add clobbers if required. */
4274 ret = insn_invalid_p (emit_insn (insn));
4275 gcc_assert (!ret);
4277 /* Emit ALC instruction pattern. */
4278 op_res = gen_rtx_fmt_ee (cmp_code, GET_MODE (dst),
4279 gen_rtx_REG (cc_mode, CC_REGNUM),
4280 const0_rtx);
4282 if (src != const0_rtx)
4284 if (!register_operand (src, GET_MODE (dst)))
4285 src = force_reg (GET_MODE (dst), src);
4287 op_res = gen_rtx_PLUS (GET_MODE (dst), op_res, src);
4288 op_res = gen_rtx_PLUS (GET_MODE (dst), op_res, const0_rtx);
4291 p = rtvec_alloc (2);
4292 RTVEC_ELT (p, 0) =
4293 gen_rtx_SET (VOIDmode, dst, op_res);
4294 RTVEC_ELT (p, 1) =
4295 gen_rtx_CLOBBER (VOIDmode, gen_rtx_REG (CCmode, CC_REGNUM));
4296 emit_insn (gen_rtx_PARALLEL (VOIDmode, p));
4298 return true;
4301 /* Try SUBTRACT LOGICAL WITH BORROW. */
4302 if (increment == constm1_rtx)
4304 /* Determine CC mode to use. */
4305 if (cmp_code == EQ || cmp_code == NE)
4307 if (cmp_op1 != const0_rtx)
4309 cmp_op0 = expand_simple_binop (cmp_mode, XOR, cmp_op0, cmp_op1,
4310 NULL_RTX, 0, OPTAB_WIDEN);
4311 cmp_op1 = const0_rtx;
4314 cmp_code = cmp_code == EQ ? LEU : GTU;
4317 if (cmp_code == GTU || cmp_code == GEU)
4319 rtx tem = cmp_op0;
4320 cmp_op0 = cmp_op1;
4321 cmp_op1 = tem;
4322 cmp_code = swap_condition (cmp_code);
4325 switch (cmp_code)
4327 case LEU:
4328 cc_mode = CCUmode;
4329 break;
4331 case LTU:
4332 cc_mode = CCL3mode;
4333 break;
4335 default:
4336 return false;
4339 /* Emit comparison instruction pattern. */
4340 if (!register_operand (cmp_op0, cmp_mode))
4341 cmp_op0 = force_reg (cmp_mode, cmp_op0);
4343 insn = gen_rtx_SET (VOIDmode, gen_rtx_REG (cc_mode, CC_REGNUM),
4344 gen_rtx_COMPARE (cc_mode, cmp_op0, cmp_op1));
4345 /* We use insn_invalid_p here to add clobbers if required. */
4346 ret = insn_invalid_p (emit_insn (insn));
4347 gcc_assert (!ret);
4349 /* Emit SLB instruction pattern. */
4350 if (!register_operand (src, GET_MODE (dst)))
4351 src = force_reg (GET_MODE (dst), src);
4353 op_res = gen_rtx_MINUS (GET_MODE (dst),
4354 gen_rtx_MINUS (GET_MODE (dst), src, const0_rtx),
4355 gen_rtx_fmt_ee (cmp_code, GET_MODE (dst),
4356 gen_rtx_REG (cc_mode, CC_REGNUM),
4357 const0_rtx));
4358 p = rtvec_alloc (2);
4359 RTVEC_ELT (p, 0) =
4360 gen_rtx_SET (VOIDmode, dst, op_res);
4361 RTVEC_ELT (p, 1) =
4362 gen_rtx_CLOBBER (VOIDmode, gen_rtx_REG (CCmode, CC_REGNUM));
4363 emit_insn (gen_rtx_PARALLEL (VOIDmode, p));
4365 return true;
4368 return false;
4371 /* Expand code for the insv template. Return true if successful. */
4373 bool
4374 s390_expand_insv (rtx dest, rtx op1, rtx op2, rtx src)
4376 int bitsize = INTVAL (op1);
4377 int bitpos = INTVAL (op2);
4379 /* On z10 we can use the risbg instruction to implement insv. */
4380 if (TARGET_Z10
4381 && ((GET_MODE (dest) == DImode && GET_MODE (src) == DImode)
4382 || (GET_MODE (dest) == SImode && GET_MODE (src) == SImode)))
4384 rtx op;
4385 rtx clobber;
4387 op = gen_rtx_SET (GET_MODE(src),
4388 gen_rtx_ZERO_EXTRACT (GET_MODE (dest), dest, op1, op2),
4389 src);
4390 clobber = gen_rtx_CLOBBER (VOIDmode, gen_rtx_REG (CCmode, CC_REGNUM));
4391 emit_insn (gen_rtx_PARALLEL (VOIDmode, gen_rtvec (2, op, clobber)));
4393 return true;
4396 /* We need byte alignment. */
4397 if (bitsize % BITS_PER_UNIT)
4398 return false;
4400 if (bitpos == 0
4401 && memory_operand (dest, VOIDmode)
4402 && (register_operand (src, word_mode)
4403 || const_int_operand (src, VOIDmode)))
4405 /* Emit standard pattern if possible. */
4406 enum machine_mode mode = smallest_mode_for_size (bitsize, MODE_INT);
4407 if (GET_MODE_BITSIZE (mode) == bitsize)
4408 emit_move_insn (adjust_address (dest, mode, 0), gen_lowpart (mode, src));
4410 /* (set (ze (mem)) (const_int)). */
4411 else if (const_int_operand (src, VOIDmode))
4413 int size = bitsize / BITS_PER_UNIT;
4414 rtx src_mem = adjust_address (force_const_mem (word_mode, src), BLKmode,
4415 GET_MODE_SIZE (word_mode) - size);
4417 dest = adjust_address (dest, BLKmode, 0);
4418 set_mem_size (dest, GEN_INT (size));
4419 s390_expand_movmem (dest, src_mem, GEN_INT (size));
4422 /* (set (ze (mem)) (reg)). */
4423 else if (register_operand (src, word_mode))
4425 if (bitsize <= GET_MODE_BITSIZE (SImode))
4426 emit_move_insn (gen_rtx_ZERO_EXTRACT (word_mode, dest, op1,
4427 const0_rtx), src);
4428 else
4430 /* Emit st,stcmh sequence. */
4431 int stcmh_width = bitsize - GET_MODE_BITSIZE (SImode);
4432 int size = stcmh_width / BITS_PER_UNIT;
4434 emit_move_insn (adjust_address (dest, SImode, size),
4435 gen_lowpart (SImode, src));
4436 set_mem_size (dest, GEN_INT (size));
4437 emit_move_insn (gen_rtx_ZERO_EXTRACT (word_mode, dest, GEN_INT
4438 (stcmh_width), const0_rtx),
4439 gen_rtx_LSHIFTRT (word_mode, src, GEN_INT
4440 (GET_MODE_BITSIZE (SImode))));
4443 else
4444 return false;
4446 return true;
4449 /* (set (ze (reg)) (const_int)). */
4450 if (TARGET_ZARCH
4451 && register_operand (dest, word_mode)
4452 && (bitpos % 16) == 0
4453 && (bitsize % 16) == 0
4454 && const_int_operand (src, VOIDmode))
4456 HOST_WIDE_INT val = INTVAL (src);
4457 int regpos = bitpos + bitsize;
4459 while (regpos > bitpos)
4461 enum machine_mode putmode;
4462 int putsize;
4464 if (TARGET_EXTIMM && (regpos % 32 == 0) && (regpos >= bitpos + 32))
4465 putmode = SImode;
4466 else
4467 putmode = HImode;
4469 putsize = GET_MODE_BITSIZE (putmode);
4470 regpos -= putsize;
4471 emit_move_insn (gen_rtx_ZERO_EXTRACT (word_mode, dest,
4472 GEN_INT (putsize),
4473 GEN_INT (regpos)),
4474 gen_int_mode (val, putmode));
4475 val >>= putsize;
4477 gcc_assert (regpos == bitpos);
4478 return true;
4481 return false;
4484 /* A subroutine of s390_expand_cs_hqi and s390_expand_atomic which returns a
4485 register that holds VAL of mode MODE shifted by COUNT bits. */
4487 static inline rtx
4488 s390_expand_mask_and_shift (rtx val, enum machine_mode mode, rtx count)
4490 val = expand_simple_binop (SImode, AND, val, GEN_INT (GET_MODE_MASK (mode)),
4491 NULL_RTX, 1, OPTAB_DIRECT);
4492 return expand_simple_binop (SImode, ASHIFT, val, count,
4493 NULL_RTX, 1, OPTAB_DIRECT);
4496 /* Structure to hold the initial parameters for a compare_and_swap operation
4497 in HImode and QImode. */
4499 struct alignment_context
4501 rtx memsi; /* SI aligned memory location. */
4502 rtx shift; /* Bit offset with regard to lsb. */
4503 rtx modemask; /* Mask of the HQImode shifted by SHIFT bits. */
4504 rtx modemaski; /* ~modemask */
4505 bool aligned; /* True if memory is aligned, false else. */
4508 /* A subroutine of s390_expand_cs_hqi and s390_expand_atomic to initialize
4509 structure AC for transparent simplifying, if the memory alignment is known
4510 to be at least 32bit. MEM is the memory location for the actual operation
4511 and MODE its mode. */
4513 static void
4514 init_alignment_context (struct alignment_context *ac, rtx mem,
4515 enum machine_mode mode)
4517 ac->shift = GEN_INT (GET_MODE_SIZE (SImode) - GET_MODE_SIZE (mode));
4518 ac->aligned = (MEM_ALIGN (mem) >= GET_MODE_BITSIZE (SImode));
4520 if (ac->aligned)
4521 ac->memsi = adjust_address (mem, SImode, 0); /* Memory is aligned. */
4522 else
4524 /* Alignment is unknown. */
4525 rtx byteoffset, addr, align;
4527 /* Force the address into a register. */
4528 addr = force_reg (Pmode, XEXP (mem, 0));
4530 /* Align it to SImode. */
4531 align = expand_simple_binop (Pmode, AND, addr,
4532 GEN_INT (-GET_MODE_SIZE (SImode)),
4533 NULL_RTX, 1, OPTAB_DIRECT);
4534 /* Generate MEM. */
4535 ac->memsi = gen_rtx_MEM (SImode, align);
4536 MEM_VOLATILE_P (ac->memsi) = MEM_VOLATILE_P (mem);
4537 set_mem_alias_set (ac->memsi, ALIAS_SET_MEMORY_BARRIER);
4538 set_mem_align (ac->memsi, GET_MODE_BITSIZE (SImode));
4540 /* Calculate shiftcount. */
4541 byteoffset = expand_simple_binop (Pmode, AND, addr,
4542 GEN_INT (GET_MODE_SIZE (SImode) - 1),
4543 NULL_RTX, 1, OPTAB_DIRECT);
4544 /* As we already have some offset, evaluate the remaining distance. */
4545 ac->shift = expand_simple_binop (SImode, MINUS, ac->shift, byteoffset,
4546 NULL_RTX, 1, OPTAB_DIRECT);
4549 /* Shift is the byte count, but we need the bitcount. */
4550 ac->shift = expand_simple_binop (SImode, MULT, ac->shift, GEN_INT (BITS_PER_UNIT),
4551 NULL_RTX, 1, OPTAB_DIRECT);
4552 /* Calculate masks. */
4553 ac->modemask = expand_simple_binop (SImode, ASHIFT,
4554 GEN_INT (GET_MODE_MASK (mode)), ac->shift,
4555 NULL_RTX, 1, OPTAB_DIRECT);
4556 ac->modemaski = expand_simple_unop (SImode, NOT, ac->modemask, NULL_RTX, 1);
4559 /* Expand an atomic compare and swap operation for HImode and QImode. MEM is
4560 the memory location, CMP the old value to compare MEM with and NEW_RTX the value
4561 to set if CMP == MEM.
4562 CMP is never in memory for compare_and_swap_cc because
4563 expand_bool_compare_and_swap puts it into a register for later compare. */
4565 void
4566 s390_expand_cs_hqi (enum machine_mode mode, rtx target, rtx mem, rtx cmp, rtx new_rtx)
4568 struct alignment_context ac;
4569 rtx cmpv, newv, val, resv, cc;
4570 rtx res = gen_reg_rtx (SImode);
4571 rtx csloop = gen_label_rtx ();
4572 rtx csend = gen_label_rtx ();
4574 gcc_assert (register_operand (target, VOIDmode));
4575 gcc_assert (MEM_P (mem));
4577 init_alignment_context (&ac, mem, mode);
4579 /* Shift the values to the correct bit positions. */
4580 if (!(ac.aligned && MEM_P (cmp)))
4581 cmp = s390_expand_mask_and_shift (cmp, mode, ac.shift);
4582 if (!(ac.aligned && MEM_P (new_rtx)))
4583 new_rtx = s390_expand_mask_and_shift (new_rtx, mode, ac.shift);
4585 /* Load full word. Subsequent loads are performed by CS. */
4586 val = expand_simple_binop (SImode, AND, ac.memsi, ac.modemaski,
4587 NULL_RTX, 1, OPTAB_DIRECT);
4589 /* Start CS loop. */
4590 emit_label (csloop);
4591 /* val = "<mem>00..0<mem>"
4592 * cmp = "00..0<cmp>00..0"
4593 * new = "00..0<new>00..0"
4596 /* Patch cmp and new with val at correct position. */
4597 if (ac.aligned && MEM_P (cmp))
4599 cmpv = force_reg (SImode, val);
4600 store_bit_field (cmpv, GET_MODE_BITSIZE (mode), 0, SImode, cmp);
4602 else
4603 cmpv = force_reg (SImode, expand_simple_binop (SImode, IOR, cmp, val,
4604 NULL_RTX, 1, OPTAB_DIRECT));
4605 if (ac.aligned && MEM_P (new_rtx))
4607 newv = force_reg (SImode, val);
4608 store_bit_field (newv, GET_MODE_BITSIZE (mode), 0, SImode, new_rtx);
4610 else
4611 newv = force_reg (SImode, expand_simple_binop (SImode, IOR, new_rtx, val,
4612 NULL_RTX, 1, OPTAB_DIRECT));
4614 /* Jump to end if we're done (likely?). */
4615 s390_emit_jump (csend, s390_emit_compare_and_swap (EQ, res, ac.memsi,
4616 cmpv, newv));
4618 /* Check for changes outside mode. */
4619 resv = expand_simple_binop (SImode, AND, res, ac.modemaski,
4620 NULL_RTX, 1, OPTAB_DIRECT);
4621 cc = s390_emit_compare (NE, resv, val);
4622 emit_move_insn (val, resv);
4623 /* Loop internal if so. */
4624 s390_emit_jump (csloop, cc);
4626 emit_label (csend);
4628 /* Return the correct part of the bitfield. */
4629 convert_move (target, expand_simple_binop (SImode, LSHIFTRT, res, ac.shift,
4630 NULL_RTX, 1, OPTAB_DIRECT), 1);
4633 /* Expand an atomic operation CODE of mode MODE. MEM is the memory location
4634 and VAL the value to play with. If AFTER is true then store the value
4635 MEM holds after the operation, if AFTER is false then store the value MEM
4636 holds before the operation. If TARGET is zero then discard that value, else
4637 store it to TARGET. */
4639 void
4640 s390_expand_atomic (enum machine_mode mode, enum rtx_code code,
4641 rtx target, rtx mem, rtx val, bool after)
4643 struct alignment_context ac;
4644 rtx cmp;
4645 rtx new_rtx = gen_reg_rtx (SImode);
4646 rtx orig = gen_reg_rtx (SImode);
4647 rtx csloop = gen_label_rtx ();
4649 gcc_assert (!target || register_operand (target, VOIDmode));
4650 gcc_assert (MEM_P (mem));
4652 init_alignment_context (&ac, mem, mode);
4654 /* Shift val to the correct bit positions.
4655 Preserve "icm", but prevent "ex icm". */
4656 if (!(ac.aligned && code == SET && MEM_P (val)))
4657 val = s390_expand_mask_and_shift (val, mode, ac.shift);
4659 /* Further preparation insns. */
4660 if (code == PLUS || code == MINUS)
4661 emit_move_insn (orig, val);
4662 else if (code == MULT || code == AND) /* val = "11..1<val>11..1" */
4663 val = expand_simple_binop (SImode, XOR, val, ac.modemaski,
4664 NULL_RTX, 1, OPTAB_DIRECT);
4666 /* Load full word. Subsequent loads are performed by CS. */
4667 cmp = force_reg (SImode, ac.memsi);
4669 /* Start CS loop. */
4670 emit_label (csloop);
4671 emit_move_insn (new_rtx, cmp);
4673 /* Patch new with val at correct position. */
4674 switch (code)
4676 case PLUS:
4677 case MINUS:
4678 val = expand_simple_binop (SImode, code, new_rtx, orig,
4679 NULL_RTX, 1, OPTAB_DIRECT);
4680 val = expand_simple_binop (SImode, AND, val, ac.modemask,
4681 NULL_RTX, 1, OPTAB_DIRECT);
4682 /* FALLTHRU */
4683 case SET:
4684 if (ac.aligned && MEM_P (val))
4685 store_bit_field (new_rtx, GET_MODE_BITSIZE (mode), 0, SImode, val);
4686 else
4688 new_rtx = expand_simple_binop (SImode, AND, new_rtx, ac.modemaski,
4689 NULL_RTX, 1, OPTAB_DIRECT);
4690 new_rtx = expand_simple_binop (SImode, IOR, new_rtx, val,
4691 NULL_RTX, 1, OPTAB_DIRECT);
4693 break;
4694 case AND:
4695 case IOR:
4696 case XOR:
4697 new_rtx = expand_simple_binop (SImode, code, new_rtx, val,
4698 NULL_RTX, 1, OPTAB_DIRECT);
4699 break;
4700 case MULT: /* NAND */
4701 new_rtx = expand_simple_binop (SImode, AND, new_rtx, val,
4702 NULL_RTX, 1, OPTAB_DIRECT);
4703 new_rtx = expand_simple_binop (SImode, XOR, new_rtx, ac.modemask,
4704 NULL_RTX, 1, OPTAB_DIRECT);
4705 break;
4706 default:
4707 gcc_unreachable ();
4710 s390_emit_jump (csloop, s390_emit_compare_and_swap (NE, cmp,
4711 ac.memsi, cmp, new_rtx));
4713 /* Return the correct part of the bitfield. */
4714 if (target)
4715 convert_move (target, expand_simple_binop (SImode, LSHIFTRT,
4716 after ? new_rtx : cmp, ac.shift,
4717 NULL_RTX, 1, OPTAB_DIRECT), 1);
4720 /* This is called from dwarf2out.c via TARGET_ASM_OUTPUT_DWARF_DTPREL.
4721 We need to emit DTP-relative relocations. */
4723 static void s390_output_dwarf_dtprel (FILE *, int, rtx) ATTRIBUTE_UNUSED;
4725 static void
4726 s390_output_dwarf_dtprel (FILE *file, int size, rtx x)
4728 switch (size)
4730 case 4:
4731 fputs ("\t.long\t", file);
4732 break;
4733 case 8:
4734 fputs ("\t.quad\t", file);
4735 break;
4736 default:
4737 gcc_unreachable ();
4739 output_addr_const (file, x);
4740 fputs ("@DTPOFF", file);
4743 #ifdef TARGET_ALTERNATE_LONG_DOUBLE_MANGLING
4744 /* Implement TARGET_MANGLE_TYPE. */
4746 static const char *
4747 s390_mangle_type (const_tree type)
4749 if (TYPE_MAIN_VARIANT (type) == long_double_type_node
4750 && TARGET_LONG_DOUBLE_128)
4751 return "g";
4753 /* For all other types, use normal C++ mangling. */
4754 return NULL;
4756 #endif
4758 /* In the name of slightly smaller debug output, and to cater to
4759 general assembler lossage, recognize various UNSPEC sequences
4760 and turn them back into a direct symbol reference. */
4762 static rtx
4763 s390_delegitimize_address (rtx orig_x)
4765 rtx x, y;
4767 orig_x = delegitimize_mem_from_attrs (orig_x);
4768 x = orig_x;
4769 if (GET_CODE (x) != MEM)
4770 return orig_x;
4772 x = XEXP (x, 0);
4773 if (GET_CODE (x) == PLUS
4774 && GET_CODE (XEXP (x, 1)) == CONST
4775 && GET_CODE (XEXP (x, 0)) == REG
4776 && REGNO (XEXP (x, 0)) == PIC_OFFSET_TABLE_REGNUM)
4778 y = XEXP (XEXP (x, 1), 0);
4779 if (GET_CODE (y) == UNSPEC
4780 && XINT (y, 1) == UNSPEC_GOT)
4781 return XVECEXP (y, 0, 0);
4782 return orig_x;
4785 if (GET_CODE (x) == CONST)
4787 y = XEXP (x, 0);
4788 if (GET_CODE (y) == UNSPEC
4789 && XINT (y, 1) == UNSPEC_GOTENT)
4790 return XVECEXP (y, 0, 0);
4791 return orig_x;
4794 return orig_x;
4797 /* Output operand OP to stdio stream FILE.
4798 OP is an address (register + offset) which is not used to address data;
4799 instead the rightmost bits are interpreted as the value. */
4801 static void
4802 print_shift_count_operand (FILE *file, rtx op)
4804 HOST_WIDE_INT offset;
4805 rtx base;
4807 /* Extract base register and offset. */
4808 if (!s390_decompose_shift_count (op, &base, &offset))
4809 gcc_unreachable ();
4811 /* Sanity check. */
4812 if (base)
4814 gcc_assert (GET_CODE (base) == REG);
4815 gcc_assert (REGNO (base) < FIRST_PSEUDO_REGISTER);
4816 gcc_assert (REGNO_REG_CLASS (REGNO (base)) == ADDR_REGS);
4819 /* Offsets are constricted to twelve bits. */
4820 fprintf (file, HOST_WIDE_INT_PRINT_DEC, offset & ((1 << 12) - 1));
4821 if (base)
4822 fprintf (file, "(%s)", reg_names[REGNO (base)]);
4825 /* See 'get_some_local_dynamic_name'. */
4827 static int
4828 get_some_local_dynamic_name_1 (rtx *px, void *data ATTRIBUTE_UNUSED)
4830 rtx x = *px;
4832 if (GET_CODE (x) == SYMBOL_REF && CONSTANT_POOL_ADDRESS_P (x))
4834 x = get_pool_constant (x);
4835 return for_each_rtx (&x, get_some_local_dynamic_name_1, 0);
4838 if (GET_CODE (x) == SYMBOL_REF
4839 && tls_symbolic_operand (x) == TLS_MODEL_LOCAL_DYNAMIC)
4841 cfun->machine->some_ld_name = XSTR (x, 0);
4842 return 1;
4845 return 0;
4848 /* Locate some local-dynamic symbol still in use by this function
4849 so that we can print its name in local-dynamic base patterns. */
4851 static const char *
4852 get_some_local_dynamic_name (void)
4854 rtx insn;
4856 if (cfun->machine->some_ld_name)
4857 return cfun->machine->some_ld_name;
4859 for (insn = get_insns (); insn ; insn = NEXT_INSN (insn))
4860 if (INSN_P (insn)
4861 && for_each_rtx (&PATTERN (insn), get_some_local_dynamic_name_1, 0))
4862 return cfun->machine->some_ld_name;
4864 gcc_unreachable ();
4867 /* Output machine-dependent UNSPECs occurring in address constant X
4868 in assembler syntax to stdio stream FILE. Returns true if the
4869 constant X could be recognized, false otherwise. */
4871 bool
4872 s390_output_addr_const_extra (FILE *file, rtx x)
4874 if (GET_CODE (x) == UNSPEC && XVECLEN (x, 0) == 1)
4875 switch (XINT (x, 1))
4877 case UNSPEC_GOTENT:
4878 output_addr_const (file, XVECEXP (x, 0, 0));
4879 fprintf (file, "@GOTENT");
4880 return true;
4881 case UNSPEC_GOT:
4882 output_addr_const (file, XVECEXP (x, 0, 0));
4883 fprintf (file, "@GOT");
4884 return true;
4885 case UNSPEC_GOTOFF:
4886 output_addr_const (file, XVECEXP (x, 0, 0));
4887 fprintf (file, "@GOTOFF");
4888 return true;
4889 case UNSPEC_PLT:
4890 output_addr_const (file, XVECEXP (x, 0, 0));
4891 fprintf (file, "@PLT");
4892 return true;
4893 case UNSPEC_PLTOFF:
4894 output_addr_const (file, XVECEXP (x, 0, 0));
4895 fprintf (file, "@PLTOFF");
4896 return true;
4897 case UNSPEC_TLSGD:
4898 output_addr_const (file, XVECEXP (x, 0, 0));
4899 fprintf (file, "@TLSGD");
4900 return true;
4901 case UNSPEC_TLSLDM:
4902 assemble_name (file, get_some_local_dynamic_name ());
4903 fprintf (file, "@TLSLDM");
4904 return true;
4905 case UNSPEC_DTPOFF:
4906 output_addr_const (file, XVECEXP (x, 0, 0));
4907 fprintf (file, "@DTPOFF");
4908 return true;
4909 case UNSPEC_NTPOFF:
4910 output_addr_const (file, XVECEXP (x, 0, 0));
4911 fprintf (file, "@NTPOFF");
4912 return true;
4913 case UNSPEC_GOTNTPOFF:
4914 output_addr_const (file, XVECEXP (x, 0, 0));
4915 fprintf (file, "@GOTNTPOFF");
4916 return true;
4917 case UNSPEC_INDNTPOFF:
4918 output_addr_const (file, XVECEXP (x, 0, 0));
4919 fprintf (file, "@INDNTPOFF");
4920 return true;
4923 if (GET_CODE (x) == UNSPEC && XVECLEN (x, 0) == 2)
4924 switch (XINT (x, 1))
4926 case UNSPEC_POOL_OFFSET:
4927 x = gen_rtx_MINUS (GET_MODE (x), XVECEXP (x, 0, 0), XVECEXP (x, 0, 1));
4928 output_addr_const (file, x);
4929 return true;
4931 return false;
4934 /* Output address operand ADDR in assembler syntax to
4935 stdio stream FILE. */
4937 void
4938 print_operand_address (FILE *file, rtx addr)
4940 struct s390_address ad;
4942 if (s390_symref_operand_p (addr, NULL, NULL))
4944 gcc_assert (TARGET_Z10);
4945 output_addr_const (file, addr);
4946 return;
4949 if (!s390_decompose_address (addr, &ad)
4950 || (ad.base && !REGNO_OK_FOR_BASE_P (REGNO (ad.base)))
4951 || (ad.indx && !REGNO_OK_FOR_INDEX_P (REGNO (ad.indx))))
4952 output_operand_lossage ("cannot decompose address");
4954 if (ad.disp)
4955 output_addr_const (file, ad.disp);
4956 else
4957 fprintf (file, "0");
4959 if (ad.base && ad.indx)
4960 fprintf (file, "(%s,%s)", reg_names[REGNO (ad.indx)],
4961 reg_names[REGNO (ad.base)]);
4962 else if (ad.base)
4963 fprintf (file, "(%s)", reg_names[REGNO (ad.base)]);
4966 /* Output operand X in assembler syntax to stdio stream FILE.
4967 CODE specified the format flag. The following format flags
4968 are recognized:
4970 'C': print opcode suffix for branch condition.
4971 'D': print opcode suffix for inverse branch condition.
4972 'E': print opcode suffix for branch on index instruction.
4973 'J': print tls_load/tls_gdcall/tls_ldcall suffix
4974 'G': print the size of the operand in bytes.
4975 'O': print only the displacement of a memory reference.
4976 'R': print only the base register of a memory reference.
4977 'S': print S-type memory reference (base+displacement).
4978 'N': print the second word of a DImode operand.
4979 'M': print the second word of a TImode operand.
4980 'Y': print shift count operand.
4982 'b': print integer X as if it's an unsigned byte.
4983 'c': print integer X as if it's an signed byte.
4984 'x': print integer X as if it's an unsigned halfword.
4985 'h': print integer X as if it's a signed halfword.
4986 'i': print the first nonzero HImode part of X.
4987 'j': print the first HImode part unequal to -1 of X.
4988 'k': print the first nonzero SImode part of X.
4989 'm': print the first SImode part unequal to -1 of X.
4990 'o': print integer X as if it's an unsigned 32bit word. */
4992 void
4993 print_operand (FILE *file, rtx x, int code)
4995 switch (code)
4997 case 'C':
4998 fprintf (file, s390_branch_condition_mnemonic (x, FALSE));
4999 return;
5001 case 'D':
5002 fprintf (file, s390_branch_condition_mnemonic (x, TRUE));
5003 return;
5005 case 'E':
5006 if (GET_CODE (x) == LE)
5007 fprintf (file, "l");
5008 else if (GET_CODE (x) == GT)
5009 fprintf (file, "h");
5010 else
5011 gcc_unreachable ();
5012 return;
5014 case 'J':
5015 if (GET_CODE (x) == SYMBOL_REF)
5017 fprintf (file, "%s", ":tls_load:");
5018 output_addr_const (file, x);
5020 else if (GET_CODE (x) == UNSPEC && XINT (x, 1) == UNSPEC_TLSGD)
5022 fprintf (file, "%s", ":tls_gdcall:");
5023 output_addr_const (file, XVECEXP (x, 0, 0));
5025 else if (GET_CODE (x) == UNSPEC && XINT (x, 1) == UNSPEC_TLSLDM)
5027 fprintf (file, "%s", ":tls_ldcall:");
5028 assemble_name (file, get_some_local_dynamic_name ());
5030 else
5031 gcc_unreachable ();
5032 return;
5034 case 'G':
5035 fprintf (file, "%u", GET_MODE_SIZE (GET_MODE (x)));
5036 return;
5038 case 'O':
5040 struct s390_address ad;
5041 int ret;
5043 gcc_assert (GET_CODE (x) == MEM);
5044 ret = s390_decompose_address (XEXP (x, 0), &ad);
5045 gcc_assert (ret);
5046 gcc_assert (!ad.base || REGNO_OK_FOR_BASE_P (REGNO (ad.base)));
5047 gcc_assert (!ad.indx);
5049 if (ad.disp)
5050 output_addr_const (file, ad.disp);
5051 else
5052 fprintf (file, "0");
5054 return;
5056 case 'R':
5058 struct s390_address ad;
5059 int ret;
5061 gcc_assert (GET_CODE (x) == MEM);
5062 ret = s390_decompose_address (XEXP (x, 0), &ad);
5063 gcc_assert (ret);
5064 gcc_assert (!ad.base || REGNO_OK_FOR_BASE_P (REGNO (ad.base)));
5065 gcc_assert (!ad.indx);
5067 if (ad.base)
5068 fprintf (file, "%s", reg_names[REGNO (ad.base)]);
5069 else
5070 fprintf (file, "0");
5072 return;
5074 case 'S':
5076 struct s390_address ad;
5077 int ret;
5079 gcc_assert (GET_CODE (x) == MEM);
5080 ret = s390_decompose_address (XEXP (x, 0), &ad);
5081 gcc_assert (ret);
5082 gcc_assert (!ad.base || REGNO_OK_FOR_BASE_P (REGNO (ad.base)));
5083 gcc_assert (!ad.indx);
5085 if (ad.disp)
5086 output_addr_const (file, ad.disp);
5087 else
5088 fprintf (file, "0");
5090 if (ad.base)
5091 fprintf (file, "(%s)", reg_names[REGNO (ad.base)]);
5093 return;
5095 case 'N':
5096 if (GET_CODE (x) == REG)
5097 x = gen_rtx_REG (GET_MODE (x), REGNO (x) + 1);
5098 else if (GET_CODE (x) == MEM)
5099 x = change_address (x, VOIDmode, plus_constant (XEXP (x, 0), 4));
5100 else
5101 gcc_unreachable ();
5102 break;
5104 case 'M':
5105 if (GET_CODE (x) == REG)
5106 x = gen_rtx_REG (GET_MODE (x), REGNO (x) + 1);
5107 else if (GET_CODE (x) == MEM)
5108 x = change_address (x, VOIDmode, plus_constant (XEXP (x, 0), 8));
5109 else
5110 gcc_unreachable ();
5111 break;
5113 case 'Y':
5114 print_shift_count_operand (file, x);
5115 return;
5118 switch (GET_CODE (x))
5120 case REG:
5121 fprintf (file, "%s", reg_names[REGNO (x)]);
5122 break;
5124 case MEM:
5125 output_address (XEXP (x, 0));
5126 break;
5128 case CONST:
5129 case CODE_LABEL:
5130 case LABEL_REF:
5131 case SYMBOL_REF:
5132 output_addr_const (file, x);
5133 break;
5135 case CONST_INT:
5136 if (code == 'b')
5137 fprintf (file, HOST_WIDE_INT_PRINT_DEC, INTVAL (x) & 0xff);
5138 else if (code == 'c')
5139 fprintf (file, HOST_WIDE_INT_PRINT_DEC, ((INTVAL (x) & 0xff) ^ 0x80) - 0x80);
5140 else if (code == 'x')
5141 fprintf (file, HOST_WIDE_INT_PRINT_DEC, INTVAL (x) & 0xffff);
5142 else if (code == 'h')
5143 fprintf (file, HOST_WIDE_INT_PRINT_DEC, ((INTVAL (x) & 0xffff) ^ 0x8000) - 0x8000);
5144 else if (code == 'i')
5145 fprintf (file, HOST_WIDE_INT_PRINT_DEC,
5146 s390_extract_part (x, HImode, 0));
5147 else if (code == 'j')
5148 fprintf (file, HOST_WIDE_INT_PRINT_DEC,
5149 s390_extract_part (x, HImode, -1));
5150 else if (code == 'k')
5151 fprintf (file, HOST_WIDE_INT_PRINT_DEC,
5152 s390_extract_part (x, SImode, 0));
5153 else if (code == 'm')
5154 fprintf (file, HOST_WIDE_INT_PRINT_DEC,
5155 s390_extract_part (x, SImode, -1));
5156 else if (code == 'o')
5157 fprintf (file, HOST_WIDE_INT_PRINT_DEC, INTVAL (x) & 0xffffffff);
5158 else
5159 fprintf (file, HOST_WIDE_INT_PRINT_DEC, INTVAL (x));
5160 break;
5162 case CONST_DOUBLE:
5163 gcc_assert (GET_MODE (x) == VOIDmode);
5164 if (code == 'b')
5165 fprintf (file, HOST_WIDE_INT_PRINT_DEC, CONST_DOUBLE_LOW (x) & 0xff);
5166 else if (code == 'x')
5167 fprintf (file, HOST_WIDE_INT_PRINT_DEC, CONST_DOUBLE_LOW (x) & 0xffff);
5168 else if (code == 'h')
5169 fprintf (file, HOST_WIDE_INT_PRINT_DEC, ((CONST_DOUBLE_LOW (x) & 0xffff) ^ 0x8000) - 0x8000);
5170 else
5171 gcc_unreachable ();
5172 break;
5174 default:
5175 fatal_insn ("UNKNOWN in print_operand !?", x);
5176 break;
5180 /* Target hook for assembling integer objects. We need to define it
5181 here to work a round a bug in some versions of GAS, which couldn't
5182 handle values smaller than INT_MIN when printed in decimal. */
5184 static bool
5185 s390_assemble_integer (rtx x, unsigned int size, int aligned_p)
5187 if (size == 8 && aligned_p
5188 && GET_CODE (x) == CONST_INT && INTVAL (x) < INT_MIN)
5190 fprintf (asm_out_file, "\t.quad\t" HOST_WIDE_INT_PRINT_HEX "\n",
5191 INTVAL (x));
5192 return true;
5194 return default_assemble_integer (x, size, aligned_p);
5197 /* Returns true if register REGNO is used for forming
5198 a memory address in expression X. */
5200 static bool
5201 reg_used_in_mem_p (int regno, rtx x)
5203 enum rtx_code code = GET_CODE (x);
5204 int i, j;
5205 const char *fmt;
5207 if (code == MEM)
5209 if (refers_to_regno_p (regno, regno+1,
5210 XEXP (x, 0), 0))
5211 return true;
5213 else if (code == SET
5214 && GET_CODE (SET_DEST (x)) == PC)
5216 if (refers_to_regno_p (regno, regno+1,
5217 SET_SRC (x), 0))
5218 return true;
5221 fmt = GET_RTX_FORMAT (code);
5222 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
5224 if (fmt[i] == 'e'
5225 && reg_used_in_mem_p (regno, XEXP (x, i)))
5226 return true;
5228 else if (fmt[i] == 'E')
5229 for (j = 0; j < XVECLEN (x, i); j++)
5230 if (reg_used_in_mem_p (regno, XVECEXP (x, i, j)))
5231 return true;
5233 return false;
5236 /* Returns true if expression DEP_RTX sets an address register
5237 used by instruction INSN to address memory. */
5239 static bool
5240 addr_generation_dependency_p (rtx dep_rtx, rtx insn)
5242 rtx target, pat;
5244 if (GET_CODE (dep_rtx) == INSN)
5245 dep_rtx = PATTERN (dep_rtx);
5247 if (GET_CODE (dep_rtx) == SET)
5249 target = SET_DEST (dep_rtx);
5250 if (GET_CODE (target) == STRICT_LOW_PART)
5251 target = XEXP (target, 0);
5252 while (GET_CODE (target) == SUBREG)
5253 target = SUBREG_REG (target);
5255 if (GET_CODE (target) == REG)
5257 int regno = REGNO (target);
5259 if (s390_safe_attr_type (insn) == TYPE_LA)
5261 pat = PATTERN (insn);
5262 if (GET_CODE (pat) == PARALLEL)
5264 gcc_assert (XVECLEN (pat, 0) == 2);
5265 pat = XVECEXP (pat, 0, 0);
5267 gcc_assert (GET_CODE (pat) == SET);
5268 return refers_to_regno_p (regno, regno+1, SET_SRC (pat), 0);
5270 else if (get_attr_atype (insn) == ATYPE_AGEN)
5271 return reg_used_in_mem_p (regno, PATTERN (insn));
5274 return false;
5277 /* Return 1, if dep_insn sets register used in insn in the agen unit. */
5280 s390_agen_dep_p (rtx dep_insn, rtx insn)
5282 rtx dep_rtx = PATTERN (dep_insn);
5283 int i;
5285 if (GET_CODE (dep_rtx) == SET
5286 && addr_generation_dependency_p (dep_rtx, insn))
5287 return 1;
5288 else if (GET_CODE (dep_rtx) == PARALLEL)
5290 for (i = 0; i < XVECLEN (dep_rtx, 0); i++)
5292 if (addr_generation_dependency_p (XVECEXP (dep_rtx, 0, i), insn))
5293 return 1;
5296 return 0;
5300 /* A C statement (sans semicolon) to update the integer scheduling priority
5301 INSN_PRIORITY (INSN). Increase the priority to execute the INSN earlier,
5302 reduce the priority to execute INSN later. Do not define this macro if
5303 you do not need to adjust the scheduling priorities of insns.
5305 A STD instruction should be scheduled earlier,
5306 in order to use the bypass. */
5309 static int
5310 s390_adjust_priority (rtx insn ATTRIBUTE_UNUSED, int priority)
5312 if (! INSN_P (insn))
5313 return priority;
5315 if (s390_tune != PROCESSOR_2084_Z990
5316 && s390_tune != PROCESSOR_2094_Z9_109
5317 && s390_tune != PROCESSOR_2097_Z10)
5318 return priority;
5320 switch (s390_safe_attr_type (insn))
5322 case TYPE_FSTOREDF:
5323 case TYPE_FSTORESF:
5324 priority = priority << 3;
5325 break;
5326 case TYPE_STORE:
5327 case TYPE_STM:
5328 priority = priority << 1;
5329 break;
5330 default:
5331 break;
5333 return priority;
5337 /* The number of instructions that can be issued per cycle. */
5339 static int
5340 s390_issue_rate (void)
5342 switch (s390_tune)
5344 case PROCESSOR_2084_Z990:
5345 case PROCESSOR_2094_Z9_109:
5346 return 3;
5347 case PROCESSOR_2097_Z10:
5348 return 2;
5349 default:
5350 return 1;
5354 static int
5355 s390_first_cycle_multipass_dfa_lookahead (void)
5357 return 4;
5361 /* Annotate every literal pool reference in X by an UNSPEC_LTREF expression.
5362 Fix up MEMs as required. */
5364 static void
5365 annotate_constant_pool_refs (rtx *x)
5367 int i, j;
5368 const char *fmt;
5370 gcc_assert (GET_CODE (*x) != SYMBOL_REF
5371 || !CONSTANT_POOL_ADDRESS_P (*x));
5373 /* Literal pool references can only occur inside a MEM ... */
5374 if (GET_CODE (*x) == MEM)
5376 rtx memref = XEXP (*x, 0);
5378 if (GET_CODE (memref) == SYMBOL_REF
5379 && CONSTANT_POOL_ADDRESS_P (memref))
5381 rtx base = cfun->machine->base_reg;
5382 rtx addr = gen_rtx_UNSPEC (Pmode, gen_rtvec (2, memref, base),
5383 UNSPEC_LTREF);
5385 *x = replace_equiv_address (*x, addr);
5386 return;
5389 if (GET_CODE (memref) == CONST
5390 && GET_CODE (XEXP (memref, 0)) == PLUS
5391 && GET_CODE (XEXP (XEXP (memref, 0), 1)) == CONST_INT
5392 && GET_CODE (XEXP (XEXP (memref, 0), 0)) == SYMBOL_REF
5393 && CONSTANT_POOL_ADDRESS_P (XEXP (XEXP (memref, 0), 0)))
5395 HOST_WIDE_INT off = INTVAL (XEXP (XEXP (memref, 0), 1));
5396 rtx sym = XEXP (XEXP (memref, 0), 0);
5397 rtx base = cfun->machine->base_reg;
5398 rtx addr = gen_rtx_UNSPEC (Pmode, gen_rtvec (2, sym, base),
5399 UNSPEC_LTREF);
5401 *x = replace_equiv_address (*x, plus_constant (addr, off));
5402 return;
5406 /* ... or a load-address type pattern. */
5407 if (GET_CODE (*x) == SET)
5409 rtx addrref = SET_SRC (*x);
5411 if (GET_CODE (addrref) == SYMBOL_REF
5412 && CONSTANT_POOL_ADDRESS_P (addrref))
5414 rtx base = cfun->machine->base_reg;
5415 rtx addr = gen_rtx_UNSPEC (Pmode, gen_rtvec (2, addrref, base),
5416 UNSPEC_LTREF);
5418 SET_SRC (*x) = addr;
5419 return;
5422 if (GET_CODE (addrref) == CONST
5423 && GET_CODE (XEXP (addrref, 0)) == PLUS
5424 && GET_CODE (XEXP (XEXP (addrref, 0), 1)) == CONST_INT
5425 && GET_CODE (XEXP (XEXP (addrref, 0), 0)) == SYMBOL_REF
5426 && CONSTANT_POOL_ADDRESS_P (XEXP (XEXP (addrref, 0), 0)))
5428 HOST_WIDE_INT off = INTVAL (XEXP (XEXP (addrref, 0), 1));
5429 rtx sym = XEXP (XEXP (addrref, 0), 0);
5430 rtx base = cfun->machine->base_reg;
5431 rtx addr = gen_rtx_UNSPEC (Pmode, gen_rtvec (2, sym, base),
5432 UNSPEC_LTREF);
5434 SET_SRC (*x) = plus_constant (addr, off);
5435 return;
5439 /* Annotate LTREL_BASE as well. */
5440 if (GET_CODE (*x) == UNSPEC
5441 && XINT (*x, 1) == UNSPEC_LTREL_BASE)
5443 rtx base = cfun->machine->base_reg;
5444 *x = gen_rtx_UNSPEC (Pmode, gen_rtvec (2, XVECEXP (*x, 0, 0), base),
5445 UNSPEC_LTREL_BASE);
5446 return;
5449 fmt = GET_RTX_FORMAT (GET_CODE (*x));
5450 for (i = GET_RTX_LENGTH (GET_CODE (*x)) - 1; i >= 0; i--)
5452 if (fmt[i] == 'e')
5454 annotate_constant_pool_refs (&XEXP (*x, i));
5456 else if (fmt[i] == 'E')
5458 for (j = 0; j < XVECLEN (*x, i); j++)
5459 annotate_constant_pool_refs (&XVECEXP (*x, i, j));
5464 /* Split all branches that exceed the maximum distance.
5465 Returns true if this created a new literal pool entry. */
5467 static int
5468 s390_split_branches (void)
5470 rtx temp_reg = gen_rtx_REG (Pmode, RETURN_REGNUM);
5471 int new_literal = 0, ret;
5472 rtx insn, pat, tmp, target;
5473 rtx *label;
5475 /* We need correct insn addresses. */
5477 shorten_branches (get_insns ());
5479 /* Find all branches that exceed 64KB, and split them. */
5481 for (insn = get_insns (); insn; insn = NEXT_INSN (insn))
5483 if (GET_CODE (insn) != JUMP_INSN)
5484 continue;
5486 pat = PATTERN (insn);
5487 if (GET_CODE (pat) == PARALLEL && XVECLEN (pat, 0) > 2)
5488 pat = XVECEXP (pat, 0, 0);
5489 if (GET_CODE (pat) != SET || SET_DEST (pat) != pc_rtx)
5490 continue;
5492 if (GET_CODE (SET_SRC (pat)) == LABEL_REF)
5494 label = &SET_SRC (pat);
5496 else if (GET_CODE (SET_SRC (pat)) == IF_THEN_ELSE)
5498 if (GET_CODE (XEXP (SET_SRC (pat), 1)) == LABEL_REF)
5499 label = &XEXP (SET_SRC (pat), 1);
5500 else if (GET_CODE (XEXP (SET_SRC (pat), 2)) == LABEL_REF)
5501 label = &XEXP (SET_SRC (pat), 2);
5502 else
5503 continue;
5505 else
5506 continue;
5508 if (get_attr_length (insn) <= 4)
5509 continue;
5511 /* We are going to use the return register as scratch register,
5512 make sure it will be saved/restored by the prologue/epilogue. */
5513 cfun_frame_layout.save_return_addr_p = 1;
5515 if (!flag_pic)
5517 new_literal = 1;
5518 tmp = force_const_mem (Pmode, *label);
5519 tmp = emit_insn_before (gen_rtx_SET (Pmode, temp_reg, tmp), insn);
5520 INSN_ADDRESSES_NEW (tmp, -1);
5521 annotate_constant_pool_refs (&PATTERN (tmp));
5523 target = temp_reg;
5525 else
5527 new_literal = 1;
5528 target = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, *label),
5529 UNSPEC_LTREL_OFFSET);
5530 target = gen_rtx_CONST (Pmode, target);
5531 target = force_const_mem (Pmode, target);
5532 tmp = emit_insn_before (gen_rtx_SET (Pmode, temp_reg, target), insn);
5533 INSN_ADDRESSES_NEW (tmp, -1);
5534 annotate_constant_pool_refs (&PATTERN (tmp));
5536 target = gen_rtx_UNSPEC (Pmode, gen_rtvec (2, XEXP (target, 0),
5537 cfun->machine->base_reg),
5538 UNSPEC_LTREL_BASE);
5539 target = gen_rtx_PLUS (Pmode, temp_reg, target);
5542 ret = validate_change (insn, label, target, 0);
5543 gcc_assert (ret);
5546 return new_literal;
5550 /* Find an annotated literal pool symbol referenced in RTX X,
5551 and store it at REF. Will abort if X contains references to
5552 more than one such pool symbol; multiple references to the same
5553 symbol are allowed, however.
5555 The rtx pointed to by REF must be initialized to NULL_RTX
5556 by the caller before calling this routine. */
5558 static void
5559 find_constant_pool_ref (rtx x, rtx *ref)
5561 int i, j;
5562 const char *fmt;
5564 /* Ignore LTREL_BASE references. */
5565 if (GET_CODE (x) == UNSPEC
5566 && XINT (x, 1) == UNSPEC_LTREL_BASE)
5567 return;
5568 /* Likewise POOL_ENTRY insns. */
5569 if (GET_CODE (x) == UNSPEC_VOLATILE
5570 && XINT (x, 1) == UNSPECV_POOL_ENTRY)
5571 return;
5573 gcc_assert (GET_CODE (x) != SYMBOL_REF
5574 || !CONSTANT_POOL_ADDRESS_P (x));
5576 if (GET_CODE (x) == UNSPEC && XINT (x, 1) == UNSPEC_LTREF)
5578 rtx sym = XVECEXP (x, 0, 0);
5579 gcc_assert (GET_CODE (sym) == SYMBOL_REF
5580 && CONSTANT_POOL_ADDRESS_P (sym));
5582 if (*ref == NULL_RTX)
5583 *ref = sym;
5584 else
5585 gcc_assert (*ref == sym);
5587 return;
5590 fmt = GET_RTX_FORMAT (GET_CODE (x));
5591 for (i = GET_RTX_LENGTH (GET_CODE (x)) - 1; i >= 0; i--)
5593 if (fmt[i] == 'e')
5595 find_constant_pool_ref (XEXP (x, i), ref);
5597 else if (fmt[i] == 'E')
5599 for (j = 0; j < XVECLEN (x, i); j++)
5600 find_constant_pool_ref (XVECEXP (x, i, j), ref);
5605 /* Replace every reference to the annotated literal pool
5606 symbol REF in X by its base plus OFFSET. */
5608 static void
5609 replace_constant_pool_ref (rtx *x, rtx ref, rtx offset)
5611 int i, j;
5612 const char *fmt;
5614 gcc_assert (*x != ref);
5616 if (GET_CODE (*x) == UNSPEC
5617 && XINT (*x, 1) == UNSPEC_LTREF
5618 && XVECEXP (*x, 0, 0) == ref)
5620 *x = gen_rtx_PLUS (Pmode, XVECEXP (*x, 0, 1), offset);
5621 return;
5624 if (GET_CODE (*x) == PLUS
5625 && GET_CODE (XEXP (*x, 1)) == CONST_INT
5626 && GET_CODE (XEXP (*x, 0)) == UNSPEC
5627 && XINT (XEXP (*x, 0), 1) == UNSPEC_LTREF
5628 && XVECEXP (XEXP (*x, 0), 0, 0) == ref)
5630 rtx addr = gen_rtx_PLUS (Pmode, XVECEXP (XEXP (*x, 0), 0, 1), offset);
5631 *x = plus_constant (addr, INTVAL (XEXP (*x, 1)));
5632 return;
5635 fmt = GET_RTX_FORMAT (GET_CODE (*x));
5636 for (i = GET_RTX_LENGTH (GET_CODE (*x)) - 1; i >= 0; i--)
5638 if (fmt[i] == 'e')
5640 replace_constant_pool_ref (&XEXP (*x, i), ref, offset);
5642 else if (fmt[i] == 'E')
5644 for (j = 0; j < XVECLEN (*x, i); j++)
5645 replace_constant_pool_ref (&XVECEXP (*x, i, j), ref, offset);
5650 /* Check whether X contains an UNSPEC_LTREL_BASE.
5651 Return its constant pool symbol if found, NULL_RTX otherwise. */
5653 static rtx
5654 find_ltrel_base (rtx x)
5656 int i, j;
5657 const char *fmt;
5659 if (GET_CODE (x) == UNSPEC
5660 && XINT (x, 1) == UNSPEC_LTREL_BASE)
5661 return XVECEXP (x, 0, 0);
5663 fmt = GET_RTX_FORMAT (GET_CODE (x));
5664 for (i = GET_RTX_LENGTH (GET_CODE (x)) - 1; i >= 0; i--)
5666 if (fmt[i] == 'e')
5668 rtx fnd = find_ltrel_base (XEXP (x, i));
5669 if (fnd)
5670 return fnd;
5672 else if (fmt[i] == 'E')
5674 for (j = 0; j < XVECLEN (x, i); j++)
5676 rtx fnd = find_ltrel_base (XVECEXP (x, i, j));
5677 if (fnd)
5678 return fnd;
5683 return NULL_RTX;
5686 /* Replace any occurrence of UNSPEC_LTREL_BASE in X with its base. */
5688 static void
5689 replace_ltrel_base (rtx *x)
5691 int i, j;
5692 const char *fmt;
5694 if (GET_CODE (*x) == UNSPEC
5695 && XINT (*x, 1) == UNSPEC_LTREL_BASE)
5697 *x = XVECEXP (*x, 0, 1);
5698 return;
5701 fmt = GET_RTX_FORMAT (GET_CODE (*x));
5702 for (i = GET_RTX_LENGTH (GET_CODE (*x)) - 1; i >= 0; i--)
5704 if (fmt[i] == 'e')
5706 replace_ltrel_base (&XEXP (*x, i));
5708 else if (fmt[i] == 'E')
5710 for (j = 0; j < XVECLEN (*x, i); j++)
5711 replace_ltrel_base (&XVECEXP (*x, i, j));
5717 /* We keep a list of constants which we have to add to internal
5718 constant tables in the middle of large functions. */
5720 #define NR_C_MODES 11
5721 enum machine_mode constant_modes[NR_C_MODES] =
5723 TFmode, TImode, TDmode,
5724 DFmode, DImode, DDmode,
5725 SFmode, SImode, SDmode,
5726 HImode,
5727 QImode
5730 struct constant
5732 struct constant *next;
5733 rtx value;
5734 rtx label;
5737 struct constant_pool
5739 struct constant_pool *next;
5740 rtx first_insn;
5741 rtx pool_insn;
5742 bitmap insns;
5743 rtx emit_pool_after;
5745 struct constant *constants[NR_C_MODES];
5746 struct constant *execute;
5747 rtx label;
5748 int size;
5751 /* Allocate new constant_pool structure. */
5753 static struct constant_pool *
5754 s390_alloc_pool (void)
5756 struct constant_pool *pool;
5757 int i;
5759 pool = (struct constant_pool *) xmalloc (sizeof *pool);
5760 pool->next = NULL;
5761 for (i = 0; i < NR_C_MODES; i++)
5762 pool->constants[i] = NULL;
5764 pool->execute = NULL;
5765 pool->label = gen_label_rtx ();
5766 pool->first_insn = NULL_RTX;
5767 pool->pool_insn = NULL_RTX;
5768 pool->insns = BITMAP_ALLOC (NULL);
5769 pool->size = 0;
5770 pool->emit_pool_after = NULL_RTX;
5772 return pool;
5775 /* Create new constant pool covering instructions starting at INSN
5776 and chain it to the end of POOL_LIST. */
5778 static struct constant_pool *
5779 s390_start_pool (struct constant_pool **pool_list, rtx insn)
5781 struct constant_pool *pool, **prev;
5783 pool = s390_alloc_pool ();
5784 pool->first_insn = insn;
5786 for (prev = pool_list; *prev; prev = &(*prev)->next)
5788 *prev = pool;
5790 return pool;
5793 /* End range of instructions covered by POOL at INSN and emit
5794 placeholder insn representing the pool. */
5796 static void
5797 s390_end_pool (struct constant_pool *pool, rtx insn)
5799 rtx pool_size = GEN_INT (pool->size + 8 /* alignment slop */);
5801 if (!insn)
5802 insn = get_last_insn ();
5804 pool->pool_insn = emit_insn_after (gen_pool (pool_size), insn);
5805 INSN_ADDRESSES_NEW (pool->pool_insn, -1);
5808 /* Add INSN to the list of insns covered by POOL. */
5810 static void
5811 s390_add_pool_insn (struct constant_pool *pool, rtx insn)
5813 bitmap_set_bit (pool->insns, INSN_UID (insn));
5816 /* Return pool out of POOL_LIST that covers INSN. */
5818 static struct constant_pool *
5819 s390_find_pool (struct constant_pool *pool_list, rtx insn)
5821 struct constant_pool *pool;
5823 for (pool = pool_list; pool; pool = pool->next)
5824 if (bitmap_bit_p (pool->insns, INSN_UID (insn)))
5825 break;
5827 return pool;
5830 /* Add constant VAL of mode MODE to the constant pool POOL. */
5832 static void
5833 s390_add_constant (struct constant_pool *pool, rtx val, enum machine_mode mode)
5835 struct constant *c;
5836 int i;
5838 for (i = 0; i < NR_C_MODES; i++)
5839 if (constant_modes[i] == mode)
5840 break;
5841 gcc_assert (i != NR_C_MODES);
5843 for (c = pool->constants[i]; c != NULL; c = c->next)
5844 if (rtx_equal_p (val, c->value))
5845 break;
5847 if (c == NULL)
5849 c = (struct constant *) xmalloc (sizeof *c);
5850 c->value = val;
5851 c->label = gen_label_rtx ();
5852 c->next = pool->constants[i];
5853 pool->constants[i] = c;
5854 pool->size += GET_MODE_SIZE (mode);
5858 /* Return an rtx that represents the offset of X from the start of
5859 pool POOL. */
5861 static rtx
5862 s390_pool_offset (struct constant_pool *pool, rtx x)
5864 rtx label;
5866 label = gen_rtx_LABEL_REF (GET_MODE (x), pool->label);
5867 x = gen_rtx_UNSPEC (GET_MODE (x), gen_rtvec (2, x, label),
5868 UNSPEC_POOL_OFFSET);
5869 return gen_rtx_CONST (GET_MODE (x), x);
5872 /* Find constant VAL of mode MODE in the constant pool POOL.
5873 Return an RTX describing the distance from the start of
5874 the pool to the location of the new constant. */
5876 static rtx
5877 s390_find_constant (struct constant_pool *pool, rtx val,
5878 enum machine_mode mode)
5880 struct constant *c;
5881 int i;
5883 for (i = 0; i < NR_C_MODES; i++)
5884 if (constant_modes[i] == mode)
5885 break;
5886 gcc_assert (i != NR_C_MODES);
5888 for (c = pool->constants[i]; c != NULL; c = c->next)
5889 if (rtx_equal_p (val, c->value))
5890 break;
5892 gcc_assert (c);
5894 return s390_pool_offset (pool, gen_rtx_LABEL_REF (Pmode, c->label));
5897 /* Check whether INSN is an execute. Return the label_ref to its
5898 execute target template if so, NULL_RTX otherwise. */
5900 static rtx
5901 s390_execute_label (rtx insn)
5903 if (GET_CODE (insn) == INSN
5904 && GET_CODE (PATTERN (insn)) == PARALLEL
5905 && GET_CODE (XVECEXP (PATTERN (insn), 0, 0)) == UNSPEC
5906 && XINT (XVECEXP (PATTERN (insn), 0, 0), 1) == UNSPEC_EXECUTE)
5907 return XVECEXP (XVECEXP (PATTERN (insn), 0, 0), 0, 2);
5909 return NULL_RTX;
5912 /* Add execute target for INSN to the constant pool POOL. */
5914 static void
5915 s390_add_execute (struct constant_pool *pool, rtx insn)
5917 struct constant *c;
5919 for (c = pool->execute; c != NULL; c = c->next)
5920 if (INSN_UID (insn) == INSN_UID (c->value))
5921 break;
5923 if (c == NULL)
5925 c = (struct constant *) xmalloc (sizeof *c);
5926 c->value = insn;
5927 c->label = gen_label_rtx ();
5928 c->next = pool->execute;
5929 pool->execute = c;
5930 pool->size += 6;
5934 /* Find execute target for INSN in the constant pool POOL.
5935 Return an RTX describing the distance from the start of
5936 the pool to the location of the execute target. */
5938 static rtx
5939 s390_find_execute (struct constant_pool *pool, rtx insn)
5941 struct constant *c;
5943 for (c = pool->execute; c != NULL; c = c->next)
5944 if (INSN_UID (insn) == INSN_UID (c->value))
5945 break;
5947 gcc_assert (c);
5949 return s390_pool_offset (pool, gen_rtx_LABEL_REF (Pmode, c->label));
5952 /* For an execute INSN, extract the execute target template. */
5954 static rtx
5955 s390_execute_target (rtx insn)
5957 rtx pattern = PATTERN (insn);
5958 gcc_assert (s390_execute_label (insn));
5960 if (XVECLEN (pattern, 0) == 2)
5962 pattern = copy_rtx (XVECEXP (pattern, 0, 1));
5964 else
5966 rtvec vec = rtvec_alloc (XVECLEN (pattern, 0) - 1);
5967 int i;
5969 for (i = 0; i < XVECLEN (pattern, 0) - 1; i++)
5970 RTVEC_ELT (vec, i) = copy_rtx (XVECEXP (pattern, 0, i + 1));
5972 pattern = gen_rtx_PARALLEL (VOIDmode, vec);
5975 return pattern;
5978 /* Indicate that INSN cannot be duplicated. This is the case for
5979 execute insns that carry a unique label. */
5981 static bool
5982 s390_cannot_copy_insn_p (rtx insn)
5984 rtx label = s390_execute_label (insn);
5985 return label && label != const0_rtx;
5988 /* Dump out the constants in POOL. If REMOTE_LABEL is true,
5989 do not emit the pool base label. */
5991 static void
5992 s390_dump_pool (struct constant_pool *pool, bool remote_label)
5994 struct constant *c;
5995 rtx insn = pool->pool_insn;
5996 int i;
5998 /* Switch to rodata section. */
5999 if (TARGET_CPU_ZARCH)
6001 insn = emit_insn_after (gen_pool_section_start (), insn);
6002 INSN_ADDRESSES_NEW (insn, -1);
6005 /* Ensure minimum pool alignment. */
6006 if (TARGET_CPU_ZARCH)
6007 insn = emit_insn_after (gen_pool_align (GEN_INT (8)), insn);
6008 else
6009 insn = emit_insn_after (gen_pool_align (GEN_INT (4)), insn);
6010 INSN_ADDRESSES_NEW (insn, -1);
6012 /* Emit pool base label. */
6013 if (!remote_label)
6015 insn = emit_label_after (pool->label, insn);
6016 INSN_ADDRESSES_NEW (insn, -1);
6019 /* Dump constants in descending alignment requirement order,
6020 ensuring proper alignment for every constant. */
6021 for (i = 0; i < NR_C_MODES; i++)
6022 for (c = pool->constants[i]; c; c = c->next)
6024 /* Convert UNSPEC_LTREL_OFFSET unspecs to pool-relative references. */
6025 rtx value = copy_rtx (c->value);
6026 if (GET_CODE (value) == CONST
6027 && GET_CODE (XEXP (value, 0)) == UNSPEC
6028 && XINT (XEXP (value, 0), 1) == UNSPEC_LTREL_OFFSET
6029 && XVECLEN (XEXP (value, 0), 0) == 1)
6030 value = s390_pool_offset (pool, XVECEXP (XEXP (value, 0), 0, 0));
6032 insn = emit_label_after (c->label, insn);
6033 INSN_ADDRESSES_NEW (insn, -1);
6035 value = gen_rtx_UNSPEC_VOLATILE (constant_modes[i],
6036 gen_rtvec (1, value),
6037 UNSPECV_POOL_ENTRY);
6038 insn = emit_insn_after (value, insn);
6039 INSN_ADDRESSES_NEW (insn, -1);
6042 /* Ensure minimum alignment for instructions. */
6043 insn = emit_insn_after (gen_pool_align (GEN_INT (2)), insn);
6044 INSN_ADDRESSES_NEW (insn, -1);
6046 /* Output in-pool execute template insns. */
6047 for (c = pool->execute; c; c = c->next)
6049 insn = emit_label_after (c->label, insn);
6050 INSN_ADDRESSES_NEW (insn, -1);
6052 insn = emit_insn_after (s390_execute_target (c->value), insn);
6053 INSN_ADDRESSES_NEW (insn, -1);
6056 /* Switch back to previous section. */
6057 if (TARGET_CPU_ZARCH)
6059 insn = emit_insn_after (gen_pool_section_end (), insn);
6060 INSN_ADDRESSES_NEW (insn, -1);
6063 insn = emit_barrier_after (insn);
6064 INSN_ADDRESSES_NEW (insn, -1);
6066 /* Remove placeholder insn. */
6067 remove_insn (pool->pool_insn);
6070 /* Free all memory used by POOL. */
6072 static void
6073 s390_free_pool (struct constant_pool *pool)
6075 struct constant *c, *next;
6076 int i;
6078 for (i = 0; i < NR_C_MODES; i++)
6079 for (c = pool->constants[i]; c; c = next)
6081 next = c->next;
6082 free (c);
6085 for (c = pool->execute; c; c = next)
6087 next = c->next;
6088 free (c);
6091 BITMAP_FREE (pool->insns);
6092 free (pool);
6096 /* Collect main literal pool. Return NULL on overflow. */
6098 static struct constant_pool *
6099 s390_mainpool_start (void)
6101 struct constant_pool *pool;
6102 rtx insn;
6104 pool = s390_alloc_pool ();
6106 for (insn = get_insns (); insn; insn = NEXT_INSN (insn))
6108 if (GET_CODE (insn) == INSN
6109 && GET_CODE (PATTERN (insn)) == SET
6110 && GET_CODE (SET_SRC (PATTERN (insn))) == UNSPEC_VOLATILE
6111 && XINT (SET_SRC (PATTERN (insn)), 1) == UNSPECV_MAIN_POOL)
6113 gcc_assert (!pool->pool_insn);
6114 pool->pool_insn = insn;
6117 if (!TARGET_CPU_ZARCH && s390_execute_label (insn))
6119 s390_add_execute (pool, insn);
6121 else if (GET_CODE (insn) == INSN || GET_CODE (insn) == CALL_INSN)
6123 rtx pool_ref = NULL_RTX;
6124 find_constant_pool_ref (PATTERN (insn), &pool_ref);
6125 if (pool_ref)
6127 rtx constant = get_pool_constant (pool_ref);
6128 enum machine_mode mode = get_pool_mode (pool_ref);
6129 s390_add_constant (pool, constant, mode);
6133 /* If hot/cold partitioning is enabled we have to make sure that
6134 the literal pool is emitted in the same section where the
6135 initialization of the literal pool base pointer takes place.
6136 emit_pool_after is only used in the non-overflow case on non
6137 Z cpus where we can emit the literal pool at the end of the
6138 function body within the text section. */
6139 if (NOTE_P (insn)
6140 && NOTE_KIND (insn) == NOTE_INSN_SWITCH_TEXT_SECTIONS
6141 && !pool->emit_pool_after)
6142 pool->emit_pool_after = PREV_INSN (insn);
6145 gcc_assert (pool->pool_insn || pool->size == 0);
6147 if (pool->size >= 4096)
6149 /* We're going to chunkify the pool, so remove the main
6150 pool placeholder insn. */
6151 remove_insn (pool->pool_insn);
6153 s390_free_pool (pool);
6154 pool = NULL;
6157 /* If the functions ends with the section where the literal pool
6158 should be emitted set the marker to its end. */
6159 if (pool && !pool->emit_pool_after)
6160 pool->emit_pool_after = get_last_insn ();
6162 return pool;
6165 /* POOL holds the main literal pool as collected by s390_mainpool_start.
6166 Modify the current function to output the pool constants as well as
6167 the pool register setup instruction. */
6169 static void
6170 s390_mainpool_finish (struct constant_pool *pool)
6172 rtx base_reg = cfun->machine->base_reg;
6173 rtx insn;
6175 /* If the pool is empty, we're done. */
6176 if (pool->size == 0)
6178 /* We don't actually need a base register after all. */
6179 cfun->machine->base_reg = NULL_RTX;
6181 if (pool->pool_insn)
6182 remove_insn (pool->pool_insn);
6183 s390_free_pool (pool);
6184 return;
6187 /* We need correct insn addresses. */
6188 shorten_branches (get_insns ());
6190 /* On zSeries, we use a LARL to load the pool register. The pool is
6191 located in the .rodata section, so we emit it after the function. */
6192 if (TARGET_CPU_ZARCH)
6194 insn = gen_main_base_64 (base_reg, pool->label);
6195 insn = emit_insn_after (insn, pool->pool_insn);
6196 INSN_ADDRESSES_NEW (insn, -1);
6197 remove_insn (pool->pool_insn);
6199 insn = get_last_insn ();
6200 pool->pool_insn = emit_insn_after (gen_pool (const0_rtx), insn);
6201 INSN_ADDRESSES_NEW (pool->pool_insn, -1);
6203 s390_dump_pool (pool, 0);
6206 /* On S/390, if the total size of the function's code plus literal pool
6207 does not exceed 4096 bytes, we use BASR to set up a function base
6208 pointer, and emit the literal pool at the end of the function. */
6209 else if (INSN_ADDRESSES (INSN_UID (pool->emit_pool_after))
6210 + pool->size + 8 /* alignment slop */ < 4096)
6212 insn = gen_main_base_31_small (base_reg, pool->label);
6213 insn = emit_insn_after (insn, pool->pool_insn);
6214 INSN_ADDRESSES_NEW (insn, -1);
6215 remove_insn (pool->pool_insn);
6217 insn = emit_label_after (pool->label, insn);
6218 INSN_ADDRESSES_NEW (insn, -1);
6220 /* emit_pool_after will be set by s390_mainpool_start to the
6221 last insn of the section where the literal pool should be
6222 emitted. */
6223 insn = pool->emit_pool_after;
6225 pool->pool_insn = emit_insn_after (gen_pool (const0_rtx), insn);
6226 INSN_ADDRESSES_NEW (pool->pool_insn, -1);
6228 s390_dump_pool (pool, 1);
6231 /* Otherwise, we emit an inline literal pool and use BASR to branch
6232 over it, setting up the pool register at the same time. */
6233 else
6235 rtx pool_end = gen_label_rtx ();
6237 insn = gen_main_base_31_large (base_reg, pool->label, pool_end);
6238 insn = emit_insn_after (insn, pool->pool_insn);
6239 INSN_ADDRESSES_NEW (insn, -1);
6240 remove_insn (pool->pool_insn);
6242 insn = emit_label_after (pool->label, insn);
6243 INSN_ADDRESSES_NEW (insn, -1);
6245 pool->pool_insn = emit_insn_after (gen_pool (const0_rtx), insn);
6246 INSN_ADDRESSES_NEW (pool->pool_insn, -1);
6248 insn = emit_label_after (pool_end, pool->pool_insn);
6249 INSN_ADDRESSES_NEW (insn, -1);
6251 s390_dump_pool (pool, 1);
6255 /* Replace all literal pool references. */
6257 for (insn = get_insns (); insn; insn = NEXT_INSN (insn))
6259 if (INSN_P (insn))
6260 replace_ltrel_base (&PATTERN (insn));
6262 if (GET_CODE (insn) == INSN || GET_CODE (insn) == CALL_INSN)
6264 rtx addr, pool_ref = NULL_RTX;
6265 find_constant_pool_ref (PATTERN (insn), &pool_ref);
6266 if (pool_ref)
6268 if (s390_execute_label (insn))
6269 addr = s390_find_execute (pool, insn);
6270 else
6271 addr = s390_find_constant (pool, get_pool_constant (pool_ref),
6272 get_pool_mode (pool_ref));
6274 replace_constant_pool_ref (&PATTERN (insn), pool_ref, addr);
6275 INSN_CODE (insn) = -1;
6281 /* Free the pool. */
6282 s390_free_pool (pool);
6285 /* POOL holds the main literal pool as collected by s390_mainpool_start.
6286 We have decided we cannot use this pool, so revert all changes
6287 to the current function that were done by s390_mainpool_start. */
6288 static void
6289 s390_mainpool_cancel (struct constant_pool *pool)
6291 /* We didn't actually change the instruction stream, so simply
6292 free the pool memory. */
6293 s390_free_pool (pool);
6297 /* Chunkify the literal pool. */
6299 #define S390_POOL_CHUNK_MIN 0xc00
6300 #define S390_POOL_CHUNK_MAX 0xe00
6302 static struct constant_pool *
6303 s390_chunkify_start (void)
6305 struct constant_pool *curr_pool = NULL, *pool_list = NULL;
6306 int extra_size = 0;
6307 bitmap far_labels;
6308 rtx pending_ltrel = NULL_RTX;
6309 rtx insn;
6311 rtx (*gen_reload_base) (rtx, rtx) =
6312 TARGET_CPU_ZARCH? gen_reload_base_64 : gen_reload_base_31;
6315 /* We need correct insn addresses. */
6317 shorten_branches (get_insns ());
6319 /* Scan all insns and move literals to pool chunks. */
6321 for (insn = get_insns (); insn; insn = NEXT_INSN (insn))
6323 bool section_switch_p = false;
6325 /* Check for pending LTREL_BASE. */
6326 if (INSN_P (insn))
6328 rtx ltrel_base = find_ltrel_base (PATTERN (insn));
6329 if (ltrel_base)
6331 gcc_assert (ltrel_base == pending_ltrel);
6332 pending_ltrel = NULL_RTX;
6336 if (!TARGET_CPU_ZARCH && s390_execute_label (insn))
6338 if (!curr_pool)
6339 curr_pool = s390_start_pool (&pool_list, insn);
6341 s390_add_execute (curr_pool, insn);
6342 s390_add_pool_insn (curr_pool, insn);
6344 else if (GET_CODE (insn) == INSN || GET_CODE (insn) == CALL_INSN)
6346 rtx pool_ref = NULL_RTX;
6347 find_constant_pool_ref (PATTERN (insn), &pool_ref);
6348 if (pool_ref)
6350 rtx constant = get_pool_constant (pool_ref);
6351 enum machine_mode mode = get_pool_mode (pool_ref);
6353 if (!curr_pool)
6354 curr_pool = s390_start_pool (&pool_list, insn);
6356 s390_add_constant (curr_pool, constant, mode);
6357 s390_add_pool_insn (curr_pool, insn);
6359 /* Don't split the pool chunk between a LTREL_OFFSET load
6360 and the corresponding LTREL_BASE. */
6361 if (GET_CODE (constant) == CONST
6362 && GET_CODE (XEXP (constant, 0)) == UNSPEC
6363 && XINT (XEXP (constant, 0), 1) == UNSPEC_LTREL_OFFSET)
6365 gcc_assert (!pending_ltrel);
6366 pending_ltrel = pool_ref;
6371 if (GET_CODE (insn) == JUMP_INSN || GET_CODE (insn) == CODE_LABEL)
6373 if (curr_pool)
6374 s390_add_pool_insn (curr_pool, insn);
6375 /* An LTREL_BASE must follow within the same basic block. */
6376 gcc_assert (!pending_ltrel);
6379 if (NOTE_P (insn) && NOTE_KIND (insn) == NOTE_INSN_SWITCH_TEXT_SECTIONS)
6380 section_switch_p = true;
6382 if (!curr_pool
6383 || INSN_ADDRESSES_SIZE () <= (size_t) INSN_UID (insn)
6384 || INSN_ADDRESSES (INSN_UID (insn)) == -1)
6385 continue;
6387 if (TARGET_CPU_ZARCH)
6389 if (curr_pool->size < S390_POOL_CHUNK_MAX)
6390 continue;
6392 s390_end_pool (curr_pool, NULL_RTX);
6393 curr_pool = NULL;
6395 else
6397 int chunk_size = INSN_ADDRESSES (INSN_UID (insn))
6398 - INSN_ADDRESSES (INSN_UID (curr_pool->first_insn))
6399 + extra_size;
6401 /* We will later have to insert base register reload insns.
6402 Those will have an effect on code size, which we need to
6403 consider here. This calculation makes rather pessimistic
6404 worst-case assumptions. */
6405 if (GET_CODE (insn) == CODE_LABEL)
6406 extra_size += 6;
6408 if (chunk_size < S390_POOL_CHUNK_MIN
6409 && curr_pool->size < S390_POOL_CHUNK_MIN
6410 && !section_switch_p)
6411 continue;
6413 /* Pool chunks can only be inserted after BARRIERs ... */
6414 if (GET_CODE (insn) == BARRIER)
6416 s390_end_pool (curr_pool, insn);
6417 curr_pool = NULL;
6418 extra_size = 0;
6421 /* ... so if we don't find one in time, create one. */
6422 else if (chunk_size > S390_POOL_CHUNK_MAX
6423 || curr_pool->size > S390_POOL_CHUNK_MAX
6424 || section_switch_p)
6426 rtx label, jump, barrier;
6428 if (!section_switch_p)
6430 /* We can insert the barrier only after a 'real' insn. */
6431 if (GET_CODE (insn) != INSN && GET_CODE (insn) != CALL_INSN)
6432 continue;
6433 if (get_attr_length (insn) == 0)
6434 continue;
6435 /* Don't separate LTREL_BASE from the corresponding
6436 LTREL_OFFSET load. */
6437 if (pending_ltrel)
6438 continue;
6440 else
6442 gcc_assert (!pending_ltrel);
6444 /* The old pool has to end before the section switch
6445 note in order to make it part of the current
6446 section. */
6447 insn = PREV_INSN (insn);
6450 label = gen_label_rtx ();
6451 jump = emit_jump_insn_after (gen_jump (label), insn);
6452 barrier = emit_barrier_after (jump);
6453 insn = emit_label_after (label, barrier);
6454 JUMP_LABEL (jump) = label;
6455 LABEL_NUSES (label) = 1;
6457 INSN_ADDRESSES_NEW (jump, -1);
6458 INSN_ADDRESSES_NEW (barrier, -1);
6459 INSN_ADDRESSES_NEW (insn, -1);
6461 s390_end_pool (curr_pool, barrier);
6462 curr_pool = NULL;
6463 extra_size = 0;
6468 if (curr_pool)
6469 s390_end_pool (curr_pool, NULL_RTX);
6470 gcc_assert (!pending_ltrel);
6472 /* Find all labels that are branched into
6473 from an insn belonging to a different chunk. */
6475 far_labels = BITMAP_ALLOC (NULL);
6477 for (insn = get_insns (); insn; insn = NEXT_INSN (insn))
6479 /* Labels marked with LABEL_PRESERVE_P can be target
6480 of non-local jumps, so we have to mark them.
6481 The same holds for named labels.
6483 Don't do that, however, if it is the label before
6484 a jump table. */
6486 if (GET_CODE (insn) == CODE_LABEL
6487 && (LABEL_PRESERVE_P (insn) || LABEL_NAME (insn)))
6489 rtx vec_insn = next_real_insn (insn);
6490 rtx vec_pat = vec_insn && GET_CODE (vec_insn) == JUMP_INSN ?
6491 PATTERN (vec_insn) : NULL_RTX;
6492 if (!vec_pat
6493 || !(GET_CODE (vec_pat) == ADDR_VEC
6494 || GET_CODE (vec_pat) == ADDR_DIFF_VEC))
6495 bitmap_set_bit (far_labels, CODE_LABEL_NUMBER (insn));
6498 /* If we have a direct jump (conditional or unconditional)
6499 or a casesi jump, check all potential targets. */
6500 else if (GET_CODE (insn) == JUMP_INSN)
6502 rtx pat = PATTERN (insn);
6503 if (GET_CODE (pat) == PARALLEL && XVECLEN (pat, 0) > 2)
6504 pat = XVECEXP (pat, 0, 0);
6506 if (GET_CODE (pat) == SET)
6508 rtx label = JUMP_LABEL (insn);
6509 if (label)
6511 if (s390_find_pool (pool_list, label)
6512 != s390_find_pool (pool_list, insn))
6513 bitmap_set_bit (far_labels, CODE_LABEL_NUMBER (label));
6516 else if (GET_CODE (pat) == PARALLEL
6517 && XVECLEN (pat, 0) == 2
6518 && GET_CODE (XVECEXP (pat, 0, 0)) == SET
6519 && GET_CODE (XVECEXP (pat, 0, 1)) == USE
6520 && GET_CODE (XEXP (XVECEXP (pat, 0, 1), 0)) == LABEL_REF)
6522 /* Find the jump table used by this casesi jump. */
6523 rtx vec_label = XEXP (XEXP (XVECEXP (pat, 0, 1), 0), 0);
6524 rtx vec_insn = next_real_insn (vec_label);
6525 rtx vec_pat = vec_insn && GET_CODE (vec_insn) == JUMP_INSN ?
6526 PATTERN (vec_insn) : NULL_RTX;
6527 if (vec_pat
6528 && (GET_CODE (vec_pat) == ADDR_VEC
6529 || GET_CODE (vec_pat) == ADDR_DIFF_VEC))
6531 int i, diff_p = GET_CODE (vec_pat) == ADDR_DIFF_VEC;
6533 for (i = 0; i < XVECLEN (vec_pat, diff_p); i++)
6535 rtx label = XEXP (XVECEXP (vec_pat, diff_p, i), 0);
6537 if (s390_find_pool (pool_list, label)
6538 != s390_find_pool (pool_list, insn))
6539 bitmap_set_bit (far_labels, CODE_LABEL_NUMBER (label));
6546 /* Insert base register reload insns before every pool. */
6548 for (curr_pool = pool_list; curr_pool; curr_pool = curr_pool->next)
6550 rtx new_insn = gen_reload_base (cfun->machine->base_reg,
6551 curr_pool->label);
6552 rtx insn = curr_pool->first_insn;
6553 INSN_ADDRESSES_NEW (emit_insn_before (new_insn, insn), -1);
6556 /* Insert base register reload insns at every far label. */
6558 for (insn = get_insns (); insn; insn = NEXT_INSN (insn))
6559 if (GET_CODE (insn) == CODE_LABEL
6560 && bitmap_bit_p (far_labels, CODE_LABEL_NUMBER (insn)))
6562 struct constant_pool *pool = s390_find_pool (pool_list, insn);
6563 if (pool)
6565 rtx new_insn = gen_reload_base (cfun->machine->base_reg,
6566 pool->label);
6567 INSN_ADDRESSES_NEW (emit_insn_after (new_insn, insn), -1);
6572 BITMAP_FREE (far_labels);
6575 /* Recompute insn addresses. */
6577 init_insn_lengths ();
6578 shorten_branches (get_insns ());
6580 return pool_list;
6583 /* POOL_LIST is a chunk list as prepared by s390_chunkify_start.
6584 After we have decided to use this list, finish implementing
6585 all changes to the current function as required. */
6587 static void
6588 s390_chunkify_finish (struct constant_pool *pool_list)
6590 struct constant_pool *curr_pool = NULL;
6591 rtx insn;
6594 /* Replace all literal pool references. */
6596 for (insn = get_insns (); insn; insn = NEXT_INSN (insn))
6598 if (INSN_P (insn))
6599 replace_ltrel_base (&PATTERN (insn));
6601 curr_pool = s390_find_pool (pool_list, insn);
6602 if (!curr_pool)
6603 continue;
6605 if (GET_CODE (insn) == INSN || GET_CODE (insn) == CALL_INSN)
6607 rtx addr, pool_ref = NULL_RTX;
6608 find_constant_pool_ref (PATTERN (insn), &pool_ref);
6609 if (pool_ref)
6611 if (s390_execute_label (insn))
6612 addr = s390_find_execute (curr_pool, insn);
6613 else
6614 addr = s390_find_constant (curr_pool,
6615 get_pool_constant (pool_ref),
6616 get_pool_mode (pool_ref));
6618 replace_constant_pool_ref (&PATTERN (insn), pool_ref, addr);
6619 INSN_CODE (insn) = -1;
6624 /* Dump out all literal pools. */
6626 for (curr_pool = pool_list; curr_pool; curr_pool = curr_pool->next)
6627 s390_dump_pool (curr_pool, 0);
6629 /* Free pool list. */
6631 while (pool_list)
6633 struct constant_pool *next = pool_list->next;
6634 s390_free_pool (pool_list);
6635 pool_list = next;
6639 /* POOL_LIST is a chunk list as prepared by s390_chunkify_start.
6640 We have decided we cannot use this list, so revert all changes
6641 to the current function that were done by s390_chunkify_start. */
6643 static void
6644 s390_chunkify_cancel (struct constant_pool *pool_list)
6646 struct constant_pool *curr_pool = NULL;
6647 rtx insn;
6649 /* Remove all pool placeholder insns. */
6651 for (curr_pool = pool_list; curr_pool; curr_pool = curr_pool->next)
6653 /* Did we insert an extra barrier? Remove it. */
6654 rtx barrier = PREV_INSN (curr_pool->pool_insn);
6655 rtx jump = barrier? PREV_INSN (barrier) : NULL_RTX;
6656 rtx label = NEXT_INSN (curr_pool->pool_insn);
6658 if (jump && GET_CODE (jump) == JUMP_INSN
6659 && barrier && GET_CODE (barrier) == BARRIER
6660 && label && GET_CODE (label) == CODE_LABEL
6661 && GET_CODE (PATTERN (jump)) == SET
6662 && SET_DEST (PATTERN (jump)) == pc_rtx
6663 && GET_CODE (SET_SRC (PATTERN (jump))) == LABEL_REF
6664 && XEXP (SET_SRC (PATTERN (jump)), 0) == label)
6666 remove_insn (jump);
6667 remove_insn (barrier);
6668 remove_insn (label);
6671 remove_insn (curr_pool->pool_insn);
6674 /* Remove all base register reload insns. */
6676 for (insn = get_insns (); insn; )
6678 rtx next_insn = NEXT_INSN (insn);
6680 if (GET_CODE (insn) == INSN
6681 && GET_CODE (PATTERN (insn)) == SET
6682 && GET_CODE (SET_SRC (PATTERN (insn))) == UNSPEC
6683 && XINT (SET_SRC (PATTERN (insn)), 1) == UNSPEC_RELOAD_BASE)
6684 remove_insn (insn);
6686 insn = next_insn;
6689 /* Free pool list. */
6691 while (pool_list)
6693 struct constant_pool *next = pool_list->next;
6694 s390_free_pool (pool_list);
6695 pool_list = next;
6699 /* Output the constant pool entry EXP in mode MODE with alignment ALIGN. */
6701 void
6702 s390_output_pool_entry (rtx exp, enum machine_mode mode, unsigned int align)
6704 REAL_VALUE_TYPE r;
6706 switch (GET_MODE_CLASS (mode))
6708 case MODE_FLOAT:
6709 case MODE_DECIMAL_FLOAT:
6710 gcc_assert (GET_CODE (exp) == CONST_DOUBLE);
6712 REAL_VALUE_FROM_CONST_DOUBLE (r, exp);
6713 assemble_real (r, mode, align);
6714 break;
6716 case MODE_INT:
6717 assemble_integer (exp, GET_MODE_SIZE (mode), align, 1);
6718 mark_symbol_refs_as_used (exp);
6719 break;
6721 default:
6722 gcc_unreachable ();
6727 /* Return an RTL expression representing the value of the return address
6728 for the frame COUNT steps up from the current frame. FRAME is the
6729 frame pointer of that frame. */
6732 s390_return_addr_rtx (int count, rtx frame ATTRIBUTE_UNUSED)
6734 int offset;
6735 rtx addr;
6737 /* Without backchain, we fail for all but the current frame. */
6739 if (!TARGET_BACKCHAIN && count > 0)
6740 return NULL_RTX;
6742 /* For the current frame, we need to make sure the initial
6743 value of RETURN_REGNUM is actually saved. */
6745 if (count == 0)
6747 /* On non-z architectures branch splitting could overwrite r14. */
6748 if (TARGET_CPU_ZARCH)
6749 return get_hard_reg_initial_val (Pmode, RETURN_REGNUM);
6750 else
6752 cfun_frame_layout.save_return_addr_p = true;
6753 return gen_rtx_MEM (Pmode, return_address_pointer_rtx);
6757 if (TARGET_PACKED_STACK)
6758 offset = -2 * UNITS_PER_WORD;
6759 else
6760 offset = RETURN_REGNUM * UNITS_PER_WORD;
6762 addr = plus_constant (frame, offset);
6763 addr = memory_address (Pmode, addr);
6764 return gen_rtx_MEM (Pmode, addr);
6767 /* Return an RTL expression representing the back chain stored in
6768 the current stack frame. */
6771 s390_back_chain_rtx (void)
6773 rtx chain;
6775 gcc_assert (TARGET_BACKCHAIN);
6777 if (TARGET_PACKED_STACK)
6778 chain = plus_constant (stack_pointer_rtx,
6779 STACK_POINTER_OFFSET - UNITS_PER_WORD);
6780 else
6781 chain = stack_pointer_rtx;
6783 chain = gen_rtx_MEM (Pmode, chain);
6784 return chain;
6787 /* Find first call clobbered register unused in a function.
6788 This could be used as base register in a leaf function
6789 or for holding the return address before epilogue. */
6791 static int
6792 find_unused_clobbered_reg (void)
6794 int i;
6795 for (i = 0; i < 6; i++)
6796 if (!df_regs_ever_live_p (i))
6797 return i;
6798 return 0;
6802 /* Helper function for s390_regs_ever_clobbered. Sets the fields in DATA for all
6803 clobbered hard regs in SETREG. */
6805 static void
6806 s390_reg_clobbered_rtx (rtx setreg, const_rtx set_insn ATTRIBUTE_UNUSED, void *data)
6808 int *regs_ever_clobbered = (int *)data;
6809 unsigned int i, regno;
6810 enum machine_mode mode = GET_MODE (setreg);
6812 if (GET_CODE (setreg) == SUBREG)
6814 rtx inner = SUBREG_REG (setreg);
6815 if (!GENERAL_REG_P (inner))
6816 return;
6817 regno = subreg_regno (setreg);
6819 else if (GENERAL_REG_P (setreg))
6820 regno = REGNO (setreg);
6821 else
6822 return;
6824 for (i = regno;
6825 i < regno + HARD_REGNO_NREGS (regno, mode);
6826 i++)
6827 regs_ever_clobbered[i] = 1;
6830 /* Walks through all basic blocks of the current function looking
6831 for clobbered hard regs using s390_reg_clobbered_rtx. The fields
6832 of the passed integer array REGS_EVER_CLOBBERED are set to one for
6833 each of those regs. */
6835 static void
6836 s390_regs_ever_clobbered (int *regs_ever_clobbered)
6838 basic_block cur_bb;
6839 rtx cur_insn;
6840 unsigned int i;
6842 memset (regs_ever_clobbered, 0, 16 * sizeof (int));
6844 /* For non-leaf functions we have to consider all call clobbered regs to be
6845 clobbered. */
6846 if (!current_function_is_leaf)
6848 for (i = 0; i < 16; i++)
6849 regs_ever_clobbered[i] = call_really_used_regs[i];
6852 /* Make the "magic" eh_return registers live if necessary. For regs_ever_live
6853 this work is done by liveness analysis (mark_regs_live_at_end).
6854 Special care is needed for functions containing landing pads. Landing pads
6855 may use the eh registers, but the code which sets these registers is not
6856 contained in that function. Hence s390_regs_ever_clobbered is not able to
6857 deal with this automatically. */
6858 if (crtl->calls_eh_return || cfun->machine->has_landing_pad_p)
6859 for (i = 0; EH_RETURN_DATA_REGNO (i) != INVALID_REGNUM ; i++)
6860 if (crtl->calls_eh_return
6861 || (cfun->machine->has_landing_pad_p
6862 && df_regs_ever_live_p (EH_RETURN_DATA_REGNO (i))))
6863 regs_ever_clobbered[EH_RETURN_DATA_REGNO (i)] = 1;
6865 /* For nonlocal gotos all call-saved registers have to be saved.
6866 This flag is also set for the unwinding code in libgcc.
6867 See expand_builtin_unwind_init. For regs_ever_live this is done by
6868 reload. */
6869 if (cfun->has_nonlocal_label)
6870 for (i = 0; i < 16; i++)
6871 if (!call_really_used_regs[i])
6872 regs_ever_clobbered[i] = 1;
6874 FOR_EACH_BB (cur_bb)
6876 FOR_BB_INSNS (cur_bb, cur_insn)
6878 if (INSN_P (cur_insn))
6879 note_stores (PATTERN (cur_insn),
6880 s390_reg_clobbered_rtx,
6881 regs_ever_clobbered);
6886 /* Determine the frame area which actually has to be accessed
6887 in the function epilogue. The values are stored at the
6888 given pointers AREA_BOTTOM (address of the lowest used stack
6889 address) and AREA_TOP (address of the first item which does
6890 not belong to the stack frame). */
6892 static void
6893 s390_frame_area (int *area_bottom, int *area_top)
6895 int b, t;
6896 int i;
6898 b = INT_MAX;
6899 t = INT_MIN;
6901 if (cfun_frame_layout.first_restore_gpr != -1)
6903 b = (cfun_frame_layout.gprs_offset
6904 + cfun_frame_layout.first_restore_gpr * UNITS_PER_WORD);
6905 t = b + (cfun_frame_layout.last_restore_gpr
6906 - cfun_frame_layout.first_restore_gpr + 1) * UNITS_PER_WORD;
6909 if (TARGET_64BIT && cfun_save_high_fprs_p)
6911 b = MIN (b, cfun_frame_layout.f8_offset);
6912 t = MAX (t, (cfun_frame_layout.f8_offset
6913 + cfun_frame_layout.high_fprs * 8));
6916 if (!TARGET_64BIT)
6917 for (i = 2; i < 4; i++)
6918 if (cfun_fpr_bit_p (i))
6920 b = MIN (b, cfun_frame_layout.f4_offset + (i - 2) * 8);
6921 t = MAX (t, cfun_frame_layout.f4_offset + (i - 1) * 8);
6924 *area_bottom = b;
6925 *area_top = t;
6928 /* Fill cfun->machine with info about register usage of current function.
6929 Return in CLOBBERED_REGS which GPRs are currently considered set. */
6931 static void
6932 s390_register_info (int clobbered_regs[])
6934 int i, j;
6936 /* fprs 8 - 15 are call saved for 64 Bit ABI. */
6937 cfun_frame_layout.fpr_bitmap = 0;
6938 cfun_frame_layout.high_fprs = 0;
6939 if (TARGET_64BIT)
6940 for (i = 24; i < 32; i++)
6941 if (df_regs_ever_live_p (i) && !global_regs[i])
6943 cfun_set_fpr_bit (i - 16);
6944 cfun_frame_layout.high_fprs++;
6947 /* Find first and last gpr to be saved. We trust regs_ever_live
6948 data, except that we don't save and restore global registers.
6950 Also, all registers with special meaning to the compiler need
6951 to be handled extra. */
6953 s390_regs_ever_clobbered (clobbered_regs);
6955 for (i = 0; i < 16; i++)
6956 clobbered_regs[i] = clobbered_regs[i] && !global_regs[i] && !fixed_regs[i];
6958 if (frame_pointer_needed)
6959 clobbered_regs[HARD_FRAME_POINTER_REGNUM] = 1;
6961 if (flag_pic)
6962 clobbered_regs[PIC_OFFSET_TABLE_REGNUM]
6963 |= df_regs_ever_live_p (PIC_OFFSET_TABLE_REGNUM);
6965 clobbered_regs[BASE_REGNUM]
6966 |= (cfun->machine->base_reg
6967 && REGNO (cfun->machine->base_reg) == BASE_REGNUM);
6969 clobbered_regs[RETURN_REGNUM]
6970 |= (!current_function_is_leaf
6971 || TARGET_TPF_PROFILING
6972 || cfun->machine->split_branches_pending_p
6973 || cfun_frame_layout.save_return_addr_p
6974 || crtl->calls_eh_return
6975 || cfun->stdarg);
6977 clobbered_regs[STACK_POINTER_REGNUM]
6978 |= (!current_function_is_leaf
6979 || TARGET_TPF_PROFILING
6980 || cfun_save_high_fprs_p
6981 || get_frame_size () > 0
6982 || cfun->calls_alloca
6983 || cfun->stdarg);
6985 for (i = 6; i < 16; i++)
6986 if (df_regs_ever_live_p (i) || clobbered_regs[i])
6987 break;
6988 for (j = 15; j > i; j--)
6989 if (df_regs_ever_live_p (j) || clobbered_regs[j])
6990 break;
6992 if (i == 16)
6994 /* Nothing to save/restore. */
6995 cfun_frame_layout.first_save_gpr_slot = -1;
6996 cfun_frame_layout.last_save_gpr_slot = -1;
6997 cfun_frame_layout.first_save_gpr = -1;
6998 cfun_frame_layout.first_restore_gpr = -1;
6999 cfun_frame_layout.last_save_gpr = -1;
7000 cfun_frame_layout.last_restore_gpr = -1;
7002 else
7004 /* Save slots for gprs from i to j. */
7005 cfun_frame_layout.first_save_gpr_slot = i;
7006 cfun_frame_layout.last_save_gpr_slot = j;
7008 for (i = cfun_frame_layout.first_save_gpr_slot;
7009 i < cfun_frame_layout.last_save_gpr_slot + 1;
7010 i++)
7011 if (clobbered_regs[i])
7012 break;
7014 for (j = cfun_frame_layout.last_save_gpr_slot; j > i; j--)
7015 if (clobbered_regs[j])
7016 break;
7018 if (i == cfun_frame_layout.last_save_gpr_slot + 1)
7020 /* Nothing to save/restore. */
7021 cfun_frame_layout.first_save_gpr = -1;
7022 cfun_frame_layout.first_restore_gpr = -1;
7023 cfun_frame_layout.last_save_gpr = -1;
7024 cfun_frame_layout.last_restore_gpr = -1;
7026 else
7028 /* Save / Restore from gpr i to j. */
7029 cfun_frame_layout.first_save_gpr = i;
7030 cfun_frame_layout.first_restore_gpr = i;
7031 cfun_frame_layout.last_save_gpr = j;
7032 cfun_frame_layout.last_restore_gpr = j;
7036 if (cfun->stdarg)
7038 /* Varargs functions need to save gprs 2 to 6. */
7039 if (cfun->va_list_gpr_size
7040 && crtl->args.info.gprs < GP_ARG_NUM_REG)
7042 int min_gpr = crtl->args.info.gprs;
7043 int max_gpr = min_gpr + cfun->va_list_gpr_size;
7044 if (max_gpr > GP_ARG_NUM_REG)
7045 max_gpr = GP_ARG_NUM_REG;
7047 if (cfun_frame_layout.first_save_gpr == -1
7048 || cfun_frame_layout.first_save_gpr > 2 + min_gpr)
7050 cfun_frame_layout.first_save_gpr = 2 + min_gpr;
7051 cfun_frame_layout.first_save_gpr_slot = 2 + min_gpr;
7054 if (cfun_frame_layout.last_save_gpr == -1
7055 || cfun_frame_layout.last_save_gpr < 2 + max_gpr - 1)
7057 cfun_frame_layout.last_save_gpr = 2 + max_gpr - 1;
7058 cfun_frame_layout.last_save_gpr_slot = 2 + max_gpr - 1;
7062 /* Mark f0, f2 for 31 bit and f0-f4 for 64 bit to be saved. */
7063 if (TARGET_HARD_FLOAT && cfun->va_list_fpr_size
7064 && crtl->args.info.fprs < FP_ARG_NUM_REG)
7066 int min_fpr = crtl->args.info.fprs;
7067 int max_fpr = min_fpr + cfun->va_list_fpr_size;
7068 if (max_fpr > FP_ARG_NUM_REG)
7069 max_fpr = FP_ARG_NUM_REG;
7071 /* ??? This is currently required to ensure proper location
7072 of the fpr save slots within the va_list save area. */
7073 if (TARGET_PACKED_STACK)
7074 min_fpr = 0;
7076 for (i = min_fpr; i < max_fpr; i++)
7077 cfun_set_fpr_bit (i);
7081 if (!TARGET_64BIT)
7082 for (i = 2; i < 4; i++)
7083 if (df_regs_ever_live_p (i + 16) && !global_regs[i + 16])
7084 cfun_set_fpr_bit (i);
7087 /* Fill cfun->machine with info about frame of current function. */
7089 static void
7090 s390_frame_info (void)
7092 int i;
7094 cfun_frame_layout.frame_size = get_frame_size ();
7095 if (!TARGET_64BIT && cfun_frame_layout.frame_size > 0x7fff0000)
7096 fatal_error ("total size of local variables exceeds architecture limit");
7098 if (!TARGET_PACKED_STACK)
7100 cfun_frame_layout.backchain_offset = 0;
7101 cfun_frame_layout.f0_offset = 16 * UNITS_PER_WORD;
7102 cfun_frame_layout.f4_offset = cfun_frame_layout.f0_offset + 2 * 8;
7103 cfun_frame_layout.f8_offset = -cfun_frame_layout.high_fprs * 8;
7104 cfun_frame_layout.gprs_offset = (cfun_frame_layout.first_save_gpr_slot
7105 * UNITS_PER_WORD);
7107 else if (TARGET_BACKCHAIN) /* kernel stack layout */
7109 cfun_frame_layout.backchain_offset = (STACK_POINTER_OFFSET
7110 - UNITS_PER_WORD);
7111 cfun_frame_layout.gprs_offset
7112 = (cfun_frame_layout.backchain_offset
7113 - (STACK_POINTER_REGNUM - cfun_frame_layout.first_save_gpr_slot + 1)
7114 * UNITS_PER_WORD);
7116 if (TARGET_64BIT)
7118 cfun_frame_layout.f4_offset
7119 = (cfun_frame_layout.gprs_offset
7120 - 8 * (cfun_fpr_bit_p (2) + cfun_fpr_bit_p (3)));
7122 cfun_frame_layout.f0_offset
7123 = (cfun_frame_layout.f4_offset
7124 - 8 * (cfun_fpr_bit_p (0) + cfun_fpr_bit_p (1)));
7126 else
7128 /* On 31 bit we have to care about alignment of the
7129 floating point regs to provide fastest access. */
7130 cfun_frame_layout.f0_offset
7131 = ((cfun_frame_layout.gprs_offset
7132 & ~(STACK_BOUNDARY / BITS_PER_UNIT - 1))
7133 - 8 * (cfun_fpr_bit_p (0) + cfun_fpr_bit_p (1)));
7135 cfun_frame_layout.f4_offset
7136 = (cfun_frame_layout.f0_offset
7137 - 8 * (cfun_fpr_bit_p (2) + cfun_fpr_bit_p (3)));
7140 else /* no backchain */
7142 cfun_frame_layout.f4_offset
7143 = (STACK_POINTER_OFFSET
7144 - 8 * (cfun_fpr_bit_p (2) + cfun_fpr_bit_p (3)));
7146 cfun_frame_layout.f0_offset
7147 = (cfun_frame_layout.f4_offset
7148 - 8 * (cfun_fpr_bit_p (0) + cfun_fpr_bit_p (1)));
7150 cfun_frame_layout.gprs_offset
7151 = cfun_frame_layout.f0_offset - cfun_gprs_save_area_size;
7154 if (current_function_is_leaf
7155 && !TARGET_TPF_PROFILING
7156 && cfun_frame_layout.frame_size == 0
7157 && !cfun_save_high_fprs_p
7158 && !cfun->calls_alloca
7159 && !cfun->stdarg)
7160 return;
7162 if (!TARGET_PACKED_STACK)
7163 cfun_frame_layout.frame_size += (STACK_POINTER_OFFSET
7164 + crtl->outgoing_args_size
7165 + cfun_frame_layout.high_fprs * 8);
7166 else
7168 if (TARGET_BACKCHAIN)
7169 cfun_frame_layout.frame_size += UNITS_PER_WORD;
7171 /* No alignment trouble here because f8-f15 are only saved under
7172 64 bit. */
7173 cfun_frame_layout.f8_offset = (MIN (MIN (cfun_frame_layout.f0_offset,
7174 cfun_frame_layout.f4_offset),
7175 cfun_frame_layout.gprs_offset)
7176 - cfun_frame_layout.high_fprs * 8);
7178 cfun_frame_layout.frame_size += cfun_frame_layout.high_fprs * 8;
7180 for (i = 0; i < 8; i++)
7181 if (cfun_fpr_bit_p (i))
7182 cfun_frame_layout.frame_size += 8;
7184 cfun_frame_layout.frame_size += cfun_gprs_save_area_size;
7186 /* If under 31 bit an odd number of gprs has to be saved we have to adjust
7187 the frame size to sustain 8 byte alignment of stack frames. */
7188 cfun_frame_layout.frame_size = ((cfun_frame_layout.frame_size +
7189 STACK_BOUNDARY / BITS_PER_UNIT - 1)
7190 & ~(STACK_BOUNDARY / BITS_PER_UNIT - 1));
7192 cfun_frame_layout.frame_size += crtl->outgoing_args_size;
7196 /* Generate frame layout. Fills in register and frame data for the current
7197 function in cfun->machine. This routine can be called multiple times;
7198 it will re-do the complete frame layout every time. */
7200 static void
7201 s390_init_frame_layout (void)
7203 HOST_WIDE_INT frame_size;
7204 int base_used;
7205 int clobbered_regs[16];
7207 /* On S/390 machines, we may need to perform branch splitting, which
7208 will require both base and return address register. We have no
7209 choice but to assume we're going to need them until right at the
7210 end of the machine dependent reorg phase. */
7211 if (!TARGET_CPU_ZARCH)
7212 cfun->machine->split_branches_pending_p = true;
7216 frame_size = cfun_frame_layout.frame_size;
7218 /* Try to predict whether we'll need the base register. */
7219 base_used = cfun->machine->split_branches_pending_p
7220 || crtl->uses_const_pool
7221 || (!DISP_IN_RANGE (frame_size)
7222 && !CONST_OK_FOR_K (frame_size));
7224 /* Decide which register to use as literal pool base. In small
7225 leaf functions, try to use an unused call-clobbered register
7226 as base register to avoid save/restore overhead. */
7227 if (!base_used)
7228 cfun->machine->base_reg = NULL_RTX;
7229 else if (current_function_is_leaf && !df_regs_ever_live_p (5))
7230 cfun->machine->base_reg = gen_rtx_REG (Pmode, 5);
7231 else
7232 cfun->machine->base_reg = gen_rtx_REG (Pmode, BASE_REGNUM);
7234 s390_register_info (clobbered_regs);
7235 s390_frame_info ();
7237 while (frame_size != cfun_frame_layout.frame_size);
7240 /* Update frame layout. Recompute actual register save data based on
7241 current info and update regs_ever_live for the special registers.
7242 May be called multiple times, but may never cause *more* registers
7243 to be saved than s390_init_frame_layout allocated room for. */
7245 static void
7246 s390_update_frame_layout (void)
7248 int clobbered_regs[16];
7250 s390_register_info (clobbered_regs);
7252 df_set_regs_ever_live (BASE_REGNUM,
7253 clobbered_regs[BASE_REGNUM] ? true : false);
7254 df_set_regs_ever_live (RETURN_REGNUM,
7255 clobbered_regs[RETURN_REGNUM] ? true : false);
7256 df_set_regs_ever_live (STACK_POINTER_REGNUM,
7257 clobbered_regs[STACK_POINTER_REGNUM] ? true : false);
7259 if (cfun->machine->base_reg)
7260 df_set_regs_ever_live (REGNO (cfun->machine->base_reg), true);
7263 /* Return true if it is legal to put a value with MODE into REGNO. */
7265 bool
7266 s390_hard_regno_mode_ok (unsigned int regno, enum machine_mode mode)
7268 switch (REGNO_REG_CLASS (regno))
7270 case FP_REGS:
7271 if (REGNO_PAIR_OK (regno, mode))
7273 if (mode == SImode || mode == DImode)
7274 return true;
7276 if (FLOAT_MODE_P (mode) && GET_MODE_CLASS (mode) != MODE_VECTOR_FLOAT)
7277 return true;
7279 break;
7280 case ADDR_REGS:
7281 if (FRAME_REGNO_P (regno) && mode == Pmode)
7282 return true;
7284 /* fallthrough */
7285 case GENERAL_REGS:
7286 if (REGNO_PAIR_OK (regno, mode))
7288 if (TARGET_64BIT
7289 || (mode != TFmode && mode != TCmode && mode != TDmode))
7290 return true;
7292 break;
7293 case CC_REGS:
7294 if (GET_MODE_CLASS (mode) == MODE_CC)
7295 return true;
7296 break;
7297 case ACCESS_REGS:
7298 if (REGNO_PAIR_OK (regno, mode))
7300 if (mode == SImode || mode == Pmode)
7301 return true;
7303 break;
7304 default:
7305 return false;
7308 return false;
7311 /* Return nonzero if register OLD_REG can be renamed to register NEW_REG. */
7313 bool
7314 s390_hard_regno_rename_ok (unsigned int old_reg, unsigned int new_reg)
7316 /* Once we've decided upon a register to use as base register, it must
7317 no longer be used for any other purpose. */
7318 if (cfun->machine->base_reg)
7319 if (REGNO (cfun->machine->base_reg) == old_reg
7320 || REGNO (cfun->machine->base_reg) == new_reg)
7321 return false;
7323 return true;
7326 /* Maximum number of registers to represent a value of mode MODE
7327 in a register of class RCLASS. */
7329 bool
7330 s390_class_max_nregs (enum reg_class rclass, enum machine_mode mode)
7332 switch (rclass)
7334 case FP_REGS:
7335 if (GET_MODE_CLASS (mode) == MODE_COMPLEX_FLOAT)
7336 return 2 * ((GET_MODE_SIZE (mode) / 2 + 8 - 1) / 8);
7337 else
7338 return (GET_MODE_SIZE (mode) + 8 - 1) / 8;
7339 case ACCESS_REGS:
7340 return (GET_MODE_SIZE (mode) + 4 - 1) / 4;
7341 default:
7342 break;
7344 return (GET_MODE_SIZE (mode) + UNITS_PER_WORD - 1) / UNITS_PER_WORD;
7347 /* Return true if register FROM can be eliminated via register TO. */
7349 static bool
7350 s390_can_eliminate (const int from, const int to)
7352 /* On zSeries machines, we have not marked the base register as fixed.
7353 Instead, we have an elimination rule BASE_REGNUM -> BASE_REGNUM.
7354 If a function requires the base register, we say here that this
7355 elimination cannot be performed. This will cause reload to free
7356 up the base register (as if it were fixed). On the other hand,
7357 if the current function does *not* require the base register, we
7358 say here the elimination succeeds, which in turn allows reload
7359 to allocate the base register for any other purpose. */
7360 if (from == BASE_REGNUM && to == BASE_REGNUM)
7362 if (TARGET_CPU_ZARCH)
7364 s390_init_frame_layout ();
7365 return cfun->machine->base_reg == NULL_RTX;
7368 return false;
7371 /* Everything else must point into the stack frame. */
7372 gcc_assert (to == STACK_POINTER_REGNUM
7373 || to == HARD_FRAME_POINTER_REGNUM);
7375 gcc_assert (from == FRAME_POINTER_REGNUM
7376 || from == ARG_POINTER_REGNUM
7377 || from == RETURN_ADDRESS_POINTER_REGNUM);
7379 /* Make sure we actually saved the return address. */
7380 if (from == RETURN_ADDRESS_POINTER_REGNUM)
7381 if (!crtl->calls_eh_return
7382 && !cfun->stdarg
7383 && !cfun_frame_layout.save_return_addr_p)
7384 return false;
7386 return true;
7389 /* Return offset between register FROM and TO initially after prolog. */
7391 HOST_WIDE_INT
7392 s390_initial_elimination_offset (int from, int to)
7394 HOST_WIDE_INT offset;
7395 int index;
7397 /* ??? Why are we called for non-eliminable pairs? */
7398 if (!s390_can_eliminate (from, to))
7399 return 0;
7401 switch (from)
7403 case FRAME_POINTER_REGNUM:
7404 offset = (get_frame_size()
7405 + STACK_POINTER_OFFSET
7406 + crtl->outgoing_args_size);
7407 break;
7409 case ARG_POINTER_REGNUM:
7410 s390_init_frame_layout ();
7411 offset = cfun_frame_layout.frame_size + STACK_POINTER_OFFSET;
7412 break;
7414 case RETURN_ADDRESS_POINTER_REGNUM:
7415 s390_init_frame_layout ();
7416 index = RETURN_REGNUM - cfun_frame_layout.first_save_gpr_slot;
7417 gcc_assert (index >= 0);
7418 offset = cfun_frame_layout.frame_size + cfun_frame_layout.gprs_offset;
7419 offset += index * UNITS_PER_WORD;
7420 break;
7422 case BASE_REGNUM:
7423 offset = 0;
7424 break;
7426 default:
7427 gcc_unreachable ();
7430 return offset;
7433 /* Emit insn to save fpr REGNUM at offset OFFSET relative
7434 to register BASE. Return generated insn. */
7436 static rtx
7437 save_fpr (rtx base, int offset, int regnum)
7439 rtx addr;
7440 addr = gen_rtx_MEM (DFmode, plus_constant (base, offset));
7442 if (regnum >= 16 && regnum <= (16 + FP_ARG_NUM_REG))
7443 set_mem_alias_set (addr, get_varargs_alias_set ());
7444 else
7445 set_mem_alias_set (addr, get_frame_alias_set ());
7447 return emit_move_insn (addr, gen_rtx_REG (DFmode, regnum));
7450 /* Emit insn to restore fpr REGNUM from offset OFFSET relative
7451 to register BASE. Return generated insn. */
7453 static rtx
7454 restore_fpr (rtx base, int offset, int regnum)
7456 rtx addr;
7457 addr = gen_rtx_MEM (DFmode, plus_constant (base, offset));
7458 set_mem_alias_set (addr, get_frame_alias_set ());
7460 return emit_move_insn (gen_rtx_REG (DFmode, regnum), addr);
7463 /* Return true if REGNO is a global register, but not one
7464 of the special ones that need to be saved/restored in anyway. */
7466 static inline bool
7467 global_not_special_regno_p (int regno)
7469 return (global_regs[regno]
7470 /* These registers are special and need to be
7471 restored in any case. */
7472 && !(regno == STACK_POINTER_REGNUM
7473 || regno == RETURN_REGNUM
7474 || regno == BASE_REGNUM
7475 || (flag_pic && regno == (int)PIC_OFFSET_TABLE_REGNUM)));
7478 /* Generate insn to save registers FIRST to LAST into
7479 the register save area located at offset OFFSET
7480 relative to register BASE. */
7482 static rtx
7483 save_gprs (rtx base, int offset, int first, int last)
7485 rtx addr, insn, note;
7486 int i;
7488 addr = plus_constant (base, offset);
7489 addr = gen_rtx_MEM (Pmode, addr);
7491 set_mem_alias_set (addr, get_frame_alias_set ());
7493 /* Special-case single register. */
7494 if (first == last)
7496 if (TARGET_64BIT)
7497 insn = gen_movdi (addr, gen_rtx_REG (Pmode, first));
7498 else
7499 insn = gen_movsi (addr, gen_rtx_REG (Pmode, first));
7501 if (!global_not_special_regno_p (first))
7502 RTX_FRAME_RELATED_P (insn) = 1;
7503 return insn;
7507 insn = gen_store_multiple (addr,
7508 gen_rtx_REG (Pmode, first),
7509 GEN_INT (last - first + 1));
7511 if (first <= 6 && cfun->stdarg)
7512 for (i = 0; i < XVECLEN (PATTERN (insn), 0); i++)
7514 rtx mem = XEXP (XVECEXP (PATTERN (insn), 0, i), 0);
7516 if (first + i <= 6)
7517 set_mem_alias_set (mem, get_varargs_alias_set ());
7520 /* We need to set the FRAME_RELATED flag on all SETs
7521 inside the store-multiple pattern.
7523 However, we must not emit DWARF records for registers 2..5
7524 if they are stored for use by variable arguments ...
7526 ??? Unfortunately, it is not enough to simply not the
7527 FRAME_RELATED flags for those SETs, because the first SET
7528 of the PARALLEL is always treated as if it had the flag
7529 set, even if it does not. Therefore we emit a new pattern
7530 without those registers as REG_FRAME_RELATED_EXPR note. */
7532 if (first >= 6 && !global_not_special_regno_p (first))
7534 rtx pat = PATTERN (insn);
7536 for (i = 0; i < XVECLEN (pat, 0); i++)
7537 if (GET_CODE (XVECEXP (pat, 0, i)) == SET
7538 && !global_not_special_regno_p (REGNO (SET_SRC (XVECEXP (pat,
7539 0, i)))))
7540 RTX_FRAME_RELATED_P (XVECEXP (pat, 0, i)) = 1;
7542 RTX_FRAME_RELATED_P (insn) = 1;
7544 else if (last >= 6)
7546 int start;
7548 for (start = first >= 6 ? first : 6; start <= last; start++)
7549 if (!global_not_special_regno_p (start))
7550 break;
7552 if (start > last)
7553 return insn;
7555 addr = plus_constant (base, offset + (start - first) * UNITS_PER_WORD);
7556 note = gen_store_multiple (gen_rtx_MEM (Pmode, addr),
7557 gen_rtx_REG (Pmode, start),
7558 GEN_INT (last - start + 1));
7559 note = PATTERN (note);
7561 add_reg_note (insn, REG_FRAME_RELATED_EXPR, note);
7563 for (i = 0; i < XVECLEN (note, 0); i++)
7564 if (GET_CODE (XVECEXP (note, 0, i)) == SET
7565 && !global_not_special_regno_p (REGNO (SET_SRC (XVECEXP (note,
7566 0, i)))))
7567 RTX_FRAME_RELATED_P (XVECEXP (note, 0, i)) = 1;
7569 RTX_FRAME_RELATED_P (insn) = 1;
7572 return insn;
7575 /* Generate insn to restore registers FIRST to LAST from
7576 the register save area located at offset OFFSET
7577 relative to register BASE. */
7579 static rtx
7580 restore_gprs (rtx base, int offset, int first, int last)
7582 rtx addr, insn;
7584 addr = plus_constant (base, offset);
7585 addr = gen_rtx_MEM (Pmode, addr);
7586 set_mem_alias_set (addr, get_frame_alias_set ());
7588 /* Special-case single register. */
7589 if (first == last)
7591 if (TARGET_64BIT)
7592 insn = gen_movdi (gen_rtx_REG (Pmode, first), addr);
7593 else
7594 insn = gen_movsi (gen_rtx_REG (Pmode, first), addr);
7596 return insn;
7599 insn = gen_load_multiple (gen_rtx_REG (Pmode, first),
7600 addr,
7601 GEN_INT (last - first + 1));
7602 return insn;
7605 /* Return insn sequence to load the GOT register. */
7607 static GTY(()) rtx got_symbol;
7609 s390_load_got (void)
7611 rtx insns;
7613 if (!got_symbol)
7615 got_symbol = gen_rtx_SYMBOL_REF (Pmode, "_GLOBAL_OFFSET_TABLE_");
7616 SYMBOL_REF_FLAGS (got_symbol) = SYMBOL_FLAG_LOCAL;
7619 start_sequence ();
7621 if (TARGET_CPU_ZARCH)
7623 emit_move_insn (pic_offset_table_rtx, got_symbol);
7625 else
7627 rtx offset;
7629 offset = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, got_symbol),
7630 UNSPEC_LTREL_OFFSET);
7631 offset = gen_rtx_CONST (Pmode, offset);
7632 offset = force_const_mem (Pmode, offset);
7634 emit_move_insn (pic_offset_table_rtx, offset);
7636 offset = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, XEXP (offset, 0)),
7637 UNSPEC_LTREL_BASE);
7638 offset = gen_rtx_PLUS (Pmode, pic_offset_table_rtx, offset);
7640 emit_move_insn (pic_offset_table_rtx, offset);
7643 insns = get_insns ();
7644 end_sequence ();
7645 return insns;
7648 /* This ties together stack memory (MEM with an alias set of frame_alias_set)
7649 and the change to the stack pointer. */
7651 static void
7652 s390_emit_stack_tie (void)
7654 rtx mem = gen_frame_mem (BLKmode,
7655 gen_rtx_REG (Pmode, STACK_POINTER_REGNUM));
7657 emit_insn (gen_stack_tie (mem));
7660 /* Expand the prologue into a bunch of separate insns. */
7662 void
7663 s390_emit_prologue (void)
7665 rtx insn, addr;
7666 rtx temp_reg;
7667 int i;
7668 int offset;
7669 int next_fpr = 0;
7671 /* Complete frame layout. */
7673 s390_update_frame_layout ();
7675 /* Annotate all constant pool references to let the scheduler know
7676 they implicitly use the base register. */
7678 push_topmost_sequence ();
7680 for (insn = get_insns (); insn; insn = NEXT_INSN (insn))
7681 if (INSN_P (insn))
7683 annotate_constant_pool_refs (&PATTERN (insn));
7684 df_insn_rescan (insn);
7687 pop_topmost_sequence ();
7689 /* Choose best register to use for temp use within prologue.
7690 See below for why TPF must use the register 1. */
7692 if (!has_hard_reg_initial_val (Pmode, RETURN_REGNUM)
7693 && !current_function_is_leaf
7694 && !TARGET_TPF_PROFILING)
7695 temp_reg = gen_rtx_REG (Pmode, RETURN_REGNUM);
7696 else
7697 temp_reg = gen_rtx_REG (Pmode, 1);
7699 /* Save call saved gprs. */
7700 if (cfun_frame_layout.first_save_gpr != -1)
7702 insn = save_gprs (stack_pointer_rtx,
7703 cfun_frame_layout.gprs_offset +
7704 UNITS_PER_WORD * (cfun_frame_layout.first_save_gpr
7705 - cfun_frame_layout.first_save_gpr_slot),
7706 cfun_frame_layout.first_save_gpr,
7707 cfun_frame_layout.last_save_gpr);
7708 emit_insn (insn);
7711 /* Dummy insn to mark literal pool slot. */
7713 if (cfun->machine->base_reg)
7714 emit_insn (gen_main_pool (cfun->machine->base_reg));
7716 offset = cfun_frame_layout.f0_offset;
7718 /* Save f0 and f2. */
7719 for (i = 0; i < 2; i++)
7721 if (cfun_fpr_bit_p (i))
7723 save_fpr (stack_pointer_rtx, offset, i + 16);
7724 offset += 8;
7726 else if (!TARGET_PACKED_STACK)
7727 offset += 8;
7730 /* Save f4 and f6. */
7731 offset = cfun_frame_layout.f4_offset;
7732 for (i = 2; i < 4; i++)
7734 if (cfun_fpr_bit_p (i))
7736 insn = save_fpr (stack_pointer_rtx, offset, i + 16);
7737 offset += 8;
7739 /* If f4 and f6 are call clobbered they are saved due to stdargs and
7740 therefore are not frame related. */
7741 if (!call_really_used_regs[i + 16])
7742 RTX_FRAME_RELATED_P (insn) = 1;
7744 else if (!TARGET_PACKED_STACK)
7745 offset += 8;
7748 if (TARGET_PACKED_STACK
7749 && cfun_save_high_fprs_p
7750 && cfun_frame_layout.f8_offset + cfun_frame_layout.high_fprs * 8 > 0)
7752 offset = (cfun_frame_layout.f8_offset
7753 + (cfun_frame_layout.high_fprs - 1) * 8);
7755 for (i = 15; i > 7 && offset >= 0; i--)
7756 if (cfun_fpr_bit_p (i))
7758 insn = save_fpr (stack_pointer_rtx, offset, i + 16);
7760 RTX_FRAME_RELATED_P (insn) = 1;
7761 offset -= 8;
7763 if (offset >= cfun_frame_layout.f8_offset)
7764 next_fpr = i + 16;
7767 if (!TARGET_PACKED_STACK)
7768 next_fpr = cfun_save_high_fprs_p ? 31 : 0;
7770 /* Decrement stack pointer. */
7772 if (cfun_frame_layout.frame_size > 0)
7774 rtx frame_off = GEN_INT (-cfun_frame_layout.frame_size);
7775 rtx real_frame_off;
7777 if (s390_stack_size)
7779 HOST_WIDE_INT stack_guard;
7781 if (s390_stack_guard)
7782 stack_guard = s390_stack_guard;
7783 else
7785 /* If no value for stack guard is provided the smallest power of 2
7786 larger than the current frame size is chosen. */
7787 stack_guard = 1;
7788 while (stack_guard < cfun_frame_layout.frame_size)
7789 stack_guard <<= 1;
7792 if (cfun_frame_layout.frame_size >= s390_stack_size)
7794 warning (0, "frame size of function %qs is "
7795 HOST_WIDE_INT_PRINT_DEC
7796 " bytes exceeding user provided stack limit of "
7797 HOST_WIDE_INT_PRINT_DEC " bytes. "
7798 "An unconditional trap is added.",
7799 current_function_name(), cfun_frame_layout.frame_size,
7800 s390_stack_size);
7801 emit_insn (gen_trap ());
7803 else
7805 /* stack_guard has to be smaller than s390_stack_size.
7806 Otherwise we would emit an AND with zero which would
7807 not match the test under mask pattern. */
7808 if (stack_guard >= s390_stack_size)
7810 warning (0, "frame size of function %qs is "
7811 HOST_WIDE_INT_PRINT_DEC
7812 " bytes which is more than half the stack size. "
7813 "The dynamic check would not be reliable. "
7814 "No check emitted for this function.",
7815 current_function_name(),
7816 cfun_frame_layout.frame_size);
7818 else
7820 HOST_WIDE_INT stack_check_mask = ((s390_stack_size - 1)
7821 & ~(stack_guard - 1));
7823 rtx t = gen_rtx_AND (Pmode, stack_pointer_rtx,
7824 GEN_INT (stack_check_mask));
7825 if (TARGET_64BIT)
7826 emit_insn (gen_ctrapdi4 (gen_rtx_EQ (VOIDmode,
7827 t, const0_rtx),
7828 t, const0_rtx, const0_rtx));
7829 else
7830 emit_insn (gen_ctrapsi4 (gen_rtx_EQ (VOIDmode,
7831 t, const0_rtx),
7832 t, const0_rtx, const0_rtx));
7837 if (s390_warn_framesize > 0
7838 && cfun_frame_layout.frame_size >= s390_warn_framesize)
7839 warning (0, "frame size of %qs is " HOST_WIDE_INT_PRINT_DEC " bytes",
7840 current_function_name (), cfun_frame_layout.frame_size);
7842 if (s390_warn_dynamicstack_p && cfun->calls_alloca)
7843 warning (0, "%qs uses dynamic stack allocation", current_function_name ());
7845 /* Save incoming stack pointer into temp reg. */
7846 if (TARGET_BACKCHAIN || next_fpr)
7847 insn = emit_insn (gen_move_insn (temp_reg, stack_pointer_rtx));
7849 /* Subtract frame size from stack pointer. */
7851 if (DISP_IN_RANGE (INTVAL (frame_off)))
7853 insn = gen_rtx_SET (VOIDmode, stack_pointer_rtx,
7854 gen_rtx_PLUS (Pmode, stack_pointer_rtx,
7855 frame_off));
7856 insn = emit_insn (insn);
7858 else
7860 if (!CONST_OK_FOR_K (INTVAL (frame_off)))
7861 frame_off = force_const_mem (Pmode, frame_off);
7863 insn = emit_insn (gen_add2_insn (stack_pointer_rtx, frame_off));
7864 annotate_constant_pool_refs (&PATTERN (insn));
7867 RTX_FRAME_RELATED_P (insn) = 1;
7868 real_frame_off = GEN_INT (-cfun_frame_layout.frame_size);
7869 add_reg_note (insn, REG_FRAME_RELATED_EXPR,
7870 gen_rtx_SET (VOIDmode, stack_pointer_rtx,
7871 gen_rtx_PLUS (Pmode, stack_pointer_rtx,
7872 real_frame_off)));
7874 /* Set backchain. */
7876 if (TARGET_BACKCHAIN)
7878 if (cfun_frame_layout.backchain_offset)
7879 addr = gen_rtx_MEM (Pmode,
7880 plus_constant (stack_pointer_rtx,
7881 cfun_frame_layout.backchain_offset));
7882 else
7883 addr = gen_rtx_MEM (Pmode, stack_pointer_rtx);
7884 set_mem_alias_set (addr, get_frame_alias_set ());
7885 insn = emit_insn (gen_move_insn (addr, temp_reg));
7888 /* If we support asynchronous exceptions (e.g. for Java),
7889 we need to make sure the backchain pointer is set up
7890 before any possibly trapping memory access. */
7892 if (TARGET_BACKCHAIN && flag_non_call_exceptions)
7894 addr = gen_rtx_MEM (BLKmode, gen_rtx_SCRATCH (VOIDmode));
7895 emit_clobber (addr);
7899 /* Save fprs 8 - 15 (64 bit ABI). */
7901 if (cfun_save_high_fprs_p && next_fpr)
7903 /* If the stack might be accessed through a different register
7904 we have to make sure that the stack pointer decrement is not
7905 moved below the use of the stack slots. */
7906 s390_emit_stack_tie ();
7908 insn = emit_insn (gen_add2_insn (temp_reg,
7909 GEN_INT (cfun_frame_layout.f8_offset)));
7911 offset = 0;
7913 for (i = 24; i <= next_fpr; i++)
7914 if (cfun_fpr_bit_p (i - 16))
7916 rtx addr = plus_constant (stack_pointer_rtx,
7917 cfun_frame_layout.frame_size
7918 + cfun_frame_layout.f8_offset
7919 + offset);
7921 insn = save_fpr (temp_reg, offset, i);
7922 offset += 8;
7923 RTX_FRAME_RELATED_P (insn) = 1;
7924 add_reg_note (insn, REG_FRAME_RELATED_EXPR,
7925 gen_rtx_SET (VOIDmode,
7926 gen_rtx_MEM (DFmode, addr),
7927 gen_rtx_REG (DFmode, i)));
7931 /* Set frame pointer, if needed. */
7933 if (frame_pointer_needed)
7935 insn = emit_move_insn (hard_frame_pointer_rtx, stack_pointer_rtx);
7936 RTX_FRAME_RELATED_P (insn) = 1;
7939 /* Set up got pointer, if needed. */
7941 if (flag_pic && df_regs_ever_live_p (PIC_OFFSET_TABLE_REGNUM))
7943 rtx insns = s390_load_got ();
7945 for (insn = insns; insn; insn = NEXT_INSN (insn))
7946 annotate_constant_pool_refs (&PATTERN (insn));
7948 emit_insn (insns);
7951 if (TARGET_TPF_PROFILING)
7953 /* Generate a BAS instruction to serve as a function
7954 entry intercept to facilitate the use of tracing
7955 algorithms located at the branch target. */
7956 emit_insn (gen_prologue_tpf ());
7958 /* Emit a blockage here so that all code
7959 lies between the profiling mechanisms. */
7960 emit_insn (gen_blockage ());
7964 /* Expand the epilogue into a bunch of separate insns. */
7966 void
7967 s390_emit_epilogue (bool sibcall)
7969 rtx frame_pointer, return_reg, cfa_restores = NULL_RTX;
7970 int area_bottom, area_top, offset = 0;
7971 int next_offset;
7972 rtvec p;
7973 int i;
7975 if (TARGET_TPF_PROFILING)
7978 /* Generate a BAS instruction to serve as a function
7979 entry intercept to facilitate the use of tracing
7980 algorithms located at the branch target. */
7982 /* Emit a blockage here so that all code
7983 lies between the profiling mechanisms. */
7984 emit_insn (gen_blockage ());
7986 emit_insn (gen_epilogue_tpf ());
7989 /* Check whether to use frame or stack pointer for restore. */
7991 frame_pointer = (frame_pointer_needed
7992 ? hard_frame_pointer_rtx : stack_pointer_rtx);
7994 s390_frame_area (&area_bottom, &area_top);
7996 /* Check whether we can access the register save area.
7997 If not, increment the frame pointer as required. */
7999 if (area_top <= area_bottom)
8001 /* Nothing to restore. */
8003 else if (DISP_IN_RANGE (cfun_frame_layout.frame_size + area_bottom)
8004 && DISP_IN_RANGE (cfun_frame_layout.frame_size + area_top - 1))
8006 /* Area is in range. */
8007 offset = cfun_frame_layout.frame_size;
8009 else
8011 rtx insn, frame_off, cfa;
8013 offset = area_bottom < 0 ? -area_bottom : 0;
8014 frame_off = GEN_INT (cfun_frame_layout.frame_size - offset);
8016 cfa = gen_rtx_SET (VOIDmode, frame_pointer,
8017 gen_rtx_PLUS (Pmode, frame_pointer, frame_off));
8018 if (DISP_IN_RANGE (INTVAL (frame_off)))
8020 insn = gen_rtx_SET (VOIDmode, frame_pointer,
8021 gen_rtx_PLUS (Pmode, frame_pointer, frame_off));
8022 insn = emit_insn (insn);
8024 else
8026 if (!CONST_OK_FOR_K (INTVAL (frame_off)))
8027 frame_off = force_const_mem (Pmode, frame_off);
8029 insn = emit_insn (gen_add2_insn (frame_pointer, frame_off));
8030 annotate_constant_pool_refs (&PATTERN (insn));
8032 add_reg_note (insn, REG_CFA_ADJUST_CFA, cfa);
8033 RTX_FRAME_RELATED_P (insn) = 1;
8036 /* Restore call saved fprs. */
8038 if (TARGET_64BIT)
8040 if (cfun_save_high_fprs_p)
8042 next_offset = cfun_frame_layout.f8_offset;
8043 for (i = 24; i < 32; i++)
8045 if (cfun_fpr_bit_p (i - 16))
8047 restore_fpr (frame_pointer,
8048 offset + next_offset, i);
8049 cfa_restores
8050 = alloc_reg_note (REG_CFA_RESTORE,
8051 gen_rtx_REG (DFmode, i), cfa_restores);
8052 next_offset += 8;
8058 else
8060 next_offset = cfun_frame_layout.f4_offset;
8061 for (i = 18; i < 20; i++)
8063 if (cfun_fpr_bit_p (i - 16))
8065 restore_fpr (frame_pointer,
8066 offset + next_offset, i);
8067 cfa_restores
8068 = alloc_reg_note (REG_CFA_RESTORE,
8069 gen_rtx_REG (DFmode, i), cfa_restores);
8070 next_offset += 8;
8072 else if (!TARGET_PACKED_STACK)
8073 next_offset += 8;
8078 /* Return register. */
8080 return_reg = gen_rtx_REG (Pmode, RETURN_REGNUM);
8082 /* Restore call saved gprs. */
8084 if (cfun_frame_layout.first_restore_gpr != -1)
8086 rtx insn, addr;
8087 int i;
8089 /* Check for global register and save them
8090 to stack location from where they get restored. */
8092 for (i = cfun_frame_layout.first_restore_gpr;
8093 i <= cfun_frame_layout.last_restore_gpr;
8094 i++)
8096 if (global_not_special_regno_p (i))
8098 addr = plus_constant (frame_pointer,
8099 offset + cfun_frame_layout.gprs_offset
8100 + (i - cfun_frame_layout.first_save_gpr_slot)
8101 * UNITS_PER_WORD);
8102 addr = gen_rtx_MEM (Pmode, addr);
8103 set_mem_alias_set (addr, get_frame_alias_set ());
8104 emit_move_insn (addr, gen_rtx_REG (Pmode, i));
8106 else
8107 cfa_restores
8108 = alloc_reg_note (REG_CFA_RESTORE,
8109 gen_rtx_REG (Pmode, i), cfa_restores);
8112 if (! sibcall)
8114 /* Fetch return address from stack before load multiple,
8115 this will do good for scheduling. */
8117 if (cfun_frame_layout.save_return_addr_p
8118 || (cfun_frame_layout.first_restore_gpr < BASE_REGNUM
8119 && cfun_frame_layout.last_restore_gpr > RETURN_REGNUM))
8121 int return_regnum = find_unused_clobbered_reg();
8122 if (!return_regnum)
8123 return_regnum = 4;
8124 return_reg = gen_rtx_REG (Pmode, return_regnum);
8126 addr = plus_constant (frame_pointer,
8127 offset + cfun_frame_layout.gprs_offset
8128 + (RETURN_REGNUM
8129 - cfun_frame_layout.first_save_gpr_slot)
8130 * UNITS_PER_WORD);
8131 addr = gen_rtx_MEM (Pmode, addr);
8132 set_mem_alias_set (addr, get_frame_alias_set ());
8133 emit_move_insn (return_reg, addr);
8137 insn = restore_gprs (frame_pointer,
8138 offset + cfun_frame_layout.gprs_offset
8139 + (cfun_frame_layout.first_restore_gpr
8140 - cfun_frame_layout.first_save_gpr_slot)
8141 * UNITS_PER_WORD,
8142 cfun_frame_layout.first_restore_gpr,
8143 cfun_frame_layout.last_restore_gpr);
8144 insn = emit_insn (insn);
8145 REG_NOTES (insn) = cfa_restores;
8146 add_reg_note (insn, REG_CFA_DEF_CFA,
8147 plus_constant (stack_pointer_rtx, STACK_POINTER_OFFSET));
8148 RTX_FRAME_RELATED_P (insn) = 1;
8151 if (! sibcall)
8154 /* Return to caller. */
8156 p = rtvec_alloc (2);
8158 RTVEC_ELT (p, 0) = gen_rtx_RETURN (VOIDmode);
8159 RTVEC_ELT (p, 1) = gen_rtx_USE (VOIDmode, return_reg);
8160 emit_jump_insn (gen_rtx_PARALLEL (VOIDmode, p));
8165 /* Return the size in bytes of a function argument of
8166 type TYPE and/or mode MODE. At least one of TYPE or
8167 MODE must be specified. */
8169 static int
8170 s390_function_arg_size (enum machine_mode mode, const_tree type)
8172 if (type)
8173 return int_size_in_bytes (type);
8175 /* No type info available for some library calls ... */
8176 if (mode != BLKmode)
8177 return GET_MODE_SIZE (mode);
8179 /* If we have neither type nor mode, abort */
8180 gcc_unreachable ();
8183 /* Return true if a function argument of type TYPE and mode MODE
8184 is to be passed in a floating-point register, if available. */
8186 static bool
8187 s390_function_arg_float (enum machine_mode mode, tree type)
8189 int size = s390_function_arg_size (mode, type);
8190 if (size > 8)
8191 return false;
8193 /* Soft-float changes the ABI: no floating-point registers are used. */
8194 if (TARGET_SOFT_FLOAT)
8195 return false;
8197 /* No type info available for some library calls ... */
8198 if (!type)
8199 return mode == SFmode || mode == DFmode || mode == SDmode || mode == DDmode;
8201 /* The ABI says that record types with a single member are treated
8202 just like that member would be. */
8203 while (TREE_CODE (type) == RECORD_TYPE)
8205 tree field, single = NULL_TREE;
8207 for (field = TYPE_FIELDS (type); field; field = TREE_CHAIN (field))
8209 if (TREE_CODE (field) != FIELD_DECL)
8210 continue;
8212 if (single == NULL_TREE)
8213 single = TREE_TYPE (field);
8214 else
8215 return false;
8218 if (single == NULL_TREE)
8219 return false;
8220 else
8221 type = single;
8224 return TREE_CODE (type) == REAL_TYPE;
8227 /* Return true if a function argument of type TYPE and mode MODE
8228 is to be passed in an integer register, or a pair of integer
8229 registers, if available. */
8231 static bool
8232 s390_function_arg_integer (enum machine_mode mode, tree type)
8234 int size = s390_function_arg_size (mode, type);
8235 if (size > 8)
8236 return false;
8238 /* No type info available for some library calls ... */
8239 if (!type)
8240 return GET_MODE_CLASS (mode) == MODE_INT
8241 || (TARGET_SOFT_FLOAT && SCALAR_FLOAT_MODE_P (mode));
8243 /* We accept small integral (and similar) types. */
8244 if (INTEGRAL_TYPE_P (type)
8245 || POINTER_TYPE_P (type)
8246 || TREE_CODE (type) == OFFSET_TYPE
8247 || (TARGET_SOFT_FLOAT && TREE_CODE (type) == REAL_TYPE))
8248 return true;
8250 /* We also accept structs of size 1, 2, 4, 8 that are not
8251 passed in floating-point registers. */
8252 if (AGGREGATE_TYPE_P (type)
8253 && exact_log2 (size) >= 0
8254 && !s390_function_arg_float (mode, type))
8255 return true;
8257 return false;
8260 /* Return 1 if a function argument of type TYPE and mode MODE
8261 is to be passed by reference. The ABI specifies that only
8262 structures of size 1, 2, 4, or 8 bytes are passed by value,
8263 all other structures (and complex numbers) are passed by
8264 reference. */
8266 static bool
8267 s390_pass_by_reference (CUMULATIVE_ARGS *ca ATTRIBUTE_UNUSED,
8268 enum machine_mode mode, const_tree type,
8269 bool named ATTRIBUTE_UNUSED)
8271 int size = s390_function_arg_size (mode, type);
8272 if (size > 8)
8273 return true;
8275 if (type)
8277 if (AGGREGATE_TYPE_P (type) && exact_log2 (size) < 0)
8278 return 1;
8280 if (TREE_CODE (type) == COMPLEX_TYPE
8281 || TREE_CODE (type) == VECTOR_TYPE)
8282 return 1;
8285 return 0;
8288 /* Update the data in CUM to advance over an argument of mode MODE and
8289 data type TYPE. (TYPE is null for libcalls where that information
8290 may not be available.). The boolean NAMED specifies whether the
8291 argument is a named argument (as opposed to an unnamed argument
8292 matching an ellipsis). */
8294 void
8295 s390_function_arg_advance (CUMULATIVE_ARGS *cum, enum machine_mode mode,
8296 tree type, int named ATTRIBUTE_UNUSED)
8298 if (s390_function_arg_float (mode, type))
8300 cum->fprs += 1;
8302 else if (s390_function_arg_integer (mode, type))
8304 int size = s390_function_arg_size (mode, type);
8305 cum->gprs += ((size + UNITS_PER_WORD-1) / UNITS_PER_WORD);
8307 else
8308 gcc_unreachable ();
8311 /* Define where to put the arguments to a function.
8312 Value is zero to push the argument on the stack,
8313 or a hard register in which to store the argument.
8315 MODE is the argument's machine mode.
8316 TYPE is the data type of the argument (as a tree).
8317 This is null for libcalls where that information may
8318 not be available.
8319 CUM is a variable of type CUMULATIVE_ARGS which gives info about
8320 the preceding args and about the function being called.
8321 NAMED is nonzero if this argument is a named parameter
8322 (otherwise it is an extra parameter matching an ellipsis).
8324 On S/390, we use general purpose registers 2 through 6 to
8325 pass integer, pointer, and certain structure arguments, and
8326 floating point registers 0 and 2 (0, 2, 4, and 6 on 64-bit)
8327 to pass floating point arguments. All remaining arguments
8328 are pushed to the stack. */
8331 s390_function_arg (CUMULATIVE_ARGS *cum, enum machine_mode mode, tree type,
8332 int named ATTRIBUTE_UNUSED)
8334 if (s390_function_arg_float (mode, type))
8336 if (cum->fprs + 1 > FP_ARG_NUM_REG)
8337 return 0;
8338 else
8339 return gen_rtx_REG (mode, cum->fprs + 16);
8341 else if (s390_function_arg_integer (mode, type))
8343 int size = s390_function_arg_size (mode, type);
8344 int n_gprs = (size + UNITS_PER_WORD-1) / UNITS_PER_WORD;
8346 if (cum->gprs + n_gprs > GP_ARG_NUM_REG)
8347 return 0;
8348 else
8349 return gen_rtx_REG (mode, cum->gprs + 2);
8352 /* After the real arguments, expand_call calls us once again
8353 with a void_type_node type. Whatever we return here is
8354 passed as operand 2 to the call expanders.
8356 We don't need this feature ... */
8357 else if (type == void_type_node)
8358 return const0_rtx;
8360 gcc_unreachable ();
8363 /* Return true if return values of type TYPE should be returned
8364 in a memory buffer whose address is passed by the caller as
8365 hidden first argument. */
8367 static bool
8368 s390_return_in_memory (const_tree type, const_tree fundecl ATTRIBUTE_UNUSED)
8370 /* We accept small integral (and similar) types. */
8371 if (INTEGRAL_TYPE_P (type)
8372 || POINTER_TYPE_P (type)
8373 || TREE_CODE (type) == OFFSET_TYPE
8374 || TREE_CODE (type) == REAL_TYPE)
8375 return int_size_in_bytes (type) > 8;
8377 /* Aggregates and similar constructs are always returned
8378 in memory. */
8379 if (AGGREGATE_TYPE_P (type)
8380 || TREE_CODE (type) == COMPLEX_TYPE
8381 || TREE_CODE (type) == VECTOR_TYPE)
8382 return true;
8384 /* ??? We get called on all sorts of random stuff from
8385 aggregate_value_p. We can't abort, but it's not clear
8386 what's safe to return. Pretend it's a struct I guess. */
8387 return true;
8390 /* Function arguments and return values are promoted to word size. */
8392 static enum machine_mode
8393 s390_promote_function_mode (const_tree type, enum machine_mode mode,
8394 int *punsignedp,
8395 const_tree fntype ATTRIBUTE_UNUSED,
8396 int for_return ATTRIBUTE_UNUSED)
8398 if (INTEGRAL_MODE_P (mode)
8399 && GET_MODE_SIZE (mode) < UNITS_PER_WORD)
8401 if (POINTER_TYPE_P (type))
8402 *punsignedp = POINTERS_EXTEND_UNSIGNED;
8403 return Pmode;
8406 return mode;
8409 /* Define where to return a (scalar) value of type TYPE.
8410 If TYPE is null, define where to return a (scalar)
8411 value of mode MODE from a libcall. */
8414 s390_function_value (const_tree type, const_tree fn, enum machine_mode mode)
8416 if (type)
8418 int unsignedp = TYPE_UNSIGNED (type);
8419 mode = promote_function_mode (type, TYPE_MODE (type), &unsignedp, fn, 1);
8422 gcc_assert (GET_MODE_CLASS (mode) == MODE_INT || SCALAR_FLOAT_MODE_P (mode));
8423 gcc_assert (GET_MODE_SIZE (mode) <= 8);
8425 if (TARGET_HARD_FLOAT && SCALAR_FLOAT_MODE_P (mode))
8426 return gen_rtx_REG (mode, 16);
8427 else
8428 return gen_rtx_REG (mode, 2);
8432 /* Create and return the va_list datatype.
8434 On S/390, va_list is an array type equivalent to
8436 typedef struct __va_list_tag
8438 long __gpr;
8439 long __fpr;
8440 void *__overflow_arg_area;
8441 void *__reg_save_area;
8442 } va_list[1];
8444 where __gpr and __fpr hold the number of general purpose
8445 or floating point arguments used up to now, respectively,
8446 __overflow_arg_area points to the stack location of the
8447 next argument passed on the stack, and __reg_save_area
8448 always points to the start of the register area in the
8449 call frame of the current function. The function prologue
8450 saves all registers used for argument passing into this
8451 area if the function uses variable arguments. */
8453 static tree
8454 s390_build_builtin_va_list (void)
8456 tree f_gpr, f_fpr, f_ovf, f_sav, record, type_decl;
8458 record = lang_hooks.types.make_type (RECORD_TYPE);
8460 type_decl =
8461 build_decl (BUILTINS_LOCATION,
8462 TYPE_DECL, get_identifier ("__va_list_tag"), record);
8464 f_gpr = build_decl (BUILTINS_LOCATION,
8465 FIELD_DECL, get_identifier ("__gpr"),
8466 long_integer_type_node);
8467 f_fpr = build_decl (BUILTINS_LOCATION,
8468 FIELD_DECL, get_identifier ("__fpr"),
8469 long_integer_type_node);
8470 f_ovf = build_decl (BUILTINS_LOCATION,
8471 FIELD_DECL, get_identifier ("__overflow_arg_area"),
8472 ptr_type_node);
8473 f_sav = build_decl (BUILTINS_LOCATION,
8474 FIELD_DECL, get_identifier ("__reg_save_area"),
8475 ptr_type_node);
8477 va_list_gpr_counter_field = f_gpr;
8478 va_list_fpr_counter_field = f_fpr;
8480 DECL_FIELD_CONTEXT (f_gpr) = record;
8481 DECL_FIELD_CONTEXT (f_fpr) = record;
8482 DECL_FIELD_CONTEXT (f_ovf) = record;
8483 DECL_FIELD_CONTEXT (f_sav) = record;
8485 TREE_CHAIN (record) = type_decl;
8486 TYPE_NAME (record) = type_decl;
8487 TYPE_FIELDS (record) = f_gpr;
8488 TREE_CHAIN (f_gpr) = f_fpr;
8489 TREE_CHAIN (f_fpr) = f_ovf;
8490 TREE_CHAIN (f_ovf) = f_sav;
8492 layout_type (record);
8494 /* The correct type is an array type of one element. */
8495 return build_array_type (record, build_index_type (size_zero_node));
8498 /* Implement va_start by filling the va_list structure VALIST.
8499 STDARG_P is always true, and ignored.
8500 NEXTARG points to the first anonymous stack argument.
8502 The following global variables are used to initialize
8503 the va_list structure:
8505 crtl->args.info:
8506 holds number of gprs and fprs used for named arguments.
8507 crtl->args.arg_offset_rtx:
8508 holds the offset of the first anonymous stack argument
8509 (relative to the virtual arg pointer). */
8511 static void
8512 s390_va_start (tree valist, rtx nextarg ATTRIBUTE_UNUSED)
8514 HOST_WIDE_INT n_gpr, n_fpr;
8515 int off;
8516 tree f_gpr, f_fpr, f_ovf, f_sav;
8517 tree gpr, fpr, ovf, sav, t;
8519 f_gpr = TYPE_FIELDS (TREE_TYPE (va_list_type_node));
8520 f_fpr = TREE_CHAIN (f_gpr);
8521 f_ovf = TREE_CHAIN (f_fpr);
8522 f_sav = TREE_CHAIN (f_ovf);
8524 valist = build_va_arg_indirect_ref (valist);
8525 gpr = build3 (COMPONENT_REF, TREE_TYPE (f_gpr), valist, f_gpr, NULL_TREE);
8526 fpr = build3 (COMPONENT_REF, TREE_TYPE (f_fpr), valist, f_fpr, NULL_TREE);
8527 ovf = build3 (COMPONENT_REF, TREE_TYPE (f_ovf), valist, f_ovf, NULL_TREE);
8528 sav = build3 (COMPONENT_REF, TREE_TYPE (f_sav), valist, f_sav, NULL_TREE);
8530 /* Count number of gp and fp argument registers used. */
8532 n_gpr = crtl->args.info.gprs;
8533 n_fpr = crtl->args.info.fprs;
8535 if (cfun->va_list_gpr_size)
8537 t = build2 (MODIFY_EXPR, TREE_TYPE (gpr), gpr,
8538 build_int_cst (NULL_TREE, n_gpr));
8539 TREE_SIDE_EFFECTS (t) = 1;
8540 expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
8543 if (cfun->va_list_fpr_size)
8545 t = build2 (MODIFY_EXPR, TREE_TYPE (fpr), fpr,
8546 build_int_cst (NULL_TREE, n_fpr));
8547 TREE_SIDE_EFFECTS (t) = 1;
8548 expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
8551 /* Find the overflow area. */
8552 if (n_gpr + cfun->va_list_gpr_size > GP_ARG_NUM_REG
8553 || n_fpr + cfun->va_list_fpr_size > FP_ARG_NUM_REG)
8555 t = make_tree (TREE_TYPE (ovf), virtual_incoming_args_rtx);
8557 off = INTVAL (crtl->args.arg_offset_rtx);
8558 off = off < 0 ? 0 : off;
8559 if (TARGET_DEBUG_ARG)
8560 fprintf (stderr, "va_start: n_gpr = %d, n_fpr = %d off %d\n",
8561 (int)n_gpr, (int)n_fpr, off);
8563 t = build2 (POINTER_PLUS_EXPR, TREE_TYPE (ovf), t, size_int (off));
8565 t = build2 (MODIFY_EXPR, TREE_TYPE (ovf), ovf, t);
8566 TREE_SIDE_EFFECTS (t) = 1;
8567 expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
8570 /* Find the register save area. */
8571 if ((cfun->va_list_gpr_size && n_gpr < GP_ARG_NUM_REG)
8572 || (cfun->va_list_fpr_size && n_fpr < FP_ARG_NUM_REG))
8574 t = make_tree (TREE_TYPE (sav), return_address_pointer_rtx);
8575 t = build2 (POINTER_PLUS_EXPR, TREE_TYPE (sav), t,
8576 size_int (-RETURN_REGNUM * UNITS_PER_WORD));
8578 t = build2 (MODIFY_EXPR, TREE_TYPE (sav), sav, t);
8579 TREE_SIDE_EFFECTS (t) = 1;
8580 expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
8584 /* Implement va_arg by updating the va_list structure
8585 VALIST as required to retrieve an argument of type
8586 TYPE, and returning that argument.
8588 Generates code equivalent to:
8590 if (integral value) {
8591 if (size <= 4 && args.gpr < 5 ||
8592 size > 4 && args.gpr < 4 )
8593 ret = args.reg_save_area[args.gpr+8]
8594 else
8595 ret = *args.overflow_arg_area++;
8596 } else if (float value) {
8597 if (args.fgpr < 2)
8598 ret = args.reg_save_area[args.fpr+64]
8599 else
8600 ret = *args.overflow_arg_area++;
8601 } else if (aggregate value) {
8602 if (args.gpr < 5)
8603 ret = *args.reg_save_area[args.gpr]
8604 else
8605 ret = **args.overflow_arg_area++;
8606 } */
8608 static tree
8609 s390_gimplify_va_arg (tree valist, tree type, gimple_seq *pre_p,
8610 gimple_seq *post_p ATTRIBUTE_UNUSED)
8612 tree f_gpr, f_fpr, f_ovf, f_sav;
8613 tree gpr, fpr, ovf, sav, reg, t, u;
8614 int indirect_p, size, n_reg, sav_ofs, sav_scale, max_reg;
8615 tree lab_false, lab_over, addr;
8617 f_gpr = TYPE_FIELDS (TREE_TYPE (va_list_type_node));
8618 f_fpr = TREE_CHAIN (f_gpr);
8619 f_ovf = TREE_CHAIN (f_fpr);
8620 f_sav = TREE_CHAIN (f_ovf);
8622 valist = build_va_arg_indirect_ref (valist);
8623 gpr = build3 (COMPONENT_REF, TREE_TYPE (f_gpr), valist, f_gpr, NULL_TREE);
8624 fpr = build3 (COMPONENT_REF, TREE_TYPE (f_fpr), valist, f_fpr, NULL_TREE);
8625 sav = build3 (COMPONENT_REF, TREE_TYPE (f_sav), valist, f_sav, NULL_TREE);
8627 /* The tree for args* cannot be shared between gpr/fpr and ovf since
8628 both appear on a lhs. */
8629 valist = unshare_expr (valist);
8630 ovf = build3 (COMPONENT_REF, TREE_TYPE (f_ovf), valist, f_ovf, NULL_TREE);
8632 size = int_size_in_bytes (type);
8634 if (pass_by_reference (NULL, TYPE_MODE (type), type, false))
8636 if (TARGET_DEBUG_ARG)
8638 fprintf (stderr, "va_arg: aggregate type");
8639 debug_tree (type);
8642 /* Aggregates are passed by reference. */
8643 indirect_p = 1;
8644 reg = gpr;
8645 n_reg = 1;
8647 /* kernel stack layout on 31 bit: It is assumed here that no padding
8648 will be added by s390_frame_info because for va_args always an even
8649 number of gprs has to be saved r15-r2 = 14 regs. */
8650 sav_ofs = 2 * UNITS_PER_WORD;
8651 sav_scale = UNITS_PER_WORD;
8652 size = UNITS_PER_WORD;
8653 max_reg = GP_ARG_NUM_REG - n_reg;
8655 else if (s390_function_arg_float (TYPE_MODE (type), type))
8657 if (TARGET_DEBUG_ARG)
8659 fprintf (stderr, "va_arg: float type");
8660 debug_tree (type);
8663 /* FP args go in FP registers, if present. */
8664 indirect_p = 0;
8665 reg = fpr;
8666 n_reg = 1;
8667 sav_ofs = 16 * UNITS_PER_WORD;
8668 sav_scale = 8;
8669 max_reg = FP_ARG_NUM_REG - n_reg;
8671 else
8673 if (TARGET_DEBUG_ARG)
8675 fprintf (stderr, "va_arg: other type");
8676 debug_tree (type);
8679 /* Otherwise into GP registers. */
8680 indirect_p = 0;
8681 reg = gpr;
8682 n_reg = (size + UNITS_PER_WORD - 1) / UNITS_PER_WORD;
8684 /* kernel stack layout on 31 bit: It is assumed here that no padding
8685 will be added by s390_frame_info because for va_args always an even
8686 number of gprs has to be saved r15-r2 = 14 regs. */
8687 sav_ofs = 2 * UNITS_PER_WORD;
8689 if (size < UNITS_PER_WORD)
8690 sav_ofs += UNITS_PER_WORD - size;
8692 sav_scale = UNITS_PER_WORD;
8693 max_reg = GP_ARG_NUM_REG - n_reg;
8696 /* Pull the value out of the saved registers ... */
8698 lab_false = create_artificial_label (UNKNOWN_LOCATION);
8699 lab_over = create_artificial_label (UNKNOWN_LOCATION);
8700 addr = create_tmp_var (ptr_type_node, "addr");
8702 t = fold_convert (TREE_TYPE (reg), size_int (max_reg));
8703 t = build2 (GT_EXPR, boolean_type_node, reg, t);
8704 u = build1 (GOTO_EXPR, void_type_node, lab_false);
8705 t = build3 (COND_EXPR, void_type_node, t, u, NULL_TREE);
8706 gimplify_and_add (t, pre_p);
8708 t = build2 (POINTER_PLUS_EXPR, ptr_type_node, sav,
8709 size_int (sav_ofs));
8710 u = build2 (MULT_EXPR, TREE_TYPE (reg), reg,
8711 fold_convert (TREE_TYPE (reg), size_int (sav_scale)));
8712 t = build2 (POINTER_PLUS_EXPR, ptr_type_node, t, fold_convert (sizetype, u));
8714 gimplify_assign (addr, t, pre_p);
8716 gimple_seq_add_stmt (pre_p, gimple_build_goto (lab_over));
8718 gimple_seq_add_stmt (pre_p, gimple_build_label (lab_false));
8721 /* ... Otherwise out of the overflow area. */
8723 t = ovf;
8724 if (size < UNITS_PER_WORD)
8725 t = build2 (POINTER_PLUS_EXPR, ptr_type_node, t,
8726 size_int (UNITS_PER_WORD - size));
8728 gimplify_expr (&t, pre_p, NULL, is_gimple_val, fb_rvalue);
8730 gimplify_assign (addr, t, pre_p);
8732 t = build2 (POINTER_PLUS_EXPR, ptr_type_node, t,
8733 size_int (size));
8734 gimplify_assign (ovf, t, pre_p);
8736 gimple_seq_add_stmt (pre_p, gimple_build_label (lab_over));
8739 /* Increment register save count. */
8741 u = build2 (PREINCREMENT_EXPR, TREE_TYPE (reg), reg,
8742 fold_convert (TREE_TYPE (reg), size_int (n_reg)));
8743 gimplify_and_add (u, pre_p);
8745 if (indirect_p)
8747 t = build_pointer_type_for_mode (build_pointer_type (type),
8748 ptr_mode, true);
8749 addr = fold_convert (t, addr);
8750 addr = build_va_arg_indirect_ref (addr);
8752 else
8754 t = build_pointer_type_for_mode (type, ptr_mode, true);
8755 addr = fold_convert (t, addr);
8758 return build_va_arg_indirect_ref (addr);
8762 /* Builtins. */
8764 enum s390_builtin
8766 S390_BUILTIN_THREAD_POINTER,
8767 S390_BUILTIN_SET_THREAD_POINTER,
8769 S390_BUILTIN_max
8772 static enum insn_code const code_for_builtin_64[S390_BUILTIN_max] = {
8773 CODE_FOR_get_tp_64,
8774 CODE_FOR_set_tp_64
8777 static enum insn_code const code_for_builtin_31[S390_BUILTIN_max] = {
8778 CODE_FOR_get_tp_31,
8779 CODE_FOR_set_tp_31
8782 static void
8783 s390_init_builtins (void)
8785 tree ftype;
8787 ftype = build_function_type (ptr_type_node, void_list_node);
8788 add_builtin_function ("__builtin_thread_pointer", ftype,
8789 S390_BUILTIN_THREAD_POINTER, BUILT_IN_MD,
8790 NULL, NULL_TREE);
8792 ftype = build_function_type_list (void_type_node, ptr_type_node, NULL_TREE);
8793 add_builtin_function ("__builtin_set_thread_pointer", ftype,
8794 S390_BUILTIN_SET_THREAD_POINTER, BUILT_IN_MD,
8795 NULL, NULL_TREE);
8798 /* Expand an expression EXP that calls a built-in function,
8799 with result going to TARGET if that's convenient
8800 (and in mode MODE if that's convenient).
8801 SUBTARGET may be used as the target for computing one of EXP's operands.
8802 IGNORE is nonzero if the value is to be ignored. */
8804 static rtx
8805 s390_expand_builtin (tree exp, rtx target, rtx subtarget ATTRIBUTE_UNUSED,
8806 enum machine_mode mode ATTRIBUTE_UNUSED,
8807 int ignore ATTRIBUTE_UNUSED)
8809 #define MAX_ARGS 2
8811 enum insn_code const *code_for_builtin =
8812 TARGET_64BIT ? code_for_builtin_64 : code_for_builtin_31;
8814 tree fndecl = TREE_OPERAND (CALL_EXPR_FN (exp), 0);
8815 unsigned int fcode = DECL_FUNCTION_CODE (fndecl);
8816 enum insn_code icode;
8817 rtx op[MAX_ARGS], pat;
8818 int arity;
8819 bool nonvoid;
8820 tree arg;
8821 call_expr_arg_iterator iter;
8823 if (fcode >= S390_BUILTIN_max)
8824 internal_error ("bad builtin fcode");
8825 icode = code_for_builtin[fcode];
8826 if (icode == 0)
8827 internal_error ("bad builtin fcode");
8829 nonvoid = TREE_TYPE (TREE_TYPE (fndecl)) != void_type_node;
8831 arity = 0;
8832 FOR_EACH_CALL_EXPR_ARG (arg, iter, exp)
8834 const struct insn_operand_data *insn_op;
8836 if (arg == error_mark_node)
8837 return NULL_RTX;
8838 if (arity > MAX_ARGS)
8839 return NULL_RTX;
8841 insn_op = &insn_data[icode].operand[arity + nonvoid];
8843 op[arity] = expand_expr (arg, NULL_RTX, insn_op->mode, EXPAND_NORMAL);
8845 if (!(*insn_op->predicate) (op[arity], insn_op->mode))
8846 op[arity] = copy_to_mode_reg (insn_op->mode, op[arity]);
8847 arity++;
8850 if (nonvoid)
8852 enum machine_mode tmode = insn_data[icode].operand[0].mode;
8853 if (!target
8854 || GET_MODE (target) != tmode
8855 || !(*insn_data[icode].operand[0].predicate) (target, tmode))
8856 target = gen_reg_rtx (tmode);
8859 switch (arity)
8861 case 0:
8862 pat = GEN_FCN (icode) (target);
8863 break;
8864 case 1:
8865 if (nonvoid)
8866 pat = GEN_FCN (icode) (target, op[0]);
8867 else
8868 pat = GEN_FCN (icode) (op[0]);
8869 break;
8870 case 2:
8871 pat = GEN_FCN (icode) (target, op[0], op[1]);
8872 break;
8873 default:
8874 gcc_unreachable ();
8876 if (!pat)
8877 return NULL_RTX;
8878 emit_insn (pat);
8880 if (nonvoid)
8881 return target;
8882 else
8883 return const0_rtx;
8887 /* Output assembly code for the trampoline template to
8888 stdio stream FILE.
8890 On S/390, we use gpr 1 internally in the trampoline code;
8891 gpr 0 is used to hold the static chain. */
8893 static void
8894 s390_asm_trampoline_template (FILE *file)
8896 rtx op[2];
8897 op[0] = gen_rtx_REG (Pmode, 0);
8898 op[1] = gen_rtx_REG (Pmode, 1);
8900 if (TARGET_64BIT)
8902 output_asm_insn ("basr\t%1,0", op);
8903 output_asm_insn ("lmg\t%0,%1,14(%1)", op);
8904 output_asm_insn ("br\t%1", op);
8905 ASM_OUTPUT_SKIP (file, (HOST_WIDE_INT)(TRAMPOLINE_SIZE - 10));
8907 else
8909 output_asm_insn ("basr\t%1,0", op);
8910 output_asm_insn ("lm\t%0,%1,6(%1)", op);
8911 output_asm_insn ("br\t%1", op);
8912 ASM_OUTPUT_SKIP (file, (HOST_WIDE_INT)(TRAMPOLINE_SIZE - 8));
8916 /* Emit RTL insns to initialize the variable parts of a trampoline.
8917 FNADDR is an RTX for the address of the function's pure code.
8918 CXT is an RTX for the static chain value for the function. */
8920 static void
8921 s390_trampoline_init (rtx m_tramp, tree fndecl, rtx cxt)
8923 rtx fnaddr = XEXP (DECL_RTL (fndecl), 0);
8924 rtx mem;
8926 emit_block_move (m_tramp, assemble_trampoline_template (),
8927 GEN_INT (2*UNITS_PER_WORD), BLOCK_OP_NORMAL);
8929 mem = adjust_address (m_tramp, Pmode, 2*UNITS_PER_WORD);
8930 emit_move_insn (mem, cxt);
8931 mem = adjust_address (m_tramp, Pmode, 3*UNITS_PER_WORD);
8932 emit_move_insn (mem, fnaddr);
8935 /* Output assembler code to FILE to increment profiler label # LABELNO
8936 for profiling a function entry. */
8938 void
8939 s390_function_profiler (FILE *file, int labelno)
8941 rtx op[7];
8943 char label[128];
8944 ASM_GENERATE_INTERNAL_LABEL (label, "LP", labelno);
8946 fprintf (file, "# function profiler \n");
8948 op[0] = gen_rtx_REG (Pmode, RETURN_REGNUM);
8949 op[1] = gen_rtx_REG (Pmode, STACK_POINTER_REGNUM);
8950 op[1] = gen_rtx_MEM (Pmode, plus_constant (op[1], UNITS_PER_WORD));
8952 op[2] = gen_rtx_REG (Pmode, 1);
8953 op[3] = gen_rtx_SYMBOL_REF (Pmode, label);
8954 SYMBOL_REF_FLAGS (op[3]) = SYMBOL_FLAG_LOCAL;
8956 op[4] = gen_rtx_SYMBOL_REF (Pmode, "_mcount");
8957 if (flag_pic)
8959 op[4] = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, op[4]), UNSPEC_PLT);
8960 op[4] = gen_rtx_CONST (Pmode, op[4]);
8963 if (TARGET_64BIT)
8965 output_asm_insn ("stg\t%0,%1", op);
8966 output_asm_insn ("larl\t%2,%3", op);
8967 output_asm_insn ("brasl\t%0,%4", op);
8968 output_asm_insn ("lg\t%0,%1", op);
8970 else if (!flag_pic)
8972 op[6] = gen_label_rtx ();
8974 output_asm_insn ("st\t%0,%1", op);
8975 output_asm_insn ("bras\t%2,%l6", op);
8976 output_asm_insn (".long\t%4", op);
8977 output_asm_insn (".long\t%3", op);
8978 targetm.asm_out.internal_label (file, "L", CODE_LABEL_NUMBER (op[6]));
8979 output_asm_insn ("l\t%0,0(%2)", op);
8980 output_asm_insn ("l\t%2,4(%2)", op);
8981 output_asm_insn ("basr\t%0,%0", op);
8982 output_asm_insn ("l\t%0,%1", op);
8984 else
8986 op[5] = gen_label_rtx ();
8987 op[6] = gen_label_rtx ();
8989 output_asm_insn ("st\t%0,%1", op);
8990 output_asm_insn ("bras\t%2,%l6", op);
8991 targetm.asm_out.internal_label (file, "L", CODE_LABEL_NUMBER (op[5]));
8992 output_asm_insn (".long\t%4-%l5", op);
8993 output_asm_insn (".long\t%3-%l5", op);
8994 targetm.asm_out.internal_label (file, "L", CODE_LABEL_NUMBER (op[6]));
8995 output_asm_insn ("lr\t%0,%2", op);
8996 output_asm_insn ("a\t%0,0(%2)", op);
8997 output_asm_insn ("a\t%2,4(%2)", op);
8998 output_asm_insn ("basr\t%0,%0", op);
8999 output_asm_insn ("l\t%0,%1", op);
9003 /* Encode symbol attributes (local vs. global, tls model) of a SYMBOL_REF
9004 into its SYMBOL_REF_FLAGS. */
9006 static void
9007 s390_encode_section_info (tree decl, rtx rtl, int first)
9009 default_encode_section_info (decl, rtl, first);
9011 if (TREE_CODE (decl) == VAR_DECL)
9013 /* If a variable has a forced alignment to < 2 bytes, mark it
9014 with SYMBOL_FLAG_ALIGN1 to prevent it from being used as LARL
9015 operand. */
9016 if (DECL_USER_ALIGN (decl) && DECL_ALIGN (decl) < 16)
9017 SYMBOL_REF_FLAGS (XEXP (rtl, 0)) |= SYMBOL_FLAG_ALIGN1;
9018 if (!DECL_SIZE (decl)
9019 || !DECL_ALIGN (decl)
9020 || !host_integerp (DECL_SIZE (decl), 0)
9021 || (DECL_ALIGN (decl) <= 64
9022 && DECL_ALIGN (decl) != tree_low_cst (DECL_SIZE (decl), 0)))
9023 SYMBOL_REF_FLAGS (XEXP (rtl, 0)) |= SYMBOL_FLAG_NOT_NATURALLY_ALIGNED;
9026 /* Literal pool references don't have a decl so they are handled
9027 differently here. We rely on the information in the MEM_ALIGN
9028 entry to decide upon natural alignment. */
9029 if (MEM_P (rtl)
9030 && GET_CODE (XEXP (rtl, 0)) == SYMBOL_REF
9031 && TREE_CONSTANT_POOL_ADDRESS_P (XEXP (rtl, 0))
9032 && (MEM_ALIGN (rtl) == 0
9033 || GET_MODE_BITSIZE (GET_MODE (rtl)) == 0
9034 || MEM_ALIGN (rtl) < GET_MODE_BITSIZE (GET_MODE (rtl))))
9035 SYMBOL_REF_FLAGS (XEXP (rtl, 0)) |= SYMBOL_FLAG_NOT_NATURALLY_ALIGNED;
9038 /* Output thunk to FILE that implements a C++ virtual function call (with
9039 multiple inheritance) to FUNCTION. The thunk adjusts the this pointer
9040 by DELTA, and unless VCALL_OFFSET is zero, applies an additional adjustment
9041 stored at VCALL_OFFSET in the vtable whose address is located at offset 0
9042 relative to the resulting this pointer. */
9044 static void
9045 s390_output_mi_thunk (FILE *file, tree thunk ATTRIBUTE_UNUSED,
9046 HOST_WIDE_INT delta, HOST_WIDE_INT vcall_offset,
9047 tree function)
9049 rtx op[10];
9050 int nonlocal = 0;
9052 /* Make sure unwind info is emitted for the thunk if needed. */
9053 final_start_function (emit_barrier (), file, 1);
9055 /* Operand 0 is the target function. */
9056 op[0] = XEXP (DECL_RTL (function), 0);
9057 if (flag_pic && !SYMBOL_REF_LOCAL_P (op[0]))
9059 nonlocal = 1;
9060 op[0] = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, op[0]),
9061 TARGET_64BIT ? UNSPEC_PLT : UNSPEC_GOT);
9062 op[0] = gen_rtx_CONST (Pmode, op[0]);
9065 /* Operand 1 is the 'this' pointer. */
9066 if (aggregate_value_p (TREE_TYPE (TREE_TYPE (function)), function))
9067 op[1] = gen_rtx_REG (Pmode, 3);
9068 else
9069 op[1] = gen_rtx_REG (Pmode, 2);
9071 /* Operand 2 is the delta. */
9072 op[2] = GEN_INT (delta);
9074 /* Operand 3 is the vcall_offset. */
9075 op[3] = GEN_INT (vcall_offset);
9077 /* Operand 4 is the temporary register. */
9078 op[4] = gen_rtx_REG (Pmode, 1);
9080 /* Operands 5 to 8 can be used as labels. */
9081 op[5] = NULL_RTX;
9082 op[6] = NULL_RTX;
9083 op[7] = NULL_RTX;
9084 op[8] = NULL_RTX;
9086 /* Operand 9 can be used for temporary register. */
9087 op[9] = NULL_RTX;
9089 /* Generate code. */
9090 if (TARGET_64BIT)
9092 /* Setup literal pool pointer if required. */
9093 if ((!DISP_IN_RANGE (delta)
9094 && !CONST_OK_FOR_K (delta)
9095 && !CONST_OK_FOR_Os (delta))
9096 || (!DISP_IN_RANGE (vcall_offset)
9097 && !CONST_OK_FOR_K (vcall_offset)
9098 && !CONST_OK_FOR_Os (vcall_offset)))
9100 op[5] = gen_label_rtx ();
9101 output_asm_insn ("larl\t%4,%5", op);
9104 /* Add DELTA to this pointer. */
9105 if (delta)
9107 if (CONST_OK_FOR_J (delta))
9108 output_asm_insn ("la\t%1,%2(%1)", op);
9109 else if (DISP_IN_RANGE (delta))
9110 output_asm_insn ("lay\t%1,%2(%1)", op);
9111 else if (CONST_OK_FOR_K (delta))
9112 output_asm_insn ("aghi\t%1,%2", op);
9113 else if (CONST_OK_FOR_Os (delta))
9114 output_asm_insn ("agfi\t%1,%2", op);
9115 else
9117 op[6] = gen_label_rtx ();
9118 output_asm_insn ("agf\t%1,%6-%5(%4)", op);
9122 /* Perform vcall adjustment. */
9123 if (vcall_offset)
9125 if (DISP_IN_RANGE (vcall_offset))
9127 output_asm_insn ("lg\t%4,0(%1)", op);
9128 output_asm_insn ("ag\t%1,%3(%4)", op);
9130 else if (CONST_OK_FOR_K (vcall_offset))
9132 output_asm_insn ("lghi\t%4,%3", op);
9133 output_asm_insn ("ag\t%4,0(%1)", op);
9134 output_asm_insn ("ag\t%1,0(%4)", op);
9136 else if (CONST_OK_FOR_Os (vcall_offset))
9138 output_asm_insn ("lgfi\t%4,%3", op);
9139 output_asm_insn ("ag\t%4,0(%1)", op);
9140 output_asm_insn ("ag\t%1,0(%4)", op);
9142 else
9144 op[7] = gen_label_rtx ();
9145 output_asm_insn ("llgf\t%4,%7-%5(%4)", op);
9146 output_asm_insn ("ag\t%4,0(%1)", op);
9147 output_asm_insn ("ag\t%1,0(%4)", op);
9151 /* Jump to target. */
9152 output_asm_insn ("jg\t%0", op);
9154 /* Output literal pool if required. */
9155 if (op[5])
9157 output_asm_insn (".align\t4", op);
9158 targetm.asm_out.internal_label (file, "L",
9159 CODE_LABEL_NUMBER (op[5]));
9161 if (op[6])
9163 targetm.asm_out.internal_label (file, "L",
9164 CODE_LABEL_NUMBER (op[6]));
9165 output_asm_insn (".long\t%2", op);
9167 if (op[7])
9169 targetm.asm_out.internal_label (file, "L",
9170 CODE_LABEL_NUMBER (op[7]));
9171 output_asm_insn (".long\t%3", op);
9174 else
9176 /* Setup base pointer if required. */
9177 if (!vcall_offset
9178 || (!DISP_IN_RANGE (delta)
9179 && !CONST_OK_FOR_K (delta)
9180 && !CONST_OK_FOR_Os (delta))
9181 || (!DISP_IN_RANGE (delta)
9182 && !CONST_OK_FOR_K (vcall_offset)
9183 && !CONST_OK_FOR_Os (vcall_offset)))
9185 op[5] = gen_label_rtx ();
9186 output_asm_insn ("basr\t%4,0", op);
9187 targetm.asm_out.internal_label (file, "L",
9188 CODE_LABEL_NUMBER (op[5]));
9191 /* Add DELTA to this pointer. */
9192 if (delta)
9194 if (CONST_OK_FOR_J (delta))
9195 output_asm_insn ("la\t%1,%2(%1)", op);
9196 else if (DISP_IN_RANGE (delta))
9197 output_asm_insn ("lay\t%1,%2(%1)", op);
9198 else if (CONST_OK_FOR_K (delta))
9199 output_asm_insn ("ahi\t%1,%2", op);
9200 else if (CONST_OK_FOR_Os (delta))
9201 output_asm_insn ("afi\t%1,%2", op);
9202 else
9204 op[6] = gen_label_rtx ();
9205 output_asm_insn ("a\t%1,%6-%5(%4)", op);
9209 /* Perform vcall adjustment. */
9210 if (vcall_offset)
9212 if (CONST_OK_FOR_J (vcall_offset))
9214 output_asm_insn ("l\t%4,0(%1)", op);
9215 output_asm_insn ("a\t%1,%3(%4)", op);
9217 else if (DISP_IN_RANGE (vcall_offset))
9219 output_asm_insn ("l\t%4,0(%1)", op);
9220 output_asm_insn ("ay\t%1,%3(%4)", op);
9222 else if (CONST_OK_FOR_K (vcall_offset))
9224 output_asm_insn ("lhi\t%4,%3", op);
9225 output_asm_insn ("a\t%4,0(%1)", op);
9226 output_asm_insn ("a\t%1,0(%4)", op);
9228 else if (CONST_OK_FOR_Os (vcall_offset))
9230 output_asm_insn ("iilf\t%4,%3", op);
9231 output_asm_insn ("a\t%4,0(%1)", op);
9232 output_asm_insn ("a\t%1,0(%4)", op);
9234 else
9236 op[7] = gen_label_rtx ();
9237 output_asm_insn ("l\t%4,%7-%5(%4)", op);
9238 output_asm_insn ("a\t%4,0(%1)", op);
9239 output_asm_insn ("a\t%1,0(%4)", op);
9242 /* We had to clobber the base pointer register.
9243 Re-setup the base pointer (with a different base). */
9244 op[5] = gen_label_rtx ();
9245 output_asm_insn ("basr\t%4,0", op);
9246 targetm.asm_out.internal_label (file, "L",
9247 CODE_LABEL_NUMBER (op[5]));
9250 /* Jump to target. */
9251 op[8] = gen_label_rtx ();
9253 if (!flag_pic)
9254 output_asm_insn ("l\t%4,%8-%5(%4)", op);
9255 else if (!nonlocal)
9256 output_asm_insn ("a\t%4,%8-%5(%4)", op);
9257 /* We cannot call through .plt, since .plt requires %r12 loaded. */
9258 else if (flag_pic == 1)
9260 output_asm_insn ("a\t%4,%8-%5(%4)", op);
9261 output_asm_insn ("l\t%4,%0(%4)", op);
9263 else if (flag_pic == 2)
9265 op[9] = gen_rtx_REG (Pmode, 0);
9266 output_asm_insn ("l\t%9,%8-4-%5(%4)", op);
9267 output_asm_insn ("a\t%4,%8-%5(%4)", op);
9268 output_asm_insn ("ar\t%4,%9", op);
9269 output_asm_insn ("l\t%4,0(%4)", op);
9272 output_asm_insn ("br\t%4", op);
9274 /* Output literal pool. */
9275 output_asm_insn (".align\t4", op);
9277 if (nonlocal && flag_pic == 2)
9278 output_asm_insn (".long\t%0", op);
9279 if (nonlocal)
9281 op[0] = gen_rtx_SYMBOL_REF (Pmode, "_GLOBAL_OFFSET_TABLE_");
9282 SYMBOL_REF_FLAGS (op[0]) = SYMBOL_FLAG_LOCAL;
9285 targetm.asm_out.internal_label (file, "L", CODE_LABEL_NUMBER (op[8]));
9286 if (!flag_pic)
9287 output_asm_insn (".long\t%0", op);
9288 else
9289 output_asm_insn (".long\t%0-%5", op);
9291 if (op[6])
9293 targetm.asm_out.internal_label (file, "L",
9294 CODE_LABEL_NUMBER (op[6]));
9295 output_asm_insn (".long\t%2", op);
9297 if (op[7])
9299 targetm.asm_out.internal_label (file, "L",
9300 CODE_LABEL_NUMBER (op[7]));
9301 output_asm_insn (".long\t%3", op);
9304 final_end_function ();
9307 static bool
9308 s390_valid_pointer_mode (enum machine_mode mode)
9310 return (mode == SImode || (TARGET_64BIT && mode == DImode));
9313 /* Checks whether the given CALL_EXPR would use a caller
9314 saved register. This is used to decide whether sibling call
9315 optimization could be performed on the respective function
9316 call. */
9318 static bool
9319 s390_call_saved_register_used (tree call_expr)
9321 CUMULATIVE_ARGS cum;
9322 tree parameter;
9323 enum machine_mode mode;
9324 tree type;
9325 rtx parm_rtx;
9326 int reg, i;
9328 INIT_CUMULATIVE_ARGS (cum, NULL, NULL, 0, 0);
9330 for (i = 0; i < call_expr_nargs (call_expr); i++)
9332 parameter = CALL_EXPR_ARG (call_expr, i);
9333 gcc_assert (parameter);
9335 /* For an undeclared variable passed as parameter we will get
9336 an ERROR_MARK node here. */
9337 if (TREE_CODE (parameter) == ERROR_MARK)
9338 return true;
9340 type = TREE_TYPE (parameter);
9341 gcc_assert (type);
9343 mode = TYPE_MODE (type);
9344 gcc_assert (mode);
9346 if (pass_by_reference (&cum, mode, type, true))
9348 mode = Pmode;
9349 type = build_pointer_type (type);
9352 parm_rtx = s390_function_arg (&cum, mode, type, 0);
9354 s390_function_arg_advance (&cum, mode, type, 0);
9356 if (parm_rtx && REG_P (parm_rtx))
9358 for (reg = 0;
9359 reg < HARD_REGNO_NREGS (REGNO (parm_rtx), GET_MODE (parm_rtx));
9360 reg++)
9361 if (! call_used_regs[reg + REGNO (parm_rtx)])
9362 return true;
9365 return false;
9368 /* Return true if the given call expression can be
9369 turned into a sibling call.
9370 DECL holds the declaration of the function to be called whereas
9371 EXP is the call expression itself. */
9373 static bool
9374 s390_function_ok_for_sibcall (tree decl, tree exp)
9376 /* The TPF epilogue uses register 1. */
9377 if (TARGET_TPF_PROFILING)
9378 return false;
9380 /* The 31 bit PLT code uses register 12 (GOT pointer - caller saved)
9381 which would have to be restored before the sibcall. */
9382 if (!TARGET_64BIT && flag_pic && decl && !targetm.binds_local_p (decl))
9383 return false;
9385 /* Register 6 on s390 is available as an argument register but unfortunately
9386 "caller saved". This makes functions needing this register for arguments
9387 not suitable for sibcalls. */
9388 return !s390_call_saved_register_used (exp);
9391 /* Return the fixed registers used for condition codes. */
9393 static bool
9394 s390_fixed_condition_code_regs (unsigned int *p1, unsigned int *p2)
9396 *p1 = CC_REGNUM;
9397 *p2 = INVALID_REGNUM;
9399 return true;
9402 /* This function is used by the call expanders of the machine description.
9403 It emits the call insn itself together with the necessary operations
9404 to adjust the target address and returns the emitted insn.
9405 ADDR_LOCATION is the target address rtx
9406 TLS_CALL the location of the thread-local symbol
9407 RESULT_REG the register where the result of the call should be stored
9408 RETADDR_REG the register where the return address should be stored
9409 If this parameter is NULL_RTX the call is considered
9410 to be a sibling call. */
9413 s390_emit_call (rtx addr_location, rtx tls_call, rtx result_reg,
9414 rtx retaddr_reg)
9416 bool plt_call = false;
9417 rtx insn;
9418 rtx call;
9419 rtx clobber;
9420 rtvec vec;
9422 /* Direct function calls need special treatment. */
9423 if (GET_CODE (addr_location) == SYMBOL_REF)
9425 /* When calling a global routine in PIC mode, we must
9426 replace the symbol itself with the PLT stub. */
9427 if (flag_pic && !SYMBOL_REF_LOCAL_P (addr_location))
9429 addr_location = gen_rtx_UNSPEC (Pmode,
9430 gen_rtvec (1, addr_location),
9431 UNSPEC_PLT);
9432 addr_location = gen_rtx_CONST (Pmode, addr_location);
9433 plt_call = true;
9436 /* Unless we can use the bras(l) insn, force the
9437 routine address into a register. */
9438 if (!TARGET_SMALL_EXEC && !TARGET_CPU_ZARCH)
9440 if (flag_pic)
9441 addr_location = legitimize_pic_address (addr_location, 0);
9442 else
9443 addr_location = force_reg (Pmode, addr_location);
9447 /* If it is already an indirect call or the code above moved the
9448 SYMBOL_REF to somewhere else make sure the address can be found in
9449 register 1. */
9450 if (retaddr_reg == NULL_RTX
9451 && GET_CODE (addr_location) != SYMBOL_REF
9452 && !plt_call)
9454 emit_move_insn (gen_rtx_REG (Pmode, SIBCALL_REGNUM), addr_location);
9455 addr_location = gen_rtx_REG (Pmode, SIBCALL_REGNUM);
9458 addr_location = gen_rtx_MEM (QImode, addr_location);
9459 call = gen_rtx_CALL (VOIDmode, addr_location, const0_rtx);
9461 if (result_reg != NULL_RTX)
9462 call = gen_rtx_SET (VOIDmode, result_reg, call);
9464 if (retaddr_reg != NULL_RTX)
9466 clobber = gen_rtx_CLOBBER (VOIDmode, retaddr_reg);
9468 if (tls_call != NULL_RTX)
9469 vec = gen_rtvec (3, call, clobber,
9470 gen_rtx_USE (VOIDmode, tls_call));
9471 else
9472 vec = gen_rtvec (2, call, clobber);
9474 call = gen_rtx_PARALLEL (VOIDmode, vec);
9477 insn = emit_call_insn (call);
9479 /* 31-bit PLT stubs and tls calls use the GOT register implicitly. */
9480 if ((!TARGET_64BIT && plt_call) || tls_call != NULL_RTX)
9482 /* s390_function_ok_for_sibcall should
9483 have denied sibcalls in this case. */
9484 gcc_assert (retaddr_reg != NULL_RTX);
9486 use_reg (&CALL_INSN_FUNCTION_USAGE (insn), pic_offset_table_rtx);
9488 return insn;
9491 /* Implement CONDITIONAL_REGISTER_USAGE. */
9493 void
9494 s390_conditional_register_usage (void)
9496 int i;
9498 if (flag_pic)
9500 fixed_regs[PIC_OFFSET_TABLE_REGNUM] = 1;
9501 call_used_regs[PIC_OFFSET_TABLE_REGNUM] = 1;
9503 if (TARGET_CPU_ZARCH)
9505 fixed_regs[BASE_REGNUM] = 0;
9506 call_used_regs[BASE_REGNUM] = 0;
9507 fixed_regs[RETURN_REGNUM] = 0;
9508 call_used_regs[RETURN_REGNUM] = 0;
9510 if (TARGET_64BIT)
9512 for (i = 24; i < 32; i++)
9513 call_used_regs[i] = call_really_used_regs[i] = 0;
9515 else
9517 for (i = 18; i < 20; i++)
9518 call_used_regs[i] = call_really_used_regs[i] = 0;
9521 if (TARGET_SOFT_FLOAT)
9523 for (i = 16; i < 32; i++)
9524 call_used_regs[i] = fixed_regs[i] = 1;
9528 /* Corresponding function to eh_return expander. */
9530 static GTY(()) rtx s390_tpf_eh_return_symbol;
9531 void
9532 s390_emit_tpf_eh_return (rtx target)
9534 rtx insn, reg;
9536 if (!s390_tpf_eh_return_symbol)
9537 s390_tpf_eh_return_symbol = gen_rtx_SYMBOL_REF (Pmode, "__tpf_eh_return");
9539 reg = gen_rtx_REG (Pmode, 2);
9541 emit_move_insn (reg, target);
9542 insn = s390_emit_call (s390_tpf_eh_return_symbol, NULL_RTX, reg,
9543 gen_rtx_REG (Pmode, RETURN_REGNUM));
9544 use_reg (&CALL_INSN_FUNCTION_USAGE (insn), reg);
9546 emit_move_insn (EH_RETURN_HANDLER_RTX, reg);
9549 /* Rework the prologue/epilogue to avoid saving/restoring
9550 registers unnecessarily. */
9552 static void
9553 s390_optimize_prologue (void)
9555 rtx insn, new_insn, next_insn;
9557 /* Do a final recompute of the frame-related data. */
9559 s390_update_frame_layout ();
9561 /* If all special registers are in fact used, there's nothing we
9562 can do, so no point in walking the insn list. */
9564 if (cfun_frame_layout.first_save_gpr <= BASE_REGNUM
9565 && cfun_frame_layout.last_save_gpr >= BASE_REGNUM
9566 && (TARGET_CPU_ZARCH
9567 || (cfun_frame_layout.first_save_gpr <= RETURN_REGNUM
9568 && cfun_frame_layout.last_save_gpr >= RETURN_REGNUM)))
9569 return;
9571 /* Search for prologue/epilogue insns and replace them. */
9573 for (insn = get_insns (); insn; insn = next_insn)
9575 int first, last, off;
9576 rtx set, base, offset;
9578 next_insn = NEXT_INSN (insn);
9580 if (GET_CODE (insn) != INSN)
9581 continue;
9583 if (GET_CODE (PATTERN (insn)) == PARALLEL
9584 && store_multiple_operation (PATTERN (insn), VOIDmode))
9586 set = XVECEXP (PATTERN (insn), 0, 0);
9587 first = REGNO (SET_SRC (set));
9588 last = first + XVECLEN (PATTERN (insn), 0) - 1;
9589 offset = const0_rtx;
9590 base = eliminate_constant_term (XEXP (SET_DEST (set), 0), &offset);
9591 off = INTVAL (offset);
9593 if (GET_CODE (base) != REG || off < 0)
9594 continue;
9595 if (cfun_frame_layout.first_save_gpr != -1
9596 && (cfun_frame_layout.first_save_gpr < first
9597 || cfun_frame_layout.last_save_gpr > last))
9598 continue;
9599 if (REGNO (base) != STACK_POINTER_REGNUM
9600 && REGNO (base) != HARD_FRAME_POINTER_REGNUM)
9601 continue;
9602 if (first > BASE_REGNUM || last < BASE_REGNUM)
9603 continue;
9605 if (cfun_frame_layout.first_save_gpr != -1)
9607 new_insn = save_gprs (base,
9608 off + (cfun_frame_layout.first_save_gpr
9609 - first) * UNITS_PER_WORD,
9610 cfun_frame_layout.first_save_gpr,
9611 cfun_frame_layout.last_save_gpr);
9612 new_insn = emit_insn_before (new_insn, insn);
9613 INSN_ADDRESSES_NEW (new_insn, -1);
9616 remove_insn (insn);
9617 continue;
9620 if (cfun_frame_layout.first_save_gpr == -1
9621 && GET_CODE (PATTERN (insn)) == SET
9622 && GET_CODE (SET_SRC (PATTERN (insn))) == REG
9623 && (REGNO (SET_SRC (PATTERN (insn))) == BASE_REGNUM
9624 || (!TARGET_CPU_ZARCH
9625 && REGNO (SET_SRC (PATTERN (insn))) == RETURN_REGNUM))
9626 && GET_CODE (SET_DEST (PATTERN (insn))) == MEM)
9628 set = PATTERN (insn);
9629 first = REGNO (SET_SRC (set));
9630 offset = const0_rtx;
9631 base = eliminate_constant_term (XEXP (SET_DEST (set), 0), &offset);
9632 off = INTVAL (offset);
9634 if (GET_CODE (base) != REG || off < 0)
9635 continue;
9636 if (REGNO (base) != STACK_POINTER_REGNUM
9637 && REGNO (base) != HARD_FRAME_POINTER_REGNUM)
9638 continue;
9640 remove_insn (insn);
9641 continue;
9644 if (GET_CODE (PATTERN (insn)) == PARALLEL
9645 && load_multiple_operation (PATTERN (insn), VOIDmode))
9647 set = XVECEXP (PATTERN (insn), 0, 0);
9648 first = REGNO (SET_DEST (set));
9649 last = first + XVECLEN (PATTERN (insn), 0) - 1;
9650 offset = const0_rtx;
9651 base = eliminate_constant_term (XEXP (SET_SRC (set), 0), &offset);
9652 off = INTVAL (offset);
9654 if (GET_CODE (base) != REG || off < 0)
9655 continue;
9656 if (cfun_frame_layout.first_restore_gpr != -1
9657 && (cfun_frame_layout.first_restore_gpr < first
9658 || cfun_frame_layout.last_restore_gpr > last))
9659 continue;
9660 if (REGNO (base) != STACK_POINTER_REGNUM
9661 && REGNO (base) != HARD_FRAME_POINTER_REGNUM)
9662 continue;
9663 if (first > BASE_REGNUM || last < BASE_REGNUM)
9664 continue;
9666 if (cfun_frame_layout.first_restore_gpr != -1)
9668 new_insn = restore_gprs (base,
9669 off + (cfun_frame_layout.first_restore_gpr
9670 - first) * UNITS_PER_WORD,
9671 cfun_frame_layout.first_restore_gpr,
9672 cfun_frame_layout.last_restore_gpr);
9673 new_insn = emit_insn_before (new_insn, insn);
9674 INSN_ADDRESSES_NEW (new_insn, -1);
9677 remove_insn (insn);
9678 continue;
9681 if (cfun_frame_layout.first_restore_gpr == -1
9682 && GET_CODE (PATTERN (insn)) == SET
9683 && GET_CODE (SET_DEST (PATTERN (insn))) == REG
9684 && (REGNO (SET_DEST (PATTERN (insn))) == BASE_REGNUM
9685 || (!TARGET_CPU_ZARCH
9686 && REGNO (SET_DEST (PATTERN (insn))) == RETURN_REGNUM))
9687 && GET_CODE (SET_SRC (PATTERN (insn))) == MEM)
9689 set = PATTERN (insn);
9690 first = REGNO (SET_DEST (set));
9691 offset = const0_rtx;
9692 base = eliminate_constant_term (XEXP (SET_SRC (set), 0), &offset);
9693 off = INTVAL (offset);
9695 if (GET_CODE (base) != REG || off < 0)
9696 continue;
9697 if (REGNO (base) != STACK_POINTER_REGNUM
9698 && REGNO (base) != HARD_FRAME_POINTER_REGNUM)
9699 continue;
9701 remove_insn (insn);
9702 continue;
9707 /* On z10 the dynamic branch prediction must see the backward jump in
9708 a window of 384 bytes. If not it falls back to the static
9709 prediction. This function rearranges the loop backward branch in a
9710 way which makes the static prediction always correct. The function
9711 returns true if it added an instruction. */
9712 static bool
9713 s390_z10_fix_long_loop_prediction (rtx insn)
9715 rtx set = single_set (insn);
9716 rtx code_label, label_ref, new_label;
9717 rtx uncond_jump;
9718 rtx cur_insn;
9719 rtx tmp;
9720 int distance;
9722 /* This will exclude branch on count and branch on index patterns
9723 since these are correctly statically predicted. */
9724 if (!set
9725 || SET_DEST (set) != pc_rtx
9726 || GET_CODE (SET_SRC(set)) != IF_THEN_ELSE)
9727 return false;
9729 label_ref = (GET_CODE (XEXP (SET_SRC (set), 1)) == LABEL_REF ?
9730 XEXP (SET_SRC (set), 1) : XEXP (SET_SRC (set), 2));
9732 gcc_assert (GET_CODE (label_ref) == LABEL_REF);
9734 code_label = XEXP (label_ref, 0);
9736 if (INSN_ADDRESSES (INSN_UID (code_label)) == -1
9737 || INSN_ADDRESSES (INSN_UID (insn)) == -1
9738 || (INSN_ADDRESSES (INSN_UID (insn))
9739 - INSN_ADDRESSES (INSN_UID (code_label)) < Z10_PREDICT_DISTANCE))
9740 return false;
9742 for (distance = 0, cur_insn = PREV_INSN (insn);
9743 distance < Z10_PREDICT_DISTANCE - 6;
9744 distance += get_attr_length (cur_insn), cur_insn = PREV_INSN (cur_insn))
9745 if (!cur_insn || JUMP_P (cur_insn) || LABEL_P (cur_insn))
9746 return false;
9748 new_label = gen_label_rtx ();
9749 uncond_jump = emit_jump_insn_after (
9750 gen_rtx_SET (VOIDmode, pc_rtx,
9751 gen_rtx_LABEL_REF (VOIDmode, code_label)),
9752 insn);
9753 emit_label_after (new_label, uncond_jump);
9755 tmp = XEXP (SET_SRC (set), 1);
9756 XEXP (SET_SRC (set), 1) = XEXP (SET_SRC (set), 2);
9757 XEXP (SET_SRC (set), 2) = tmp;
9758 INSN_CODE (insn) = -1;
9760 XEXP (label_ref, 0) = new_label;
9761 JUMP_LABEL (insn) = new_label;
9762 JUMP_LABEL (uncond_jump) = code_label;
9764 return true;
9767 /* Returns 1 if INSN reads the value of REG for purposes not related
9768 to addressing of memory, and 0 otherwise. */
9769 static int
9770 s390_non_addr_reg_read_p (rtx reg, rtx insn)
9772 return reg_referenced_p (reg, PATTERN (insn))
9773 && !reg_used_in_mem_p (REGNO (reg), PATTERN (insn));
9776 /* Starting from INSN find_cond_jump looks downwards in the insn
9777 stream for a single jump insn which is the last user of the
9778 condition code set in INSN. */
9779 static rtx
9780 find_cond_jump (rtx insn)
9782 for (; insn; insn = NEXT_INSN (insn))
9784 rtx ite, cc;
9786 if (LABEL_P (insn))
9787 break;
9789 if (!JUMP_P (insn))
9791 if (reg_mentioned_p (gen_rtx_REG (CCmode, CC_REGNUM), insn))
9792 break;
9793 continue;
9796 /* This will be triggered by a return. */
9797 if (GET_CODE (PATTERN (insn)) != SET)
9798 break;
9800 gcc_assert (SET_DEST (PATTERN (insn)) == pc_rtx);
9801 ite = SET_SRC (PATTERN (insn));
9803 if (GET_CODE (ite) != IF_THEN_ELSE)
9804 break;
9806 cc = XEXP (XEXP (ite, 0), 0);
9807 if (!REG_P (cc) || !CC_REGNO_P (REGNO (cc)))
9808 break;
9810 if (find_reg_note (insn, REG_DEAD, cc))
9811 return insn;
9812 break;
9815 return NULL_RTX;
9818 /* Swap the condition in COND and the operands in OP0 and OP1 so that
9819 the semantics does not change. If NULL_RTX is passed as COND the
9820 function tries to find the conditional jump starting with INSN. */
9821 static void
9822 s390_swap_cmp (rtx cond, rtx *op0, rtx *op1, rtx insn)
9824 rtx tmp = *op0;
9826 if (cond == NULL_RTX)
9828 rtx jump = find_cond_jump (NEXT_INSN (insn));
9829 jump = jump ? single_set (jump) : NULL_RTX;
9831 if (jump == NULL_RTX)
9832 return;
9834 cond = XEXP (XEXP (jump, 1), 0);
9837 *op0 = *op1;
9838 *op1 = tmp;
9839 PUT_CODE (cond, swap_condition (GET_CODE (cond)));
9842 /* On z10, instructions of the compare-and-branch family have the
9843 property to access the register occurring as second operand with
9844 its bits complemented. If such a compare is grouped with a second
9845 instruction that accesses the same register non-complemented, and
9846 if that register's value is delivered via a bypass, then the
9847 pipeline recycles, thereby causing significant performance decline.
9848 This function locates such situations and exchanges the two
9849 operands of the compare. The function return true whenever it
9850 added an insn. */
9851 static bool
9852 s390_z10_optimize_cmp (rtx insn)
9854 rtx prev_insn, next_insn;
9855 bool insn_added_p = false;
9856 rtx cond, *op0, *op1;
9858 if (GET_CODE (PATTERN (insn)) == PARALLEL)
9860 /* Handle compare and branch and branch on count
9861 instructions. */
9862 rtx pattern = single_set (insn);
9864 if (!pattern
9865 || SET_DEST (pattern) != pc_rtx
9866 || GET_CODE (SET_SRC (pattern)) != IF_THEN_ELSE)
9867 return false;
9869 cond = XEXP (SET_SRC (pattern), 0);
9870 op0 = &XEXP (cond, 0);
9871 op1 = &XEXP (cond, 1);
9873 else if (GET_CODE (PATTERN (insn)) == SET)
9875 rtx src, dest;
9877 /* Handle normal compare instructions. */
9878 src = SET_SRC (PATTERN (insn));
9879 dest = SET_DEST (PATTERN (insn));
9881 if (!REG_P (dest)
9882 || !CC_REGNO_P (REGNO (dest))
9883 || GET_CODE (src) != COMPARE)
9884 return false;
9886 /* s390_swap_cmp will try to find the conditional
9887 jump when passing NULL_RTX as condition. */
9888 cond = NULL_RTX;
9889 op0 = &XEXP (src, 0);
9890 op1 = &XEXP (src, 1);
9892 else
9893 return false;
9895 if (!REG_P (*op0) || !REG_P (*op1))
9896 return false;
9898 if (GET_MODE_CLASS (GET_MODE (*op0)) != MODE_INT)
9899 return false;
9901 /* Swap the COMPARE arguments and its mask if there is a
9902 conflicting access in the previous insn. */
9903 prev_insn = prev_active_insn (insn);
9904 if (prev_insn != NULL_RTX && INSN_P (prev_insn)
9905 && reg_referenced_p (*op1, PATTERN (prev_insn)))
9906 s390_swap_cmp (cond, op0, op1, insn);
9908 /* Check if there is a conflict with the next insn. If there
9909 was no conflict with the previous insn, then swap the
9910 COMPARE arguments and its mask. If we already swapped
9911 the operands, or if swapping them would cause a conflict
9912 with the previous insn, issue a NOP after the COMPARE in
9913 order to separate the two instuctions. */
9914 next_insn = next_active_insn (insn);
9915 if (next_insn != NULL_RTX && INSN_P (next_insn)
9916 && s390_non_addr_reg_read_p (*op1, next_insn))
9918 if (prev_insn != NULL_RTX && INSN_P (prev_insn)
9919 && s390_non_addr_reg_read_p (*op0, prev_insn))
9921 if (REGNO (*op1) == 0)
9922 emit_insn_after (gen_nop1 (), insn);
9923 else
9924 emit_insn_after (gen_nop (), insn);
9925 insn_added_p = true;
9927 else
9928 s390_swap_cmp (cond, op0, op1, insn);
9930 return insn_added_p;
9933 /* Perform machine-dependent processing. */
9935 static void
9936 s390_reorg (void)
9938 bool pool_overflow = false;
9940 /* Make sure all splits have been performed; splits after
9941 machine_dependent_reorg might confuse insn length counts. */
9942 split_all_insns_noflow ();
9944 /* Install the main literal pool and the associated base
9945 register load insns.
9947 In addition, there are two problematic situations we need
9948 to correct:
9950 - the literal pool might be > 4096 bytes in size, so that
9951 some of its elements cannot be directly accessed
9953 - a branch target might be > 64K away from the branch, so that
9954 it is not possible to use a PC-relative instruction.
9956 To fix those, we split the single literal pool into multiple
9957 pool chunks, reloading the pool base register at various
9958 points throughout the function to ensure it always points to
9959 the pool chunk the following code expects, and / or replace
9960 PC-relative branches by absolute branches.
9962 However, the two problems are interdependent: splitting the
9963 literal pool can move a branch further away from its target,
9964 causing the 64K limit to overflow, and on the other hand,
9965 replacing a PC-relative branch by an absolute branch means
9966 we need to put the branch target address into the literal
9967 pool, possibly causing it to overflow.
9969 So, we loop trying to fix up both problems until we manage
9970 to satisfy both conditions at the same time. Note that the
9971 loop is guaranteed to terminate as every pass of the loop
9972 strictly decreases the total number of PC-relative branches
9973 in the function. (This is not completely true as there
9974 might be branch-over-pool insns introduced by chunkify_start.
9975 Those never need to be split however.) */
9977 for (;;)
9979 struct constant_pool *pool = NULL;
9981 /* Collect the literal pool. */
9982 if (!pool_overflow)
9984 pool = s390_mainpool_start ();
9985 if (!pool)
9986 pool_overflow = true;
9989 /* If literal pool overflowed, start to chunkify it. */
9990 if (pool_overflow)
9991 pool = s390_chunkify_start ();
9993 /* Split out-of-range branches. If this has created new
9994 literal pool entries, cancel current chunk list and
9995 recompute it. zSeries machines have large branch
9996 instructions, so we never need to split a branch. */
9997 if (!TARGET_CPU_ZARCH && s390_split_branches ())
9999 if (pool_overflow)
10000 s390_chunkify_cancel (pool);
10001 else
10002 s390_mainpool_cancel (pool);
10004 continue;
10007 /* If we made it up to here, both conditions are satisfied.
10008 Finish up literal pool related changes. */
10009 if (pool_overflow)
10010 s390_chunkify_finish (pool);
10011 else
10012 s390_mainpool_finish (pool);
10014 /* We're done splitting branches. */
10015 cfun->machine->split_branches_pending_p = false;
10016 break;
10019 /* Generate out-of-pool execute target insns. */
10020 if (TARGET_CPU_ZARCH)
10022 rtx insn, label, target;
10024 for (insn = get_insns (); insn; insn = NEXT_INSN (insn))
10026 label = s390_execute_label (insn);
10027 if (!label)
10028 continue;
10030 gcc_assert (label != const0_rtx);
10032 target = emit_label (XEXP (label, 0));
10033 INSN_ADDRESSES_NEW (target, -1);
10035 target = emit_insn (s390_execute_target (insn));
10036 INSN_ADDRESSES_NEW (target, -1);
10040 /* Try to optimize prologue and epilogue further. */
10041 s390_optimize_prologue ();
10043 /* Walk over the insns and do some z10 specific changes. */
10044 if (s390_tune == PROCESSOR_2097_Z10)
10046 rtx insn;
10047 bool insn_added_p = false;
10049 /* The insn lengths and addresses have to be up to date for the
10050 following manipulations. */
10051 shorten_branches (get_insns ());
10053 for (insn = get_insns (); insn; insn = NEXT_INSN (insn))
10055 if (!INSN_P (insn) || INSN_CODE (insn) <= 0)
10056 continue;
10058 if (JUMP_P (insn))
10059 insn_added_p |= s390_z10_fix_long_loop_prediction (insn);
10061 if (GET_CODE (PATTERN (insn)) == PARALLEL
10062 || GET_CODE (PATTERN (insn)) == SET)
10063 insn_added_p |= s390_z10_optimize_cmp (insn);
10066 /* Adjust branches if we added new instructions. */
10067 if (insn_added_p)
10068 shorten_branches (get_insns ());
10072 /* Return true if INSN is a fp load insn writing register REGNO. */
10073 static inline bool
10074 s390_fpload_toreg (rtx insn, unsigned int regno)
10076 rtx set;
10077 enum attr_type flag = s390_safe_attr_type (insn);
10079 if (flag != TYPE_FLOADSF && flag != TYPE_FLOADDF)
10080 return false;
10082 set = single_set (insn);
10084 if (set == NULL_RTX)
10085 return false;
10087 if (!REG_P (SET_DEST (set)) || !MEM_P (SET_SRC (set)))
10088 return false;
10090 if (REGNO (SET_DEST (set)) != regno)
10091 return false;
10093 return true;
10096 /* This value describes the distance to be avoided between an
10097 aritmetic fp instruction and an fp load writing the same register.
10098 Z10_EARLYLOAD_DISTANCE - 1 as well as Z10_EARLYLOAD_DISTANCE + 1 is
10099 fine but the exact value has to be avoided. Otherwise the FP
10100 pipeline will throw an exception causing a major penalty. */
10101 #define Z10_EARLYLOAD_DISTANCE 7
10103 /* Rearrange the ready list in order to avoid the situation described
10104 for Z10_EARLYLOAD_DISTANCE. A problematic load instruction is
10105 moved to the very end of the ready list. */
10106 static void
10107 s390_z10_prevent_earlyload_conflicts (rtx *ready, int *nready_p)
10109 unsigned int regno;
10110 int nready = *nready_p;
10111 rtx tmp;
10112 int i;
10113 rtx insn;
10114 rtx set;
10115 enum attr_type flag;
10116 int distance;
10118 /* Skip DISTANCE - 1 active insns. */
10119 for (insn = last_scheduled_insn, distance = Z10_EARLYLOAD_DISTANCE - 1;
10120 distance > 0 && insn != NULL_RTX;
10121 distance--, insn = prev_active_insn (insn))
10122 if (CALL_P (insn) || JUMP_P (insn))
10123 return;
10125 if (insn == NULL_RTX)
10126 return;
10128 set = single_set (insn);
10130 if (set == NULL_RTX || !REG_P (SET_DEST (set))
10131 || GET_MODE_CLASS (GET_MODE (SET_DEST (set))) != MODE_FLOAT)
10132 return;
10134 flag = s390_safe_attr_type (insn);
10136 if (flag == TYPE_FLOADSF || flag == TYPE_FLOADDF)
10137 return;
10139 regno = REGNO (SET_DEST (set));
10140 i = nready - 1;
10142 while (!s390_fpload_toreg (ready[i], regno) && i > 0)
10143 i--;
10145 if (!i)
10146 return;
10148 tmp = ready[i];
10149 memmove (&ready[1], &ready[0], sizeof (rtx) * i);
10150 ready[0] = tmp;
10153 /* This function is called via hook TARGET_SCHED_REORDER before
10154 issueing one insn from list READY which contains *NREADYP entries.
10155 For target z10 it reorders load instructions to avoid early load
10156 conflicts in the floating point pipeline */
10157 static int
10158 s390_sched_reorder (FILE *file ATTRIBUTE_UNUSED, int verbose ATTRIBUTE_UNUSED,
10159 rtx *ready, int *nreadyp, int clock ATTRIBUTE_UNUSED)
10161 if (s390_tune == PROCESSOR_2097_Z10)
10162 if (reload_completed && *nreadyp > 1)
10163 s390_z10_prevent_earlyload_conflicts (ready, nreadyp);
10165 return s390_issue_rate ();
10168 /* This function is called via hook TARGET_SCHED_VARIABLE_ISSUE after
10169 the scheduler has issued INSN. It stores the last issued insn into
10170 last_scheduled_insn in order to make it available for
10171 s390_sched_reorder. */
10172 static int
10173 s390_sched_variable_issue (FILE *file ATTRIBUTE_UNUSED,
10174 int verbose ATTRIBUTE_UNUSED,
10175 rtx insn, int more)
10177 last_scheduled_insn = insn;
10179 if (GET_CODE (PATTERN (insn)) != USE
10180 && GET_CODE (PATTERN (insn)) != CLOBBER)
10181 return more - 1;
10182 else
10183 return more;
10186 static void
10187 s390_sched_init (FILE *file ATTRIBUTE_UNUSED,
10188 int verbose ATTRIBUTE_UNUSED,
10189 int max_ready ATTRIBUTE_UNUSED)
10191 last_scheduled_insn = NULL_RTX;
10194 /* Initialize GCC target structure. */
10196 #undef TARGET_ASM_ALIGNED_HI_OP
10197 #define TARGET_ASM_ALIGNED_HI_OP "\t.word\t"
10198 #undef TARGET_ASM_ALIGNED_DI_OP
10199 #define TARGET_ASM_ALIGNED_DI_OP "\t.quad\t"
10200 #undef TARGET_ASM_INTEGER
10201 #define TARGET_ASM_INTEGER s390_assemble_integer
10203 #undef TARGET_ASM_OPEN_PAREN
10204 #define TARGET_ASM_OPEN_PAREN ""
10206 #undef TARGET_ASM_CLOSE_PAREN
10207 #define TARGET_ASM_CLOSE_PAREN ""
10209 #undef TARGET_DEFAULT_TARGET_FLAGS
10210 #define TARGET_DEFAULT_TARGET_FLAGS (TARGET_DEFAULT | MASK_FUSED_MADD)
10211 #undef TARGET_HANDLE_OPTION
10212 #define TARGET_HANDLE_OPTION s390_handle_option
10214 #undef TARGET_ENCODE_SECTION_INFO
10215 #define TARGET_ENCODE_SECTION_INFO s390_encode_section_info
10217 #ifdef HAVE_AS_TLS
10218 #undef TARGET_HAVE_TLS
10219 #define TARGET_HAVE_TLS true
10220 #endif
10221 #undef TARGET_CANNOT_FORCE_CONST_MEM
10222 #define TARGET_CANNOT_FORCE_CONST_MEM s390_cannot_force_const_mem
10224 #undef TARGET_DELEGITIMIZE_ADDRESS
10225 #define TARGET_DELEGITIMIZE_ADDRESS s390_delegitimize_address
10227 #undef TARGET_LEGITIMIZE_ADDRESS
10228 #define TARGET_LEGITIMIZE_ADDRESS s390_legitimize_address
10230 #undef TARGET_RETURN_IN_MEMORY
10231 #define TARGET_RETURN_IN_MEMORY s390_return_in_memory
10233 #undef TARGET_INIT_BUILTINS
10234 #define TARGET_INIT_BUILTINS s390_init_builtins
10235 #undef TARGET_EXPAND_BUILTIN
10236 #define TARGET_EXPAND_BUILTIN s390_expand_builtin
10238 #undef TARGET_ASM_OUTPUT_MI_THUNK
10239 #define TARGET_ASM_OUTPUT_MI_THUNK s390_output_mi_thunk
10240 #undef TARGET_ASM_CAN_OUTPUT_MI_THUNK
10241 #define TARGET_ASM_CAN_OUTPUT_MI_THUNK hook_bool_const_tree_hwi_hwi_const_tree_true
10243 #undef TARGET_SCHED_ADJUST_PRIORITY
10244 #define TARGET_SCHED_ADJUST_PRIORITY s390_adjust_priority
10245 #undef TARGET_SCHED_ISSUE_RATE
10246 #define TARGET_SCHED_ISSUE_RATE s390_issue_rate
10247 #undef TARGET_SCHED_FIRST_CYCLE_MULTIPASS_DFA_LOOKAHEAD
10248 #define TARGET_SCHED_FIRST_CYCLE_MULTIPASS_DFA_LOOKAHEAD s390_first_cycle_multipass_dfa_lookahead
10250 #undef TARGET_SCHED_VARIABLE_ISSUE
10251 #define TARGET_SCHED_VARIABLE_ISSUE s390_sched_variable_issue
10252 #undef TARGET_SCHED_REORDER
10253 #define TARGET_SCHED_REORDER s390_sched_reorder
10254 #undef TARGET_SCHED_INIT
10255 #define TARGET_SCHED_INIT s390_sched_init
10257 #undef TARGET_CANNOT_COPY_INSN_P
10258 #define TARGET_CANNOT_COPY_INSN_P s390_cannot_copy_insn_p
10259 #undef TARGET_RTX_COSTS
10260 #define TARGET_RTX_COSTS s390_rtx_costs
10261 #undef TARGET_ADDRESS_COST
10262 #define TARGET_ADDRESS_COST s390_address_cost
10264 #undef TARGET_MACHINE_DEPENDENT_REORG
10265 #define TARGET_MACHINE_DEPENDENT_REORG s390_reorg
10267 #undef TARGET_VALID_POINTER_MODE
10268 #define TARGET_VALID_POINTER_MODE s390_valid_pointer_mode
10270 #undef TARGET_BUILD_BUILTIN_VA_LIST
10271 #define TARGET_BUILD_BUILTIN_VA_LIST s390_build_builtin_va_list
10272 #undef TARGET_EXPAND_BUILTIN_VA_START
10273 #define TARGET_EXPAND_BUILTIN_VA_START s390_va_start
10274 #undef TARGET_GIMPLIFY_VA_ARG_EXPR
10275 #define TARGET_GIMPLIFY_VA_ARG_EXPR s390_gimplify_va_arg
10277 #undef TARGET_PROMOTE_FUNCTION_MODE
10278 #define TARGET_PROMOTE_FUNCTION_MODE s390_promote_function_mode
10279 #undef TARGET_PASS_BY_REFERENCE
10280 #define TARGET_PASS_BY_REFERENCE s390_pass_by_reference
10282 #undef TARGET_FUNCTION_OK_FOR_SIBCALL
10283 #define TARGET_FUNCTION_OK_FOR_SIBCALL s390_function_ok_for_sibcall
10285 #undef TARGET_FIXED_CONDITION_CODE_REGS
10286 #define TARGET_FIXED_CONDITION_CODE_REGS s390_fixed_condition_code_regs
10288 #undef TARGET_CC_MODES_COMPATIBLE
10289 #define TARGET_CC_MODES_COMPATIBLE s390_cc_modes_compatible
10291 #undef TARGET_INVALID_WITHIN_DOLOOP
10292 #define TARGET_INVALID_WITHIN_DOLOOP hook_constcharptr_const_rtx_null
10294 #ifdef HAVE_AS_TLS
10295 #undef TARGET_ASM_OUTPUT_DWARF_DTPREL
10296 #define TARGET_ASM_OUTPUT_DWARF_DTPREL s390_output_dwarf_dtprel
10297 #endif
10299 #ifdef TARGET_ALTERNATE_LONG_DOUBLE_MANGLING
10300 #undef TARGET_MANGLE_TYPE
10301 #define TARGET_MANGLE_TYPE s390_mangle_type
10302 #endif
10304 #undef TARGET_SCALAR_MODE_SUPPORTED_P
10305 #define TARGET_SCALAR_MODE_SUPPORTED_P s390_scalar_mode_supported_p
10307 #undef TARGET_SECONDARY_RELOAD
10308 #define TARGET_SECONDARY_RELOAD s390_secondary_reload
10310 #undef TARGET_LIBGCC_CMP_RETURN_MODE
10311 #define TARGET_LIBGCC_CMP_RETURN_MODE s390_libgcc_cmp_return_mode
10313 #undef TARGET_LIBGCC_SHIFT_COUNT_MODE
10314 #define TARGET_LIBGCC_SHIFT_COUNT_MODE s390_libgcc_shift_count_mode
10316 #undef TARGET_LEGITIMATE_ADDRESS_P
10317 #define TARGET_LEGITIMATE_ADDRESS_P s390_legitimate_address_p
10319 #undef TARGET_CAN_ELIMINATE
10320 #define TARGET_CAN_ELIMINATE s390_can_eliminate
10322 #undef TARGET_ASM_TRAMPOLINE_TEMPLATE
10323 #define TARGET_ASM_TRAMPOLINE_TEMPLATE s390_asm_trampoline_template
10324 #undef TARGET_TRAMPOLINE_INIT
10325 #define TARGET_TRAMPOLINE_INIT s390_trampoline_init
10327 struct gcc_target targetm = TARGET_INITIALIZER;
10329 #include "gt-s390.h"