1 /* Subroutines used for code generation on IBM S/390 and zSeries
2 Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006,
3 2007, 2008, 2009, 2010 Free Software Foundation, Inc.
4 Contributed by Hartmut Penner (hpenner@de.ibm.com) and
5 Ulrich Weigand (uweigand@de.ibm.com) and
6 Andreas Krebbel (Andreas.Krebbel@de.ibm.com).
8 This file is part of GCC.
10 GCC is free software; you can redistribute it and/or modify it under
11 the terms of the GNU General Public License as published by the Free
12 Software Foundation; either version 3, or (at your option) any later
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"
44 #include "basic-block.h"
45 #include "integrate.h"
48 #include "target-def.h"
50 #include "langhooks.h"
58 /* Define the specific costs for a given cpu. */
60 struct processor_costs
63 const int m
; /* cost of an M instruction. */
64 const int mghi
; /* cost of an MGHI instruction. */
65 const int mh
; /* cost of an MH instruction. */
66 const int mhi
; /* cost of an MHI instruction. */
67 const int ml
; /* cost of an ML instruction. */
68 const int mr
; /* cost of an MR instruction. */
69 const int ms
; /* cost of an MS instruction. */
70 const int msg
; /* cost of an MSG instruction. */
71 const int msgf
; /* cost of an MSGF instruction. */
72 const int msgfr
; /* cost of an MSGFR instruction. */
73 const int msgr
; /* cost of an MSGR instruction. */
74 const int msr
; /* cost of an MSR instruction. */
75 const int mult_df
; /* cost of multiplication in DFmode. */
78 const int sqxbr
; /* cost of square root in TFmode. */
79 const int sqdbr
; /* cost of square root in DFmode. */
80 const int sqebr
; /* cost of square root in SFmode. */
81 /* multiply and add */
82 const int madbr
; /* cost of multiply and add in DFmode. */
83 const int maebr
; /* cost of multiply and add in SFmode. */
95 const struct processor_costs
*s390_cost
;
98 struct processor_costs z900_cost
=
100 COSTS_N_INSNS (5), /* M */
101 COSTS_N_INSNS (10), /* MGHI */
102 COSTS_N_INSNS (5), /* MH */
103 COSTS_N_INSNS (4), /* MHI */
104 COSTS_N_INSNS (5), /* ML */
105 COSTS_N_INSNS (5), /* MR */
106 COSTS_N_INSNS (4), /* MS */
107 COSTS_N_INSNS (15), /* MSG */
108 COSTS_N_INSNS (7), /* MSGF */
109 COSTS_N_INSNS (7), /* MSGFR */
110 COSTS_N_INSNS (10), /* MSGR */
111 COSTS_N_INSNS (4), /* MSR */
112 COSTS_N_INSNS (7), /* multiplication in DFmode */
113 COSTS_N_INSNS (13), /* MXBR */
114 COSTS_N_INSNS (136), /* SQXBR */
115 COSTS_N_INSNS (44), /* SQDBR */
116 COSTS_N_INSNS (35), /* SQEBR */
117 COSTS_N_INSNS (18), /* MADBR */
118 COSTS_N_INSNS (13), /* MAEBR */
119 COSTS_N_INSNS (134), /* DXBR */
120 COSTS_N_INSNS (30), /* DDBR */
121 COSTS_N_INSNS (27), /* DEBR */
122 COSTS_N_INSNS (220), /* DLGR */
123 COSTS_N_INSNS (34), /* DLR */
124 COSTS_N_INSNS (34), /* DR */
125 COSTS_N_INSNS (32), /* DSGFR */
126 COSTS_N_INSNS (32), /* DSGR */
130 struct processor_costs z990_cost
=
132 COSTS_N_INSNS (4), /* M */
133 COSTS_N_INSNS (2), /* MGHI */
134 COSTS_N_INSNS (2), /* MH */
135 COSTS_N_INSNS (2), /* MHI */
136 COSTS_N_INSNS (4), /* ML */
137 COSTS_N_INSNS (4), /* MR */
138 COSTS_N_INSNS (5), /* MS */
139 COSTS_N_INSNS (6), /* MSG */
140 COSTS_N_INSNS (4), /* MSGF */
141 COSTS_N_INSNS (4), /* MSGFR */
142 COSTS_N_INSNS (4), /* MSGR */
143 COSTS_N_INSNS (4), /* MSR */
144 COSTS_N_INSNS (1), /* multiplication in DFmode */
145 COSTS_N_INSNS (28), /* MXBR */
146 COSTS_N_INSNS (130), /* SQXBR */
147 COSTS_N_INSNS (66), /* SQDBR */
148 COSTS_N_INSNS (38), /* SQEBR */
149 COSTS_N_INSNS (1), /* MADBR */
150 COSTS_N_INSNS (1), /* MAEBR */
151 COSTS_N_INSNS (60), /* DXBR */
152 COSTS_N_INSNS (40), /* DDBR */
153 COSTS_N_INSNS (26), /* DEBR */
154 COSTS_N_INSNS (176), /* DLGR */
155 COSTS_N_INSNS (31), /* DLR */
156 COSTS_N_INSNS (31), /* DR */
157 COSTS_N_INSNS (31), /* DSGFR */
158 COSTS_N_INSNS (31), /* DSGR */
162 struct processor_costs z9_109_cost
=
164 COSTS_N_INSNS (4), /* M */
165 COSTS_N_INSNS (2), /* MGHI */
166 COSTS_N_INSNS (2), /* MH */
167 COSTS_N_INSNS (2), /* MHI */
168 COSTS_N_INSNS (4), /* ML */
169 COSTS_N_INSNS (4), /* MR */
170 COSTS_N_INSNS (5), /* MS */
171 COSTS_N_INSNS (6), /* MSG */
172 COSTS_N_INSNS (4), /* MSGF */
173 COSTS_N_INSNS (4), /* MSGFR */
174 COSTS_N_INSNS (4), /* MSGR */
175 COSTS_N_INSNS (4), /* MSR */
176 COSTS_N_INSNS (1), /* multiplication in DFmode */
177 COSTS_N_INSNS (28), /* MXBR */
178 COSTS_N_INSNS (130), /* SQXBR */
179 COSTS_N_INSNS (66), /* SQDBR */
180 COSTS_N_INSNS (38), /* SQEBR */
181 COSTS_N_INSNS (1), /* MADBR */
182 COSTS_N_INSNS (1), /* MAEBR */
183 COSTS_N_INSNS (60), /* DXBR */
184 COSTS_N_INSNS (40), /* DDBR */
185 COSTS_N_INSNS (26), /* DEBR */
186 COSTS_N_INSNS (30), /* DLGR */
187 COSTS_N_INSNS (23), /* DLR */
188 COSTS_N_INSNS (23), /* DR */
189 COSTS_N_INSNS (24), /* DSGFR */
190 COSTS_N_INSNS (24), /* DSGR */
194 struct processor_costs z10_cost
=
196 COSTS_N_INSNS (10), /* M */
197 COSTS_N_INSNS (10), /* MGHI */
198 COSTS_N_INSNS (10), /* MH */
199 COSTS_N_INSNS (10), /* MHI */
200 COSTS_N_INSNS (10), /* ML */
201 COSTS_N_INSNS (10), /* MR */
202 COSTS_N_INSNS (10), /* MS */
203 COSTS_N_INSNS (10), /* MSG */
204 COSTS_N_INSNS (10), /* MSGF */
205 COSTS_N_INSNS (10), /* MSGFR */
206 COSTS_N_INSNS (10), /* MSGR */
207 COSTS_N_INSNS (10), /* MSR */
208 COSTS_N_INSNS (1) , /* multiplication in DFmode */
209 COSTS_N_INSNS (50), /* MXBR */
210 COSTS_N_INSNS (120), /* SQXBR */
211 COSTS_N_INSNS (52), /* SQDBR */
212 COSTS_N_INSNS (38), /* SQEBR */
213 COSTS_N_INSNS (1), /* MADBR */
214 COSTS_N_INSNS (1), /* MAEBR */
215 COSTS_N_INSNS (111), /* DXBR */
216 COSTS_N_INSNS (39), /* DDBR */
217 COSTS_N_INSNS (32), /* DEBR */
218 COSTS_N_INSNS (160), /* DLGR */
219 COSTS_N_INSNS (71), /* DLR */
220 COSTS_N_INSNS (71), /* DR */
221 COSTS_N_INSNS (71), /* DSGFR */
222 COSTS_N_INSNS (71), /* DSGR */
225 extern int reload_completed
;
227 /* Kept up to date using the SCHED_VARIABLE_ISSUE hook. */
228 static rtx last_scheduled_insn
;
230 /* Structure used to hold the components of a S/390 memory
231 address. A legitimate address on S/390 is of the general
233 base + index + displacement
234 where any of the components is optional.
236 base and index are registers of the class ADDR_REGS,
237 displacement is an unsigned 12-bit immediate constant. */
248 /* Which cpu are we tuning for. */
249 enum processor_type s390_tune
= PROCESSOR_max
;
251 /* Which instruction set architecture to use. */
252 enum processor_type s390_arch
;
255 HOST_WIDE_INT s390_warn_framesize
= 0;
256 HOST_WIDE_INT s390_stack_size
= 0;
257 HOST_WIDE_INT s390_stack_guard
= 0;
259 /* The following structure is embedded in the machine
260 specific part of struct function. */
262 struct GTY (()) s390_frame_layout
264 /* Offset within stack frame. */
265 HOST_WIDE_INT gprs_offset
;
266 HOST_WIDE_INT f0_offset
;
267 HOST_WIDE_INT f4_offset
;
268 HOST_WIDE_INT f8_offset
;
269 HOST_WIDE_INT backchain_offset
;
271 /* Number of first and last gpr where slots in the register
272 save area are reserved for. */
273 int first_save_gpr_slot
;
274 int last_save_gpr_slot
;
276 /* Number of first and last gpr to be saved, restored. */
278 int first_restore_gpr
;
280 int last_restore_gpr
;
282 /* Bits standing for floating point registers. Set, if the
283 respective register has to be saved. Starting with reg 16 (f0)
284 at the rightmost bit.
285 Bit 15 - 8 7 6 5 4 3 2 1 0
286 fpr 15 - 8 7 5 3 1 6 4 2 0
287 reg 31 - 24 23 22 21 20 19 18 17 16 */
288 unsigned int fpr_bitmap
;
290 /* Number of floating point registers f8-f15 which must be saved. */
293 /* Set if return address needs to be saved.
294 This flag is set by s390_return_addr_rtx if it could not use
295 the initial value of r14 and therefore depends on r14 saved
297 bool save_return_addr_p
;
299 /* Size of stack frame. */
300 HOST_WIDE_INT frame_size
;
303 /* Define the structure for the machine field in struct function. */
305 struct GTY(()) machine_function
307 struct s390_frame_layout frame_layout
;
309 /* Literal pool base register. */
312 /* True if we may need to perform branch splitting. */
313 bool split_branches_pending_p
;
315 /* Some local-dynamic TLS symbol name. */
316 const char *some_ld_name
;
318 bool has_landing_pad_p
;
321 /* Few accessor macros for struct cfun->machine->s390_frame_layout. */
323 #define cfun_frame_layout (cfun->machine->frame_layout)
324 #define cfun_save_high_fprs_p (!!cfun_frame_layout.high_fprs)
325 #define cfun_gprs_save_area_size ((cfun_frame_layout.last_save_gpr_slot - \
326 cfun_frame_layout.first_save_gpr_slot + 1) * UNITS_PER_LONG)
327 #define cfun_set_fpr_bit(BITNUM) (cfun->machine->frame_layout.fpr_bitmap |= \
329 #define cfun_fpr_bit_p(BITNUM) (!!(cfun->machine->frame_layout.fpr_bitmap & \
332 /* Number of GPRs and FPRs used for argument passing. */
333 #define GP_ARG_NUM_REG 5
334 #define FP_ARG_NUM_REG (TARGET_64BIT? 4 : 2)
336 /* A couple of shortcuts. */
337 #define CONST_OK_FOR_J(x) \
338 CONST_OK_FOR_CONSTRAINT_P((x), 'J', "J")
339 #define CONST_OK_FOR_K(x) \
340 CONST_OK_FOR_CONSTRAINT_P((x), 'K', "K")
341 #define CONST_OK_FOR_Os(x) \
342 CONST_OK_FOR_CONSTRAINT_P((x), 'O', "Os")
343 #define CONST_OK_FOR_Op(x) \
344 CONST_OK_FOR_CONSTRAINT_P((x), 'O', "Op")
345 #define CONST_OK_FOR_On(x) \
346 CONST_OK_FOR_CONSTRAINT_P((x), 'O', "On")
348 #define REGNO_PAIR_OK(REGNO, MODE) \
349 (HARD_REGNO_NREGS ((REGNO), (MODE)) == 1 || !((REGNO) & 1))
351 /* That's the read ahead of the dynamic branch prediction unit in
352 bytes on a z10 CPU. */
353 #define Z10_PREDICT_DISTANCE 384
355 static enum machine_mode
356 s390_libgcc_cmp_return_mode (void)
358 return TARGET_64BIT
? DImode
: SImode
;
361 static enum machine_mode
362 s390_libgcc_shift_count_mode (void)
364 return TARGET_64BIT
? DImode
: SImode
;
367 static enum machine_mode
368 s390_unwind_word_mode (void)
370 return TARGET_64BIT
? DImode
: SImode
;
373 /* Return true if the back end supports mode MODE. */
375 s390_scalar_mode_supported_p (enum machine_mode mode
)
377 /* In contrast to the default implementation reject TImode constants on 31bit
378 TARGET_ZARCH for ABI compliance. */
379 if (!TARGET_64BIT
&& TARGET_ZARCH
&& mode
== TImode
)
382 if (DECIMAL_FLOAT_MODE_P (mode
))
383 return default_decimal_float_supported_p ();
385 return default_scalar_mode_supported_p (mode
);
388 /* Set the has_landing_pad_p flag in struct machine_function to VALUE. */
391 s390_set_has_landing_pad_p (bool value
)
393 cfun
->machine
->has_landing_pad_p
= value
;
396 /* If two condition code modes are compatible, return a condition code
397 mode which is compatible with both. Otherwise, return
400 static enum machine_mode
401 s390_cc_modes_compatible (enum machine_mode m1
, enum machine_mode m2
)
409 if (m2
== CCUmode
|| m2
== CCTmode
|| m2
== CCZ1mode
410 || m2
== CCSmode
|| m2
== CCSRmode
|| m2
== CCURmode
)
431 /* Return true if SET either doesn't set the CC register, or else
432 the source and destination have matching CC modes and that
433 CC mode is at least as constrained as REQ_MODE. */
436 s390_match_ccmode_set (rtx set
, enum machine_mode req_mode
)
438 enum machine_mode set_mode
;
440 gcc_assert (GET_CODE (set
) == SET
);
442 if (GET_CODE (SET_DEST (set
)) != REG
|| !CC_REGNO_P (REGNO (SET_DEST (set
))))
445 set_mode
= GET_MODE (SET_DEST (set
));
459 if (req_mode
!= set_mode
)
464 if (req_mode
!= CCSmode
&& req_mode
!= CCUmode
&& req_mode
!= CCTmode
465 && req_mode
!= CCSRmode
&& req_mode
!= CCURmode
)
471 if (req_mode
!= CCAmode
)
479 return (GET_MODE (SET_SRC (set
)) == set_mode
);
482 /* Return true if every SET in INSN that sets the CC register
483 has source and destination with matching CC modes and that
484 CC mode is at least as constrained as REQ_MODE.
485 If REQ_MODE is VOIDmode, always return false. */
488 s390_match_ccmode (rtx insn
, enum machine_mode req_mode
)
492 /* s390_tm_ccmode returns VOIDmode to indicate failure. */
493 if (req_mode
== VOIDmode
)
496 if (GET_CODE (PATTERN (insn
)) == SET
)
497 return s390_match_ccmode_set (PATTERN (insn
), req_mode
);
499 if (GET_CODE (PATTERN (insn
)) == PARALLEL
)
500 for (i
= 0; i
< XVECLEN (PATTERN (insn
), 0); i
++)
502 rtx set
= XVECEXP (PATTERN (insn
), 0, i
);
503 if (GET_CODE (set
) == SET
)
504 if (!s390_match_ccmode_set (set
, req_mode
))
511 /* If a test-under-mask instruction can be used to implement
512 (compare (and ... OP1) OP2), return the CC mode required
513 to do that. Otherwise, return VOIDmode.
514 MIXED is true if the instruction can distinguish between
515 CC1 and CC2 for mixed selected bits (TMxx), it is false
516 if the instruction cannot (TM). */
519 s390_tm_ccmode (rtx op1
, rtx op2
, bool mixed
)
523 /* ??? Fixme: should work on CONST_DOUBLE as well. */
524 if (GET_CODE (op1
) != CONST_INT
|| GET_CODE (op2
) != CONST_INT
)
527 /* Selected bits all zero: CC0.
528 e.g.: int a; if ((a & (16 + 128)) == 0) */
529 if (INTVAL (op2
) == 0)
532 /* Selected bits all one: CC3.
533 e.g.: int a; if ((a & (16 + 128)) == 16 + 128) */
534 if (INTVAL (op2
) == INTVAL (op1
))
537 /* Exactly two bits selected, mixed zeroes and ones: CC1 or CC2. e.g.:
539 if ((a & (16 + 128)) == 16) -> CCT1
540 if ((a & (16 + 128)) == 128) -> CCT2 */
543 bit1
= exact_log2 (INTVAL (op2
));
544 bit0
= exact_log2 (INTVAL (op1
) ^ INTVAL (op2
));
545 if (bit0
!= -1 && bit1
!= -1)
546 return bit0
> bit1
? CCT1mode
: CCT2mode
;
552 /* Given a comparison code OP (EQ, NE, etc.) and the operands
553 OP0 and OP1 of a COMPARE, return the mode to be used for the
557 s390_select_ccmode (enum rtx_code code
, rtx op0
, rtx op1
)
563 if ((GET_CODE (op0
) == NEG
|| GET_CODE (op0
) == ABS
)
564 && GET_MODE_CLASS (GET_MODE (op0
)) == MODE_INT
)
566 if (GET_CODE (op0
) == PLUS
&& GET_CODE (XEXP (op0
, 1)) == CONST_INT
567 && CONST_OK_FOR_K (INTVAL (XEXP (op0
, 1))))
569 if ((GET_CODE (op0
) == PLUS
|| GET_CODE (op0
) == MINUS
570 || GET_CODE (op1
) == NEG
)
571 && GET_MODE_CLASS (GET_MODE (op0
)) == MODE_INT
)
574 if (GET_CODE (op0
) == AND
)
576 /* Check whether we can potentially do it via TM. */
577 enum machine_mode ccmode
;
578 ccmode
= s390_tm_ccmode (XEXP (op0
, 1), op1
, 1);
579 if (ccmode
!= VOIDmode
)
581 /* Relax CCTmode to CCZmode to allow fall-back to AND
582 if that turns out to be beneficial. */
583 return ccmode
== CCTmode
? CCZmode
: ccmode
;
587 if (register_operand (op0
, HImode
)
588 && GET_CODE (op1
) == CONST_INT
589 && (INTVAL (op1
) == -1 || INTVAL (op1
) == 65535))
591 if (register_operand (op0
, QImode
)
592 && GET_CODE (op1
) == CONST_INT
593 && (INTVAL (op1
) == -1 || INTVAL (op1
) == 255))
602 /* The only overflow condition of NEG and ABS happens when
603 -INT_MAX is used as parameter, which stays negative. So
604 we have an overflow from a positive value to a negative.
605 Using CCAP mode the resulting cc can be used for comparisons. */
606 if ((GET_CODE (op0
) == NEG
|| GET_CODE (op0
) == ABS
)
607 && GET_MODE_CLASS (GET_MODE (op0
)) == MODE_INT
)
610 /* If constants are involved in an add instruction it is possible to use
611 the resulting cc for comparisons with zero. Knowing the sign of the
612 constant the overflow behavior gets predictable. e.g.:
613 int a, b; if ((b = a + c) > 0)
614 with c as a constant value: c < 0 -> CCAN and c >= 0 -> CCAP */
615 if (GET_CODE (op0
) == PLUS
&& GET_CODE (XEXP (op0
, 1)) == CONST_INT
616 && CONST_OK_FOR_K (INTVAL (XEXP (op0
, 1))))
618 if (INTVAL (XEXP((op0
), 1)) < 0)
632 if ((GET_CODE (op0
) == SIGN_EXTEND
|| GET_CODE (op0
) == ZERO_EXTEND
)
633 && GET_CODE (op1
) != CONST_INT
)
639 if (GET_CODE (op0
) == PLUS
640 && GET_MODE_CLASS (GET_MODE (op0
)) == MODE_INT
)
643 if ((GET_CODE (op0
) == SIGN_EXTEND
|| GET_CODE (op0
) == ZERO_EXTEND
)
644 && GET_CODE (op1
) != CONST_INT
)
650 if (GET_CODE (op0
) == MINUS
651 && GET_MODE_CLASS (GET_MODE (op0
)) == MODE_INT
)
654 if ((GET_CODE (op0
) == SIGN_EXTEND
|| GET_CODE (op0
) == ZERO_EXTEND
)
655 && GET_CODE (op1
) != CONST_INT
)
664 /* Replace the comparison OP0 CODE OP1 by a semantically equivalent one
665 that we can implement more efficiently. */
668 s390_canonicalize_comparison (enum rtx_code
*code
, rtx
*op0
, rtx
*op1
)
670 /* Convert ZERO_EXTRACT back to AND to enable TM patterns. */
671 if ((*code
== EQ
|| *code
== NE
)
672 && *op1
== const0_rtx
673 && GET_CODE (*op0
) == ZERO_EXTRACT
674 && GET_CODE (XEXP (*op0
, 1)) == CONST_INT
675 && GET_CODE (XEXP (*op0
, 2)) == CONST_INT
676 && SCALAR_INT_MODE_P (GET_MODE (XEXP (*op0
, 0))))
678 rtx inner
= XEXP (*op0
, 0);
679 HOST_WIDE_INT modesize
= GET_MODE_BITSIZE (GET_MODE (inner
));
680 HOST_WIDE_INT len
= INTVAL (XEXP (*op0
, 1));
681 HOST_WIDE_INT pos
= INTVAL (XEXP (*op0
, 2));
683 if (len
> 0 && len
< modesize
684 && pos
>= 0 && pos
+ len
<= modesize
685 && modesize
<= HOST_BITS_PER_WIDE_INT
)
687 unsigned HOST_WIDE_INT block
;
688 block
= ((unsigned HOST_WIDE_INT
) 1 << len
) - 1;
689 block
<<= modesize
- pos
- len
;
691 *op0
= gen_rtx_AND (GET_MODE (inner
), inner
,
692 gen_int_mode (block
, GET_MODE (inner
)));
696 /* Narrow AND of memory against immediate to enable TM. */
697 if ((*code
== EQ
|| *code
== NE
)
698 && *op1
== const0_rtx
699 && GET_CODE (*op0
) == AND
700 && GET_CODE (XEXP (*op0
, 1)) == CONST_INT
701 && SCALAR_INT_MODE_P (GET_MODE (XEXP (*op0
, 0))))
703 rtx inner
= XEXP (*op0
, 0);
704 rtx mask
= XEXP (*op0
, 1);
706 /* Ignore paradoxical SUBREGs if all extra bits are masked out. */
707 if (GET_CODE (inner
) == SUBREG
708 && SCALAR_INT_MODE_P (GET_MODE (SUBREG_REG (inner
)))
709 && (GET_MODE_SIZE (GET_MODE (inner
))
710 >= GET_MODE_SIZE (GET_MODE (SUBREG_REG (inner
))))
712 & GET_MODE_MASK (GET_MODE (inner
))
713 & ~GET_MODE_MASK (GET_MODE (SUBREG_REG (inner
))))
715 inner
= SUBREG_REG (inner
);
717 /* Do not change volatile MEMs. */
718 if (MEM_P (inner
) && !MEM_VOLATILE_P (inner
))
720 int part
= s390_single_part (XEXP (*op0
, 1),
721 GET_MODE (inner
), QImode
, 0);
724 mask
= gen_int_mode (s390_extract_part (mask
, QImode
, 0), QImode
);
725 inner
= adjust_address_nv (inner
, QImode
, part
);
726 *op0
= gen_rtx_AND (QImode
, inner
, mask
);
731 /* Narrow comparisons against 0xffff to HImode if possible. */
732 if ((*code
== EQ
|| *code
== NE
)
733 && GET_CODE (*op1
) == CONST_INT
734 && INTVAL (*op1
) == 0xffff
735 && SCALAR_INT_MODE_P (GET_MODE (*op0
))
736 && (nonzero_bits (*op0
, GET_MODE (*op0
))
737 & ~(unsigned HOST_WIDE_INT
) 0xffff) == 0)
739 *op0
= gen_lowpart (HImode
, *op0
);
743 /* Remove redundant UNSPEC_CCU_TO_INT conversions if possible. */
744 if (GET_CODE (*op0
) == UNSPEC
745 && XINT (*op0
, 1) == UNSPEC_CCU_TO_INT
746 && XVECLEN (*op0
, 0) == 1
747 && GET_MODE (XVECEXP (*op0
, 0, 0)) == CCUmode
748 && GET_CODE (XVECEXP (*op0
, 0, 0)) == REG
749 && REGNO (XVECEXP (*op0
, 0, 0)) == CC_REGNUM
750 && *op1
== const0_rtx
)
752 enum rtx_code new_code
= UNKNOWN
;
755 case EQ
: new_code
= EQ
; break;
756 case NE
: new_code
= NE
; break;
757 case LT
: new_code
= GTU
; break;
758 case GT
: new_code
= LTU
; break;
759 case LE
: new_code
= GEU
; break;
760 case GE
: new_code
= LEU
; break;
764 if (new_code
!= UNKNOWN
)
766 *op0
= XVECEXP (*op0
, 0, 0);
771 /* Remove redundant UNSPEC_CCZ_TO_INT conversions if possible. */
772 if (GET_CODE (*op0
) == UNSPEC
773 && XINT (*op0
, 1) == UNSPEC_CCZ_TO_INT
774 && XVECLEN (*op0
, 0) == 1
775 && GET_MODE (XVECEXP (*op0
, 0, 0)) == CCZmode
776 && GET_CODE (XVECEXP (*op0
, 0, 0)) == REG
777 && REGNO (XVECEXP (*op0
, 0, 0)) == CC_REGNUM
778 && *op1
== const0_rtx
)
780 enum rtx_code new_code
= UNKNOWN
;
783 case EQ
: new_code
= EQ
; break;
784 case NE
: new_code
= NE
; break;
788 if (new_code
!= UNKNOWN
)
790 *op0
= XVECEXP (*op0
, 0, 0);
795 /* Simplify cascaded EQ, NE with const0_rtx. */
796 if ((*code
== NE
|| *code
== EQ
)
797 && (GET_CODE (*op0
) == EQ
|| GET_CODE (*op0
) == NE
)
798 && GET_MODE (*op0
) == SImode
799 && GET_MODE (XEXP (*op0
, 0)) == CCZ1mode
800 && REG_P (XEXP (*op0
, 0))
801 && XEXP (*op0
, 1) == const0_rtx
802 && *op1
== const0_rtx
)
804 if ((*code
== EQ
&& GET_CODE (*op0
) == NE
)
805 || (*code
== NE
&& GET_CODE (*op0
) == EQ
))
809 *op0
= XEXP (*op0
, 0);
812 /* Prefer register over memory as first operand. */
813 if (MEM_P (*op0
) && REG_P (*op1
))
815 rtx tem
= *op0
; *op0
= *op1
; *op1
= tem
;
816 *code
= swap_condition (*code
);
820 /* Emit a compare instruction suitable to implement the comparison
821 OP0 CODE OP1. Return the correct condition RTL to be placed in
822 the IF_THEN_ELSE of the conditional branch testing the result. */
825 s390_emit_compare (enum rtx_code code
, rtx op0
, rtx op1
)
827 enum machine_mode mode
= s390_select_ccmode (code
, op0
, op1
);
830 /* Do not output a redundant compare instruction if a compare_and_swap
831 pattern already computed the result and the machine modes are compatible. */
832 if (GET_MODE_CLASS (GET_MODE (op0
)) == MODE_CC
)
834 gcc_assert (s390_cc_modes_compatible (GET_MODE (op0
), mode
)
840 cc
= gen_rtx_REG (mode
, CC_REGNUM
);
841 emit_insn (gen_rtx_SET (VOIDmode
, cc
, gen_rtx_COMPARE (mode
, op0
, op1
)));
844 return gen_rtx_fmt_ee (code
, VOIDmode
, cc
, const0_rtx
);
847 /* Emit a SImode compare and swap instruction setting MEM to NEW_RTX if OLD
849 Return the correct condition RTL to be placed in the IF_THEN_ELSE of the
850 conditional branch testing the result. */
853 s390_emit_compare_and_swap (enum rtx_code code
, rtx old
, rtx mem
, rtx cmp
, rtx new_rtx
)
855 emit_insn (gen_sync_compare_and_swapsi (old
, mem
, cmp
, new_rtx
));
856 return s390_emit_compare (code
, gen_rtx_REG (CCZ1mode
, CC_REGNUM
), const0_rtx
);
859 /* Emit a jump instruction to TARGET. If COND is NULL_RTX, emit an
860 unconditional jump, else a conditional jump under condition COND. */
863 s390_emit_jump (rtx target
, rtx cond
)
867 target
= gen_rtx_LABEL_REF (VOIDmode
, target
);
869 target
= gen_rtx_IF_THEN_ELSE (VOIDmode
, cond
, target
, pc_rtx
);
871 insn
= gen_rtx_SET (VOIDmode
, pc_rtx
, target
);
872 emit_jump_insn (insn
);
875 /* Return branch condition mask to implement a branch
876 specified by CODE. Return -1 for invalid comparisons. */
879 s390_branch_condition_mask (rtx code
)
881 const int CC0
= 1 << 3;
882 const int CC1
= 1 << 2;
883 const int CC2
= 1 << 1;
884 const int CC3
= 1 << 0;
886 gcc_assert (GET_CODE (XEXP (code
, 0)) == REG
);
887 gcc_assert (REGNO (XEXP (code
, 0)) == CC_REGNUM
);
888 gcc_assert (XEXP (code
, 1) == const0_rtx
);
890 switch (GET_MODE (XEXP (code
, 0)))
894 switch (GET_CODE (code
))
897 case NE
: return CC1
| CC2
| CC3
;
903 switch (GET_CODE (code
))
906 case NE
: return CC0
| CC2
| CC3
;
912 switch (GET_CODE (code
))
915 case NE
: return CC0
| CC1
| CC3
;
921 switch (GET_CODE (code
))
924 case NE
: return CC0
| CC1
| CC2
;
930 switch (GET_CODE (code
))
932 case EQ
: return CC0
| CC2
;
933 case NE
: return CC1
| CC3
;
939 switch (GET_CODE (code
))
941 case LTU
: return CC2
| CC3
; /* carry */
942 case GEU
: return CC0
| CC1
; /* no carry */
948 switch (GET_CODE (code
))
950 case GTU
: return CC0
| CC1
; /* borrow */
951 case LEU
: return CC2
| CC3
; /* no borrow */
957 switch (GET_CODE (code
))
959 case EQ
: return CC0
| CC2
;
960 case NE
: return CC1
| CC3
;
961 case LTU
: return CC1
;
962 case GTU
: return CC3
;
963 case LEU
: return CC1
| CC2
;
964 case GEU
: return CC2
| CC3
;
969 switch (GET_CODE (code
))
972 case NE
: return CC1
| CC2
| CC3
;
973 case LTU
: return CC1
;
974 case GTU
: return CC2
;
975 case LEU
: return CC0
| CC1
;
976 case GEU
: return CC0
| CC2
;
982 switch (GET_CODE (code
))
985 case NE
: return CC2
| CC1
| CC3
;
986 case LTU
: return CC2
;
987 case GTU
: return CC1
;
988 case LEU
: return CC0
| CC2
;
989 case GEU
: return CC0
| CC1
;
995 switch (GET_CODE (code
))
998 case NE
: return CC1
| CC2
| CC3
;
999 case LT
: return CC1
| CC3
;
1000 case GT
: return CC2
;
1001 case LE
: return CC0
| CC1
| CC3
;
1002 case GE
: return CC0
| CC2
;
1008 switch (GET_CODE (code
))
1010 case EQ
: return CC0
;
1011 case NE
: return CC1
| CC2
| CC3
;
1012 case LT
: return CC1
;
1013 case GT
: return CC2
| CC3
;
1014 case LE
: return CC0
| CC1
;
1015 case GE
: return CC0
| CC2
| CC3
;
1021 switch (GET_CODE (code
))
1023 case EQ
: return CC0
;
1024 case NE
: return CC1
| CC2
| CC3
;
1025 case LT
: return CC1
;
1026 case GT
: return CC2
;
1027 case LE
: return CC0
| CC1
;
1028 case GE
: return CC0
| CC2
;
1029 case UNORDERED
: return CC3
;
1030 case ORDERED
: return CC0
| CC1
| CC2
;
1031 case UNEQ
: return CC0
| CC3
;
1032 case UNLT
: return CC1
| CC3
;
1033 case UNGT
: return CC2
| CC3
;
1034 case UNLE
: return CC0
| CC1
| CC3
;
1035 case UNGE
: return CC0
| CC2
| CC3
;
1036 case LTGT
: return CC1
| CC2
;
1042 switch (GET_CODE (code
))
1044 case EQ
: return CC0
;
1045 case NE
: return CC2
| CC1
| CC3
;
1046 case LT
: return CC2
;
1047 case GT
: return CC1
;
1048 case LE
: return CC0
| CC2
;
1049 case GE
: return CC0
| CC1
;
1050 case UNORDERED
: return CC3
;
1051 case ORDERED
: return CC0
| CC2
| CC1
;
1052 case UNEQ
: return CC0
| CC3
;
1053 case UNLT
: return CC2
| CC3
;
1054 case UNGT
: return CC1
| CC3
;
1055 case UNLE
: return CC0
| CC2
| CC3
;
1056 case UNGE
: return CC0
| CC1
| CC3
;
1057 case LTGT
: return CC2
| CC1
;
1068 /* Return branch condition mask to implement a compare and branch
1069 specified by CODE. Return -1 for invalid comparisons. */
1072 s390_compare_and_branch_condition_mask (rtx code
)
1074 const int CC0
= 1 << 3;
1075 const int CC1
= 1 << 2;
1076 const int CC2
= 1 << 1;
1078 switch (GET_CODE (code
))
1102 /* If INV is false, return assembler mnemonic string to implement
1103 a branch specified by CODE. If INV is true, return mnemonic
1104 for the corresponding inverted branch. */
1107 s390_branch_condition_mnemonic (rtx code
, int inv
)
1111 static const char *const mnemonic
[16] =
1113 NULL
, "o", "h", "nle",
1114 "l", "nhe", "lh", "ne",
1115 "e", "nlh", "he", "nl",
1116 "le", "nh", "no", NULL
1119 if (GET_CODE (XEXP (code
, 0)) == REG
1120 && REGNO (XEXP (code
, 0)) == CC_REGNUM
1121 && XEXP (code
, 1) == const0_rtx
)
1122 mask
= s390_branch_condition_mask (code
);
1124 mask
= s390_compare_and_branch_condition_mask (code
);
1126 gcc_assert (mask
>= 0);
1131 gcc_assert (mask
>= 1 && mask
<= 14);
1133 return mnemonic
[mask
];
1136 /* Return the part of op which has a value different from def.
1137 The size of the part is determined by mode.
1138 Use this function only if you already know that op really
1139 contains such a part. */
1141 unsigned HOST_WIDE_INT
1142 s390_extract_part (rtx op
, enum machine_mode mode
, int def
)
1144 unsigned HOST_WIDE_INT value
= 0;
1145 int max_parts
= HOST_BITS_PER_WIDE_INT
/ GET_MODE_BITSIZE (mode
);
1146 int part_bits
= GET_MODE_BITSIZE (mode
);
1147 unsigned HOST_WIDE_INT part_mask
1148 = ((unsigned HOST_WIDE_INT
)1 << part_bits
) - 1;
1151 for (i
= 0; i
< max_parts
; i
++)
1154 value
= (unsigned HOST_WIDE_INT
) INTVAL (op
);
1156 value
>>= part_bits
;
1158 if ((value
& part_mask
) != (def
& part_mask
))
1159 return value
& part_mask
;
1165 /* If OP is an integer constant of mode MODE with exactly one
1166 part of mode PART_MODE unequal to DEF, return the number of that
1167 part. Otherwise, return -1. */
1170 s390_single_part (rtx op
,
1171 enum machine_mode mode
,
1172 enum machine_mode part_mode
,
1175 unsigned HOST_WIDE_INT value
= 0;
1176 int n_parts
= GET_MODE_SIZE (mode
) / GET_MODE_SIZE (part_mode
);
1177 unsigned HOST_WIDE_INT part_mask
1178 = ((unsigned HOST_WIDE_INT
)1 << GET_MODE_BITSIZE (part_mode
)) - 1;
1181 if (GET_CODE (op
) != CONST_INT
)
1184 for (i
= 0; i
< n_parts
; i
++)
1187 value
= (unsigned HOST_WIDE_INT
) INTVAL (op
);
1189 value
>>= GET_MODE_BITSIZE (part_mode
);
1191 if ((value
& part_mask
) != (def
& part_mask
))
1199 return part
== -1 ? -1 : n_parts
- 1 - part
;
1202 /* Return true if IN contains a contiguous bitfield in the lower SIZE
1203 bits and no other bits are set in IN. POS and LENGTH can be used
1204 to obtain the start position and the length of the bitfield.
1206 POS gives the position of the first bit of the bitfield counting
1207 from the lowest order bit starting with zero. In order to use this
1208 value for S/390 instructions this has to be converted to "bits big
1212 s390_contiguous_bitmask_p (unsigned HOST_WIDE_INT in
, int size
,
1213 int *pos
, int *length
)
1218 unsigned HOST_WIDE_INT mask
= 1ULL;
1219 bool contiguous
= false;
1221 for (i
= 0; i
< size
; mask
<<= 1, i
++)
1245 /* Calculate a mask for all bits beyond the contiguous bits. */
1246 mask
= (-1LL & ~(((1ULL << (tmp_length
+ tmp_pos
- 1)) << 1) - 1));
1251 if (tmp_length
+ tmp_pos
- 1 > size
)
1255 *length
= tmp_length
;
1263 /* Check whether we can (and want to) split a double-word
1264 move in mode MODE from SRC to DST into two single-word
1265 moves, moving the subword FIRST_SUBWORD first. */
1268 s390_split_ok_p (rtx dst
, rtx src
, enum machine_mode mode
, int first_subword
)
1270 /* Floating point registers cannot be split. */
1271 if (FP_REG_P (src
) || FP_REG_P (dst
))
1274 /* We don't need to split if operands are directly accessible. */
1275 if (s_operand (src
, mode
) || s_operand (dst
, mode
))
1278 /* Non-offsettable memory references cannot be split. */
1279 if ((GET_CODE (src
) == MEM
&& !offsettable_memref_p (src
))
1280 || (GET_CODE (dst
) == MEM
&& !offsettable_memref_p (dst
)))
1283 /* Moving the first subword must not clobber a register
1284 needed to move the second subword. */
1285 if (register_operand (dst
, mode
))
1287 rtx subreg
= operand_subword (dst
, first_subword
, 0, mode
);
1288 if (reg_overlap_mentioned_p (subreg
, src
))
1295 /* Return true if it can be proven that [MEM1, MEM1 + SIZE]
1296 and [MEM2, MEM2 + SIZE] do overlap and false
1300 s390_overlap_p (rtx mem1
, rtx mem2
, HOST_WIDE_INT size
)
1302 rtx addr1
, addr2
, addr_delta
;
1303 HOST_WIDE_INT delta
;
1305 if (GET_CODE (mem1
) != MEM
|| GET_CODE (mem2
) != MEM
)
1311 addr1
= XEXP (mem1
, 0);
1312 addr2
= XEXP (mem2
, 0);
1314 addr_delta
= simplify_binary_operation (MINUS
, Pmode
, addr2
, addr1
);
1316 /* This overlapping check is used by peepholes merging memory block operations.
1317 Overlapping operations would otherwise be recognized by the S/390 hardware
1318 and would fall back to a slower implementation. Allowing overlapping
1319 operations would lead to slow code but not to wrong code. Therefore we are
1320 somewhat optimistic if we cannot prove that the memory blocks are
1322 That's why we return false here although this may accept operations on
1323 overlapping memory areas. */
1324 if (!addr_delta
|| GET_CODE (addr_delta
) != CONST_INT
)
1327 delta
= INTVAL (addr_delta
);
1330 || (delta
> 0 && delta
< size
)
1331 || (delta
< 0 && -delta
< size
))
1337 /* Check whether the address of memory reference MEM2 equals exactly
1338 the address of memory reference MEM1 plus DELTA. Return true if
1339 we can prove this to be the case, false otherwise. */
1342 s390_offset_p (rtx mem1
, rtx mem2
, rtx delta
)
1344 rtx addr1
, addr2
, addr_delta
;
1346 if (GET_CODE (mem1
) != MEM
|| GET_CODE (mem2
) != MEM
)
1349 addr1
= XEXP (mem1
, 0);
1350 addr2
= XEXP (mem2
, 0);
1352 addr_delta
= simplify_binary_operation (MINUS
, Pmode
, addr2
, addr1
);
1353 if (!addr_delta
|| !rtx_equal_p (addr_delta
, delta
))
1359 /* Expand logical operator CODE in mode MODE with operands OPERANDS. */
1362 s390_expand_logical_operator (enum rtx_code code
, enum machine_mode mode
,
1365 enum machine_mode wmode
= mode
;
1366 rtx dst
= operands
[0];
1367 rtx src1
= operands
[1];
1368 rtx src2
= operands
[2];
1371 /* If we cannot handle the operation directly, use a temp register. */
1372 if (!s390_logical_operator_ok_p (operands
))
1373 dst
= gen_reg_rtx (mode
);
1375 /* QImode and HImode patterns make sense only if we have a destination
1376 in memory. Otherwise perform the operation in SImode. */
1377 if ((mode
== QImode
|| mode
== HImode
) && GET_CODE (dst
) != MEM
)
1380 /* Widen operands if required. */
1383 if (GET_CODE (dst
) == SUBREG
1384 && (tem
= simplify_subreg (wmode
, dst
, mode
, 0)) != 0)
1386 else if (REG_P (dst
))
1387 dst
= gen_rtx_SUBREG (wmode
, dst
, 0);
1389 dst
= gen_reg_rtx (wmode
);
1391 if (GET_CODE (src1
) == SUBREG
1392 && (tem
= simplify_subreg (wmode
, src1
, mode
, 0)) != 0)
1394 else if (GET_MODE (src1
) != VOIDmode
)
1395 src1
= gen_rtx_SUBREG (wmode
, force_reg (mode
, src1
), 0);
1397 if (GET_CODE (src2
) == SUBREG
1398 && (tem
= simplify_subreg (wmode
, src2
, mode
, 0)) != 0)
1400 else if (GET_MODE (src2
) != VOIDmode
)
1401 src2
= gen_rtx_SUBREG (wmode
, force_reg (mode
, src2
), 0);
1404 /* Emit the instruction. */
1405 op
= gen_rtx_SET (VOIDmode
, dst
, gen_rtx_fmt_ee (code
, wmode
, src1
, src2
));
1406 clob
= gen_rtx_CLOBBER (VOIDmode
, gen_rtx_REG (CCmode
, CC_REGNUM
));
1407 emit_insn (gen_rtx_PARALLEL (VOIDmode
, gen_rtvec (2, op
, clob
)));
1409 /* Fix up the destination if needed. */
1410 if (dst
!= operands
[0])
1411 emit_move_insn (operands
[0], gen_lowpart (mode
, dst
));
1414 /* Check whether OPERANDS are OK for a logical operation (AND, IOR, XOR). */
1417 s390_logical_operator_ok_p (rtx
*operands
)
1419 /* If the destination operand is in memory, it needs to coincide
1420 with one of the source operands. After reload, it has to be
1421 the first source operand. */
1422 if (GET_CODE (operands
[0]) == MEM
)
1423 return rtx_equal_p (operands
[0], operands
[1])
1424 || (!reload_completed
&& rtx_equal_p (operands
[0], operands
[2]));
1429 /* Narrow logical operation CODE of memory operand MEMOP with immediate
1430 operand IMMOP to switch from SS to SI type instructions. */
1433 s390_narrow_logical_operator (enum rtx_code code
, rtx
*memop
, rtx
*immop
)
1435 int def
= code
== AND
? -1 : 0;
1439 gcc_assert (GET_CODE (*memop
) == MEM
);
1440 gcc_assert (!MEM_VOLATILE_P (*memop
));
1442 mask
= s390_extract_part (*immop
, QImode
, def
);
1443 part
= s390_single_part (*immop
, GET_MODE (*memop
), QImode
, def
);
1444 gcc_assert (part
>= 0);
1446 *memop
= adjust_address (*memop
, QImode
, part
);
1447 *immop
= gen_int_mode (mask
, QImode
);
1451 /* How to allocate a 'struct machine_function'. */
1453 static struct machine_function
*
1454 s390_init_machine_status (void)
1456 return ggc_alloc_cleared_machine_function ();
1459 /* Change optimizations to be performed, depending on the
1462 LEVEL is the optimization level specified; 2 if `-O2' is
1463 specified, 1 if `-O' is specified, and 0 if neither is specified.
1465 SIZE is nonzero if `-Os' is specified and zero otherwise. */
1468 optimization_options (int level ATTRIBUTE_UNUSED
, int size ATTRIBUTE_UNUSED
)
1470 /* ??? There are apparently still problems with -fcaller-saves. */
1471 flag_caller_saves
= 0;
1473 /* By default, always emit DWARF-2 unwind info. This allows debugging
1474 without maintaining a stack frame back-chain. */
1475 flag_asynchronous_unwind_tables
= 1;
1477 /* Use MVCLE instructions to decrease code size if requested. */
1479 target_flags
|= MASK_MVCLE
;
1482 /* Return true if ARG is the name of a processor. Set *TYPE and *FLAGS
1483 to the associated processor_type and processor_flags if so. */
1486 s390_handle_arch_option (const char *arg
,
1487 enum processor_type
*type
,
1492 const char *const name
; /* processor name or nickname. */
1493 const enum processor_type processor
;
1494 const int flags
; /* From enum processor_flags. */
1496 const processor_alias_table
[] =
1498 {"g5", PROCESSOR_9672_G5
, PF_IEEE_FLOAT
},
1499 {"g6", PROCESSOR_9672_G6
, PF_IEEE_FLOAT
},
1500 {"z900", PROCESSOR_2064_Z900
, PF_IEEE_FLOAT
| PF_ZARCH
},
1501 {"z990", PROCESSOR_2084_Z990
, PF_IEEE_FLOAT
| PF_ZARCH
1502 | PF_LONG_DISPLACEMENT
},
1503 {"z9-109", PROCESSOR_2094_Z9_109
, PF_IEEE_FLOAT
| PF_ZARCH
1504 | PF_LONG_DISPLACEMENT
| PF_EXTIMM
},
1505 {"z9-ec", PROCESSOR_2094_Z9_109
, PF_IEEE_FLOAT
| PF_ZARCH
1506 | PF_LONG_DISPLACEMENT
| PF_EXTIMM
| PF_DFP
},
1507 {"z10", PROCESSOR_2097_Z10
, PF_IEEE_FLOAT
| PF_ZARCH
1508 | PF_LONG_DISPLACEMENT
| PF_EXTIMM
| PF_DFP
| PF_Z10
},
1512 for (i
= 0; i
< ARRAY_SIZE (processor_alias_table
); i
++)
1513 if (strcmp (arg
, processor_alias_table
[i
].name
) == 0)
1515 *type
= processor_alias_table
[i
].processor
;
1516 *flags
= processor_alias_table
[i
].flags
;
1522 /* Implement TARGET_HANDLE_OPTION. */
1525 s390_handle_option (size_t code
, const char *arg
, int value ATTRIBUTE_UNUSED
)
1530 return s390_handle_arch_option (arg
, &s390_arch
, &s390_arch_flags
);
1532 case OPT_mstack_guard_
:
1533 if (sscanf (arg
, HOST_WIDE_INT_PRINT_DEC
, &s390_stack_guard
) != 1)
1535 if (exact_log2 (s390_stack_guard
) == -1)
1536 error ("stack guard value must be an exact power of 2");
1539 case OPT_mstack_size_
:
1540 if (sscanf (arg
, HOST_WIDE_INT_PRINT_DEC
, &s390_stack_size
) != 1)
1542 if (exact_log2 (s390_stack_size
) == -1)
1543 error ("stack size must be an exact power of 2");
1547 return s390_handle_arch_option (arg
, &s390_tune
, &s390_tune_flags
);
1549 case OPT_mwarn_framesize_
:
1550 return sscanf (arg
, HOST_WIDE_INT_PRINT_DEC
, &s390_warn_framesize
) == 1;
1558 override_options (void)
1560 /* Set up function hooks. */
1561 init_machine_status
= s390_init_machine_status
;
1563 /* Architecture mode defaults according to ABI. */
1564 if (!(target_flags_explicit
& MASK_ZARCH
))
1567 target_flags
|= MASK_ZARCH
;
1569 target_flags
&= ~MASK_ZARCH
;
1572 /* Determine processor architectural level. */
1573 if (!s390_arch_string
)
1575 s390_arch_string
= TARGET_ZARCH
? "z900" : "g5";
1576 s390_handle_arch_option (s390_arch_string
, &s390_arch
, &s390_arch_flags
);
1579 /* Determine processor to tune for. */
1580 if (s390_tune
== PROCESSOR_max
)
1582 s390_tune
= s390_arch
;
1583 s390_tune_flags
= s390_arch_flags
;
1586 /* Sanity checks. */
1587 if (TARGET_ZARCH
&& !TARGET_CPU_ZARCH
)
1588 error ("z/Architecture mode not supported on %s", s390_arch_string
);
1589 if (TARGET_64BIT
&& !TARGET_ZARCH
)
1590 error ("64-bit ABI not supported in ESA/390 mode");
1592 if (TARGET_HARD_DFP
&& !TARGET_DFP
)
1594 if (target_flags_explicit
& MASK_HARD_DFP
)
1596 if (!TARGET_CPU_DFP
)
1597 error ("Hardware decimal floating point instructions"
1598 " not available on %s", s390_arch_string
);
1600 error ("Hardware decimal floating point instructions"
1601 " not available in ESA/390 mode");
1604 target_flags
&= ~MASK_HARD_DFP
;
1607 if ((target_flags_explicit
& MASK_SOFT_FLOAT
) && TARGET_SOFT_FLOAT
)
1609 if ((target_flags_explicit
& MASK_HARD_DFP
) && TARGET_HARD_DFP
)
1610 error ("-mhard-dfp can't be used in conjunction with -msoft-float");
1612 target_flags
&= ~MASK_HARD_DFP
;
1615 /* Set processor cost function. */
1618 case PROCESSOR_2084_Z990
:
1619 s390_cost
= &z990_cost
;
1621 case PROCESSOR_2094_Z9_109
:
1622 s390_cost
= &z9_109_cost
;
1624 case PROCESSOR_2097_Z10
:
1625 s390_cost
= &z10_cost
;
1628 s390_cost
= &z900_cost
;
1631 if (TARGET_BACKCHAIN
&& TARGET_PACKED_STACK
&& TARGET_HARD_FLOAT
)
1632 error ("-mbackchain -mpacked-stack -mhard-float are not supported "
1635 if (s390_stack_size
)
1637 if (s390_stack_guard
>= s390_stack_size
)
1638 error ("stack size must be greater than the stack guard value");
1639 else if (s390_stack_size
> 1 << 16)
1640 error ("stack size must not be greater than 64k");
1642 else if (s390_stack_guard
)
1643 error ("-mstack-guard implies use of -mstack-size");
1645 #ifdef TARGET_DEFAULT_LONG_DOUBLE_128
1646 if (!(target_flags_explicit
& MASK_LONG_DOUBLE_128
))
1647 target_flags
|= MASK_LONG_DOUBLE_128
;
1650 if (s390_tune
== PROCESSOR_2097_Z10
)
1652 if (!PARAM_SET_P (PARAM_MAX_UNROLLED_INSNS
))
1653 set_param_value ("max-unrolled-insns", 100);
1654 if (!PARAM_SET_P (PARAM_MAX_UNROLL_TIMES
))
1655 set_param_value ("max-unroll-times", 32);
1656 if (!PARAM_SET_P (PARAM_MAX_COMPLETELY_PEELED_INSNS
))
1657 set_param_value ("max-completely-peeled-insns", 2000);
1658 if (!PARAM_SET_P (PARAM_MAX_COMPLETELY_PEEL_TIMES
))
1659 set_param_value ("max-completely-peel-times", 64);
1662 set_param_value ("max-pending-list-length", 256);
1663 /* values for loop prefetching */
1664 set_param_value ("l1-cache-line-size", 256);
1665 if (!PARAM_SET_P (PARAM_L1_CACHE_SIZE
))
1666 set_param_value ("l1-cache-size", 128);
1667 /* s390 has more than 2 levels and the size is much larger. Since
1668 we are always running virtualized assume that we only get a small
1669 part of the caches above l1. */
1670 if (!PARAM_SET_P (PARAM_L2_CACHE_SIZE
))
1671 set_param_value ("l2-cache-size", 1500);
1672 if (!PARAM_SET_P (PARAM_PREFETCH_MIN_INSN_TO_MEM_RATIO
))
1673 set_param_value ("prefetch-min-insn-to-mem-ratio", 2);
1674 if (!PARAM_SET_P (PARAM_SIMULTANEOUS_PREFETCHES
))
1675 set_param_value ("simultaneous-prefetches", 6);
1677 /* This cannot reside in optimization_options since HAVE_prefetch
1678 requires the arch flags to be evaluated already. */
1679 if (HAVE_prefetch
&& optimize
>= 3)
1680 flag_prefetch_loop_arrays
= 1;
1683 /* Map for smallest class containing reg regno. */
1685 const enum reg_class regclass_map
[FIRST_PSEUDO_REGISTER
] =
1686 { GENERAL_REGS
, ADDR_REGS
, ADDR_REGS
, ADDR_REGS
,
1687 ADDR_REGS
, ADDR_REGS
, ADDR_REGS
, ADDR_REGS
,
1688 ADDR_REGS
, ADDR_REGS
, ADDR_REGS
, ADDR_REGS
,
1689 ADDR_REGS
, ADDR_REGS
, ADDR_REGS
, ADDR_REGS
,
1690 FP_REGS
, FP_REGS
, FP_REGS
, FP_REGS
,
1691 FP_REGS
, FP_REGS
, FP_REGS
, FP_REGS
,
1692 FP_REGS
, FP_REGS
, FP_REGS
, FP_REGS
,
1693 FP_REGS
, FP_REGS
, FP_REGS
, FP_REGS
,
1694 ADDR_REGS
, CC_REGS
, ADDR_REGS
, ADDR_REGS
,
1695 ACCESS_REGS
, ACCESS_REGS
1698 /* Return attribute type of insn. */
1700 static enum attr_type
1701 s390_safe_attr_type (rtx insn
)
1703 if (recog_memoized (insn
) >= 0)
1704 return get_attr_type (insn
);
1709 /* Return true if DISP is a valid short displacement. */
1712 s390_short_displacement (rtx disp
)
1714 /* No displacement is OK. */
1718 /* Without the long displacement facility we don't need to
1719 distingiush between long and short displacement. */
1720 if (!TARGET_LONG_DISPLACEMENT
)
1723 /* Integer displacement in range. */
1724 if (GET_CODE (disp
) == CONST_INT
)
1725 return INTVAL (disp
) >= 0 && INTVAL (disp
) < 4096;
1727 /* GOT offset is not OK, the GOT can be large. */
1728 if (GET_CODE (disp
) == CONST
1729 && GET_CODE (XEXP (disp
, 0)) == UNSPEC
1730 && (XINT (XEXP (disp
, 0), 1) == UNSPEC_GOT
1731 || XINT (XEXP (disp
, 0), 1) == UNSPEC_GOTNTPOFF
))
1734 /* All other symbolic constants are literal pool references,
1735 which are OK as the literal pool must be small. */
1736 if (GET_CODE (disp
) == CONST
)
1742 /* Decompose a RTL expression ADDR for a memory address into
1743 its components, returned in OUT.
1745 Returns false if ADDR is not a valid memory address, true
1746 otherwise. If OUT is NULL, don't return the components,
1747 but check for validity only.
1749 Note: Only addresses in canonical form are recognized.
1750 LEGITIMIZE_ADDRESS should convert non-canonical forms to the
1751 canonical form so that they will be recognized. */
1754 s390_decompose_address (rtx addr
, struct s390_address
*out
)
1756 HOST_WIDE_INT offset
= 0;
1757 rtx base
= NULL_RTX
;
1758 rtx indx
= NULL_RTX
;
1759 rtx disp
= NULL_RTX
;
1761 bool pointer
= false;
1762 bool base_ptr
= false;
1763 bool indx_ptr
= false;
1764 bool literal_pool
= false;
1766 /* We may need to substitute the literal pool base register into the address
1767 below. However, at this point we do not know which register is going to
1768 be used as base, so we substitute the arg pointer register. This is going
1769 to be treated as holding a pointer below -- it shouldn't be used for any
1771 rtx fake_pool_base
= gen_rtx_REG (Pmode
, ARG_POINTER_REGNUM
);
1773 /* Decompose address into base + index + displacement. */
1775 if (GET_CODE (addr
) == REG
|| GET_CODE (addr
) == UNSPEC
)
1778 else if (GET_CODE (addr
) == PLUS
)
1780 rtx op0
= XEXP (addr
, 0);
1781 rtx op1
= XEXP (addr
, 1);
1782 enum rtx_code code0
= GET_CODE (op0
);
1783 enum rtx_code code1
= GET_CODE (op1
);
1785 if (code0
== REG
|| code0
== UNSPEC
)
1787 if (code1
== REG
|| code1
== UNSPEC
)
1789 indx
= op0
; /* index + base */
1795 base
= op0
; /* base + displacement */
1800 else if (code0
== PLUS
)
1802 indx
= XEXP (op0
, 0); /* index + base + disp */
1803 base
= XEXP (op0
, 1);
1814 disp
= addr
; /* displacement */
1816 /* Extract integer part of displacement. */
1820 if (GET_CODE (disp
) == CONST_INT
)
1822 offset
= INTVAL (disp
);
1825 else if (GET_CODE (disp
) == CONST
1826 && GET_CODE (XEXP (disp
, 0)) == PLUS
1827 && GET_CODE (XEXP (XEXP (disp
, 0), 1)) == CONST_INT
)
1829 offset
= INTVAL (XEXP (XEXP (disp
, 0), 1));
1830 disp
= XEXP (XEXP (disp
, 0), 0);
1834 /* Strip off CONST here to avoid special case tests later. */
1835 if (disp
&& GET_CODE (disp
) == CONST
)
1836 disp
= XEXP (disp
, 0);
1838 /* We can convert literal pool addresses to
1839 displacements by basing them off the base register. */
1840 if (disp
&& GET_CODE (disp
) == SYMBOL_REF
&& CONSTANT_POOL_ADDRESS_P (disp
))
1842 /* Either base or index must be free to hold the base register. */
1844 base
= fake_pool_base
, literal_pool
= true;
1846 indx
= fake_pool_base
, literal_pool
= true;
1850 /* Mark up the displacement. */
1851 disp
= gen_rtx_UNSPEC (Pmode
, gen_rtvec (1, disp
),
1852 UNSPEC_LTREL_OFFSET
);
1855 /* Validate base register. */
1858 if (GET_CODE (base
) == UNSPEC
)
1859 switch (XINT (base
, 1))
1863 disp
= gen_rtx_UNSPEC (Pmode
,
1864 gen_rtvec (1, XVECEXP (base
, 0, 0)),
1865 UNSPEC_LTREL_OFFSET
);
1869 base
= XVECEXP (base
, 0, 1);
1872 case UNSPEC_LTREL_BASE
:
1873 if (XVECLEN (base
, 0) == 1)
1874 base
= fake_pool_base
, literal_pool
= true;
1876 base
= XVECEXP (base
, 0, 1);
1884 || (GET_MODE (base
) != SImode
1885 && GET_MODE (base
) != Pmode
))
1888 if (REGNO (base
) == STACK_POINTER_REGNUM
1889 || REGNO (base
) == FRAME_POINTER_REGNUM
1890 || ((reload_completed
|| reload_in_progress
)
1891 && frame_pointer_needed
1892 && REGNO (base
) == HARD_FRAME_POINTER_REGNUM
)
1893 || REGNO (base
) == ARG_POINTER_REGNUM
1895 && REGNO (base
) == PIC_OFFSET_TABLE_REGNUM
))
1896 pointer
= base_ptr
= true;
1898 if ((reload_completed
|| reload_in_progress
)
1899 && base
== cfun
->machine
->base_reg
)
1900 pointer
= base_ptr
= literal_pool
= true;
1903 /* Validate index register. */
1906 if (GET_CODE (indx
) == UNSPEC
)
1907 switch (XINT (indx
, 1))
1911 disp
= gen_rtx_UNSPEC (Pmode
,
1912 gen_rtvec (1, XVECEXP (indx
, 0, 0)),
1913 UNSPEC_LTREL_OFFSET
);
1917 indx
= XVECEXP (indx
, 0, 1);
1920 case UNSPEC_LTREL_BASE
:
1921 if (XVECLEN (indx
, 0) == 1)
1922 indx
= fake_pool_base
, literal_pool
= true;
1924 indx
= XVECEXP (indx
, 0, 1);
1932 || (GET_MODE (indx
) != SImode
1933 && GET_MODE (indx
) != Pmode
))
1936 if (REGNO (indx
) == STACK_POINTER_REGNUM
1937 || REGNO (indx
) == FRAME_POINTER_REGNUM
1938 || ((reload_completed
|| reload_in_progress
)
1939 && frame_pointer_needed
1940 && REGNO (indx
) == HARD_FRAME_POINTER_REGNUM
)
1941 || REGNO (indx
) == ARG_POINTER_REGNUM
1943 && REGNO (indx
) == PIC_OFFSET_TABLE_REGNUM
))
1944 pointer
= indx_ptr
= true;
1946 if ((reload_completed
|| reload_in_progress
)
1947 && indx
== cfun
->machine
->base_reg
)
1948 pointer
= indx_ptr
= literal_pool
= true;
1951 /* Prefer to use pointer as base, not index. */
1952 if (base
&& indx
&& !base_ptr
1953 && (indx_ptr
|| (!REG_POINTER (base
) && REG_POINTER (indx
))))
1960 /* Validate displacement. */
1963 /* If virtual registers are involved, the displacement will change later
1964 anyway as the virtual registers get eliminated. This could make a
1965 valid displacement invalid, but it is more likely to make an invalid
1966 displacement valid, because we sometimes access the register save area
1967 via negative offsets to one of those registers.
1968 Thus we don't check the displacement for validity here. If after
1969 elimination the displacement turns out to be invalid after all,
1970 this is fixed up by reload in any case. */
1971 if (base
!= arg_pointer_rtx
1972 && indx
!= arg_pointer_rtx
1973 && base
!= return_address_pointer_rtx
1974 && indx
!= return_address_pointer_rtx
1975 && base
!= frame_pointer_rtx
1976 && indx
!= frame_pointer_rtx
1977 && base
!= virtual_stack_vars_rtx
1978 && indx
!= virtual_stack_vars_rtx
)
1979 if (!DISP_IN_RANGE (offset
))
1984 /* All the special cases are pointers. */
1987 /* In the small-PIC case, the linker converts @GOT
1988 and @GOTNTPOFF offsets to possible displacements. */
1989 if (GET_CODE (disp
) == UNSPEC
1990 && (XINT (disp
, 1) == UNSPEC_GOT
1991 || XINT (disp
, 1) == UNSPEC_GOTNTPOFF
)
1997 /* Accept pool label offsets. */
1998 else if (GET_CODE (disp
) == UNSPEC
1999 && XINT (disp
, 1) == UNSPEC_POOL_OFFSET
)
2002 /* Accept literal pool references. */
2003 else if (GET_CODE (disp
) == UNSPEC
2004 && XINT (disp
, 1) == UNSPEC_LTREL_OFFSET
)
2006 orig_disp
= gen_rtx_CONST (Pmode
, disp
);
2009 /* If we have an offset, make sure it does not
2010 exceed the size of the constant pool entry. */
2011 rtx sym
= XVECEXP (disp
, 0, 0);
2012 if (offset
>= GET_MODE_SIZE (get_pool_mode (sym
)))
2015 orig_disp
= plus_constant (orig_disp
, offset
);
2030 out
->disp
= orig_disp
;
2031 out
->pointer
= pointer
;
2032 out
->literal_pool
= literal_pool
;
2038 /* Decompose a RTL expression OP for a shift count into its components,
2039 and return the base register in BASE and the offset in OFFSET.
2041 Return true if OP is a valid shift count, false if not. */
2044 s390_decompose_shift_count (rtx op
, rtx
*base
, HOST_WIDE_INT
*offset
)
2046 HOST_WIDE_INT off
= 0;
2048 /* We can have an integer constant, an address register,
2049 or a sum of the two. */
2050 if (GET_CODE (op
) == CONST_INT
)
2055 if (op
&& GET_CODE (op
) == PLUS
&& GET_CODE (XEXP (op
, 1)) == CONST_INT
)
2057 off
= INTVAL (XEXP (op
, 1));
2060 while (op
&& GET_CODE (op
) == SUBREG
)
2061 op
= SUBREG_REG (op
);
2063 if (op
&& GET_CODE (op
) != REG
)
2075 /* Return true if CODE is a valid address without index. */
2078 s390_legitimate_address_without_index_p (rtx op
)
2080 struct s390_address addr
;
2082 if (!s390_decompose_address (XEXP (op
, 0), &addr
))
2091 /* Return true if ADDR is of kind symbol_ref or symbol_ref + const_int
2092 and return these parts in SYMREF and ADDEND. You can pass NULL in
2093 SYMREF and/or ADDEND if you are not interested in these values. */
2096 s390_symref_operand_p (rtx addr
, rtx
*symref
, HOST_WIDE_INT
*addend
)
2098 HOST_WIDE_INT tmpaddend
= 0;
2100 if (GET_CODE (addr
) == CONST
)
2101 addr
= XEXP (addr
, 0);
2103 if (GET_CODE (addr
) == PLUS
)
2105 if (GET_CODE (XEXP (addr
, 0)) == SYMBOL_REF
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
)
2121 *addend
= tmpaddend
;
2127 /* Return true if the address in OP is valid for constraint letter C
2128 if wrapped in a MEM rtx. Set LIT_POOL_OK to true if it literal
2129 pool MEMs should be accepted. Only the Q, R, S, T constraint
2130 letters are allowed for C. */
2133 s390_check_qrst_address (char c
, rtx op
, bool lit_pool_ok
)
2135 struct s390_address addr
;
2136 bool decomposed
= false;
2138 /* This check makes sure that no symbolic address (except literal
2139 pool references) are accepted by the R or T constraints. */
2140 if (s390_symref_operand_p (op
, NULL
, NULL
))
2144 if (!s390_decompose_address (op
, &addr
))
2146 if (!addr
.literal_pool
)
2153 case 'Q': /* no index short displacement */
2154 if (!decomposed
&& !s390_decompose_address (op
, &addr
))
2158 if (!s390_short_displacement (addr
.disp
))
2162 case 'R': /* with index short displacement */
2163 if (TARGET_LONG_DISPLACEMENT
)
2165 if (!decomposed
&& !s390_decompose_address (op
, &addr
))
2167 if (!s390_short_displacement (addr
.disp
))
2170 /* Any invalid address here will be fixed up by reload,
2171 so accept it for the most generic constraint. */
2174 case 'S': /* no index long displacement */
2175 if (!TARGET_LONG_DISPLACEMENT
)
2177 if (!decomposed
&& !s390_decompose_address (op
, &addr
))
2181 if (s390_short_displacement (addr
.disp
))
2185 case 'T': /* with index long displacement */
2186 if (!TARGET_LONG_DISPLACEMENT
)
2188 /* Any invalid address here will be fixed up by reload,
2189 so accept it for the most generic constraint. */
2190 if ((decomposed
|| s390_decompose_address (op
, &addr
))
2191 && s390_short_displacement (addr
.disp
))
2201 /* Evaluates constraint strings described by the regular expression
2202 ([A|B|Z](Q|R|S|T))|U|W|Y and returns 1 if OP is a valid operand for
2203 the constraint given in STR, or 0 else. */
2206 s390_mem_constraint (const char *str
, rtx op
)
2213 /* Check for offsettable variants of memory constraints. */
2214 if (!MEM_P (op
) || MEM_VOLATILE_P (op
))
2216 if ((reload_completed
|| reload_in_progress
)
2217 ? !offsettable_memref_p (op
) : !offsettable_nonstrict_memref_p (op
))
2219 return s390_check_qrst_address (str
[1], XEXP (op
, 0), true);
2221 /* Check for non-literal-pool variants of memory constraints. */
2224 return s390_check_qrst_address (str
[1], XEXP (op
, 0), false);
2229 if (GET_CODE (op
) != MEM
)
2231 return s390_check_qrst_address (c
, XEXP (op
, 0), true);
2233 return (s390_check_qrst_address ('Q', op
, true)
2234 || s390_check_qrst_address ('R', op
, true));
2236 return (s390_check_qrst_address ('S', op
, true)
2237 || s390_check_qrst_address ('T', op
, true));
2239 /* Simply check for the basic form of a shift count. Reload will
2240 take care of making sure we have a proper base register. */
2241 if (!s390_decompose_shift_count (op
, NULL
, NULL
))
2245 return s390_check_qrst_address (str
[1], op
, true);
2253 /* Evaluates constraint strings starting with letter O. Input
2254 parameter C is the second letter following the "O" in the constraint
2255 string. Returns 1 if VALUE meets the respective constraint and 0
2259 s390_O_constraint_str (const char c
, HOST_WIDE_INT value
)
2267 return trunc_int_for_mode (value
, SImode
) == value
;
2271 || s390_single_part (GEN_INT (value
), DImode
, SImode
, 0) == 1;
2274 return s390_single_part (GEN_INT (value
- 1), DImode
, SImode
, -1) == 1;
2282 /* Evaluates constraint strings starting with letter N. Parameter STR
2283 contains the letters following letter "N" in the constraint string.
2284 Returns true if VALUE matches the constraint. */
2287 s390_N_constraint_str (const char *str
, HOST_WIDE_INT value
)
2289 enum machine_mode mode
, part_mode
;
2291 int part
, part_goal
;
2297 part_goal
= str
[0] - '0';
2341 if (GET_MODE_SIZE (mode
) <= GET_MODE_SIZE (part_mode
))
2344 part
= s390_single_part (GEN_INT (value
), mode
, part_mode
, def
);
2347 if (part_goal
!= -1 && part_goal
!= part
)
2354 /* Returns true if the input parameter VALUE is a float zero. */
2357 s390_float_const_zero_p (rtx value
)
2359 return (GET_MODE_CLASS (GET_MODE (value
)) == MODE_FLOAT
2360 && value
== CONST0_RTX (GET_MODE (value
)));
2364 /* Compute a (partial) cost for rtx X. Return true if the complete
2365 cost has been computed, and false if subexpressions should be
2366 scanned. In either case, *TOTAL contains the cost result.
2367 CODE contains GET_CODE (x), OUTER_CODE contains the code
2368 of the superexpression of x. */
2371 s390_rtx_costs (rtx x
, int code
, int outer_code
, int *total
,
2372 bool speed ATTRIBUTE_UNUSED
)
2395 *total
= COSTS_N_INSNS (1);
2400 /* Check for multiply and add. */
2401 if ((GET_MODE (x
) == DFmode
|| GET_MODE (x
) == SFmode
)
2402 && GET_CODE (XEXP (x
, 0)) == MULT
2403 && TARGET_HARD_FLOAT
&& TARGET_FUSED_MADD
)
2405 /* This is the multiply and add case. */
2406 if (GET_MODE (x
) == DFmode
)
2407 *total
= s390_cost
->madbr
;
2409 *total
= s390_cost
->maebr
;
2410 *total
+= (rtx_cost (XEXP (XEXP (x
, 0), 0), MULT
, speed
)
2411 + rtx_cost (XEXP (XEXP (x
, 0), 1), MULT
, speed
)
2412 + rtx_cost (XEXP (x
, 1), (enum rtx_code
) code
, speed
));
2413 return true; /* Do not do an additional recursive descent. */
2415 *total
= COSTS_N_INSNS (1);
2419 switch (GET_MODE (x
))
2423 rtx left
= XEXP (x
, 0);
2424 rtx right
= XEXP (x
, 1);
2425 if (GET_CODE (right
) == CONST_INT
2426 && CONST_OK_FOR_K (INTVAL (right
)))
2427 *total
= s390_cost
->mhi
;
2428 else if (GET_CODE (left
) == SIGN_EXTEND
)
2429 *total
= s390_cost
->mh
;
2431 *total
= s390_cost
->ms
; /* msr, ms, msy */
2436 rtx left
= XEXP (x
, 0);
2437 rtx right
= XEXP (x
, 1);
2440 if (GET_CODE (right
) == CONST_INT
2441 && CONST_OK_FOR_K (INTVAL (right
)))
2442 *total
= s390_cost
->mghi
;
2443 else if (GET_CODE (left
) == SIGN_EXTEND
)
2444 *total
= s390_cost
->msgf
;
2446 *total
= s390_cost
->msg
; /* msgr, msg */
2448 else /* TARGET_31BIT */
2450 if (GET_CODE (left
) == SIGN_EXTEND
2451 && GET_CODE (right
) == SIGN_EXTEND
)
2452 /* mulsidi case: mr, m */
2453 *total
= s390_cost
->m
;
2454 else if (GET_CODE (left
) == ZERO_EXTEND
2455 && GET_CODE (right
) == ZERO_EXTEND
2456 && TARGET_CPU_ZARCH
)
2457 /* umulsidi case: ml, mlr */
2458 *total
= s390_cost
->ml
;
2460 /* Complex calculation is required. */
2461 *total
= COSTS_N_INSNS (40);
2467 *total
= s390_cost
->mult_df
;
2470 *total
= s390_cost
->mxbr
;
2479 if (GET_MODE (x
) == TImode
) /* 128 bit division */
2480 *total
= s390_cost
->dlgr
;
2481 else if (GET_MODE (x
) == DImode
)
2483 rtx right
= XEXP (x
, 1);
2484 if (GET_CODE (right
) == ZERO_EXTEND
) /* 64 by 32 bit division */
2485 *total
= s390_cost
->dlr
;
2486 else /* 64 by 64 bit division */
2487 *total
= s390_cost
->dlgr
;
2489 else if (GET_MODE (x
) == SImode
) /* 32 bit division */
2490 *total
= s390_cost
->dlr
;
2495 if (GET_MODE (x
) == DImode
)
2497 rtx right
= XEXP (x
, 1);
2498 if (GET_CODE (right
) == ZERO_EXTEND
) /* 64 by 32 bit division */
2500 *total
= s390_cost
->dsgfr
;
2502 *total
= s390_cost
->dr
;
2503 else /* 64 by 64 bit division */
2504 *total
= s390_cost
->dsgr
;
2506 else if (GET_MODE (x
) == SImode
) /* 32 bit division */
2507 *total
= s390_cost
->dlr
;
2508 else if (GET_MODE (x
) == SFmode
)
2510 *total
= s390_cost
->debr
;
2512 else if (GET_MODE (x
) == DFmode
)
2514 *total
= s390_cost
->ddbr
;
2516 else if (GET_MODE (x
) == TFmode
)
2518 *total
= s390_cost
->dxbr
;
2523 if (GET_MODE (x
) == SFmode
)
2524 *total
= s390_cost
->sqebr
;
2525 else if (GET_MODE (x
) == DFmode
)
2526 *total
= s390_cost
->sqdbr
;
2528 *total
= s390_cost
->sqxbr
;
2533 if (outer_code
== MULT
|| outer_code
== DIV
|| outer_code
== MOD
2534 || outer_code
== PLUS
|| outer_code
== MINUS
2535 || outer_code
== COMPARE
)
2540 *total
= COSTS_N_INSNS (1);
2541 if (GET_CODE (XEXP (x
, 0)) == AND
2542 && GET_CODE (XEXP (x
, 1)) == CONST_INT
2543 && GET_CODE (XEXP (XEXP (x
, 0), 1)) == CONST_INT
)
2545 rtx op0
= XEXP (XEXP (x
, 0), 0);
2546 rtx op1
= XEXP (XEXP (x
, 0), 1);
2547 rtx op2
= XEXP (x
, 1);
2549 if (memory_operand (op0
, GET_MODE (op0
))
2550 && s390_tm_ccmode (op1
, op2
, 0) != VOIDmode
)
2552 if (register_operand (op0
, GET_MODE (op0
))
2553 && s390_tm_ccmode (op1
, op2
, 1) != VOIDmode
)
2563 /* Return the cost of an address rtx ADDR. */
2566 s390_address_cost (rtx addr
, bool speed ATTRIBUTE_UNUSED
)
2568 struct s390_address ad
;
2569 if (!s390_decompose_address (addr
, &ad
))
2572 return ad
.indx
? COSTS_N_INSNS (1) + 1 : COSTS_N_INSNS (1);
2575 /* If OP is a SYMBOL_REF of a thread-local symbol, return its TLS mode,
2576 otherwise return 0. */
2579 tls_symbolic_operand (rtx op
)
2581 if (GET_CODE (op
) != SYMBOL_REF
)
2583 return SYMBOL_REF_TLS_MODEL (op
);
2586 /* Split DImode access register reference REG (on 64-bit) into its constituent
2587 low and high parts, and store them into LO and HI. Note that gen_lowpart/
2588 gen_highpart cannot be used as they assume all registers are word-sized,
2589 while our access registers have only half that size. */
2592 s390_split_access_reg (rtx reg
, rtx
*lo
, rtx
*hi
)
2594 gcc_assert (TARGET_64BIT
);
2595 gcc_assert (ACCESS_REG_P (reg
));
2596 gcc_assert (GET_MODE (reg
) == DImode
);
2597 gcc_assert (!(REGNO (reg
) & 1));
2599 *lo
= gen_rtx_REG (SImode
, REGNO (reg
) + 1);
2600 *hi
= gen_rtx_REG (SImode
, REGNO (reg
));
2603 /* Return true if OP contains a symbol reference */
2606 symbolic_reference_mentioned_p (rtx op
)
2611 if (GET_CODE (op
) == SYMBOL_REF
|| GET_CODE (op
) == LABEL_REF
)
2614 fmt
= GET_RTX_FORMAT (GET_CODE (op
));
2615 for (i
= GET_RTX_LENGTH (GET_CODE (op
)) - 1; i
>= 0; i
--)
2621 for (j
= XVECLEN (op
, i
) - 1; j
>= 0; j
--)
2622 if (symbolic_reference_mentioned_p (XVECEXP (op
, i
, j
)))
2626 else if (fmt
[i
] == 'e' && symbolic_reference_mentioned_p (XEXP (op
, i
)))
2633 /* Return true if OP contains a reference to a thread-local symbol. */
2636 tls_symbolic_reference_mentioned_p (rtx op
)
2641 if (GET_CODE (op
) == SYMBOL_REF
)
2642 return tls_symbolic_operand (op
);
2644 fmt
= GET_RTX_FORMAT (GET_CODE (op
));
2645 for (i
= GET_RTX_LENGTH (GET_CODE (op
)) - 1; i
>= 0; i
--)
2651 for (j
= XVECLEN (op
, i
) - 1; j
>= 0; j
--)
2652 if (tls_symbolic_reference_mentioned_p (XVECEXP (op
, i
, j
)))
2656 else if (fmt
[i
] == 'e' && tls_symbolic_reference_mentioned_p (XEXP (op
, i
)))
2664 /* Return true if OP is a legitimate general operand when
2665 generating PIC code. It is given that flag_pic is on
2666 and that OP satisfies CONSTANT_P or is a CONST_DOUBLE. */
2669 legitimate_pic_operand_p (rtx op
)
2671 /* Accept all non-symbolic constants. */
2672 if (!SYMBOLIC_CONST (op
))
2675 /* Reject everything else; must be handled
2676 via emit_symbolic_move. */
2680 /* Returns true if the constant value OP is a legitimate general operand.
2681 It is given that OP satisfies CONSTANT_P or is a CONST_DOUBLE. */
2684 legitimate_constant_p (rtx op
)
2686 /* Accept all non-symbolic constants. */
2687 if (!SYMBOLIC_CONST (op
))
2690 /* Accept immediate LARL operands. */
2691 if (TARGET_CPU_ZARCH
&& larl_operand (op
, VOIDmode
))
2694 /* Thread-local symbols are never legal constants. This is
2695 so that emit_call knows that computing such addresses
2696 might require a function call. */
2697 if (TLS_SYMBOLIC_CONST (op
))
2700 /* In the PIC case, symbolic constants must *not* be
2701 forced into the literal pool. We accept them here,
2702 so that they will be handled by emit_symbolic_move. */
2706 /* All remaining non-PIC symbolic constants are
2707 forced into the literal pool. */
2711 /* Determine if it's legal to put X into the constant pool. This
2712 is not possible if X contains the address of a symbol that is
2713 not constant (TLS) or not known at final link time (PIC). */
2716 s390_cannot_force_const_mem (rtx x
)
2718 switch (GET_CODE (x
))
2722 /* Accept all non-symbolic constants. */
2726 /* Labels are OK iff we are non-PIC. */
2727 return flag_pic
!= 0;
2730 /* 'Naked' TLS symbol references are never OK,
2731 non-TLS symbols are OK iff we are non-PIC. */
2732 if (tls_symbolic_operand (x
))
2735 return flag_pic
!= 0;
2738 return s390_cannot_force_const_mem (XEXP (x
, 0));
2741 return s390_cannot_force_const_mem (XEXP (x
, 0))
2742 || s390_cannot_force_const_mem (XEXP (x
, 1));
2745 switch (XINT (x
, 1))
2747 /* Only lt-relative or GOT-relative UNSPECs are OK. */
2748 case UNSPEC_LTREL_OFFSET
:
2756 case UNSPEC_GOTNTPOFF
:
2757 case UNSPEC_INDNTPOFF
:
2760 /* If the literal pool shares the code section, be put
2761 execute template placeholders into the pool as well. */
2763 return TARGET_CPU_ZARCH
;
2775 /* Returns true if the constant value OP is a legitimate general
2776 operand during and after reload. The difference to
2777 legitimate_constant_p is that this function will not accept
2778 a constant that would need to be forced to the literal pool
2779 before it can be used as operand. */
2782 legitimate_reload_constant_p (rtx op
)
2784 /* Accept la(y) operands. */
2785 if (GET_CODE (op
) == CONST_INT
2786 && DISP_IN_RANGE (INTVAL (op
)))
2789 /* Accept l(g)hi/l(g)fi operands. */
2790 if (GET_CODE (op
) == CONST_INT
2791 && (CONST_OK_FOR_K (INTVAL (op
)) || CONST_OK_FOR_Os (INTVAL (op
))))
2794 /* Accept lliXX operands. */
2796 && GET_CODE (op
) == CONST_INT
2797 && trunc_int_for_mode (INTVAL (op
), word_mode
) == INTVAL (op
)
2798 && s390_single_part (op
, word_mode
, HImode
, 0) >= 0)
2802 && GET_CODE (op
) == CONST_INT
2803 && trunc_int_for_mode (INTVAL (op
), word_mode
) == INTVAL (op
)
2804 && s390_single_part (op
, word_mode
, SImode
, 0) >= 0)
2807 /* Accept larl operands. */
2808 if (TARGET_CPU_ZARCH
2809 && larl_operand (op
, VOIDmode
))
2812 /* Accept double-word operands that can be split. */
2813 if (GET_CODE (op
) == CONST_INT
2814 && trunc_int_for_mode (INTVAL (op
), word_mode
) != INTVAL (op
))
2816 enum machine_mode dword_mode
= word_mode
== SImode
? DImode
: TImode
;
2817 rtx hi
= operand_subword (op
, 0, 0, dword_mode
);
2818 rtx lo
= operand_subword (op
, 1, 0, dword_mode
);
2819 return legitimate_reload_constant_p (hi
)
2820 && legitimate_reload_constant_p (lo
);
2823 /* Everything else cannot be handled without reload. */
2827 /* Given an rtx OP being reloaded into a reg required to be in class RCLASS,
2828 return the class of reg to actually use. */
2831 s390_preferred_reload_class (rtx op
, enum reg_class rclass
)
2833 switch (GET_CODE (op
))
2835 /* Constants we cannot reload must be forced into the
2840 if (legitimate_reload_constant_p (op
))
2845 /* If a symbolic constant or a PLUS is reloaded,
2846 it is most likely being used as an address, so
2847 prefer ADDR_REGS. If 'class' is not a superset
2848 of ADDR_REGS, e.g. FP_REGS, reject this reload. */
2853 if (reg_class_subset_p (ADDR_REGS
, rclass
))
2865 /* Return true if ADDR is SYMBOL_REF + addend with addend being a
2866 multiple of ALIGNMENT and the SYMBOL_REF being naturally
2870 s390_check_symref_alignment (rtx addr
, HOST_WIDE_INT alignment
)
2872 HOST_WIDE_INT addend
;
2875 if (!s390_symref_operand_p (addr
, &symref
, &addend
))
2878 return (!SYMBOL_REF_NOT_NATURALLY_ALIGNED_P (symref
)
2879 && !(addend
& (alignment
- 1)));
2882 /* ADDR is moved into REG using larl. If ADDR isn't a valid larl
2883 operand SCRATCH is used to reload the even part of the address and
2887 s390_reload_larl_operand (rtx reg
, rtx addr
, rtx scratch
)
2889 HOST_WIDE_INT addend
;
2892 if (!s390_symref_operand_p (addr
, &symref
, &addend
))
2896 /* Easy case. The addend is even so larl will do fine. */
2897 emit_move_insn (reg
, addr
);
2900 /* We can leave the scratch register untouched if the target
2901 register is a valid base register. */
2902 if (REGNO (reg
) < FIRST_PSEUDO_REGISTER
2903 && REGNO_REG_CLASS (REGNO (reg
)) == ADDR_REGS
)
2906 gcc_assert (REGNO (scratch
) < FIRST_PSEUDO_REGISTER
);
2907 gcc_assert (REGNO_REG_CLASS (REGNO (scratch
)) == ADDR_REGS
);
2910 emit_move_insn (scratch
,
2911 gen_rtx_CONST (Pmode
,
2912 gen_rtx_PLUS (Pmode
, symref
,
2913 GEN_INT (addend
- 1))));
2915 emit_move_insn (scratch
, symref
);
2917 /* Increment the address using la in order to avoid clobbering cc. */
2918 emit_move_insn (reg
, gen_rtx_PLUS (Pmode
, scratch
, const1_rtx
));
2922 /* Generate what is necessary to move between REG and MEM using
2923 SCRATCH. The direction is given by TOMEM. */
2926 s390_reload_symref_address (rtx reg
, rtx mem
, rtx scratch
, bool tomem
)
2928 /* Reload might have pulled a constant out of the literal pool.
2929 Force it back in. */
2930 if (CONST_INT_P (mem
) || GET_CODE (mem
) == CONST_DOUBLE
2931 || GET_CODE (mem
) == CONST
)
2932 mem
= force_const_mem (GET_MODE (reg
), mem
);
2934 gcc_assert (MEM_P (mem
));
2936 /* For a load from memory we can leave the scratch register
2937 untouched if the target register is a valid base register. */
2939 && REGNO (reg
) < FIRST_PSEUDO_REGISTER
2940 && REGNO_REG_CLASS (REGNO (reg
)) == ADDR_REGS
2941 && GET_MODE (reg
) == GET_MODE (scratch
))
2944 /* Load address into scratch register. Since we can't have a
2945 secondary reload for a secondary reload we have to cover the case
2946 where larl would need a secondary reload here as well. */
2947 s390_reload_larl_operand (scratch
, XEXP (mem
, 0), scratch
);
2949 /* Now we can use a standard load/store to do the move. */
2951 emit_move_insn (replace_equiv_address (mem
, scratch
), reg
);
2953 emit_move_insn (reg
, replace_equiv_address (mem
, scratch
));
2956 /* Inform reload about cases where moving X with a mode MODE to a register in
2957 RCLASS requires an extra scratch or immediate register. Return the class
2958 needed for the immediate register. */
2961 s390_secondary_reload (bool in_p
, rtx x
, reg_class_t rclass_i
,
2962 enum machine_mode mode
, secondary_reload_info
*sri
)
2964 enum reg_class rclass
= (enum reg_class
) rclass_i
;
2966 /* Intermediate register needed. */
2967 if (reg_classes_intersect_p (CC_REGS
, rclass
))
2968 return GENERAL_REGS
;
2972 /* On z10 several optimizer steps may generate larl operands with
2975 && s390_symref_operand_p (x
, NULL
, NULL
)
2977 && !s390_check_symref_alignment (x
, 2))
2978 sri
->icode
= ((mode
== DImode
) ? CODE_FOR_reloaddi_larl_odd_addend_z10
2979 : CODE_FOR_reloadsi_larl_odd_addend_z10
);
2981 /* On z10 we need a scratch register when moving QI, TI or floating
2982 point mode values from or to a memory location with a SYMBOL_REF
2983 or if the symref addend of a SI or DI move is not aligned to the
2984 width of the access. */
2986 && s390_symref_operand_p (XEXP (x
, 0), NULL
, NULL
)
2987 && (mode
== QImode
|| mode
== TImode
|| FLOAT_MODE_P (mode
)
2988 || (!TARGET_ZARCH
&& mode
== DImode
)
2989 || ((mode
== HImode
|| mode
== SImode
|| mode
== DImode
)
2990 && (!s390_check_symref_alignment (XEXP (x
, 0),
2991 GET_MODE_SIZE (mode
))))))
2993 #define __SECONDARY_RELOAD_CASE(M,m) \
2996 sri->icode = in_p ? CODE_FOR_reload##m##di_toreg_z10 : \
2997 CODE_FOR_reload##m##di_tomem_z10; \
2999 sri->icode = in_p ? CODE_FOR_reload##m##si_toreg_z10 : \
3000 CODE_FOR_reload##m##si_tomem_z10; \
3003 switch (GET_MODE (x
))
3005 __SECONDARY_RELOAD_CASE (QI
, qi
);
3006 __SECONDARY_RELOAD_CASE (HI
, hi
);
3007 __SECONDARY_RELOAD_CASE (SI
, si
);
3008 __SECONDARY_RELOAD_CASE (DI
, di
);
3009 __SECONDARY_RELOAD_CASE (TI
, ti
);
3010 __SECONDARY_RELOAD_CASE (SF
, sf
);
3011 __SECONDARY_RELOAD_CASE (DF
, df
);
3012 __SECONDARY_RELOAD_CASE (TF
, tf
);
3013 __SECONDARY_RELOAD_CASE (SD
, sd
);
3014 __SECONDARY_RELOAD_CASE (DD
, dd
);
3015 __SECONDARY_RELOAD_CASE (TD
, td
);
3020 #undef __SECONDARY_RELOAD_CASE
3024 /* We need a scratch register when loading a PLUS expression which
3025 is not a legitimate operand of the LOAD ADDRESS instruction. */
3026 if (in_p
&& s390_plus_operand (x
, mode
))
3027 sri
->icode
= (TARGET_64BIT
?
3028 CODE_FOR_reloaddi_plus
: CODE_FOR_reloadsi_plus
);
3030 /* Performing a multiword move from or to memory we have to make sure the
3031 second chunk in memory is addressable without causing a displacement
3032 overflow. If that would be the case we calculate the address in
3033 a scratch register. */
3035 && GET_CODE (XEXP (x
, 0)) == PLUS
3036 && GET_CODE (XEXP (XEXP (x
, 0), 1)) == CONST_INT
3037 && !DISP_IN_RANGE (INTVAL (XEXP (XEXP (x
, 0), 1))
3038 + GET_MODE_SIZE (mode
) - 1))
3040 /* For GENERAL_REGS a displacement overflow is no problem if occurring
3041 in a s_operand address since we may fallback to lm/stm. So we only
3042 have to care about overflows in the b+i+d case. */
3043 if ((reg_classes_intersect_p (GENERAL_REGS
, rclass
)
3044 && s390_class_max_nregs (GENERAL_REGS
, mode
) > 1
3045 && GET_CODE (XEXP (XEXP (x
, 0), 0)) == PLUS
)
3046 /* For FP_REGS no lm/stm is available so this check is triggered
3047 for displacement overflows in b+i+d and b+d like addresses. */
3048 || (reg_classes_intersect_p (FP_REGS
, rclass
)
3049 && s390_class_max_nregs (FP_REGS
, mode
) > 1))
3052 sri
->icode
= (TARGET_64BIT
?
3053 CODE_FOR_reloaddi_nonoffmem_in
:
3054 CODE_FOR_reloadsi_nonoffmem_in
);
3056 sri
->icode
= (TARGET_64BIT
?
3057 CODE_FOR_reloaddi_nonoffmem_out
:
3058 CODE_FOR_reloadsi_nonoffmem_out
);
3062 /* A scratch address register is needed when a symbolic constant is
3063 copied to r0 compiling with -fPIC. In other cases the target
3064 register might be used as temporary (see legitimize_pic_address). */
3065 if (in_p
&& SYMBOLIC_CONST (x
) && flag_pic
== 2 && rclass
!= ADDR_REGS
)
3066 sri
->icode
= (TARGET_64BIT
?
3067 CODE_FOR_reloaddi_PIC_addr
:
3068 CODE_FOR_reloadsi_PIC_addr
);
3070 /* Either scratch or no register needed. */
3074 /* Generate code to load SRC, which is PLUS that is not a
3075 legitimate operand for the LA instruction, into TARGET.
3076 SCRATCH may be used as scratch register. */
3079 s390_expand_plus_operand (rtx target
, rtx src
,
3083 struct s390_address ad
;
3085 /* src must be a PLUS; get its two operands. */
3086 gcc_assert (GET_CODE (src
) == PLUS
);
3087 gcc_assert (GET_MODE (src
) == Pmode
);
3089 /* Check if any of the two operands is already scheduled
3090 for replacement by reload. This can happen e.g. when
3091 float registers occur in an address. */
3092 sum1
= find_replacement (&XEXP (src
, 0));
3093 sum2
= find_replacement (&XEXP (src
, 1));
3094 src
= gen_rtx_PLUS (Pmode
, sum1
, sum2
);
3096 /* If the address is already strictly valid, there's nothing to do. */
3097 if (!s390_decompose_address (src
, &ad
)
3098 || (ad
.base
&& !REGNO_OK_FOR_BASE_P (REGNO (ad
.base
)))
3099 || (ad
.indx
&& !REGNO_OK_FOR_INDEX_P (REGNO (ad
.indx
))))
3101 /* Otherwise, one of the operands cannot be an address register;
3102 we reload its value into the scratch register. */
3103 if (true_regnum (sum1
) < 1 || true_regnum (sum1
) > 15)
3105 emit_move_insn (scratch
, sum1
);
3108 if (true_regnum (sum2
) < 1 || true_regnum (sum2
) > 15)
3110 emit_move_insn (scratch
, sum2
);
3114 /* According to the way these invalid addresses are generated
3115 in reload.c, it should never happen (at least on s390) that
3116 *neither* of the PLUS components, after find_replacements
3117 was applied, is an address register. */
3118 if (sum1
== scratch
&& sum2
== scratch
)
3124 src
= gen_rtx_PLUS (Pmode
, sum1
, sum2
);
3127 /* Emit the LOAD ADDRESS pattern. Note that reload of PLUS
3128 is only ever performed on addresses, so we can mark the
3129 sum as legitimate for LA in any case. */
3130 s390_load_address (target
, src
);
3134 /* Return true if ADDR is a valid memory address.
3135 STRICT specifies whether strict register checking applies. */
3138 s390_legitimate_address_p (enum machine_mode mode
, rtx addr
, bool strict
)
3140 struct s390_address ad
;
3143 && larl_operand (addr
, VOIDmode
)
3144 && (mode
== VOIDmode
3145 || s390_check_symref_alignment (addr
, GET_MODE_SIZE (mode
))))
3148 if (!s390_decompose_address (addr
, &ad
))
3153 if (ad
.base
&& !REGNO_OK_FOR_BASE_P (REGNO (ad
.base
)))
3156 if (ad
.indx
&& !REGNO_OK_FOR_INDEX_P (REGNO (ad
.indx
)))
3162 && !(REGNO (ad
.base
) >= FIRST_PSEUDO_REGISTER
3163 || REGNO_REG_CLASS (REGNO (ad
.base
)) == ADDR_REGS
))
3167 && !(REGNO (ad
.indx
) >= FIRST_PSEUDO_REGISTER
3168 || REGNO_REG_CLASS (REGNO (ad
.indx
)) == ADDR_REGS
))
3174 /* Return true if OP is a valid operand for the LA instruction.
3175 In 31-bit, we need to prove that the result is used as an
3176 address, as LA performs only a 31-bit addition. */
3179 legitimate_la_operand_p (rtx op
)
3181 struct s390_address addr
;
3182 if (!s390_decompose_address (op
, &addr
))
3185 return (TARGET_64BIT
|| addr
.pointer
);
3188 /* Return true if it is valid *and* preferable to use LA to
3189 compute the sum of OP1 and OP2. */
3192 preferred_la_operand_p (rtx op1
, rtx op2
)
3194 struct s390_address addr
;
3196 if (op2
!= const0_rtx
)
3197 op1
= gen_rtx_PLUS (Pmode
, op1
, op2
);
3199 if (!s390_decompose_address (op1
, &addr
))
3201 if (addr
.base
&& !REGNO_OK_FOR_BASE_P (REGNO (addr
.base
)))
3203 if (addr
.indx
&& !REGNO_OK_FOR_INDEX_P (REGNO (addr
.indx
)))
3206 if (!TARGET_64BIT
&& !addr
.pointer
)
3212 if ((addr
.base
&& REG_P (addr
.base
) && REG_POINTER (addr
.base
))
3213 || (addr
.indx
&& REG_P (addr
.indx
) && REG_POINTER (addr
.indx
)))
3219 /* Emit a forced load-address operation to load SRC into DST.
3220 This will use the LOAD ADDRESS instruction even in situations
3221 where legitimate_la_operand_p (SRC) returns false. */
3224 s390_load_address (rtx dst
, rtx src
)
3227 emit_move_insn (dst
, src
);
3229 emit_insn (gen_force_la_31 (dst
, src
));
3232 /* Return a legitimate reference for ORIG (an address) using the
3233 register REG. If REG is 0, a new pseudo is generated.
3235 There are two types of references that must be handled:
3237 1. Global data references must load the address from the GOT, via
3238 the PIC reg. An insn is emitted to do this load, and the reg is
3241 2. Static data references, constant pool addresses, and code labels
3242 compute the address as an offset from the GOT, whose base is in
3243 the PIC reg. Static data objects have SYMBOL_FLAG_LOCAL set to
3244 differentiate them from global data objects. The returned
3245 address is the PIC reg + an unspec constant.
3247 TARGET_LEGITIMIZE_ADDRESS_P rejects symbolic references unless the PIC
3248 reg also appears in the address. */
3251 legitimize_pic_address (rtx orig
, rtx reg
)
3257 gcc_assert (!TLS_SYMBOLIC_CONST (addr
));
3259 if (GET_CODE (addr
) == LABEL_REF
3260 || (GET_CODE (addr
) == SYMBOL_REF
&& SYMBOL_REF_LOCAL_P (addr
)))
3262 /* This is a local symbol. */
3263 if (TARGET_CPU_ZARCH
&& larl_operand (addr
, VOIDmode
))
3265 /* Access local symbols PC-relative via LARL.
3266 This is the same as in the non-PIC case, so it is
3267 handled automatically ... */
3271 /* Access local symbols relative to the GOT. */
3273 rtx temp
= reg
? reg
: gen_reg_rtx (Pmode
);
3275 if (reload_in_progress
|| reload_completed
)
3276 df_set_regs_ever_live (PIC_OFFSET_TABLE_REGNUM
, true);
3278 addr
= gen_rtx_UNSPEC (Pmode
, gen_rtvec (1, addr
), UNSPEC_GOTOFF
);
3279 addr
= gen_rtx_CONST (Pmode
, addr
);
3280 addr
= force_const_mem (Pmode
, addr
);
3281 emit_move_insn (temp
, addr
);
3283 new_rtx
= gen_rtx_PLUS (Pmode
, pic_offset_table_rtx
, temp
);
3286 s390_load_address (reg
, new_rtx
);
3291 else if (GET_CODE (addr
) == SYMBOL_REF
)
3294 reg
= gen_reg_rtx (Pmode
);
3298 /* Assume GOT offset < 4k. This is handled the same way
3299 in both 31- and 64-bit code (@GOT). */
3301 if (reload_in_progress
|| reload_completed
)
3302 df_set_regs_ever_live (PIC_OFFSET_TABLE_REGNUM
, true);
3304 new_rtx
= gen_rtx_UNSPEC (Pmode
, gen_rtvec (1, addr
), UNSPEC_GOT
);
3305 new_rtx
= gen_rtx_CONST (Pmode
, new_rtx
);
3306 new_rtx
= gen_rtx_PLUS (Pmode
, pic_offset_table_rtx
, new_rtx
);
3307 new_rtx
= gen_const_mem (Pmode
, new_rtx
);
3308 emit_move_insn (reg
, new_rtx
);
3311 else if (TARGET_CPU_ZARCH
)
3313 /* If the GOT offset might be >= 4k, we determine the position
3314 of the GOT entry via a PC-relative LARL (@GOTENT). */
3316 rtx temp
= reg
? reg
: gen_reg_rtx (Pmode
);
3318 gcc_assert (REGNO (temp
) >= FIRST_PSEUDO_REGISTER
3319 || REGNO_REG_CLASS (REGNO (temp
)) == ADDR_REGS
);
3321 new_rtx
= gen_rtx_UNSPEC (Pmode
, gen_rtvec (1, addr
), UNSPEC_GOTENT
);
3322 new_rtx
= gen_rtx_CONST (Pmode
, new_rtx
);
3323 emit_move_insn (temp
, new_rtx
);
3325 new_rtx
= gen_const_mem (Pmode
, temp
);
3326 emit_move_insn (reg
, new_rtx
);
3331 /* If the GOT offset might be >= 4k, we have to load it
3332 from the literal pool (@GOT). */
3334 rtx temp
= reg
? reg
: gen_reg_rtx (Pmode
);
3336 gcc_assert (REGNO (temp
) >= FIRST_PSEUDO_REGISTER
3337 || REGNO_REG_CLASS (REGNO (temp
)) == ADDR_REGS
);
3339 if (reload_in_progress
|| reload_completed
)
3340 df_set_regs_ever_live (PIC_OFFSET_TABLE_REGNUM
, true);
3342 addr
= gen_rtx_UNSPEC (Pmode
, gen_rtvec (1, addr
), UNSPEC_GOT
);
3343 addr
= gen_rtx_CONST (Pmode
, addr
);
3344 addr
= force_const_mem (Pmode
, addr
);
3345 emit_move_insn (temp
, addr
);
3347 new_rtx
= gen_rtx_PLUS (Pmode
, pic_offset_table_rtx
, temp
);
3348 new_rtx
= gen_const_mem (Pmode
, new_rtx
);
3349 emit_move_insn (reg
, new_rtx
);
3355 if (GET_CODE (addr
) == CONST
)
3357 addr
= XEXP (addr
, 0);
3358 if (GET_CODE (addr
) == UNSPEC
)
3360 gcc_assert (XVECLEN (addr
, 0) == 1);
3361 switch (XINT (addr
, 1))
3363 /* If someone moved a GOT-relative UNSPEC
3364 out of the literal pool, force them back in. */
3367 new_rtx
= force_const_mem (Pmode
, orig
);
3370 /* @GOT is OK as is if small. */
3373 new_rtx
= force_const_mem (Pmode
, orig
);
3376 /* @GOTENT is OK as is. */
3380 /* @PLT is OK as is on 64-bit, must be converted to
3381 GOT-relative @PLTOFF on 31-bit. */
3383 if (!TARGET_CPU_ZARCH
)
3385 rtx temp
= reg
? reg
: gen_reg_rtx (Pmode
);
3387 if (reload_in_progress
|| reload_completed
)
3388 df_set_regs_ever_live (PIC_OFFSET_TABLE_REGNUM
, true);
3390 addr
= XVECEXP (addr
, 0, 0);
3391 addr
= gen_rtx_UNSPEC (Pmode
, gen_rtvec (1, addr
),
3393 addr
= gen_rtx_CONST (Pmode
, addr
);
3394 addr
= force_const_mem (Pmode
, addr
);
3395 emit_move_insn (temp
, addr
);
3397 new_rtx
= gen_rtx_PLUS (Pmode
, pic_offset_table_rtx
, temp
);
3400 s390_load_address (reg
, new_rtx
);
3406 /* Everything else cannot happen. */
3412 gcc_assert (GET_CODE (addr
) == PLUS
);
3414 if (GET_CODE (addr
) == PLUS
)
3416 rtx op0
= XEXP (addr
, 0), op1
= XEXP (addr
, 1);
3418 gcc_assert (!TLS_SYMBOLIC_CONST (op0
));
3419 gcc_assert (!TLS_SYMBOLIC_CONST (op1
));
3421 /* Check first to see if this is a constant offset
3422 from a local symbol reference. */
3423 if ((GET_CODE (op0
) == LABEL_REF
3424 || (GET_CODE (op0
) == SYMBOL_REF
&& SYMBOL_REF_LOCAL_P (op0
)))
3425 && GET_CODE (op1
) == CONST_INT
)
3427 if (TARGET_CPU_ZARCH
3428 && larl_operand (op0
, VOIDmode
)
3429 && INTVAL (op1
) < (HOST_WIDE_INT
)1 << 31
3430 && INTVAL (op1
) >= -((HOST_WIDE_INT
)1 << 31))
3432 if (INTVAL (op1
) & 1)
3434 /* LARL can't handle odd offsets, so emit a
3435 pair of LARL and LA. */
3436 rtx temp
= reg
? reg
: gen_reg_rtx (Pmode
);
3438 if (!DISP_IN_RANGE (INTVAL (op1
)))
3440 HOST_WIDE_INT even
= INTVAL (op1
) - 1;
3441 op0
= gen_rtx_PLUS (Pmode
, op0
, GEN_INT (even
));
3442 op0
= gen_rtx_CONST (Pmode
, op0
);
3446 emit_move_insn (temp
, op0
);
3447 new_rtx
= gen_rtx_PLUS (Pmode
, temp
, op1
);
3451 s390_load_address (reg
, new_rtx
);
3457 /* If the offset is even, we can just use LARL.
3458 This will happen automatically. */
3463 /* Access local symbols relative to the GOT. */
3465 rtx temp
= reg
? reg
: gen_reg_rtx (Pmode
);
3467 if (reload_in_progress
|| reload_completed
)
3468 df_set_regs_ever_live (PIC_OFFSET_TABLE_REGNUM
, true);
3470 addr
= gen_rtx_UNSPEC (Pmode
, gen_rtvec (1, op0
),
3472 addr
= gen_rtx_PLUS (Pmode
, addr
, op1
);
3473 addr
= gen_rtx_CONST (Pmode
, addr
);
3474 addr
= force_const_mem (Pmode
, addr
);
3475 emit_move_insn (temp
, addr
);
3477 new_rtx
= gen_rtx_PLUS (Pmode
, pic_offset_table_rtx
, temp
);
3480 s390_load_address (reg
, new_rtx
);
3486 /* Now, check whether it is a GOT relative symbol plus offset
3487 that was pulled out of the literal pool. Force it back in. */
3489 else if (GET_CODE (op0
) == UNSPEC
3490 && GET_CODE (op1
) == CONST_INT
3491 && XINT (op0
, 1) == UNSPEC_GOTOFF
)
3493 gcc_assert (XVECLEN (op0
, 0) == 1);
3495 new_rtx
= force_const_mem (Pmode
, orig
);
3498 /* Otherwise, compute the sum. */
3501 base
= legitimize_pic_address (XEXP (addr
, 0), reg
);
3502 new_rtx
= legitimize_pic_address (XEXP (addr
, 1),
3503 base
== reg
? NULL_RTX
: reg
);
3504 if (GET_CODE (new_rtx
) == CONST_INT
)
3505 new_rtx
= plus_constant (base
, INTVAL (new_rtx
));
3508 if (GET_CODE (new_rtx
) == PLUS
&& CONSTANT_P (XEXP (new_rtx
, 1)))
3510 base
= gen_rtx_PLUS (Pmode
, base
, XEXP (new_rtx
, 0));
3511 new_rtx
= XEXP (new_rtx
, 1);
3513 new_rtx
= gen_rtx_PLUS (Pmode
, base
, new_rtx
);
3516 if (GET_CODE (new_rtx
) == CONST
)
3517 new_rtx
= XEXP (new_rtx
, 0);
3518 new_rtx
= force_operand (new_rtx
, 0);
3525 /* Load the thread pointer into a register. */
3528 s390_get_thread_pointer (void)
3530 rtx tp
= gen_reg_rtx (Pmode
);
3532 emit_move_insn (tp
, gen_rtx_REG (Pmode
, TP_REGNUM
));
3533 mark_reg_pointer (tp
, BITS_PER_WORD
);
3538 /* Emit a tls call insn. The call target is the SYMBOL_REF stored
3539 in s390_tls_symbol which always refers to __tls_get_offset.
3540 The returned offset is written to RESULT_REG and an USE rtx is
3541 generated for TLS_CALL. */
3543 static GTY(()) rtx s390_tls_symbol
;
3546 s390_emit_tls_call_insn (rtx result_reg
, rtx tls_call
)
3550 gcc_assert (flag_pic
);
3552 if (!s390_tls_symbol
)
3553 s390_tls_symbol
= gen_rtx_SYMBOL_REF (Pmode
, "__tls_get_offset");
3555 insn
= s390_emit_call (s390_tls_symbol
, tls_call
, result_reg
,
3556 gen_rtx_REG (Pmode
, RETURN_REGNUM
));
3558 use_reg (&CALL_INSN_FUNCTION_USAGE (insn
), result_reg
);
3559 RTL_CONST_CALL_P (insn
) = 1;
3562 /* ADDR contains a thread-local SYMBOL_REF. Generate code to compute
3563 this (thread-local) address. REG may be used as temporary. */
3566 legitimize_tls_address (rtx addr
, rtx reg
)
3568 rtx new_rtx
, tls_call
, temp
, base
, r2
, insn
;
3570 if (GET_CODE (addr
) == SYMBOL_REF
)
3571 switch (tls_symbolic_operand (addr
))
3573 case TLS_MODEL_GLOBAL_DYNAMIC
:
3575 r2
= gen_rtx_REG (Pmode
, 2);
3576 tls_call
= gen_rtx_UNSPEC (Pmode
, gen_rtvec (1, addr
), UNSPEC_TLSGD
);
3577 new_rtx
= gen_rtx_CONST (Pmode
, tls_call
);
3578 new_rtx
= force_const_mem (Pmode
, new_rtx
);
3579 emit_move_insn (r2
, new_rtx
);
3580 s390_emit_tls_call_insn (r2
, tls_call
);
3581 insn
= get_insns ();
3584 new_rtx
= gen_rtx_UNSPEC (Pmode
, gen_rtvec (1, addr
), UNSPEC_NTPOFF
);
3585 temp
= gen_reg_rtx (Pmode
);
3586 emit_libcall_block (insn
, temp
, r2
, new_rtx
);
3588 new_rtx
= gen_rtx_PLUS (Pmode
, s390_get_thread_pointer (), temp
);
3591 s390_load_address (reg
, new_rtx
);
3596 case TLS_MODEL_LOCAL_DYNAMIC
:
3598 r2
= gen_rtx_REG (Pmode
, 2);
3599 tls_call
= gen_rtx_UNSPEC (Pmode
, gen_rtvec (1, const0_rtx
), UNSPEC_TLSLDM
);
3600 new_rtx
= gen_rtx_CONST (Pmode
, tls_call
);
3601 new_rtx
= force_const_mem (Pmode
, new_rtx
);
3602 emit_move_insn (r2
, new_rtx
);
3603 s390_emit_tls_call_insn (r2
, tls_call
);
3604 insn
= get_insns ();
3607 new_rtx
= gen_rtx_UNSPEC (Pmode
, gen_rtvec (1, const0_rtx
), UNSPEC_TLSLDM_NTPOFF
);
3608 temp
= gen_reg_rtx (Pmode
);
3609 emit_libcall_block (insn
, temp
, r2
, new_rtx
);
3611 new_rtx
= gen_rtx_PLUS (Pmode
, s390_get_thread_pointer (), temp
);
3612 base
= gen_reg_rtx (Pmode
);
3613 s390_load_address (base
, new_rtx
);
3615 new_rtx
= gen_rtx_UNSPEC (Pmode
, gen_rtvec (1, addr
), UNSPEC_DTPOFF
);
3616 new_rtx
= gen_rtx_CONST (Pmode
, new_rtx
);
3617 new_rtx
= force_const_mem (Pmode
, new_rtx
);
3618 temp
= gen_reg_rtx (Pmode
);
3619 emit_move_insn (temp
, new_rtx
);
3621 new_rtx
= gen_rtx_PLUS (Pmode
, base
, temp
);
3624 s390_load_address (reg
, new_rtx
);
3629 case TLS_MODEL_INITIAL_EXEC
:
3632 /* Assume GOT offset < 4k. This is handled the same way
3633 in both 31- and 64-bit code. */
3635 if (reload_in_progress
|| reload_completed
)
3636 df_set_regs_ever_live (PIC_OFFSET_TABLE_REGNUM
, true);
3638 new_rtx
= gen_rtx_UNSPEC (Pmode
, gen_rtvec (1, addr
), UNSPEC_GOTNTPOFF
);
3639 new_rtx
= gen_rtx_CONST (Pmode
, new_rtx
);
3640 new_rtx
= gen_rtx_PLUS (Pmode
, pic_offset_table_rtx
, new_rtx
);
3641 new_rtx
= gen_const_mem (Pmode
, new_rtx
);
3642 temp
= gen_reg_rtx (Pmode
);
3643 emit_move_insn (temp
, new_rtx
);
3645 else if (TARGET_CPU_ZARCH
)
3647 /* If the GOT offset might be >= 4k, we determine the position
3648 of the GOT entry via a PC-relative LARL. */
3650 new_rtx
= gen_rtx_UNSPEC (Pmode
, gen_rtvec (1, addr
), UNSPEC_INDNTPOFF
);
3651 new_rtx
= gen_rtx_CONST (Pmode
, new_rtx
);
3652 temp
= gen_reg_rtx (Pmode
);
3653 emit_move_insn (temp
, new_rtx
);
3655 new_rtx
= gen_const_mem (Pmode
, temp
);
3656 temp
= gen_reg_rtx (Pmode
);
3657 emit_move_insn (temp
, new_rtx
);
3661 /* If the GOT offset might be >= 4k, we have to load it
3662 from the literal pool. */
3664 if (reload_in_progress
|| reload_completed
)
3665 df_set_regs_ever_live (PIC_OFFSET_TABLE_REGNUM
, true);
3667 new_rtx
= gen_rtx_UNSPEC (Pmode
, gen_rtvec (1, addr
), UNSPEC_GOTNTPOFF
);
3668 new_rtx
= gen_rtx_CONST (Pmode
, new_rtx
);
3669 new_rtx
= force_const_mem (Pmode
, new_rtx
);
3670 temp
= gen_reg_rtx (Pmode
);
3671 emit_move_insn (temp
, new_rtx
);
3673 new_rtx
= gen_rtx_PLUS (Pmode
, pic_offset_table_rtx
, temp
);
3674 new_rtx
= gen_const_mem (Pmode
, new_rtx
);
3676 new_rtx
= gen_rtx_UNSPEC (Pmode
, gen_rtvec (2, new_rtx
, addr
), UNSPEC_TLS_LOAD
);
3677 temp
= gen_reg_rtx (Pmode
);
3678 emit_insn (gen_rtx_SET (Pmode
, temp
, new_rtx
));
3682 /* In position-dependent code, load the absolute address of
3683 the GOT entry from the literal pool. */
3685 new_rtx
= gen_rtx_UNSPEC (Pmode
, gen_rtvec (1, addr
), UNSPEC_INDNTPOFF
);
3686 new_rtx
= gen_rtx_CONST (Pmode
, new_rtx
);
3687 new_rtx
= force_const_mem (Pmode
, new_rtx
);
3688 temp
= gen_reg_rtx (Pmode
);
3689 emit_move_insn (temp
, new_rtx
);
3692 new_rtx
= gen_const_mem (Pmode
, new_rtx
);
3693 new_rtx
= gen_rtx_UNSPEC (Pmode
, gen_rtvec (2, new_rtx
, addr
), UNSPEC_TLS_LOAD
);
3694 temp
= gen_reg_rtx (Pmode
);
3695 emit_insn (gen_rtx_SET (Pmode
, temp
, new_rtx
));
3698 new_rtx
= gen_rtx_PLUS (Pmode
, s390_get_thread_pointer (), temp
);
3701 s390_load_address (reg
, new_rtx
);
3706 case TLS_MODEL_LOCAL_EXEC
:
3707 new_rtx
= gen_rtx_UNSPEC (Pmode
, gen_rtvec (1, addr
), UNSPEC_NTPOFF
);
3708 new_rtx
= gen_rtx_CONST (Pmode
, new_rtx
);
3709 new_rtx
= force_const_mem (Pmode
, new_rtx
);
3710 temp
= gen_reg_rtx (Pmode
);
3711 emit_move_insn (temp
, new_rtx
);
3713 new_rtx
= gen_rtx_PLUS (Pmode
, s390_get_thread_pointer (), temp
);
3716 s390_load_address (reg
, new_rtx
);
3725 else if (GET_CODE (addr
) == CONST
&& GET_CODE (XEXP (addr
, 0)) == UNSPEC
)
3727 switch (XINT (XEXP (addr
, 0), 1))
3729 case UNSPEC_INDNTPOFF
:
3730 gcc_assert (TARGET_CPU_ZARCH
);
3739 else if (GET_CODE (addr
) == CONST
&& GET_CODE (XEXP (addr
, 0)) == PLUS
3740 && GET_CODE (XEXP (XEXP (addr
, 0), 1)) == CONST_INT
)
3742 new_rtx
= XEXP (XEXP (addr
, 0), 0);
3743 if (GET_CODE (new_rtx
) != SYMBOL_REF
)
3744 new_rtx
= gen_rtx_CONST (Pmode
, new_rtx
);
3746 new_rtx
= legitimize_tls_address (new_rtx
, reg
);
3747 new_rtx
= plus_constant (new_rtx
, INTVAL (XEXP (XEXP (addr
, 0), 1)));
3748 new_rtx
= force_operand (new_rtx
, 0);
3752 gcc_unreachable (); /* for now ... */
3757 /* Emit insns making the address in operands[1] valid for a standard
3758 move to operands[0]. operands[1] is replaced by an address which
3759 should be used instead of the former RTX to emit the move
3763 emit_symbolic_move (rtx
*operands
)
3765 rtx temp
= !can_create_pseudo_p () ? operands
[0] : gen_reg_rtx (Pmode
);
3767 if (GET_CODE (operands
[0]) == MEM
)
3768 operands
[1] = force_reg (Pmode
, operands
[1]);
3769 else if (TLS_SYMBOLIC_CONST (operands
[1]))
3770 operands
[1] = legitimize_tls_address (operands
[1], temp
);
3772 operands
[1] = legitimize_pic_address (operands
[1], temp
);
3775 /* Try machine-dependent ways of modifying an illegitimate address X
3776 to be legitimate. If we find one, return the new, valid address.
3778 OLDX is the address as it was before break_out_memory_refs was called.
3779 In some cases it is useful to look at this to decide what needs to be done.
3781 MODE is the mode of the operand pointed to by X.
3783 When -fpic is used, special handling is needed for symbolic references.
3784 See comments by legitimize_pic_address for details. */
3787 s390_legitimize_address (rtx x
, rtx oldx ATTRIBUTE_UNUSED
,
3788 enum machine_mode mode ATTRIBUTE_UNUSED
)
3790 rtx constant_term
= const0_rtx
;
3792 if (TLS_SYMBOLIC_CONST (x
))
3794 x
= legitimize_tls_address (x
, 0);
3796 if (s390_legitimate_address_p (mode
, x
, FALSE
))
3799 else if (GET_CODE (x
) == PLUS
3800 && (TLS_SYMBOLIC_CONST (XEXP (x
, 0))
3801 || TLS_SYMBOLIC_CONST (XEXP (x
, 1))))
3807 if (SYMBOLIC_CONST (x
)
3808 || (GET_CODE (x
) == PLUS
3809 && (SYMBOLIC_CONST (XEXP (x
, 0))
3810 || SYMBOLIC_CONST (XEXP (x
, 1)))))
3811 x
= legitimize_pic_address (x
, 0);
3813 if (s390_legitimate_address_p (mode
, x
, FALSE
))
3817 x
= eliminate_constant_term (x
, &constant_term
);
3819 /* Optimize loading of large displacements by splitting them
3820 into the multiple of 4K and the rest; this allows the
3821 former to be CSE'd if possible.
3823 Don't do this if the displacement is added to a register
3824 pointing into the stack frame, as the offsets will
3825 change later anyway. */
3827 if (GET_CODE (constant_term
) == CONST_INT
3828 && !TARGET_LONG_DISPLACEMENT
3829 && !DISP_IN_RANGE (INTVAL (constant_term
))
3830 && !(REG_P (x
) && REGNO_PTR_FRAME_P (REGNO (x
))))
3832 HOST_WIDE_INT lower
= INTVAL (constant_term
) & 0xfff;
3833 HOST_WIDE_INT upper
= INTVAL (constant_term
) ^ lower
;
3835 rtx temp
= gen_reg_rtx (Pmode
);
3836 rtx val
= force_operand (GEN_INT (upper
), temp
);
3838 emit_move_insn (temp
, val
);
3840 x
= gen_rtx_PLUS (Pmode
, x
, temp
);
3841 constant_term
= GEN_INT (lower
);
3844 if (GET_CODE (x
) == PLUS
)
3846 if (GET_CODE (XEXP (x
, 0)) == REG
)
3848 rtx temp
= gen_reg_rtx (Pmode
);
3849 rtx val
= force_operand (XEXP (x
, 1), temp
);
3851 emit_move_insn (temp
, val
);
3853 x
= gen_rtx_PLUS (Pmode
, XEXP (x
, 0), temp
);
3856 else if (GET_CODE (XEXP (x
, 1)) == REG
)
3858 rtx temp
= gen_reg_rtx (Pmode
);
3859 rtx val
= force_operand (XEXP (x
, 0), temp
);
3861 emit_move_insn (temp
, val
);
3863 x
= gen_rtx_PLUS (Pmode
, temp
, XEXP (x
, 1));
3867 if (constant_term
!= const0_rtx
)
3868 x
= gen_rtx_PLUS (Pmode
, x
, constant_term
);
3873 /* Try a machine-dependent way of reloading an illegitimate address AD
3874 operand. If we find one, push the reload and and return the new address.
3876 MODE is the mode of the enclosing MEM. OPNUM is the operand number
3877 and TYPE is the reload type of the current reload. */
3880 legitimize_reload_address (rtx ad
, enum machine_mode mode ATTRIBUTE_UNUSED
,
3881 int opnum
, int type
)
3883 if (!optimize
|| TARGET_LONG_DISPLACEMENT
)
3886 if (GET_CODE (ad
) == PLUS
)
3888 rtx tem
= simplify_binary_operation (PLUS
, Pmode
,
3889 XEXP (ad
, 0), XEXP (ad
, 1));
3894 if (GET_CODE (ad
) == PLUS
3895 && GET_CODE (XEXP (ad
, 0)) == REG
3896 && GET_CODE (XEXP (ad
, 1)) == CONST_INT
3897 && !DISP_IN_RANGE (INTVAL (XEXP (ad
, 1))))
3899 HOST_WIDE_INT lower
= INTVAL (XEXP (ad
, 1)) & 0xfff;
3900 HOST_WIDE_INT upper
= INTVAL (XEXP (ad
, 1)) ^ lower
;
3901 rtx cst
, tem
, new_rtx
;
3903 cst
= GEN_INT (upper
);
3904 if (!legitimate_reload_constant_p (cst
))
3905 cst
= force_const_mem (Pmode
, cst
);
3907 tem
= gen_rtx_PLUS (Pmode
, XEXP (ad
, 0), cst
);
3908 new_rtx
= gen_rtx_PLUS (Pmode
, tem
, GEN_INT (lower
));
3910 push_reload (XEXP (tem
, 1), 0, &XEXP (tem
, 1), 0,
3911 BASE_REG_CLASS
, Pmode
, VOIDmode
, 0, 0,
3912 opnum
, (enum reload_type
) type
);
3919 /* Emit code to move LEN bytes from DST to SRC. */
3922 s390_expand_movmem (rtx dst
, rtx src
, rtx len
)
3924 if (GET_CODE (len
) == CONST_INT
&& INTVAL (len
) >= 0 && INTVAL (len
) <= 256)
3926 if (INTVAL (len
) > 0)
3927 emit_insn (gen_movmem_short (dst
, src
, GEN_INT (INTVAL (len
) - 1)));
3930 else if (TARGET_MVCLE
)
3932 emit_insn (gen_movmem_long (dst
, src
, convert_to_mode (Pmode
, len
, 1)));
3937 rtx dst_addr
, src_addr
, count
, blocks
, temp
;
3938 rtx loop_start_label
= gen_label_rtx ();
3939 rtx loop_end_label
= gen_label_rtx ();
3940 rtx end_label
= gen_label_rtx ();
3941 enum machine_mode mode
;
3943 mode
= GET_MODE (len
);
3944 if (mode
== VOIDmode
)
3947 dst_addr
= gen_reg_rtx (Pmode
);
3948 src_addr
= gen_reg_rtx (Pmode
);
3949 count
= gen_reg_rtx (mode
);
3950 blocks
= gen_reg_rtx (mode
);
3952 convert_move (count
, len
, 1);
3953 emit_cmp_and_jump_insns (count
, const0_rtx
,
3954 EQ
, NULL_RTX
, mode
, 1, end_label
);
3956 emit_move_insn (dst_addr
, force_operand (XEXP (dst
, 0), NULL_RTX
));
3957 emit_move_insn (src_addr
, force_operand (XEXP (src
, 0), NULL_RTX
));
3958 dst
= change_address (dst
, VOIDmode
, dst_addr
);
3959 src
= change_address (src
, VOIDmode
, src_addr
);
3961 temp
= expand_binop (mode
, add_optab
, count
, constm1_rtx
, count
, 1,
3964 emit_move_insn (count
, temp
);
3966 temp
= expand_binop (mode
, lshr_optab
, count
, GEN_INT (8), blocks
, 1,
3969 emit_move_insn (blocks
, temp
);
3971 emit_cmp_and_jump_insns (blocks
, const0_rtx
,
3972 EQ
, NULL_RTX
, mode
, 1, loop_end_label
);
3974 emit_label (loop_start_label
);
3977 && (GET_CODE (len
) != CONST_INT
|| INTVAL (len
) > 768))
3981 /* Issue a read prefetch for the +3 cache line. */
3982 prefetch
= gen_prefetch (gen_rtx_PLUS (Pmode
, src_addr
, GEN_INT (768)),
3983 const0_rtx
, const0_rtx
);
3984 PREFETCH_SCHEDULE_BARRIER_P (prefetch
) = true;
3985 emit_insn (prefetch
);
3987 /* Issue a write prefetch for the +3 cache line. */
3988 prefetch
= gen_prefetch (gen_rtx_PLUS (Pmode
, dst_addr
, GEN_INT (768)),
3989 const1_rtx
, const0_rtx
);
3990 PREFETCH_SCHEDULE_BARRIER_P (prefetch
) = true;
3991 emit_insn (prefetch
);
3994 emit_insn (gen_movmem_short (dst
, src
, GEN_INT (255)));
3995 s390_load_address (dst_addr
,
3996 gen_rtx_PLUS (Pmode
, dst_addr
, GEN_INT (256)));
3997 s390_load_address (src_addr
,
3998 gen_rtx_PLUS (Pmode
, src_addr
, GEN_INT (256)));
4000 temp
= expand_binop (mode
, add_optab
, blocks
, constm1_rtx
, blocks
, 1,
4003 emit_move_insn (blocks
, temp
);
4005 emit_cmp_and_jump_insns (blocks
, const0_rtx
,
4006 EQ
, NULL_RTX
, mode
, 1, loop_end_label
);
4008 emit_jump (loop_start_label
);
4009 emit_label (loop_end_label
);
4011 emit_insn (gen_movmem_short (dst
, src
,
4012 convert_to_mode (Pmode
, count
, 1)));
4013 emit_label (end_label
);
4017 /* Emit code to set LEN bytes at DST to VAL.
4018 Make use of clrmem if VAL is zero. */
4021 s390_expand_setmem (rtx dst
, rtx len
, rtx val
)
4023 if (GET_CODE (len
) == CONST_INT
&& INTVAL (len
) == 0)
4026 gcc_assert (GET_CODE (val
) == CONST_INT
|| GET_MODE (val
) == QImode
);
4028 if (GET_CODE (len
) == CONST_INT
&& INTVAL (len
) > 0 && INTVAL (len
) <= 257)
4030 if (val
== const0_rtx
&& INTVAL (len
) <= 256)
4031 emit_insn (gen_clrmem_short (dst
, GEN_INT (INTVAL (len
) - 1)));
4034 /* Initialize memory by storing the first byte. */
4035 emit_move_insn (adjust_address (dst
, QImode
, 0), val
);
4037 if (INTVAL (len
) > 1)
4039 /* Initiate 1 byte overlap move.
4040 The first byte of DST is propagated through DSTP1.
4041 Prepare a movmem for: DST+1 = DST (length = LEN - 1).
4042 DST is set to size 1 so the rest of the memory location
4043 does not count as source operand. */
4044 rtx dstp1
= adjust_address (dst
, VOIDmode
, 1);
4045 set_mem_size (dst
, const1_rtx
);
4047 emit_insn (gen_movmem_short (dstp1
, dst
,
4048 GEN_INT (INTVAL (len
) - 2)));
4053 else if (TARGET_MVCLE
)
4055 val
= force_not_mem (convert_modes (Pmode
, QImode
, val
, 1));
4056 emit_insn (gen_setmem_long (dst
, convert_to_mode (Pmode
, len
, 1), val
));
4061 rtx dst_addr
, count
, blocks
, temp
, dstp1
= NULL_RTX
;
4062 rtx loop_start_label
= gen_label_rtx ();
4063 rtx loop_end_label
= gen_label_rtx ();
4064 rtx end_label
= gen_label_rtx ();
4065 enum machine_mode mode
;
4067 mode
= GET_MODE (len
);
4068 if (mode
== VOIDmode
)
4071 dst_addr
= gen_reg_rtx (Pmode
);
4072 count
= gen_reg_rtx (mode
);
4073 blocks
= gen_reg_rtx (mode
);
4075 convert_move (count
, len
, 1);
4076 emit_cmp_and_jump_insns (count
, const0_rtx
,
4077 EQ
, NULL_RTX
, mode
, 1, end_label
);
4079 emit_move_insn (dst_addr
, force_operand (XEXP (dst
, 0), NULL_RTX
));
4080 dst
= change_address (dst
, VOIDmode
, dst_addr
);
4082 if (val
== const0_rtx
)
4083 temp
= expand_binop (mode
, add_optab
, count
, constm1_rtx
, count
, 1,
4087 dstp1
= adjust_address (dst
, VOIDmode
, 1);
4088 set_mem_size (dst
, const1_rtx
);
4090 /* Initialize memory by storing the first byte. */
4091 emit_move_insn (adjust_address (dst
, QImode
, 0), val
);
4093 /* If count is 1 we are done. */
4094 emit_cmp_and_jump_insns (count
, const1_rtx
,
4095 EQ
, NULL_RTX
, mode
, 1, end_label
);
4097 temp
= expand_binop (mode
, add_optab
, count
, GEN_INT (-2), count
, 1,
4101 emit_move_insn (count
, temp
);
4103 temp
= expand_binop (mode
, lshr_optab
, count
, GEN_INT (8), blocks
, 1,
4106 emit_move_insn (blocks
, temp
);
4108 emit_cmp_and_jump_insns (blocks
, const0_rtx
,
4109 EQ
, NULL_RTX
, mode
, 1, loop_end_label
);
4111 emit_label (loop_start_label
);
4114 && (GET_CODE (len
) != CONST_INT
|| INTVAL (len
) > 1024))
4116 /* Issue a write prefetch for the +4 cache line. */
4117 rtx prefetch
= gen_prefetch (gen_rtx_PLUS (Pmode
, dst_addr
,
4119 const1_rtx
, const0_rtx
);
4120 emit_insn (prefetch
);
4121 PREFETCH_SCHEDULE_BARRIER_P (prefetch
) = true;
4124 if (val
== const0_rtx
)
4125 emit_insn (gen_clrmem_short (dst
, GEN_INT (255)));
4127 emit_insn (gen_movmem_short (dstp1
, dst
, GEN_INT (255)));
4128 s390_load_address (dst_addr
,
4129 gen_rtx_PLUS (Pmode
, dst_addr
, GEN_INT (256)));
4131 temp
= expand_binop (mode
, add_optab
, blocks
, constm1_rtx
, blocks
, 1,
4134 emit_move_insn (blocks
, temp
);
4136 emit_cmp_and_jump_insns (blocks
, const0_rtx
,
4137 EQ
, NULL_RTX
, mode
, 1, loop_end_label
);
4139 emit_jump (loop_start_label
);
4140 emit_label (loop_end_label
);
4142 if (val
== const0_rtx
)
4143 emit_insn (gen_clrmem_short (dst
, convert_to_mode (Pmode
, count
, 1)));
4145 emit_insn (gen_movmem_short (dstp1
, dst
, convert_to_mode (Pmode
, count
, 1)));
4146 emit_label (end_label
);
4150 /* Emit code to compare LEN bytes at OP0 with those at OP1,
4151 and return the result in TARGET. */
4154 s390_expand_cmpmem (rtx target
, rtx op0
, rtx op1
, rtx len
)
4156 rtx ccreg
= gen_rtx_REG (CCUmode
, CC_REGNUM
);
4159 /* As the result of CMPINT is inverted compared to what we need,
4160 we have to swap the operands. */
4161 tmp
= op0
; op0
= op1
; op1
= tmp
;
4163 if (GET_CODE (len
) == CONST_INT
&& INTVAL (len
) >= 0 && INTVAL (len
) <= 256)
4165 if (INTVAL (len
) > 0)
4167 emit_insn (gen_cmpmem_short (op0
, op1
, GEN_INT (INTVAL (len
) - 1)));
4168 emit_insn (gen_cmpint (target
, ccreg
));
4171 emit_move_insn (target
, const0_rtx
);
4173 else if (TARGET_MVCLE
)
4175 emit_insn (gen_cmpmem_long (op0
, op1
, convert_to_mode (Pmode
, len
, 1)));
4176 emit_insn (gen_cmpint (target
, ccreg
));
4180 rtx addr0
, addr1
, count
, blocks
, temp
;
4181 rtx loop_start_label
= gen_label_rtx ();
4182 rtx loop_end_label
= gen_label_rtx ();
4183 rtx end_label
= gen_label_rtx ();
4184 enum machine_mode mode
;
4186 mode
= GET_MODE (len
);
4187 if (mode
== VOIDmode
)
4190 addr0
= gen_reg_rtx (Pmode
);
4191 addr1
= gen_reg_rtx (Pmode
);
4192 count
= gen_reg_rtx (mode
);
4193 blocks
= gen_reg_rtx (mode
);
4195 convert_move (count
, len
, 1);
4196 emit_cmp_and_jump_insns (count
, const0_rtx
,
4197 EQ
, NULL_RTX
, mode
, 1, end_label
);
4199 emit_move_insn (addr0
, force_operand (XEXP (op0
, 0), NULL_RTX
));
4200 emit_move_insn (addr1
, force_operand (XEXP (op1
, 0), NULL_RTX
));
4201 op0
= change_address (op0
, VOIDmode
, addr0
);
4202 op1
= change_address (op1
, VOIDmode
, addr1
);
4204 temp
= expand_binop (mode
, add_optab
, count
, constm1_rtx
, count
, 1,
4207 emit_move_insn (count
, temp
);
4209 temp
= expand_binop (mode
, lshr_optab
, count
, GEN_INT (8), blocks
, 1,
4212 emit_move_insn (blocks
, temp
);
4214 emit_cmp_and_jump_insns (blocks
, const0_rtx
,
4215 EQ
, NULL_RTX
, mode
, 1, loop_end_label
);
4217 emit_label (loop_start_label
);
4220 && (GET_CODE (len
) != CONST_INT
|| INTVAL (len
) > 512))
4224 /* Issue a read prefetch for the +2 cache line of operand 1. */
4225 prefetch
= gen_prefetch (gen_rtx_PLUS (Pmode
, addr0
, GEN_INT (512)),
4226 const0_rtx
, const0_rtx
);
4227 emit_insn (prefetch
);
4228 PREFETCH_SCHEDULE_BARRIER_P (prefetch
) = true;
4230 /* Issue a read prefetch for the +2 cache line of operand 2. */
4231 prefetch
= gen_prefetch (gen_rtx_PLUS (Pmode
, addr1
, GEN_INT (512)),
4232 const0_rtx
, const0_rtx
);
4233 emit_insn (prefetch
);
4234 PREFETCH_SCHEDULE_BARRIER_P (prefetch
) = true;
4237 emit_insn (gen_cmpmem_short (op0
, op1
, GEN_INT (255)));
4238 temp
= gen_rtx_NE (VOIDmode
, ccreg
, const0_rtx
);
4239 temp
= gen_rtx_IF_THEN_ELSE (VOIDmode
, temp
,
4240 gen_rtx_LABEL_REF (VOIDmode
, end_label
), pc_rtx
);
4241 temp
= gen_rtx_SET (VOIDmode
, pc_rtx
, temp
);
4242 emit_jump_insn (temp
);
4244 s390_load_address (addr0
,
4245 gen_rtx_PLUS (Pmode
, addr0
, GEN_INT (256)));
4246 s390_load_address (addr1
,
4247 gen_rtx_PLUS (Pmode
, addr1
, 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 emit_insn (gen_cmpmem_short (op0
, op1
,
4261 convert_to_mode (Pmode
, count
, 1)));
4262 emit_label (end_label
);
4264 emit_insn (gen_cmpint (target
, ccreg
));
4269 /* Expand conditional increment or decrement using alc/slb instructions.
4270 Should generate code setting DST to either SRC or SRC + INCREMENT,
4271 depending on the result of the comparison CMP_OP0 CMP_CODE CMP_OP1.
4272 Returns true if successful, false otherwise.
4274 That makes it possible to implement some if-constructs without jumps e.g.:
4275 (borrow = CC0 | CC1 and carry = CC2 | CC3)
4276 unsigned int a, b, c;
4277 if (a < b) c++; -> CCU b > a -> CC2; c += carry;
4278 if (a < b) c--; -> CCL3 a - b -> borrow; c -= borrow;
4279 if (a <= b) c++; -> CCL3 b - a -> borrow; c += carry;
4280 if (a <= b) c--; -> CCU a <= b -> borrow; c -= borrow;
4282 Checks for EQ and NE with a nonzero value need an additional xor e.g.:
4283 if (a == b) c++; -> CCL3 a ^= b; 0 - a -> borrow; c += carry;
4284 if (a == b) c--; -> CCU a ^= b; a <= 0 -> CC0 | CC1; c -= borrow;
4285 if (a != b) c++; -> CCU a ^= b; a > 0 -> CC2; c += carry;
4286 if (a != b) c--; -> CCL3 a ^= b; 0 - a -> borrow; c -= borrow; */
4289 s390_expand_addcc (enum rtx_code cmp_code
, rtx cmp_op0
, rtx cmp_op1
,
4290 rtx dst
, rtx src
, rtx increment
)
4292 enum machine_mode cmp_mode
;
4293 enum machine_mode cc_mode
;
4299 if ((GET_MODE (cmp_op0
) == SImode
|| GET_MODE (cmp_op0
) == VOIDmode
)
4300 && (GET_MODE (cmp_op1
) == SImode
|| GET_MODE (cmp_op1
) == VOIDmode
))
4302 else if ((GET_MODE (cmp_op0
) == DImode
|| GET_MODE (cmp_op0
) == VOIDmode
)
4303 && (GET_MODE (cmp_op1
) == DImode
|| GET_MODE (cmp_op1
) == VOIDmode
))
4308 /* Try ADD LOGICAL WITH CARRY. */
4309 if (increment
== const1_rtx
)
4311 /* Determine CC mode to use. */
4312 if (cmp_code
== EQ
|| cmp_code
== NE
)
4314 if (cmp_op1
!= const0_rtx
)
4316 cmp_op0
= expand_simple_binop (cmp_mode
, XOR
, cmp_op0
, cmp_op1
,
4317 NULL_RTX
, 0, OPTAB_WIDEN
);
4318 cmp_op1
= const0_rtx
;
4321 cmp_code
= cmp_code
== EQ
? LEU
: GTU
;
4324 if (cmp_code
== LTU
|| cmp_code
== LEU
)
4329 cmp_code
= swap_condition (cmp_code
);
4346 /* Emit comparison instruction pattern. */
4347 if (!register_operand (cmp_op0
, cmp_mode
))
4348 cmp_op0
= force_reg (cmp_mode
, cmp_op0
);
4350 insn
= gen_rtx_SET (VOIDmode
, gen_rtx_REG (cc_mode
, CC_REGNUM
),
4351 gen_rtx_COMPARE (cc_mode
, cmp_op0
, cmp_op1
));
4352 /* We use insn_invalid_p here to add clobbers if required. */
4353 ret
= insn_invalid_p (emit_insn (insn
));
4356 /* Emit ALC instruction pattern. */
4357 op_res
= gen_rtx_fmt_ee (cmp_code
, GET_MODE (dst
),
4358 gen_rtx_REG (cc_mode
, CC_REGNUM
),
4361 if (src
!= const0_rtx
)
4363 if (!register_operand (src
, GET_MODE (dst
)))
4364 src
= force_reg (GET_MODE (dst
), src
);
4366 op_res
= gen_rtx_PLUS (GET_MODE (dst
), op_res
, src
);
4367 op_res
= gen_rtx_PLUS (GET_MODE (dst
), op_res
, const0_rtx
);
4370 p
= rtvec_alloc (2);
4372 gen_rtx_SET (VOIDmode
, dst
, op_res
);
4374 gen_rtx_CLOBBER (VOIDmode
, gen_rtx_REG (CCmode
, CC_REGNUM
));
4375 emit_insn (gen_rtx_PARALLEL (VOIDmode
, p
));
4380 /* Try SUBTRACT LOGICAL WITH BORROW. */
4381 if (increment
== constm1_rtx
)
4383 /* Determine CC mode to use. */
4384 if (cmp_code
== EQ
|| cmp_code
== NE
)
4386 if (cmp_op1
!= const0_rtx
)
4388 cmp_op0
= expand_simple_binop (cmp_mode
, XOR
, cmp_op0
, cmp_op1
,
4389 NULL_RTX
, 0, OPTAB_WIDEN
);
4390 cmp_op1
= const0_rtx
;
4393 cmp_code
= cmp_code
== EQ
? LEU
: GTU
;
4396 if (cmp_code
== GTU
|| cmp_code
== GEU
)
4401 cmp_code
= swap_condition (cmp_code
);
4418 /* Emit comparison instruction pattern. */
4419 if (!register_operand (cmp_op0
, cmp_mode
))
4420 cmp_op0
= force_reg (cmp_mode
, cmp_op0
);
4422 insn
= gen_rtx_SET (VOIDmode
, gen_rtx_REG (cc_mode
, CC_REGNUM
),
4423 gen_rtx_COMPARE (cc_mode
, cmp_op0
, cmp_op1
));
4424 /* We use insn_invalid_p here to add clobbers if required. */
4425 ret
= insn_invalid_p (emit_insn (insn
));
4428 /* Emit SLB instruction pattern. */
4429 if (!register_operand (src
, GET_MODE (dst
)))
4430 src
= force_reg (GET_MODE (dst
), src
);
4432 op_res
= gen_rtx_MINUS (GET_MODE (dst
),
4433 gen_rtx_MINUS (GET_MODE (dst
), src
, const0_rtx
),
4434 gen_rtx_fmt_ee (cmp_code
, GET_MODE (dst
),
4435 gen_rtx_REG (cc_mode
, CC_REGNUM
),
4437 p
= rtvec_alloc (2);
4439 gen_rtx_SET (VOIDmode
, dst
, op_res
);
4441 gen_rtx_CLOBBER (VOIDmode
, gen_rtx_REG (CCmode
, CC_REGNUM
));
4442 emit_insn (gen_rtx_PARALLEL (VOIDmode
, p
));
4450 /* Expand code for the insv template. Return true if successful. */
4453 s390_expand_insv (rtx dest
, rtx op1
, rtx op2
, rtx src
)
4455 int bitsize
= INTVAL (op1
);
4456 int bitpos
= INTVAL (op2
);
4458 /* On z10 we can use the risbg instruction to implement insv. */
4460 && ((GET_MODE (dest
) == DImode
&& GET_MODE (src
) == DImode
)
4461 || (GET_MODE (dest
) == SImode
&& GET_MODE (src
) == SImode
)))
4466 op
= gen_rtx_SET (GET_MODE(src
),
4467 gen_rtx_ZERO_EXTRACT (GET_MODE (dest
), dest
, op1
, op2
),
4469 clobber
= gen_rtx_CLOBBER (VOIDmode
, gen_rtx_REG (CCmode
, CC_REGNUM
));
4470 emit_insn (gen_rtx_PARALLEL (VOIDmode
, gen_rtvec (2, op
, clobber
)));
4475 /* We need byte alignment. */
4476 if (bitsize
% BITS_PER_UNIT
)
4480 && memory_operand (dest
, VOIDmode
)
4481 && (register_operand (src
, word_mode
)
4482 || const_int_operand (src
, VOIDmode
)))
4484 /* Emit standard pattern if possible. */
4485 enum machine_mode mode
= smallest_mode_for_size (bitsize
, MODE_INT
);
4486 if (GET_MODE_BITSIZE (mode
) == bitsize
)
4487 emit_move_insn (adjust_address (dest
, mode
, 0), gen_lowpart (mode
, src
));
4489 /* (set (ze (mem)) (const_int)). */
4490 else if (const_int_operand (src
, VOIDmode
))
4492 int size
= bitsize
/ BITS_PER_UNIT
;
4493 rtx src_mem
= adjust_address (force_const_mem (word_mode
, src
), BLKmode
,
4494 GET_MODE_SIZE (word_mode
) - size
);
4496 dest
= adjust_address (dest
, BLKmode
, 0);
4497 set_mem_size (dest
, GEN_INT (size
));
4498 s390_expand_movmem (dest
, src_mem
, GEN_INT (size
));
4501 /* (set (ze (mem)) (reg)). */
4502 else if (register_operand (src
, word_mode
))
4504 if (bitsize
<= GET_MODE_BITSIZE (SImode
))
4505 emit_move_insn (gen_rtx_ZERO_EXTRACT (word_mode
, dest
, op1
,
4509 /* Emit st,stcmh sequence. */
4510 int stcmh_width
= bitsize
- GET_MODE_BITSIZE (SImode
);
4511 int size
= stcmh_width
/ BITS_PER_UNIT
;
4513 emit_move_insn (adjust_address (dest
, SImode
, size
),
4514 gen_lowpart (SImode
, src
));
4515 set_mem_size (dest
, GEN_INT (size
));
4516 emit_move_insn (gen_rtx_ZERO_EXTRACT (word_mode
, dest
, GEN_INT
4517 (stcmh_width
), const0_rtx
),
4518 gen_rtx_LSHIFTRT (word_mode
, src
, GEN_INT
4519 (GET_MODE_BITSIZE (SImode
))));
4528 /* (set (ze (reg)) (const_int)). */
4530 && register_operand (dest
, word_mode
)
4531 && (bitpos
% 16) == 0
4532 && (bitsize
% 16) == 0
4533 && const_int_operand (src
, VOIDmode
))
4535 HOST_WIDE_INT val
= INTVAL (src
);
4536 int regpos
= bitpos
+ bitsize
;
4538 while (regpos
> bitpos
)
4540 enum machine_mode putmode
;
4543 if (TARGET_EXTIMM
&& (regpos
% 32 == 0) && (regpos
>= bitpos
+ 32))
4548 putsize
= GET_MODE_BITSIZE (putmode
);
4550 emit_move_insn (gen_rtx_ZERO_EXTRACT (word_mode
, dest
,
4553 gen_int_mode (val
, putmode
));
4556 gcc_assert (regpos
== bitpos
);
4563 /* A subroutine of s390_expand_cs_hqi and s390_expand_atomic which returns a
4564 register that holds VAL of mode MODE shifted by COUNT bits. */
4567 s390_expand_mask_and_shift (rtx val
, enum machine_mode mode
, rtx count
)
4569 val
= expand_simple_binop (SImode
, AND
, val
, GEN_INT (GET_MODE_MASK (mode
)),
4570 NULL_RTX
, 1, OPTAB_DIRECT
);
4571 return expand_simple_binop (SImode
, ASHIFT
, val
, count
,
4572 NULL_RTX
, 1, OPTAB_DIRECT
);
4575 /* Structure to hold the initial parameters for a compare_and_swap operation
4576 in HImode and QImode. */
4578 struct alignment_context
4580 rtx memsi
; /* SI aligned memory location. */
4581 rtx shift
; /* Bit offset with regard to lsb. */
4582 rtx modemask
; /* Mask of the HQImode shifted by SHIFT bits. */
4583 rtx modemaski
; /* ~modemask */
4584 bool aligned
; /* True if memory is aligned, false else. */
4587 /* A subroutine of s390_expand_cs_hqi and s390_expand_atomic to initialize
4588 structure AC for transparent simplifying, if the memory alignment is known
4589 to be at least 32bit. MEM is the memory location for the actual operation
4590 and MODE its mode. */
4593 init_alignment_context (struct alignment_context
*ac
, rtx mem
,
4594 enum machine_mode mode
)
4596 ac
->shift
= GEN_INT (GET_MODE_SIZE (SImode
) - GET_MODE_SIZE (mode
));
4597 ac
->aligned
= (MEM_ALIGN (mem
) >= GET_MODE_BITSIZE (SImode
));
4600 ac
->memsi
= adjust_address (mem
, SImode
, 0); /* Memory is aligned. */
4603 /* Alignment is unknown. */
4604 rtx byteoffset
, addr
, align
;
4606 /* Force the address into a register. */
4607 addr
= force_reg (Pmode
, XEXP (mem
, 0));
4609 /* Align it to SImode. */
4610 align
= expand_simple_binop (Pmode
, AND
, addr
,
4611 GEN_INT (-GET_MODE_SIZE (SImode
)),
4612 NULL_RTX
, 1, OPTAB_DIRECT
);
4614 ac
->memsi
= gen_rtx_MEM (SImode
, align
);
4615 MEM_VOLATILE_P (ac
->memsi
) = MEM_VOLATILE_P (mem
);
4616 set_mem_alias_set (ac
->memsi
, ALIAS_SET_MEMORY_BARRIER
);
4617 set_mem_align (ac
->memsi
, GET_MODE_BITSIZE (SImode
));
4619 /* Calculate shiftcount. */
4620 byteoffset
= expand_simple_binop (Pmode
, AND
, addr
,
4621 GEN_INT (GET_MODE_SIZE (SImode
) - 1),
4622 NULL_RTX
, 1, OPTAB_DIRECT
);
4623 /* As we already have some offset, evaluate the remaining distance. */
4624 ac
->shift
= expand_simple_binop (SImode
, MINUS
, ac
->shift
, byteoffset
,
4625 NULL_RTX
, 1, OPTAB_DIRECT
);
4628 /* Shift is the byte count, but we need the bitcount. */
4629 ac
->shift
= expand_simple_binop (SImode
, MULT
, ac
->shift
, GEN_INT (BITS_PER_UNIT
),
4630 NULL_RTX
, 1, OPTAB_DIRECT
);
4631 /* Calculate masks. */
4632 ac
->modemask
= expand_simple_binop (SImode
, ASHIFT
,
4633 GEN_INT (GET_MODE_MASK (mode
)), ac
->shift
,
4634 NULL_RTX
, 1, OPTAB_DIRECT
);
4635 ac
->modemaski
= expand_simple_unop (SImode
, NOT
, ac
->modemask
, NULL_RTX
, 1);
4638 /* Expand an atomic compare and swap operation for HImode and QImode. MEM is
4639 the memory location, CMP the old value to compare MEM with and NEW_RTX the value
4640 to set if CMP == MEM.
4641 CMP is never in memory for compare_and_swap_cc because
4642 expand_bool_compare_and_swap puts it into a register for later compare. */
4645 s390_expand_cs_hqi (enum machine_mode mode
, rtx target
, rtx mem
, rtx cmp
, rtx new_rtx
)
4647 struct alignment_context ac
;
4648 rtx cmpv
, newv
, val
, resv
, cc
;
4649 rtx res
= gen_reg_rtx (SImode
);
4650 rtx csloop
= gen_label_rtx ();
4651 rtx csend
= gen_label_rtx ();
4653 gcc_assert (register_operand (target
, VOIDmode
));
4654 gcc_assert (MEM_P (mem
));
4656 init_alignment_context (&ac
, mem
, mode
);
4658 /* Shift the values to the correct bit positions. */
4659 if (!(ac
.aligned
&& MEM_P (cmp
)))
4660 cmp
= s390_expand_mask_and_shift (cmp
, mode
, ac
.shift
);
4661 if (!(ac
.aligned
&& MEM_P (new_rtx
)))
4662 new_rtx
= s390_expand_mask_and_shift (new_rtx
, mode
, ac
.shift
);
4664 /* Load full word. Subsequent loads are performed by CS. */
4665 val
= expand_simple_binop (SImode
, AND
, ac
.memsi
, ac
.modemaski
,
4666 NULL_RTX
, 1, OPTAB_DIRECT
);
4668 /* Start CS loop. */
4669 emit_label (csloop
);
4670 /* val = "<mem>00..0<mem>"
4671 * cmp = "00..0<cmp>00..0"
4672 * new = "00..0<new>00..0"
4675 /* Patch cmp and new with val at correct position. */
4676 if (ac
.aligned
&& MEM_P (cmp
))
4678 cmpv
= force_reg (SImode
, val
);
4679 store_bit_field (cmpv
, GET_MODE_BITSIZE (mode
), 0, SImode
, cmp
);
4682 cmpv
= force_reg (SImode
, expand_simple_binop (SImode
, IOR
, cmp
, val
,
4683 NULL_RTX
, 1, OPTAB_DIRECT
));
4684 if (ac
.aligned
&& MEM_P (new_rtx
))
4686 newv
= force_reg (SImode
, val
);
4687 store_bit_field (newv
, GET_MODE_BITSIZE (mode
), 0, SImode
, new_rtx
);
4690 newv
= force_reg (SImode
, expand_simple_binop (SImode
, IOR
, new_rtx
, val
,
4691 NULL_RTX
, 1, OPTAB_DIRECT
));
4693 /* Jump to end if we're done (likely?). */
4694 s390_emit_jump (csend
, s390_emit_compare_and_swap (EQ
, res
, ac
.memsi
,
4697 /* Check for changes outside mode. */
4698 resv
= expand_simple_binop (SImode
, AND
, res
, ac
.modemaski
,
4699 NULL_RTX
, 1, OPTAB_DIRECT
);
4700 cc
= s390_emit_compare (NE
, resv
, val
);
4701 emit_move_insn (val
, resv
);
4702 /* Loop internal if so. */
4703 s390_emit_jump (csloop
, cc
);
4707 /* Return the correct part of the bitfield. */
4708 convert_move (target
, expand_simple_binop (SImode
, LSHIFTRT
, res
, ac
.shift
,
4709 NULL_RTX
, 1, OPTAB_DIRECT
), 1);
4712 /* Expand an atomic operation CODE of mode MODE. MEM is the memory location
4713 and VAL the value to play with. If AFTER is true then store the value
4714 MEM holds after the operation, if AFTER is false then store the value MEM
4715 holds before the operation. If TARGET is zero then discard that value, else
4716 store it to TARGET. */
4719 s390_expand_atomic (enum machine_mode mode
, enum rtx_code code
,
4720 rtx target
, rtx mem
, rtx val
, bool after
)
4722 struct alignment_context ac
;
4724 rtx new_rtx
= gen_reg_rtx (SImode
);
4725 rtx orig
= gen_reg_rtx (SImode
);
4726 rtx csloop
= gen_label_rtx ();
4728 gcc_assert (!target
|| register_operand (target
, VOIDmode
));
4729 gcc_assert (MEM_P (mem
));
4731 init_alignment_context (&ac
, mem
, mode
);
4733 /* Shift val to the correct bit positions.
4734 Preserve "icm", but prevent "ex icm". */
4735 if (!(ac
.aligned
&& code
== SET
&& MEM_P (val
)))
4736 val
= s390_expand_mask_and_shift (val
, mode
, ac
.shift
);
4738 /* Further preparation insns. */
4739 if (code
== PLUS
|| code
== MINUS
)
4740 emit_move_insn (orig
, val
);
4741 else if (code
== MULT
|| code
== AND
) /* val = "11..1<val>11..1" */
4742 val
= expand_simple_binop (SImode
, XOR
, val
, ac
.modemaski
,
4743 NULL_RTX
, 1, OPTAB_DIRECT
);
4745 /* Load full word. Subsequent loads are performed by CS. */
4746 cmp
= force_reg (SImode
, ac
.memsi
);
4748 /* Start CS loop. */
4749 emit_label (csloop
);
4750 emit_move_insn (new_rtx
, cmp
);
4752 /* Patch new with val at correct position. */
4757 val
= expand_simple_binop (SImode
, code
, new_rtx
, orig
,
4758 NULL_RTX
, 1, OPTAB_DIRECT
);
4759 val
= expand_simple_binop (SImode
, AND
, val
, ac
.modemask
,
4760 NULL_RTX
, 1, OPTAB_DIRECT
);
4763 if (ac
.aligned
&& MEM_P (val
))
4764 store_bit_field (new_rtx
, GET_MODE_BITSIZE (mode
), 0, SImode
, val
);
4767 new_rtx
= expand_simple_binop (SImode
, AND
, new_rtx
, ac
.modemaski
,
4768 NULL_RTX
, 1, OPTAB_DIRECT
);
4769 new_rtx
= expand_simple_binop (SImode
, IOR
, new_rtx
, val
,
4770 NULL_RTX
, 1, OPTAB_DIRECT
);
4776 new_rtx
= expand_simple_binop (SImode
, code
, new_rtx
, val
,
4777 NULL_RTX
, 1, OPTAB_DIRECT
);
4779 case MULT
: /* NAND */
4780 new_rtx
= expand_simple_binop (SImode
, AND
, new_rtx
, val
,
4781 NULL_RTX
, 1, OPTAB_DIRECT
);
4782 new_rtx
= expand_simple_binop (SImode
, XOR
, new_rtx
, ac
.modemask
,
4783 NULL_RTX
, 1, OPTAB_DIRECT
);
4789 s390_emit_jump (csloop
, s390_emit_compare_and_swap (NE
, cmp
,
4790 ac
.memsi
, cmp
, new_rtx
));
4792 /* Return the correct part of the bitfield. */
4794 convert_move (target
, expand_simple_binop (SImode
, LSHIFTRT
,
4795 after
? new_rtx
: cmp
, ac
.shift
,
4796 NULL_RTX
, 1, OPTAB_DIRECT
), 1);
4799 /* This is called from dwarf2out.c via TARGET_ASM_OUTPUT_DWARF_DTPREL.
4800 We need to emit DTP-relative relocations. */
4802 static void s390_output_dwarf_dtprel (FILE *, int, rtx
) ATTRIBUTE_UNUSED
;
4805 s390_output_dwarf_dtprel (FILE *file
, int size
, rtx x
)
4810 fputs ("\t.long\t", file
);
4813 fputs ("\t.quad\t", file
);
4818 output_addr_const (file
, x
);
4819 fputs ("@DTPOFF", file
);
4822 #ifdef TARGET_ALTERNATE_LONG_DOUBLE_MANGLING
4823 /* Implement TARGET_MANGLE_TYPE. */
4826 s390_mangle_type (const_tree type
)
4828 if (TYPE_MAIN_VARIANT (type
) == long_double_type_node
4829 && TARGET_LONG_DOUBLE_128
)
4832 /* For all other types, use normal C++ mangling. */
4837 /* In the name of slightly smaller debug output, and to cater to
4838 general assembler lossage, recognize various UNSPEC sequences
4839 and turn them back into a direct symbol reference. */
4842 s390_delegitimize_address (rtx orig_x
)
4846 orig_x
= delegitimize_mem_from_attrs (orig_x
);
4848 if (GET_CODE (x
) != MEM
)
4852 if (GET_CODE (x
) == PLUS
4853 && GET_CODE (XEXP (x
, 1)) == CONST
4854 && GET_CODE (XEXP (x
, 0)) == REG
4855 && REGNO (XEXP (x
, 0)) == PIC_OFFSET_TABLE_REGNUM
)
4857 y
= XEXP (XEXP (x
, 1), 0);
4858 if (GET_CODE (y
) == UNSPEC
4859 && XINT (y
, 1) == UNSPEC_GOT
)
4860 return XVECEXP (y
, 0, 0);
4864 if (GET_CODE (x
) == CONST
)
4867 if (GET_CODE (y
) == UNSPEC
4868 && XINT (y
, 1) == UNSPEC_GOTENT
)
4869 return XVECEXP (y
, 0, 0);
4876 /* Output operand OP to stdio stream FILE.
4877 OP is an address (register + offset) which is not used to address data;
4878 instead the rightmost bits are interpreted as the value. */
4881 print_shift_count_operand (FILE *file
, rtx op
)
4883 HOST_WIDE_INT offset
;
4886 /* Extract base register and offset. */
4887 if (!s390_decompose_shift_count (op
, &base
, &offset
))
4893 gcc_assert (GET_CODE (base
) == REG
);
4894 gcc_assert (REGNO (base
) < FIRST_PSEUDO_REGISTER
);
4895 gcc_assert (REGNO_REG_CLASS (REGNO (base
)) == ADDR_REGS
);
4898 /* Offsets are constricted to twelve bits. */
4899 fprintf (file
, HOST_WIDE_INT_PRINT_DEC
, offset
& ((1 << 12) - 1));
4901 fprintf (file
, "(%s)", reg_names
[REGNO (base
)]);
4904 /* See 'get_some_local_dynamic_name'. */
4907 get_some_local_dynamic_name_1 (rtx
*px
, void *data ATTRIBUTE_UNUSED
)
4911 if (GET_CODE (x
) == SYMBOL_REF
&& CONSTANT_POOL_ADDRESS_P (x
))
4913 x
= get_pool_constant (x
);
4914 return for_each_rtx (&x
, get_some_local_dynamic_name_1
, 0);
4917 if (GET_CODE (x
) == SYMBOL_REF
4918 && tls_symbolic_operand (x
) == TLS_MODEL_LOCAL_DYNAMIC
)
4920 cfun
->machine
->some_ld_name
= XSTR (x
, 0);
4927 /* Locate some local-dynamic symbol still in use by this function
4928 so that we can print its name in local-dynamic base patterns. */
4931 get_some_local_dynamic_name (void)
4935 if (cfun
->machine
->some_ld_name
)
4936 return cfun
->machine
->some_ld_name
;
4938 for (insn
= get_insns (); insn
; insn
= NEXT_INSN (insn
))
4940 && for_each_rtx (&PATTERN (insn
), get_some_local_dynamic_name_1
, 0))
4941 return cfun
->machine
->some_ld_name
;
4946 /* Output machine-dependent UNSPECs occurring in address constant X
4947 in assembler syntax to stdio stream FILE. Returns true if the
4948 constant X could be recognized, false otherwise. */
4951 s390_output_addr_const_extra (FILE *file
, rtx x
)
4953 if (GET_CODE (x
) == UNSPEC
&& XVECLEN (x
, 0) == 1)
4954 switch (XINT (x
, 1))
4957 output_addr_const (file
, XVECEXP (x
, 0, 0));
4958 fprintf (file
, "@GOTENT");
4961 output_addr_const (file
, XVECEXP (x
, 0, 0));
4962 fprintf (file
, "@GOT");
4965 output_addr_const (file
, XVECEXP (x
, 0, 0));
4966 fprintf (file
, "@GOTOFF");
4969 output_addr_const (file
, XVECEXP (x
, 0, 0));
4970 fprintf (file
, "@PLT");
4973 output_addr_const (file
, XVECEXP (x
, 0, 0));
4974 fprintf (file
, "@PLTOFF");
4977 output_addr_const (file
, XVECEXP (x
, 0, 0));
4978 fprintf (file
, "@TLSGD");
4981 assemble_name (file
, get_some_local_dynamic_name ());
4982 fprintf (file
, "@TLSLDM");
4985 output_addr_const (file
, XVECEXP (x
, 0, 0));
4986 fprintf (file
, "@DTPOFF");
4989 output_addr_const (file
, XVECEXP (x
, 0, 0));
4990 fprintf (file
, "@NTPOFF");
4992 case UNSPEC_GOTNTPOFF
:
4993 output_addr_const (file
, XVECEXP (x
, 0, 0));
4994 fprintf (file
, "@GOTNTPOFF");
4996 case UNSPEC_INDNTPOFF
:
4997 output_addr_const (file
, XVECEXP (x
, 0, 0));
4998 fprintf (file
, "@INDNTPOFF");
5002 if (GET_CODE (x
) == UNSPEC
&& XVECLEN (x
, 0) == 2)
5003 switch (XINT (x
, 1))
5005 case UNSPEC_POOL_OFFSET
:
5006 x
= gen_rtx_MINUS (GET_MODE (x
), XVECEXP (x
, 0, 0), XVECEXP (x
, 0, 1));
5007 output_addr_const (file
, x
);
5013 /* Output address operand ADDR in assembler syntax to
5014 stdio stream FILE. */
5017 print_operand_address (FILE *file
, rtx addr
)
5019 struct s390_address ad
;
5021 if (s390_symref_operand_p (addr
, NULL
, NULL
))
5023 gcc_assert (TARGET_Z10
);
5024 output_addr_const (file
, addr
);
5028 if (!s390_decompose_address (addr
, &ad
)
5029 || (ad
.base
&& !REGNO_OK_FOR_BASE_P (REGNO (ad
.base
)))
5030 || (ad
.indx
&& !REGNO_OK_FOR_INDEX_P (REGNO (ad
.indx
))))
5031 output_operand_lossage ("cannot decompose address");
5034 output_addr_const (file
, ad
.disp
);
5036 fprintf (file
, "0");
5038 if (ad
.base
&& ad
.indx
)
5039 fprintf (file
, "(%s,%s)", reg_names
[REGNO (ad
.indx
)],
5040 reg_names
[REGNO (ad
.base
)]);
5042 fprintf (file
, "(%s)", reg_names
[REGNO (ad
.base
)]);
5045 /* Output operand X in assembler syntax to stdio stream FILE.
5046 CODE specified the format flag. The following format flags
5049 'C': print opcode suffix for branch condition.
5050 'D': print opcode suffix for inverse branch condition.
5051 'E': print opcode suffix for branch on index instruction.
5052 'J': print tls_load/tls_gdcall/tls_ldcall suffix
5053 'G': print the size of the operand in bytes.
5054 'O': print only the displacement of a memory reference.
5055 'R': print only the base register of a memory reference.
5056 'S': print S-type memory reference (base+displacement).
5057 'N': print the second word of a DImode operand.
5058 'M': print the second word of a TImode operand.
5059 'Y': print shift count operand.
5061 'b': print integer X as if it's an unsigned byte.
5062 'c': print integer X as if it's an signed byte.
5063 'x': print integer X as if it's an unsigned halfword.
5064 'h': print integer X as if it's a signed halfword.
5065 'i': print the first nonzero HImode part of X.
5066 'j': print the first HImode part unequal to -1 of X.
5067 'k': print the first nonzero SImode part of X.
5068 'm': print the first SImode part unequal to -1 of X.
5069 'o': print integer X as if it's an unsigned 32bit word. */
5072 print_operand (FILE *file
, rtx x
, int code
)
5077 fprintf (file
, s390_branch_condition_mnemonic (x
, FALSE
));
5081 fprintf (file
, s390_branch_condition_mnemonic (x
, TRUE
));
5085 if (GET_CODE (x
) == LE
)
5086 fprintf (file
, "l");
5087 else if (GET_CODE (x
) == GT
)
5088 fprintf (file
, "h");
5094 if (GET_CODE (x
) == SYMBOL_REF
)
5096 fprintf (file
, "%s", ":tls_load:");
5097 output_addr_const (file
, x
);
5099 else if (GET_CODE (x
) == UNSPEC
&& XINT (x
, 1) == UNSPEC_TLSGD
)
5101 fprintf (file
, "%s", ":tls_gdcall:");
5102 output_addr_const (file
, XVECEXP (x
, 0, 0));
5104 else if (GET_CODE (x
) == UNSPEC
&& XINT (x
, 1) == UNSPEC_TLSLDM
)
5106 fprintf (file
, "%s", ":tls_ldcall:");
5107 assemble_name (file
, get_some_local_dynamic_name ());
5114 fprintf (file
, "%u", GET_MODE_SIZE (GET_MODE (x
)));
5119 struct s390_address ad
;
5122 gcc_assert (GET_CODE (x
) == MEM
);
5123 ret
= s390_decompose_address (XEXP (x
, 0), &ad
);
5125 gcc_assert (!ad
.base
|| REGNO_OK_FOR_BASE_P (REGNO (ad
.base
)));
5126 gcc_assert (!ad
.indx
);
5129 output_addr_const (file
, ad
.disp
);
5131 fprintf (file
, "0");
5137 struct s390_address ad
;
5140 gcc_assert (GET_CODE (x
) == MEM
);
5141 ret
= s390_decompose_address (XEXP (x
, 0), &ad
);
5143 gcc_assert (!ad
.base
|| REGNO_OK_FOR_BASE_P (REGNO (ad
.base
)));
5144 gcc_assert (!ad
.indx
);
5147 fprintf (file
, "%s", reg_names
[REGNO (ad
.base
)]);
5149 fprintf (file
, "0");
5155 struct s390_address ad
;
5158 gcc_assert (GET_CODE (x
) == MEM
);
5159 ret
= s390_decompose_address (XEXP (x
, 0), &ad
);
5161 gcc_assert (!ad
.base
|| REGNO_OK_FOR_BASE_P (REGNO (ad
.base
)));
5162 gcc_assert (!ad
.indx
);
5165 output_addr_const (file
, ad
.disp
);
5167 fprintf (file
, "0");
5170 fprintf (file
, "(%s)", reg_names
[REGNO (ad
.base
)]);
5175 if (GET_CODE (x
) == REG
)
5176 x
= gen_rtx_REG (GET_MODE (x
), REGNO (x
) + 1);
5177 else if (GET_CODE (x
) == MEM
)
5178 x
= change_address (x
, VOIDmode
, plus_constant (XEXP (x
, 0), 4));
5184 if (GET_CODE (x
) == REG
)
5185 x
= gen_rtx_REG (GET_MODE (x
), REGNO (x
) + 1);
5186 else if (GET_CODE (x
) == MEM
)
5187 x
= change_address (x
, VOIDmode
, plus_constant (XEXP (x
, 0), 8));
5193 print_shift_count_operand (file
, x
);
5197 switch (GET_CODE (x
))
5200 fprintf (file
, "%s", reg_names
[REGNO (x
)]);
5204 output_address (XEXP (x
, 0));
5211 output_addr_const (file
, x
);
5216 fprintf (file
, HOST_WIDE_INT_PRINT_DEC
, INTVAL (x
) & 0xff);
5217 else if (code
== 'c')
5218 fprintf (file
, HOST_WIDE_INT_PRINT_DEC
, ((INTVAL (x
) & 0xff) ^ 0x80) - 0x80);
5219 else if (code
== 'x')
5220 fprintf (file
, HOST_WIDE_INT_PRINT_DEC
, INTVAL (x
) & 0xffff);
5221 else if (code
== 'h')
5222 fprintf (file
, HOST_WIDE_INT_PRINT_DEC
, ((INTVAL (x
) & 0xffff) ^ 0x8000) - 0x8000);
5223 else if (code
== 'i')
5224 fprintf (file
, HOST_WIDE_INT_PRINT_DEC
,
5225 s390_extract_part (x
, HImode
, 0));
5226 else if (code
== 'j')
5227 fprintf (file
, HOST_WIDE_INT_PRINT_DEC
,
5228 s390_extract_part (x
, HImode
, -1));
5229 else if (code
== 'k')
5230 fprintf (file
, HOST_WIDE_INT_PRINT_DEC
,
5231 s390_extract_part (x
, SImode
, 0));
5232 else if (code
== 'm')
5233 fprintf (file
, HOST_WIDE_INT_PRINT_DEC
,
5234 s390_extract_part (x
, SImode
, -1));
5235 else if (code
== 'o')
5236 fprintf (file
, HOST_WIDE_INT_PRINT_DEC
, INTVAL (x
) & 0xffffffff);
5238 fprintf (file
, HOST_WIDE_INT_PRINT_DEC
, INTVAL (x
));
5242 gcc_assert (GET_MODE (x
) == VOIDmode
);
5244 fprintf (file
, HOST_WIDE_INT_PRINT_DEC
, CONST_DOUBLE_LOW (x
) & 0xff);
5245 else if (code
== 'x')
5246 fprintf (file
, HOST_WIDE_INT_PRINT_DEC
, CONST_DOUBLE_LOW (x
) & 0xffff);
5247 else if (code
== 'h')
5248 fprintf (file
, HOST_WIDE_INT_PRINT_DEC
, ((CONST_DOUBLE_LOW (x
) & 0xffff) ^ 0x8000) - 0x8000);
5254 fatal_insn ("UNKNOWN in print_operand !?", x
);
5259 /* Target hook for assembling integer objects. We need to define it
5260 here to work a round a bug in some versions of GAS, which couldn't
5261 handle values smaller than INT_MIN when printed in decimal. */
5264 s390_assemble_integer (rtx x
, unsigned int size
, int aligned_p
)
5266 if (size
== 8 && aligned_p
5267 && GET_CODE (x
) == CONST_INT
&& INTVAL (x
) < INT_MIN
)
5269 fprintf (asm_out_file
, "\t.quad\t" HOST_WIDE_INT_PRINT_HEX
"\n",
5273 return default_assemble_integer (x
, size
, aligned_p
);
5276 /* Returns true if register REGNO is used for forming
5277 a memory address in expression X. */
5280 reg_used_in_mem_p (int regno
, rtx x
)
5282 enum rtx_code code
= GET_CODE (x
);
5288 if (refers_to_regno_p (regno
, regno
+1,
5292 else if (code
== SET
5293 && GET_CODE (SET_DEST (x
)) == PC
)
5295 if (refers_to_regno_p (regno
, regno
+1,
5300 fmt
= GET_RTX_FORMAT (code
);
5301 for (i
= GET_RTX_LENGTH (code
) - 1; i
>= 0; i
--)
5304 && reg_used_in_mem_p (regno
, XEXP (x
, i
)))
5307 else if (fmt
[i
] == 'E')
5308 for (j
= 0; j
< XVECLEN (x
, i
); j
++)
5309 if (reg_used_in_mem_p (regno
, XVECEXP (x
, i
, j
)))
5315 /* Returns true if expression DEP_RTX sets an address register
5316 used by instruction INSN to address memory. */
5319 addr_generation_dependency_p (rtx dep_rtx
, rtx insn
)
5323 if (GET_CODE (dep_rtx
) == INSN
)
5324 dep_rtx
= PATTERN (dep_rtx
);
5326 if (GET_CODE (dep_rtx
) == SET
)
5328 target
= SET_DEST (dep_rtx
);
5329 if (GET_CODE (target
) == STRICT_LOW_PART
)
5330 target
= XEXP (target
, 0);
5331 while (GET_CODE (target
) == SUBREG
)
5332 target
= SUBREG_REG (target
);
5334 if (GET_CODE (target
) == REG
)
5336 int regno
= REGNO (target
);
5338 if (s390_safe_attr_type (insn
) == TYPE_LA
)
5340 pat
= PATTERN (insn
);
5341 if (GET_CODE (pat
) == PARALLEL
)
5343 gcc_assert (XVECLEN (pat
, 0) == 2);
5344 pat
= XVECEXP (pat
, 0, 0);
5346 gcc_assert (GET_CODE (pat
) == SET
);
5347 return refers_to_regno_p (regno
, regno
+1, SET_SRC (pat
), 0);
5349 else if (get_attr_atype (insn
) == ATYPE_AGEN
)
5350 return reg_used_in_mem_p (regno
, PATTERN (insn
));
5356 /* Return 1, if dep_insn sets register used in insn in the agen unit. */
5359 s390_agen_dep_p (rtx dep_insn
, rtx insn
)
5361 rtx dep_rtx
= PATTERN (dep_insn
);
5364 if (GET_CODE (dep_rtx
) == SET
5365 && addr_generation_dependency_p (dep_rtx
, insn
))
5367 else if (GET_CODE (dep_rtx
) == PARALLEL
)
5369 for (i
= 0; i
< XVECLEN (dep_rtx
, 0); i
++)
5371 if (addr_generation_dependency_p (XVECEXP (dep_rtx
, 0, i
), insn
))
5379 /* A C statement (sans semicolon) to update the integer scheduling priority
5380 INSN_PRIORITY (INSN). Increase the priority to execute the INSN earlier,
5381 reduce the priority to execute INSN later. Do not define this macro if
5382 you do not need to adjust the scheduling priorities of insns.
5384 A STD instruction should be scheduled earlier,
5385 in order to use the bypass. */
5389 s390_adjust_priority (rtx insn ATTRIBUTE_UNUSED
, int priority
)
5391 if (! INSN_P (insn
))
5394 if (s390_tune
!= PROCESSOR_2084_Z990
5395 && s390_tune
!= PROCESSOR_2094_Z9_109
5396 && s390_tune
!= PROCESSOR_2097_Z10
)
5399 switch (s390_safe_attr_type (insn
))
5403 priority
= priority
<< 3;
5407 priority
= priority
<< 1;
5416 /* The number of instructions that can be issued per cycle. */
5419 s390_issue_rate (void)
5423 case PROCESSOR_2084_Z990
:
5424 case PROCESSOR_2094_Z9_109
:
5426 case PROCESSOR_2097_Z10
:
5434 s390_first_cycle_multipass_dfa_lookahead (void)
5439 /* Annotate every literal pool reference in X by an UNSPEC_LTREF expression.
5440 Fix up MEMs as required. */
5443 annotate_constant_pool_refs (rtx
*x
)
5448 gcc_assert (GET_CODE (*x
) != SYMBOL_REF
5449 || !CONSTANT_POOL_ADDRESS_P (*x
));
5451 /* Literal pool references can only occur inside a MEM ... */
5452 if (GET_CODE (*x
) == MEM
)
5454 rtx memref
= XEXP (*x
, 0);
5456 if (GET_CODE (memref
) == SYMBOL_REF
5457 && CONSTANT_POOL_ADDRESS_P (memref
))
5459 rtx base
= cfun
->machine
->base_reg
;
5460 rtx addr
= gen_rtx_UNSPEC (Pmode
, gen_rtvec (2, memref
, base
),
5463 *x
= replace_equiv_address (*x
, addr
);
5467 if (GET_CODE (memref
) == CONST
5468 && GET_CODE (XEXP (memref
, 0)) == PLUS
5469 && GET_CODE (XEXP (XEXP (memref
, 0), 1)) == CONST_INT
5470 && GET_CODE (XEXP (XEXP (memref
, 0), 0)) == SYMBOL_REF
5471 && CONSTANT_POOL_ADDRESS_P (XEXP (XEXP (memref
, 0), 0)))
5473 HOST_WIDE_INT off
= INTVAL (XEXP (XEXP (memref
, 0), 1));
5474 rtx sym
= XEXP (XEXP (memref
, 0), 0);
5475 rtx base
= cfun
->machine
->base_reg
;
5476 rtx addr
= gen_rtx_UNSPEC (Pmode
, gen_rtvec (2, sym
, base
),
5479 *x
= replace_equiv_address (*x
, plus_constant (addr
, off
));
5484 /* ... or a load-address type pattern. */
5485 if (GET_CODE (*x
) == SET
)
5487 rtx addrref
= SET_SRC (*x
);
5489 if (GET_CODE (addrref
) == SYMBOL_REF
5490 && CONSTANT_POOL_ADDRESS_P (addrref
))
5492 rtx base
= cfun
->machine
->base_reg
;
5493 rtx addr
= gen_rtx_UNSPEC (Pmode
, gen_rtvec (2, addrref
, base
),
5496 SET_SRC (*x
) = addr
;
5500 if (GET_CODE (addrref
) == CONST
5501 && GET_CODE (XEXP (addrref
, 0)) == PLUS
5502 && GET_CODE (XEXP (XEXP (addrref
, 0), 1)) == CONST_INT
5503 && GET_CODE (XEXP (XEXP (addrref
, 0), 0)) == SYMBOL_REF
5504 && CONSTANT_POOL_ADDRESS_P (XEXP (XEXP (addrref
, 0), 0)))
5506 HOST_WIDE_INT off
= INTVAL (XEXP (XEXP (addrref
, 0), 1));
5507 rtx sym
= XEXP (XEXP (addrref
, 0), 0);
5508 rtx base
= cfun
->machine
->base_reg
;
5509 rtx addr
= gen_rtx_UNSPEC (Pmode
, gen_rtvec (2, sym
, base
),
5512 SET_SRC (*x
) = plus_constant (addr
, off
);
5517 /* Annotate LTREL_BASE as well. */
5518 if (GET_CODE (*x
) == UNSPEC
5519 && XINT (*x
, 1) == UNSPEC_LTREL_BASE
)
5521 rtx base
= cfun
->machine
->base_reg
;
5522 *x
= gen_rtx_UNSPEC (Pmode
, gen_rtvec (2, XVECEXP (*x
, 0, 0), base
),
5527 fmt
= GET_RTX_FORMAT (GET_CODE (*x
));
5528 for (i
= GET_RTX_LENGTH (GET_CODE (*x
)) - 1; i
>= 0; i
--)
5532 annotate_constant_pool_refs (&XEXP (*x
, i
));
5534 else if (fmt
[i
] == 'E')
5536 for (j
= 0; j
< XVECLEN (*x
, i
); j
++)
5537 annotate_constant_pool_refs (&XVECEXP (*x
, i
, j
));
5542 /* Split all branches that exceed the maximum distance.
5543 Returns true if this created a new literal pool entry. */
5546 s390_split_branches (void)
5548 rtx temp_reg
= gen_rtx_REG (Pmode
, RETURN_REGNUM
);
5549 int new_literal
= 0, ret
;
5550 rtx insn
, pat
, tmp
, target
;
5553 /* We need correct insn addresses. */
5555 shorten_branches (get_insns ());
5557 /* Find all branches that exceed 64KB, and split them. */
5559 for (insn
= get_insns (); insn
; insn
= NEXT_INSN (insn
))
5561 if (GET_CODE (insn
) != JUMP_INSN
)
5564 pat
= PATTERN (insn
);
5565 if (GET_CODE (pat
) == PARALLEL
&& XVECLEN (pat
, 0) > 2)
5566 pat
= XVECEXP (pat
, 0, 0);
5567 if (GET_CODE (pat
) != SET
|| SET_DEST (pat
) != pc_rtx
)
5570 if (GET_CODE (SET_SRC (pat
)) == LABEL_REF
)
5572 label
= &SET_SRC (pat
);
5574 else if (GET_CODE (SET_SRC (pat
)) == IF_THEN_ELSE
)
5576 if (GET_CODE (XEXP (SET_SRC (pat
), 1)) == LABEL_REF
)
5577 label
= &XEXP (SET_SRC (pat
), 1);
5578 else if (GET_CODE (XEXP (SET_SRC (pat
), 2)) == LABEL_REF
)
5579 label
= &XEXP (SET_SRC (pat
), 2);
5586 if (get_attr_length (insn
) <= 4)
5589 /* We are going to use the return register as scratch register,
5590 make sure it will be saved/restored by the prologue/epilogue. */
5591 cfun_frame_layout
.save_return_addr_p
= 1;
5596 tmp
= force_const_mem (Pmode
, *label
);
5597 tmp
= emit_insn_before (gen_rtx_SET (Pmode
, temp_reg
, tmp
), insn
);
5598 INSN_ADDRESSES_NEW (tmp
, -1);
5599 annotate_constant_pool_refs (&PATTERN (tmp
));
5606 target
= gen_rtx_UNSPEC (Pmode
, gen_rtvec (1, *label
),
5607 UNSPEC_LTREL_OFFSET
);
5608 target
= gen_rtx_CONST (Pmode
, target
);
5609 target
= force_const_mem (Pmode
, target
);
5610 tmp
= emit_insn_before (gen_rtx_SET (Pmode
, temp_reg
, target
), insn
);
5611 INSN_ADDRESSES_NEW (tmp
, -1);
5612 annotate_constant_pool_refs (&PATTERN (tmp
));
5614 target
= gen_rtx_UNSPEC (Pmode
, gen_rtvec (2, XEXP (target
, 0),
5615 cfun
->machine
->base_reg
),
5617 target
= gen_rtx_PLUS (Pmode
, temp_reg
, target
);
5620 ret
= validate_change (insn
, label
, target
, 0);
5628 /* Find an annotated literal pool symbol referenced in RTX X,
5629 and store it at REF. Will abort if X contains references to
5630 more than one such pool symbol; multiple references to the same
5631 symbol are allowed, however.
5633 The rtx pointed to by REF must be initialized to NULL_RTX
5634 by the caller before calling this routine. */
5637 find_constant_pool_ref (rtx x
, rtx
*ref
)
5642 /* Ignore LTREL_BASE references. */
5643 if (GET_CODE (x
) == UNSPEC
5644 && XINT (x
, 1) == UNSPEC_LTREL_BASE
)
5646 /* Likewise POOL_ENTRY insns. */
5647 if (GET_CODE (x
) == UNSPEC_VOLATILE
5648 && XINT (x
, 1) == UNSPECV_POOL_ENTRY
)
5651 gcc_assert (GET_CODE (x
) != SYMBOL_REF
5652 || !CONSTANT_POOL_ADDRESS_P (x
));
5654 if (GET_CODE (x
) == UNSPEC
&& XINT (x
, 1) == UNSPEC_LTREF
)
5656 rtx sym
= XVECEXP (x
, 0, 0);
5657 gcc_assert (GET_CODE (sym
) == SYMBOL_REF
5658 && CONSTANT_POOL_ADDRESS_P (sym
));
5660 if (*ref
== NULL_RTX
)
5663 gcc_assert (*ref
== sym
);
5668 fmt
= GET_RTX_FORMAT (GET_CODE (x
));
5669 for (i
= GET_RTX_LENGTH (GET_CODE (x
)) - 1; i
>= 0; i
--)
5673 find_constant_pool_ref (XEXP (x
, i
), ref
);
5675 else if (fmt
[i
] == 'E')
5677 for (j
= 0; j
< XVECLEN (x
, i
); j
++)
5678 find_constant_pool_ref (XVECEXP (x
, i
, j
), ref
);
5683 /* Replace every reference to the annotated literal pool
5684 symbol REF in X by its base plus OFFSET. */
5687 replace_constant_pool_ref (rtx
*x
, rtx ref
, rtx offset
)
5692 gcc_assert (*x
!= ref
);
5694 if (GET_CODE (*x
) == UNSPEC
5695 && XINT (*x
, 1) == UNSPEC_LTREF
5696 && XVECEXP (*x
, 0, 0) == ref
)
5698 *x
= gen_rtx_PLUS (Pmode
, XVECEXP (*x
, 0, 1), offset
);
5702 if (GET_CODE (*x
) == PLUS
5703 && GET_CODE (XEXP (*x
, 1)) == CONST_INT
5704 && GET_CODE (XEXP (*x
, 0)) == UNSPEC
5705 && XINT (XEXP (*x
, 0), 1) == UNSPEC_LTREF
5706 && XVECEXP (XEXP (*x
, 0), 0, 0) == ref
)
5708 rtx addr
= gen_rtx_PLUS (Pmode
, XVECEXP (XEXP (*x
, 0), 0, 1), offset
);
5709 *x
= plus_constant (addr
, INTVAL (XEXP (*x
, 1)));
5713 fmt
= GET_RTX_FORMAT (GET_CODE (*x
));
5714 for (i
= GET_RTX_LENGTH (GET_CODE (*x
)) - 1; i
>= 0; i
--)
5718 replace_constant_pool_ref (&XEXP (*x
, i
), ref
, offset
);
5720 else if (fmt
[i
] == 'E')
5722 for (j
= 0; j
< XVECLEN (*x
, i
); j
++)
5723 replace_constant_pool_ref (&XVECEXP (*x
, i
, j
), ref
, offset
);
5728 /* Check whether X contains an UNSPEC_LTREL_BASE.
5729 Return its constant pool symbol if found, NULL_RTX otherwise. */
5732 find_ltrel_base (rtx x
)
5737 if (GET_CODE (x
) == UNSPEC
5738 && XINT (x
, 1) == UNSPEC_LTREL_BASE
)
5739 return XVECEXP (x
, 0, 0);
5741 fmt
= GET_RTX_FORMAT (GET_CODE (x
));
5742 for (i
= GET_RTX_LENGTH (GET_CODE (x
)) - 1; i
>= 0; i
--)
5746 rtx fnd
= find_ltrel_base (XEXP (x
, i
));
5750 else if (fmt
[i
] == 'E')
5752 for (j
= 0; j
< XVECLEN (x
, i
); j
++)
5754 rtx fnd
= find_ltrel_base (XVECEXP (x
, i
, j
));
5764 /* Replace any occurrence of UNSPEC_LTREL_BASE in X with its base. */
5767 replace_ltrel_base (rtx
*x
)
5772 if (GET_CODE (*x
) == UNSPEC
5773 && XINT (*x
, 1) == UNSPEC_LTREL_BASE
)
5775 *x
= XVECEXP (*x
, 0, 1);
5779 fmt
= GET_RTX_FORMAT (GET_CODE (*x
));
5780 for (i
= GET_RTX_LENGTH (GET_CODE (*x
)) - 1; i
>= 0; i
--)
5784 replace_ltrel_base (&XEXP (*x
, i
));
5786 else if (fmt
[i
] == 'E')
5788 for (j
= 0; j
< XVECLEN (*x
, i
); j
++)
5789 replace_ltrel_base (&XVECEXP (*x
, i
, j
));
5795 /* We keep a list of constants which we have to add to internal
5796 constant tables in the middle of large functions. */
5798 #define NR_C_MODES 11
5799 enum machine_mode constant_modes
[NR_C_MODES
] =
5801 TFmode
, TImode
, TDmode
,
5802 DFmode
, DImode
, DDmode
,
5803 SFmode
, SImode
, SDmode
,
5810 struct constant
*next
;
5815 struct constant_pool
5817 struct constant_pool
*next
;
5821 rtx emit_pool_after
;
5823 struct constant
*constants
[NR_C_MODES
];
5824 struct constant
*execute
;
5829 /* Allocate new constant_pool structure. */
5831 static struct constant_pool
*
5832 s390_alloc_pool (void)
5834 struct constant_pool
*pool
;
5837 pool
= (struct constant_pool
*) xmalloc (sizeof *pool
);
5839 for (i
= 0; i
< NR_C_MODES
; i
++)
5840 pool
->constants
[i
] = NULL
;
5842 pool
->execute
= NULL
;
5843 pool
->label
= gen_label_rtx ();
5844 pool
->first_insn
= NULL_RTX
;
5845 pool
->pool_insn
= NULL_RTX
;
5846 pool
->insns
= BITMAP_ALLOC (NULL
);
5848 pool
->emit_pool_after
= NULL_RTX
;
5853 /* Create new constant pool covering instructions starting at INSN
5854 and chain it to the end of POOL_LIST. */
5856 static struct constant_pool
*
5857 s390_start_pool (struct constant_pool
**pool_list
, rtx insn
)
5859 struct constant_pool
*pool
, **prev
;
5861 pool
= s390_alloc_pool ();
5862 pool
->first_insn
= insn
;
5864 for (prev
= pool_list
; *prev
; prev
= &(*prev
)->next
)
5871 /* End range of instructions covered by POOL at INSN and emit
5872 placeholder insn representing the pool. */
5875 s390_end_pool (struct constant_pool
*pool
, rtx insn
)
5877 rtx pool_size
= GEN_INT (pool
->size
+ 8 /* alignment slop */);
5880 insn
= get_last_insn ();
5882 pool
->pool_insn
= emit_insn_after (gen_pool (pool_size
), insn
);
5883 INSN_ADDRESSES_NEW (pool
->pool_insn
, -1);
5886 /* Add INSN to the list of insns covered by POOL. */
5889 s390_add_pool_insn (struct constant_pool
*pool
, rtx insn
)
5891 bitmap_set_bit (pool
->insns
, INSN_UID (insn
));
5894 /* Return pool out of POOL_LIST that covers INSN. */
5896 static struct constant_pool
*
5897 s390_find_pool (struct constant_pool
*pool_list
, rtx insn
)
5899 struct constant_pool
*pool
;
5901 for (pool
= pool_list
; pool
; pool
= pool
->next
)
5902 if (bitmap_bit_p (pool
->insns
, INSN_UID (insn
)))
5908 /* Add constant VAL of mode MODE to the constant pool POOL. */
5911 s390_add_constant (struct constant_pool
*pool
, rtx val
, enum machine_mode mode
)
5916 for (i
= 0; i
< NR_C_MODES
; i
++)
5917 if (constant_modes
[i
] == mode
)
5919 gcc_assert (i
!= NR_C_MODES
);
5921 for (c
= pool
->constants
[i
]; c
!= NULL
; c
= c
->next
)
5922 if (rtx_equal_p (val
, c
->value
))
5927 c
= (struct constant
*) xmalloc (sizeof *c
);
5929 c
->label
= gen_label_rtx ();
5930 c
->next
= pool
->constants
[i
];
5931 pool
->constants
[i
] = c
;
5932 pool
->size
+= GET_MODE_SIZE (mode
);
5936 /* Return an rtx that represents the offset of X from the start of
5940 s390_pool_offset (struct constant_pool
*pool
, rtx x
)
5944 label
= gen_rtx_LABEL_REF (GET_MODE (x
), pool
->label
);
5945 x
= gen_rtx_UNSPEC (GET_MODE (x
), gen_rtvec (2, x
, label
),
5946 UNSPEC_POOL_OFFSET
);
5947 return gen_rtx_CONST (GET_MODE (x
), x
);
5950 /* Find constant VAL of mode MODE in the constant pool POOL.
5951 Return an RTX describing the distance from the start of
5952 the pool to the location of the new constant. */
5955 s390_find_constant (struct constant_pool
*pool
, rtx val
,
5956 enum machine_mode mode
)
5961 for (i
= 0; i
< NR_C_MODES
; i
++)
5962 if (constant_modes
[i
] == mode
)
5964 gcc_assert (i
!= NR_C_MODES
);
5966 for (c
= pool
->constants
[i
]; c
!= NULL
; c
= c
->next
)
5967 if (rtx_equal_p (val
, c
->value
))
5972 return s390_pool_offset (pool
, gen_rtx_LABEL_REF (Pmode
, c
->label
));
5975 /* Check whether INSN is an execute. Return the label_ref to its
5976 execute target template if so, NULL_RTX otherwise. */
5979 s390_execute_label (rtx insn
)
5981 if (GET_CODE (insn
) == INSN
5982 && GET_CODE (PATTERN (insn
)) == PARALLEL
5983 && GET_CODE (XVECEXP (PATTERN (insn
), 0, 0)) == UNSPEC
5984 && XINT (XVECEXP (PATTERN (insn
), 0, 0), 1) == UNSPEC_EXECUTE
)
5985 return XVECEXP (XVECEXP (PATTERN (insn
), 0, 0), 0, 2);
5990 /* Add execute target for INSN to the constant pool POOL. */
5993 s390_add_execute (struct constant_pool
*pool
, rtx insn
)
5997 for (c
= pool
->execute
; c
!= NULL
; c
= c
->next
)
5998 if (INSN_UID (insn
) == INSN_UID (c
->value
))
6003 c
= (struct constant
*) xmalloc (sizeof *c
);
6005 c
->label
= gen_label_rtx ();
6006 c
->next
= pool
->execute
;
6012 /* Find execute target for INSN in the constant pool POOL.
6013 Return an RTX describing the distance from the start of
6014 the pool to the location of the execute target. */
6017 s390_find_execute (struct constant_pool
*pool
, rtx insn
)
6021 for (c
= pool
->execute
; c
!= NULL
; c
= c
->next
)
6022 if (INSN_UID (insn
) == INSN_UID (c
->value
))
6027 return s390_pool_offset (pool
, gen_rtx_LABEL_REF (Pmode
, c
->label
));
6030 /* For an execute INSN, extract the execute target template. */
6033 s390_execute_target (rtx insn
)
6035 rtx pattern
= PATTERN (insn
);
6036 gcc_assert (s390_execute_label (insn
));
6038 if (XVECLEN (pattern
, 0) == 2)
6040 pattern
= copy_rtx (XVECEXP (pattern
, 0, 1));
6044 rtvec vec
= rtvec_alloc (XVECLEN (pattern
, 0) - 1);
6047 for (i
= 0; i
< XVECLEN (pattern
, 0) - 1; i
++)
6048 RTVEC_ELT (vec
, i
) = copy_rtx (XVECEXP (pattern
, 0, i
+ 1));
6050 pattern
= gen_rtx_PARALLEL (VOIDmode
, vec
);
6056 /* Indicate that INSN cannot be duplicated. This is the case for
6057 execute insns that carry a unique label. */
6060 s390_cannot_copy_insn_p (rtx insn
)
6062 rtx label
= s390_execute_label (insn
);
6063 return label
&& label
!= const0_rtx
;
6066 /* Dump out the constants in POOL. If REMOTE_LABEL is true,
6067 do not emit the pool base label. */
6070 s390_dump_pool (struct constant_pool
*pool
, bool remote_label
)
6073 rtx insn
= pool
->pool_insn
;
6076 /* Switch to rodata section. */
6077 if (TARGET_CPU_ZARCH
)
6079 insn
= emit_insn_after (gen_pool_section_start (), insn
);
6080 INSN_ADDRESSES_NEW (insn
, -1);
6083 /* Ensure minimum pool alignment. */
6084 if (TARGET_CPU_ZARCH
)
6085 insn
= emit_insn_after (gen_pool_align (GEN_INT (8)), insn
);
6087 insn
= emit_insn_after (gen_pool_align (GEN_INT (4)), insn
);
6088 INSN_ADDRESSES_NEW (insn
, -1);
6090 /* Emit pool base label. */
6093 insn
= emit_label_after (pool
->label
, insn
);
6094 INSN_ADDRESSES_NEW (insn
, -1);
6097 /* Dump constants in descending alignment requirement order,
6098 ensuring proper alignment for every constant. */
6099 for (i
= 0; i
< NR_C_MODES
; i
++)
6100 for (c
= pool
->constants
[i
]; c
; c
= c
->next
)
6102 /* Convert UNSPEC_LTREL_OFFSET unspecs to pool-relative references. */
6103 rtx value
= copy_rtx (c
->value
);
6104 if (GET_CODE (value
) == CONST
6105 && GET_CODE (XEXP (value
, 0)) == UNSPEC
6106 && XINT (XEXP (value
, 0), 1) == UNSPEC_LTREL_OFFSET
6107 && XVECLEN (XEXP (value
, 0), 0) == 1)
6108 value
= s390_pool_offset (pool
, XVECEXP (XEXP (value
, 0), 0, 0));
6110 insn
= emit_label_after (c
->label
, insn
);
6111 INSN_ADDRESSES_NEW (insn
, -1);
6113 value
= gen_rtx_UNSPEC_VOLATILE (constant_modes
[i
],
6114 gen_rtvec (1, value
),
6115 UNSPECV_POOL_ENTRY
);
6116 insn
= emit_insn_after (value
, insn
);
6117 INSN_ADDRESSES_NEW (insn
, -1);
6120 /* Ensure minimum alignment for instructions. */
6121 insn
= emit_insn_after (gen_pool_align (GEN_INT (2)), insn
);
6122 INSN_ADDRESSES_NEW (insn
, -1);
6124 /* Output in-pool execute template insns. */
6125 for (c
= pool
->execute
; c
; c
= c
->next
)
6127 insn
= emit_label_after (c
->label
, insn
);
6128 INSN_ADDRESSES_NEW (insn
, -1);
6130 insn
= emit_insn_after (s390_execute_target (c
->value
), insn
);
6131 INSN_ADDRESSES_NEW (insn
, -1);
6134 /* Switch back to previous section. */
6135 if (TARGET_CPU_ZARCH
)
6137 insn
= emit_insn_after (gen_pool_section_end (), insn
);
6138 INSN_ADDRESSES_NEW (insn
, -1);
6141 insn
= emit_barrier_after (insn
);
6142 INSN_ADDRESSES_NEW (insn
, -1);
6144 /* Remove placeholder insn. */
6145 remove_insn (pool
->pool_insn
);
6148 /* Free all memory used by POOL. */
6151 s390_free_pool (struct constant_pool
*pool
)
6153 struct constant
*c
, *next
;
6156 for (i
= 0; i
< NR_C_MODES
; i
++)
6157 for (c
= pool
->constants
[i
]; c
; c
= next
)
6163 for (c
= pool
->execute
; c
; c
= next
)
6169 BITMAP_FREE (pool
->insns
);
6174 /* Collect main literal pool. Return NULL on overflow. */
6176 static struct constant_pool
*
6177 s390_mainpool_start (void)
6179 struct constant_pool
*pool
;
6182 pool
= s390_alloc_pool ();
6184 for (insn
= get_insns (); insn
; insn
= NEXT_INSN (insn
))
6186 if (GET_CODE (insn
) == INSN
6187 && GET_CODE (PATTERN (insn
)) == SET
6188 && GET_CODE (SET_SRC (PATTERN (insn
))) == UNSPEC_VOLATILE
6189 && XINT (SET_SRC (PATTERN (insn
)), 1) == UNSPECV_MAIN_POOL
)
6191 gcc_assert (!pool
->pool_insn
);
6192 pool
->pool_insn
= insn
;
6195 if (!TARGET_CPU_ZARCH
&& s390_execute_label (insn
))
6197 s390_add_execute (pool
, insn
);
6199 else if (GET_CODE (insn
) == INSN
|| GET_CODE (insn
) == CALL_INSN
)
6201 rtx pool_ref
= NULL_RTX
;
6202 find_constant_pool_ref (PATTERN (insn
), &pool_ref
);
6205 rtx constant
= get_pool_constant (pool_ref
);
6206 enum machine_mode mode
= get_pool_mode (pool_ref
);
6207 s390_add_constant (pool
, constant
, mode
);
6211 /* If hot/cold partitioning is enabled we have to make sure that
6212 the literal pool is emitted in the same section where the
6213 initialization of the literal pool base pointer takes place.
6214 emit_pool_after is only used in the non-overflow case on non
6215 Z cpus where we can emit the literal pool at the end of the
6216 function body within the text section. */
6218 && NOTE_KIND (insn
) == NOTE_INSN_SWITCH_TEXT_SECTIONS
6219 && !pool
->emit_pool_after
)
6220 pool
->emit_pool_after
= PREV_INSN (insn
);
6223 gcc_assert (pool
->pool_insn
|| pool
->size
== 0);
6225 if (pool
->size
>= 4096)
6227 /* We're going to chunkify the pool, so remove the main
6228 pool placeholder insn. */
6229 remove_insn (pool
->pool_insn
);
6231 s390_free_pool (pool
);
6235 /* If the functions ends with the section where the literal pool
6236 should be emitted set the marker to its end. */
6237 if (pool
&& !pool
->emit_pool_after
)
6238 pool
->emit_pool_after
= get_last_insn ();
6243 /* POOL holds the main literal pool as collected by s390_mainpool_start.
6244 Modify the current function to output the pool constants as well as
6245 the pool register setup instruction. */
6248 s390_mainpool_finish (struct constant_pool
*pool
)
6250 rtx base_reg
= cfun
->machine
->base_reg
;
6253 /* If the pool is empty, we're done. */
6254 if (pool
->size
== 0)
6256 /* We don't actually need a base register after all. */
6257 cfun
->machine
->base_reg
= NULL_RTX
;
6259 if (pool
->pool_insn
)
6260 remove_insn (pool
->pool_insn
);
6261 s390_free_pool (pool
);
6265 /* We need correct insn addresses. */
6266 shorten_branches (get_insns ());
6268 /* On zSeries, we use a LARL to load the pool register. The pool is
6269 located in the .rodata section, so we emit it after the function. */
6270 if (TARGET_CPU_ZARCH
)
6272 insn
= gen_main_base_64 (base_reg
, pool
->label
);
6273 insn
= emit_insn_after (insn
, pool
->pool_insn
);
6274 INSN_ADDRESSES_NEW (insn
, -1);
6275 remove_insn (pool
->pool_insn
);
6277 insn
= get_last_insn ();
6278 pool
->pool_insn
= emit_insn_after (gen_pool (const0_rtx
), insn
);
6279 INSN_ADDRESSES_NEW (pool
->pool_insn
, -1);
6281 s390_dump_pool (pool
, 0);
6284 /* On S/390, if the total size of the function's code plus literal pool
6285 does not exceed 4096 bytes, we use BASR to set up a function base
6286 pointer, and emit the literal pool at the end of the function. */
6287 else if (INSN_ADDRESSES (INSN_UID (pool
->emit_pool_after
))
6288 + pool
->size
+ 8 /* alignment slop */ < 4096)
6290 insn
= gen_main_base_31_small (base_reg
, pool
->label
);
6291 insn
= emit_insn_after (insn
, pool
->pool_insn
);
6292 INSN_ADDRESSES_NEW (insn
, -1);
6293 remove_insn (pool
->pool_insn
);
6295 insn
= emit_label_after (pool
->label
, insn
);
6296 INSN_ADDRESSES_NEW (insn
, -1);
6298 /* emit_pool_after will be set by s390_mainpool_start to the
6299 last insn of the section where the literal pool should be
6301 insn
= pool
->emit_pool_after
;
6303 pool
->pool_insn
= emit_insn_after (gen_pool (const0_rtx
), insn
);
6304 INSN_ADDRESSES_NEW (pool
->pool_insn
, -1);
6306 s390_dump_pool (pool
, 1);
6309 /* Otherwise, we emit an inline literal pool and use BASR to branch
6310 over it, setting up the pool register at the same time. */
6313 rtx pool_end
= gen_label_rtx ();
6315 insn
= gen_main_base_31_large (base_reg
, pool
->label
, pool_end
);
6316 insn
= emit_insn_after (insn
, pool
->pool_insn
);
6317 INSN_ADDRESSES_NEW (insn
, -1);
6318 remove_insn (pool
->pool_insn
);
6320 insn
= emit_label_after (pool
->label
, insn
);
6321 INSN_ADDRESSES_NEW (insn
, -1);
6323 pool
->pool_insn
= emit_insn_after (gen_pool (const0_rtx
), insn
);
6324 INSN_ADDRESSES_NEW (pool
->pool_insn
, -1);
6326 insn
= emit_label_after (pool_end
, pool
->pool_insn
);
6327 INSN_ADDRESSES_NEW (insn
, -1);
6329 s390_dump_pool (pool
, 1);
6333 /* Replace all literal pool references. */
6335 for (insn
= get_insns (); insn
; insn
= NEXT_INSN (insn
))
6338 replace_ltrel_base (&PATTERN (insn
));
6340 if (GET_CODE (insn
) == INSN
|| GET_CODE (insn
) == CALL_INSN
)
6342 rtx addr
, pool_ref
= NULL_RTX
;
6343 find_constant_pool_ref (PATTERN (insn
), &pool_ref
);
6346 if (s390_execute_label (insn
))
6347 addr
= s390_find_execute (pool
, insn
);
6349 addr
= s390_find_constant (pool
, get_pool_constant (pool_ref
),
6350 get_pool_mode (pool_ref
));
6352 replace_constant_pool_ref (&PATTERN (insn
), pool_ref
, addr
);
6353 INSN_CODE (insn
) = -1;
6359 /* Free the pool. */
6360 s390_free_pool (pool
);
6363 /* POOL holds the main literal pool as collected by s390_mainpool_start.
6364 We have decided we cannot use this pool, so revert all changes
6365 to the current function that were done by s390_mainpool_start. */
6367 s390_mainpool_cancel (struct constant_pool
*pool
)
6369 /* We didn't actually change the instruction stream, so simply
6370 free the pool memory. */
6371 s390_free_pool (pool
);
6375 /* Chunkify the literal pool. */
6377 #define S390_POOL_CHUNK_MIN 0xc00
6378 #define S390_POOL_CHUNK_MAX 0xe00
6380 static struct constant_pool
*
6381 s390_chunkify_start (void)
6383 struct constant_pool
*curr_pool
= NULL
, *pool_list
= NULL
;
6386 rtx pending_ltrel
= NULL_RTX
;
6389 rtx (*gen_reload_base
) (rtx
, rtx
) =
6390 TARGET_CPU_ZARCH
? gen_reload_base_64
: gen_reload_base_31
;
6393 /* We need correct insn addresses. */
6395 shorten_branches (get_insns ());
6397 /* Scan all insns and move literals to pool chunks. */
6399 for (insn
= get_insns (); insn
; insn
= NEXT_INSN (insn
))
6401 bool section_switch_p
= false;
6403 /* Check for pending LTREL_BASE. */
6406 rtx ltrel_base
= find_ltrel_base (PATTERN (insn
));
6409 gcc_assert (ltrel_base
== pending_ltrel
);
6410 pending_ltrel
= NULL_RTX
;
6414 if (!TARGET_CPU_ZARCH
&& s390_execute_label (insn
))
6417 curr_pool
= s390_start_pool (&pool_list
, insn
);
6419 s390_add_execute (curr_pool
, insn
);
6420 s390_add_pool_insn (curr_pool
, insn
);
6422 else if (GET_CODE (insn
) == INSN
|| GET_CODE (insn
) == CALL_INSN
)
6424 rtx pool_ref
= NULL_RTX
;
6425 find_constant_pool_ref (PATTERN (insn
), &pool_ref
);
6428 rtx constant
= get_pool_constant (pool_ref
);
6429 enum machine_mode mode
= get_pool_mode (pool_ref
);
6432 curr_pool
= s390_start_pool (&pool_list
, insn
);
6434 s390_add_constant (curr_pool
, constant
, mode
);
6435 s390_add_pool_insn (curr_pool
, insn
);
6437 /* Don't split the pool chunk between a LTREL_OFFSET load
6438 and the corresponding LTREL_BASE. */
6439 if (GET_CODE (constant
) == CONST
6440 && GET_CODE (XEXP (constant
, 0)) == UNSPEC
6441 && XINT (XEXP (constant
, 0), 1) == UNSPEC_LTREL_OFFSET
)
6443 gcc_assert (!pending_ltrel
);
6444 pending_ltrel
= pool_ref
;
6449 if (GET_CODE (insn
) == JUMP_INSN
|| GET_CODE (insn
) == CODE_LABEL
)
6452 s390_add_pool_insn (curr_pool
, insn
);
6453 /* An LTREL_BASE must follow within the same basic block. */
6454 gcc_assert (!pending_ltrel
);
6457 if (NOTE_P (insn
) && NOTE_KIND (insn
) == NOTE_INSN_SWITCH_TEXT_SECTIONS
)
6458 section_switch_p
= true;
6461 || INSN_ADDRESSES_SIZE () <= (size_t) INSN_UID (insn
)
6462 || INSN_ADDRESSES (INSN_UID (insn
)) == -1)
6465 if (TARGET_CPU_ZARCH
)
6467 if (curr_pool
->size
< S390_POOL_CHUNK_MAX
)
6470 s390_end_pool (curr_pool
, NULL_RTX
);
6475 int chunk_size
= INSN_ADDRESSES (INSN_UID (insn
))
6476 - INSN_ADDRESSES (INSN_UID (curr_pool
->first_insn
))
6479 /* We will later have to insert base register reload insns.
6480 Those will have an effect on code size, which we need to
6481 consider here. This calculation makes rather pessimistic
6482 worst-case assumptions. */
6483 if (GET_CODE (insn
) == CODE_LABEL
)
6486 if (chunk_size
< S390_POOL_CHUNK_MIN
6487 && curr_pool
->size
< S390_POOL_CHUNK_MIN
6488 && !section_switch_p
)
6491 /* Pool chunks can only be inserted after BARRIERs ... */
6492 if (GET_CODE (insn
) == BARRIER
)
6494 s390_end_pool (curr_pool
, insn
);
6499 /* ... so if we don't find one in time, create one. */
6500 else if (chunk_size
> S390_POOL_CHUNK_MAX
6501 || curr_pool
->size
> S390_POOL_CHUNK_MAX
6502 || section_switch_p
)
6504 rtx label
, jump
, barrier
;
6506 if (!section_switch_p
)
6508 /* We can insert the barrier only after a 'real' insn. */
6509 if (GET_CODE (insn
) != INSN
&& GET_CODE (insn
) != CALL_INSN
)
6511 if (get_attr_length (insn
) == 0)
6513 /* Don't separate LTREL_BASE from the corresponding
6514 LTREL_OFFSET load. */
6520 gcc_assert (!pending_ltrel
);
6522 /* The old pool has to end before the section switch
6523 note in order to make it part of the current
6525 insn
= PREV_INSN (insn
);
6528 label
= gen_label_rtx ();
6529 jump
= emit_jump_insn_after (gen_jump (label
), insn
);
6530 barrier
= emit_barrier_after (jump
);
6531 insn
= emit_label_after (label
, barrier
);
6532 JUMP_LABEL (jump
) = label
;
6533 LABEL_NUSES (label
) = 1;
6535 INSN_ADDRESSES_NEW (jump
, -1);
6536 INSN_ADDRESSES_NEW (barrier
, -1);
6537 INSN_ADDRESSES_NEW (insn
, -1);
6539 s390_end_pool (curr_pool
, barrier
);
6547 s390_end_pool (curr_pool
, NULL_RTX
);
6548 gcc_assert (!pending_ltrel
);
6550 /* Find all labels that are branched into
6551 from an insn belonging to a different chunk. */
6553 far_labels
= BITMAP_ALLOC (NULL
);
6555 for (insn
= get_insns (); insn
; insn
= NEXT_INSN (insn
))
6557 /* Labels marked with LABEL_PRESERVE_P can be target
6558 of non-local jumps, so we have to mark them.
6559 The same holds for named labels.
6561 Don't do that, however, if it is the label before
6564 if (GET_CODE (insn
) == CODE_LABEL
6565 && (LABEL_PRESERVE_P (insn
) || LABEL_NAME (insn
)))
6567 rtx vec_insn
= next_real_insn (insn
);
6568 rtx vec_pat
= vec_insn
&& GET_CODE (vec_insn
) == JUMP_INSN
?
6569 PATTERN (vec_insn
) : NULL_RTX
;
6571 || !(GET_CODE (vec_pat
) == ADDR_VEC
6572 || GET_CODE (vec_pat
) == ADDR_DIFF_VEC
))
6573 bitmap_set_bit (far_labels
, CODE_LABEL_NUMBER (insn
));
6576 /* If we have a direct jump (conditional or unconditional)
6577 or a casesi jump, check all potential targets. */
6578 else if (GET_CODE (insn
) == JUMP_INSN
)
6580 rtx pat
= PATTERN (insn
);
6581 if (GET_CODE (pat
) == PARALLEL
&& XVECLEN (pat
, 0) > 2)
6582 pat
= XVECEXP (pat
, 0, 0);
6584 if (GET_CODE (pat
) == SET
)
6586 rtx label
= JUMP_LABEL (insn
);
6589 if (s390_find_pool (pool_list
, label
)
6590 != s390_find_pool (pool_list
, insn
))
6591 bitmap_set_bit (far_labels
, CODE_LABEL_NUMBER (label
));
6594 else if (GET_CODE (pat
) == PARALLEL
6595 && XVECLEN (pat
, 0) == 2
6596 && GET_CODE (XVECEXP (pat
, 0, 0)) == SET
6597 && GET_CODE (XVECEXP (pat
, 0, 1)) == USE
6598 && GET_CODE (XEXP (XVECEXP (pat
, 0, 1), 0)) == LABEL_REF
)
6600 /* Find the jump table used by this casesi jump. */
6601 rtx vec_label
= XEXP (XEXP (XVECEXP (pat
, 0, 1), 0), 0);
6602 rtx vec_insn
= next_real_insn (vec_label
);
6603 rtx vec_pat
= vec_insn
&& GET_CODE (vec_insn
) == JUMP_INSN
?
6604 PATTERN (vec_insn
) : NULL_RTX
;
6606 && (GET_CODE (vec_pat
) == ADDR_VEC
6607 || GET_CODE (vec_pat
) == ADDR_DIFF_VEC
))
6609 int i
, diff_p
= GET_CODE (vec_pat
) == ADDR_DIFF_VEC
;
6611 for (i
= 0; i
< XVECLEN (vec_pat
, diff_p
); i
++)
6613 rtx label
= XEXP (XVECEXP (vec_pat
, diff_p
, i
), 0);
6615 if (s390_find_pool (pool_list
, label
)
6616 != s390_find_pool (pool_list
, insn
))
6617 bitmap_set_bit (far_labels
, CODE_LABEL_NUMBER (label
));
6624 /* Insert base register reload insns before every pool. */
6626 for (curr_pool
= pool_list
; curr_pool
; curr_pool
= curr_pool
->next
)
6628 rtx new_insn
= gen_reload_base (cfun
->machine
->base_reg
,
6630 rtx insn
= curr_pool
->first_insn
;
6631 INSN_ADDRESSES_NEW (emit_insn_before (new_insn
, insn
), -1);
6634 /* Insert base register reload insns at every far label. */
6636 for (insn
= get_insns (); insn
; insn
= NEXT_INSN (insn
))
6637 if (GET_CODE (insn
) == CODE_LABEL
6638 && bitmap_bit_p (far_labels
, CODE_LABEL_NUMBER (insn
)))
6640 struct constant_pool
*pool
= s390_find_pool (pool_list
, insn
);
6643 rtx new_insn
= gen_reload_base (cfun
->machine
->base_reg
,
6645 INSN_ADDRESSES_NEW (emit_insn_after (new_insn
, insn
), -1);
6650 BITMAP_FREE (far_labels
);
6653 /* Recompute insn addresses. */
6655 init_insn_lengths ();
6656 shorten_branches (get_insns ());
6661 /* POOL_LIST is a chunk list as prepared by s390_chunkify_start.
6662 After we have decided to use this list, finish implementing
6663 all changes to the current function as required. */
6666 s390_chunkify_finish (struct constant_pool
*pool_list
)
6668 struct constant_pool
*curr_pool
= NULL
;
6672 /* Replace all literal pool references. */
6674 for (insn
= get_insns (); insn
; insn
= NEXT_INSN (insn
))
6677 replace_ltrel_base (&PATTERN (insn
));
6679 curr_pool
= s390_find_pool (pool_list
, insn
);
6683 if (GET_CODE (insn
) == INSN
|| GET_CODE (insn
) == CALL_INSN
)
6685 rtx addr
, pool_ref
= NULL_RTX
;
6686 find_constant_pool_ref (PATTERN (insn
), &pool_ref
);
6689 if (s390_execute_label (insn
))
6690 addr
= s390_find_execute (curr_pool
, insn
);
6692 addr
= s390_find_constant (curr_pool
,
6693 get_pool_constant (pool_ref
),
6694 get_pool_mode (pool_ref
));
6696 replace_constant_pool_ref (&PATTERN (insn
), pool_ref
, addr
);
6697 INSN_CODE (insn
) = -1;
6702 /* Dump out all literal pools. */
6704 for (curr_pool
= pool_list
; curr_pool
; curr_pool
= curr_pool
->next
)
6705 s390_dump_pool (curr_pool
, 0);
6707 /* Free pool list. */
6711 struct constant_pool
*next
= pool_list
->next
;
6712 s390_free_pool (pool_list
);
6717 /* POOL_LIST is a chunk list as prepared by s390_chunkify_start.
6718 We have decided we cannot use this list, so revert all changes
6719 to the current function that were done by s390_chunkify_start. */
6722 s390_chunkify_cancel (struct constant_pool
*pool_list
)
6724 struct constant_pool
*curr_pool
= NULL
;
6727 /* Remove all pool placeholder insns. */
6729 for (curr_pool
= pool_list
; curr_pool
; curr_pool
= curr_pool
->next
)
6731 /* Did we insert an extra barrier? Remove it. */
6732 rtx barrier
= PREV_INSN (curr_pool
->pool_insn
);
6733 rtx jump
= barrier
? PREV_INSN (barrier
) : NULL_RTX
;
6734 rtx label
= NEXT_INSN (curr_pool
->pool_insn
);
6736 if (jump
&& GET_CODE (jump
) == JUMP_INSN
6737 && barrier
&& GET_CODE (barrier
) == BARRIER
6738 && label
&& GET_CODE (label
) == CODE_LABEL
6739 && GET_CODE (PATTERN (jump
)) == SET
6740 && SET_DEST (PATTERN (jump
)) == pc_rtx
6741 && GET_CODE (SET_SRC (PATTERN (jump
))) == LABEL_REF
6742 && XEXP (SET_SRC (PATTERN (jump
)), 0) == label
)
6745 remove_insn (barrier
);
6746 remove_insn (label
);
6749 remove_insn (curr_pool
->pool_insn
);
6752 /* Remove all base register reload insns. */
6754 for (insn
= get_insns (); insn
; )
6756 rtx next_insn
= NEXT_INSN (insn
);
6758 if (GET_CODE (insn
) == INSN
6759 && GET_CODE (PATTERN (insn
)) == SET
6760 && GET_CODE (SET_SRC (PATTERN (insn
))) == UNSPEC
6761 && XINT (SET_SRC (PATTERN (insn
)), 1) == UNSPEC_RELOAD_BASE
)
6767 /* Free pool list. */
6771 struct constant_pool
*next
= pool_list
->next
;
6772 s390_free_pool (pool_list
);
6777 /* Output the constant pool entry EXP in mode MODE with alignment ALIGN. */
6780 s390_output_pool_entry (rtx exp
, enum machine_mode mode
, unsigned int align
)
6784 switch (GET_MODE_CLASS (mode
))
6787 case MODE_DECIMAL_FLOAT
:
6788 gcc_assert (GET_CODE (exp
) == CONST_DOUBLE
);
6790 REAL_VALUE_FROM_CONST_DOUBLE (r
, exp
);
6791 assemble_real (r
, mode
, align
);
6795 assemble_integer (exp
, GET_MODE_SIZE (mode
), align
, 1);
6796 mark_symbol_refs_as_used (exp
);
6805 /* Return an RTL expression representing the value of the return address
6806 for the frame COUNT steps up from the current frame. FRAME is the
6807 frame pointer of that frame. */
6810 s390_return_addr_rtx (int count
, rtx frame ATTRIBUTE_UNUSED
)
6815 /* Without backchain, we fail for all but the current frame. */
6817 if (!TARGET_BACKCHAIN
&& count
> 0)
6820 /* For the current frame, we need to make sure the initial
6821 value of RETURN_REGNUM is actually saved. */
6825 /* On non-z architectures branch splitting could overwrite r14. */
6826 if (TARGET_CPU_ZARCH
)
6827 return get_hard_reg_initial_val (Pmode
, RETURN_REGNUM
);
6830 cfun_frame_layout
.save_return_addr_p
= true;
6831 return gen_rtx_MEM (Pmode
, return_address_pointer_rtx
);
6835 if (TARGET_PACKED_STACK
)
6836 offset
= -2 * UNITS_PER_LONG
;
6838 offset
= RETURN_REGNUM
* UNITS_PER_LONG
;
6840 addr
= plus_constant (frame
, offset
);
6841 addr
= memory_address (Pmode
, addr
);
6842 return gen_rtx_MEM (Pmode
, addr
);
6845 /* Return an RTL expression representing the back chain stored in
6846 the current stack frame. */
6849 s390_back_chain_rtx (void)
6853 gcc_assert (TARGET_BACKCHAIN
);
6855 if (TARGET_PACKED_STACK
)
6856 chain
= plus_constant (stack_pointer_rtx
,
6857 STACK_POINTER_OFFSET
- UNITS_PER_LONG
);
6859 chain
= stack_pointer_rtx
;
6861 chain
= gen_rtx_MEM (Pmode
, chain
);
6865 /* Find first call clobbered register unused in a function.
6866 This could be used as base register in a leaf function
6867 or for holding the return address before epilogue. */
6870 find_unused_clobbered_reg (void)
6873 for (i
= 0; i
< 6; i
++)
6874 if (!df_regs_ever_live_p (i
))
6880 /* Helper function for s390_regs_ever_clobbered. Sets the fields in DATA for all
6881 clobbered hard regs in SETREG. */
6884 s390_reg_clobbered_rtx (rtx setreg
, const_rtx set_insn ATTRIBUTE_UNUSED
, void *data
)
6886 int *regs_ever_clobbered
= (int *)data
;
6887 unsigned int i
, regno
;
6888 enum machine_mode mode
= GET_MODE (setreg
);
6890 if (GET_CODE (setreg
) == SUBREG
)
6892 rtx inner
= SUBREG_REG (setreg
);
6893 if (!GENERAL_REG_P (inner
))
6895 regno
= subreg_regno (setreg
);
6897 else if (GENERAL_REG_P (setreg
))
6898 regno
= REGNO (setreg
);
6903 i
< regno
+ HARD_REGNO_NREGS (regno
, mode
);
6905 regs_ever_clobbered
[i
] = 1;
6908 /* Walks through all basic blocks of the current function looking
6909 for clobbered hard regs using s390_reg_clobbered_rtx. The fields
6910 of the passed integer array REGS_EVER_CLOBBERED are set to one for
6911 each of those regs. */
6914 s390_regs_ever_clobbered (int *regs_ever_clobbered
)
6920 memset (regs_ever_clobbered
, 0, 16 * sizeof (int));
6922 /* For non-leaf functions we have to consider all call clobbered regs to be
6924 if (!current_function_is_leaf
)
6926 for (i
= 0; i
< 16; i
++)
6927 regs_ever_clobbered
[i
] = call_really_used_regs
[i
];
6930 /* Make the "magic" eh_return registers live if necessary. For regs_ever_live
6931 this work is done by liveness analysis (mark_regs_live_at_end).
6932 Special care is needed for functions containing landing pads. Landing pads
6933 may use the eh registers, but the code which sets these registers is not
6934 contained in that function. Hence s390_regs_ever_clobbered is not able to
6935 deal with this automatically. */
6936 if (crtl
->calls_eh_return
|| cfun
->machine
->has_landing_pad_p
)
6937 for (i
= 0; EH_RETURN_DATA_REGNO (i
) != INVALID_REGNUM
; i
++)
6938 if (crtl
->calls_eh_return
6939 || (cfun
->machine
->has_landing_pad_p
6940 && df_regs_ever_live_p (EH_RETURN_DATA_REGNO (i
))))
6941 regs_ever_clobbered
[EH_RETURN_DATA_REGNO (i
)] = 1;
6943 /* For nonlocal gotos all call-saved registers have to be saved.
6944 This flag is also set for the unwinding code in libgcc.
6945 See expand_builtin_unwind_init. For regs_ever_live this is done by
6947 if (cfun
->has_nonlocal_label
)
6948 for (i
= 0; i
< 16; i
++)
6949 if (!call_really_used_regs
[i
])
6950 regs_ever_clobbered
[i
] = 1;
6952 FOR_EACH_BB (cur_bb
)
6954 FOR_BB_INSNS (cur_bb
, cur_insn
)
6956 if (INSN_P (cur_insn
))
6957 note_stores (PATTERN (cur_insn
),
6958 s390_reg_clobbered_rtx
,
6959 regs_ever_clobbered
);
6964 /* Determine the frame area which actually has to be accessed
6965 in the function epilogue. The values are stored at the
6966 given pointers AREA_BOTTOM (address of the lowest used stack
6967 address) and AREA_TOP (address of the first item which does
6968 not belong to the stack frame). */
6971 s390_frame_area (int *area_bottom
, int *area_top
)
6979 if (cfun_frame_layout
.first_restore_gpr
!= -1)
6981 b
= (cfun_frame_layout
.gprs_offset
6982 + cfun_frame_layout
.first_restore_gpr
* UNITS_PER_LONG
);
6983 t
= b
+ (cfun_frame_layout
.last_restore_gpr
6984 - cfun_frame_layout
.first_restore_gpr
+ 1) * UNITS_PER_LONG
;
6987 if (TARGET_64BIT
&& cfun_save_high_fprs_p
)
6989 b
= MIN (b
, cfun_frame_layout
.f8_offset
);
6990 t
= MAX (t
, (cfun_frame_layout
.f8_offset
6991 + cfun_frame_layout
.high_fprs
* 8));
6995 for (i
= 2; i
< 4; i
++)
6996 if (cfun_fpr_bit_p (i
))
6998 b
= MIN (b
, cfun_frame_layout
.f4_offset
+ (i
- 2) * 8);
6999 t
= MAX (t
, cfun_frame_layout
.f4_offset
+ (i
- 1) * 8);
7006 /* Fill cfun->machine with info about register usage of current function.
7007 Return in CLOBBERED_REGS which GPRs are currently considered set. */
7010 s390_register_info (int clobbered_regs
[])
7014 /* fprs 8 - 15 are call saved for 64 Bit ABI. */
7015 cfun_frame_layout
.fpr_bitmap
= 0;
7016 cfun_frame_layout
.high_fprs
= 0;
7018 for (i
= 24; i
< 32; i
++)
7019 if (df_regs_ever_live_p (i
) && !global_regs
[i
])
7021 cfun_set_fpr_bit (i
- 16);
7022 cfun_frame_layout
.high_fprs
++;
7025 /* Find first and last gpr to be saved. We trust regs_ever_live
7026 data, except that we don't save and restore global registers.
7028 Also, all registers with special meaning to the compiler need
7029 to be handled extra. */
7031 s390_regs_ever_clobbered (clobbered_regs
);
7033 for (i
= 0; i
< 16; i
++)
7034 clobbered_regs
[i
] = clobbered_regs
[i
] && !global_regs
[i
] && !fixed_regs
[i
];
7036 if (frame_pointer_needed
)
7037 clobbered_regs
[HARD_FRAME_POINTER_REGNUM
] = 1;
7040 clobbered_regs
[PIC_OFFSET_TABLE_REGNUM
]
7041 |= df_regs_ever_live_p (PIC_OFFSET_TABLE_REGNUM
);
7043 clobbered_regs
[BASE_REGNUM
]
7044 |= (cfun
->machine
->base_reg
7045 && REGNO (cfun
->machine
->base_reg
) == BASE_REGNUM
);
7047 clobbered_regs
[RETURN_REGNUM
]
7048 |= (!current_function_is_leaf
7049 || TARGET_TPF_PROFILING
7050 || cfun
->machine
->split_branches_pending_p
7051 || cfun_frame_layout
.save_return_addr_p
7052 || crtl
->calls_eh_return
7055 clobbered_regs
[STACK_POINTER_REGNUM
]
7056 |= (!current_function_is_leaf
7057 || TARGET_TPF_PROFILING
7058 || cfun_save_high_fprs_p
7059 || get_frame_size () > 0
7060 || cfun
->calls_alloca
7063 for (i
= 6; i
< 16; i
++)
7064 if (df_regs_ever_live_p (i
) || clobbered_regs
[i
])
7066 for (j
= 15; j
> i
; j
--)
7067 if (df_regs_ever_live_p (j
) || clobbered_regs
[j
])
7072 /* Nothing to save/restore. */
7073 cfun_frame_layout
.first_save_gpr_slot
= -1;
7074 cfun_frame_layout
.last_save_gpr_slot
= -1;
7075 cfun_frame_layout
.first_save_gpr
= -1;
7076 cfun_frame_layout
.first_restore_gpr
= -1;
7077 cfun_frame_layout
.last_save_gpr
= -1;
7078 cfun_frame_layout
.last_restore_gpr
= -1;
7082 /* Save slots for gprs from i to j. */
7083 cfun_frame_layout
.first_save_gpr_slot
= i
;
7084 cfun_frame_layout
.last_save_gpr_slot
= j
;
7086 for (i
= cfun_frame_layout
.first_save_gpr_slot
;
7087 i
< cfun_frame_layout
.last_save_gpr_slot
+ 1;
7089 if (clobbered_regs
[i
])
7092 for (j
= cfun_frame_layout
.last_save_gpr_slot
; j
> i
; j
--)
7093 if (clobbered_regs
[j
])
7096 if (i
== cfun_frame_layout
.last_save_gpr_slot
+ 1)
7098 /* Nothing to save/restore. */
7099 cfun_frame_layout
.first_save_gpr
= -1;
7100 cfun_frame_layout
.first_restore_gpr
= -1;
7101 cfun_frame_layout
.last_save_gpr
= -1;
7102 cfun_frame_layout
.last_restore_gpr
= -1;
7106 /* Save / Restore from gpr i to j. */
7107 cfun_frame_layout
.first_save_gpr
= i
;
7108 cfun_frame_layout
.first_restore_gpr
= i
;
7109 cfun_frame_layout
.last_save_gpr
= j
;
7110 cfun_frame_layout
.last_restore_gpr
= j
;
7116 /* Varargs functions need to save gprs 2 to 6. */
7117 if (cfun
->va_list_gpr_size
7118 && crtl
->args
.info
.gprs
< GP_ARG_NUM_REG
)
7120 int min_gpr
= crtl
->args
.info
.gprs
;
7121 int max_gpr
= min_gpr
+ cfun
->va_list_gpr_size
;
7122 if (max_gpr
> GP_ARG_NUM_REG
)
7123 max_gpr
= GP_ARG_NUM_REG
;
7125 if (cfun_frame_layout
.first_save_gpr
== -1
7126 || cfun_frame_layout
.first_save_gpr
> 2 + min_gpr
)
7128 cfun_frame_layout
.first_save_gpr
= 2 + min_gpr
;
7129 cfun_frame_layout
.first_save_gpr_slot
= 2 + min_gpr
;
7132 if (cfun_frame_layout
.last_save_gpr
== -1
7133 || cfun_frame_layout
.last_save_gpr
< 2 + max_gpr
- 1)
7135 cfun_frame_layout
.last_save_gpr
= 2 + max_gpr
- 1;
7136 cfun_frame_layout
.last_save_gpr_slot
= 2 + max_gpr
- 1;
7140 /* Mark f0, f2 for 31 bit and f0-f4 for 64 bit to be saved. */
7141 if (TARGET_HARD_FLOAT
&& cfun
->va_list_fpr_size
7142 && crtl
->args
.info
.fprs
< FP_ARG_NUM_REG
)
7144 int min_fpr
= crtl
->args
.info
.fprs
;
7145 int max_fpr
= min_fpr
+ cfun
->va_list_fpr_size
;
7146 if (max_fpr
> FP_ARG_NUM_REG
)
7147 max_fpr
= FP_ARG_NUM_REG
;
7149 /* ??? This is currently required to ensure proper location
7150 of the fpr save slots within the va_list save area. */
7151 if (TARGET_PACKED_STACK
)
7154 for (i
= min_fpr
; i
< max_fpr
; i
++)
7155 cfun_set_fpr_bit (i
);
7160 for (i
= 2; i
< 4; i
++)
7161 if (df_regs_ever_live_p (i
+ 16) && !global_regs
[i
+ 16])
7162 cfun_set_fpr_bit (i
);
7165 /* Fill cfun->machine with info about frame of current function. */
7168 s390_frame_info (void)
7172 cfun_frame_layout
.frame_size
= get_frame_size ();
7173 if (!TARGET_64BIT
&& cfun_frame_layout
.frame_size
> 0x7fff0000)
7174 fatal_error ("total size of local variables exceeds architecture limit");
7176 if (!TARGET_PACKED_STACK
)
7178 cfun_frame_layout
.backchain_offset
= 0;
7179 cfun_frame_layout
.f0_offset
= 16 * UNITS_PER_LONG
;
7180 cfun_frame_layout
.f4_offset
= cfun_frame_layout
.f0_offset
+ 2 * 8;
7181 cfun_frame_layout
.f8_offset
= -cfun_frame_layout
.high_fprs
* 8;
7182 cfun_frame_layout
.gprs_offset
= (cfun_frame_layout
.first_save_gpr_slot
7185 else if (TARGET_BACKCHAIN
) /* kernel stack layout */
7187 cfun_frame_layout
.backchain_offset
= (STACK_POINTER_OFFSET
7189 cfun_frame_layout
.gprs_offset
7190 = (cfun_frame_layout
.backchain_offset
7191 - (STACK_POINTER_REGNUM
- cfun_frame_layout
.first_save_gpr_slot
+ 1)
7196 cfun_frame_layout
.f4_offset
7197 = (cfun_frame_layout
.gprs_offset
7198 - 8 * (cfun_fpr_bit_p (2) + cfun_fpr_bit_p (3)));
7200 cfun_frame_layout
.f0_offset
7201 = (cfun_frame_layout
.f4_offset
7202 - 8 * (cfun_fpr_bit_p (0) + cfun_fpr_bit_p (1)));
7206 /* On 31 bit we have to care about alignment of the
7207 floating point regs to provide fastest access. */
7208 cfun_frame_layout
.f0_offset
7209 = ((cfun_frame_layout
.gprs_offset
7210 & ~(STACK_BOUNDARY
/ BITS_PER_UNIT
- 1))
7211 - 8 * (cfun_fpr_bit_p (0) + cfun_fpr_bit_p (1)));
7213 cfun_frame_layout
.f4_offset
7214 = (cfun_frame_layout
.f0_offset
7215 - 8 * (cfun_fpr_bit_p (2) + cfun_fpr_bit_p (3)));
7218 else /* no backchain */
7220 cfun_frame_layout
.f4_offset
7221 = (STACK_POINTER_OFFSET
7222 - 8 * (cfun_fpr_bit_p (2) + cfun_fpr_bit_p (3)));
7224 cfun_frame_layout
.f0_offset
7225 = (cfun_frame_layout
.f4_offset
7226 - 8 * (cfun_fpr_bit_p (0) + cfun_fpr_bit_p (1)));
7228 cfun_frame_layout
.gprs_offset
7229 = cfun_frame_layout
.f0_offset
- cfun_gprs_save_area_size
;
7232 if (current_function_is_leaf
7233 && !TARGET_TPF_PROFILING
7234 && cfun_frame_layout
.frame_size
== 0
7235 && !cfun_save_high_fprs_p
7236 && !cfun
->calls_alloca
7240 if (!TARGET_PACKED_STACK
)
7241 cfun_frame_layout
.frame_size
+= (STACK_POINTER_OFFSET
7242 + crtl
->outgoing_args_size
7243 + cfun_frame_layout
.high_fprs
* 8);
7246 if (TARGET_BACKCHAIN
)
7247 cfun_frame_layout
.frame_size
+= UNITS_PER_LONG
;
7249 /* No alignment trouble here because f8-f15 are only saved under
7251 cfun_frame_layout
.f8_offset
= (MIN (MIN (cfun_frame_layout
.f0_offset
,
7252 cfun_frame_layout
.f4_offset
),
7253 cfun_frame_layout
.gprs_offset
)
7254 - cfun_frame_layout
.high_fprs
* 8);
7256 cfun_frame_layout
.frame_size
+= cfun_frame_layout
.high_fprs
* 8;
7258 for (i
= 0; i
< 8; i
++)
7259 if (cfun_fpr_bit_p (i
))
7260 cfun_frame_layout
.frame_size
+= 8;
7262 cfun_frame_layout
.frame_size
+= cfun_gprs_save_area_size
;
7264 /* If under 31 bit an odd number of gprs has to be saved we have to adjust
7265 the frame size to sustain 8 byte alignment of stack frames. */
7266 cfun_frame_layout
.frame_size
= ((cfun_frame_layout
.frame_size
+
7267 STACK_BOUNDARY
/ BITS_PER_UNIT
- 1)
7268 & ~(STACK_BOUNDARY
/ BITS_PER_UNIT
- 1));
7270 cfun_frame_layout
.frame_size
+= crtl
->outgoing_args_size
;
7274 /* Generate frame layout. Fills in register and frame data for the current
7275 function in cfun->machine. This routine can be called multiple times;
7276 it will re-do the complete frame layout every time. */
7279 s390_init_frame_layout (void)
7281 HOST_WIDE_INT frame_size
;
7283 int clobbered_regs
[16];
7285 /* On S/390 machines, we may need to perform branch splitting, which
7286 will require both base and return address register. We have no
7287 choice but to assume we're going to need them until right at the
7288 end of the machine dependent reorg phase. */
7289 if (!TARGET_CPU_ZARCH
)
7290 cfun
->machine
->split_branches_pending_p
= true;
7294 frame_size
= cfun_frame_layout
.frame_size
;
7296 /* Try to predict whether we'll need the base register. */
7297 base_used
= cfun
->machine
->split_branches_pending_p
7298 || crtl
->uses_const_pool
7299 || (!DISP_IN_RANGE (frame_size
)
7300 && !CONST_OK_FOR_K (frame_size
));
7302 /* Decide which register to use as literal pool base. In small
7303 leaf functions, try to use an unused call-clobbered register
7304 as base register to avoid save/restore overhead. */
7306 cfun
->machine
->base_reg
= NULL_RTX
;
7307 else if (current_function_is_leaf
&& !df_regs_ever_live_p (5))
7308 cfun
->machine
->base_reg
= gen_rtx_REG (Pmode
, 5);
7310 cfun
->machine
->base_reg
= gen_rtx_REG (Pmode
, BASE_REGNUM
);
7312 s390_register_info (clobbered_regs
);
7315 while (frame_size
!= cfun_frame_layout
.frame_size
);
7318 /* Update frame layout. Recompute actual register save data based on
7319 current info and update regs_ever_live for the special registers.
7320 May be called multiple times, but may never cause *more* registers
7321 to be saved than s390_init_frame_layout allocated room for. */
7324 s390_update_frame_layout (void)
7326 int clobbered_regs
[16];
7328 s390_register_info (clobbered_regs
);
7330 df_set_regs_ever_live (BASE_REGNUM
,
7331 clobbered_regs
[BASE_REGNUM
] ? true : false);
7332 df_set_regs_ever_live (RETURN_REGNUM
,
7333 clobbered_regs
[RETURN_REGNUM
] ? true : false);
7334 df_set_regs_ever_live (STACK_POINTER_REGNUM
,
7335 clobbered_regs
[STACK_POINTER_REGNUM
] ? true : false);
7337 if (cfun
->machine
->base_reg
)
7338 df_set_regs_ever_live (REGNO (cfun
->machine
->base_reg
), true);
7341 /* Return true if it is legal to put a value with MODE into REGNO. */
7344 s390_hard_regno_mode_ok (unsigned int regno
, enum machine_mode mode
)
7346 switch (REGNO_REG_CLASS (regno
))
7349 if (REGNO_PAIR_OK (regno
, mode
))
7351 if (mode
== SImode
|| mode
== DImode
)
7354 if (FLOAT_MODE_P (mode
) && GET_MODE_CLASS (mode
) != MODE_VECTOR_FLOAT
)
7359 if (FRAME_REGNO_P (regno
) && mode
== Pmode
)
7364 if (REGNO_PAIR_OK (regno
, mode
))
7367 || (mode
!= TFmode
&& mode
!= TCmode
&& mode
!= TDmode
))
7372 if (GET_MODE_CLASS (mode
) == MODE_CC
)
7376 if (REGNO_PAIR_OK (regno
, mode
))
7378 if (mode
== SImode
|| mode
== Pmode
)
7389 /* Return nonzero if register OLD_REG can be renamed to register NEW_REG. */
7392 s390_hard_regno_rename_ok (unsigned int old_reg
, unsigned int new_reg
)
7394 /* Once we've decided upon a register to use as base register, it must
7395 no longer be used for any other purpose. */
7396 if (cfun
->machine
->base_reg
)
7397 if (REGNO (cfun
->machine
->base_reg
) == old_reg
7398 || REGNO (cfun
->machine
->base_reg
) == new_reg
)
7404 /* Maximum number of registers to represent a value of mode MODE
7405 in a register of class RCLASS. */
7408 s390_class_max_nregs (enum reg_class rclass
, enum machine_mode mode
)
7413 if (GET_MODE_CLASS (mode
) == MODE_COMPLEX_FLOAT
)
7414 return 2 * ((GET_MODE_SIZE (mode
) / 2 + 8 - 1) / 8);
7416 return (GET_MODE_SIZE (mode
) + 8 - 1) / 8;
7418 return (GET_MODE_SIZE (mode
) + 4 - 1) / 4;
7422 return (GET_MODE_SIZE (mode
) + UNITS_PER_WORD
- 1) / UNITS_PER_WORD
;
7425 /* Return true if register FROM can be eliminated via register TO. */
7428 s390_can_eliminate (const int from
, const int to
)
7430 /* On zSeries machines, we have not marked the base register as fixed.
7431 Instead, we have an elimination rule BASE_REGNUM -> BASE_REGNUM.
7432 If a function requires the base register, we say here that this
7433 elimination cannot be performed. This will cause reload to free
7434 up the base register (as if it were fixed). On the other hand,
7435 if the current function does *not* require the base register, we
7436 say here the elimination succeeds, which in turn allows reload
7437 to allocate the base register for any other purpose. */
7438 if (from
== BASE_REGNUM
&& to
== BASE_REGNUM
)
7440 if (TARGET_CPU_ZARCH
)
7442 s390_init_frame_layout ();
7443 return cfun
->machine
->base_reg
== NULL_RTX
;
7449 /* Everything else must point into the stack frame. */
7450 gcc_assert (to
== STACK_POINTER_REGNUM
7451 || to
== HARD_FRAME_POINTER_REGNUM
);
7453 gcc_assert (from
== FRAME_POINTER_REGNUM
7454 || from
== ARG_POINTER_REGNUM
7455 || from
== RETURN_ADDRESS_POINTER_REGNUM
);
7457 /* Make sure we actually saved the return address. */
7458 if (from
== RETURN_ADDRESS_POINTER_REGNUM
)
7459 if (!crtl
->calls_eh_return
7461 && !cfun_frame_layout
.save_return_addr_p
)
7467 /* Return offset between register FROM and TO initially after prolog. */
7470 s390_initial_elimination_offset (int from
, int to
)
7472 HOST_WIDE_INT offset
;
7475 /* ??? Why are we called for non-eliminable pairs? */
7476 if (!s390_can_eliminate (from
, to
))
7481 case FRAME_POINTER_REGNUM
:
7482 offset
= (get_frame_size()
7483 + STACK_POINTER_OFFSET
7484 + crtl
->outgoing_args_size
);
7487 case ARG_POINTER_REGNUM
:
7488 s390_init_frame_layout ();
7489 offset
= cfun_frame_layout
.frame_size
+ STACK_POINTER_OFFSET
;
7492 case RETURN_ADDRESS_POINTER_REGNUM
:
7493 s390_init_frame_layout ();
7494 index
= RETURN_REGNUM
- cfun_frame_layout
.first_save_gpr_slot
;
7495 gcc_assert (index
>= 0);
7496 offset
= cfun_frame_layout
.frame_size
+ cfun_frame_layout
.gprs_offset
;
7497 offset
+= index
* UNITS_PER_LONG
;
7511 /* Emit insn to save fpr REGNUM at offset OFFSET relative
7512 to register BASE. Return generated insn. */
7515 save_fpr (rtx base
, int offset
, int regnum
)
7518 addr
= gen_rtx_MEM (DFmode
, plus_constant (base
, offset
));
7520 if (regnum
>= 16 && regnum
<= (16 + FP_ARG_NUM_REG
))
7521 set_mem_alias_set (addr
, get_varargs_alias_set ());
7523 set_mem_alias_set (addr
, get_frame_alias_set ());
7525 return emit_move_insn (addr
, gen_rtx_REG (DFmode
, regnum
));
7528 /* Emit insn to restore fpr REGNUM from offset OFFSET relative
7529 to register BASE. Return generated insn. */
7532 restore_fpr (rtx base
, int offset
, int regnum
)
7535 addr
= gen_rtx_MEM (DFmode
, plus_constant (base
, offset
));
7536 set_mem_alias_set (addr
, get_frame_alias_set ());
7538 return emit_move_insn (gen_rtx_REG (DFmode
, regnum
), addr
);
7541 /* Return true if REGNO is a global register, but not one
7542 of the special ones that need to be saved/restored in anyway. */
7545 global_not_special_regno_p (int regno
)
7547 return (global_regs
[regno
]
7548 /* These registers are special and need to be
7549 restored in any case. */
7550 && !(regno
== STACK_POINTER_REGNUM
7551 || regno
== RETURN_REGNUM
7552 || regno
== BASE_REGNUM
7553 || (flag_pic
&& regno
== (int)PIC_OFFSET_TABLE_REGNUM
)));
7556 /* Generate insn to save registers FIRST to LAST into
7557 the register save area located at offset OFFSET
7558 relative to register BASE. */
7561 save_gprs (rtx base
, int offset
, int first
, int last
)
7563 rtx addr
, insn
, note
;
7566 addr
= plus_constant (base
, offset
);
7567 addr
= gen_rtx_MEM (Pmode
, addr
);
7569 set_mem_alias_set (addr
, get_frame_alias_set ());
7571 /* Special-case single register. */
7575 insn
= gen_movdi (addr
, gen_rtx_REG (Pmode
, first
));
7577 insn
= gen_movsi (addr
, gen_rtx_REG (Pmode
, first
));
7579 if (!global_not_special_regno_p (first
))
7580 RTX_FRAME_RELATED_P (insn
) = 1;
7585 insn
= gen_store_multiple (addr
,
7586 gen_rtx_REG (Pmode
, first
),
7587 GEN_INT (last
- first
+ 1));
7589 if (first
<= 6 && cfun
->stdarg
)
7590 for (i
= 0; i
< XVECLEN (PATTERN (insn
), 0); i
++)
7592 rtx mem
= XEXP (XVECEXP (PATTERN (insn
), 0, i
), 0);
7595 set_mem_alias_set (mem
, get_varargs_alias_set ());
7598 /* We need to set the FRAME_RELATED flag on all SETs
7599 inside the store-multiple pattern.
7601 However, we must not emit DWARF records for registers 2..5
7602 if they are stored for use by variable arguments ...
7604 ??? Unfortunately, it is not enough to simply not the
7605 FRAME_RELATED flags for those SETs, because the first SET
7606 of the PARALLEL is always treated as if it had the flag
7607 set, even if it does not. Therefore we emit a new pattern
7608 without those registers as REG_FRAME_RELATED_EXPR note. */
7610 if (first
>= 6 && !global_not_special_regno_p (first
))
7612 rtx pat
= PATTERN (insn
);
7614 for (i
= 0; i
< XVECLEN (pat
, 0); i
++)
7615 if (GET_CODE (XVECEXP (pat
, 0, i
)) == SET
7616 && !global_not_special_regno_p (REGNO (SET_SRC (XVECEXP (pat
,
7618 RTX_FRAME_RELATED_P (XVECEXP (pat
, 0, i
)) = 1;
7620 RTX_FRAME_RELATED_P (insn
) = 1;
7626 for (start
= first
>= 6 ? first
: 6; start
<= last
; start
++)
7627 if (!global_not_special_regno_p (start
))
7633 addr
= plus_constant (base
, offset
+ (start
- first
) * UNITS_PER_LONG
);
7634 note
= gen_store_multiple (gen_rtx_MEM (Pmode
, addr
),
7635 gen_rtx_REG (Pmode
, start
),
7636 GEN_INT (last
- start
+ 1));
7637 note
= PATTERN (note
);
7639 add_reg_note (insn
, REG_FRAME_RELATED_EXPR
, note
);
7641 for (i
= 0; i
< XVECLEN (note
, 0); i
++)
7642 if (GET_CODE (XVECEXP (note
, 0, i
)) == SET
7643 && !global_not_special_regno_p (REGNO (SET_SRC (XVECEXP (note
,
7645 RTX_FRAME_RELATED_P (XVECEXP (note
, 0, i
)) = 1;
7647 RTX_FRAME_RELATED_P (insn
) = 1;
7653 /* Generate insn to restore registers FIRST to LAST from
7654 the register save area located at offset OFFSET
7655 relative to register BASE. */
7658 restore_gprs (rtx base
, int offset
, int first
, int last
)
7662 addr
= plus_constant (base
, offset
);
7663 addr
= gen_rtx_MEM (Pmode
, addr
);
7664 set_mem_alias_set (addr
, get_frame_alias_set ());
7666 /* Special-case single register. */
7670 insn
= gen_movdi (gen_rtx_REG (Pmode
, first
), addr
);
7672 insn
= gen_movsi (gen_rtx_REG (Pmode
, first
), addr
);
7677 insn
= gen_load_multiple (gen_rtx_REG (Pmode
, first
),
7679 GEN_INT (last
- first
+ 1));
7683 /* Return insn sequence to load the GOT register. */
7685 static GTY(()) rtx got_symbol
;
7687 s390_load_got (void)
7693 got_symbol
= gen_rtx_SYMBOL_REF (Pmode
, "_GLOBAL_OFFSET_TABLE_");
7694 SYMBOL_REF_FLAGS (got_symbol
) = SYMBOL_FLAG_LOCAL
;
7699 if (TARGET_CPU_ZARCH
)
7701 emit_move_insn (pic_offset_table_rtx
, got_symbol
);
7707 offset
= gen_rtx_UNSPEC (Pmode
, gen_rtvec (1, got_symbol
),
7708 UNSPEC_LTREL_OFFSET
);
7709 offset
= gen_rtx_CONST (Pmode
, offset
);
7710 offset
= force_const_mem (Pmode
, offset
);
7712 emit_move_insn (pic_offset_table_rtx
, offset
);
7714 offset
= gen_rtx_UNSPEC (Pmode
, gen_rtvec (1, XEXP (offset
, 0)),
7716 offset
= gen_rtx_PLUS (Pmode
, pic_offset_table_rtx
, offset
);
7718 emit_move_insn (pic_offset_table_rtx
, offset
);
7721 insns
= get_insns ();
7726 /* This ties together stack memory (MEM with an alias set of frame_alias_set)
7727 and the change to the stack pointer. */
7730 s390_emit_stack_tie (void)
7732 rtx mem
= gen_frame_mem (BLKmode
,
7733 gen_rtx_REG (Pmode
, STACK_POINTER_REGNUM
));
7735 emit_insn (gen_stack_tie (mem
));
7738 /* Expand the prologue into a bunch of separate insns. */
7741 s390_emit_prologue (void)
7749 /* Complete frame layout. */
7751 s390_update_frame_layout ();
7753 /* Annotate all constant pool references to let the scheduler know
7754 they implicitly use the base register. */
7756 push_topmost_sequence ();
7758 for (insn
= get_insns (); insn
; insn
= NEXT_INSN (insn
))
7761 annotate_constant_pool_refs (&PATTERN (insn
));
7762 df_insn_rescan (insn
);
7765 pop_topmost_sequence ();
7767 /* Choose best register to use for temp use within prologue.
7768 See below for why TPF must use the register 1. */
7770 if (!has_hard_reg_initial_val (Pmode
, RETURN_REGNUM
)
7771 && !current_function_is_leaf
7772 && !TARGET_TPF_PROFILING
)
7773 temp_reg
= gen_rtx_REG (Pmode
, RETURN_REGNUM
);
7775 temp_reg
= gen_rtx_REG (Pmode
, 1);
7777 /* Save call saved gprs. */
7778 if (cfun_frame_layout
.first_save_gpr
!= -1)
7780 insn
= save_gprs (stack_pointer_rtx
,
7781 cfun_frame_layout
.gprs_offset
+
7782 UNITS_PER_LONG
* (cfun_frame_layout
.first_save_gpr
7783 - cfun_frame_layout
.first_save_gpr_slot
),
7784 cfun_frame_layout
.first_save_gpr
,
7785 cfun_frame_layout
.last_save_gpr
);
7789 /* Dummy insn to mark literal pool slot. */
7791 if (cfun
->machine
->base_reg
)
7792 emit_insn (gen_main_pool (cfun
->machine
->base_reg
));
7794 offset
= cfun_frame_layout
.f0_offset
;
7796 /* Save f0 and f2. */
7797 for (i
= 0; i
< 2; i
++)
7799 if (cfun_fpr_bit_p (i
))
7801 save_fpr (stack_pointer_rtx
, offset
, i
+ 16);
7804 else if (!TARGET_PACKED_STACK
)
7808 /* Save f4 and f6. */
7809 offset
= cfun_frame_layout
.f4_offset
;
7810 for (i
= 2; i
< 4; i
++)
7812 if (cfun_fpr_bit_p (i
))
7814 insn
= save_fpr (stack_pointer_rtx
, offset
, i
+ 16);
7817 /* If f4 and f6 are call clobbered they are saved due to stdargs and
7818 therefore are not frame related. */
7819 if (!call_really_used_regs
[i
+ 16])
7820 RTX_FRAME_RELATED_P (insn
) = 1;
7822 else if (!TARGET_PACKED_STACK
)
7826 if (TARGET_PACKED_STACK
7827 && cfun_save_high_fprs_p
7828 && cfun_frame_layout
.f8_offset
+ cfun_frame_layout
.high_fprs
* 8 > 0)
7830 offset
= (cfun_frame_layout
.f8_offset
7831 + (cfun_frame_layout
.high_fprs
- 1) * 8);
7833 for (i
= 15; i
> 7 && offset
>= 0; i
--)
7834 if (cfun_fpr_bit_p (i
))
7836 insn
= save_fpr (stack_pointer_rtx
, offset
, i
+ 16);
7838 RTX_FRAME_RELATED_P (insn
) = 1;
7841 if (offset
>= cfun_frame_layout
.f8_offset
)
7845 if (!TARGET_PACKED_STACK
)
7846 next_fpr
= cfun_save_high_fprs_p
? 31 : 0;
7848 /* Decrement stack pointer. */
7850 if (cfun_frame_layout
.frame_size
> 0)
7852 rtx frame_off
= GEN_INT (-cfun_frame_layout
.frame_size
);
7855 if (s390_stack_size
)
7857 HOST_WIDE_INT stack_guard
;
7859 if (s390_stack_guard
)
7860 stack_guard
= s390_stack_guard
;
7863 /* If no value for stack guard is provided the smallest power of 2
7864 larger than the current frame size is chosen. */
7866 while (stack_guard
< cfun_frame_layout
.frame_size
)
7870 if (cfun_frame_layout
.frame_size
>= s390_stack_size
)
7872 warning (0, "frame size of function %qs is "
7873 HOST_WIDE_INT_PRINT_DEC
7874 " bytes exceeding user provided stack limit of "
7875 HOST_WIDE_INT_PRINT_DEC
" bytes. "
7876 "An unconditional trap is added.",
7877 current_function_name(), cfun_frame_layout
.frame_size
,
7879 emit_insn (gen_trap ());
7883 /* stack_guard has to be smaller than s390_stack_size.
7884 Otherwise we would emit an AND with zero which would
7885 not match the test under mask pattern. */
7886 if (stack_guard
>= s390_stack_size
)
7888 warning (0, "frame size of function %qs is "
7889 HOST_WIDE_INT_PRINT_DEC
7890 " bytes which is more than half the stack size. "
7891 "The dynamic check would not be reliable. "
7892 "No check emitted for this function.",
7893 current_function_name(),
7894 cfun_frame_layout
.frame_size
);
7898 HOST_WIDE_INT stack_check_mask
= ((s390_stack_size
- 1)
7899 & ~(stack_guard
- 1));
7901 rtx t
= gen_rtx_AND (Pmode
, stack_pointer_rtx
,
7902 GEN_INT (stack_check_mask
));
7904 emit_insn (gen_ctrapdi4 (gen_rtx_EQ (VOIDmode
,
7906 t
, const0_rtx
, const0_rtx
));
7908 emit_insn (gen_ctrapsi4 (gen_rtx_EQ (VOIDmode
,
7910 t
, const0_rtx
, const0_rtx
));
7915 if (s390_warn_framesize
> 0
7916 && cfun_frame_layout
.frame_size
>= s390_warn_framesize
)
7917 warning (0, "frame size of %qs is " HOST_WIDE_INT_PRINT_DEC
" bytes",
7918 current_function_name (), cfun_frame_layout
.frame_size
);
7920 if (s390_warn_dynamicstack_p
&& cfun
->calls_alloca
)
7921 warning (0, "%qs uses dynamic stack allocation", current_function_name ());
7923 /* Save incoming stack pointer into temp reg. */
7924 if (TARGET_BACKCHAIN
|| next_fpr
)
7925 insn
= emit_insn (gen_move_insn (temp_reg
, stack_pointer_rtx
));
7927 /* Subtract frame size from stack pointer. */
7929 if (DISP_IN_RANGE (INTVAL (frame_off
)))
7931 insn
= gen_rtx_SET (VOIDmode
, stack_pointer_rtx
,
7932 gen_rtx_PLUS (Pmode
, stack_pointer_rtx
,
7934 insn
= emit_insn (insn
);
7938 if (!CONST_OK_FOR_K (INTVAL (frame_off
)))
7939 frame_off
= force_const_mem (Pmode
, frame_off
);
7941 insn
= emit_insn (gen_add2_insn (stack_pointer_rtx
, frame_off
));
7942 annotate_constant_pool_refs (&PATTERN (insn
));
7945 RTX_FRAME_RELATED_P (insn
) = 1;
7946 real_frame_off
= GEN_INT (-cfun_frame_layout
.frame_size
);
7947 add_reg_note (insn
, REG_FRAME_RELATED_EXPR
,
7948 gen_rtx_SET (VOIDmode
, stack_pointer_rtx
,
7949 gen_rtx_PLUS (Pmode
, stack_pointer_rtx
,
7952 /* Set backchain. */
7954 if (TARGET_BACKCHAIN
)
7956 if (cfun_frame_layout
.backchain_offset
)
7957 addr
= gen_rtx_MEM (Pmode
,
7958 plus_constant (stack_pointer_rtx
,
7959 cfun_frame_layout
.backchain_offset
));
7961 addr
= gen_rtx_MEM (Pmode
, stack_pointer_rtx
);
7962 set_mem_alias_set (addr
, get_frame_alias_set ());
7963 insn
= emit_insn (gen_move_insn (addr
, temp_reg
));
7966 /* If we support non-call exceptions (e.g. for Java),
7967 we need to make sure the backchain pointer is set up
7968 before any possibly trapping memory access. */
7969 if (TARGET_BACKCHAIN
&& cfun
->can_throw_non_call_exceptions
)
7971 addr
= gen_rtx_MEM (BLKmode
, gen_rtx_SCRATCH (VOIDmode
));
7972 emit_clobber (addr
);
7976 /* Save fprs 8 - 15 (64 bit ABI). */
7978 if (cfun_save_high_fprs_p
&& next_fpr
)
7980 /* If the stack might be accessed through a different register
7981 we have to make sure that the stack pointer decrement is not
7982 moved below the use of the stack slots. */
7983 s390_emit_stack_tie ();
7985 insn
= emit_insn (gen_add2_insn (temp_reg
,
7986 GEN_INT (cfun_frame_layout
.f8_offset
)));
7990 for (i
= 24; i
<= next_fpr
; i
++)
7991 if (cfun_fpr_bit_p (i
- 16))
7993 rtx addr
= plus_constant (stack_pointer_rtx
,
7994 cfun_frame_layout
.frame_size
7995 + cfun_frame_layout
.f8_offset
7998 insn
= save_fpr (temp_reg
, offset
, i
);
8000 RTX_FRAME_RELATED_P (insn
) = 1;
8001 add_reg_note (insn
, REG_FRAME_RELATED_EXPR
,
8002 gen_rtx_SET (VOIDmode
,
8003 gen_rtx_MEM (DFmode
, addr
),
8004 gen_rtx_REG (DFmode
, i
)));
8008 /* Set frame pointer, if needed. */
8010 if (frame_pointer_needed
)
8012 insn
= emit_move_insn (hard_frame_pointer_rtx
, stack_pointer_rtx
);
8013 RTX_FRAME_RELATED_P (insn
) = 1;
8016 /* Set up got pointer, if needed. */
8018 if (flag_pic
&& df_regs_ever_live_p (PIC_OFFSET_TABLE_REGNUM
))
8020 rtx insns
= s390_load_got ();
8022 for (insn
= insns
; insn
; insn
= NEXT_INSN (insn
))
8023 annotate_constant_pool_refs (&PATTERN (insn
));
8028 if (TARGET_TPF_PROFILING
)
8030 /* Generate a BAS instruction to serve as a function
8031 entry intercept to facilitate the use of tracing
8032 algorithms located at the branch target. */
8033 emit_insn (gen_prologue_tpf ());
8035 /* Emit a blockage here so that all code
8036 lies between the profiling mechanisms. */
8037 emit_insn (gen_blockage ());
8041 /* Expand the epilogue into a bunch of separate insns. */
8044 s390_emit_epilogue (bool sibcall
)
8046 rtx frame_pointer
, return_reg
, cfa_restores
= NULL_RTX
;
8047 int area_bottom
, area_top
, offset
= 0;
8052 if (TARGET_TPF_PROFILING
)
8055 /* Generate a BAS instruction to serve as a function
8056 entry intercept to facilitate the use of tracing
8057 algorithms located at the branch target. */
8059 /* Emit a blockage here so that all code
8060 lies between the profiling mechanisms. */
8061 emit_insn (gen_blockage ());
8063 emit_insn (gen_epilogue_tpf ());
8066 /* Check whether to use frame or stack pointer for restore. */
8068 frame_pointer
= (frame_pointer_needed
8069 ? hard_frame_pointer_rtx
: stack_pointer_rtx
);
8071 s390_frame_area (&area_bottom
, &area_top
);
8073 /* Check whether we can access the register save area.
8074 If not, increment the frame pointer as required. */
8076 if (area_top
<= area_bottom
)
8078 /* Nothing to restore. */
8080 else if (DISP_IN_RANGE (cfun_frame_layout
.frame_size
+ area_bottom
)
8081 && DISP_IN_RANGE (cfun_frame_layout
.frame_size
+ area_top
- 1))
8083 /* Area is in range. */
8084 offset
= cfun_frame_layout
.frame_size
;
8088 rtx insn
, frame_off
, cfa
;
8090 offset
= area_bottom
< 0 ? -area_bottom
: 0;
8091 frame_off
= GEN_INT (cfun_frame_layout
.frame_size
- offset
);
8093 cfa
= gen_rtx_SET (VOIDmode
, frame_pointer
,
8094 gen_rtx_PLUS (Pmode
, frame_pointer
, frame_off
));
8095 if (DISP_IN_RANGE (INTVAL (frame_off
)))
8097 insn
= gen_rtx_SET (VOIDmode
, frame_pointer
,
8098 gen_rtx_PLUS (Pmode
, frame_pointer
, frame_off
));
8099 insn
= emit_insn (insn
);
8103 if (!CONST_OK_FOR_K (INTVAL (frame_off
)))
8104 frame_off
= force_const_mem (Pmode
, frame_off
);
8106 insn
= emit_insn (gen_add2_insn (frame_pointer
, frame_off
));
8107 annotate_constant_pool_refs (&PATTERN (insn
));
8109 add_reg_note (insn
, REG_CFA_ADJUST_CFA
, cfa
);
8110 RTX_FRAME_RELATED_P (insn
) = 1;
8113 /* Restore call saved fprs. */
8117 if (cfun_save_high_fprs_p
)
8119 next_offset
= cfun_frame_layout
.f8_offset
;
8120 for (i
= 24; i
< 32; i
++)
8122 if (cfun_fpr_bit_p (i
- 16))
8124 restore_fpr (frame_pointer
,
8125 offset
+ next_offset
, i
);
8127 = alloc_reg_note (REG_CFA_RESTORE
,
8128 gen_rtx_REG (DFmode
, i
), cfa_restores
);
8137 next_offset
= cfun_frame_layout
.f4_offset
;
8138 for (i
= 18; i
< 20; i
++)
8140 if (cfun_fpr_bit_p (i
- 16))
8142 restore_fpr (frame_pointer
,
8143 offset
+ next_offset
, i
);
8145 = alloc_reg_note (REG_CFA_RESTORE
,
8146 gen_rtx_REG (DFmode
, i
), cfa_restores
);
8149 else if (!TARGET_PACKED_STACK
)
8155 /* Return register. */
8157 return_reg
= gen_rtx_REG (Pmode
, RETURN_REGNUM
);
8159 /* Restore call saved gprs. */
8161 if (cfun_frame_layout
.first_restore_gpr
!= -1)
8166 /* Check for global register and save them
8167 to stack location from where they get restored. */
8169 for (i
= cfun_frame_layout
.first_restore_gpr
;
8170 i
<= cfun_frame_layout
.last_restore_gpr
;
8173 if (global_not_special_regno_p (i
))
8175 addr
= plus_constant (frame_pointer
,
8176 offset
+ cfun_frame_layout
.gprs_offset
8177 + (i
- cfun_frame_layout
.first_save_gpr_slot
)
8179 addr
= gen_rtx_MEM (Pmode
, addr
);
8180 set_mem_alias_set (addr
, get_frame_alias_set ());
8181 emit_move_insn (addr
, gen_rtx_REG (Pmode
, i
));
8185 = alloc_reg_note (REG_CFA_RESTORE
,
8186 gen_rtx_REG (Pmode
, i
), cfa_restores
);
8191 /* Fetch return address from stack before load multiple,
8192 this will do good for scheduling. */
8194 if (cfun_frame_layout
.save_return_addr_p
8195 || (cfun_frame_layout
.first_restore_gpr
< BASE_REGNUM
8196 && cfun_frame_layout
.last_restore_gpr
> RETURN_REGNUM
))
8198 int return_regnum
= find_unused_clobbered_reg();
8201 return_reg
= gen_rtx_REG (Pmode
, return_regnum
);
8203 addr
= plus_constant (frame_pointer
,
8204 offset
+ cfun_frame_layout
.gprs_offset
8206 - cfun_frame_layout
.first_save_gpr_slot
)
8208 addr
= gen_rtx_MEM (Pmode
, addr
);
8209 set_mem_alias_set (addr
, get_frame_alias_set ());
8210 emit_move_insn (return_reg
, addr
);
8214 insn
= restore_gprs (frame_pointer
,
8215 offset
+ cfun_frame_layout
.gprs_offset
8216 + (cfun_frame_layout
.first_restore_gpr
8217 - cfun_frame_layout
.first_save_gpr_slot
)
8219 cfun_frame_layout
.first_restore_gpr
,
8220 cfun_frame_layout
.last_restore_gpr
);
8221 insn
= emit_insn (insn
);
8222 REG_NOTES (insn
) = cfa_restores
;
8223 add_reg_note (insn
, REG_CFA_DEF_CFA
,
8224 plus_constant (stack_pointer_rtx
, STACK_POINTER_OFFSET
));
8225 RTX_FRAME_RELATED_P (insn
) = 1;
8231 /* Return to caller. */
8233 p
= rtvec_alloc (2);
8235 RTVEC_ELT (p
, 0) = gen_rtx_RETURN (VOIDmode
);
8236 RTVEC_ELT (p
, 1) = gen_rtx_USE (VOIDmode
, return_reg
);
8237 emit_jump_insn (gen_rtx_PARALLEL (VOIDmode
, p
));
8242 /* Return the size in bytes of a function argument of
8243 type TYPE and/or mode MODE. At least one of TYPE or
8244 MODE must be specified. */
8247 s390_function_arg_size (enum machine_mode mode
, const_tree type
)
8250 return int_size_in_bytes (type
);
8252 /* No type info available for some library calls ... */
8253 if (mode
!= BLKmode
)
8254 return GET_MODE_SIZE (mode
);
8256 /* If we have neither type nor mode, abort */
8260 /* Return true if a function argument of type TYPE and mode MODE
8261 is to be passed in a floating-point register, if available. */
8264 s390_function_arg_float (enum machine_mode mode
, tree type
)
8266 int size
= s390_function_arg_size (mode
, type
);
8270 /* Soft-float changes the ABI: no floating-point registers are used. */
8271 if (TARGET_SOFT_FLOAT
)
8274 /* No type info available for some library calls ... */
8276 return mode
== SFmode
|| mode
== DFmode
|| mode
== SDmode
|| mode
== DDmode
;
8278 /* The ABI says that record types with a single member are treated
8279 just like that member would be. */
8280 while (TREE_CODE (type
) == RECORD_TYPE
)
8282 tree field
, single
= NULL_TREE
;
8284 for (field
= TYPE_FIELDS (type
); field
; field
= TREE_CHAIN (field
))
8286 if (TREE_CODE (field
) != FIELD_DECL
)
8289 if (single
== NULL_TREE
)
8290 single
= TREE_TYPE (field
);
8295 if (single
== NULL_TREE
)
8301 return TREE_CODE (type
) == REAL_TYPE
;
8304 /* Return true if a function argument of type TYPE and mode MODE
8305 is to be passed in an integer register, or a pair of integer
8306 registers, if available. */
8309 s390_function_arg_integer (enum machine_mode mode
, tree type
)
8311 int size
= s390_function_arg_size (mode
, type
);
8315 /* No type info available for some library calls ... */
8317 return GET_MODE_CLASS (mode
) == MODE_INT
8318 || (TARGET_SOFT_FLOAT
&& SCALAR_FLOAT_MODE_P (mode
));
8320 /* We accept small integral (and similar) types. */
8321 if (INTEGRAL_TYPE_P (type
)
8322 || POINTER_TYPE_P (type
)
8323 || TREE_CODE (type
) == OFFSET_TYPE
8324 || (TARGET_SOFT_FLOAT
&& TREE_CODE (type
) == REAL_TYPE
))
8327 /* We also accept structs of size 1, 2, 4, 8 that are not
8328 passed in floating-point registers. */
8329 if (AGGREGATE_TYPE_P (type
)
8330 && exact_log2 (size
) >= 0
8331 && !s390_function_arg_float (mode
, type
))
8337 /* Return 1 if a function argument of type TYPE and mode MODE
8338 is to be passed by reference. The ABI specifies that only
8339 structures of size 1, 2, 4, or 8 bytes are passed by value,
8340 all other structures (and complex numbers) are passed by
8344 s390_pass_by_reference (CUMULATIVE_ARGS
*ca ATTRIBUTE_UNUSED
,
8345 enum machine_mode mode
, const_tree type
,
8346 bool named ATTRIBUTE_UNUSED
)
8348 int size
= s390_function_arg_size (mode
, type
);
8354 if (AGGREGATE_TYPE_P (type
) && exact_log2 (size
) < 0)
8357 if (TREE_CODE (type
) == COMPLEX_TYPE
8358 || TREE_CODE (type
) == VECTOR_TYPE
)
8365 /* Update the data in CUM to advance over an argument of mode MODE and
8366 data type TYPE. (TYPE is null for libcalls where that information
8367 may not be available.). The boolean NAMED specifies whether the
8368 argument is a named argument (as opposed to an unnamed argument
8369 matching an ellipsis). */
8372 s390_function_arg_advance (CUMULATIVE_ARGS
*cum
, enum machine_mode mode
,
8373 tree type
, int named ATTRIBUTE_UNUSED
)
8375 if (s390_function_arg_float (mode
, type
))
8379 else if (s390_function_arg_integer (mode
, type
))
8381 int size
= s390_function_arg_size (mode
, type
);
8382 cum
->gprs
+= ((size
+ UNITS_PER_LONG
- 1) / UNITS_PER_LONG
);
8388 /* Define where to put the arguments to a function.
8389 Value is zero to push the argument on the stack,
8390 or a hard register in which to store the argument.
8392 MODE is the argument's machine mode.
8393 TYPE is the data type of the argument (as a tree).
8394 This is null for libcalls where that information may
8396 CUM is a variable of type CUMULATIVE_ARGS which gives info about
8397 the preceding args and about the function being called.
8398 NAMED is nonzero if this argument is a named parameter
8399 (otherwise it is an extra parameter matching an ellipsis).
8401 On S/390, we use general purpose registers 2 through 6 to
8402 pass integer, pointer, and certain structure arguments, and
8403 floating point registers 0 and 2 (0, 2, 4, and 6 on 64-bit)
8404 to pass floating point arguments. All remaining arguments
8405 are pushed to the stack. */
8408 s390_function_arg (CUMULATIVE_ARGS
*cum
, enum machine_mode mode
, tree type
,
8409 int named ATTRIBUTE_UNUSED
)
8411 if (s390_function_arg_float (mode
, type
))
8413 if (cum
->fprs
+ 1 > FP_ARG_NUM_REG
)
8416 return gen_rtx_REG (mode
, cum
->fprs
+ 16);
8418 else if (s390_function_arg_integer (mode
, type
))
8420 int size
= s390_function_arg_size (mode
, type
);
8421 int n_gprs
= (size
+ UNITS_PER_LONG
- 1) / UNITS_PER_LONG
;
8423 if (cum
->gprs
+ n_gprs
> GP_ARG_NUM_REG
)
8425 else if (n_gprs
== 1 || UNITS_PER_WORD
== UNITS_PER_LONG
)
8426 return gen_rtx_REG (mode
, cum
->gprs
+ 2);
8427 else if (n_gprs
== 2)
8429 rtvec p
= rtvec_alloc (2);
8432 = gen_rtx_EXPR_LIST (SImode
, gen_rtx_REG (SImode
, cum
->gprs
+ 2),
8435 = gen_rtx_EXPR_LIST (SImode
, gen_rtx_REG (SImode
, cum
->gprs
+ 3),
8438 return gen_rtx_PARALLEL (mode
, p
);
8442 /* After the real arguments, expand_call calls us once again
8443 with a void_type_node type. Whatever we return here is
8444 passed as operand 2 to the call expanders.
8446 We don't need this feature ... */
8447 else if (type
== void_type_node
)
8453 /* Return true if return values of type TYPE should be returned
8454 in a memory buffer whose address is passed by the caller as
8455 hidden first argument. */
8458 s390_return_in_memory (const_tree type
, const_tree fundecl ATTRIBUTE_UNUSED
)
8460 /* We accept small integral (and similar) types. */
8461 if (INTEGRAL_TYPE_P (type
)
8462 || POINTER_TYPE_P (type
)
8463 || TREE_CODE (type
) == OFFSET_TYPE
8464 || TREE_CODE (type
) == REAL_TYPE
)
8465 return int_size_in_bytes (type
) > 8;
8467 /* Aggregates and similar constructs are always returned
8469 if (AGGREGATE_TYPE_P (type
)
8470 || TREE_CODE (type
) == COMPLEX_TYPE
8471 || TREE_CODE (type
) == VECTOR_TYPE
)
8474 /* ??? We get called on all sorts of random stuff from
8475 aggregate_value_p. We can't abort, but it's not clear
8476 what's safe to return. Pretend it's a struct I guess. */
8480 /* Function arguments and return values are promoted to word size. */
8482 static enum machine_mode
8483 s390_promote_function_mode (const_tree type
, enum machine_mode mode
,
8485 const_tree fntype ATTRIBUTE_UNUSED
,
8486 int for_return ATTRIBUTE_UNUSED
)
8488 if (INTEGRAL_MODE_P (mode
)
8489 && GET_MODE_SIZE (mode
) < UNITS_PER_LONG
)
8491 if (POINTER_TYPE_P (type
))
8492 *punsignedp
= POINTERS_EXTEND_UNSIGNED
;
8499 /* Define where to return a (scalar) value of type TYPE.
8500 If TYPE is null, define where to return a (scalar)
8501 value of mode MODE from a libcall. */
8504 s390_function_value (const_tree type
, const_tree fn
, enum machine_mode mode
)
8508 int unsignedp
= TYPE_UNSIGNED (type
);
8509 mode
= promote_function_mode (type
, TYPE_MODE (type
), &unsignedp
, fn
, 1);
8512 gcc_assert (GET_MODE_CLASS (mode
) == MODE_INT
|| SCALAR_FLOAT_MODE_P (mode
));
8513 gcc_assert (GET_MODE_SIZE (mode
) <= 8);
8515 if (TARGET_HARD_FLOAT
&& SCALAR_FLOAT_MODE_P (mode
))
8516 return gen_rtx_REG (mode
, 16);
8517 else if (GET_MODE_SIZE (mode
) <= UNITS_PER_LONG
8518 || UNITS_PER_LONG
== UNITS_PER_WORD
)
8519 return gen_rtx_REG (mode
, 2);
8520 else if (GET_MODE_SIZE (mode
) == 2 * UNITS_PER_LONG
)
8522 rtvec p
= rtvec_alloc (2);
8525 = gen_rtx_EXPR_LIST (SImode
, gen_rtx_REG (SImode
, 2), const0_rtx
);
8527 = gen_rtx_EXPR_LIST (SImode
, gen_rtx_REG (SImode
, 3), GEN_INT (4));
8529 return gen_rtx_PARALLEL (mode
, p
);
8536 /* Create and return the va_list datatype.
8538 On S/390, va_list is an array type equivalent to
8540 typedef struct __va_list_tag
8544 void *__overflow_arg_area;
8545 void *__reg_save_area;
8548 where __gpr and __fpr hold the number of general purpose
8549 or floating point arguments used up to now, respectively,
8550 __overflow_arg_area points to the stack location of the
8551 next argument passed on the stack, and __reg_save_area
8552 always points to the start of the register area in the
8553 call frame of the current function. The function prologue
8554 saves all registers used for argument passing into this
8555 area if the function uses variable arguments. */
8558 s390_build_builtin_va_list (void)
8560 tree f_gpr
, f_fpr
, f_ovf
, f_sav
, record
, type_decl
;
8562 record
= lang_hooks
.types
.make_type (RECORD_TYPE
);
8565 build_decl (BUILTINS_LOCATION
,
8566 TYPE_DECL
, get_identifier ("__va_list_tag"), record
);
8568 f_gpr
= build_decl (BUILTINS_LOCATION
,
8569 FIELD_DECL
, get_identifier ("__gpr"),
8570 long_integer_type_node
);
8571 f_fpr
= build_decl (BUILTINS_LOCATION
,
8572 FIELD_DECL
, get_identifier ("__fpr"),
8573 long_integer_type_node
);
8574 f_ovf
= build_decl (BUILTINS_LOCATION
,
8575 FIELD_DECL
, get_identifier ("__overflow_arg_area"),
8577 f_sav
= build_decl (BUILTINS_LOCATION
,
8578 FIELD_DECL
, get_identifier ("__reg_save_area"),
8581 va_list_gpr_counter_field
= f_gpr
;
8582 va_list_fpr_counter_field
= f_fpr
;
8584 DECL_FIELD_CONTEXT (f_gpr
) = record
;
8585 DECL_FIELD_CONTEXT (f_fpr
) = record
;
8586 DECL_FIELD_CONTEXT (f_ovf
) = record
;
8587 DECL_FIELD_CONTEXT (f_sav
) = record
;
8589 TREE_CHAIN (record
) = type_decl
;
8590 TYPE_NAME (record
) = type_decl
;
8591 TYPE_FIELDS (record
) = f_gpr
;
8592 TREE_CHAIN (f_gpr
) = f_fpr
;
8593 TREE_CHAIN (f_fpr
) = f_ovf
;
8594 TREE_CHAIN (f_ovf
) = f_sav
;
8596 layout_type (record
);
8598 /* The correct type is an array type of one element. */
8599 return build_array_type (record
, build_index_type (size_zero_node
));
8602 /* Implement va_start by filling the va_list structure VALIST.
8603 STDARG_P is always true, and ignored.
8604 NEXTARG points to the first anonymous stack argument.
8606 The following global variables are used to initialize
8607 the va_list structure:
8610 holds number of gprs and fprs used for named arguments.
8611 crtl->args.arg_offset_rtx:
8612 holds the offset of the first anonymous stack argument
8613 (relative to the virtual arg pointer). */
8616 s390_va_start (tree valist
, rtx nextarg ATTRIBUTE_UNUSED
)
8618 HOST_WIDE_INT n_gpr
, n_fpr
;
8620 tree f_gpr
, f_fpr
, f_ovf
, f_sav
;
8621 tree gpr
, fpr
, ovf
, sav
, t
;
8623 f_gpr
= TYPE_FIELDS (TREE_TYPE (va_list_type_node
));
8624 f_fpr
= TREE_CHAIN (f_gpr
);
8625 f_ovf
= TREE_CHAIN (f_fpr
);
8626 f_sav
= TREE_CHAIN (f_ovf
);
8628 valist
= build_va_arg_indirect_ref (valist
);
8629 gpr
= build3 (COMPONENT_REF
, TREE_TYPE (f_gpr
), valist
, f_gpr
, NULL_TREE
);
8630 fpr
= build3 (COMPONENT_REF
, TREE_TYPE (f_fpr
), valist
, f_fpr
, NULL_TREE
);
8631 ovf
= build3 (COMPONENT_REF
, TREE_TYPE (f_ovf
), valist
, f_ovf
, NULL_TREE
);
8632 sav
= build3 (COMPONENT_REF
, TREE_TYPE (f_sav
), valist
, f_sav
, NULL_TREE
);
8634 /* Count number of gp and fp argument registers used. */
8636 n_gpr
= crtl
->args
.info
.gprs
;
8637 n_fpr
= crtl
->args
.info
.fprs
;
8639 if (cfun
->va_list_gpr_size
)
8641 t
= build2 (MODIFY_EXPR
, TREE_TYPE (gpr
), gpr
,
8642 build_int_cst (NULL_TREE
, n_gpr
));
8643 TREE_SIDE_EFFECTS (t
) = 1;
8644 expand_expr (t
, const0_rtx
, VOIDmode
, EXPAND_NORMAL
);
8647 if (cfun
->va_list_fpr_size
)
8649 t
= build2 (MODIFY_EXPR
, TREE_TYPE (fpr
), fpr
,
8650 build_int_cst (NULL_TREE
, n_fpr
));
8651 TREE_SIDE_EFFECTS (t
) = 1;
8652 expand_expr (t
, const0_rtx
, VOIDmode
, EXPAND_NORMAL
);
8655 /* Find the overflow area. */
8656 if (n_gpr
+ cfun
->va_list_gpr_size
> GP_ARG_NUM_REG
8657 || n_fpr
+ cfun
->va_list_fpr_size
> FP_ARG_NUM_REG
)
8659 t
= make_tree (TREE_TYPE (ovf
), virtual_incoming_args_rtx
);
8661 off
= INTVAL (crtl
->args
.arg_offset_rtx
);
8662 off
= off
< 0 ? 0 : off
;
8663 if (TARGET_DEBUG_ARG
)
8664 fprintf (stderr
, "va_start: n_gpr = %d, n_fpr = %d off %d\n",
8665 (int)n_gpr
, (int)n_fpr
, off
);
8667 t
= build2 (POINTER_PLUS_EXPR
, TREE_TYPE (ovf
), t
, size_int (off
));
8669 t
= build2 (MODIFY_EXPR
, TREE_TYPE (ovf
), ovf
, t
);
8670 TREE_SIDE_EFFECTS (t
) = 1;
8671 expand_expr (t
, const0_rtx
, VOIDmode
, EXPAND_NORMAL
);
8674 /* Find the register save area. */
8675 if ((cfun
->va_list_gpr_size
&& n_gpr
< GP_ARG_NUM_REG
)
8676 || (cfun
->va_list_fpr_size
&& n_fpr
< FP_ARG_NUM_REG
))
8678 t
= make_tree (TREE_TYPE (sav
), return_address_pointer_rtx
);
8679 t
= build2 (POINTER_PLUS_EXPR
, TREE_TYPE (sav
), t
,
8680 size_int (-RETURN_REGNUM
* UNITS_PER_LONG
));
8682 t
= build2 (MODIFY_EXPR
, TREE_TYPE (sav
), sav
, t
);
8683 TREE_SIDE_EFFECTS (t
) = 1;
8684 expand_expr (t
, const0_rtx
, VOIDmode
, EXPAND_NORMAL
);
8688 /* Implement va_arg by updating the va_list structure
8689 VALIST as required to retrieve an argument of type
8690 TYPE, and returning that argument.
8692 Generates code equivalent to:
8694 if (integral value) {
8695 if (size <= 4 && args.gpr < 5 ||
8696 size > 4 && args.gpr < 4 )
8697 ret = args.reg_save_area[args.gpr+8]
8699 ret = *args.overflow_arg_area++;
8700 } else if (float value) {
8702 ret = args.reg_save_area[args.fpr+64]
8704 ret = *args.overflow_arg_area++;
8705 } else if (aggregate value) {
8707 ret = *args.reg_save_area[args.gpr]
8709 ret = **args.overflow_arg_area++;
8713 s390_gimplify_va_arg (tree valist
, tree type
, gimple_seq
*pre_p
,
8714 gimple_seq
*post_p ATTRIBUTE_UNUSED
)
8716 tree f_gpr
, f_fpr
, f_ovf
, f_sav
;
8717 tree gpr
, fpr
, ovf
, sav
, reg
, t
, u
;
8718 int indirect_p
, size
, n_reg
, sav_ofs
, sav_scale
, max_reg
;
8719 tree lab_false
, lab_over
, addr
;
8721 f_gpr
= TYPE_FIELDS (TREE_TYPE (va_list_type_node
));
8722 f_fpr
= TREE_CHAIN (f_gpr
);
8723 f_ovf
= TREE_CHAIN (f_fpr
);
8724 f_sav
= TREE_CHAIN (f_ovf
);
8726 valist
= build_va_arg_indirect_ref (valist
);
8727 gpr
= build3 (COMPONENT_REF
, TREE_TYPE (f_gpr
), valist
, f_gpr
, NULL_TREE
);
8728 fpr
= build3 (COMPONENT_REF
, TREE_TYPE (f_fpr
), valist
, f_fpr
, NULL_TREE
);
8729 sav
= build3 (COMPONENT_REF
, TREE_TYPE (f_sav
), valist
, f_sav
, NULL_TREE
);
8731 /* The tree for args* cannot be shared between gpr/fpr and ovf since
8732 both appear on a lhs. */
8733 valist
= unshare_expr (valist
);
8734 ovf
= build3 (COMPONENT_REF
, TREE_TYPE (f_ovf
), valist
, f_ovf
, NULL_TREE
);
8736 size
= int_size_in_bytes (type
);
8738 if (pass_by_reference (NULL
, TYPE_MODE (type
), type
, false))
8740 if (TARGET_DEBUG_ARG
)
8742 fprintf (stderr
, "va_arg: aggregate type");
8746 /* Aggregates are passed by reference. */
8751 /* kernel stack layout on 31 bit: It is assumed here that no padding
8752 will be added by s390_frame_info because for va_args always an even
8753 number of gprs has to be saved r15-r2 = 14 regs. */
8754 sav_ofs
= 2 * UNITS_PER_LONG
;
8755 sav_scale
= UNITS_PER_LONG
;
8756 size
= UNITS_PER_LONG
;
8757 max_reg
= GP_ARG_NUM_REG
- n_reg
;
8759 else if (s390_function_arg_float (TYPE_MODE (type
), type
))
8761 if (TARGET_DEBUG_ARG
)
8763 fprintf (stderr
, "va_arg: float type");
8767 /* FP args go in FP registers, if present. */
8771 sav_ofs
= 16 * UNITS_PER_LONG
;
8773 max_reg
= FP_ARG_NUM_REG
- n_reg
;
8777 if (TARGET_DEBUG_ARG
)
8779 fprintf (stderr
, "va_arg: other type");
8783 /* Otherwise into GP registers. */
8786 n_reg
= (size
+ UNITS_PER_LONG
- 1) / UNITS_PER_LONG
;
8788 /* kernel stack layout on 31 bit: It is assumed here that no padding
8789 will be added by s390_frame_info because for va_args always an even
8790 number of gprs has to be saved r15-r2 = 14 regs. */
8791 sav_ofs
= 2 * UNITS_PER_LONG
;
8793 if (size
< UNITS_PER_LONG
)
8794 sav_ofs
+= UNITS_PER_LONG
- size
;
8796 sav_scale
= UNITS_PER_LONG
;
8797 max_reg
= GP_ARG_NUM_REG
- n_reg
;
8800 /* Pull the value out of the saved registers ... */
8802 lab_false
= create_artificial_label (UNKNOWN_LOCATION
);
8803 lab_over
= create_artificial_label (UNKNOWN_LOCATION
);
8804 addr
= create_tmp_var (ptr_type_node
, "addr");
8806 t
= fold_convert (TREE_TYPE (reg
), size_int (max_reg
));
8807 t
= build2 (GT_EXPR
, boolean_type_node
, reg
, t
);
8808 u
= build1 (GOTO_EXPR
, void_type_node
, lab_false
);
8809 t
= build3 (COND_EXPR
, void_type_node
, t
, u
, NULL_TREE
);
8810 gimplify_and_add (t
, pre_p
);
8812 t
= build2 (POINTER_PLUS_EXPR
, ptr_type_node
, sav
,
8813 size_int (sav_ofs
));
8814 u
= build2 (MULT_EXPR
, TREE_TYPE (reg
), reg
,
8815 fold_convert (TREE_TYPE (reg
), size_int (sav_scale
)));
8816 t
= build2 (POINTER_PLUS_EXPR
, ptr_type_node
, t
, fold_convert (sizetype
, u
));
8818 gimplify_assign (addr
, t
, pre_p
);
8820 gimple_seq_add_stmt (pre_p
, gimple_build_goto (lab_over
));
8822 gimple_seq_add_stmt (pre_p
, gimple_build_label (lab_false
));
8825 /* ... Otherwise out of the overflow area. */
8828 if (size
< UNITS_PER_LONG
)
8829 t
= build2 (POINTER_PLUS_EXPR
, ptr_type_node
, t
,
8830 size_int (UNITS_PER_LONG
- size
));
8832 gimplify_expr (&t
, pre_p
, NULL
, is_gimple_val
, fb_rvalue
);
8834 gimplify_assign (addr
, t
, pre_p
);
8836 t
= build2 (POINTER_PLUS_EXPR
, ptr_type_node
, t
,
8838 gimplify_assign (ovf
, t
, pre_p
);
8840 gimple_seq_add_stmt (pre_p
, gimple_build_label (lab_over
));
8843 /* Increment register save count. */
8845 u
= build2 (PREINCREMENT_EXPR
, TREE_TYPE (reg
), reg
,
8846 fold_convert (TREE_TYPE (reg
), size_int (n_reg
)));
8847 gimplify_and_add (u
, pre_p
);
8851 t
= build_pointer_type_for_mode (build_pointer_type (type
),
8853 addr
= fold_convert (t
, addr
);
8854 addr
= build_va_arg_indirect_ref (addr
);
8858 t
= build_pointer_type_for_mode (type
, ptr_mode
, true);
8859 addr
= fold_convert (t
, addr
);
8862 return build_va_arg_indirect_ref (addr
);
8870 S390_BUILTIN_THREAD_POINTER
,
8871 S390_BUILTIN_SET_THREAD_POINTER
,
8876 static enum insn_code
const code_for_builtin_64
[S390_BUILTIN_max
] = {
8881 static enum insn_code
const code_for_builtin_31
[S390_BUILTIN_max
] = {
8887 s390_init_builtins (void)
8891 ftype
= build_function_type (ptr_type_node
, void_list_node
);
8892 add_builtin_function ("__builtin_thread_pointer", ftype
,
8893 S390_BUILTIN_THREAD_POINTER
, BUILT_IN_MD
,
8896 ftype
= build_function_type_list (void_type_node
, ptr_type_node
, NULL_TREE
);
8897 add_builtin_function ("__builtin_set_thread_pointer", ftype
,
8898 S390_BUILTIN_SET_THREAD_POINTER
, BUILT_IN_MD
,
8902 /* Expand an expression EXP that calls a built-in function,
8903 with result going to TARGET if that's convenient
8904 (and in mode MODE if that's convenient).
8905 SUBTARGET may be used as the target for computing one of EXP's operands.
8906 IGNORE is nonzero if the value is to be ignored. */
8909 s390_expand_builtin (tree exp
, rtx target
, rtx subtarget ATTRIBUTE_UNUSED
,
8910 enum machine_mode mode ATTRIBUTE_UNUSED
,
8911 int ignore ATTRIBUTE_UNUSED
)
8915 enum insn_code
const *code_for_builtin
=
8916 TARGET_64BIT
? code_for_builtin_64
: code_for_builtin_31
;
8918 tree fndecl
= TREE_OPERAND (CALL_EXPR_FN (exp
), 0);
8919 unsigned int fcode
= DECL_FUNCTION_CODE (fndecl
);
8920 enum insn_code icode
;
8921 rtx op
[MAX_ARGS
], pat
;
8925 call_expr_arg_iterator iter
;
8927 if (fcode
>= S390_BUILTIN_max
)
8928 internal_error ("bad builtin fcode");
8929 icode
= code_for_builtin
[fcode
];
8931 internal_error ("bad builtin fcode");
8933 nonvoid
= TREE_TYPE (TREE_TYPE (fndecl
)) != void_type_node
;
8936 FOR_EACH_CALL_EXPR_ARG (arg
, iter
, exp
)
8938 const struct insn_operand_data
*insn_op
;
8940 if (arg
== error_mark_node
)
8942 if (arity
> MAX_ARGS
)
8945 insn_op
= &insn_data
[icode
].operand
[arity
+ nonvoid
];
8947 op
[arity
] = expand_expr (arg
, NULL_RTX
, insn_op
->mode
, EXPAND_NORMAL
);
8949 if (!(*insn_op
->predicate
) (op
[arity
], insn_op
->mode
))
8950 op
[arity
] = copy_to_mode_reg (insn_op
->mode
, op
[arity
]);
8956 enum machine_mode tmode
= insn_data
[icode
].operand
[0].mode
;
8958 || GET_MODE (target
) != tmode
8959 || !(*insn_data
[icode
].operand
[0].predicate
) (target
, tmode
))
8960 target
= gen_reg_rtx (tmode
);
8966 pat
= GEN_FCN (icode
) (target
);
8970 pat
= GEN_FCN (icode
) (target
, op
[0]);
8972 pat
= GEN_FCN (icode
) (op
[0]);
8975 pat
= GEN_FCN (icode
) (target
, op
[0], op
[1]);
8991 /* Output assembly code for the trampoline template to
8994 On S/390, we use gpr 1 internally in the trampoline code;
8995 gpr 0 is used to hold the static chain. */
8998 s390_asm_trampoline_template (FILE *file
)
9001 op
[0] = gen_rtx_REG (Pmode
, 0);
9002 op
[1] = gen_rtx_REG (Pmode
, 1);
9006 output_asm_insn ("basr\t%1,0", op
);
9007 output_asm_insn ("lmg\t%0,%1,14(%1)", op
);
9008 output_asm_insn ("br\t%1", op
);
9009 ASM_OUTPUT_SKIP (file
, (HOST_WIDE_INT
)(TRAMPOLINE_SIZE
- 10));
9013 output_asm_insn ("basr\t%1,0", op
);
9014 output_asm_insn ("lm\t%0,%1,6(%1)", op
);
9015 output_asm_insn ("br\t%1", op
);
9016 ASM_OUTPUT_SKIP (file
, (HOST_WIDE_INT
)(TRAMPOLINE_SIZE
- 8));
9020 /* Emit RTL insns to initialize the variable parts of a trampoline.
9021 FNADDR is an RTX for the address of the function's pure code.
9022 CXT is an RTX for the static chain value for the function. */
9025 s390_trampoline_init (rtx m_tramp
, tree fndecl
, rtx cxt
)
9027 rtx fnaddr
= XEXP (DECL_RTL (fndecl
), 0);
9030 emit_block_move (m_tramp
, assemble_trampoline_template (),
9031 GEN_INT (2*UNITS_PER_WORD
), BLOCK_OP_NORMAL
);
9033 mem
= adjust_address (m_tramp
, Pmode
, 2*UNITS_PER_WORD
);
9034 emit_move_insn (mem
, cxt
);
9035 mem
= adjust_address (m_tramp
, Pmode
, 3*UNITS_PER_WORD
);
9036 emit_move_insn (mem
, fnaddr
);
9039 /* Output assembler code to FILE to increment profiler label # LABELNO
9040 for profiling a function entry. */
9043 s390_function_profiler (FILE *file
, int labelno
)
9048 ASM_GENERATE_INTERNAL_LABEL (label
, "LP", labelno
);
9050 fprintf (file
, "# function profiler \n");
9052 op
[0] = gen_rtx_REG (Pmode
, RETURN_REGNUM
);
9053 op
[1] = gen_rtx_REG (Pmode
, STACK_POINTER_REGNUM
);
9054 op
[1] = gen_rtx_MEM (Pmode
, plus_constant (op
[1], UNITS_PER_LONG
));
9056 op
[2] = gen_rtx_REG (Pmode
, 1);
9057 op
[3] = gen_rtx_SYMBOL_REF (Pmode
, label
);
9058 SYMBOL_REF_FLAGS (op
[3]) = SYMBOL_FLAG_LOCAL
;
9060 op
[4] = gen_rtx_SYMBOL_REF (Pmode
, "_mcount");
9063 op
[4] = gen_rtx_UNSPEC (Pmode
, gen_rtvec (1, op
[4]), UNSPEC_PLT
);
9064 op
[4] = gen_rtx_CONST (Pmode
, op
[4]);
9069 output_asm_insn ("stg\t%0,%1", op
);
9070 output_asm_insn ("larl\t%2,%3", op
);
9071 output_asm_insn ("brasl\t%0,%4", op
);
9072 output_asm_insn ("lg\t%0,%1", op
);
9076 op
[6] = gen_label_rtx ();
9078 output_asm_insn ("st\t%0,%1", op
);
9079 output_asm_insn ("bras\t%2,%l6", op
);
9080 output_asm_insn (".long\t%4", op
);
9081 output_asm_insn (".long\t%3", op
);
9082 targetm
.asm_out
.internal_label (file
, "L", CODE_LABEL_NUMBER (op
[6]));
9083 output_asm_insn ("l\t%0,0(%2)", op
);
9084 output_asm_insn ("l\t%2,4(%2)", op
);
9085 output_asm_insn ("basr\t%0,%0", op
);
9086 output_asm_insn ("l\t%0,%1", op
);
9090 op
[5] = gen_label_rtx ();
9091 op
[6] = gen_label_rtx ();
9093 output_asm_insn ("st\t%0,%1", op
);
9094 output_asm_insn ("bras\t%2,%l6", op
);
9095 targetm
.asm_out
.internal_label (file
, "L", CODE_LABEL_NUMBER (op
[5]));
9096 output_asm_insn (".long\t%4-%l5", op
);
9097 output_asm_insn (".long\t%3-%l5", op
);
9098 targetm
.asm_out
.internal_label (file
, "L", CODE_LABEL_NUMBER (op
[6]));
9099 output_asm_insn ("lr\t%0,%2", op
);
9100 output_asm_insn ("a\t%0,0(%2)", op
);
9101 output_asm_insn ("a\t%2,4(%2)", op
);
9102 output_asm_insn ("basr\t%0,%0", op
);
9103 output_asm_insn ("l\t%0,%1", op
);
9107 /* Encode symbol attributes (local vs. global, tls model) of a SYMBOL_REF
9108 into its SYMBOL_REF_FLAGS. */
9111 s390_encode_section_info (tree decl
, rtx rtl
, int first
)
9113 default_encode_section_info (decl
, rtl
, first
);
9115 if (TREE_CODE (decl
) == VAR_DECL
)
9117 /* If a variable has a forced alignment to < 2 bytes, mark it
9118 with SYMBOL_FLAG_ALIGN1 to prevent it from being used as LARL
9120 if (DECL_USER_ALIGN (decl
) && DECL_ALIGN (decl
) < 16)
9121 SYMBOL_REF_FLAGS (XEXP (rtl
, 0)) |= SYMBOL_FLAG_ALIGN1
;
9122 if (!DECL_SIZE (decl
)
9123 || !DECL_ALIGN (decl
)
9124 || !host_integerp (DECL_SIZE (decl
), 0)
9125 || (DECL_ALIGN (decl
) <= 64
9126 && DECL_ALIGN (decl
) != tree_low_cst (DECL_SIZE (decl
), 0)))
9127 SYMBOL_REF_FLAGS (XEXP (rtl
, 0)) |= SYMBOL_FLAG_NOT_NATURALLY_ALIGNED
;
9130 /* Literal pool references don't have a decl so they are handled
9131 differently here. We rely on the information in the MEM_ALIGN
9132 entry to decide upon natural alignment. */
9134 && GET_CODE (XEXP (rtl
, 0)) == SYMBOL_REF
9135 && TREE_CONSTANT_POOL_ADDRESS_P (XEXP (rtl
, 0))
9136 && (MEM_ALIGN (rtl
) == 0
9137 || GET_MODE_BITSIZE (GET_MODE (rtl
)) == 0
9138 || MEM_ALIGN (rtl
) < GET_MODE_BITSIZE (GET_MODE (rtl
))))
9139 SYMBOL_REF_FLAGS (XEXP (rtl
, 0)) |= SYMBOL_FLAG_NOT_NATURALLY_ALIGNED
;
9142 /* Output thunk to FILE that implements a C++ virtual function call (with
9143 multiple inheritance) to FUNCTION. The thunk adjusts the this pointer
9144 by DELTA, and unless VCALL_OFFSET is zero, applies an additional adjustment
9145 stored at VCALL_OFFSET in the vtable whose address is located at offset 0
9146 relative to the resulting this pointer. */
9149 s390_output_mi_thunk (FILE *file
, tree thunk ATTRIBUTE_UNUSED
,
9150 HOST_WIDE_INT delta
, HOST_WIDE_INT vcall_offset
,
9156 /* Make sure unwind info is emitted for the thunk if needed. */
9157 final_start_function (emit_barrier (), file
, 1);
9159 /* Operand 0 is the target function. */
9160 op
[0] = XEXP (DECL_RTL (function
), 0);
9161 if (flag_pic
&& !SYMBOL_REF_LOCAL_P (op
[0]))
9164 op
[0] = gen_rtx_UNSPEC (Pmode
, gen_rtvec (1, op
[0]),
9165 TARGET_64BIT
? UNSPEC_PLT
: UNSPEC_GOT
);
9166 op
[0] = gen_rtx_CONST (Pmode
, op
[0]);
9169 /* Operand 1 is the 'this' pointer. */
9170 if (aggregate_value_p (TREE_TYPE (TREE_TYPE (function
)), function
))
9171 op
[1] = gen_rtx_REG (Pmode
, 3);
9173 op
[1] = gen_rtx_REG (Pmode
, 2);
9175 /* Operand 2 is the delta. */
9176 op
[2] = GEN_INT (delta
);
9178 /* Operand 3 is the vcall_offset. */
9179 op
[3] = GEN_INT (vcall_offset
);
9181 /* Operand 4 is the temporary register. */
9182 op
[4] = gen_rtx_REG (Pmode
, 1);
9184 /* Operands 5 to 8 can be used as labels. */
9190 /* Operand 9 can be used for temporary register. */
9193 /* Generate code. */
9196 /* Setup literal pool pointer if required. */
9197 if ((!DISP_IN_RANGE (delta
)
9198 && !CONST_OK_FOR_K (delta
)
9199 && !CONST_OK_FOR_Os (delta
))
9200 || (!DISP_IN_RANGE (vcall_offset
)
9201 && !CONST_OK_FOR_K (vcall_offset
)
9202 && !CONST_OK_FOR_Os (vcall_offset
)))
9204 op
[5] = gen_label_rtx ();
9205 output_asm_insn ("larl\t%4,%5", op
);
9208 /* Add DELTA to this pointer. */
9211 if (CONST_OK_FOR_J (delta
))
9212 output_asm_insn ("la\t%1,%2(%1)", op
);
9213 else if (DISP_IN_RANGE (delta
))
9214 output_asm_insn ("lay\t%1,%2(%1)", op
);
9215 else if (CONST_OK_FOR_K (delta
))
9216 output_asm_insn ("aghi\t%1,%2", op
);
9217 else if (CONST_OK_FOR_Os (delta
))
9218 output_asm_insn ("agfi\t%1,%2", op
);
9221 op
[6] = gen_label_rtx ();
9222 output_asm_insn ("agf\t%1,%6-%5(%4)", op
);
9226 /* Perform vcall adjustment. */
9229 if (DISP_IN_RANGE (vcall_offset
))
9231 output_asm_insn ("lg\t%4,0(%1)", op
);
9232 output_asm_insn ("ag\t%1,%3(%4)", op
);
9234 else if (CONST_OK_FOR_K (vcall_offset
))
9236 output_asm_insn ("lghi\t%4,%3", op
);
9237 output_asm_insn ("ag\t%4,0(%1)", op
);
9238 output_asm_insn ("ag\t%1,0(%4)", op
);
9240 else if (CONST_OK_FOR_Os (vcall_offset
))
9242 output_asm_insn ("lgfi\t%4,%3", op
);
9243 output_asm_insn ("ag\t%4,0(%1)", op
);
9244 output_asm_insn ("ag\t%1,0(%4)", op
);
9248 op
[7] = gen_label_rtx ();
9249 output_asm_insn ("llgf\t%4,%7-%5(%4)", op
);
9250 output_asm_insn ("ag\t%4,0(%1)", op
);
9251 output_asm_insn ("ag\t%1,0(%4)", op
);
9255 /* Jump to target. */
9256 output_asm_insn ("jg\t%0", op
);
9258 /* Output literal pool if required. */
9261 output_asm_insn (".align\t4", op
);
9262 targetm
.asm_out
.internal_label (file
, "L",
9263 CODE_LABEL_NUMBER (op
[5]));
9267 targetm
.asm_out
.internal_label (file
, "L",
9268 CODE_LABEL_NUMBER (op
[6]));
9269 output_asm_insn (".long\t%2", op
);
9273 targetm
.asm_out
.internal_label (file
, "L",
9274 CODE_LABEL_NUMBER (op
[7]));
9275 output_asm_insn (".long\t%3", op
);
9280 /* Setup base pointer if required. */
9282 || (!DISP_IN_RANGE (delta
)
9283 && !CONST_OK_FOR_K (delta
)
9284 && !CONST_OK_FOR_Os (delta
))
9285 || (!DISP_IN_RANGE (delta
)
9286 && !CONST_OK_FOR_K (vcall_offset
)
9287 && !CONST_OK_FOR_Os (vcall_offset
)))
9289 op
[5] = gen_label_rtx ();
9290 output_asm_insn ("basr\t%4,0", op
);
9291 targetm
.asm_out
.internal_label (file
, "L",
9292 CODE_LABEL_NUMBER (op
[5]));
9295 /* Add DELTA to this pointer. */
9298 if (CONST_OK_FOR_J (delta
))
9299 output_asm_insn ("la\t%1,%2(%1)", op
);
9300 else if (DISP_IN_RANGE (delta
))
9301 output_asm_insn ("lay\t%1,%2(%1)", op
);
9302 else if (CONST_OK_FOR_K (delta
))
9303 output_asm_insn ("ahi\t%1,%2", op
);
9304 else if (CONST_OK_FOR_Os (delta
))
9305 output_asm_insn ("afi\t%1,%2", op
);
9308 op
[6] = gen_label_rtx ();
9309 output_asm_insn ("a\t%1,%6-%5(%4)", op
);
9313 /* Perform vcall adjustment. */
9316 if (CONST_OK_FOR_J (vcall_offset
))
9318 output_asm_insn ("l\t%4,0(%1)", op
);
9319 output_asm_insn ("a\t%1,%3(%4)", op
);
9321 else if (DISP_IN_RANGE (vcall_offset
))
9323 output_asm_insn ("l\t%4,0(%1)", op
);
9324 output_asm_insn ("ay\t%1,%3(%4)", op
);
9326 else if (CONST_OK_FOR_K (vcall_offset
))
9328 output_asm_insn ("lhi\t%4,%3", op
);
9329 output_asm_insn ("a\t%4,0(%1)", op
);
9330 output_asm_insn ("a\t%1,0(%4)", op
);
9332 else if (CONST_OK_FOR_Os (vcall_offset
))
9334 output_asm_insn ("iilf\t%4,%3", op
);
9335 output_asm_insn ("a\t%4,0(%1)", op
);
9336 output_asm_insn ("a\t%1,0(%4)", op
);
9340 op
[7] = gen_label_rtx ();
9341 output_asm_insn ("l\t%4,%7-%5(%4)", op
);
9342 output_asm_insn ("a\t%4,0(%1)", op
);
9343 output_asm_insn ("a\t%1,0(%4)", op
);
9346 /* We had to clobber the base pointer register.
9347 Re-setup the base pointer (with a different base). */
9348 op
[5] = gen_label_rtx ();
9349 output_asm_insn ("basr\t%4,0", op
);
9350 targetm
.asm_out
.internal_label (file
, "L",
9351 CODE_LABEL_NUMBER (op
[5]));
9354 /* Jump to target. */
9355 op
[8] = gen_label_rtx ();
9358 output_asm_insn ("l\t%4,%8-%5(%4)", op
);
9360 output_asm_insn ("a\t%4,%8-%5(%4)", op
);
9361 /* We cannot call through .plt, since .plt requires %r12 loaded. */
9362 else if (flag_pic
== 1)
9364 output_asm_insn ("a\t%4,%8-%5(%4)", op
);
9365 output_asm_insn ("l\t%4,%0(%4)", op
);
9367 else if (flag_pic
== 2)
9369 op
[9] = gen_rtx_REG (Pmode
, 0);
9370 output_asm_insn ("l\t%9,%8-4-%5(%4)", op
);
9371 output_asm_insn ("a\t%4,%8-%5(%4)", op
);
9372 output_asm_insn ("ar\t%4,%9", op
);
9373 output_asm_insn ("l\t%4,0(%4)", op
);
9376 output_asm_insn ("br\t%4", op
);
9378 /* Output literal pool. */
9379 output_asm_insn (".align\t4", op
);
9381 if (nonlocal
&& flag_pic
== 2)
9382 output_asm_insn (".long\t%0", op
);
9385 op
[0] = gen_rtx_SYMBOL_REF (Pmode
, "_GLOBAL_OFFSET_TABLE_");
9386 SYMBOL_REF_FLAGS (op
[0]) = SYMBOL_FLAG_LOCAL
;
9389 targetm
.asm_out
.internal_label (file
, "L", CODE_LABEL_NUMBER (op
[8]));
9391 output_asm_insn (".long\t%0", op
);
9393 output_asm_insn (".long\t%0-%5", op
);
9397 targetm
.asm_out
.internal_label (file
, "L",
9398 CODE_LABEL_NUMBER (op
[6]));
9399 output_asm_insn (".long\t%2", op
);
9403 targetm
.asm_out
.internal_label (file
, "L",
9404 CODE_LABEL_NUMBER (op
[7]));
9405 output_asm_insn (".long\t%3", op
);
9408 final_end_function ();
9412 s390_valid_pointer_mode (enum machine_mode mode
)
9414 return (mode
== SImode
|| (TARGET_64BIT
&& mode
== DImode
));
9417 /* Checks whether the given CALL_EXPR would use a caller
9418 saved register. This is used to decide whether sibling call
9419 optimization could be performed on the respective function
9423 s390_call_saved_register_used (tree call_expr
)
9425 CUMULATIVE_ARGS cum
;
9427 enum machine_mode mode
;
9432 INIT_CUMULATIVE_ARGS (cum
, NULL
, NULL
, 0, 0);
9434 for (i
= 0; i
< call_expr_nargs (call_expr
); i
++)
9436 parameter
= CALL_EXPR_ARG (call_expr
, i
);
9437 gcc_assert (parameter
);
9439 /* For an undeclared variable passed as parameter we will get
9440 an ERROR_MARK node here. */
9441 if (TREE_CODE (parameter
) == ERROR_MARK
)
9444 type
= TREE_TYPE (parameter
);
9447 mode
= TYPE_MODE (type
);
9450 if (pass_by_reference (&cum
, mode
, type
, true))
9453 type
= build_pointer_type (type
);
9456 parm_rtx
= s390_function_arg (&cum
, mode
, type
, 0);
9458 s390_function_arg_advance (&cum
, mode
, type
, 0);
9463 if (REG_P (parm_rtx
))
9466 reg
< HARD_REGNO_NREGS (REGNO (parm_rtx
), GET_MODE (parm_rtx
));
9468 if (!call_used_regs
[reg
+ REGNO (parm_rtx
)])
9472 if (GET_CODE (parm_rtx
) == PARALLEL
)
9476 for (i
= 0; i
< XVECLEN (parm_rtx
, 0); i
++)
9478 rtx r
= XEXP (XVECEXP (parm_rtx
, 0, i
), 0);
9480 gcc_assert (REG_P (r
));
9483 reg
< HARD_REGNO_NREGS (REGNO (r
), GET_MODE (r
));
9485 if (!call_used_regs
[reg
+ REGNO (r
)])
9494 /* Return true if the given call expression can be
9495 turned into a sibling call.
9496 DECL holds the declaration of the function to be called whereas
9497 EXP is the call expression itself. */
9500 s390_function_ok_for_sibcall (tree decl
, tree exp
)
9502 /* The TPF epilogue uses register 1. */
9503 if (TARGET_TPF_PROFILING
)
9506 /* The 31 bit PLT code uses register 12 (GOT pointer - caller saved)
9507 which would have to be restored before the sibcall. */
9508 if (!TARGET_64BIT
&& flag_pic
&& decl
&& !targetm
.binds_local_p (decl
))
9511 /* Register 6 on s390 is available as an argument register but unfortunately
9512 "caller saved". This makes functions needing this register for arguments
9513 not suitable for sibcalls. */
9514 return !s390_call_saved_register_used (exp
);
9517 /* Return the fixed registers used for condition codes. */
9520 s390_fixed_condition_code_regs (unsigned int *p1
, unsigned int *p2
)
9523 *p2
= INVALID_REGNUM
;
9528 /* This function is used by the call expanders of the machine description.
9529 It emits the call insn itself together with the necessary operations
9530 to adjust the target address and returns the emitted insn.
9531 ADDR_LOCATION is the target address rtx
9532 TLS_CALL the location of the thread-local symbol
9533 RESULT_REG the register where the result of the call should be stored
9534 RETADDR_REG the register where the return address should be stored
9535 If this parameter is NULL_RTX the call is considered
9536 to be a sibling call. */
9539 s390_emit_call (rtx addr_location
, rtx tls_call
, rtx result_reg
,
9542 bool plt_call
= false;
9548 /* Direct function calls need special treatment. */
9549 if (GET_CODE (addr_location
) == SYMBOL_REF
)
9551 /* When calling a global routine in PIC mode, we must
9552 replace the symbol itself with the PLT stub. */
9553 if (flag_pic
&& !SYMBOL_REF_LOCAL_P (addr_location
))
9555 if (retaddr_reg
!= NULL_RTX
)
9557 addr_location
= gen_rtx_UNSPEC (Pmode
,
9558 gen_rtvec (1, addr_location
),
9560 addr_location
= gen_rtx_CONST (Pmode
, addr_location
);
9564 /* For -fpic code the PLT entries might use r12 which is
9565 call-saved. Therefore we cannot do a sibcall when
9566 calling directly using a symbol ref. When reaching
9567 this point we decided (in s390_function_ok_for_sibcall)
9568 to do a sibcall for a function pointer but one of the
9569 optimizers was able to get rid of the function pointer
9570 by propagating the symbol ref into the call. This
9571 optimization is illegal for S/390 so we turn the direct
9572 call into a indirect call again. */
9573 addr_location
= force_reg (Pmode
, addr_location
);
9576 /* Unless we can use the bras(l) insn, force the
9577 routine address into a register. */
9578 if (!TARGET_SMALL_EXEC
&& !TARGET_CPU_ZARCH
)
9581 addr_location
= legitimize_pic_address (addr_location
, 0);
9583 addr_location
= force_reg (Pmode
, addr_location
);
9587 /* If it is already an indirect call or the code above moved the
9588 SYMBOL_REF to somewhere else make sure the address can be found in
9590 if (retaddr_reg
== NULL_RTX
9591 && GET_CODE (addr_location
) != SYMBOL_REF
9594 emit_move_insn (gen_rtx_REG (Pmode
, SIBCALL_REGNUM
), addr_location
);
9595 addr_location
= gen_rtx_REG (Pmode
, SIBCALL_REGNUM
);
9598 addr_location
= gen_rtx_MEM (QImode
, addr_location
);
9599 call
= gen_rtx_CALL (VOIDmode
, addr_location
, const0_rtx
);
9601 if (result_reg
!= NULL_RTX
)
9602 call
= gen_rtx_SET (VOIDmode
, result_reg
, call
);
9604 if (retaddr_reg
!= NULL_RTX
)
9606 clobber
= gen_rtx_CLOBBER (VOIDmode
, retaddr_reg
);
9608 if (tls_call
!= NULL_RTX
)
9609 vec
= gen_rtvec (3, call
, clobber
,
9610 gen_rtx_USE (VOIDmode
, tls_call
));
9612 vec
= gen_rtvec (2, call
, clobber
);
9614 call
= gen_rtx_PARALLEL (VOIDmode
, vec
);
9617 insn
= emit_call_insn (call
);
9619 /* 31-bit PLT stubs and tls calls use the GOT register implicitly. */
9620 if ((!TARGET_64BIT
&& plt_call
) || tls_call
!= NULL_RTX
)
9622 /* s390_function_ok_for_sibcall should
9623 have denied sibcalls in this case. */
9624 gcc_assert (retaddr_reg
!= NULL_RTX
);
9626 use_reg (&CALL_INSN_FUNCTION_USAGE (insn
), pic_offset_table_rtx
);
9631 /* Implement CONDITIONAL_REGISTER_USAGE. */
9634 s390_conditional_register_usage (void)
9640 fixed_regs
[PIC_OFFSET_TABLE_REGNUM
] = 1;
9641 call_used_regs
[PIC_OFFSET_TABLE_REGNUM
] = 1;
9643 if (TARGET_CPU_ZARCH
)
9645 fixed_regs
[BASE_REGNUM
] = 0;
9646 call_used_regs
[BASE_REGNUM
] = 0;
9647 fixed_regs
[RETURN_REGNUM
] = 0;
9648 call_used_regs
[RETURN_REGNUM
] = 0;
9652 for (i
= 24; i
< 32; i
++)
9653 call_used_regs
[i
] = call_really_used_regs
[i
] = 0;
9657 for (i
= 18; i
< 20; i
++)
9658 call_used_regs
[i
] = call_really_used_regs
[i
] = 0;
9661 if (TARGET_SOFT_FLOAT
)
9663 for (i
= 16; i
< 32; i
++)
9664 call_used_regs
[i
] = fixed_regs
[i
] = 1;
9668 /* Corresponding function to eh_return expander. */
9670 static GTY(()) rtx s390_tpf_eh_return_symbol
;
9672 s390_emit_tpf_eh_return (rtx target
)
9676 if (!s390_tpf_eh_return_symbol
)
9677 s390_tpf_eh_return_symbol
= gen_rtx_SYMBOL_REF (Pmode
, "__tpf_eh_return");
9679 reg
= gen_rtx_REG (Pmode
, 2);
9681 emit_move_insn (reg
, target
);
9682 insn
= s390_emit_call (s390_tpf_eh_return_symbol
, NULL_RTX
, reg
,
9683 gen_rtx_REG (Pmode
, RETURN_REGNUM
));
9684 use_reg (&CALL_INSN_FUNCTION_USAGE (insn
), reg
);
9686 emit_move_insn (EH_RETURN_HANDLER_RTX
, reg
);
9689 /* Rework the prologue/epilogue to avoid saving/restoring
9690 registers unnecessarily. */
9693 s390_optimize_prologue (void)
9695 rtx insn
, new_insn
, next_insn
;
9697 /* Do a final recompute of the frame-related data. */
9699 s390_update_frame_layout ();
9701 /* If all special registers are in fact used, there's nothing we
9702 can do, so no point in walking the insn list. */
9704 if (cfun_frame_layout
.first_save_gpr
<= BASE_REGNUM
9705 && cfun_frame_layout
.last_save_gpr
>= BASE_REGNUM
9706 && (TARGET_CPU_ZARCH
9707 || (cfun_frame_layout
.first_save_gpr
<= RETURN_REGNUM
9708 && cfun_frame_layout
.last_save_gpr
>= RETURN_REGNUM
)))
9711 /* Search for prologue/epilogue insns and replace them. */
9713 for (insn
= get_insns (); insn
; insn
= next_insn
)
9715 int first
, last
, off
;
9716 rtx set
, base
, offset
;
9718 next_insn
= NEXT_INSN (insn
);
9720 if (GET_CODE (insn
) != INSN
)
9723 if (GET_CODE (PATTERN (insn
)) == PARALLEL
9724 && store_multiple_operation (PATTERN (insn
), VOIDmode
))
9726 set
= XVECEXP (PATTERN (insn
), 0, 0);
9727 first
= REGNO (SET_SRC (set
));
9728 last
= first
+ XVECLEN (PATTERN (insn
), 0) - 1;
9729 offset
= const0_rtx
;
9730 base
= eliminate_constant_term (XEXP (SET_DEST (set
), 0), &offset
);
9731 off
= INTVAL (offset
);
9733 if (GET_CODE (base
) != REG
|| off
< 0)
9735 if (cfun_frame_layout
.first_save_gpr
!= -1
9736 && (cfun_frame_layout
.first_save_gpr
< first
9737 || cfun_frame_layout
.last_save_gpr
> last
))
9739 if (REGNO (base
) != STACK_POINTER_REGNUM
9740 && REGNO (base
) != HARD_FRAME_POINTER_REGNUM
)
9742 if (first
> BASE_REGNUM
|| last
< BASE_REGNUM
)
9745 if (cfun_frame_layout
.first_save_gpr
!= -1)
9747 new_insn
= save_gprs (base
,
9748 off
+ (cfun_frame_layout
.first_save_gpr
9749 - first
) * UNITS_PER_LONG
,
9750 cfun_frame_layout
.first_save_gpr
,
9751 cfun_frame_layout
.last_save_gpr
);
9752 new_insn
= emit_insn_before (new_insn
, insn
);
9753 INSN_ADDRESSES_NEW (new_insn
, -1);
9760 if (cfun_frame_layout
.first_save_gpr
== -1
9761 && GET_CODE (PATTERN (insn
)) == SET
9762 && GET_CODE (SET_SRC (PATTERN (insn
))) == REG
9763 && (REGNO (SET_SRC (PATTERN (insn
))) == BASE_REGNUM
9764 || (!TARGET_CPU_ZARCH
9765 && REGNO (SET_SRC (PATTERN (insn
))) == RETURN_REGNUM
))
9766 && GET_CODE (SET_DEST (PATTERN (insn
))) == MEM
)
9768 set
= PATTERN (insn
);
9769 first
= REGNO (SET_SRC (set
));
9770 offset
= const0_rtx
;
9771 base
= eliminate_constant_term (XEXP (SET_DEST (set
), 0), &offset
);
9772 off
= INTVAL (offset
);
9774 if (GET_CODE (base
) != REG
|| off
< 0)
9776 if (REGNO (base
) != STACK_POINTER_REGNUM
9777 && REGNO (base
) != HARD_FRAME_POINTER_REGNUM
)
9784 if (GET_CODE (PATTERN (insn
)) == PARALLEL
9785 && load_multiple_operation (PATTERN (insn
), VOIDmode
))
9787 set
= XVECEXP (PATTERN (insn
), 0, 0);
9788 first
= REGNO (SET_DEST (set
));
9789 last
= first
+ XVECLEN (PATTERN (insn
), 0) - 1;
9790 offset
= const0_rtx
;
9791 base
= eliminate_constant_term (XEXP (SET_SRC (set
), 0), &offset
);
9792 off
= INTVAL (offset
);
9794 if (GET_CODE (base
) != REG
|| off
< 0)
9796 if (cfun_frame_layout
.first_restore_gpr
!= -1
9797 && (cfun_frame_layout
.first_restore_gpr
< first
9798 || cfun_frame_layout
.last_restore_gpr
> last
))
9800 if (REGNO (base
) != STACK_POINTER_REGNUM
9801 && REGNO (base
) != HARD_FRAME_POINTER_REGNUM
)
9803 if (first
> BASE_REGNUM
|| last
< BASE_REGNUM
)
9806 if (cfun_frame_layout
.first_restore_gpr
!= -1)
9808 new_insn
= restore_gprs (base
,
9809 off
+ (cfun_frame_layout
.first_restore_gpr
9810 - first
) * UNITS_PER_LONG
,
9811 cfun_frame_layout
.first_restore_gpr
,
9812 cfun_frame_layout
.last_restore_gpr
);
9813 new_insn
= emit_insn_before (new_insn
, insn
);
9814 INSN_ADDRESSES_NEW (new_insn
, -1);
9821 if (cfun_frame_layout
.first_restore_gpr
== -1
9822 && GET_CODE (PATTERN (insn
)) == SET
9823 && GET_CODE (SET_DEST (PATTERN (insn
))) == REG
9824 && (REGNO (SET_DEST (PATTERN (insn
))) == BASE_REGNUM
9825 || (!TARGET_CPU_ZARCH
9826 && REGNO (SET_DEST (PATTERN (insn
))) == RETURN_REGNUM
))
9827 && GET_CODE (SET_SRC (PATTERN (insn
))) == MEM
)
9829 set
= PATTERN (insn
);
9830 first
= REGNO (SET_DEST (set
));
9831 offset
= const0_rtx
;
9832 base
= eliminate_constant_term (XEXP (SET_SRC (set
), 0), &offset
);
9833 off
= INTVAL (offset
);
9835 if (GET_CODE (base
) != REG
|| off
< 0)
9837 if (REGNO (base
) != STACK_POINTER_REGNUM
9838 && REGNO (base
) != HARD_FRAME_POINTER_REGNUM
)
9847 /* On z10 the dynamic branch prediction must see the backward jump in
9848 a window of 384 bytes. If not it falls back to the static
9849 prediction. This function rearranges the loop backward branch in a
9850 way which makes the static prediction always correct. The function
9851 returns true if it added an instruction. */
9853 s390_z10_fix_long_loop_prediction (rtx insn
)
9855 rtx set
= single_set (insn
);
9856 rtx code_label
, label_ref
, new_label
;
9862 /* This will exclude branch on count and branch on index patterns
9863 since these are correctly statically predicted. */
9865 || SET_DEST (set
) != pc_rtx
9866 || GET_CODE (SET_SRC(set
)) != IF_THEN_ELSE
)
9869 label_ref
= (GET_CODE (XEXP (SET_SRC (set
), 1)) == LABEL_REF
?
9870 XEXP (SET_SRC (set
), 1) : XEXP (SET_SRC (set
), 2));
9872 gcc_assert (GET_CODE (label_ref
) == LABEL_REF
);
9874 code_label
= XEXP (label_ref
, 0);
9876 if (INSN_ADDRESSES (INSN_UID (code_label
)) == -1
9877 || INSN_ADDRESSES (INSN_UID (insn
)) == -1
9878 || (INSN_ADDRESSES (INSN_UID (insn
))
9879 - INSN_ADDRESSES (INSN_UID (code_label
)) < Z10_PREDICT_DISTANCE
))
9882 for (distance
= 0, cur_insn
= PREV_INSN (insn
);
9883 distance
< Z10_PREDICT_DISTANCE
- 6;
9884 distance
+= get_attr_length (cur_insn
), cur_insn
= PREV_INSN (cur_insn
))
9885 if (!cur_insn
|| JUMP_P (cur_insn
) || LABEL_P (cur_insn
))
9888 new_label
= gen_label_rtx ();
9889 uncond_jump
= emit_jump_insn_after (
9890 gen_rtx_SET (VOIDmode
, pc_rtx
,
9891 gen_rtx_LABEL_REF (VOIDmode
, code_label
)),
9893 emit_label_after (new_label
, uncond_jump
);
9895 tmp
= XEXP (SET_SRC (set
), 1);
9896 XEXP (SET_SRC (set
), 1) = XEXP (SET_SRC (set
), 2);
9897 XEXP (SET_SRC (set
), 2) = tmp
;
9898 INSN_CODE (insn
) = -1;
9900 XEXP (label_ref
, 0) = new_label
;
9901 JUMP_LABEL (insn
) = new_label
;
9902 JUMP_LABEL (uncond_jump
) = code_label
;
9907 /* Returns 1 if INSN reads the value of REG for purposes not related
9908 to addressing of memory, and 0 otherwise. */
9910 s390_non_addr_reg_read_p (rtx reg
, rtx insn
)
9912 return reg_referenced_p (reg
, PATTERN (insn
))
9913 && !reg_used_in_mem_p (REGNO (reg
), PATTERN (insn
));
9916 /* Starting from INSN find_cond_jump looks downwards in the insn
9917 stream for a single jump insn which is the last user of the
9918 condition code set in INSN. */
9920 find_cond_jump (rtx insn
)
9922 for (; insn
; insn
= NEXT_INSN (insn
))
9931 if (reg_mentioned_p (gen_rtx_REG (CCmode
, CC_REGNUM
), insn
))
9936 /* This will be triggered by a return. */
9937 if (GET_CODE (PATTERN (insn
)) != SET
)
9940 gcc_assert (SET_DEST (PATTERN (insn
)) == pc_rtx
);
9941 ite
= SET_SRC (PATTERN (insn
));
9943 if (GET_CODE (ite
) != IF_THEN_ELSE
)
9946 cc
= XEXP (XEXP (ite
, 0), 0);
9947 if (!REG_P (cc
) || !CC_REGNO_P (REGNO (cc
)))
9950 if (find_reg_note (insn
, REG_DEAD
, cc
))
9958 /* Swap the condition in COND and the operands in OP0 and OP1 so that
9959 the semantics does not change. If NULL_RTX is passed as COND the
9960 function tries to find the conditional jump starting with INSN. */
9962 s390_swap_cmp (rtx cond
, rtx
*op0
, rtx
*op1
, rtx insn
)
9966 if (cond
== NULL_RTX
)
9968 rtx jump
= find_cond_jump (NEXT_INSN (insn
));
9969 jump
= jump
? single_set (jump
) : NULL_RTX
;
9971 if (jump
== NULL_RTX
)
9974 cond
= XEXP (XEXP (jump
, 1), 0);
9979 PUT_CODE (cond
, swap_condition (GET_CODE (cond
)));
9982 /* On z10, instructions of the compare-and-branch family have the
9983 property to access the register occurring as second operand with
9984 its bits complemented. If such a compare is grouped with a second
9985 instruction that accesses the same register non-complemented, and
9986 if that register's value is delivered via a bypass, then the
9987 pipeline recycles, thereby causing significant performance decline.
9988 This function locates such situations and exchanges the two
9989 operands of the compare. The function return true whenever it
9992 s390_z10_optimize_cmp (rtx insn
)
9994 rtx prev_insn
, next_insn
;
9995 bool insn_added_p
= false;
9996 rtx cond
, *op0
, *op1
;
9998 if (GET_CODE (PATTERN (insn
)) == PARALLEL
)
10000 /* Handle compare and branch and branch on count
10002 rtx pattern
= single_set (insn
);
10005 || SET_DEST (pattern
) != pc_rtx
10006 || GET_CODE (SET_SRC (pattern
)) != IF_THEN_ELSE
)
10009 cond
= XEXP (SET_SRC (pattern
), 0);
10010 op0
= &XEXP (cond
, 0);
10011 op1
= &XEXP (cond
, 1);
10013 else if (GET_CODE (PATTERN (insn
)) == SET
)
10017 /* Handle normal compare instructions. */
10018 src
= SET_SRC (PATTERN (insn
));
10019 dest
= SET_DEST (PATTERN (insn
));
10022 || !CC_REGNO_P (REGNO (dest
))
10023 || GET_CODE (src
) != COMPARE
)
10026 /* s390_swap_cmp will try to find the conditional
10027 jump when passing NULL_RTX as condition. */
10029 op0
= &XEXP (src
, 0);
10030 op1
= &XEXP (src
, 1);
10035 if (!REG_P (*op0
) || !REG_P (*op1
))
10038 if (GET_MODE_CLASS (GET_MODE (*op0
)) != MODE_INT
)
10041 /* Swap the COMPARE arguments and its mask if there is a
10042 conflicting access in the previous insn. */
10043 prev_insn
= prev_active_insn (insn
);
10044 if (prev_insn
!= NULL_RTX
&& INSN_P (prev_insn
)
10045 && reg_referenced_p (*op1
, PATTERN (prev_insn
)))
10046 s390_swap_cmp (cond
, op0
, op1
, insn
);
10048 /* Check if there is a conflict with the next insn. If there
10049 was no conflict with the previous insn, then swap the
10050 COMPARE arguments and its mask. If we already swapped
10051 the operands, or if swapping them would cause a conflict
10052 with the previous insn, issue a NOP after the COMPARE in
10053 order to separate the two instuctions. */
10054 next_insn
= next_active_insn (insn
);
10055 if (next_insn
!= NULL_RTX
&& INSN_P (next_insn
)
10056 && s390_non_addr_reg_read_p (*op1
, next_insn
))
10058 if (prev_insn
!= NULL_RTX
&& INSN_P (prev_insn
)
10059 && s390_non_addr_reg_read_p (*op0
, prev_insn
))
10061 if (REGNO (*op1
) == 0)
10062 emit_insn_after (gen_nop1 (), insn
);
10064 emit_insn_after (gen_nop (), insn
);
10065 insn_added_p
= true;
10068 s390_swap_cmp (cond
, op0
, op1
, insn
);
10070 return insn_added_p
;
10073 /* Perform machine-dependent processing. */
10078 bool pool_overflow
= false;
10080 /* Make sure all splits have been performed; splits after
10081 machine_dependent_reorg might confuse insn length counts. */
10082 split_all_insns_noflow ();
10084 /* Install the main literal pool and the associated base
10085 register load insns.
10087 In addition, there are two problematic situations we need
10090 - the literal pool might be > 4096 bytes in size, so that
10091 some of its elements cannot be directly accessed
10093 - a branch target might be > 64K away from the branch, so that
10094 it is not possible to use a PC-relative instruction.
10096 To fix those, we split the single literal pool into multiple
10097 pool chunks, reloading the pool base register at various
10098 points throughout the function to ensure it always points to
10099 the pool chunk the following code expects, and / or replace
10100 PC-relative branches by absolute branches.
10102 However, the two problems are interdependent: splitting the
10103 literal pool can move a branch further away from its target,
10104 causing the 64K limit to overflow, and on the other hand,
10105 replacing a PC-relative branch by an absolute branch means
10106 we need to put the branch target address into the literal
10107 pool, possibly causing it to overflow.
10109 So, we loop trying to fix up both problems until we manage
10110 to satisfy both conditions at the same time. Note that the
10111 loop is guaranteed to terminate as every pass of the loop
10112 strictly decreases the total number of PC-relative branches
10113 in the function. (This is not completely true as there
10114 might be branch-over-pool insns introduced by chunkify_start.
10115 Those never need to be split however.) */
10119 struct constant_pool
*pool
= NULL
;
10121 /* Collect the literal pool. */
10122 if (!pool_overflow
)
10124 pool
= s390_mainpool_start ();
10126 pool_overflow
= true;
10129 /* If literal pool overflowed, start to chunkify it. */
10131 pool
= s390_chunkify_start ();
10133 /* Split out-of-range branches. If this has created new
10134 literal pool entries, cancel current chunk list and
10135 recompute it. zSeries machines have large branch
10136 instructions, so we never need to split a branch. */
10137 if (!TARGET_CPU_ZARCH
&& s390_split_branches ())
10140 s390_chunkify_cancel (pool
);
10142 s390_mainpool_cancel (pool
);
10147 /* If we made it up to here, both conditions are satisfied.
10148 Finish up literal pool related changes. */
10150 s390_chunkify_finish (pool
);
10152 s390_mainpool_finish (pool
);
10154 /* We're done splitting branches. */
10155 cfun
->machine
->split_branches_pending_p
= false;
10159 /* Generate out-of-pool execute target insns. */
10160 if (TARGET_CPU_ZARCH
)
10162 rtx insn
, label
, target
;
10164 for (insn
= get_insns (); insn
; insn
= NEXT_INSN (insn
))
10166 label
= s390_execute_label (insn
);
10170 gcc_assert (label
!= const0_rtx
);
10172 target
= emit_label (XEXP (label
, 0));
10173 INSN_ADDRESSES_NEW (target
, -1);
10175 target
= emit_insn (s390_execute_target (insn
));
10176 INSN_ADDRESSES_NEW (target
, -1);
10180 /* Try to optimize prologue and epilogue further. */
10181 s390_optimize_prologue ();
10183 /* Walk over the insns and do some z10 specific changes. */
10184 if (s390_tune
== PROCESSOR_2097_Z10
)
10187 bool insn_added_p
= false;
10189 /* The insn lengths and addresses have to be up to date for the
10190 following manipulations. */
10191 shorten_branches (get_insns ());
10193 for (insn
= get_insns (); insn
; insn
= NEXT_INSN (insn
))
10195 if (!INSN_P (insn
) || INSN_CODE (insn
) <= 0)
10199 insn_added_p
|= s390_z10_fix_long_loop_prediction (insn
);
10201 if (GET_CODE (PATTERN (insn
)) == PARALLEL
10202 || GET_CODE (PATTERN (insn
)) == SET
)
10203 insn_added_p
|= s390_z10_optimize_cmp (insn
);
10206 /* Adjust branches if we added new instructions. */
10208 shorten_branches (get_insns ());
10212 /* Return true if INSN is a fp load insn writing register REGNO. */
10214 s390_fpload_toreg (rtx insn
, unsigned int regno
)
10217 enum attr_type flag
= s390_safe_attr_type (insn
);
10219 if (flag
!= TYPE_FLOADSF
&& flag
!= TYPE_FLOADDF
)
10222 set
= single_set (insn
);
10224 if (set
== NULL_RTX
)
10227 if (!REG_P (SET_DEST (set
)) || !MEM_P (SET_SRC (set
)))
10230 if (REGNO (SET_DEST (set
)) != regno
)
10236 /* This value describes the distance to be avoided between an
10237 aritmetic fp instruction and an fp load writing the same register.
10238 Z10_EARLYLOAD_DISTANCE - 1 as well as Z10_EARLYLOAD_DISTANCE + 1 is
10239 fine but the exact value has to be avoided. Otherwise the FP
10240 pipeline will throw an exception causing a major penalty. */
10241 #define Z10_EARLYLOAD_DISTANCE 7
10243 /* Rearrange the ready list in order to avoid the situation described
10244 for Z10_EARLYLOAD_DISTANCE. A problematic load instruction is
10245 moved to the very end of the ready list. */
10247 s390_z10_prevent_earlyload_conflicts (rtx
*ready
, int *nready_p
)
10249 unsigned int regno
;
10250 int nready
= *nready_p
;
10255 enum attr_type flag
;
10258 /* Skip DISTANCE - 1 active insns. */
10259 for (insn
= last_scheduled_insn
, distance
= Z10_EARLYLOAD_DISTANCE
- 1;
10260 distance
> 0 && insn
!= NULL_RTX
;
10261 distance
--, insn
= prev_active_insn (insn
))
10262 if (CALL_P (insn
) || JUMP_P (insn
))
10265 if (insn
== NULL_RTX
)
10268 set
= single_set (insn
);
10270 if (set
== NULL_RTX
|| !REG_P (SET_DEST (set
))
10271 || GET_MODE_CLASS (GET_MODE (SET_DEST (set
))) != MODE_FLOAT
)
10274 flag
= s390_safe_attr_type (insn
);
10276 if (flag
== TYPE_FLOADSF
|| flag
== TYPE_FLOADDF
)
10279 regno
= REGNO (SET_DEST (set
));
10282 while (!s390_fpload_toreg (ready
[i
], regno
) && i
> 0)
10289 memmove (&ready
[1], &ready
[0], sizeof (rtx
) * i
);
10293 /* This function is called via hook TARGET_SCHED_REORDER before
10294 issueing one insn from list READY which contains *NREADYP entries.
10295 For target z10 it reorders load instructions to avoid early load
10296 conflicts in the floating point pipeline */
10298 s390_sched_reorder (FILE *file ATTRIBUTE_UNUSED
, int verbose ATTRIBUTE_UNUSED
,
10299 rtx
*ready
, int *nreadyp
, int clock ATTRIBUTE_UNUSED
)
10301 if (s390_tune
== PROCESSOR_2097_Z10
)
10302 if (reload_completed
&& *nreadyp
> 1)
10303 s390_z10_prevent_earlyload_conflicts (ready
, nreadyp
);
10305 return s390_issue_rate ();
10308 /* This function is called via hook TARGET_SCHED_VARIABLE_ISSUE after
10309 the scheduler has issued INSN. It stores the last issued insn into
10310 last_scheduled_insn in order to make it available for
10311 s390_sched_reorder. */
10313 s390_sched_variable_issue (FILE *file ATTRIBUTE_UNUSED
,
10314 int verbose ATTRIBUTE_UNUSED
,
10315 rtx insn
, int more
)
10317 last_scheduled_insn
= insn
;
10319 if (GET_CODE (PATTERN (insn
)) != USE
10320 && GET_CODE (PATTERN (insn
)) != CLOBBER
)
10327 s390_sched_init (FILE *file ATTRIBUTE_UNUSED
,
10328 int verbose ATTRIBUTE_UNUSED
,
10329 int max_ready ATTRIBUTE_UNUSED
)
10331 last_scheduled_insn
= NULL_RTX
;
10334 /* This function checks the whole of insn X for memory references. The
10335 function always returns zero because the framework it is called
10336 from would stop recursively analyzing the insn upon a return value
10337 other than zero. The real result of this function is updating
10338 counter variable MEM_COUNT. */
10340 check_dpu (rtx
*x
, unsigned *mem_count
)
10342 if (*x
!= NULL_RTX
&& MEM_P (*x
))
10347 /* This target hook implementation for TARGET_LOOP_UNROLL_ADJUST calculates
10348 a new number struct loop *loop should be unrolled if tuned for the z10
10349 cpu. The loop is analyzed for memory accesses by calling check_dpu for
10350 each rtx of the loop. Depending on the loop_depth and the amount of
10351 memory accesses a new number <=nunroll is returned to improve the
10352 behaviour of the hardware prefetch unit. */
10354 s390_loop_unroll_adjust (unsigned nunroll
, struct loop
*loop
)
10359 unsigned mem_count
= 0;
10361 /* Only z10 needs special handling. */
10362 if (s390_tune
!= PROCESSOR_2097_Z10
)
10365 /* Count the number of memory references within the loop body. */
10366 bbs
= get_loop_body (loop
);
10367 for (i
= 0; i
< loop
->num_nodes
; i
++)
10369 for (insn
= BB_HEAD (bbs
[i
]); insn
!= BB_END (bbs
[i
]); insn
= NEXT_INSN (insn
))
10370 if (INSN_P (insn
) && INSN_CODE (insn
) != -1)
10371 for_each_rtx (&insn
, (rtx_function
) check_dpu
, &mem_count
);
10375 /* Prevent division by zero, and we do not need to adjust nunroll in this case. */
10376 if (mem_count
== 0)
10379 switch (loop_depth(loop
))
10382 return MIN (nunroll
, 28 / mem_count
);
10384 return MIN (nunroll
, 22 / mem_count
);
10386 return MIN (nunroll
, 16 / mem_count
);
10390 /* Initialize GCC target structure. */
10392 #undef TARGET_ASM_ALIGNED_HI_OP
10393 #define TARGET_ASM_ALIGNED_HI_OP "\t.word\t"
10394 #undef TARGET_ASM_ALIGNED_DI_OP
10395 #define TARGET_ASM_ALIGNED_DI_OP "\t.quad\t"
10396 #undef TARGET_ASM_INTEGER
10397 #define TARGET_ASM_INTEGER s390_assemble_integer
10399 #undef TARGET_ASM_OPEN_PAREN
10400 #define TARGET_ASM_OPEN_PAREN ""
10402 #undef TARGET_ASM_CLOSE_PAREN
10403 #define TARGET_ASM_CLOSE_PAREN ""
10405 #undef TARGET_DEFAULT_TARGET_FLAGS
10406 #define TARGET_DEFAULT_TARGET_FLAGS (TARGET_DEFAULT | MASK_FUSED_MADD)
10408 #undef TARGET_HANDLE_OPTION
10409 #define TARGET_HANDLE_OPTION s390_handle_option
10411 #undef TARGET_ENCODE_SECTION_INFO
10412 #define TARGET_ENCODE_SECTION_INFO s390_encode_section_info
10414 #undef TARGET_SCALAR_MODE_SUPPORTED_P
10415 #define TARGET_SCALAR_MODE_SUPPORTED_P s390_scalar_mode_supported_p
10418 #undef TARGET_HAVE_TLS
10419 #define TARGET_HAVE_TLS true
10421 #undef TARGET_CANNOT_FORCE_CONST_MEM
10422 #define TARGET_CANNOT_FORCE_CONST_MEM s390_cannot_force_const_mem
10424 #undef TARGET_DELEGITIMIZE_ADDRESS
10425 #define TARGET_DELEGITIMIZE_ADDRESS s390_delegitimize_address
10427 #undef TARGET_LEGITIMIZE_ADDRESS
10428 #define TARGET_LEGITIMIZE_ADDRESS s390_legitimize_address
10430 #undef TARGET_RETURN_IN_MEMORY
10431 #define TARGET_RETURN_IN_MEMORY s390_return_in_memory
10433 #undef TARGET_INIT_BUILTINS
10434 #define TARGET_INIT_BUILTINS s390_init_builtins
10435 #undef TARGET_EXPAND_BUILTIN
10436 #define TARGET_EXPAND_BUILTIN s390_expand_builtin
10438 #undef TARGET_ASM_OUTPUT_MI_THUNK
10439 #define TARGET_ASM_OUTPUT_MI_THUNK s390_output_mi_thunk
10440 #undef TARGET_ASM_CAN_OUTPUT_MI_THUNK
10441 #define TARGET_ASM_CAN_OUTPUT_MI_THUNK hook_bool_const_tree_hwi_hwi_const_tree_true
10443 #undef TARGET_SCHED_ADJUST_PRIORITY
10444 #define TARGET_SCHED_ADJUST_PRIORITY s390_adjust_priority
10445 #undef TARGET_SCHED_ISSUE_RATE
10446 #define TARGET_SCHED_ISSUE_RATE s390_issue_rate
10447 #undef TARGET_SCHED_FIRST_CYCLE_MULTIPASS_DFA_LOOKAHEAD
10448 #define TARGET_SCHED_FIRST_CYCLE_MULTIPASS_DFA_LOOKAHEAD s390_first_cycle_multipass_dfa_lookahead
10450 #undef TARGET_SCHED_VARIABLE_ISSUE
10451 #define TARGET_SCHED_VARIABLE_ISSUE s390_sched_variable_issue
10452 #undef TARGET_SCHED_REORDER
10453 #define TARGET_SCHED_REORDER s390_sched_reorder
10454 #undef TARGET_SCHED_INIT
10455 #define TARGET_SCHED_INIT s390_sched_init
10457 #undef TARGET_CANNOT_COPY_INSN_P
10458 #define TARGET_CANNOT_COPY_INSN_P s390_cannot_copy_insn_p
10459 #undef TARGET_RTX_COSTS
10460 #define TARGET_RTX_COSTS s390_rtx_costs
10461 #undef TARGET_ADDRESS_COST
10462 #define TARGET_ADDRESS_COST s390_address_cost
10464 #undef TARGET_MACHINE_DEPENDENT_REORG
10465 #define TARGET_MACHINE_DEPENDENT_REORG s390_reorg
10467 #undef TARGET_VALID_POINTER_MODE
10468 #define TARGET_VALID_POINTER_MODE s390_valid_pointer_mode
10470 #undef TARGET_BUILD_BUILTIN_VA_LIST
10471 #define TARGET_BUILD_BUILTIN_VA_LIST s390_build_builtin_va_list
10472 #undef TARGET_EXPAND_BUILTIN_VA_START
10473 #define TARGET_EXPAND_BUILTIN_VA_START s390_va_start
10474 #undef TARGET_GIMPLIFY_VA_ARG_EXPR
10475 #define TARGET_GIMPLIFY_VA_ARG_EXPR s390_gimplify_va_arg
10477 #undef TARGET_PROMOTE_FUNCTION_MODE
10478 #define TARGET_PROMOTE_FUNCTION_MODE s390_promote_function_mode
10479 #undef TARGET_PASS_BY_REFERENCE
10480 #define TARGET_PASS_BY_REFERENCE s390_pass_by_reference
10482 #undef TARGET_FUNCTION_OK_FOR_SIBCALL
10483 #define TARGET_FUNCTION_OK_FOR_SIBCALL s390_function_ok_for_sibcall
10485 #undef TARGET_FIXED_CONDITION_CODE_REGS
10486 #define TARGET_FIXED_CONDITION_CODE_REGS s390_fixed_condition_code_regs
10488 #undef TARGET_CC_MODES_COMPATIBLE
10489 #define TARGET_CC_MODES_COMPATIBLE s390_cc_modes_compatible
10491 #undef TARGET_INVALID_WITHIN_DOLOOP
10492 #define TARGET_INVALID_WITHIN_DOLOOP hook_constcharptr_const_rtx_null
10495 #undef TARGET_ASM_OUTPUT_DWARF_DTPREL
10496 #define TARGET_ASM_OUTPUT_DWARF_DTPREL s390_output_dwarf_dtprel
10499 #ifdef TARGET_ALTERNATE_LONG_DOUBLE_MANGLING
10500 #undef TARGET_MANGLE_TYPE
10501 #define TARGET_MANGLE_TYPE s390_mangle_type
10504 #undef TARGET_SCALAR_MODE_SUPPORTED_P
10505 #define TARGET_SCALAR_MODE_SUPPORTED_P s390_scalar_mode_supported_p
10507 #undef TARGET_SECONDARY_RELOAD
10508 #define TARGET_SECONDARY_RELOAD s390_secondary_reload
10510 #undef TARGET_LIBGCC_CMP_RETURN_MODE
10511 #define TARGET_LIBGCC_CMP_RETURN_MODE s390_libgcc_cmp_return_mode
10513 #undef TARGET_LIBGCC_SHIFT_COUNT_MODE
10514 #define TARGET_LIBGCC_SHIFT_COUNT_MODE s390_libgcc_shift_count_mode
10516 #undef TARGET_LEGITIMATE_ADDRESS_P
10517 #define TARGET_LEGITIMATE_ADDRESS_P s390_legitimate_address_p
10519 #undef TARGET_CAN_ELIMINATE
10520 #define TARGET_CAN_ELIMINATE s390_can_eliminate
10522 #undef TARGET_LOOP_UNROLL_ADJUST
10523 #define TARGET_LOOP_UNROLL_ADJUST s390_loop_unroll_adjust
10525 #undef TARGET_ASM_TRAMPOLINE_TEMPLATE
10526 #define TARGET_ASM_TRAMPOLINE_TEMPLATE s390_asm_trampoline_template
10527 #undef TARGET_TRAMPOLINE_INIT
10528 #define TARGET_TRAMPOLINE_INIT s390_trampoline_init
10530 #undef TARGET_UNWIND_WORD_MODE
10531 #define TARGET_UNWIND_WORD_MODE s390_unwind_word_mode
10533 struct gcc_target targetm
= TARGET_INITIALIZER
;
10535 #include "gt-s390.h"