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, 2011, 2012 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
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
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/>. */
26 #include "coretypes.h"
32 #include "hard-reg-set.h"
33 #include "insn-config.h"
34 #include "conditions.h"
36 #include "insn-attr.h"
43 #include "diagnostic-core.h"
44 #include "basic-block.h"
47 #include "target-def.h"
49 #include "langhooks.h"
57 /* Define the specific costs for a given cpu. */
59 struct processor_costs
62 const int m
; /* cost of an M instruction. */
63 const int mghi
; /* cost of an MGHI instruction. */
64 const int mh
; /* cost of an MH instruction. */
65 const int mhi
; /* cost of an MHI instruction. */
66 const int ml
; /* cost of an ML instruction. */
67 const int mr
; /* cost of an MR instruction. */
68 const int ms
; /* cost of an MS instruction. */
69 const int msg
; /* cost of an MSG instruction. */
70 const int msgf
; /* cost of an MSGF instruction. */
71 const int msgfr
; /* cost of an MSGFR instruction. */
72 const int msgr
; /* cost of an MSGR instruction. */
73 const int msr
; /* cost of an MSR instruction. */
74 const int mult_df
; /* cost of multiplication in DFmode. */
77 const int sqxbr
; /* cost of square root in TFmode. */
78 const int sqdbr
; /* cost of square root in DFmode. */
79 const int sqebr
; /* cost of square root in SFmode. */
80 /* multiply and add */
81 const int madbr
; /* cost of multiply and add in DFmode. */
82 const int maebr
; /* cost of multiply and add in SFmode. */
94 const struct processor_costs
*s390_cost
;
97 struct processor_costs z900_cost
=
99 COSTS_N_INSNS (5), /* M */
100 COSTS_N_INSNS (10), /* MGHI */
101 COSTS_N_INSNS (5), /* MH */
102 COSTS_N_INSNS (4), /* MHI */
103 COSTS_N_INSNS (5), /* ML */
104 COSTS_N_INSNS (5), /* MR */
105 COSTS_N_INSNS (4), /* MS */
106 COSTS_N_INSNS (15), /* MSG */
107 COSTS_N_INSNS (7), /* MSGF */
108 COSTS_N_INSNS (7), /* MSGFR */
109 COSTS_N_INSNS (10), /* MSGR */
110 COSTS_N_INSNS (4), /* MSR */
111 COSTS_N_INSNS (7), /* multiplication in DFmode */
112 COSTS_N_INSNS (13), /* MXBR */
113 COSTS_N_INSNS (136), /* SQXBR */
114 COSTS_N_INSNS (44), /* SQDBR */
115 COSTS_N_INSNS (35), /* SQEBR */
116 COSTS_N_INSNS (18), /* MADBR */
117 COSTS_N_INSNS (13), /* MAEBR */
118 COSTS_N_INSNS (134), /* DXBR */
119 COSTS_N_INSNS (30), /* DDBR */
120 COSTS_N_INSNS (27), /* DEBR */
121 COSTS_N_INSNS (220), /* DLGR */
122 COSTS_N_INSNS (34), /* DLR */
123 COSTS_N_INSNS (34), /* DR */
124 COSTS_N_INSNS (32), /* DSGFR */
125 COSTS_N_INSNS (32), /* DSGR */
129 struct processor_costs z990_cost
=
131 COSTS_N_INSNS (4), /* M */
132 COSTS_N_INSNS (2), /* MGHI */
133 COSTS_N_INSNS (2), /* MH */
134 COSTS_N_INSNS (2), /* MHI */
135 COSTS_N_INSNS (4), /* ML */
136 COSTS_N_INSNS (4), /* MR */
137 COSTS_N_INSNS (5), /* MS */
138 COSTS_N_INSNS (6), /* MSG */
139 COSTS_N_INSNS (4), /* MSGF */
140 COSTS_N_INSNS (4), /* MSGFR */
141 COSTS_N_INSNS (4), /* MSGR */
142 COSTS_N_INSNS (4), /* MSR */
143 COSTS_N_INSNS (1), /* multiplication in DFmode */
144 COSTS_N_INSNS (28), /* MXBR */
145 COSTS_N_INSNS (130), /* SQXBR */
146 COSTS_N_INSNS (66), /* SQDBR */
147 COSTS_N_INSNS (38), /* SQEBR */
148 COSTS_N_INSNS (1), /* MADBR */
149 COSTS_N_INSNS (1), /* MAEBR */
150 COSTS_N_INSNS (60), /* DXBR */
151 COSTS_N_INSNS (40), /* DDBR */
152 COSTS_N_INSNS (26), /* DEBR */
153 COSTS_N_INSNS (176), /* DLGR */
154 COSTS_N_INSNS (31), /* DLR */
155 COSTS_N_INSNS (31), /* DR */
156 COSTS_N_INSNS (31), /* DSGFR */
157 COSTS_N_INSNS (31), /* DSGR */
161 struct processor_costs z9_109_cost
=
163 COSTS_N_INSNS (4), /* M */
164 COSTS_N_INSNS (2), /* MGHI */
165 COSTS_N_INSNS (2), /* MH */
166 COSTS_N_INSNS (2), /* MHI */
167 COSTS_N_INSNS (4), /* ML */
168 COSTS_N_INSNS (4), /* MR */
169 COSTS_N_INSNS (5), /* MS */
170 COSTS_N_INSNS (6), /* MSG */
171 COSTS_N_INSNS (4), /* MSGF */
172 COSTS_N_INSNS (4), /* MSGFR */
173 COSTS_N_INSNS (4), /* MSGR */
174 COSTS_N_INSNS (4), /* MSR */
175 COSTS_N_INSNS (1), /* multiplication in DFmode */
176 COSTS_N_INSNS (28), /* MXBR */
177 COSTS_N_INSNS (130), /* SQXBR */
178 COSTS_N_INSNS (66), /* SQDBR */
179 COSTS_N_INSNS (38), /* SQEBR */
180 COSTS_N_INSNS (1), /* MADBR */
181 COSTS_N_INSNS (1), /* MAEBR */
182 COSTS_N_INSNS (60), /* DXBR */
183 COSTS_N_INSNS (40), /* DDBR */
184 COSTS_N_INSNS (26), /* DEBR */
185 COSTS_N_INSNS (30), /* DLGR */
186 COSTS_N_INSNS (23), /* DLR */
187 COSTS_N_INSNS (23), /* DR */
188 COSTS_N_INSNS (24), /* DSGFR */
189 COSTS_N_INSNS (24), /* DSGR */
193 struct processor_costs z10_cost
=
195 COSTS_N_INSNS (10), /* M */
196 COSTS_N_INSNS (10), /* MGHI */
197 COSTS_N_INSNS (10), /* MH */
198 COSTS_N_INSNS (10), /* MHI */
199 COSTS_N_INSNS (10), /* ML */
200 COSTS_N_INSNS (10), /* MR */
201 COSTS_N_INSNS (10), /* MS */
202 COSTS_N_INSNS (10), /* MSG */
203 COSTS_N_INSNS (10), /* MSGF */
204 COSTS_N_INSNS (10), /* MSGFR */
205 COSTS_N_INSNS (10), /* MSGR */
206 COSTS_N_INSNS (10), /* MSR */
207 COSTS_N_INSNS (1) , /* multiplication in DFmode */
208 COSTS_N_INSNS (50), /* MXBR */
209 COSTS_N_INSNS (120), /* SQXBR */
210 COSTS_N_INSNS (52), /* SQDBR */
211 COSTS_N_INSNS (38), /* SQEBR */
212 COSTS_N_INSNS (1), /* MADBR */
213 COSTS_N_INSNS (1), /* MAEBR */
214 COSTS_N_INSNS (111), /* DXBR */
215 COSTS_N_INSNS (39), /* DDBR */
216 COSTS_N_INSNS (32), /* DEBR */
217 COSTS_N_INSNS (160), /* DLGR */
218 COSTS_N_INSNS (71), /* DLR */
219 COSTS_N_INSNS (71), /* DR */
220 COSTS_N_INSNS (71), /* DSGFR */
221 COSTS_N_INSNS (71), /* DSGR */
225 struct processor_costs z196_cost
=
227 COSTS_N_INSNS (7), /* M */
228 COSTS_N_INSNS (5), /* MGHI */
229 COSTS_N_INSNS (5), /* MH */
230 COSTS_N_INSNS (5), /* MHI */
231 COSTS_N_INSNS (7), /* ML */
232 COSTS_N_INSNS (7), /* MR */
233 COSTS_N_INSNS (6), /* MS */
234 COSTS_N_INSNS (8), /* MSG */
235 COSTS_N_INSNS (6), /* MSGF */
236 COSTS_N_INSNS (6), /* MSGFR */
237 COSTS_N_INSNS (8), /* MSGR */
238 COSTS_N_INSNS (6), /* MSR */
239 COSTS_N_INSNS (1) , /* multiplication in DFmode */
240 COSTS_N_INSNS (40), /* MXBR B+40 */
241 COSTS_N_INSNS (100), /* SQXBR B+100 */
242 COSTS_N_INSNS (42), /* SQDBR B+42 */
243 COSTS_N_INSNS (28), /* SQEBR B+28 */
244 COSTS_N_INSNS (1), /* MADBR B */
245 COSTS_N_INSNS (1), /* MAEBR B */
246 COSTS_N_INSNS (101), /* DXBR B+101 */
247 COSTS_N_INSNS (29), /* DDBR */
248 COSTS_N_INSNS (22), /* DEBR */
249 COSTS_N_INSNS (160), /* DLGR cracked */
250 COSTS_N_INSNS (160), /* DLR cracked */
251 COSTS_N_INSNS (160), /* DR expanded */
252 COSTS_N_INSNS (160), /* DSGFR cracked */
253 COSTS_N_INSNS (160), /* DSGR cracked */
256 extern int reload_completed
;
258 /* Kept up to date using the SCHED_VARIABLE_ISSUE hook. */
259 static rtx last_scheduled_insn
;
261 /* Structure used to hold the components of a S/390 memory
262 address. A legitimate address on S/390 is of the general
264 base + index + displacement
265 where any of the components is optional.
267 base and index are registers of the class ADDR_REGS,
268 displacement is an unsigned 12-bit immediate constant. */
279 /* The following structure is embedded in the machine
280 specific part of struct function. */
282 struct GTY (()) s390_frame_layout
284 /* Offset within stack frame. */
285 HOST_WIDE_INT gprs_offset
;
286 HOST_WIDE_INT f0_offset
;
287 HOST_WIDE_INT f4_offset
;
288 HOST_WIDE_INT f8_offset
;
289 HOST_WIDE_INT backchain_offset
;
291 /* Number of first and last gpr where slots in the register
292 save area are reserved for. */
293 int first_save_gpr_slot
;
294 int last_save_gpr_slot
;
296 /* Number of first and last gpr to be saved, restored. */
298 int first_restore_gpr
;
300 int last_restore_gpr
;
302 /* Bits standing for floating point registers. Set, if the
303 respective register has to be saved. Starting with reg 16 (f0)
304 at the rightmost bit.
305 Bit 15 - 8 7 6 5 4 3 2 1 0
306 fpr 15 - 8 7 5 3 1 6 4 2 0
307 reg 31 - 24 23 22 21 20 19 18 17 16 */
308 unsigned int fpr_bitmap
;
310 /* Number of floating point registers f8-f15 which must be saved. */
313 /* Set if return address needs to be saved.
314 This flag is set by s390_return_addr_rtx if it could not use
315 the initial value of r14 and therefore depends on r14 saved
317 bool save_return_addr_p
;
319 /* Size of stack frame. */
320 HOST_WIDE_INT frame_size
;
323 /* Define the structure for the machine field in struct function. */
325 struct GTY(()) machine_function
327 struct s390_frame_layout frame_layout
;
329 /* Literal pool base register. */
332 /* True if we may need to perform branch splitting. */
333 bool split_branches_pending_p
;
335 /* Some local-dynamic TLS symbol name. */
336 const char *some_ld_name
;
338 bool has_landing_pad_p
;
341 /* Few accessor macros for struct cfun->machine->s390_frame_layout. */
343 #define cfun_frame_layout (cfun->machine->frame_layout)
344 #define cfun_save_high_fprs_p (!!cfun_frame_layout.high_fprs)
345 #define cfun_gprs_save_area_size ((cfun_frame_layout.last_save_gpr_slot - \
346 cfun_frame_layout.first_save_gpr_slot + 1) * UNITS_PER_LONG)
347 #define cfun_set_fpr_bit(BITNUM) (cfun->machine->frame_layout.fpr_bitmap |= \
349 #define cfun_fpr_bit_p(BITNUM) (!!(cfun->machine->frame_layout.fpr_bitmap & \
352 /* Number of GPRs and FPRs used for argument passing. */
353 #define GP_ARG_NUM_REG 5
354 #define FP_ARG_NUM_REG (TARGET_64BIT? 4 : 2)
356 /* A couple of shortcuts. */
357 #define CONST_OK_FOR_J(x) \
358 CONST_OK_FOR_CONSTRAINT_P((x), 'J', "J")
359 #define CONST_OK_FOR_K(x) \
360 CONST_OK_FOR_CONSTRAINT_P((x), 'K', "K")
361 #define CONST_OK_FOR_Os(x) \
362 CONST_OK_FOR_CONSTRAINT_P((x), 'O', "Os")
363 #define CONST_OK_FOR_Op(x) \
364 CONST_OK_FOR_CONSTRAINT_P((x), 'O', "Op")
365 #define CONST_OK_FOR_On(x) \
366 CONST_OK_FOR_CONSTRAINT_P((x), 'O', "On")
368 #define REGNO_PAIR_OK(REGNO, MODE) \
369 (HARD_REGNO_NREGS ((REGNO), (MODE)) == 1 || !((REGNO) & 1))
371 /* That's the read ahead of the dynamic branch prediction unit in
372 bytes on a z10 (or higher) CPU. */
373 #define PREDICT_DISTANCE (TARGET_Z10 ? 384 : 2048)
375 /* Return the alignment for LABEL. We default to the -falign-labels
376 value except for the literal pool base label. */
378 s390_label_align (rtx label
)
380 rtx prev_insn
= prev_active_insn (label
);
382 if (prev_insn
== NULL_RTX
)
385 prev_insn
= single_set (prev_insn
);
387 if (prev_insn
== NULL_RTX
)
390 prev_insn
= SET_SRC (prev_insn
);
392 /* Don't align literal pool base labels. */
393 if (GET_CODE (prev_insn
) == UNSPEC
394 && XINT (prev_insn
, 1) == UNSPEC_MAIN_BASE
)
398 return align_labels_log
;
401 static enum machine_mode
402 s390_libgcc_cmp_return_mode (void)
404 return TARGET_64BIT
? DImode
: SImode
;
407 static enum machine_mode
408 s390_libgcc_shift_count_mode (void)
410 return TARGET_64BIT
? DImode
: SImode
;
413 static enum machine_mode
414 s390_unwind_word_mode (void)
416 return TARGET_64BIT
? DImode
: SImode
;
419 /* Return true if the back end supports mode MODE. */
421 s390_scalar_mode_supported_p (enum machine_mode mode
)
423 /* In contrast to the default implementation reject TImode constants on 31bit
424 TARGET_ZARCH for ABI compliance. */
425 if (!TARGET_64BIT
&& TARGET_ZARCH
&& mode
== TImode
)
428 if (DECIMAL_FLOAT_MODE_P (mode
))
429 return default_decimal_float_supported_p ();
431 return default_scalar_mode_supported_p (mode
);
434 /* Set the has_landing_pad_p flag in struct machine_function to VALUE. */
437 s390_set_has_landing_pad_p (bool value
)
439 cfun
->machine
->has_landing_pad_p
= value
;
442 /* If two condition code modes are compatible, return a condition code
443 mode which is compatible with both. Otherwise, return
446 static enum machine_mode
447 s390_cc_modes_compatible (enum machine_mode m1
, enum machine_mode m2
)
455 if (m2
== CCUmode
|| m2
== CCTmode
|| m2
== CCZ1mode
456 || m2
== CCSmode
|| m2
== CCSRmode
|| m2
== CCURmode
)
477 /* Return true if SET either doesn't set the CC register, or else
478 the source and destination have matching CC modes and that
479 CC mode is at least as constrained as REQ_MODE. */
482 s390_match_ccmode_set (rtx set
, enum machine_mode req_mode
)
484 enum machine_mode set_mode
;
486 gcc_assert (GET_CODE (set
) == SET
);
488 if (GET_CODE (SET_DEST (set
)) != REG
|| !CC_REGNO_P (REGNO (SET_DEST (set
))))
491 set_mode
= GET_MODE (SET_DEST (set
));
505 if (req_mode
!= set_mode
)
510 if (req_mode
!= CCSmode
&& req_mode
!= CCUmode
&& req_mode
!= CCTmode
511 && req_mode
!= CCSRmode
&& req_mode
!= CCURmode
)
517 if (req_mode
!= CCAmode
)
525 return (GET_MODE (SET_SRC (set
)) == set_mode
);
528 /* Return true if every SET in INSN that sets the CC register
529 has source and destination with matching CC modes and that
530 CC mode is at least as constrained as REQ_MODE.
531 If REQ_MODE is VOIDmode, always return false. */
534 s390_match_ccmode (rtx insn
, enum machine_mode req_mode
)
538 /* s390_tm_ccmode returns VOIDmode to indicate failure. */
539 if (req_mode
== VOIDmode
)
542 if (GET_CODE (PATTERN (insn
)) == SET
)
543 return s390_match_ccmode_set (PATTERN (insn
), req_mode
);
545 if (GET_CODE (PATTERN (insn
)) == PARALLEL
)
546 for (i
= 0; i
< XVECLEN (PATTERN (insn
), 0); i
++)
548 rtx set
= XVECEXP (PATTERN (insn
), 0, i
);
549 if (GET_CODE (set
) == SET
)
550 if (!s390_match_ccmode_set (set
, req_mode
))
557 /* If a test-under-mask instruction can be used to implement
558 (compare (and ... OP1) OP2), return the CC mode required
559 to do that. Otherwise, return VOIDmode.
560 MIXED is true if the instruction can distinguish between
561 CC1 and CC2 for mixed selected bits (TMxx), it is false
562 if the instruction cannot (TM). */
565 s390_tm_ccmode (rtx op1
, rtx op2
, bool mixed
)
569 /* ??? Fixme: should work on CONST_DOUBLE as well. */
570 if (GET_CODE (op1
) != CONST_INT
|| GET_CODE (op2
) != CONST_INT
)
573 /* Selected bits all zero: CC0.
574 e.g.: int a; if ((a & (16 + 128)) == 0) */
575 if (INTVAL (op2
) == 0)
578 /* Selected bits all one: CC3.
579 e.g.: int a; if ((a & (16 + 128)) == 16 + 128) */
580 if (INTVAL (op2
) == INTVAL (op1
))
583 /* Exactly two bits selected, mixed zeroes and ones: CC1 or CC2. e.g.:
585 if ((a & (16 + 128)) == 16) -> CCT1
586 if ((a & (16 + 128)) == 128) -> CCT2 */
589 bit1
= exact_log2 (INTVAL (op2
));
590 bit0
= exact_log2 (INTVAL (op1
) ^ INTVAL (op2
));
591 if (bit0
!= -1 && bit1
!= -1)
592 return bit0
> bit1
? CCT1mode
: CCT2mode
;
598 /* Given a comparison code OP (EQ, NE, etc.) and the operands
599 OP0 and OP1 of a COMPARE, return the mode to be used for the
603 s390_select_ccmode (enum rtx_code code
, rtx op0
, rtx op1
)
609 if ((GET_CODE (op0
) == NEG
|| GET_CODE (op0
) == ABS
)
610 && GET_MODE_CLASS (GET_MODE (op0
)) == MODE_INT
)
612 if (GET_CODE (op0
) == PLUS
&& GET_CODE (XEXP (op0
, 1)) == CONST_INT
613 && CONST_OK_FOR_K (INTVAL (XEXP (op0
, 1))))
615 if ((GET_CODE (op0
) == PLUS
|| GET_CODE (op0
) == MINUS
616 || GET_CODE (op1
) == NEG
)
617 && GET_MODE_CLASS (GET_MODE (op0
)) == MODE_INT
)
620 if (GET_CODE (op0
) == AND
)
622 /* Check whether we can potentially do it via TM. */
623 enum machine_mode ccmode
;
624 ccmode
= s390_tm_ccmode (XEXP (op0
, 1), op1
, 1);
625 if (ccmode
!= VOIDmode
)
627 /* Relax CCTmode to CCZmode to allow fall-back to AND
628 if that turns out to be beneficial. */
629 return ccmode
== CCTmode
? CCZmode
: ccmode
;
633 if (register_operand (op0
, HImode
)
634 && GET_CODE (op1
) == CONST_INT
635 && (INTVAL (op1
) == -1 || INTVAL (op1
) == 65535))
637 if (register_operand (op0
, QImode
)
638 && GET_CODE (op1
) == CONST_INT
639 && (INTVAL (op1
) == -1 || INTVAL (op1
) == 255))
648 /* The only overflow condition of NEG and ABS happens when
649 -INT_MAX is used as parameter, which stays negative. So
650 we have an overflow from a positive value to a negative.
651 Using CCAP mode the resulting cc can be used for comparisons. */
652 if ((GET_CODE (op0
) == NEG
|| GET_CODE (op0
) == ABS
)
653 && GET_MODE_CLASS (GET_MODE (op0
)) == MODE_INT
)
656 /* If constants are involved in an add instruction it is possible to use
657 the resulting cc for comparisons with zero. Knowing the sign of the
658 constant the overflow behavior gets predictable. e.g.:
659 int a, b; if ((b = a + c) > 0)
660 with c as a constant value: c < 0 -> CCAN and c >= 0 -> CCAP */
661 if (GET_CODE (op0
) == PLUS
&& GET_CODE (XEXP (op0
, 1)) == CONST_INT
662 && CONST_OK_FOR_K (INTVAL (XEXP (op0
, 1))))
664 if (INTVAL (XEXP((op0
), 1)) < 0)
678 if ((GET_CODE (op0
) == SIGN_EXTEND
|| GET_CODE (op0
) == ZERO_EXTEND
)
679 && GET_CODE (op1
) != CONST_INT
)
685 if (GET_CODE (op0
) == PLUS
686 && GET_MODE_CLASS (GET_MODE (op0
)) == MODE_INT
)
689 if ((GET_CODE (op0
) == SIGN_EXTEND
|| GET_CODE (op0
) == ZERO_EXTEND
)
690 && GET_CODE (op1
) != CONST_INT
)
696 if (GET_CODE (op0
) == MINUS
697 && GET_MODE_CLASS (GET_MODE (op0
)) == MODE_INT
)
700 if ((GET_CODE (op0
) == SIGN_EXTEND
|| GET_CODE (op0
) == ZERO_EXTEND
)
701 && GET_CODE (op1
) != CONST_INT
)
710 /* Replace the comparison OP0 CODE OP1 by a semantically equivalent one
711 that we can implement more efficiently. */
714 s390_canonicalize_comparison (enum rtx_code
*code
, rtx
*op0
, rtx
*op1
)
716 /* Convert ZERO_EXTRACT back to AND to enable TM patterns. */
717 if ((*code
== EQ
|| *code
== NE
)
718 && *op1
== const0_rtx
719 && GET_CODE (*op0
) == ZERO_EXTRACT
720 && GET_CODE (XEXP (*op0
, 1)) == CONST_INT
721 && GET_CODE (XEXP (*op0
, 2)) == CONST_INT
722 && SCALAR_INT_MODE_P (GET_MODE (XEXP (*op0
, 0))))
724 rtx inner
= XEXP (*op0
, 0);
725 HOST_WIDE_INT modesize
= GET_MODE_BITSIZE (GET_MODE (inner
));
726 HOST_WIDE_INT len
= INTVAL (XEXP (*op0
, 1));
727 HOST_WIDE_INT pos
= INTVAL (XEXP (*op0
, 2));
729 if (len
> 0 && len
< modesize
730 && pos
>= 0 && pos
+ len
<= modesize
731 && modesize
<= HOST_BITS_PER_WIDE_INT
)
733 unsigned HOST_WIDE_INT block
;
734 block
= ((unsigned HOST_WIDE_INT
) 1 << len
) - 1;
735 block
<<= modesize
- pos
- len
;
737 *op0
= gen_rtx_AND (GET_MODE (inner
), inner
,
738 gen_int_mode (block
, GET_MODE (inner
)));
742 /* Narrow AND of memory against immediate to enable TM. */
743 if ((*code
== EQ
|| *code
== NE
)
744 && *op1
== const0_rtx
745 && GET_CODE (*op0
) == AND
746 && GET_CODE (XEXP (*op0
, 1)) == CONST_INT
747 && SCALAR_INT_MODE_P (GET_MODE (XEXP (*op0
, 0))))
749 rtx inner
= XEXP (*op0
, 0);
750 rtx mask
= XEXP (*op0
, 1);
752 /* Ignore paradoxical SUBREGs if all extra bits are masked out. */
753 if (GET_CODE (inner
) == SUBREG
754 && SCALAR_INT_MODE_P (GET_MODE (SUBREG_REG (inner
)))
755 && (GET_MODE_SIZE (GET_MODE (inner
))
756 >= GET_MODE_SIZE (GET_MODE (SUBREG_REG (inner
))))
758 & GET_MODE_MASK (GET_MODE (inner
))
759 & ~GET_MODE_MASK (GET_MODE (SUBREG_REG (inner
))))
761 inner
= SUBREG_REG (inner
);
763 /* Do not change volatile MEMs. */
764 if (MEM_P (inner
) && !MEM_VOLATILE_P (inner
))
766 int part
= s390_single_part (XEXP (*op0
, 1),
767 GET_MODE (inner
), QImode
, 0);
770 mask
= gen_int_mode (s390_extract_part (mask
, QImode
, 0), QImode
);
771 inner
= adjust_address_nv (inner
, QImode
, part
);
772 *op0
= gen_rtx_AND (QImode
, inner
, mask
);
777 /* Narrow comparisons against 0xffff to HImode if possible. */
778 if ((*code
== EQ
|| *code
== NE
)
779 && GET_CODE (*op1
) == CONST_INT
780 && INTVAL (*op1
) == 0xffff
781 && SCALAR_INT_MODE_P (GET_MODE (*op0
))
782 && (nonzero_bits (*op0
, GET_MODE (*op0
))
783 & ~(unsigned HOST_WIDE_INT
) 0xffff) == 0)
785 *op0
= gen_lowpart (HImode
, *op0
);
789 /* Remove redundant UNSPEC_CCU_TO_INT conversions if possible. */
790 if (GET_CODE (*op0
) == UNSPEC
791 && XINT (*op0
, 1) == UNSPEC_CCU_TO_INT
792 && XVECLEN (*op0
, 0) == 1
793 && GET_MODE (XVECEXP (*op0
, 0, 0)) == CCUmode
794 && GET_CODE (XVECEXP (*op0
, 0, 0)) == REG
795 && REGNO (XVECEXP (*op0
, 0, 0)) == CC_REGNUM
796 && *op1
== const0_rtx
)
798 enum rtx_code new_code
= UNKNOWN
;
801 case EQ
: new_code
= EQ
; break;
802 case NE
: new_code
= NE
; break;
803 case LT
: new_code
= GTU
; break;
804 case GT
: new_code
= LTU
; break;
805 case LE
: new_code
= GEU
; break;
806 case GE
: new_code
= LEU
; break;
810 if (new_code
!= UNKNOWN
)
812 *op0
= XVECEXP (*op0
, 0, 0);
817 /* Remove redundant UNSPEC_CCZ_TO_INT conversions if possible. */
818 if (GET_CODE (*op0
) == UNSPEC
819 && XINT (*op0
, 1) == UNSPEC_CCZ_TO_INT
820 && XVECLEN (*op0
, 0) == 1
821 && GET_MODE (XVECEXP (*op0
, 0, 0)) == CCZmode
822 && GET_CODE (XVECEXP (*op0
, 0, 0)) == REG
823 && REGNO (XVECEXP (*op0
, 0, 0)) == CC_REGNUM
824 && *op1
== const0_rtx
)
826 enum rtx_code new_code
= UNKNOWN
;
829 case EQ
: new_code
= EQ
; break;
830 case NE
: new_code
= NE
; break;
834 if (new_code
!= UNKNOWN
)
836 *op0
= XVECEXP (*op0
, 0, 0);
841 /* Simplify cascaded EQ, NE with const0_rtx. */
842 if ((*code
== NE
|| *code
== EQ
)
843 && (GET_CODE (*op0
) == EQ
|| GET_CODE (*op0
) == NE
)
844 && GET_MODE (*op0
) == SImode
845 && GET_MODE (XEXP (*op0
, 0)) == CCZ1mode
846 && REG_P (XEXP (*op0
, 0))
847 && XEXP (*op0
, 1) == const0_rtx
848 && *op1
== const0_rtx
)
850 if ((*code
== EQ
&& GET_CODE (*op0
) == NE
)
851 || (*code
== NE
&& GET_CODE (*op0
) == EQ
))
855 *op0
= XEXP (*op0
, 0);
858 /* Prefer register over memory as first operand. */
859 if (MEM_P (*op0
) && REG_P (*op1
))
861 rtx tem
= *op0
; *op0
= *op1
; *op1
= tem
;
862 *code
= swap_condition (*code
);
866 /* Emit a compare instruction suitable to implement the comparison
867 OP0 CODE OP1. Return the correct condition RTL to be placed in
868 the IF_THEN_ELSE of the conditional branch testing the result. */
871 s390_emit_compare (enum rtx_code code
, rtx op0
, rtx op1
)
873 enum machine_mode mode
= s390_select_ccmode (code
, op0
, op1
);
876 /* Do not output a redundant compare instruction if a compare_and_swap
877 pattern already computed the result and the machine modes are compatible. */
878 if (GET_MODE_CLASS (GET_MODE (op0
)) == MODE_CC
)
880 gcc_assert (s390_cc_modes_compatible (GET_MODE (op0
), mode
)
886 cc
= gen_rtx_REG (mode
, CC_REGNUM
);
887 emit_insn (gen_rtx_SET (VOIDmode
, cc
, gen_rtx_COMPARE (mode
, op0
, op1
)));
890 return gen_rtx_fmt_ee (code
, VOIDmode
, cc
, const0_rtx
);
893 /* Emit a SImode compare and swap instruction setting MEM to NEW_RTX if OLD
895 Return the correct condition RTL to be placed in the IF_THEN_ELSE of the
896 conditional branch testing the result. */
899 s390_emit_compare_and_swap (enum rtx_code code
, rtx old
, rtx mem
,
900 rtx cmp
, rtx new_rtx
)
902 emit_insn (gen_atomic_compare_and_swapsi_internal (old
, mem
, cmp
, new_rtx
));
903 return s390_emit_compare (code
, gen_rtx_REG (CCZ1mode
, CC_REGNUM
),
907 /* Emit a jump instruction to TARGET. If COND is NULL_RTX, emit an
908 unconditional jump, else a conditional jump under condition COND. */
911 s390_emit_jump (rtx target
, rtx cond
)
915 target
= gen_rtx_LABEL_REF (VOIDmode
, target
);
917 target
= gen_rtx_IF_THEN_ELSE (VOIDmode
, cond
, target
, pc_rtx
);
919 insn
= gen_rtx_SET (VOIDmode
, pc_rtx
, target
);
920 emit_jump_insn (insn
);
923 /* Return branch condition mask to implement a branch
924 specified by CODE. Return -1 for invalid comparisons. */
927 s390_branch_condition_mask (rtx code
)
929 const int CC0
= 1 << 3;
930 const int CC1
= 1 << 2;
931 const int CC2
= 1 << 1;
932 const int CC3
= 1 << 0;
934 gcc_assert (GET_CODE (XEXP (code
, 0)) == REG
);
935 gcc_assert (REGNO (XEXP (code
, 0)) == CC_REGNUM
);
936 gcc_assert (XEXP (code
, 1) == const0_rtx
);
938 switch (GET_MODE (XEXP (code
, 0)))
942 switch (GET_CODE (code
))
945 case NE
: return CC1
| CC2
| CC3
;
951 switch (GET_CODE (code
))
954 case NE
: return CC0
| CC2
| CC3
;
960 switch (GET_CODE (code
))
963 case NE
: return CC0
| CC1
| CC3
;
969 switch (GET_CODE (code
))
972 case NE
: return CC0
| CC1
| CC2
;
978 switch (GET_CODE (code
))
980 case EQ
: return CC0
| CC2
;
981 case NE
: return CC1
| CC3
;
987 switch (GET_CODE (code
))
989 case LTU
: return CC2
| CC3
; /* carry */
990 case GEU
: return CC0
| CC1
; /* no carry */
996 switch (GET_CODE (code
))
998 case GTU
: return CC0
| CC1
; /* borrow */
999 case LEU
: return CC2
| CC3
; /* no borrow */
1005 switch (GET_CODE (code
))
1007 case EQ
: return CC0
| CC2
;
1008 case NE
: return CC1
| CC3
;
1009 case LTU
: return CC1
;
1010 case GTU
: return CC3
;
1011 case LEU
: return CC1
| CC2
;
1012 case GEU
: return CC2
| CC3
;
1017 switch (GET_CODE (code
))
1019 case EQ
: return CC0
;
1020 case NE
: return CC1
| CC2
| CC3
;
1021 case LTU
: return CC1
;
1022 case GTU
: return CC2
;
1023 case LEU
: return CC0
| CC1
;
1024 case GEU
: return CC0
| CC2
;
1030 switch (GET_CODE (code
))
1032 case EQ
: return CC0
;
1033 case NE
: return CC2
| CC1
| CC3
;
1034 case LTU
: return CC2
;
1035 case GTU
: return CC1
;
1036 case LEU
: return CC0
| CC2
;
1037 case GEU
: return CC0
| CC1
;
1043 switch (GET_CODE (code
))
1045 case EQ
: return CC0
;
1046 case NE
: return CC1
| CC2
| CC3
;
1047 case LT
: return CC1
| CC3
;
1048 case GT
: return CC2
;
1049 case LE
: return CC0
| CC1
| CC3
;
1050 case GE
: return CC0
| CC2
;
1056 switch (GET_CODE (code
))
1058 case EQ
: return CC0
;
1059 case NE
: return CC1
| CC2
| CC3
;
1060 case LT
: return CC1
;
1061 case GT
: return CC2
| CC3
;
1062 case LE
: return CC0
| CC1
;
1063 case GE
: return CC0
| CC2
| CC3
;
1069 switch (GET_CODE (code
))
1071 case EQ
: return CC0
;
1072 case NE
: return CC1
| CC2
| CC3
;
1073 case LT
: return CC1
;
1074 case GT
: return CC2
;
1075 case LE
: return CC0
| CC1
;
1076 case GE
: return CC0
| CC2
;
1077 case UNORDERED
: return CC3
;
1078 case ORDERED
: return CC0
| CC1
| CC2
;
1079 case UNEQ
: return CC0
| CC3
;
1080 case UNLT
: return CC1
| CC3
;
1081 case UNGT
: return CC2
| CC3
;
1082 case UNLE
: return CC0
| CC1
| CC3
;
1083 case UNGE
: return CC0
| CC2
| CC3
;
1084 case LTGT
: return CC1
| CC2
;
1090 switch (GET_CODE (code
))
1092 case EQ
: return CC0
;
1093 case NE
: return CC2
| CC1
| CC3
;
1094 case LT
: return CC2
;
1095 case GT
: return CC1
;
1096 case LE
: return CC0
| CC2
;
1097 case GE
: return CC0
| CC1
;
1098 case UNORDERED
: return CC3
;
1099 case ORDERED
: return CC0
| CC2
| CC1
;
1100 case UNEQ
: return CC0
| CC3
;
1101 case UNLT
: return CC2
| CC3
;
1102 case UNGT
: return CC1
| CC3
;
1103 case UNLE
: return CC0
| CC2
| CC3
;
1104 case UNGE
: return CC0
| CC1
| CC3
;
1105 case LTGT
: return CC2
| CC1
;
1116 /* Return branch condition mask to implement a compare and branch
1117 specified by CODE. Return -1 for invalid comparisons. */
1120 s390_compare_and_branch_condition_mask (rtx code
)
1122 const int CC0
= 1 << 3;
1123 const int CC1
= 1 << 2;
1124 const int CC2
= 1 << 1;
1126 switch (GET_CODE (code
))
1150 /* If INV is false, return assembler mnemonic string to implement
1151 a branch specified by CODE. If INV is true, return mnemonic
1152 for the corresponding inverted branch. */
1155 s390_branch_condition_mnemonic (rtx code
, int inv
)
1159 static const char *const mnemonic
[16] =
1161 NULL
, "o", "h", "nle",
1162 "l", "nhe", "lh", "ne",
1163 "e", "nlh", "he", "nl",
1164 "le", "nh", "no", NULL
1167 if (GET_CODE (XEXP (code
, 0)) == REG
1168 && REGNO (XEXP (code
, 0)) == CC_REGNUM
1169 && XEXP (code
, 1) == const0_rtx
)
1170 mask
= s390_branch_condition_mask (code
);
1172 mask
= s390_compare_and_branch_condition_mask (code
);
1174 gcc_assert (mask
>= 0);
1179 gcc_assert (mask
>= 1 && mask
<= 14);
1181 return mnemonic
[mask
];
1184 /* Return the part of op which has a value different from def.
1185 The size of the part is determined by mode.
1186 Use this function only if you already know that op really
1187 contains such a part. */
1189 unsigned HOST_WIDE_INT
1190 s390_extract_part (rtx op
, enum machine_mode mode
, int def
)
1192 unsigned HOST_WIDE_INT value
= 0;
1193 int max_parts
= HOST_BITS_PER_WIDE_INT
/ GET_MODE_BITSIZE (mode
);
1194 int part_bits
= GET_MODE_BITSIZE (mode
);
1195 unsigned HOST_WIDE_INT part_mask
1196 = ((unsigned HOST_WIDE_INT
)1 << part_bits
) - 1;
1199 for (i
= 0; i
< max_parts
; i
++)
1202 value
= (unsigned HOST_WIDE_INT
) INTVAL (op
);
1204 value
>>= part_bits
;
1206 if ((value
& part_mask
) != (def
& part_mask
))
1207 return value
& part_mask
;
1213 /* If OP is an integer constant of mode MODE with exactly one
1214 part of mode PART_MODE unequal to DEF, return the number of that
1215 part. Otherwise, return -1. */
1218 s390_single_part (rtx op
,
1219 enum machine_mode mode
,
1220 enum machine_mode part_mode
,
1223 unsigned HOST_WIDE_INT value
= 0;
1224 int n_parts
= GET_MODE_SIZE (mode
) / GET_MODE_SIZE (part_mode
);
1225 unsigned HOST_WIDE_INT part_mask
1226 = ((unsigned HOST_WIDE_INT
)1 << GET_MODE_BITSIZE (part_mode
)) - 1;
1229 if (GET_CODE (op
) != CONST_INT
)
1232 for (i
= 0; i
< n_parts
; i
++)
1235 value
= (unsigned HOST_WIDE_INT
) INTVAL (op
);
1237 value
>>= GET_MODE_BITSIZE (part_mode
);
1239 if ((value
& part_mask
) != (def
& part_mask
))
1247 return part
== -1 ? -1 : n_parts
- 1 - part
;
1250 /* Return true if IN contains a contiguous bitfield in the lower SIZE
1251 bits and no other bits are set in IN. POS and LENGTH can be used
1252 to obtain the start position and the length of the bitfield.
1254 POS gives the position of the first bit of the bitfield counting
1255 from the lowest order bit starting with zero. In order to use this
1256 value for S/390 instructions this has to be converted to "bits big
1260 s390_contiguous_bitmask_p (unsigned HOST_WIDE_INT in
, int size
,
1261 int *pos
, int *length
)
1266 unsigned HOST_WIDE_INT mask
= 1ULL;
1267 bool contiguous
= false;
1269 for (i
= 0; i
< size
; mask
<<= 1, i
++)
1293 /* Calculate a mask for all bits beyond the contiguous bits. */
1294 mask
= (-1LL & ~(((1ULL << (tmp_length
+ tmp_pos
- 1)) << 1) - 1));
1299 if (tmp_length
+ tmp_pos
- 1 > size
)
1303 *length
= tmp_length
;
1311 /* Check whether we can (and want to) split a double-word
1312 move in mode MODE from SRC to DST into two single-word
1313 moves, moving the subword FIRST_SUBWORD first. */
1316 s390_split_ok_p (rtx dst
, rtx src
, enum machine_mode mode
, int first_subword
)
1318 /* Floating point registers cannot be split. */
1319 if (FP_REG_P (src
) || FP_REG_P (dst
))
1322 /* We don't need to split if operands are directly accessible. */
1323 if (s_operand (src
, mode
) || s_operand (dst
, mode
))
1326 /* Non-offsettable memory references cannot be split. */
1327 if ((GET_CODE (src
) == MEM
&& !offsettable_memref_p (src
))
1328 || (GET_CODE (dst
) == MEM
&& !offsettable_memref_p (dst
)))
1331 /* Moving the first subword must not clobber a register
1332 needed to move the second subword. */
1333 if (register_operand (dst
, mode
))
1335 rtx subreg
= operand_subword (dst
, first_subword
, 0, mode
);
1336 if (reg_overlap_mentioned_p (subreg
, src
))
1343 /* Return true if it can be proven that [MEM1, MEM1 + SIZE]
1344 and [MEM2, MEM2 + SIZE] do overlap and false
1348 s390_overlap_p (rtx mem1
, rtx mem2
, HOST_WIDE_INT size
)
1350 rtx addr1
, addr2
, addr_delta
;
1351 HOST_WIDE_INT delta
;
1353 if (GET_CODE (mem1
) != MEM
|| GET_CODE (mem2
) != MEM
)
1359 addr1
= XEXP (mem1
, 0);
1360 addr2
= XEXP (mem2
, 0);
1362 addr_delta
= simplify_binary_operation (MINUS
, Pmode
, addr2
, addr1
);
1364 /* This overlapping check is used by peepholes merging memory block operations.
1365 Overlapping operations would otherwise be recognized by the S/390 hardware
1366 and would fall back to a slower implementation. Allowing overlapping
1367 operations would lead to slow code but not to wrong code. Therefore we are
1368 somewhat optimistic if we cannot prove that the memory blocks are
1370 That's why we return false here although this may accept operations on
1371 overlapping memory areas. */
1372 if (!addr_delta
|| GET_CODE (addr_delta
) != CONST_INT
)
1375 delta
= INTVAL (addr_delta
);
1378 || (delta
> 0 && delta
< size
)
1379 || (delta
< 0 && -delta
< size
))
1385 /* Check whether the address of memory reference MEM2 equals exactly
1386 the address of memory reference MEM1 plus DELTA. Return true if
1387 we can prove this to be the case, false otherwise. */
1390 s390_offset_p (rtx mem1
, rtx mem2
, rtx delta
)
1392 rtx addr1
, addr2
, addr_delta
;
1394 if (GET_CODE (mem1
) != MEM
|| GET_CODE (mem2
) != MEM
)
1397 addr1
= XEXP (mem1
, 0);
1398 addr2
= XEXP (mem2
, 0);
1400 addr_delta
= simplify_binary_operation (MINUS
, Pmode
, addr2
, addr1
);
1401 if (!addr_delta
|| !rtx_equal_p (addr_delta
, delta
))
1407 /* Expand logical operator CODE in mode MODE with operands OPERANDS. */
1410 s390_expand_logical_operator (enum rtx_code code
, enum machine_mode mode
,
1413 enum machine_mode wmode
= mode
;
1414 rtx dst
= operands
[0];
1415 rtx src1
= operands
[1];
1416 rtx src2
= operands
[2];
1419 /* If we cannot handle the operation directly, use a temp register. */
1420 if (!s390_logical_operator_ok_p (operands
))
1421 dst
= gen_reg_rtx (mode
);
1423 /* QImode and HImode patterns make sense only if we have a destination
1424 in memory. Otherwise perform the operation in SImode. */
1425 if ((mode
== QImode
|| mode
== HImode
) && GET_CODE (dst
) != MEM
)
1428 /* Widen operands if required. */
1431 if (GET_CODE (dst
) == SUBREG
1432 && (tem
= simplify_subreg (wmode
, dst
, mode
, 0)) != 0)
1434 else if (REG_P (dst
))
1435 dst
= gen_rtx_SUBREG (wmode
, dst
, 0);
1437 dst
= gen_reg_rtx (wmode
);
1439 if (GET_CODE (src1
) == SUBREG
1440 && (tem
= simplify_subreg (wmode
, src1
, mode
, 0)) != 0)
1442 else if (GET_MODE (src1
) != VOIDmode
)
1443 src1
= gen_rtx_SUBREG (wmode
, force_reg (mode
, src1
), 0);
1445 if (GET_CODE (src2
) == SUBREG
1446 && (tem
= simplify_subreg (wmode
, src2
, mode
, 0)) != 0)
1448 else if (GET_MODE (src2
) != VOIDmode
)
1449 src2
= gen_rtx_SUBREG (wmode
, force_reg (mode
, src2
), 0);
1452 /* Emit the instruction. */
1453 op
= gen_rtx_SET (VOIDmode
, dst
, gen_rtx_fmt_ee (code
, wmode
, src1
, src2
));
1454 clob
= gen_rtx_CLOBBER (VOIDmode
, gen_rtx_REG (CCmode
, CC_REGNUM
));
1455 emit_insn (gen_rtx_PARALLEL (VOIDmode
, gen_rtvec (2, op
, clob
)));
1457 /* Fix up the destination if needed. */
1458 if (dst
!= operands
[0])
1459 emit_move_insn (operands
[0], gen_lowpart (mode
, dst
));
1462 /* Check whether OPERANDS are OK for a logical operation (AND, IOR, XOR). */
1465 s390_logical_operator_ok_p (rtx
*operands
)
1467 /* If the destination operand is in memory, it needs to coincide
1468 with one of the source operands. After reload, it has to be
1469 the first source operand. */
1470 if (GET_CODE (operands
[0]) == MEM
)
1471 return rtx_equal_p (operands
[0], operands
[1])
1472 || (!reload_completed
&& rtx_equal_p (operands
[0], operands
[2]));
1477 /* Narrow logical operation CODE of memory operand MEMOP with immediate
1478 operand IMMOP to switch from SS to SI type instructions. */
1481 s390_narrow_logical_operator (enum rtx_code code
, rtx
*memop
, rtx
*immop
)
1483 int def
= code
== AND
? -1 : 0;
1487 gcc_assert (GET_CODE (*memop
) == MEM
);
1488 gcc_assert (!MEM_VOLATILE_P (*memop
));
1490 mask
= s390_extract_part (*immop
, QImode
, def
);
1491 part
= s390_single_part (*immop
, GET_MODE (*memop
), QImode
, def
);
1492 gcc_assert (part
>= 0);
1494 *memop
= adjust_address (*memop
, QImode
, part
);
1495 *immop
= gen_int_mode (mask
, QImode
);
1499 /* How to allocate a 'struct machine_function'. */
1501 static struct machine_function
*
1502 s390_init_machine_status (void)
1504 return ggc_alloc_cleared_machine_function ();
1508 s390_option_override (void)
1510 /* Set up function hooks. */
1511 init_machine_status
= s390_init_machine_status
;
1513 /* Architecture mode defaults according to ABI. */
1514 if (!(target_flags_explicit
& MASK_ZARCH
))
1517 target_flags
|= MASK_ZARCH
;
1519 target_flags
&= ~MASK_ZARCH
;
1522 /* Set the march default in case it hasn't been specified on
1524 if (s390_arch
== PROCESSOR_max
)
1526 s390_arch_string
= TARGET_ZARCH
? "z900" : "g5";
1527 s390_arch
= TARGET_ZARCH
? PROCESSOR_2064_Z900
: PROCESSOR_9672_G5
;
1528 s390_arch_flags
= processor_flags_table
[(int)s390_arch
];
1531 /* Determine processor to tune for. */
1532 if (s390_tune
== PROCESSOR_max
)
1534 s390_tune
= s390_arch
;
1535 s390_tune_flags
= s390_arch_flags
;
1538 /* Sanity checks. */
1539 if (TARGET_ZARCH
&& !TARGET_CPU_ZARCH
)
1540 error ("z/Architecture mode not supported on %s", s390_arch_string
);
1541 if (TARGET_64BIT
&& !TARGET_ZARCH
)
1542 error ("64-bit ABI not supported in ESA/390 mode");
1544 /* Use hardware DFP if available and not explicitly disabled by
1545 user. E.g. with -m31 -march=z10 -mzarch */
1546 if (!(target_flags_explicit
& MASK_HARD_DFP
) && TARGET_DFP
)
1547 target_flags
|= MASK_HARD_DFP
;
1549 if (TARGET_HARD_DFP
&& !TARGET_DFP
)
1551 if (target_flags_explicit
& MASK_HARD_DFP
)
1553 if (!TARGET_CPU_DFP
)
1554 error ("hardware decimal floating point instructions"
1555 " not available on %s", s390_arch_string
);
1557 error ("hardware decimal floating point instructions"
1558 " not available in ESA/390 mode");
1561 target_flags
&= ~MASK_HARD_DFP
;
1564 if ((target_flags_explicit
& MASK_SOFT_FLOAT
) && TARGET_SOFT_FLOAT
)
1566 if ((target_flags_explicit
& MASK_HARD_DFP
) && TARGET_HARD_DFP
)
1567 error ("-mhard-dfp can%'t be used in conjunction with -msoft-float");
1569 target_flags
&= ~MASK_HARD_DFP
;
1572 /* Set processor cost function. */
1575 case PROCESSOR_2084_Z990
:
1576 s390_cost
= &z990_cost
;
1578 case PROCESSOR_2094_Z9_109
:
1579 s390_cost
= &z9_109_cost
;
1581 case PROCESSOR_2097_Z10
:
1582 s390_cost
= &z10_cost
;
1583 case PROCESSOR_2817_Z196
:
1584 s390_cost
= &z196_cost
;
1587 s390_cost
= &z900_cost
;
1590 if (TARGET_BACKCHAIN
&& TARGET_PACKED_STACK
&& TARGET_HARD_FLOAT
)
1591 error ("-mbackchain -mpacked-stack -mhard-float are not supported "
1594 if (s390_stack_size
)
1596 if (s390_stack_guard
>= s390_stack_size
)
1597 error ("stack size must be greater than the stack guard value");
1598 else if (s390_stack_size
> 1 << 16)
1599 error ("stack size must not be greater than 64k");
1601 else if (s390_stack_guard
)
1602 error ("-mstack-guard implies use of -mstack-size");
1604 #ifdef TARGET_DEFAULT_LONG_DOUBLE_128
1605 if (!(target_flags_explicit
& MASK_LONG_DOUBLE_128
))
1606 target_flags
|= MASK_LONG_DOUBLE_128
;
1609 if (s390_tune
== PROCESSOR_2097_Z10
1610 || s390_tune
== PROCESSOR_2817_Z196
)
1612 maybe_set_param_value (PARAM_MAX_UNROLLED_INSNS
, 100,
1613 global_options
.x_param_values
,
1614 global_options_set
.x_param_values
);
1615 maybe_set_param_value (PARAM_MAX_UNROLL_TIMES
, 32,
1616 global_options
.x_param_values
,
1617 global_options_set
.x_param_values
);
1618 maybe_set_param_value (PARAM_MAX_COMPLETELY_PEELED_INSNS
, 2000,
1619 global_options
.x_param_values
,
1620 global_options_set
.x_param_values
);
1621 maybe_set_param_value (PARAM_MAX_COMPLETELY_PEEL_TIMES
, 64,
1622 global_options
.x_param_values
,
1623 global_options_set
.x_param_values
);
1626 maybe_set_param_value (PARAM_MAX_PENDING_LIST_LENGTH
, 256,
1627 global_options
.x_param_values
,
1628 global_options_set
.x_param_values
);
1629 /* values for loop prefetching */
1630 maybe_set_param_value (PARAM_L1_CACHE_LINE_SIZE
, 256,
1631 global_options
.x_param_values
,
1632 global_options_set
.x_param_values
);
1633 maybe_set_param_value (PARAM_L1_CACHE_SIZE
, 128,
1634 global_options
.x_param_values
,
1635 global_options_set
.x_param_values
);
1636 /* s390 has more than 2 levels and the size is much larger. Since
1637 we are always running virtualized assume that we only get a small
1638 part of the caches above l1. */
1639 maybe_set_param_value (PARAM_L2_CACHE_SIZE
, 1500,
1640 global_options
.x_param_values
,
1641 global_options_set
.x_param_values
);
1642 maybe_set_param_value (PARAM_PREFETCH_MIN_INSN_TO_MEM_RATIO
, 2,
1643 global_options
.x_param_values
,
1644 global_options_set
.x_param_values
);
1645 maybe_set_param_value (PARAM_SIMULTANEOUS_PREFETCHES
, 6,
1646 global_options
.x_param_values
,
1647 global_options_set
.x_param_values
);
1649 /* This cannot reside in s390_option_optimization_table since HAVE_prefetch
1650 requires the arch flags to be evaluated already. Since prefetching
1651 is beneficial on s390, we enable it if available. */
1652 if (flag_prefetch_loop_arrays
< 0 && HAVE_prefetch
&& optimize
>= 3)
1653 flag_prefetch_loop_arrays
= 1;
1655 /* Use the alternative scheduling-pressure algorithm by default. */
1656 maybe_set_param_value (PARAM_SCHED_PRESSURE_ALGORITHM
, 2,
1657 global_options
.x_param_values
,
1658 global_options_set
.x_param_values
);
1662 /* Don't emit DWARF3/4 unless specifically selected. The TPF
1663 debuggers do not yet support DWARF 3/4. */
1664 if (!global_options_set
.x_dwarf_strict
)
1666 if (!global_options_set
.x_dwarf_version
)
1671 /* Map for smallest class containing reg regno. */
1673 const enum reg_class regclass_map
[FIRST_PSEUDO_REGISTER
] =
1674 { GENERAL_REGS
, ADDR_REGS
, ADDR_REGS
, ADDR_REGS
,
1675 ADDR_REGS
, ADDR_REGS
, ADDR_REGS
, ADDR_REGS
,
1676 ADDR_REGS
, ADDR_REGS
, ADDR_REGS
, ADDR_REGS
,
1677 ADDR_REGS
, ADDR_REGS
, ADDR_REGS
, ADDR_REGS
,
1678 FP_REGS
, FP_REGS
, FP_REGS
, FP_REGS
,
1679 FP_REGS
, FP_REGS
, FP_REGS
, FP_REGS
,
1680 FP_REGS
, FP_REGS
, FP_REGS
, FP_REGS
,
1681 FP_REGS
, FP_REGS
, FP_REGS
, FP_REGS
,
1682 ADDR_REGS
, CC_REGS
, ADDR_REGS
, ADDR_REGS
,
1683 ACCESS_REGS
, ACCESS_REGS
1686 /* Return attribute type of insn. */
1688 static enum attr_type
1689 s390_safe_attr_type (rtx insn
)
1691 if (recog_memoized (insn
) >= 0)
1692 return get_attr_type (insn
);
1697 /* Return true if DISP is a valid short displacement. */
1700 s390_short_displacement (rtx disp
)
1702 /* No displacement is OK. */
1706 /* Without the long displacement facility we don't need to
1707 distingiush between long and short displacement. */
1708 if (!TARGET_LONG_DISPLACEMENT
)
1711 /* Integer displacement in range. */
1712 if (GET_CODE (disp
) == CONST_INT
)
1713 return INTVAL (disp
) >= 0 && INTVAL (disp
) < 4096;
1715 /* GOT offset is not OK, the GOT can be large. */
1716 if (GET_CODE (disp
) == CONST
1717 && GET_CODE (XEXP (disp
, 0)) == UNSPEC
1718 && (XINT (XEXP (disp
, 0), 1) == UNSPEC_GOT
1719 || XINT (XEXP (disp
, 0), 1) == UNSPEC_GOTNTPOFF
))
1722 /* All other symbolic constants are literal pool references,
1723 which are OK as the literal pool must be small. */
1724 if (GET_CODE (disp
) == CONST
)
1730 /* Decompose a RTL expression ADDR for a memory address into
1731 its components, returned in OUT.
1733 Returns false if ADDR is not a valid memory address, true
1734 otherwise. If OUT is NULL, don't return the components,
1735 but check for validity only.
1737 Note: Only addresses in canonical form are recognized.
1738 LEGITIMIZE_ADDRESS should convert non-canonical forms to the
1739 canonical form so that they will be recognized. */
1742 s390_decompose_address (rtx addr
, struct s390_address
*out
)
1744 HOST_WIDE_INT offset
= 0;
1745 rtx base
= NULL_RTX
;
1746 rtx indx
= NULL_RTX
;
1747 rtx disp
= NULL_RTX
;
1749 bool pointer
= false;
1750 bool base_ptr
= false;
1751 bool indx_ptr
= false;
1752 bool literal_pool
= false;
1754 /* We may need to substitute the literal pool base register into the address
1755 below. However, at this point we do not know which register is going to
1756 be used as base, so we substitute the arg pointer register. This is going
1757 to be treated as holding a pointer below -- it shouldn't be used for any
1759 rtx fake_pool_base
= gen_rtx_REG (Pmode
, ARG_POINTER_REGNUM
);
1761 /* Decompose address into base + index + displacement. */
1763 if (GET_CODE (addr
) == REG
|| GET_CODE (addr
) == UNSPEC
)
1766 else if (GET_CODE (addr
) == PLUS
)
1768 rtx op0
= XEXP (addr
, 0);
1769 rtx op1
= XEXP (addr
, 1);
1770 enum rtx_code code0
= GET_CODE (op0
);
1771 enum rtx_code code1
= GET_CODE (op1
);
1773 if (code0
== REG
|| code0
== UNSPEC
)
1775 if (code1
== REG
|| code1
== UNSPEC
)
1777 indx
= op0
; /* index + base */
1783 base
= op0
; /* base + displacement */
1788 else if (code0
== PLUS
)
1790 indx
= XEXP (op0
, 0); /* index + base + disp */
1791 base
= XEXP (op0
, 1);
1802 disp
= addr
; /* displacement */
1804 /* Extract integer part of displacement. */
1808 if (GET_CODE (disp
) == CONST_INT
)
1810 offset
= INTVAL (disp
);
1813 else if (GET_CODE (disp
) == CONST
1814 && GET_CODE (XEXP (disp
, 0)) == PLUS
1815 && GET_CODE (XEXP (XEXP (disp
, 0), 1)) == CONST_INT
)
1817 offset
= INTVAL (XEXP (XEXP (disp
, 0), 1));
1818 disp
= XEXP (XEXP (disp
, 0), 0);
1822 /* Strip off CONST here to avoid special case tests later. */
1823 if (disp
&& GET_CODE (disp
) == CONST
)
1824 disp
= XEXP (disp
, 0);
1826 /* We can convert literal pool addresses to
1827 displacements by basing them off the base register. */
1828 if (disp
&& GET_CODE (disp
) == SYMBOL_REF
&& CONSTANT_POOL_ADDRESS_P (disp
))
1830 /* Either base or index must be free to hold the base register. */
1832 base
= fake_pool_base
, literal_pool
= true;
1834 indx
= fake_pool_base
, literal_pool
= true;
1838 /* Mark up the displacement. */
1839 disp
= gen_rtx_UNSPEC (Pmode
, gen_rtvec (1, disp
),
1840 UNSPEC_LTREL_OFFSET
);
1843 /* Validate base register. */
1846 if (GET_CODE (base
) == UNSPEC
)
1847 switch (XINT (base
, 1))
1851 disp
= gen_rtx_UNSPEC (Pmode
,
1852 gen_rtvec (1, XVECEXP (base
, 0, 0)),
1853 UNSPEC_LTREL_OFFSET
);
1857 base
= XVECEXP (base
, 0, 1);
1860 case UNSPEC_LTREL_BASE
:
1861 if (XVECLEN (base
, 0) == 1)
1862 base
= fake_pool_base
, literal_pool
= true;
1864 base
= XVECEXP (base
, 0, 1);
1872 || (GET_MODE (base
) != SImode
1873 && GET_MODE (base
) != Pmode
))
1876 if (REGNO (base
) == STACK_POINTER_REGNUM
1877 || REGNO (base
) == FRAME_POINTER_REGNUM
1878 || ((reload_completed
|| reload_in_progress
)
1879 && frame_pointer_needed
1880 && REGNO (base
) == HARD_FRAME_POINTER_REGNUM
)
1881 || REGNO (base
) == ARG_POINTER_REGNUM
1883 && REGNO (base
) == PIC_OFFSET_TABLE_REGNUM
))
1884 pointer
= base_ptr
= true;
1886 if ((reload_completed
|| reload_in_progress
)
1887 && base
== cfun
->machine
->base_reg
)
1888 pointer
= base_ptr
= literal_pool
= true;
1891 /* Validate index register. */
1894 if (GET_CODE (indx
) == UNSPEC
)
1895 switch (XINT (indx
, 1))
1899 disp
= gen_rtx_UNSPEC (Pmode
,
1900 gen_rtvec (1, XVECEXP (indx
, 0, 0)),
1901 UNSPEC_LTREL_OFFSET
);
1905 indx
= XVECEXP (indx
, 0, 1);
1908 case UNSPEC_LTREL_BASE
:
1909 if (XVECLEN (indx
, 0) == 1)
1910 indx
= fake_pool_base
, literal_pool
= true;
1912 indx
= XVECEXP (indx
, 0, 1);
1920 || (GET_MODE (indx
) != SImode
1921 && GET_MODE (indx
) != Pmode
))
1924 if (REGNO (indx
) == STACK_POINTER_REGNUM
1925 || REGNO (indx
) == FRAME_POINTER_REGNUM
1926 || ((reload_completed
|| reload_in_progress
)
1927 && frame_pointer_needed
1928 && REGNO (indx
) == HARD_FRAME_POINTER_REGNUM
)
1929 || REGNO (indx
) == ARG_POINTER_REGNUM
1931 && REGNO (indx
) == PIC_OFFSET_TABLE_REGNUM
))
1932 pointer
= indx_ptr
= true;
1934 if ((reload_completed
|| reload_in_progress
)
1935 && indx
== cfun
->machine
->base_reg
)
1936 pointer
= indx_ptr
= literal_pool
= true;
1939 /* Prefer to use pointer as base, not index. */
1940 if (base
&& indx
&& !base_ptr
1941 && (indx_ptr
|| (!REG_POINTER (base
) && REG_POINTER (indx
))))
1948 /* Validate displacement. */
1951 /* If virtual registers are involved, the displacement will change later
1952 anyway as the virtual registers get eliminated. This could make a
1953 valid displacement invalid, but it is more likely to make an invalid
1954 displacement valid, because we sometimes access the register save area
1955 via negative offsets to one of those registers.
1956 Thus we don't check the displacement for validity here. If after
1957 elimination the displacement turns out to be invalid after all,
1958 this is fixed up by reload in any case. */
1959 if (base
!= arg_pointer_rtx
1960 && indx
!= arg_pointer_rtx
1961 && base
!= return_address_pointer_rtx
1962 && indx
!= return_address_pointer_rtx
1963 && base
!= frame_pointer_rtx
1964 && indx
!= frame_pointer_rtx
1965 && base
!= virtual_stack_vars_rtx
1966 && indx
!= virtual_stack_vars_rtx
)
1967 if (!DISP_IN_RANGE (offset
))
1972 /* All the special cases are pointers. */
1975 /* In the small-PIC case, the linker converts @GOT
1976 and @GOTNTPOFF offsets to possible displacements. */
1977 if (GET_CODE (disp
) == UNSPEC
1978 && (XINT (disp
, 1) == UNSPEC_GOT
1979 || XINT (disp
, 1) == UNSPEC_GOTNTPOFF
)
1985 /* Accept pool label offsets. */
1986 else if (GET_CODE (disp
) == UNSPEC
1987 && XINT (disp
, 1) == UNSPEC_POOL_OFFSET
)
1990 /* Accept literal pool references. */
1991 else if (GET_CODE (disp
) == UNSPEC
1992 && XINT (disp
, 1) == UNSPEC_LTREL_OFFSET
)
1994 /* In case CSE pulled a non literal pool reference out of
1995 the pool we have to reject the address. This is
1996 especially important when loading the GOT pointer on non
1997 zarch CPUs. In this case the literal pool contains an lt
1998 relative offset to the _GLOBAL_OFFSET_TABLE_ label which
1999 will most likely exceed the displacement. */
2000 if (GET_CODE (XVECEXP (disp
, 0, 0)) != SYMBOL_REF
2001 || !CONSTANT_POOL_ADDRESS_P (XVECEXP (disp
, 0, 0)))
2004 orig_disp
= gen_rtx_CONST (Pmode
, disp
);
2007 /* If we have an offset, make sure it does not
2008 exceed the size of the constant pool entry. */
2009 rtx sym
= XVECEXP (disp
, 0, 0);
2010 if (offset
>= GET_MODE_SIZE (get_pool_mode (sym
)))
2013 orig_disp
= plus_constant (Pmode
, orig_disp
, offset
);
2028 out
->disp
= orig_disp
;
2029 out
->pointer
= pointer
;
2030 out
->literal_pool
= literal_pool
;
2036 /* Decompose a RTL expression OP for a shift count into its components,
2037 and return the base register in BASE and the offset in OFFSET.
2039 Return true if OP is a valid shift count, false if not. */
2042 s390_decompose_shift_count (rtx op
, rtx
*base
, HOST_WIDE_INT
*offset
)
2044 HOST_WIDE_INT off
= 0;
2046 /* We can have an integer constant, an address register,
2047 or a sum of the two. */
2048 if (GET_CODE (op
) == CONST_INT
)
2053 if (op
&& GET_CODE (op
) == PLUS
&& GET_CODE (XEXP (op
, 1)) == CONST_INT
)
2055 off
= INTVAL (XEXP (op
, 1));
2058 while (op
&& GET_CODE (op
) == SUBREG
)
2059 op
= SUBREG_REG (op
);
2061 if (op
&& GET_CODE (op
) != REG
)
2073 /* Return true if CODE is a valid address without index. */
2076 s390_legitimate_address_without_index_p (rtx op
)
2078 struct s390_address addr
;
2080 if (!s390_decompose_address (XEXP (op
, 0), &addr
))
2089 /* Return true if ADDR is of kind symbol_ref or symbol_ref + const_int
2090 and return these parts in SYMREF and ADDEND. You can pass NULL in
2091 SYMREF and/or ADDEND if you are not interested in these values.
2092 Literal pool references are *not* considered symbol references. */
2095 s390_symref_operand_p (rtx addr
, rtx
*symref
, HOST_WIDE_INT
*addend
)
2097 HOST_WIDE_INT tmpaddend
= 0;
2099 if (GET_CODE (addr
) == CONST
)
2100 addr
= XEXP (addr
, 0);
2102 if (GET_CODE (addr
) == PLUS
)
2104 if (GET_CODE (XEXP (addr
, 0)) == SYMBOL_REF
2105 && !CONSTANT_POOL_ADDRESS_P (XEXP (addr
, 0))
2106 && CONST_INT_P (XEXP (addr
, 1)))
2108 tmpaddend
= INTVAL (XEXP (addr
, 1));
2109 addr
= XEXP (addr
, 0);
2115 if (GET_CODE (addr
) != SYMBOL_REF
|| CONSTANT_POOL_ADDRESS_P (addr
))
2121 *addend
= tmpaddend
;
2126 /* Return TRUE if ADDR is an operand valid for a load/store relative
2127 instructions. Be aware that the alignment of the operand needs to
2128 be checked separately. */
2130 s390_loadrelative_operand_p (rtx addr
)
2132 if (GET_CODE (addr
) == CONST
)
2133 addr
= XEXP (addr
, 0);
2135 /* Enable load relative for symbol@GOTENT. */
2136 if (GET_CODE (addr
) == UNSPEC
2137 && XINT (addr
, 1) == UNSPEC_GOTENT
)
2140 return s390_symref_operand_p (addr
, NULL
, NULL
);
2143 /* Return true if the address in OP is valid for constraint letter C
2144 if wrapped in a MEM rtx. Set LIT_POOL_OK to true if it literal
2145 pool MEMs should be accepted. Only the Q, R, S, T constraint
2146 letters are allowed for C. */
2149 s390_check_qrst_address (char c
, rtx op
, bool lit_pool_ok
)
2151 struct s390_address addr
;
2152 bool decomposed
= false;
2154 /* This check makes sure that no symbolic address (except literal
2155 pool references) are accepted by the R or T constraints. */
2156 if (s390_loadrelative_operand_p (op
))
2159 /* Ensure literal pool references are only accepted if LIT_POOL_OK. */
2162 if (!s390_decompose_address (op
, &addr
))
2164 if (addr
.literal_pool
)
2171 case 'Q': /* no index short displacement */
2172 if (!decomposed
&& !s390_decompose_address (op
, &addr
))
2176 if (!s390_short_displacement (addr
.disp
))
2180 case 'R': /* with index short displacement */
2181 if (TARGET_LONG_DISPLACEMENT
)
2183 if (!decomposed
&& !s390_decompose_address (op
, &addr
))
2185 if (!s390_short_displacement (addr
.disp
))
2188 /* Any invalid address here will be fixed up by reload,
2189 so accept it for the most generic constraint. */
2192 case 'S': /* no index long displacement */
2193 if (!TARGET_LONG_DISPLACEMENT
)
2195 if (!decomposed
&& !s390_decompose_address (op
, &addr
))
2199 if (s390_short_displacement (addr
.disp
))
2203 case 'T': /* with index long displacement */
2204 if (!TARGET_LONG_DISPLACEMENT
)
2206 /* Any invalid address here will be fixed up by reload,
2207 so accept it for the most generic constraint. */
2208 if ((decomposed
|| s390_decompose_address (op
, &addr
))
2209 && s390_short_displacement (addr
.disp
))
2219 /* Evaluates constraint strings described by the regular expression
2220 ([A|B|Z](Q|R|S|T))|U|W|Y and returns 1 if OP is a valid operand for
2221 the constraint given in STR, or 0 else. */
2224 s390_mem_constraint (const char *str
, rtx op
)
2231 /* Check for offsettable variants of memory constraints. */
2232 if (!MEM_P (op
) || MEM_VOLATILE_P (op
))
2234 if ((reload_completed
|| reload_in_progress
)
2235 ? !offsettable_memref_p (op
) : !offsettable_nonstrict_memref_p (op
))
2237 return s390_check_qrst_address (str
[1], XEXP (op
, 0), true);
2239 /* Check for non-literal-pool variants of memory constraints. */
2242 return s390_check_qrst_address (str
[1], XEXP (op
, 0), false);
2247 if (GET_CODE (op
) != MEM
)
2249 return s390_check_qrst_address (c
, XEXP (op
, 0), true);
2251 return (s390_check_qrst_address ('Q', op
, true)
2252 || s390_check_qrst_address ('R', op
, true));
2254 return (s390_check_qrst_address ('S', op
, true)
2255 || s390_check_qrst_address ('T', op
, true));
2257 /* Simply check for the basic form of a shift count. Reload will
2258 take care of making sure we have a proper base register. */
2259 if (!s390_decompose_shift_count (op
, NULL
, NULL
))
2263 return s390_check_qrst_address (str
[1], op
, true);
2271 /* Evaluates constraint strings starting with letter O. Input
2272 parameter C is the second letter following the "O" in the constraint
2273 string. Returns 1 if VALUE meets the respective constraint and 0
2277 s390_O_constraint_str (const char c
, HOST_WIDE_INT value
)
2285 return trunc_int_for_mode (value
, SImode
) == value
;
2289 || s390_single_part (GEN_INT (value
), DImode
, SImode
, 0) == 1;
2292 return s390_single_part (GEN_INT (value
- 1), DImode
, SImode
, -1) == 1;
2300 /* Evaluates constraint strings starting with letter N. Parameter STR
2301 contains the letters following letter "N" in the constraint string.
2302 Returns true if VALUE matches the constraint. */
2305 s390_N_constraint_str (const char *str
, HOST_WIDE_INT value
)
2307 enum machine_mode mode
, part_mode
;
2309 int part
, part_goal
;
2315 part_goal
= str
[0] - '0';
2359 if (GET_MODE_SIZE (mode
) <= GET_MODE_SIZE (part_mode
))
2362 part
= s390_single_part (GEN_INT (value
), mode
, part_mode
, def
);
2365 if (part_goal
!= -1 && part_goal
!= part
)
2372 /* Returns true if the input parameter VALUE is a float zero. */
2375 s390_float_const_zero_p (rtx value
)
2377 return (GET_MODE_CLASS (GET_MODE (value
)) == MODE_FLOAT
2378 && value
== CONST0_RTX (GET_MODE (value
)));
2381 /* Implement TARGET_REGISTER_MOVE_COST. */
2384 s390_register_move_cost (enum machine_mode mode ATTRIBUTE_UNUSED
,
2385 reg_class_t from
, reg_class_t to
)
2387 /* On s390, copy between fprs and gprs is expensive. */
2388 if ((reg_classes_intersect_p (from
, GENERAL_REGS
)
2389 && reg_classes_intersect_p (to
, FP_REGS
))
2390 || (reg_classes_intersect_p (from
, FP_REGS
)
2391 && reg_classes_intersect_p (to
, GENERAL_REGS
)))
2397 /* Implement TARGET_MEMORY_MOVE_COST. */
2400 s390_memory_move_cost (enum machine_mode mode ATTRIBUTE_UNUSED
,
2401 reg_class_t rclass ATTRIBUTE_UNUSED
,
2402 bool in ATTRIBUTE_UNUSED
)
2407 /* Compute a (partial) cost for rtx X. Return true if the complete
2408 cost has been computed, and false if subexpressions should be
2409 scanned. In either case, *TOTAL contains the cost result.
2410 CODE contains GET_CODE (x), OUTER_CODE contains the code
2411 of the superexpression of x. */
2414 s390_rtx_costs (rtx x
, int code
, int outer_code
, int opno ATTRIBUTE_UNUSED
,
2415 int *total
, bool speed ATTRIBUTE_UNUSED
)
2438 *total
= COSTS_N_INSNS (1);
2443 *total
= COSTS_N_INSNS (1);
2447 switch (GET_MODE (x
))
2451 rtx left
= XEXP (x
, 0);
2452 rtx right
= XEXP (x
, 1);
2453 if (GET_CODE (right
) == CONST_INT
2454 && CONST_OK_FOR_K (INTVAL (right
)))
2455 *total
= s390_cost
->mhi
;
2456 else if (GET_CODE (left
) == SIGN_EXTEND
)
2457 *total
= s390_cost
->mh
;
2459 *total
= s390_cost
->ms
; /* msr, ms, msy */
2464 rtx left
= XEXP (x
, 0);
2465 rtx right
= XEXP (x
, 1);
2468 if (GET_CODE (right
) == CONST_INT
2469 && CONST_OK_FOR_K (INTVAL (right
)))
2470 *total
= s390_cost
->mghi
;
2471 else if (GET_CODE (left
) == SIGN_EXTEND
)
2472 *total
= s390_cost
->msgf
;
2474 *total
= s390_cost
->msg
; /* msgr, msg */
2476 else /* TARGET_31BIT */
2478 if (GET_CODE (left
) == SIGN_EXTEND
2479 && GET_CODE (right
) == SIGN_EXTEND
)
2480 /* mulsidi case: mr, m */
2481 *total
= s390_cost
->m
;
2482 else if (GET_CODE (left
) == ZERO_EXTEND
2483 && GET_CODE (right
) == ZERO_EXTEND
2484 && TARGET_CPU_ZARCH
)
2485 /* umulsidi case: ml, mlr */
2486 *total
= s390_cost
->ml
;
2488 /* Complex calculation is required. */
2489 *total
= COSTS_N_INSNS (40);
2495 *total
= s390_cost
->mult_df
;
2498 *total
= s390_cost
->mxbr
;
2506 switch (GET_MODE (x
))
2509 *total
= s390_cost
->madbr
;
2512 *total
= s390_cost
->maebr
;
2517 /* Negate in the third argument is free: FMSUB. */
2518 if (GET_CODE (XEXP (x
, 2)) == NEG
)
2520 *total
+= (rtx_cost (XEXP (x
, 0), FMA
, 0, speed
)
2521 + rtx_cost (XEXP (x
, 1), FMA
, 1, speed
)
2522 + rtx_cost (XEXP (XEXP (x
, 2), 0), FMA
, 2, speed
));
2529 if (GET_MODE (x
) == TImode
) /* 128 bit division */
2530 *total
= s390_cost
->dlgr
;
2531 else if (GET_MODE (x
) == DImode
)
2533 rtx right
= XEXP (x
, 1);
2534 if (GET_CODE (right
) == ZERO_EXTEND
) /* 64 by 32 bit division */
2535 *total
= s390_cost
->dlr
;
2536 else /* 64 by 64 bit division */
2537 *total
= s390_cost
->dlgr
;
2539 else if (GET_MODE (x
) == SImode
) /* 32 bit division */
2540 *total
= s390_cost
->dlr
;
2545 if (GET_MODE (x
) == DImode
)
2547 rtx right
= XEXP (x
, 1);
2548 if (GET_CODE (right
) == ZERO_EXTEND
) /* 64 by 32 bit division */
2550 *total
= s390_cost
->dsgfr
;
2552 *total
= s390_cost
->dr
;
2553 else /* 64 by 64 bit division */
2554 *total
= s390_cost
->dsgr
;
2556 else if (GET_MODE (x
) == SImode
) /* 32 bit division */
2557 *total
= s390_cost
->dlr
;
2558 else if (GET_MODE (x
) == SFmode
)
2560 *total
= s390_cost
->debr
;
2562 else if (GET_MODE (x
) == DFmode
)
2564 *total
= s390_cost
->ddbr
;
2566 else if (GET_MODE (x
) == TFmode
)
2568 *total
= s390_cost
->dxbr
;
2573 if (GET_MODE (x
) == SFmode
)
2574 *total
= s390_cost
->sqebr
;
2575 else if (GET_MODE (x
) == DFmode
)
2576 *total
= s390_cost
->sqdbr
;
2578 *total
= s390_cost
->sqxbr
;
2583 if (outer_code
== MULT
|| outer_code
== DIV
|| outer_code
== MOD
2584 || outer_code
== PLUS
|| outer_code
== MINUS
2585 || outer_code
== COMPARE
)
2590 *total
= COSTS_N_INSNS (1);
2591 if (GET_CODE (XEXP (x
, 0)) == AND
2592 && GET_CODE (XEXP (x
, 1)) == CONST_INT
2593 && GET_CODE (XEXP (XEXP (x
, 0), 1)) == CONST_INT
)
2595 rtx op0
= XEXP (XEXP (x
, 0), 0);
2596 rtx op1
= XEXP (XEXP (x
, 0), 1);
2597 rtx op2
= XEXP (x
, 1);
2599 if (memory_operand (op0
, GET_MODE (op0
))
2600 && s390_tm_ccmode (op1
, op2
, 0) != VOIDmode
)
2602 if (register_operand (op0
, GET_MODE (op0
))
2603 && s390_tm_ccmode (op1
, op2
, 1) != VOIDmode
)
2613 /* Return the cost of an address rtx ADDR. */
2616 s390_address_cost (rtx addr
, enum machine_mode mode ATTRIBUTE_UNUSED
,
2617 addr_space_t as ATTRIBUTE_UNUSED
,
2618 bool speed ATTRIBUTE_UNUSED
)
2620 struct s390_address ad
;
2621 if (!s390_decompose_address (addr
, &ad
))
2624 return ad
.indx
? COSTS_N_INSNS (1) + 1 : COSTS_N_INSNS (1);
2627 /* If OP is a SYMBOL_REF of a thread-local symbol, return its TLS mode,
2628 otherwise return 0. */
2631 tls_symbolic_operand (rtx op
)
2633 if (GET_CODE (op
) != SYMBOL_REF
)
2635 return SYMBOL_REF_TLS_MODEL (op
);
2638 /* Split DImode access register reference REG (on 64-bit) into its constituent
2639 low and high parts, and store them into LO and HI. Note that gen_lowpart/
2640 gen_highpart cannot be used as they assume all registers are word-sized,
2641 while our access registers have only half that size. */
2644 s390_split_access_reg (rtx reg
, rtx
*lo
, rtx
*hi
)
2646 gcc_assert (TARGET_64BIT
);
2647 gcc_assert (ACCESS_REG_P (reg
));
2648 gcc_assert (GET_MODE (reg
) == DImode
);
2649 gcc_assert (!(REGNO (reg
) & 1));
2651 *lo
= gen_rtx_REG (SImode
, REGNO (reg
) + 1);
2652 *hi
= gen_rtx_REG (SImode
, REGNO (reg
));
2655 /* Return true if OP contains a symbol reference */
2658 symbolic_reference_mentioned_p (rtx op
)
2663 if (GET_CODE (op
) == SYMBOL_REF
|| GET_CODE (op
) == LABEL_REF
)
2666 fmt
= GET_RTX_FORMAT (GET_CODE (op
));
2667 for (i
= GET_RTX_LENGTH (GET_CODE (op
)) - 1; i
>= 0; i
--)
2673 for (j
= XVECLEN (op
, i
) - 1; j
>= 0; j
--)
2674 if (symbolic_reference_mentioned_p (XVECEXP (op
, i
, j
)))
2678 else if (fmt
[i
] == 'e' && symbolic_reference_mentioned_p (XEXP (op
, i
)))
2685 /* Return true if OP contains a reference to a thread-local symbol. */
2688 tls_symbolic_reference_mentioned_p (rtx op
)
2693 if (GET_CODE (op
) == SYMBOL_REF
)
2694 return tls_symbolic_operand (op
);
2696 fmt
= GET_RTX_FORMAT (GET_CODE (op
));
2697 for (i
= GET_RTX_LENGTH (GET_CODE (op
)) - 1; i
>= 0; i
--)
2703 for (j
= XVECLEN (op
, i
) - 1; j
>= 0; j
--)
2704 if (tls_symbolic_reference_mentioned_p (XVECEXP (op
, i
, j
)))
2708 else if (fmt
[i
] == 'e' && tls_symbolic_reference_mentioned_p (XEXP (op
, i
)))
2716 /* Return true if OP is a legitimate general operand when
2717 generating PIC code. It is given that flag_pic is on
2718 and that OP satisfies CONSTANT_P or is a CONST_DOUBLE. */
2721 legitimate_pic_operand_p (rtx op
)
2723 /* Accept all non-symbolic constants. */
2724 if (!SYMBOLIC_CONST (op
))
2727 /* Reject everything else; must be handled
2728 via emit_symbolic_move. */
2732 /* Returns true if the constant value OP is a legitimate general operand.
2733 It is given that OP satisfies CONSTANT_P or is a CONST_DOUBLE. */
2736 s390_legitimate_constant_p (enum machine_mode mode
, rtx op
)
2738 /* Accept all non-symbolic constants. */
2739 if (!SYMBOLIC_CONST (op
))
2742 /* Accept immediate LARL operands. */
2743 if (TARGET_CPU_ZARCH
&& larl_operand (op
, mode
))
2746 /* Thread-local symbols are never legal constants. This is
2747 so that emit_call knows that computing such addresses
2748 might require a function call. */
2749 if (TLS_SYMBOLIC_CONST (op
))
2752 /* In the PIC case, symbolic constants must *not* be
2753 forced into the literal pool. We accept them here,
2754 so that they will be handled by emit_symbolic_move. */
2758 /* All remaining non-PIC symbolic constants are
2759 forced into the literal pool. */
2763 /* Determine if it's legal to put X into the constant pool. This
2764 is not possible if X contains the address of a symbol that is
2765 not constant (TLS) or not known at final link time (PIC). */
2768 s390_cannot_force_const_mem (enum machine_mode mode
, rtx x
)
2770 switch (GET_CODE (x
))
2774 /* Accept all non-symbolic constants. */
2778 /* Labels are OK iff we are non-PIC. */
2779 return flag_pic
!= 0;
2782 /* 'Naked' TLS symbol references are never OK,
2783 non-TLS symbols are OK iff we are non-PIC. */
2784 if (tls_symbolic_operand (x
))
2787 return flag_pic
!= 0;
2790 return s390_cannot_force_const_mem (mode
, XEXP (x
, 0));
2793 return s390_cannot_force_const_mem (mode
, XEXP (x
, 0))
2794 || s390_cannot_force_const_mem (mode
, XEXP (x
, 1));
2797 switch (XINT (x
, 1))
2799 /* Only lt-relative or GOT-relative UNSPECs are OK. */
2800 case UNSPEC_LTREL_OFFSET
:
2808 case UNSPEC_GOTNTPOFF
:
2809 case UNSPEC_INDNTPOFF
:
2812 /* If the literal pool shares the code section, be put
2813 execute template placeholders into the pool as well. */
2815 return TARGET_CPU_ZARCH
;
2827 /* Returns true if the constant value OP is a legitimate general
2828 operand during and after reload. The difference to
2829 legitimate_constant_p is that this function will not accept
2830 a constant that would need to be forced to the literal pool
2831 before it can be used as operand.
2832 This function accepts all constants which can be loaded directly
2836 legitimate_reload_constant_p (rtx op
)
2838 /* Accept la(y) operands. */
2839 if (GET_CODE (op
) == CONST_INT
2840 && DISP_IN_RANGE (INTVAL (op
)))
2843 /* Accept l(g)hi/l(g)fi operands. */
2844 if (GET_CODE (op
) == CONST_INT
2845 && (CONST_OK_FOR_K (INTVAL (op
)) || CONST_OK_FOR_Os (INTVAL (op
))))
2848 /* Accept lliXX operands. */
2850 && GET_CODE (op
) == CONST_INT
2851 && trunc_int_for_mode (INTVAL (op
), word_mode
) == INTVAL (op
)
2852 && s390_single_part (op
, word_mode
, HImode
, 0) >= 0)
2856 && GET_CODE (op
) == CONST_INT
2857 && trunc_int_for_mode (INTVAL (op
), word_mode
) == INTVAL (op
)
2858 && s390_single_part (op
, word_mode
, SImode
, 0) >= 0)
2861 /* Accept larl operands. */
2862 if (TARGET_CPU_ZARCH
2863 && larl_operand (op
, VOIDmode
))
2866 /* Accept floating-point zero operands that fit into a single GPR. */
2867 if (GET_CODE (op
) == CONST_DOUBLE
2868 && s390_float_const_zero_p (op
)
2869 && GET_MODE_SIZE (GET_MODE (op
)) <= UNITS_PER_WORD
)
2872 /* Accept double-word operands that can be split. */
2873 if (GET_CODE (op
) == CONST_INT
2874 && trunc_int_for_mode (INTVAL (op
), word_mode
) != INTVAL (op
))
2876 enum machine_mode dword_mode
= word_mode
== SImode
? DImode
: TImode
;
2877 rtx hi
= operand_subword (op
, 0, 0, dword_mode
);
2878 rtx lo
= operand_subword (op
, 1, 0, dword_mode
);
2879 return legitimate_reload_constant_p (hi
)
2880 && legitimate_reload_constant_p (lo
);
2883 /* Everything else cannot be handled without reload. */
2887 /* Returns true if the constant value OP is a legitimate fp operand
2888 during and after reload.
2889 This function accepts all constants which can be loaded directly
2893 legitimate_reload_fp_constant_p (rtx op
)
2895 /* Accept floating-point zero operands if the load zero instruction
2898 && GET_CODE (op
) == CONST_DOUBLE
2899 && s390_float_const_zero_p (op
))
2905 /* Given an rtx OP being reloaded into a reg required to be in class RCLASS,
2906 return the class of reg to actually use. */
2909 s390_preferred_reload_class (rtx op
, reg_class_t rclass
)
2911 switch (GET_CODE (op
))
2913 /* Constants we cannot reload into general registers
2914 must be forced into the literal pool. */
2917 if (reg_class_subset_p (GENERAL_REGS
, rclass
)
2918 && legitimate_reload_constant_p (op
))
2919 return GENERAL_REGS
;
2920 else if (reg_class_subset_p (ADDR_REGS
, rclass
)
2921 && legitimate_reload_constant_p (op
))
2923 else if (reg_class_subset_p (FP_REGS
, rclass
)
2924 && legitimate_reload_fp_constant_p (op
))
2928 /* If a symbolic constant or a PLUS is reloaded,
2929 it is most likely being used as an address, so
2930 prefer ADDR_REGS. If 'class' is not a superset
2931 of ADDR_REGS, e.g. FP_REGS, reject this reload. */
2935 if (!legitimate_reload_constant_p (op
))
2939 /* load address will be used. */
2940 if (reg_class_subset_p (ADDR_REGS
, rclass
))
2952 /* Return true if ADDR is SYMBOL_REF + addend with addend being a
2953 multiple of ALIGNMENT and the SYMBOL_REF being naturally
2957 s390_check_symref_alignment (rtx addr
, HOST_WIDE_INT alignment
)
2959 HOST_WIDE_INT addend
;
2962 /* Accept symbol@GOTENT with pointer size alignment. */
2963 if (GET_CODE (addr
) == CONST
2964 && GET_CODE (XEXP (addr
, 0)) == UNSPEC
2965 && XINT (XEXP (addr
, 0), 1) == UNSPEC_GOTENT
2966 && alignment
<= UNITS_PER_LONG
)
2969 if (!s390_symref_operand_p (addr
, &symref
, &addend
))
2972 return (!SYMBOL_REF_NOT_NATURALLY_ALIGNED_P (symref
)
2973 && !(addend
& (alignment
- 1)));
2976 /* ADDR is moved into REG using larl. If ADDR isn't a valid larl
2977 operand SCRATCH is used to reload the even part of the address and
2981 s390_reload_larl_operand (rtx reg
, rtx addr
, rtx scratch
)
2983 HOST_WIDE_INT addend
;
2986 if (!s390_symref_operand_p (addr
, &symref
, &addend
))
2990 /* Easy case. The addend is even so larl will do fine. */
2991 emit_move_insn (reg
, addr
);
2994 /* We can leave the scratch register untouched if the target
2995 register is a valid base register. */
2996 if (REGNO (reg
) < FIRST_PSEUDO_REGISTER
2997 && REGNO_REG_CLASS (REGNO (reg
)) == ADDR_REGS
)
3000 gcc_assert (REGNO (scratch
) < FIRST_PSEUDO_REGISTER
);
3001 gcc_assert (REGNO_REG_CLASS (REGNO (scratch
)) == ADDR_REGS
);
3004 emit_move_insn (scratch
,
3005 gen_rtx_CONST (Pmode
,
3006 gen_rtx_PLUS (Pmode
, symref
,
3007 GEN_INT (addend
- 1))));
3009 emit_move_insn (scratch
, symref
);
3011 /* Increment the address using la in order to avoid clobbering cc. */
3012 emit_move_insn (reg
, gen_rtx_PLUS (Pmode
, scratch
, const1_rtx
));
3016 /* Generate what is necessary to move between REG and MEM using
3017 SCRATCH. The direction is given by TOMEM. */
3020 s390_reload_symref_address (rtx reg
, rtx mem
, rtx scratch
, bool tomem
)
3022 /* Reload might have pulled a constant out of the literal pool.
3023 Force it back in. */
3024 if (CONST_INT_P (mem
) || GET_CODE (mem
) == CONST_DOUBLE
3025 || GET_CODE (mem
) == CONST
)
3026 mem
= force_const_mem (GET_MODE (reg
), mem
);
3028 gcc_assert (MEM_P (mem
));
3030 /* For a load from memory we can leave the scratch register
3031 untouched if the target register is a valid base register. */
3033 && REGNO (reg
) < FIRST_PSEUDO_REGISTER
3034 && REGNO_REG_CLASS (REGNO (reg
)) == ADDR_REGS
3035 && GET_MODE (reg
) == GET_MODE (scratch
))
3038 /* Load address into scratch register. Since we can't have a
3039 secondary reload for a secondary reload we have to cover the case
3040 where larl would need a secondary reload here as well. */
3041 s390_reload_larl_operand (scratch
, XEXP (mem
, 0), scratch
);
3043 /* Now we can use a standard load/store to do the move. */
3045 emit_move_insn (replace_equiv_address (mem
, scratch
), reg
);
3047 emit_move_insn (reg
, replace_equiv_address (mem
, scratch
));
3050 /* Inform reload about cases where moving X with a mode MODE to a register in
3051 RCLASS requires an extra scratch or immediate register. Return the class
3052 needed for the immediate register. */
3055 s390_secondary_reload (bool in_p
, rtx x
, reg_class_t rclass_i
,
3056 enum machine_mode mode
, secondary_reload_info
*sri
)
3058 enum reg_class rclass
= (enum reg_class
) rclass_i
;
3060 /* Intermediate register needed. */
3061 if (reg_classes_intersect_p (CC_REGS
, rclass
))
3062 return GENERAL_REGS
;
3066 HOST_WIDE_INT offset
;
3069 /* On z10 several optimizer steps may generate larl operands with
3072 && s390_symref_operand_p (x
, &symref
, &offset
)
3074 && !SYMBOL_REF_ALIGN1_P (symref
)
3075 && (offset
& 1) == 1)
3076 sri
->icode
= ((mode
== DImode
) ? CODE_FOR_reloaddi_larl_odd_addend_z10
3077 : CODE_FOR_reloadsi_larl_odd_addend_z10
);
3079 /* On z10 we need a scratch register when moving QI, TI or floating
3080 point mode values from or to a memory location with a SYMBOL_REF
3081 or if the symref addend of a SI or DI move is not aligned to the
3082 width of the access. */
3084 && s390_symref_operand_p (XEXP (x
, 0), NULL
, NULL
)
3085 && (mode
== QImode
|| mode
== TImode
|| FLOAT_MODE_P (mode
)
3086 || (!TARGET_ZARCH
&& mode
== DImode
)
3087 || ((mode
== HImode
|| mode
== SImode
|| mode
== DImode
)
3088 && (!s390_check_symref_alignment (XEXP (x
, 0),
3089 GET_MODE_SIZE (mode
))))))
3091 #define __SECONDARY_RELOAD_CASE(M,m) \
3094 sri->icode = in_p ? CODE_FOR_reload##m##di_toreg_z10 : \
3095 CODE_FOR_reload##m##di_tomem_z10; \
3097 sri->icode = in_p ? CODE_FOR_reload##m##si_toreg_z10 : \
3098 CODE_FOR_reload##m##si_tomem_z10; \
3101 switch (GET_MODE (x
))
3103 __SECONDARY_RELOAD_CASE (QI
, qi
);
3104 __SECONDARY_RELOAD_CASE (HI
, hi
);
3105 __SECONDARY_RELOAD_CASE (SI
, si
);
3106 __SECONDARY_RELOAD_CASE (DI
, di
);
3107 __SECONDARY_RELOAD_CASE (TI
, ti
);
3108 __SECONDARY_RELOAD_CASE (SF
, sf
);
3109 __SECONDARY_RELOAD_CASE (DF
, df
);
3110 __SECONDARY_RELOAD_CASE (TF
, tf
);
3111 __SECONDARY_RELOAD_CASE (SD
, sd
);
3112 __SECONDARY_RELOAD_CASE (DD
, dd
);
3113 __SECONDARY_RELOAD_CASE (TD
, td
);
3118 #undef __SECONDARY_RELOAD_CASE
3122 /* We need a scratch register when loading a PLUS expression which
3123 is not a legitimate operand of the LOAD ADDRESS instruction. */
3124 if (in_p
&& s390_plus_operand (x
, mode
))
3125 sri
->icode
= (TARGET_64BIT
?
3126 CODE_FOR_reloaddi_plus
: CODE_FOR_reloadsi_plus
);
3128 /* Performing a multiword move from or to memory we have to make sure the
3129 second chunk in memory is addressable without causing a displacement
3130 overflow. If that would be the case we calculate the address in
3131 a scratch register. */
3133 && GET_CODE (XEXP (x
, 0)) == PLUS
3134 && GET_CODE (XEXP (XEXP (x
, 0), 1)) == CONST_INT
3135 && !DISP_IN_RANGE (INTVAL (XEXP (XEXP (x
, 0), 1))
3136 + GET_MODE_SIZE (mode
) - 1))
3138 /* For GENERAL_REGS a displacement overflow is no problem if occurring
3139 in a s_operand address since we may fallback to lm/stm. So we only
3140 have to care about overflows in the b+i+d case. */
3141 if ((reg_classes_intersect_p (GENERAL_REGS
, rclass
)
3142 && s390_class_max_nregs (GENERAL_REGS
, mode
) > 1
3143 && GET_CODE (XEXP (XEXP (x
, 0), 0)) == PLUS
)
3144 /* For FP_REGS no lm/stm is available so this check is triggered
3145 for displacement overflows in b+i+d and b+d like addresses. */
3146 || (reg_classes_intersect_p (FP_REGS
, rclass
)
3147 && s390_class_max_nregs (FP_REGS
, mode
) > 1))
3150 sri
->icode
= (TARGET_64BIT
?
3151 CODE_FOR_reloaddi_nonoffmem_in
:
3152 CODE_FOR_reloadsi_nonoffmem_in
);
3154 sri
->icode
= (TARGET_64BIT
?
3155 CODE_FOR_reloaddi_nonoffmem_out
:
3156 CODE_FOR_reloadsi_nonoffmem_out
);
3160 /* A scratch address register is needed when a symbolic constant is
3161 copied to r0 compiling with -fPIC. In other cases the target
3162 register might be used as temporary (see legitimize_pic_address). */
3163 if (in_p
&& SYMBOLIC_CONST (x
) && flag_pic
== 2 && rclass
!= ADDR_REGS
)
3164 sri
->icode
= (TARGET_64BIT
?
3165 CODE_FOR_reloaddi_PIC_addr
:
3166 CODE_FOR_reloadsi_PIC_addr
);
3168 /* Either scratch or no register needed. */
3172 /* Generate code to load SRC, which is PLUS that is not a
3173 legitimate operand for the LA instruction, into TARGET.
3174 SCRATCH may be used as scratch register. */
3177 s390_expand_plus_operand (rtx target
, rtx src
,
3181 struct s390_address ad
;
3183 /* src must be a PLUS; get its two operands. */
3184 gcc_assert (GET_CODE (src
) == PLUS
);
3185 gcc_assert (GET_MODE (src
) == Pmode
);
3187 /* Check if any of the two operands is already scheduled
3188 for replacement by reload. This can happen e.g. when
3189 float registers occur in an address. */
3190 sum1
= find_replacement (&XEXP (src
, 0));
3191 sum2
= find_replacement (&XEXP (src
, 1));
3192 src
= gen_rtx_PLUS (Pmode
, sum1
, sum2
);
3194 /* If the address is already strictly valid, there's nothing to do. */
3195 if (!s390_decompose_address (src
, &ad
)
3196 || (ad
.base
&& !REGNO_OK_FOR_BASE_P (REGNO (ad
.base
)))
3197 || (ad
.indx
&& !REGNO_OK_FOR_INDEX_P (REGNO (ad
.indx
))))
3199 /* Otherwise, one of the operands cannot be an address register;
3200 we reload its value into the scratch register. */
3201 if (true_regnum (sum1
) < 1 || true_regnum (sum1
) > 15)
3203 emit_move_insn (scratch
, sum1
);
3206 if (true_regnum (sum2
) < 1 || true_regnum (sum2
) > 15)
3208 emit_move_insn (scratch
, sum2
);
3212 /* According to the way these invalid addresses are generated
3213 in reload.c, it should never happen (at least on s390) that
3214 *neither* of the PLUS components, after find_replacements
3215 was applied, is an address register. */
3216 if (sum1
== scratch
&& sum2
== scratch
)
3222 src
= gen_rtx_PLUS (Pmode
, sum1
, sum2
);
3225 /* Emit the LOAD ADDRESS pattern. Note that reload of PLUS
3226 is only ever performed on addresses, so we can mark the
3227 sum as legitimate for LA in any case. */
3228 s390_load_address (target
, src
);
3232 /* Return true if ADDR is a valid memory address.
3233 STRICT specifies whether strict register checking applies. */
3236 s390_legitimate_address_p (enum machine_mode mode
, rtx addr
, bool strict
)
3238 struct s390_address ad
;
3241 && larl_operand (addr
, VOIDmode
)
3242 && (mode
== VOIDmode
3243 || s390_check_symref_alignment (addr
, GET_MODE_SIZE (mode
))))
3246 if (!s390_decompose_address (addr
, &ad
))
3251 if (ad
.base
&& !REGNO_OK_FOR_BASE_P (REGNO (ad
.base
)))
3254 if (ad
.indx
&& !REGNO_OK_FOR_INDEX_P (REGNO (ad
.indx
)))
3260 && !(REGNO (ad
.base
) >= FIRST_PSEUDO_REGISTER
3261 || REGNO_REG_CLASS (REGNO (ad
.base
)) == ADDR_REGS
))
3265 && !(REGNO (ad
.indx
) >= FIRST_PSEUDO_REGISTER
3266 || REGNO_REG_CLASS (REGNO (ad
.indx
)) == ADDR_REGS
))
3272 /* Return true if OP is a valid operand for the LA instruction.
3273 In 31-bit, we need to prove that the result is used as an
3274 address, as LA performs only a 31-bit addition. */
3277 legitimate_la_operand_p (rtx op
)
3279 struct s390_address addr
;
3280 if (!s390_decompose_address (op
, &addr
))
3283 return (TARGET_64BIT
|| addr
.pointer
);
3286 /* Return true if it is valid *and* preferable to use LA to
3287 compute the sum of OP1 and OP2. */
3290 preferred_la_operand_p (rtx op1
, rtx op2
)
3292 struct s390_address addr
;
3294 if (op2
!= const0_rtx
)
3295 op1
= gen_rtx_PLUS (Pmode
, op1
, op2
);
3297 if (!s390_decompose_address (op1
, &addr
))
3299 if (addr
.base
&& !REGNO_OK_FOR_BASE_P (REGNO (addr
.base
)))
3301 if (addr
.indx
&& !REGNO_OK_FOR_INDEX_P (REGNO (addr
.indx
)))
3304 /* Avoid LA instructions with index register on z196; it is
3305 preferable to use regular add instructions when possible. */
3306 if (addr
.indx
&& s390_tune
== PROCESSOR_2817_Z196
)
3309 if (!TARGET_64BIT
&& !addr
.pointer
)
3315 if ((addr
.base
&& REG_P (addr
.base
) && REG_POINTER (addr
.base
))
3316 || (addr
.indx
&& REG_P (addr
.indx
) && REG_POINTER (addr
.indx
)))
3322 /* Emit a forced load-address operation to load SRC into DST.
3323 This will use the LOAD ADDRESS instruction even in situations
3324 where legitimate_la_operand_p (SRC) returns false. */
3327 s390_load_address (rtx dst
, rtx src
)
3330 emit_move_insn (dst
, src
);
3332 emit_insn (gen_force_la_31 (dst
, src
));
3335 /* Return a legitimate reference for ORIG (an address) using the
3336 register REG. If REG is 0, a new pseudo is generated.
3338 There are two types of references that must be handled:
3340 1. Global data references must load the address from the GOT, via
3341 the PIC reg. An insn is emitted to do this load, and the reg is
3344 2. Static data references, constant pool addresses, and code labels
3345 compute the address as an offset from the GOT, whose base is in
3346 the PIC reg. Static data objects have SYMBOL_FLAG_LOCAL set to
3347 differentiate them from global data objects. The returned
3348 address is the PIC reg + an unspec constant.
3350 TARGET_LEGITIMIZE_ADDRESS_P rejects symbolic references unless the PIC
3351 reg also appears in the address. */
3354 legitimize_pic_address (rtx orig
, rtx reg
)
3360 gcc_assert (!TLS_SYMBOLIC_CONST (addr
));
3362 if (GET_CODE (addr
) == LABEL_REF
3363 || (GET_CODE (addr
) == SYMBOL_REF
&& SYMBOL_REF_LOCAL_P (addr
)))
3365 /* This is a local symbol. */
3366 if (TARGET_CPU_ZARCH
&& larl_operand (addr
, VOIDmode
))
3368 /* Access local symbols PC-relative via LARL.
3369 This is the same as in the non-PIC case, so it is
3370 handled automatically ... */
3374 /* Access local symbols relative to the GOT. */
3376 rtx temp
= reg
? reg
: gen_reg_rtx (Pmode
);
3378 if (reload_in_progress
|| reload_completed
)
3379 df_set_regs_ever_live (PIC_OFFSET_TABLE_REGNUM
, true);
3381 addr
= gen_rtx_UNSPEC (Pmode
, gen_rtvec (1, addr
), UNSPEC_GOTOFF
);
3382 addr
= gen_rtx_CONST (Pmode
, addr
);
3383 addr
= force_const_mem (Pmode
, addr
);
3384 emit_move_insn (temp
, addr
);
3386 new_rtx
= gen_rtx_PLUS (Pmode
, pic_offset_table_rtx
, temp
);
3389 s390_load_address (reg
, new_rtx
);
3394 else if (GET_CODE (addr
) == SYMBOL_REF
)
3397 reg
= gen_reg_rtx (Pmode
);
3401 /* Assume GOT offset < 4k. This is handled the same way
3402 in both 31- and 64-bit code (@GOT). */
3404 if (reload_in_progress
|| reload_completed
)
3405 df_set_regs_ever_live (PIC_OFFSET_TABLE_REGNUM
, true);
3407 new_rtx
= gen_rtx_UNSPEC (Pmode
, gen_rtvec (1, addr
), UNSPEC_GOT
);
3408 new_rtx
= gen_rtx_CONST (Pmode
, new_rtx
);
3409 new_rtx
= gen_rtx_PLUS (Pmode
, pic_offset_table_rtx
, new_rtx
);
3410 new_rtx
= gen_const_mem (Pmode
, new_rtx
);
3411 emit_move_insn (reg
, new_rtx
);
3414 else if (TARGET_CPU_ZARCH
)
3416 /* If the GOT offset might be >= 4k, we determine the position
3417 of the GOT entry via a PC-relative LARL (@GOTENT). */
3419 rtx temp
= reg
? reg
: gen_reg_rtx (Pmode
);
3421 gcc_assert (REGNO (temp
) >= FIRST_PSEUDO_REGISTER
3422 || REGNO_REG_CLASS (REGNO (temp
)) == ADDR_REGS
);
3424 new_rtx
= gen_rtx_UNSPEC (Pmode
, gen_rtvec (1, addr
), UNSPEC_GOTENT
);
3425 new_rtx
= gen_rtx_CONST (Pmode
, new_rtx
);
3429 emit_move_insn (temp
, new_rtx
);
3430 new_rtx
= gen_const_mem (Pmode
, temp
);
3433 new_rtx
= gen_const_mem (GET_MODE (reg
), new_rtx
);
3434 emit_move_insn (reg
, new_rtx
);
3439 /* If the GOT offset might be >= 4k, we have to load it
3440 from the literal pool (@GOT). */
3442 rtx temp
= reg
? reg
: gen_reg_rtx (Pmode
);
3444 gcc_assert (REGNO (temp
) >= FIRST_PSEUDO_REGISTER
3445 || REGNO_REG_CLASS (REGNO (temp
)) == ADDR_REGS
);
3447 if (reload_in_progress
|| reload_completed
)
3448 df_set_regs_ever_live (PIC_OFFSET_TABLE_REGNUM
, true);
3450 addr
= gen_rtx_UNSPEC (Pmode
, gen_rtvec (1, addr
), UNSPEC_GOT
);
3451 addr
= gen_rtx_CONST (Pmode
, addr
);
3452 addr
= force_const_mem (Pmode
, addr
);
3453 emit_move_insn (temp
, addr
);
3455 new_rtx
= gen_rtx_PLUS (Pmode
, pic_offset_table_rtx
, temp
);
3456 new_rtx
= gen_const_mem (Pmode
, new_rtx
);
3457 emit_move_insn (reg
, new_rtx
);
3463 if (GET_CODE (addr
) == CONST
)
3465 addr
= XEXP (addr
, 0);
3466 if (GET_CODE (addr
) == UNSPEC
)
3468 gcc_assert (XVECLEN (addr
, 0) == 1);
3469 switch (XINT (addr
, 1))
3471 /* If someone moved a GOT-relative UNSPEC
3472 out of the literal pool, force them back in. */
3475 new_rtx
= force_const_mem (Pmode
, orig
);
3478 /* @GOT is OK as is if small. */
3481 new_rtx
= force_const_mem (Pmode
, orig
);
3484 /* @GOTENT is OK as is. */
3488 /* @PLT is OK as is on 64-bit, must be converted to
3489 GOT-relative @PLTOFF on 31-bit. */
3491 if (!TARGET_CPU_ZARCH
)
3493 rtx temp
= reg
? reg
: gen_reg_rtx (Pmode
);
3495 if (reload_in_progress
|| reload_completed
)
3496 df_set_regs_ever_live (PIC_OFFSET_TABLE_REGNUM
, true);
3498 addr
= XVECEXP (addr
, 0, 0);
3499 addr
= gen_rtx_UNSPEC (Pmode
, gen_rtvec (1, addr
),
3501 addr
= gen_rtx_CONST (Pmode
, addr
);
3502 addr
= force_const_mem (Pmode
, addr
);
3503 emit_move_insn (temp
, addr
);
3505 new_rtx
= gen_rtx_PLUS (Pmode
, pic_offset_table_rtx
, temp
);
3508 s390_load_address (reg
, new_rtx
);
3514 /* Everything else cannot happen. */
3520 gcc_assert (GET_CODE (addr
) == PLUS
);
3522 if (GET_CODE (addr
) == PLUS
)
3524 rtx op0
= XEXP (addr
, 0), op1
= XEXP (addr
, 1);
3526 gcc_assert (!TLS_SYMBOLIC_CONST (op0
));
3527 gcc_assert (!TLS_SYMBOLIC_CONST (op1
));
3529 /* Check first to see if this is a constant offset
3530 from a local symbol reference. */
3531 if ((GET_CODE (op0
) == LABEL_REF
3532 || (GET_CODE (op0
) == SYMBOL_REF
&& SYMBOL_REF_LOCAL_P (op0
)))
3533 && GET_CODE (op1
) == CONST_INT
)
3535 if (TARGET_CPU_ZARCH
3536 && larl_operand (op0
, VOIDmode
)
3537 && INTVAL (op1
) < (HOST_WIDE_INT
)1 << 31
3538 && INTVAL (op1
) >= -((HOST_WIDE_INT
)1 << 31))
3540 if (INTVAL (op1
) & 1)
3542 /* LARL can't handle odd offsets, so emit a
3543 pair of LARL and LA. */
3544 rtx temp
= reg
? reg
: gen_reg_rtx (Pmode
);
3546 if (!DISP_IN_RANGE (INTVAL (op1
)))
3548 HOST_WIDE_INT even
= INTVAL (op1
) - 1;
3549 op0
= gen_rtx_PLUS (Pmode
, op0
, GEN_INT (even
));
3550 op0
= gen_rtx_CONST (Pmode
, op0
);
3554 emit_move_insn (temp
, op0
);
3555 new_rtx
= gen_rtx_PLUS (Pmode
, temp
, op1
);
3559 s390_load_address (reg
, new_rtx
);
3565 /* If the offset is even, we can just use LARL.
3566 This will happen automatically. */
3571 /* Access local symbols relative to the GOT. */
3573 rtx temp
= reg
? reg
: gen_reg_rtx (Pmode
);
3575 if (reload_in_progress
|| reload_completed
)
3576 df_set_regs_ever_live (PIC_OFFSET_TABLE_REGNUM
, true);
3578 addr
= gen_rtx_UNSPEC (Pmode
, gen_rtvec (1, op0
),
3580 addr
= gen_rtx_PLUS (Pmode
, addr
, op1
);
3581 addr
= gen_rtx_CONST (Pmode
, addr
);
3582 addr
= force_const_mem (Pmode
, addr
);
3583 emit_move_insn (temp
, addr
);
3585 new_rtx
= gen_rtx_PLUS (Pmode
, pic_offset_table_rtx
, temp
);
3588 s390_load_address (reg
, new_rtx
);
3594 /* Now, check whether it is a GOT relative symbol plus offset
3595 that was pulled out of the literal pool. Force it back in. */
3597 else if (GET_CODE (op0
) == UNSPEC
3598 && GET_CODE (op1
) == CONST_INT
3599 && XINT (op0
, 1) == UNSPEC_GOTOFF
)
3601 gcc_assert (XVECLEN (op0
, 0) == 1);
3603 new_rtx
= force_const_mem (Pmode
, orig
);
3606 /* Otherwise, compute the sum. */
3609 base
= legitimize_pic_address (XEXP (addr
, 0), reg
);
3610 new_rtx
= legitimize_pic_address (XEXP (addr
, 1),
3611 base
== reg
? NULL_RTX
: reg
);
3612 if (GET_CODE (new_rtx
) == CONST_INT
)
3613 new_rtx
= plus_constant (Pmode
, base
, INTVAL (new_rtx
));
3616 if (GET_CODE (new_rtx
) == PLUS
&& CONSTANT_P (XEXP (new_rtx
, 1)))
3618 base
= gen_rtx_PLUS (Pmode
, base
, XEXP (new_rtx
, 0));
3619 new_rtx
= XEXP (new_rtx
, 1);
3621 new_rtx
= gen_rtx_PLUS (Pmode
, base
, new_rtx
);
3624 if (GET_CODE (new_rtx
) == CONST
)
3625 new_rtx
= XEXP (new_rtx
, 0);
3626 new_rtx
= force_operand (new_rtx
, 0);
3633 /* Load the thread pointer into a register. */
3636 s390_get_thread_pointer (void)
3638 rtx tp
= gen_reg_rtx (Pmode
);
3640 emit_move_insn (tp
, gen_rtx_REG (Pmode
, TP_REGNUM
));
3641 mark_reg_pointer (tp
, BITS_PER_WORD
);
3646 /* Emit a tls call insn. The call target is the SYMBOL_REF stored
3647 in s390_tls_symbol which always refers to __tls_get_offset.
3648 The returned offset is written to RESULT_REG and an USE rtx is
3649 generated for TLS_CALL. */
3651 static GTY(()) rtx s390_tls_symbol
;
3654 s390_emit_tls_call_insn (rtx result_reg
, rtx tls_call
)
3659 emit_insn (s390_load_got ());
3661 if (!s390_tls_symbol
)
3662 s390_tls_symbol
= gen_rtx_SYMBOL_REF (Pmode
, "__tls_get_offset");
3664 insn
= s390_emit_call (s390_tls_symbol
, tls_call
, result_reg
,
3665 gen_rtx_REG (Pmode
, RETURN_REGNUM
));
3667 use_reg (&CALL_INSN_FUNCTION_USAGE (insn
), result_reg
);
3668 RTL_CONST_CALL_P (insn
) = 1;
3671 /* ADDR contains a thread-local SYMBOL_REF. Generate code to compute
3672 this (thread-local) address. REG may be used as temporary. */
3675 legitimize_tls_address (rtx addr
, rtx reg
)
3677 rtx new_rtx
, tls_call
, temp
, base
, r2
, insn
;
3679 if (GET_CODE (addr
) == SYMBOL_REF
)
3680 switch (tls_symbolic_operand (addr
))
3682 case TLS_MODEL_GLOBAL_DYNAMIC
:
3684 r2
= gen_rtx_REG (Pmode
, 2);
3685 tls_call
= gen_rtx_UNSPEC (Pmode
, gen_rtvec (1, addr
), UNSPEC_TLSGD
);
3686 new_rtx
= gen_rtx_CONST (Pmode
, tls_call
);
3687 new_rtx
= force_const_mem (Pmode
, new_rtx
);
3688 emit_move_insn (r2
, new_rtx
);
3689 s390_emit_tls_call_insn (r2
, tls_call
);
3690 insn
= get_insns ();
3693 new_rtx
= gen_rtx_UNSPEC (Pmode
, gen_rtvec (1, addr
), UNSPEC_NTPOFF
);
3694 temp
= gen_reg_rtx (Pmode
);
3695 emit_libcall_block (insn
, temp
, r2
, new_rtx
);
3697 new_rtx
= gen_rtx_PLUS (Pmode
, s390_get_thread_pointer (), temp
);
3700 s390_load_address (reg
, new_rtx
);
3705 case TLS_MODEL_LOCAL_DYNAMIC
:
3707 r2
= gen_rtx_REG (Pmode
, 2);
3708 tls_call
= gen_rtx_UNSPEC (Pmode
, gen_rtvec (1, const0_rtx
), UNSPEC_TLSLDM
);
3709 new_rtx
= gen_rtx_CONST (Pmode
, tls_call
);
3710 new_rtx
= force_const_mem (Pmode
, new_rtx
);
3711 emit_move_insn (r2
, new_rtx
);
3712 s390_emit_tls_call_insn (r2
, tls_call
);
3713 insn
= get_insns ();
3716 new_rtx
= gen_rtx_UNSPEC (Pmode
, gen_rtvec (1, const0_rtx
), UNSPEC_TLSLDM_NTPOFF
);
3717 temp
= gen_reg_rtx (Pmode
);
3718 emit_libcall_block (insn
, temp
, r2
, new_rtx
);
3720 new_rtx
= gen_rtx_PLUS (Pmode
, s390_get_thread_pointer (), temp
);
3721 base
= gen_reg_rtx (Pmode
);
3722 s390_load_address (base
, new_rtx
);
3724 new_rtx
= gen_rtx_UNSPEC (Pmode
, gen_rtvec (1, addr
), UNSPEC_DTPOFF
);
3725 new_rtx
= gen_rtx_CONST (Pmode
, new_rtx
);
3726 new_rtx
= force_const_mem (Pmode
, new_rtx
);
3727 temp
= gen_reg_rtx (Pmode
);
3728 emit_move_insn (temp
, new_rtx
);
3730 new_rtx
= gen_rtx_PLUS (Pmode
, base
, temp
);
3733 s390_load_address (reg
, new_rtx
);
3738 case TLS_MODEL_INITIAL_EXEC
:
3741 /* Assume GOT offset < 4k. This is handled the same way
3742 in both 31- and 64-bit code. */
3744 if (reload_in_progress
|| reload_completed
)
3745 df_set_regs_ever_live (PIC_OFFSET_TABLE_REGNUM
, true);
3747 new_rtx
= gen_rtx_UNSPEC (Pmode
, gen_rtvec (1, addr
), UNSPEC_GOTNTPOFF
);
3748 new_rtx
= gen_rtx_CONST (Pmode
, new_rtx
);
3749 new_rtx
= gen_rtx_PLUS (Pmode
, pic_offset_table_rtx
, new_rtx
);
3750 new_rtx
= gen_const_mem (Pmode
, new_rtx
);
3751 temp
= gen_reg_rtx (Pmode
);
3752 emit_move_insn (temp
, new_rtx
);
3754 else if (TARGET_CPU_ZARCH
)
3756 /* If the GOT offset might be >= 4k, we determine the position
3757 of the GOT entry via a PC-relative LARL. */
3759 new_rtx
= gen_rtx_UNSPEC (Pmode
, gen_rtvec (1, addr
), UNSPEC_INDNTPOFF
);
3760 new_rtx
= gen_rtx_CONST (Pmode
, new_rtx
);
3761 temp
= gen_reg_rtx (Pmode
);
3762 emit_move_insn (temp
, new_rtx
);
3764 new_rtx
= gen_const_mem (Pmode
, temp
);
3765 temp
= gen_reg_rtx (Pmode
);
3766 emit_move_insn (temp
, new_rtx
);
3770 /* If the GOT offset might be >= 4k, we have to load it
3771 from the literal pool. */
3773 if (reload_in_progress
|| reload_completed
)
3774 df_set_regs_ever_live (PIC_OFFSET_TABLE_REGNUM
, true);
3776 new_rtx
= gen_rtx_UNSPEC (Pmode
, gen_rtvec (1, addr
), UNSPEC_GOTNTPOFF
);
3777 new_rtx
= gen_rtx_CONST (Pmode
, new_rtx
);
3778 new_rtx
= force_const_mem (Pmode
, new_rtx
);
3779 temp
= gen_reg_rtx (Pmode
);
3780 emit_move_insn (temp
, new_rtx
);
3782 new_rtx
= gen_rtx_PLUS (Pmode
, pic_offset_table_rtx
, temp
);
3783 new_rtx
= gen_const_mem (Pmode
, new_rtx
);
3785 new_rtx
= gen_rtx_UNSPEC (Pmode
, gen_rtvec (2, new_rtx
, addr
), UNSPEC_TLS_LOAD
);
3786 temp
= gen_reg_rtx (Pmode
);
3787 emit_insn (gen_rtx_SET (Pmode
, temp
, new_rtx
));
3791 /* In position-dependent code, load the absolute address of
3792 the GOT entry from the literal pool. */
3794 new_rtx
= gen_rtx_UNSPEC (Pmode
, gen_rtvec (1, addr
), UNSPEC_INDNTPOFF
);
3795 new_rtx
= gen_rtx_CONST (Pmode
, new_rtx
);
3796 new_rtx
= force_const_mem (Pmode
, new_rtx
);
3797 temp
= gen_reg_rtx (Pmode
);
3798 emit_move_insn (temp
, new_rtx
);
3801 new_rtx
= gen_const_mem (Pmode
, new_rtx
);
3802 new_rtx
= gen_rtx_UNSPEC (Pmode
, gen_rtvec (2, new_rtx
, addr
), UNSPEC_TLS_LOAD
);
3803 temp
= gen_reg_rtx (Pmode
);
3804 emit_insn (gen_rtx_SET (Pmode
, temp
, new_rtx
));
3807 new_rtx
= gen_rtx_PLUS (Pmode
, s390_get_thread_pointer (), temp
);
3810 s390_load_address (reg
, new_rtx
);
3815 case TLS_MODEL_LOCAL_EXEC
:
3816 new_rtx
= gen_rtx_UNSPEC (Pmode
, gen_rtvec (1, addr
), UNSPEC_NTPOFF
);
3817 new_rtx
= gen_rtx_CONST (Pmode
, new_rtx
);
3818 new_rtx
= force_const_mem (Pmode
, new_rtx
);
3819 temp
= gen_reg_rtx (Pmode
);
3820 emit_move_insn (temp
, new_rtx
);
3822 new_rtx
= gen_rtx_PLUS (Pmode
, s390_get_thread_pointer (), temp
);
3825 s390_load_address (reg
, new_rtx
);
3834 else if (GET_CODE (addr
) == CONST
&& GET_CODE (XEXP (addr
, 0)) == UNSPEC
)
3836 switch (XINT (XEXP (addr
, 0), 1))
3838 case UNSPEC_INDNTPOFF
:
3839 gcc_assert (TARGET_CPU_ZARCH
);
3848 else if (GET_CODE (addr
) == CONST
&& GET_CODE (XEXP (addr
, 0)) == PLUS
3849 && GET_CODE (XEXP (XEXP (addr
, 0), 1)) == CONST_INT
)
3851 new_rtx
= XEXP (XEXP (addr
, 0), 0);
3852 if (GET_CODE (new_rtx
) != SYMBOL_REF
)
3853 new_rtx
= gen_rtx_CONST (Pmode
, new_rtx
);
3855 new_rtx
= legitimize_tls_address (new_rtx
, reg
);
3856 new_rtx
= plus_constant (Pmode
, new_rtx
,
3857 INTVAL (XEXP (XEXP (addr
, 0), 1)));
3858 new_rtx
= force_operand (new_rtx
, 0);
3862 gcc_unreachable (); /* for now ... */
3867 /* Emit insns making the address in operands[1] valid for a standard
3868 move to operands[0]. operands[1] is replaced by an address which
3869 should be used instead of the former RTX to emit the move
3873 emit_symbolic_move (rtx
*operands
)
3875 rtx temp
= !can_create_pseudo_p () ? operands
[0] : gen_reg_rtx (Pmode
);
3877 if (GET_CODE (operands
[0]) == MEM
)
3878 operands
[1] = force_reg (Pmode
, operands
[1]);
3879 else if (TLS_SYMBOLIC_CONST (operands
[1]))
3880 operands
[1] = legitimize_tls_address (operands
[1], temp
);
3882 operands
[1] = legitimize_pic_address (operands
[1], temp
);
3885 /* Try machine-dependent ways of modifying an illegitimate address X
3886 to be legitimate. If we find one, return the new, valid address.
3888 OLDX is the address as it was before break_out_memory_refs was called.
3889 In some cases it is useful to look at this to decide what needs to be done.
3891 MODE is the mode of the operand pointed to by X.
3893 When -fpic is used, special handling is needed for symbolic references.
3894 See comments by legitimize_pic_address for details. */
3897 s390_legitimize_address (rtx x
, rtx oldx ATTRIBUTE_UNUSED
,
3898 enum machine_mode mode ATTRIBUTE_UNUSED
)
3900 rtx constant_term
= const0_rtx
;
3902 if (TLS_SYMBOLIC_CONST (x
))
3904 x
= legitimize_tls_address (x
, 0);
3906 if (s390_legitimate_address_p (mode
, x
, FALSE
))
3909 else if (GET_CODE (x
) == PLUS
3910 && (TLS_SYMBOLIC_CONST (XEXP (x
, 0))
3911 || TLS_SYMBOLIC_CONST (XEXP (x
, 1))))
3917 if (SYMBOLIC_CONST (x
)
3918 || (GET_CODE (x
) == PLUS
3919 && (SYMBOLIC_CONST (XEXP (x
, 0))
3920 || SYMBOLIC_CONST (XEXP (x
, 1)))))
3921 x
= legitimize_pic_address (x
, 0);
3923 if (s390_legitimate_address_p (mode
, x
, FALSE
))
3927 x
= eliminate_constant_term (x
, &constant_term
);
3929 /* Optimize loading of large displacements by splitting them
3930 into the multiple of 4K and the rest; this allows the
3931 former to be CSE'd if possible.
3933 Don't do this if the displacement is added to a register
3934 pointing into the stack frame, as the offsets will
3935 change later anyway. */
3937 if (GET_CODE (constant_term
) == CONST_INT
3938 && !TARGET_LONG_DISPLACEMENT
3939 && !DISP_IN_RANGE (INTVAL (constant_term
))
3940 && !(REG_P (x
) && REGNO_PTR_FRAME_P (REGNO (x
))))
3942 HOST_WIDE_INT lower
= INTVAL (constant_term
) & 0xfff;
3943 HOST_WIDE_INT upper
= INTVAL (constant_term
) ^ lower
;
3945 rtx temp
= gen_reg_rtx (Pmode
);
3946 rtx val
= force_operand (GEN_INT (upper
), temp
);
3948 emit_move_insn (temp
, val
);
3950 x
= gen_rtx_PLUS (Pmode
, x
, temp
);
3951 constant_term
= GEN_INT (lower
);
3954 if (GET_CODE (x
) == PLUS
)
3956 if (GET_CODE (XEXP (x
, 0)) == REG
)
3958 rtx temp
= gen_reg_rtx (Pmode
);
3959 rtx val
= force_operand (XEXP (x
, 1), temp
);
3961 emit_move_insn (temp
, val
);
3963 x
= gen_rtx_PLUS (Pmode
, XEXP (x
, 0), temp
);
3966 else if (GET_CODE (XEXP (x
, 1)) == REG
)
3968 rtx temp
= gen_reg_rtx (Pmode
);
3969 rtx val
= force_operand (XEXP (x
, 0), temp
);
3971 emit_move_insn (temp
, val
);
3973 x
= gen_rtx_PLUS (Pmode
, temp
, XEXP (x
, 1));
3977 if (constant_term
!= const0_rtx
)
3978 x
= gen_rtx_PLUS (Pmode
, x
, constant_term
);
3983 /* Try a machine-dependent way of reloading an illegitimate address AD
3984 operand. If we find one, push the reload and return the new address.
3986 MODE is the mode of the enclosing MEM. OPNUM is the operand number
3987 and TYPE is the reload type of the current reload. */
3990 legitimize_reload_address (rtx ad
, enum machine_mode mode ATTRIBUTE_UNUSED
,
3991 int opnum
, int type
)
3993 if (!optimize
|| TARGET_LONG_DISPLACEMENT
)
3996 if (GET_CODE (ad
) == PLUS
)
3998 rtx tem
= simplify_binary_operation (PLUS
, Pmode
,
3999 XEXP (ad
, 0), XEXP (ad
, 1));
4004 if (GET_CODE (ad
) == PLUS
4005 && GET_CODE (XEXP (ad
, 0)) == REG
4006 && GET_CODE (XEXP (ad
, 1)) == CONST_INT
4007 && !DISP_IN_RANGE (INTVAL (XEXP (ad
, 1))))
4009 HOST_WIDE_INT lower
= INTVAL (XEXP (ad
, 1)) & 0xfff;
4010 HOST_WIDE_INT upper
= INTVAL (XEXP (ad
, 1)) ^ lower
;
4011 rtx cst
, tem
, new_rtx
;
4013 cst
= GEN_INT (upper
);
4014 if (!legitimate_reload_constant_p (cst
))
4015 cst
= force_const_mem (Pmode
, cst
);
4017 tem
= gen_rtx_PLUS (Pmode
, XEXP (ad
, 0), cst
);
4018 new_rtx
= gen_rtx_PLUS (Pmode
, tem
, GEN_INT (lower
));
4020 push_reload (XEXP (tem
, 1), 0, &XEXP (tem
, 1), 0,
4021 BASE_REG_CLASS
, Pmode
, VOIDmode
, 0, 0,
4022 opnum
, (enum reload_type
) type
);
4029 /* Emit code to move LEN bytes from DST to SRC. */
4032 s390_expand_movmem (rtx dst
, rtx src
, rtx len
)
4034 /* When tuning for z10 or higher we rely on the Glibc functions to
4035 do the right thing. Only for constant lengths below 64k we will
4036 generate inline code. */
4037 if (s390_tune
>= PROCESSOR_2097_Z10
4038 && (GET_CODE (len
) != CONST_INT
|| INTVAL (len
) > (1<<16)))
4041 if (GET_CODE (len
) == CONST_INT
&& INTVAL (len
) >= 0 && INTVAL (len
) <= 256)
4043 if (INTVAL (len
) > 0)
4044 emit_insn (gen_movmem_short (dst
, src
, GEN_INT (INTVAL (len
) - 1)));
4047 else if (TARGET_MVCLE
)
4049 emit_insn (gen_movmem_long (dst
, src
, convert_to_mode (Pmode
, len
, 1)));
4054 rtx dst_addr
, src_addr
, count
, blocks
, temp
;
4055 rtx loop_start_label
= gen_label_rtx ();
4056 rtx loop_end_label
= gen_label_rtx ();
4057 rtx end_label
= gen_label_rtx ();
4058 enum machine_mode mode
;
4060 mode
= GET_MODE (len
);
4061 if (mode
== VOIDmode
)
4064 dst_addr
= gen_reg_rtx (Pmode
);
4065 src_addr
= gen_reg_rtx (Pmode
);
4066 count
= gen_reg_rtx (mode
);
4067 blocks
= gen_reg_rtx (mode
);
4069 convert_move (count
, len
, 1);
4070 emit_cmp_and_jump_insns (count
, const0_rtx
,
4071 EQ
, NULL_RTX
, mode
, 1, end_label
);
4073 emit_move_insn (dst_addr
, force_operand (XEXP (dst
, 0), NULL_RTX
));
4074 emit_move_insn (src_addr
, force_operand (XEXP (src
, 0), NULL_RTX
));
4075 dst
= change_address (dst
, VOIDmode
, dst_addr
);
4076 src
= change_address (src
, VOIDmode
, src_addr
);
4078 temp
= expand_binop (mode
, add_optab
, count
, constm1_rtx
, count
, 1,
4081 emit_move_insn (count
, temp
);
4083 temp
= expand_binop (mode
, lshr_optab
, count
, GEN_INT (8), blocks
, 1,
4086 emit_move_insn (blocks
, temp
);
4088 emit_cmp_and_jump_insns (blocks
, const0_rtx
,
4089 EQ
, NULL_RTX
, mode
, 1, loop_end_label
);
4091 emit_label (loop_start_label
);
4094 && (GET_CODE (len
) != CONST_INT
|| INTVAL (len
) > 768))
4098 /* Issue a read prefetch for the +3 cache line. */
4099 prefetch
= gen_prefetch (gen_rtx_PLUS (Pmode
, src_addr
, GEN_INT (768)),
4100 const0_rtx
, const0_rtx
);
4101 PREFETCH_SCHEDULE_BARRIER_P (prefetch
) = true;
4102 emit_insn (prefetch
);
4104 /* Issue a write prefetch for the +3 cache line. */
4105 prefetch
= gen_prefetch (gen_rtx_PLUS (Pmode
, dst_addr
, GEN_INT (768)),
4106 const1_rtx
, const0_rtx
);
4107 PREFETCH_SCHEDULE_BARRIER_P (prefetch
) = true;
4108 emit_insn (prefetch
);
4111 emit_insn (gen_movmem_short (dst
, src
, GEN_INT (255)));
4112 s390_load_address (dst_addr
,
4113 gen_rtx_PLUS (Pmode
, dst_addr
, GEN_INT (256)));
4114 s390_load_address (src_addr
,
4115 gen_rtx_PLUS (Pmode
, src_addr
, GEN_INT (256)));
4117 temp
= expand_binop (mode
, add_optab
, blocks
, constm1_rtx
, blocks
, 1,
4120 emit_move_insn (blocks
, temp
);
4122 emit_cmp_and_jump_insns (blocks
, const0_rtx
,
4123 EQ
, NULL_RTX
, mode
, 1, loop_end_label
);
4125 emit_jump (loop_start_label
);
4126 emit_label (loop_end_label
);
4128 emit_insn (gen_movmem_short (dst
, src
,
4129 convert_to_mode (Pmode
, count
, 1)));
4130 emit_label (end_label
);
4135 /* Emit code to set LEN bytes at DST to VAL.
4136 Make use of clrmem if VAL is zero. */
4139 s390_expand_setmem (rtx dst
, rtx len
, rtx val
)
4141 if (GET_CODE (len
) == CONST_INT
&& INTVAL (len
) == 0)
4144 gcc_assert (GET_CODE (val
) == CONST_INT
|| GET_MODE (val
) == QImode
);
4146 if (GET_CODE (len
) == CONST_INT
&& INTVAL (len
) > 0 && INTVAL (len
) <= 257)
4148 if (val
== const0_rtx
&& INTVAL (len
) <= 256)
4149 emit_insn (gen_clrmem_short (dst
, GEN_INT (INTVAL (len
) - 1)));
4152 /* Initialize memory by storing the first byte. */
4153 emit_move_insn (adjust_address (dst
, QImode
, 0), val
);
4155 if (INTVAL (len
) > 1)
4157 /* Initiate 1 byte overlap move.
4158 The first byte of DST is propagated through DSTP1.
4159 Prepare a movmem for: DST+1 = DST (length = LEN - 1).
4160 DST is set to size 1 so the rest of the memory location
4161 does not count as source operand. */
4162 rtx dstp1
= adjust_address (dst
, VOIDmode
, 1);
4163 set_mem_size (dst
, 1);
4165 emit_insn (gen_movmem_short (dstp1
, dst
,
4166 GEN_INT (INTVAL (len
) - 2)));
4171 else if (TARGET_MVCLE
)
4173 val
= force_not_mem (convert_modes (Pmode
, QImode
, val
, 1));
4174 emit_insn (gen_setmem_long (dst
, convert_to_mode (Pmode
, len
, 1), val
));
4179 rtx dst_addr
, count
, blocks
, temp
, dstp1
= NULL_RTX
;
4180 rtx loop_start_label
= gen_label_rtx ();
4181 rtx loop_end_label
= gen_label_rtx ();
4182 rtx end_label
= gen_label_rtx ();
4183 enum machine_mode mode
;
4185 mode
= GET_MODE (len
);
4186 if (mode
== VOIDmode
)
4189 dst_addr
= gen_reg_rtx (Pmode
);
4190 count
= gen_reg_rtx (mode
);
4191 blocks
= gen_reg_rtx (mode
);
4193 convert_move (count
, len
, 1);
4194 emit_cmp_and_jump_insns (count
, const0_rtx
,
4195 EQ
, NULL_RTX
, mode
, 1, end_label
);
4197 emit_move_insn (dst_addr
, force_operand (XEXP (dst
, 0), NULL_RTX
));
4198 dst
= change_address (dst
, VOIDmode
, dst_addr
);
4200 if (val
== const0_rtx
)
4201 temp
= expand_binop (mode
, add_optab
, count
, constm1_rtx
, count
, 1,
4205 dstp1
= adjust_address (dst
, VOIDmode
, 1);
4206 set_mem_size (dst
, 1);
4208 /* Initialize memory by storing the first byte. */
4209 emit_move_insn (adjust_address (dst
, QImode
, 0), val
);
4211 /* If count is 1 we are done. */
4212 emit_cmp_and_jump_insns (count
, const1_rtx
,
4213 EQ
, NULL_RTX
, mode
, 1, end_label
);
4215 temp
= expand_binop (mode
, add_optab
, count
, GEN_INT (-2), count
, 1,
4219 emit_move_insn (count
, temp
);
4221 temp
= expand_binop (mode
, lshr_optab
, count
, GEN_INT (8), blocks
, 1,
4224 emit_move_insn (blocks
, temp
);
4226 emit_cmp_and_jump_insns (blocks
, const0_rtx
,
4227 EQ
, NULL_RTX
, mode
, 1, loop_end_label
);
4229 emit_label (loop_start_label
);
4232 && (GET_CODE (len
) != CONST_INT
|| INTVAL (len
) > 1024))
4234 /* Issue a write prefetch for the +4 cache line. */
4235 rtx prefetch
= gen_prefetch (gen_rtx_PLUS (Pmode
, dst_addr
,
4237 const1_rtx
, const0_rtx
);
4238 emit_insn (prefetch
);
4239 PREFETCH_SCHEDULE_BARRIER_P (prefetch
) = true;
4242 if (val
== const0_rtx
)
4243 emit_insn (gen_clrmem_short (dst
, GEN_INT (255)));
4245 emit_insn (gen_movmem_short (dstp1
, dst
, GEN_INT (255)));
4246 s390_load_address (dst_addr
,
4247 gen_rtx_PLUS (Pmode
, dst_addr
, GEN_INT (256)));
4249 temp
= expand_binop (mode
, add_optab
, blocks
, constm1_rtx
, blocks
, 1,
4252 emit_move_insn (blocks
, temp
);
4254 emit_cmp_and_jump_insns (blocks
, const0_rtx
,
4255 EQ
, NULL_RTX
, mode
, 1, loop_end_label
);
4257 emit_jump (loop_start_label
);
4258 emit_label (loop_end_label
);
4260 if (val
== const0_rtx
)
4261 emit_insn (gen_clrmem_short (dst
, convert_to_mode (Pmode
, count
, 1)));
4263 emit_insn (gen_movmem_short (dstp1
, dst
, convert_to_mode (Pmode
, count
, 1)));
4264 emit_label (end_label
);
4268 /* Emit code to compare LEN bytes at OP0 with those at OP1,
4269 and return the result in TARGET. */
4272 s390_expand_cmpmem (rtx target
, rtx op0
, rtx op1
, rtx len
)
4274 rtx ccreg
= gen_rtx_REG (CCUmode
, CC_REGNUM
);
4277 /* When tuning for z10 or higher we rely on the Glibc functions to
4278 do the right thing. Only for constant lengths below 64k we will
4279 generate inline code. */
4280 if (s390_tune
>= PROCESSOR_2097_Z10
4281 && (GET_CODE (len
) != CONST_INT
|| INTVAL (len
) > (1<<16)))
4284 /* As the result of CMPINT is inverted compared to what we need,
4285 we have to swap the operands. */
4286 tmp
= op0
; op0
= op1
; op1
= tmp
;
4288 if (GET_CODE (len
) == CONST_INT
&& INTVAL (len
) >= 0 && INTVAL (len
) <= 256)
4290 if (INTVAL (len
) > 0)
4292 emit_insn (gen_cmpmem_short (op0
, op1
, GEN_INT (INTVAL (len
) - 1)));
4293 emit_insn (gen_cmpint (target
, ccreg
));
4296 emit_move_insn (target
, const0_rtx
);
4298 else if (TARGET_MVCLE
)
4300 emit_insn (gen_cmpmem_long (op0
, op1
, convert_to_mode (Pmode
, len
, 1)));
4301 emit_insn (gen_cmpint (target
, ccreg
));
4305 rtx addr0
, addr1
, count
, blocks
, temp
;
4306 rtx loop_start_label
= gen_label_rtx ();
4307 rtx loop_end_label
= gen_label_rtx ();
4308 rtx end_label
= gen_label_rtx ();
4309 enum machine_mode mode
;
4311 mode
= GET_MODE (len
);
4312 if (mode
== VOIDmode
)
4315 addr0
= gen_reg_rtx (Pmode
);
4316 addr1
= gen_reg_rtx (Pmode
);
4317 count
= gen_reg_rtx (mode
);
4318 blocks
= gen_reg_rtx (mode
);
4320 convert_move (count
, len
, 1);
4321 emit_cmp_and_jump_insns (count
, const0_rtx
,
4322 EQ
, NULL_RTX
, mode
, 1, end_label
);
4324 emit_move_insn (addr0
, force_operand (XEXP (op0
, 0), NULL_RTX
));
4325 emit_move_insn (addr1
, force_operand (XEXP (op1
, 0), NULL_RTX
));
4326 op0
= change_address (op0
, VOIDmode
, addr0
);
4327 op1
= change_address (op1
, VOIDmode
, addr1
);
4329 temp
= expand_binop (mode
, add_optab
, count
, constm1_rtx
, count
, 1,
4332 emit_move_insn (count
, temp
);
4334 temp
= expand_binop (mode
, lshr_optab
, count
, GEN_INT (8), blocks
, 1,
4337 emit_move_insn (blocks
, temp
);
4339 emit_cmp_and_jump_insns (blocks
, const0_rtx
,
4340 EQ
, NULL_RTX
, mode
, 1, loop_end_label
);
4342 emit_label (loop_start_label
);
4345 && (GET_CODE (len
) != CONST_INT
|| INTVAL (len
) > 512))
4349 /* Issue a read prefetch for the +2 cache line of operand 1. */
4350 prefetch
= gen_prefetch (gen_rtx_PLUS (Pmode
, addr0
, GEN_INT (512)),
4351 const0_rtx
, const0_rtx
);
4352 emit_insn (prefetch
);
4353 PREFETCH_SCHEDULE_BARRIER_P (prefetch
) = true;
4355 /* Issue a read prefetch for the +2 cache line of operand 2. */
4356 prefetch
= gen_prefetch (gen_rtx_PLUS (Pmode
, addr1
, GEN_INT (512)),
4357 const0_rtx
, const0_rtx
);
4358 emit_insn (prefetch
);
4359 PREFETCH_SCHEDULE_BARRIER_P (prefetch
) = true;
4362 emit_insn (gen_cmpmem_short (op0
, op1
, GEN_INT (255)));
4363 temp
= gen_rtx_NE (VOIDmode
, ccreg
, const0_rtx
);
4364 temp
= gen_rtx_IF_THEN_ELSE (VOIDmode
, temp
,
4365 gen_rtx_LABEL_REF (VOIDmode
, end_label
), pc_rtx
);
4366 temp
= gen_rtx_SET (VOIDmode
, pc_rtx
, temp
);
4367 emit_jump_insn (temp
);
4369 s390_load_address (addr0
,
4370 gen_rtx_PLUS (Pmode
, addr0
, GEN_INT (256)));
4371 s390_load_address (addr1
,
4372 gen_rtx_PLUS (Pmode
, addr1
, GEN_INT (256)));
4374 temp
= expand_binop (mode
, add_optab
, blocks
, constm1_rtx
, blocks
, 1,
4377 emit_move_insn (blocks
, temp
);
4379 emit_cmp_and_jump_insns (blocks
, const0_rtx
,
4380 EQ
, NULL_RTX
, mode
, 1, loop_end_label
);
4382 emit_jump (loop_start_label
);
4383 emit_label (loop_end_label
);
4385 emit_insn (gen_cmpmem_short (op0
, op1
,
4386 convert_to_mode (Pmode
, count
, 1)));
4387 emit_label (end_label
);
4389 emit_insn (gen_cmpint (target
, ccreg
));
4395 /* Expand conditional increment or decrement using alc/slb instructions.
4396 Should generate code setting DST to either SRC or SRC + INCREMENT,
4397 depending on the result of the comparison CMP_OP0 CMP_CODE CMP_OP1.
4398 Returns true if successful, false otherwise.
4400 That makes it possible to implement some if-constructs without jumps e.g.:
4401 (borrow = CC0 | CC1 and carry = CC2 | CC3)
4402 unsigned int a, b, c;
4403 if (a < b) c++; -> CCU b > a -> CC2; c += carry;
4404 if (a < b) c--; -> CCL3 a - b -> borrow; c -= borrow;
4405 if (a <= b) c++; -> CCL3 b - a -> borrow; c += carry;
4406 if (a <= b) c--; -> CCU a <= b -> borrow; c -= borrow;
4408 Checks for EQ and NE with a nonzero value need an additional xor e.g.:
4409 if (a == b) c++; -> CCL3 a ^= b; 0 - a -> borrow; c += carry;
4410 if (a == b) c--; -> CCU a ^= b; a <= 0 -> CC0 | CC1; c -= borrow;
4411 if (a != b) c++; -> CCU a ^= b; a > 0 -> CC2; c += carry;
4412 if (a != b) c--; -> CCL3 a ^= b; 0 - a -> borrow; c -= borrow; */
4415 s390_expand_addcc (enum rtx_code cmp_code
, rtx cmp_op0
, rtx cmp_op1
,
4416 rtx dst
, rtx src
, rtx increment
)
4418 enum machine_mode cmp_mode
;
4419 enum machine_mode cc_mode
;
4425 if ((GET_MODE (cmp_op0
) == SImode
|| GET_MODE (cmp_op0
) == VOIDmode
)
4426 && (GET_MODE (cmp_op1
) == SImode
|| GET_MODE (cmp_op1
) == VOIDmode
))
4428 else if ((GET_MODE (cmp_op0
) == DImode
|| GET_MODE (cmp_op0
) == VOIDmode
)
4429 && (GET_MODE (cmp_op1
) == DImode
|| GET_MODE (cmp_op1
) == VOIDmode
))
4434 /* Try ADD LOGICAL WITH CARRY. */
4435 if (increment
== const1_rtx
)
4437 /* Determine CC mode to use. */
4438 if (cmp_code
== EQ
|| cmp_code
== NE
)
4440 if (cmp_op1
!= const0_rtx
)
4442 cmp_op0
= expand_simple_binop (cmp_mode
, XOR
, cmp_op0
, cmp_op1
,
4443 NULL_RTX
, 0, OPTAB_WIDEN
);
4444 cmp_op1
= const0_rtx
;
4447 cmp_code
= cmp_code
== EQ
? LEU
: GTU
;
4450 if (cmp_code
== LTU
|| cmp_code
== LEU
)
4455 cmp_code
= swap_condition (cmp_code
);
4472 /* Emit comparison instruction pattern. */
4473 if (!register_operand (cmp_op0
, cmp_mode
))
4474 cmp_op0
= force_reg (cmp_mode
, cmp_op0
);
4476 insn
= gen_rtx_SET (VOIDmode
, gen_rtx_REG (cc_mode
, CC_REGNUM
),
4477 gen_rtx_COMPARE (cc_mode
, cmp_op0
, cmp_op1
));
4478 /* We use insn_invalid_p here to add clobbers if required. */
4479 ret
= insn_invalid_p (emit_insn (insn
), false);
4482 /* Emit ALC instruction pattern. */
4483 op_res
= gen_rtx_fmt_ee (cmp_code
, GET_MODE (dst
),
4484 gen_rtx_REG (cc_mode
, CC_REGNUM
),
4487 if (src
!= const0_rtx
)
4489 if (!register_operand (src
, GET_MODE (dst
)))
4490 src
= force_reg (GET_MODE (dst
), src
);
4492 op_res
= gen_rtx_PLUS (GET_MODE (dst
), op_res
, src
);
4493 op_res
= gen_rtx_PLUS (GET_MODE (dst
), op_res
, const0_rtx
);
4496 p
= rtvec_alloc (2);
4498 gen_rtx_SET (VOIDmode
, dst
, op_res
);
4500 gen_rtx_CLOBBER (VOIDmode
, gen_rtx_REG (CCmode
, CC_REGNUM
));
4501 emit_insn (gen_rtx_PARALLEL (VOIDmode
, p
));
4506 /* Try SUBTRACT LOGICAL WITH BORROW. */
4507 if (increment
== constm1_rtx
)
4509 /* Determine CC mode to use. */
4510 if (cmp_code
== EQ
|| cmp_code
== NE
)
4512 if (cmp_op1
!= const0_rtx
)
4514 cmp_op0
= expand_simple_binop (cmp_mode
, XOR
, cmp_op0
, cmp_op1
,
4515 NULL_RTX
, 0, OPTAB_WIDEN
);
4516 cmp_op1
= const0_rtx
;
4519 cmp_code
= cmp_code
== EQ
? LEU
: GTU
;
4522 if (cmp_code
== GTU
|| cmp_code
== GEU
)
4527 cmp_code
= swap_condition (cmp_code
);
4544 /* Emit comparison instruction pattern. */
4545 if (!register_operand (cmp_op0
, cmp_mode
))
4546 cmp_op0
= force_reg (cmp_mode
, cmp_op0
);
4548 insn
= gen_rtx_SET (VOIDmode
, gen_rtx_REG (cc_mode
, CC_REGNUM
),
4549 gen_rtx_COMPARE (cc_mode
, cmp_op0
, cmp_op1
));
4550 /* We use insn_invalid_p here to add clobbers if required. */
4551 ret
= insn_invalid_p (emit_insn (insn
), false);
4554 /* Emit SLB instruction pattern. */
4555 if (!register_operand (src
, GET_MODE (dst
)))
4556 src
= force_reg (GET_MODE (dst
), src
);
4558 op_res
= gen_rtx_MINUS (GET_MODE (dst
),
4559 gen_rtx_MINUS (GET_MODE (dst
), src
, const0_rtx
),
4560 gen_rtx_fmt_ee (cmp_code
, GET_MODE (dst
),
4561 gen_rtx_REG (cc_mode
, CC_REGNUM
),
4563 p
= rtvec_alloc (2);
4565 gen_rtx_SET (VOIDmode
, dst
, op_res
);
4567 gen_rtx_CLOBBER (VOIDmode
, gen_rtx_REG (CCmode
, CC_REGNUM
));
4568 emit_insn (gen_rtx_PARALLEL (VOIDmode
, p
));
4576 /* Expand code for the insv template. Return true if successful. */
4579 s390_expand_insv (rtx dest
, rtx op1
, rtx op2
, rtx src
)
4581 int bitsize
= INTVAL (op1
);
4582 int bitpos
= INTVAL (op2
);
4583 enum machine_mode mode
= GET_MODE (dest
);
4584 enum machine_mode smode
;
4585 int smode_bsize
, mode_bsize
;
4588 /* Generate INSERT IMMEDIATE (IILL et al). */
4589 /* (set (ze (reg)) (const_int)). */
4591 && register_operand (dest
, word_mode
)
4592 && (bitpos
% 16) == 0
4593 && (bitsize
% 16) == 0
4594 && const_int_operand (src
, VOIDmode
))
4596 HOST_WIDE_INT val
= INTVAL (src
);
4597 int regpos
= bitpos
+ bitsize
;
4599 while (regpos
> bitpos
)
4601 enum machine_mode putmode
;
4604 if (TARGET_EXTIMM
&& (regpos
% 32 == 0) && (regpos
>= bitpos
+ 32))
4609 putsize
= GET_MODE_BITSIZE (putmode
);
4611 emit_move_insn (gen_rtx_ZERO_EXTRACT (word_mode
, dest
,
4614 gen_int_mode (val
, putmode
));
4617 gcc_assert (regpos
== bitpos
);
4621 smode
= smallest_mode_for_size (bitsize
, MODE_INT
);
4622 smode_bsize
= GET_MODE_BITSIZE (smode
);
4623 mode_bsize
= GET_MODE_BITSIZE (mode
);
4625 /* Generate STORE CHARACTERS UNDER MASK (STCM et al). */
4627 && (bitsize
% BITS_PER_UNIT
) == 0
4629 && (register_operand (src
, word_mode
)
4630 || const_int_operand (src
, VOIDmode
)))
4632 /* Emit standard pattern if possible. */
4633 if (smode_bsize
== bitsize
)
4635 emit_move_insn (adjust_address (dest
, smode
, 0),
4636 gen_lowpart (smode
, src
));
4640 /* (set (ze (mem)) (const_int)). */
4641 else if (const_int_operand (src
, VOIDmode
))
4643 int size
= bitsize
/ BITS_PER_UNIT
;
4644 rtx src_mem
= adjust_address (force_const_mem (word_mode
, src
),
4646 UNITS_PER_WORD
- size
);
4648 dest
= adjust_address (dest
, BLKmode
, 0);
4649 set_mem_size (dest
, size
);
4650 s390_expand_movmem (dest
, src_mem
, GEN_INT (size
));
4654 /* (set (ze (mem)) (reg)). */
4655 else if (register_operand (src
, word_mode
))
4658 emit_move_insn (gen_rtx_ZERO_EXTRACT (word_mode
, dest
, op1
,
4662 /* Emit st,stcmh sequence. */
4663 int stcmh_width
= bitsize
- 32;
4664 int size
= stcmh_width
/ BITS_PER_UNIT
;
4666 emit_move_insn (adjust_address (dest
, SImode
, size
),
4667 gen_lowpart (SImode
, src
));
4668 set_mem_size (dest
, size
);
4669 emit_move_insn (gen_rtx_ZERO_EXTRACT (word_mode
, dest
,
4670 GEN_INT (stcmh_width
),
4672 gen_rtx_LSHIFTRT (word_mode
, src
, GEN_INT (32)));
4678 /* Generate INSERT CHARACTERS UNDER MASK (IC, ICM et al). */
4679 if ((bitpos
% BITS_PER_UNIT
) == 0
4680 && (bitsize
% BITS_PER_UNIT
) == 0
4681 && (bitpos
& 32) == ((bitpos
+ bitsize
- 1) & 32)
4683 && (mode
== DImode
|| mode
== SImode
)
4684 && register_operand (dest
, mode
))
4686 /* Emit a strict_low_part pattern if possible. */
4687 if (smode_bsize
== bitsize
&& bitpos
== mode_bsize
- smode_bsize
)
4689 op
= gen_rtx_STRICT_LOW_PART (VOIDmode
, gen_lowpart (smode
, dest
));
4690 op
= gen_rtx_SET (VOIDmode
, op
, gen_lowpart (smode
, src
));
4691 clobber
= gen_rtx_CLOBBER (VOIDmode
, gen_rtx_REG (CCmode
, CC_REGNUM
));
4692 emit_insn (gen_rtx_PARALLEL (VOIDmode
, gen_rtvec (2, op
, clobber
)));
4696 /* ??? There are more powerful versions of ICM that are not
4697 completely represented in the md file. */
4700 /* For z10, generate ROTATE THEN INSERT SELECTED BITS (RISBG et al). */
4701 if (TARGET_Z10
&& (mode
== DImode
|| mode
== SImode
))
4703 enum machine_mode mode_s
= GET_MODE (src
);
4705 if (mode_s
== VOIDmode
)
4707 /* Assume const_int etc already in the proper mode. */
4708 src
= force_reg (mode
, src
);
4710 else if (mode_s
!= mode
)
4712 gcc_assert (GET_MODE_BITSIZE (mode_s
) >= bitsize
);
4713 src
= force_reg (mode_s
, src
);
4714 src
= gen_lowpart (mode
, src
);
4717 op
= gen_rtx_ZERO_EXTRACT (mode
, dest
, op1
, op2
),
4718 op
= gen_rtx_SET (VOIDmode
, op
, src
);
4719 clobber
= gen_rtx_CLOBBER (VOIDmode
, gen_rtx_REG (CCmode
, CC_REGNUM
));
4720 emit_insn (gen_rtx_PARALLEL (VOIDmode
, gen_rtvec (2, op
, clobber
)));
4728 /* A subroutine of s390_expand_cs_hqi and s390_expand_atomic which returns a
4729 register that holds VAL of mode MODE shifted by COUNT bits. */
4732 s390_expand_mask_and_shift (rtx val
, enum machine_mode mode
, rtx count
)
4734 val
= expand_simple_binop (SImode
, AND
, val
, GEN_INT (GET_MODE_MASK (mode
)),
4735 NULL_RTX
, 1, OPTAB_DIRECT
);
4736 return expand_simple_binop (SImode
, ASHIFT
, val
, count
,
4737 NULL_RTX
, 1, OPTAB_DIRECT
);
4740 /* Structure to hold the initial parameters for a compare_and_swap operation
4741 in HImode and QImode. */
4743 struct alignment_context
4745 rtx memsi
; /* SI aligned memory location. */
4746 rtx shift
; /* Bit offset with regard to lsb. */
4747 rtx modemask
; /* Mask of the HQImode shifted by SHIFT bits. */
4748 rtx modemaski
; /* ~modemask */
4749 bool aligned
; /* True if memory is aligned, false else. */
4752 /* A subroutine of s390_expand_cs_hqi and s390_expand_atomic to initialize
4753 structure AC for transparent simplifying, if the memory alignment is known
4754 to be at least 32bit. MEM is the memory location for the actual operation
4755 and MODE its mode. */
4758 init_alignment_context (struct alignment_context
*ac
, rtx mem
,
4759 enum machine_mode mode
)
4761 ac
->shift
= GEN_INT (GET_MODE_SIZE (SImode
) - GET_MODE_SIZE (mode
));
4762 ac
->aligned
= (MEM_ALIGN (mem
) >= GET_MODE_BITSIZE (SImode
));
4765 ac
->memsi
= adjust_address (mem
, SImode
, 0); /* Memory is aligned. */
4768 /* Alignment is unknown. */
4769 rtx byteoffset
, addr
, align
;
4771 /* Force the address into a register. */
4772 addr
= force_reg (Pmode
, XEXP (mem
, 0));
4774 /* Align it to SImode. */
4775 align
= expand_simple_binop (Pmode
, AND
, addr
,
4776 GEN_INT (-GET_MODE_SIZE (SImode
)),
4777 NULL_RTX
, 1, OPTAB_DIRECT
);
4779 ac
->memsi
= gen_rtx_MEM (SImode
, align
);
4780 MEM_VOLATILE_P (ac
->memsi
) = MEM_VOLATILE_P (mem
);
4781 set_mem_alias_set (ac
->memsi
, ALIAS_SET_MEMORY_BARRIER
);
4782 set_mem_align (ac
->memsi
, GET_MODE_BITSIZE (SImode
));
4784 /* Calculate shiftcount. */
4785 byteoffset
= expand_simple_binop (Pmode
, AND
, addr
,
4786 GEN_INT (GET_MODE_SIZE (SImode
) - 1),
4787 NULL_RTX
, 1, OPTAB_DIRECT
);
4788 /* As we already have some offset, evaluate the remaining distance. */
4789 ac
->shift
= expand_simple_binop (SImode
, MINUS
, ac
->shift
, byteoffset
,
4790 NULL_RTX
, 1, OPTAB_DIRECT
);
4793 /* Shift is the byte count, but we need the bitcount. */
4794 ac
->shift
= expand_simple_binop (SImode
, ASHIFT
, ac
->shift
, GEN_INT (3),
4795 NULL_RTX
, 1, OPTAB_DIRECT
);
4797 /* Calculate masks. */
4798 ac
->modemask
= expand_simple_binop (SImode
, ASHIFT
,
4799 GEN_INT (GET_MODE_MASK (mode
)),
4800 ac
->shift
, NULL_RTX
, 1, OPTAB_DIRECT
);
4801 ac
->modemaski
= expand_simple_unop (SImode
, NOT
, ac
->modemask
,
4805 /* A subroutine of s390_expand_cs_hqi. Insert INS into VAL. If possible,
4806 use a single insv insn into SEQ2. Otherwise, put prep insns in SEQ1 and
4807 perform the merge in SEQ2. */
4810 s390_two_part_insv (struct alignment_context
*ac
, rtx
*seq1
, rtx
*seq2
,
4811 enum machine_mode mode
, rtx val
, rtx ins
)
4818 tmp
= copy_to_mode_reg (SImode
, val
);
4819 if (s390_expand_insv (tmp
, GEN_INT (GET_MODE_BITSIZE (mode
)),
4823 *seq2
= get_insns ();
4830 /* Failed to use insv. Generate a two part shift and mask. */
4832 tmp
= s390_expand_mask_and_shift (ins
, mode
, ac
->shift
);
4833 *seq1
= get_insns ();
4837 tmp
= expand_simple_binop (SImode
, IOR
, tmp
, val
, NULL_RTX
, 1, OPTAB_DIRECT
);
4838 *seq2
= get_insns ();
4844 /* Expand an atomic compare and swap operation for HImode and QImode. MEM is
4845 the memory location, CMP the old value to compare MEM with and NEW_RTX the
4846 value to set if CMP == MEM. */
4849 s390_expand_cs_hqi (enum machine_mode mode
, rtx btarget
, rtx vtarget
, rtx mem
,
4850 rtx cmp
, rtx new_rtx
, bool is_weak
)
4852 struct alignment_context ac
;
4853 rtx cmpv
, newv
, val
, cc
, seq0
, seq1
, seq2
, seq3
;
4854 rtx res
= gen_reg_rtx (SImode
);
4855 rtx csloop
= NULL
, csend
= NULL
;
4857 gcc_assert (MEM_P (mem
));
4859 init_alignment_context (&ac
, mem
, mode
);
4861 /* Load full word. Subsequent loads are performed by CS. */
4862 val
= expand_simple_binop (SImode
, AND
, ac
.memsi
, ac
.modemaski
,
4863 NULL_RTX
, 1, OPTAB_DIRECT
);
4865 /* Prepare insertions of cmp and new_rtx into the loaded value. When
4866 possible, we try to use insv to make this happen efficiently. If
4867 that fails we'll generate code both inside and outside the loop. */
4868 cmpv
= s390_two_part_insv (&ac
, &seq0
, &seq2
, mode
, val
, cmp
);
4869 newv
= s390_two_part_insv (&ac
, &seq1
, &seq3
, mode
, val
, new_rtx
);
4876 /* Start CS loop. */
4879 /* Begin assuming success. */
4880 emit_move_insn (btarget
, const1_rtx
);
4882 csloop
= gen_label_rtx ();
4883 csend
= gen_label_rtx ();
4884 emit_label (csloop
);
4887 /* val = "<mem>00..0<mem>"
4888 * cmp = "00..0<cmp>00..0"
4889 * new = "00..0<new>00..0"
4895 cc
= s390_emit_compare_and_swap (EQ
, res
, ac
.memsi
, cmpv
, newv
);
4897 emit_insn (gen_cstorecc4 (btarget
, cc
, XEXP (cc
, 0), XEXP (cc
, 1)));
4902 /* Jump to end if we're done (likely?). */
4903 s390_emit_jump (csend
, cc
);
4905 /* Check for changes outside mode, and loop internal if so.
4906 Arrange the moves so that the compare is adjacent to the
4907 branch so that we can generate CRJ. */
4908 tmp
= copy_to_reg (val
);
4909 force_expand_binop (SImode
, and_optab
, res
, ac
.modemaski
, val
,
4911 cc
= s390_emit_compare (NE
, val
, tmp
);
4912 s390_emit_jump (csloop
, cc
);
4915 emit_move_insn (btarget
, const0_rtx
);
4919 /* Return the correct part of the bitfield. */
4920 convert_move (vtarget
, expand_simple_binop (SImode
, LSHIFTRT
, res
, ac
.shift
,
4921 NULL_RTX
, 1, OPTAB_DIRECT
), 1);
4924 /* Expand an atomic operation CODE of mode MODE. MEM is the memory location
4925 and VAL the value to play with. If AFTER is true then store the value
4926 MEM holds after the operation, if AFTER is false then store the value MEM
4927 holds before the operation. If TARGET is zero then discard that value, else
4928 store it to TARGET. */
4931 s390_expand_atomic (enum machine_mode mode
, enum rtx_code code
,
4932 rtx target
, rtx mem
, rtx val
, bool after
)
4934 struct alignment_context ac
;
4936 rtx new_rtx
= gen_reg_rtx (SImode
);
4937 rtx orig
= gen_reg_rtx (SImode
);
4938 rtx csloop
= gen_label_rtx ();
4940 gcc_assert (!target
|| register_operand (target
, VOIDmode
));
4941 gcc_assert (MEM_P (mem
));
4943 init_alignment_context (&ac
, mem
, mode
);
4945 /* Shift val to the correct bit positions.
4946 Preserve "icm", but prevent "ex icm". */
4947 if (!(ac
.aligned
&& code
== SET
&& MEM_P (val
)))
4948 val
= s390_expand_mask_and_shift (val
, mode
, ac
.shift
);
4950 /* Further preparation insns. */
4951 if (code
== PLUS
|| code
== MINUS
)
4952 emit_move_insn (orig
, val
);
4953 else if (code
== MULT
|| code
== AND
) /* val = "11..1<val>11..1" */
4954 val
= expand_simple_binop (SImode
, XOR
, val
, ac
.modemaski
,
4955 NULL_RTX
, 1, OPTAB_DIRECT
);
4957 /* Load full word. Subsequent loads are performed by CS. */
4958 cmp
= force_reg (SImode
, ac
.memsi
);
4960 /* Start CS loop. */
4961 emit_label (csloop
);
4962 emit_move_insn (new_rtx
, cmp
);
4964 /* Patch new with val at correct position. */
4969 val
= expand_simple_binop (SImode
, code
, new_rtx
, orig
,
4970 NULL_RTX
, 1, OPTAB_DIRECT
);
4971 val
= expand_simple_binop (SImode
, AND
, val
, ac
.modemask
,
4972 NULL_RTX
, 1, OPTAB_DIRECT
);
4975 if (ac
.aligned
&& MEM_P (val
))
4976 store_bit_field (new_rtx
, GET_MODE_BITSIZE (mode
), 0,
4980 new_rtx
= expand_simple_binop (SImode
, AND
, new_rtx
, ac
.modemaski
,
4981 NULL_RTX
, 1, OPTAB_DIRECT
);
4982 new_rtx
= expand_simple_binop (SImode
, IOR
, new_rtx
, val
,
4983 NULL_RTX
, 1, OPTAB_DIRECT
);
4989 new_rtx
= expand_simple_binop (SImode
, code
, new_rtx
, val
,
4990 NULL_RTX
, 1, OPTAB_DIRECT
);
4992 case MULT
: /* NAND */
4993 new_rtx
= expand_simple_binop (SImode
, AND
, new_rtx
, val
,
4994 NULL_RTX
, 1, OPTAB_DIRECT
);
4995 new_rtx
= expand_simple_binop (SImode
, XOR
, new_rtx
, ac
.modemask
,
4996 NULL_RTX
, 1, OPTAB_DIRECT
);
5002 s390_emit_jump (csloop
, s390_emit_compare_and_swap (NE
, cmp
,
5003 ac
.memsi
, cmp
, new_rtx
));
5005 /* Return the correct part of the bitfield. */
5007 convert_move (target
, expand_simple_binop (SImode
, LSHIFTRT
,
5008 after
? new_rtx
: cmp
, ac
.shift
,
5009 NULL_RTX
, 1, OPTAB_DIRECT
), 1);
5012 /* This is called from dwarf2out.c via TARGET_ASM_OUTPUT_DWARF_DTPREL.
5013 We need to emit DTP-relative relocations. */
5015 static void s390_output_dwarf_dtprel (FILE *, int, rtx
) ATTRIBUTE_UNUSED
;
5018 s390_output_dwarf_dtprel (FILE *file
, int size
, rtx x
)
5023 fputs ("\t.long\t", file
);
5026 fputs ("\t.quad\t", file
);
5031 output_addr_const (file
, x
);
5032 fputs ("@DTPOFF", file
);
5035 #ifdef TARGET_ALTERNATE_LONG_DOUBLE_MANGLING
5036 /* Implement TARGET_MANGLE_TYPE. */
5039 s390_mangle_type (const_tree type
)
5041 if (TYPE_MAIN_VARIANT (type
) == long_double_type_node
5042 && TARGET_LONG_DOUBLE_128
)
5045 /* For all other types, use normal C++ mangling. */
5050 /* In the name of slightly smaller debug output, and to cater to
5051 general assembler lossage, recognize various UNSPEC sequences
5052 and turn them back into a direct symbol reference. */
5055 s390_delegitimize_address (rtx orig_x
)
5059 orig_x
= delegitimize_mem_from_attrs (orig_x
);
5062 /* Extract the symbol ref from:
5063 (plus:SI (reg:SI 12 %r12)
5064 (const:SI (unspec:SI [(symbol_ref/f:SI ("*.LC0"))]
5065 UNSPEC_GOTOFF/PLTOFF)))
5067 (plus:SI (reg:SI 12 %r12)
5068 (const:SI (plus:SI (unspec:SI [(symbol_ref:SI ("L"))]
5069 UNSPEC_GOTOFF/PLTOFF)
5070 (const_int 4 [0x4])))) */
5071 if (GET_CODE (x
) == PLUS
5072 && REG_P (XEXP (x
, 0))
5073 && REGNO (XEXP (x
, 0)) == PIC_OFFSET_TABLE_REGNUM
5074 && GET_CODE (XEXP (x
, 1)) == CONST
)
5076 HOST_WIDE_INT offset
= 0;
5078 /* The const operand. */
5079 y
= XEXP (XEXP (x
, 1), 0);
5081 if (GET_CODE (y
) == PLUS
5082 && GET_CODE (XEXP (y
, 1)) == CONST_INT
)
5084 offset
= INTVAL (XEXP (y
, 1));
5088 if (GET_CODE (y
) == UNSPEC
5089 && (XINT (y
, 1) == UNSPEC_GOTOFF
5090 || XINT (y
, 1) == UNSPEC_PLTOFF
))
5091 return plus_constant (Pmode
, XVECEXP (y
, 0, 0), offset
);
5094 if (GET_CODE (x
) != MEM
)
5098 if (GET_CODE (x
) == PLUS
5099 && GET_CODE (XEXP (x
, 1)) == CONST
5100 && GET_CODE (XEXP (x
, 0)) == REG
5101 && REGNO (XEXP (x
, 0)) == PIC_OFFSET_TABLE_REGNUM
)
5103 y
= XEXP (XEXP (x
, 1), 0);
5104 if (GET_CODE (y
) == UNSPEC
5105 && XINT (y
, 1) == UNSPEC_GOT
)
5106 y
= XVECEXP (y
, 0, 0);
5110 else if (GET_CODE (x
) == CONST
)
5112 /* Extract the symbol ref from:
5113 (mem:QI (const:DI (unspec:DI [(symbol_ref:DI ("foo"))]
5114 UNSPEC_PLT/GOTENT))) */
5117 if (GET_CODE (y
) == UNSPEC
5118 && (XINT (y
, 1) == UNSPEC_GOTENT
5119 || XINT (y
, 1) == UNSPEC_PLT
))
5120 y
= XVECEXP (y
, 0, 0);
5127 if (GET_MODE (orig_x
) != Pmode
)
5129 if (GET_MODE (orig_x
) == BLKmode
)
5131 y
= lowpart_subreg (GET_MODE (orig_x
), y
, Pmode
);
5138 /* Output operand OP to stdio stream FILE.
5139 OP is an address (register + offset) which is not used to address data;
5140 instead the rightmost bits are interpreted as the value. */
5143 print_shift_count_operand (FILE *file
, rtx op
)
5145 HOST_WIDE_INT offset
;
5148 /* Extract base register and offset. */
5149 if (!s390_decompose_shift_count (op
, &base
, &offset
))
5155 gcc_assert (GET_CODE (base
) == REG
);
5156 gcc_assert (REGNO (base
) < FIRST_PSEUDO_REGISTER
);
5157 gcc_assert (REGNO_REG_CLASS (REGNO (base
)) == ADDR_REGS
);
5160 /* Offsets are constricted to twelve bits. */
5161 fprintf (file
, HOST_WIDE_INT_PRINT_DEC
, offset
& ((1 << 12) - 1));
5163 fprintf (file
, "(%s)", reg_names
[REGNO (base
)]);
5166 /* See 'get_some_local_dynamic_name'. */
5169 get_some_local_dynamic_name_1 (rtx
*px
, void *data ATTRIBUTE_UNUSED
)
5173 if (GET_CODE (x
) == SYMBOL_REF
&& CONSTANT_POOL_ADDRESS_P (x
))
5175 x
= get_pool_constant (x
);
5176 return for_each_rtx (&x
, get_some_local_dynamic_name_1
, 0);
5179 if (GET_CODE (x
) == SYMBOL_REF
5180 && tls_symbolic_operand (x
) == TLS_MODEL_LOCAL_DYNAMIC
)
5182 cfun
->machine
->some_ld_name
= XSTR (x
, 0);
5189 /* Locate some local-dynamic symbol still in use by this function
5190 so that we can print its name in local-dynamic base patterns. */
5193 get_some_local_dynamic_name (void)
5197 if (cfun
->machine
->some_ld_name
)
5198 return cfun
->machine
->some_ld_name
;
5200 for (insn
= get_insns (); insn
; insn
= NEXT_INSN (insn
))
5202 && for_each_rtx (&PATTERN (insn
), get_some_local_dynamic_name_1
, 0))
5203 return cfun
->machine
->some_ld_name
;
5208 /* Output machine-dependent UNSPECs occurring in address constant X
5209 in assembler syntax to stdio stream FILE. Returns true if the
5210 constant X could be recognized, false otherwise. */
5213 s390_output_addr_const_extra (FILE *file
, rtx x
)
5215 if (GET_CODE (x
) == UNSPEC
&& XVECLEN (x
, 0) == 1)
5216 switch (XINT (x
, 1))
5219 output_addr_const (file
, XVECEXP (x
, 0, 0));
5220 fprintf (file
, "@GOTENT");
5223 output_addr_const (file
, XVECEXP (x
, 0, 0));
5224 fprintf (file
, "@GOT");
5227 output_addr_const (file
, XVECEXP (x
, 0, 0));
5228 fprintf (file
, "@GOTOFF");
5231 output_addr_const (file
, XVECEXP (x
, 0, 0));
5232 fprintf (file
, "@PLT");
5235 output_addr_const (file
, XVECEXP (x
, 0, 0));
5236 fprintf (file
, "@PLTOFF");
5239 output_addr_const (file
, XVECEXP (x
, 0, 0));
5240 fprintf (file
, "@TLSGD");
5243 assemble_name (file
, get_some_local_dynamic_name ());
5244 fprintf (file
, "@TLSLDM");
5247 output_addr_const (file
, XVECEXP (x
, 0, 0));
5248 fprintf (file
, "@DTPOFF");
5251 output_addr_const (file
, XVECEXP (x
, 0, 0));
5252 fprintf (file
, "@NTPOFF");
5254 case UNSPEC_GOTNTPOFF
:
5255 output_addr_const (file
, XVECEXP (x
, 0, 0));
5256 fprintf (file
, "@GOTNTPOFF");
5258 case UNSPEC_INDNTPOFF
:
5259 output_addr_const (file
, XVECEXP (x
, 0, 0));
5260 fprintf (file
, "@INDNTPOFF");
5264 if (GET_CODE (x
) == UNSPEC
&& XVECLEN (x
, 0) == 2)
5265 switch (XINT (x
, 1))
5267 case UNSPEC_POOL_OFFSET
:
5268 x
= gen_rtx_MINUS (GET_MODE (x
), XVECEXP (x
, 0, 0), XVECEXP (x
, 0, 1));
5269 output_addr_const (file
, x
);
5275 /* Output address operand ADDR in assembler syntax to
5276 stdio stream FILE. */
5279 print_operand_address (FILE *file
, rtx addr
)
5281 struct s390_address ad
;
5283 if (s390_loadrelative_operand_p (addr
))
5287 output_operand_lossage ("symbolic memory references are "
5288 "only supported on z10 or later");
5291 output_addr_const (file
, addr
);
5295 if (!s390_decompose_address (addr
, &ad
)
5296 || (ad
.base
&& !REGNO_OK_FOR_BASE_P (REGNO (ad
.base
)))
5297 || (ad
.indx
&& !REGNO_OK_FOR_INDEX_P (REGNO (ad
.indx
))))
5298 output_operand_lossage ("cannot decompose address");
5301 output_addr_const (file
, ad
.disp
);
5303 fprintf (file
, "0");
5305 if (ad
.base
&& ad
.indx
)
5306 fprintf (file
, "(%s,%s)", reg_names
[REGNO (ad
.indx
)],
5307 reg_names
[REGNO (ad
.base
)]);
5309 fprintf (file
, "(%s)", reg_names
[REGNO (ad
.base
)]);
5312 /* Output operand X in assembler syntax to stdio stream FILE.
5313 CODE specified the format flag. The following format flags
5316 'C': print opcode suffix for branch condition.
5317 'D': print opcode suffix for inverse branch condition.
5318 'E': print opcode suffix for branch on index instruction.
5319 'J': print tls_load/tls_gdcall/tls_ldcall suffix
5320 'G': print the size of the operand in bytes.
5321 'O': print only the displacement of a memory reference.
5322 'R': print only the base register of a memory reference.
5323 'S': print S-type memory reference (base+displacement).
5324 'N': print the second word of a DImode operand.
5325 'M': print the second word of a TImode operand.
5326 'Y': print shift count operand.
5328 'b': print integer X as if it's an unsigned byte.
5329 'c': print integer X as if it's an signed byte.
5330 'x': print integer X as if it's an unsigned halfword.
5331 'h': print integer X as if it's a signed halfword.
5332 'i': print the first nonzero HImode part of X.
5333 'j': print the first HImode part unequal to -1 of X.
5334 'k': print the first nonzero SImode part of X.
5335 'm': print the first SImode part unequal to -1 of X.
5336 'o': print integer X as if it's an unsigned 32bit word. */
5339 print_operand (FILE *file
, rtx x
, int code
)
5344 fprintf (file
, s390_branch_condition_mnemonic (x
, FALSE
));
5348 fprintf (file
, s390_branch_condition_mnemonic (x
, TRUE
));
5352 if (GET_CODE (x
) == LE
)
5353 fprintf (file
, "l");
5354 else if (GET_CODE (x
) == GT
)
5355 fprintf (file
, "h");
5357 output_operand_lossage ("invalid comparison operator "
5358 "for 'E' output modifier");
5362 if (GET_CODE (x
) == SYMBOL_REF
)
5364 fprintf (file
, "%s", ":tls_load:");
5365 output_addr_const (file
, x
);
5367 else if (GET_CODE (x
) == UNSPEC
&& XINT (x
, 1) == UNSPEC_TLSGD
)
5369 fprintf (file
, "%s", ":tls_gdcall:");
5370 output_addr_const (file
, XVECEXP (x
, 0, 0));
5372 else if (GET_CODE (x
) == UNSPEC
&& XINT (x
, 1) == UNSPEC_TLSLDM
)
5374 fprintf (file
, "%s", ":tls_ldcall:");
5375 assemble_name (file
, get_some_local_dynamic_name ());
5378 output_operand_lossage ("invalid reference for 'J' output modifier");
5382 fprintf (file
, "%u", GET_MODE_SIZE (GET_MODE (x
)));
5387 struct s390_address ad
;
5392 output_operand_lossage ("memory reference expected for "
5393 "'O' output modifier");
5397 ret
= s390_decompose_address (XEXP (x
, 0), &ad
);
5400 || (ad
.base
&& !REGNO_OK_FOR_BASE_P (REGNO (ad
.base
)))
5403 output_operand_lossage ("invalid address for 'O' output modifier");
5408 output_addr_const (file
, ad
.disp
);
5410 fprintf (file
, "0");
5416 struct s390_address ad
;
5421 output_operand_lossage ("memory reference expected for "
5422 "'R' output modifier");
5426 ret
= s390_decompose_address (XEXP (x
, 0), &ad
);
5429 || (ad
.base
&& !REGNO_OK_FOR_BASE_P (REGNO (ad
.base
)))
5432 output_operand_lossage ("invalid address for 'R' output modifier");
5437 fprintf (file
, "%s", reg_names
[REGNO (ad
.base
)]);
5439 fprintf (file
, "0");
5445 struct s390_address ad
;
5450 output_operand_lossage ("memory reference expected for "
5451 "'S' output modifier");
5454 ret
= s390_decompose_address (XEXP (x
, 0), &ad
);
5457 || (ad
.base
&& !REGNO_OK_FOR_BASE_P (REGNO (ad
.base
)))
5460 output_operand_lossage ("invalid address for 'S' output modifier");
5465 output_addr_const (file
, ad
.disp
);
5467 fprintf (file
, "0");
5470 fprintf (file
, "(%s)", reg_names
[REGNO (ad
.base
)]);
5475 if (GET_CODE (x
) == REG
)
5476 x
= gen_rtx_REG (GET_MODE (x
), REGNO (x
) + 1);
5477 else if (GET_CODE (x
) == MEM
)
5478 x
= change_address (x
, VOIDmode
,
5479 plus_constant (Pmode
, XEXP (x
, 0), 4));
5481 output_operand_lossage ("register or memory expression expected "
5482 "for 'N' output modifier");
5486 if (GET_CODE (x
) == REG
)
5487 x
= gen_rtx_REG (GET_MODE (x
), REGNO (x
) + 1);
5488 else if (GET_CODE (x
) == MEM
)
5489 x
= change_address (x
, VOIDmode
,
5490 plus_constant (Pmode
, XEXP (x
, 0), 8));
5492 output_operand_lossage ("register or memory expression expected "
5493 "for 'M' output modifier");
5497 print_shift_count_operand (file
, x
);
5501 switch (GET_CODE (x
))
5504 fprintf (file
, "%s", reg_names
[REGNO (x
)]);
5508 output_address (XEXP (x
, 0));
5515 output_addr_const (file
, x
);
5520 fprintf (file
, HOST_WIDE_INT_PRINT_DEC
, INTVAL (x
) & 0xff);
5521 else if (code
== 'c')
5522 fprintf (file
, HOST_WIDE_INT_PRINT_DEC
, ((INTVAL (x
) & 0xff) ^ 0x80) - 0x80);
5523 else if (code
== 'x')
5524 fprintf (file
, HOST_WIDE_INT_PRINT_DEC
, INTVAL (x
) & 0xffff);
5525 else if (code
== 'h')
5526 fprintf (file
, HOST_WIDE_INT_PRINT_DEC
, ((INTVAL (x
) & 0xffff) ^ 0x8000) - 0x8000);
5527 else if (code
== 'i')
5528 fprintf (file
, HOST_WIDE_INT_PRINT_DEC
,
5529 s390_extract_part (x
, HImode
, 0));
5530 else if (code
== 'j')
5531 fprintf (file
, HOST_WIDE_INT_PRINT_DEC
,
5532 s390_extract_part (x
, HImode
, -1));
5533 else if (code
== 'k')
5534 fprintf (file
, HOST_WIDE_INT_PRINT_DEC
,
5535 s390_extract_part (x
, SImode
, 0));
5536 else if (code
== 'm')
5537 fprintf (file
, HOST_WIDE_INT_PRINT_DEC
,
5538 s390_extract_part (x
, SImode
, -1));
5539 else if (code
== 'o')
5540 fprintf (file
, HOST_WIDE_INT_PRINT_DEC
, INTVAL (x
) & 0xffffffff);
5542 fprintf (file
, HOST_WIDE_INT_PRINT_DEC
, INTVAL (x
));
5546 gcc_assert (GET_MODE (x
) == VOIDmode
);
5548 fprintf (file
, HOST_WIDE_INT_PRINT_DEC
, CONST_DOUBLE_LOW (x
) & 0xff);
5549 else if (code
== 'x')
5550 fprintf (file
, HOST_WIDE_INT_PRINT_DEC
, CONST_DOUBLE_LOW (x
) & 0xffff);
5551 else if (code
== 'h')
5552 fprintf (file
, HOST_WIDE_INT_PRINT_DEC
,
5553 ((CONST_DOUBLE_LOW (x
) & 0xffff) ^ 0x8000) - 0x8000);
5557 output_operand_lossage ("invalid constant - try using "
5558 "an output modifier");
5560 output_operand_lossage ("invalid constant for output modifier '%c'",
5567 output_operand_lossage ("invalid expression - try using "
5568 "an output modifier");
5570 output_operand_lossage ("invalid expression for output "
5571 "modifier '%c'", code
);
5576 /* Target hook for assembling integer objects. We need to define it
5577 here to work a round a bug in some versions of GAS, which couldn't
5578 handle values smaller than INT_MIN when printed in decimal. */
5581 s390_assemble_integer (rtx x
, unsigned int size
, int aligned_p
)
5583 if (size
== 8 && aligned_p
5584 && GET_CODE (x
) == CONST_INT
&& INTVAL (x
) < INT_MIN
)
5586 fprintf (asm_out_file
, "\t.quad\t" HOST_WIDE_INT_PRINT_HEX
"\n",
5590 return default_assemble_integer (x
, size
, aligned_p
);
5593 /* Returns true if register REGNO is used for forming
5594 a memory address in expression X. */
5597 reg_used_in_mem_p (int regno
, rtx x
)
5599 enum rtx_code code
= GET_CODE (x
);
5605 if (refers_to_regno_p (regno
, regno
+1,
5609 else if (code
== SET
5610 && GET_CODE (SET_DEST (x
)) == PC
)
5612 if (refers_to_regno_p (regno
, regno
+1,
5617 fmt
= GET_RTX_FORMAT (code
);
5618 for (i
= GET_RTX_LENGTH (code
) - 1; i
>= 0; i
--)
5621 && reg_used_in_mem_p (regno
, XEXP (x
, i
)))
5624 else if (fmt
[i
] == 'E')
5625 for (j
= 0; j
< XVECLEN (x
, i
); j
++)
5626 if (reg_used_in_mem_p (regno
, XVECEXP (x
, i
, j
)))
5632 /* Returns true if expression DEP_RTX sets an address register
5633 used by instruction INSN to address memory. */
5636 addr_generation_dependency_p (rtx dep_rtx
, rtx insn
)
5640 if (GET_CODE (dep_rtx
) == INSN
)
5641 dep_rtx
= PATTERN (dep_rtx
);
5643 if (GET_CODE (dep_rtx
) == SET
)
5645 target
= SET_DEST (dep_rtx
);
5646 if (GET_CODE (target
) == STRICT_LOW_PART
)
5647 target
= XEXP (target
, 0);
5648 while (GET_CODE (target
) == SUBREG
)
5649 target
= SUBREG_REG (target
);
5651 if (GET_CODE (target
) == REG
)
5653 int regno
= REGNO (target
);
5655 if (s390_safe_attr_type (insn
) == TYPE_LA
)
5657 pat
= PATTERN (insn
);
5658 if (GET_CODE (pat
) == PARALLEL
)
5660 gcc_assert (XVECLEN (pat
, 0) == 2);
5661 pat
= XVECEXP (pat
, 0, 0);
5663 gcc_assert (GET_CODE (pat
) == SET
);
5664 return refers_to_regno_p (regno
, regno
+1, SET_SRC (pat
), 0);
5666 else if (get_attr_atype (insn
) == ATYPE_AGEN
)
5667 return reg_used_in_mem_p (regno
, PATTERN (insn
));
5673 /* Return 1, if dep_insn sets register used in insn in the agen unit. */
5676 s390_agen_dep_p (rtx dep_insn
, rtx insn
)
5678 rtx dep_rtx
= PATTERN (dep_insn
);
5681 if (GET_CODE (dep_rtx
) == SET
5682 && addr_generation_dependency_p (dep_rtx
, insn
))
5684 else if (GET_CODE (dep_rtx
) == PARALLEL
)
5686 for (i
= 0; i
< XVECLEN (dep_rtx
, 0); i
++)
5688 if (addr_generation_dependency_p (XVECEXP (dep_rtx
, 0, i
), insn
))
5696 /* A C statement (sans semicolon) to update the integer scheduling priority
5697 INSN_PRIORITY (INSN). Increase the priority to execute the INSN earlier,
5698 reduce the priority to execute INSN later. Do not define this macro if
5699 you do not need to adjust the scheduling priorities of insns.
5701 A STD instruction should be scheduled earlier,
5702 in order to use the bypass. */
5704 s390_adjust_priority (rtx insn ATTRIBUTE_UNUSED
, int priority
)
5706 if (! INSN_P (insn
))
5709 if (s390_tune
!= PROCESSOR_2084_Z990
5710 && s390_tune
!= PROCESSOR_2094_Z9_109
5711 && s390_tune
!= PROCESSOR_2097_Z10
5712 && s390_tune
!= PROCESSOR_2817_Z196
)
5715 switch (s390_safe_attr_type (insn
))
5719 priority
= priority
<< 3;
5723 priority
= priority
<< 1;
5732 /* The number of instructions that can be issued per cycle. */
5735 s390_issue_rate (void)
5739 case PROCESSOR_2084_Z990
:
5740 case PROCESSOR_2094_Z9_109
:
5741 case PROCESSOR_2817_Z196
:
5743 case PROCESSOR_2097_Z10
:
5751 s390_first_cycle_multipass_dfa_lookahead (void)
5756 /* Annotate every literal pool reference in X by an UNSPEC_LTREF expression.
5757 Fix up MEMs as required. */
5760 annotate_constant_pool_refs (rtx
*x
)
5765 gcc_assert (GET_CODE (*x
) != SYMBOL_REF
5766 || !CONSTANT_POOL_ADDRESS_P (*x
));
5768 /* Literal pool references can only occur inside a MEM ... */
5769 if (GET_CODE (*x
) == MEM
)
5771 rtx memref
= XEXP (*x
, 0);
5773 if (GET_CODE (memref
) == SYMBOL_REF
5774 && CONSTANT_POOL_ADDRESS_P (memref
))
5776 rtx base
= cfun
->machine
->base_reg
;
5777 rtx addr
= gen_rtx_UNSPEC (Pmode
, gen_rtvec (2, memref
, base
),
5780 *x
= replace_equiv_address (*x
, addr
);
5784 if (GET_CODE (memref
) == CONST
5785 && GET_CODE (XEXP (memref
, 0)) == PLUS
5786 && GET_CODE (XEXP (XEXP (memref
, 0), 1)) == CONST_INT
5787 && GET_CODE (XEXP (XEXP (memref
, 0), 0)) == SYMBOL_REF
5788 && CONSTANT_POOL_ADDRESS_P (XEXP (XEXP (memref
, 0), 0)))
5790 HOST_WIDE_INT off
= INTVAL (XEXP (XEXP (memref
, 0), 1));
5791 rtx sym
= XEXP (XEXP (memref
, 0), 0);
5792 rtx base
= cfun
->machine
->base_reg
;
5793 rtx addr
= gen_rtx_UNSPEC (Pmode
, gen_rtvec (2, sym
, base
),
5796 *x
= replace_equiv_address (*x
, plus_constant (Pmode
, addr
, off
));
5801 /* ... or a load-address type pattern. */
5802 if (GET_CODE (*x
) == SET
)
5804 rtx addrref
= SET_SRC (*x
);
5806 if (GET_CODE (addrref
) == SYMBOL_REF
5807 && CONSTANT_POOL_ADDRESS_P (addrref
))
5809 rtx base
= cfun
->machine
->base_reg
;
5810 rtx addr
= gen_rtx_UNSPEC (Pmode
, gen_rtvec (2, addrref
, base
),
5813 SET_SRC (*x
) = addr
;
5817 if (GET_CODE (addrref
) == CONST
5818 && GET_CODE (XEXP (addrref
, 0)) == PLUS
5819 && GET_CODE (XEXP (XEXP (addrref
, 0), 1)) == CONST_INT
5820 && GET_CODE (XEXP (XEXP (addrref
, 0), 0)) == SYMBOL_REF
5821 && CONSTANT_POOL_ADDRESS_P (XEXP (XEXP (addrref
, 0), 0)))
5823 HOST_WIDE_INT off
= INTVAL (XEXP (XEXP (addrref
, 0), 1));
5824 rtx sym
= XEXP (XEXP (addrref
, 0), 0);
5825 rtx base
= cfun
->machine
->base_reg
;
5826 rtx addr
= gen_rtx_UNSPEC (Pmode
, gen_rtvec (2, sym
, base
),
5829 SET_SRC (*x
) = plus_constant (Pmode
, addr
, off
);
5834 /* Annotate LTREL_BASE as well. */
5835 if (GET_CODE (*x
) == UNSPEC
5836 && XINT (*x
, 1) == UNSPEC_LTREL_BASE
)
5838 rtx base
= cfun
->machine
->base_reg
;
5839 *x
= gen_rtx_UNSPEC (Pmode
, gen_rtvec (2, XVECEXP (*x
, 0, 0), base
),
5844 fmt
= GET_RTX_FORMAT (GET_CODE (*x
));
5845 for (i
= GET_RTX_LENGTH (GET_CODE (*x
)) - 1; i
>= 0; i
--)
5849 annotate_constant_pool_refs (&XEXP (*x
, i
));
5851 else if (fmt
[i
] == 'E')
5853 for (j
= 0; j
< XVECLEN (*x
, i
); j
++)
5854 annotate_constant_pool_refs (&XVECEXP (*x
, i
, j
));
5859 /* Split all branches that exceed the maximum distance.
5860 Returns true if this created a new literal pool entry. */
5863 s390_split_branches (void)
5865 rtx temp_reg
= gen_rtx_REG (Pmode
, RETURN_REGNUM
);
5866 int new_literal
= 0, ret
;
5867 rtx insn
, pat
, tmp
, target
;
5870 /* We need correct insn addresses. */
5872 shorten_branches (get_insns ());
5874 /* Find all branches that exceed 64KB, and split them. */
5876 for (insn
= get_insns (); insn
; insn
= NEXT_INSN (insn
))
5878 if (GET_CODE (insn
) != JUMP_INSN
)
5881 pat
= PATTERN (insn
);
5882 if (GET_CODE (pat
) == PARALLEL
&& XVECLEN (pat
, 0) > 2)
5883 pat
= XVECEXP (pat
, 0, 0);
5884 if (GET_CODE (pat
) != SET
|| SET_DEST (pat
) != pc_rtx
)
5887 if (GET_CODE (SET_SRC (pat
)) == LABEL_REF
)
5889 label
= &SET_SRC (pat
);
5891 else if (GET_CODE (SET_SRC (pat
)) == IF_THEN_ELSE
)
5893 if (GET_CODE (XEXP (SET_SRC (pat
), 1)) == LABEL_REF
)
5894 label
= &XEXP (SET_SRC (pat
), 1);
5895 else if (GET_CODE (XEXP (SET_SRC (pat
), 2)) == LABEL_REF
)
5896 label
= &XEXP (SET_SRC (pat
), 2);
5903 if (get_attr_length (insn
) <= 4)
5906 /* We are going to use the return register as scratch register,
5907 make sure it will be saved/restored by the prologue/epilogue. */
5908 cfun_frame_layout
.save_return_addr_p
= 1;
5913 tmp
= force_const_mem (Pmode
, *label
);
5914 tmp
= emit_insn_before (gen_rtx_SET (Pmode
, temp_reg
, tmp
), insn
);
5915 INSN_ADDRESSES_NEW (tmp
, -1);
5916 annotate_constant_pool_refs (&PATTERN (tmp
));
5923 target
= gen_rtx_UNSPEC (Pmode
, gen_rtvec (1, *label
),
5924 UNSPEC_LTREL_OFFSET
);
5925 target
= gen_rtx_CONST (Pmode
, target
);
5926 target
= force_const_mem (Pmode
, target
);
5927 tmp
= emit_insn_before (gen_rtx_SET (Pmode
, temp_reg
, target
), insn
);
5928 INSN_ADDRESSES_NEW (tmp
, -1);
5929 annotate_constant_pool_refs (&PATTERN (tmp
));
5931 target
= gen_rtx_UNSPEC (Pmode
, gen_rtvec (2, XEXP (target
, 0),
5932 cfun
->machine
->base_reg
),
5934 target
= gen_rtx_PLUS (Pmode
, temp_reg
, target
);
5937 ret
= validate_change (insn
, label
, target
, 0);
5945 /* Find an annotated literal pool symbol referenced in RTX X,
5946 and store it at REF. Will abort if X contains references to
5947 more than one such pool symbol; multiple references to the same
5948 symbol are allowed, however.
5950 The rtx pointed to by REF must be initialized to NULL_RTX
5951 by the caller before calling this routine. */
5954 find_constant_pool_ref (rtx x
, rtx
*ref
)
5959 /* Ignore LTREL_BASE references. */
5960 if (GET_CODE (x
) == UNSPEC
5961 && XINT (x
, 1) == UNSPEC_LTREL_BASE
)
5963 /* Likewise POOL_ENTRY insns. */
5964 if (GET_CODE (x
) == UNSPEC_VOLATILE
5965 && XINT (x
, 1) == UNSPECV_POOL_ENTRY
)
5968 gcc_assert (GET_CODE (x
) != SYMBOL_REF
5969 || !CONSTANT_POOL_ADDRESS_P (x
));
5971 if (GET_CODE (x
) == UNSPEC
&& XINT (x
, 1) == UNSPEC_LTREF
)
5973 rtx sym
= XVECEXP (x
, 0, 0);
5974 gcc_assert (GET_CODE (sym
) == SYMBOL_REF
5975 && CONSTANT_POOL_ADDRESS_P (sym
));
5977 if (*ref
== NULL_RTX
)
5980 gcc_assert (*ref
== sym
);
5985 fmt
= GET_RTX_FORMAT (GET_CODE (x
));
5986 for (i
= GET_RTX_LENGTH (GET_CODE (x
)) - 1; i
>= 0; i
--)
5990 find_constant_pool_ref (XEXP (x
, i
), ref
);
5992 else if (fmt
[i
] == 'E')
5994 for (j
= 0; j
< XVECLEN (x
, i
); j
++)
5995 find_constant_pool_ref (XVECEXP (x
, i
, j
), ref
);
6000 /* Replace every reference to the annotated literal pool
6001 symbol REF in X by its base plus OFFSET. */
6004 replace_constant_pool_ref (rtx
*x
, rtx ref
, rtx offset
)
6009 gcc_assert (*x
!= ref
);
6011 if (GET_CODE (*x
) == UNSPEC
6012 && XINT (*x
, 1) == UNSPEC_LTREF
6013 && XVECEXP (*x
, 0, 0) == ref
)
6015 *x
= gen_rtx_PLUS (Pmode
, XVECEXP (*x
, 0, 1), offset
);
6019 if (GET_CODE (*x
) == PLUS
6020 && GET_CODE (XEXP (*x
, 1)) == CONST_INT
6021 && GET_CODE (XEXP (*x
, 0)) == UNSPEC
6022 && XINT (XEXP (*x
, 0), 1) == UNSPEC_LTREF
6023 && XVECEXP (XEXP (*x
, 0), 0, 0) == ref
)
6025 rtx addr
= gen_rtx_PLUS (Pmode
, XVECEXP (XEXP (*x
, 0), 0, 1), offset
);
6026 *x
= plus_constant (Pmode
, addr
, INTVAL (XEXP (*x
, 1)));
6030 fmt
= GET_RTX_FORMAT (GET_CODE (*x
));
6031 for (i
= GET_RTX_LENGTH (GET_CODE (*x
)) - 1; i
>= 0; i
--)
6035 replace_constant_pool_ref (&XEXP (*x
, i
), ref
, offset
);
6037 else if (fmt
[i
] == 'E')
6039 for (j
= 0; j
< XVECLEN (*x
, i
); j
++)
6040 replace_constant_pool_ref (&XVECEXP (*x
, i
, j
), ref
, offset
);
6045 /* Check whether X contains an UNSPEC_LTREL_BASE.
6046 Return its constant pool symbol if found, NULL_RTX otherwise. */
6049 find_ltrel_base (rtx x
)
6054 if (GET_CODE (x
) == UNSPEC
6055 && XINT (x
, 1) == UNSPEC_LTREL_BASE
)
6056 return XVECEXP (x
, 0, 0);
6058 fmt
= GET_RTX_FORMAT (GET_CODE (x
));
6059 for (i
= GET_RTX_LENGTH (GET_CODE (x
)) - 1; i
>= 0; i
--)
6063 rtx fnd
= find_ltrel_base (XEXP (x
, i
));
6067 else if (fmt
[i
] == 'E')
6069 for (j
= 0; j
< XVECLEN (x
, i
); j
++)
6071 rtx fnd
= find_ltrel_base (XVECEXP (x
, i
, j
));
6081 /* Replace any occurrence of UNSPEC_LTREL_BASE in X with its base. */
6084 replace_ltrel_base (rtx
*x
)
6089 if (GET_CODE (*x
) == UNSPEC
6090 && XINT (*x
, 1) == UNSPEC_LTREL_BASE
)
6092 *x
= XVECEXP (*x
, 0, 1);
6096 fmt
= GET_RTX_FORMAT (GET_CODE (*x
));
6097 for (i
= GET_RTX_LENGTH (GET_CODE (*x
)) - 1; i
>= 0; i
--)
6101 replace_ltrel_base (&XEXP (*x
, i
));
6103 else if (fmt
[i
] == 'E')
6105 for (j
= 0; j
< XVECLEN (*x
, i
); j
++)
6106 replace_ltrel_base (&XVECEXP (*x
, i
, j
));
6112 /* We keep a list of constants which we have to add to internal
6113 constant tables in the middle of large functions. */
6115 #define NR_C_MODES 11
6116 enum machine_mode constant_modes
[NR_C_MODES
] =
6118 TFmode
, TImode
, TDmode
,
6119 DFmode
, DImode
, DDmode
,
6120 SFmode
, SImode
, SDmode
,
6127 struct constant
*next
;
6132 struct constant_pool
6134 struct constant_pool
*next
;
6138 rtx emit_pool_after
;
6140 struct constant
*constants
[NR_C_MODES
];
6141 struct constant
*execute
;
6146 /* Allocate new constant_pool structure. */
6148 static struct constant_pool
*
6149 s390_alloc_pool (void)
6151 struct constant_pool
*pool
;
6154 pool
= (struct constant_pool
*) xmalloc (sizeof *pool
);
6156 for (i
= 0; i
< NR_C_MODES
; i
++)
6157 pool
->constants
[i
] = NULL
;
6159 pool
->execute
= NULL
;
6160 pool
->label
= gen_label_rtx ();
6161 pool
->first_insn
= NULL_RTX
;
6162 pool
->pool_insn
= NULL_RTX
;
6163 pool
->insns
= BITMAP_ALLOC (NULL
);
6165 pool
->emit_pool_after
= NULL_RTX
;
6170 /* Create new constant pool covering instructions starting at INSN
6171 and chain it to the end of POOL_LIST. */
6173 static struct constant_pool
*
6174 s390_start_pool (struct constant_pool
**pool_list
, rtx insn
)
6176 struct constant_pool
*pool
, **prev
;
6178 pool
= s390_alloc_pool ();
6179 pool
->first_insn
= insn
;
6181 for (prev
= pool_list
; *prev
; prev
= &(*prev
)->next
)
6188 /* End range of instructions covered by POOL at INSN and emit
6189 placeholder insn representing the pool. */
6192 s390_end_pool (struct constant_pool
*pool
, rtx insn
)
6194 rtx pool_size
= GEN_INT (pool
->size
+ 8 /* alignment slop */);
6197 insn
= get_last_insn ();
6199 pool
->pool_insn
= emit_insn_after (gen_pool (pool_size
), insn
);
6200 INSN_ADDRESSES_NEW (pool
->pool_insn
, -1);
6203 /* Add INSN to the list of insns covered by POOL. */
6206 s390_add_pool_insn (struct constant_pool
*pool
, rtx insn
)
6208 bitmap_set_bit (pool
->insns
, INSN_UID (insn
));
6211 /* Return pool out of POOL_LIST that covers INSN. */
6213 static struct constant_pool
*
6214 s390_find_pool (struct constant_pool
*pool_list
, rtx insn
)
6216 struct constant_pool
*pool
;
6218 for (pool
= pool_list
; pool
; pool
= pool
->next
)
6219 if (bitmap_bit_p (pool
->insns
, INSN_UID (insn
)))
6225 /* Add constant VAL of mode MODE to the constant pool POOL. */
6228 s390_add_constant (struct constant_pool
*pool
, rtx val
, enum machine_mode mode
)
6233 for (i
= 0; i
< NR_C_MODES
; i
++)
6234 if (constant_modes
[i
] == mode
)
6236 gcc_assert (i
!= NR_C_MODES
);
6238 for (c
= pool
->constants
[i
]; c
!= NULL
; c
= c
->next
)
6239 if (rtx_equal_p (val
, c
->value
))
6244 c
= (struct constant
*) xmalloc (sizeof *c
);
6246 c
->label
= gen_label_rtx ();
6247 c
->next
= pool
->constants
[i
];
6248 pool
->constants
[i
] = c
;
6249 pool
->size
+= GET_MODE_SIZE (mode
);
6253 /* Return an rtx that represents the offset of X from the start of
6257 s390_pool_offset (struct constant_pool
*pool
, rtx x
)
6261 label
= gen_rtx_LABEL_REF (GET_MODE (x
), pool
->label
);
6262 x
= gen_rtx_UNSPEC (GET_MODE (x
), gen_rtvec (2, x
, label
),
6263 UNSPEC_POOL_OFFSET
);
6264 return gen_rtx_CONST (GET_MODE (x
), x
);
6267 /* Find constant VAL of mode MODE in the constant pool POOL.
6268 Return an RTX describing the distance from the start of
6269 the pool to the location of the new constant. */
6272 s390_find_constant (struct constant_pool
*pool
, rtx val
,
6273 enum machine_mode mode
)
6278 for (i
= 0; i
< NR_C_MODES
; i
++)
6279 if (constant_modes
[i
] == mode
)
6281 gcc_assert (i
!= NR_C_MODES
);
6283 for (c
= pool
->constants
[i
]; c
!= NULL
; c
= c
->next
)
6284 if (rtx_equal_p (val
, c
->value
))
6289 return s390_pool_offset (pool
, gen_rtx_LABEL_REF (Pmode
, c
->label
));
6292 /* Check whether INSN is an execute. Return the label_ref to its
6293 execute target template if so, NULL_RTX otherwise. */
6296 s390_execute_label (rtx insn
)
6298 if (GET_CODE (insn
) == INSN
6299 && GET_CODE (PATTERN (insn
)) == PARALLEL
6300 && GET_CODE (XVECEXP (PATTERN (insn
), 0, 0)) == UNSPEC
6301 && XINT (XVECEXP (PATTERN (insn
), 0, 0), 1) == UNSPEC_EXECUTE
)
6302 return XVECEXP (XVECEXP (PATTERN (insn
), 0, 0), 0, 2);
6307 /* Add execute target for INSN to the constant pool POOL. */
6310 s390_add_execute (struct constant_pool
*pool
, rtx insn
)
6314 for (c
= pool
->execute
; c
!= NULL
; c
= c
->next
)
6315 if (INSN_UID (insn
) == INSN_UID (c
->value
))
6320 c
= (struct constant
*) xmalloc (sizeof *c
);
6322 c
->label
= gen_label_rtx ();
6323 c
->next
= pool
->execute
;
6329 /* Find execute target for INSN in the constant pool POOL.
6330 Return an RTX describing the distance from the start of
6331 the pool to the location of the execute target. */
6334 s390_find_execute (struct constant_pool
*pool
, rtx insn
)
6338 for (c
= pool
->execute
; c
!= NULL
; c
= c
->next
)
6339 if (INSN_UID (insn
) == INSN_UID (c
->value
))
6344 return s390_pool_offset (pool
, gen_rtx_LABEL_REF (Pmode
, c
->label
));
6347 /* For an execute INSN, extract the execute target template. */
6350 s390_execute_target (rtx insn
)
6352 rtx pattern
= PATTERN (insn
);
6353 gcc_assert (s390_execute_label (insn
));
6355 if (XVECLEN (pattern
, 0) == 2)
6357 pattern
= copy_rtx (XVECEXP (pattern
, 0, 1));
6361 rtvec vec
= rtvec_alloc (XVECLEN (pattern
, 0) - 1);
6364 for (i
= 0; i
< XVECLEN (pattern
, 0) - 1; i
++)
6365 RTVEC_ELT (vec
, i
) = copy_rtx (XVECEXP (pattern
, 0, i
+ 1));
6367 pattern
= gen_rtx_PARALLEL (VOIDmode
, vec
);
6373 /* Indicate that INSN cannot be duplicated. This is the case for
6374 execute insns that carry a unique label. */
6377 s390_cannot_copy_insn_p (rtx insn
)
6379 rtx label
= s390_execute_label (insn
);
6380 return label
&& label
!= const0_rtx
;
6383 /* Dump out the constants in POOL. If REMOTE_LABEL is true,
6384 do not emit the pool base label. */
6387 s390_dump_pool (struct constant_pool
*pool
, bool remote_label
)
6390 rtx insn
= pool
->pool_insn
;
6393 /* Switch to rodata section. */
6394 if (TARGET_CPU_ZARCH
)
6396 insn
= emit_insn_after (gen_pool_section_start (), insn
);
6397 INSN_ADDRESSES_NEW (insn
, -1);
6400 /* Ensure minimum pool alignment. */
6401 if (TARGET_CPU_ZARCH
)
6402 insn
= emit_insn_after (gen_pool_align (GEN_INT (8)), insn
);
6404 insn
= emit_insn_after (gen_pool_align (GEN_INT (4)), insn
);
6405 INSN_ADDRESSES_NEW (insn
, -1);
6407 /* Emit pool base label. */
6410 insn
= emit_label_after (pool
->label
, insn
);
6411 INSN_ADDRESSES_NEW (insn
, -1);
6414 /* Dump constants in descending alignment requirement order,
6415 ensuring proper alignment for every constant. */
6416 for (i
= 0; i
< NR_C_MODES
; i
++)
6417 for (c
= pool
->constants
[i
]; c
; c
= c
->next
)
6419 /* Convert UNSPEC_LTREL_OFFSET unspecs to pool-relative references. */
6420 rtx value
= copy_rtx (c
->value
);
6421 if (GET_CODE (value
) == CONST
6422 && GET_CODE (XEXP (value
, 0)) == UNSPEC
6423 && XINT (XEXP (value
, 0), 1) == UNSPEC_LTREL_OFFSET
6424 && XVECLEN (XEXP (value
, 0), 0) == 1)
6425 value
= s390_pool_offset (pool
, XVECEXP (XEXP (value
, 0), 0, 0));
6427 insn
= emit_label_after (c
->label
, insn
);
6428 INSN_ADDRESSES_NEW (insn
, -1);
6430 value
= gen_rtx_UNSPEC_VOLATILE (constant_modes
[i
],
6431 gen_rtvec (1, value
),
6432 UNSPECV_POOL_ENTRY
);
6433 insn
= emit_insn_after (value
, insn
);
6434 INSN_ADDRESSES_NEW (insn
, -1);
6437 /* Ensure minimum alignment for instructions. */
6438 insn
= emit_insn_after (gen_pool_align (GEN_INT (2)), insn
);
6439 INSN_ADDRESSES_NEW (insn
, -1);
6441 /* Output in-pool execute template insns. */
6442 for (c
= pool
->execute
; c
; c
= c
->next
)
6444 insn
= emit_label_after (c
->label
, insn
);
6445 INSN_ADDRESSES_NEW (insn
, -1);
6447 insn
= emit_insn_after (s390_execute_target (c
->value
), insn
);
6448 INSN_ADDRESSES_NEW (insn
, -1);
6451 /* Switch back to previous section. */
6452 if (TARGET_CPU_ZARCH
)
6454 insn
= emit_insn_after (gen_pool_section_end (), insn
);
6455 INSN_ADDRESSES_NEW (insn
, -1);
6458 insn
= emit_barrier_after (insn
);
6459 INSN_ADDRESSES_NEW (insn
, -1);
6461 /* Remove placeholder insn. */
6462 remove_insn (pool
->pool_insn
);
6465 /* Free all memory used by POOL. */
6468 s390_free_pool (struct constant_pool
*pool
)
6470 struct constant
*c
, *next
;
6473 for (i
= 0; i
< NR_C_MODES
; i
++)
6474 for (c
= pool
->constants
[i
]; c
; c
= next
)
6480 for (c
= pool
->execute
; c
; c
= next
)
6486 BITMAP_FREE (pool
->insns
);
6491 /* Collect main literal pool. Return NULL on overflow. */
6493 static struct constant_pool
*
6494 s390_mainpool_start (void)
6496 struct constant_pool
*pool
;
6499 pool
= s390_alloc_pool ();
6501 for (insn
= get_insns (); insn
; insn
= NEXT_INSN (insn
))
6503 if (GET_CODE (insn
) == INSN
6504 && GET_CODE (PATTERN (insn
)) == SET
6505 && GET_CODE (SET_SRC (PATTERN (insn
))) == UNSPEC_VOLATILE
6506 && XINT (SET_SRC (PATTERN (insn
)), 1) == UNSPECV_MAIN_POOL
)
6508 gcc_assert (!pool
->pool_insn
);
6509 pool
->pool_insn
= insn
;
6512 if (!TARGET_CPU_ZARCH
&& s390_execute_label (insn
))
6514 s390_add_execute (pool
, insn
);
6516 else if (GET_CODE (insn
) == INSN
|| GET_CODE (insn
) == CALL_INSN
)
6518 rtx pool_ref
= NULL_RTX
;
6519 find_constant_pool_ref (PATTERN (insn
), &pool_ref
);
6522 rtx constant
= get_pool_constant (pool_ref
);
6523 enum machine_mode mode
= get_pool_mode (pool_ref
);
6524 s390_add_constant (pool
, constant
, mode
);
6528 /* If hot/cold partitioning is enabled we have to make sure that
6529 the literal pool is emitted in the same section where the
6530 initialization of the literal pool base pointer takes place.
6531 emit_pool_after is only used in the non-overflow case on non
6532 Z cpus where we can emit the literal pool at the end of the
6533 function body within the text section. */
6535 && NOTE_KIND (insn
) == NOTE_INSN_SWITCH_TEXT_SECTIONS
6536 && !pool
->emit_pool_after
)
6537 pool
->emit_pool_after
= PREV_INSN (insn
);
6540 gcc_assert (pool
->pool_insn
|| pool
->size
== 0);
6542 if (pool
->size
>= 4096)
6544 /* We're going to chunkify the pool, so remove the main
6545 pool placeholder insn. */
6546 remove_insn (pool
->pool_insn
);
6548 s390_free_pool (pool
);
6552 /* If the functions ends with the section where the literal pool
6553 should be emitted set the marker to its end. */
6554 if (pool
&& !pool
->emit_pool_after
)
6555 pool
->emit_pool_after
= get_last_insn ();
6560 /* POOL holds the main literal pool as collected by s390_mainpool_start.
6561 Modify the current function to output the pool constants as well as
6562 the pool register setup instruction. */
6565 s390_mainpool_finish (struct constant_pool
*pool
)
6567 rtx base_reg
= cfun
->machine
->base_reg
;
6570 /* If the pool is empty, we're done. */
6571 if (pool
->size
== 0)
6573 /* We don't actually need a base register after all. */
6574 cfun
->machine
->base_reg
= NULL_RTX
;
6576 if (pool
->pool_insn
)
6577 remove_insn (pool
->pool_insn
);
6578 s390_free_pool (pool
);
6582 /* We need correct insn addresses. */
6583 shorten_branches (get_insns ());
6585 /* On zSeries, we use a LARL to load the pool register. The pool is
6586 located in the .rodata section, so we emit it after the function. */
6587 if (TARGET_CPU_ZARCH
)
6589 insn
= gen_main_base_64 (base_reg
, pool
->label
);
6590 insn
= emit_insn_after (insn
, pool
->pool_insn
);
6591 INSN_ADDRESSES_NEW (insn
, -1);
6592 remove_insn (pool
->pool_insn
);
6594 insn
= get_last_insn ();
6595 pool
->pool_insn
= emit_insn_after (gen_pool (const0_rtx
), insn
);
6596 INSN_ADDRESSES_NEW (pool
->pool_insn
, -1);
6598 s390_dump_pool (pool
, 0);
6601 /* On S/390, if the total size of the function's code plus literal pool
6602 does not exceed 4096 bytes, we use BASR to set up a function base
6603 pointer, and emit the literal pool at the end of the function. */
6604 else if (INSN_ADDRESSES (INSN_UID (pool
->emit_pool_after
))
6605 + pool
->size
+ 8 /* alignment slop */ < 4096)
6607 insn
= gen_main_base_31_small (base_reg
, pool
->label
);
6608 insn
= emit_insn_after (insn
, pool
->pool_insn
);
6609 INSN_ADDRESSES_NEW (insn
, -1);
6610 remove_insn (pool
->pool_insn
);
6612 insn
= emit_label_after (pool
->label
, insn
);
6613 INSN_ADDRESSES_NEW (insn
, -1);
6615 /* emit_pool_after will be set by s390_mainpool_start to the
6616 last insn of the section where the literal pool should be
6618 insn
= pool
->emit_pool_after
;
6620 pool
->pool_insn
= emit_insn_after (gen_pool (const0_rtx
), insn
);
6621 INSN_ADDRESSES_NEW (pool
->pool_insn
, -1);
6623 s390_dump_pool (pool
, 1);
6626 /* Otherwise, we emit an inline literal pool and use BASR to branch
6627 over it, setting up the pool register at the same time. */
6630 rtx pool_end
= gen_label_rtx ();
6632 insn
= gen_main_base_31_large (base_reg
, pool
->label
, pool_end
);
6633 insn
= emit_jump_insn_after (insn
, pool
->pool_insn
);
6634 JUMP_LABEL (insn
) = pool_end
;
6635 INSN_ADDRESSES_NEW (insn
, -1);
6636 remove_insn (pool
->pool_insn
);
6638 insn
= emit_label_after (pool
->label
, insn
);
6639 INSN_ADDRESSES_NEW (insn
, -1);
6641 pool
->pool_insn
= emit_insn_after (gen_pool (const0_rtx
), insn
);
6642 INSN_ADDRESSES_NEW (pool
->pool_insn
, -1);
6644 insn
= emit_label_after (pool_end
, pool
->pool_insn
);
6645 INSN_ADDRESSES_NEW (insn
, -1);
6647 s390_dump_pool (pool
, 1);
6651 /* Replace all literal pool references. */
6653 for (insn
= get_insns (); insn
; insn
= NEXT_INSN (insn
))
6656 replace_ltrel_base (&PATTERN (insn
));
6658 if (GET_CODE (insn
) == INSN
|| GET_CODE (insn
) == CALL_INSN
)
6660 rtx addr
, pool_ref
= NULL_RTX
;
6661 find_constant_pool_ref (PATTERN (insn
), &pool_ref
);
6664 if (s390_execute_label (insn
))
6665 addr
= s390_find_execute (pool
, insn
);
6667 addr
= s390_find_constant (pool
, get_pool_constant (pool_ref
),
6668 get_pool_mode (pool_ref
));
6670 replace_constant_pool_ref (&PATTERN (insn
), pool_ref
, addr
);
6671 INSN_CODE (insn
) = -1;
6677 /* Free the pool. */
6678 s390_free_pool (pool
);
6681 /* POOL holds the main literal pool as collected by s390_mainpool_start.
6682 We have decided we cannot use this pool, so revert all changes
6683 to the current function that were done by s390_mainpool_start. */
6685 s390_mainpool_cancel (struct constant_pool
*pool
)
6687 /* We didn't actually change the instruction stream, so simply
6688 free the pool memory. */
6689 s390_free_pool (pool
);
6693 /* Chunkify the literal pool. */
6695 #define S390_POOL_CHUNK_MIN 0xc00
6696 #define S390_POOL_CHUNK_MAX 0xe00
6698 static struct constant_pool
*
6699 s390_chunkify_start (void)
6701 struct constant_pool
*curr_pool
= NULL
, *pool_list
= NULL
;
6704 rtx pending_ltrel
= NULL_RTX
;
6707 rtx (*gen_reload_base
) (rtx
, rtx
) =
6708 TARGET_CPU_ZARCH
? gen_reload_base_64
: gen_reload_base_31
;
6711 /* We need correct insn addresses. */
6713 shorten_branches (get_insns ());
6715 /* Scan all insns and move literals to pool chunks. */
6717 for (insn
= get_insns (); insn
; insn
= NEXT_INSN (insn
))
6719 bool section_switch_p
= false;
6721 /* Check for pending LTREL_BASE. */
6724 rtx ltrel_base
= find_ltrel_base (PATTERN (insn
));
6727 gcc_assert (ltrel_base
== pending_ltrel
);
6728 pending_ltrel
= NULL_RTX
;
6732 if (!TARGET_CPU_ZARCH
&& s390_execute_label (insn
))
6735 curr_pool
= s390_start_pool (&pool_list
, insn
);
6737 s390_add_execute (curr_pool
, insn
);
6738 s390_add_pool_insn (curr_pool
, insn
);
6740 else if (GET_CODE (insn
) == INSN
|| CALL_P (insn
))
6742 rtx pool_ref
= NULL_RTX
;
6743 find_constant_pool_ref (PATTERN (insn
), &pool_ref
);
6746 rtx constant
= get_pool_constant (pool_ref
);
6747 enum machine_mode mode
= get_pool_mode (pool_ref
);
6750 curr_pool
= s390_start_pool (&pool_list
, insn
);
6752 s390_add_constant (curr_pool
, constant
, mode
);
6753 s390_add_pool_insn (curr_pool
, insn
);
6755 /* Don't split the pool chunk between a LTREL_OFFSET load
6756 and the corresponding LTREL_BASE. */
6757 if (GET_CODE (constant
) == CONST
6758 && GET_CODE (XEXP (constant
, 0)) == UNSPEC
6759 && XINT (XEXP (constant
, 0), 1) == UNSPEC_LTREL_OFFSET
)
6761 gcc_assert (!pending_ltrel
);
6762 pending_ltrel
= pool_ref
;
6767 if (GET_CODE (insn
) == JUMP_INSN
|| GET_CODE (insn
) == CODE_LABEL
)
6770 s390_add_pool_insn (curr_pool
, insn
);
6771 /* An LTREL_BASE must follow within the same basic block. */
6772 gcc_assert (!pending_ltrel
);
6776 switch (NOTE_KIND (insn
))
6778 case NOTE_INSN_SWITCH_TEXT_SECTIONS
:
6779 section_switch_p
= true;
6781 case NOTE_INSN_VAR_LOCATION
:
6782 case NOTE_INSN_CALL_ARG_LOCATION
:
6789 || INSN_ADDRESSES_SIZE () <= (size_t) INSN_UID (insn
)
6790 || INSN_ADDRESSES (INSN_UID (insn
)) == -1)
6793 if (TARGET_CPU_ZARCH
)
6795 if (curr_pool
->size
< S390_POOL_CHUNK_MAX
)
6798 s390_end_pool (curr_pool
, NULL_RTX
);
6803 int chunk_size
= INSN_ADDRESSES (INSN_UID (insn
))
6804 - INSN_ADDRESSES (INSN_UID (curr_pool
->first_insn
))
6807 /* We will later have to insert base register reload insns.
6808 Those will have an effect on code size, which we need to
6809 consider here. This calculation makes rather pessimistic
6810 worst-case assumptions. */
6811 if (GET_CODE (insn
) == CODE_LABEL
)
6814 if (chunk_size
< S390_POOL_CHUNK_MIN
6815 && curr_pool
->size
< S390_POOL_CHUNK_MIN
6816 && !section_switch_p
)
6819 /* Pool chunks can only be inserted after BARRIERs ... */
6820 if (GET_CODE (insn
) == BARRIER
)
6822 s390_end_pool (curr_pool
, insn
);
6827 /* ... so if we don't find one in time, create one. */
6828 else if (chunk_size
> S390_POOL_CHUNK_MAX
6829 || curr_pool
->size
> S390_POOL_CHUNK_MAX
6830 || section_switch_p
)
6832 rtx label
, jump
, barrier
, next
, prev
;
6834 if (!section_switch_p
)
6836 /* We can insert the barrier only after a 'real' insn. */
6837 if (GET_CODE (insn
) != INSN
&& GET_CODE (insn
) != CALL_INSN
)
6839 if (get_attr_length (insn
) == 0)
6841 /* Don't separate LTREL_BASE from the corresponding
6842 LTREL_OFFSET load. */
6849 next
= NEXT_INSN (insn
);
6853 && (NOTE_KIND (next
) == NOTE_INSN_VAR_LOCATION
6854 || NOTE_KIND (next
) == NOTE_INSN_CALL_ARG_LOCATION
));
6858 gcc_assert (!pending_ltrel
);
6860 /* The old pool has to end before the section switch
6861 note in order to make it part of the current
6863 insn
= PREV_INSN (insn
);
6866 label
= gen_label_rtx ();
6868 if (prev
&& NOTE_P (prev
))
6869 prev
= prev_nonnote_insn (prev
);
6871 jump
= emit_jump_insn_after_setloc (gen_jump (label
), insn
,
6872 INSN_LOCATION (prev
));
6874 jump
= emit_jump_insn_after_noloc (gen_jump (label
), insn
);
6875 barrier
= emit_barrier_after (jump
);
6876 insn
= emit_label_after (label
, barrier
);
6877 JUMP_LABEL (jump
) = label
;
6878 LABEL_NUSES (label
) = 1;
6880 INSN_ADDRESSES_NEW (jump
, -1);
6881 INSN_ADDRESSES_NEW (barrier
, -1);
6882 INSN_ADDRESSES_NEW (insn
, -1);
6884 s390_end_pool (curr_pool
, barrier
);
6892 s390_end_pool (curr_pool
, NULL_RTX
);
6893 gcc_assert (!pending_ltrel
);
6895 /* Find all labels that are branched into
6896 from an insn belonging to a different chunk. */
6898 far_labels
= BITMAP_ALLOC (NULL
);
6900 for (insn
= get_insns (); insn
; insn
= NEXT_INSN (insn
))
6902 /* Labels marked with LABEL_PRESERVE_P can be target
6903 of non-local jumps, so we have to mark them.
6904 The same holds for named labels.
6906 Don't do that, however, if it is the label before
6909 if (GET_CODE (insn
) == CODE_LABEL
6910 && (LABEL_PRESERVE_P (insn
) || LABEL_NAME (insn
)))
6912 rtx vec_insn
= next_real_insn (insn
);
6913 rtx vec_pat
= vec_insn
&& GET_CODE (vec_insn
) == JUMP_INSN
?
6914 PATTERN (vec_insn
) : NULL_RTX
;
6916 || !(GET_CODE (vec_pat
) == ADDR_VEC
6917 || GET_CODE (vec_pat
) == ADDR_DIFF_VEC
))
6918 bitmap_set_bit (far_labels
, CODE_LABEL_NUMBER (insn
));
6921 /* If we have a direct jump (conditional or unconditional)
6922 or a casesi jump, check all potential targets. */
6923 else if (GET_CODE (insn
) == JUMP_INSN
)
6925 rtx pat
= PATTERN (insn
);
6926 if (GET_CODE (pat
) == PARALLEL
&& XVECLEN (pat
, 0) > 2)
6927 pat
= XVECEXP (pat
, 0, 0);
6929 if (GET_CODE (pat
) == SET
)
6931 rtx label
= JUMP_LABEL (insn
);
6934 if (s390_find_pool (pool_list
, label
)
6935 != s390_find_pool (pool_list
, insn
))
6936 bitmap_set_bit (far_labels
, CODE_LABEL_NUMBER (label
));
6939 else if (GET_CODE (pat
) == PARALLEL
6940 && XVECLEN (pat
, 0) == 2
6941 && GET_CODE (XVECEXP (pat
, 0, 0)) == SET
6942 && GET_CODE (XVECEXP (pat
, 0, 1)) == USE
6943 && GET_CODE (XEXP (XVECEXP (pat
, 0, 1), 0)) == LABEL_REF
)
6945 /* Find the jump table used by this casesi jump. */
6946 rtx vec_label
= XEXP (XEXP (XVECEXP (pat
, 0, 1), 0), 0);
6947 rtx vec_insn
= next_real_insn (vec_label
);
6948 rtx vec_pat
= vec_insn
&& GET_CODE (vec_insn
) == JUMP_INSN
?
6949 PATTERN (vec_insn
) : NULL_RTX
;
6951 && (GET_CODE (vec_pat
) == ADDR_VEC
6952 || GET_CODE (vec_pat
) == ADDR_DIFF_VEC
))
6954 int i
, diff_p
= GET_CODE (vec_pat
) == ADDR_DIFF_VEC
;
6956 for (i
= 0; i
< XVECLEN (vec_pat
, diff_p
); i
++)
6958 rtx label
= XEXP (XVECEXP (vec_pat
, diff_p
, i
), 0);
6960 if (s390_find_pool (pool_list
, label
)
6961 != s390_find_pool (pool_list
, insn
))
6962 bitmap_set_bit (far_labels
, CODE_LABEL_NUMBER (label
));
6969 /* Insert base register reload insns before every pool. */
6971 for (curr_pool
= pool_list
; curr_pool
; curr_pool
= curr_pool
->next
)
6973 rtx new_insn
= gen_reload_base (cfun
->machine
->base_reg
,
6975 rtx insn
= curr_pool
->first_insn
;
6976 INSN_ADDRESSES_NEW (emit_insn_before (new_insn
, insn
), -1);
6979 /* Insert base register reload insns at every far label. */
6981 for (insn
= get_insns (); insn
; insn
= NEXT_INSN (insn
))
6982 if (GET_CODE (insn
) == CODE_LABEL
6983 && bitmap_bit_p (far_labels
, CODE_LABEL_NUMBER (insn
)))
6985 struct constant_pool
*pool
= s390_find_pool (pool_list
, insn
);
6988 rtx new_insn
= gen_reload_base (cfun
->machine
->base_reg
,
6990 INSN_ADDRESSES_NEW (emit_insn_after (new_insn
, insn
), -1);
6995 BITMAP_FREE (far_labels
);
6998 /* Recompute insn addresses. */
7000 init_insn_lengths ();
7001 shorten_branches (get_insns ());
7006 /* POOL_LIST is a chunk list as prepared by s390_chunkify_start.
7007 After we have decided to use this list, finish implementing
7008 all changes to the current function as required. */
7011 s390_chunkify_finish (struct constant_pool
*pool_list
)
7013 struct constant_pool
*curr_pool
= NULL
;
7017 /* Replace all literal pool references. */
7019 for (insn
= get_insns (); insn
; insn
= NEXT_INSN (insn
))
7022 replace_ltrel_base (&PATTERN (insn
));
7024 curr_pool
= s390_find_pool (pool_list
, insn
);
7028 if (GET_CODE (insn
) == INSN
|| GET_CODE (insn
) == CALL_INSN
)
7030 rtx addr
, pool_ref
= NULL_RTX
;
7031 find_constant_pool_ref (PATTERN (insn
), &pool_ref
);
7034 if (s390_execute_label (insn
))
7035 addr
= s390_find_execute (curr_pool
, insn
);
7037 addr
= s390_find_constant (curr_pool
,
7038 get_pool_constant (pool_ref
),
7039 get_pool_mode (pool_ref
));
7041 replace_constant_pool_ref (&PATTERN (insn
), pool_ref
, addr
);
7042 INSN_CODE (insn
) = -1;
7047 /* Dump out all literal pools. */
7049 for (curr_pool
= pool_list
; curr_pool
; curr_pool
= curr_pool
->next
)
7050 s390_dump_pool (curr_pool
, 0);
7052 /* Free pool list. */
7056 struct constant_pool
*next
= pool_list
->next
;
7057 s390_free_pool (pool_list
);
7062 /* POOL_LIST is a chunk list as prepared by s390_chunkify_start.
7063 We have decided we cannot use this list, so revert all changes
7064 to the current function that were done by s390_chunkify_start. */
7067 s390_chunkify_cancel (struct constant_pool
*pool_list
)
7069 struct constant_pool
*curr_pool
= NULL
;
7072 /* Remove all pool placeholder insns. */
7074 for (curr_pool
= pool_list
; curr_pool
; curr_pool
= curr_pool
->next
)
7076 /* Did we insert an extra barrier? Remove it. */
7077 rtx barrier
= PREV_INSN (curr_pool
->pool_insn
);
7078 rtx jump
= barrier
? PREV_INSN (barrier
) : NULL_RTX
;
7079 rtx label
= NEXT_INSN (curr_pool
->pool_insn
);
7081 if (jump
&& GET_CODE (jump
) == JUMP_INSN
7082 && barrier
&& GET_CODE (barrier
) == BARRIER
7083 && label
&& GET_CODE (label
) == CODE_LABEL
7084 && GET_CODE (PATTERN (jump
)) == SET
7085 && SET_DEST (PATTERN (jump
)) == pc_rtx
7086 && GET_CODE (SET_SRC (PATTERN (jump
))) == LABEL_REF
7087 && XEXP (SET_SRC (PATTERN (jump
)), 0) == label
)
7090 remove_insn (barrier
);
7091 remove_insn (label
);
7094 remove_insn (curr_pool
->pool_insn
);
7097 /* Remove all base register reload insns. */
7099 for (insn
= get_insns (); insn
; )
7101 rtx next_insn
= NEXT_INSN (insn
);
7103 if (GET_CODE (insn
) == INSN
7104 && GET_CODE (PATTERN (insn
)) == SET
7105 && GET_CODE (SET_SRC (PATTERN (insn
))) == UNSPEC
7106 && XINT (SET_SRC (PATTERN (insn
)), 1) == UNSPEC_RELOAD_BASE
)
7112 /* Free pool list. */
7116 struct constant_pool
*next
= pool_list
->next
;
7117 s390_free_pool (pool_list
);
7122 /* Output the constant pool entry EXP in mode MODE with alignment ALIGN. */
7125 s390_output_pool_entry (rtx exp
, enum machine_mode mode
, unsigned int align
)
7129 switch (GET_MODE_CLASS (mode
))
7132 case MODE_DECIMAL_FLOAT
:
7133 gcc_assert (GET_CODE (exp
) == CONST_DOUBLE
);
7135 REAL_VALUE_FROM_CONST_DOUBLE (r
, exp
);
7136 assemble_real (r
, mode
, align
);
7140 assemble_integer (exp
, GET_MODE_SIZE (mode
), align
, 1);
7141 mark_symbol_refs_as_used (exp
);
7150 /* Return an RTL expression representing the value of the return address
7151 for the frame COUNT steps up from the current frame. FRAME is the
7152 frame pointer of that frame. */
7155 s390_return_addr_rtx (int count
, rtx frame ATTRIBUTE_UNUSED
)
7160 /* Without backchain, we fail for all but the current frame. */
7162 if (!TARGET_BACKCHAIN
&& count
> 0)
7165 /* For the current frame, we need to make sure the initial
7166 value of RETURN_REGNUM is actually saved. */
7170 /* On non-z architectures branch splitting could overwrite r14. */
7171 if (TARGET_CPU_ZARCH
)
7172 return get_hard_reg_initial_val (Pmode
, RETURN_REGNUM
);
7175 cfun_frame_layout
.save_return_addr_p
= true;
7176 return gen_rtx_MEM (Pmode
, return_address_pointer_rtx
);
7180 if (TARGET_PACKED_STACK
)
7181 offset
= -2 * UNITS_PER_LONG
;
7183 offset
= RETURN_REGNUM
* UNITS_PER_LONG
;
7185 addr
= plus_constant (Pmode
, frame
, offset
);
7186 addr
= memory_address (Pmode
, addr
);
7187 return gen_rtx_MEM (Pmode
, addr
);
7190 /* Return an RTL expression representing the back chain stored in
7191 the current stack frame. */
7194 s390_back_chain_rtx (void)
7198 gcc_assert (TARGET_BACKCHAIN
);
7200 if (TARGET_PACKED_STACK
)
7201 chain
= plus_constant (Pmode
, stack_pointer_rtx
,
7202 STACK_POINTER_OFFSET
- UNITS_PER_LONG
);
7204 chain
= stack_pointer_rtx
;
7206 chain
= gen_rtx_MEM (Pmode
, chain
);
7210 /* Find first call clobbered register unused in a function.
7211 This could be used as base register in a leaf function
7212 or for holding the return address before epilogue. */
7215 find_unused_clobbered_reg (void)
7218 for (i
= 0; i
< 6; i
++)
7219 if (!df_regs_ever_live_p (i
))
7225 /* Helper function for s390_regs_ever_clobbered. Sets the fields in DATA for all
7226 clobbered hard regs in SETREG. */
7229 s390_reg_clobbered_rtx (rtx setreg
, const_rtx set_insn ATTRIBUTE_UNUSED
, void *data
)
7231 int *regs_ever_clobbered
= (int *)data
;
7232 unsigned int i
, regno
;
7233 enum machine_mode mode
= GET_MODE (setreg
);
7235 if (GET_CODE (setreg
) == SUBREG
)
7237 rtx inner
= SUBREG_REG (setreg
);
7238 if (!GENERAL_REG_P (inner
))
7240 regno
= subreg_regno (setreg
);
7242 else if (GENERAL_REG_P (setreg
))
7243 regno
= REGNO (setreg
);
7248 i
< regno
+ HARD_REGNO_NREGS (regno
, mode
);
7250 regs_ever_clobbered
[i
] = 1;
7253 /* Walks through all basic blocks of the current function looking
7254 for clobbered hard regs using s390_reg_clobbered_rtx. The fields
7255 of the passed integer array REGS_EVER_CLOBBERED are set to one for
7256 each of those regs. */
7259 s390_regs_ever_clobbered (int *regs_ever_clobbered
)
7265 memset (regs_ever_clobbered
, 0, 16 * sizeof (int));
7267 /* For non-leaf functions we have to consider all call clobbered regs to be
7271 for (i
= 0; i
< 16; i
++)
7272 regs_ever_clobbered
[i
] = call_really_used_regs
[i
];
7275 /* Make the "magic" eh_return registers live if necessary. For regs_ever_live
7276 this work is done by liveness analysis (mark_regs_live_at_end).
7277 Special care is needed for functions containing landing pads. Landing pads
7278 may use the eh registers, but the code which sets these registers is not
7279 contained in that function. Hence s390_regs_ever_clobbered is not able to
7280 deal with this automatically. */
7281 if (crtl
->calls_eh_return
|| cfun
->machine
->has_landing_pad_p
)
7282 for (i
= 0; EH_RETURN_DATA_REGNO (i
) != INVALID_REGNUM
; i
++)
7283 if (crtl
->calls_eh_return
7284 || (cfun
->machine
->has_landing_pad_p
7285 && df_regs_ever_live_p (EH_RETURN_DATA_REGNO (i
))))
7286 regs_ever_clobbered
[EH_RETURN_DATA_REGNO (i
)] = 1;
7288 /* For nonlocal gotos all call-saved registers have to be saved.
7289 This flag is also set for the unwinding code in libgcc.
7290 See expand_builtin_unwind_init. For regs_ever_live this is done by
7292 if (cfun
->has_nonlocal_label
)
7293 for (i
= 0; i
< 16; i
++)
7294 if (!call_really_used_regs
[i
])
7295 regs_ever_clobbered
[i
] = 1;
7297 FOR_EACH_BB (cur_bb
)
7299 FOR_BB_INSNS (cur_bb
, cur_insn
)
7301 if (INSN_P (cur_insn
))
7302 note_stores (PATTERN (cur_insn
),
7303 s390_reg_clobbered_rtx
,
7304 regs_ever_clobbered
);
7309 /* Determine the frame area which actually has to be accessed
7310 in the function epilogue. The values are stored at the
7311 given pointers AREA_BOTTOM (address of the lowest used stack
7312 address) and AREA_TOP (address of the first item which does
7313 not belong to the stack frame). */
7316 s390_frame_area (int *area_bottom
, int *area_top
)
7324 if (cfun_frame_layout
.first_restore_gpr
!= -1)
7326 b
= (cfun_frame_layout
.gprs_offset
7327 + cfun_frame_layout
.first_restore_gpr
* UNITS_PER_LONG
);
7328 t
= b
+ (cfun_frame_layout
.last_restore_gpr
7329 - cfun_frame_layout
.first_restore_gpr
+ 1) * UNITS_PER_LONG
;
7332 if (TARGET_64BIT
&& cfun_save_high_fprs_p
)
7334 b
= MIN (b
, cfun_frame_layout
.f8_offset
);
7335 t
= MAX (t
, (cfun_frame_layout
.f8_offset
7336 + cfun_frame_layout
.high_fprs
* 8));
7340 for (i
= 2; i
< 4; i
++)
7341 if (cfun_fpr_bit_p (i
))
7343 b
= MIN (b
, cfun_frame_layout
.f4_offset
+ (i
- 2) * 8);
7344 t
= MAX (t
, cfun_frame_layout
.f4_offset
+ (i
- 1) * 8);
7351 /* Fill cfun->machine with info about register usage of current function.
7352 Return in CLOBBERED_REGS which GPRs are currently considered set. */
7355 s390_register_info (int clobbered_regs
[])
7359 /* fprs 8 - 15 are call saved for 64 Bit ABI. */
7360 cfun_frame_layout
.fpr_bitmap
= 0;
7361 cfun_frame_layout
.high_fprs
= 0;
7363 for (i
= 24; i
< 32; i
++)
7364 if (df_regs_ever_live_p (i
) && !global_regs
[i
])
7366 cfun_set_fpr_bit (i
- 16);
7367 cfun_frame_layout
.high_fprs
++;
7370 /* Find first and last gpr to be saved. We trust regs_ever_live
7371 data, except that we don't save and restore global registers.
7373 Also, all registers with special meaning to the compiler need
7374 to be handled extra. */
7376 s390_regs_ever_clobbered (clobbered_regs
);
7378 for (i
= 0; i
< 16; i
++)
7379 clobbered_regs
[i
] = clobbered_regs
[i
] && !global_regs
[i
] && !fixed_regs
[i
];
7381 if (frame_pointer_needed
)
7382 clobbered_regs
[HARD_FRAME_POINTER_REGNUM
] = 1;
7385 clobbered_regs
[PIC_OFFSET_TABLE_REGNUM
]
7386 |= df_regs_ever_live_p (PIC_OFFSET_TABLE_REGNUM
);
7388 clobbered_regs
[BASE_REGNUM
]
7389 |= (cfun
->machine
->base_reg
7390 && REGNO (cfun
->machine
->base_reg
) == BASE_REGNUM
);
7392 clobbered_regs
[RETURN_REGNUM
]
7394 || TARGET_TPF_PROFILING
7395 || cfun
->machine
->split_branches_pending_p
7396 || cfun_frame_layout
.save_return_addr_p
7397 || crtl
->calls_eh_return
7400 clobbered_regs
[STACK_POINTER_REGNUM
]
7402 || TARGET_TPF_PROFILING
7403 || cfun_save_high_fprs_p
7404 || get_frame_size () > 0
7405 || cfun
->calls_alloca
7408 for (i
= 6; i
< 16; i
++)
7409 if (df_regs_ever_live_p (i
) || clobbered_regs
[i
])
7411 for (j
= 15; j
> i
; j
--)
7412 if (df_regs_ever_live_p (j
) || clobbered_regs
[j
])
7417 /* Nothing to save/restore. */
7418 cfun_frame_layout
.first_save_gpr_slot
= -1;
7419 cfun_frame_layout
.last_save_gpr_slot
= -1;
7420 cfun_frame_layout
.first_save_gpr
= -1;
7421 cfun_frame_layout
.first_restore_gpr
= -1;
7422 cfun_frame_layout
.last_save_gpr
= -1;
7423 cfun_frame_layout
.last_restore_gpr
= -1;
7427 /* Save slots for gprs from i to j. */
7428 cfun_frame_layout
.first_save_gpr_slot
= i
;
7429 cfun_frame_layout
.last_save_gpr_slot
= j
;
7431 for (i
= cfun_frame_layout
.first_save_gpr_slot
;
7432 i
< cfun_frame_layout
.last_save_gpr_slot
+ 1;
7434 if (clobbered_regs
[i
])
7437 for (j
= cfun_frame_layout
.last_save_gpr_slot
; j
> i
; j
--)
7438 if (clobbered_regs
[j
])
7441 if (i
== cfun_frame_layout
.last_save_gpr_slot
+ 1)
7443 /* Nothing to save/restore. */
7444 cfun_frame_layout
.first_save_gpr
= -1;
7445 cfun_frame_layout
.first_restore_gpr
= -1;
7446 cfun_frame_layout
.last_save_gpr
= -1;
7447 cfun_frame_layout
.last_restore_gpr
= -1;
7451 /* Save / Restore from gpr i to j. */
7452 cfun_frame_layout
.first_save_gpr
= i
;
7453 cfun_frame_layout
.first_restore_gpr
= i
;
7454 cfun_frame_layout
.last_save_gpr
= j
;
7455 cfun_frame_layout
.last_restore_gpr
= j
;
7461 /* Varargs functions need to save gprs 2 to 6. */
7462 if (cfun
->va_list_gpr_size
7463 && crtl
->args
.info
.gprs
< GP_ARG_NUM_REG
)
7465 int min_gpr
= crtl
->args
.info
.gprs
;
7466 int max_gpr
= min_gpr
+ cfun
->va_list_gpr_size
;
7467 if (max_gpr
> GP_ARG_NUM_REG
)
7468 max_gpr
= GP_ARG_NUM_REG
;
7470 if (cfun_frame_layout
.first_save_gpr
== -1
7471 || cfun_frame_layout
.first_save_gpr
> 2 + min_gpr
)
7473 cfun_frame_layout
.first_save_gpr
= 2 + min_gpr
;
7474 cfun_frame_layout
.first_save_gpr_slot
= 2 + min_gpr
;
7477 if (cfun_frame_layout
.last_save_gpr
== -1
7478 || cfun_frame_layout
.last_save_gpr
< 2 + max_gpr
- 1)
7480 cfun_frame_layout
.last_save_gpr
= 2 + max_gpr
- 1;
7481 cfun_frame_layout
.last_save_gpr_slot
= 2 + max_gpr
- 1;
7485 /* Mark f0, f2 for 31 bit and f0-f4 for 64 bit to be saved. */
7486 if (TARGET_HARD_FLOAT
&& cfun
->va_list_fpr_size
7487 && crtl
->args
.info
.fprs
< FP_ARG_NUM_REG
)
7489 int min_fpr
= crtl
->args
.info
.fprs
;
7490 int max_fpr
= min_fpr
+ cfun
->va_list_fpr_size
;
7491 if (max_fpr
> FP_ARG_NUM_REG
)
7492 max_fpr
= FP_ARG_NUM_REG
;
7494 /* ??? This is currently required to ensure proper location
7495 of the fpr save slots within the va_list save area. */
7496 if (TARGET_PACKED_STACK
)
7499 for (i
= min_fpr
; i
< max_fpr
; i
++)
7500 cfun_set_fpr_bit (i
);
7505 for (i
= 2; i
< 4; i
++)
7506 if (df_regs_ever_live_p (i
+ 16) && !global_regs
[i
+ 16])
7507 cfun_set_fpr_bit (i
);
7510 /* Fill cfun->machine with info about frame of current function. */
7513 s390_frame_info (void)
7517 cfun_frame_layout
.frame_size
= get_frame_size ();
7518 if (!TARGET_64BIT
&& cfun_frame_layout
.frame_size
> 0x7fff0000)
7519 fatal_error ("total size of local variables exceeds architecture limit");
7521 if (!TARGET_PACKED_STACK
)
7523 cfun_frame_layout
.backchain_offset
= 0;
7524 cfun_frame_layout
.f0_offset
= 16 * UNITS_PER_LONG
;
7525 cfun_frame_layout
.f4_offset
= cfun_frame_layout
.f0_offset
+ 2 * 8;
7526 cfun_frame_layout
.f8_offset
= -cfun_frame_layout
.high_fprs
* 8;
7527 cfun_frame_layout
.gprs_offset
= (cfun_frame_layout
.first_save_gpr_slot
7530 else if (TARGET_BACKCHAIN
) /* kernel stack layout */
7532 cfun_frame_layout
.backchain_offset
= (STACK_POINTER_OFFSET
7534 cfun_frame_layout
.gprs_offset
7535 = (cfun_frame_layout
.backchain_offset
7536 - (STACK_POINTER_REGNUM
- cfun_frame_layout
.first_save_gpr_slot
+ 1)
7541 cfun_frame_layout
.f4_offset
7542 = (cfun_frame_layout
.gprs_offset
7543 - 8 * (cfun_fpr_bit_p (2) + cfun_fpr_bit_p (3)));
7545 cfun_frame_layout
.f0_offset
7546 = (cfun_frame_layout
.f4_offset
7547 - 8 * (cfun_fpr_bit_p (0) + cfun_fpr_bit_p (1)));
7551 /* On 31 bit we have to care about alignment of the
7552 floating point regs to provide fastest access. */
7553 cfun_frame_layout
.f0_offset
7554 = ((cfun_frame_layout
.gprs_offset
7555 & ~(STACK_BOUNDARY
/ BITS_PER_UNIT
- 1))
7556 - 8 * (cfun_fpr_bit_p (0) + cfun_fpr_bit_p (1)));
7558 cfun_frame_layout
.f4_offset
7559 = (cfun_frame_layout
.f0_offset
7560 - 8 * (cfun_fpr_bit_p (2) + cfun_fpr_bit_p (3)));
7563 else /* no backchain */
7565 cfun_frame_layout
.f4_offset
7566 = (STACK_POINTER_OFFSET
7567 - 8 * (cfun_fpr_bit_p (2) + cfun_fpr_bit_p (3)));
7569 cfun_frame_layout
.f0_offset
7570 = (cfun_frame_layout
.f4_offset
7571 - 8 * (cfun_fpr_bit_p (0) + cfun_fpr_bit_p (1)));
7573 cfun_frame_layout
.gprs_offset
7574 = cfun_frame_layout
.f0_offset
- cfun_gprs_save_area_size
;
7578 && !TARGET_TPF_PROFILING
7579 && cfun_frame_layout
.frame_size
== 0
7580 && !cfun_save_high_fprs_p
7581 && !cfun
->calls_alloca
7585 if (!TARGET_PACKED_STACK
)
7586 cfun_frame_layout
.frame_size
+= (STACK_POINTER_OFFSET
7587 + crtl
->outgoing_args_size
7588 + cfun_frame_layout
.high_fprs
* 8);
7591 if (TARGET_BACKCHAIN
)
7592 cfun_frame_layout
.frame_size
+= UNITS_PER_LONG
;
7594 /* No alignment trouble here because f8-f15 are only saved under
7596 cfun_frame_layout
.f8_offset
= (MIN (MIN (cfun_frame_layout
.f0_offset
,
7597 cfun_frame_layout
.f4_offset
),
7598 cfun_frame_layout
.gprs_offset
)
7599 - cfun_frame_layout
.high_fprs
* 8);
7601 cfun_frame_layout
.frame_size
+= cfun_frame_layout
.high_fprs
* 8;
7603 for (i
= 0; i
< 8; i
++)
7604 if (cfun_fpr_bit_p (i
))
7605 cfun_frame_layout
.frame_size
+= 8;
7607 cfun_frame_layout
.frame_size
+= cfun_gprs_save_area_size
;
7609 /* If under 31 bit an odd number of gprs has to be saved we have to adjust
7610 the frame size to sustain 8 byte alignment of stack frames. */
7611 cfun_frame_layout
.frame_size
= ((cfun_frame_layout
.frame_size
+
7612 STACK_BOUNDARY
/ BITS_PER_UNIT
- 1)
7613 & ~(STACK_BOUNDARY
/ BITS_PER_UNIT
- 1));
7615 cfun_frame_layout
.frame_size
+= crtl
->outgoing_args_size
;
7619 /* Generate frame layout. Fills in register and frame data for the current
7620 function in cfun->machine. This routine can be called multiple times;
7621 it will re-do the complete frame layout every time. */
7624 s390_init_frame_layout (void)
7626 HOST_WIDE_INT frame_size
;
7628 int clobbered_regs
[16];
7630 /* On S/390 machines, we may need to perform branch splitting, which
7631 will require both base and return address register. We have no
7632 choice but to assume we're going to need them until right at the
7633 end of the machine dependent reorg phase. */
7634 if (!TARGET_CPU_ZARCH
)
7635 cfun
->machine
->split_branches_pending_p
= true;
7639 frame_size
= cfun_frame_layout
.frame_size
;
7641 /* Try to predict whether we'll need the base register. */
7642 base_used
= cfun
->machine
->split_branches_pending_p
7643 || crtl
->uses_const_pool
7644 || (!DISP_IN_RANGE (frame_size
)
7645 && !CONST_OK_FOR_K (frame_size
));
7647 /* Decide which register to use as literal pool base. In small
7648 leaf functions, try to use an unused call-clobbered register
7649 as base register to avoid save/restore overhead. */
7651 cfun
->machine
->base_reg
= NULL_RTX
;
7652 else if (crtl
->is_leaf
&& !df_regs_ever_live_p (5))
7653 cfun
->machine
->base_reg
= gen_rtx_REG (Pmode
, 5);
7655 cfun
->machine
->base_reg
= gen_rtx_REG (Pmode
, BASE_REGNUM
);
7657 s390_register_info (clobbered_regs
);
7660 while (frame_size
!= cfun_frame_layout
.frame_size
);
7663 /* Update frame layout. Recompute actual register save data based on
7664 current info and update regs_ever_live for the special registers.
7665 May be called multiple times, but may never cause *more* registers
7666 to be saved than s390_init_frame_layout allocated room for. */
7669 s390_update_frame_layout (void)
7671 int clobbered_regs
[16];
7673 s390_register_info (clobbered_regs
);
7675 df_set_regs_ever_live (BASE_REGNUM
,
7676 clobbered_regs
[BASE_REGNUM
] ? true : false);
7677 df_set_regs_ever_live (RETURN_REGNUM
,
7678 clobbered_regs
[RETURN_REGNUM
] ? true : false);
7679 df_set_regs_ever_live (STACK_POINTER_REGNUM
,
7680 clobbered_regs
[STACK_POINTER_REGNUM
] ? true : false);
7682 if (cfun
->machine
->base_reg
)
7683 df_set_regs_ever_live (REGNO (cfun
->machine
->base_reg
), true);
7686 /* Return true if it is legal to put a value with MODE into REGNO. */
7689 s390_hard_regno_mode_ok (unsigned int regno
, enum machine_mode mode
)
7691 switch (REGNO_REG_CLASS (regno
))
7694 if (REGNO_PAIR_OK (regno
, mode
))
7696 if (mode
== SImode
|| mode
== DImode
)
7699 if (FLOAT_MODE_P (mode
) && GET_MODE_CLASS (mode
) != MODE_VECTOR_FLOAT
)
7704 if (FRAME_REGNO_P (regno
) && mode
== Pmode
)
7709 if (REGNO_PAIR_OK (regno
, mode
))
7712 || (mode
!= TFmode
&& mode
!= TCmode
&& mode
!= TDmode
))
7717 if (GET_MODE_CLASS (mode
) == MODE_CC
)
7721 if (REGNO_PAIR_OK (regno
, mode
))
7723 if (mode
== SImode
|| mode
== Pmode
)
7734 /* Return nonzero if register OLD_REG can be renamed to register NEW_REG. */
7737 s390_hard_regno_rename_ok (unsigned int old_reg
, unsigned int new_reg
)
7739 /* Once we've decided upon a register to use as base register, it must
7740 no longer be used for any other purpose. */
7741 if (cfun
->machine
->base_reg
)
7742 if (REGNO (cfun
->machine
->base_reg
) == old_reg
7743 || REGNO (cfun
->machine
->base_reg
) == new_reg
)
7749 /* Maximum number of registers to represent a value of mode MODE
7750 in a register of class RCLASS. */
7753 s390_class_max_nregs (enum reg_class rclass
, enum machine_mode mode
)
7758 if (GET_MODE_CLASS (mode
) == MODE_COMPLEX_FLOAT
)
7759 return 2 * ((GET_MODE_SIZE (mode
) / 2 + 8 - 1) / 8);
7761 return (GET_MODE_SIZE (mode
) + 8 - 1) / 8;
7763 return (GET_MODE_SIZE (mode
) + 4 - 1) / 4;
7767 return (GET_MODE_SIZE (mode
) + UNITS_PER_WORD
- 1) / UNITS_PER_WORD
;
7770 /* Return true if register FROM can be eliminated via register TO. */
7773 s390_can_eliminate (const int from
, const int to
)
7775 /* On zSeries machines, we have not marked the base register as fixed.
7776 Instead, we have an elimination rule BASE_REGNUM -> BASE_REGNUM.
7777 If a function requires the base register, we say here that this
7778 elimination cannot be performed. This will cause reload to free
7779 up the base register (as if it were fixed). On the other hand,
7780 if the current function does *not* require the base register, we
7781 say here the elimination succeeds, which in turn allows reload
7782 to allocate the base register for any other purpose. */
7783 if (from
== BASE_REGNUM
&& to
== BASE_REGNUM
)
7785 if (TARGET_CPU_ZARCH
)
7787 s390_init_frame_layout ();
7788 return cfun
->machine
->base_reg
== NULL_RTX
;
7794 /* Everything else must point into the stack frame. */
7795 gcc_assert (to
== STACK_POINTER_REGNUM
7796 || to
== HARD_FRAME_POINTER_REGNUM
);
7798 gcc_assert (from
== FRAME_POINTER_REGNUM
7799 || from
== ARG_POINTER_REGNUM
7800 || from
== RETURN_ADDRESS_POINTER_REGNUM
);
7802 /* Make sure we actually saved the return address. */
7803 if (from
== RETURN_ADDRESS_POINTER_REGNUM
)
7804 if (!crtl
->calls_eh_return
7806 && !cfun_frame_layout
.save_return_addr_p
)
7812 /* Return offset between register FROM and TO initially after prolog. */
7815 s390_initial_elimination_offset (int from
, int to
)
7817 HOST_WIDE_INT offset
;
7820 /* ??? Why are we called for non-eliminable pairs? */
7821 if (!s390_can_eliminate (from
, to
))
7826 case FRAME_POINTER_REGNUM
:
7827 offset
= (get_frame_size()
7828 + STACK_POINTER_OFFSET
7829 + crtl
->outgoing_args_size
);
7832 case ARG_POINTER_REGNUM
:
7833 s390_init_frame_layout ();
7834 offset
= cfun_frame_layout
.frame_size
+ STACK_POINTER_OFFSET
;
7837 case RETURN_ADDRESS_POINTER_REGNUM
:
7838 s390_init_frame_layout ();
7839 index
= RETURN_REGNUM
- cfun_frame_layout
.first_save_gpr_slot
;
7840 gcc_assert (index
>= 0);
7841 offset
= cfun_frame_layout
.frame_size
+ cfun_frame_layout
.gprs_offset
;
7842 offset
+= index
* UNITS_PER_LONG
;
7856 /* Emit insn to save fpr REGNUM at offset OFFSET relative
7857 to register BASE. Return generated insn. */
7860 save_fpr (rtx base
, int offset
, int regnum
)
7863 addr
= gen_rtx_MEM (DFmode
, plus_constant (Pmode
, base
, offset
));
7865 if (regnum
>= 16 && regnum
<= (16 + FP_ARG_NUM_REG
))
7866 set_mem_alias_set (addr
, get_varargs_alias_set ());
7868 set_mem_alias_set (addr
, get_frame_alias_set ());
7870 return emit_move_insn (addr
, gen_rtx_REG (DFmode
, regnum
));
7873 /* Emit insn to restore fpr REGNUM from offset OFFSET relative
7874 to register BASE. Return generated insn. */
7877 restore_fpr (rtx base
, int offset
, int regnum
)
7880 addr
= gen_rtx_MEM (DFmode
, plus_constant (Pmode
, base
, offset
));
7881 set_mem_alias_set (addr
, get_frame_alias_set ());
7883 return emit_move_insn (gen_rtx_REG (DFmode
, regnum
), addr
);
7886 /* Return true if REGNO is a global register, but not one
7887 of the special ones that need to be saved/restored in anyway. */
7890 global_not_special_regno_p (int regno
)
7892 return (global_regs
[regno
]
7893 /* These registers are special and need to be
7894 restored in any case. */
7895 && !(regno
== STACK_POINTER_REGNUM
7896 || regno
== RETURN_REGNUM
7897 || regno
== BASE_REGNUM
7898 || (flag_pic
&& regno
== (int)PIC_OFFSET_TABLE_REGNUM
)));
7901 /* Generate insn to save registers FIRST to LAST into
7902 the register save area located at offset OFFSET
7903 relative to register BASE. */
7906 save_gprs (rtx base
, int offset
, int first
, int last
)
7908 rtx addr
, insn
, note
;
7911 addr
= plus_constant (Pmode
, base
, offset
);
7912 addr
= gen_rtx_MEM (Pmode
, addr
);
7914 set_mem_alias_set (addr
, get_frame_alias_set ());
7916 /* Special-case single register. */
7920 insn
= gen_movdi (addr
, gen_rtx_REG (Pmode
, first
));
7922 insn
= gen_movsi (addr
, gen_rtx_REG (Pmode
, first
));
7924 if (!global_not_special_regno_p (first
))
7925 RTX_FRAME_RELATED_P (insn
) = 1;
7930 insn
= gen_store_multiple (addr
,
7931 gen_rtx_REG (Pmode
, first
),
7932 GEN_INT (last
- first
+ 1));
7934 if (first
<= 6 && cfun
->stdarg
)
7935 for (i
= 0; i
< XVECLEN (PATTERN (insn
), 0); i
++)
7937 rtx mem
= XEXP (XVECEXP (PATTERN (insn
), 0, i
), 0);
7940 set_mem_alias_set (mem
, get_varargs_alias_set ());
7943 /* We need to set the FRAME_RELATED flag on all SETs
7944 inside the store-multiple pattern.
7946 However, we must not emit DWARF records for registers 2..5
7947 if they are stored for use by variable arguments ...
7949 ??? Unfortunately, it is not enough to simply not the
7950 FRAME_RELATED flags for those SETs, because the first SET
7951 of the PARALLEL is always treated as if it had the flag
7952 set, even if it does not. Therefore we emit a new pattern
7953 without those registers as REG_FRAME_RELATED_EXPR note. */
7955 if (first
>= 6 && !global_not_special_regno_p (first
))
7957 rtx pat
= PATTERN (insn
);
7959 for (i
= 0; i
< XVECLEN (pat
, 0); i
++)
7960 if (GET_CODE (XVECEXP (pat
, 0, i
)) == SET
7961 && !global_not_special_regno_p (REGNO (SET_SRC (XVECEXP (pat
,
7963 RTX_FRAME_RELATED_P (XVECEXP (pat
, 0, i
)) = 1;
7965 RTX_FRAME_RELATED_P (insn
) = 1;
7971 for (start
= first
>= 6 ? first
: 6; start
<= last
; start
++)
7972 if (!global_not_special_regno_p (start
))
7978 addr
= plus_constant (Pmode
, base
,
7979 offset
+ (start
- first
) * UNITS_PER_LONG
);
7980 note
= gen_store_multiple (gen_rtx_MEM (Pmode
, addr
),
7981 gen_rtx_REG (Pmode
, start
),
7982 GEN_INT (last
- start
+ 1));
7983 note
= PATTERN (note
);
7985 add_reg_note (insn
, REG_FRAME_RELATED_EXPR
, note
);
7987 for (i
= 0; i
< XVECLEN (note
, 0); i
++)
7988 if (GET_CODE (XVECEXP (note
, 0, i
)) == SET
7989 && !global_not_special_regno_p (REGNO (SET_SRC (XVECEXP (note
,
7991 RTX_FRAME_RELATED_P (XVECEXP (note
, 0, i
)) = 1;
7993 RTX_FRAME_RELATED_P (insn
) = 1;
7999 /* Generate insn to restore registers FIRST to LAST from
8000 the register save area located at offset OFFSET
8001 relative to register BASE. */
8004 restore_gprs (rtx base
, int offset
, int first
, int last
)
8008 addr
= plus_constant (Pmode
, base
, offset
);
8009 addr
= gen_rtx_MEM (Pmode
, addr
);
8010 set_mem_alias_set (addr
, get_frame_alias_set ());
8012 /* Special-case single register. */
8016 insn
= gen_movdi (gen_rtx_REG (Pmode
, first
), addr
);
8018 insn
= gen_movsi (gen_rtx_REG (Pmode
, first
), addr
);
8023 insn
= gen_load_multiple (gen_rtx_REG (Pmode
, first
),
8025 GEN_INT (last
- first
+ 1));
8029 /* Return insn sequence to load the GOT register. */
8031 static GTY(()) rtx got_symbol
;
8033 s390_load_got (void)
8037 /* We cannot use pic_offset_table_rtx here since we use this
8038 function also for non-pic if __tls_get_offset is called and in
8039 that case PIC_OFFSET_TABLE_REGNUM as well as pic_offset_table_rtx
8041 rtx got_rtx
= gen_rtx_REG (Pmode
, 12);
8045 got_symbol
= gen_rtx_SYMBOL_REF (Pmode
, "_GLOBAL_OFFSET_TABLE_");
8046 SYMBOL_REF_FLAGS (got_symbol
) = SYMBOL_FLAG_LOCAL
;
8051 if (TARGET_CPU_ZARCH
)
8053 emit_move_insn (got_rtx
, got_symbol
);
8059 offset
= gen_rtx_UNSPEC (Pmode
, gen_rtvec (1, got_symbol
),
8060 UNSPEC_LTREL_OFFSET
);
8061 offset
= gen_rtx_CONST (Pmode
, offset
);
8062 offset
= force_const_mem (Pmode
, offset
);
8064 emit_move_insn (got_rtx
, offset
);
8066 offset
= gen_rtx_UNSPEC (Pmode
, gen_rtvec (1, XEXP (offset
, 0)),
8068 offset
= gen_rtx_PLUS (Pmode
, got_rtx
, offset
);
8070 emit_move_insn (got_rtx
, offset
);
8073 insns
= get_insns ();
8078 /* This ties together stack memory (MEM with an alias set of frame_alias_set)
8079 and the change to the stack pointer. */
8082 s390_emit_stack_tie (void)
8084 rtx mem
= gen_frame_mem (BLKmode
,
8085 gen_rtx_REG (Pmode
, STACK_POINTER_REGNUM
));
8087 emit_insn (gen_stack_tie (mem
));
8090 /* Expand the prologue into a bunch of separate insns. */
8093 s390_emit_prologue (void)
8101 /* Complete frame layout. */
8103 s390_update_frame_layout ();
8105 /* Annotate all constant pool references to let the scheduler know
8106 they implicitly use the base register. */
8108 push_topmost_sequence ();
8110 for (insn
= get_insns (); insn
; insn
= NEXT_INSN (insn
))
8113 annotate_constant_pool_refs (&PATTERN (insn
));
8114 df_insn_rescan (insn
);
8117 pop_topmost_sequence ();
8119 /* Choose best register to use for temp use within prologue.
8120 See below for why TPF must use the register 1. */
8122 if (!has_hard_reg_initial_val (Pmode
, RETURN_REGNUM
)
8124 && !TARGET_TPF_PROFILING
)
8125 temp_reg
= gen_rtx_REG (Pmode
, RETURN_REGNUM
);
8127 temp_reg
= gen_rtx_REG (Pmode
, 1);
8129 /* Save call saved gprs. */
8130 if (cfun_frame_layout
.first_save_gpr
!= -1)
8132 insn
= save_gprs (stack_pointer_rtx
,
8133 cfun_frame_layout
.gprs_offset
+
8134 UNITS_PER_LONG
* (cfun_frame_layout
.first_save_gpr
8135 - cfun_frame_layout
.first_save_gpr_slot
),
8136 cfun_frame_layout
.first_save_gpr
,
8137 cfun_frame_layout
.last_save_gpr
);
8141 /* Dummy insn to mark literal pool slot. */
8143 if (cfun
->machine
->base_reg
)
8144 emit_insn (gen_main_pool (cfun
->machine
->base_reg
));
8146 offset
= cfun_frame_layout
.f0_offset
;
8148 /* Save f0 and f2. */
8149 for (i
= 0; i
< 2; i
++)
8151 if (cfun_fpr_bit_p (i
))
8153 save_fpr (stack_pointer_rtx
, offset
, i
+ 16);
8156 else if (!TARGET_PACKED_STACK
)
8160 /* Save f4 and f6. */
8161 offset
= cfun_frame_layout
.f4_offset
;
8162 for (i
= 2; i
< 4; i
++)
8164 if (cfun_fpr_bit_p (i
))
8166 insn
= save_fpr (stack_pointer_rtx
, offset
, i
+ 16);
8169 /* If f4 and f6 are call clobbered they are saved due to stdargs and
8170 therefore are not frame related. */
8171 if (!call_really_used_regs
[i
+ 16])
8172 RTX_FRAME_RELATED_P (insn
) = 1;
8174 else if (!TARGET_PACKED_STACK
)
8178 if (TARGET_PACKED_STACK
8179 && cfun_save_high_fprs_p
8180 && cfun_frame_layout
.f8_offset
+ cfun_frame_layout
.high_fprs
* 8 > 0)
8182 offset
= (cfun_frame_layout
.f8_offset
8183 + (cfun_frame_layout
.high_fprs
- 1) * 8);
8185 for (i
= 15; i
> 7 && offset
>= 0; i
--)
8186 if (cfun_fpr_bit_p (i
))
8188 insn
= save_fpr (stack_pointer_rtx
, offset
, i
+ 16);
8190 RTX_FRAME_RELATED_P (insn
) = 1;
8193 if (offset
>= cfun_frame_layout
.f8_offset
)
8197 if (!TARGET_PACKED_STACK
)
8198 next_fpr
= cfun_save_high_fprs_p
? 31 : 0;
8200 if (flag_stack_usage_info
)
8201 current_function_static_stack_size
= cfun_frame_layout
.frame_size
;
8203 /* Decrement stack pointer. */
8205 if (cfun_frame_layout
.frame_size
> 0)
8207 rtx frame_off
= GEN_INT (-cfun_frame_layout
.frame_size
);
8210 if (s390_stack_size
)
8212 HOST_WIDE_INT stack_guard
;
8214 if (s390_stack_guard
)
8215 stack_guard
= s390_stack_guard
;
8218 /* If no value for stack guard is provided the smallest power of 2
8219 larger than the current frame size is chosen. */
8221 while (stack_guard
< cfun_frame_layout
.frame_size
)
8225 if (cfun_frame_layout
.frame_size
>= s390_stack_size
)
8227 warning (0, "frame size of function %qs is %wd"
8228 " bytes exceeding user provided stack limit of "
8230 "An unconditional trap is added.",
8231 current_function_name(), cfun_frame_layout
.frame_size
,
8233 emit_insn (gen_trap ());
8237 /* stack_guard has to be smaller than s390_stack_size.
8238 Otherwise we would emit an AND with zero which would
8239 not match the test under mask pattern. */
8240 if (stack_guard
>= s390_stack_size
)
8242 warning (0, "frame size of function %qs is %wd"
8243 " bytes which is more than half the stack size. "
8244 "The dynamic check would not be reliable. "
8245 "No check emitted for this function.",
8246 current_function_name(),
8247 cfun_frame_layout
.frame_size
);
8251 HOST_WIDE_INT stack_check_mask
= ((s390_stack_size
- 1)
8252 & ~(stack_guard
- 1));
8254 rtx t
= gen_rtx_AND (Pmode
, stack_pointer_rtx
,
8255 GEN_INT (stack_check_mask
));
8257 emit_insn (gen_ctrapdi4 (gen_rtx_EQ (VOIDmode
,
8259 t
, const0_rtx
, const0_rtx
));
8261 emit_insn (gen_ctrapsi4 (gen_rtx_EQ (VOIDmode
,
8263 t
, const0_rtx
, const0_rtx
));
8268 if (s390_warn_framesize
> 0
8269 && cfun_frame_layout
.frame_size
>= s390_warn_framesize
)
8270 warning (0, "frame size of %qs is %wd bytes",
8271 current_function_name (), cfun_frame_layout
.frame_size
);
8273 if (s390_warn_dynamicstack_p
&& cfun
->calls_alloca
)
8274 warning (0, "%qs uses dynamic stack allocation", current_function_name ());
8276 /* Save incoming stack pointer into temp reg. */
8277 if (TARGET_BACKCHAIN
|| next_fpr
)
8278 insn
= emit_insn (gen_move_insn (temp_reg
, stack_pointer_rtx
));
8280 /* Subtract frame size from stack pointer. */
8282 if (DISP_IN_RANGE (INTVAL (frame_off
)))
8284 insn
= gen_rtx_SET (VOIDmode
, stack_pointer_rtx
,
8285 gen_rtx_PLUS (Pmode
, stack_pointer_rtx
,
8287 insn
= emit_insn (insn
);
8291 if (!CONST_OK_FOR_K (INTVAL (frame_off
)))
8292 frame_off
= force_const_mem (Pmode
, frame_off
);
8294 insn
= emit_insn (gen_add2_insn (stack_pointer_rtx
, frame_off
));
8295 annotate_constant_pool_refs (&PATTERN (insn
));
8298 RTX_FRAME_RELATED_P (insn
) = 1;
8299 real_frame_off
= GEN_INT (-cfun_frame_layout
.frame_size
);
8300 add_reg_note (insn
, REG_FRAME_RELATED_EXPR
,
8301 gen_rtx_SET (VOIDmode
, stack_pointer_rtx
,
8302 gen_rtx_PLUS (Pmode
, stack_pointer_rtx
,
8305 /* Set backchain. */
8307 if (TARGET_BACKCHAIN
)
8309 if (cfun_frame_layout
.backchain_offset
)
8310 addr
= gen_rtx_MEM (Pmode
,
8311 plus_constant (Pmode
, stack_pointer_rtx
,
8312 cfun_frame_layout
.backchain_offset
));
8314 addr
= gen_rtx_MEM (Pmode
, stack_pointer_rtx
);
8315 set_mem_alias_set (addr
, get_frame_alias_set ());
8316 insn
= emit_insn (gen_move_insn (addr
, temp_reg
));
8319 /* If we support non-call exceptions (e.g. for Java),
8320 we need to make sure the backchain pointer is set up
8321 before any possibly trapping memory access. */
8322 if (TARGET_BACKCHAIN
&& cfun
->can_throw_non_call_exceptions
)
8324 addr
= gen_rtx_MEM (BLKmode
, gen_rtx_SCRATCH (VOIDmode
));
8325 emit_clobber (addr
);
8329 /* Save fprs 8 - 15 (64 bit ABI). */
8331 if (cfun_save_high_fprs_p
&& next_fpr
)
8333 /* If the stack might be accessed through a different register
8334 we have to make sure that the stack pointer decrement is not
8335 moved below the use of the stack slots. */
8336 s390_emit_stack_tie ();
8338 insn
= emit_insn (gen_add2_insn (temp_reg
,
8339 GEN_INT (cfun_frame_layout
.f8_offset
)));
8343 for (i
= 24; i
<= next_fpr
; i
++)
8344 if (cfun_fpr_bit_p (i
- 16))
8346 rtx addr
= plus_constant (Pmode
, stack_pointer_rtx
,
8347 cfun_frame_layout
.frame_size
8348 + cfun_frame_layout
.f8_offset
8351 insn
= save_fpr (temp_reg
, offset
, i
);
8353 RTX_FRAME_RELATED_P (insn
) = 1;
8354 add_reg_note (insn
, REG_FRAME_RELATED_EXPR
,
8355 gen_rtx_SET (VOIDmode
,
8356 gen_rtx_MEM (DFmode
, addr
),
8357 gen_rtx_REG (DFmode
, i
)));
8361 /* Set frame pointer, if needed. */
8363 if (frame_pointer_needed
)
8365 insn
= emit_move_insn (hard_frame_pointer_rtx
, stack_pointer_rtx
);
8366 RTX_FRAME_RELATED_P (insn
) = 1;
8369 /* Set up got pointer, if needed. */
8371 if (flag_pic
&& df_regs_ever_live_p (PIC_OFFSET_TABLE_REGNUM
))
8373 rtx insns
= s390_load_got ();
8375 for (insn
= insns
; insn
; insn
= NEXT_INSN (insn
))
8376 annotate_constant_pool_refs (&PATTERN (insn
));
8381 if (TARGET_TPF_PROFILING
)
8383 /* Generate a BAS instruction to serve as a function
8384 entry intercept to facilitate the use of tracing
8385 algorithms located at the branch target. */
8386 emit_insn (gen_prologue_tpf ());
8388 /* Emit a blockage here so that all code
8389 lies between the profiling mechanisms. */
8390 emit_insn (gen_blockage ());
8394 /* Expand the epilogue into a bunch of separate insns. */
8397 s390_emit_epilogue (bool sibcall
)
8399 rtx frame_pointer
, return_reg
, cfa_restores
= NULL_RTX
;
8400 int area_bottom
, area_top
, offset
= 0;
8405 if (TARGET_TPF_PROFILING
)
8408 /* Generate a BAS instruction to serve as a function
8409 entry intercept to facilitate the use of tracing
8410 algorithms located at the branch target. */
8412 /* Emit a blockage here so that all code
8413 lies between the profiling mechanisms. */
8414 emit_insn (gen_blockage ());
8416 emit_insn (gen_epilogue_tpf ());
8419 /* Check whether to use frame or stack pointer for restore. */
8421 frame_pointer
= (frame_pointer_needed
8422 ? hard_frame_pointer_rtx
: stack_pointer_rtx
);
8424 s390_frame_area (&area_bottom
, &area_top
);
8426 /* Check whether we can access the register save area.
8427 If not, increment the frame pointer as required. */
8429 if (area_top
<= area_bottom
)
8431 /* Nothing to restore. */
8433 else if (DISP_IN_RANGE (cfun_frame_layout
.frame_size
+ area_bottom
)
8434 && DISP_IN_RANGE (cfun_frame_layout
.frame_size
+ area_top
- 1))
8436 /* Area is in range. */
8437 offset
= cfun_frame_layout
.frame_size
;
8441 rtx insn
, frame_off
, cfa
;
8443 offset
= area_bottom
< 0 ? -area_bottom
: 0;
8444 frame_off
= GEN_INT (cfun_frame_layout
.frame_size
- offset
);
8446 cfa
= gen_rtx_SET (VOIDmode
, frame_pointer
,
8447 gen_rtx_PLUS (Pmode
, frame_pointer
, frame_off
));
8448 if (DISP_IN_RANGE (INTVAL (frame_off
)))
8450 insn
= gen_rtx_SET (VOIDmode
, frame_pointer
,
8451 gen_rtx_PLUS (Pmode
, frame_pointer
, frame_off
));
8452 insn
= emit_insn (insn
);
8456 if (!CONST_OK_FOR_K (INTVAL (frame_off
)))
8457 frame_off
= force_const_mem (Pmode
, frame_off
);
8459 insn
= emit_insn (gen_add2_insn (frame_pointer
, frame_off
));
8460 annotate_constant_pool_refs (&PATTERN (insn
));
8462 add_reg_note (insn
, REG_CFA_ADJUST_CFA
, cfa
);
8463 RTX_FRAME_RELATED_P (insn
) = 1;
8466 /* Restore call saved fprs. */
8470 if (cfun_save_high_fprs_p
)
8472 next_offset
= cfun_frame_layout
.f8_offset
;
8473 for (i
= 24; i
< 32; i
++)
8475 if (cfun_fpr_bit_p (i
- 16))
8477 restore_fpr (frame_pointer
,
8478 offset
+ next_offset
, i
);
8480 = alloc_reg_note (REG_CFA_RESTORE
,
8481 gen_rtx_REG (DFmode
, i
), cfa_restores
);
8490 next_offset
= cfun_frame_layout
.f4_offset
;
8491 for (i
= 18; i
< 20; i
++)
8493 if (cfun_fpr_bit_p (i
- 16))
8495 restore_fpr (frame_pointer
,
8496 offset
+ next_offset
, i
);
8498 = alloc_reg_note (REG_CFA_RESTORE
,
8499 gen_rtx_REG (DFmode
, i
), cfa_restores
);
8502 else if (!TARGET_PACKED_STACK
)
8508 /* Return register. */
8510 return_reg
= gen_rtx_REG (Pmode
, RETURN_REGNUM
);
8512 /* Restore call saved gprs. */
8514 if (cfun_frame_layout
.first_restore_gpr
!= -1)
8519 /* Check for global register and save them
8520 to stack location from where they get restored. */
8522 for (i
= cfun_frame_layout
.first_restore_gpr
;
8523 i
<= cfun_frame_layout
.last_restore_gpr
;
8526 if (global_not_special_regno_p (i
))
8528 addr
= plus_constant (Pmode
, frame_pointer
,
8529 offset
+ cfun_frame_layout
.gprs_offset
8530 + (i
- cfun_frame_layout
.first_save_gpr_slot
)
8532 addr
= gen_rtx_MEM (Pmode
, addr
);
8533 set_mem_alias_set (addr
, get_frame_alias_set ());
8534 emit_move_insn (addr
, gen_rtx_REG (Pmode
, i
));
8538 = alloc_reg_note (REG_CFA_RESTORE
,
8539 gen_rtx_REG (Pmode
, i
), cfa_restores
);
8544 /* Fetch return address from stack before load multiple,
8545 this will do good for scheduling. */
8547 if (cfun_frame_layout
.save_return_addr_p
8548 || (cfun_frame_layout
.first_restore_gpr
< BASE_REGNUM
8549 && cfun_frame_layout
.last_restore_gpr
> RETURN_REGNUM
))
8551 int return_regnum
= find_unused_clobbered_reg();
8554 return_reg
= gen_rtx_REG (Pmode
, return_regnum
);
8556 addr
= plus_constant (Pmode
, frame_pointer
,
8557 offset
+ cfun_frame_layout
.gprs_offset
8559 - cfun_frame_layout
.first_save_gpr_slot
)
8561 addr
= gen_rtx_MEM (Pmode
, addr
);
8562 set_mem_alias_set (addr
, get_frame_alias_set ());
8563 emit_move_insn (return_reg
, addr
);
8567 insn
= restore_gprs (frame_pointer
,
8568 offset
+ cfun_frame_layout
.gprs_offset
8569 + (cfun_frame_layout
.first_restore_gpr
8570 - cfun_frame_layout
.first_save_gpr_slot
)
8572 cfun_frame_layout
.first_restore_gpr
,
8573 cfun_frame_layout
.last_restore_gpr
);
8574 insn
= emit_insn (insn
);
8575 REG_NOTES (insn
) = cfa_restores
;
8576 add_reg_note (insn
, REG_CFA_DEF_CFA
,
8577 plus_constant (Pmode
, stack_pointer_rtx
,
8578 STACK_POINTER_OFFSET
));
8579 RTX_FRAME_RELATED_P (insn
) = 1;
8585 /* Return to caller. */
8587 p
= rtvec_alloc (2);
8589 RTVEC_ELT (p
, 0) = ret_rtx
;
8590 RTVEC_ELT (p
, 1) = gen_rtx_USE (VOIDmode
, return_reg
);
8591 emit_jump_insn (gen_rtx_PARALLEL (VOIDmode
, p
));
8596 /* Return the size in bytes of a function argument of
8597 type TYPE and/or mode MODE. At least one of TYPE or
8598 MODE must be specified. */
8601 s390_function_arg_size (enum machine_mode mode
, const_tree type
)
8604 return int_size_in_bytes (type
);
8606 /* No type info available for some library calls ... */
8607 if (mode
!= BLKmode
)
8608 return GET_MODE_SIZE (mode
);
8610 /* If we have neither type nor mode, abort */
8614 /* Return true if a function argument of type TYPE and mode MODE
8615 is to be passed in a floating-point register, if available. */
8618 s390_function_arg_float (enum machine_mode mode
, const_tree type
)
8620 int size
= s390_function_arg_size (mode
, type
);
8624 /* Soft-float changes the ABI: no floating-point registers are used. */
8625 if (TARGET_SOFT_FLOAT
)
8628 /* No type info available for some library calls ... */
8630 return mode
== SFmode
|| mode
== DFmode
|| mode
== SDmode
|| mode
== DDmode
;
8632 /* The ABI says that record types with a single member are treated
8633 just like that member would be. */
8634 while (TREE_CODE (type
) == RECORD_TYPE
)
8636 tree field
, single
= NULL_TREE
;
8638 for (field
= TYPE_FIELDS (type
); field
; field
= DECL_CHAIN (field
))
8640 if (TREE_CODE (field
) != FIELD_DECL
)
8643 if (single
== NULL_TREE
)
8644 single
= TREE_TYPE (field
);
8649 if (single
== NULL_TREE
)
8655 return TREE_CODE (type
) == REAL_TYPE
;
8658 /* Return true if a function argument of type TYPE and mode MODE
8659 is to be passed in an integer register, or a pair of integer
8660 registers, if available. */
8663 s390_function_arg_integer (enum machine_mode mode
, const_tree type
)
8665 int size
= s390_function_arg_size (mode
, type
);
8669 /* No type info available for some library calls ... */
8671 return GET_MODE_CLASS (mode
) == MODE_INT
8672 || (TARGET_SOFT_FLOAT
&& SCALAR_FLOAT_MODE_P (mode
));
8674 /* We accept small integral (and similar) types. */
8675 if (INTEGRAL_TYPE_P (type
)
8676 || POINTER_TYPE_P (type
)
8677 || TREE_CODE (type
) == NULLPTR_TYPE
8678 || TREE_CODE (type
) == OFFSET_TYPE
8679 || (TARGET_SOFT_FLOAT
&& TREE_CODE (type
) == REAL_TYPE
))
8682 /* We also accept structs of size 1, 2, 4, 8 that are not
8683 passed in floating-point registers. */
8684 if (AGGREGATE_TYPE_P (type
)
8685 && exact_log2 (size
) >= 0
8686 && !s390_function_arg_float (mode
, type
))
8692 /* Return 1 if a function argument of type TYPE and mode MODE
8693 is to be passed by reference. The ABI specifies that only
8694 structures of size 1, 2, 4, or 8 bytes are passed by value,
8695 all other structures (and complex numbers) are passed by
8699 s390_pass_by_reference (cumulative_args_t ca ATTRIBUTE_UNUSED
,
8700 enum machine_mode mode
, const_tree type
,
8701 bool named ATTRIBUTE_UNUSED
)
8703 int size
= s390_function_arg_size (mode
, type
);
8709 if (AGGREGATE_TYPE_P (type
) && exact_log2 (size
) < 0)
8712 if (TREE_CODE (type
) == COMPLEX_TYPE
8713 || TREE_CODE (type
) == VECTOR_TYPE
)
8720 /* Update the data in CUM to advance over an argument of mode MODE and
8721 data type TYPE. (TYPE is null for libcalls where that information
8722 may not be available.). The boolean NAMED specifies whether the
8723 argument is a named argument (as opposed to an unnamed argument
8724 matching an ellipsis). */
8727 s390_function_arg_advance (cumulative_args_t cum_v
, enum machine_mode mode
,
8728 const_tree type
, bool named ATTRIBUTE_UNUSED
)
8730 CUMULATIVE_ARGS
*cum
= get_cumulative_args (cum_v
);
8732 if (s390_function_arg_float (mode
, type
))
8736 else if (s390_function_arg_integer (mode
, type
))
8738 int size
= s390_function_arg_size (mode
, type
);
8739 cum
->gprs
+= ((size
+ UNITS_PER_LONG
- 1) / UNITS_PER_LONG
);
8745 /* Define where to put the arguments to a function.
8746 Value is zero to push the argument on the stack,
8747 or a hard register in which to store the argument.
8749 MODE is the argument's machine mode.
8750 TYPE is the data type of the argument (as a tree).
8751 This is null for libcalls where that information may
8753 CUM is a variable of type CUMULATIVE_ARGS which gives info about
8754 the preceding args and about the function being called.
8755 NAMED is nonzero if this argument is a named parameter
8756 (otherwise it is an extra parameter matching an ellipsis).
8758 On S/390, we use general purpose registers 2 through 6 to
8759 pass integer, pointer, and certain structure arguments, and
8760 floating point registers 0 and 2 (0, 2, 4, and 6 on 64-bit)
8761 to pass floating point arguments. All remaining arguments
8762 are pushed to the stack. */
8765 s390_function_arg (cumulative_args_t cum_v
, enum machine_mode mode
,
8766 const_tree type
, bool named ATTRIBUTE_UNUSED
)
8768 CUMULATIVE_ARGS
*cum
= get_cumulative_args (cum_v
);
8770 if (s390_function_arg_float (mode
, type
))
8772 if (cum
->fprs
+ 1 > FP_ARG_NUM_REG
)
8775 return gen_rtx_REG (mode
, cum
->fprs
+ 16);
8777 else if (s390_function_arg_integer (mode
, type
))
8779 int size
= s390_function_arg_size (mode
, type
);
8780 int n_gprs
= (size
+ UNITS_PER_LONG
- 1) / UNITS_PER_LONG
;
8782 if (cum
->gprs
+ n_gprs
> GP_ARG_NUM_REG
)
8784 else if (n_gprs
== 1 || UNITS_PER_WORD
== UNITS_PER_LONG
)
8785 return gen_rtx_REG (mode
, cum
->gprs
+ 2);
8786 else if (n_gprs
== 2)
8788 rtvec p
= rtvec_alloc (2);
8791 = gen_rtx_EXPR_LIST (SImode
, gen_rtx_REG (SImode
, cum
->gprs
+ 2),
8794 = gen_rtx_EXPR_LIST (SImode
, gen_rtx_REG (SImode
, cum
->gprs
+ 3),
8797 return gen_rtx_PARALLEL (mode
, p
);
8801 /* After the real arguments, expand_call calls us once again
8802 with a void_type_node type. Whatever we return here is
8803 passed as operand 2 to the call expanders.
8805 We don't need this feature ... */
8806 else if (type
== void_type_node
)
8812 /* Return true if return values of type TYPE should be returned
8813 in a memory buffer whose address is passed by the caller as
8814 hidden first argument. */
8817 s390_return_in_memory (const_tree type
, const_tree fundecl ATTRIBUTE_UNUSED
)
8819 /* We accept small integral (and similar) types. */
8820 if (INTEGRAL_TYPE_P (type
)
8821 || POINTER_TYPE_P (type
)
8822 || TREE_CODE (type
) == OFFSET_TYPE
8823 || TREE_CODE (type
) == REAL_TYPE
)
8824 return int_size_in_bytes (type
) > 8;
8826 /* Aggregates and similar constructs are always returned
8828 if (AGGREGATE_TYPE_P (type
)
8829 || TREE_CODE (type
) == COMPLEX_TYPE
8830 || TREE_CODE (type
) == VECTOR_TYPE
)
8833 /* ??? We get called on all sorts of random stuff from
8834 aggregate_value_p. We can't abort, but it's not clear
8835 what's safe to return. Pretend it's a struct I guess. */
8839 /* Function arguments and return values are promoted to word size. */
8841 static enum machine_mode
8842 s390_promote_function_mode (const_tree type
, enum machine_mode mode
,
8844 const_tree fntype ATTRIBUTE_UNUSED
,
8845 int for_return ATTRIBUTE_UNUSED
)
8847 if (INTEGRAL_MODE_P (mode
)
8848 && GET_MODE_SIZE (mode
) < UNITS_PER_LONG
)
8850 if (type
!= NULL_TREE
&& POINTER_TYPE_P (type
))
8851 *punsignedp
= POINTERS_EXTEND_UNSIGNED
;
8858 /* Define where to return a (scalar) value of type RET_TYPE.
8859 If RET_TYPE is null, define where to return a (scalar)
8860 value of mode MODE from a libcall. */
8863 s390_function_and_libcall_value (enum machine_mode mode
,
8864 const_tree ret_type
,
8865 const_tree fntype_or_decl
,
8866 bool outgoing ATTRIBUTE_UNUSED
)
8868 /* For normal functions perform the promotion as
8869 promote_function_mode would do. */
8872 int unsignedp
= TYPE_UNSIGNED (ret_type
);
8873 mode
= promote_function_mode (ret_type
, mode
, &unsignedp
,
8877 gcc_assert (GET_MODE_CLASS (mode
) == MODE_INT
|| SCALAR_FLOAT_MODE_P (mode
));
8878 gcc_assert (GET_MODE_SIZE (mode
) <= 8);
8880 if (TARGET_HARD_FLOAT
&& SCALAR_FLOAT_MODE_P (mode
))
8881 return gen_rtx_REG (mode
, 16);
8882 else if (GET_MODE_SIZE (mode
) <= UNITS_PER_LONG
8883 || UNITS_PER_LONG
== UNITS_PER_WORD
)
8884 return gen_rtx_REG (mode
, 2);
8885 else if (GET_MODE_SIZE (mode
) == 2 * UNITS_PER_LONG
)
8887 /* This case is triggered when returning a 64 bit value with
8888 -m31 -mzarch. Although the value would fit into a single
8889 register it has to be forced into a 32 bit register pair in
8890 order to match the ABI. */
8891 rtvec p
= rtvec_alloc (2);
8894 = gen_rtx_EXPR_LIST (SImode
, gen_rtx_REG (SImode
, 2), const0_rtx
);
8896 = gen_rtx_EXPR_LIST (SImode
, gen_rtx_REG (SImode
, 3), GEN_INT (4));
8898 return gen_rtx_PARALLEL (mode
, p
);
8904 /* Define where to return a scalar return value of type RET_TYPE. */
8907 s390_function_value (const_tree ret_type
, const_tree fn_decl_or_type
,
8910 return s390_function_and_libcall_value (TYPE_MODE (ret_type
), ret_type
,
8911 fn_decl_or_type
, outgoing
);
8914 /* Define where to return a scalar libcall return value of mode
8918 s390_libcall_value (enum machine_mode mode
, const_rtx fun ATTRIBUTE_UNUSED
)
8920 return s390_function_and_libcall_value (mode
, NULL_TREE
,
8925 /* Create and return the va_list datatype.
8927 On S/390, va_list is an array type equivalent to
8929 typedef struct __va_list_tag
8933 void *__overflow_arg_area;
8934 void *__reg_save_area;
8937 where __gpr and __fpr hold the number of general purpose
8938 or floating point arguments used up to now, respectively,
8939 __overflow_arg_area points to the stack location of the
8940 next argument passed on the stack, and __reg_save_area
8941 always points to the start of the register area in the
8942 call frame of the current function. The function prologue
8943 saves all registers used for argument passing into this
8944 area if the function uses variable arguments. */
8947 s390_build_builtin_va_list (void)
8949 tree f_gpr
, f_fpr
, f_ovf
, f_sav
, record
, type_decl
;
8951 record
= lang_hooks
.types
.make_type (RECORD_TYPE
);
8954 build_decl (BUILTINS_LOCATION
,
8955 TYPE_DECL
, get_identifier ("__va_list_tag"), record
);
8957 f_gpr
= build_decl (BUILTINS_LOCATION
,
8958 FIELD_DECL
, get_identifier ("__gpr"),
8959 long_integer_type_node
);
8960 f_fpr
= build_decl (BUILTINS_LOCATION
,
8961 FIELD_DECL
, get_identifier ("__fpr"),
8962 long_integer_type_node
);
8963 f_ovf
= build_decl (BUILTINS_LOCATION
,
8964 FIELD_DECL
, get_identifier ("__overflow_arg_area"),
8966 f_sav
= build_decl (BUILTINS_LOCATION
,
8967 FIELD_DECL
, get_identifier ("__reg_save_area"),
8970 va_list_gpr_counter_field
= f_gpr
;
8971 va_list_fpr_counter_field
= f_fpr
;
8973 DECL_FIELD_CONTEXT (f_gpr
) = record
;
8974 DECL_FIELD_CONTEXT (f_fpr
) = record
;
8975 DECL_FIELD_CONTEXT (f_ovf
) = record
;
8976 DECL_FIELD_CONTEXT (f_sav
) = record
;
8978 TYPE_STUB_DECL (record
) = type_decl
;
8979 TYPE_NAME (record
) = type_decl
;
8980 TYPE_FIELDS (record
) = f_gpr
;
8981 DECL_CHAIN (f_gpr
) = f_fpr
;
8982 DECL_CHAIN (f_fpr
) = f_ovf
;
8983 DECL_CHAIN (f_ovf
) = f_sav
;
8985 layout_type (record
);
8987 /* The correct type is an array type of one element. */
8988 return build_array_type (record
, build_index_type (size_zero_node
));
8991 /* Implement va_start by filling the va_list structure VALIST.
8992 STDARG_P is always true, and ignored.
8993 NEXTARG points to the first anonymous stack argument.
8995 The following global variables are used to initialize
8996 the va_list structure:
8999 holds number of gprs and fprs used for named arguments.
9000 crtl->args.arg_offset_rtx:
9001 holds the offset of the first anonymous stack argument
9002 (relative to the virtual arg pointer). */
9005 s390_va_start (tree valist
, rtx nextarg ATTRIBUTE_UNUSED
)
9007 HOST_WIDE_INT n_gpr
, n_fpr
;
9009 tree f_gpr
, f_fpr
, f_ovf
, f_sav
;
9010 tree gpr
, fpr
, ovf
, sav
, t
;
9012 f_gpr
= TYPE_FIELDS (TREE_TYPE (va_list_type_node
));
9013 f_fpr
= DECL_CHAIN (f_gpr
);
9014 f_ovf
= DECL_CHAIN (f_fpr
);
9015 f_sav
= DECL_CHAIN (f_ovf
);
9017 valist
= build_simple_mem_ref (valist
);
9018 gpr
= build3 (COMPONENT_REF
, TREE_TYPE (f_gpr
), valist
, f_gpr
, NULL_TREE
);
9019 fpr
= build3 (COMPONENT_REF
, TREE_TYPE (f_fpr
), valist
, f_fpr
, NULL_TREE
);
9020 ovf
= build3 (COMPONENT_REF
, TREE_TYPE (f_ovf
), valist
, f_ovf
, NULL_TREE
);
9021 sav
= build3 (COMPONENT_REF
, TREE_TYPE (f_sav
), valist
, f_sav
, NULL_TREE
);
9023 /* Count number of gp and fp argument registers used. */
9025 n_gpr
= crtl
->args
.info
.gprs
;
9026 n_fpr
= crtl
->args
.info
.fprs
;
9028 if (cfun
->va_list_gpr_size
)
9030 t
= build2 (MODIFY_EXPR
, TREE_TYPE (gpr
), gpr
,
9031 build_int_cst (NULL_TREE
, n_gpr
));
9032 TREE_SIDE_EFFECTS (t
) = 1;
9033 expand_expr (t
, const0_rtx
, VOIDmode
, EXPAND_NORMAL
);
9036 if (cfun
->va_list_fpr_size
)
9038 t
= build2 (MODIFY_EXPR
, TREE_TYPE (fpr
), fpr
,
9039 build_int_cst (NULL_TREE
, n_fpr
));
9040 TREE_SIDE_EFFECTS (t
) = 1;
9041 expand_expr (t
, const0_rtx
, VOIDmode
, EXPAND_NORMAL
);
9044 /* Find the overflow area. */
9045 if (n_gpr
+ cfun
->va_list_gpr_size
> GP_ARG_NUM_REG
9046 || n_fpr
+ cfun
->va_list_fpr_size
> FP_ARG_NUM_REG
)
9048 t
= make_tree (TREE_TYPE (ovf
), virtual_incoming_args_rtx
);
9050 off
= INTVAL (crtl
->args
.arg_offset_rtx
);
9051 off
= off
< 0 ? 0 : off
;
9052 if (TARGET_DEBUG_ARG
)
9053 fprintf (stderr
, "va_start: n_gpr = %d, n_fpr = %d off %d\n",
9054 (int)n_gpr
, (int)n_fpr
, off
);
9056 t
= fold_build_pointer_plus_hwi (t
, off
);
9058 t
= build2 (MODIFY_EXPR
, TREE_TYPE (ovf
), ovf
, t
);
9059 TREE_SIDE_EFFECTS (t
) = 1;
9060 expand_expr (t
, const0_rtx
, VOIDmode
, EXPAND_NORMAL
);
9063 /* Find the register save area. */
9064 if ((cfun
->va_list_gpr_size
&& n_gpr
< GP_ARG_NUM_REG
)
9065 || (cfun
->va_list_fpr_size
&& n_fpr
< FP_ARG_NUM_REG
))
9067 t
= make_tree (TREE_TYPE (sav
), return_address_pointer_rtx
);
9068 t
= fold_build_pointer_plus_hwi (t
, -RETURN_REGNUM
* UNITS_PER_LONG
);
9070 t
= build2 (MODIFY_EXPR
, TREE_TYPE (sav
), sav
, t
);
9071 TREE_SIDE_EFFECTS (t
) = 1;
9072 expand_expr (t
, const0_rtx
, VOIDmode
, EXPAND_NORMAL
);
9076 /* Implement va_arg by updating the va_list structure
9077 VALIST as required to retrieve an argument of type
9078 TYPE, and returning that argument.
9080 Generates code equivalent to:
9082 if (integral value) {
9083 if (size <= 4 && args.gpr < 5 ||
9084 size > 4 && args.gpr < 4 )
9085 ret = args.reg_save_area[args.gpr+8]
9087 ret = *args.overflow_arg_area++;
9088 } else if (float value) {
9090 ret = args.reg_save_area[args.fpr+64]
9092 ret = *args.overflow_arg_area++;
9093 } else if (aggregate value) {
9095 ret = *args.reg_save_area[args.gpr]
9097 ret = **args.overflow_arg_area++;
9101 s390_gimplify_va_arg (tree valist
, tree type
, gimple_seq
*pre_p
,
9102 gimple_seq
*post_p ATTRIBUTE_UNUSED
)
9104 tree f_gpr
, f_fpr
, f_ovf
, f_sav
;
9105 tree gpr
, fpr
, ovf
, sav
, reg
, t
, u
;
9106 int indirect_p
, size
, n_reg
, sav_ofs
, sav_scale
, max_reg
;
9107 tree lab_false
, lab_over
, addr
;
9109 f_gpr
= TYPE_FIELDS (TREE_TYPE (va_list_type_node
));
9110 f_fpr
= DECL_CHAIN (f_gpr
);
9111 f_ovf
= DECL_CHAIN (f_fpr
);
9112 f_sav
= DECL_CHAIN (f_ovf
);
9114 valist
= build_va_arg_indirect_ref (valist
);
9115 gpr
= build3 (COMPONENT_REF
, TREE_TYPE (f_gpr
), valist
, f_gpr
, NULL_TREE
);
9116 fpr
= build3 (COMPONENT_REF
, TREE_TYPE (f_fpr
), valist
, f_fpr
, NULL_TREE
);
9117 sav
= build3 (COMPONENT_REF
, TREE_TYPE (f_sav
), valist
, f_sav
, NULL_TREE
);
9119 /* The tree for args* cannot be shared between gpr/fpr and ovf since
9120 both appear on a lhs. */
9121 valist
= unshare_expr (valist
);
9122 ovf
= build3 (COMPONENT_REF
, TREE_TYPE (f_ovf
), valist
, f_ovf
, NULL_TREE
);
9124 size
= int_size_in_bytes (type
);
9126 if (pass_by_reference (NULL
, TYPE_MODE (type
), type
, false))
9128 if (TARGET_DEBUG_ARG
)
9130 fprintf (stderr
, "va_arg: aggregate type");
9134 /* Aggregates are passed by reference. */
9139 /* kernel stack layout on 31 bit: It is assumed here that no padding
9140 will be added by s390_frame_info because for va_args always an even
9141 number of gprs has to be saved r15-r2 = 14 regs. */
9142 sav_ofs
= 2 * UNITS_PER_LONG
;
9143 sav_scale
= UNITS_PER_LONG
;
9144 size
= UNITS_PER_LONG
;
9145 max_reg
= GP_ARG_NUM_REG
- n_reg
;
9147 else if (s390_function_arg_float (TYPE_MODE (type
), type
))
9149 if (TARGET_DEBUG_ARG
)
9151 fprintf (stderr
, "va_arg: float type");
9155 /* FP args go in FP registers, if present. */
9159 sav_ofs
= 16 * UNITS_PER_LONG
;
9161 max_reg
= FP_ARG_NUM_REG
- n_reg
;
9165 if (TARGET_DEBUG_ARG
)
9167 fprintf (stderr
, "va_arg: other type");
9171 /* Otherwise into GP registers. */
9174 n_reg
= (size
+ UNITS_PER_LONG
- 1) / UNITS_PER_LONG
;
9176 /* kernel stack layout on 31 bit: It is assumed here that no padding
9177 will be added by s390_frame_info because for va_args always an even
9178 number of gprs has to be saved r15-r2 = 14 regs. */
9179 sav_ofs
= 2 * UNITS_PER_LONG
;
9181 if (size
< UNITS_PER_LONG
)
9182 sav_ofs
+= UNITS_PER_LONG
- size
;
9184 sav_scale
= UNITS_PER_LONG
;
9185 max_reg
= GP_ARG_NUM_REG
- n_reg
;
9188 /* Pull the value out of the saved registers ... */
9190 lab_false
= create_artificial_label (UNKNOWN_LOCATION
);
9191 lab_over
= create_artificial_label (UNKNOWN_LOCATION
);
9192 addr
= create_tmp_var (ptr_type_node
, "addr");
9194 t
= fold_convert (TREE_TYPE (reg
), size_int (max_reg
));
9195 t
= build2 (GT_EXPR
, boolean_type_node
, reg
, t
);
9196 u
= build1 (GOTO_EXPR
, void_type_node
, lab_false
);
9197 t
= build3 (COND_EXPR
, void_type_node
, t
, u
, NULL_TREE
);
9198 gimplify_and_add (t
, pre_p
);
9200 t
= fold_build_pointer_plus_hwi (sav
, sav_ofs
);
9201 u
= build2 (MULT_EXPR
, TREE_TYPE (reg
), reg
,
9202 fold_convert (TREE_TYPE (reg
), size_int (sav_scale
)));
9203 t
= fold_build_pointer_plus (t
, u
);
9205 gimplify_assign (addr
, t
, pre_p
);
9207 gimple_seq_add_stmt (pre_p
, gimple_build_goto (lab_over
));
9209 gimple_seq_add_stmt (pre_p
, gimple_build_label (lab_false
));
9212 /* ... Otherwise out of the overflow area. */
9215 if (size
< UNITS_PER_LONG
)
9216 t
= fold_build_pointer_plus_hwi (t
, UNITS_PER_LONG
- size
);
9218 gimplify_expr (&t
, pre_p
, NULL
, is_gimple_val
, fb_rvalue
);
9220 gimplify_assign (addr
, t
, pre_p
);
9222 t
= fold_build_pointer_plus_hwi (t
, size
);
9223 gimplify_assign (ovf
, t
, pre_p
);
9225 gimple_seq_add_stmt (pre_p
, gimple_build_label (lab_over
));
9228 /* Increment register save count. */
9230 u
= build2 (PREINCREMENT_EXPR
, TREE_TYPE (reg
), reg
,
9231 fold_convert (TREE_TYPE (reg
), size_int (n_reg
)));
9232 gimplify_and_add (u
, pre_p
);
9236 t
= build_pointer_type_for_mode (build_pointer_type (type
),
9238 addr
= fold_convert (t
, addr
);
9239 addr
= build_va_arg_indirect_ref (addr
);
9243 t
= build_pointer_type_for_mode (type
, ptr_mode
, true);
9244 addr
= fold_convert (t
, addr
);
9247 return build_va_arg_indirect_ref (addr
);
9255 S390_BUILTIN_THREAD_POINTER
,
9256 S390_BUILTIN_SET_THREAD_POINTER
,
9261 static enum insn_code
const code_for_builtin_64
[S390_BUILTIN_max
] = {
9266 static enum insn_code
const code_for_builtin_31
[S390_BUILTIN_max
] = {
9272 s390_init_builtins (void)
9276 ftype
= build_function_type_list (ptr_type_node
, NULL_TREE
);
9277 add_builtin_function ("__builtin_thread_pointer", ftype
,
9278 S390_BUILTIN_THREAD_POINTER
, BUILT_IN_MD
,
9281 ftype
= build_function_type_list (void_type_node
, ptr_type_node
, NULL_TREE
);
9282 add_builtin_function ("__builtin_set_thread_pointer", ftype
,
9283 S390_BUILTIN_SET_THREAD_POINTER
, BUILT_IN_MD
,
9287 /* Expand an expression EXP that calls a built-in function,
9288 with result going to TARGET if that's convenient
9289 (and in mode MODE if that's convenient).
9290 SUBTARGET may be used as the target for computing one of EXP's operands.
9291 IGNORE is nonzero if the value is to be ignored. */
9294 s390_expand_builtin (tree exp
, rtx target
, rtx subtarget ATTRIBUTE_UNUSED
,
9295 enum machine_mode mode ATTRIBUTE_UNUSED
,
9296 int ignore ATTRIBUTE_UNUSED
)
9300 enum insn_code
const *code_for_builtin
=
9301 TARGET_64BIT
? code_for_builtin_64
: code_for_builtin_31
;
9303 tree fndecl
= TREE_OPERAND (CALL_EXPR_FN (exp
), 0);
9304 unsigned int fcode
= DECL_FUNCTION_CODE (fndecl
);
9305 enum insn_code icode
;
9306 rtx op
[MAX_ARGS
], pat
;
9310 call_expr_arg_iterator iter
;
9312 if (fcode
>= S390_BUILTIN_max
)
9313 internal_error ("bad builtin fcode");
9314 icode
= code_for_builtin
[fcode
];
9316 internal_error ("bad builtin fcode");
9318 nonvoid
= TREE_TYPE (TREE_TYPE (fndecl
)) != void_type_node
;
9321 FOR_EACH_CALL_EXPR_ARG (arg
, iter
, exp
)
9323 const struct insn_operand_data
*insn_op
;
9325 if (arg
== error_mark_node
)
9327 if (arity
> MAX_ARGS
)
9330 insn_op
= &insn_data
[icode
].operand
[arity
+ nonvoid
];
9332 op
[arity
] = expand_expr (arg
, NULL_RTX
, insn_op
->mode
, EXPAND_NORMAL
);
9334 if (!(*insn_op
->predicate
) (op
[arity
], insn_op
->mode
))
9335 op
[arity
] = copy_to_mode_reg (insn_op
->mode
, op
[arity
]);
9341 enum machine_mode tmode
= insn_data
[icode
].operand
[0].mode
;
9343 || GET_MODE (target
) != tmode
9344 || !(*insn_data
[icode
].operand
[0].predicate
) (target
, tmode
))
9345 target
= gen_reg_rtx (tmode
);
9351 pat
= GEN_FCN (icode
) (target
);
9355 pat
= GEN_FCN (icode
) (target
, op
[0]);
9357 pat
= GEN_FCN (icode
) (op
[0]);
9360 pat
= GEN_FCN (icode
) (target
, op
[0], op
[1]);
9376 /* Output assembly code for the trampoline template to
9379 On S/390, we use gpr 1 internally in the trampoline code;
9380 gpr 0 is used to hold the static chain. */
9383 s390_asm_trampoline_template (FILE *file
)
9386 op
[0] = gen_rtx_REG (Pmode
, 0);
9387 op
[1] = gen_rtx_REG (Pmode
, 1);
9391 output_asm_insn ("basr\t%1,0", op
); /* 2 byte */
9392 output_asm_insn ("lmg\t%0,%1,14(%1)", op
); /* 6 byte */
9393 output_asm_insn ("br\t%1", op
); /* 2 byte */
9394 ASM_OUTPUT_SKIP (file
, (HOST_WIDE_INT
)(TRAMPOLINE_SIZE
- 10));
9398 output_asm_insn ("basr\t%1,0", op
); /* 2 byte */
9399 output_asm_insn ("lm\t%0,%1,6(%1)", op
); /* 4 byte */
9400 output_asm_insn ("br\t%1", op
); /* 2 byte */
9401 ASM_OUTPUT_SKIP (file
, (HOST_WIDE_INT
)(TRAMPOLINE_SIZE
- 8));
9405 /* Emit RTL insns to initialize the variable parts of a trampoline.
9406 FNADDR is an RTX for the address of the function's pure code.
9407 CXT is an RTX for the static chain value for the function. */
9410 s390_trampoline_init (rtx m_tramp
, tree fndecl
, rtx cxt
)
9412 rtx fnaddr
= XEXP (DECL_RTL (fndecl
), 0);
9415 emit_block_move (m_tramp
, assemble_trampoline_template (),
9416 GEN_INT (2 * UNITS_PER_LONG
), BLOCK_OP_NORMAL
);
9418 mem
= adjust_address (m_tramp
, Pmode
, 2 * UNITS_PER_LONG
);
9419 emit_move_insn (mem
, cxt
);
9420 mem
= adjust_address (m_tramp
, Pmode
, 3 * UNITS_PER_LONG
);
9421 emit_move_insn (mem
, fnaddr
);
9424 /* Output assembler code to FILE to increment profiler label # LABELNO
9425 for profiling a function entry. */
9428 s390_function_profiler (FILE *file
, int labelno
)
9433 ASM_GENERATE_INTERNAL_LABEL (label
, "LP", labelno
);
9435 fprintf (file
, "# function profiler \n");
9437 op
[0] = gen_rtx_REG (Pmode
, RETURN_REGNUM
);
9438 op
[1] = gen_rtx_REG (Pmode
, STACK_POINTER_REGNUM
);
9439 op
[1] = gen_rtx_MEM (Pmode
, plus_constant (Pmode
, op
[1], UNITS_PER_LONG
));
9441 op
[2] = gen_rtx_REG (Pmode
, 1);
9442 op
[3] = gen_rtx_SYMBOL_REF (Pmode
, label
);
9443 SYMBOL_REF_FLAGS (op
[3]) = SYMBOL_FLAG_LOCAL
;
9445 op
[4] = gen_rtx_SYMBOL_REF (Pmode
, "_mcount");
9448 op
[4] = gen_rtx_UNSPEC (Pmode
, gen_rtvec (1, op
[4]), UNSPEC_PLT
);
9449 op
[4] = gen_rtx_CONST (Pmode
, op
[4]);
9454 output_asm_insn ("stg\t%0,%1", op
);
9455 output_asm_insn ("larl\t%2,%3", op
);
9456 output_asm_insn ("brasl\t%0,%4", op
);
9457 output_asm_insn ("lg\t%0,%1", op
);
9461 op
[6] = gen_label_rtx ();
9463 output_asm_insn ("st\t%0,%1", op
);
9464 output_asm_insn ("bras\t%2,%l6", op
);
9465 output_asm_insn (".long\t%4", op
);
9466 output_asm_insn (".long\t%3", op
);
9467 targetm
.asm_out
.internal_label (file
, "L", CODE_LABEL_NUMBER (op
[6]));
9468 output_asm_insn ("l\t%0,0(%2)", op
);
9469 output_asm_insn ("l\t%2,4(%2)", op
);
9470 output_asm_insn ("basr\t%0,%0", op
);
9471 output_asm_insn ("l\t%0,%1", op
);
9475 op
[5] = gen_label_rtx ();
9476 op
[6] = gen_label_rtx ();
9478 output_asm_insn ("st\t%0,%1", op
);
9479 output_asm_insn ("bras\t%2,%l6", op
);
9480 targetm
.asm_out
.internal_label (file
, "L", CODE_LABEL_NUMBER (op
[5]));
9481 output_asm_insn (".long\t%4-%l5", op
);
9482 output_asm_insn (".long\t%3-%l5", op
);
9483 targetm
.asm_out
.internal_label (file
, "L", CODE_LABEL_NUMBER (op
[6]));
9484 output_asm_insn ("lr\t%0,%2", op
);
9485 output_asm_insn ("a\t%0,0(%2)", op
);
9486 output_asm_insn ("a\t%2,4(%2)", op
);
9487 output_asm_insn ("basr\t%0,%0", op
);
9488 output_asm_insn ("l\t%0,%1", op
);
9492 /* Encode symbol attributes (local vs. global, tls model) of a SYMBOL_REF
9493 into its SYMBOL_REF_FLAGS. */
9496 s390_encode_section_info (tree decl
, rtx rtl
, int first
)
9498 default_encode_section_info (decl
, rtl
, first
);
9500 if (TREE_CODE (decl
) == VAR_DECL
)
9502 /* If a variable has a forced alignment to < 2 bytes, mark it
9503 with SYMBOL_FLAG_ALIGN1 to prevent it from being used as LARL
9505 if (DECL_USER_ALIGN (decl
) && DECL_ALIGN (decl
) < 16)
9506 SYMBOL_REF_FLAGS (XEXP (rtl
, 0)) |= SYMBOL_FLAG_ALIGN1
;
9507 if (!DECL_SIZE (decl
)
9508 || !DECL_ALIGN (decl
)
9509 || !host_integerp (DECL_SIZE (decl
), 0)
9510 || (DECL_ALIGN (decl
) <= 64
9511 && DECL_ALIGN (decl
) != tree_low_cst (DECL_SIZE (decl
), 0)))
9512 SYMBOL_REF_FLAGS (XEXP (rtl
, 0)) |= SYMBOL_FLAG_NOT_NATURALLY_ALIGNED
;
9515 /* Literal pool references don't have a decl so they are handled
9516 differently here. We rely on the information in the MEM_ALIGN
9517 entry to decide upon natural alignment. */
9519 && GET_CODE (XEXP (rtl
, 0)) == SYMBOL_REF
9520 && TREE_CONSTANT_POOL_ADDRESS_P (XEXP (rtl
, 0))
9521 && (MEM_ALIGN (rtl
) == 0
9522 || GET_MODE_BITSIZE (GET_MODE (rtl
)) == 0
9523 || MEM_ALIGN (rtl
) < GET_MODE_BITSIZE (GET_MODE (rtl
))))
9524 SYMBOL_REF_FLAGS (XEXP (rtl
, 0)) |= SYMBOL_FLAG_NOT_NATURALLY_ALIGNED
;
9527 /* Output thunk to FILE that implements a C++ virtual function call (with
9528 multiple inheritance) to FUNCTION. The thunk adjusts the this pointer
9529 by DELTA, and unless VCALL_OFFSET is zero, applies an additional adjustment
9530 stored at VCALL_OFFSET in the vtable whose address is located at offset 0
9531 relative to the resulting this pointer. */
9534 s390_output_mi_thunk (FILE *file
, tree thunk ATTRIBUTE_UNUSED
,
9535 HOST_WIDE_INT delta
, HOST_WIDE_INT vcall_offset
,
9541 /* Make sure unwind info is emitted for the thunk if needed. */
9542 final_start_function (emit_barrier (), file
, 1);
9544 /* Operand 0 is the target function. */
9545 op
[0] = XEXP (DECL_RTL (function
), 0);
9546 if (flag_pic
&& !SYMBOL_REF_LOCAL_P (op
[0]))
9549 op
[0] = gen_rtx_UNSPEC (Pmode
, gen_rtvec (1, op
[0]),
9550 TARGET_64BIT
? UNSPEC_PLT
: UNSPEC_GOT
);
9551 op
[0] = gen_rtx_CONST (Pmode
, op
[0]);
9554 /* Operand 1 is the 'this' pointer. */
9555 if (aggregate_value_p (TREE_TYPE (TREE_TYPE (function
)), function
))
9556 op
[1] = gen_rtx_REG (Pmode
, 3);
9558 op
[1] = gen_rtx_REG (Pmode
, 2);
9560 /* Operand 2 is the delta. */
9561 op
[2] = GEN_INT (delta
);
9563 /* Operand 3 is the vcall_offset. */
9564 op
[3] = GEN_INT (vcall_offset
);
9566 /* Operand 4 is the temporary register. */
9567 op
[4] = gen_rtx_REG (Pmode
, 1);
9569 /* Operands 5 to 8 can be used as labels. */
9575 /* Operand 9 can be used for temporary register. */
9578 /* Generate code. */
9581 /* Setup literal pool pointer if required. */
9582 if ((!DISP_IN_RANGE (delta
)
9583 && !CONST_OK_FOR_K (delta
)
9584 && !CONST_OK_FOR_Os (delta
))
9585 || (!DISP_IN_RANGE (vcall_offset
)
9586 && !CONST_OK_FOR_K (vcall_offset
)
9587 && !CONST_OK_FOR_Os (vcall_offset
)))
9589 op
[5] = gen_label_rtx ();
9590 output_asm_insn ("larl\t%4,%5", op
);
9593 /* Add DELTA to this pointer. */
9596 if (CONST_OK_FOR_J (delta
))
9597 output_asm_insn ("la\t%1,%2(%1)", op
);
9598 else if (DISP_IN_RANGE (delta
))
9599 output_asm_insn ("lay\t%1,%2(%1)", op
);
9600 else if (CONST_OK_FOR_K (delta
))
9601 output_asm_insn ("aghi\t%1,%2", op
);
9602 else if (CONST_OK_FOR_Os (delta
))
9603 output_asm_insn ("agfi\t%1,%2", op
);
9606 op
[6] = gen_label_rtx ();
9607 output_asm_insn ("agf\t%1,%6-%5(%4)", op
);
9611 /* Perform vcall adjustment. */
9614 if (DISP_IN_RANGE (vcall_offset
))
9616 output_asm_insn ("lg\t%4,0(%1)", op
);
9617 output_asm_insn ("ag\t%1,%3(%4)", op
);
9619 else if (CONST_OK_FOR_K (vcall_offset
))
9621 output_asm_insn ("lghi\t%4,%3", op
);
9622 output_asm_insn ("ag\t%4,0(%1)", op
);
9623 output_asm_insn ("ag\t%1,0(%4)", op
);
9625 else if (CONST_OK_FOR_Os (vcall_offset
))
9627 output_asm_insn ("lgfi\t%4,%3", op
);
9628 output_asm_insn ("ag\t%4,0(%1)", op
);
9629 output_asm_insn ("ag\t%1,0(%4)", op
);
9633 op
[7] = gen_label_rtx ();
9634 output_asm_insn ("llgf\t%4,%7-%5(%4)", op
);
9635 output_asm_insn ("ag\t%4,0(%1)", op
);
9636 output_asm_insn ("ag\t%1,0(%4)", op
);
9640 /* Jump to target. */
9641 output_asm_insn ("jg\t%0", op
);
9643 /* Output literal pool if required. */
9646 output_asm_insn (".align\t4", op
);
9647 targetm
.asm_out
.internal_label (file
, "L",
9648 CODE_LABEL_NUMBER (op
[5]));
9652 targetm
.asm_out
.internal_label (file
, "L",
9653 CODE_LABEL_NUMBER (op
[6]));
9654 output_asm_insn (".long\t%2", op
);
9658 targetm
.asm_out
.internal_label (file
, "L",
9659 CODE_LABEL_NUMBER (op
[7]));
9660 output_asm_insn (".long\t%3", op
);
9665 /* Setup base pointer if required. */
9667 || (!DISP_IN_RANGE (delta
)
9668 && !CONST_OK_FOR_K (delta
)
9669 && !CONST_OK_FOR_Os (delta
))
9670 || (!DISP_IN_RANGE (delta
)
9671 && !CONST_OK_FOR_K (vcall_offset
)
9672 && !CONST_OK_FOR_Os (vcall_offset
)))
9674 op
[5] = gen_label_rtx ();
9675 output_asm_insn ("basr\t%4,0", op
);
9676 targetm
.asm_out
.internal_label (file
, "L",
9677 CODE_LABEL_NUMBER (op
[5]));
9680 /* Add DELTA to this pointer. */
9683 if (CONST_OK_FOR_J (delta
))
9684 output_asm_insn ("la\t%1,%2(%1)", op
);
9685 else if (DISP_IN_RANGE (delta
))
9686 output_asm_insn ("lay\t%1,%2(%1)", op
);
9687 else if (CONST_OK_FOR_K (delta
))
9688 output_asm_insn ("ahi\t%1,%2", op
);
9689 else if (CONST_OK_FOR_Os (delta
))
9690 output_asm_insn ("afi\t%1,%2", op
);
9693 op
[6] = gen_label_rtx ();
9694 output_asm_insn ("a\t%1,%6-%5(%4)", op
);
9698 /* Perform vcall adjustment. */
9701 if (CONST_OK_FOR_J (vcall_offset
))
9703 output_asm_insn ("l\t%4,0(%1)", op
);
9704 output_asm_insn ("a\t%1,%3(%4)", op
);
9706 else if (DISP_IN_RANGE (vcall_offset
))
9708 output_asm_insn ("l\t%4,0(%1)", op
);
9709 output_asm_insn ("ay\t%1,%3(%4)", op
);
9711 else if (CONST_OK_FOR_K (vcall_offset
))
9713 output_asm_insn ("lhi\t%4,%3", op
);
9714 output_asm_insn ("a\t%4,0(%1)", op
);
9715 output_asm_insn ("a\t%1,0(%4)", op
);
9717 else if (CONST_OK_FOR_Os (vcall_offset
))
9719 output_asm_insn ("iilf\t%4,%3", op
);
9720 output_asm_insn ("a\t%4,0(%1)", op
);
9721 output_asm_insn ("a\t%1,0(%4)", op
);
9725 op
[7] = gen_label_rtx ();
9726 output_asm_insn ("l\t%4,%7-%5(%4)", op
);
9727 output_asm_insn ("a\t%4,0(%1)", op
);
9728 output_asm_insn ("a\t%1,0(%4)", op
);
9731 /* We had to clobber the base pointer register.
9732 Re-setup the base pointer (with a different base). */
9733 op
[5] = gen_label_rtx ();
9734 output_asm_insn ("basr\t%4,0", op
);
9735 targetm
.asm_out
.internal_label (file
, "L",
9736 CODE_LABEL_NUMBER (op
[5]));
9739 /* Jump to target. */
9740 op
[8] = gen_label_rtx ();
9743 output_asm_insn ("l\t%4,%8-%5(%4)", op
);
9745 output_asm_insn ("a\t%4,%8-%5(%4)", op
);
9746 /* We cannot call through .plt, since .plt requires %r12 loaded. */
9747 else if (flag_pic
== 1)
9749 output_asm_insn ("a\t%4,%8-%5(%4)", op
);
9750 output_asm_insn ("l\t%4,%0(%4)", op
);
9752 else if (flag_pic
== 2)
9754 op
[9] = gen_rtx_REG (Pmode
, 0);
9755 output_asm_insn ("l\t%9,%8-4-%5(%4)", op
);
9756 output_asm_insn ("a\t%4,%8-%5(%4)", op
);
9757 output_asm_insn ("ar\t%4,%9", op
);
9758 output_asm_insn ("l\t%4,0(%4)", op
);
9761 output_asm_insn ("br\t%4", op
);
9763 /* Output literal pool. */
9764 output_asm_insn (".align\t4", op
);
9766 if (nonlocal
&& flag_pic
== 2)
9767 output_asm_insn (".long\t%0", op
);
9770 op
[0] = gen_rtx_SYMBOL_REF (Pmode
, "_GLOBAL_OFFSET_TABLE_");
9771 SYMBOL_REF_FLAGS (op
[0]) = SYMBOL_FLAG_LOCAL
;
9774 targetm
.asm_out
.internal_label (file
, "L", CODE_LABEL_NUMBER (op
[8]));
9776 output_asm_insn (".long\t%0", op
);
9778 output_asm_insn (".long\t%0-%5", op
);
9782 targetm
.asm_out
.internal_label (file
, "L",
9783 CODE_LABEL_NUMBER (op
[6]));
9784 output_asm_insn (".long\t%2", op
);
9788 targetm
.asm_out
.internal_label (file
, "L",
9789 CODE_LABEL_NUMBER (op
[7]));
9790 output_asm_insn (".long\t%3", op
);
9793 final_end_function ();
9797 s390_valid_pointer_mode (enum machine_mode mode
)
9799 return (mode
== SImode
|| (TARGET_64BIT
&& mode
== DImode
));
9802 /* Checks whether the given CALL_EXPR would use a caller
9803 saved register. This is used to decide whether sibling call
9804 optimization could be performed on the respective function
9808 s390_call_saved_register_used (tree call_expr
)
9810 CUMULATIVE_ARGS cum_v
;
9811 cumulative_args_t cum
;
9813 enum machine_mode mode
;
9818 INIT_CUMULATIVE_ARGS (cum_v
, NULL
, NULL
, 0, 0);
9819 cum
= pack_cumulative_args (&cum_v
);
9821 for (i
= 0; i
< call_expr_nargs (call_expr
); i
++)
9823 parameter
= CALL_EXPR_ARG (call_expr
, i
);
9824 gcc_assert (parameter
);
9826 /* For an undeclared variable passed as parameter we will get
9827 an ERROR_MARK node here. */
9828 if (TREE_CODE (parameter
) == ERROR_MARK
)
9831 type
= TREE_TYPE (parameter
);
9834 mode
= TYPE_MODE (type
);
9837 if (pass_by_reference (&cum_v
, mode
, type
, true))
9840 type
= build_pointer_type (type
);
9843 parm_rtx
= s390_function_arg (cum
, mode
, type
, 0);
9845 s390_function_arg_advance (cum
, mode
, type
, 0);
9850 if (REG_P (parm_rtx
))
9853 reg
< HARD_REGNO_NREGS (REGNO (parm_rtx
), GET_MODE (parm_rtx
));
9855 if (!call_used_regs
[reg
+ REGNO (parm_rtx
)])
9859 if (GET_CODE (parm_rtx
) == PARALLEL
)
9863 for (i
= 0; i
< XVECLEN (parm_rtx
, 0); i
++)
9865 rtx r
= XEXP (XVECEXP (parm_rtx
, 0, i
), 0);
9867 gcc_assert (REG_P (r
));
9870 reg
< HARD_REGNO_NREGS (REGNO (r
), GET_MODE (r
));
9872 if (!call_used_regs
[reg
+ REGNO (r
)])
9881 /* Return true if the given call expression can be
9882 turned into a sibling call.
9883 DECL holds the declaration of the function to be called whereas
9884 EXP is the call expression itself. */
9887 s390_function_ok_for_sibcall (tree decl
, tree exp
)
9889 /* The TPF epilogue uses register 1. */
9890 if (TARGET_TPF_PROFILING
)
9893 /* The 31 bit PLT code uses register 12 (GOT pointer - caller saved)
9894 which would have to be restored before the sibcall. */
9895 if (!TARGET_64BIT
&& flag_pic
&& decl
&& !targetm
.binds_local_p (decl
))
9898 /* Register 6 on s390 is available as an argument register but unfortunately
9899 "caller saved". This makes functions needing this register for arguments
9900 not suitable for sibcalls. */
9901 return !s390_call_saved_register_used (exp
);
9904 /* Return the fixed registers used for condition codes. */
9907 s390_fixed_condition_code_regs (unsigned int *p1
, unsigned int *p2
)
9910 *p2
= INVALID_REGNUM
;
9915 /* This function is used by the call expanders of the machine description.
9916 It emits the call insn itself together with the necessary operations
9917 to adjust the target address and returns the emitted insn.
9918 ADDR_LOCATION is the target address rtx
9919 TLS_CALL the location of the thread-local symbol
9920 RESULT_REG the register where the result of the call should be stored
9921 RETADDR_REG the register where the return address should be stored
9922 If this parameter is NULL_RTX the call is considered
9923 to be a sibling call. */
9926 s390_emit_call (rtx addr_location
, rtx tls_call
, rtx result_reg
,
9929 bool plt_call
= false;
9935 /* Direct function calls need special treatment. */
9936 if (GET_CODE (addr_location
) == SYMBOL_REF
)
9938 /* When calling a global routine in PIC mode, we must
9939 replace the symbol itself with the PLT stub. */
9940 if (flag_pic
&& !SYMBOL_REF_LOCAL_P (addr_location
))
9942 if (retaddr_reg
!= NULL_RTX
)
9944 addr_location
= gen_rtx_UNSPEC (Pmode
,
9945 gen_rtvec (1, addr_location
),
9947 addr_location
= gen_rtx_CONST (Pmode
, addr_location
);
9951 /* For -fpic code the PLT entries might use r12 which is
9952 call-saved. Therefore we cannot do a sibcall when
9953 calling directly using a symbol ref. When reaching
9954 this point we decided (in s390_function_ok_for_sibcall)
9955 to do a sibcall for a function pointer but one of the
9956 optimizers was able to get rid of the function pointer
9957 by propagating the symbol ref into the call. This
9958 optimization is illegal for S/390 so we turn the direct
9959 call into a indirect call again. */
9960 addr_location
= force_reg (Pmode
, addr_location
);
9963 /* Unless we can use the bras(l) insn, force the
9964 routine address into a register. */
9965 if (!TARGET_SMALL_EXEC
&& !TARGET_CPU_ZARCH
)
9968 addr_location
= legitimize_pic_address (addr_location
, 0);
9970 addr_location
= force_reg (Pmode
, addr_location
);
9974 /* If it is already an indirect call or the code above moved the
9975 SYMBOL_REF to somewhere else make sure the address can be found in
9977 if (retaddr_reg
== NULL_RTX
9978 && GET_CODE (addr_location
) != SYMBOL_REF
9981 emit_move_insn (gen_rtx_REG (Pmode
, SIBCALL_REGNUM
), addr_location
);
9982 addr_location
= gen_rtx_REG (Pmode
, SIBCALL_REGNUM
);
9985 addr_location
= gen_rtx_MEM (QImode
, addr_location
);
9986 call
= gen_rtx_CALL (VOIDmode
, addr_location
, const0_rtx
);
9988 if (result_reg
!= NULL_RTX
)
9989 call
= gen_rtx_SET (VOIDmode
, result_reg
, call
);
9991 if (retaddr_reg
!= NULL_RTX
)
9993 clobber
= gen_rtx_CLOBBER (VOIDmode
, retaddr_reg
);
9995 if (tls_call
!= NULL_RTX
)
9996 vec
= gen_rtvec (3, call
, clobber
,
9997 gen_rtx_USE (VOIDmode
, tls_call
));
9999 vec
= gen_rtvec (2, call
, clobber
);
10001 call
= gen_rtx_PARALLEL (VOIDmode
, vec
);
10004 insn
= emit_call_insn (call
);
10006 /* 31-bit PLT stubs and tls calls use the GOT register implicitly. */
10007 if ((!TARGET_64BIT
&& plt_call
) || tls_call
!= NULL_RTX
)
10009 /* s390_function_ok_for_sibcall should
10010 have denied sibcalls in this case. */
10011 gcc_assert (retaddr_reg
!= NULL_RTX
);
10012 use_reg (&CALL_INSN_FUNCTION_USAGE (insn
), gen_rtx_REG (Pmode
, 12));
10017 /* Implement TARGET_CONDITIONAL_REGISTER_USAGE. */
10020 s390_conditional_register_usage (void)
10026 fixed_regs
[PIC_OFFSET_TABLE_REGNUM
] = 1;
10027 call_used_regs
[PIC_OFFSET_TABLE_REGNUM
] = 1;
10029 if (TARGET_CPU_ZARCH
)
10031 fixed_regs
[BASE_REGNUM
] = 0;
10032 call_used_regs
[BASE_REGNUM
] = 0;
10033 fixed_regs
[RETURN_REGNUM
] = 0;
10034 call_used_regs
[RETURN_REGNUM
] = 0;
10038 for (i
= 24; i
< 32; i
++)
10039 call_used_regs
[i
] = call_really_used_regs
[i
] = 0;
10043 for (i
= 18; i
< 20; i
++)
10044 call_used_regs
[i
] = call_really_used_regs
[i
] = 0;
10047 if (TARGET_SOFT_FLOAT
)
10049 for (i
= 16; i
< 32; i
++)
10050 call_used_regs
[i
] = fixed_regs
[i
] = 1;
10054 /* Corresponding function to eh_return expander. */
10056 static GTY(()) rtx s390_tpf_eh_return_symbol
;
10058 s390_emit_tpf_eh_return (rtx target
)
10062 if (!s390_tpf_eh_return_symbol
)
10063 s390_tpf_eh_return_symbol
= gen_rtx_SYMBOL_REF (Pmode
, "__tpf_eh_return");
10065 reg
= gen_rtx_REG (Pmode
, 2);
10067 emit_move_insn (reg
, target
);
10068 insn
= s390_emit_call (s390_tpf_eh_return_symbol
, NULL_RTX
, reg
,
10069 gen_rtx_REG (Pmode
, RETURN_REGNUM
));
10070 use_reg (&CALL_INSN_FUNCTION_USAGE (insn
), reg
);
10072 emit_move_insn (EH_RETURN_HANDLER_RTX
, reg
);
10075 /* Rework the prologue/epilogue to avoid saving/restoring
10076 registers unnecessarily. */
10079 s390_optimize_prologue (void)
10081 rtx insn
, new_insn
, next_insn
;
10083 /* Do a final recompute of the frame-related data. */
10085 s390_update_frame_layout ();
10087 /* If all special registers are in fact used, there's nothing we
10088 can do, so no point in walking the insn list. */
10090 if (cfun_frame_layout
.first_save_gpr
<= BASE_REGNUM
10091 && cfun_frame_layout
.last_save_gpr
>= BASE_REGNUM
10092 && (TARGET_CPU_ZARCH
10093 || (cfun_frame_layout
.first_save_gpr
<= RETURN_REGNUM
10094 && cfun_frame_layout
.last_save_gpr
>= RETURN_REGNUM
)))
10097 /* Search for prologue/epilogue insns and replace them. */
10099 for (insn
= get_insns (); insn
; insn
= next_insn
)
10101 int first
, last
, off
;
10102 rtx set
, base
, offset
;
10104 next_insn
= NEXT_INSN (insn
);
10106 if (GET_CODE (insn
) != INSN
)
10109 if (GET_CODE (PATTERN (insn
)) == PARALLEL
10110 && store_multiple_operation (PATTERN (insn
), VOIDmode
))
10112 set
= XVECEXP (PATTERN (insn
), 0, 0);
10113 first
= REGNO (SET_SRC (set
));
10114 last
= first
+ XVECLEN (PATTERN (insn
), 0) - 1;
10115 offset
= const0_rtx
;
10116 base
= eliminate_constant_term (XEXP (SET_DEST (set
), 0), &offset
);
10117 off
= INTVAL (offset
);
10119 if (GET_CODE (base
) != REG
|| off
< 0)
10121 if (cfun_frame_layout
.first_save_gpr
!= -1
10122 && (cfun_frame_layout
.first_save_gpr
< first
10123 || cfun_frame_layout
.last_save_gpr
> last
))
10125 if (REGNO (base
) != STACK_POINTER_REGNUM
10126 && REGNO (base
) != HARD_FRAME_POINTER_REGNUM
)
10128 if (first
> BASE_REGNUM
|| last
< BASE_REGNUM
)
10131 if (cfun_frame_layout
.first_save_gpr
!= -1)
10133 new_insn
= save_gprs (base
,
10134 off
+ (cfun_frame_layout
.first_save_gpr
10135 - first
) * UNITS_PER_LONG
,
10136 cfun_frame_layout
.first_save_gpr
,
10137 cfun_frame_layout
.last_save_gpr
);
10138 new_insn
= emit_insn_before (new_insn
, insn
);
10139 INSN_ADDRESSES_NEW (new_insn
, -1);
10142 remove_insn (insn
);
10146 if (cfun_frame_layout
.first_save_gpr
== -1
10147 && GET_CODE (PATTERN (insn
)) == SET
10148 && GET_CODE (SET_SRC (PATTERN (insn
))) == REG
10149 && (REGNO (SET_SRC (PATTERN (insn
))) == BASE_REGNUM
10150 || (!TARGET_CPU_ZARCH
10151 && REGNO (SET_SRC (PATTERN (insn
))) == RETURN_REGNUM
))
10152 && GET_CODE (SET_DEST (PATTERN (insn
))) == MEM
)
10154 set
= PATTERN (insn
);
10155 first
= REGNO (SET_SRC (set
));
10156 offset
= const0_rtx
;
10157 base
= eliminate_constant_term (XEXP (SET_DEST (set
), 0), &offset
);
10158 off
= INTVAL (offset
);
10160 if (GET_CODE (base
) != REG
|| off
< 0)
10162 if (REGNO (base
) != STACK_POINTER_REGNUM
10163 && REGNO (base
) != HARD_FRAME_POINTER_REGNUM
)
10166 remove_insn (insn
);
10170 if (GET_CODE (PATTERN (insn
)) == PARALLEL
10171 && load_multiple_operation (PATTERN (insn
), VOIDmode
))
10173 set
= XVECEXP (PATTERN (insn
), 0, 0);
10174 first
= REGNO (SET_DEST (set
));
10175 last
= first
+ XVECLEN (PATTERN (insn
), 0) - 1;
10176 offset
= const0_rtx
;
10177 base
= eliminate_constant_term (XEXP (SET_SRC (set
), 0), &offset
);
10178 off
= INTVAL (offset
);
10180 if (GET_CODE (base
) != REG
|| off
< 0)
10182 if (cfun_frame_layout
.first_restore_gpr
!= -1
10183 && (cfun_frame_layout
.first_restore_gpr
< first
10184 || cfun_frame_layout
.last_restore_gpr
> last
))
10186 if (REGNO (base
) != STACK_POINTER_REGNUM
10187 && REGNO (base
) != HARD_FRAME_POINTER_REGNUM
)
10189 if (first
> BASE_REGNUM
|| last
< BASE_REGNUM
)
10192 if (cfun_frame_layout
.first_restore_gpr
!= -1)
10194 new_insn
= restore_gprs (base
,
10195 off
+ (cfun_frame_layout
.first_restore_gpr
10196 - first
) * UNITS_PER_LONG
,
10197 cfun_frame_layout
.first_restore_gpr
,
10198 cfun_frame_layout
.last_restore_gpr
);
10199 new_insn
= emit_insn_before (new_insn
, insn
);
10200 INSN_ADDRESSES_NEW (new_insn
, -1);
10203 remove_insn (insn
);
10207 if (cfun_frame_layout
.first_restore_gpr
== -1
10208 && GET_CODE (PATTERN (insn
)) == SET
10209 && GET_CODE (SET_DEST (PATTERN (insn
))) == REG
10210 && (REGNO (SET_DEST (PATTERN (insn
))) == BASE_REGNUM
10211 || (!TARGET_CPU_ZARCH
10212 && REGNO (SET_DEST (PATTERN (insn
))) == RETURN_REGNUM
))
10213 && GET_CODE (SET_SRC (PATTERN (insn
))) == MEM
)
10215 set
= PATTERN (insn
);
10216 first
= REGNO (SET_DEST (set
));
10217 offset
= const0_rtx
;
10218 base
= eliminate_constant_term (XEXP (SET_SRC (set
), 0), &offset
);
10219 off
= INTVAL (offset
);
10221 if (GET_CODE (base
) != REG
|| off
< 0)
10223 if (REGNO (base
) != STACK_POINTER_REGNUM
10224 && REGNO (base
) != HARD_FRAME_POINTER_REGNUM
)
10227 remove_insn (insn
);
10233 /* On z10 and later the dynamic branch prediction must see the
10234 backward jump within a certain windows. If not it falls back to
10235 the static prediction. This function rearranges the loop backward
10236 branch in a way which makes the static prediction always correct.
10237 The function returns true if it added an instruction. */
10239 s390_fix_long_loop_prediction (rtx insn
)
10241 rtx set
= single_set (insn
);
10242 rtx code_label
, label_ref
, new_label
;
10248 /* This will exclude branch on count and branch on index patterns
10249 since these are correctly statically predicted. */
10251 || SET_DEST (set
) != pc_rtx
10252 || GET_CODE (SET_SRC(set
)) != IF_THEN_ELSE
)
10255 label_ref
= (GET_CODE (XEXP (SET_SRC (set
), 1)) == LABEL_REF
?
10256 XEXP (SET_SRC (set
), 1) : XEXP (SET_SRC (set
), 2));
10258 gcc_assert (GET_CODE (label_ref
) == LABEL_REF
);
10260 code_label
= XEXP (label_ref
, 0);
10262 if (INSN_ADDRESSES (INSN_UID (code_label
)) == -1
10263 || INSN_ADDRESSES (INSN_UID (insn
)) == -1
10264 || (INSN_ADDRESSES (INSN_UID (insn
))
10265 - INSN_ADDRESSES (INSN_UID (code_label
)) < PREDICT_DISTANCE
))
10268 for (distance
= 0, cur_insn
= PREV_INSN (insn
);
10269 distance
< PREDICT_DISTANCE
- 6;
10270 distance
+= get_attr_length (cur_insn
), cur_insn
= PREV_INSN (cur_insn
))
10271 if (!cur_insn
|| JUMP_P (cur_insn
) || LABEL_P (cur_insn
))
10274 new_label
= gen_label_rtx ();
10275 uncond_jump
= emit_jump_insn_after (
10276 gen_rtx_SET (VOIDmode
, pc_rtx
,
10277 gen_rtx_LABEL_REF (VOIDmode
, code_label
)),
10279 emit_label_after (new_label
, uncond_jump
);
10281 tmp
= XEXP (SET_SRC (set
), 1);
10282 XEXP (SET_SRC (set
), 1) = XEXP (SET_SRC (set
), 2);
10283 XEXP (SET_SRC (set
), 2) = tmp
;
10284 INSN_CODE (insn
) = -1;
10286 XEXP (label_ref
, 0) = new_label
;
10287 JUMP_LABEL (insn
) = new_label
;
10288 JUMP_LABEL (uncond_jump
) = code_label
;
10293 /* Returns 1 if INSN reads the value of REG for purposes not related
10294 to addressing of memory, and 0 otherwise. */
10296 s390_non_addr_reg_read_p (rtx reg
, rtx insn
)
10298 return reg_referenced_p (reg
, PATTERN (insn
))
10299 && !reg_used_in_mem_p (REGNO (reg
), PATTERN (insn
));
10302 /* Starting from INSN find_cond_jump looks downwards in the insn
10303 stream for a single jump insn which is the last user of the
10304 condition code set in INSN. */
10306 find_cond_jump (rtx insn
)
10308 for (; insn
; insn
= NEXT_INSN (insn
))
10312 if (LABEL_P (insn
))
10315 if (!JUMP_P (insn
))
10317 if (reg_mentioned_p (gen_rtx_REG (CCmode
, CC_REGNUM
), insn
))
10322 /* This will be triggered by a return. */
10323 if (GET_CODE (PATTERN (insn
)) != SET
)
10326 gcc_assert (SET_DEST (PATTERN (insn
)) == pc_rtx
);
10327 ite
= SET_SRC (PATTERN (insn
));
10329 if (GET_CODE (ite
) != IF_THEN_ELSE
)
10332 cc
= XEXP (XEXP (ite
, 0), 0);
10333 if (!REG_P (cc
) || !CC_REGNO_P (REGNO (cc
)))
10336 if (find_reg_note (insn
, REG_DEAD
, cc
))
10344 /* Swap the condition in COND and the operands in OP0 and OP1 so that
10345 the semantics does not change. If NULL_RTX is passed as COND the
10346 function tries to find the conditional jump starting with INSN. */
10348 s390_swap_cmp (rtx cond
, rtx
*op0
, rtx
*op1
, rtx insn
)
10352 if (cond
== NULL_RTX
)
10354 rtx jump
= find_cond_jump (NEXT_INSN (insn
));
10355 jump
= jump
? single_set (jump
) : NULL_RTX
;
10357 if (jump
== NULL_RTX
)
10360 cond
= XEXP (XEXP (jump
, 1), 0);
10365 PUT_CODE (cond
, swap_condition (GET_CODE (cond
)));
10368 /* On z10, instructions of the compare-and-branch family have the
10369 property to access the register occurring as second operand with
10370 its bits complemented. If such a compare is grouped with a second
10371 instruction that accesses the same register non-complemented, and
10372 if that register's value is delivered via a bypass, then the
10373 pipeline recycles, thereby causing significant performance decline.
10374 This function locates such situations and exchanges the two
10375 operands of the compare. The function return true whenever it
10378 s390_z10_optimize_cmp (rtx insn
)
10380 rtx prev_insn
, next_insn
;
10381 bool insn_added_p
= false;
10382 rtx cond
, *op0
, *op1
;
10384 if (GET_CODE (PATTERN (insn
)) == PARALLEL
)
10386 /* Handle compare and branch and branch on count
10388 rtx pattern
= single_set (insn
);
10391 || SET_DEST (pattern
) != pc_rtx
10392 || GET_CODE (SET_SRC (pattern
)) != IF_THEN_ELSE
)
10395 cond
= XEXP (SET_SRC (pattern
), 0);
10396 op0
= &XEXP (cond
, 0);
10397 op1
= &XEXP (cond
, 1);
10399 else if (GET_CODE (PATTERN (insn
)) == SET
)
10403 /* Handle normal compare instructions. */
10404 src
= SET_SRC (PATTERN (insn
));
10405 dest
= SET_DEST (PATTERN (insn
));
10408 || !CC_REGNO_P (REGNO (dest
))
10409 || GET_CODE (src
) != COMPARE
)
10412 /* s390_swap_cmp will try to find the conditional
10413 jump when passing NULL_RTX as condition. */
10415 op0
= &XEXP (src
, 0);
10416 op1
= &XEXP (src
, 1);
10421 if (!REG_P (*op0
) || !REG_P (*op1
))
10424 if (GET_MODE_CLASS (GET_MODE (*op0
)) != MODE_INT
)
10427 /* Swap the COMPARE arguments and its mask if there is a
10428 conflicting access in the previous insn. */
10429 prev_insn
= prev_active_insn (insn
);
10430 if (prev_insn
!= NULL_RTX
&& INSN_P (prev_insn
)
10431 && reg_referenced_p (*op1
, PATTERN (prev_insn
)))
10432 s390_swap_cmp (cond
, op0
, op1
, insn
);
10434 /* Check if there is a conflict with the next insn. If there
10435 was no conflict with the previous insn, then swap the
10436 COMPARE arguments and its mask. If we already swapped
10437 the operands, or if swapping them would cause a conflict
10438 with the previous insn, issue a NOP after the COMPARE in
10439 order to separate the two instuctions. */
10440 next_insn
= next_active_insn (insn
);
10441 if (next_insn
!= NULL_RTX
&& INSN_P (next_insn
)
10442 && s390_non_addr_reg_read_p (*op1
, next_insn
))
10444 if (prev_insn
!= NULL_RTX
&& INSN_P (prev_insn
)
10445 && s390_non_addr_reg_read_p (*op0
, prev_insn
))
10447 if (REGNO (*op1
) == 0)
10448 emit_insn_after (gen_nop1 (), insn
);
10450 emit_insn_after (gen_nop (), insn
);
10451 insn_added_p
= true;
10454 s390_swap_cmp (cond
, op0
, op1
, insn
);
10456 return insn_added_p
;
10459 /* Perform machine-dependent processing. */
10464 bool pool_overflow
= false;
10466 /* Make sure all splits have been performed; splits after
10467 machine_dependent_reorg might confuse insn length counts. */
10468 split_all_insns_noflow ();
10470 /* Install the main literal pool and the associated base
10471 register load insns.
10473 In addition, there are two problematic situations we need
10476 - the literal pool might be > 4096 bytes in size, so that
10477 some of its elements cannot be directly accessed
10479 - a branch target might be > 64K away from the branch, so that
10480 it is not possible to use a PC-relative instruction.
10482 To fix those, we split the single literal pool into multiple
10483 pool chunks, reloading the pool base register at various
10484 points throughout the function to ensure it always points to
10485 the pool chunk the following code expects, and / or replace
10486 PC-relative branches by absolute branches.
10488 However, the two problems are interdependent: splitting the
10489 literal pool can move a branch further away from its target,
10490 causing the 64K limit to overflow, and on the other hand,
10491 replacing a PC-relative branch by an absolute branch means
10492 we need to put the branch target address into the literal
10493 pool, possibly causing it to overflow.
10495 So, we loop trying to fix up both problems until we manage
10496 to satisfy both conditions at the same time. Note that the
10497 loop is guaranteed to terminate as every pass of the loop
10498 strictly decreases the total number of PC-relative branches
10499 in the function. (This is not completely true as there
10500 might be branch-over-pool insns introduced by chunkify_start.
10501 Those never need to be split however.) */
10505 struct constant_pool
*pool
= NULL
;
10507 /* Collect the literal pool. */
10508 if (!pool_overflow
)
10510 pool
= s390_mainpool_start ();
10512 pool_overflow
= true;
10515 /* If literal pool overflowed, start to chunkify it. */
10517 pool
= s390_chunkify_start ();
10519 /* Split out-of-range branches. If this has created new
10520 literal pool entries, cancel current chunk list and
10521 recompute it. zSeries machines have large branch
10522 instructions, so we never need to split a branch. */
10523 if (!TARGET_CPU_ZARCH
&& s390_split_branches ())
10526 s390_chunkify_cancel (pool
);
10528 s390_mainpool_cancel (pool
);
10533 /* If we made it up to here, both conditions are satisfied.
10534 Finish up literal pool related changes. */
10536 s390_chunkify_finish (pool
);
10538 s390_mainpool_finish (pool
);
10540 /* We're done splitting branches. */
10541 cfun
->machine
->split_branches_pending_p
= false;
10545 /* Generate out-of-pool execute target insns. */
10546 if (TARGET_CPU_ZARCH
)
10548 rtx insn
, label
, target
;
10550 for (insn
= get_insns (); insn
; insn
= NEXT_INSN (insn
))
10552 label
= s390_execute_label (insn
);
10556 gcc_assert (label
!= const0_rtx
);
10558 target
= emit_label (XEXP (label
, 0));
10559 INSN_ADDRESSES_NEW (target
, -1);
10561 target
= emit_insn (s390_execute_target (insn
));
10562 INSN_ADDRESSES_NEW (target
, -1);
10566 /* Try to optimize prologue and epilogue further. */
10567 s390_optimize_prologue ();
10569 /* Walk over the insns and do some >=z10 specific changes. */
10570 if (s390_tune
== PROCESSOR_2097_Z10
10571 || s390_tune
== PROCESSOR_2817_Z196
)
10574 bool insn_added_p
= false;
10576 /* The insn lengths and addresses have to be up to date for the
10577 following manipulations. */
10578 shorten_branches (get_insns ());
10580 for (insn
= get_insns (); insn
; insn
= NEXT_INSN (insn
))
10582 if (!INSN_P (insn
) || INSN_CODE (insn
) <= 0)
10586 insn_added_p
|= s390_fix_long_loop_prediction (insn
);
10588 if ((GET_CODE (PATTERN (insn
)) == PARALLEL
10589 || GET_CODE (PATTERN (insn
)) == SET
)
10590 && s390_tune
== PROCESSOR_2097_Z10
)
10591 insn_added_p
|= s390_z10_optimize_cmp (insn
);
10594 /* Adjust branches if we added new instructions. */
10596 shorten_branches (get_insns ());
10600 /* Return true if INSN is a fp load insn writing register REGNO. */
10602 s390_fpload_toreg (rtx insn
, unsigned int regno
)
10605 enum attr_type flag
= s390_safe_attr_type (insn
);
10607 if (flag
!= TYPE_FLOADSF
&& flag
!= TYPE_FLOADDF
)
10610 set
= single_set (insn
);
10612 if (set
== NULL_RTX
)
10615 if (!REG_P (SET_DEST (set
)) || !MEM_P (SET_SRC (set
)))
10618 if (REGNO (SET_DEST (set
)) != regno
)
10624 /* This value describes the distance to be avoided between an
10625 aritmetic fp instruction and an fp load writing the same register.
10626 Z10_EARLYLOAD_DISTANCE - 1 as well as Z10_EARLYLOAD_DISTANCE + 1 is
10627 fine but the exact value has to be avoided. Otherwise the FP
10628 pipeline will throw an exception causing a major penalty. */
10629 #define Z10_EARLYLOAD_DISTANCE 7
10631 /* Rearrange the ready list in order to avoid the situation described
10632 for Z10_EARLYLOAD_DISTANCE. A problematic load instruction is
10633 moved to the very end of the ready list. */
10635 s390_z10_prevent_earlyload_conflicts (rtx
*ready
, int *nready_p
)
10637 unsigned int regno
;
10638 int nready
= *nready_p
;
10643 enum attr_type flag
;
10646 /* Skip DISTANCE - 1 active insns. */
10647 for (insn
= last_scheduled_insn
, distance
= Z10_EARLYLOAD_DISTANCE
- 1;
10648 distance
> 0 && insn
!= NULL_RTX
;
10649 distance
--, insn
= prev_active_insn (insn
))
10650 if (CALL_P (insn
) || JUMP_P (insn
))
10653 if (insn
== NULL_RTX
)
10656 set
= single_set (insn
);
10658 if (set
== NULL_RTX
|| !REG_P (SET_DEST (set
))
10659 || GET_MODE_CLASS (GET_MODE (SET_DEST (set
))) != MODE_FLOAT
)
10662 flag
= s390_safe_attr_type (insn
);
10664 if (flag
== TYPE_FLOADSF
|| flag
== TYPE_FLOADDF
)
10667 regno
= REGNO (SET_DEST (set
));
10670 while (!s390_fpload_toreg (ready
[i
], regno
) && i
> 0)
10677 memmove (&ready
[1], &ready
[0], sizeof (rtx
) * i
);
10681 /* This function is called via hook TARGET_SCHED_REORDER before
10682 issuing one insn from list READY which contains *NREADYP entries.
10683 For target z10 it reorders load instructions to avoid early load
10684 conflicts in the floating point pipeline */
10686 s390_sched_reorder (FILE *file ATTRIBUTE_UNUSED
, int verbose ATTRIBUTE_UNUSED
,
10687 rtx
*ready
, int *nreadyp
, int clock ATTRIBUTE_UNUSED
)
10689 if (s390_tune
== PROCESSOR_2097_Z10
)
10690 if (reload_completed
&& *nreadyp
> 1)
10691 s390_z10_prevent_earlyload_conflicts (ready
, nreadyp
);
10693 return s390_issue_rate ();
10696 /* This function is called via hook TARGET_SCHED_VARIABLE_ISSUE after
10697 the scheduler has issued INSN. It stores the last issued insn into
10698 last_scheduled_insn in order to make it available for
10699 s390_sched_reorder. */
10701 s390_sched_variable_issue (FILE *file ATTRIBUTE_UNUSED
,
10702 int verbose ATTRIBUTE_UNUSED
,
10703 rtx insn
, int more
)
10705 last_scheduled_insn
= insn
;
10707 if (GET_CODE (PATTERN (insn
)) != USE
10708 && GET_CODE (PATTERN (insn
)) != CLOBBER
)
10715 s390_sched_init (FILE *file ATTRIBUTE_UNUSED
,
10716 int verbose ATTRIBUTE_UNUSED
,
10717 int max_ready ATTRIBUTE_UNUSED
)
10719 last_scheduled_insn
= NULL_RTX
;
10722 /* This function checks the whole of insn X for memory references. The
10723 function always returns zero because the framework it is called
10724 from would stop recursively analyzing the insn upon a return value
10725 other than zero. The real result of this function is updating
10726 counter variable MEM_COUNT. */
10728 check_dpu (rtx
*x
, unsigned *mem_count
)
10730 if (*x
!= NULL_RTX
&& MEM_P (*x
))
10735 /* This target hook implementation for TARGET_LOOP_UNROLL_ADJUST calculates
10736 a new number struct loop *loop should be unrolled if tuned for cpus with
10737 a built-in stride prefetcher.
10738 The loop is analyzed for memory accesses by calling check_dpu for
10739 each rtx of the loop. Depending on the loop_depth and the amount of
10740 memory accesses a new number <=nunroll is returned to improve the
10741 behaviour of the hardware prefetch unit. */
10743 s390_loop_unroll_adjust (unsigned nunroll
, struct loop
*loop
)
10748 unsigned mem_count
= 0;
10750 if (s390_tune
!= PROCESSOR_2097_Z10
&& s390_tune
!= PROCESSOR_2817_Z196
)
10753 /* Count the number of memory references within the loop body. */
10754 bbs
= get_loop_body (loop
);
10755 for (i
= 0; i
< loop
->num_nodes
; i
++)
10757 for (insn
= BB_HEAD (bbs
[i
]); insn
!= BB_END (bbs
[i
]); insn
= NEXT_INSN (insn
))
10758 if (INSN_P (insn
) && INSN_CODE (insn
) != -1)
10759 for_each_rtx (&insn
, (rtx_function
) check_dpu
, &mem_count
);
10763 /* Prevent division by zero, and we do not need to adjust nunroll in this case. */
10764 if (mem_count
== 0)
10767 switch (loop_depth(loop
))
10770 return MIN (nunroll
, 28 / mem_count
);
10772 return MIN (nunroll
, 22 / mem_count
);
10774 return MIN (nunroll
, 16 / mem_count
);
10778 /* Initialize GCC target structure. */
10780 #undef TARGET_ASM_ALIGNED_HI_OP
10781 #define TARGET_ASM_ALIGNED_HI_OP "\t.word\t"
10782 #undef TARGET_ASM_ALIGNED_DI_OP
10783 #define TARGET_ASM_ALIGNED_DI_OP "\t.quad\t"
10784 #undef TARGET_ASM_INTEGER
10785 #define TARGET_ASM_INTEGER s390_assemble_integer
10787 #undef TARGET_ASM_OPEN_PAREN
10788 #define TARGET_ASM_OPEN_PAREN ""
10790 #undef TARGET_ASM_CLOSE_PAREN
10791 #define TARGET_ASM_CLOSE_PAREN ""
10793 #undef TARGET_OPTION_OVERRIDE
10794 #define TARGET_OPTION_OVERRIDE s390_option_override
10796 #undef TARGET_ENCODE_SECTION_INFO
10797 #define TARGET_ENCODE_SECTION_INFO s390_encode_section_info
10799 #undef TARGET_SCALAR_MODE_SUPPORTED_P
10800 #define TARGET_SCALAR_MODE_SUPPORTED_P s390_scalar_mode_supported_p
10803 #undef TARGET_HAVE_TLS
10804 #define TARGET_HAVE_TLS true
10806 #undef TARGET_CANNOT_FORCE_CONST_MEM
10807 #define TARGET_CANNOT_FORCE_CONST_MEM s390_cannot_force_const_mem
10809 #undef TARGET_DELEGITIMIZE_ADDRESS
10810 #define TARGET_DELEGITIMIZE_ADDRESS s390_delegitimize_address
10812 #undef TARGET_LEGITIMIZE_ADDRESS
10813 #define TARGET_LEGITIMIZE_ADDRESS s390_legitimize_address
10815 #undef TARGET_RETURN_IN_MEMORY
10816 #define TARGET_RETURN_IN_MEMORY s390_return_in_memory
10818 #undef TARGET_INIT_BUILTINS
10819 #define TARGET_INIT_BUILTINS s390_init_builtins
10820 #undef TARGET_EXPAND_BUILTIN
10821 #define TARGET_EXPAND_BUILTIN s390_expand_builtin
10823 #undef TARGET_ASM_OUTPUT_ADDR_CONST_EXTRA
10824 #define TARGET_ASM_OUTPUT_ADDR_CONST_EXTRA s390_output_addr_const_extra
10826 #undef TARGET_ASM_OUTPUT_MI_THUNK
10827 #define TARGET_ASM_OUTPUT_MI_THUNK s390_output_mi_thunk
10828 #undef TARGET_ASM_CAN_OUTPUT_MI_THUNK
10829 #define TARGET_ASM_CAN_OUTPUT_MI_THUNK hook_bool_const_tree_hwi_hwi_const_tree_true
10831 #undef TARGET_SCHED_ADJUST_PRIORITY
10832 #define TARGET_SCHED_ADJUST_PRIORITY s390_adjust_priority
10833 #undef TARGET_SCHED_ISSUE_RATE
10834 #define TARGET_SCHED_ISSUE_RATE s390_issue_rate
10835 #undef TARGET_SCHED_FIRST_CYCLE_MULTIPASS_DFA_LOOKAHEAD
10836 #define TARGET_SCHED_FIRST_CYCLE_MULTIPASS_DFA_LOOKAHEAD s390_first_cycle_multipass_dfa_lookahead
10838 #undef TARGET_SCHED_VARIABLE_ISSUE
10839 #define TARGET_SCHED_VARIABLE_ISSUE s390_sched_variable_issue
10840 #undef TARGET_SCHED_REORDER
10841 #define TARGET_SCHED_REORDER s390_sched_reorder
10842 #undef TARGET_SCHED_INIT
10843 #define TARGET_SCHED_INIT s390_sched_init
10845 #undef TARGET_CANNOT_COPY_INSN_P
10846 #define TARGET_CANNOT_COPY_INSN_P s390_cannot_copy_insn_p
10847 #undef TARGET_RTX_COSTS
10848 #define TARGET_RTX_COSTS s390_rtx_costs
10849 #undef TARGET_ADDRESS_COST
10850 #define TARGET_ADDRESS_COST s390_address_cost
10851 #undef TARGET_REGISTER_MOVE_COST
10852 #define TARGET_REGISTER_MOVE_COST s390_register_move_cost
10853 #undef TARGET_MEMORY_MOVE_COST
10854 #define TARGET_MEMORY_MOVE_COST s390_memory_move_cost
10856 #undef TARGET_MACHINE_DEPENDENT_REORG
10857 #define TARGET_MACHINE_DEPENDENT_REORG s390_reorg
10859 #undef TARGET_VALID_POINTER_MODE
10860 #define TARGET_VALID_POINTER_MODE s390_valid_pointer_mode
10862 #undef TARGET_BUILD_BUILTIN_VA_LIST
10863 #define TARGET_BUILD_BUILTIN_VA_LIST s390_build_builtin_va_list
10864 #undef TARGET_EXPAND_BUILTIN_VA_START
10865 #define TARGET_EXPAND_BUILTIN_VA_START s390_va_start
10866 #undef TARGET_GIMPLIFY_VA_ARG_EXPR
10867 #define TARGET_GIMPLIFY_VA_ARG_EXPR s390_gimplify_va_arg
10869 #undef TARGET_PROMOTE_FUNCTION_MODE
10870 #define TARGET_PROMOTE_FUNCTION_MODE s390_promote_function_mode
10871 #undef TARGET_PASS_BY_REFERENCE
10872 #define TARGET_PASS_BY_REFERENCE s390_pass_by_reference
10874 #undef TARGET_FUNCTION_OK_FOR_SIBCALL
10875 #define TARGET_FUNCTION_OK_FOR_SIBCALL s390_function_ok_for_sibcall
10876 #undef TARGET_FUNCTION_ARG
10877 #define TARGET_FUNCTION_ARG s390_function_arg
10878 #undef TARGET_FUNCTION_ARG_ADVANCE
10879 #define TARGET_FUNCTION_ARG_ADVANCE s390_function_arg_advance
10880 #undef TARGET_FUNCTION_VALUE
10881 #define TARGET_FUNCTION_VALUE s390_function_value
10882 #undef TARGET_LIBCALL_VALUE
10883 #define TARGET_LIBCALL_VALUE s390_libcall_value
10885 #undef TARGET_FIXED_CONDITION_CODE_REGS
10886 #define TARGET_FIXED_CONDITION_CODE_REGS s390_fixed_condition_code_regs
10888 #undef TARGET_CC_MODES_COMPATIBLE
10889 #define TARGET_CC_MODES_COMPATIBLE s390_cc_modes_compatible
10891 #undef TARGET_INVALID_WITHIN_DOLOOP
10892 #define TARGET_INVALID_WITHIN_DOLOOP hook_constcharptr_const_rtx_null
10895 #undef TARGET_ASM_OUTPUT_DWARF_DTPREL
10896 #define TARGET_ASM_OUTPUT_DWARF_DTPREL s390_output_dwarf_dtprel
10899 #ifdef TARGET_ALTERNATE_LONG_DOUBLE_MANGLING
10900 #undef TARGET_MANGLE_TYPE
10901 #define TARGET_MANGLE_TYPE s390_mangle_type
10904 #undef TARGET_SCALAR_MODE_SUPPORTED_P
10905 #define TARGET_SCALAR_MODE_SUPPORTED_P s390_scalar_mode_supported_p
10907 #undef TARGET_PREFERRED_RELOAD_CLASS
10908 #define TARGET_PREFERRED_RELOAD_CLASS s390_preferred_reload_class
10910 #undef TARGET_SECONDARY_RELOAD
10911 #define TARGET_SECONDARY_RELOAD s390_secondary_reload
10913 #undef TARGET_LIBGCC_CMP_RETURN_MODE
10914 #define TARGET_LIBGCC_CMP_RETURN_MODE s390_libgcc_cmp_return_mode
10916 #undef TARGET_LIBGCC_SHIFT_COUNT_MODE
10917 #define TARGET_LIBGCC_SHIFT_COUNT_MODE s390_libgcc_shift_count_mode
10919 #undef TARGET_LEGITIMATE_ADDRESS_P
10920 #define TARGET_LEGITIMATE_ADDRESS_P s390_legitimate_address_p
10922 #undef TARGET_LEGITIMATE_CONSTANT_P
10923 #define TARGET_LEGITIMATE_CONSTANT_P s390_legitimate_constant_p
10925 #undef TARGET_CAN_ELIMINATE
10926 #define TARGET_CAN_ELIMINATE s390_can_eliminate
10928 #undef TARGET_CONDITIONAL_REGISTER_USAGE
10929 #define TARGET_CONDITIONAL_REGISTER_USAGE s390_conditional_register_usage
10931 #undef TARGET_LOOP_UNROLL_ADJUST
10932 #define TARGET_LOOP_UNROLL_ADJUST s390_loop_unroll_adjust
10934 #undef TARGET_ASM_TRAMPOLINE_TEMPLATE
10935 #define TARGET_ASM_TRAMPOLINE_TEMPLATE s390_asm_trampoline_template
10936 #undef TARGET_TRAMPOLINE_INIT
10937 #define TARGET_TRAMPOLINE_INIT s390_trampoline_init
10939 #undef TARGET_UNWIND_WORD_MODE
10940 #define TARGET_UNWIND_WORD_MODE s390_unwind_word_mode
10942 struct gcc_target targetm
= TARGET_INITIALIZER
;
10944 #include "gt-s390.h"