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 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"
34 #include "insn-config.h"
35 #include "conditions.h"
37 #include "insn-attr.h"
45 #include "basic-block.h"
46 #include "integrate.h"
49 #include "target-def.h"
51 #include "langhooks.h"
53 #include "tree-gimple.h"
57 /* Define the specific costs for a given cpu. */
59 struct processor_costs
62 const int m
; /* cost of an M instruction. */
63 const int mghi
; /* cost of an MGHI instruction. */
64 const int mh
; /* cost of an MH instruction. */
65 const int mhi
; /* cost of an MHI instruction. */
66 const int ml
; /* cost of an ML instruction. */
67 const int mr
; /* cost of an MR instruction. */
68 const int ms
; /* cost of an MS instruction. */
69 const int msg
; /* cost of an MSG instruction. */
70 const int msgf
; /* cost of an MSGF instruction. */
71 const int msgfr
; /* cost of an MSGFR instruction. */
72 const int msgr
; /* cost of an MSGR instruction. */
73 const int msr
; /* cost of an MSR instruction. */
74 const int mult_df
; /* cost of multiplication in DFmode. */
77 const int sqxbr
; /* cost of square root in TFmode. */
78 const int sqdbr
; /* cost of square root in DFmode. */
79 const int sqebr
; /* cost of square root in SFmode. */
80 /* multiply and add */
81 const int madbr
; /* cost of multiply and add in DFmode. */
82 const int maebr
; /* cost of multiply and add in SFmode. */
94 const struct processor_costs
*s390_cost
;
97 struct processor_costs z900_cost
=
99 COSTS_N_INSNS (5), /* M */
100 COSTS_N_INSNS (10), /* MGHI */
101 COSTS_N_INSNS (5), /* MH */
102 COSTS_N_INSNS (4), /* MHI */
103 COSTS_N_INSNS (5), /* ML */
104 COSTS_N_INSNS (5), /* MR */
105 COSTS_N_INSNS (4), /* MS */
106 COSTS_N_INSNS (15), /* MSG */
107 COSTS_N_INSNS (7), /* MSGF */
108 COSTS_N_INSNS (7), /* MSGFR */
109 COSTS_N_INSNS (10), /* MSGR */
110 COSTS_N_INSNS (4), /* MSR */
111 COSTS_N_INSNS (7), /* multiplication in DFmode */
112 COSTS_N_INSNS (13), /* MXBR */
113 COSTS_N_INSNS (136), /* SQXBR */
114 COSTS_N_INSNS (44), /* SQDBR */
115 COSTS_N_INSNS (35), /* SQEBR */
116 COSTS_N_INSNS (18), /* MADBR */
117 COSTS_N_INSNS (13), /* MAEBR */
118 COSTS_N_INSNS (134), /* DXBR */
119 COSTS_N_INSNS (30), /* DDBR */
120 COSTS_N_INSNS (27), /* DEBR */
121 COSTS_N_INSNS (220), /* DLGR */
122 COSTS_N_INSNS (34), /* DLR */
123 COSTS_N_INSNS (34), /* DR */
124 COSTS_N_INSNS (32), /* DSGFR */
125 COSTS_N_INSNS (32), /* DSGR */
129 struct processor_costs z990_cost
=
131 COSTS_N_INSNS (4), /* M */
132 COSTS_N_INSNS (2), /* MGHI */
133 COSTS_N_INSNS (2), /* MH */
134 COSTS_N_INSNS (2), /* MHI */
135 COSTS_N_INSNS (4), /* ML */
136 COSTS_N_INSNS (4), /* MR */
137 COSTS_N_INSNS (5), /* MS */
138 COSTS_N_INSNS (6), /* MSG */
139 COSTS_N_INSNS (4), /* MSGF */
140 COSTS_N_INSNS (4), /* MSGFR */
141 COSTS_N_INSNS (4), /* MSGR */
142 COSTS_N_INSNS (4), /* MSR */
143 COSTS_N_INSNS (1), /* multiplication in DFmode */
144 COSTS_N_INSNS (28), /* MXBR */
145 COSTS_N_INSNS (130), /* SQXBR */
146 COSTS_N_INSNS (66), /* SQDBR */
147 COSTS_N_INSNS (38), /* SQEBR */
148 COSTS_N_INSNS (1), /* MADBR */
149 COSTS_N_INSNS (1), /* MAEBR */
150 COSTS_N_INSNS (60), /* DXBR */
151 COSTS_N_INSNS (40), /* DDBR */
152 COSTS_N_INSNS (26), /* DEBR */
153 COSTS_N_INSNS (176), /* DLGR */
154 COSTS_N_INSNS (31), /* DLR */
155 COSTS_N_INSNS (31), /* DR */
156 COSTS_N_INSNS (31), /* DSGFR */
157 COSTS_N_INSNS (31), /* DSGR */
161 struct processor_costs z9_109_cost
=
163 COSTS_N_INSNS (4), /* M */
164 COSTS_N_INSNS (2), /* MGHI */
165 COSTS_N_INSNS (2), /* MH */
166 COSTS_N_INSNS (2), /* MHI */
167 COSTS_N_INSNS (4), /* ML */
168 COSTS_N_INSNS (4), /* MR */
169 COSTS_N_INSNS (5), /* MS */
170 COSTS_N_INSNS (6), /* MSG */
171 COSTS_N_INSNS (4), /* MSGF */
172 COSTS_N_INSNS (4), /* MSGFR */
173 COSTS_N_INSNS (4), /* MSGR */
174 COSTS_N_INSNS (4), /* MSR */
175 COSTS_N_INSNS (1), /* multiplication in DFmode */
176 COSTS_N_INSNS (28), /* MXBR */
177 COSTS_N_INSNS (130), /* SQXBR */
178 COSTS_N_INSNS (66), /* SQDBR */
179 COSTS_N_INSNS (38), /* SQEBR */
180 COSTS_N_INSNS (1), /* MADBR */
181 COSTS_N_INSNS (1), /* MAEBR */
182 COSTS_N_INSNS (60), /* DXBR */
183 COSTS_N_INSNS (40), /* DDBR */
184 COSTS_N_INSNS (26), /* DEBR */
185 COSTS_N_INSNS (30), /* DLGR */
186 COSTS_N_INSNS (23), /* DLR */
187 COSTS_N_INSNS (23), /* DR */
188 COSTS_N_INSNS (24), /* DSGFR */
189 COSTS_N_INSNS (24), /* DSGR */
193 struct processor_costs z10_cost
=
195 COSTS_N_INSNS (4), /* M */
196 COSTS_N_INSNS (2), /* MGHI */
197 COSTS_N_INSNS (2), /* MH */
198 COSTS_N_INSNS (2), /* MHI */
199 COSTS_N_INSNS (4), /* ML */
200 COSTS_N_INSNS (4), /* MR */
201 COSTS_N_INSNS (5), /* MS */
202 COSTS_N_INSNS (6), /* MSG */
203 COSTS_N_INSNS (4), /* MSGF */
204 COSTS_N_INSNS (4), /* MSGFR */
205 COSTS_N_INSNS (4), /* MSGR */
206 COSTS_N_INSNS (4), /* MSR */
207 COSTS_N_INSNS (1), /* multiplication in DFmode */
208 COSTS_N_INSNS (28), /* MXBR */
209 COSTS_N_INSNS (130), /* SQXBR */
210 COSTS_N_INSNS (66), /* SQDBR */
211 COSTS_N_INSNS (38), /* SQEBR */
212 COSTS_N_INSNS (1), /* MADBR */
213 COSTS_N_INSNS (1), /* MAEBR */
214 COSTS_N_INSNS (60), /* DXBR */
215 COSTS_N_INSNS (40), /* DDBR */
216 COSTS_N_INSNS (26), /* DEBR */
217 COSTS_N_INSNS (30), /* DLGR */
218 COSTS_N_INSNS (23), /* DLR */
219 COSTS_N_INSNS (23), /* DR */
220 COSTS_N_INSNS (24), /* DSGFR */
221 COSTS_N_INSNS (24), /* DSGR */
224 extern int reload_completed
;
226 /* Save information from a "cmpxx" operation until the branch or scc is
228 rtx s390_compare_op0
, s390_compare_op1
;
230 /* Save the result of a compare_and_swap until the branch or scc is
232 rtx s390_compare_emitted
= NULL_RTX
;
234 /* Structure used to hold the components of a S/390 memory
235 address. A legitimate address on S/390 is of the general
237 base + index + displacement
238 where any of the components is optional.
240 base and index are registers of the class ADDR_REGS,
241 displacement is an unsigned 12-bit immediate constant. */
252 /* Which cpu are we tuning for. */
253 enum processor_type s390_tune
= PROCESSOR_max
;
254 enum processor_flags s390_tune_flags
;
255 /* Which instruction set architecture to use. */
256 enum processor_type s390_arch
;
257 enum processor_flags s390_arch_flags
;
259 HOST_WIDE_INT s390_warn_framesize
= 0;
260 HOST_WIDE_INT s390_stack_size
= 0;
261 HOST_WIDE_INT s390_stack_guard
= 0;
263 /* The following structure is embedded in the machine
264 specific part of struct function. */
266 struct s390_frame_layout
GTY (())
268 /* Offset within stack frame. */
269 HOST_WIDE_INT gprs_offset
;
270 HOST_WIDE_INT f0_offset
;
271 HOST_WIDE_INT f4_offset
;
272 HOST_WIDE_INT f8_offset
;
273 HOST_WIDE_INT backchain_offset
;
275 /* Number of first and last gpr where slots in the register
276 save area are reserved for. */
277 int first_save_gpr_slot
;
278 int last_save_gpr_slot
;
280 /* Number of first and last gpr to be saved, restored. */
282 int first_restore_gpr
;
284 int last_restore_gpr
;
286 /* Bits standing for floating point registers. Set, if the
287 respective register has to be saved. Starting with reg 16 (f0)
288 at the rightmost bit.
289 Bit 15 - 8 7 6 5 4 3 2 1 0
290 fpr 15 - 8 7 5 3 1 6 4 2 0
291 reg 31 - 24 23 22 21 20 19 18 17 16 */
292 unsigned int fpr_bitmap
;
294 /* Number of floating point registers f8-f15 which must be saved. */
297 /* Set if return address needs to be saved.
298 This flag is set by s390_return_addr_rtx if it could not use
299 the initial value of r14 and therefore depends on r14 saved
301 bool save_return_addr_p
;
303 /* Size of stack frame. */
304 HOST_WIDE_INT frame_size
;
307 /* Define the structure for the machine field in struct function. */
309 struct machine_function
GTY(())
311 struct s390_frame_layout frame_layout
;
313 /* Literal pool base register. */
316 /* True if we may need to perform branch splitting. */
317 bool split_branches_pending_p
;
319 /* True during final stage of literal pool processing. */
320 bool decomposed_literal_pool_addresses_ok_p
;
322 /* Some local-dynamic TLS symbol name. */
323 const char *some_ld_name
;
325 bool has_landing_pad_p
;
328 /* Few accessor macros for struct cfun->machine->s390_frame_layout. */
330 #define cfun_frame_layout (cfun->machine->frame_layout)
331 #define cfun_save_high_fprs_p (!!cfun_frame_layout.high_fprs)
332 #define cfun_gprs_save_area_size ((cfun_frame_layout.last_save_gpr_slot - \
333 cfun_frame_layout.first_save_gpr_slot + 1) * UNITS_PER_WORD)
334 #define cfun_set_fpr_bit(BITNUM) (cfun->machine->frame_layout.fpr_bitmap |= \
336 #define cfun_fpr_bit_p(BITNUM) (!!(cfun->machine->frame_layout.fpr_bitmap & \
339 /* Number of GPRs and FPRs used for argument passing. */
340 #define GP_ARG_NUM_REG 5
341 #define FP_ARG_NUM_REG (TARGET_64BIT? 4 : 2)
343 /* A couple of shortcuts. */
344 #define CONST_OK_FOR_J(x) \
345 CONST_OK_FOR_CONSTRAINT_P((x), 'J', "J")
346 #define CONST_OK_FOR_K(x) \
347 CONST_OK_FOR_CONSTRAINT_P((x), 'K', "K")
348 #define CONST_OK_FOR_Os(x) \
349 CONST_OK_FOR_CONSTRAINT_P((x), 'O', "Os")
350 #define CONST_OK_FOR_Op(x) \
351 CONST_OK_FOR_CONSTRAINT_P((x), 'O', "Op")
352 #define CONST_OK_FOR_On(x) \
353 CONST_OK_FOR_CONSTRAINT_P((x), 'O', "On")
355 #define REGNO_PAIR_OK(REGNO, MODE) \
356 (HARD_REGNO_NREGS ((REGNO), (MODE)) == 1 || !((REGNO) & 1))
358 static enum machine_mode
359 s390_libgcc_cmp_return_mode (void)
361 return TARGET_64BIT
? DImode
: SImode
;
364 static enum machine_mode
365 s390_libgcc_shift_count_mode (void)
367 return TARGET_64BIT
? DImode
: SImode
;
370 /* Return true if the back end supports mode MODE. */
372 s390_scalar_mode_supported_p (enum machine_mode mode
)
374 if (DECIMAL_FLOAT_MODE_P (mode
))
377 return default_scalar_mode_supported_p (mode
);
380 /* Set the has_landing_pad_p flag in struct machine_function to VALUE. */
383 s390_set_has_landing_pad_p (bool value
)
385 cfun
->machine
->has_landing_pad_p
= value
;
388 /* If two condition code modes are compatible, return a condition code
389 mode which is compatible with both. Otherwise, return
392 static enum machine_mode
393 s390_cc_modes_compatible (enum machine_mode m1
, enum machine_mode m2
)
401 if (m2
== CCUmode
|| m2
== CCTmode
|| m2
== CCZ1mode
402 || m2
== CCSmode
|| m2
== CCSRmode
|| m2
== CCURmode
)
423 /* Return true if SET either doesn't set the CC register, or else
424 the source and destination have matching CC modes and that
425 CC mode is at least as constrained as REQ_MODE. */
428 s390_match_ccmode_set (rtx set
, enum machine_mode req_mode
)
430 enum machine_mode set_mode
;
432 gcc_assert (GET_CODE (set
) == SET
);
434 if (GET_CODE (SET_DEST (set
)) != REG
|| !CC_REGNO_P (REGNO (SET_DEST (set
))))
437 set_mode
= GET_MODE (SET_DEST (set
));
451 if (req_mode
!= set_mode
)
456 if (req_mode
!= CCSmode
&& req_mode
!= CCUmode
&& req_mode
!= CCTmode
457 && req_mode
!= CCSRmode
&& req_mode
!= CCURmode
)
463 if (req_mode
!= CCAmode
)
471 return (GET_MODE (SET_SRC (set
)) == set_mode
);
474 /* Return true if every SET in INSN that sets the CC register
475 has source and destination with matching CC modes and that
476 CC mode is at least as constrained as REQ_MODE.
477 If REQ_MODE is VOIDmode, always return false. */
480 s390_match_ccmode (rtx insn
, enum machine_mode req_mode
)
484 /* s390_tm_ccmode returns VOIDmode to indicate failure. */
485 if (req_mode
== VOIDmode
)
488 if (GET_CODE (PATTERN (insn
)) == SET
)
489 return s390_match_ccmode_set (PATTERN (insn
), req_mode
);
491 if (GET_CODE (PATTERN (insn
)) == PARALLEL
)
492 for (i
= 0; i
< XVECLEN (PATTERN (insn
), 0); i
++)
494 rtx set
= XVECEXP (PATTERN (insn
), 0, i
);
495 if (GET_CODE (set
) == SET
)
496 if (!s390_match_ccmode_set (set
, req_mode
))
503 /* If a test-under-mask instruction can be used to implement
504 (compare (and ... OP1) OP2), return the CC mode required
505 to do that. Otherwise, return VOIDmode.
506 MIXED is true if the instruction can distinguish between
507 CC1 and CC2 for mixed selected bits (TMxx), it is false
508 if the instruction cannot (TM). */
511 s390_tm_ccmode (rtx op1
, rtx op2
, bool mixed
)
515 /* ??? Fixme: should work on CONST_DOUBLE as well. */
516 if (GET_CODE (op1
) != CONST_INT
|| GET_CODE (op2
) != CONST_INT
)
519 /* Selected bits all zero: CC0.
520 e.g.: int a; if ((a & (16 + 128)) == 0) */
521 if (INTVAL (op2
) == 0)
524 /* Selected bits all one: CC3.
525 e.g.: int a; if ((a & (16 + 128)) == 16 + 128) */
526 if (INTVAL (op2
) == INTVAL (op1
))
529 /* Exactly two bits selected, mixed zeroes and ones: CC1 or CC2. e.g.:
531 if ((a & (16 + 128)) == 16) -> CCT1
532 if ((a & (16 + 128)) == 128) -> CCT2 */
535 bit1
= exact_log2 (INTVAL (op2
));
536 bit0
= exact_log2 (INTVAL (op1
) ^ INTVAL (op2
));
537 if (bit0
!= -1 && bit1
!= -1)
538 return bit0
> bit1
? CCT1mode
: CCT2mode
;
544 /* Given a comparison code OP (EQ, NE, etc.) and the operands
545 OP0 and OP1 of a COMPARE, return the mode to be used for the
549 s390_select_ccmode (enum rtx_code code
, rtx op0
, rtx op1
)
555 if ((GET_CODE (op0
) == NEG
|| GET_CODE (op0
) == ABS
)
556 && GET_MODE_CLASS (GET_MODE (op0
)) == MODE_INT
)
558 if (GET_CODE (op0
) == PLUS
&& GET_CODE (XEXP (op0
, 1)) == CONST_INT
559 && CONST_OK_FOR_K (INTVAL (XEXP (op0
, 1))))
561 if ((GET_CODE (op0
) == PLUS
|| GET_CODE (op0
) == MINUS
562 || GET_CODE (op1
) == NEG
)
563 && GET_MODE_CLASS (GET_MODE (op0
)) == MODE_INT
)
566 if (GET_CODE (op0
) == AND
)
568 /* Check whether we can potentially do it via TM. */
569 enum machine_mode ccmode
;
570 ccmode
= s390_tm_ccmode (XEXP (op0
, 1), op1
, 1);
571 if (ccmode
!= VOIDmode
)
573 /* Relax CCTmode to CCZmode to allow fall-back to AND
574 if that turns out to be beneficial. */
575 return ccmode
== CCTmode
? CCZmode
: ccmode
;
579 if (register_operand (op0
, HImode
)
580 && GET_CODE (op1
) == CONST_INT
581 && (INTVAL (op1
) == -1 || INTVAL (op1
) == 65535))
583 if (register_operand (op0
, QImode
)
584 && GET_CODE (op1
) == CONST_INT
585 && (INTVAL (op1
) == -1 || INTVAL (op1
) == 255))
594 /* The only overflow condition of NEG and ABS happens when
595 -INT_MAX is used as parameter, which stays negative. So
596 we have an overflow from a positive value to a negative.
597 Using CCAP mode the resulting cc can be used for comparisons. */
598 if ((GET_CODE (op0
) == NEG
|| GET_CODE (op0
) == ABS
)
599 && GET_MODE_CLASS (GET_MODE (op0
)) == MODE_INT
)
602 /* If constants are involved in an add instruction it is possible to use
603 the resulting cc for comparisons with zero. Knowing the sign of the
604 constant the overflow behavior gets predictable. e.g.:
605 int a, b; if ((b = a + c) > 0)
606 with c as a constant value: c < 0 -> CCAN and c >= 0 -> CCAP */
607 if (GET_CODE (op0
) == PLUS
&& GET_CODE (XEXP (op0
, 1)) == CONST_INT
608 && CONST_OK_FOR_K (INTVAL (XEXP (op0
, 1))))
610 if (INTVAL (XEXP((op0
), 1)) < 0)
624 if ((GET_CODE (op0
) == SIGN_EXTEND
|| GET_CODE (op0
) == ZERO_EXTEND
)
625 && GET_CODE (op1
) != CONST_INT
)
631 if (GET_CODE (op0
) == PLUS
632 && GET_MODE_CLASS (GET_MODE (op0
)) == MODE_INT
)
635 if ((GET_CODE (op0
) == SIGN_EXTEND
|| GET_CODE (op0
) == ZERO_EXTEND
)
636 && GET_CODE (op1
) != CONST_INT
)
642 if (GET_CODE (op0
) == MINUS
643 && GET_MODE_CLASS (GET_MODE (op0
)) == MODE_INT
)
646 if ((GET_CODE (op0
) == SIGN_EXTEND
|| GET_CODE (op0
) == ZERO_EXTEND
)
647 && GET_CODE (op1
) != CONST_INT
)
656 /* Replace the comparison OP0 CODE OP1 by a semantically equivalent one
657 that we can implement more efficiently. */
660 s390_canonicalize_comparison (enum rtx_code
*code
, rtx
*op0
, rtx
*op1
)
662 /* Convert ZERO_EXTRACT back to AND to enable TM patterns. */
663 if ((*code
== EQ
|| *code
== NE
)
664 && *op1
== const0_rtx
665 && GET_CODE (*op0
) == ZERO_EXTRACT
666 && GET_CODE (XEXP (*op0
, 1)) == CONST_INT
667 && GET_CODE (XEXP (*op0
, 2)) == CONST_INT
668 && SCALAR_INT_MODE_P (GET_MODE (XEXP (*op0
, 0))))
670 rtx inner
= XEXP (*op0
, 0);
671 HOST_WIDE_INT modesize
= GET_MODE_BITSIZE (GET_MODE (inner
));
672 HOST_WIDE_INT len
= INTVAL (XEXP (*op0
, 1));
673 HOST_WIDE_INT pos
= INTVAL (XEXP (*op0
, 2));
675 if (len
> 0 && len
< modesize
676 && pos
>= 0 && pos
+ len
<= modesize
677 && modesize
<= HOST_BITS_PER_WIDE_INT
)
679 unsigned HOST_WIDE_INT block
;
680 block
= ((unsigned HOST_WIDE_INT
) 1 << len
) - 1;
681 block
<<= modesize
- pos
- len
;
683 *op0
= gen_rtx_AND (GET_MODE (inner
), inner
,
684 gen_int_mode (block
, GET_MODE (inner
)));
688 /* Narrow AND of memory against immediate to enable TM. */
689 if ((*code
== EQ
|| *code
== NE
)
690 && *op1
== const0_rtx
691 && GET_CODE (*op0
) == AND
692 && GET_CODE (XEXP (*op0
, 1)) == CONST_INT
693 && SCALAR_INT_MODE_P (GET_MODE (XEXP (*op0
, 0))))
695 rtx inner
= XEXP (*op0
, 0);
696 rtx mask
= XEXP (*op0
, 1);
698 /* Ignore paradoxical SUBREGs if all extra bits are masked out. */
699 if (GET_CODE (inner
) == SUBREG
700 && SCALAR_INT_MODE_P (GET_MODE (SUBREG_REG (inner
)))
701 && (GET_MODE_SIZE (GET_MODE (inner
))
702 >= GET_MODE_SIZE (GET_MODE (SUBREG_REG (inner
))))
704 & GET_MODE_MASK (GET_MODE (inner
))
705 & ~GET_MODE_MASK (GET_MODE (SUBREG_REG (inner
))))
707 inner
= SUBREG_REG (inner
);
709 /* Do not change volatile MEMs. */
710 if (MEM_P (inner
) && !MEM_VOLATILE_P (inner
))
712 int part
= s390_single_part (XEXP (*op0
, 1),
713 GET_MODE (inner
), QImode
, 0);
716 mask
= gen_int_mode (s390_extract_part (mask
, QImode
, 0), QImode
);
717 inner
= adjust_address_nv (inner
, QImode
, part
);
718 *op0
= gen_rtx_AND (QImode
, inner
, mask
);
723 /* Narrow comparisons against 0xffff to HImode if possible. */
724 if ((*code
== EQ
|| *code
== NE
)
725 && GET_CODE (*op1
) == CONST_INT
726 && INTVAL (*op1
) == 0xffff
727 && SCALAR_INT_MODE_P (GET_MODE (*op0
))
728 && (nonzero_bits (*op0
, GET_MODE (*op0
))
729 & ~(unsigned HOST_WIDE_INT
) 0xffff) == 0)
731 *op0
= gen_lowpart (HImode
, *op0
);
735 /* Remove redundant UNSPEC_CCU_TO_INT conversions if possible. */
736 if (GET_CODE (*op0
) == UNSPEC
737 && XINT (*op0
, 1) == UNSPEC_CCU_TO_INT
738 && XVECLEN (*op0
, 0) == 1
739 && GET_MODE (XVECEXP (*op0
, 0, 0)) == CCUmode
740 && GET_CODE (XVECEXP (*op0
, 0, 0)) == REG
741 && REGNO (XVECEXP (*op0
, 0, 0)) == CC_REGNUM
742 && *op1
== const0_rtx
)
744 enum rtx_code new_code
= UNKNOWN
;
747 case EQ
: new_code
= EQ
; break;
748 case NE
: new_code
= NE
; break;
749 case LT
: new_code
= GTU
; break;
750 case GT
: new_code
= LTU
; break;
751 case LE
: new_code
= GEU
; break;
752 case GE
: new_code
= LEU
; break;
756 if (new_code
!= UNKNOWN
)
758 *op0
= XVECEXP (*op0
, 0, 0);
763 /* Remove redundant UNSPEC_CCZ_TO_INT conversions if possible. */
764 if (GET_CODE (*op0
) == UNSPEC
765 && XINT (*op0
, 1) == UNSPEC_CCZ_TO_INT
766 && XVECLEN (*op0
, 0) == 1
767 && GET_MODE (XVECEXP (*op0
, 0, 0)) == CCZmode
768 && GET_CODE (XVECEXP (*op0
, 0, 0)) == REG
769 && REGNO (XVECEXP (*op0
, 0, 0)) == CC_REGNUM
770 && *op1
== const0_rtx
)
772 enum rtx_code new_code
= UNKNOWN
;
775 case EQ
: new_code
= EQ
; break;
776 case NE
: new_code
= NE
; break;
780 if (new_code
!= UNKNOWN
)
782 *op0
= XVECEXP (*op0
, 0, 0);
787 /* Simplify cascaded EQ, NE with const0_rtx. */
788 if ((*code
== NE
|| *code
== EQ
)
789 && (GET_CODE (*op0
) == EQ
|| GET_CODE (*op0
) == NE
)
790 && GET_MODE (*op0
) == SImode
791 && GET_MODE (XEXP (*op0
, 0)) == CCZ1mode
792 && REG_P (XEXP (*op0
, 0))
793 && XEXP (*op0
, 1) == const0_rtx
794 && *op1
== const0_rtx
)
796 if ((*code
== EQ
&& GET_CODE (*op0
) == NE
)
797 || (*code
== NE
&& GET_CODE (*op0
) == EQ
))
801 *op0
= XEXP (*op0
, 0);
804 /* Prefer register over memory as first operand. */
805 if (MEM_P (*op0
) && REG_P (*op1
))
807 rtx tem
= *op0
; *op0
= *op1
; *op1
= tem
;
808 *code
= swap_condition (*code
);
812 /* Emit a compare instruction suitable to implement the comparison
813 OP0 CODE OP1. Return the correct condition RTL to be placed in
814 the IF_THEN_ELSE of the conditional branch testing the result. */
817 s390_emit_compare (enum rtx_code code
, rtx op0
, rtx op1
)
819 enum machine_mode mode
= s390_select_ccmode (code
, op0
, op1
);
822 /* Do not output a redundant compare instruction if a compare_and_swap
823 pattern already computed the result and the machine modes are compatible. */
824 if (s390_compare_emitted
825 && (s390_cc_modes_compatible (GET_MODE (s390_compare_emitted
), mode
)
826 == GET_MODE (s390_compare_emitted
)))
827 ret
= gen_rtx_fmt_ee (code
, VOIDmode
, s390_compare_emitted
, const0_rtx
);
830 rtx cc
= gen_rtx_REG (mode
, CC_REGNUM
);
832 emit_insn (gen_rtx_SET (VOIDmode
, cc
, gen_rtx_COMPARE (mode
, op0
, op1
)));
833 ret
= gen_rtx_fmt_ee (code
, VOIDmode
, cc
, const0_rtx
);
835 s390_compare_emitted
= NULL_RTX
;
839 /* Emit a SImode compare and swap instruction setting MEM to NEW if OLD
841 Return the correct condition RTL to be placed in the IF_THEN_ELSE of the
842 conditional branch testing the result. */
845 s390_emit_compare_and_swap (enum rtx_code code
, rtx old
, rtx mem
, rtx cmp
, rtx
new)
849 emit_insn (gen_sync_compare_and_swap_ccsi (old
, mem
, cmp
, new));
850 ret
= gen_rtx_fmt_ee (code
, VOIDmode
, s390_compare_emitted
, const0_rtx
);
852 s390_compare_emitted
= NULL_RTX
;
857 /* Emit a jump instruction to TARGET. If COND is NULL_RTX, emit an
858 unconditional jump, else a conditional jump under condition COND. */
861 s390_emit_jump (rtx target
, rtx cond
)
865 target
= gen_rtx_LABEL_REF (VOIDmode
, target
);
867 target
= gen_rtx_IF_THEN_ELSE (VOIDmode
, cond
, target
, pc_rtx
);
869 insn
= gen_rtx_SET (VOIDmode
, pc_rtx
, target
);
870 emit_jump_insn (insn
);
873 /* Return branch condition mask to implement a branch
874 specified by CODE. Return -1 for invalid comparisons. */
877 s390_branch_condition_mask (rtx code
)
879 const int CC0
= 1 << 3;
880 const int CC1
= 1 << 2;
881 const int CC2
= 1 << 1;
882 const int CC3
= 1 << 0;
884 gcc_assert (GET_CODE (XEXP (code
, 0)) == REG
);
885 gcc_assert (REGNO (XEXP (code
, 0)) == CC_REGNUM
);
886 gcc_assert (XEXP (code
, 1) == const0_rtx
);
888 switch (GET_MODE (XEXP (code
, 0)))
892 switch (GET_CODE (code
))
895 case NE
: return CC1
| CC2
| CC3
;
901 switch (GET_CODE (code
))
904 case NE
: return CC0
| CC2
| CC3
;
910 switch (GET_CODE (code
))
913 case NE
: return CC0
| CC1
| CC3
;
919 switch (GET_CODE (code
))
922 case NE
: return CC0
| CC1
| CC2
;
928 switch (GET_CODE (code
))
930 case EQ
: return CC0
| CC2
;
931 case NE
: return CC1
| CC3
;
937 switch (GET_CODE (code
))
939 case LTU
: return CC2
| CC3
; /* carry */
940 case GEU
: return CC0
| CC1
; /* no carry */
946 switch (GET_CODE (code
))
948 case GTU
: return CC0
| CC1
; /* borrow */
949 case LEU
: return CC2
| CC3
; /* no borrow */
955 switch (GET_CODE (code
))
957 case EQ
: return CC0
| CC2
;
958 case NE
: return CC1
| CC3
;
959 case LTU
: return CC1
;
960 case GTU
: return CC3
;
961 case LEU
: return CC1
| CC2
;
962 case GEU
: return CC2
| CC3
;
967 switch (GET_CODE (code
))
970 case NE
: return CC1
| CC2
| CC3
;
971 case LTU
: return CC1
;
972 case GTU
: return CC2
;
973 case LEU
: return CC0
| CC1
;
974 case GEU
: return CC0
| CC2
;
980 switch (GET_CODE (code
))
983 case NE
: return CC2
| CC1
| CC3
;
984 case LTU
: return CC2
;
985 case GTU
: return CC1
;
986 case LEU
: return CC0
| CC2
;
987 case GEU
: return CC0
| CC1
;
993 switch (GET_CODE (code
))
996 case NE
: return CC1
| CC2
| CC3
;
997 case LT
: return CC1
| CC3
;
999 case LE
: return CC0
| CC1
| CC3
;
1000 case GE
: return CC0
| CC2
;
1006 switch (GET_CODE (code
))
1008 case EQ
: return CC0
;
1009 case NE
: return CC1
| CC2
| CC3
;
1010 case LT
: return CC1
;
1011 case GT
: return CC2
| CC3
;
1012 case LE
: return CC0
| CC1
;
1013 case GE
: return CC0
| CC2
| CC3
;
1019 switch (GET_CODE (code
))
1021 case EQ
: return CC0
;
1022 case NE
: return CC1
| CC2
| CC3
;
1023 case LT
: return CC1
;
1024 case GT
: return CC2
;
1025 case LE
: return CC0
| CC1
;
1026 case GE
: return CC0
| CC2
;
1027 case UNORDERED
: return CC3
;
1028 case ORDERED
: return CC0
| CC1
| CC2
;
1029 case UNEQ
: return CC0
| CC3
;
1030 case UNLT
: return CC1
| CC3
;
1031 case UNGT
: return CC2
| CC3
;
1032 case UNLE
: return CC0
| CC1
| CC3
;
1033 case UNGE
: return CC0
| CC2
| CC3
;
1034 case LTGT
: return CC1
| CC2
;
1040 switch (GET_CODE (code
))
1042 case EQ
: return CC0
;
1043 case NE
: return CC2
| CC1
| CC3
;
1044 case LT
: return CC2
;
1045 case GT
: return CC1
;
1046 case LE
: return CC0
| CC2
;
1047 case GE
: return CC0
| CC1
;
1048 case UNORDERED
: return CC3
;
1049 case ORDERED
: return CC0
| CC2
| CC1
;
1050 case UNEQ
: return CC0
| CC3
;
1051 case UNLT
: return CC2
| CC3
;
1052 case UNGT
: return CC1
| CC3
;
1053 case UNLE
: return CC0
| CC2
| CC3
;
1054 case UNGE
: return CC0
| CC1
| CC3
;
1055 case LTGT
: return CC2
| CC1
;
1066 /* Return branch condition mask to implement a compare and branch
1067 specified by CODE. Return -1 for invalid comparisons. */
1070 s390_compare_and_branch_condition_mask (rtx code
)
1072 const int CC0
= 1 << 3;
1073 const int CC1
= 1 << 2;
1074 const int CC2
= 1 << 1;
1076 switch (GET_CODE (code
))
1100 /* If INV is false, return assembler mnemonic string to implement
1101 a branch specified by CODE. If INV is true, return mnemonic
1102 for the corresponding inverted branch. */
1105 s390_branch_condition_mnemonic (rtx code
, int inv
)
1109 static const char *const mnemonic
[16] =
1111 NULL
, "o", "h", "nle",
1112 "l", "nhe", "lh", "ne",
1113 "e", "nlh", "he", "nl",
1114 "le", "nh", "no", NULL
1117 if (GET_CODE (XEXP (code
, 0)) == REG
1118 && REGNO (XEXP (code
, 0)) == CC_REGNUM
1119 && XEXP (code
, 1) == const0_rtx
)
1120 mask
= s390_branch_condition_mask (code
);
1122 mask
= s390_compare_and_branch_condition_mask (code
);
1124 gcc_assert (mask
>= 0);
1129 gcc_assert (mask
>= 1 && mask
<= 14);
1131 return mnemonic
[mask
];
1134 /* Return the part of op which has a value different from def.
1135 The size of the part is determined by mode.
1136 Use this function only if you already know that op really
1137 contains such a part. */
1139 unsigned HOST_WIDE_INT
1140 s390_extract_part (rtx op
, enum machine_mode mode
, int def
)
1142 unsigned HOST_WIDE_INT value
= 0;
1143 int max_parts
= HOST_BITS_PER_WIDE_INT
/ GET_MODE_BITSIZE (mode
);
1144 int part_bits
= GET_MODE_BITSIZE (mode
);
1145 unsigned HOST_WIDE_INT part_mask
1146 = ((unsigned HOST_WIDE_INT
)1 << part_bits
) - 1;
1149 for (i
= 0; i
< max_parts
; i
++)
1152 value
= (unsigned HOST_WIDE_INT
) INTVAL (op
);
1154 value
>>= part_bits
;
1156 if ((value
& part_mask
) != (def
& part_mask
))
1157 return value
& part_mask
;
1163 /* If OP is an integer constant of mode MODE with exactly one
1164 part of mode PART_MODE unequal to DEF, return the number of that
1165 part. Otherwise, return -1. */
1168 s390_single_part (rtx op
,
1169 enum machine_mode mode
,
1170 enum machine_mode part_mode
,
1173 unsigned HOST_WIDE_INT value
= 0;
1174 int n_parts
= GET_MODE_SIZE (mode
) / GET_MODE_SIZE (part_mode
);
1175 unsigned HOST_WIDE_INT part_mask
1176 = ((unsigned HOST_WIDE_INT
)1 << GET_MODE_BITSIZE (part_mode
)) - 1;
1179 if (GET_CODE (op
) != CONST_INT
)
1182 for (i
= 0; i
< n_parts
; i
++)
1185 value
= (unsigned HOST_WIDE_INT
) INTVAL (op
);
1187 value
>>= GET_MODE_BITSIZE (part_mode
);
1189 if ((value
& part_mask
) != (def
& part_mask
))
1197 return part
== -1 ? -1 : n_parts
- 1 - part
;
1200 /* Return true if IN contains a contiguous bitfield in the lower SIZE
1201 bits and no other bits are set in IN. POS and LENGTH can be used
1202 to obtain the start position and the length of the bitfield.
1204 POS gives the position of the first bit of the bitfield counting
1205 from the lowest order bit starting with zero. In order to use this
1206 value for S/390 instructions this has to be converted to "bits big
1210 s390_contiguous_bitmask_p (unsigned HOST_WIDE_INT in
, int size
,
1211 int *pos
, int *length
)
1216 unsigned HOST_WIDE_INT mask
= 1ULL;
1217 bool contiguous
= false;
1219 for (i
= 0; i
< size
; mask
<<= 1, i
++)
1243 /* Calculate a mask for all bits beyond the contiguous bits. */
1244 mask
= (-1LL & ~(((1ULL << (tmp_length
+ tmp_pos
- 1)) << 1) - 1));
1249 if (tmp_length
+ tmp_pos
- 1 > size
)
1253 *length
= tmp_length
;
1261 /* Check whether we can (and want to) split a double-word
1262 move in mode MODE from SRC to DST into two single-word
1263 moves, moving the subword FIRST_SUBWORD first. */
1266 s390_split_ok_p (rtx dst
, rtx src
, enum machine_mode mode
, int first_subword
)
1268 /* Floating point registers cannot be split. */
1269 if (FP_REG_P (src
) || FP_REG_P (dst
))
1272 /* We don't need to split if operands are directly accessible. */
1273 if (s_operand (src
, mode
) || s_operand (dst
, mode
))
1276 /* Non-offsettable memory references cannot be split. */
1277 if ((GET_CODE (src
) == MEM
&& !offsettable_memref_p (src
))
1278 || (GET_CODE (dst
) == MEM
&& !offsettable_memref_p (dst
)))
1281 /* Moving the first subword must not clobber a register
1282 needed to move the second subword. */
1283 if (register_operand (dst
, mode
))
1285 rtx subreg
= operand_subword (dst
, first_subword
, 0, mode
);
1286 if (reg_overlap_mentioned_p (subreg
, src
))
1293 /* Return true if it can be proven that [MEM1, MEM1 + SIZE]
1294 and [MEM2, MEM2 + SIZE] do overlap and false
1298 s390_overlap_p (rtx mem1
, rtx mem2
, HOST_WIDE_INT size
)
1300 rtx addr1
, addr2
, addr_delta
;
1301 HOST_WIDE_INT delta
;
1303 if (GET_CODE (mem1
) != MEM
|| GET_CODE (mem2
) != MEM
)
1309 addr1
= XEXP (mem1
, 0);
1310 addr2
= XEXP (mem2
, 0);
1312 addr_delta
= simplify_binary_operation (MINUS
, Pmode
, addr2
, addr1
);
1314 /* This overlapping check is used by peepholes merging memory block operations.
1315 Overlapping operations would otherwise be recognized by the S/390 hardware
1316 and would fall back to a slower implementation. Allowing overlapping
1317 operations would lead to slow code but not to wrong code. Therefore we are
1318 somewhat optimistic if we cannot prove that the memory blocks are
1320 That's why we return false here although this may accept operations on
1321 overlapping memory areas. */
1322 if (!addr_delta
|| GET_CODE (addr_delta
) != CONST_INT
)
1325 delta
= INTVAL (addr_delta
);
1328 || (delta
> 0 && delta
< size
)
1329 || (delta
< 0 && -delta
< size
))
1335 /* Check whether the address of memory reference MEM2 equals exactly
1336 the address of memory reference MEM1 plus DELTA. Return true if
1337 we can prove this to be the case, false otherwise. */
1340 s390_offset_p (rtx mem1
, rtx mem2
, rtx delta
)
1342 rtx addr1
, addr2
, addr_delta
;
1344 if (GET_CODE (mem1
) != MEM
|| GET_CODE (mem2
) != MEM
)
1347 addr1
= XEXP (mem1
, 0);
1348 addr2
= XEXP (mem2
, 0);
1350 addr_delta
= simplify_binary_operation (MINUS
, Pmode
, addr2
, addr1
);
1351 if (!addr_delta
|| !rtx_equal_p (addr_delta
, delta
))
1357 /* Expand logical operator CODE in mode MODE with operands OPERANDS. */
1360 s390_expand_logical_operator (enum rtx_code code
, enum machine_mode mode
,
1363 enum machine_mode wmode
= mode
;
1364 rtx dst
= operands
[0];
1365 rtx src1
= operands
[1];
1366 rtx src2
= operands
[2];
1369 /* If we cannot handle the operation directly, use a temp register. */
1370 if (!s390_logical_operator_ok_p (operands
))
1371 dst
= gen_reg_rtx (mode
);
1373 /* QImode and HImode patterns make sense only if we have a destination
1374 in memory. Otherwise perform the operation in SImode. */
1375 if ((mode
== QImode
|| mode
== HImode
) && GET_CODE (dst
) != MEM
)
1378 /* Widen operands if required. */
1381 if (GET_CODE (dst
) == SUBREG
1382 && (tem
= simplify_subreg (wmode
, dst
, mode
, 0)) != 0)
1384 else if (REG_P (dst
))
1385 dst
= gen_rtx_SUBREG (wmode
, dst
, 0);
1387 dst
= gen_reg_rtx (wmode
);
1389 if (GET_CODE (src1
) == SUBREG
1390 && (tem
= simplify_subreg (wmode
, src1
, mode
, 0)) != 0)
1392 else if (GET_MODE (src1
) != VOIDmode
)
1393 src1
= gen_rtx_SUBREG (wmode
, force_reg (mode
, src1
), 0);
1395 if (GET_CODE (src2
) == SUBREG
1396 && (tem
= simplify_subreg (wmode
, src2
, mode
, 0)) != 0)
1398 else if (GET_MODE (src2
) != VOIDmode
)
1399 src2
= gen_rtx_SUBREG (wmode
, force_reg (mode
, src2
), 0);
1402 /* Emit the instruction. */
1403 op
= gen_rtx_SET (VOIDmode
, dst
, gen_rtx_fmt_ee (code
, wmode
, src1
, src2
));
1404 clob
= gen_rtx_CLOBBER (VOIDmode
, gen_rtx_REG (CCmode
, CC_REGNUM
));
1405 emit_insn (gen_rtx_PARALLEL (VOIDmode
, gen_rtvec (2, op
, clob
)));
1407 /* Fix up the destination if needed. */
1408 if (dst
!= operands
[0])
1409 emit_move_insn (operands
[0], gen_lowpart (mode
, dst
));
1412 /* Check whether OPERANDS are OK for a logical operation (AND, IOR, XOR). */
1415 s390_logical_operator_ok_p (rtx
*operands
)
1417 /* If the destination operand is in memory, it needs to coincide
1418 with one of the source operands. After reload, it has to be
1419 the first source operand. */
1420 if (GET_CODE (operands
[0]) == MEM
)
1421 return rtx_equal_p (operands
[0], operands
[1])
1422 || (!reload_completed
&& rtx_equal_p (operands
[0], operands
[2]));
1427 /* Narrow logical operation CODE of memory operand MEMOP with immediate
1428 operand IMMOP to switch from SS to SI type instructions. */
1431 s390_narrow_logical_operator (enum rtx_code code
, rtx
*memop
, rtx
*immop
)
1433 int def
= code
== AND
? -1 : 0;
1437 gcc_assert (GET_CODE (*memop
) == MEM
);
1438 gcc_assert (!MEM_VOLATILE_P (*memop
));
1440 mask
= s390_extract_part (*immop
, QImode
, def
);
1441 part
= s390_single_part (*immop
, GET_MODE (*memop
), QImode
, def
);
1442 gcc_assert (part
>= 0);
1444 *memop
= adjust_address (*memop
, QImode
, part
);
1445 *immop
= gen_int_mode (mask
, QImode
);
1449 /* How to allocate a 'struct machine_function'. */
1451 static struct machine_function
*
1452 s390_init_machine_status (void)
1454 return GGC_CNEW (struct machine_function
);
1457 /* Change optimizations to be performed, depending on the
1460 LEVEL is the optimization level specified; 2 if `-O2' is
1461 specified, 1 if `-O' is specified, and 0 if neither is specified.
1463 SIZE is nonzero if `-Os' is specified and zero otherwise. */
1466 optimization_options (int level ATTRIBUTE_UNUSED
, int size ATTRIBUTE_UNUSED
)
1468 /* ??? There are apparently still problems with -fcaller-saves. */
1469 flag_caller_saves
= 0;
1471 /* By default, always emit DWARF-2 unwind info. This allows debugging
1472 without maintaining a stack frame back-chain. */
1473 flag_asynchronous_unwind_tables
= 1;
1475 /* Use MVCLE instructions to decrease code size if requested. */
1477 target_flags
|= MASK_MVCLE
;
1480 /* Return true if ARG is the name of a processor. Set *TYPE and *FLAGS
1481 to the associated processor_type and processor_flags if so. */
1484 s390_handle_arch_option (const char *arg
,
1485 enum processor_type
*type
,
1486 enum processor_flags
*flags
)
1490 const char *const name
; /* processor name or nickname. */
1491 const enum processor_type processor
;
1492 const enum processor_flags flags
;
1494 const processor_alias_table
[] =
1496 {"g5", PROCESSOR_9672_G5
, PF_IEEE_FLOAT
},
1497 {"g6", PROCESSOR_9672_G6
, PF_IEEE_FLOAT
},
1498 {"z900", PROCESSOR_2064_Z900
, PF_IEEE_FLOAT
| PF_ZARCH
},
1499 {"z990", PROCESSOR_2084_Z990
, PF_IEEE_FLOAT
| PF_ZARCH
1500 | PF_LONG_DISPLACEMENT
},
1501 {"z9-109", PROCESSOR_2094_Z9_109
, PF_IEEE_FLOAT
| PF_ZARCH
1502 | PF_LONG_DISPLACEMENT
| PF_EXTIMM
},
1503 {"z9-ec", PROCESSOR_2094_Z9_109
, PF_IEEE_FLOAT
| PF_ZARCH
1504 | PF_LONG_DISPLACEMENT
| PF_EXTIMM
| PF_DFP
},
1505 {"z10", PROCESSOR_2097_Z10
, PF_IEEE_FLOAT
| PF_ZARCH
1506 | PF_LONG_DISPLACEMENT
| PF_EXTIMM
| PF_DFP
| PF_Z10
},
1510 for (i
= 0; i
< ARRAY_SIZE (processor_alias_table
); i
++)
1511 if (strcmp (arg
, processor_alias_table
[i
].name
) == 0)
1513 *type
= processor_alias_table
[i
].processor
;
1514 *flags
= processor_alias_table
[i
].flags
;
1520 /* Implement TARGET_HANDLE_OPTION. */
1523 s390_handle_option (size_t code
, const char *arg
, int value ATTRIBUTE_UNUSED
)
1528 return s390_handle_arch_option (arg
, &s390_arch
, &s390_arch_flags
);
1530 case OPT_mstack_guard_
:
1531 if (sscanf (arg
, HOST_WIDE_INT_PRINT_DEC
, &s390_stack_guard
) != 1)
1533 if (exact_log2 (s390_stack_guard
) == -1)
1534 error ("stack guard value must be an exact power of 2");
1537 case OPT_mstack_size_
:
1538 if (sscanf (arg
, HOST_WIDE_INT_PRINT_DEC
, &s390_stack_size
) != 1)
1540 if (exact_log2 (s390_stack_size
) == -1)
1541 error ("stack size must be an exact power of 2");
1545 return s390_handle_arch_option (arg
, &s390_tune
, &s390_tune_flags
);
1547 case OPT_mwarn_framesize_
:
1548 return sscanf (arg
, HOST_WIDE_INT_PRINT_DEC
, &s390_warn_framesize
) == 1;
1556 override_options (void)
1558 /* Set up function hooks. */
1559 init_machine_status
= s390_init_machine_status
;
1561 /* Architecture mode defaults according to ABI. */
1562 if (!(target_flags_explicit
& MASK_ZARCH
))
1565 target_flags
|= MASK_ZARCH
;
1567 target_flags
&= ~MASK_ZARCH
;
1570 /* Determine processor architectural level. */
1571 if (!s390_arch_string
)
1573 s390_arch_string
= TARGET_ZARCH
? "z900" : "g5";
1574 s390_handle_arch_option (s390_arch_string
, &s390_arch
, &s390_arch_flags
);
1577 /* Determine processor to tune for. */
1578 if (s390_tune
== PROCESSOR_max
)
1580 s390_tune
= s390_arch
;
1581 s390_tune_flags
= s390_arch_flags
;
1584 /* Sanity checks. */
1585 if (TARGET_ZARCH
&& !TARGET_CPU_ZARCH
)
1586 error ("z/Architecture mode not supported on %s", s390_arch_string
);
1587 if (TARGET_64BIT
&& !TARGET_ZARCH
)
1588 error ("64-bit ABI not supported in ESA/390 mode");
1590 if (TARGET_HARD_DFP
&& !TARGET_DFP
)
1592 if (target_flags_explicit
& MASK_HARD_DFP
)
1594 if (!TARGET_CPU_DFP
)
1595 error ("Hardware decimal floating point instructions"
1596 " not available on %s", s390_arch_string
);
1598 error ("Hardware decimal floating point instructions"
1599 " not available in ESA/390 mode");
1602 target_flags
&= ~MASK_HARD_DFP
;
1605 if ((target_flags_explicit
& MASK_SOFT_FLOAT
) && TARGET_SOFT_FLOAT
)
1607 if ((target_flags_explicit
& MASK_HARD_DFP
) && TARGET_HARD_DFP
)
1608 error ("-mhard-dfp can't be used in conjunction with -msoft-float");
1610 target_flags
&= ~MASK_HARD_DFP
;
1613 /* Set processor cost function. */
1616 case PROCESSOR_2084_Z990
:
1617 s390_cost
= &z990_cost
;
1619 case PROCESSOR_2094_Z9_109
:
1620 s390_cost
= &z9_109_cost
;
1622 case PROCESSOR_2097_Z10
:
1623 s390_cost
= &z10_cost
;
1626 s390_cost
= &z900_cost
;
1629 if (TARGET_BACKCHAIN
&& TARGET_PACKED_STACK
&& TARGET_HARD_FLOAT
)
1630 error ("-mbackchain -mpacked-stack -mhard-float are not supported "
1633 if (s390_stack_size
)
1635 if (s390_stack_guard
>= s390_stack_size
)
1636 error ("stack size must be greater than the stack guard value");
1637 else if (s390_stack_size
> 1 << 16)
1638 error ("stack size must not be greater than 64k");
1640 else if (s390_stack_guard
)
1641 error ("-mstack-guard implies use of -mstack-size");
1643 #ifdef TARGET_DEFAULT_LONG_DOUBLE_128
1644 if (!(target_flags_explicit
& MASK_LONG_DOUBLE_128
))
1645 target_flags
|= MASK_LONG_DOUBLE_128
;
1649 /* Map for smallest class containing reg regno. */
1651 const enum reg_class regclass_map
[FIRST_PSEUDO_REGISTER
] =
1652 { GENERAL_REGS
, ADDR_REGS
, ADDR_REGS
, ADDR_REGS
,
1653 ADDR_REGS
, ADDR_REGS
, ADDR_REGS
, ADDR_REGS
,
1654 ADDR_REGS
, ADDR_REGS
, ADDR_REGS
, ADDR_REGS
,
1655 ADDR_REGS
, ADDR_REGS
, ADDR_REGS
, ADDR_REGS
,
1656 FP_REGS
, FP_REGS
, FP_REGS
, FP_REGS
,
1657 FP_REGS
, FP_REGS
, FP_REGS
, FP_REGS
,
1658 FP_REGS
, FP_REGS
, FP_REGS
, FP_REGS
,
1659 FP_REGS
, FP_REGS
, FP_REGS
, FP_REGS
,
1660 ADDR_REGS
, CC_REGS
, ADDR_REGS
, ADDR_REGS
,
1661 ACCESS_REGS
, ACCESS_REGS
1664 /* Return attribute type of insn. */
1666 static enum attr_type
1667 s390_safe_attr_type (rtx insn
)
1669 if (recog_memoized (insn
) >= 0)
1670 return get_attr_type (insn
);
1675 /* Return true if DISP is a valid short displacement. */
1678 s390_short_displacement (rtx disp
)
1680 /* No displacement is OK. */
1684 /* Integer displacement in range. */
1685 if (GET_CODE (disp
) == CONST_INT
)
1686 return INTVAL (disp
) >= 0 && INTVAL (disp
) < 4096;
1688 /* GOT offset is not OK, the GOT can be large. */
1689 if (GET_CODE (disp
) == CONST
1690 && GET_CODE (XEXP (disp
, 0)) == UNSPEC
1691 && (XINT (XEXP (disp
, 0), 1) == UNSPEC_GOT
1692 || XINT (XEXP (disp
, 0), 1) == UNSPEC_GOTNTPOFF
))
1695 /* All other symbolic constants are literal pool references,
1696 which are OK as the literal pool must be small. */
1697 if (GET_CODE (disp
) == CONST
)
1703 /* Decompose a RTL expression ADDR for a memory address into
1704 its components, returned in OUT.
1706 Returns false if ADDR is not a valid memory address, true
1707 otherwise. If OUT is NULL, don't return the components,
1708 but check for validity only.
1710 Note: Only addresses in canonical form are recognized.
1711 LEGITIMIZE_ADDRESS should convert non-canonical forms to the
1712 canonical form so that they will be recognized. */
1715 s390_decompose_address (rtx addr
, struct s390_address
*out
)
1717 HOST_WIDE_INT offset
= 0;
1718 rtx base
= NULL_RTX
;
1719 rtx indx
= NULL_RTX
;
1720 rtx disp
= NULL_RTX
;
1722 bool pointer
= false;
1723 bool base_ptr
= false;
1724 bool indx_ptr
= false;
1725 bool literal_pool
= false;
1727 /* We may need to substitute the literal pool base register into the address
1728 below. However, at this point we do not know which register is going to
1729 be used as base, so we substitute the arg pointer register. This is going
1730 to be treated as holding a pointer below -- it shouldn't be used for any
1732 rtx fake_pool_base
= gen_rtx_REG (Pmode
, ARG_POINTER_REGNUM
);
1734 /* Decompose address into base + index + displacement. */
1736 if (GET_CODE (addr
) == REG
|| GET_CODE (addr
) == UNSPEC
)
1739 else if (GET_CODE (addr
) == PLUS
)
1741 rtx op0
= XEXP (addr
, 0);
1742 rtx op1
= XEXP (addr
, 1);
1743 enum rtx_code code0
= GET_CODE (op0
);
1744 enum rtx_code code1
= GET_CODE (op1
);
1746 if (code0
== REG
|| code0
== UNSPEC
)
1748 if (code1
== REG
|| code1
== UNSPEC
)
1750 indx
= op0
; /* index + base */
1756 base
= op0
; /* base + displacement */
1761 else if (code0
== PLUS
)
1763 indx
= XEXP (op0
, 0); /* index + base + disp */
1764 base
= XEXP (op0
, 1);
1775 disp
= addr
; /* displacement */
1777 /* Extract integer part of displacement. */
1781 if (GET_CODE (disp
) == CONST_INT
)
1783 offset
= INTVAL (disp
);
1786 else if (GET_CODE (disp
) == CONST
1787 && GET_CODE (XEXP (disp
, 0)) == PLUS
1788 && GET_CODE (XEXP (XEXP (disp
, 0), 1)) == CONST_INT
)
1790 offset
= INTVAL (XEXP (XEXP (disp
, 0), 1));
1791 disp
= XEXP (XEXP (disp
, 0), 0);
1795 /* Strip off CONST here to avoid special case tests later. */
1796 if (disp
&& GET_CODE (disp
) == CONST
)
1797 disp
= XEXP (disp
, 0);
1799 /* We can convert literal pool addresses to
1800 displacements by basing them off the base register. */
1801 if (disp
&& GET_CODE (disp
) == SYMBOL_REF
&& CONSTANT_POOL_ADDRESS_P (disp
))
1803 /* Either base or index must be free to hold the base register. */
1805 base
= fake_pool_base
, literal_pool
= true;
1807 indx
= fake_pool_base
, literal_pool
= true;
1811 /* Mark up the displacement. */
1812 disp
= gen_rtx_UNSPEC (Pmode
, gen_rtvec (1, disp
),
1813 UNSPEC_LTREL_OFFSET
);
1816 /* Validate base register. */
1819 if (GET_CODE (base
) == UNSPEC
)
1820 switch (XINT (base
, 1))
1824 disp
= gen_rtx_UNSPEC (Pmode
,
1825 gen_rtvec (1, XVECEXP (base
, 0, 0)),
1826 UNSPEC_LTREL_OFFSET
);
1830 base
= XVECEXP (base
, 0, 1);
1833 case UNSPEC_LTREL_BASE
:
1834 if (XVECLEN (base
, 0) == 1)
1835 base
= fake_pool_base
, literal_pool
= true;
1837 base
= XVECEXP (base
, 0, 1);
1845 || (GET_MODE (base
) != SImode
1846 && GET_MODE (base
) != Pmode
))
1849 if (REGNO (base
) == STACK_POINTER_REGNUM
1850 || REGNO (base
) == FRAME_POINTER_REGNUM
1851 || ((reload_completed
|| reload_in_progress
)
1852 && frame_pointer_needed
1853 && REGNO (base
) == HARD_FRAME_POINTER_REGNUM
)
1854 || REGNO (base
) == ARG_POINTER_REGNUM
1856 && REGNO (base
) == PIC_OFFSET_TABLE_REGNUM
))
1857 pointer
= base_ptr
= true;
1859 if ((reload_completed
|| reload_in_progress
)
1860 && base
== cfun
->machine
->base_reg
)
1861 pointer
= base_ptr
= literal_pool
= true;
1864 /* Validate index register. */
1867 if (GET_CODE (indx
) == UNSPEC
)
1868 switch (XINT (indx
, 1))
1872 disp
= gen_rtx_UNSPEC (Pmode
,
1873 gen_rtvec (1, XVECEXP (indx
, 0, 0)),
1874 UNSPEC_LTREL_OFFSET
);
1878 indx
= XVECEXP (indx
, 0, 1);
1881 case UNSPEC_LTREL_BASE
:
1882 if (XVECLEN (indx
, 0) == 1)
1883 indx
= fake_pool_base
, literal_pool
= true;
1885 indx
= XVECEXP (indx
, 0, 1);
1893 || (GET_MODE (indx
) != SImode
1894 && GET_MODE (indx
) != Pmode
))
1897 if (REGNO (indx
) == STACK_POINTER_REGNUM
1898 || REGNO (indx
) == FRAME_POINTER_REGNUM
1899 || ((reload_completed
|| reload_in_progress
)
1900 && frame_pointer_needed
1901 && REGNO (indx
) == HARD_FRAME_POINTER_REGNUM
)
1902 || REGNO (indx
) == ARG_POINTER_REGNUM
1904 && REGNO (indx
) == PIC_OFFSET_TABLE_REGNUM
))
1905 pointer
= indx_ptr
= true;
1907 if ((reload_completed
|| reload_in_progress
)
1908 && indx
== cfun
->machine
->base_reg
)
1909 pointer
= indx_ptr
= literal_pool
= true;
1912 /* Prefer to use pointer as base, not index. */
1913 if (base
&& indx
&& !base_ptr
1914 && (indx_ptr
|| (!REG_POINTER (base
) && REG_POINTER (indx
))))
1921 /* Validate displacement. */
1924 /* If virtual registers are involved, the displacement will change later
1925 anyway as the virtual registers get eliminated. This could make a
1926 valid displacement invalid, but it is more likely to make an invalid
1927 displacement valid, because we sometimes access the register save area
1928 via negative offsets to one of those registers.
1929 Thus we don't check the displacement for validity here. If after
1930 elimination the displacement turns out to be invalid after all,
1931 this is fixed up by reload in any case. */
1932 if (base
!= arg_pointer_rtx
1933 && indx
!= arg_pointer_rtx
1934 && base
!= return_address_pointer_rtx
1935 && indx
!= return_address_pointer_rtx
1936 && base
!= frame_pointer_rtx
1937 && indx
!= frame_pointer_rtx
1938 && base
!= virtual_stack_vars_rtx
1939 && indx
!= virtual_stack_vars_rtx
)
1940 if (!DISP_IN_RANGE (offset
))
1945 /* All the special cases are pointers. */
1948 /* In the small-PIC case, the linker converts @GOT
1949 and @GOTNTPOFF offsets to possible displacements. */
1950 if (GET_CODE (disp
) == UNSPEC
1951 && (XINT (disp
, 1) == UNSPEC_GOT
1952 || XINT (disp
, 1) == UNSPEC_GOTNTPOFF
)
1958 /* Accept chunkified literal pool symbol references. */
1959 else if (cfun
&& cfun
->machine
1960 && cfun
->machine
->decomposed_literal_pool_addresses_ok_p
1961 && GET_CODE (disp
) == MINUS
1962 && GET_CODE (XEXP (disp
, 0)) == LABEL_REF
1963 && GET_CODE (XEXP (disp
, 1)) == LABEL_REF
)
1968 /* Accept literal pool references. */
1969 else if (GET_CODE (disp
) == UNSPEC
1970 && XINT (disp
, 1) == UNSPEC_LTREL_OFFSET
)
1972 orig_disp
= gen_rtx_CONST (Pmode
, disp
);
1975 /* If we have an offset, make sure it does not
1976 exceed the size of the constant pool entry. */
1977 rtx sym
= XVECEXP (disp
, 0, 0);
1978 if (offset
>= GET_MODE_SIZE (get_pool_mode (sym
)))
1981 orig_disp
= plus_constant (orig_disp
, offset
);
1996 out
->disp
= orig_disp
;
1997 out
->pointer
= pointer
;
1998 out
->literal_pool
= literal_pool
;
2004 /* Decompose a RTL expression OP for a shift count into its components,
2005 and return the base register in BASE and the offset in OFFSET.
2007 Return true if OP is a valid shift count, false if not. */
2010 s390_decompose_shift_count (rtx op
, rtx
*base
, HOST_WIDE_INT
*offset
)
2012 HOST_WIDE_INT off
= 0;
2014 /* We can have an integer constant, an address register,
2015 or a sum of the two. */
2016 if (GET_CODE (op
) == CONST_INT
)
2021 if (op
&& GET_CODE (op
) == PLUS
&& GET_CODE (XEXP (op
, 1)) == CONST_INT
)
2023 off
= INTVAL (XEXP (op
, 1));
2026 while (op
&& GET_CODE (op
) == SUBREG
)
2027 op
= SUBREG_REG (op
);
2029 if (op
&& GET_CODE (op
) != REG
)
2041 /* Return true if CODE is a valid address without index. */
2044 s390_legitimate_address_without_index_p (rtx op
)
2046 struct s390_address addr
;
2048 if (!s390_decompose_address (XEXP (op
, 0), &addr
))
2057 /* Evaluates constraint strings described by the regular expression
2058 ([A|B](Q|R|S|T))|U|W and returns 1 if OP is a valid operand for the
2059 constraint given in STR, or 0 else. */
2062 s390_mem_constraint (const char *str
, rtx op
)
2064 struct s390_address addr
;
2067 /* Check for offsettable variants of memory constraints. */
2070 /* Only accept non-volatile MEMs. */
2071 if (!MEM_P (op
) || MEM_VOLATILE_P (op
))
2074 if ((reload_completed
|| reload_in_progress
)
2075 ? !offsettable_memref_p (op
) : !offsettable_nonstrict_memref_p (op
))
2081 /* Check for non-literal-pool variants of memory constraints. */
2084 if (GET_CODE (op
) != MEM
)
2086 if (!s390_decompose_address (XEXP (op
, 0), &addr
))
2088 if (addr
.literal_pool
)
2097 if (GET_CODE (op
) != MEM
)
2099 if (!s390_decompose_address (XEXP (op
, 0), &addr
))
2104 if (TARGET_LONG_DISPLACEMENT
)
2106 if (!s390_short_displacement (addr
.disp
))
2112 if (GET_CODE (op
) != MEM
)
2115 if (TARGET_LONG_DISPLACEMENT
)
2117 if (!s390_decompose_address (XEXP (op
, 0), &addr
))
2119 if (!s390_short_displacement (addr
.disp
))
2125 if (!TARGET_LONG_DISPLACEMENT
)
2127 if (GET_CODE (op
) != MEM
)
2129 if (!s390_decompose_address (XEXP (op
, 0), &addr
))
2133 if (s390_short_displacement (addr
.disp
))
2138 if (!TARGET_LONG_DISPLACEMENT
)
2140 if (GET_CODE (op
) != MEM
)
2142 if (!s390_decompose_address (XEXP (op
, 0), &addr
))
2144 if (s390_short_displacement (addr
.disp
))
2149 if (TARGET_LONG_DISPLACEMENT
)
2151 if (!s390_decompose_address (op
, &addr
))
2153 if (!s390_short_displacement (addr
.disp
))
2159 if (!TARGET_LONG_DISPLACEMENT
)
2161 if (!s390_decompose_address (op
, &addr
))
2163 if (s390_short_displacement (addr
.disp
))
2168 /* Simply check for the basic form of a shift count. Reload will
2169 take care of making sure we have a proper base register. */
2170 if (!s390_decompose_shift_count (op
, NULL
, NULL
))
2183 /* Evaluates constraint strings starting with letter O. Input
2184 parameter C is the second letter following the "O" in the constraint
2185 string. Returns 1 if VALUE meets the respective constraint and 0
2189 s390_O_constraint_str (const char c
, HOST_WIDE_INT value
)
2197 return trunc_int_for_mode (value
, SImode
) == value
;
2201 || s390_single_part (GEN_INT (value
), DImode
, SImode
, 0) == 1;
2204 return s390_single_part (GEN_INT (value
- 1), DImode
, SImode
, -1) == 1;
2212 /* Evaluates constraint strings starting with letter N. Parameter STR
2213 contains the letters following letter "N" in the constraint string.
2214 Returns true if VALUE matches the constraint. */
2217 s390_N_constraint_str (const char *str
, HOST_WIDE_INT value
)
2219 enum machine_mode mode
, part_mode
;
2221 int part
, part_goal
;
2227 part_goal
= str
[0] - '0';
2271 if (GET_MODE_SIZE (mode
) <= GET_MODE_SIZE (part_mode
))
2274 part
= s390_single_part (GEN_INT (value
), mode
, part_mode
, def
);
2277 if (part_goal
!= -1 && part_goal
!= part
)
2284 /* Returns true if the input parameter VALUE is a float zero. */
2287 s390_float_const_zero_p (rtx value
)
2289 return (GET_MODE_CLASS (GET_MODE (value
)) == MODE_FLOAT
2290 && value
== CONST0_RTX (GET_MODE (value
)));
2294 /* Compute a (partial) cost for rtx X. Return true if the complete
2295 cost has been computed, and false if subexpressions should be
2296 scanned. In either case, *TOTAL contains the cost result.
2297 CODE contains GET_CODE (x), OUTER_CODE contains the code
2298 of the superexpression of x. */
2301 s390_rtx_costs (rtx x
, int code
, int outer_code
, int *total
)
2324 *total
= COSTS_N_INSNS (1);
2329 /* Check for multiply and add. */
2330 if ((GET_MODE (x
) == DFmode
|| GET_MODE (x
) == SFmode
)
2331 && GET_CODE (XEXP (x
, 0)) == MULT
2332 && TARGET_HARD_FLOAT
&& TARGET_FUSED_MADD
)
2334 /* This is the multiply and add case. */
2335 if (GET_MODE (x
) == DFmode
)
2336 *total
= s390_cost
->madbr
;
2338 *total
= s390_cost
->maebr
;
2339 *total
+= rtx_cost (XEXP (XEXP (x
, 0), 0), MULT
)
2340 + rtx_cost (XEXP (XEXP (x
, 0), 1), MULT
)
2341 + rtx_cost (XEXP (x
, 1), code
);
2342 return true; /* Do not do an additional recursive descent. */
2344 *total
= COSTS_N_INSNS (1);
2348 switch (GET_MODE (x
))
2352 rtx left
= XEXP (x
, 0);
2353 rtx right
= XEXP (x
, 1);
2354 if (GET_CODE (right
) == CONST_INT
2355 && CONST_OK_FOR_K (INTVAL (right
)))
2356 *total
= s390_cost
->mhi
;
2357 else if (GET_CODE (left
) == SIGN_EXTEND
)
2358 *total
= s390_cost
->mh
;
2360 *total
= s390_cost
->ms
; /* msr, ms, msy */
2365 rtx left
= XEXP (x
, 0);
2366 rtx right
= XEXP (x
, 1);
2369 if (GET_CODE (right
) == CONST_INT
2370 && CONST_OK_FOR_K (INTVAL (right
)))
2371 *total
= s390_cost
->mghi
;
2372 else if (GET_CODE (left
) == SIGN_EXTEND
)
2373 *total
= s390_cost
->msgf
;
2375 *total
= s390_cost
->msg
; /* msgr, msg */
2377 else /* TARGET_31BIT */
2379 if (GET_CODE (left
) == SIGN_EXTEND
2380 && GET_CODE (right
) == SIGN_EXTEND
)
2381 /* mulsidi case: mr, m */
2382 *total
= s390_cost
->m
;
2383 else if (GET_CODE (left
) == ZERO_EXTEND
2384 && GET_CODE (right
) == ZERO_EXTEND
2385 && TARGET_CPU_ZARCH
)
2386 /* umulsidi case: ml, mlr */
2387 *total
= s390_cost
->ml
;
2389 /* Complex calculation is required. */
2390 *total
= COSTS_N_INSNS (40);
2396 *total
= s390_cost
->mult_df
;
2399 *total
= s390_cost
->mxbr
;
2408 if (GET_MODE (x
) == TImode
) /* 128 bit division */
2409 *total
= s390_cost
->dlgr
;
2410 else if (GET_MODE (x
) == DImode
)
2412 rtx right
= XEXP (x
, 1);
2413 if (GET_CODE (right
) == ZERO_EXTEND
) /* 64 by 32 bit division */
2414 *total
= s390_cost
->dlr
;
2415 else /* 64 by 64 bit division */
2416 *total
= s390_cost
->dlgr
;
2418 else if (GET_MODE (x
) == SImode
) /* 32 bit division */
2419 *total
= s390_cost
->dlr
;
2424 if (GET_MODE (x
) == DImode
)
2426 rtx right
= XEXP (x
, 1);
2427 if (GET_CODE (right
) == ZERO_EXTEND
) /* 64 by 32 bit division */
2429 *total
= s390_cost
->dsgfr
;
2431 *total
= s390_cost
->dr
;
2432 else /* 64 by 64 bit division */
2433 *total
= s390_cost
->dsgr
;
2435 else if (GET_MODE (x
) == SImode
) /* 32 bit division */
2436 *total
= s390_cost
->dlr
;
2437 else if (GET_MODE (x
) == SFmode
)
2439 *total
= s390_cost
->debr
;
2441 else if (GET_MODE (x
) == DFmode
)
2443 *total
= s390_cost
->ddbr
;
2445 else if (GET_MODE (x
) == TFmode
)
2447 *total
= s390_cost
->dxbr
;
2452 if (GET_MODE (x
) == SFmode
)
2453 *total
= s390_cost
->sqebr
;
2454 else if (GET_MODE (x
) == DFmode
)
2455 *total
= s390_cost
->sqdbr
;
2457 *total
= s390_cost
->sqxbr
;
2462 if (outer_code
== MULT
|| outer_code
== DIV
|| outer_code
== MOD
2463 || outer_code
== PLUS
|| outer_code
== MINUS
2464 || outer_code
== COMPARE
)
2469 *total
= COSTS_N_INSNS (1);
2470 if (GET_CODE (XEXP (x
, 0)) == AND
2471 && GET_CODE (XEXP (x
, 1)) == CONST_INT
2472 && GET_CODE (XEXP (XEXP (x
, 0), 1)) == CONST_INT
)
2474 rtx op0
= XEXP (XEXP (x
, 0), 0);
2475 rtx op1
= XEXP (XEXP (x
, 0), 1);
2476 rtx op2
= XEXP (x
, 1);
2478 if (memory_operand (op0
, GET_MODE (op0
))
2479 && s390_tm_ccmode (op1
, op2
, 0) != VOIDmode
)
2481 if (register_operand (op0
, GET_MODE (op0
))
2482 && s390_tm_ccmode (op1
, op2
, 1) != VOIDmode
)
2492 /* Return the cost of an address rtx ADDR. */
2495 s390_address_cost (rtx addr
)
2497 struct s390_address ad
;
2498 if (!s390_decompose_address (addr
, &ad
))
2501 return ad
.indx
? COSTS_N_INSNS (1) + 1 : COSTS_N_INSNS (1);
2504 /* If OP is a SYMBOL_REF of a thread-local symbol, return its TLS mode,
2505 otherwise return 0. */
2508 tls_symbolic_operand (rtx op
)
2510 if (GET_CODE (op
) != SYMBOL_REF
)
2512 return SYMBOL_REF_TLS_MODEL (op
);
2515 /* Split DImode access register reference REG (on 64-bit) into its constituent
2516 low and high parts, and store them into LO and HI. Note that gen_lowpart/
2517 gen_highpart cannot be used as they assume all registers are word-sized,
2518 while our access registers have only half that size. */
2521 s390_split_access_reg (rtx reg
, rtx
*lo
, rtx
*hi
)
2523 gcc_assert (TARGET_64BIT
);
2524 gcc_assert (ACCESS_REG_P (reg
));
2525 gcc_assert (GET_MODE (reg
) == DImode
);
2526 gcc_assert (!(REGNO (reg
) & 1));
2528 *lo
= gen_rtx_REG (SImode
, REGNO (reg
) + 1);
2529 *hi
= gen_rtx_REG (SImode
, REGNO (reg
));
2532 /* Return true if OP contains a symbol reference */
2535 symbolic_reference_mentioned_p (rtx op
)
2540 if (GET_CODE (op
) == SYMBOL_REF
|| GET_CODE (op
) == LABEL_REF
)
2543 fmt
= GET_RTX_FORMAT (GET_CODE (op
));
2544 for (i
= GET_RTX_LENGTH (GET_CODE (op
)) - 1; i
>= 0; i
--)
2550 for (j
= XVECLEN (op
, i
) - 1; j
>= 0; j
--)
2551 if (symbolic_reference_mentioned_p (XVECEXP (op
, i
, j
)))
2555 else if (fmt
[i
] == 'e' && symbolic_reference_mentioned_p (XEXP (op
, i
)))
2562 /* Return true if OP contains a reference to a thread-local symbol. */
2565 tls_symbolic_reference_mentioned_p (rtx op
)
2570 if (GET_CODE (op
) == SYMBOL_REF
)
2571 return tls_symbolic_operand (op
);
2573 fmt
= GET_RTX_FORMAT (GET_CODE (op
));
2574 for (i
= GET_RTX_LENGTH (GET_CODE (op
)) - 1; i
>= 0; i
--)
2580 for (j
= XVECLEN (op
, i
) - 1; j
>= 0; j
--)
2581 if (tls_symbolic_reference_mentioned_p (XVECEXP (op
, i
, j
)))
2585 else if (fmt
[i
] == 'e' && tls_symbolic_reference_mentioned_p (XEXP (op
, i
)))
2593 /* Return true if OP is a legitimate general operand when
2594 generating PIC code. It is given that flag_pic is on
2595 and that OP satisfies CONSTANT_P or is a CONST_DOUBLE. */
2598 legitimate_pic_operand_p (rtx op
)
2600 /* Accept all non-symbolic constants. */
2601 if (!SYMBOLIC_CONST (op
))
2604 /* Reject everything else; must be handled
2605 via emit_symbolic_move. */
2609 /* Returns true if the constant value OP is a legitimate general operand.
2610 It is given that OP satisfies CONSTANT_P or is a CONST_DOUBLE. */
2613 legitimate_constant_p (rtx op
)
2615 /* Accept all non-symbolic constants. */
2616 if (!SYMBOLIC_CONST (op
))
2619 /* Accept immediate LARL operands. */
2620 if (TARGET_CPU_ZARCH
&& larl_operand (op
, VOIDmode
))
2623 /* Thread-local symbols are never legal constants. This is
2624 so that emit_call knows that computing such addresses
2625 might require a function call. */
2626 if (TLS_SYMBOLIC_CONST (op
))
2629 /* In the PIC case, symbolic constants must *not* be
2630 forced into the literal pool. We accept them here,
2631 so that they will be handled by emit_symbolic_move. */
2635 /* All remaining non-PIC symbolic constants are
2636 forced into the literal pool. */
2640 /* Determine if it's legal to put X into the constant pool. This
2641 is not possible if X contains the address of a symbol that is
2642 not constant (TLS) or not known at final link time (PIC). */
2645 s390_cannot_force_const_mem (rtx x
)
2647 switch (GET_CODE (x
))
2651 /* Accept all non-symbolic constants. */
2655 /* Labels are OK iff we are non-PIC. */
2656 return flag_pic
!= 0;
2659 /* 'Naked' TLS symbol references are never OK,
2660 non-TLS symbols are OK iff we are non-PIC. */
2661 if (tls_symbolic_operand (x
))
2664 return flag_pic
!= 0;
2667 return s390_cannot_force_const_mem (XEXP (x
, 0));
2670 return s390_cannot_force_const_mem (XEXP (x
, 0))
2671 || s390_cannot_force_const_mem (XEXP (x
, 1));
2674 switch (XINT (x
, 1))
2676 /* Only lt-relative or GOT-relative UNSPECs are OK. */
2677 case UNSPEC_LTREL_OFFSET
:
2685 case UNSPEC_GOTNTPOFF
:
2686 case UNSPEC_INDNTPOFF
:
2689 /* If the literal pool shares the code section, be put
2690 execute template placeholders into the pool as well. */
2692 return TARGET_CPU_ZARCH
;
2704 /* Returns true if the constant value OP is a legitimate general
2705 operand during and after reload. The difference to
2706 legitimate_constant_p is that this function will not accept
2707 a constant that would need to be forced to the literal pool
2708 before it can be used as operand. */
2711 legitimate_reload_constant_p (rtx op
)
2713 /* Accept la(y) operands. */
2714 if (GET_CODE (op
) == CONST_INT
2715 && DISP_IN_RANGE (INTVAL (op
)))
2718 /* Accept l(g)hi/l(g)fi operands. */
2719 if (GET_CODE (op
) == CONST_INT
2720 && (CONST_OK_FOR_K (INTVAL (op
)) || CONST_OK_FOR_Os (INTVAL (op
))))
2723 /* Accept lliXX operands. */
2725 && GET_CODE (op
) == CONST_INT
2726 && trunc_int_for_mode (INTVAL (op
), word_mode
) == INTVAL (op
)
2727 && s390_single_part (op
, word_mode
, HImode
, 0) >= 0)
2731 && GET_CODE (op
) == CONST_INT
2732 && trunc_int_for_mode (INTVAL (op
), word_mode
) == INTVAL (op
)
2733 && s390_single_part (op
, word_mode
, SImode
, 0) >= 0)
2736 /* Accept larl operands. */
2737 if (TARGET_CPU_ZARCH
2738 && larl_operand (op
, VOIDmode
))
2741 /* Accept lzXX operands. */
2742 if (GET_CODE (op
) == CONST_DOUBLE
2743 && CONST_DOUBLE_OK_FOR_CONSTRAINT_P (op
, 'G', "G"))
2746 /* Accept double-word operands that can be split. */
2747 if (GET_CODE (op
) == CONST_INT
2748 && trunc_int_for_mode (INTVAL (op
), word_mode
) != INTVAL (op
))
2750 enum machine_mode dword_mode
= word_mode
== SImode
? DImode
: TImode
;
2751 rtx hi
= operand_subword (op
, 0, 0, dword_mode
);
2752 rtx lo
= operand_subword (op
, 1, 0, dword_mode
);
2753 return legitimate_reload_constant_p (hi
)
2754 && legitimate_reload_constant_p (lo
);
2757 /* Everything else cannot be handled without reload. */
2761 /* Given an rtx OP being reloaded into a reg required to be in class CLASS,
2762 return the class of reg to actually use. */
2765 s390_preferred_reload_class (rtx op
, enum reg_class
class)
2767 switch (GET_CODE (op
))
2769 /* Constants we cannot reload must be forced into the
2774 if (legitimate_reload_constant_p (op
))
2779 /* If a symbolic constant or a PLUS is reloaded,
2780 it is most likely being used as an address, so
2781 prefer ADDR_REGS. If 'class' is not a superset
2782 of ADDR_REGS, e.g. FP_REGS, reject this reload. */
2787 if (reg_class_subset_p (ADDR_REGS
, class))
2799 /* Return true if ADDR is of kind symbol_ref or symbol_ref + const_int
2800 and return these parts in SYMREF and ADDEND. You can pass NULL in
2801 SYMREF and/or ADDEND if you are not interested in these values. */
2804 s390_symref_operand_p (rtx addr
, rtx
*symref
, HOST_WIDE_INT
*addend
)
2806 HOST_WIDE_INT tmpaddend
= 0;
2808 if (GET_CODE (addr
) == CONST
)
2809 addr
= XEXP (addr
, 0);
2811 if (GET_CODE (addr
) == PLUS
)
2813 if (GET_CODE (XEXP (addr
, 0)) == SYMBOL_REF
2814 && CONST_INT_P (XEXP (addr
, 1)))
2816 tmpaddend
= INTVAL (XEXP (addr
, 1));
2817 addr
= XEXP (addr
, 0);
2823 if (GET_CODE (addr
) != SYMBOL_REF
)
2829 *addend
= tmpaddend
;
2834 /* Return true if ADDR is SYMBOL_REF + addend with addend being a
2835 multiple of ALIGNMENT and the SYMBOL_REF being naturally
2839 s390_check_symref_alignment (rtx addr
, HOST_WIDE_INT alignment
)
2841 HOST_WIDE_INT addend
;
2844 if (!s390_symref_operand_p (addr
, &symref
, &addend
))
2847 return (!SYMBOL_REF_NOT_NATURALLY_ALIGNED_P (symref
)
2848 && !(addend
& (alignment
- 1)));
2851 /* ADDR is moved into REG using larl. If ADDR isn't a valid larl
2852 operand SCRATCH is used to reload the even part of the address and
2856 s390_reload_larl_operand (rtx reg
, rtx addr
, rtx scratch
)
2858 HOST_WIDE_INT addend
;
2861 if (!s390_symref_operand_p (addr
, &symref
, &addend
))
2865 /* Easy case. The addend is even so larl will do fine. */
2866 emit_move_insn (reg
, addr
);
2869 /* We can leave the scratch register untouched if the target
2870 register is a valid base register. */
2871 if (REGNO (reg
) < FIRST_PSEUDO_REGISTER
2872 && REGNO_REG_CLASS (REGNO (reg
)) == ADDR_REGS
)
2875 gcc_assert (REGNO (scratch
) < FIRST_PSEUDO_REGISTER
);
2876 gcc_assert (REGNO_REG_CLASS (REGNO (scratch
)) == ADDR_REGS
);
2879 emit_move_insn (scratch
,
2880 gen_rtx_CONST (Pmode
,
2881 gen_rtx_PLUS (Pmode
, symref
,
2882 GEN_INT (addend
- 1))));
2884 emit_move_insn (scratch
, symref
);
2886 /* Increment the address using la in order to avoid clobbering cc. */
2887 emit_move_insn (reg
, gen_rtx_PLUS (Pmode
, scratch
, const1_rtx
));
2891 /* Generate what is necessary to move between REG and MEM using
2892 SCRATCH. The direction is given by TOMEM. */
2895 s390_reload_symref_address (rtx reg
, rtx mem
, rtx scratch
, bool tomem
)
2897 /* Reload might have pulled a constant out of the literal pool.
2898 Force it back in. */
2899 if (CONST_INT_P (mem
) || GET_CODE (mem
) == CONST_DOUBLE
2900 || GET_CODE (mem
) == CONST
)
2901 mem
= force_const_mem (GET_MODE (reg
), mem
);
2903 gcc_assert (MEM_P (mem
));
2905 /* For a load from memory we can leave the scratch register
2906 untouched if the target register is a valid base register. */
2908 && REGNO (reg
) < FIRST_PSEUDO_REGISTER
2909 && REGNO_REG_CLASS (REGNO (reg
)) == ADDR_REGS
2910 && GET_MODE (reg
) == GET_MODE (scratch
))
2913 /* Load address into scratch register. Since we can't have a
2914 secondary reload for a secondary reload we have to cover the case
2915 where larl would need a secondary reload here as well. */
2916 s390_reload_larl_operand (scratch
, XEXP (mem
, 0), scratch
);
2918 /* Now we can use a standard load/store to do the move. */
2920 emit_move_insn (replace_equiv_address (mem
, scratch
), reg
);
2922 emit_move_insn (reg
, replace_equiv_address (mem
, scratch
));
2925 /* Inform reload about cases where moving X with a mode MODE to a register in
2926 CLASS requires an extra scratch or immediate register. Return the class
2927 needed for the immediate register. */
2929 static enum reg_class
2930 s390_secondary_reload (bool in_p
, rtx x
, enum reg_class
class,
2931 enum machine_mode mode
, secondary_reload_info
*sri
)
2933 /* Intermediate register needed. */
2934 if (reg_classes_intersect_p (CC_REGS
, class))
2935 return GENERAL_REGS
;
2939 /* On z10 several optimizer steps may generate larl operands with
2942 && s390_symref_operand_p (x
, NULL
, NULL
)
2944 && !s390_check_symref_alignment (x
, 2))
2945 sri
->icode
= ((mode
== DImode
) ? CODE_FOR_reloaddi_larl_odd_addend_z10
2946 : CODE_FOR_reloadsi_larl_odd_addend_z10
);
2948 /* On z10 we need a scratch register when moving QI, TI or floating
2949 point mode values from or to a memory location with a SYMBOL_REF
2950 or if the symref addend of a SI or DI move is not aligned to the
2951 width of the access. */
2953 && s390_symref_operand_p (XEXP (x
, 0), NULL
, NULL
)
2954 && (mode
== QImode
|| mode
== TImode
|| FLOAT_MODE_P (mode
)
2955 || (!TARGET_64BIT
&& mode
== DImode
)
2956 || ((mode
== HImode
|| mode
== SImode
|| mode
== DImode
)
2957 && (!s390_check_symref_alignment (XEXP (x
, 0),
2958 GET_MODE_SIZE (mode
))))))
2960 #define __SECONDARY_RELOAD_CASE(M,m) \
2963 sri->icode = in_p ? CODE_FOR_reload##m##di_toreg_z10 : \
2964 CODE_FOR_reload##m##di_tomem_z10; \
2966 sri->icode = in_p ? CODE_FOR_reload##m##si_toreg_z10 : \
2967 CODE_FOR_reload##m##si_tomem_z10; \
2970 switch (GET_MODE (x
))
2972 __SECONDARY_RELOAD_CASE (QI
, qi
);
2973 __SECONDARY_RELOAD_CASE (HI
, hi
);
2974 __SECONDARY_RELOAD_CASE (SI
, si
);
2975 __SECONDARY_RELOAD_CASE (DI
, di
);
2976 __SECONDARY_RELOAD_CASE (TI
, ti
);
2977 __SECONDARY_RELOAD_CASE (SF
, sf
);
2978 __SECONDARY_RELOAD_CASE (DF
, df
);
2979 __SECONDARY_RELOAD_CASE (TF
, tf
);
2980 __SECONDARY_RELOAD_CASE (SD
, sd
);
2981 __SECONDARY_RELOAD_CASE (DD
, dd
);
2982 __SECONDARY_RELOAD_CASE (TD
, td
);
2987 #undef __SECONDARY_RELOAD_CASE
2991 /* We need a scratch register when loading a PLUS expression which
2992 is not a legitimate operand of the LOAD ADDRESS instruction. */
2993 if (in_p
&& s390_plus_operand (x
, mode
))
2994 sri
->icode
= (TARGET_64BIT
?
2995 CODE_FOR_reloaddi_plus
: CODE_FOR_reloadsi_plus
);
2997 /* Performing a multiword move from or to memory we have to make sure the
2998 second chunk in memory is addressable without causing a displacement
2999 overflow. If that would be the case we calculate the address in
3000 a scratch register. */
3002 && GET_CODE (XEXP (x
, 0)) == PLUS
3003 && GET_CODE (XEXP (XEXP (x
, 0), 1)) == CONST_INT
3004 && !DISP_IN_RANGE (INTVAL (XEXP (XEXP (x
, 0), 1))
3005 + GET_MODE_SIZE (mode
) - 1))
3007 /* For GENERAL_REGS a displacement overflow is no problem if occurring
3008 in a s_operand address since we may fallback to lm/stm. So we only
3009 have to care about overflows in the b+i+d case. */
3010 if ((reg_classes_intersect_p (GENERAL_REGS
, class)
3011 && s390_class_max_nregs (GENERAL_REGS
, mode
) > 1
3012 && GET_CODE (XEXP (XEXP (x
, 0), 0)) == PLUS
)
3013 /* For FP_REGS no lm/stm is available so this check is triggered
3014 for displacement overflows in b+i+d and b+d like addresses. */
3015 || (reg_classes_intersect_p (FP_REGS
, class)
3016 && s390_class_max_nregs (FP_REGS
, mode
) > 1))
3019 sri
->icode
= (TARGET_64BIT
?
3020 CODE_FOR_reloaddi_nonoffmem_in
:
3021 CODE_FOR_reloadsi_nonoffmem_in
);
3023 sri
->icode
= (TARGET_64BIT
?
3024 CODE_FOR_reloaddi_nonoffmem_out
:
3025 CODE_FOR_reloadsi_nonoffmem_out
);
3029 /* Either scratch or no register needed. */
3033 /* Generate code to load SRC, which is PLUS that is not a
3034 legitimate operand for the LA instruction, into TARGET.
3035 SCRATCH may be used as scratch register. */
3038 s390_expand_plus_operand (rtx target
, rtx src
,
3042 struct s390_address ad
;
3044 /* src must be a PLUS; get its two operands. */
3045 gcc_assert (GET_CODE (src
) == PLUS
);
3046 gcc_assert (GET_MODE (src
) == Pmode
);
3048 /* Check if any of the two operands is already scheduled
3049 for replacement by reload. This can happen e.g. when
3050 float registers occur in an address. */
3051 sum1
= find_replacement (&XEXP (src
, 0));
3052 sum2
= find_replacement (&XEXP (src
, 1));
3053 src
= gen_rtx_PLUS (Pmode
, sum1
, sum2
);
3055 /* If the address is already strictly valid, there's nothing to do. */
3056 if (!s390_decompose_address (src
, &ad
)
3057 || (ad
.base
&& !REGNO_OK_FOR_BASE_P (REGNO (ad
.base
)))
3058 || (ad
.indx
&& !REGNO_OK_FOR_INDEX_P (REGNO (ad
.indx
))))
3060 /* Otherwise, one of the operands cannot be an address register;
3061 we reload its value into the scratch register. */
3062 if (true_regnum (sum1
) < 1 || true_regnum (sum1
) > 15)
3064 emit_move_insn (scratch
, sum1
);
3067 if (true_regnum (sum2
) < 1 || true_regnum (sum2
) > 15)
3069 emit_move_insn (scratch
, sum2
);
3073 /* According to the way these invalid addresses are generated
3074 in reload.c, it should never happen (at least on s390) that
3075 *neither* of the PLUS components, after find_replacements
3076 was applied, is an address register. */
3077 if (sum1
== scratch
&& sum2
== scratch
)
3083 src
= gen_rtx_PLUS (Pmode
, sum1
, sum2
);
3086 /* Emit the LOAD ADDRESS pattern. Note that reload of PLUS
3087 is only ever performed on addresses, so we can mark the
3088 sum as legitimate for LA in any case. */
3089 s390_load_address (target
, src
);
3093 /* Return true if ADDR is a valid memory address.
3094 STRICT specifies whether strict register checking applies. */
3097 legitimate_address_p (enum machine_mode mode
, rtx addr
, int strict
)
3099 struct s390_address ad
;
3102 && larl_operand (addr
, VOIDmode
)
3103 && (mode
== VOIDmode
3104 || s390_check_symref_alignment (addr
, GET_MODE_SIZE (mode
))))
3107 if (!s390_decompose_address (addr
, &ad
))
3112 if (ad
.base
&& !REGNO_OK_FOR_BASE_P (REGNO (ad
.base
)))
3115 if (ad
.indx
&& !REGNO_OK_FOR_INDEX_P (REGNO (ad
.indx
)))
3121 && !(REGNO (ad
.base
) >= FIRST_PSEUDO_REGISTER
3122 || REGNO_REG_CLASS (REGNO (ad
.base
)) == ADDR_REGS
))
3126 && !(REGNO (ad
.indx
) >= FIRST_PSEUDO_REGISTER
3127 || REGNO_REG_CLASS (REGNO (ad
.indx
)) == ADDR_REGS
))
3133 /* Return true if OP is a valid operand for the LA instruction.
3134 In 31-bit, we need to prove that the result is used as an
3135 address, as LA performs only a 31-bit addition. */
3138 legitimate_la_operand_p (rtx op
)
3140 struct s390_address addr
;
3141 if (!s390_decompose_address (op
, &addr
))
3144 return (TARGET_64BIT
|| addr
.pointer
);
3147 /* Return true if it is valid *and* preferable to use LA to
3148 compute the sum of OP1 and OP2. */
3151 preferred_la_operand_p (rtx op1
, rtx op2
)
3153 struct s390_address addr
;
3155 if (op2
!= const0_rtx
)
3156 op1
= gen_rtx_PLUS (Pmode
, op1
, op2
);
3158 if (!s390_decompose_address (op1
, &addr
))
3160 if (addr
.base
&& !REGNO_OK_FOR_BASE_P (REGNO (addr
.base
)))
3162 if (addr
.indx
&& !REGNO_OK_FOR_INDEX_P (REGNO (addr
.indx
)))
3165 if (!TARGET_64BIT
&& !addr
.pointer
)
3171 if ((addr
.base
&& REG_P (addr
.base
) && REG_POINTER (addr
.base
))
3172 || (addr
.indx
&& REG_P (addr
.indx
) && REG_POINTER (addr
.indx
)))
3178 /* Emit a forced load-address operation to load SRC into DST.
3179 This will use the LOAD ADDRESS instruction even in situations
3180 where legitimate_la_operand_p (SRC) returns false. */
3183 s390_load_address (rtx dst
, rtx src
)
3186 emit_move_insn (dst
, src
);
3188 emit_insn (gen_force_la_31 (dst
, src
));
3191 /* Return a legitimate reference for ORIG (an address) using the
3192 register REG. If REG is 0, a new pseudo is generated.
3194 There are two types of references that must be handled:
3196 1. Global data references must load the address from the GOT, via
3197 the PIC reg. An insn is emitted to do this load, and the reg is
3200 2. Static data references, constant pool addresses, and code labels
3201 compute the address as an offset from the GOT, whose base is in
3202 the PIC reg. Static data objects have SYMBOL_FLAG_LOCAL set to
3203 differentiate them from global data objects. The returned
3204 address is the PIC reg + an unspec constant.
3206 GO_IF_LEGITIMATE_ADDRESS rejects symbolic references unless the PIC
3207 reg also appears in the address. */
3210 legitimize_pic_address (rtx orig
, rtx reg
)
3216 gcc_assert (!TLS_SYMBOLIC_CONST (addr
));
3218 if (GET_CODE (addr
) == LABEL_REF
3219 || (GET_CODE (addr
) == SYMBOL_REF
&& SYMBOL_REF_LOCAL_P (addr
)))
3221 /* This is a local symbol. */
3222 if (TARGET_CPU_ZARCH
&& larl_operand (addr
, VOIDmode
))
3224 /* Access local symbols PC-relative via LARL.
3225 This is the same as in the non-PIC case, so it is
3226 handled automatically ... */
3230 /* Access local symbols relative to the GOT. */
3232 rtx temp
= reg
? reg
: gen_reg_rtx (Pmode
);
3234 if (reload_in_progress
|| reload_completed
)
3235 df_set_regs_ever_live (PIC_OFFSET_TABLE_REGNUM
, true);
3237 addr
= gen_rtx_UNSPEC (Pmode
, gen_rtvec (1, addr
), UNSPEC_GOTOFF
);
3238 addr
= gen_rtx_CONST (Pmode
, addr
);
3239 addr
= force_const_mem (Pmode
, addr
);
3240 emit_move_insn (temp
, addr
);
3242 new = gen_rtx_PLUS (Pmode
, pic_offset_table_rtx
, temp
);
3245 s390_load_address (reg
, new);
3250 else if (GET_CODE (addr
) == SYMBOL_REF
)
3253 reg
= gen_reg_rtx (Pmode
);
3257 /* Assume GOT offset < 4k. This is handled the same way
3258 in both 31- and 64-bit code (@GOT). */
3260 if (reload_in_progress
|| reload_completed
)
3261 df_set_regs_ever_live (PIC_OFFSET_TABLE_REGNUM
, true);
3263 new = gen_rtx_UNSPEC (Pmode
, gen_rtvec (1, addr
), UNSPEC_GOT
);
3264 new = gen_rtx_CONST (Pmode
, new);
3265 new = gen_rtx_PLUS (Pmode
, pic_offset_table_rtx
, new);
3266 new = gen_const_mem (Pmode
, new);
3267 emit_move_insn (reg
, new);
3270 else if (TARGET_CPU_ZARCH
)
3272 /* If the GOT offset might be >= 4k, we determine the position
3273 of the GOT entry via a PC-relative LARL (@GOTENT). */
3275 rtx temp
= gen_reg_rtx (Pmode
);
3277 new = gen_rtx_UNSPEC (Pmode
, gen_rtvec (1, addr
), UNSPEC_GOTENT
);
3278 new = gen_rtx_CONST (Pmode
, new);
3279 emit_move_insn (temp
, new);
3281 new = gen_const_mem (Pmode
, temp
);
3282 emit_move_insn (reg
, new);
3287 /* If the GOT offset might be >= 4k, we have to load it
3288 from the literal pool (@GOT). */
3290 rtx temp
= gen_reg_rtx (Pmode
);
3292 if (reload_in_progress
|| reload_completed
)
3293 df_set_regs_ever_live (PIC_OFFSET_TABLE_REGNUM
, true);
3295 addr
= gen_rtx_UNSPEC (Pmode
, gen_rtvec (1, addr
), UNSPEC_GOT
);
3296 addr
= gen_rtx_CONST (Pmode
, addr
);
3297 addr
= force_const_mem (Pmode
, addr
);
3298 emit_move_insn (temp
, addr
);
3300 new = gen_rtx_PLUS (Pmode
, pic_offset_table_rtx
, temp
);
3301 new = gen_const_mem (Pmode
, new);
3302 emit_move_insn (reg
, new);
3308 if (GET_CODE (addr
) == CONST
)
3310 addr
= XEXP (addr
, 0);
3311 if (GET_CODE (addr
) == UNSPEC
)
3313 gcc_assert (XVECLEN (addr
, 0) == 1);
3314 switch (XINT (addr
, 1))
3316 /* If someone moved a GOT-relative UNSPEC
3317 out of the literal pool, force them back in. */
3320 new = force_const_mem (Pmode
, orig
);
3323 /* @GOT is OK as is if small. */
3326 new = force_const_mem (Pmode
, orig
);
3329 /* @GOTENT is OK as is. */
3333 /* @PLT is OK as is on 64-bit, must be converted to
3334 GOT-relative @PLTOFF on 31-bit. */
3336 if (!TARGET_CPU_ZARCH
)
3338 rtx temp
= reg
? reg
: gen_reg_rtx (Pmode
);
3340 if (reload_in_progress
|| reload_completed
)
3341 df_set_regs_ever_live (PIC_OFFSET_TABLE_REGNUM
, true);
3343 addr
= XVECEXP (addr
, 0, 0);
3344 addr
= gen_rtx_UNSPEC (Pmode
, gen_rtvec (1, addr
),
3346 addr
= gen_rtx_CONST (Pmode
, addr
);
3347 addr
= force_const_mem (Pmode
, addr
);
3348 emit_move_insn (temp
, addr
);
3350 new = gen_rtx_PLUS (Pmode
, pic_offset_table_rtx
, temp
);
3353 s390_load_address (reg
, new);
3359 /* Everything else cannot happen. */
3365 gcc_assert (GET_CODE (addr
) == PLUS
);
3367 if (GET_CODE (addr
) == PLUS
)
3369 rtx op0
= XEXP (addr
, 0), op1
= XEXP (addr
, 1);
3371 gcc_assert (!TLS_SYMBOLIC_CONST (op0
));
3372 gcc_assert (!TLS_SYMBOLIC_CONST (op1
));
3374 /* Check first to see if this is a constant offset
3375 from a local symbol reference. */
3376 if ((GET_CODE (op0
) == LABEL_REF
3377 || (GET_CODE (op0
) == SYMBOL_REF
&& SYMBOL_REF_LOCAL_P (op0
)))
3378 && GET_CODE (op1
) == CONST_INT
)
3380 if (TARGET_CPU_ZARCH
3381 && larl_operand (op0
, VOIDmode
)
3382 && INTVAL (op1
) < (HOST_WIDE_INT
)1 << 31
3383 && INTVAL (op1
) >= -((HOST_WIDE_INT
)1 << 31))
3385 if (INTVAL (op1
) & 1)
3387 /* LARL can't handle odd offsets, so emit a
3388 pair of LARL and LA. */
3389 rtx temp
= reg
? reg
: gen_reg_rtx (Pmode
);
3391 if (!DISP_IN_RANGE (INTVAL (op1
)))
3393 HOST_WIDE_INT even
= INTVAL (op1
) - 1;
3394 op0
= gen_rtx_PLUS (Pmode
, op0
, GEN_INT (even
));
3395 op0
= gen_rtx_CONST (Pmode
, op0
);
3399 emit_move_insn (temp
, op0
);
3400 new = gen_rtx_PLUS (Pmode
, temp
, op1
);
3404 s390_load_address (reg
, new);
3410 /* If the offset is even, we can just use LARL.
3411 This will happen automatically. */
3416 /* Access local symbols relative to the GOT. */
3418 rtx temp
= reg
? reg
: gen_reg_rtx (Pmode
);
3420 if (reload_in_progress
|| reload_completed
)
3421 df_set_regs_ever_live (PIC_OFFSET_TABLE_REGNUM
, true);
3423 addr
= gen_rtx_UNSPEC (Pmode
, gen_rtvec (1, op0
),
3425 addr
= gen_rtx_PLUS (Pmode
, addr
, op1
);
3426 addr
= gen_rtx_CONST (Pmode
, addr
);
3427 addr
= force_const_mem (Pmode
, addr
);
3428 emit_move_insn (temp
, addr
);
3430 new = gen_rtx_PLUS (Pmode
, pic_offset_table_rtx
, temp
);
3433 s390_load_address (reg
, new);
3439 /* Now, check whether it is a GOT relative symbol plus offset
3440 that was pulled out of the literal pool. Force it back in. */
3442 else if (GET_CODE (op0
) == UNSPEC
3443 && GET_CODE (op1
) == CONST_INT
3444 && XINT (op0
, 1) == UNSPEC_GOTOFF
)
3446 gcc_assert (XVECLEN (op0
, 0) == 1);
3448 new = force_const_mem (Pmode
, orig
);
3451 /* Otherwise, compute the sum. */
3454 base
= legitimize_pic_address (XEXP (addr
, 0), reg
);
3455 new = legitimize_pic_address (XEXP (addr
, 1),
3456 base
== reg
? NULL_RTX
: reg
);
3457 if (GET_CODE (new) == CONST_INT
)
3458 new = plus_constant (base
, INTVAL (new));
3461 if (GET_CODE (new) == PLUS
&& CONSTANT_P (XEXP (new, 1)))
3463 base
= gen_rtx_PLUS (Pmode
, base
, XEXP (new, 0));
3464 new = XEXP (new, 1);
3466 new = gen_rtx_PLUS (Pmode
, base
, new);
3469 if (GET_CODE (new) == CONST
)
3470 new = XEXP (new, 0);
3471 new = force_operand (new, 0);
3478 /* Load the thread pointer into a register. */
3481 s390_get_thread_pointer (void)
3483 rtx tp
= gen_reg_rtx (Pmode
);
3485 emit_move_insn (tp
, gen_rtx_REG (Pmode
, TP_REGNUM
));
3486 mark_reg_pointer (tp
, BITS_PER_WORD
);
3491 /* Emit a tls call insn. The call target is the SYMBOL_REF stored
3492 in s390_tls_symbol which always refers to __tls_get_offset.
3493 The returned offset is written to RESULT_REG and an USE rtx is
3494 generated for TLS_CALL. */
3496 static GTY(()) rtx s390_tls_symbol
;
3499 s390_emit_tls_call_insn (rtx result_reg
, rtx tls_call
)
3503 gcc_assert (flag_pic
);
3505 if (!s390_tls_symbol
)
3506 s390_tls_symbol
= gen_rtx_SYMBOL_REF (Pmode
, "__tls_get_offset");
3508 insn
= s390_emit_call (s390_tls_symbol
, tls_call
, result_reg
,
3509 gen_rtx_REG (Pmode
, RETURN_REGNUM
));
3511 use_reg (&CALL_INSN_FUNCTION_USAGE (insn
), result_reg
);
3512 RTL_CONST_CALL_P (insn
) = 1;
3515 /* ADDR contains a thread-local SYMBOL_REF. Generate code to compute
3516 this (thread-local) address. REG may be used as temporary. */
3519 legitimize_tls_address (rtx addr
, rtx reg
)
3521 rtx
new, tls_call
, temp
, base
, r2
, insn
;
3523 if (GET_CODE (addr
) == SYMBOL_REF
)
3524 switch (tls_symbolic_operand (addr
))
3526 case TLS_MODEL_GLOBAL_DYNAMIC
:
3528 r2
= gen_rtx_REG (Pmode
, 2);
3529 tls_call
= gen_rtx_UNSPEC (Pmode
, gen_rtvec (1, addr
), UNSPEC_TLSGD
);
3530 new = gen_rtx_CONST (Pmode
, tls_call
);
3531 new = force_const_mem (Pmode
, new);
3532 emit_move_insn (r2
, new);
3533 s390_emit_tls_call_insn (r2
, tls_call
);
3534 insn
= get_insns ();
3537 new = gen_rtx_UNSPEC (Pmode
, gen_rtvec (1, addr
), UNSPEC_NTPOFF
);
3538 temp
= gen_reg_rtx (Pmode
);
3539 emit_libcall_block (insn
, temp
, r2
, new);
3541 new = gen_rtx_PLUS (Pmode
, s390_get_thread_pointer (), temp
);
3544 s390_load_address (reg
, new);
3549 case TLS_MODEL_LOCAL_DYNAMIC
:
3551 r2
= gen_rtx_REG (Pmode
, 2);
3552 tls_call
= gen_rtx_UNSPEC (Pmode
, gen_rtvec (1, const0_rtx
), UNSPEC_TLSLDM
);
3553 new = gen_rtx_CONST (Pmode
, tls_call
);
3554 new = force_const_mem (Pmode
, new);
3555 emit_move_insn (r2
, new);
3556 s390_emit_tls_call_insn (r2
, tls_call
);
3557 insn
= get_insns ();
3560 new = gen_rtx_UNSPEC (Pmode
, gen_rtvec (1, const0_rtx
), UNSPEC_TLSLDM_NTPOFF
);
3561 temp
= gen_reg_rtx (Pmode
);
3562 emit_libcall_block (insn
, temp
, r2
, new);
3564 new = gen_rtx_PLUS (Pmode
, s390_get_thread_pointer (), temp
);
3565 base
= gen_reg_rtx (Pmode
);
3566 s390_load_address (base
, new);
3568 new = gen_rtx_UNSPEC (Pmode
, gen_rtvec (1, addr
), UNSPEC_DTPOFF
);
3569 new = gen_rtx_CONST (Pmode
, new);
3570 new = force_const_mem (Pmode
, new);
3571 temp
= gen_reg_rtx (Pmode
);
3572 emit_move_insn (temp
, new);
3574 new = gen_rtx_PLUS (Pmode
, base
, temp
);
3577 s390_load_address (reg
, new);
3582 case TLS_MODEL_INITIAL_EXEC
:
3585 /* Assume GOT offset < 4k. This is handled the same way
3586 in both 31- and 64-bit code. */
3588 if (reload_in_progress
|| reload_completed
)
3589 df_set_regs_ever_live (PIC_OFFSET_TABLE_REGNUM
, true);
3591 new = gen_rtx_UNSPEC (Pmode
, gen_rtvec (1, addr
), UNSPEC_GOTNTPOFF
);
3592 new = gen_rtx_CONST (Pmode
, new);
3593 new = gen_rtx_PLUS (Pmode
, pic_offset_table_rtx
, new);
3594 new = gen_const_mem (Pmode
, new);
3595 temp
= gen_reg_rtx (Pmode
);
3596 emit_move_insn (temp
, new);
3598 else if (TARGET_CPU_ZARCH
)
3600 /* If the GOT offset might be >= 4k, we determine the position
3601 of the GOT entry via a PC-relative LARL. */
3603 new = gen_rtx_UNSPEC (Pmode
, gen_rtvec (1, addr
), UNSPEC_INDNTPOFF
);
3604 new = gen_rtx_CONST (Pmode
, new);
3605 temp
= gen_reg_rtx (Pmode
);
3606 emit_move_insn (temp
, new);
3608 new = gen_const_mem (Pmode
, temp
);
3609 temp
= gen_reg_rtx (Pmode
);
3610 emit_move_insn (temp
, new);
3614 /* If the GOT offset might be >= 4k, we have to load it
3615 from the literal pool. */
3617 if (reload_in_progress
|| reload_completed
)
3618 df_set_regs_ever_live (PIC_OFFSET_TABLE_REGNUM
, true);
3620 new = gen_rtx_UNSPEC (Pmode
, gen_rtvec (1, addr
), UNSPEC_GOTNTPOFF
);
3621 new = gen_rtx_CONST (Pmode
, new);
3622 new = force_const_mem (Pmode
, new);
3623 temp
= gen_reg_rtx (Pmode
);
3624 emit_move_insn (temp
, new);
3626 new = gen_rtx_PLUS (Pmode
, pic_offset_table_rtx
, temp
);
3627 new = gen_const_mem (Pmode
, new);
3629 new = gen_rtx_UNSPEC (Pmode
, gen_rtvec (2, new, addr
), UNSPEC_TLS_LOAD
);
3630 temp
= gen_reg_rtx (Pmode
);
3631 emit_insn (gen_rtx_SET (Pmode
, temp
, new));
3635 /* In position-dependent code, load the absolute address of
3636 the GOT entry from the literal pool. */
3638 new = gen_rtx_UNSPEC (Pmode
, gen_rtvec (1, addr
), UNSPEC_INDNTPOFF
);
3639 new = gen_rtx_CONST (Pmode
, new);
3640 new = force_const_mem (Pmode
, new);
3641 temp
= gen_reg_rtx (Pmode
);
3642 emit_move_insn (temp
, new);
3645 new = gen_const_mem (Pmode
, new);
3646 new = gen_rtx_UNSPEC (Pmode
, gen_rtvec (2, new, addr
), UNSPEC_TLS_LOAD
);
3647 temp
= gen_reg_rtx (Pmode
);
3648 emit_insn (gen_rtx_SET (Pmode
, temp
, new));
3651 new = gen_rtx_PLUS (Pmode
, s390_get_thread_pointer (), temp
);
3654 s390_load_address (reg
, new);
3659 case TLS_MODEL_LOCAL_EXEC
:
3660 new = gen_rtx_UNSPEC (Pmode
, gen_rtvec (1, addr
), UNSPEC_NTPOFF
);
3661 new = gen_rtx_CONST (Pmode
, new);
3662 new = force_const_mem (Pmode
, new);
3663 temp
= gen_reg_rtx (Pmode
);
3664 emit_move_insn (temp
, new);
3666 new = gen_rtx_PLUS (Pmode
, s390_get_thread_pointer (), temp
);
3669 s390_load_address (reg
, new);
3678 else if (GET_CODE (addr
) == CONST
&& GET_CODE (XEXP (addr
, 0)) == UNSPEC
)
3680 switch (XINT (XEXP (addr
, 0), 1))
3682 case UNSPEC_INDNTPOFF
:
3683 gcc_assert (TARGET_CPU_ZARCH
);
3692 else if (GET_CODE (addr
) == CONST
&& GET_CODE (XEXP (addr
, 0)) == PLUS
3693 && GET_CODE (XEXP (XEXP (addr
, 0), 1)) == CONST_INT
)
3695 new = XEXP (XEXP (addr
, 0), 0);
3696 if (GET_CODE (new) != SYMBOL_REF
)
3697 new = gen_rtx_CONST (Pmode
, new);
3699 new = legitimize_tls_address (new, reg
);
3700 new = plus_constant (new, INTVAL (XEXP (XEXP (addr
, 0), 1)));
3701 new = force_operand (new, 0);
3705 gcc_unreachable (); /* for now ... */
3710 /* Emit insns to move operands[1] into operands[0]. */
3713 emit_symbolic_move (rtx
*operands
)
3715 rtx temp
= !can_create_pseudo_p () ? operands
[0] : gen_reg_rtx (Pmode
);
3717 if (GET_CODE (operands
[0]) == MEM
)
3718 operands
[1] = force_reg (Pmode
, operands
[1]);
3719 else if (TLS_SYMBOLIC_CONST (operands
[1]))
3720 operands
[1] = legitimize_tls_address (operands
[1], temp
);
3722 operands
[1] = legitimize_pic_address (operands
[1], temp
);
3725 /* Try machine-dependent ways of modifying an illegitimate address X
3726 to be legitimate. If we find one, return the new, valid address.
3728 OLDX is the address as it was before break_out_memory_refs was called.
3729 In some cases it is useful to look at this to decide what needs to be done.
3731 MODE is the mode of the operand pointed to by X.
3733 When -fpic is used, special handling is needed for symbolic references.
3734 See comments by legitimize_pic_address for details. */
3737 legitimize_address (rtx x
, rtx oldx ATTRIBUTE_UNUSED
,
3738 enum machine_mode mode ATTRIBUTE_UNUSED
)
3740 rtx constant_term
= const0_rtx
;
3742 if (TLS_SYMBOLIC_CONST (x
))
3744 x
= legitimize_tls_address (x
, 0);
3746 if (legitimate_address_p (mode
, x
, FALSE
))
3749 else if (GET_CODE (x
) == PLUS
3750 && (TLS_SYMBOLIC_CONST (XEXP (x
, 0))
3751 || TLS_SYMBOLIC_CONST (XEXP (x
, 1))))
3757 if (SYMBOLIC_CONST (x
)
3758 || (GET_CODE (x
) == PLUS
3759 && (SYMBOLIC_CONST (XEXP (x
, 0))
3760 || SYMBOLIC_CONST (XEXP (x
, 1)))))
3761 x
= legitimize_pic_address (x
, 0);
3763 if (legitimate_address_p (mode
, x
, FALSE
))
3767 x
= eliminate_constant_term (x
, &constant_term
);
3769 /* Optimize loading of large displacements by splitting them
3770 into the multiple of 4K and the rest; this allows the
3771 former to be CSE'd if possible.
3773 Don't do this if the displacement is added to a register
3774 pointing into the stack frame, as the offsets will
3775 change later anyway. */
3777 if (GET_CODE (constant_term
) == CONST_INT
3778 && !TARGET_LONG_DISPLACEMENT
3779 && !DISP_IN_RANGE (INTVAL (constant_term
))
3780 && !(REG_P (x
) && REGNO_PTR_FRAME_P (REGNO (x
))))
3782 HOST_WIDE_INT lower
= INTVAL (constant_term
) & 0xfff;
3783 HOST_WIDE_INT upper
= INTVAL (constant_term
) ^ lower
;
3785 rtx temp
= gen_reg_rtx (Pmode
);
3786 rtx val
= force_operand (GEN_INT (upper
), temp
);
3788 emit_move_insn (temp
, val
);
3790 x
= gen_rtx_PLUS (Pmode
, x
, temp
);
3791 constant_term
= GEN_INT (lower
);
3794 if (GET_CODE (x
) == PLUS
)
3796 if (GET_CODE (XEXP (x
, 0)) == REG
)
3798 rtx temp
= gen_reg_rtx (Pmode
);
3799 rtx val
= force_operand (XEXP (x
, 1), temp
);
3801 emit_move_insn (temp
, val
);
3803 x
= gen_rtx_PLUS (Pmode
, XEXP (x
, 0), temp
);
3806 else if (GET_CODE (XEXP (x
, 1)) == REG
)
3808 rtx temp
= gen_reg_rtx (Pmode
);
3809 rtx val
= force_operand (XEXP (x
, 0), temp
);
3811 emit_move_insn (temp
, val
);
3813 x
= gen_rtx_PLUS (Pmode
, temp
, XEXP (x
, 1));
3817 if (constant_term
!= const0_rtx
)
3818 x
= gen_rtx_PLUS (Pmode
, x
, constant_term
);
3823 /* Try a machine-dependent way of reloading an illegitimate address AD
3824 operand. If we find one, push the reload and and return the new address.
3826 MODE is the mode of the enclosing MEM. OPNUM is the operand number
3827 and TYPE is the reload type of the current reload. */
3830 legitimize_reload_address (rtx ad
, enum machine_mode mode ATTRIBUTE_UNUSED
,
3831 int opnum
, int type
)
3833 if (!optimize
|| TARGET_LONG_DISPLACEMENT
)
3836 if (GET_CODE (ad
) == PLUS
)
3838 rtx tem
= simplify_binary_operation (PLUS
, Pmode
,
3839 XEXP (ad
, 0), XEXP (ad
, 1));
3844 if (GET_CODE (ad
) == PLUS
3845 && GET_CODE (XEXP (ad
, 0)) == REG
3846 && GET_CODE (XEXP (ad
, 1)) == CONST_INT
3847 && !DISP_IN_RANGE (INTVAL (XEXP (ad
, 1))))
3849 HOST_WIDE_INT lower
= INTVAL (XEXP (ad
, 1)) & 0xfff;
3850 HOST_WIDE_INT upper
= INTVAL (XEXP (ad
, 1)) ^ lower
;
3853 cst
= GEN_INT (upper
);
3854 if (!legitimate_reload_constant_p (cst
))
3855 cst
= force_const_mem (Pmode
, cst
);
3857 tem
= gen_rtx_PLUS (Pmode
, XEXP (ad
, 0), cst
);
3858 new = gen_rtx_PLUS (Pmode
, tem
, GEN_INT (lower
));
3860 push_reload (XEXP (tem
, 1), 0, &XEXP (tem
, 1), 0,
3861 BASE_REG_CLASS
, Pmode
, VOIDmode
, 0, 0,
3862 opnum
, (enum reload_type
) type
);
3869 /* Emit code to move LEN bytes from DST to SRC. */
3872 s390_expand_movmem (rtx dst
, rtx src
, rtx len
)
3874 if (GET_CODE (len
) == CONST_INT
&& INTVAL (len
) >= 0 && INTVAL (len
) <= 256)
3876 if (INTVAL (len
) > 0)
3877 emit_insn (gen_movmem_short (dst
, src
, GEN_INT (INTVAL (len
) - 1)));
3880 else if (TARGET_MVCLE
)
3882 emit_insn (gen_movmem_long (dst
, src
, convert_to_mode (Pmode
, len
, 1)));
3887 rtx dst_addr
, src_addr
, count
, blocks
, temp
;
3888 rtx loop_start_label
= gen_label_rtx ();
3889 rtx loop_end_label
= gen_label_rtx ();
3890 rtx end_label
= gen_label_rtx ();
3891 enum machine_mode mode
;
3893 mode
= GET_MODE (len
);
3894 if (mode
== VOIDmode
)
3897 dst_addr
= gen_reg_rtx (Pmode
);
3898 src_addr
= gen_reg_rtx (Pmode
);
3899 count
= gen_reg_rtx (mode
);
3900 blocks
= gen_reg_rtx (mode
);
3902 convert_move (count
, len
, 1);
3903 emit_cmp_and_jump_insns (count
, const0_rtx
,
3904 EQ
, NULL_RTX
, mode
, 1, end_label
);
3906 emit_move_insn (dst_addr
, force_operand (XEXP (dst
, 0), NULL_RTX
));
3907 emit_move_insn (src_addr
, force_operand (XEXP (src
, 0), NULL_RTX
));
3908 dst
= change_address (dst
, VOIDmode
, dst_addr
);
3909 src
= change_address (src
, VOIDmode
, src_addr
);
3911 temp
= expand_binop (mode
, add_optab
, count
, constm1_rtx
, count
, 1, 0);
3913 emit_move_insn (count
, temp
);
3915 temp
= expand_binop (mode
, lshr_optab
, count
, GEN_INT (8), blocks
, 1, 0);
3917 emit_move_insn (blocks
, temp
);
3919 emit_cmp_and_jump_insns (blocks
, const0_rtx
,
3920 EQ
, NULL_RTX
, mode
, 1, loop_end_label
);
3922 emit_label (loop_start_label
);
3924 emit_insn (gen_movmem_short (dst
, src
, GEN_INT (255)));
3925 s390_load_address (dst_addr
,
3926 gen_rtx_PLUS (Pmode
, dst_addr
, GEN_INT (256)));
3927 s390_load_address (src_addr
,
3928 gen_rtx_PLUS (Pmode
, src_addr
, GEN_INT (256)));
3930 temp
= expand_binop (mode
, add_optab
, blocks
, constm1_rtx
, blocks
, 1, 0);
3932 emit_move_insn (blocks
, temp
);
3934 emit_cmp_and_jump_insns (blocks
, const0_rtx
,
3935 EQ
, NULL_RTX
, mode
, 1, loop_end_label
);
3937 emit_jump (loop_start_label
);
3938 emit_label (loop_end_label
);
3940 emit_insn (gen_movmem_short (dst
, src
,
3941 convert_to_mode (Pmode
, count
, 1)));
3942 emit_label (end_label
);
3946 /* Emit code to set LEN bytes at DST to VAL.
3947 Make use of clrmem if VAL is zero. */
3950 s390_expand_setmem (rtx dst
, rtx len
, rtx val
)
3952 if (GET_CODE (len
) == CONST_INT
&& INTVAL (len
) == 0)
3955 gcc_assert (GET_CODE (val
) == CONST_INT
|| GET_MODE (val
) == QImode
);
3957 if (GET_CODE (len
) == CONST_INT
&& INTVAL (len
) > 0 && INTVAL (len
) <= 257)
3959 if (val
== const0_rtx
&& INTVAL (len
) <= 256)
3960 emit_insn (gen_clrmem_short (dst
, GEN_INT (INTVAL (len
) - 1)));
3963 /* Initialize memory by storing the first byte. */
3964 emit_move_insn (adjust_address (dst
, QImode
, 0), val
);
3966 if (INTVAL (len
) > 1)
3968 /* Initiate 1 byte overlap move.
3969 The first byte of DST is propagated through DSTP1.
3970 Prepare a movmem for: DST+1 = DST (length = LEN - 1).
3971 DST is set to size 1 so the rest of the memory location
3972 does not count as source operand. */
3973 rtx dstp1
= adjust_address (dst
, VOIDmode
, 1);
3974 set_mem_size (dst
, const1_rtx
);
3976 emit_insn (gen_movmem_short (dstp1
, dst
,
3977 GEN_INT (INTVAL (len
) - 2)));
3982 else if (TARGET_MVCLE
)
3984 val
= force_not_mem (convert_modes (Pmode
, QImode
, val
, 1));
3985 emit_insn (gen_setmem_long (dst
, convert_to_mode (Pmode
, len
, 1), val
));
3990 rtx dst_addr
, src_addr
, count
, blocks
, temp
, dstp1
= NULL_RTX
;
3991 rtx loop_start_label
= gen_label_rtx ();
3992 rtx loop_end_label
= gen_label_rtx ();
3993 rtx end_label
= gen_label_rtx ();
3994 enum machine_mode mode
;
3996 mode
= GET_MODE (len
);
3997 if (mode
== VOIDmode
)
4000 dst_addr
= gen_reg_rtx (Pmode
);
4001 src_addr
= gen_reg_rtx (Pmode
);
4002 count
= gen_reg_rtx (mode
);
4003 blocks
= gen_reg_rtx (mode
);
4005 convert_move (count
, len
, 1);
4006 emit_cmp_and_jump_insns (count
, const0_rtx
,
4007 EQ
, NULL_RTX
, mode
, 1, end_label
);
4009 emit_move_insn (dst_addr
, force_operand (XEXP (dst
, 0), NULL_RTX
));
4010 dst
= change_address (dst
, VOIDmode
, dst_addr
);
4012 if (val
== const0_rtx
)
4013 temp
= expand_binop (mode
, add_optab
, count
, constm1_rtx
, count
, 1, 0);
4016 dstp1
= adjust_address (dst
, VOIDmode
, 1);
4017 set_mem_size (dst
, const1_rtx
);
4019 /* Initialize memory by storing the first byte. */
4020 emit_move_insn (adjust_address (dst
, QImode
, 0), val
);
4022 /* If count is 1 we are done. */
4023 emit_cmp_and_jump_insns (count
, const1_rtx
,
4024 EQ
, NULL_RTX
, mode
, 1, end_label
);
4026 temp
= expand_binop (mode
, add_optab
, count
, GEN_INT (-2), count
, 1, 0);
4029 emit_move_insn (count
, temp
);
4031 temp
= expand_binop (mode
, lshr_optab
, count
, GEN_INT (8), blocks
, 1, 0);
4033 emit_move_insn (blocks
, temp
);
4035 emit_cmp_and_jump_insns (blocks
, const0_rtx
,
4036 EQ
, NULL_RTX
, mode
, 1, loop_end_label
);
4038 emit_label (loop_start_label
);
4040 if (val
== const0_rtx
)
4041 emit_insn (gen_clrmem_short (dst
, GEN_INT (255)));
4043 emit_insn (gen_movmem_short (dstp1
, dst
, GEN_INT (255)));
4044 s390_load_address (dst_addr
,
4045 gen_rtx_PLUS (Pmode
, dst_addr
, GEN_INT (256)));
4047 temp
= expand_binop (mode
, add_optab
, blocks
, constm1_rtx
, blocks
, 1, 0);
4049 emit_move_insn (blocks
, temp
);
4051 emit_cmp_and_jump_insns (blocks
, const0_rtx
,
4052 EQ
, NULL_RTX
, mode
, 1, loop_end_label
);
4054 emit_jump (loop_start_label
);
4055 emit_label (loop_end_label
);
4057 if (val
== const0_rtx
)
4058 emit_insn (gen_clrmem_short (dst
, convert_to_mode (Pmode
, count
, 1)));
4060 emit_insn (gen_movmem_short (dstp1
, dst
, convert_to_mode (Pmode
, count
, 1)));
4061 emit_label (end_label
);
4065 /* Emit code to compare LEN bytes at OP0 with those at OP1,
4066 and return the result in TARGET. */
4069 s390_expand_cmpmem (rtx target
, rtx op0
, rtx op1
, rtx len
)
4071 rtx ccreg
= gen_rtx_REG (CCUmode
, CC_REGNUM
);
4074 /* As the result of CMPINT is inverted compared to what we need,
4075 we have to swap the operands. */
4076 tmp
= op0
; op0
= op1
; op1
= tmp
;
4078 if (GET_CODE (len
) == CONST_INT
&& INTVAL (len
) >= 0 && INTVAL (len
) <= 256)
4080 if (INTVAL (len
) > 0)
4082 emit_insn (gen_cmpmem_short (op0
, op1
, GEN_INT (INTVAL (len
) - 1)));
4083 emit_insn (gen_cmpint (target
, ccreg
));
4086 emit_move_insn (target
, const0_rtx
);
4088 else if (TARGET_MVCLE
)
4090 emit_insn (gen_cmpmem_long (op0
, op1
, convert_to_mode (Pmode
, len
, 1)));
4091 emit_insn (gen_cmpint (target
, ccreg
));
4095 rtx addr0
, addr1
, count
, blocks
, temp
;
4096 rtx loop_start_label
= gen_label_rtx ();
4097 rtx loop_end_label
= gen_label_rtx ();
4098 rtx end_label
= gen_label_rtx ();
4099 enum machine_mode mode
;
4101 mode
= GET_MODE (len
);
4102 if (mode
== VOIDmode
)
4105 addr0
= gen_reg_rtx (Pmode
);
4106 addr1
= gen_reg_rtx (Pmode
);
4107 count
= gen_reg_rtx (mode
);
4108 blocks
= gen_reg_rtx (mode
);
4110 convert_move (count
, len
, 1);
4111 emit_cmp_and_jump_insns (count
, const0_rtx
,
4112 EQ
, NULL_RTX
, mode
, 1, end_label
);
4114 emit_move_insn (addr0
, force_operand (XEXP (op0
, 0), NULL_RTX
));
4115 emit_move_insn (addr1
, force_operand (XEXP (op1
, 0), NULL_RTX
));
4116 op0
= change_address (op0
, VOIDmode
, addr0
);
4117 op1
= change_address (op1
, VOIDmode
, addr1
);
4119 temp
= expand_binop (mode
, add_optab
, count
, constm1_rtx
, count
, 1, 0);
4121 emit_move_insn (count
, temp
);
4123 temp
= expand_binop (mode
, lshr_optab
, count
, GEN_INT (8), blocks
, 1, 0);
4125 emit_move_insn (blocks
, temp
);
4127 emit_cmp_and_jump_insns (blocks
, const0_rtx
,
4128 EQ
, NULL_RTX
, mode
, 1, loop_end_label
);
4130 emit_label (loop_start_label
);
4132 emit_insn (gen_cmpmem_short (op0
, op1
, GEN_INT (255)));
4133 temp
= gen_rtx_NE (VOIDmode
, ccreg
, const0_rtx
);
4134 temp
= gen_rtx_IF_THEN_ELSE (VOIDmode
, temp
,
4135 gen_rtx_LABEL_REF (VOIDmode
, end_label
), pc_rtx
);
4136 temp
= gen_rtx_SET (VOIDmode
, pc_rtx
, temp
);
4137 emit_jump_insn (temp
);
4139 s390_load_address (addr0
,
4140 gen_rtx_PLUS (Pmode
, addr0
, GEN_INT (256)));
4141 s390_load_address (addr1
,
4142 gen_rtx_PLUS (Pmode
, addr1
, GEN_INT (256)));
4144 temp
= expand_binop (mode
, add_optab
, blocks
, constm1_rtx
, blocks
, 1, 0);
4146 emit_move_insn (blocks
, temp
);
4148 emit_cmp_and_jump_insns (blocks
, const0_rtx
,
4149 EQ
, NULL_RTX
, mode
, 1, loop_end_label
);
4151 emit_jump (loop_start_label
);
4152 emit_label (loop_end_label
);
4154 emit_insn (gen_cmpmem_short (op0
, op1
,
4155 convert_to_mode (Pmode
, count
, 1)));
4156 emit_label (end_label
);
4158 emit_insn (gen_cmpint (target
, ccreg
));
4163 /* Expand conditional increment or decrement using alc/slb instructions.
4164 Should generate code setting DST to either SRC or SRC + INCREMENT,
4165 depending on the result of the comparison CMP_OP0 CMP_CODE CMP_OP1.
4166 Returns true if successful, false otherwise.
4168 That makes it possible to implement some if-constructs without jumps e.g.:
4169 (borrow = CC0 | CC1 and carry = CC2 | CC3)
4170 unsigned int a, b, c;
4171 if (a < b) c++; -> CCU b > a -> CC2; c += carry;
4172 if (a < b) c--; -> CCL3 a - b -> borrow; c -= borrow;
4173 if (a <= b) c++; -> CCL3 b - a -> borrow; c += carry;
4174 if (a <= b) c--; -> CCU a <= b -> borrow; c -= borrow;
4176 Checks for EQ and NE with a nonzero value need an additional xor e.g.:
4177 if (a == b) c++; -> CCL3 a ^= b; 0 - a -> borrow; c += carry;
4178 if (a == b) c--; -> CCU a ^= b; a <= 0 -> CC0 | CC1; c -= borrow;
4179 if (a != b) c++; -> CCU a ^= b; a > 0 -> CC2; c += carry;
4180 if (a != b) c--; -> CCL3 a ^= b; 0 - a -> borrow; c -= borrow; */
4183 s390_expand_addcc (enum rtx_code cmp_code
, rtx cmp_op0
, rtx cmp_op1
,
4184 rtx dst
, rtx src
, rtx increment
)
4186 enum machine_mode cmp_mode
;
4187 enum machine_mode cc_mode
;
4193 if ((GET_MODE (cmp_op0
) == SImode
|| GET_MODE (cmp_op0
) == VOIDmode
)
4194 && (GET_MODE (cmp_op1
) == SImode
|| GET_MODE (cmp_op1
) == VOIDmode
))
4196 else if ((GET_MODE (cmp_op0
) == DImode
|| GET_MODE (cmp_op0
) == VOIDmode
)
4197 && (GET_MODE (cmp_op1
) == DImode
|| GET_MODE (cmp_op1
) == VOIDmode
))
4202 /* Try ADD LOGICAL WITH CARRY. */
4203 if (increment
== const1_rtx
)
4205 /* Determine CC mode to use. */
4206 if (cmp_code
== EQ
|| cmp_code
== NE
)
4208 if (cmp_op1
!= const0_rtx
)
4210 cmp_op0
= expand_simple_binop (cmp_mode
, XOR
, cmp_op0
, cmp_op1
,
4211 NULL_RTX
, 0, OPTAB_WIDEN
);
4212 cmp_op1
= const0_rtx
;
4215 cmp_code
= cmp_code
== EQ
? LEU
: GTU
;
4218 if (cmp_code
== LTU
|| cmp_code
== LEU
)
4223 cmp_code
= swap_condition (cmp_code
);
4240 /* Emit comparison instruction pattern. */
4241 if (!register_operand (cmp_op0
, cmp_mode
))
4242 cmp_op0
= force_reg (cmp_mode
, cmp_op0
);
4244 insn
= gen_rtx_SET (VOIDmode
, gen_rtx_REG (cc_mode
, CC_REGNUM
),
4245 gen_rtx_COMPARE (cc_mode
, cmp_op0
, cmp_op1
));
4246 /* We use insn_invalid_p here to add clobbers if required. */
4247 ret
= insn_invalid_p (emit_insn (insn
));
4250 /* Emit ALC instruction pattern. */
4251 op_res
= gen_rtx_fmt_ee (cmp_code
, GET_MODE (dst
),
4252 gen_rtx_REG (cc_mode
, CC_REGNUM
),
4255 if (src
!= const0_rtx
)
4257 if (!register_operand (src
, GET_MODE (dst
)))
4258 src
= force_reg (GET_MODE (dst
), src
);
4260 op_res
= gen_rtx_PLUS (GET_MODE (dst
), op_res
, src
);
4261 op_res
= gen_rtx_PLUS (GET_MODE (dst
), op_res
, const0_rtx
);
4264 p
= rtvec_alloc (2);
4266 gen_rtx_SET (VOIDmode
, dst
, op_res
);
4268 gen_rtx_CLOBBER (VOIDmode
, gen_rtx_REG (CCmode
, CC_REGNUM
));
4269 emit_insn (gen_rtx_PARALLEL (VOIDmode
, p
));
4274 /* Try SUBTRACT LOGICAL WITH BORROW. */
4275 if (increment
== constm1_rtx
)
4277 /* Determine CC mode to use. */
4278 if (cmp_code
== EQ
|| cmp_code
== NE
)
4280 if (cmp_op1
!= const0_rtx
)
4282 cmp_op0
= expand_simple_binop (cmp_mode
, XOR
, cmp_op0
, cmp_op1
,
4283 NULL_RTX
, 0, OPTAB_WIDEN
);
4284 cmp_op1
= const0_rtx
;
4287 cmp_code
= cmp_code
== EQ
? LEU
: GTU
;
4290 if (cmp_code
== GTU
|| cmp_code
== GEU
)
4295 cmp_code
= swap_condition (cmp_code
);
4312 /* Emit comparison instruction pattern. */
4313 if (!register_operand (cmp_op0
, cmp_mode
))
4314 cmp_op0
= force_reg (cmp_mode
, cmp_op0
);
4316 insn
= gen_rtx_SET (VOIDmode
, gen_rtx_REG (cc_mode
, CC_REGNUM
),
4317 gen_rtx_COMPARE (cc_mode
, cmp_op0
, cmp_op1
));
4318 /* We use insn_invalid_p here to add clobbers if required. */
4319 ret
= insn_invalid_p (emit_insn (insn
));
4322 /* Emit SLB instruction pattern. */
4323 if (!register_operand (src
, GET_MODE (dst
)))
4324 src
= force_reg (GET_MODE (dst
), src
);
4326 op_res
= gen_rtx_MINUS (GET_MODE (dst
),
4327 gen_rtx_MINUS (GET_MODE (dst
), src
, const0_rtx
),
4328 gen_rtx_fmt_ee (cmp_code
, GET_MODE (dst
),
4329 gen_rtx_REG (cc_mode
, CC_REGNUM
),
4331 p
= rtvec_alloc (2);
4333 gen_rtx_SET (VOIDmode
, dst
, op_res
);
4335 gen_rtx_CLOBBER (VOIDmode
, gen_rtx_REG (CCmode
, CC_REGNUM
));
4336 emit_insn (gen_rtx_PARALLEL (VOIDmode
, p
));
4344 /* Expand code for the insv template. Return true if successful. */
4347 s390_expand_insv (rtx dest
, rtx op1
, rtx op2
, rtx src
)
4349 int bitsize
= INTVAL (op1
);
4350 int bitpos
= INTVAL (op2
);
4352 /* On z10 we can use the risbg instruction to implement insv. */
4354 && ((GET_MODE (dest
) == DImode
&& GET_MODE (src
) == DImode
)
4355 || (GET_MODE (dest
) == SImode
&& GET_MODE (src
) == SImode
)))
4360 op
= gen_rtx_SET (GET_MODE(src
),
4361 gen_rtx_ZERO_EXTRACT (GET_MODE (dest
), dest
, op1
, op2
),
4363 clobber
= gen_rtx_CLOBBER (VOIDmode
, gen_rtx_REG (CCmode
, CC_REGNUM
));
4364 emit_insn (gen_rtx_PARALLEL (VOIDmode
, gen_rtvec (2, op
, clobber
)));
4369 /* We need byte alignment. */
4370 if (bitsize
% BITS_PER_UNIT
)
4374 && memory_operand (dest
, VOIDmode
)
4375 && (register_operand (src
, word_mode
)
4376 || const_int_operand (src
, VOIDmode
)))
4378 /* Emit standard pattern if possible. */
4379 enum machine_mode mode
= smallest_mode_for_size (bitsize
, MODE_INT
);
4380 if (GET_MODE_BITSIZE (mode
) == bitsize
)
4381 emit_move_insn (adjust_address (dest
, mode
, 0), gen_lowpart (mode
, src
));
4383 /* (set (ze (mem)) (const_int)). */
4384 else if (const_int_operand (src
, VOIDmode
))
4386 int size
= bitsize
/ BITS_PER_UNIT
;
4387 rtx src_mem
= adjust_address (force_const_mem (word_mode
, src
), BLKmode
,
4388 GET_MODE_SIZE (word_mode
) - size
);
4390 dest
= adjust_address (dest
, BLKmode
, 0);
4391 set_mem_size (dest
, GEN_INT (size
));
4392 s390_expand_movmem (dest
, src_mem
, GEN_INT (size
));
4395 /* (set (ze (mem)) (reg)). */
4396 else if (register_operand (src
, word_mode
))
4398 if (bitsize
<= GET_MODE_BITSIZE (SImode
))
4399 emit_move_insn (gen_rtx_ZERO_EXTRACT (word_mode
, dest
, op1
,
4403 /* Emit st,stcmh sequence. */
4404 int stcmh_width
= bitsize
- GET_MODE_BITSIZE (SImode
);
4405 int size
= stcmh_width
/ BITS_PER_UNIT
;
4407 emit_move_insn (adjust_address (dest
, SImode
, size
),
4408 gen_lowpart (SImode
, src
));
4409 set_mem_size (dest
, GEN_INT (size
));
4410 emit_move_insn (gen_rtx_ZERO_EXTRACT (word_mode
, dest
, GEN_INT
4411 (stcmh_width
), const0_rtx
),
4412 gen_rtx_LSHIFTRT (word_mode
, src
, GEN_INT
4413 (GET_MODE_BITSIZE (SImode
))));
4422 /* (set (ze (reg)) (const_int)). */
4424 && register_operand (dest
, word_mode
)
4425 && (bitpos
% 16) == 0
4426 && (bitsize
% 16) == 0
4427 && const_int_operand (src
, VOIDmode
))
4429 HOST_WIDE_INT val
= INTVAL (src
);
4430 int regpos
= bitpos
+ bitsize
;
4432 while (regpos
> bitpos
)
4434 enum machine_mode putmode
;
4437 if (TARGET_EXTIMM
&& (regpos
% 32 == 0) && (regpos
>= bitpos
+ 32))
4442 putsize
= GET_MODE_BITSIZE (putmode
);
4444 emit_move_insn (gen_rtx_ZERO_EXTRACT (word_mode
, dest
,
4447 gen_int_mode (val
, putmode
));
4450 gcc_assert (regpos
== bitpos
);
4457 /* A subroutine of s390_expand_cs_hqi and s390_expand_atomic which returns a
4458 register that holds VAL of mode MODE shifted by COUNT bits. */
4461 s390_expand_mask_and_shift (rtx val
, enum machine_mode mode
, rtx count
)
4463 val
= expand_simple_binop (SImode
, AND
, val
, GEN_INT (GET_MODE_MASK (mode
)),
4464 NULL_RTX
, 1, OPTAB_DIRECT
);
4465 return expand_simple_binop (SImode
, ASHIFT
, val
, count
,
4466 NULL_RTX
, 1, OPTAB_DIRECT
);
4469 /* Structure to hold the initial parameters for a compare_and_swap operation
4470 in HImode and QImode. */
4472 struct alignment_context
4474 rtx memsi
; /* SI aligned memory location. */
4475 rtx shift
; /* Bit offset with regard to lsb. */
4476 rtx modemask
; /* Mask of the HQImode shifted by SHIFT bits. */
4477 rtx modemaski
; /* ~modemask */
4478 bool aligned
; /* True if memory is aligned, false else. */
4481 /* A subroutine of s390_expand_cs_hqi and s390_expand_atomic to initialize
4482 structure AC for transparent simplifying, if the memory alignment is known
4483 to be at least 32bit. MEM is the memory location for the actual operation
4484 and MODE its mode. */
4487 init_alignment_context (struct alignment_context
*ac
, rtx mem
,
4488 enum machine_mode mode
)
4490 ac
->shift
= GEN_INT (GET_MODE_SIZE (SImode
) - GET_MODE_SIZE (mode
));
4491 ac
->aligned
= (MEM_ALIGN (mem
) >= GET_MODE_BITSIZE (SImode
));
4494 ac
->memsi
= adjust_address (mem
, SImode
, 0); /* Memory is aligned. */
4497 /* Alignment is unknown. */
4498 rtx byteoffset
, addr
, align
;
4500 /* Force the address into a register. */
4501 addr
= force_reg (Pmode
, XEXP (mem
, 0));
4503 /* Align it to SImode. */
4504 align
= expand_simple_binop (Pmode
, AND
, addr
,
4505 GEN_INT (-GET_MODE_SIZE (SImode
)),
4506 NULL_RTX
, 1, OPTAB_DIRECT
);
4508 ac
->memsi
= gen_rtx_MEM (SImode
, align
);
4509 MEM_VOLATILE_P (ac
->memsi
) = MEM_VOLATILE_P (mem
);
4510 set_mem_alias_set (ac
->memsi
, ALIAS_SET_MEMORY_BARRIER
);
4511 set_mem_align (ac
->memsi
, GET_MODE_BITSIZE (SImode
));
4513 /* Calculate shiftcount. */
4514 byteoffset
= expand_simple_binop (Pmode
, AND
, addr
,
4515 GEN_INT (GET_MODE_SIZE (SImode
) - 1),
4516 NULL_RTX
, 1, OPTAB_DIRECT
);
4517 /* As we already have some offset, evaluate the remaining distance. */
4518 ac
->shift
= expand_simple_binop (SImode
, MINUS
, ac
->shift
, byteoffset
,
4519 NULL_RTX
, 1, OPTAB_DIRECT
);
4522 /* Shift is the byte count, but we need the bitcount. */
4523 ac
->shift
= expand_simple_binop (SImode
, MULT
, ac
->shift
, GEN_INT (BITS_PER_UNIT
),
4524 NULL_RTX
, 1, OPTAB_DIRECT
);
4525 /* Calculate masks. */
4526 ac
->modemask
= expand_simple_binop (SImode
, ASHIFT
,
4527 GEN_INT (GET_MODE_MASK (mode
)), ac
->shift
,
4528 NULL_RTX
, 1, OPTAB_DIRECT
);
4529 ac
->modemaski
= expand_simple_unop (SImode
, NOT
, ac
->modemask
, NULL_RTX
, 1);
4532 /* Expand an atomic compare and swap operation for HImode and QImode. MEM is
4533 the memory location, CMP the old value to compare MEM with and NEW the value
4534 to set if CMP == MEM.
4535 CMP is never in memory for compare_and_swap_cc because
4536 expand_bool_compare_and_swap puts it into a register for later compare. */
4539 s390_expand_cs_hqi (enum machine_mode mode
, rtx target
, rtx mem
, rtx cmp
, rtx
new)
4541 struct alignment_context ac
;
4542 rtx cmpv
, newv
, val
, resv
, cc
;
4543 rtx res
= gen_reg_rtx (SImode
);
4544 rtx csloop
= gen_label_rtx ();
4545 rtx csend
= gen_label_rtx ();
4547 gcc_assert (register_operand (target
, VOIDmode
));
4548 gcc_assert (MEM_P (mem
));
4550 init_alignment_context (&ac
, mem
, mode
);
4552 /* Shift the values to the correct bit positions. */
4553 if (!(ac
.aligned
&& MEM_P (cmp
)))
4554 cmp
= s390_expand_mask_and_shift (cmp
, mode
, ac
.shift
);
4555 if (!(ac
.aligned
&& MEM_P (new)))
4556 new = s390_expand_mask_and_shift (new, mode
, ac
.shift
);
4558 /* Load full word. Subsequent loads are performed by CS. */
4559 val
= expand_simple_binop (SImode
, AND
, ac
.memsi
, ac
.modemaski
,
4560 NULL_RTX
, 1, OPTAB_DIRECT
);
4562 /* Start CS loop. */
4563 emit_label (csloop
);
4564 /* val = "<mem>00..0<mem>"
4565 * cmp = "00..0<cmp>00..0"
4566 * new = "00..0<new>00..0"
4569 /* Patch cmp and new with val at correct position. */
4570 if (ac
.aligned
&& MEM_P (cmp
))
4572 cmpv
= force_reg (SImode
, val
);
4573 store_bit_field (cmpv
, GET_MODE_BITSIZE (mode
), 0, SImode
, cmp
);
4576 cmpv
= force_reg (SImode
, expand_simple_binop (SImode
, IOR
, cmp
, val
,
4577 NULL_RTX
, 1, OPTAB_DIRECT
));
4578 if (ac
.aligned
&& MEM_P (new))
4580 newv
= force_reg (SImode
, val
);
4581 store_bit_field (newv
, GET_MODE_BITSIZE (mode
), 0, SImode
, new);
4584 newv
= force_reg (SImode
, expand_simple_binop (SImode
, IOR
, new, val
,
4585 NULL_RTX
, 1, OPTAB_DIRECT
));
4587 /* Jump to end if we're done (likely?). */
4588 s390_emit_jump (csend
, s390_emit_compare_and_swap (EQ
, res
, ac
.memsi
,
4591 /* Check for changes outside mode. */
4592 resv
= expand_simple_binop (SImode
, AND
, res
, ac
.modemaski
,
4593 NULL_RTX
, 1, OPTAB_DIRECT
);
4594 cc
= s390_emit_compare (NE
, resv
, val
);
4595 emit_move_insn (val
, resv
);
4596 /* Loop internal if so. */
4597 s390_emit_jump (csloop
, cc
);
4601 /* Return the correct part of the bitfield. */
4602 convert_move (target
, expand_simple_binop (SImode
, LSHIFTRT
, res
, ac
.shift
,
4603 NULL_RTX
, 1, OPTAB_DIRECT
), 1);
4606 /* Expand an atomic operation CODE of mode MODE. MEM is the memory location
4607 and VAL the value to play with. If AFTER is true then store the value
4608 MEM holds after the operation, if AFTER is false then store the value MEM
4609 holds before the operation. If TARGET is zero then discard that value, else
4610 store it to TARGET. */
4613 s390_expand_atomic (enum machine_mode mode
, enum rtx_code code
,
4614 rtx target
, rtx mem
, rtx val
, bool after
)
4616 struct alignment_context ac
;
4618 rtx
new = gen_reg_rtx (SImode
);
4619 rtx orig
= gen_reg_rtx (SImode
);
4620 rtx csloop
= gen_label_rtx ();
4622 gcc_assert (!target
|| register_operand (target
, VOIDmode
));
4623 gcc_assert (MEM_P (mem
));
4625 init_alignment_context (&ac
, mem
, mode
);
4627 /* Shift val to the correct bit positions.
4628 Preserve "icm", but prevent "ex icm". */
4629 if (!(ac
.aligned
&& code
== SET
&& MEM_P (val
)))
4630 val
= s390_expand_mask_and_shift (val
, mode
, ac
.shift
);
4632 /* Further preparation insns. */
4633 if (code
== PLUS
|| code
== MINUS
)
4634 emit_move_insn (orig
, val
);
4635 else if (code
== MULT
|| code
== AND
) /* val = "11..1<val>11..1" */
4636 val
= expand_simple_binop (SImode
, XOR
, val
, ac
.modemaski
,
4637 NULL_RTX
, 1, OPTAB_DIRECT
);
4639 /* Load full word. Subsequent loads are performed by CS. */
4640 cmp
= force_reg (SImode
, ac
.memsi
);
4642 /* Start CS loop. */
4643 emit_label (csloop
);
4644 emit_move_insn (new, cmp
);
4646 /* Patch new with val at correct position. */
4651 val
= expand_simple_binop (SImode
, code
, new, orig
,
4652 NULL_RTX
, 1, OPTAB_DIRECT
);
4653 val
= expand_simple_binop (SImode
, AND
, val
, ac
.modemask
,
4654 NULL_RTX
, 1, OPTAB_DIRECT
);
4657 if (ac
.aligned
&& MEM_P (val
))
4658 store_bit_field (new, GET_MODE_BITSIZE (mode
), 0, SImode
, val
);
4661 new = expand_simple_binop (SImode
, AND
, new, ac
.modemaski
,
4662 NULL_RTX
, 1, OPTAB_DIRECT
);
4663 new = expand_simple_binop (SImode
, IOR
, new, val
,
4664 NULL_RTX
, 1, OPTAB_DIRECT
);
4670 new = expand_simple_binop (SImode
, code
, new, val
,
4671 NULL_RTX
, 1, OPTAB_DIRECT
);
4673 case MULT
: /* NAND */
4674 new = expand_simple_binop (SImode
, XOR
, new, ac
.modemask
,
4675 NULL_RTX
, 1, OPTAB_DIRECT
);
4676 new = expand_simple_binop (SImode
, AND
, new, val
,
4677 NULL_RTX
, 1, OPTAB_DIRECT
);
4683 s390_emit_jump (csloop
, s390_emit_compare_and_swap (NE
, cmp
,
4684 ac
.memsi
, cmp
, new));
4686 /* Return the correct part of the bitfield. */
4688 convert_move (target
, expand_simple_binop (SImode
, LSHIFTRT
,
4689 after
? new : cmp
, ac
.shift
,
4690 NULL_RTX
, 1, OPTAB_DIRECT
), 1);
4693 /* This is called from dwarf2out.c via TARGET_ASM_OUTPUT_DWARF_DTPREL.
4694 We need to emit DTP-relative relocations. */
4696 static void s390_output_dwarf_dtprel (FILE *, int, rtx
) ATTRIBUTE_UNUSED
;
4699 s390_output_dwarf_dtprel (FILE *file
, int size
, rtx x
)
4704 fputs ("\t.long\t", file
);
4707 fputs ("\t.quad\t", file
);
4712 output_addr_const (file
, x
);
4713 fputs ("@DTPOFF", file
);
4716 #ifdef TARGET_ALTERNATE_LONG_DOUBLE_MANGLING
4717 /* Implement TARGET_MANGLE_TYPE. */
4720 s390_mangle_type (const_tree type
)
4722 if (TYPE_MAIN_VARIANT (type
) == long_double_type_node
4723 && TARGET_LONG_DOUBLE_128
)
4726 /* For all other types, use normal C++ mangling. */
4731 /* In the name of slightly smaller debug output, and to cater to
4732 general assembler lossage, recognize various UNSPEC sequences
4733 and turn them back into a direct symbol reference. */
4736 s390_delegitimize_address (rtx orig_x
)
4740 if (GET_CODE (x
) != MEM
)
4744 if (GET_CODE (x
) == PLUS
4745 && GET_CODE (XEXP (x
, 1)) == CONST
4746 && GET_CODE (XEXP (x
, 0)) == REG
4747 && REGNO (XEXP (x
, 0)) == PIC_OFFSET_TABLE_REGNUM
)
4749 y
= XEXP (XEXP (x
, 1), 0);
4750 if (GET_CODE (y
) == UNSPEC
4751 && XINT (y
, 1) == UNSPEC_GOT
)
4752 return XVECEXP (y
, 0, 0);
4756 if (GET_CODE (x
) == CONST
)
4759 if (GET_CODE (y
) == UNSPEC
4760 && XINT (y
, 1) == UNSPEC_GOTENT
)
4761 return XVECEXP (y
, 0, 0);
4768 /* Output operand OP to stdio stream FILE.
4769 OP is an address (register + offset) which is not used to address data;
4770 instead the rightmost bits are interpreted as the value. */
4773 print_shift_count_operand (FILE *file
, rtx op
)
4775 HOST_WIDE_INT offset
;
4778 /* Extract base register and offset. */
4779 if (!s390_decompose_shift_count (op
, &base
, &offset
))
4785 gcc_assert (GET_CODE (base
) == REG
);
4786 gcc_assert (REGNO (base
) < FIRST_PSEUDO_REGISTER
);
4787 gcc_assert (REGNO_REG_CLASS (REGNO (base
)) == ADDR_REGS
);
4790 /* Offsets are constricted to twelve bits. */
4791 fprintf (file
, HOST_WIDE_INT_PRINT_DEC
, offset
& ((1 << 12) - 1));
4793 fprintf (file
, "(%s)", reg_names
[REGNO (base
)]);
4796 /* See 'get_some_local_dynamic_name'. */
4799 get_some_local_dynamic_name_1 (rtx
*px
, void *data ATTRIBUTE_UNUSED
)
4803 if (GET_CODE (x
) == SYMBOL_REF
&& CONSTANT_POOL_ADDRESS_P (x
))
4805 x
= get_pool_constant (x
);
4806 return for_each_rtx (&x
, get_some_local_dynamic_name_1
, 0);
4809 if (GET_CODE (x
) == SYMBOL_REF
4810 && tls_symbolic_operand (x
) == TLS_MODEL_LOCAL_DYNAMIC
)
4812 cfun
->machine
->some_ld_name
= XSTR (x
, 0);
4819 /* Locate some local-dynamic symbol still in use by this function
4820 so that we can print its name in local-dynamic base patterns. */
4823 get_some_local_dynamic_name (void)
4827 if (cfun
->machine
->some_ld_name
)
4828 return cfun
->machine
->some_ld_name
;
4830 for (insn
= get_insns (); insn
; insn
= NEXT_INSN (insn
))
4832 && for_each_rtx (&PATTERN (insn
), get_some_local_dynamic_name_1
, 0))
4833 return cfun
->machine
->some_ld_name
;
4838 /* Output machine-dependent UNSPECs occurring in address constant X
4839 in assembler syntax to stdio stream FILE. Returns true if the
4840 constant X could be recognized, false otherwise. */
4843 s390_output_addr_const_extra (FILE *file
, rtx x
)
4845 if (GET_CODE (x
) == UNSPEC
&& XVECLEN (x
, 0) == 1)
4846 switch (XINT (x
, 1))
4849 output_addr_const (file
, XVECEXP (x
, 0, 0));
4850 fprintf (file
, "@GOTENT");
4853 output_addr_const (file
, XVECEXP (x
, 0, 0));
4854 fprintf (file
, "@GOT");
4857 output_addr_const (file
, XVECEXP (x
, 0, 0));
4858 fprintf (file
, "@GOTOFF");
4861 output_addr_const (file
, XVECEXP (x
, 0, 0));
4862 fprintf (file
, "@PLT");
4865 output_addr_const (file
, XVECEXP (x
, 0, 0));
4866 fprintf (file
, "@PLTOFF");
4869 output_addr_const (file
, XVECEXP (x
, 0, 0));
4870 fprintf (file
, "@TLSGD");
4873 assemble_name (file
, get_some_local_dynamic_name ());
4874 fprintf (file
, "@TLSLDM");
4877 output_addr_const (file
, XVECEXP (x
, 0, 0));
4878 fprintf (file
, "@DTPOFF");
4881 output_addr_const (file
, XVECEXP (x
, 0, 0));
4882 fprintf (file
, "@NTPOFF");
4884 case UNSPEC_GOTNTPOFF
:
4885 output_addr_const (file
, XVECEXP (x
, 0, 0));
4886 fprintf (file
, "@GOTNTPOFF");
4888 case UNSPEC_INDNTPOFF
:
4889 output_addr_const (file
, XVECEXP (x
, 0, 0));
4890 fprintf (file
, "@INDNTPOFF");
4897 /* Output address operand ADDR in assembler syntax to
4898 stdio stream FILE. */
4901 print_operand_address (FILE *file
, rtx addr
)
4903 struct s390_address ad
;
4905 if (s390_symref_operand_p (addr
, NULL
, NULL
))
4907 gcc_assert (TARGET_Z10
);
4908 output_addr_const (file
, addr
);
4912 if (!s390_decompose_address (addr
, &ad
)
4913 || (ad
.base
&& !REGNO_OK_FOR_BASE_P (REGNO (ad
.base
)))
4914 || (ad
.indx
&& !REGNO_OK_FOR_INDEX_P (REGNO (ad
.indx
))))
4915 output_operand_lossage ("cannot decompose address");
4918 output_addr_const (file
, ad
.disp
);
4920 fprintf (file
, "0");
4922 if (ad
.base
&& ad
.indx
)
4923 fprintf (file
, "(%s,%s)", reg_names
[REGNO (ad
.indx
)],
4924 reg_names
[REGNO (ad
.base
)]);
4926 fprintf (file
, "(%s)", reg_names
[REGNO (ad
.base
)]);
4929 /* Output operand X in assembler syntax to stdio stream FILE.
4930 CODE specified the format flag. The following format flags
4933 'C': print opcode suffix for branch condition.
4934 'D': print opcode suffix for inverse branch condition.
4935 'J': print tls_load/tls_gdcall/tls_ldcall suffix
4936 'G': print the size of the operand in bytes.
4937 'O': print only the displacement of a memory reference.
4938 'R': print only the base register of a memory reference.
4939 'S': print S-type memory reference (base+displacement).
4940 'N': print the second word of a DImode operand.
4941 'M': print the second word of a TImode operand.
4942 'Y': print shift count operand.
4944 'b': print integer X as if it's an unsigned byte.
4945 'c': print integer X as if it's an signed byte.
4946 'x': print integer X as if it's an unsigned halfword.
4947 'h': print integer X as if it's a signed halfword.
4948 'i': print the first nonzero HImode part of X.
4949 'j': print the first HImode part unequal to -1 of X.
4950 'k': print the first nonzero SImode part of X.
4951 'm': print the first SImode part unequal to -1 of X.
4952 'o': print integer X as if it's an unsigned 32bit word. */
4955 print_operand (FILE *file
, rtx x
, int code
)
4960 fprintf (file
, s390_branch_condition_mnemonic (x
, FALSE
));
4964 fprintf (file
, s390_branch_condition_mnemonic (x
, TRUE
));
4968 if (GET_CODE (x
) == SYMBOL_REF
)
4970 fprintf (file
, "%s", ":tls_load:");
4971 output_addr_const (file
, x
);
4973 else if (GET_CODE (x
) == UNSPEC
&& XINT (x
, 1) == UNSPEC_TLSGD
)
4975 fprintf (file
, "%s", ":tls_gdcall:");
4976 output_addr_const (file
, XVECEXP (x
, 0, 0));
4978 else if (GET_CODE (x
) == UNSPEC
&& XINT (x
, 1) == UNSPEC_TLSLDM
)
4980 fprintf (file
, "%s", ":tls_ldcall:");
4981 assemble_name (file
, get_some_local_dynamic_name ());
4988 fprintf (file
, "%u", GET_MODE_SIZE (GET_MODE (x
)));
4993 struct s390_address ad
;
4996 gcc_assert (GET_CODE (x
) == MEM
);
4997 ret
= s390_decompose_address (XEXP (x
, 0), &ad
);
4999 gcc_assert (!ad
.base
|| REGNO_OK_FOR_BASE_P (REGNO (ad
.base
)));
5000 gcc_assert (!ad
.indx
);
5003 output_addr_const (file
, ad
.disp
);
5005 fprintf (file
, "0");
5011 struct s390_address ad
;
5014 gcc_assert (GET_CODE (x
) == MEM
);
5015 ret
= s390_decompose_address (XEXP (x
, 0), &ad
);
5017 gcc_assert (!ad
.base
|| REGNO_OK_FOR_BASE_P (REGNO (ad
.base
)));
5018 gcc_assert (!ad
.indx
);
5021 fprintf (file
, "%s", reg_names
[REGNO (ad
.base
)]);
5023 fprintf (file
, "0");
5029 struct s390_address ad
;
5032 gcc_assert (GET_CODE (x
) == MEM
);
5033 ret
= s390_decompose_address (XEXP (x
, 0), &ad
);
5035 gcc_assert (!ad
.base
|| REGNO_OK_FOR_BASE_P (REGNO (ad
.base
)));
5036 gcc_assert (!ad
.indx
);
5039 output_addr_const (file
, ad
.disp
);
5041 fprintf (file
, "0");
5044 fprintf (file
, "(%s)", reg_names
[REGNO (ad
.base
)]);
5049 if (GET_CODE (x
) == REG
)
5050 x
= gen_rtx_REG (GET_MODE (x
), REGNO (x
) + 1);
5051 else if (GET_CODE (x
) == MEM
)
5052 x
= change_address (x
, VOIDmode
, plus_constant (XEXP (x
, 0), 4));
5058 if (GET_CODE (x
) == REG
)
5059 x
= gen_rtx_REG (GET_MODE (x
), REGNO (x
) + 1);
5060 else if (GET_CODE (x
) == MEM
)
5061 x
= change_address (x
, VOIDmode
, plus_constant (XEXP (x
, 0), 8));
5067 print_shift_count_operand (file
, x
);
5071 switch (GET_CODE (x
))
5074 fprintf (file
, "%s", reg_names
[REGNO (x
)]);
5078 output_address (XEXP (x
, 0));
5085 output_addr_const (file
, x
);
5090 fprintf (file
, HOST_WIDE_INT_PRINT_DEC
, INTVAL (x
) & 0xff);
5091 else if (code
== 'c')
5092 fprintf (file
, HOST_WIDE_INT_PRINT_DEC
, ((INTVAL (x
) & 0xff) ^ 0x80) - 0x80);
5093 else if (code
== 'x')
5094 fprintf (file
, HOST_WIDE_INT_PRINT_DEC
, INTVAL (x
) & 0xffff);
5095 else if (code
== 'h')
5096 fprintf (file
, HOST_WIDE_INT_PRINT_DEC
, ((INTVAL (x
) & 0xffff) ^ 0x8000) - 0x8000);
5097 else if (code
== 'i')
5098 fprintf (file
, HOST_WIDE_INT_PRINT_DEC
,
5099 s390_extract_part (x
, HImode
, 0));
5100 else if (code
== 'j')
5101 fprintf (file
, HOST_WIDE_INT_PRINT_DEC
,
5102 s390_extract_part (x
, HImode
, -1));
5103 else if (code
== 'k')
5104 fprintf (file
, HOST_WIDE_INT_PRINT_DEC
,
5105 s390_extract_part (x
, SImode
, 0));
5106 else if (code
== 'm')
5107 fprintf (file
, HOST_WIDE_INT_PRINT_DEC
,
5108 s390_extract_part (x
, SImode
, -1));
5109 else if (code
== 'o')
5110 fprintf (file
, HOST_WIDE_INT_PRINT_DEC
, INTVAL (x
) & 0xffffffff);
5112 fprintf (file
, HOST_WIDE_INT_PRINT_DEC
, INTVAL (x
));
5116 gcc_assert (GET_MODE (x
) == VOIDmode
);
5118 fprintf (file
, HOST_WIDE_INT_PRINT_DEC
, CONST_DOUBLE_LOW (x
) & 0xff);
5119 else if (code
== 'x')
5120 fprintf (file
, HOST_WIDE_INT_PRINT_DEC
, CONST_DOUBLE_LOW (x
) & 0xffff);
5121 else if (code
== 'h')
5122 fprintf (file
, HOST_WIDE_INT_PRINT_DEC
, ((CONST_DOUBLE_LOW (x
) & 0xffff) ^ 0x8000) - 0x8000);
5128 fatal_insn ("UNKNOWN in print_operand !?", x
);
5133 /* Target hook for assembling integer objects. We need to define it
5134 here to work a round a bug in some versions of GAS, which couldn't
5135 handle values smaller than INT_MIN when printed in decimal. */
5138 s390_assemble_integer (rtx x
, unsigned int size
, int aligned_p
)
5140 if (size
== 8 && aligned_p
5141 && GET_CODE (x
) == CONST_INT
&& INTVAL (x
) < INT_MIN
)
5143 fprintf (asm_out_file
, "\t.quad\t" HOST_WIDE_INT_PRINT_HEX
"\n",
5147 return default_assemble_integer (x
, size
, aligned_p
);
5150 /* Returns true if register REGNO is used for forming
5151 a memory address in expression X. */
5154 reg_used_in_mem_p (int regno
, rtx x
)
5156 enum rtx_code code
= GET_CODE (x
);
5162 if (refers_to_regno_p (regno
, regno
+1,
5166 else if (code
== SET
5167 && GET_CODE (SET_DEST (x
)) == PC
)
5169 if (refers_to_regno_p (regno
, regno
+1,
5174 fmt
= GET_RTX_FORMAT (code
);
5175 for (i
= GET_RTX_LENGTH (code
) - 1; i
>= 0; i
--)
5178 && reg_used_in_mem_p (regno
, XEXP (x
, i
)))
5181 else if (fmt
[i
] == 'E')
5182 for (j
= 0; j
< XVECLEN (x
, i
); j
++)
5183 if (reg_used_in_mem_p (regno
, XVECEXP (x
, i
, j
)))
5189 /* Returns true if expression DEP_RTX sets an address register
5190 used by instruction INSN to address memory. */
5193 addr_generation_dependency_p (rtx dep_rtx
, rtx insn
)
5197 if (GET_CODE (dep_rtx
) == INSN
)
5198 dep_rtx
= PATTERN (dep_rtx
);
5200 if (GET_CODE (dep_rtx
) == SET
)
5202 target
= SET_DEST (dep_rtx
);
5203 if (GET_CODE (target
) == STRICT_LOW_PART
)
5204 target
= XEXP (target
, 0);
5205 while (GET_CODE (target
) == SUBREG
)
5206 target
= SUBREG_REG (target
);
5208 if (GET_CODE (target
) == REG
)
5210 int regno
= REGNO (target
);
5212 if (s390_safe_attr_type (insn
) == TYPE_LA
)
5214 pat
= PATTERN (insn
);
5215 if (GET_CODE (pat
) == PARALLEL
)
5217 gcc_assert (XVECLEN (pat
, 0) == 2);
5218 pat
= XVECEXP (pat
, 0, 0);
5220 gcc_assert (GET_CODE (pat
) == SET
);
5221 return refers_to_regno_p (regno
, regno
+1, SET_SRC (pat
), 0);
5223 else if (get_attr_atype (insn
) == ATYPE_AGEN
)
5224 return reg_used_in_mem_p (regno
, PATTERN (insn
));
5230 /* Return 1, if dep_insn sets register used in insn in the agen unit. */
5233 s390_agen_dep_p (rtx dep_insn
, rtx insn
)
5235 rtx dep_rtx
= PATTERN (dep_insn
);
5238 if (GET_CODE (dep_rtx
) == SET
5239 && addr_generation_dependency_p (dep_rtx
, insn
))
5241 else if (GET_CODE (dep_rtx
) == PARALLEL
)
5243 for (i
= 0; i
< XVECLEN (dep_rtx
, 0); i
++)
5245 if (addr_generation_dependency_p (XVECEXP (dep_rtx
, 0, i
), insn
))
5252 /* A C statement (sans semicolon) to update the integer scheduling priority
5253 INSN_PRIORITY (INSN). Increase the priority to execute the INSN earlier,
5254 reduce the priority to execute INSN later. Do not define this macro if
5255 you do not need to adjust the scheduling priorities of insns.
5257 A STD instruction should be scheduled earlier,
5258 in order to use the bypass. */
5261 s390_adjust_priority (rtx insn ATTRIBUTE_UNUSED
, int priority
)
5263 if (! INSN_P (insn
))
5266 if (s390_tune
!= PROCESSOR_2084_Z990
5267 && s390_tune
!= PROCESSOR_2094_Z9_109
)
5270 switch (s390_safe_attr_type (insn
))
5274 priority
= priority
<< 3;
5278 priority
= priority
<< 1;
5286 /* The number of instructions that can be issued per cycle. */
5289 s390_issue_rate (void)
5293 case PROCESSOR_2084_Z990
:
5294 case PROCESSOR_2094_Z9_109
:
5296 case PROCESSOR_2097_Z10
:
5304 s390_first_cycle_multipass_dfa_lookahead (void)
5310 /* Annotate every literal pool reference in X by an UNSPEC_LTREF expression.
5311 Fix up MEMs as required. */
5314 annotate_constant_pool_refs (rtx
*x
)
5319 gcc_assert (GET_CODE (*x
) != SYMBOL_REF
5320 || !CONSTANT_POOL_ADDRESS_P (*x
));
5322 /* Literal pool references can only occur inside a MEM ... */
5323 if (GET_CODE (*x
) == MEM
)
5325 rtx memref
= XEXP (*x
, 0);
5327 if (GET_CODE (memref
) == SYMBOL_REF
5328 && CONSTANT_POOL_ADDRESS_P (memref
))
5330 rtx base
= cfun
->machine
->base_reg
;
5331 rtx addr
= gen_rtx_UNSPEC (Pmode
, gen_rtvec (2, memref
, base
),
5334 *x
= replace_equiv_address (*x
, addr
);
5338 if (GET_CODE (memref
) == CONST
5339 && GET_CODE (XEXP (memref
, 0)) == PLUS
5340 && GET_CODE (XEXP (XEXP (memref
, 0), 1)) == CONST_INT
5341 && GET_CODE (XEXP (XEXP (memref
, 0), 0)) == SYMBOL_REF
5342 && CONSTANT_POOL_ADDRESS_P (XEXP (XEXP (memref
, 0), 0)))
5344 HOST_WIDE_INT off
= INTVAL (XEXP (XEXP (memref
, 0), 1));
5345 rtx sym
= XEXP (XEXP (memref
, 0), 0);
5346 rtx base
= cfun
->machine
->base_reg
;
5347 rtx addr
= gen_rtx_UNSPEC (Pmode
, gen_rtvec (2, sym
, base
),
5350 *x
= replace_equiv_address (*x
, plus_constant (addr
, off
));
5355 /* ... or a load-address type pattern. */
5356 if (GET_CODE (*x
) == SET
)
5358 rtx addrref
= SET_SRC (*x
);
5360 if (GET_CODE (addrref
) == SYMBOL_REF
5361 && CONSTANT_POOL_ADDRESS_P (addrref
))
5363 rtx base
= cfun
->machine
->base_reg
;
5364 rtx addr
= gen_rtx_UNSPEC (Pmode
, gen_rtvec (2, addrref
, base
),
5367 SET_SRC (*x
) = addr
;
5371 if (GET_CODE (addrref
) == CONST
5372 && GET_CODE (XEXP (addrref
, 0)) == PLUS
5373 && GET_CODE (XEXP (XEXP (addrref
, 0), 1)) == CONST_INT
5374 && GET_CODE (XEXP (XEXP (addrref
, 0), 0)) == SYMBOL_REF
5375 && CONSTANT_POOL_ADDRESS_P (XEXP (XEXP (addrref
, 0), 0)))
5377 HOST_WIDE_INT off
= INTVAL (XEXP (XEXP (addrref
, 0), 1));
5378 rtx sym
= XEXP (XEXP (addrref
, 0), 0);
5379 rtx base
= cfun
->machine
->base_reg
;
5380 rtx addr
= gen_rtx_UNSPEC (Pmode
, gen_rtvec (2, sym
, base
),
5383 SET_SRC (*x
) = plus_constant (addr
, off
);
5388 /* Annotate LTREL_BASE as well. */
5389 if (GET_CODE (*x
) == UNSPEC
5390 && XINT (*x
, 1) == UNSPEC_LTREL_BASE
)
5392 rtx base
= cfun
->machine
->base_reg
;
5393 *x
= gen_rtx_UNSPEC (Pmode
, gen_rtvec (2, XVECEXP (*x
, 0, 0), base
),
5398 fmt
= GET_RTX_FORMAT (GET_CODE (*x
));
5399 for (i
= GET_RTX_LENGTH (GET_CODE (*x
)) - 1; i
>= 0; i
--)
5403 annotate_constant_pool_refs (&XEXP (*x
, i
));
5405 else if (fmt
[i
] == 'E')
5407 for (j
= 0; j
< XVECLEN (*x
, i
); j
++)
5408 annotate_constant_pool_refs (&XVECEXP (*x
, i
, j
));
5413 /* Split all branches that exceed the maximum distance.
5414 Returns true if this created a new literal pool entry. */
5417 s390_split_branches (void)
5419 rtx temp_reg
= gen_rtx_REG (Pmode
, RETURN_REGNUM
);
5420 int new_literal
= 0, ret
;
5421 rtx insn
, pat
, tmp
, target
;
5424 /* We need correct insn addresses. */
5426 shorten_branches (get_insns ());
5428 /* Find all branches that exceed 64KB, and split them. */
5430 for (insn
= get_insns (); insn
; insn
= NEXT_INSN (insn
))
5432 if (GET_CODE (insn
) != JUMP_INSN
)
5435 pat
= PATTERN (insn
);
5436 if (GET_CODE (pat
) == PARALLEL
&& XVECLEN (pat
, 0) > 2)
5437 pat
= XVECEXP (pat
, 0, 0);
5438 if (GET_CODE (pat
) != SET
|| SET_DEST (pat
) != pc_rtx
)
5441 if (GET_CODE (SET_SRC (pat
)) == LABEL_REF
)
5443 label
= &SET_SRC (pat
);
5445 else if (GET_CODE (SET_SRC (pat
)) == IF_THEN_ELSE
)
5447 if (GET_CODE (XEXP (SET_SRC (pat
), 1)) == LABEL_REF
)
5448 label
= &XEXP (SET_SRC (pat
), 1);
5449 else if (GET_CODE (XEXP (SET_SRC (pat
), 2)) == LABEL_REF
)
5450 label
= &XEXP (SET_SRC (pat
), 2);
5457 if (get_attr_length (insn
) <= 4)
5460 /* We are going to use the return register as scratch register,
5461 make sure it will be saved/restored by the prologue/epilogue. */
5462 cfun_frame_layout
.save_return_addr_p
= 1;
5467 tmp
= force_const_mem (Pmode
, *label
);
5468 tmp
= emit_insn_before (gen_rtx_SET (Pmode
, temp_reg
, tmp
), insn
);
5469 INSN_ADDRESSES_NEW (tmp
, -1);
5470 annotate_constant_pool_refs (&PATTERN (tmp
));
5477 target
= gen_rtx_UNSPEC (Pmode
, gen_rtvec (1, *label
),
5478 UNSPEC_LTREL_OFFSET
);
5479 target
= gen_rtx_CONST (Pmode
, target
);
5480 target
= force_const_mem (Pmode
, target
);
5481 tmp
= emit_insn_before (gen_rtx_SET (Pmode
, temp_reg
, target
), insn
);
5482 INSN_ADDRESSES_NEW (tmp
, -1);
5483 annotate_constant_pool_refs (&PATTERN (tmp
));
5485 target
= gen_rtx_UNSPEC (Pmode
, gen_rtvec (2, XEXP (target
, 0),
5486 cfun
->machine
->base_reg
),
5488 target
= gen_rtx_PLUS (Pmode
, temp_reg
, target
);
5491 ret
= validate_change (insn
, label
, target
, 0);
5499 /* Find an annotated literal pool symbol referenced in RTX X,
5500 and store it at REF. Will abort if X contains references to
5501 more than one such pool symbol; multiple references to the same
5502 symbol are allowed, however.
5504 The rtx pointed to by REF must be initialized to NULL_RTX
5505 by the caller before calling this routine. */
5508 find_constant_pool_ref (rtx x
, rtx
*ref
)
5513 /* Ignore LTREL_BASE references. */
5514 if (GET_CODE (x
) == UNSPEC
5515 && XINT (x
, 1) == UNSPEC_LTREL_BASE
)
5517 /* Likewise POOL_ENTRY insns. */
5518 if (GET_CODE (x
) == UNSPEC_VOLATILE
5519 && XINT (x
, 1) == UNSPECV_POOL_ENTRY
)
5522 gcc_assert (GET_CODE (x
) != SYMBOL_REF
5523 || !CONSTANT_POOL_ADDRESS_P (x
));
5525 if (GET_CODE (x
) == UNSPEC
&& XINT (x
, 1) == UNSPEC_LTREF
)
5527 rtx sym
= XVECEXP (x
, 0, 0);
5528 gcc_assert (GET_CODE (sym
) == SYMBOL_REF
5529 && CONSTANT_POOL_ADDRESS_P (sym
));
5531 if (*ref
== NULL_RTX
)
5534 gcc_assert (*ref
== sym
);
5539 fmt
= GET_RTX_FORMAT (GET_CODE (x
));
5540 for (i
= GET_RTX_LENGTH (GET_CODE (x
)) - 1; i
>= 0; i
--)
5544 find_constant_pool_ref (XEXP (x
, i
), ref
);
5546 else if (fmt
[i
] == 'E')
5548 for (j
= 0; j
< XVECLEN (x
, i
); j
++)
5549 find_constant_pool_ref (XVECEXP (x
, i
, j
), ref
);
5554 /* Replace every reference to the annotated literal pool
5555 symbol REF in X by its base plus OFFSET. */
5558 replace_constant_pool_ref (rtx
*x
, rtx ref
, rtx offset
)
5563 gcc_assert (*x
!= ref
);
5565 if (GET_CODE (*x
) == UNSPEC
5566 && XINT (*x
, 1) == UNSPEC_LTREF
5567 && XVECEXP (*x
, 0, 0) == ref
)
5569 *x
= gen_rtx_PLUS (Pmode
, XVECEXP (*x
, 0, 1), offset
);
5573 if (GET_CODE (*x
) == PLUS
5574 && GET_CODE (XEXP (*x
, 1)) == CONST_INT
5575 && GET_CODE (XEXP (*x
, 0)) == UNSPEC
5576 && XINT (XEXP (*x
, 0), 1) == UNSPEC_LTREF
5577 && XVECEXP (XEXP (*x
, 0), 0, 0) == ref
)
5579 rtx addr
= gen_rtx_PLUS (Pmode
, XVECEXP (XEXP (*x
, 0), 0, 1), offset
);
5580 *x
= plus_constant (addr
, INTVAL (XEXP (*x
, 1)));
5584 fmt
= GET_RTX_FORMAT (GET_CODE (*x
));
5585 for (i
= GET_RTX_LENGTH (GET_CODE (*x
)) - 1; i
>= 0; i
--)
5589 replace_constant_pool_ref (&XEXP (*x
, i
), ref
, offset
);
5591 else if (fmt
[i
] == 'E')
5593 for (j
= 0; j
< XVECLEN (*x
, i
); j
++)
5594 replace_constant_pool_ref (&XVECEXP (*x
, i
, j
), ref
, offset
);
5599 /* Check whether X contains an UNSPEC_LTREL_BASE.
5600 Return its constant pool symbol if found, NULL_RTX otherwise. */
5603 find_ltrel_base (rtx x
)
5608 if (GET_CODE (x
) == UNSPEC
5609 && XINT (x
, 1) == UNSPEC_LTREL_BASE
)
5610 return XVECEXP (x
, 0, 0);
5612 fmt
= GET_RTX_FORMAT (GET_CODE (x
));
5613 for (i
= GET_RTX_LENGTH (GET_CODE (x
)) - 1; i
>= 0; i
--)
5617 rtx fnd
= find_ltrel_base (XEXP (x
, i
));
5621 else if (fmt
[i
] == 'E')
5623 for (j
= 0; j
< XVECLEN (x
, i
); j
++)
5625 rtx fnd
= find_ltrel_base (XVECEXP (x
, i
, j
));
5635 /* Replace any occurrence of UNSPEC_LTREL_BASE in X with its base. */
5638 replace_ltrel_base (rtx
*x
)
5643 if (GET_CODE (*x
) == UNSPEC
5644 && XINT (*x
, 1) == UNSPEC_LTREL_BASE
)
5646 *x
= XVECEXP (*x
, 0, 1);
5650 fmt
= GET_RTX_FORMAT (GET_CODE (*x
));
5651 for (i
= GET_RTX_LENGTH (GET_CODE (*x
)) - 1; i
>= 0; i
--)
5655 replace_ltrel_base (&XEXP (*x
, i
));
5657 else if (fmt
[i
] == 'E')
5659 for (j
= 0; j
< XVECLEN (*x
, i
); j
++)
5660 replace_ltrel_base (&XVECEXP (*x
, i
, j
));
5666 /* We keep a list of constants which we have to add to internal
5667 constant tables in the middle of large functions. */
5669 #define NR_C_MODES 11
5670 enum machine_mode constant_modes
[NR_C_MODES
] =
5672 TFmode
, TImode
, TDmode
,
5673 DFmode
, DImode
, DDmode
,
5674 SFmode
, SImode
, SDmode
,
5681 struct constant
*next
;
5686 struct constant_pool
5688 struct constant_pool
*next
;
5692 rtx emit_pool_after
;
5694 struct constant
*constants
[NR_C_MODES
];
5695 struct constant
*execute
;
5700 /* Allocate new constant_pool structure. */
5702 static struct constant_pool
*
5703 s390_alloc_pool (void)
5705 struct constant_pool
*pool
;
5708 pool
= (struct constant_pool
*) xmalloc (sizeof *pool
);
5710 for (i
= 0; i
< NR_C_MODES
; i
++)
5711 pool
->constants
[i
] = NULL
;
5713 pool
->execute
= NULL
;
5714 pool
->label
= gen_label_rtx ();
5715 pool
->first_insn
= NULL_RTX
;
5716 pool
->pool_insn
= NULL_RTX
;
5717 pool
->insns
= BITMAP_ALLOC (NULL
);
5719 pool
->emit_pool_after
= NULL_RTX
;
5724 /* Create new constant pool covering instructions starting at INSN
5725 and chain it to the end of POOL_LIST. */
5727 static struct constant_pool
*
5728 s390_start_pool (struct constant_pool
**pool_list
, rtx insn
)
5730 struct constant_pool
*pool
, **prev
;
5732 pool
= s390_alloc_pool ();
5733 pool
->first_insn
= insn
;
5735 for (prev
= pool_list
; *prev
; prev
= &(*prev
)->next
)
5742 /* End range of instructions covered by POOL at INSN and emit
5743 placeholder insn representing the pool. */
5746 s390_end_pool (struct constant_pool
*pool
, rtx insn
)
5748 rtx pool_size
= GEN_INT (pool
->size
+ 8 /* alignment slop */);
5751 insn
= get_last_insn ();
5753 pool
->pool_insn
= emit_insn_after (gen_pool (pool_size
), insn
);
5754 INSN_ADDRESSES_NEW (pool
->pool_insn
, -1);
5757 /* Add INSN to the list of insns covered by POOL. */
5760 s390_add_pool_insn (struct constant_pool
*pool
, rtx insn
)
5762 bitmap_set_bit (pool
->insns
, INSN_UID (insn
));
5765 /* Return pool out of POOL_LIST that covers INSN. */
5767 static struct constant_pool
*
5768 s390_find_pool (struct constant_pool
*pool_list
, rtx insn
)
5770 struct constant_pool
*pool
;
5772 for (pool
= pool_list
; pool
; pool
= pool
->next
)
5773 if (bitmap_bit_p (pool
->insns
, INSN_UID (insn
)))
5779 /* Add constant VAL of mode MODE to the constant pool POOL. */
5782 s390_add_constant (struct constant_pool
*pool
, rtx val
, enum machine_mode mode
)
5787 for (i
= 0; i
< NR_C_MODES
; i
++)
5788 if (constant_modes
[i
] == mode
)
5790 gcc_assert (i
!= NR_C_MODES
);
5792 for (c
= pool
->constants
[i
]; c
!= NULL
; c
= c
->next
)
5793 if (rtx_equal_p (val
, c
->value
))
5798 c
= (struct constant
*) xmalloc (sizeof *c
);
5800 c
->label
= gen_label_rtx ();
5801 c
->next
= pool
->constants
[i
];
5802 pool
->constants
[i
] = c
;
5803 pool
->size
+= GET_MODE_SIZE (mode
);
5807 /* Find constant VAL of mode MODE in the constant pool POOL.
5808 Return an RTX describing the distance from the start of
5809 the pool to the location of the new constant. */
5812 s390_find_constant (struct constant_pool
*pool
, rtx val
,
5813 enum machine_mode mode
)
5819 for (i
= 0; i
< NR_C_MODES
; i
++)
5820 if (constant_modes
[i
] == mode
)
5822 gcc_assert (i
!= NR_C_MODES
);
5824 for (c
= pool
->constants
[i
]; c
!= NULL
; c
= c
->next
)
5825 if (rtx_equal_p (val
, c
->value
))
5830 offset
= gen_rtx_MINUS (Pmode
, gen_rtx_LABEL_REF (Pmode
, c
->label
),
5831 gen_rtx_LABEL_REF (Pmode
, pool
->label
));
5832 offset
= gen_rtx_CONST (Pmode
, offset
);
5836 /* Check whether INSN is an execute. Return the label_ref to its
5837 execute target template if so, NULL_RTX otherwise. */
5840 s390_execute_label (rtx insn
)
5842 if (GET_CODE (insn
) == INSN
5843 && GET_CODE (PATTERN (insn
)) == PARALLEL
5844 && GET_CODE (XVECEXP (PATTERN (insn
), 0, 0)) == UNSPEC
5845 && XINT (XVECEXP (PATTERN (insn
), 0, 0), 1) == UNSPEC_EXECUTE
)
5846 return XVECEXP (XVECEXP (PATTERN (insn
), 0, 0), 0, 2);
5851 /* Add execute target for INSN to the constant pool POOL. */
5854 s390_add_execute (struct constant_pool
*pool
, rtx insn
)
5858 for (c
= pool
->execute
; c
!= NULL
; c
= c
->next
)
5859 if (INSN_UID (insn
) == INSN_UID (c
->value
))
5864 c
= (struct constant
*) xmalloc (sizeof *c
);
5866 c
->label
= gen_label_rtx ();
5867 c
->next
= pool
->execute
;
5873 /* Find execute target for INSN in the constant pool POOL.
5874 Return an RTX describing the distance from the start of
5875 the pool to the location of the execute target. */
5878 s390_find_execute (struct constant_pool
*pool
, rtx insn
)
5883 for (c
= pool
->execute
; c
!= NULL
; c
= c
->next
)
5884 if (INSN_UID (insn
) == INSN_UID (c
->value
))
5889 offset
= gen_rtx_MINUS (Pmode
, gen_rtx_LABEL_REF (Pmode
, c
->label
),
5890 gen_rtx_LABEL_REF (Pmode
, pool
->label
));
5891 offset
= gen_rtx_CONST (Pmode
, offset
);
5895 /* For an execute INSN, extract the execute target template. */
5898 s390_execute_target (rtx insn
)
5900 rtx pattern
= PATTERN (insn
);
5901 gcc_assert (s390_execute_label (insn
));
5903 if (XVECLEN (pattern
, 0) == 2)
5905 pattern
= copy_rtx (XVECEXP (pattern
, 0, 1));
5909 rtvec vec
= rtvec_alloc (XVECLEN (pattern
, 0) - 1);
5912 for (i
= 0; i
< XVECLEN (pattern
, 0) - 1; i
++)
5913 RTVEC_ELT (vec
, i
) = copy_rtx (XVECEXP (pattern
, 0, i
+ 1));
5915 pattern
= gen_rtx_PARALLEL (VOIDmode
, vec
);
5921 /* Indicate that INSN cannot be duplicated. This is the case for
5922 execute insns that carry a unique label. */
5925 s390_cannot_copy_insn_p (rtx insn
)
5927 rtx label
= s390_execute_label (insn
);
5928 return label
&& label
!= const0_rtx
;
5931 /* Dump out the constants in POOL. If REMOTE_LABEL is true,
5932 do not emit the pool base label. */
5935 s390_dump_pool (struct constant_pool
*pool
, bool remote_label
)
5938 rtx insn
= pool
->pool_insn
;
5941 /* Switch to rodata section. */
5942 if (TARGET_CPU_ZARCH
)
5944 insn
= emit_insn_after (gen_pool_section_start (), insn
);
5945 INSN_ADDRESSES_NEW (insn
, -1);
5948 /* Ensure minimum pool alignment. */
5949 if (TARGET_CPU_ZARCH
)
5950 insn
= emit_insn_after (gen_pool_align (GEN_INT (8)), insn
);
5952 insn
= emit_insn_after (gen_pool_align (GEN_INT (4)), insn
);
5953 INSN_ADDRESSES_NEW (insn
, -1);
5955 /* Emit pool base label. */
5958 insn
= emit_label_after (pool
->label
, insn
);
5959 INSN_ADDRESSES_NEW (insn
, -1);
5962 /* Dump constants in descending alignment requirement order,
5963 ensuring proper alignment for every constant. */
5964 for (i
= 0; i
< NR_C_MODES
; i
++)
5965 for (c
= pool
->constants
[i
]; c
; c
= c
->next
)
5967 /* Convert UNSPEC_LTREL_OFFSET unspecs to pool-relative references. */
5968 rtx value
= copy_rtx (c
->value
);
5969 if (GET_CODE (value
) == CONST
5970 && GET_CODE (XEXP (value
, 0)) == UNSPEC
5971 && XINT (XEXP (value
, 0), 1) == UNSPEC_LTREL_OFFSET
5972 && XVECLEN (XEXP (value
, 0), 0) == 1)
5974 value
= gen_rtx_MINUS (Pmode
, XVECEXP (XEXP (value
, 0), 0, 0),
5975 gen_rtx_LABEL_REF (VOIDmode
, pool
->label
));
5976 value
= gen_rtx_CONST (VOIDmode
, value
);
5979 insn
= emit_label_after (c
->label
, insn
);
5980 INSN_ADDRESSES_NEW (insn
, -1);
5982 value
= gen_rtx_UNSPEC_VOLATILE (constant_modes
[i
],
5983 gen_rtvec (1, value
),
5984 UNSPECV_POOL_ENTRY
);
5985 insn
= emit_insn_after (value
, insn
);
5986 INSN_ADDRESSES_NEW (insn
, -1);
5989 /* Ensure minimum alignment for instructions. */
5990 insn
= emit_insn_after (gen_pool_align (GEN_INT (2)), insn
);
5991 INSN_ADDRESSES_NEW (insn
, -1);
5993 /* Output in-pool execute template insns. */
5994 for (c
= pool
->execute
; c
; c
= c
->next
)
5996 insn
= emit_label_after (c
->label
, insn
);
5997 INSN_ADDRESSES_NEW (insn
, -1);
5999 insn
= emit_insn_after (s390_execute_target (c
->value
), insn
);
6000 INSN_ADDRESSES_NEW (insn
, -1);
6003 /* Switch back to previous section. */
6004 if (TARGET_CPU_ZARCH
)
6006 insn
= emit_insn_after (gen_pool_section_end (), insn
);
6007 INSN_ADDRESSES_NEW (insn
, -1);
6010 insn
= emit_barrier_after (insn
);
6011 INSN_ADDRESSES_NEW (insn
, -1);
6013 /* Remove placeholder insn. */
6014 remove_insn (pool
->pool_insn
);
6017 /* Free all memory used by POOL. */
6020 s390_free_pool (struct constant_pool
*pool
)
6022 struct constant
*c
, *next
;
6025 for (i
= 0; i
< NR_C_MODES
; i
++)
6026 for (c
= pool
->constants
[i
]; c
; c
= next
)
6032 for (c
= pool
->execute
; c
; c
= next
)
6038 BITMAP_FREE (pool
->insns
);
6043 /* Collect main literal pool. Return NULL on overflow. */
6045 static struct constant_pool
*
6046 s390_mainpool_start (void)
6048 struct constant_pool
*pool
;
6051 pool
= s390_alloc_pool ();
6053 for (insn
= get_insns (); insn
; insn
= NEXT_INSN (insn
))
6055 if (GET_CODE (insn
) == INSN
6056 && GET_CODE (PATTERN (insn
)) == SET
6057 && GET_CODE (SET_SRC (PATTERN (insn
))) == UNSPEC_VOLATILE
6058 && XINT (SET_SRC (PATTERN (insn
)), 1) == UNSPECV_MAIN_POOL
)
6060 gcc_assert (!pool
->pool_insn
);
6061 pool
->pool_insn
= insn
;
6064 if (!TARGET_CPU_ZARCH
&& s390_execute_label (insn
))
6066 s390_add_execute (pool
, insn
);
6068 else if (GET_CODE (insn
) == INSN
|| GET_CODE (insn
) == CALL_INSN
)
6070 rtx pool_ref
= NULL_RTX
;
6071 find_constant_pool_ref (PATTERN (insn
), &pool_ref
);
6074 rtx constant
= get_pool_constant (pool_ref
);
6075 enum machine_mode mode
= get_pool_mode (pool_ref
);
6076 s390_add_constant (pool
, constant
, mode
);
6080 /* If hot/cold partitioning is enabled we have to make sure that
6081 the literal pool is emitted in the same section where the
6082 initialization of the literal pool base pointer takes place.
6083 emit_pool_after is only used in the non-overflow case on non
6084 Z cpus where we can emit the literal pool at the end of the
6085 function body within the text section. */
6087 && NOTE_KIND (insn
) == NOTE_INSN_SWITCH_TEXT_SECTIONS
6088 && !pool
->emit_pool_after
)
6089 pool
->emit_pool_after
= PREV_INSN (insn
);
6092 gcc_assert (pool
->pool_insn
|| pool
->size
== 0);
6094 if (pool
->size
>= 4096)
6096 /* We're going to chunkify the pool, so remove the main
6097 pool placeholder insn. */
6098 remove_insn (pool
->pool_insn
);
6100 s390_free_pool (pool
);
6104 /* If the functions ends with the section where the literal pool
6105 should be emitted set the marker to its end. */
6106 if (pool
&& !pool
->emit_pool_after
)
6107 pool
->emit_pool_after
= get_last_insn ();
6112 /* POOL holds the main literal pool as collected by s390_mainpool_start.
6113 Modify the current function to output the pool constants as well as
6114 the pool register setup instruction. */
6117 s390_mainpool_finish (struct constant_pool
*pool
)
6119 rtx base_reg
= cfun
->machine
->base_reg
;
6122 /* If the pool is empty, we're done. */
6123 if (pool
->size
== 0)
6125 /* We don't actually need a base register after all. */
6126 cfun
->machine
->base_reg
= NULL_RTX
;
6128 if (pool
->pool_insn
)
6129 remove_insn (pool
->pool_insn
);
6130 s390_free_pool (pool
);
6134 /* We need correct insn addresses. */
6135 shorten_branches (get_insns ());
6137 /* On zSeries, we use a LARL to load the pool register. The pool is
6138 located in the .rodata section, so we emit it after the function. */
6139 if (TARGET_CPU_ZARCH
)
6141 insn
= gen_main_base_64 (base_reg
, pool
->label
);
6142 insn
= emit_insn_after (insn
, pool
->pool_insn
);
6143 INSN_ADDRESSES_NEW (insn
, -1);
6144 remove_insn (pool
->pool_insn
);
6146 insn
= get_last_insn ();
6147 pool
->pool_insn
= emit_insn_after (gen_pool (const0_rtx
), insn
);
6148 INSN_ADDRESSES_NEW (pool
->pool_insn
, -1);
6150 s390_dump_pool (pool
, 0);
6153 /* On S/390, if the total size of the function's code plus literal pool
6154 does not exceed 4096 bytes, we use BASR to set up a function base
6155 pointer, and emit the literal pool at the end of the function. */
6156 else if (INSN_ADDRESSES (INSN_UID (pool
->emit_pool_after
))
6157 + pool
->size
+ 8 /* alignment slop */ < 4096)
6159 insn
= gen_main_base_31_small (base_reg
, pool
->label
);
6160 insn
= emit_insn_after (insn
, pool
->pool_insn
);
6161 INSN_ADDRESSES_NEW (insn
, -1);
6162 remove_insn (pool
->pool_insn
);
6164 insn
= emit_label_after (pool
->label
, insn
);
6165 INSN_ADDRESSES_NEW (insn
, -1);
6167 /* emit_pool_after will be set by s390_mainpool_start to the
6168 last insn of the section where the literal pool should be
6170 insn
= pool
->emit_pool_after
;
6172 pool
->pool_insn
= emit_insn_after (gen_pool (const0_rtx
), insn
);
6173 INSN_ADDRESSES_NEW (pool
->pool_insn
, -1);
6175 s390_dump_pool (pool
, 1);
6178 /* Otherwise, we emit an inline literal pool and use BASR to branch
6179 over it, setting up the pool register at the same time. */
6182 rtx pool_end
= gen_label_rtx ();
6184 insn
= gen_main_base_31_large (base_reg
, pool
->label
, pool_end
);
6185 insn
= emit_insn_after (insn
, pool
->pool_insn
);
6186 INSN_ADDRESSES_NEW (insn
, -1);
6187 remove_insn (pool
->pool_insn
);
6189 insn
= emit_label_after (pool
->label
, insn
);
6190 INSN_ADDRESSES_NEW (insn
, -1);
6192 pool
->pool_insn
= emit_insn_after (gen_pool (const0_rtx
), insn
);
6193 INSN_ADDRESSES_NEW (pool
->pool_insn
, -1);
6195 insn
= emit_label_after (pool_end
, pool
->pool_insn
);
6196 INSN_ADDRESSES_NEW (insn
, -1);
6198 s390_dump_pool (pool
, 1);
6202 /* Replace all literal pool references. */
6204 for (insn
= get_insns (); insn
; insn
= NEXT_INSN (insn
))
6207 replace_ltrel_base (&PATTERN (insn
));
6209 if (GET_CODE (insn
) == INSN
|| GET_CODE (insn
) == CALL_INSN
)
6211 rtx addr
, pool_ref
= NULL_RTX
;
6212 find_constant_pool_ref (PATTERN (insn
), &pool_ref
);
6215 if (s390_execute_label (insn
))
6216 addr
= s390_find_execute (pool
, insn
);
6218 addr
= s390_find_constant (pool
, get_pool_constant (pool_ref
),
6219 get_pool_mode (pool_ref
));
6221 replace_constant_pool_ref (&PATTERN (insn
), pool_ref
, addr
);
6222 INSN_CODE (insn
) = -1;
6228 /* Free the pool. */
6229 s390_free_pool (pool
);
6232 /* POOL holds the main literal pool as collected by s390_mainpool_start.
6233 We have decided we cannot use this pool, so revert all changes
6234 to the current function that were done by s390_mainpool_start. */
6236 s390_mainpool_cancel (struct constant_pool
*pool
)
6238 /* We didn't actually change the instruction stream, so simply
6239 free the pool memory. */
6240 s390_free_pool (pool
);
6244 /* Chunkify the literal pool. */
6246 #define S390_POOL_CHUNK_MIN 0xc00
6247 #define S390_POOL_CHUNK_MAX 0xe00
6249 static struct constant_pool
*
6250 s390_chunkify_start (void)
6252 struct constant_pool
*curr_pool
= NULL
, *pool_list
= NULL
;
6255 rtx pending_ltrel
= NULL_RTX
;
6258 rtx (*gen_reload_base
) (rtx
, rtx
) =
6259 TARGET_CPU_ZARCH
? gen_reload_base_64
: gen_reload_base_31
;
6262 /* We need correct insn addresses. */
6264 shorten_branches (get_insns ());
6266 /* Scan all insns and move literals to pool chunks. */
6268 for (insn
= get_insns (); insn
; insn
= NEXT_INSN (insn
))
6270 bool section_switch_p
= false;
6272 /* Check for pending LTREL_BASE. */
6275 rtx ltrel_base
= find_ltrel_base (PATTERN (insn
));
6278 gcc_assert (ltrel_base
== pending_ltrel
);
6279 pending_ltrel
= NULL_RTX
;
6283 if (!TARGET_CPU_ZARCH
&& s390_execute_label (insn
))
6286 curr_pool
= s390_start_pool (&pool_list
, insn
);
6288 s390_add_execute (curr_pool
, insn
);
6289 s390_add_pool_insn (curr_pool
, insn
);
6291 else if (GET_CODE (insn
) == INSN
|| GET_CODE (insn
) == CALL_INSN
)
6293 rtx pool_ref
= NULL_RTX
;
6294 find_constant_pool_ref (PATTERN (insn
), &pool_ref
);
6297 rtx constant
= get_pool_constant (pool_ref
);
6298 enum machine_mode mode
= get_pool_mode (pool_ref
);
6301 curr_pool
= s390_start_pool (&pool_list
, insn
);
6303 s390_add_constant (curr_pool
, constant
, mode
);
6304 s390_add_pool_insn (curr_pool
, insn
);
6306 /* Don't split the pool chunk between a LTREL_OFFSET load
6307 and the corresponding LTREL_BASE. */
6308 if (GET_CODE (constant
) == CONST
6309 && GET_CODE (XEXP (constant
, 0)) == UNSPEC
6310 && XINT (XEXP (constant
, 0), 1) == UNSPEC_LTREL_OFFSET
)
6312 gcc_assert (!pending_ltrel
);
6313 pending_ltrel
= pool_ref
;
6318 if (GET_CODE (insn
) == JUMP_INSN
|| GET_CODE (insn
) == CODE_LABEL
)
6321 s390_add_pool_insn (curr_pool
, insn
);
6322 /* An LTREL_BASE must follow within the same basic block. */
6323 gcc_assert (!pending_ltrel
);
6326 if (NOTE_P (insn
) && NOTE_KIND (insn
) == NOTE_INSN_SWITCH_TEXT_SECTIONS
)
6327 section_switch_p
= true;
6330 || INSN_ADDRESSES_SIZE () <= (size_t) INSN_UID (insn
)
6331 || INSN_ADDRESSES (INSN_UID (insn
)) == -1)
6334 if (TARGET_CPU_ZARCH
)
6336 if (curr_pool
->size
< S390_POOL_CHUNK_MAX
)
6339 s390_end_pool (curr_pool
, NULL_RTX
);
6344 int chunk_size
= INSN_ADDRESSES (INSN_UID (insn
))
6345 - INSN_ADDRESSES (INSN_UID (curr_pool
->first_insn
))
6348 /* We will later have to insert base register reload insns.
6349 Those will have an effect on code size, which we need to
6350 consider here. This calculation makes rather pessimistic
6351 worst-case assumptions. */
6352 if (GET_CODE (insn
) == CODE_LABEL
)
6355 if (chunk_size
< S390_POOL_CHUNK_MIN
6356 && curr_pool
->size
< S390_POOL_CHUNK_MIN
6357 && !section_switch_p
)
6360 /* Pool chunks can only be inserted after BARRIERs ... */
6361 if (GET_CODE (insn
) == BARRIER
)
6363 s390_end_pool (curr_pool
, insn
);
6368 /* ... so if we don't find one in time, create one. */
6369 else if (chunk_size
> S390_POOL_CHUNK_MAX
6370 || curr_pool
->size
> S390_POOL_CHUNK_MAX
6371 || section_switch_p
)
6373 rtx label
, jump
, barrier
;
6375 if (!section_switch_p
)
6377 /* We can insert the barrier only after a 'real' insn. */
6378 if (GET_CODE (insn
) != INSN
&& GET_CODE (insn
) != CALL_INSN
)
6380 if (get_attr_length (insn
) == 0)
6382 /* Don't separate LTREL_BASE from the corresponding
6383 LTREL_OFFSET load. */
6389 gcc_assert (!pending_ltrel
);
6391 /* The old pool has to end before the section switch
6392 note in order to make it part of the current
6394 insn
= PREV_INSN (insn
);
6397 label
= gen_label_rtx ();
6398 jump
= emit_jump_insn_after (gen_jump (label
), insn
);
6399 barrier
= emit_barrier_after (jump
);
6400 insn
= emit_label_after (label
, barrier
);
6401 JUMP_LABEL (jump
) = label
;
6402 LABEL_NUSES (label
) = 1;
6404 INSN_ADDRESSES_NEW (jump
, -1);
6405 INSN_ADDRESSES_NEW (barrier
, -1);
6406 INSN_ADDRESSES_NEW (insn
, -1);
6408 s390_end_pool (curr_pool
, barrier
);
6416 s390_end_pool (curr_pool
, NULL_RTX
);
6417 gcc_assert (!pending_ltrel
);
6419 /* Find all labels that are branched into
6420 from an insn belonging to a different chunk. */
6422 far_labels
= BITMAP_ALLOC (NULL
);
6424 for (insn
= get_insns (); insn
; insn
= NEXT_INSN (insn
))
6426 /* Labels marked with LABEL_PRESERVE_P can be target
6427 of non-local jumps, so we have to mark them.
6428 The same holds for named labels.
6430 Don't do that, however, if it is the label before
6433 if (GET_CODE (insn
) == CODE_LABEL
6434 && (LABEL_PRESERVE_P (insn
) || LABEL_NAME (insn
)))
6436 rtx vec_insn
= next_real_insn (insn
);
6437 rtx vec_pat
= vec_insn
&& GET_CODE (vec_insn
) == JUMP_INSN
?
6438 PATTERN (vec_insn
) : NULL_RTX
;
6440 || !(GET_CODE (vec_pat
) == ADDR_VEC
6441 || GET_CODE (vec_pat
) == ADDR_DIFF_VEC
))
6442 bitmap_set_bit (far_labels
, CODE_LABEL_NUMBER (insn
));
6445 /* If we have a direct jump (conditional or unconditional)
6446 or a casesi jump, check all potential targets. */
6447 else if (GET_CODE (insn
) == JUMP_INSN
)
6449 rtx pat
= PATTERN (insn
);
6450 if (GET_CODE (pat
) == PARALLEL
&& XVECLEN (pat
, 0) > 2)
6451 pat
= XVECEXP (pat
, 0, 0);
6453 if (GET_CODE (pat
) == SET
)
6455 rtx label
= JUMP_LABEL (insn
);
6458 if (s390_find_pool (pool_list
, label
)
6459 != s390_find_pool (pool_list
, insn
))
6460 bitmap_set_bit (far_labels
, CODE_LABEL_NUMBER (label
));
6463 else if (GET_CODE (pat
) == PARALLEL
6464 && XVECLEN (pat
, 0) == 2
6465 && GET_CODE (XVECEXP (pat
, 0, 0)) == SET
6466 && GET_CODE (XVECEXP (pat
, 0, 1)) == USE
6467 && GET_CODE (XEXP (XVECEXP (pat
, 0, 1), 0)) == LABEL_REF
)
6469 /* Find the jump table used by this casesi jump. */
6470 rtx vec_label
= XEXP (XEXP (XVECEXP (pat
, 0, 1), 0), 0);
6471 rtx vec_insn
= next_real_insn (vec_label
);
6472 rtx vec_pat
= vec_insn
&& GET_CODE (vec_insn
) == JUMP_INSN
?
6473 PATTERN (vec_insn
) : NULL_RTX
;
6475 && (GET_CODE (vec_pat
) == ADDR_VEC
6476 || GET_CODE (vec_pat
) == ADDR_DIFF_VEC
))
6478 int i
, diff_p
= GET_CODE (vec_pat
) == ADDR_DIFF_VEC
;
6480 for (i
= 0; i
< XVECLEN (vec_pat
, diff_p
); i
++)
6482 rtx label
= XEXP (XVECEXP (vec_pat
, diff_p
, i
), 0);
6484 if (s390_find_pool (pool_list
, label
)
6485 != s390_find_pool (pool_list
, insn
))
6486 bitmap_set_bit (far_labels
, CODE_LABEL_NUMBER (label
));
6493 /* Insert base register reload insns before every pool. */
6495 for (curr_pool
= pool_list
; curr_pool
; curr_pool
= curr_pool
->next
)
6497 rtx new_insn
= gen_reload_base (cfun
->machine
->base_reg
,
6499 rtx insn
= curr_pool
->first_insn
;
6500 INSN_ADDRESSES_NEW (emit_insn_before (new_insn
, insn
), -1);
6503 /* Insert base register reload insns at every far label. */
6505 for (insn
= get_insns (); insn
; insn
= NEXT_INSN (insn
))
6506 if (GET_CODE (insn
) == CODE_LABEL
6507 && bitmap_bit_p (far_labels
, CODE_LABEL_NUMBER (insn
)))
6509 struct constant_pool
*pool
= s390_find_pool (pool_list
, insn
);
6512 rtx new_insn
= gen_reload_base (cfun
->machine
->base_reg
,
6514 INSN_ADDRESSES_NEW (emit_insn_after (new_insn
, insn
), -1);
6519 BITMAP_FREE (far_labels
);
6522 /* Recompute insn addresses. */
6524 init_insn_lengths ();
6525 shorten_branches (get_insns ());
6530 /* POOL_LIST is a chunk list as prepared by s390_chunkify_start.
6531 After we have decided to use this list, finish implementing
6532 all changes to the current function as required. */
6535 s390_chunkify_finish (struct constant_pool
*pool_list
)
6537 struct constant_pool
*curr_pool
= NULL
;
6541 /* Replace all literal pool references. */
6543 for (insn
= get_insns (); insn
; insn
= NEXT_INSN (insn
))
6546 replace_ltrel_base (&PATTERN (insn
));
6548 curr_pool
= s390_find_pool (pool_list
, insn
);
6552 if (GET_CODE (insn
) == INSN
|| GET_CODE (insn
) == CALL_INSN
)
6554 rtx addr
, pool_ref
= NULL_RTX
;
6555 find_constant_pool_ref (PATTERN (insn
), &pool_ref
);
6558 if (s390_execute_label (insn
))
6559 addr
= s390_find_execute (curr_pool
, insn
);
6561 addr
= s390_find_constant (curr_pool
,
6562 get_pool_constant (pool_ref
),
6563 get_pool_mode (pool_ref
));
6565 replace_constant_pool_ref (&PATTERN (insn
), pool_ref
, addr
);
6566 INSN_CODE (insn
) = -1;
6571 /* Dump out all literal pools. */
6573 for (curr_pool
= pool_list
; curr_pool
; curr_pool
= curr_pool
->next
)
6574 s390_dump_pool (curr_pool
, 0);
6576 /* Free pool list. */
6580 struct constant_pool
*next
= pool_list
->next
;
6581 s390_free_pool (pool_list
);
6586 /* POOL_LIST is a chunk list as prepared by s390_chunkify_start.
6587 We have decided we cannot use this list, so revert all changes
6588 to the current function that were done by s390_chunkify_start. */
6591 s390_chunkify_cancel (struct constant_pool
*pool_list
)
6593 struct constant_pool
*curr_pool
= NULL
;
6596 /* Remove all pool placeholder insns. */
6598 for (curr_pool
= pool_list
; curr_pool
; curr_pool
= curr_pool
->next
)
6600 /* Did we insert an extra barrier? Remove it. */
6601 rtx barrier
= PREV_INSN (curr_pool
->pool_insn
);
6602 rtx jump
= barrier
? PREV_INSN (barrier
) : NULL_RTX
;
6603 rtx label
= NEXT_INSN (curr_pool
->pool_insn
);
6605 if (jump
&& GET_CODE (jump
) == JUMP_INSN
6606 && barrier
&& GET_CODE (barrier
) == BARRIER
6607 && label
&& GET_CODE (label
) == CODE_LABEL
6608 && GET_CODE (PATTERN (jump
)) == SET
6609 && SET_DEST (PATTERN (jump
)) == pc_rtx
6610 && GET_CODE (SET_SRC (PATTERN (jump
))) == LABEL_REF
6611 && XEXP (SET_SRC (PATTERN (jump
)), 0) == label
)
6614 remove_insn (barrier
);
6615 remove_insn (label
);
6618 remove_insn (curr_pool
->pool_insn
);
6621 /* Remove all base register reload insns. */
6623 for (insn
= get_insns (); insn
; )
6625 rtx next_insn
= NEXT_INSN (insn
);
6627 if (GET_CODE (insn
) == INSN
6628 && GET_CODE (PATTERN (insn
)) == SET
6629 && GET_CODE (SET_SRC (PATTERN (insn
))) == UNSPEC
6630 && XINT (SET_SRC (PATTERN (insn
)), 1) == UNSPEC_RELOAD_BASE
)
6636 /* Free pool list. */
6640 struct constant_pool
*next
= pool_list
->next
;
6641 s390_free_pool (pool_list
);
6647 /* Output the constant pool entry EXP in mode MODE with alignment ALIGN. */
6650 s390_output_pool_entry (rtx exp
, enum machine_mode mode
, unsigned int align
)
6654 switch (GET_MODE_CLASS (mode
))
6657 case MODE_DECIMAL_FLOAT
:
6658 gcc_assert (GET_CODE (exp
) == CONST_DOUBLE
);
6660 REAL_VALUE_FROM_CONST_DOUBLE (r
, exp
);
6661 assemble_real (r
, mode
, align
);
6665 assemble_integer (exp
, GET_MODE_SIZE (mode
), align
, 1);
6674 /* Return an RTL expression representing the value of the return address
6675 for the frame COUNT steps up from the current frame. FRAME is the
6676 frame pointer of that frame. */
6679 s390_return_addr_rtx (int count
, rtx frame ATTRIBUTE_UNUSED
)
6684 /* Without backchain, we fail for all but the current frame. */
6686 if (!TARGET_BACKCHAIN
&& count
> 0)
6689 /* For the current frame, we need to make sure the initial
6690 value of RETURN_REGNUM is actually saved. */
6694 /* On non-z architectures branch splitting could overwrite r14. */
6695 if (TARGET_CPU_ZARCH
)
6696 return get_hard_reg_initial_val (Pmode
, RETURN_REGNUM
);
6699 cfun_frame_layout
.save_return_addr_p
= true;
6700 return gen_rtx_MEM (Pmode
, return_address_pointer_rtx
);
6704 if (TARGET_PACKED_STACK
)
6705 offset
= -2 * UNITS_PER_WORD
;
6707 offset
= RETURN_REGNUM
* UNITS_PER_WORD
;
6709 addr
= plus_constant (frame
, offset
);
6710 addr
= memory_address (Pmode
, addr
);
6711 return gen_rtx_MEM (Pmode
, addr
);
6714 /* Return an RTL expression representing the back chain stored in
6715 the current stack frame. */
6718 s390_back_chain_rtx (void)
6722 gcc_assert (TARGET_BACKCHAIN
);
6724 if (TARGET_PACKED_STACK
)
6725 chain
= plus_constant (stack_pointer_rtx
,
6726 STACK_POINTER_OFFSET
- UNITS_PER_WORD
);
6728 chain
= stack_pointer_rtx
;
6730 chain
= gen_rtx_MEM (Pmode
, chain
);
6734 /* Find first call clobbered register unused in a function.
6735 This could be used as base register in a leaf function
6736 or for holding the return address before epilogue. */
6739 find_unused_clobbered_reg (void)
6742 for (i
= 0; i
< 6; i
++)
6743 if (!df_regs_ever_live_p (i
))
6749 /* Helper function for s390_regs_ever_clobbered. Sets the fields in DATA for all
6750 clobbered hard regs in SETREG. */
6753 s390_reg_clobbered_rtx (rtx setreg
, const_rtx set_insn ATTRIBUTE_UNUSED
, void *data
)
6755 int *regs_ever_clobbered
= (int *)data
;
6756 unsigned int i
, regno
;
6757 enum machine_mode mode
= GET_MODE (setreg
);
6759 if (GET_CODE (setreg
) == SUBREG
)
6761 rtx inner
= SUBREG_REG (setreg
);
6762 if (!GENERAL_REG_P (inner
))
6764 regno
= subreg_regno (setreg
);
6766 else if (GENERAL_REG_P (setreg
))
6767 regno
= REGNO (setreg
);
6772 i
< regno
+ HARD_REGNO_NREGS (regno
, mode
);
6774 regs_ever_clobbered
[i
] = 1;
6777 /* Walks through all basic blocks of the current function looking
6778 for clobbered hard regs using s390_reg_clobbered_rtx. The fields
6779 of the passed integer array REGS_EVER_CLOBBERED are set to one for
6780 each of those regs. */
6783 s390_regs_ever_clobbered (int *regs_ever_clobbered
)
6789 memset (regs_ever_clobbered
, 0, 16 * sizeof (int));
6791 /* For non-leaf functions we have to consider all call clobbered regs to be
6793 if (!current_function_is_leaf
)
6795 for (i
= 0; i
< 16; i
++)
6796 regs_ever_clobbered
[i
] = call_really_used_regs
[i
];
6799 /* Make the "magic" eh_return registers live if necessary. For regs_ever_live
6800 this work is done by liveness analysis (mark_regs_live_at_end).
6801 Special care is needed for functions containing landing pads. Landing pads
6802 may use the eh registers, but the code which sets these registers is not
6803 contained in that function. Hence s390_regs_ever_clobbered is not able to
6804 deal with this automatically. */
6805 if (crtl
->calls_eh_return
|| cfun
->machine
->has_landing_pad_p
)
6806 for (i
= 0; EH_RETURN_DATA_REGNO (i
) != INVALID_REGNUM
; i
++)
6807 if (crtl
->calls_eh_return
6808 || (cfun
->machine
->has_landing_pad_p
6809 && df_regs_ever_live_p (EH_RETURN_DATA_REGNO (i
))))
6810 regs_ever_clobbered
[EH_RETURN_DATA_REGNO (i
)] = 1;
6812 /* For nonlocal gotos all call-saved registers have to be saved.
6813 This flag is also set for the unwinding code in libgcc.
6814 See expand_builtin_unwind_init. For regs_ever_live this is done by
6816 if (cfun
->has_nonlocal_label
)
6817 for (i
= 0; i
< 16; i
++)
6818 if (!call_really_used_regs
[i
])
6819 regs_ever_clobbered
[i
] = 1;
6821 FOR_EACH_BB (cur_bb
)
6823 FOR_BB_INSNS (cur_bb
, cur_insn
)
6825 if (INSN_P (cur_insn
))
6826 note_stores (PATTERN (cur_insn
),
6827 s390_reg_clobbered_rtx
,
6828 regs_ever_clobbered
);
6833 /* Determine the frame area which actually has to be accessed
6834 in the function epilogue. The values are stored at the
6835 given pointers AREA_BOTTOM (address of the lowest used stack
6836 address) and AREA_TOP (address of the first item which does
6837 not belong to the stack frame). */
6840 s390_frame_area (int *area_bottom
, int *area_top
)
6848 if (cfun_frame_layout
.first_restore_gpr
!= -1)
6850 b
= (cfun_frame_layout
.gprs_offset
6851 + cfun_frame_layout
.first_restore_gpr
* UNITS_PER_WORD
);
6852 t
= b
+ (cfun_frame_layout
.last_restore_gpr
6853 - cfun_frame_layout
.first_restore_gpr
+ 1) * UNITS_PER_WORD
;
6856 if (TARGET_64BIT
&& cfun_save_high_fprs_p
)
6858 b
= MIN (b
, cfun_frame_layout
.f8_offset
);
6859 t
= MAX (t
, (cfun_frame_layout
.f8_offset
6860 + cfun_frame_layout
.high_fprs
* 8));
6864 for (i
= 2; i
< 4; i
++)
6865 if (cfun_fpr_bit_p (i
))
6867 b
= MIN (b
, cfun_frame_layout
.f4_offset
+ (i
- 2) * 8);
6868 t
= MAX (t
, cfun_frame_layout
.f4_offset
+ (i
- 1) * 8);
6875 /* Fill cfun->machine with info about register usage of current function.
6876 Return in CLOBBERED_REGS which GPRs are currently considered set. */
6879 s390_register_info (int clobbered_regs
[])
6883 /* fprs 8 - 15 are call saved for 64 Bit ABI. */
6884 cfun_frame_layout
.fpr_bitmap
= 0;
6885 cfun_frame_layout
.high_fprs
= 0;
6887 for (i
= 24; i
< 32; i
++)
6888 if (df_regs_ever_live_p (i
) && !global_regs
[i
])
6890 cfun_set_fpr_bit (i
- 16);
6891 cfun_frame_layout
.high_fprs
++;
6894 /* Find first and last gpr to be saved. We trust regs_ever_live
6895 data, except that we don't save and restore global registers.
6897 Also, all registers with special meaning to the compiler need
6898 to be handled extra. */
6900 s390_regs_ever_clobbered (clobbered_regs
);
6902 for (i
= 0; i
< 16; i
++)
6903 clobbered_regs
[i
] = clobbered_regs
[i
] && !global_regs
[i
] && !fixed_regs
[i
];
6905 if (frame_pointer_needed
)
6906 clobbered_regs
[HARD_FRAME_POINTER_REGNUM
] = 1;
6909 clobbered_regs
[PIC_OFFSET_TABLE_REGNUM
]
6910 |= df_regs_ever_live_p (PIC_OFFSET_TABLE_REGNUM
);
6912 clobbered_regs
[BASE_REGNUM
]
6913 |= (cfun
->machine
->base_reg
6914 && REGNO (cfun
->machine
->base_reg
) == BASE_REGNUM
);
6916 clobbered_regs
[RETURN_REGNUM
]
6917 |= (!current_function_is_leaf
6918 || TARGET_TPF_PROFILING
6919 || cfun
->machine
->split_branches_pending_p
6920 || cfun_frame_layout
.save_return_addr_p
6921 || crtl
->calls_eh_return
6924 clobbered_regs
[STACK_POINTER_REGNUM
]
6925 |= (!current_function_is_leaf
6926 || TARGET_TPF_PROFILING
6927 || cfun_save_high_fprs_p
6928 || get_frame_size () > 0
6929 || cfun
->calls_alloca
6932 for (i
= 6; i
< 16; i
++)
6933 if (df_regs_ever_live_p (i
) || clobbered_regs
[i
])
6935 for (j
= 15; j
> i
; j
--)
6936 if (df_regs_ever_live_p (j
) || clobbered_regs
[j
])
6941 /* Nothing to save/restore. */
6942 cfun_frame_layout
.first_save_gpr_slot
= -1;
6943 cfun_frame_layout
.last_save_gpr_slot
= -1;
6944 cfun_frame_layout
.first_save_gpr
= -1;
6945 cfun_frame_layout
.first_restore_gpr
= -1;
6946 cfun_frame_layout
.last_save_gpr
= -1;
6947 cfun_frame_layout
.last_restore_gpr
= -1;
6951 /* Save slots for gprs from i to j. */
6952 cfun_frame_layout
.first_save_gpr_slot
= i
;
6953 cfun_frame_layout
.last_save_gpr_slot
= j
;
6955 for (i
= cfun_frame_layout
.first_save_gpr_slot
;
6956 i
< cfun_frame_layout
.last_save_gpr_slot
+ 1;
6958 if (clobbered_regs
[i
])
6961 for (j
= cfun_frame_layout
.last_save_gpr_slot
; j
> i
; j
--)
6962 if (clobbered_regs
[j
])
6965 if (i
== cfun_frame_layout
.last_save_gpr_slot
+ 1)
6967 /* Nothing to save/restore. */
6968 cfun_frame_layout
.first_save_gpr
= -1;
6969 cfun_frame_layout
.first_restore_gpr
= -1;
6970 cfun_frame_layout
.last_save_gpr
= -1;
6971 cfun_frame_layout
.last_restore_gpr
= -1;
6975 /* Save / Restore from gpr i to j. */
6976 cfun_frame_layout
.first_save_gpr
= i
;
6977 cfun_frame_layout
.first_restore_gpr
= i
;
6978 cfun_frame_layout
.last_save_gpr
= j
;
6979 cfun_frame_layout
.last_restore_gpr
= j
;
6985 /* Varargs functions need to save gprs 2 to 6. */
6986 if (cfun
->va_list_gpr_size
6987 && crtl
->args
.info
.gprs
< GP_ARG_NUM_REG
)
6989 int min_gpr
= crtl
->args
.info
.gprs
;
6990 int max_gpr
= min_gpr
+ cfun
->va_list_gpr_size
;
6991 if (max_gpr
> GP_ARG_NUM_REG
)
6992 max_gpr
= GP_ARG_NUM_REG
;
6994 if (cfun_frame_layout
.first_save_gpr
== -1
6995 || cfun_frame_layout
.first_save_gpr
> 2 + min_gpr
)
6997 cfun_frame_layout
.first_save_gpr
= 2 + min_gpr
;
6998 cfun_frame_layout
.first_save_gpr_slot
= 2 + min_gpr
;
7001 if (cfun_frame_layout
.last_save_gpr
== -1
7002 || cfun_frame_layout
.last_save_gpr
< 2 + max_gpr
- 1)
7004 cfun_frame_layout
.last_save_gpr
= 2 + max_gpr
- 1;
7005 cfun_frame_layout
.last_save_gpr_slot
= 2 + max_gpr
- 1;
7009 /* Mark f0, f2 for 31 bit and f0-f4 for 64 bit to be saved. */
7010 if (TARGET_HARD_FLOAT
&& cfun
->va_list_fpr_size
7011 && crtl
->args
.info
.fprs
< FP_ARG_NUM_REG
)
7013 int min_fpr
= crtl
->args
.info
.fprs
;
7014 int max_fpr
= min_fpr
+ cfun
->va_list_fpr_size
;
7015 if (max_fpr
> FP_ARG_NUM_REG
)
7016 max_fpr
= FP_ARG_NUM_REG
;
7018 /* ??? This is currently required to ensure proper location
7019 of the fpr save slots within the va_list save area. */
7020 if (TARGET_PACKED_STACK
)
7023 for (i
= min_fpr
; i
< max_fpr
; i
++)
7024 cfun_set_fpr_bit (i
);
7029 for (i
= 2; i
< 4; i
++)
7030 if (df_regs_ever_live_p (i
+ 16) && !global_regs
[i
+ 16])
7031 cfun_set_fpr_bit (i
);
7034 /* Fill cfun->machine with info about frame of current function. */
7037 s390_frame_info (void)
7041 cfun_frame_layout
.frame_size
= get_frame_size ();
7042 if (!TARGET_64BIT
&& cfun_frame_layout
.frame_size
> 0x7fff0000)
7043 fatal_error ("total size of local variables exceeds architecture limit");
7045 if (!TARGET_PACKED_STACK
)
7047 cfun_frame_layout
.backchain_offset
= 0;
7048 cfun_frame_layout
.f0_offset
= 16 * UNITS_PER_WORD
;
7049 cfun_frame_layout
.f4_offset
= cfun_frame_layout
.f0_offset
+ 2 * 8;
7050 cfun_frame_layout
.f8_offset
= -cfun_frame_layout
.high_fprs
* 8;
7051 cfun_frame_layout
.gprs_offset
= (cfun_frame_layout
.first_save_gpr_slot
7054 else if (TARGET_BACKCHAIN
) /* kernel stack layout */
7056 cfun_frame_layout
.backchain_offset
= (STACK_POINTER_OFFSET
7058 cfun_frame_layout
.gprs_offset
7059 = (cfun_frame_layout
.backchain_offset
7060 - (STACK_POINTER_REGNUM
- cfun_frame_layout
.first_save_gpr_slot
+ 1)
7065 cfun_frame_layout
.f4_offset
7066 = (cfun_frame_layout
.gprs_offset
7067 - 8 * (cfun_fpr_bit_p (2) + cfun_fpr_bit_p (3)));
7069 cfun_frame_layout
.f0_offset
7070 = (cfun_frame_layout
.f4_offset
7071 - 8 * (cfun_fpr_bit_p (0) + cfun_fpr_bit_p (1)));
7075 /* On 31 bit we have to care about alignment of the
7076 floating point regs to provide fastest access. */
7077 cfun_frame_layout
.f0_offset
7078 = ((cfun_frame_layout
.gprs_offset
7079 & ~(STACK_BOUNDARY
/ BITS_PER_UNIT
- 1))
7080 - 8 * (cfun_fpr_bit_p (0) + cfun_fpr_bit_p (1)));
7082 cfun_frame_layout
.f4_offset
7083 = (cfun_frame_layout
.f0_offset
7084 - 8 * (cfun_fpr_bit_p (2) + cfun_fpr_bit_p (3)));
7087 else /* no backchain */
7089 cfun_frame_layout
.f4_offset
7090 = (STACK_POINTER_OFFSET
7091 - 8 * (cfun_fpr_bit_p (2) + cfun_fpr_bit_p (3)));
7093 cfun_frame_layout
.f0_offset
7094 = (cfun_frame_layout
.f4_offset
7095 - 8 * (cfun_fpr_bit_p (0) + cfun_fpr_bit_p (1)));
7097 cfun_frame_layout
.gprs_offset
7098 = cfun_frame_layout
.f0_offset
- cfun_gprs_save_area_size
;
7101 if (current_function_is_leaf
7102 && !TARGET_TPF_PROFILING
7103 && cfun_frame_layout
.frame_size
== 0
7104 && !cfun_save_high_fprs_p
7105 && !cfun
->calls_alloca
7109 if (!TARGET_PACKED_STACK
)
7110 cfun_frame_layout
.frame_size
+= (STACK_POINTER_OFFSET
7111 + crtl
->outgoing_args_size
7112 + cfun_frame_layout
.high_fprs
* 8);
7115 if (TARGET_BACKCHAIN
)
7116 cfun_frame_layout
.frame_size
+= UNITS_PER_WORD
;
7118 /* No alignment trouble here because f8-f15 are only saved under
7120 cfun_frame_layout
.f8_offset
= (MIN (MIN (cfun_frame_layout
.f0_offset
,
7121 cfun_frame_layout
.f4_offset
),
7122 cfun_frame_layout
.gprs_offset
)
7123 - cfun_frame_layout
.high_fprs
* 8);
7125 cfun_frame_layout
.frame_size
+= cfun_frame_layout
.high_fprs
* 8;
7127 for (i
= 0; i
< 8; i
++)
7128 if (cfun_fpr_bit_p (i
))
7129 cfun_frame_layout
.frame_size
+= 8;
7131 cfun_frame_layout
.frame_size
+= cfun_gprs_save_area_size
;
7133 /* If under 31 bit an odd number of gprs has to be saved we have to adjust
7134 the frame size to sustain 8 byte alignment of stack frames. */
7135 cfun_frame_layout
.frame_size
= ((cfun_frame_layout
.frame_size
+
7136 STACK_BOUNDARY
/ BITS_PER_UNIT
- 1)
7137 & ~(STACK_BOUNDARY
/ BITS_PER_UNIT
- 1));
7139 cfun_frame_layout
.frame_size
+= crtl
->outgoing_args_size
;
7143 /* Generate frame layout. Fills in register and frame data for the current
7144 function in cfun->machine. This routine can be called multiple times;
7145 it will re-do the complete frame layout every time. */
7148 s390_init_frame_layout (void)
7150 HOST_WIDE_INT frame_size
;
7152 int clobbered_regs
[16];
7154 /* On S/390 machines, we may need to perform branch splitting, which
7155 will require both base and return address register. We have no
7156 choice but to assume we're going to need them until right at the
7157 end of the machine dependent reorg phase. */
7158 if (!TARGET_CPU_ZARCH
)
7159 cfun
->machine
->split_branches_pending_p
= true;
7163 frame_size
= cfun_frame_layout
.frame_size
;
7165 /* Try to predict whether we'll need the base register. */
7166 base_used
= cfun
->machine
->split_branches_pending_p
7167 || crtl
->uses_const_pool
7168 || (!DISP_IN_RANGE (frame_size
)
7169 && !CONST_OK_FOR_K (frame_size
));
7171 /* Decide which register to use as literal pool base. In small
7172 leaf functions, try to use an unused call-clobbered register
7173 as base register to avoid save/restore overhead. */
7175 cfun
->machine
->base_reg
= NULL_RTX
;
7176 else if (current_function_is_leaf
&& !df_regs_ever_live_p (5))
7177 cfun
->machine
->base_reg
= gen_rtx_REG (Pmode
, 5);
7179 cfun
->machine
->base_reg
= gen_rtx_REG (Pmode
, BASE_REGNUM
);
7181 s390_register_info (clobbered_regs
);
7184 while (frame_size
!= cfun_frame_layout
.frame_size
);
7187 /* Update frame layout. Recompute actual register save data based on
7188 current info and update regs_ever_live for the special registers.
7189 May be called multiple times, but may never cause *more* registers
7190 to be saved than s390_init_frame_layout allocated room for. */
7193 s390_update_frame_layout (void)
7195 int clobbered_regs
[16];
7197 s390_register_info (clobbered_regs
);
7199 df_set_regs_ever_live (BASE_REGNUM
,
7200 clobbered_regs
[BASE_REGNUM
] ? true : false);
7201 df_set_regs_ever_live (RETURN_REGNUM
,
7202 clobbered_regs
[RETURN_REGNUM
] ? true : false);
7203 df_set_regs_ever_live (STACK_POINTER_REGNUM
,
7204 clobbered_regs
[STACK_POINTER_REGNUM
] ? true : false);
7206 if (cfun
->machine
->base_reg
)
7207 df_set_regs_ever_live (REGNO (cfun
->machine
->base_reg
), true);
7210 /* Return true if it is legal to put a value with MODE into REGNO. */
7213 s390_hard_regno_mode_ok (unsigned int regno
, enum machine_mode mode
)
7215 switch (REGNO_REG_CLASS (regno
))
7218 if (REGNO_PAIR_OK (regno
, mode
))
7220 if (mode
== SImode
|| mode
== DImode
)
7223 if (FLOAT_MODE_P (mode
) && GET_MODE_CLASS (mode
) != MODE_VECTOR_FLOAT
)
7228 if (FRAME_REGNO_P (regno
) && mode
== Pmode
)
7233 if (REGNO_PAIR_OK (regno
, mode
))
7236 || (mode
!= TFmode
&& mode
!= TCmode
&& mode
!= TDmode
))
7241 if (GET_MODE_CLASS (mode
) == MODE_CC
)
7245 if (REGNO_PAIR_OK (regno
, mode
))
7247 if (mode
== SImode
|| mode
== Pmode
)
7258 /* Return nonzero if register OLD_REG can be renamed to register NEW_REG. */
7261 s390_hard_regno_rename_ok (unsigned int old_reg
, unsigned int new_reg
)
7263 /* Once we've decided upon a register to use as base register, it must
7264 no longer be used for any other purpose. */
7265 if (cfun
->machine
->base_reg
)
7266 if (REGNO (cfun
->machine
->base_reg
) == old_reg
7267 || REGNO (cfun
->machine
->base_reg
) == new_reg
)
7273 /* Maximum number of registers to represent a value of mode MODE
7274 in a register of class CLASS. */
7277 s390_class_max_nregs (enum reg_class
class, enum machine_mode mode
)
7282 if (GET_MODE_CLASS (mode
) == MODE_COMPLEX_FLOAT
)
7283 return 2 * ((GET_MODE_SIZE (mode
) / 2 + 8 - 1) / 8);
7285 return (GET_MODE_SIZE (mode
) + 8 - 1) / 8;
7287 return (GET_MODE_SIZE (mode
) + 4 - 1) / 4;
7291 return (GET_MODE_SIZE (mode
) + UNITS_PER_WORD
- 1) / UNITS_PER_WORD
;
7294 /* Return true if register FROM can be eliminated via register TO. */
7297 s390_can_eliminate (int from
, int to
)
7299 /* On zSeries machines, we have not marked the base register as fixed.
7300 Instead, we have an elimination rule BASE_REGNUM -> BASE_REGNUM.
7301 If a function requires the base register, we say here that this
7302 elimination cannot be performed. This will cause reload to free
7303 up the base register (as if it were fixed). On the other hand,
7304 if the current function does *not* require the base register, we
7305 say here the elimination succeeds, which in turn allows reload
7306 to allocate the base register for any other purpose. */
7307 if (from
== BASE_REGNUM
&& to
== BASE_REGNUM
)
7309 if (TARGET_CPU_ZARCH
)
7311 s390_init_frame_layout ();
7312 return cfun
->machine
->base_reg
== NULL_RTX
;
7318 /* Everything else must point into the stack frame. */
7319 gcc_assert (to
== STACK_POINTER_REGNUM
7320 || to
== HARD_FRAME_POINTER_REGNUM
);
7322 gcc_assert (from
== FRAME_POINTER_REGNUM
7323 || from
== ARG_POINTER_REGNUM
7324 || from
== RETURN_ADDRESS_POINTER_REGNUM
);
7326 /* Make sure we actually saved the return address. */
7327 if (from
== RETURN_ADDRESS_POINTER_REGNUM
)
7328 if (!crtl
->calls_eh_return
7330 && !cfun_frame_layout
.save_return_addr_p
)
7336 /* Return offset between register FROM and TO initially after prolog. */
7339 s390_initial_elimination_offset (int from
, int to
)
7341 HOST_WIDE_INT offset
;
7344 /* ??? Why are we called for non-eliminable pairs? */
7345 if (!s390_can_eliminate (from
, to
))
7350 case FRAME_POINTER_REGNUM
:
7351 offset
= (get_frame_size()
7352 + STACK_POINTER_OFFSET
7353 + crtl
->outgoing_args_size
);
7356 case ARG_POINTER_REGNUM
:
7357 s390_init_frame_layout ();
7358 offset
= cfun_frame_layout
.frame_size
+ STACK_POINTER_OFFSET
;
7361 case RETURN_ADDRESS_POINTER_REGNUM
:
7362 s390_init_frame_layout ();
7363 index
= RETURN_REGNUM
- cfun_frame_layout
.first_save_gpr_slot
;
7364 gcc_assert (index
>= 0);
7365 offset
= cfun_frame_layout
.frame_size
+ cfun_frame_layout
.gprs_offset
;
7366 offset
+= index
* UNITS_PER_WORD
;
7380 /* Emit insn to save fpr REGNUM at offset OFFSET relative
7381 to register BASE. Return generated insn. */
7384 save_fpr (rtx base
, int offset
, int regnum
)
7387 addr
= gen_rtx_MEM (DFmode
, plus_constant (base
, offset
));
7389 if (regnum
>= 16 && regnum
<= (16 + FP_ARG_NUM_REG
))
7390 set_mem_alias_set (addr
, get_varargs_alias_set ());
7392 set_mem_alias_set (addr
, get_frame_alias_set ());
7394 return emit_move_insn (addr
, gen_rtx_REG (DFmode
, regnum
));
7397 /* Emit insn to restore fpr REGNUM from offset OFFSET relative
7398 to register BASE. Return generated insn. */
7401 restore_fpr (rtx base
, int offset
, int regnum
)
7404 addr
= gen_rtx_MEM (DFmode
, plus_constant (base
, offset
));
7405 set_mem_alias_set (addr
, get_frame_alias_set ());
7407 return emit_move_insn (gen_rtx_REG (DFmode
, regnum
), addr
);
7410 /* Generate insn to save registers FIRST to LAST into
7411 the register save area located at offset OFFSET
7412 relative to register BASE. */
7415 save_gprs (rtx base
, int offset
, int first
, int last
)
7417 rtx addr
, insn
, note
;
7420 addr
= plus_constant (base
, offset
);
7421 addr
= gen_rtx_MEM (Pmode
, addr
);
7423 set_mem_alias_set (addr
, get_frame_alias_set ());
7425 /* Special-case single register. */
7429 insn
= gen_movdi (addr
, gen_rtx_REG (Pmode
, first
));
7431 insn
= gen_movsi (addr
, gen_rtx_REG (Pmode
, first
));
7433 RTX_FRAME_RELATED_P (insn
) = 1;
7438 insn
= gen_store_multiple (addr
,
7439 gen_rtx_REG (Pmode
, first
),
7440 GEN_INT (last
- first
+ 1));
7442 if (first
<= 6 && cfun
->stdarg
)
7443 for (i
= 0; i
< XVECLEN (PATTERN (insn
), 0); i
++)
7445 rtx mem
= XEXP (XVECEXP (PATTERN (insn
), 0, i
), 0);
7448 set_mem_alias_set (mem
, get_varargs_alias_set ());
7451 /* We need to set the FRAME_RELATED flag on all SETs
7452 inside the store-multiple pattern.
7454 However, we must not emit DWARF records for registers 2..5
7455 if they are stored for use by variable arguments ...
7457 ??? Unfortunately, it is not enough to simply not the
7458 FRAME_RELATED flags for those SETs, because the first SET
7459 of the PARALLEL is always treated as if it had the flag
7460 set, even if it does not. Therefore we emit a new pattern
7461 without those registers as REG_FRAME_RELATED_EXPR note. */
7465 rtx pat
= PATTERN (insn
);
7467 for (i
= 0; i
< XVECLEN (pat
, 0); i
++)
7468 if (GET_CODE (XVECEXP (pat
, 0, i
)) == SET
)
7469 RTX_FRAME_RELATED_P (XVECEXP (pat
, 0, i
)) = 1;
7471 RTX_FRAME_RELATED_P (insn
) = 1;
7475 addr
= plus_constant (base
, offset
+ (6 - first
) * UNITS_PER_WORD
);
7476 note
= gen_store_multiple (gen_rtx_MEM (Pmode
, addr
),
7477 gen_rtx_REG (Pmode
, 6),
7478 GEN_INT (last
- 6 + 1));
7479 note
= PATTERN (note
);
7482 gen_rtx_EXPR_LIST (REG_FRAME_RELATED_EXPR
,
7483 note
, REG_NOTES (insn
));
7485 for (i
= 0; i
< XVECLEN (note
, 0); i
++)
7486 if (GET_CODE (XVECEXP (note
, 0, i
)) == SET
)
7487 RTX_FRAME_RELATED_P (XVECEXP (note
, 0, i
)) = 1;
7489 RTX_FRAME_RELATED_P (insn
) = 1;
7495 /* Generate insn to restore registers FIRST to LAST from
7496 the register save area located at offset OFFSET
7497 relative to register BASE. */
7500 restore_gprs (rtx base
, int offset
, int first
, int last
)
7504 addr
= plus_constant (base
, offset
);
7505 addr
= gen_rtx_MEM (Pmode
, addr
);
7506 set_mem_alias_set (addr
, get_frame_alias_set ());
7508 /* Special-case single register. */
7512 insn
= gen_movdi (gen_rtx_REG (Pmode
, first
), addr
);
7514 insn
= gen_movsi (gen_rtx_REG (Pmode
, first
), addr
);
7519 insn
= gen_load_multiple (gen_rtx_REG (Pmode
, first
),
7521 GEN_INT (last
- first
+ 1));
7525 /* Return insn sequence to load the GOT register. */
7527 static GTY(()) rtx got_symbol
;
7529 s390_load_got (void)
7535 got_symbol
= gen_rtx_SYMBOL_REF (Pmode
, "_GLOBAL_OFFSET_TABLE_");
7536 SYMBOL_REF_FLAGS (got_symbol
) = SYMBOL_FLAG_LOCAL
;
7541 if (TARGET_CPU_ZARCH
)
7543 emit_move_insn (pic_offset_table_rtx
, got_symbol
);
7549 offset
= gen_rtx_UNSPEC (Pmode
, gen_rtvec (1, got_symbol
),
7550 UNSPEC_LTREL_OFFSET
);
7551 offset
= gen_rtx_CONST (Pmode
, offset
);
7552 offset
= force_const_mem (Pmode
, offset
);
7554 emit_move_insn (pic_offset_table_rtx
, offset
);
7556 offset
= gen_rtx_UNSPEC (Pmode
, gen_rtvec (1, XEXP (offset
, 0)),
7558 offset
= gen_rtx_PLUS (Pmode
, pic_offset_table_rtx
, offset
);
7560 emit_move_insn (pic_offset_table_rtx
, offset
);
7563 insns
= get_insns ();
7568 /* This ties together stack memory (MEM with an alias set of frame_alias_set)
7569 and the change to the stack pointer. */
7572 s390_emit_stack_tie (void)
7574 rtx mem
= gen_frame_mem (BLKmode
,
7575 gen_rtx_REG (Pmode
, STACK_POINTER_REGNUM
));
7577 emit_insn (gen_stack_tie (mem
));
7580 /* Expand the prologue into a bunch of separate insns. */
7583 s390_emit_prologue (void)
7591 /* Complete frame layout. */
7593 s390_update_frame_layout ();
7595 /* Annotate all constant pool references to let the scheduler know
7596 they implicitly use the base register. */
7598 push_topmost_sequence ();
7600 for (insn
= get_insns (); insn
; insn
= NEXT_INSN (insn
))
7603 annotate_constant_pool_refs (&PATTERN (insn
));
7604 df_insn_rescan (insn
);
7607 pop_topmost_sequence ();
7609 /* Choose best register to use for temp use within prologue.
7610 See below for why TPF must use the register 1. */
7612 if (!has_hard_reg_initial_val (Pmode
, RETURN_REGNUM
)
7613 && !current_function_is_leaf
7614 && !TARGET_TPF_PROFILING
)
7615 temp_reg
= gen_rtx_REG (Pmode
, RETURN_REGNUM
);
7617 temp_reg
= gen_rtx_REG (Pmode
, 1);
7619 /* Save call saved gprs. */
7620 if (cfun_frame_layout
.first_save_gpr
!= -1)
7622 insn
= save_gprs (stack_pointer_rtx
,
7623 cfun_frame_layout
.gprs_offset
+
7624 UNITS_PER_WORD
* (cfun_frame_layout
.first_save_gpr
7625 - cfun_frame_layout
.first_save_gpr_slot
),
7626 cfun_frame_layout
.first_save_gpr
,
7627 cfun_frame_layout
.last_save_gpr
);
7631 /* Dummy insn to mark literal pool slot. */
7633 if (cfun
->machine
->base_reg
)
7634 emit_insn (gen_main_pool (cfun
->machine
->base_reg
));
7636 offset
= cfun_frame_layout
.f0_offset
;
7638 /* Save f0 and f2. */
7639 for (i
= 0; i
< 2; i
++)
7641 if (cfun_fpr_bit_p (i
))
7643 save_fpr (stack_pointer_rtx
, offset
, i
+ 16);
7646 else if (!TARGET_PACKED_STACK
)
7650 /* Save f4 and f6. */
7651 offset
= cfun_frame_layout
.f4_offset
;
7652 for (i
= 2; i
< 4; i
++)
7654 if (cfun_fpr_bit_p (i
))
7656 insn
= save_fpr (stack_pointer_rtx
, offset
, i
+ 16);
7659 /* If f4 and f6 are call clobbered they are saved due to stdargs and
7660 therefore are not frame related. */
7661 if (!call_really_used_regs
[i
+ 16])
7662 RTX_FRAME_RELATED_P (insn
) = 1;
7664 else if (!TARGET_PACKED_STACK
)
7668 if (TARGET_PACKED_STACK
7669 && cfun_save_high_fprs_p
7670 && cfun_frame_layout
.f8_offset
+ cfun_frame_layout
.high_fprs
* 8 > 0)
7672 offset
= (cfun_frame_layout
.f8_offset
7673 + (cfun_frame_layout
.high_fprs
- 1) * 8);
7675 for (i
= 15; i
> 7 && offset
>= 0; i
--)
7676 if (cfun_fpr_bit_p (i
))
7678 insn
= save_fpr (stack_pointer_rtx
, offset
, i
+ 16);
7680 RTX_FRAME_RELATED_P (insn
) = 1;
7683 if (offset
>= cfun_frame_layout
.f8_offset
)
7687 if (!TARGET_PACKED_STACK
)
7688 next_fpr
= cfun_save_high_fprs_p
? 31 : 0;
7690 /* Decrement stack pointer. */
7692 if (cfun_frame_layout
.frame_size
> 0)
7694 rtx frame_off
= GEN_INT (-cfun_frame_layout
.frame_size
);
7696 if (s390_stack_size
)
7698 HOST_WIDE_INT stack_guard
;
7700 if (s390_stack_guard
)
7701 stack_guard
= s390_stack_guard
;
7704 /* If no value for stack guard is provided the smallest power of 2
7705 larger than the current frame size is chosen. */
7707 while (stack_guard
< cfun_frame_layout
.frame_size
)
7711 if (cfun_frame_layout
.frame_size
>= s390_stack_size
)
7713 warning (0, "frame size of function %qs is "
7714 HOST_WIDE_INT_PRINT_DEC
7715 " bytes exceeding user provided stack limit of "
7716 HOST_WIDE_INT_PRINT_DEC
" bytes. "
7717 "An unconditional trap is added.",
7718 current_function_name(), cfun_frame_layout
.frame_size
,
7720 emit_insn (gen_trap ());
7724 HOST_WIDE_INT stack_check_mask
= ((s390_stack_size
- 1)
7725 & ~(stack_guard
- 1));
7726 rtx t
= gen_rtx_AND (Pmode
, stack_pointer_rtx
,
7727 GEN_INT (stack_check_mask
));
7729 gen_cmpdi (t
, const0_rtx
);
7731 gen_cmpsi (t
, const0_rtx
);
7733 emit_insn (gen_conditional_trap (gen_rtx_EQ (CCmode
,
7734 gen_rtx_REG (CCmode
,
7741 if (s390_warn_framesize
> 0
7742 && cfun_frame_layout
.frame_size
>= s390_warn_framesize
)
7743 warning (0, "frame size of %qs is " HOST_WIDE_INT_PRINT_DEC
" bytes",
7744 current_function_name (), cfun_frame_layout
.frame_size
);
7746 if (s390_warn_dynamicstack_p
&& cfun
->calls_alloca
)
7747 warning (0, "%qs uses dynamic stack allocation", current_function_name ());
7749 /* Save incoming stack pointer into temp reg. */
7750 if (TARGET_BACKCHAIN
|| next_fpr
)
7751 insn
= emit_insn (gen_move_insn (temp_reg
, stack_pointer_rtx
));
7753 /* Subtract frame size from stack pointer. */
7755 if (DISP_IN_RANGE (INTVAL (frame_off
)))
7757 insn
= gen_rtx_SET (VOIDmode
, stack_pointer_rtx
,
7758 gen_rtx_PLUS (Pmode
, stack_pointer_rtx
,
7760 insn
= emit_insn (insn
);
7764 if (!CONST_OK_FOR_K (INTVAL (frame_off
)))
7765 frame_off
= force_const_mem (Pmode
, frame_off
);
7767 insn
= emit_insn (gen_add2_insn (stack_pointer_rtx
, frame_off
));
7768 annotate_constant_pool_refs (&PATTERN (insn
));
7771 RTX_FRAME_RELATED_P (insn
) = 1;
7773 gen_rtx_EXPR_LIST (REG_FRAME_RELATED_EXPR
,
7774 gen_rtx_SET (VOIDmode
, stack_pointer_rtx
,
7775 gen_rtx_PLUS (Pmode
, stack_pointer_rtx
,
7776 GEN_INT (-cfun_frame_layout
.frame_size
))),
7779 /* Set backchain. */
7781 if (TARGET_BACKCHAIN
)
7783 if (cfun_frame_layout
.backchain_offset
)
7784 addr
= gen_rtx_MEM (Pmode
,
7785 plus_constant (stack_pointer_rtx
,
7786 cfun_frame_layout
.backchain_offset
));
7788 addr
= gen_rtx_MEM (Pmode
, stack_pointer_rtx
);
7789 set_mem_alias_set (addr
, get_frame_alias_set ());
7790 insn
= emit_insn (gen_move_insn (addr
, temp_reg
));
7793 /* If we support asynchronous exceptions (e.g. for Java),
7794 we need to make sure the backchain pointer is set up
7795 before any possibly trapping memory access. */
7797 if (TARGET_BACKCHAIN
&& flag_non_call_exceptions
)
7799 addr
= gen_rtx_MEM (BLKmode
, gen_rtx_SCRATCH (VOIDmode
));
7800 emit_clobber (addr
);
7804 /* Save fprs 8 - 15 (64 bit ABI). */
7806 if (cfun_save_high_fprs_p
&& next_fpr
)
7808 /* If the stack might be accessed through a different register
7809 we have to make sure that the stack pointer decrement is not
7810 moved below the use of the stack slots. */
7811 s390_emit_stack_tie ();
7813 insn
= emit_insn (gen_add2_insn (temp_reg
,
7814 GEN_INT (cfun_frame_layout
.f8_offset
)));
7818 for (i
= 24; i
<= next_fpr
; i
++)
7819 if (cfun_fpr_bit_p (i
- 16))
7821 rtx addr
= plus_constant (stack_pointer_rtx
,
7822 cfun_frame_layout
.frame_size
7823 + cfun_frame_layout
.f8_offset
7826 insn
= save_fpr (temp_reg
, offset
, i
);
7828 RTX_FRAME_RELATED_P (insn
) = 1;
7830 gen_rtx_EXPR_LIST (REG_FRAME_RELATED_EXPR
,
7831 gen_rtx_SET (VOIDmode
,
7832 gen_rtx_MEM (DFmode
, addr
),
7833 gen_rtx_REG (DFmode
, i
)),
7838 /* Set frame pointer, if needed. */
7840 if (frame_pointer_needed
)
7842 insn
= emit_move_insn (hard_frame_pointer_rtx
, stack_pointer_rtx
);
7843 RTX_FRAME_RELATED_P (insn
) = 1;
7846 /* Set up got pointer, if needed. */
7848 if (flag_pic
&& df_regs_ever_live_p (PIC_OFFSET_TABLE_REGNUM
))
7850 rtx insns
= s390_load_got ();
7852 for (insn
= insns
; insn
; insn
= NEXT_INSN (insn
))
7853 annotate_constant_pool_refs (&PATTERN (insn
));
7858 if (TARGET_TPF_PROFILING
)
7860 /* Generate a BAS instruction to serve as a function
7861 entry intercept to facilitate the use of tracing
7862 algorithms located at the branch target. */
7863 emit_insn (gen_prologue_tpf ());
7865 /* Emit a blockage here so that all code
7866 lies between the profiling mechanisms. */
7867 emit_insn (gen_blockage ());
7871 /* Expand the epilogue into a bunch of separate insns. */
7874 s390_emit_epilogue (bool sibcall
)
7876 rtx frame_pointer
, return_reg
;
7877 int area_bottom
, area_top
, offset
= 0;
7882 if (TARGET_TPF_PROFILING
)
7885 /* Generate a BAS instruction to serve as a function
7886 entry intercept to facilitate the use of tracing
7887 algorithms located at the branch target. */
7889 /* Emit a blockage here so that all code
7890 lies between the profiling mechanisms. */
7891 emit_insn (gen_blockage ());
7893 emit_insn (gen_epilogue_tpf ());
7896 /* Check whether to use frame or stack pointer for restore. */
7898 frame_pointer
= (frame_pointer_needed
7899 ? hard_frame_pointer_rtx
: stack_pointer_rtx
);
7901 s390_frame_area (&area_bottom
, &area_top
);
7903 /* Check whether we can access the register save area.
7904 If not, increment the frame pointer as required. */
7906 if (area_top
<= area_bottom
)
7908 /* Nothing to restore. */
7910 else if (DISP_IN_RANGE (cfun_frame_layout
.frame_size
+ area_bottom
)
7911 && DISP_IN_RANGE (cfun_frame_layout
.frame_size
+ area_top
- 1))
7913 /* Area is in range. */
7914 offset
= cfun_frame_layout
.frame_size
;
7918 rtx insn
, frame_off
;
7920 offset
= area_bottom
< 0 ? -area_bottom
: 0;
7921 frame_off
= GEN_INT (cfun_frame_layout
.frame_size
- offset
);
7923 if (DISP_IN_RANGE (INTVAL (frame_off
)))
7925 insn
= gen_rtx_SET (VOIDmode
, frame_pointer
,
7926 gen_rtx_PLUS (Pmode
, frame_pointer
, frame_off
));
7927 insn
= emit_insn (insn
);
7931 if (!CONST_OK_FOR_K (INTVAL (frame_off
)))
7932 frame_off
= force_const_mem (Pmode
, frame_off
);
7934 insn
= emit_insn (gen_add2_insn (frame_pointer
, frame_off
));
7935 annotate_constant_pool_refs (&PATTERN (insn
));
7939 /* Restore call saved fprs. */
7943 if (cfun_save_high_fprs_p
)
7945 next_offset
= cfun_frame_layout
.f8_offset
;
7946 for (i
= 24; i
< 32; i
++)
7948 if (cfun_fpr_bit_p (i
- 16))
7950 restore_fpr (frame_pointer
,
7951 offset
+ next_offset
, i
);
7960 next_offset
= cfun_frame_layout
.f4_offset
;
7961 for (i
= 18; i
< 20; i
++)
7963 if (cfun_fpr_bit_p (i
- 16))
7965 restore_fpr (frame_pointer
,
7966 offset
+ next_offset
, i
);
7969 else if (!TARGET_PACKED_STACK
)
7975 /* Return register. */
7977 return_reg
= gen_rtx_REG (Pmode
, RETURN_REGNUM
);
7979 /* Restore call saved gprs. */
7981 if (cfun_frame_layout
.first_restore_gpr
!= -1)
7986 /* Check for global register and save them
7987 to stack location from where they get restored. */
7989 for (i
= cfun_frame_layout
.first_restore_gpr
;
7990 i
<= cfun_frame_layout
.last_restore_gpr
;
7993 /* These registers are special and need to be
7994 restored in any case. */
7995 if (i
== STACK_POINTER_REGNUM
7996 || i
== RETURN_REGNUM
7998 || (flag_pic
&& i
== (int)PIC_OFFSET_TABLE_REGNUM
))
8003 addr
= plus_constant (frame_pointer
,
8004 offset
+ cfun_frame_layout
.gprs_offset
8005 + (i
- cfun_frame_layout
.first_save_gpr_slot
)
8007 addr
= gen_rtx_MEM (Pmode
, addr
);
8008 set_mem_alias_set (addr
, get_frame_alias_set ());
8009 emit_move_insn (addr
, gen_rtx_REG (Pmode
, i
));
8015 /* Fetch return address from stack before load multiple,
8016 this will do good for scheduling. */
8018 if (cfun_frame_layout
.save_return_addr_p
8019 || (cfun_frame_layout
.first_restore_gpr
< BASE_REGNUM
8020 && cfun_frame_layout
.last_restore_gpr
> RETURN_REGNUM
))
8022 int return_regnum
= find_unused_clobbered_reg();
8025 return_reg
= gen_rtx_REG (Pmode
, return_regnum
);
8027 addr
= plus_constant (frame_pointer
,
8028 offset
+ cfun_frame_layout
.gprs_offset
8030 - cfun_frame_layout
.first_save_gpr_slot
)
8032 addr
= gen_rtx_MEM (Pmode
, addr
);
8033 set_mem_alias_set (addr
, get_frame_alias_set ());
8034 emit_move_insn (return_reg
, addr
);
8038 insn
= restore_gprs (frame_pointer
,
8039 offset
+ cfun_frame_layout
.gprs_offset
8040 + (cfun_frame_layout
.first_restore_gpr
8041 - cfun_frame_layout
.first_save_gpr_slot
)
8043 cfun_frame_layout
.first_restore_gpr
,
8044 cfun_frame_layout
.last_restore_gpr
);
8051 /* Return to caller. */
8053 p
= rtvec_alloc (2);
8055 RTVEC_ELT (p
, 0) = gen_rtx_RETURN (VOIDmode
);
8056 RTVEC_ELT (p
, 1) = gen_rtx_USE (VOIDmode
, return_reg
);
8057 emit_jump_insn (gen_rtx_PARALLEL (VOIDmode
, p
));
8062 /* Return the size in bytes of a function argument of
8063 type TYPE and/or mode MODE. At least one of TYPE or
8064 MODE must be specified. */
8067 s390_function_arg_size (enum machine_mode mode
, const_tree type
)
8070 return int_size_in_bytes (type
);
8072 /* No type info available for some library calls ... */
8073 if (mode
!= BLKmode
)
8074 return GET_MODE_SIZE (mode
);
8076 /* If we have neither type nor mode, abort */
8080 /* Return true if a function argument of type TYPE and mode MODE
8081 is to be passed in a floating-point register, if available. */
8084 s390_function_arg_float (enum machine_mode mode
, tree type
)
8086 int size
= s390_function_arg_size (mode
, type
);
8090 /* Soft-float changes the ABI: no floating-point registers are used. */
8091 if (TARGET_SOFT_FLOAT
)
8094 /* No type info available for some library calls ... */
8096 return mode
== SFmode
|| mode
== DFmode
|| mode
== SDmode
|| mode
== DDmode
;
8098 /* The ABI says that record types with a single member are treated
8099 just like that member would be. */
8100 while (TREE_CODE (type
) == RECORD_TYPE
)
8102 tree field
, single
= NULL_TREE
;
8104 for (field
= TYPE_FIELDS (type
); field
; field
= TREE_CHAIN (field
))
8106 if (TREE_CODE (field
) != FIELD_DECL
)
8109 if (single
== NULL_TREE
)
8110 single
= TREE_TYPE (field
);
8115 if (single
== NULL_TREE
)
8121 return TREE_CODE (type
) == REAL_TYPE
;
8124 /* Return true if a function argument of type TYPE and mode MODE
8125 is to be passed in an integer register, or a pair of integer
8126 registers, if available. */
8129 s390_function_arg_integer (enum machine_mode mode
, tree type
)
8131 int size
= s390_function_arg_size (mode
, type
);
8135 /* No type info available for some library calls ... */
8137 return GET_MODE_CLASS (mode
) == MODE_INT
8138 || (TARGET_SOFT_FLOAT
&& SCALAR_FLOAT_MODE_P (mode
));
8140 /* We accept small integral (and similar) types. */
8141 if (INTEGRAL_TYPE_P (type
)
8142 || POINTER_TYPE_P (type
)
8143 || TREE_CODE (type
) == OFFSET_TYPE
8144 || (TARGET_SOFT_FLOAT
&& TREE_CODE (type
) == REAL_TYPE
))
8147 /* We also accept structs of size 1, 2, 4, 8 that are not
8148 passed in floating-point registers. */
8149 if (AGGREGATE_TYPE_P (type
)
8150 && exact_log2 (size
) >= 0
8151 && !s390_function_arg_float (mode
, type
))
8157 /* Return 1 if a function argument of type TYPE and mode MODE
8158 is to be passed by reference. The ABI specifies that only
8159 structures of size 1, 2, 4, or 8 bytes are passed by value,
8160 all other structures (and complex numbers) are passed by
8164 s390_pass_by_reference (CUMULATIVE_ARGS
*ca ATTRIBUTE_UNUSED
,
8165 enum machine_mode mode
, const_tree type
,
8166 bool named ATTRIBUTE_UNUSED
)
8168 int size
= s390_function_arg_size (mode
, type
);
8174 if (AGGREGATE_TYPE_P (type
) && exact_log2 (size
) < 0)
8177 if (TREE_CODE (type
) == COMPLEX_TYPE
8178 || TREE_CODE (type
) == VECTOR_TYPE
)
8185 /* Update the data in CUM to advance over an argument of mode MODE and
8186 data type TYPE. (TYPE is null for libcalls where that information
8187 may not be available.). The boolean NAMED specifies whether the
8188 argument is a named argument (as opposed to an unnamed argument
8189 matching an ellipsis). */
8192 s390_function_arg_advance (CUMULATIVE_ARGS
*cum
, enum machine_mode mode
,
8193 tree type
, int named ATTRIBUTE_UNUSED
)
8195 if (s390_function_arg_float (mode
, type
))
8199 else if (s390_function_arg_integer (mode
, type
))
8201 int size
= s390_function_arg_size (mode
, type
);
8202 cum
->gprs
+= ((size
+ UNITS_PER_WORD
-1) / UNITS_PER_WORD
);
8208 /* Define where to put the arguments to a function.
8209 Value is zero to push the argument on the stack,
8210 or a hard register in which to store the argument.
8212 MODE is the argument's machine mode.
8213 TYPE is the data type of the argument (as a tree).
8214 This is null for libcalls where that information may
8216 CUM is a variable of type CUMULATIVE_ARGS which gives info about
8217 the preceding args and about the function being called.
8218 NAMED is nonzero if this argument is a named parameter
8219 (otherwise it is an extra parameter matching an ellipsis).
8221 On S/390, we use general purpose registers 2 through 6 to
8222 pass integer, pointer, and certain structure arguments, and
8223 floating point registers 0 and 2 (0, 2, 4, and 6 on 64-bit)
8224 to pass floating point arguments. All remaining arguments
8225 are pushed to the stack. */
8228 s390_function_arg (CUMULATIVE_ARGS
*cum
, enum machine_mode mode
, tree type
,
8229 int named ATTRIBUTE_UNUSED
)
8231 if (s390_function_arg_float (mode
, type
))
8233 if (cum
->fprs
+ 1 > FP_ARG_NUM_REG
)
8236 return gen_rtx_REG (mode
, cum
->fprs
+ 16);
8238 else if (s390_function_arg_integer (mode
, type
))
8240 int size
= s390_function_arg_size (mode
, type
);
8241 int n_gprs
= (size
+ UNITS_PER_WORD
-1) / UNITS_PER_WORD
;
8243 if (cum
->gprs
+ n_gprs
> GP_ARG_NUM_REG
)
8246 return gen_rtx_REG (mode
, cum
->gprs
+ 2);
8249 /* After the real arguments, expand_call calls us once again
8250 with a void_type_node type. Whatever we return here is
8251 passed as operand 2 to the call expanders.
8253 We don't need this feature ... */
8254 else if (type
== void_type_node
)
8260 /* Return true if return values of type TYPE should be returned
8261 in a memory buffer whose address is passed by the caller as
8262 hidden first argument. */
8265 s390_return_in_memory (const_tree type
, const_tree fundecl ATTRIBUTE_UNUSED
)
8267 /* We accept small integral (and similar) types. */
8268 if (INTEGRAL_TYPE_P (type
)
8269 || POINTER_TYPE_P (type
)
8270 || TREE_CODE (type
) == OFFSET_TYPE
8271 || TREE_CODE (type
) == REAL_TYPE
)
8272 return int_size_in_bytes (type
) > 8;
8274 /* Aggregates and similar constructs are always returned
8276 if (AGGREGATE_TYPE_P (type
)
8277 || TREE_CODE (type
) == COMPLEX_TYPE
8278 || TREE_CODE (type
) == VECTOR_TYPE
)
8281 /* ??? We get called on all sorts of random stuff from
8282 aggregate_value_p. We can't abort, but it's not clear
8283 what's safe to return. Pretend it's a struct I guess. */
8287 /* Define where to return a (scalar) value of type TYPE.
8288 If TYPE is null, define where to return a (scalar)
8289 value of mode MODE from a libcall. */
8292 s390_function_value (const_tree type
, enum machine_mode mode
)
8296 int unsignedp
= TYPE_UNSIGNED (type
);
8297 mode
= promote_mode (type
, TYPE_MODE (type
), &unsignedp
, 1);
8300 gcc_assert (GET_MODE_CLASS (mode
) == MODE_INT
|| SCALAR_FLOAT_MODE_P (mode
));
8301 gcc_assert (GET_MODE_SIZE (mode
) <= 8);
8303 if (TARGET_HARD_FLOAT
&& SCALAR_FLOAT_MODE_P (mode
))
8304 return gen_rtx_REG (mode
, 16);
8306 return gen_rtx_REG (mode
, 2);
8310 /* Create and return the va_list datatype.
8312 On S/390, va_list is an array type equivalent to
8314 typedef struct __va_list_tag
8318 void *__overflow_arg_area;
8319 void *__reg_save_area;
8322 where __gpr and __fpr hold the number of general purpose
8323 or floating point arguments used up to now, respectively,
8324 __overflow_arg_area points to the stack location of the
8325 next argument passed on the stack, and __reg_save_area
8326 always points to the start of the register area in the
8327 call frame of the current function. The function prologue
8328 saves all registers used for argument passing into this
8329 area if the function uses variable arguments. */
8332 s390_build_builtin_va_list (void)
8334 tree f_gpr
, f_fpr
, f_ovf
, f_sav
, record
, type_decl
;
8336 record
= lang_hooks
.types
.make_type (RECORD_TYPE
);
8339 build_decl (TYPE_DECL
, get_identifier ("__va_list_tag"), record
);
8341 f_gpr
= build_decl (FIELD_DECL
, get_identifier ("__gpr"),
8342 long_integer_type_node
);
8343 f_fpr
= build_decl (FIELD_DECL
, get_identifier ("__fpr"),
8344 long_integer_type_node
);
8345 f_ovf
= build_decl (FIELD_DECL
, get_identifier ("__overflow_arg_area"),
8347 f_sav
= build_decl (FIELD_DECL
, get_identifier ("__reg_save_area"),
8350 va_list_gpr_counter_field
= f_gpr
;
8351 va_list_fpr_counter_field
= f_fpr
;
8353 DECL_FIELD_CONTEXT (f_gpr
) = record
;
8354 DECL_FIELD_CONTEXT (f_fpr
) = record
;
8355 DECL_FIELD_CONTEXT (f_ovf
) = record
;
8356 DECL_FIELD_CONTEXT (f_sav
) = record
;
8358 TREE_CHAIN (record
) = type_decl
;
8359 TYPE_NAME (record
) = type_decl
;
8360 TYPE_FIELDS (record
) = f_gpr
;
8361 TREE_CHAIN (f_gpr
) = f_fpr
;
8362 TREE_CHAIN (f_fpr
) = f_ovf
;
8363 TREE_CHAIN (f_ovf
) = f_sav
;
8365 layout_type (record
);
8367 /* The correct type is an array type of one element. */
8368 return build_array_type (record
, build_index_type (size_zero_node
));
8371 /* Implement va_start by filling the va_list structure VALIST.
8372 STDARG_P is always true, and ignored.
8373 NEXTARG points to the first anonymous stack argument.
8375 The following global variables are used to initialize
8376 the va_list structure:
8379 holds number of gprs and fprs used for named arguments.
8380 crtl->args.arg_offset_rtx:
8381 holds the offset of the first anonymous stack argument
8382 (relative to the virtual arg pointer). */
8385 s390_va_start (tree valist
, rtx nextarg ATTRIBUTE_UNUSED
)
8387 HOST_WIDE_INT n_gpr
, n_fpr
;
8389 tree f_gpr
, f_fpr
, f_ovf
, f_sav
;
8390 tree gpr
, fpr
, ovf
, sav
, t
;
8392 f_gpr
= TYPE_FIELDS (TREE_TYPE (va_list_type_node
));
8393 f_fpr
= TREE_CHAIN (f_gpr
);
8394 f_ovf
= TREE_CHAIN (f_fpr
);
8395 f_sav
= TREE_CHAIN (f_ovf
);
8397 valist
= build_va_arg_indirect_ref (valist
);
8398 gpr
= build3 (COMPONENT_REF
, TREE_TYPE (f_gpr
), valist
, f_gpr
, NULL_TREE
);
8399 fpr
= build3 (COMPONENT_REF
, TREE_TYPE (f_fpr
), valist
, f_fpr
, NULL_TREE
);
8400 ovf
= build3 (COMPONENT_REF
, TREE_TYPE (f_ovf
), valist
, f_ovf
, NULL_TREE
);
8401 sav
= build3 (COMPONENT_REF
, TREE_TYPE (f_sav
), valist
, f_sav
, NULL_TREE
);
8403 /* Count number of gp and fp argument registers used. */
8405 n_gpr
= crtl
->args
.info
.gprs
;
8406 n_fpr
= crtl
->args
.info
.fprs
;
8408 if (cfun
->va_list_gpr_size
)
8410 t
= build2 (GIMPLE_MODIFY_STMT
, TREE_TYPE (gpr
), gpr
,
8411 build_int_cst (NULL_TREE
, n_gpr
));
8412 TREE_SIDE_EFFECTS (t
) = 1;
8413 expand_expr (t
, const0_rtx
, VOIDmode
, EXPAND_NORMAL
);
8416 if (cfun
->va_list_fpr_size
)
8418 t
= build2 (GIMPLE_MODIFY_STMT
, TREE_TYPE (fpr
), fpr
,
8419 build_int_cst (NULL_TREE
, n_fpr
));
8420 TREE_SIDE_EFFECTS (t
) = 1;
8421 expand_expr (t
, const0_rtx
, VOIDmode
, EXPAND_NORMAL
);
8424 /* Find the overflow area. */
8425 if (n_gpr
+ cfun
->va_list_gpr_size
> GP_ARG_NUM_REG
8426 || n_fpr
+ cfun
->va_list_fpr_size
> FP_ARG_NUM_REG
)
8428 t
= make_tree (TREE_TYPE (ovf
), virtual_incoming_args_rtx
);
8430 off
= INTVAL (crtl
->args
.arg_offset_rtx
);
8431 off
= off
< 0 ? 0 : off
;
8432 if (TARGET_DEBUG_ARG
)
8433 fprintf (stderr
, "va_start: n_gpr = %d, n_fpr = %d off %d\n",
8434 (int)n_gpr
, (int)n_fpr
, off
);
8436 t
= build2 (POINTER_PLUS_EXPR
, TREE_TYPE (ovf
), t
, size_int (off
));
8438 t
= build2 (GIMPLE_MODIFY_STMT
, TREE_TYPE (ovf
), ovf
, t
);
8439 TREE_SIDE_EFFECTS (t
) = 1;
8440 expand_expr (t
, const0_rtx
, VOIDmode
, EXPAND_NORMAL
);
8443 /* Find the register save area. */
8444 if ((cfun
->va_list_gpr_size
&& n_gpr
< GP_ARG_NUM_REG
)
8445 || (cfun
->va_list_fpr_size
&& n_fpr
< FP_ARG_NUM_REG
))
8447 t
= make_tree (TREE_TYPE (sav
), return_address_pointer_rtx
);
8448 t
= build2 (POINTER_PLUS_EXPR
, TREE_TYPE (sav
), t
,
8449 size_int (-RETURN_REGNUM
* UNITS_PER_WORD
));
8451 t
= build2 (GIMPLE_MODIFY_STMT
, TREE_TYPE (sav
), sav
, t
);
8452 TREE_SIDE_EFFECTS (t
) = 1;
8453 expand_expr (t
, const0_rtx
, VOIDmode
, EXPAND_NORMAL
);
8457 /* Implement va_arg by updating the va_list structure
8458 VALIST as required to retrieve an argument of type
8459 TYPE, and returning that argument.
8461 Generates code equivalent to:
8463 if (integral value) {
8464 if (size <= 4 && args.gpr < 5 ||
8465 size > 4 && args.gpr < 4 )
8466 ret = args.reg_save_area[args.gpr+8]
8468 ret = *args.overflow_arg_area++;
8469 } else if (float value) {
8471 ret = args.reg_save_area[args.fpr+64]
8473 ret = *args.overflow_arg_area++;
8474 } else if (aggregate value) {
8476 ret = *args.reg_save_area[args.gpr]
8478 ret = **args.overflow_arg_area++;
8482 s390_gimplify_va_arg (tree valist
, tree type
, tree
*pre_p
,
8483 tree
*post_p ATTRIBUTE_UNUSED
)
8485 tree f_gpr
, f_fpr
, f_ovf
, f_sav
;
8486 tree gpr
, fpr
, ovf
, sav
, reg
, t
, u
;
8487 int indirect_p
, size
, n_reg
, sav_ofs
, sav_scale
, max_reg
;
8488 tree lab_false
, lab_over
, addr
;
8490 f_gpr
= TYPE_FIELDS (TREE_TYPE (va_list_type_node
));
8491 f_fpr
= TREE_CHAIN (f_gpr
);
8492 f_ovf
= TREE_CHAIN (f_fpr
);
8493 f_sav
= TREE_CHAIN (f_ovf
);
8495 valist
= build_va_arg_indirect_ref (valist
);
8496 gpr
= build3 (COMPONENT_REF
, TREE_TYPE (f_gpr
), valist
, f_gpr
, NULL_TREE
);
8497 fpr
= build3 (COMPONENT_REF
, TREE_TYPE (f_fpr
), valist
, f_fpr
, NULL_TREE
);
8498 ovf
= build3 (COMPONENT_REF
, TREE_TYPE (f_ovf
), valist
, f_ovf
, NULL_TREE
);
8499 sav
= build3 (COMPONENT_REF
, TREE_TYPE (f_sav
), valist
, f_sav
, NULL_TREE
);
8501 size
= int_size_in_bytes (type
);
8503 if (pass_by_reference (NULL
, TYPE_MODE (type
), type
, false))
8505 if (TARGET_DEBUG_ARG
)
8507 fprintf (stderr
, "va_arg: aggregate type");
8511 /* Aggregates are passed by reference. */
8516 /* kernel stack layout on 31 bit: It is assumed here that no padding
8517 will be added by s390_frame_info because for va_args always an even
8518 number of gprs has to be saved r15-r2 = 14 regs. */
8519 sav_ofs
= 2 * UNITS_PER_WORD
;
8520 sav_scale
= UNITS_PER_WORD
;
8521 size
= UNITS_PER_WORD
;
8522 max_reg
= GP_ARG_NUM_REG
- n_reg
;
8524 else if (s390_function_arg_float (TYPE_MODE (type
), type
))
8526 if (TARGET_DEBUG_ARG
)
8528 fprintf (stderr
, "va_arg: float type");
8532 /* FP args go in FP registers, if present. */
8536 sav_ofs
= 16 * UNITS_PER_WORD
;
8538 max_reg
= FP_ARG_NUM_REG
- n_reg
;
8542 if (TARGET_DEBUG_ARG
)
8544 fprintf (stderr
, "va_arg: other type");
8548 /* Otherwise into GP registers. */
8551 n_reg
= (size
+ UNITS_PER_WORD
- 1) / UNITS_PER_WORD
;
8553 /* kernel stack layout on 31 bit: It is assumed here that no padding
8554 will be added by s390_frame_info because for va_args always an even
8555 number of gprs has to be saved r15-r2 = 14 regs. */
8556 sav_ofs
= 2 * UNITS_PER_WORD
;
8558 if (size
< UNITS_PER_WORD
)
8559 sav_ofs
+= UNITS_PER_WORD
- size
;
8561 sav_scale
= UNITS_PER_WORD
;
8562 max_reg
= GP_ARG_NUM_REG
- n_reg
;
8565 /* Pull the value out of the saved registers ... */
8567 lab_false
= create_artificial_label ();
8568 lab_over
= create_artificial_label ();
8569 addr
= create_tmp_var (ptr_type_node
, "addr");
8570 DECL_POINTER_ALIAS_SET (addr
) = get_varargs_alias_set ();
8572 t
= fold_convert (TREE_TYPE (reg
), size_int (max_reg
));
8573 t
= build2 (GT_EXPR
, boolean_type_node
, reg
, t
);
8574 u
= build1 (GOTO_EXPR
, void_type_node
, lab_false
);
8575 t
= build3 (COND_EXPR
, void_type_node
, t
, u
, NULL_TREE
);
8576 gimplify_and_add (t
, pre_p
);
8578 t
= build2 (POINTER_PLUS_EXPR
, ptr_type_node
, sav
,
8579 size_int (sav_ofs
));
8580 u
= build2 (MULT_EXPR
, TREE_TYPE (reg
), reg
,
8581 fold_convert (TREE_TYPE (reg
), size_int (sav_scale
)));
8582 t
= build2 (POINTER_PLUS_EXPR
, ptr_type_node
, t
, fold_convert (sizetype
, u
));
8584 t
= build2 (GIMPLE_MODIFY_STMT
, void_type_node
, addr
, t
);
8585 gimplify_and_add (t
, pre_p
);
8587 t
= build1 (GOTO_EXPR
, void_type_node
, lab_over
);
8588 gimplify_and_add (t
, pre_p
);
8590 t
= build1 (LABEL_EXPR
, void_type_node
, lab_false
);
8591 append_to_statement_list (t
, pre_p
);
8594 /* ... Otherwise out of the overflow area. */
8597 if (size
< UNITS_PER_WORD
)
8598 t
= build2 (POINTER_PLUS_EXPR
, ptr_type_node
, t
,
8599 size_int (UNITS_PER_WORD
- size
));
8601 gimplify_expr (&t
, pre_p
, NULL
, is_gimple_val
, fb_rvalue
);
8603 u
= build2 (GIMPLE_MODIFY_STMT
, void_type_node
, addr
, t
);
8604 gimplify_and_add (u
, pre_p
);
8606 t
= build2 (POINTER_PLUS_EXPR
, ptr_type_node
, t
,
8608 t
= build2 (GIMPLE_MODIFY_STMT
, ptr_type_node
, ovf
, t
);
8609 gimplify_and_add (t
, pre_p
);
8611 t
= build1 (LABEL_EXPR
, void_type_node
, lab_over
);
8612 append_to_statement_list (t
, pre_p
);
8615 /* Increment register save count. */
8617 u
= build2 (PREINCREMENT_EXPR
, TREE_TYPE (reg
), reg
,
8618 fold_convert (TREE_TYPE (reg
), size_int (n_reg
)));
8619 gimplify_and_add (u
, pre_p
);
8623 t
= build_pointer_type (build_pointer_type (type
));
8624 addr
= fold_convert (t
, addr
);
8625 addr
= build_va_arg_indirect_ref (addr
);
8629 t
= build_pointer_type (type
);
8630 addr
= fold_convert (t
, addr
);
8633 return build_va_arg_indirect_ref (addr
);
8641 S390_BUILTIN_THREAD_POINTER
,
8642 S390_BUILTIN_SET_THREAD_POINTER
,
8647 static unsigned int const code_for_builtin_64
[S390_BUILTIN_max
] = {
8652 static unsigned int const code_for_builtin_31
[S390_BUILTIN_max
] = {
8658 s390_init_builtins (void)
8662 ftype
= build_function_type (ptr_type_node
, void_list_node
);
8663 add_builtin_function ("__builtin_thread_pointer", ftype
,
8664 S390_BUILTIN_THREAD_POINTER
, BUILT_IN_MD
,
8667 ftype
= build_function_type_list (void_type_node
, ptr_type_node
, NULL_TREE
);
8668 add_builtin_function ("__builtin_set_thread_pointer", ftype
,
8669 S390_BUILTIN_SET_THREAD_POINTER
, BUILT_IN_MD
,
8673 /* Expand an expression EXP that calls a built-in function,
8674 with result going to TARGET if that's convenient
8675 (and in mode MODE if that's convenient).
8676 SUBTARGET may be used as the target for computing one of EXP's operands.
8677 IGNORE is nonzero if the value is to be ignored. */
8680 s390_expand_builtin (tree exp
, rtx target
, rtx subtarget ATTRIBUTE_UNUSED
,
8681 enum machine_mode mode ATTRIBUTE_UNUSED
,
8682 int ignore ATTRIBUTE_UNUSED
)
8686 unsigned int const *code_for_builtin
=
8687 TARGET_64BIT
? code_for_builtin_64
: code_for_builtin_31
;
8689 tree fndecl
= TREE_OPERAND (CALL_EXPR_FN (exp
), 0);
8690 unsigned int fcode
= DECL_FUNCTION_CODE (fndecl
);
8691 enum insn_code icode
;
8692 rtx op
[MAX_ARGS
], pat
;
8696 call_expr_arg_iterator iter
;
8698 if (fcode
>= S390_BUILTIN_max
)
8699 internal_error ("bad builtin fcode");
8700 icode
= code_for_builtin
[fcode
];
8702 internal_error ("bad builtin fcode");
8704 nonvoid
= TREE_TYPE (TREE_TYPE (fndecl
)) != void_type_node
;
8707 FOR_EACH_CALL_EXPR_ARG (arg
, iter
, exp
)
8709 const struct insn_operand_data
*insn_op
;
8711 if (arg
== error_mark_node
)
8713 if (arity
> MAX_ARGS
)
8716 insn_op
= &insn_data
[icode
].operand
[arity
+ nonvoid
];
8718 op
[arity
] = expand_expr (arg
, NULL_RTX
, insn_op
->mode
, 0);
8720 if (!(*insn_op
->predicate
) (op
[arity
], insn_op
->mode
))
8721 op
[arity
] = copy_to_mode_reg (insn_op
->mode
, op
[arity
]);
8727 enum machine_mode tmode
= insn_data
[icode
].operand
[0].mode
;
8729 || GET_MODE (target
) != tmode
8730 || !(*insn_data
[icode
].operand
[0].predicate
) (target
, tmode
))
8731 target
= gen_reg_rtx (tmode
);
8737 pat
= GEN_FCN (icode
) (target
);
8741 pat
= GEN_FCN (icode
) (target
, op
[0]);
8743 pat
= GEN_FCN (icode
) (op
[0]);
8746 pat
= GEN_FCN (icode
) (target
, op
[0], op
[1]);
8762 /* Output assembly code for the trampoline template to
8765 On S/390, we use gpr 1 internally in the trampoline code;
8766 gpr 0 is used to hold the static chain. */
8769 s390_trampoline_template (FILE *file
)
8772 op
[0] = gen_rtx_REG (Pmode
, 0);
8773 op
[1] = gen_rtx_REG (Pmode
, 1);
8777 output_asm_insn ("basr\t%1,0", op
);
8778 output_asm_insn ("lmg\t%0,%1,14(%1)", op
);
8779 output_asm_insn ("br\t%1", op
);
8780 ASM_OUTPUT_SKIP (file
, (HOST_WIDE_INT
)(TRAMPOLINE_SIZE
- 10));
8784 output_asm_insn ("basr\t%1,0", op
);
8785 output_asm_insn ("lm\t%0,%1,6(%1)", op
);
8786 output_asm_insn ("br\t%1", op
);
8787 ASM_OUTPUT_SKIP (file
, (HOST_WIDE_INT
)(TRAMPOLINE_SIZE
- 8));
8791 /* Emit RTL insns to initialize the variable parts of a trampoline.
8792 FNADDR is an RTX for the address of the function's pure code.
8793 CXT is an RTX for the static chain value for the function. */
8796 s390_initialize_trampoline (rtx addr
, rtx fnaddr
, rtx cxt
)
8798 emit_move_insn (gen_rtx_MEM (Pmode
,
8799 memory_address (Pmode
,
8800 plus_constant (addr
, (TARGET_64BIT
? 16 : 8)))), cxt
);
8801 emit_move_insn (gen_rtx_MEM (Pmode
,
8802 memory_address (Pmode
,
8803 plus_constant (addr
, (TARGET_64BIT
? 24 : 12)))), fnaddr
);
8806 /* Output assembler code to FILE to increment profiler label # LABELNO
8807 for profiling a function entry. */
8810 s390_function_profiler (FILE *file
, int labelno
)
8815 ASM_GENERATE_INTERNAL_LABEL (label
, "LP", labelno
);
8817 fprintf (file
, "# function profiler \n");
8819 op
[0] = gen_rtx_REG (Pmode
, RETURN_REGNUM
);
8820 op
[1] = gen_rtx_REG (Pmode
, STACK_POINTER_REGNUM
);
8821 op
[1] = gen_rtx_MEM (Pmode
, plus_constant (op
[1], UNITS_PER_WORD
));
8823 op
[2] = gen_rtx_REG (Pmode
, 1);
8824 op
[3] = gen_rtx_SYMBOL_REF (Pmode
, label
);
8825 SYMBOL_REF_FLAGS (op
[3]) = SYMBOL_FLAG_LOCAL
;
8827 op
[4] = gen_rtx_SYMBOL_REF (Pmode
, "_mcount");
8830 op
[4] = gen_rtx_UNSPEC (Pmode
, gen_rtvec (1, op
[4]), UNSPEC_PLT
);
8831 op
[4] = gen_rtx_CONST (Pmode
, op
[4]);
8836 output_asm_insn ("stg\t%0,%1", op
);
8837 output_asm_insn ("larl\t%2,%3", op
);
8838 output_asm_insn ("brasl\t%0,%4", op
);
8839 output_asm_insn ("lg\t%0,%1", op
);
8843 op
[6] = gen_label_rtx ();
8845 output_asm_insn ("st\t%0,%1", op
);
8846 output_asm_insn ("bras\t%2,%l6", op
);
8847 output_asm_insn (".long\t%4", op
);
8848 output_asm_insn (".long\t%3", op
);
8849 targetm
.asm_out
.internal_label (file
, "L", CODE_LABEL_NUMBER (op
[6]));
8850 output_asm_insn ("l\t%0,0(%2)", op
);
8851 output_asm_insn ("l\t%2,4(%2)", op
);
8852 output_asm_insn ("basr\t%0,%0", op
);
8853 output_asm_insn ("l\t%0,%1", op
);
8857 op
[5] = gen_label_rtx ();
8858 op
[6] = gen_label_rtx ();
8860 output_asm_insn ("st\t%0,%1", op
);
8861 output_asm_insn ("bras\t%2,%l6", op
);
8862 targetm
.asm_out
.internal_label (file
, "L", CODE_LABEL_NUMBER (op
[5]));
8863 output_asm_insn (".long\t%4-%l5", op
);
8864 output_asm_insn (".long\t%3-%l5", op
);
8865 targetm
.asm_out
.internal_label (file
, "L", CODE_LABEL_NUMBER (op
[6]));
8866 output_asm_insn ("lr\t%0,%2", op
);
8867 output_asm_insn ("a\t%0,0(%2)", op
);
8868 output_asm_insn ("a\t%2,4(%2)", op
);
8869 output_asm_insn ("basr\t%0,%0", op
);
8870 output_asm_insn ("l\t%0,%1", op
);
8874 /* Encode symbol attributes (local vs. global, tls model) of a SYMBOL_REF
8875 into its SYMBOL_REF_FLAGS. */
8878 s390_encode_section_info (tree decl
, rtx rtl
, int first
)
8880 default_encode_section_info (decl
, rtl
, first
);
8882 if (TREE_CODE (decl
) == VAR_DECL
)
8884 /* If a variable has a forced alignment to < 2 bytes, mark it
8885 with SYMBOL_FLAG_ALIGN1 to prevent it from being used as LARL
8887 if (DECL_USER_ALIGN (decl
) && DECL_ALIGN (decl
) < 16)
8888 SYMBOL_REF_FLAGS (XEXP (rtl
, 0)) |= SYMBOL_FLAG_ALIGN1
;
8889 if (!DECL_SIZE (decl
)
8890 || !DECL_ALIGN (decl
)
8891 || !host_integerp (DECL_SIZE (decl
), 0)
8892 || (DECL_ALIGN (decl
) <= 64
8893 && DECL_ALIGN (decl
) != tree_low_cst (DECL_SIZE (decl
), 0)))
8894 SYMBOL_REF_FLAGS (XEXP (rtl
, 0)) |= SYMBOL_FLAG_NOT_NATURALLY_ALIGNED
;
8897 /* Literal pool references don't have a decl so they are handled
8898 differently here. We rely on the information in the MEM_ALIGN
8899 entry to decide upon natural alignment. */
8901 && GET_CODE (XEXP (rtl
, 0)) == SYMBOL_REF
8902 && TREE_CONSTANT_POOL_ADDRESS_P (XEXP (rtl
, 0))
8903 && (MEM_ALIGN (rtl
) == 0
8904 || MEM_ALIGN (rtl
) < GET_MODE_BITSIZE (GET_MODE (rtl
))))
8905 SYMBOL_REF_FLAGS (XEXP (rtl
, 0)) |= SYMBOL_FLAG_NOT_NATURALLY_ALIGNED
;
8908 /* Output thunk to FILE that implements a C++ virtual function call (with
8909 multiple inheritance) to FUNCTION. The thunk adjusts the this pointer
8910 by DELTA, and unless VCALL_OFFSET is zero, applies an additional adjustment
8911 stored at VCALL_OFFSET in the vtable whose address is located at offset 0
8912 relative to the resulting this pointer. */
8915 s390_output_mi_thunk (FILE *file
, tree thunk ATTRIBUTE_UNUSED
,
8916 HOST_WIDE_INT delta
, HOST_WIDE_INT vcall_offset
,
8922 /* Operand 0 is the target function. */
8923 op
[0] = XEXP (DECL_RTL (function
), 0);
8924 if (flag_pic
&& !SYMBOL_REF_LOCAL_P (op
[0]))
8927 op
[0] = gen_rtx_UNSPEC (Pmode
, gen_rtvec (1, op
[0]),
8928 TARGET_64BIT
? UNSPEC_PLT
: UNSPEC_GOT
);
8929 op
[0] = gen_rtx_CONST (Pmode
, op
[0]);
8932 /* Operand 1 is the 'this' pointer. */
8933 if (aggregate_value_p (TREE_TYPE (TREE_TYPE (function
)), function
))
8934 op
[1] = gen_rtx_REG (Pmode
, 3);
8936 op
[1] = gen_rtx_REG (Pmode
, 2);
8938 /* Operand 2 is the delta. */
8939 op
[2] = GEN_INT (delta
);
8941 /* Operand 3 is the vcall_offset. */
8942 op
[3] = GEN_INT (vcall_offset
);
8944 /* Operand 4 is the temporary register. */
8945 op
[4] = gen_rtx_REG (Pmode
, 1);
8947 /* Operands 5 to 8 can be used as labels. */
8953 /* Operand 9 can be used for temporary register. */
8956 /* Generate code. */
8959 /* Setup literal pool pointer if required. */
8960 if ((!DISP_IN_RANGE (delta
)
8961 && !CONST_OK_FOR_K (delta
)
8962 && !CONST_OK_FOR_Os (delta
))
8963 || (!DISP_IN_RANGE (vcall_offset
)
8964 && !CONST_OK_FOR_K (vcall_offset
)
8965 && !CONST_OK_FOR_Os (vcall_offset
)))
8967 op
[5] = gen_label_rtx ();
8968 output_asm_insn ("larl\t%4,%5", op
);
8971 /* Add DELTA to this pointer. */
8974 if (CONST_OK_FOR_J (delta
))
8975 output_asm_insn ("la\t%1,%2(%1)", op
);
8976 else if (DISP_IN_RANGE (delta
))
8977 output_asm_insn ("lay\t%1,%2(%1)", op
);
8978 else if (CONST_OK_FOR_K (delta
))
8979 output_asm_insn ("aghi\t%1,%2", op
);
8980 else if (CONST_OK_FOR_Os (delta
))
8981 output_asm_insn ("agfi\t%1,%2", op
);
8984 op
[6] = gen_label_rtx ();
8985 output_asm_insn ("agf\t%1,%6-%5(%4)", op
);
8989 /* Perform vcall adjustment. */
8992 if (DISP_IN_RANGE (vcall_offset
))
8994 output_asm_insn ("lg\t%4,0(%1)", op
);
8995 output_asm_insn ("ag\t%1,%3(%4)", op
);
8997 else if (CONST_OK_FOR_K (vcall_offset
))
8999 output_asm_insn ("lghi\t%4,%3", op
);
9000 output_asm_insn ("ag\t%4,0(%1)", op
);
9001 output_asm_insn ("ag\t%1,0(%4)", op
);
9003 else if (CONST_OK_FOR_Os (vcall_offset
))
9005 output_asm_insn ("lgfi\t%4,%3", op
);
9006 output_asm_insn ("ag\t%4,0(%1)", op
);
9007 output_asm_insn ("ag\t%1,0(%4)", op
);
9011 op
[7] = gen_label_rtx ();
9012 output_asm_insn ("llgf\t%4,%7-%5(%4)", op
);
9013 output_asm_insn ("ag\t%4,0(%1)", op
);
9014 output_asm_insn ("ag\t%1,0(%4)", op
);
9018 /* Jump to target. */
9019 output_asm_insn ("jg\t%0", op
);
9021 /* Output literal pool if required. */
9024 output_asm_insn (".align\t4", op
);
9025 targetm
.asm_out
.internal_label (file
, "L",
9026 CODE_LABEL_NUMBER (op
[5]));
9030 targetm
.asm_out
.internal_label (file
, "L",
9031 CODE_LABEL_NUMBER (op
[6]));
9032 output_asm_insn (".long\t%2", op
);
9036 targetm
.asm_out
.internal_label (file
, "L",
9037 CODE_LABEL_NUMBER (op
[7]));
9038 output_asm_insn (".long\t%3", op
);
9043 /* Setup base pointer if required. */
9045 || (!DISP_IN_RANGE (delta
)
9046 && !CONST_OK_FOR_K (delta
)
9047 && !CONST_OK_FOR_Os (delta
))
9048 || (!DISP_IN_RANGE (delta
)
9049 && !CONST_OK_FOR_K (vcall_offset
)
9050 && !CONST_OK_FOR_Os (vcall_offset
)))
9052 op
[5] = gen_label_rtx ();
9053 output_asm_insn ("basr\t%4,0", op
);
9054 targetm
.asm_out
.internal_label (file
, "L",
9055 CODE_LABEL_NUMBER (op
[5]));
9058 /* Add DELTA to this pointer. */
9061 if (CONST_OK_FOR_J (delta
))
9062 output_asm_insn ("la\t%1,%2(%1)", op
);
9063 else if (DISP_IN_RANGE (delta
))
9064 output_asm_insn ("lay\t%1,%2(%1)", op
);
9065 else if (CONST_OK_FOR_K (delta
))
9066 output_asm_insn ("ahi\t%1,%2", op
);
9067 else if (CONST_OK_FOR_Os (delta
))
9068 output_asm_insn ("afi\t%1,%2", op
);
9071 op
[6] = gen_label_rtx ();
9072 output_asm_insn ("a\t%1,%6-%5(%4)", op
);
9076 /* Perform vcall adjustment. */
9079 if (CONST_OK_FOR_J (vcall_offset
))
9081 output_asm_insn ("l\t%4,0(%1)", op
);
9082 output_asm_insn ("a\t%1,%3(%4)", op
);
9084 else if (DISP_IN_RANGE (vcall_offset
))
9086 output_asm_insn ("l\t%4,0(%1)", op
);
9087 output_asm_insn ("ay\t%1,%3(%4)", op
);
9089 else if (CONST_OK_FOR_K (vcall_offset
))
9091 output_asm_insn ("lhi\t%4,%3", op
);
9092 output_asm_insn ("a\t%4,0(%1)", op
);
9093 output_asm_insn ("a\t%1,0(%4)", op
);
9095 else if (CONST_OK_FOR_Os (vcall_offset
))
9097 output_asm_insn ("iilf\t%4,%3", op
);
9098 output_asm_insn ("a\t%4,0(%1)", op
);
9099 output_asm_insn ("a\t%1,0(%4)", op
);
9103 op
[7] = gen_label_rtx ();
9104 output_asm_insn ("l\t%4,%7-%5(%4)", op
);
9105 output_asm_insn ("a\t%4,0(%1)", op
);
9106 output_asm_insn ("a\t%1,0(%4)", op
);
9109 /* We had to clobber the base pointer register.
9110 Re-setup the base pointer (with a different base). */
9111 op
[5] = gen_label_rtx ();
9112 output_asm_insn ("basr\t%4,0", op
);
9113 targetm
.asm_out
.internal_label (file
, "L",
9114 CODE_LABEL_NUMBER (op
[5]));
9117 /* Jump to target. */
9118 op
[8] = gen_label_rtx ();
9121 output_asm_insn ("l\t%4,%8-%5(%4)", op
);
9123 output_asm_insn ("a\t%4,%8-%5(%4)", op
);
9124 /* We cannot call through .plt, since .plt requires %r12 loaded. */
9125 else if (flag_pic
== 1)
9127 output_asm_insn ("a\t%4,%8-%5(%4)", op
);
9128 output_asm_insn ("l\t%4,%0(%4)", op
);
9130 else if (flag_pic
== 2)
9132 op
[9] = gen_rtx_REG (Pmode
, 0);
9133 output_asm_insn ("l\t%9,%8-4-%5(%4)", op
);
9134 output_asm_insn ("a\t%4,%8-%5(%4)", op
);
9135 output_asm_insn ("ar\t%4,%9", op
);
9136 output_asm_insn ("l\t%4,0(%4)", op
);
9139 output_asm_insn ("br\t%4", op
);
9141 /* Output literal pool. */
9142 output_asm_insn (".align\t4", op
);
9144 if (nonlocal
&& flag_pic
== 2)
9145 output_asm_insn (".long\t%0", op
);
9148 op
[0] = gen_rtx_SYMBOL_REF (Pmode
, "_GLOBAL_OFFSET_TABLE_");
9149 SYMBOL_REF_FLAGS (op
[0]) = SYMBOL_FLAG_LOCAL
;
9152 targetm
.asm_out
.internal_label (file
, "L", CODE_LABEL_NUMBER (op
[8]));
9154 output_asm_insn (".long\t%0", op
);
9156 output_asm_insn (".long\t%0-%5", op
);
9160 targetm
.asm_out
.internal_label (file
, "L",
9161 CODE_LABEL_NUMBER (op
[6]));
9162 output_asm_insn (".long\t%2", op
);
9166 targetm
.asm_out
.internal_label (file
, "L",
9167 CODE_LABEL_NUMBER (op
[7]));
9168 output_asm_insn (".long\t%3", op
);
9174 s390_valid_pointer_mode (enum machine_mode mode
)
9176 return (mode
== SImode
|| (TARGET_64BIT
&& mode
== DImode
));
9179 /* Checks whether the given CALL_EXPR would use a caller
9180 saved register. This is used to decide whether sibling call
9181 optimization could be performed on the respective function
9185 s390_call_saved_register_used (tree call_expr
)
9187 CUMULATIVE_ARGS cum
;
9189 enum machine_mode mode
;
9194 INIT_CUMULATIVE_ARGS (cum
, NULL
, NULL
, 0, 0);
9196 for (i
= 0; i
< call_expr_nargs (call_expr
); i
++)
9198 parameter
= CALL_EXPR_ARG (call_expr
, i
);
9199 gcc_assert (parameter
);
9201 /* For an undeclared variable passed as parameter we will get
9202 an ERROR_MARK node here. */
9203 if (TREE_CODE (parameter
) == ERROR_MARK
)
9206 type
= TREE_TYPE (parameter
);
9209 mode
= TYPE_MODE (type
);
9212 if (pass_by_reference (&cum
, mode
, type
, true))
9215 type
= build_pointer_type (type
);
9218 parm_rtx
= s390_function_arg (&cum
, mode
, type
, 0);
9220 s390_function_arg_advance (&cum
, mode
, type
, 0);
9222 if (parm_rtx
&& REG_P (parm_rtx
))
9225 reg
< HARD_REGNO_NREGS (REGNO (parm_rtx
), GET_MODE (parm_rtx
));
9227 if (! call_used_regs
[reg
+ REGNO (parm_rtx
)])
9234 /* Return true if the given call expression can be
9235 turned into a sibling call.
9236 DECL holds the declaration of the function to be called whereas
9237 EXP is the call expression itself. */
9240 s390_function_ok_for_sibcall (tree decl
, tree exp
)
9242 /* The TPF epilogue uses register 1. */
9243 if (TARGET_TPF_PROFILING
)
9246 /* The 31 bit PLT code uses register 12 (GOT pointer - caller saved)
9247 which would have to be restored before the sibcall. */
9248 if (!TARGET_64BIT
&& flag_pic
&& decl
&& !targetm
.binds_local_p (decl
))
9251 /* Register 6 on s390 is available as an argument register but unfortunately
9252 "caller saved". This makes functions needing this register for arguments
9253 not suitable for sibcalls. */
9254 return !s390_call_saved_register_used (exp
);
9257 /* Return the fixed registers used for condition codes. */
9260 s390_fixed_condition_code_regs (unsigned int *p1
, unsigned int *p2
)
9263 *p2
= INVALID_REGNUM
;
9268 /* This function is used by the call expanders of the machine description.
9269 It emits the call insn itself together with the necessary operations
9270 to adjust the target address and returns the emitted insn.
9271 ADDR_LOCATION is the target address rtx
9272 TLS_CALL the location of the thread-local symbol
9273 RESULT_REG the register where the result of the call should be stored
9274 RETADDR_REG the register where the return address should be stored
9275 If this parameter is NULL_RTX the call is considered
9276 to be a sibling call. */
9279 s390_emit_call (rtx addr_location
, rtx tls_call
, rtx result_reg
,
9282 bool plt_call
= false;
9288 /* Direct function calls need special treatment. */
9289 if (GET_CODE (addr_location
) == SYMBOL_REF
)
9291 /* When calling a global routine in PIC mode, we must
9292 replace the symbol itself with the PLT stub. */
9293 if (flag_pic
&& !SYMBOL_REF_LOCAL_P (addr_location
))
9295 addr_location
= gen_rtx_UNSPEC (Pmode
,
9296 gen_rtvec (1, addr_location
),
9298 addr_location
= gen_rtx_CONST (Pmode
, addr_location
);
9302 /* Unless we can use the bras(l) insn, force the
9303 routine address into a register. */
9304 if (!TARGET_SMALL_EXEC
&& !TARGET_CPU_ZARCH
)
9307 addr_location
= legitimize_pic_address (addr_location
, 0);
9309 addr_location
= force_reg (Pmode
, addr_location
);
9313 /* If it is already an indirect call or the code above moved the
9314 SYMBOL_REF to somewhere else make sure the address can be found in
9316 if (retaddr_reg
== NULL_RTX
9317 && GET_CODE (addr_location
) != SYMBOL_REF
9320 emit_move_insn (gen_rtx_REG (Pmode
, SIBCALL_REGNUM
), addr_location
);
9321 addr_location
= gen_rtx_REG (Pmode
, SIBCALL_REGNUM
);
9324 addr_location
= gen_rtx_MEM (QImode
, addr_location
);
9325 call
= gen_rtx_CALL (VOIDmode
, addr_location
, const0_rtx
);
9327 if (result_reg
!= NULL_RTX
)
9328 call
= gen_rtx_SET (VOIDmode
, result_reg
, call
);
9330 if (retaddr_reg
!= NULL_RTX
)
9332 clobber
= gen_rtx_CLOBBER (VOIDmode
, retaddr_reg
);
9334 if (tls_call
!= NULL_RTX
)
9335 vec
= gen_rtvec (3, call
, clobber
,
9336 gen_rtx_USE (VOIDmode
, tls_call
));
9338 vec
= gen_rtvec (2, call
, clobber
);
9340 call
= gen_rtx_PARALLEL (VOIDmode
, vec
);
9343 insn
= emit_call_insn (call
);
9345 /* 31-bit PLT stubs and tls calls use the GOT register implicitly. */
9346 if ((!TARGET_64BIT
&& plt_call
) || tls_call
!= NULL_RTX
)
9348 /* s390_function_ok_for_sibcall should
9349 have denied sibcalls in this case. */
9350 gcc_assert (retaddr_reg
!= NULL_RTX
);
9352 use_reg (&CALL_INSN_FUNCTION_USAGE (insn
), pic_offset_table_rtx
);
9357 /* Implement CONDITIONAL_REGISTER_USAGE. */
9360 s390_conditional_register_usage (void)
9366 fixed_regs
[PIC_OFFSET_TABLE_REGNUM
] = 1;
9367 call_used_regs
[PIC_OFFSET_TABLE_REGNUM
] = 1;
9369 if (TARGET_CPU_ZARCH
)
9371 fixed_regs
[BASE_REGNUM
] = 0;
9372 call_used_regs
[BASE_REGNUM
] = 0;
9373 fixed_regs
[RETURN_REGNUM
] = 0;
9374 call_used_regs
[RETURN_REGNUM
] = 0;
9378 for (i
= 24; i
< 32; i
++)
9379 call_used_regs
[i
] = call_really_used_regs
[i
] = 0;
9383 for (i
= 18; i
< 20; i
++)
9384 call_used_regs
[i
] = call_really_used_regs
[i
] = 0;
9387 if (TARGET_SOFT_FLOAT
)
9389 for (i
= 16; i
< 32; i
++)
9390 call_used_regs
[i
] = fixed_regs
[i
] = 1;
9394 /* Corresponding function to eh_return expander. */
9396 static GTY(()) rtx s390_tpf_eh_return_symbol
;
9398 s390_emit_tpf_eh_return (rtx target
)
9402 if (!s390_tpf_eh_return_symbol
)
9403 s390_tpf_eh_return_symbol
= gen_rtx_SYMBOL_REF (Pmode
, "__tpf_eh_return");
9405 reg
= gen_rtx_REG (Pmode
, 2);
9407 emit_move_insn (reg
, target
);
9408 insn
= s390_emit_call (s390_tpf_eh_return_symbol
, NULL_RTX
, reg
,
9409 gen_rtx_REG (Pmode
, RETURN_REGNUM
));
9410 use_reg (&CALL_INSN_FUNCTION_USAGE (insn
), reg
);
9412 emit_move_insn (EH_RETURN_HANDLER_RTX
, reg
);
9415 /* Rework the prologue/epilogue to avoid saving/restoring
9416 registers unnecessarily. */
9419 s390_optimize_prologue (void)
9421 rtx insn
, new_insn
, next_insn
;
9423 /* Do a final recompute of the frame-related data. */
9425 s390_update_frame_layout ();
9427 /* If all special registers are in fact used, there's nothing we
9428 can do, so no point in walking the insn list. */
9430 if (cfun_frame_layout
.first_save_gpr
<= BASE_REGNUM
9431 && cfun_frame_layout
.last_save_gpr
>= BASE_REGNUM
9432 && (TARGET_CPU_ZARCH
9433 || (cfun_frame_layout
.first_save_gpr
<= RETURN_REGNUM
9434 && cfun_frame_layout
.last_save_gpr
>= RETURN_REGNUM
)))
9437 /* Search for prologue/epilogue insns and replace them. */
9439 for (insn
= get_insns (); insn
; insn
= next_insn
)
9441 int first
, last
, off
;
9442 rtx set
, base
, offset
;
9444 next_insn
= NEXT_INSN (insn
);
9446 if (GET_CODE (insn
) != INSN
)
9449 if (GET_CODE (PATTERN (insn
)) == PARALLEL
9450 && store_multiple_operation (PATTERN (insn
), VOIDmode
))
9452 set
= XVECEXP (PATTERN (insn
), 0, 0);
9453 first
= REGNO (SET_SRC (set
));
9454 last
= first
+ XVECLEN (PATTERN (insn
), 0) - 1;
9455 offset
= const0_rtx
;
9456 base
= eliminate_constant_term (XEXP (SET_DEST (set
), 0), &offset
);
9457 off
= INTVAL (offset
);
9459 if (GET_CODE (base
) != REG
|| off
< 0)
9461 if (cfun_frame_layout
.first_save_gpr
!= -1
9462 && (cfun_frame_layout
.first_save_gpr
< first
9463 || cfun_frame_layout
.last_save_gpr
> last
))
9465 if (REGNO (base
) != STACK_POINTER_REGNUM
9466 && REGNO (base
) != HARD_FRAME_POINTER_REGNUM
)
9468 if (first
> BASE_REGNUM
|| last
< BASE_REGNUM
)
9471 if (cfun_frame_layout
.first_save_gpr
!= -1)
9473 new_insn
= save_gprs (base
,
9474 off
+ (cfun_frame_layout
.first_save_gpr
9475 - first
) * UNITS_PER_WORD
,
9476 cfun_frame_layout
.first_save_gpr
,
9477 cfun_frame_layout
.last_save_gpr
);
9478 new_insn
= emit_insn_before (new_insn
, insn
);
9479 INSN_ADDRESSES_NEW (new_insn
, -1);
9486 if (cfun_frame_layout
.first_save_gpr
== -1
9487 && GET_CODE (PATTERN (insn
)) == SET
9488 && GET_CODE (SET_SRC (PATTERN (insn
))) == REG
9489 && (REGNO (SET_SRC (PATTERN (insn
))) == BASE_REGNUM
9490 || (!TARGET_CPU_ZARCH
9491 && REGNO (SET_SRC (PATTERN (insn
))) == RETURN_REGNUM
))
9492 && GET_CODE (SET_DEST (PATTERN (insn
))) == MEM
)
9494 set
= PATTERN (insn
);
9495 first
= REGNO (SET_SRC (set
));
9496 offset
= const0_rtx
;
9497 base
= eliminate_constant_term (XEXP (SET_DEST (set
), 0), &offset
);
9498 off
= INTVAL (offset
);
9500 if (GET_CODE (base
) != REG
|| off
< 0)
9502 if (REGNO (base
) != STACK_POINTER_REGNUM
9503 && REGNO (base
) != HARD_FRAME_POINTER_REGNUM
)
9510 if (GET_CODE (PATTERN (insn
)) == PARALLEL
9511 && load_multiple_operation (PATTERN (insn
), VOIDmode
))
9513 set
= XVECEXP (PATTERN (insn
), 0, 0);
9514 first
= REGNO (SET_DEST (set
));
9515 last
= first
+ XVECLEN (PATTERN (insn
), 0) - 1;
9516 offset
= const0_rtx
;
9517 base
= eliminate_constant_term (XEXP (SET_SRC (set
), 0), &offset
);
9518 off
= INTVAL (offset
);
9520 if (GET_CODE (base
) != REG
|| off
< 0)
9522 if (cfun_frame_layout
.first_restore_gpr
!= -1
9523 && (cfun_frame_layout
.first_restore_gpr
< first
9524 || cfun_frame_layout
.last_restore_gpr
> last
))
9526 if (REGNO (base
) != STACK_POINTER_REGNUM
9527 && REGNO (base
) != HARD_FRAME_POINTER_REGNUM
)
9529 if (first
> BASE_REGNUM
|| last
< BASE_REGNUM
)
9532 if (cfun_frame_layout
.first_restore_gpr
!= -1)
9534 new_insn
= restore_gprs (base
,
9535 off
+ (cfun_frame_layout
.first_restore_gpr
9536 - first
) * UNITS_PER_WORD
,
9537 cfun_frame_layout
.first_restore_gpr
,
9538 cfun_frame_layout
.last_restore_gpr
);
9539 new_insn
= emit_insn_before (new_insn
, insn
);
9540 INSN_ADDRESSES_NEW (new_insn
, -1);
9547 if (cfun_frame_layout
.first_restore_gpr
== -1
9548 && GET_CODE (PATTERN (insn
)) == SET
9549 && GET_CODE (SET_DEST (PATTERN (insn
))) == REG
9550 && (REGNO (SET_DEST (PATTERN (insn
))) == BASE_REGNUM
9551 || (!TARGET_CPU_ZARCH
9552 && REGNO (SET_DEST (PATTERN (insn
))) == RETURN_REGNUM
))
9553 && GET_CODE (SET_SRC (PATTERN (insn
))) == MEM
)
9555 set
= PATTERN (insn
);
9556 first
= REGNO (SET_DEST (set
));
9557 offset
= const0_rtx
;
9558 base
= eliminate_constant_term (XEXP (SET_SRC (set
), 0), &offset
);
9559 off
= INTVAL (offset
);
9561 if (GET_CODE (base
) != REG
|| off
< 0)
9563 if (REGNO (base
) != STACK_POINTER_REGNUM
9564 && REGNO (base
) != HARD_FRAME_POINTER_REGNUM
)
9573 /* Perform machine-dependent processing. */
9578 bool pool_overflow
= false;
9580 /* Make sure all splits have been performed; splits after
9581 machine_dependent_reorg might confuse insn length counts. */
9582 split_all_insns_noflow ();
9584 /* From here on decomposed literal pool addresses must be accepted. */
9585 cfun
->machine
->decomposed_literal_pool_addresses_ok_p
= true;
9587 /* Install the main literal pool and the associated base
9588 register load insns.
9590 In addition, there are two problematic situations we need
9593 - the literal pool might be > 4096 bytes in size, so that
9594 some of its elements cannot be directly accessed
9596 - a branch target might be > 64K away from the branch, so that
9597 it is not possible to use a PC-relative instruction.
9599 To fix those, we split the single literal pool into multiple
9600 pool chunks, reloading the pool base register at various
9601 points throughout the function to ensure it always points to
9602 the pool chunk the following code expects, and / or replace
9603 PC-relative branches by absolute branches.
9605 However, the two problems are interdependent: splitting the
9606 literal pool can move a branch further away from its target,
9607 causing the 64K limit to overflow, and on the other hand,
9608 replacing a PC-relative branch by an absolute branch means
9609 we need to put the branch target address into the literal
9610 pool, possibly causing it to overflow.
9612 So, we loop trying to fix up both problems until we manage
9613 to satisfy both conditions at the same time. Note that the
9614 loop is guaranteed to terminate as every pass of the loop
9615 strictly decreases the total number of PC-relative branches
9616 in the function. (This is not completely true as there
9617 might be branch-over-pool insns introduced by chunkify_start.
9618 Those never need to be split however.) */
9622 struct constant_pool
*pool
= NULL
;
9624 /* Collect the literal pool. */
9627 pool
= s390_mainpool_start ();
9629 pool_overflow
= true;
9632 /* If literal pool overflowed, start to chunkify it. */
9634 pool
= s390_chunkify_start ();
9636 /* Split out-of-range branches. If this has created new
9637 literal pool entries, cancel current chunk list and
9638 recompute it. zSeries machines have large branch
9639 instructions, so we never need to split a branch. */
9640 if (!TARGET_CPU_ZARCH
&& s390_split_branches ())
9643 s390_chunkify_cancel (pool
);
9645 s390_mainpool_cancel (pool
);
9650 /* If we made it up to here, both conditions are satisfied.
9651 Finish up literal pool related changes. */
9653 s390_chunkify_finish (pool
);
9655 s390_mainpool_finish (pool
);
9657 /* We're done splitting branches. */
9658 cfun
->machine
->split_branches_pending_p
= false;
9662 /* Generate out-of-pool execute target insns. */
9663 if (TARGET_CPU_ZARCH
)
9665 rtx insn
, label
, target
;
9667 for (insn
= get_insns (); insn
; insn
= NEXT_INSN (insn
))
9669 label
= s390_execute_label (insn
);
9673 gcc_assert (label
!= const0_rtx
);
9675 target
= emit_label (XEXP (label
, 0));
9676 INSN_ADDRESSES_NEW (target
, -1);
9678 target
= emit_insn (s390_execute_target (insn
));
9679 INSN_ADDRESSES_NEW (target
, -1);
9683 /* Try to optimize prologue and epilogue further. */
9684 s390_optimize_prologue ();
9688 /* Initialize GCC target structure. */
9690 #undef TARGET_ASM_ALIGNED_HI_OP
9691 #define TARGET_ASM_ALIGNED_HI_OP "\t.word\t"
9692 #undef TARGET_ASM_ALIGNED_DI_OP
9693 #define TARGET_ASM_ALIGNED_DI_OP "\t.quad\t"
9694 #undef TARGET_ASM_INTEGER
9695 #define TARGET_ASM_INTEGER s390_assemble_integer
9697 #undef TARGET_ASM_OPEN_PAREN
9698 #define TARGET_ASM_OPEN_PAREN ""
9700 #undef TARGET_ASM_CLOSE_PAREN
9701 #define TARGET_ASM_CLOSE_PAREN ""
9703 #undef TARGET_DEFAULT_TARGET_FLAGS
9704 #define TARGET_DEFAULT_TARGET_FLAGS (TARGET_DEFAULT | MASK_FUSED_MADD)
9705 #undef TARGET_HANDLE_OPTION
9706 #define TARGET_HANDLE_OPTION s390_handle_option
9708 #undef TARGET_ENCODE_SECTION_INFO
9709 #define TARGET_ENCODE_SECTION_INFO s390_encode_section_info
9712 #undef TARGET_HAVE_TLS
9713 #define TARGET_HAVE_TLS true
9715 #undef TARGET_CANNOT_FORCE_CONST_MEM
9716 #define TARGET_CANNOT_FORCE_CONST_MEM s390_cannot_force_const_mem
9718 #undef TARGET_DELEGITIMIZE_ADDRESS
9719 #define TARGET_DELEGITIMIZE_ADDRESS s390_delegitimize_address
9721 #undef TARGET_RETURN_IN_MEMORY
9722 #define TARGET_RETURN_IN_MEMORY s390_return_in_memory
9724 #undef TARGET_INIT_BUILTINS
9725 #define TARGET_INIT_BUILTINS s390_init_builtins
9726 #undef TARGET_EXPAND_BUILTIN
9727 #define TARGET_EXPAND_BUILTIN s390_expand_builtin
9729 #undef TARGET_ASM_OUTPUT_MI_THUNK
9730 #define TARGET_ASM_OUTPUT_MI_THUNK s390_output_mi_thunk
9731 #undef TARGET_ASM_CAN_OUTPUT_MI_THUNK
9732 #define TARGET_ASM_CAN_OUTPUT_MI_THUNK hook_bool_const_tree_hwi_hwi_const_tree_true
9734 #undef TARGET_SCHED_ADJUST_PRIORITY
9735 #define TARGET_SCHED_ADJUST_PRIORITY s390_adjust_priority
9736 #undef TARGET_SCHED_ISSUE_RATE
9737 #define TARGET_SCHED_ISSUE_RATE s390_issue_rate
9738 #undef TARGET_SCHED_FIRST_CYCLE_MULTIPASS_DFA_LOOKAHEAD
9739 #define TARGET_SCHED_FIRST_CYCLE_MULTIPASS_DFA_LOOKAHEAD s390_first_cycle_multipass_dfa_lookahead
9741 #undef TARGET_CANNOT_COPY_INSN_P
9742 #define TARGET_CANNOT_COPY_INSN_P s390_cannot_copy_insn_p
9743 #undef TARGET_RTX_COSTS
9744 #define TARGET_RTX_COSTS s390_rtx_costs
9745 #undef TARGET_ADDRESS_COST
9746 #define TARGET_ADDRESS_COST s390_address_cost
9748 #undef TARGET_MACHINE_DEPENDENT_REORG
9749 #define TARGET_MACHINE_DEPENDENT_REORG s390_reorg
9751 #undef TARGET_VALID_POINTER_MODE
9752 #define TARGET_VALID_POINTER_MODE s390_valid_pointer_mode
9754 #undef TARGET_BUILD_BUILTIN_VA_LIST
9755 #define TARGET_BUILD_BUILTIN_VA_LIST s390_build_builtin_va_list
9756 #undef TARGET_EXPAND_BUILTIN_VA_START
9757 #define TARGET_EXPAND_BUILTIN_VA_START s390_va_start
9758 #undef TARGET_GIMPLIFY_VA_ARG_EXPR
9759 #define TARGET_GIMPLIFY_VA_ARG_EXPR s390_gimplify_va_arg
9761 #undef TARGET_PROMOTE_FUNCTION_ARGS
9762 #define TARGET_PROMOTE_FUNCTION_ARGS hook_bool_const_tree_true
9763 #undef TARGET_PROMOTE_FUNCTION_RETURN
9764 #define TARGET_PROMOTE_FUNCTION_RETURN hook_bool_const_tree_true
9765 #undef TARGET_PASS_BY_REFERENCE
9766 #define TARGET_PASS_BY_REFERENCE s390_pass_by_reference
9768 #undef TARGET_FUNCTION_OK_FOR_SIBCALL
9769 #define TARGET_FUNCTION_OK_FOR_SIBCALL s390_function_ok_for_sibcall
9771 #undef TARGET_FIXED_CONDITION_CODE_REGS
9772 #define TARGET_FIXED_CONDITION_CODE_REGS s390_fixed_condition_code_regs
9774 #undef TARGET_CC_MODES_COMPATIBLE
9775 #define TARGET_CC_MODES_COMPATIBLE s390_cc_modes_compatible
9777 #undef TARGET_INVALID_WITHIN_DOLOOP
9778 #define TARGET_INVALID_WITHIN_DOLOOP hook_constcharptr_const_rtx_null
9781 #undef TARGET_ASM_OUTPUT_DWARF_DTPREL
9782 #define TARGET_ASM_OUTPUT_DWARF_DTPREL s390_output_dwarf_dtprel
9785 #ifdef TARGET_ALTERNATE_LONG_DOUBLE_MANGLING
9786 #undef TARGET_MANGLE_TYPE
9787 #define TARGET_MANGLE_TYPE s390_mangle_type
9790 #undef TARGET_SCALAR_MODE_SUPPORTED_P
9791 #define TARGET_SCALAR_MODE_SUPPORTED_P s390_scalar_mode_supported_p
9793 #undef TARGET_SECONDARY_RELOAD
9794 #define TARGET_SECONDARY_RELOAD s390_secondary_reload
9796 #undef TARGET_LIBGCC_CMP_RETURN_MODE
9797 #define TARGET_LIBGCC_CMP_RETURN_MODE s390_libgcc_cmp_return_mode
9799 #undef TARGET_LIBGCC_SHIFT_COUNT_MODE
9800 #define TARGET_LIBGCC_SHIFT_COUNT_MODE s390_libgcc_shift_count_mode
9802 struct gcc_target targetm
= TARGET_INITIALIZER
;
9804 #include "gt-s390.h"