1 /* Subroutines used for code generation on IBM S/390 and zSeries
2 Copyright (C) 1999-2015 Free Software Foundation, Inc.
3 Contributed by Hartmut Penner (hpenner@de.ibm.com) and
4 Ulrich Weigand (uweigand@de.ibm.com) and
5 Andreas Krebbel (Andreas.Krebbel@de.ibm.com).
7 This file is part of GCC.
9 GCC is free software; you can redistribute it and/or modify it under
10 the terms of the GNU General Public License as published by the Free
11 Software Foundation; either version 3, or (at your option) any later
14 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
15 WARRANTY; without even the implied warranty of MERCHANTABILITY or
16 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
19 You should have received a copy of the GNU General Public License
20 along with GCC; see the file COPYING3. If not see
21 <http://www.gnu.org/licenses/>. */
25 #include "coretypes.h"
31 #include "fold-const.h"
32 #include "print-tree.h"
33 #include "stringpool.h"
34 #include "stor-layout.h"
39 #include "hard-reg-set.h"
40 #include "insn-config.h"
41 #include "conditions.h"
43 #include "insn-attr.h"
55 #include "diagnostic-core.h"
57 #include "dominance.h"
63 #include "cfgcleanup.h"
64 #include "basic-block.h"
66 #include "target-def.h"
68 #include "langhooks.h"
69 #include "insn-codes.h"
71 #include "tree-ssa-alias.h"
72 #include "internal-fn.h"
73 #include "gimple-fold.h"
75 #include "gimple-expr.h"
82 #include "tree-pass.h"
87 #include "plugin-api.h"
91 /* Define the specific costs for a given cpu. */
93 struct processor_costs
96 const int m
; /* cost of an M instruction. */
97 const int mghi
; /* cost of an MGHI instruction. */
98 const int mh
; /* cost of an MH instruction. */
99 const int mhi
; /* cost of an MHI instruction. */
100 const int ml
; /* cost of an ML instruction. */
101 const int mr
; /* cost of an MR instruction. */
102 const int ms
; /* cost of an MS instruction. */
103 const int msg
; /* cost of an MSG instruction. */
104 const int msgf
; /* cost of an MSGF instruction. */
105 const int msgfr
; /* cost of an MSGFR instruction. */
106 const int msgr
; /* cost of an MSGR instruction. */
107 const int msr
; /* cost of an MSR instruction. */
108 const int mult_df
; /* cost of multiplication in DFmode. */
111 const int sqxbr
; /* cost of square root in TFmode. */
112 const int sqdbr
; /* cost of square root in DFmode. */
113 const int sqebr
; /* cost of square root in SFmode. */
114 /* multiply and add */
115 const int madbr
; /* cost of multiply and add in DFmode. */
116 const int maebr
; /* cost of multiply and add in SFmode. */
128 const struct processor_costs
*s390_cost
;
131 struct processor_costs z900_cost
=
133 COSTS_N_INSNS (5), /* M */
134 COSTS_N_INSNS (10), /* MGHI */
135 COSTS_N_INSNS (5), /* MH */
136 COSTS_N_INSNS (4), /* MHI */
137 COSTS_N_INSNS (5), /* ML */
138 COSTS_N_INSNS (5), /* MR */
139 COSTS_N_INSNS (4), /* MS */
140 COSTS_N_INSNS (15), /* MSG */
141 COSTS_N_INSNS (7), /* MSGF */
142 COSTS_N_INSNS (7), /* MSGFR */
143 COSTS_N_INSNS (10), /* MSGR */
144 COSTS_N_INSNS (4), /* MSR */
145 COSTS_N_INSNS (7), /* multiplication in DFmode */
146 COSTS_N_INSNS (13), /* MXBR */
147 COSTS_N_INSNS (136), /* SQXBR */
148 COSTS_N_INSNS (44), /* SQDBR */
149 COSTS_N_INSNS (35), /* SQEBR */
150 COSTS_N_INSNS (18), /* MADBR */
151 COSTS_N_INSNS (13), /* MAEBR */
152 COSTS_N_INSNS (134), /* DXBR */
153 COSTS_N_INSNS (30), /* DDBR */
154 COSTS_N_INSNS (27), /* DEBR */
155 COSTS_N_INSNS (220), /* DLGR */
156 COSTS_N_INSNS (34), /* DLR */
157 COSTS_N_INSNS (34), /* DR */
158 COSTS_N_INSNS (32), /* DSGFR */
159 COSTS_N_INSNS (32), /* DSGR */
163 struct processor_costs z990_cost
=
165 COSTS_N_INSNS (4), /* M */
166 COSTS_N_INSNS (2), /* MGHI */
167 COSTS_N_INSNS (2), /* MH */
168 COSTS_N_INSNS (2), /* MHI */
169 COSTS_N_INSNS (4), /* ML */
170 COSTS_N_INSNS (4), /* MR */
171 COSTS_N_INSNS (5), /* MS */
172 COSTS_N_INSNS (6), /* MSG */
173 COSTS_N_INSNS (4), /* MSGF */
174 COSTS_N_INSNS (4), /* MSGFR */
175 COSTS_N_INSNS (4), /* MSGR */
176 COSTS_N_INSNS (4), /* MSR */
177 COSTS_N_INSNS (1), /* multiplication in DFmode */
178 COSTS_N_INSNS (28), /* MXBR */
179 COSTS_N_INSNS (130), /* SQXBR */
180 COSTS_N_INSNS (66), /* SQDBR */
181 COSTS_N_INSNS (38), /* SQEBR */
182 COSTS_N_INSNS (1), /* MADBR */
183 COSTS_N_INSNS (1), /* MAEBR */
184 COSTS_N_INSNS (60), /* DXBR */
185 COSTS_N_INSNS (40), /* DDBR */
186 COSTS_N_INSNS (26), /* DEBR */
187 COSTS_N_INSNS (176), /* DLGR */
188 COSTS_N_INSNS (31), /* DLR */
189 COSTS_N_INSNS (31), /* DR */
190 COSTS_N_INSNS (31), /* DSGFR */
191 COSTS_N_INSNS (31), /* DSGR */
195 struct processor_costs z9_109_cost
=
197 COSTS_N_INSNS (4), /* M */
198 COSTS_N_INSNS (2), /* MGHI */
199 COSTS_N_INSNS (2), /* MH */
200 COSTS_N_INSNS (2), /* MHI */
201 COSTS_N_INSNS (4), /* ML */
202 COSTS_N_INSNS (4), /* MR */
203 COSTS_N_INSNS (5), /* MS */
204 COSTS_N_INSNS (6), /* MSG */
205 COSTS_N_INSNS (4), /* MSGF */
206 COSTS_N_INSNS (4), /* MSGFR */
207 COSTS_N_INSNS (4), /* MSGR */
208 COSTS_N_INSNS (4), /* MSR */
209 COSTS_N_INSNS (1), /* multiplication in DFmode */
210 COSTS_N_INSNS (28), /* MXBR */
211 COSTS_N_INSNS (130), /* SQXBR */
212 COSTS_N_INSNS (66), /* SQDBR */
213 COSTS_N_INSNS (38), /* SQEBR */
214 COSTS_N_INSNS (1), /* MADBR */
215 COSTS_N_INSNS (1), /* MAEBR */
216 COSTS_N_INSNS (60), /* DXBR */
217 COSTS_N_INSNS (40), /* DDBR */
218 COSTS_N_INSNS (26), /* DEBR */
219 COSTS_N_INSNS (30), /* DLGR */
220 COSTS_N_INSNS (23), /* DLR */
221 COSTS_N_INSNS (23), /* DR */
222 COSTS_N_INSNS (24), /* DSGFR */
223 COSTS_N_INSNS (24), /* DSGR */
227 struct processor_costs z10_cost
=
229 COSTS_N_INSNS (10), /* M */
230 COSTS_N_INSNS (10), /* MGHI */
231 COSTS_N_INSNS (10), /* MH */
232 COSTS_N_INSNS (10), /* MHI */
233 COSTS_N_INSNS (10), /* ML */
234 COSTS_N_INSNS (10), /* MR */
235 COSTS_N_INSNS (10), /* MS */
236 COSTS_N_INSNS (10), /* MSG */
237 COSTS_N_INSNS (10), /* MSGF */
238 COSTS_N_INSNS (10), /* MSGFR */
239 COSTS_N_INSNS (10), /* MSGR */
240 COSTS_N_INSNS (10), /* MSR */
241 COSTS_N_INSNS (1) , /* multiplication in DFmode */
242 COSTS_N_INSNS (50), /* MXBR */
243 COSTS_N_INSNS (120), /* SQXBR */
244 COSTS_N_INSNS (52), /* SQDBR */
245 COSTS_N_INSNS (38), /* SQEBR */
246 COSTS_N_INSNS (1), /* MADBR */
247 COSTS_N_INSNS (1), /* MAEBR */
248 COSTS_N_INSNS (111), /* DXBR */
249 COSTS_N_INSNS (39), /* DDBR */
250 COSTS_N_INSNS (32), /* DEBR */
251 COSTS_N_INSNS (160), /* DLGR */
252 COSTS_N_INSNS (71), /* DLR */
253 COSTS_N_INSNS (71), /* DR */
254 COSTS_N_INSNS (71), /* DSGFR */
255 COSTS_N_INSNS (71), /* DSGR */
259 struct processor_costs z196_cost
=
261 COSTS_N_INSNS (7), /* M */
262 COSTS_N_INSNS (5), /* MGHI */
263 COSTS_N_INSNS (5), /* MH */
264 COSTS_N_INSNS (5), /* MHI */
265 COSTS_N_INSNS (7), /* ML */
266 COSTS_N_INSNS (7), /* MR */
267 COSTS_N_INSNS (6), /* MS */
268 COSTS_N_INSNS (8), /* MSG */
269 COSTS_N_INSNS (6), /* MSGF */
270 COSTS_N_INSNS (6), /* MSGFR */
271 COSTS_N_INSNS (8), /* MSGR */
272 COSTS_N_INSNS (6), /* MSR */
273 COSTS_N_INSNS (1) , /* multiplication in DFmode */
274 COSTS_N_INSNS (40), /* MXBR B+40 */
275 COSTS_N_INSNS (100), /* SQXBR B+100 */
276 COSTS_N_INSNS (42), /* SQDBR B+42 */
277 COSTS_N_INSNS (28), /* SQEBR B+28 */
278 COSTS_N_INSNS (1), /* MADBR B */
279 COSTS_N_INSNS (1), /* MAEBR B */
280 COSTS_N_INSNS (101), /* DXBR B+101 */
281 COSTS_N_INSNS (29), /* DDBR */
282 COSTS_N_INSNS (22), /* DEBR */
283 COSTS_N_INSNS (160), /* DLGR cracked */
284 COSTS_N_INSNS (160), /* DLR cracked */
285 COSTS_N_INSNS (160), /* DR expanded */
286 COSTS_N_INSNS (160), /* DSGFR cracked */
287 COSTS_N_INSNS (160), /* DSGR cracked */
291 struct processor_costs zEC12_cost
=
293 COSTS_N_INSNS (7), /* M */
294 COSTS_N_INSNS (5), /* MGHI */
295 COSTS_N_INSNS (5), /* MH */
296 COSTS_N_INSNS (5), /* MHI */
297 COSTS_N_INSNS (7), /* ML */
298 COSTS_N_INSNS (7), /* MR */
299 COSTS_N_INSNS (6), /* MS */
300 COSTS_N_INSNS (8), /* MSG */
301 COSTS_N_INSNS (6), /* MSGF */
302 COSTS_N_INSNS (6), /* MSGFR */
303 COSTS_N_INSNS (8), /* MSGR */
304 COSTS_N_INSNS (6), /* MSR */
305 COSTS_N_INSNS (1) , /* multiplication in DFmode */
306 COSTS_N_INSNS (40), /* MXBR B+40 */
307 COSTS_N_INSNS (100), /* SQXBR B+100 */
308 COSTS_N_INSNS (42), /* SQDBR B+42 */
309 COSTS_N_INSNS (28), /* SQEBR B+28 */
310 COSTS_N_INSNS (1), /* MADBR B */
311 COSTS_N_INSNS (1), /* MAEBR B */
312 COSTS_N_INSNS (131), /* DXBR B+131 */
313 COSTS_N_INSNS (29), /* DDBR */
314 COSTS_N_INSNS (22), /* DEBR */
315 COSTS_N_INSNS (160), /* DLGR cracked */
316 COSTS_N_INSNS (160), /* DLR cracked */
317 COSTS_N_INSNS (160), /* DR expanded */
318 COSTS_N_INSNS (160), /* DSGFR cracked */
319 COSTS_N_INSNS (160), /* DSGR cracked */
322 extern int reload_completed
;
324 /* Kept up to date using the SCHED_VARIABLE_ISSUE hook. */
325 static rtx_insn
*last_scheduled_insn
;
327 /* Structure used to hold the components of a S/390 memory
328 address. A legitimate address on S/390 is of the general
330 base + index + displacement
331 where any of the components is optional.
333 base and index are registers of the class ADDR_REGS,
334 displacement is an unsigned 12-bit immediate constant. */
345 /* The following structure is embedded in the machine
346 specific part of struct function. */
348 struct GTY (()) s390_frame_layout
350 /* Offset within stack frame. */
351 HOST_WIDE_INT gprs_offset
;
352 HOST_WIDE_INT f0_offset
;
353 HOST_WIDE_INT f4_offset
;
354 HOST_WIDE_INT f8_offset
;
355 HOST_WIDE_INT backchain_offset
;
357 /* Number of first and last gpr where slots in the register
358 save area are reserved for. */
359 int first_save_gpr_slot
;
360 int last_save_gpr_slot
;
362 /* Location (FP register number) where GPRs (r0-r15) should
364 0 - does not need to be saved at all
366 signed char gpr_save_slots
[16];
368 /* Number of first and last gpr to be saved, restored. */
370 int first_restore_gpr
;
372 int last_restore_gpr
;
374 /* Bits standing for floating point registers. Set, if the
375 respective register has to be saved. Starting with reg 16 (f0)
376 at the rightmost bit.
377 Bit 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
378 fpr 15 13 11 9 14 12 10 8 7 5 3 1 6 4 2 0
379 reg 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 */
380 unsigned int fpr_bitmap
;
382 /* Number of floating point registers f8-f15 which must be saved. */
385 /* Set if return address needs to be saved.
386 This flag is set by s390_return_addr_rtx if it could not use
387 the initial value of r14 and therefore depends on r14 saved
389 bool save_return_addr_p
;
391 /* Size of stack frame. */
392 HOST_WIDE_INT frame_size
;
395 /* Define the structure for the machine field in struct function. */
397 struct GTY(()) machine_function
399 struct s390_frame_layout frame_layout
;
401 /* Literal pool base register. */
404 /* True if we may need to perform branch splitting. */
405 bool split_branches_pending_p
;
407 bool has_landing_pad_p
;
409 /* True if the current function may contain a tbegin clobbering
414 /* Few accessor macros for struct cfun->machine->s390_frame_layout. */
416 #define cfun_frame_layout (cfun->machine->frame_layout)
417 #define cfun_save_high_fprs_p (!!cfun_frame_layout.high_fprs)
418 #define cfun_save_arg_fprs_p (!!(TARGET_64BIT \
419 ? cfun_frame_layout.fpr_bitmap & 0x0f \
420 : cfun_frame_layout.fpr_bitmap & 0x03))
421 #define cfun_gprs_save_area_size ((cfun_frame_layout.last_save_gpr_slot - \
422 cfun_frame_layout.first_save_gpr_slot + 1) * UNITS_PER_LONG)
423 #define cfun_set_fpr_save(REGNO) (cfun->machine->frame_layout.fpr_bitmap |= \
424 (1 << (REGNO - FPR0_REGNUM)))
425 #define cfun_fpr_save_p(REGNO) (!!(cfun->machine->frame_layout.fpr_bitmap & \
426 (1 << (REGNO - FPR0_REGNUM))))
427 #define cfun_gpr_save_slot(REGNO) \
428 cfun->machine->frame_layout.gpr_save_slots[REGNO]
430 /* Number of GPRs and FPRs used for argument passing. */
431 #define GP_ARG_NUM_REG 5
432 #define FP_ARG_NUM_REG (TARGET_64BIT? 4 : 2)
433 #define VEC_ARG_NUM_REG 8
435 /* A couple of shortcuts. */
436 #define CONST_OK_FOR_J(x) \
437 CONST_OK_FOR_CONSTRAINT_P((x), 'J', "J")
438 #define CONST_OK_FOR_K(x) \
439 CONST_OK_FOR_CONSTRAINT_P((x), 'K', "K")
440 #define CONST_OK_FOR_Os(x) \
441 CONST_OK_FOR_CONSTRAINT_P((x), 'O', "Os")
442 #define CONST_OK_FOR_Op(x) \
443 CONST_OK_FOR_CONSTRAINT_P((x), 'O', "Op")
444 #define CONST_OK_FOR_On(x) \
445 CONST_OK_FOR_CONSTRAINT_P((x), 'O', "On")
447 #define REGNO_PAIR_OK(REGNO, MODE) \
448 (HARD_REGNO_NREGS ((REGNO), (MODE)) == 1 || !((REGNO) & 1))
450 /* That's the read ahead of the dynamic branch prediction unit in
451 bytes on a z10 (or higher) CPU. */
452 #define PREDICT_DISTANCE (TARGET_Z10 ? 384 : 2048)
455 /* System z builtins. */
457 #include "s390-builtins.h"
459 const unsigned int flags_builtin
[S390_BUILTIN_MAX
+ 1] =
464 #define B_DEF(NAME, PATTERN, ATTRS, FLAGS, FNTYPE) FLAGS,
466 #define OB_DEF_VAR(...)
467 #include "s390-builtins.def"
471 const unsigned int flags_overloaded_builtin_var
[S390_OVERLOADED_BUILTIN_VAR_MAX
+ 1] =
478 #define OB_DEF_VAR(NAME, PATTERN, FLAGS, FNTYPE) FLAGS,
479 #include "s390-builtins.def"
483 tree s390_builtin_types
[BT_MAX
];
484 tree s390_builtin_fn_types
[BT_FN_MAX
];
485 tree s390_builtin_decls
[S390_BUILTIN_MAX
+
486 S390_OVERLOADED_BUILTIN_MAX
+
487 S390_OVERLOADED_BUILTIN_VAR_MAX
];
489 static enum insn_code
const code_for_builtin
[S390_BUILTIN_MAX
+ 1] = {
493 #define B_DEF(NAME, PATTERN, ...) CODE_FOR_##PATTERN,
495 #define OB_DEF_VAR(...)
497 #include "s390-builtins.def"
502 s390_init_builtins (void)
504 /* These definitions are being used in s390-builtins.def. */
505 tree returns_twice_attr
= tree_cons (get_identifier ("returns_twice"),
507 tree noreturn_attr
= tree_cons (get_identifier ("noreturn"), NULL
, NULL
);
508 tree c_uint64_type_node
;
510 /* The uint64_type_node from tree.c is not compatible to the C99
511 uint64_t data type. What we want is c_uint64_type_node from
512 c-common.c. But since backend code is not supposed to interface
513 with the frontend we recreate it here. */
515 c_uint64_type_node
= long_unsigned_type_node
;
517 c_uint64_type_node
= long_long_unsigned_type_node
;
520 #define DEF_TYPE(INDEX, NODE, CONST_P) \
521 s390_builtin_types[INDEX] = (!CONST_P) ? \
522 (NODE) : build_type_variant ((NODE), 1, 0);
524 #undef DEF_POINTER_TYPE
525 #define DEF_POINTER_TYPE(INDEX, INDEX_BASE) \
526 s390_builtin_types[INDEX] = \
527 build_pointer_type (s390_builtin_types[INDEX_BASE]);
529 #undef DEF_DISTINCT_TYPE
530 #define DEF_DISTINCT_TYPE(INDEX, INDEX_BASE) \
531 s390_builtin_types[INDEX] = \
532 build_distinct_type_copy (s390_builtin_types[INDEX_BASE]);
534 #undef DEF_VECTOR_TYPE
535 #define DEF_VECTOR_TYPE(INDEX, INDEX_BASE, ELEMENTS) \
536 s390_builtin_types[INDEX] = \
537 build_vector_type (s390_builtin_types[INDEX_BASE], ELEMENTS);
539 #undef DEF_OPAQUE_VECTOR_TYPE
540 #define DEF_OPAQUE_VECTOR_TYPE(INDEX, INDEX_BASE, ELEMENTS) \
541 s390_builtin_types[INDEX] = \
542 build_opaque_vector_type (s390_builtin_types[INDEX_BASE], ELEMENTS);
545 #define DEF_FN_TYPE(INDEX, args...) \
546 s390_builtin_fn_types[INDEX] = \
547 build_function_type_list (args, NULL_TREE);
549 #define DEF_OV_TYPE(...)
550 #include "s390-builtin-types.def"
553 #define B_DEF(NAME, PATTERN, ATTRS, FLAGS, FNTYPE) \
554 s390_builtin_decls[S390_BUILTIN_##NAME] = \
555 add_builtin_function ("__builtin_" #NAME, \
556 s390_builtin_fn_types[FNTYPE], \
557 S390_BUILTIN_##NAME, \
562 #define OB_DEF(NAME, FIRST_VAR_NAME, LAST_VAR_NAME, FNTYPE) \
563 s390_builtin_decls[S390_OVERLOADED_BUILTIN_##NAME + S390_BUILTIN_MAX] = \
564 add_builtin_function ("__builtin_" #NAME, \
565 s390_builtin_fn_types[FNTYPE], \
566 S390_OVERLOADED_BUILTIN_##NAME + S390_BUILTIN_MAX, \
571 #define OB_DEF_VAR(...)
572 #include "s390-builtins.def"
576 /* Return true if ARG is appropriate as argument number ARGNUM of
577 builtin DECL. The operand flags from s390-builtins.def have to
578 passed as OP_FLAGS. */
580 s390_const_operand_ok (tree arg
, int argnum
, int op_flags
, tree decl
)
582 if (O_UIMM_P (op_flags
))
584 int bitwidths
[] = { 1, 2, 3, 4, 5, 8, 12, 16, 32 };
585 int bitwidth
= bitwidths
[op_flags
- O_U1
];
587 if (!tree_fits_uhwi_p (arg
)
588 || tree_to_uhwi (arg
) > ((unsigned HOST_WIDE_INT
)1 << bitwidth
) - 1)
590 error("constant argument %d for builtin %qF is out of range (0.."
591 HOST_WIDE_INT_PRINT_UNSIGNED
")",
593 ((unsigned HOST_WIDE_INT
)1 << bitwidth
) - 1);
598 if (O_SIMM_P (op_flags
))
600 int bitwidths
[] = { 2, 3, 4, 5, 8, 12, 16, 32 };
601 int bitwidth
= bitwidths
[op_flags
- O_S2
];
603 if (!tree_fits_shwi_p (arg
)
604 || tree_to_shwi (arg
) < -((HOST_WIDE_INT
)1 << (bitwidth
- 1))
605 || tree_to_shwi (arg
) > (((HOST_WIDE_INT
)1 << (bitwidth
- 1)) - 1))
607 error("constant argument %d for builtin %qF is out of range ("
608 HOST_WIDE_INT_PRINT_DEC
".."
609 HOST_WIDE_INT_PRINT_DEC
")",
611 -(HOST_WIDE_INT
)1 << (bitwidth
- 1),
612 ((HOST_WIDE_INT
)1 << (bitwidth
- 1)) - 1);
619 /* Expand an expression EXP that calls a built-in function,
620 with result going to TARGET if that's convenient
621 (and in mode MODE if that's convenient).
622 SUBTARGET may be used as the target for computing one of EXP's operands.
623 IGNORE is nonzero if the value is to be ignored. */
626 s390_expand_builtin (tree exp
, rtx target
, rtx subtarget ATTRIBUTE_UNUSED
,
627 machine_mode mode ATTRIBUTE_UNUSED
,
628 int ignore ATTRIBUTE_UNUSED
)
632 tree fndecl
= TREE_OPERAND (CALL_EXPR_FN (exp
), 0);
633 unsigned int fcode
= DECL_FUNCTION_CODE (fndecl
);
634 enum insn_code icode
;
635 rtx op
[MAX_ARGS
], pat
;
639 call_expr_arg_iterator iter
;
640 unsigned int all_op_flags
= flags_for_builtin (fcode
);
641 machine_mode last_vec_mode
= VOIDmode
;
643 if (TARGET_DEBUG_ARG
)
646 "s390_expand_builtin, code = %4d, %s\n",
647 (int)fcode
, IDENTIFIER_POINTER (DECL_NAME (fndecl
)));
651 if (fcode
>= S390_OVERLOADED_BUILTIN_VAR_OFFSET
652 && fcode
< S390_ALL_BUILTIN_MAX
)
656 else if (fcode
< S390_OVERLOADED_BUILTIN_OFFSET
)
658 icode
= code_for_builtin
[fcode
];
659 /* Set a flag in the machine specific cfun part in order to support
660 saving/restoring of FPRs. */
661 if (fcode
== S390_BUILTIN_tbegin
|| fcode
== S390_BUILTIN_tbegin_retry
)
662 cfun
->machine
->tbegin_p
= true;
664 else if (fcode
< S390_OVERLOADED_BUILTIN_VAR_OFFSET
)
666 error ("Unresolved overloaded builtin");
670 internal_error ("bad builtin fcode");
673 internal_error ("bad builtin icode");
675 nonvoid
= TREE_TYPE (TREE_TYPE (fndecl
)) != void_type_node
;
679 machine_mode tmode
= insn_data
[icode
].operand
[0].mode
;
681 || GET_MODE (target
) != tmode
682 || !(*insn_data
[icode
].operand
[0].predicate
) (target
, tmode
))
683 target
= gen_reg_rtx (tmode
);
685 /* There are builtins (e.g. vec_promote) with no vector
686 arguments but an element selector. So we have to also look
687 at the vector return type when emitting the modulo
689 if (VECTOR_MODE_P (insn_data
[icode
].operand
[0].mode
))
690 last_vec_mode
= insn_data
[icode
].operand
[0].mode
;
694 FOR_EACH_CALL_EXPR_ARG (arg
, iter
, exp
)
696 const struct insn_operand_data
*insn_op
;
697 unsigned int op_flags
= all_op_flags
& ((1 << O_SHIFT
) - 1);
699 all_op_flags
= all_op_flags
>> O_SHIFT
;
701 if (arg
== error_mark_node
)
703 if (arity
>= MAX_ARGS
)
706 if (O_IMM_P (op_flags
)
707 && TREE_CODE (arg
) != INTEGER_CST
)
709 error ("constant value required for builtin %qF argument %d",
714 if (!s390_const_operand_ok (arg
, arity
+ 1, op_flags
, fndecl
))
717 insn_op
= &insn_data
[icode
].operand
[arity
+ nonvoid
];
718 op
[arity
] = expand_expr (arg
, NULL_RTX
, insn_op
->mode
, EXPAND_NORMAL
);
720 /* Wrap the expanded RTX for pointer types into a MEM expr with
721 the proper mode. This allows us to use e.g. (match_operand
722 "memory_operand"..) in the insn patterns instead of (mem
723 (match_operand "address_operand)). This is helpful for
724 patterns not just accepting MEMs. */
725 if (POINTER_TYPE_P (TREE_TYPE (arg
))
726 && insn_op
->predicate
!= address_operand
)
727 op
[arity
] = gen_rtx_MEM (insn_op
->mode
, op
[arity
]);
729 /* Expand the module operation required on element selectors. */
730 if (op_flags
== O_ELEM
)
732 gcc_assert (last_vec_mode
!= VOIDmode
);
733 op
[arity
] = simplify_expand_binop (SImode
, code_to_optab (AND
),
735 GEN_INT (GET_MODE_NUNITS (last_vec_mode
) - 1),
736 NULL_RTX
, 1, OPTAB_DIRECT
);
739 /* Record the vector mode used for an element selector. This assumes:
740 1. There is no builtin with two different vector modes and an element selector
741 2. The element selector comes after the vector type it is referring to.
742 This currently the true for all the builtins but FIXME we
743 should better check for that. */
744 if (VECTOR_MODE_P (insn_op
->mode
))
745 last_vec_mode
= insn_op
->mode
;
747 if (insn_op
->predicate (op
[arity
], insn_op
->mode
))
753 if (MEM_P (op
[arity
])
754 && insn_op
->predicate
== memory_operand
755 && (GET_MODE (XEXP (op
[arity
], 0)) == Pmode
756 || GET_MODE (XEXP (op
[arity
], 0)) == VOIDmode
))
758 op
[arity
] = replace_equiv_address (op
[arity
],
759 copy_to_mode_reg (Pmode
,
760 XEXP (op
[arity
], 0)));
762 else if (GET_MODE (op
[arity
]) == insn_op
->mode
763 || GET_MODE (op
[arity
]) == VOIDmode
764 || (insn_op
->predicate
== address_operand
765 && GET_MODE (op
[arity
]) == Pmode
))
767 /* An address_operand usually has VOIDmode in the expander
768 so we cannot use this. */
769 machine_mode target_mode
=
770 (insn_op
->predicate
== address_operand
771 ? Pmode
: insn_op
->mode
);
772 op
[arity
] = copy_to_mode_reg (target_mode
, op
[arity
]);
775 if (!insn_op
->predicate (op
[arity
], insn_op
->mode
))
777 error ("Invalid argument %d for builtin %qF", arity
+ 1, fndecl
);
783 if (last_vec_mode
!= VOIDmode
&& !TARGET_VX
)
785 error ("Vector type builtin %qF is not supported without -mvx "
786 "(default with -march=z13).",
794 pat
= GEN_FCN (icode
) (target
);
798 pat
= GEN_FCN (icode
) (target
, op
[0]);
800 pat
= GEN_FCN (icode
) (op
[0]);
804 pat
= GEN_FCN (icode
) (target
, op
[0], op
[1]);
806 pat
= GEN_FCN (icode
) (op
[0], op
[1]);
810 pat
= GEN_FCN (icode
) (target
, op
[0], op
[1], op
[2]);
812 pat
= GEN_FCN (icode
) (op
[0], op
[1], op
[2]);
816 pat
= GEN_FCN (icode
) (target
, op
[0], op
[1], op
[2], op
[3]);
818 pat
= GEN_FCN (icode
) (op
[0], op
[1], op
[2], op
[3]);
822 pat
= GEN_FCN (icode
) (target
, op
[0], op
[1], op
[2], op
[3], op
[4]);
824 pat
= GEN_FCN (icode
) (op
[0], op
[1], op
[2], op
[3], op
[4]);
828 pat
= GEN_FCN (icode
) (target
, op
[0], op
[1], op
[2], op
[3], op
[4], op
[5]);
830 pat
= GEN_FCN (icode
) (op
[0], op
[1], op
[2], op
[3], op
[4], op
[5]);
846 static const int s390_hotpatch_hw_max
= 1000000;
847 static int s390_hotpatch_hw_before_label
= 0;
848 static int s390_hotpatch_hw_after_label
= 0;
850 /* Check whether the hotpatch attribute is applied to a function and, if it has
851 an argument, the argument is valid. */
854 s390_handle_hotpatch_attribute (tree
*node
, tree name
, tree args
,
855 int flags ATTRIBUTE_UNUSED
, bool *no_add_attrs
)
861 if (TREE_CODE (*node
) != FUNCTION_DECL
)
863 warning (OPT_Wattributes
, "%qE attribute only applies to functions",
865 *no_add_attrs
= true;
867 if (args
!= NULL
&& TREE_CHAIN (args
) != NULL
)
869 expr
= TREE_VALUE (args
);
870 expr2
= TREE_VALUE (TREE_CHAIN (args
));
872 if (args
== NULL
|| TREE_CHAIN (args
) == NULL
)
874 else if (TREE_CODE (expr
) != INTEGER_CST
875 || !INTEGRAL_TYPE_P (TREE_TYPE (expr
))
876 || wi::gtu_p (expr
, s390_hotpatch_hw_max
))
878 else if (TREE_CODE (expr2
) != INTEGER_CST
879 || !INTEGRAL_TYPE_P (TREE_TYPE (expr2
))
880 || wi::gtu_p (expr2
, s390_hotpatch_hw_max
))
886 error ("requested %qE attribute is not a comma separated pair of"
887 " non-negative integer constants or too large (max. %d)", name
,
888 s390_hotpatch_hw_max
);
889 *no_add_attrs
= true;
895 /* Expand the s390_vector_bool type attribute. */
898 s390_handle_vectorbool_attribute (tree
*node
, tree name ATTRIBUTE_UNUSED
,
899 tree args ATTRIBUTE_UNUSED
,
900 int flags ATTRIBUTE_UNUSED
, bool *no_add_attrs
)
902 tree type
= *node
, result
= NULL_TREE
;
905 while (POINTER_TYPE_P (type
)
906 || TREE_CODE (type
) == FUNCTION_TYPE
907 || TREE_CODE (type
) == METHOD_TYPE
908 || TREE_CODE (type
) == ARRAY_TYPE
)
909 type
= TREE_TYPE (type
);
911 mode
= TYPE_MODE (type
);
914 case DImode
: case V2DImode
: result
= s390_builtin_types
[BT_BV2DI
]; break;
915 case SImode
: case V4SImode
: result
= s390_builtin_types
[BT_BV4SI
]; break;
916 case HImode
: case V8HImode
: result
= s390_builtin_types
[BT_BV8HI
]; break;
917 case QImode
: case V16QImode
: result
= s390_builtin_types
[BT_BV16QI
];
921 *no_add_attrs
= true; /* No need to hang on to the attribute. */
924 *node
= lang_hooks
.types
.reconstruct_complex_type (*node
, result
);
929 static const struct attribute_spec s390_attribute_table
[] = {
930 { "hotpatch", 2, 2, true, false, false, s390_handle_hotpatch_attribute
, false },
931 { "s390_vector_bool", 0, 0, false, true, false, s390_handle_vectorbool_attribute
, true },
933 { NULL
, 0, 0, false, false, false, NULL
, false }
936 /* Return the alignment for LABEL. We default to the -falign-labels
937 value except for the literal pool base label. */
939 s390_label_align (rtx label
)
941 rtx_insn
*prev_insn
= prev_active_insn (label
);
944 if (prev_insn
== NULL_RTX
)
947 set
= single_set (prev_insn
);
954 /* Don't align literal pool base labels. */
955 if (GET_CODE (src
) == UNSPEC
956 && XINT (src
, 1) == UNSPEC_MAIN_BASE
)
960 return align_labels_log
;
964 s390_libgcc_cmp_return_mode (void)
966 return TARGET_64BIT
? DImode
: SImode
;
970 s390_libgcc_shift_count_mode (void)
972 return TARGET_64BIT
? DImode
: SImode
;
976 s390_unwind_word_mode (void)
978 return TARGET_64BIT
? DImode
: SImode
;
981 /* Return true if the back end supports mode MODE. */
983 s390_scalar_mode_supported_p (machine_mode mode
)
985 /* In contrast to the default implementation reject TImode constants on 31bit
986 TARGET_ZARCH for ABI compliance. */
987 if (!TARGET_64BIT
&& TARGET_ZARCH
&& mode
== TImode
)
990 if (DECIMAL_FLOAT_MODE_P (mode
))
991 return default_decimal_float_supported_p ();
993 return default_scalar_mode_supported_p (mode
);
996 /* Return true if the back end supports vector mode MODE. */
998 s390_vector_mode_supported_p (machine_mode mode
)
1002 if (!VECTOR_MODE_P (mode
)
1004 || GET_MODE_SIZE (mode
) > 16)
1007 inner
= GET_MODE_INNER (mode
);
1025 /* Set the has_landing_pad_p flag in struct machine_function to VALUE. */
1028 s390_set_has_landing_pad_p (bool value
)
1030 cfun
->machine
->has_landing_pad_p
= value
;
1033 /* If two condition code modes are compatible, return a condition code
1034 mode which is compatible with both. Otherwise, return
1038 s390_cc_modes_compatible (machine_mode m1
, machine_mode m2
)
1046 if (m2
== CCUmode
|| m2
== CCTmode
|| m2
== CCZ1mode
1047 || m2
== CCSmode
|| m2
== CCSRmode
|| m2
== CCURmode
)
1068 /* Return true if SET either doesn't set the CC register, or else
1069 the source and destination have matching CC modes and that
1070 CC mode is at least as constrained as REQ_MODE. */
1073 s390_match_ccmode_set (rtx set
, machine_mode req_mode
)
1075 machine_mode set_mode
;
1077 gcc_assert (GET_CODE (set
) == SET
);
1079 if (GET_CODE (SET_DEST (set
)) != REG
|| !CC_REGNO_P (REGNO (SET_DEST (set
))))
1082 set_mode
= GET_MODE (SET_DEST (set
));
1101 if (req_mode
!= set_mode
)
1106 if (req_mode
!= CCSmode
&& req_mode
!= CCUmode
&& req_mode
!= CCTmode
1107 && req_mode
!= CCSRmode
&& req_mode
!= CCURmode
)
1113 if (req_mode
!= CCAmode
)
1121 return (GET_MODE (SET_SRC (set
)) == set_mode
);
1124 /* Return true if every SET in INSN that sets the CC register
1125 has source and destination with matching CC modes and that
1126 CC mode is at least as constrained as REQ_MODE.
1127 If REQ_MODE is VOIDmode, always return false. */
1130 s390_match_ccmode (rtx_insn
*insn
, machine_mode req_mode
)
1134 /* s390_tm_ccmode returns VOIDmode to indicate failure. */
1135 if (req_mode
== VOIDmode
)
1138 if (GET_CODE (PATTERN (insn
)) == SET
)
1139 return s390_match_ccmode_set (PATTERN (insn
), req_mode
);
1141 if (GET_CODE (PATTERN (insn
)) == PARALLEL
)
1142 for (i
= 0; i
< XVECLEN (PATTERN (insn
), 0); i
++)
1144 rtx set
= XVECEXP (PATTERN (insn
), 0, i
);
1145 if (GET_CODE (set
) == SET
)
1146 if (!s390_match_ccmode_set (set
, req_mode
))
1153 /* If a test-under-mask instruction can be used to implement
1154 (compare (and ... OP1) OP2), return the CC mode required
1155 to do that. Otherwise, return VOIDmode.
1156 MIXED is true if the instruction can distinguish between
1157 CC1 and CC2 for mixed selected bits (TMxx), it is false
1158 if the instruction cannot (TM). */
1161 s390_tm_ccmode (rtx op1
, rtx op2
, bool mixed
)
1165 /* ??? Fixme: should work on CONST_DOUBLE as well. */
1166 if (GET_CODE (op1
) != CONST_INT
|| GET_CODE (op2
) != CONST_INT
)
1169 /* Selected bits all zero: CC0.
1170 e.g.: int a; if ((a & (16 + 128)) == 0) */
1171 if (INTVAL (op2
) == 0)
1174 /* Selected bits all one: CC3.
1175 e.g.: int a; if ((a & (16 + 128)) == 16 + 128) */
1176 if (INTVAL (op2
) == INTVAL (op1
))
1179 /* Exactly two bits selected, mixed zeroes and ones: CC1 or CC2. e.g.:
1181 if ((a & (16 + 128)) == 16) -> CCT1
1182 if ((a & (16 + 128)) == 128) -> CCT2 */
1185 bit1
= exact_log2 (INTVAL (op2
));
1186 bit0
= exact_log2 (INTVAL (op1
) ^ INTVAL (op2
));
1187 if (bit0
!= -1 && bit1
!= -1)
1188 return bit0
> bit1
? CCT1mode
: CCT2mode
;
1194 /* Given a comparison code OP (EQ, NE, etc.) and the operands
1195 OP0 and OP1 of a COMPARE, return the mode to be used for the
1199 s390_select_ccmode (enum rtx_code code
, rtx op0
, rtx op1
)
1202 && register_operand (op0
, DFmode
)
1203 && register_operand (op1
, DFmode
))
1205 /* LT, LE, UNGT, UNGE require swapping OP0 and OP1. Either
1206 s390_emit_compare or s390_canonicalize_comparison will take
1228 if ((GET_CODE (op0
) == NEG
|| GET_CODE (op0
) == ABS
)
1229 && GET_MODE_CLASS (GET_MODE (op0
)) == MODE_INT
)
1231 if (GET_CODE (op0
) == PLUS
&& GET_CODE (XEXP (op0
, 1)) == CONST_INT
1232 && CONST_OK_FOR_K (INTVAL (XEXP (op0
, 1))))
1234 if ((GET_CODE (op0
) == PLUS
|| GET_CODE (op0
) == MINUS
1235 || GET_CODE (op1
) == NEG
)
1236 && GET_MODE_CLASS (GET_MODE (op0
)) == MODE_INT
)
1239 if (GET_CODE (op0
) == AND
)
1241 /* Check whether we can potentially do it via TM. */
1242 machine_mode ccmode
;
1243 ccmode
= s390_tm_ccmode (XEXP (op0
, 1), op1
, 1);
1244 if (ccmode
!= VOIDmode
)
1246 /* Relax CCTmode to CCZmode to allow fall-back to AND
1247 if that turns out to be beneficial. */
1248 return ccmode
== CCTmode
? CCZmode
: ccmode
;
1252 if (register_operand (op0
, HImode
)
1253 && GET_CODE (op1
) == CONST_INT
1254 && (INTVAL (op1
) == -1 || INTVAL (op1
) == 65535))
1256 if (register_operand (op0
, QImode
)
1257 && GET_CODE (op1
) == CONST_INT
1258 && (INTVAL (op1
) == -1 || INTVAL (op1
) == 255))
1267 /* The only overflow condition of NEG and ABS happens when
1268 -INT_MAX is used as parameter, which stays negative. So
1269 we have an overflow from a positive value to a negative.
1270 Using CCAP mode the resulting cc can be used for comparisons. */
1271 if ((GET_CODE (op0
) == NEG
|| GET_CODE (op0
) == ABS
)
1272 && GET_MODE_CLASS (GET_MODE (op0
)) == MODE_INT
)
1275 /* If constants are involved in an add instruction it is possible to use
1276 the resulting cc for comparisons with zero. Knowing the sign of the
1277 constant the overflow behavior gets predictable. e.g.:
1278 int a, b; if ((b = a + c) > 0)
1279 with c as a constant value: c < 0 -> CCAN and c >= 0 -> CCAP */
1280 if (GET_CODE (op0
) == PLUS
&& GET_CODE (XEXP (op0
, 1)) == CONST_INT
1281 && (CONST_OK_FOR_K (INTVAL (XEXP (op0
, 1)))
1282 || (CONST_OK_FOR_CONSTRAINT_P (INTVAL (XEXP (op0
, 1)), 'O', "Os")
1283 /* Avoid INT32_MIN on 32 bit. */
1284 && (!TARGET_ZARCH
|| INTVAL (XEXP (op0
, 1)) != -0x7fffffff - 1))))
1286 if (INTVAL (XEXP((op0
), 1)) < 0)
1300 if ((GET_CODE (op0
) == SIGN_EXTEND
|| GET_CODE (op0
) == ZERO_EXTEND
)
1301 && GET_CODE (op1
) != CONST_INT
)
1307 if (GET_CODE (op0
) == PLUS
1308 && GET_MODE_CLASS (GET_MODE (op0
)) == MODE_INT
)
1311 if ((GET_CODE (op0
) == SIGN_EXTEND
|| GET_CODE (op0
) == ZERO_EXTEND
)
1312 && GET_CODE (op1
) != CONST_INT
)
1318 if (GET_CODE (op0
) == MINUS
1319 && GET_MODE_CLASS (GET_MODE (op0
)) == MODE_INT
)
1322 if ((GET_CODE (op0
) == SIGN_EXTEND
|| GET_CODE (op0
) == ZERO_EXTEND
)
1323 && GET_CODE (op1
) != CONST_INT
)
1332 /* Replace the comparison OP0 CODE OP1 by a semantically equivalent one
1333 that we can implement more efficiently. */
1336 s390_canonicalize_comparison (int *code
, rtx
*op0
, rtx
*op1
,
1337 bool op0_preserve_value
)
1339 if (op0_preserve_value
)
1342 /* Convert ZERO_EXTRACT back to AND to enable TM patterns. */
1343 if ((*code
== EQ
|| *code
== NE
)
1344 && *op1
== const0_rtx
1345 && GET_CODE (*op0
) == ZERO_EXTRACT
1346 && GET_CODE (XEXP (*op0
, 1)) == CONST_INT
1347 && GET_CODE (XEXP (*op0
, 2)) == CONST_INT
1348 && SCALAR_INT_MODE_P (GET_MODE (XEXP (*op0
, 0))))
1350 rtx inner
= XEXP (*op0
, 0);
1351 HOST_WIDE_INT modesize
= GET_MODE_BITSIZE (GET_MODE (inner
));
1352 HOST_WIDE_INT len
= INTVAL (XEXP (*op0
, 1));
1353 HOST_WIDE_INT pos
= INTVAL (XEXP (*op0
, 2));
1355 if (len
> 0 && len
< modesize
1356 && pos
>= 0 && pos
+ len
<= modesize
1357 && modesize
<= HOST_BITS_PER_WIDE_INT
)
1359 unsigned HOST_WIDE_INT block
;
1360 block
= ((unsigned HOST_WIDE_INT
) 1 << len
) - 1;
1361 block
<<= modesize
- pos
- len
;
1363 *op0
= gen_rtx_AND (GET_MODE (inner
), inner
,
1364 gen_int_mode (block
, GET_MODE (inner
)));
1368 /* Narrow AND of memory against immediate to enable TM. */
1369 if ((*code
== EQ
|| *code
== NE
)
1370 && *op1
== const0_rtx
1371 && GET_CODE (*op0
) == AND
1372 && GET_CODE (XEXP (*op0
, 1)) == CONST_INT
1373 && SCALAR_INT_MODE_P (GET_MODE (XEXP (*op0
, 0))))
1375 rtx inner
= XEXP (*op0
, 0);
1376 rtx mask
= XEXP (*op0
, 1);
1378 /* Ignore paradoxical SUBREGs if all extra bits are masked out. */
1379 if (GET_CODE (inner
) == SUBREG
1380 && SCALAR_INT_MODE_P (GET_MODE (SUBREG_REG (inner
)))
1381 && (GET_MODE_SIZE (GET_MODE (inner
))
1382 >= GET_MODE_SIZE (GET_MODE (SUBREG_REG (inner
))))
1384 & GET_MODE_MASK (GET_MODE (inner
))
1385 & ~GET_MODE_MASK (GET_MODE (SUBREG_REG (inner
))))
1387 inner
= SUBREG_REG (inner
);
1389 /* Do not change volatile MEMs. */
1390 if (MEM_P (inner
) && !MEM_VOLATILE_P (inner
))
1392 int part
= s390_single_part (XEXP (*op0
, 1),
1393 GET_MODE (inner
), QImode
, 0);
1396 mask
= gen_int_mode (s390_extract_part (mask
, QImode
, 0), QImode
);
1397 inner
= adjust_address_nv (inner
, QImode
, part
);
1398 *op0
= gen_rtx_AND (QImode
, inner
, mask
);
1403 /* Narrow comparisons against 0xffff to HImode if possible. */
1404 if ((*code
== EQ
|| *code
== NE
)
1405 && GET_CODE (*op1
) == CONST_INT
1406 && INTVAL (*op1
) == 0xffff
1407 && SCALAR_INT_MODE_P (GET_MODE (*op0
))
1408 && (nonzero_bits (*op0
, GET_MODE (*op0
))
1409 & ~(unsigned HOST_WIDE_INT
) 0xffff) == 0)
1411 *op0
= gen_lowpart (HImode
, *op0
);
1415 /* Remove redundant UNSPEC_STRCMPCC_TO_INT conversions if possible. */
1416 if (GET_CODE (*op0
) == UNSPEC
1417 && XINT (*op0
, 1) == UNSPEC_STRCMPCC_TO_INT
1418 && XVECLEN (*op0
, 0) == 1
1419 && GET_MODE (XVECEXP (*op0
, 0, 0)) == CCUmode
1420 && GET_CODE (XVECEXP (*op0
, 0, 0)) == REG
1421 && REGNO (XVECEXP (*op0
, 0, 0)) == CC_REGNUM
1422 && *op1
== const0_rtx
)
1424 enum rtx_code new_code
= UNKNOWN
;
1427 case EQ
: new_code
= EQ
; break;
1428 case NE
: new_code
= NE
; break;
1429 case LT
: new_code
= GTU
; break;
1430 case GT
: new_code
= LTU
; break;
1431 case LE
: new_code
= GEU
; break;
1432 case GE
: new_code
= LEU
; break;
1436 if (new_code
!= UNKNOWN
)
1438 *op0
= XVECEXP (*op0
, 0, 0);
1443 /* Remove redundant UNSPEC_CC_TO_INT conversions if possible. */
1444 if (GET_CODE (*op0
) == UNSPEC
1445 && XINT (*op0
, 1) == UNSPEC_CC_TO_INT
1446 && XVECLEN (*op0
, 0) == 1
1447 && GET_CODE (XVECEXP (*op0
, 0, 0)) == REG
1448 && REGNO (XVECEXP (*op0
, 0, 0)) == CC_REGNUM
1449 && CONST_INT_P (*op1
))
1451 enum rtx_code new_code
= UNKNOWN
;
1452 switch (GET_MODE (XVECEXP (*op0
, 0, 0)))
1458 case EQ
: new_code
= EQ
; break;
1459 case NE
: new_code
= NE
; break;
1466 if (new_code
!= UNKNOWN
)
1468 /* For CCRAWmode put the required cc mask into the second
1470 if (GET_MODE (XVECEXP (*op0
, 0, 0)) == CCRAWmode
1471 && INTVAL (*op1
) >= 0 && INTVAL (*op1
) <= 3)
1472 *op1
= gen_rtx_CONST_INT (VOIDmode
, 1 << (3 - INTVAL (*op1
)));
1473 *op0
= XVECEXP (*op0
, 0, 0);
1478 /* Simplify cascaded EQ, NE with const0_rtx. */
1479 if ((*code
== NE
|| *code
== EQ
)
1480 && (GET_CODE (*op0
) == EQ
|| GET_CODE (*op0
) == NE
)
1481 && GET_MODE (*op0
) == SImode
1482 && GET_MODE (XEXP (*op0
, 0)) == CCZ1mode
1483 && REG_P (XEXP (*op0
, 0))
1484 && XEXP (*op0
, 1) == const0_rtx
1485 && *op1
== const0_rtx
)
1487 if ((*code
== EQ
&& GET_CODE (*op0
) == NE
)
1488 || (*code
== NE
&& GET_CODE (*op0
) == EQ
))
1492 *op0
= XEXP (*op0
, 0);
1495 /* Prefer register over memory as first operand. */
1496 if (MEM_P (*op0
) && REG_P (*op1
))
1498 rtx tem
= *op0
; *op0
= *op1
; *op1
= tem
;
1499 *code
= (int)swap_condition ((enum rtx_code
)*code
);
1502 /* Using the scalar variants of vector instructions for 64 bit FP
1503 comparisons might require swapping the operands. */
1505 && register_operand (*op0
, DFmode
)
1506 && register_operand (*op1
, DFmode
)
1507 && (*code
== LT
|| *code
== LE
|| *code
== UNGT
|| *code
== UNGE
))
1513 case LT
: *code
= GT
; break;
1514 case LE
: *code
= GE
; break;
1515 case UNGT
: *code
= UNLE
; break;
1516 case UNGE
: *code
= UNLT
; break;
1519 tmp
= *op0
; *op0
= *op1
; *op1
= tmp
;
1523 /* Helper function for s390_emit_compare. If possible emit a 64 bit
1524 FP compare using the single element variant of vector instructions.
1525 Replace CODE with the comparison code to be used in the CC reg
1526 compare and return the condition code register RTX in CC. */
1529 s390_expand_vec_compare_scalar (enum rtx_code
*code
, rtx cmp1
, rtx cmp2
,
1532 machine_mode cmp_mode
;
1533 bool swap_p
= false;
1537 case EQ
: cmp_mode
= CCVEQmode
; break;
1538 case NE
: cmp_mode
= CCVEQmode
; break;
1539 case GT
: cmp_mode
= CCVFHmode
; break;
1540 case GE
: cmp_mode
= CCVFHEmode
; break;
1541 case UNLE
: cmp_mode
= CCVFHmode
; break;
1542 case UNLT
: cmp_mode
= CCVFHEmode
; break;
1543 case LT
: cmp_mode
= CCVFHmode
; *code
= GT
; swap_p
= true; break;
1544 case LE
: cmp_mode
= CCVFHEmode
; *code
= GE
; swap_p
= true; break;
1545 case UNGE
: cmp_mode
= CCVFHmode
; *code
= UNLE
; swap_p
= true; break;
1546 case UNGT
: cmp_mode
= CCVFHEmode
; *code
= UNLT
; swap_p
= true; break;
1547 default: return false;
1556 *cc
= gen_rtx_REG (cmp_mode
, CC_REGNUM
);
1557 emit_insn (gen_rtx_PARALLEL (VOIDmode
,
1560 gen_rtx_COMPARE (cmp_mode
, cmp1
,
1562 gen_rtx_CLOBBER (VOIDmode
,
1563 gen_rtx_SCRATCH (V2DImode
)))));
1568 /* Emit a compare instruction suitable to implement the comparison
1569 OP0 CODE OP1. Return the correct condition RTL to be placed in
1570 the IF_THEN_ELSE of the conditional branch testing the result. */
1573 s390_emit_compare (enum rtx_code code
, rtx op0
, rtx op1
)
1575 machine_mode mode
= s390_select_ccmode (code
, op0
, op1
);
1579 && register_operand (op0
, DFmode
)
1580 && register_operand (op1
, DFmode
)
1581 && s390_expand_vec_compare_scalar (&code
, op0
, op1
, &cc
))
1583 /* Work has been done by s390_expand_vec_compare_scalar already. */
1585 else if (GET_MODE_CLASS (GET_MODE (op0
)) == MODE_CC
)
1587 /* Do not output a redundant compare instruction if a
1588 compare_and_swap pattern already computed the result and the
1589 machine modes are compatible. */
1590 gcc_assert (s390_cc_modes_compatible (GET_MODE (op0
), mode
)
1596 cc
= gen_rtx_REG (mode
, CC_REGNUM
);
1597 emit_insn (gen_rtx_SET (cc
, gen_rtx_COMPARE (mode
, op0
, op1
)));
1600 return gen_rtx_fmt_ee (code
, VOIDmode
, cc
, const0_rtx
);
1603 /* Emit a SImode compare and swap instruction setting MEM to NEW_RTX if OLD
1605 Return the correct condition RTL to be placed in the IF_THEN_ELSE of the
1606 conditional branch testing the result. */
1609 s390_emit_compare_and_swap (enum rtx_code code
, rtx old
, rtx mem
,
1610 rtx cmp
, rtx new_rtx
)
1612 emit_insn (gen_atomic_compare_and_swapsi_internal (old
, mem
, cmp
, new_rtx
));
1613 return s390_emit_compare (code
, gen_rtx_REG (CCZ1mode
, CC_REGNUM
),
1617 /* Emit a jump instruction to TARGET and return it. If COND is
1618 NULL_RTX, emit an unconditional jump, else a conditional jump under
1622 s390_emit_jump (rtx target
, rtx cond
)
1626 target
= gen_rtx_LABEL_REF (VOIDmode
, target
);
1628 target
= gen_rtx_IF_THEN_ELSE (VOIDmode
, cond
, target
, pc_rtx
);
1630 insn
= gen_rtx_SET (pc_rtx
, target
);
1631 return emit_jump_insn (insn
);
1634 /* Return branch condition mask to implement a branch
1635 specified by CODE. Return -1 for invalid comparisons. */
1638 s390_branch_condition_mask (rtx code
)
1640 const int CC0
= 1 << 3;
1641 const int CC1
= 1 << 2;
1642 const int CC2
= 1 << 1;
1643 const int CC3
= 1 << 0;
1645 gcc_assert (GET_CODE (XEXP (code
, 0)) == REG
);
1646 gcc_assert (REGNO (XEXP (code
, 0)) == CC_REGNUM
);
1647 gcc_assert (XEXP (code
, 1) == const0_rtx
1648 || (GET_MODE (XEXP (code
, 0)) == CCRAWmode
1649 && CONST_INT_P (XEXP (code
, 1))));
1652 switch (GET_MODE (XEXP (code
, 0)))
1656 switch (GET_CODE (code
))
1658 case EQ
: return CC0
;
1659 case NE
: return CC1
| CC2
| CC3
;
1665 switch (GET_CODE (code
))
1667 case EQ
: return CC1
;
1668 case NE
: return CC0
| CC2
| CC3
;
1674 switch (GET_CODE (code
))
1676 case EQ
: return CC2
;
1677 case NE
: return CC0
| CC1
| CC3
;
1683 switch (GET_CODE (code
))
1685 case EQ
: return CC3
;
1686 case NE
: return CC0
| CC1
| CC2
;
1692 switch (GET_CODE (code
))
1694 case EQ
: return CC0
| CC2
;
1695 case NE
: return CC1
| CC3
;
1701 switch (GET_CODE (code
))
1703 case LTU
: return CC2
| CC3
; /* carry */
1704 case GEU
: return CC0
| CC1
; /* no carry */
1710 switch (GET_CODE (code
))
1712 case GTU
: return CC0
| CC1
; /* borrow */
1713 case LEU
: return CC2
| CC3
; /* no borrow */
1719 switch (GET_CODE (code
))
1721 case EQ
: return CC0
| CC2
;
1722 case NE
: return CC1
| CC3
;
1723 case LTU
: return CC1
;
1724 case GTU
: return CC3
;
1725 case LEU
: return CC1
| CC2
;
1726 case GEU
: return CC2
| CC3
;
1731 switch (GET_CODE (code
))
1733 case EQ
: return CC0
;
1734 case NE
: return CC1
| CC2
| CC3
;
1735 case LTU
: return CC1
;
1736 case GTU
: return CC2
;
1737 case LEU
: return CC0
| CC1
;
1738 case GEU
: return CC0
| CC2
;
1744 switch (GET_CODE (code
))
1746 case EQ
: return CC0
;
1747 case NE
: return CC2
| CC1
| CC3
;
1748 case LTU
: return CC2
;
1749 case GTU
: return CC1
;
1750 case LEU
: return CC0
| CC2
;
1751 case GEU
: return CC0
| CC1
;
1757 switch (GET_CODE (code
))
1759 case EQ
: return CC0
;
1760 case NE
: return CC1
| CC2
| CC3
;
1761 case LT
: return CC1
| CC3
;
1762 case GT
: return CC2
;
1763 case LE
: return CC0
| CC1
| CC3
;
1764 case GE
: return CC0
| CC2
;
1770 switch (GET_CODE (code
))
1772 case EQ
: return CC0
;
1773 case NE
: return CC1
| CC2
| CC3
;
1774 case LT
: return CC1
;
1775 case GT
: return CC2
| CC3
;
1776 case LE
: return CC0
| CC1
;
1777 case GE
: return CC0
| CC2
| CC3
;
1783 switch (GET_CODE (code
))
1785 case EQ
: return CC0
;
1786 case NE
: return CC1
| CC2
| CC3
;
1787 case LT
: return CC1
;
1788 case GT
: return CC2
;
1789 case LE
: return CC0
| CC1
;
1790 case GE
: return CC0
| CC2
;
1791 case UNORDERED
: return CC3
;
1792 case ORDERED
: return CC0
| CC1
| CC2
;
1793 case UNEQ
: return CC0
| CC3
;
1794 case UNLT
: return CC1
| CC3
;
1795 case UNGT
: return CC2
| CC3
;
1796 case UNLE
: return CC0
| CC1
| CC3
;
1797 case UNGE
: return CC0
| CC2
| CC3
;
1798 case LTGT
: return CC1
| CC2
;
1804 switch (GET_CODE (code
))
1806 case EQ
: return CC0
;
1807 case NE
: return CC2
| CC1
| CC3
;
1808 case LT
: return CC2
;
1809 case GT
: return CC1
;
1810 case LE
: return CC0
| CC2
;
1811 case GE
: return CC0
| CC1
;
1812 case UNORDERED
: return CC3
;
1813 case ORDERED
: return CC0
| CC2
| CC1
;
1814 case UNEQ
: return CC0
| CC3
;
1815 case UNLT
: return CC2
| CC3
;
1816 case UNGT
: return CC1
| CC3
;
1817 case UNLE
: return CC0
| CC2
| CC3
;
1818 case UNGE
: return CC0
| CC1
| CC3
;
1819 case LTGT
: return CC2
| CC1
;
1824 /* Vector comparison modes. */
1827 switch (GET_CODE (code
))
1829 case EQ
: return CC0
;
1830 case NE
: return CC3
;
1835 switch (GET_CODE (code
))
1837 case EQ
: return CC0
| CC1
;
1838 case NE
: return CC3
| CC1
;
1842 /* Integer vector compare modes. */
1845 switch (GET_CODE (code
))
1847 case GT
: return CC0
;
1848 case LE
: return CC3
;
1853 switch (GET_CODE (code
))
1855 case GT
: return CC0
| CC1
;
1856 case LE
: return CC3
| CC1
;
1861 switch (GET_CODE (code
))
1863 case GTU
: return CC0
;
1864 case LEU
: return CC3
;
1869 switch (GET_CODE (code
))
1871 case GTU
: return CC0
| CC1
;
1872 case LEU
: return CC3
| CC1
;
1876 /* FP vector compare modes. */
1879 switch (GET_CODE (code
))
1881 case GT
: return CC0
;
1882 case UNLE
: return CC3
;
1887 switch (GET_CODE (code
))
1889 case GT
: return CC0
| CC1
;
1890 case UNLE
: return CC3
| CC1
;
1895 switch (GET_CODE (code
))
1897 case GE
: return CC0
;
1898 case UNLT
: return CC3
;
1903 switch (GET_CODE (code
))
1905 case GE
: return CC0
| CC1
;
1906 case UNLT
: return CC3
| CC1
;
1912 switch (GET_CODE (code
))
1915 return INTVAL (XEXP (code
, 1));
1917 return (INTVAL (XEXP (code
, 1))) ^ 0xf;
1928 /* Return branch condition mask to implement a compare and branch
1929 specified by CODE. Return -1 for invalid comparisons. */
1932 s390_compare_and_branch_condition_mask (rtx code
)
1934 const int CC0
= 1 << 3;
1935 const int CC1
= 1 << 2;
1936 const int CC2
= 1 << 1;
1938 switch (GET_CODE (code
))
1962 /* If INV is false, return assembler mnemonic string to implement
1963 a branch specified by CODE. If INV is true, return mnemonic
1964 for the corresponding inverted branch. */
1967 s390_branch_condition_mnemonic (rtx code
, int inv
)
1971 static const char *const mnemonic
[16] =
1973 NULL
, "o", "h", "nle",
1974 "l", "nhe", "lh", "ne",
1975 "e", "nlh", "he", "nl",
1976 "le", "nh", "no", NULL
1979 if (GET_CODE (XEXP (code
, 0)) == REG
1980 && REGNO (XEXP (code
, 0)) == CC_REGNUM
1981 && (XEXP (code
, 1) == const0_rtx
1982 || (GET_MODE (XEXP (code
, 0)) == CCRAWmode
1983 && CONST_INT_P (XEXP (code
, 1)))))
1984 mask
= s390_branch_condition_mask (code
);
1986 mask
= s390_compare_and_branch_condition_mask (code
);
1988 gcc_assert (mask
>= 0);
1993 gcc_assert (mask
>= 1 && mask
<= 14);
1995 return mnemonic
[mask
];
1998 /* Return the part of op which has a value different from def.
1999 The size of the part is determined by mode.
2000 Use this function only if you already know that op really
2001 contains such a part. */
2003 unsigned HOST_WIDE_INT
2004 s390_extract_part (rtx op
, machine_mode mode
, int def
)
2006 unsigned HOST_WIDE_INT value
= 0;
2007 int max_parts
= HOST_BITS_PER_WIDE_INT
/ GET_MODE_BITSIZE (mode
);
2008 int part_bits
= GET_MODE_BITSIZE (mode
);
2009 unsigned HOST_WIDE_INT part_mask
2010 = ((unsigned HOST_WIDE_INT
)1 << part_bits
) - 1;
2013 for (i
= 0; i
< max_parts
; i
++)
2016 value
= (unsigned HOST_WIDE_INT
) INTVAL (op
);
2018 value
>>= part_bits
;
2020 if ((value
& part_mask
) != (def
& part_mask
))
2021 return value
& part_mask
;
2027 /* If OP is an integer constant of mode MODE with exactly one
2028 part of mode PART_MODE unequal to DEF, return the number of that
2029 part. Otherwise, return -1. */
2032 s390_single_part (rtx op
,
2034 machine_mode part_mode
,
2037 unsigned HOST_WIDE_INT value
= 0;
2038 int n_parts
= GET_MODE_SIZE (mode
) / GET_MODE_SIZE (part_mode
);
2039 unsigned HOST_WIDE_INT part_mask
2040 = ((unsigned HOST_WIDE_INT
)1 << GET_MODE_BITSIZE (part_mode
)) - 1;
2043 if (GET_CODE (op
) != CONST_INT
)
2046 for (i
= 0; i
< n_parts
; i
++)
2049 value
= (unsigned HOST_WIDE_INT
) INTVAL (op
);
2051 value
>>= GET_MODE_BITSIZE (part_mode
);
2053 if ((value
& part_mask
) != (def
& part_mask
))
2061 return part
== -1 ? -1 : n_parts
- 1 - part
;
2064 /* Return true if IN contains a contiguous bitfield in the lower SIZE
2065 bits and no other bits are set in IN. POS and LENGTH can be used
2066 to obtain the start position and the length of the bitfield.
2068 POS gives the position of the first bit of the bitfield counting
2069 from the lowest order bit starting with zero. In order to use this
2070 value for S/390 instructions this has to be converted to "bits big
2074 s390_contiguous_bitmask_p (unsigned HOST_WIDE_INT in
, int size
,
2075 int *pos
, int *length
)
2080 unsigned HOST_WIDE_INT mask
= 1ULL;
2081 bool contiguous
= false;
2083 for (i
= 0; i
< size
; mask
<<= 1, i
++)
2107 /* Calculate a mask for all bits beyond the contiguous bits. */
2108 mask
= (-1LL & ~(((1ULL << (tmp_length
+ tmp_pos
- 1)) << 1) - 1));
2110 if ((unsigned)size
< sizeof (HOST_WIDE_INT
) * BITS_PER_UNIT
)
2111 mask
&= (HOST_WIDE_INT_1U
<< size
) - 1;
2116 if (tmp_length
+ tmp_pos
- 1 > size
)
2120 *length
= tmp_length
;
2128 /* Return true if OP contains the same contiguous bitfield in *all*
2129 its elements. START and END can be used to obtain the start and
2130 end position of the bitfield.
2132 START/STOP give the position of the first/last bit of the bitfield
2133 counting from the lowest order bit starting with zero. In order to
2134 use these values for S/390 instructions this has to be converted to
2135 "bits big endian" style. */
2138 s390_contiguous_bitmask_vector_p (rtx op
, int *start
, int *end
)
2140 unsigned HOST_WIDE_INT mask
;
2143 if (!VECTOR_MODE_P (GET_MODE (op
))
2144 || GET_CODE (op
) != CONST_VECTOR
2145 || !CONST_INT_P (XVECEXP (op
, 0, 0)))
2148 if (GET_MODE_NUNITS (GET_MODE (op
)) > 1)
2152 for (i
= 1; i
< GET_MODE_NUNITS (GET_MODE (op
)); ++i
)
2153 if (!rtx_equal_p (XVECEXP (op
, 0, i
), XVECEXP (op
, 0, 0)))
2157 size
= GET_MODE_UNIT_BITSIZE (GET_MODE (op
));
2158 mask
= UINTVAL (XVECEXP (op
, 0, 0));
2159 if (s390_contiguous_bitmask_p (mask
, size
, start
,
2160 end
!= NULL
? &length
: NULL
))
2163 *end
= *start
+ length
- 1;
2166 /* 0xff00000f style immediates can be covered by swapping start and
2167 end indices in vgm. */
2168 if (s390_contiguous_bitmask_p (~mask
, size
, start
,
2169 end
!= NULL
? &length
: NULL
))
2174 *start
= *start
+ length
;
2180 /* Return true if C consists only of byte chunks being either 0 or
2181 0xff. If MASK is !=NULL a byte mask is generated which is
2182 appropriate for the vector generate byte mask instruction. */
2185 s390_bytemask_vector_p (rtx op
, unsigned *mask
)
2188 unsigned tmp_mask
= 0;
2189 int nunit
, unit_size
;
2191 if (!VECTOR_MODE_P (GET_MODE (op
))
2192 || GET_CODE (op
) != CONST_VECTOR
2193 || !CONST_INT_P (XVECEXP (op
, 0, 0)))
2196 nunit
= GET_MODE_NUNITS (GET_MODE (op
));
2197 unit_size
= GET_MODE_UNIT_SIZE (GET_MODE (op
));
2199 for (i
= 0; i
< nunit
; i
++)
2201 unsigned HOST_WIDE_INT c
;
2204 if (!CONST_INT_P (XVECEXP (op
, 0, i
)))
2207 c
= UINTVAL (XVECEXP (op
, 0, i
));
2208 for (j
= 0; j
< unit_size
; j
++)
2210 if ((c
& 0xff) != 0 && (c
& 0xff) != 0xff)
2212 tmp_mask
|= (c
& 1) << ((nunit
- 1 - i
) * unit_size
+ j
);
2213 c
= c
>> BITS_PER_UNIT
;
2223 /* Check whether a rotate of ROTL followed by an AND of CONTIG is
2224 equivalent to a shift followed by the AND. In particular, CONTIG
2225 should not overlap the (rotated) bit 0/bit 63 gap. Negative values
2226 for ROTL indicate a rotate to the right. */
2229 s390_extzv_shift_ok (int bitsize
, int rotl
, unsigned HOST_WIDE_INT contig
)
2234 ok
= s390_contiguous_bitmask_p (contig
, bitsize
, &pos
, &len
);
2237 return ((rotl
>= 0 && rotl
<= pos
)
2238 || (rotl
< 0 && -rotl
<= bitsize
- len
- pos
));
2241 /* Check whether we can (and want to) split a double-word
2242 move in mode MODE from SRC to DST into two single-word
2243 moves, moving the subword FIRST_SUBWORD first. */
2246 s390_split_ok_p (rtx dst
, rtx src
, machine_mode mode
, int first_subword
)
2248 /* Floating point and vector registers cannot be split. */
2249 if (FP_REG_P (src
) || FP_REG_P (dst
) || VECTOR_REG_P (src
) || VECTOR_REG_P (dst
))
2252 /* We don't need to split if operands are directly accessible. */
2253 if (s_operand (src
, mode
) || s_operand (dst
, mode
))
2256 /* Non-offsettable memory references cannot be split. */
2257 if ((GET_CODE (src
) == MEM
&& !offsettable_memref_p (src
))
2258 || (GET_CODE (dst
) == MEM
&& !offsettable_memref_p (dst
)))
2261 /* Moving the first subword must not clobber a register
2262 needed to move the second subword. */
2263 if (register_operand (dst
, mode
))
2265 rtx subreg
= operand_subword (dst
, first_subword
, 0, mode
);
2266 if (reg_overlap_mentioned_p (subreg
, src
))
2273 /* Return true if it can be proven that [MEM1, MEM1 + SIZE]
2274 and [MEM2, MEM2 + SIZE] do overlap and false
2278 s390_overlap_p (rtx mem1
, rtx mem2
, HOST_WIDE_INT size
)
2280 rtx addr1
, addr2
, addr_delta
;
2281 HOST_WIDE_INT delta
;
2283 if (GET_CODE (mem1
) != MEM
|| GET_CODE (mem2
) != MEM
)
2289 addr1
= XEXP (mem1
, 0);
2290 addr2
= XEXP (mem2
, 0);
2292 addr_delta
= simplify_binary_operation (MINUS
, Pmode
, addr2
, addr1
);
2294 /* This overlapping check is used by peepholes merging memory block operations.
2295 Overlapping operations would otherwise be recognized by the S/390 hardware
2296 and would fall back to a slower implementation. Allowing overlapping
2297 operations would lead to slow code but not to wrong code. Therefore we are
2298 somewhat optimistic if we cannot prove that the memory blocks are
2300 That's why we return false here although this may accept operations on
2301 overlapping memory areas. */
2302 if (!addr_delta
|| GET_CODE (addr_delta
) != CONST_INT
)
2305 delta
= INTVAL (addr_delta
);
2308 || (delta
> 0 && delta
< size
)
2309 || (delta
< 0 && -delta
< size
))
2315 /* Check whether the address of memory reference MEM2 equals exactly
2316 the address of memory reference MEM1 plus DELTA. Return true if
2317 we can prove this to be the case, false otherwise. */
2320 s390_offset_p (rtx mem1
, rtx mem2
, rtx delta
)
2322 rtx addr1
, addr2
, addr_delta
;
2324 if (GET_CODE (mem1
) != MEM
|| GET_CODE (mem2
) != MEM
)
2327 addr1
= XEXP (mem1
, 0);
2328 addr2
= XEXP (mem2
, 0);
2330 addr_delta
= simplify_binary_operation (MINUS
, Pmode
, addr2
, addr1
);
2331 if (!addr_delta
|| !rtx_equal_p (addr_delta
, delta
))
2337 /* Expand logical operator CODE in mode MODE with operands OPERANDS. */
2340 s390_expand_logical_operator (enum rtx_code code
, machine_mode mode
,
2343 machine_mode wmode
= mode
;
2344 rtx dst
= operands
[0];
2345 rtx src1
= operands
[1];
2346 rtx src2
= operands
[2];
2349 /* If we cannot handle the operation directly, use a temp register. */
2350 if (!s390_logical_operator_ok_p (operands
))
2351 dst
= gen_reg_rtx (mode
);
2353 /* QImode and HImode patterns make sense only if we have a destination
2354 in memory. Otherwise perform the operation in SImode. */
2355 if ((mode
== QImode
|| mode
== HImode
) && GET_CODE (dst
) != MEM
)
2358 /* Widen operands if required. */
2361 if (GET_CODE (dst
) == SUBREG
2362 && (tem
= simplify_subreg (wmode
, dst
, mode
, 0)) != 0)
2364 else if (REG_P (dst
))
2365 dst
= gen_rtx_SUBREG (wmode
, dst
, 0);
2367 dst
= gen_reg_rtx (wmode
);
2369 if (GET_CODE (src1
) == SUBREG
2370 && (tem
= simplify_subreg (wmode
, src1
, mode
, 0)) != 0)
2372 else if (GET_MODE (src1
) != VOIDmode
)
2373 src1
= gen_rtx_SUBREG (wmode
, force_reg (mode
, src1
), 0);
2375 if (GET_CODE (src2
) == SUBREG
2376 && (tem
= simplify_subreg (wmode
, src2
, mode
, 0)) != 0)
2378 else if (GET_MODE (src2
) != VOIDmode
)
2379 src2
= gen_rtx_SUBREG (wmode
, force_reg (mode
, src2
), 0);
2382 /* Emit the instruction. */
2383 op
= gen_rtx_SET (dst
, gen_rtx_fmt_ee (code
, wmode
, src1
, src2
));
2384 clob
= gen_rtx_CLOBBER (VOIDmode
, gen_rtx_REG (CCmode
, CC_REGNUM
));
2385 emit_insn (gen_rtx_PARALLEL (VOIDmode
, gen_rtvec (2, op
, clob
)));
2387 /* Fix up the destination if needed. */
2388 if (dst
!= operands
[0])
2389 emit_move_insn (operands
[0], gen_lowpart (mode
, dst
));
2392 /* Check whether OPERANDS are OK for a logical operation (AND, IOR, XOR). */
2395 s390_logical_operator_ok_p (rtx
*operands
)
2397 /* If the destination operand is in memory, it needs to coincide
2398 with one of the source operands. After reload, it has to be
2399 the first source operand. */
2400 if (GET_CODE (operands
[0]) == MEM
)
2401 return rtx_equal_p (operands
[0], operands
[1])
2402 || (!reload_completed
&& rtx_equal_p (operands
[0], operands
[2]));
2407 /* Narrow logical operation CODE of memory operand MEMOP with immediate
2408 operand IMMOP to switch from SS to SI type instructions. */
2411 s390_narrow_logical_operator (enum rtx_code code
, rtx
*memop
, rtx
*immop
)
2413 int def
= code
== AND
? -1 : 0;
2417 gcc_assert (GET_CODE (*memop
) == MEM
);
2418 gcc_assert (!MEM_VOLATILE_P (*memop
));
2420 mask
= s390_extract_part (*immop
, QImode
, def
);
2421 part
= s390_single_part (*immop
, GET_MODE (*memop
), QImode
, def
);
2422 gcc_assert (part
>= 0);
2424 *memop
= adjust_address (*memop
, QImode
, part
);
2425 *immop
= gen_int_mode (mask
, QImode
);
2429 /* How to allocate a 'struct machine_function'. */
2431 static struct machine_function
*
2432 s390_init_machine_status (void)
2434 return ggc_cleared_alloc
<machine_function
> ();
2437 /* Map for smallest class containing reg regno. */
2439 const enum reg_class regclass_map
[FIRST_PSEUDO_REGISTER
] =
2440 { GENERAL_REGS
, ADDR_REGS
, ADDR_REGS
, ADDR_REGS
, /* 0 */
2441 ADDR_REGS
, ADDR_REGS
, ADDR_REGS
, ADDR_REGS
, /* 4 */
2442 ADDR_REGS
, ADDR_REGS
, ADDR_REGS
, ADDR_REGS
, /* 8 */
2443 ADDR_REGS
, ADDR_REGS
, ADDR_REGS
, ADDR_REGS
, /* 12 */
2444 FP_REGS
, FP_REGS
, FP_REGS
, FP_REGS
, /* 16 */
2445 FP_REGS
, FP_REGS
, FP_REGS
, FP_REGS
, /* 20 */
2446 FP_REGS
, FP_REGS
, FP_REGS
, FP_REGS
, /* 24 */
2447 FP_REGS
, FP_REGS
, FP_REGS
, FP_REGS
, /* 28 */
2448 ADDR_REGS
, CC_REGS
, ADDR_REGS
, ADDR_REGS
, /* 32 */
2449 ACCESS_REGS
, ACCESS_REGS
, VEC_REGS
, VEC_REGS
, /* 36 */
2450 VEC_REGS
, VEC_REGS
, VEC_REGS
, VEC_REGS
, /* 40 */
2451 VEC_REGS
, VEC_REGS
, VEC_REGS
, VEC_REGS
, /* 44 */
2452 VEC_REGS
, VEC_REGS
, VEC_REGS
, VEC_REGS
, /* 48 */
2453 VEC_REGS
, VEC_REGS
/* 52 */
2456 /* Return attribute type of insn. */
2458 static enum attr_type
2459 s390_safe_attr_type (rtx_insn
*insn
)
2461 if (recog_memoized (insn
) >= 0)
2462 return get_attr_type (insn
);
2467 /* Return true if DISP is a valid short displacement. */
2470 s390_short_displacement (rtx disp
)
2472 /* No displacement is OK. */
2476 /* Without the long displacement facility we don't need to
2477 distingiush between long and short displacement. */
2478 if (!TARGET_LONG_DISPLACEMENT
)
2481 /* Integer displacement in range. */
2482 if (GET_CODE (disp
) == CONST_INT
)
2483 return INTVAL (disp
) >= 0 && INTVAL (disp
) < 4096;
2485 /* GOT offset is not OK, the GOT can be large. */
2486 if (GET_CODE (disp
) == CONST
2487 && GET_CODE (XEXP (disp
, 0)) == UNSPEC
2488 && (XINT (XEXP (disp
, 0), 1) == UNSPEC_GOT
2489 || XINT (XEXP (disp
, 0), 1) == UNSPEC_GOTNTPOFF
))
2492 /* All other symbolic constants are literal pool references,
2493 which are OK as the literal pool must be small. */
2494 if (GET_CODE (disp
) == CONST
)
2500 /* Decompose a RTL expression ADDR for a memory address into
2501 its components, returned in OUT.
2503 Returns false if ADDR is not a valid memory address, true
2504 otherwise. If OUT is NULL, don't return the components,
2505 but check for validity only.
2507 Note: Only addresses in canonical form are recognized.
2508 LEGITIMIZE_ADDRESS should convert non-canonical forms to the
2509 canonical form so that they will be recognized. */
2512 s390_decompose_address (rtx addr
, struct s390_address
*out
)
2514 HOST_WIDE_INT offset
= 0;
2515 rtx base
= NULL_RTX
;
2516 rtx indx
= NULL_RTX
;
2517 rtx disp
= NULL_RTX
;
2519 bool pointer
= false;
2520 bool base_ptr
= false;
2521 bool indx_ptr
= false;
2522 bool literal_pool
= false;
2524 /* We may need to substitute the literal pool base register into the address
2525 below. However, at this point we do not know which register is going to
2526 be used as base, so we substitute the arg pointer register. This is going
2527 to be treated as holding a pointer below -- it shouldn't be used for any
2529 rtx fake_pool_base
= gen_rtx_REG (Pmode
, ARG_POINTER_REGNUM
);
2531 /* Decompose address into base + index + displacement. */
2533 if (GET_CODE (addr
) == REG
|| GET_CODE (addr
) == UNSPEC
)
2536 else if (GET_CODE (addr
) == PLUS
)
2538 rtx op0
= XEXP (addr
, 0);
2539 rtx op1
= XEXP (addr
, 1);
2540 enum rtx_code code0
= GET_CODE (op0
);
2541 enum rtx_code code1
= GET_CODE (op1
);
2543 if (code0
== REG
|| code0
== UNSPEC
)
2545 if (code1
== REG
|| code1
== UNSPEC
)
2547 indx
= op0
; /* index + base */
2553 base
= op0
; /* base + displacement */
2558 else if (code0
== PLUS
)
2560 indx
= XEXP (op0
, 0); /* index + base + disp */
2561 base
= XEXP (op0
, 1);
2572 disp
= addr
; /* displacement */
2574 /* Extract integer part of displacement. */
2578 if (GET_CODE (disp
) == CONST_INT
)
2580 offset
= INTVAL (disp
);
2583 else if (GET_CODE (disp
) == CONST
2584 && GET_CODE (XEXP (disp
, 0)) == PLUS
2585 && GET_CODE (XEXP (XEXP (disp
, 0), 1)) == CONST_INT
)
2587 offset
= INTVAL (XEXP (XEXP (disp
, 0), 1));
2588 disp
= XEXP (XEXP (disp
, 0), 0);
2592 /* Strip off CONST here to avoid special case tests later. */
2593 if (disp
&& GET_CODE (disp
) == CONST
)
2594 disp
= XEXP (disp
, 0);
2596 /* We can convert literal pool addresses to
2597 displacements by basing them off the base register. */
2598 if (disp
&& GET_CODE (disp
) == SYMBOL_REF
&& CONSTANT_POOL_ADDRESS_P (disp
))
2600 /* Either base or index must be free to hold the base register. */
2602 base
= fake_pool_base
, literal_pool
= true;
2604 indx
= fake_pool_base
, literal_pool
= true;
2608 /* Mark up the displacement. */
2609 disp
= gen_rtx_UNSPEC (Pmode
, gen_rtvec (1, disp
),
2610 UNSPEC_LTREL_OFFSET
);
2613 /* Validate base register. */
2616 if (GET_CODE (base
) == UNSPEC
)
2617 switch (XINT (base
, 1))
2621 disp
= gen_rtx_UNSPEC (Pmode
,
2622 gen_rtvec (1, XVECEXP (base
, 0, 0)),
2623 UNSPEC_LTREL_OFFSET
);
2627 base
= XVECEXP (base
, 0, 1);
2630 case UNSPEC_LTREL_BASE
:
2631 if (XVECLEN (base
, 0) == 1)
2632 base
= fake_pool_base
, literal_pool
= true;
2634 base
= XVECEXP (base
, 0, 1);
2642 || (GET_MODE (base
) != SImode
2643 && GET_MODE (base
) != Pmode
))
2646 if (REGNO (base
) == STACK_POINTER_REGNUM
2647 || REGNO (base
) == FRAME_POINTER_REGNUM
2648 || ((reload_completed
|| reload_in_progress
)
2649 && frame_pointer_needed
2650 && REGNO (base
) == HARD_FRAME_POINTER_REGNUM
)
2651 || REGNO (base
) == ARG_POINTER_REGNUM
2653 && REGNO (base
) == PIC_OFFSET_TABLE_REGNUM
))
2654 pointer
= base_ptr
= true;
2656 if ((reload_completed
|| reload_in_progress
)
2657 && base
== cfun
->machine
->base_reg
)
2658 pointer
= base_ptr
= literal_pool
= true;
2661 /* Validate index register. */
2664 if (GET_CODE (indx
) == UNSPEC
)
2665 switch (XINT (indx
, 1))
2669 disp
= gen_rtx_UNSPEC (Pmode
,
2670 gen_rtvec (1, XVECEXP (indx
, 0, 0)),
2671 UNSPEC_LTREL_OFFSET
);
2675 indx
= XVECEXP (indx
, 0, 1);
2678 case UNSPEC_LTREL_BASE
:
2679 if (XVECLEN (indx
, 0) == 1)
2680 indx
= fake_pool_base
, literal_pool
= true;
2682 indx
= XVECEXP (indx
, 0, 1);
2690 || (GET_MODE (indx
) != SImode
2691 && GET_MODE (indx
) != Pmode
))
2694 if (REGNO (indx
) == STACK_POINTER_REGNUM
2695 || REGNO (indx
) == FRAME_POINTER_REGNUM
2696 || ((reload_completed
|| reload_in_progress
)
2697 && frame_pointer_needed
2698 && REGNO (indx
) == HARD_FRAME_POINTER_REGNUM
)
2699 || REGNO (indx
) == ARG_POINTER_REGNUM
2701 && REGNO (indx
) == PIC_OFFSET_TABLE_REGNUM
))
2702 pointer
= indx_ptr
= true;
2704 if ((reload_completed
|| reload_in_progress
)
2705 && indx
== cfun
->machine
->base_reg
)
2706 pointer
= indx_ptr
= literal_pool
= true;
2709 /* Prefer to use pointer as base, not index. */
2710 if (base
&& indx
&& !base_ptr
2711 && (indx_ptr
|| (!REG_POINTER (base
) && REG_POINTER (indx
))))
2718 /* Validate displacement. */
2721 /* If virtual registers are involved, the displacement will change later
2722 anyway as the virtual registers get eliminated. This could make a
2723 valid displacement invalid, but it is more likely to make an invalid
2724 displacement valid, because we sometimes access the register save area
2725 via negative offsets to one of those registers.
2726 Thus we don't check the displacement for validity here. If after
2727 elimination the displacement turns out to be invalid after all,
2728 this is fixed up by reload in any case. */
2729 /* LRA maintains always displacements up to date and we need to
2730 know the displacement is right during all LRA not only at the
2731 final elimination. */
2733 || (base
!= arg_pointer_rtx
2734 && indx
!= arg_pointer_rtx
2735 && base
!= return_address_pointer_rtx
2736 && indx
!= return_address_pointer_rtx
2737 && base
!= frame_pointer_rtx
2738 && indx
!= frame_pointer_rtx
2739 && base
!= virtual_stack_vars_rtx
2740 && indx
!= virtual_stack_vars_rtx
))
2741 if (!DISP_IN_RANGE (offset
))
2746 /* All the special cases are pointers. */
2749 /* In the small-PIC case, the linker converts @GOT
2750 and @GOTNTPOFF offsets to possible displacements. */
2751 if (GET_CODE (disp
) == UNSPEC
2752 && (XINT (disp
, 1) == UNSPEC_GOT
2753 || XINT (disp
, 1) == UNSPEC_GOTNTPOFF
)
2759 /* Accept pool label offsets. */
2760 else if (GET_CODE (disp
) == UNSPEC
2761 && XINT (disp
, 1) == UNSPEC_POOL_OFFSET
)
2764 /* Accept literal pool references. */
2765 else if (GET_CODE (disp
) == UNSPEC
2766 && XINT (disp
, 1) == UNSPEC_LTREL_OFFSET
)
2768 /* In case CSE pulled a non literal pool reference out of
2769 the pool we have to reject the address. This is
2770 especially important when loading the GOT pointer on non
2771 zarch CPUs. In this case the literal pool contains an lt
2772 relative offset to the _GLOBAL_OFFSET_TABLE_ label which
2773 will most likely exceed the displacement. */
2774 if (GET_CODE (XVECEXP (disp
, 0, 0)) != SYMBOL_REF
2775 || !CONSTANT_POOL_ADDRESS_P (XVECEXP (disp
, 0, 0)))
2778 orig_disp
= gen_rtx_CONST (Pmode
, disp
);
2781 /* If we have an offset, make sure it does not
2782 exceed the size of the constant pool entry. */
2783 rtx sym
= XVECEXP (disp
, 0, 0);
2784 if (offset
>= GET_MODE_SIZE (get_pool_mode (sym
)))
2787 orig_disp
= plus_constant (Pmode
, orig_disp
, offset
);
2802 out
->disp
= orig_disp
;
2803 out
->pointer
= pointer
;
2804 out
->literal_pool
= literal_pool
;
2810 /* Decompose a RTL expression OP for a shift count into its components,
2811 and return the base register in BASE and the offset in OFFSET.
2813 Return true if OP is a valid shift count, false if not. */
2816 s390_decompose_shift_count (rtx op
, rtx
*base
, HOST_WIDE_INT
*offset
)
2818 HOST_WIDE_INT off
= 0;
2820 /* We can have an integer constant, an address register,
2821 or a sum of the two. */
2822 if (GET_CODE (op
) == CONST_INT
)
2827 if (op
&& GET_CODE (op
) == PLUS
&& GET_CODE (XEXP (op
, 1)) == CONST_INT
)
2829 off
= INTVAL (XEXP (op
, 1));
2832 while (op
&& GET_CODE (op
) == SUBREG
)
2833 op
= SUBREG_REG (op
);
2835 if (op
&& GET_CODE (op
) != REG
)
2847 /* Return true if CODE is a valid address without index. */
2850 s390_legitimate_address_without_index_p (rtx op
)
2852 struct s390_address addr
;
2854 if (!s390_decompose_address (XEXP (op
, 0), &addr
))
2863 /* Return TRUE if ADDR is an operand valid for a load/store relative
2864 instruction. Be aware that the alignment of the operand needs to
2865 be checked separately.
2866 Valid addresses are single references or a sum of a reference and a
2867 constant integer. Return these parts in SYMREF and ADDEND. You can
2868 pass NULL in REF and/or ADDEND if you are not interested in these
2869 values. Literal pool references are *not* considered symbol
2873 s390_loadrelative_operand_p (rtx addr
, rtx
*symref
, HOST_WIDE_INT
*addend
)
2875 HOST_WIDE_INT tmpaddend
= 0;
2877 if (GET_CODE (addr
) == CONST
)
2878 addr
= XEXP (addr
, 0);
2880 if (GET_CODE (addr
) == PLUS
)
2882 if (!CONST_INT_P (XEXP (addr
, 1)))
2885 tmpaddend
= INTVAL (XEXP (addr
, 1));
2886 addr
= XEXP (addr
, 0);
2889 if ((GET_CODE (addr
) == SYMBOL_REF
&& !CONSTANT_POOL_ADDRESS_P (addr
))
2890 || (GET_CODE (addr
) == UNSPEC
2891 && (XINT (addr
, 1) == UNSPEC_GOTENT
2892 || (TARGET_CPU_ZARCH
&& XINT (addr
, 1) == UNSPEC_PLT
))))
2897 *addend
= tmpaddend
;
2904 /* Return true if the address in OP is valid for constraint letter C
2905 if wrapped in a MEM rtx. Set LIT_POOL_OK to true if it literal
2906 pool MEMs should be accepted. Only the Q, R, S, T constraint
2907 letters are allowed for C. */
2910 s390_check_qrst_address (char c
, rtx op
, bool lit_pool_ok
)
2912 struct s390_address addr
;
2913 bool decomposed
= false;
2915 /* This check makes sure that no symbolic address (except literal
2916 pool references) are accepted by the R or T constraints. */
2917 if (s390_loadrelative_operand_p (op
, NULL
, NULL
))
2920 /* Ensure literal pool references are only accepted if LIT_POOL_OK. */
2923 if (!s390_decompose_address (op
, &addr
))
2925 if (addr
.literal_pool
)
2932 case 'Q': /* no index short displacement */
2933 if (!decomposed
&& !s390_decompose_address (op
, &addr
))
2937 if (!s390_short_displacement (addr
.disp
))
2941 case 'R': /* with index short displacement */
2942 if (TARGET_LONG_DISPLACEMENT
)
2944 if (!decomposed
&& !s390_decompose_address (op
, &addr
))
2946 if (!s390_short_displacement (addr
.disp
))
2949 /* Any invalid address here will be fixed up by reload,
2950 so accept it for the most generic constraint. */
2953 case 'S': /* no index long displacement */
2954 if (!TARGET_LONG_DISPLACEMENT
)
2956 if (!decomposed
&& !s390_decompose_address (op
, &addr
))
2960 if (s390_short_displacement (addr
.disp
))
2964 case 'T': /* with index long displacement */
2965 if (!TARGET_LONG_DISPLACEMENT
)
2967 /* Any invalid address here will be fixed up by reload,
2968 so accept it for the most generic constraint. */
2969 if ((decomposed
|| s390_decompose_address (op
, &addr
))
2970 && s390_short_displacement (addr
.disp
))
2980 /* Evaluates constraint strings described by the regular expression
2981 ([A|B|Z](Q|R|S|T))|U|W|Y and returns 1 if OP is a valid operand for
2982 the constraint given in STR, or 0 else. */
2985 s390_mem_constraint (const char *str
, rtx op
)
2992 /* Check for offsettable variants of memory constraints. */
2993 if (!MEM_P (op
) || MEM_VOLATILE_P (op
))
2995 if ((reload_completed
|| reload_in_progress
)
2996 ? !offsettable_memref_p (op
) : !offsettable_nonstrict_memref_p (op
))
2998 return s390_check_qrst_address (str
[1], XEXP (op
, 0), true);
3000 /* Check for non-literal-pool variants of memory constraints. */
3003 return s390_check_qrst_address (str
[1], XEXP (op
, 0), false);
3008 if (GET_CODE (op
) != MEM
)
3010 return s390_check_qrst_address (c
, XEXP (op
, 0), true);
3012 return (s390_check_qrst_address ('Q', op
, true)
3013 || s390_check_qrst_address ('R', op
, true));
3015 return (s390_check_qrst_address ('S', op
, true)
3016 || s390_check_qrst_address ('T', op
, true));
3018 /* Simply check for the basic form of a shift count. Reload will
3019 take care of making sure we have a proper base register. */
3020 if (!s390_decompose_shift_count (op
, NULL
, NULL
))
3024 return s390_check_qrst_address (str
[1], op
, true);
3032 /* Evaluates constraint strings starting with letter O. Input
3033 parameter C is the second letter following the "O" in the constraint
3034 string. Returns 1 if VALUE meets the respective constraint and 0
3038 s390_O_constraint_str (const char c
, HOST_WIDE_INT value
)
3046 return trunc_int_for_mode (value
, SImode
) == value
;
3050 || s390_single_part (GEN_INT (value
), DImode
, SImode
, 0) == 1;
3053 return s390_single_part (GEN_INT (value
- 1), DImode
, SImode
, -1) == 1;
3061 /* Evaluates constraint strings starting with letter N. Parameter STR
3062 contains the letters following letter "N" in the constraint string.
3063 Returns true if VALUE matches the constraint. */
3066 s390_N_constraint_str (const char *str
, HOST_WIDE_INT value
)
3068 machine_mode mode
, part_mode
;
3070 int part
, part_goal
;
3076 part_goal
= str
[0] - '0';
3120 if (GET_MODE_SIZE (mode
) <= GET_MODE_SIZE (part_mode
))
3123 part
= s390_single_part (GEN_INT (value
), mode
, part_mode
, def
);
3126 if (part_goal
!= -1 && part_goal
!= part
)
3133 /* Returns true if the input parameter VALUE is a float zero. */
3136 s390_float_const_zero_p (rtx value
)
3138 return (GET_MODE_CLASS (GET_MODE (value
)) == MODE_FLOAT
3139 && value
== CONST0_RTX (GET_MODE (value
)));
3142 /* Implement TARGET_REGISTER_MOVE_COST. */
3145 s390_register_move_cost (machine_mode mode
,
3146 reg_class_t from
, reg_class_t to
)
3148 /* On s390, copy between fprs and gprs is expensive. */
3150 /* It becomes somewhat faster having ldgr/lgdr. */
3151 if (TARGET_Z10
&& GET_MODE_SIZE (mode
) == 8)
3153 /* ldgr is single cycle. */
3154 if (reg_classes_intersect_p (from
, GENERAL_REGS
)
3155 && reg_classes_intersect_p (to
, FP_REGS
))
3157 /* lgdr needs 3 cycles. */
3158 if (reg_classes_intersect_p (to
, GENERAL_REGS
)
3159 && reg_classes_intersect_p (from
, FP_REGS
))
3163 /* Otherwise copying is done via memory. */
3164 if ((reg_classes_intersect_p (from
, GENERAL_REGS
)
3165 && reg_classes_intersect_p (to
, FP_REGS
))
3166 || (reg_classes_intersect_p (from
, FP_REGS
)
3167 && reg_classes_intersect_p (to
, GENERAL_REGS
)))
3173 /* Implement TARGET_MEMORY_MOVE_COST. */
3176 s390_memory_move_cost (machine_mode mode ATTRIBUTE_UNUSED
,
3177 reg_class_t rclass ATTRIBUTE_UNUSED
,
3178 bool in ATTRIBUTE_UNUSED
)
3183 /* Compute a (partial) cost for rtx X. Return true if the complete
3184 cost has been computed, and false if subexpressions should be
3185 scanned. In either case, *TOTAL contains the cost result.
3186 CODE contains GET_CODE (x), OUTER_CODE contains the code
3187 of the superexpression of x. */
3190 s390_rtx_costs (rtx x
, int code
, int outer_code
, int opno ATTRIBUTE_UNUSED
,
3191 int *total
, bool speed ATTRIBUTE_UNUSED
)
3214 *total
= COSTS_N_INSNS (1);
3219 *total
= COSTS_N_INSNS (1);
3223 switch (GET_MODE (x
))
3227 rtx left
= XEXP (x
, 0);
3228 rtx right
= XEXP (x
, 1);
3229 if (GET_CODE (right
) == CONST_INT
3230 && CONST_OK_FOR_K (INTVAL (right
)))
3231 *total
= s390_cost
->mhi
;
3232 else if (GET_CODE (left
) == SIGN_EXTEND
)
3233 *total
= s390_cost
->mh
;
3235 *total
= s390_cost
->ms
; /* msr, ms, msy */
3240 rtx left
= XEXP (x
, 0);
3241 rtx right
= XEXP (x
, 1);
3244 if (GET_CODE (right
) == CONST_INT
3245 && CONST_OK_FOR_K (INTVAL (right
)))
3246 *total
= s390_cost
->mghi
;
3247 else if (GET_CODE (left
) == SIGN_EXTEND
)
3248 *total
= s390_cost
->msgf
;
3250 *total
= s390_cost
->msg
; /* msgr, msg */
3252 else /* TARGET_31BIT */
3254 if (GET_CODE (left
) == SIGN_EXTEND
3255 && GET_CODE (right
) == SIGN_EXTEND
)
3256 /* mulsidi case: mr, m */
3257 *total
= s390_cost
->m
;
3258 else if (GET_CODE (left
) == ZERO_EXTEND
3259 && GET_CODE (right
) == ZERO_EXTEND
3260 && TARGET_CPU_ZARCH
)
3261 /* umulsidi case: ml, mlr */
3262 *total
= s390_cost
->ml
;
3264 /* Complex calculation is required. */
3265 *total
= COSTS_N_INSNS (40);
3271 *total
= s390_cost
->mult_df
;
3274 *total
= s390_cost
->mxbr
;
3282 switch (GET_MODE (x
))
3285 *total
= s390_cost
->madbr
;
3288 *total
= s390_cost
->maebr
;
3293 /* Negate in the third argument is free: FMSUB. */
3294 if (GET_CODE (XEXP (x
, 2)) == NEG
)
3296 *total
+= (rtx_cost (XEXP (x
, 0), FMA
, 0, speed
)
3297 + rtx_cost (XEXP (x
, 1), FMA
, 1, speed
)
3298 + rtx_cost (XEXP (XEXP (x
, 2), 0), FMA
, 2, speed
));
3305 if (GET_MODE (x
) == TImode
) /* 128 bit division */
3306 *total
= s390_cost
->dlgr
;
3307 else if (GET_MODE (x
) == DImode
)
3309 rtx right
= XEXP (x
, 1);
3310 if (GET_CODE (right
) == ZERO_EXTEND
) /* 64 by 32 bit division */
3311 *total
= s390_cost
->dlr
;
3312 else /* 64 by 64 bit division */
3313 *total
= s390_cost
->dlgr
;
3315 else if (GET_MODE (x
) == SImode
) /* 32 bit division */
3316 *total
= s390_cost
->dlr
;
3321 if (GET_MODE (x
) == DImode
)
3323 rtx right
= XEXP (x
, 1);
3324 if (GET_CODE (right
) == ZERO_EXTEND
) /* 64 by 32 bit division */
3326 *total
= s390_cost
->dsgfr
;
3328 *total
= s390_cost
->dr
;
3329 else /* 64 by 64 bit division */
3330 *total
= s390_cost
->dsgr
;
3332 else if (GET_MODE (x
) == SImode
) /* 32 bit division */
3333 *total
= s390_cost
->dlr
;
3334 else if (GET_MODE (x
) == SFmode
)
3336 *total
= s390_cost
->debr
;
3338 else if (GET_MODE (x
) == DFmode
)
3340 *total
= s390_cost
->ddbr
;
3342 else if (GET_MODE (x
) == TFmode
)
3344 *total
= s390_cost
->dxbr
;
3349 if (GET_MODE (x
) == SFmode
)
3350 *total
= s390_cost
->sqebr
;
3351 else if (GET_MODE (x
) == DFmode
)
3352 *total
= s390_cost
->sqdbr
;
3354 *total
= s390_cost
->sqxbr
;
3359 if (outer_code
== MULT
|| outer_code
== DIV
|| outer_code
== MOD
3360 || outer_code
== PLUS
|| outer_code
== MINUS
3361 || outer_code
== COMPARE
)
3366 *total
= COSTS_N_INSNS (1);
3367 if (GET_CODE (XEXP (x
, 0)) == AND
3368 && GET_CODE (XEXP (x
, 1)) == CONST_INT
3369 && GET_CODE (XEXP (XEXP (x
, 0), 1)) == CONST_INT
)
3371 rtx op0
= XEXP (XEXP (x
, 0), 0);
3372 rtx op1
= XEXP (XEXP (x
, 0), 1);
3373 rtx op2
= XEXP (x
, 1);
3375 if (memory_operand (op0
, GET_MODE (op0
))
3376 && s390_tm_ccmode (op1
, op2
, 0) != VOIDmode
)
3378 if (register_operand (op0
, GET_MODE (op0
))
3379 && s390_tm_ccmode (op1
, op2
, 1) != VOIDmode
)
3389 /* Return the cost of an address rtx ADDR. */
3392 s390_address_cost (rtx addr
, machine_mode mode ATTRIBUTE_UNUSED
,
3393 addr_space_t as ATTRIBUTE_UNUSED
,
3394 bool speed ATTRIBUTE_UNUSED
)
3396 struct s390_address ad
;
3397 if (!s390_decompose_address (addr
, &ad
))
3400 return ad
.indx
? COSTS_N_INSNS (1) + 1 : COSTS_N_INSNS (1);
3403 /* If OP is a SYMBOL_REF of a thread-local symbol, return its TLS mode,
3404 otherwise return 0. */
3407 tls_symbolic_operand (rtx op
)
3409 if (GET_CODE (op
) != SYMBOL_REF
)
3411 return SYMBOL_REF_TLS_MODEL (op
);
3414 /* Split DImode access register reference REG (on 64-bit) into its constituent
3415 low and high parts, and store them into LO and HI. Note that gen_lowpart/
3416 gen_highpart cannot be used as they assume all registers are word-sized,
3417 while our access registers have only half that size. */
3420 s390_split_access_reg (rtx reg
, rtx
*lo
, rtx
*hi
)
3422 gcc_assert (TARGET_64BIT
);
3423 gcc_assert (ACCESS_REG_P (reg
));
3424 gcc_assert (GET_MODE (reg
) == DImode
);
3425 gcc_assert (!(REGNO (reg
) & 1));
3427 *lo
= gen_rtx_REG (SImode
, REGNO (reg
) + 1);
3428 *hi
= gen_rtx_REG (SImode
, REGNO (reg
));
3431 /* Return true if OP contains a symbol reference */
3434 symbolic_reference_mentioned_p (rtx op
)
3439 if (GET_CODE (op
) == SYMBOL_REF
|| GET_CODE (op
) == LABEL_REF
)
3442 fmt
= GET_RTX_FORMAT (GET_CODE (op
));
3443 for (i
= GET_RTX_LENGTH (GET_CODE (op
)) - 1; i
>= 0; i
--)
3449 for (j
= XVECLEN (op
, i
) - 1; j
>= 0; j
--)
3450 if (symbolic_reference_mentioned_p (XVECEXP (op
, i
, j
)))
3454 else if (fmt
[i
] == 'e' && symbolic_reference_mentioned_p (XEXP (op
, i
)))
3461 /* Return true if OP contains a reference to a thread-local symbol. */
3464 tls_symbolic_reference_mentioned_p (rtx op
)
3469 if (GET_CODE (op
) == SYMBOL_REF
)
3470 return tls_symbolic_operand (op
);
3472 fmt
= GET_RTX_FORMAT (GET_CODE (op
));
3473 for (i
= GET_RTX_LENGTH (GET_CODE (op
)) - 1; i
>= 0; i
--)
3479 for (j
= XVECLEN (op
, i
) - 1; j
>= 0; j
--)
3480 if (tls_symbolic_reference_mentioned_p (XVECEXP (op
, i
, j
)))
3484 else if (fmt
[i
] == 'e' && tls_symbolic_reference_mentioned_p (XEXP (op
, i
)))
3492 /* Return true if OP is a legitimate general operand when
3493 generating PIC code. It is given that flag_pic is on
3494 and that OP satisfies CONSTANT_P or is a CONST_DOUBLE. */
3497 legitimate_pic_operand_p (rtx op
)
3499 /* Accept all non-symbolic constants. */
3500 if (!SYMBOLIC_CONST (op
))
3503 /* Reject everything else; must be handled
3504 via emit_symbolic_move. */
3508 /* Returns true if the constant value OP is a legitimate general operand.
3509 It is given that OP satisfies CONSTANT_P or is a CONST_DOUBLE. */
3512 s390_legitimate_constant_p (machine_mode mode
, rtx op
)
3514 if (VECTOR_MODE_P (mode
) && GET_CODE (op
) == CONST_VECTOR
)
3516 if (GET_MODE_SIZE (mode
) != 16)
3519 if (!const0_operand (op
, mode
)
3520 && !s390_contiguous_bitmask_vector_p (op
, NULL
, NULL
)
3521 && !s390_bytemask_vector_p (op
, NULL
))
3525 /* Accept all non-symbolic constants. */
3526 if (!SYMBOLIC_CONST (op
))
3529 /* Accept immediate LARL operands. */
3530 if (TARGET_CPU_ZARCH
&& larl_operand (op
, mode
))
3533 /* Thread-local symbols are never legal constants. This is
3534 so that emit_call knows that computing such addresses
3535 might require a function call. */
3536 if (TLS_SYMBOLIC_CONST (op
))
3539 /* In the PIC case, symbolic constants must *not* be
3540 forced into the literal pool. We accept them here,
3541 so that they will be handled by emit_symbolic_move. */
3545 /* All remaining non-PIC symbolic constants are
3546 forced into the literal pool. */
3550 /* Determine if it's legal to put X into the constant pool. This
3551 is not possible if X contains the address of a symbol that is
3552 not constant (TLS) or not known at final link time (PIC). */
3555 s390_cannot_force_const_mem (machine_mode mode
, rtx x
)
3557 switch (GET_CODE (x
))
3562 /* Accept all non-symbolic constants. */
3566 /* Labels are OK iff we are non-PIC. */
3567 return flag_pic
!= 0;
3570 /* 'Naked' TLS symbol references are never OK,
3571 non-TLS symbols are OK iff we are non-PIC. */
3572 if (tls_symbolic_operand (x
))
3575 return flag_pic
!= 0;
3578 return s390_cannot_force_const_mem (mode
, XEXP (x
, 0));
3581 return s390_cannot_force_const_mem (mode
, XEXP (x
, 0))
3582 || s390_cannot_force_const_mem (mode
, XEXP (x
, 1));
3585 switch (XINT (x
, 1))
3587 /* Only lt-relative or GOT-relative UNSPECs are OK. */
3588 case UNSPEC_LTREL_OFFSET
:
3596 case UNSPEC_GOTNTPOFF
:
3597 case UNSPEC_INDNTPOFF
:
3600 /* If the literal pool shares the code section, be put
3601 execute template placeholders into the pool as well. */
3603 return TARGET_CPU_ZARCH
;
3615 /* Returns true if the constant value OP is a legitimate general
3616 operand during and after reload. The difference to
3617 legitimate_constant_p is that this function will not accept
3618 a constant that would need to be forced to the literal pool
3619 before it can be used as operand.
3620 This function accepts all constants which can be loaded directly
3624 legitimate_reload_constant_p (rtx op
)
3626 /* Accept la(y) operands. */
3627 if (GET_CODE (op
) == CONST_INT
3628 && DISP_IN_RANGE (INTVAL (op
)))
3631 /* Accept l(g)hi/l(g)fi operands. */
3632 if (GET_CODE (op
) == CONST_INT
3633 && (CONST_OK_FOR_K (INTVAL (op
)) || CONST_OK_FOR_Os (INTVAL (op
))))
3636 /* Accept lliXX operands. */
3638 && GET_CODE (op
) == CONST_INT
3639 && trunc_int_for_mode (INTVAL (op
), word_mode
) == INTVAL (op
)
3640 && s390_single_part (op
, word_mode
, HImode
, 0) >= 0)
3644 && GET_CODE (op
) == CONST_INT
3645 && trunc_int_for_mode (INTVAL (op
), word_mode
) == INTVAL (op
)
3646 && s390_single_part (op
, word_mode
, SImode
, 0) >= 0)
3649 /* Accept larl operands. */
3650 if (TARGET_CPU_ZARCH
3651 && larl_operand (op
, VOIDmode
))
3654 /* Accept floating-point zero operands that fit into a single GPR. */
3655 if (GET_CODE (op
) == CONST_DOUBLE
3656 && s390_float_const_zero_p (op
)
3657 && GET_MODE_SIZE (GET_MODE (op
)) <= UNITS_PER_WORD
)
3660 /* Accept double-word operands that can be split. */
3661 if (GET_CODE (op
) == CONST_INT
3662 && trunc_int_for_mode (INTVAL (op
), word_mode
) != INTVAL (op
))
3664 machine_mode dword_mode
= word_mode
== SImode
? DImode
: TImode
;
3665 rtx hi
= operand_subword (op
, 0, 0, dword_mode
);
3666 rtx lo
= operand_subword (op
, 1, 0, dword_mode
);
3667 return legitimate_reload_constant_p (hi
)
3668 && legitimate_reload_constant_p (lo
);
3671 /* Everything else cannot be handled without reload. */
3675 /* Returns true if the constant value OP is a legitimate fp operand
3676 during and after reload.
3677 This function accepts all constants which can be loaded directly
3681 legitimate_reload_fp_constant_p (rtx op
)
3683 /* Accept floating-point zero operands if the load zero instruction
3684 can be used. Prior to z196 the load fp zero instruction caused a
3685 performance penalty if the result is used as BFP number. */
3687 && GET_CODE (op
) == CONST_DOUBLE
3688 && s390_float_const_zero_p (op
))
3694 /* Returns true if the constant value OP is a legitimate vector operand
3695 during and after reload.
3696 This function accepts all constants which can be loaded directly
3700 legitimate_reload_vector_constant_p (rtx op
)
3702 /* FIXME: Support constant vectors with all the same 16 bit unsigned
3703 operands. These can be loaded with vrepi. */
3705 if (TARGET_VX
&& GET_MODE_SIZE (GET_MODE (op
)) == 16
3706 && (const0_operand (op
, GET_MODE (op
))
3707 || constm1_operand (op
, GET_MODE (op
))
3708 || s390_contiguous_bitmask_vector_p (op
, NULL
, NULL
)
3709 || s390_bytemask_vector_p (op
, NULL
)))
3715 /* Given an rtx OP being reloaded into a reg required to be in class RCLASS,
3716 return the class of reg to actually use. */
3719 s390_preferred_reload_class (rtx op
, reg_class_t rclass
)
3721 switch (GET_CODE (op
))
3723 /* Constants we cannot reload into general registers
3724 must be forced into the literal pool. */
3728 if (reg_class_subset_p (GENERAL_REGS
, rclass
)
3729 && legitimate_reload_constant_p (op
))
3730 return GENERAL_REGS
;
3731 else if (reg_class_subset_p (ADDR_REGS
, rclass
)
3732 && legitimate_reload_constant_p (op
))
3734 else if (reg_class_subset_p (FP_REGS
, rclass
)
3735 && legitimate_reload_fp_constant_p (op
))
3737 else if (reg_class_subset_p (VEC_REGS
, rclass
)
3738 && legitimate_reload_vector_constant_p (op
))
3743 /* If a symbolic constant or a PLUS is reloaded,
3744 it is most likely being used as an address, so
3745 prefer ADDR_REGS. If 'class' is not a superset
3746 of ADDR_REGS, e.g. FP_REGS, reject this reload. */
3748 /* Symrefs cannot be pushed into the literal pool with -fPIC
3749 so we *MUST NOT* return NO_REGS for these cases
3750 (s390_cannot_force_const_mem will return true).
3752 On the other hand we MUST return NO_REGS for symrefs with
3753 invalid addend which might have been pushed to the literal
3754 pool (no -fPIC). Usually we would expect them to be
3755 handled via secondary reload but this does not happen if
3756 they are used as literal pool slot replacement in reload
3757 inheritance (see emit_input_reload_insns). */
3758 if (TARGET_CPU_ZARCH
3759 && GET_CODE (XEXP (op
, 0)) == PLUS
3760 && GET_CODE (XEXP (XEXP(op
, 0), 0)) == SYMBOL_REF
3761 && GET_CODE (XEXP (XEXP(op
, 0), 1)) == CONST_INT
)
3763 if (flag_pic
&& reg_class_subset_p (ADDR_REGS
, rclass
))
3771 if (!legitimate_reload_constant_p (op
))
3775 /* load address will be used. */
3776 if (reg_class_subset_p (ADDR_REGS
, rclass
))
3788 /* Return true if ADDR is SYMBOL_REF + addend with addend being a
3789 multiple of ALIGNMENT and the SYMBOL_REF being naturally
3793 s390_check_symref_alignment (rtx addr
, HOST_WIDE_INT alignment
)
3795 HOST_WIDE_INT addend
;
3798 if (!s390_loadrelative_operand_p (addr
, &symref
, &addend
))
3801 if (addend
& (alignment
- 1))
3804 if (GET_CODE (symref
) == SYMBOL_REF
3805 && !SYMBOL_REF_NOT_NATURALLY_ALIGNED_P (symref
))
3808 if (GET_CODE (symref
) == UNSPEC
3809 && alignment
<= UNITS_PER_LONG
)
3815 /* ADDR is moved into REG using larl. If ADDR isn't a valid larl
3816 operand SCRATCH is used to reload the even part of the address and
3820 s390_reload_larl_operand (rtx reg
, rtx addr
, rtx scratch
)
3822 HOST_WIDE_INT addend
;
3825 if (!s390_loadrelative_operand_p (addr
, &symref
, &addend
))
3829 /* Easy case. The addend is even so larl will do fine. */
3830 emit_move_insn (reg
, addr
);
3833 /* We can leave the scratch register untouched if the target
3834 register is a valid base register. */
3835 if (REGNO (reg
) < FIRST_PSEUDO_REGISTER
3836 && REGNO_REG_CLASS (REGNO (reg
)) == ADDR_REGS
)
3839 gcc_assert (REGNO (scratch
) < FIRST_PSEUDO_REGISTER
);
3840 gcc_assert (REGNO_REG_CLASS (REGNO (scratch
)) == ADDR_REGS
);
3843 emit_move_insn (scratch
,
3844 gen_rtx_CONST (Pmode
,
3845 gen_rtx_PLUS (Pmode
, symref
,
3846 GEN_INT (addend
- 1))));
3848 emit_move_insn (scratch
, symref
);
3850 /* Increment the address using la in order to avoid clobbering cc. */
3851 s390_load_address (reg
, gen_rtx_PLUS (Pmode
, scratch
, const1_rtx
));
3855 /* Generate what is necessary to move between REG and MEM using
3856 SCRATCH. The direction is given by TOMEM. */
3859 s390_reload_symref_address (rtx reg
, rtx mem
, rtx scratch
, bool tomem
)
3861 /* Reload might have pulled a constant out of the literal pool.
3862 Force it back in. */
3863 if (CONST_INT_P (mem
) || GET_CODE (mem
) == CONST_DOUBLE
3864 || GET_CODE (mem
) == CONST_VECTOR
3865 || GET_CODE (mem
) == CONST
)
3866 mem
= force_const_mem (GET_MODE (reg
), mem
);
3868 gcc_assert (MEM_P (mem
));
3870 /* For a load from memory we can leave the scratch register
3871 untouched if the target register is a valid base register. */
3873 && REGNO (reg
) < FIRST_PSEUDO_REGISTER
3874 && REGNO_REG_CLASS (REGNO (reg
)) == ADDR_REGS
3875 && GET_MODE (reg
) == GET_MODE (scratch
))
3878 /* Load address into scratch register. Since we can't have a
3879 secondary reload for a secondary reload we have to cover the case
3880 where larl would need a secondary reload here as well. */
3881 s390_reload_larl_operand (scratch
, XEXP (mem
, 0), scratch
);
3883 /* Now we can use a standard load/store to do the move. */
3885 emit_move_insn (replace_equiv_address (mem
, scratch
), reg
);
3887 emit_move_insn (reg
, replace_equiv_address (mem
, scratch
));
3890 /* Inform reload about cases where moving X with a mode MODE to a register in
3891 RCLASS requires an extra scratch or immediate register. Return the class
3892 needed for the immediate register. */
3895 s390_secondary_reload (bool in_p
, rtx x
, reg_class_t rclass_i
,
3896 machine_mode mode
, secondary_reload_info
*sri
)
3898 enum reg_class rclass
= (enum reg_class
) rclass_i
;
3900 /* Intermediate register needed. */
3901 if (reg_classes_intersect_p (CC_REGS
, rclass
))
3902 return GENERAL_REGS
;
3906 /* The vst/vl vector move instructions allow only for short
3909 && GET_CODE (XEXP (x
, 0)) == PLUS
3910 && GET_CODE (XEXP (XEXP (x
, 0), 1)) == CONST_INT
3911 && !SHORT_DISP_IN_RANGE(INTVAL (XEXP (XEXP (x
, 0), 1)))
3912 && reg_class_subset_p (rclass
, VEC_REGS
)
3913 && (!reg_class_subset_p (rclass
, FP_REGS
)
3914 || (GET_MODE_SIZE (mode
) > 8
3915 && s390_class_max_nregs (FP_REGS
, mode
) == 1)))
3918 sri
->icode
= (TARGET_64BIT
?
3919 CODE_FOR_reloaddi_la_in
:
3920 CODE_FOR_reloadsi_la_in
);
3922 sri
->icode
= (TARGET_64BIT
?
3923 CODE_FOR_reloaddi_la_out
:
3924 CODE_FOR_reloadsi_la_out
);
3930 HOST_WIDE_INT offset
;
3933 /* On z10 several optimizer steps may generate larl operands with
3936 && s390_loadrelative_operand_p (x
, &symref
, &offset
)
3938 && !SYMBOL_REF_ALIGN1_P (symref
)
3939 && (offset
& 1) == 1)
3940 sri
->icode
= ((mode
== DImode
) ? CODE_FOR_reloaddi_larl_odd_addend_z10
3941 : CODE_FOR_reloadsi_larl_odd_addend_z10
);
3943 /* Handle all the (mem (symref)) accesses we cannot use the z10
3944 instructions for. */
3946 && s390_loadrelative_operand_p (XEXP (x
, 0), NULL
, NULL
)
3948 || !reg_classes_intersect_p (GENERAL_REGS
, rclass
)
3949 || GET_MODE_SIZE (mode
) > UNITS_PER_WORD
3950 || !s390_check_symref_alignment (XEXP (x
, 0),
3951 GET_MODE_SIZE (mode
))))
3953 #define __SECONDARY_RELOAD_CASE(M,m) \
3956 sri->icode = in_p ? CODE_FOR_reload##m##di_toreg_z10 : \
3957 CODE_FOR_reload##m##di_tomem_z10; \
3959 sri->icode = in_p ? CODE_FOR_reload##m##si_toreg_z10 : \
3960 CODE_FOR_reload##m##si_tomem_z10; \
3963 switch (GET_MODE (x
))
3965 __SECONDARY_RELOAD_CASE (QI
, qi
);
3966 __SECONDARY_RELOAD_CASE (HI
, hi
);
3967 __SECONDARY_RELOAD_CASE (SI
, si
);
3968 __SECONDARY_RELOAD_CASE (DI
, di
);
3969 __SECONDARY_RELOAD_CASE (TI
, ti
);
3970 __SECONDARY_RELOAD_CASE (SF
, sf
);
3971 __SECONDARY_RELOAD_CASE (DF
, df
);
3972 __SECONDARY_RELOAD_CASE (TF
, tf
);
3973 __SECONDARY_RELOAD_CASE (SD
, sd
);
3974 __SECONDARY_RELOAD_CASE (DD
, dd
);
3975 __SECONDARY_RELOAD_CASE (TD
, td
);
3976 __SECONDARY_RELOAD_CASE (V1QI
, v1qi
);
3977 __SECONDARY_RELOAD_CASE (V2QI
, v2qi
);
3978 __SECONDARY_RELOAD_CASE (V4QI
, v4qi
);
3979 __SECONDARY_RELOAD_CASE (V8QI
, v8qi
);
3980 __SECONDARY_RELOAD_CASE (V16QI
, v16qi
);
3981 __SECONDARY_RELOAD_CASE (V1HI
, v1hi
);
3982 __SECONDARY_RELOAD_CASE (V2HI
, v2hi
);
3983 __SECONDARY_RELOAD_CASE (V4HI
, v4hi
);
3984 __SECONDARY_RELOAD_CASE (V8HI
, v8hi
);
3985 __SECONDARY_RELOAD_CASE (V1SI
, v1si
);
3986 __SECONDARY_RELOAD_CASE (V2SI
, v2si
);
3987 __SECONDARY_RELOAD_CASE (V4SI
, v4si
);
3988 __SECONDARY_RELOAD_CASE (V1DI
, v1di
);
3989 __SECONDARY_RELOAD_CASE (V2DI
, v2di
);
3990 __SECONDARY_RELOAD_CASE (V1TI
, v1ti
);
3991 __SECONDARY_RELOAD_CASE (V1SF
, v1sf
);
3992 __SECONDARY_RELOAD_CASE (V2SF
, v2sf
);
3993 __SECONDARY_RELOAD_CASE (V4SF
, v4sf
);
3994 __SECONDARY_RELOAD_CASE (V1DF
, v1df
);
3995 __SECONDARY_RELOAD_CASE (V2DF
, v2df
);
3996 __SECONDARY_RELOAD_CASE (V1TF
, v1tf
);
4000 #undef __SECONDARY_RELOAD_CASE
4004 /* We need a scratch register when loading a PLUS expression which
4005 is not a legitimate operand of the LOAD ADDRESS instruction. */
4006 /* LRA can deal with transformation of plus op very well -- so we
4007 don't need to prompt LRA in this case. */
4008 if (! lra_in_progress
&& in_p
&& s390_plus_operand (x
, mode
))
4009 sri
->icode
= (TARGET_64BIT
?
4010 CODE_FOR_reloaddi_plus
: CODE_FOR_reloadsi_plus
);
4012 /* Performing a multiword move from or to memory we have to make sure the
4013 second chunk in memory is addressable without causing a displacement
4014 overflow. If that would be the case we calculate the address in
4015 a scratch register. */
4017 && GET_CODE (XEXP (x
, 0)) == PLUS
4018 && GET_CODE (XEXP (XEXP (x
, 0), 1)) == CONST_INT
4019 && !DISP_IN_RANGE (INTVAL (XEXP (XEXP (x
, 0), 1))
4020 + GET_MODE_SIZE (mode
) - 1))
4022 /* For GENERAL_REGS a displacement overflow is no problem if occurring
4023 in a s_operand address since we may fallback to lm/stm. So we only
4024 have to care about overflows in the b+i+d case. */
4025 if ((reg_classes_intersect_p (GENERAL_REGS
, rclass
)
4026 && s390_class_max_nregs (GENERAL_REGS
, mode
) > 1
4027 && GET_CODE (XEXP (XEXP (x
, 0), 0)) == PLUS
)
4028 /* For FP_REGS no lm/stm is available so this check is triggered
4029 for displacement overflows in b+i+d and b+d like addresses. */
4030 || (reg_classes_intersect_p (FP_REGS
, rclass
)
4031 && s390_class_max_nregs (FP_REGS
, mode
) > 1))
4034 sri
->icode
= (TARGET_64BIT
?
4035 CODE_FOR_reloaddi_la_in
:
4036 CODE_FOR_reloadsi_la_in
);
4038 sri
->icode
= (TARGET_64BIT
?
4039 CODE_FOR_reloaddi_la_out
:
4040 CODE_FOR_reloadsi_la_out
);
4044 /* A scratch address register is needed when a symbolic constant is
4045 copied to r0 compiling with -fPIC. In other cases the target
4046 register might be used as temporary (see legitimize_pic_address). */
4047 if (in_p
&& SYMBOLIC_CONST (x
) && flag_pic
== 2 && rclass
!= ADDR_REGS
)
4048 sri
->icode
= (TARGET_64BIT
?
4049 CODE_FOR_reloaddi_PIC_addr
:
4050 CODE_FOR_reloadsi_PIC_addr
);
4052 /* Either scratch or no register needed. */
4056 /* Generate code to load SRC, which is PLUS that is not a
4057 legitimate operand for the LA instruction, into TARGET.
4058 SCRATCH may be used as scratch register. */
4061 s390_expand_plus_operand (rtx target
, rtx src
,
4065 struct s390_address ad
;
4067 /* src must be a PLUS; get its two operands. */
4068 gcc_assert (GET_CODE (src
) == PLUS
);
4069 gcc_assert (GET_MODE (src
) == Pmode
);
4071 /* Check if any of the two operands is already scheduled
4072 for replacement by reload. This can happen e.g. when
4073 float registers occur in an address. */
4074 sum1
= find_replacement (&XEXP (src
, 0));
4075 sum2
= find_replacement (&XEXP (src
, 1));
4076 src
= gen_rtx_PLUS (Pmode
, sum1
, sum2
);
4078 /* If the address is already strictly valid, there's nothing to do. */
4079 if (!s390_decompose_address (src
, &ad
)
4080 || (ad
.base
&& !REGNO_OK_FOR_BASE_P (REGNO (ad
.base
)))
4081 || (ad
.indx
&& !REGNO_OK_FOR_INDEX_P (REGNO (ad
.indx
))))
4083 /* Otherwise, one of the operands cannot be an address register;
4084 we reload its value into the scratch register. */
4085 if (true_regnum (sum1
) < 1 || true_regnum (sum1
) > 15)
4087 emit_move_insn (scratch
, sum1
);
4090 if (true_regnum (sum2
) < 1 || true_regnum (sum2
) > 15)
4092 emit_move_insn (scratch
, sum2
);
4096 /* According to the way these invalid addresses are generated
4097 in reload.c, it should never happen (at least on s390) that
4098 *neither* of the PLUS components, after find_replacements
4099 was applied, is an address register. */
4100 if (sum1
== scratch
&& sum2
== scratch
)
4106 src
= gen_rtx_PLUS (Pmode
, sum1
, sum2
);
4109 /* Emit the LOAD ADDRESS pattern. Note that reload of PLUS
4110 is only ever performed on addresses, so we can mark the
4111 sum as legitimate for LA in any case. */
4112 s390_load_address (target
, src
);
4116 /* Return true if ADDR is a valid memory address.
4117 STRICT specifies whether strict register checking applies. */
4120 s390_legitimate_address_p (machine_mode mode
, rtx addr
, bool strict
)
4122 struct s390_address ad
;
4125 && larl_operand (addr
, VOIDmode
)
4126 && (mode
== VOIDmode
4127 || s390_check_symref_alignment (addr
, GET_MODE_SIZE (mode
))))
4130 if (!s390_decompose_address (addr
, &ad
))
4135 if (ad
.base
&& !REGNO_OK_FOR_BASE_P (REGNO (ad
.base
)))
4138 if (ad
.indx
&& !REGNO_OK_FOR_INDEX_P (REGNO (ad
.indx
)))
4144 && !(REGNO (ad
.base
) >= FIRST_PSEUDO_REGISTER
4145 || REGNO_REG_CLASS (REGNO (ad
.base
)) == ADDR_REGS
))
4149 && !(REGNO (ad
.indx
) >= FIRST_PSEUDO_REGISTER
4150 || REGNO_REG_CLASS (REGNO (ad
.indx
)) == ADDR_REGS
))
4156 /* Return true if OP is a valid operand for the LA instruction.
4157 In 31-bit, we need to prove that the result is used as an
4158 address, as LA performs only a 31-bit addition. */
4161 legitimate_la_operand_p (rtx op
)
4163 struct s390_address addr
;
4164 if (!s390_decompose_address (op
, &addr
))
4167 return (TARGET_64BIT
|| addr
.pointer
);
4170 /* Return true if it is valid *and* preferable to use LA to
4171 compute the sum of OP1 and OP2. */
4174 preferred_la_operand_p (rtx op1
, rtx op2
)
4176 struct s390_address addr
;
4178 if (op2
!= const0_rtx
)
4179 op1
= gen_rtx_PLUS (Pmode
, op1
, op2
);
4181 if (!s390_decompose_address (op1
, &addr
))
4183 if (addr
.base
&& !REGNO_OK_FOR_BASE_P (REGNO (addr
.base
)))
4185 if (addr
.indx
&& !REGNO_OK_FOR_INDEX_P (REGNO (addr
.indx
)))
4188 /* Avoid LA instructions with index register on z196; it is
4189 preferable to use regular add instructions when possible.
4190 Starting with zEC12 the la with index register is "uncracked"
4192 if (addr
.indx
&& s390_tune
== PROCESSOR_2817_Z196
)
4195 if (!TARGET_64BIT
&& !addr
.pointer
)
4201 if ((addr
.base
&& REG_P (addr
.base
) && REG_POINTER (addr
.base
))
4202 || (addr
.indx
&& REG_P (addr
.indx
) && REG_POINTER (addr
.indx
)))
4208 /* Emit a forced load-address operation to load SRC into DST.
4209 This will use the LOAD ADDRESS instruction even in situations
4210 where legitimate_la_operand_p (SRC) returns false. */
4213 s390_load_address (rtx dst
, rtx src
)
4216 emit_move_insn (dst
, src
);
4218 emit_insn (gen_force_la_31 (dst
, src
));
4221 /* Return a legitimate reference for ORIG (an address) using the
4222 register REG. If REG is 0, a new pseudo is generated.
4224 There are two types of references that must be handled:
4226 1. Global data references must load the address from the GOT, via
4227 the PIC reg. An insn is emitted to do this load, and the reg is
4230 2. Static data references, constant pool addresses, and code labels
4231 compute the address as an offset from the GOT, whose base is in
4232 the PIC reg. Static data objects have SYMBOL_FLAG_LOCAL set to
4233 differentiate them from global data objects. The returned
4234 address is the PIC reg + an unspec constant.
4236 TARGET_LEGITIMIZE_ADDRESS_P rejects symbolic references unless the PIC
4237 reg also appears in the address. */
4240 legitimize_pic_address (rtx orig
, rtx reg
)
4243 rtx addend
= const0_rtx
;
4246 gcc_assert (!TLS_SYMBOLIC_CONST (addr
));
4248 if (GET_CODE (addr
) == CONST
)
4249 addr
= XEXP (addr
, 0);
4251 if (GET_CODE (addr
) == PLUS
)
4253 addend
= XEXP (addr
, 1);
4254 addr
= XEXP (addr
, 0);
4257 if ((GET_CODE (addr
) == LABEL_REF
4258 || (GET_CODE (addr
) == SYMBOL_REF
&& SYMBOL_REF_LOCAL_P (addr
))
4259 || (GET_CODE (addr
) == UNSPEC
&&
4260 (XINT (addr
, 1) == UNSPEC_GOTENT
4261 || (TARGET_CPU_ZARCH
&& XINT (addr
, 1) == UNSPEC_PLT
))))
4262 && GET_CODE (addend
) == CONST_INT
)
4264 /* This can be locally addressed. */
4266 /* larl_operand requires UNSPECs to be wrapped in a const rtx. */
4267 rtx const_addr
= (GET_CODE (addr
) == UNSPEC
?
4268 gen_rtx_CONST (Pmode
, addr
) : addr
);
4270 if (TARGET_CPU_ZARCH
4271 && larl_operand (const_addr
, VOIDmode
)
4272 && INTVAL (addend
) < (HOST_WIDE_INT
)1 << 31
4273 && INTVAL (addend
) >= -((HOST_WIDE_INT
)1 << 31))
4275 if (INTVAL (addend
) & 1)
4277 /* LARL can't handle odd offsets, so emit a pair of LARL
4279 rtx temp
= reg
? reg
: gen_reg_rtx (Pmode
);
4281 if (!DISP_IN_RANGE (INTVAL (addend
)))
4283 HOST_WIDE_INT even
= INTVAL (addend
) - 1;
4284 addr
= gen_rtx_PLUS (Pmode
, addr
, GEN_INT (even
));
4285 addr
= gen_rtx_CONST (Pmode
, addr
);
4286 addend
= const1_rtx
;
4289 emit_move_insn (temp
, addr
);
4290 new_rtx
= gen_rtx_PLUS (Pmode
, temp
, addend
);
4294 s390_load_address (reg
, new_rtx
);
4300 /* If the offset is even, we can just use LARL. This
4301 will happen automatically. */
4306 /* No larl - Access local symbols relative to the GOT. */
4308 rtx temp
= reg
? reg
: gen_reg_rtx (Pmode
);
4310 if (reload_in_progress
|| reload_completed
)
4311 df_set_regs_ever_live (PIC_OFFSET_TABLE_REGNUM
, true);
4313 addr
= gen_rtx_UNSPEC (Pmode
, gen_rtvec (1, addr
), UNSPEC_GOTOFF
);
4314 if (addend
!= const0_rtx
)
4315 addr
= gen_rtx_PLUS (Pmode
, addr
, addend
);
4316 addr
= gen_rtx_CONST (Pmode
, addr
);
4317 addr
= force_const_mem (Pmode
, addr
);
4318 emit_move_insn (temp
, addr
);
4320 new_rtx
= gen_rtx_PLUS (Pmode
, pic_offset_table_rtx
, temp
);
4323 s390_load_address (reg
, new_rtx
);
4328 else if (GET_CODE (addr
) == SYMBOL_REF
&& addend
== const0_rtx
)
4330 /* A non-local symbol reference without addend.
4332 The symbol ref is wrapped into an UNSPEC to make sure the
4333 proper operand modifier (@GOT or @GOTENT) will be emitted.
4334 This will tell the linker to put the symbol into the GOT.
4336 Additionally the code dereferencing the GOT slot is emitted here.
4338 An addend to the symref needs to be added afterwards.
4339 legitimize_pic_address calls itself recursively to handle
4340 that case. So no need to do it here. */
4343 reg
= gen_reg_rtx (Pmode
);
4347 /* Use load relative if possible.
4348 lgrl <target>, sym@GOTENT */
4349 new_rtx
= gen_rtx_UNSPEC (Pmode
, gen_rtvec (1, addr
), UNSPEC_GOTENT
);
4350 new_rtx
= gen_rtx_CONST (Pmode
, new_rtx
);
4351 new_rtx
= gen_const_mem (GET_MODE (reg
), new_rtx
);
4353 emit_move_insn (reg
, new_rtx
);
4356 else if (flag_pic
== 1)
4358 /* Assume GOT offset is a valid displacement operand (< 4k
4359 or < 512k with z990). This is handled the same way in
4360 both 31- and 64-bit code (@GOT).
4361 lg <target>, sym@GOT(r12) */
4363 if (reload_in_progress
|| reload_completed
)
4364 df_set_regs_ever_live (PIC_OFFSET_TABLE_REGNUM
, true);
4366 new_rtx
= gen_rtx_UNSPEC (Pmode
, gen_rtvec (1, addr
), UNSPEC_GOT
);
4367 new_rtx
= gen_rtx_CONST (Pmode
, new_rtx
);
4368 new_rtx
= gen_rtx_PLUS (Pmode
, pic_offset_table_rtx
, new_rtx
);
4369 new_rtx
= gen_const_mem (Pmode
, new_rtx
);
4370 emit_move_insn (reg
, new_rtx
);
4373 else if (TARGET_CPU_ZARCH
)
4375 /* If the GOT offset might be >= 4k, we determine the position
4376 of the GOT entry via a PC-relative LARL (@GOTENT).
4377 larl temp, sym@GOTENT
4378 lg <target>, 0(temp) */
4380 rtx temp
= reg
? reg
: gen_reg_rtx (Pmode
);
4382 gcc_assert (REGNO (temp
) >= FIRST_PSEUDO_REGISTER
4383 || REGNO_REG_CLASS (REGNO (temp
)) == ADDR_REGS
);
4385 new_rtx
= gen_rtx_UNSPEC (Pmode
, gen_rtvec (1, addr
), UNSPEC_GOTENT
);
4386 new_rtx
= gen_rtx_CONST (Pmode
, new_rtx
);
4387 emit_move_insn (temp
, new_rtx
);
4389 new_rtx
= gen_const_mem (Pmode
, temp
);
4390 emit_move_insn (reg
, new_rtx
);
4396 /* If the GOT offset might be >= 4k, we have to load it
4397 from the literal pool (@GOT).
4399 lg temp, lit-litbase(r13)
4400 lg <target>, 0(temp)
4401 lit: .long sym@GOT */
4403 rtx temp
= reg
? reg
: gen_reg_rtx (Pmode
);
4405 gcc_assert (REGNO (temp
) >= FIRST_PSEUDO_REGISTER
4406 || REGNO_REG_CLASS (REGNO (temp
)) == ADDR_REGS
);
4408 if (reload_in_progress
|| reload_completed
)
4409 df_set_regs_ever_live (PIC_OFFSET_TABLE_REGNUM
, true);
4411 addr
= gen_rtx_UNSPEC (Pmode
, gen_rtvec (1, addr
), UNSPEC_GOT
);
4412 addr
= gen_rtx_CONST (Pmode
, addr
);
4413 addr
= force_const_mem (Pmode
, addr
);
4414 emit_move_insn (temp
, addr
);
4416 new_rtx
= gen_rtx_PLUS (Pmode
, pic_offset_table_rtx
, temp
);
4417 new_rtx
= gen_const_mem (Pmode
, new_rtx
);
4418 emit_move_insn (reg
, new_rtx
);
4422 else if (GET_CODE (addr
) == UNSPEC
&& GET_CODE (addend
) == CONST_INT
)
4424 gcc_assert (XVECLEN (addr
, 0) == 1);
4425 switch (XINT (addr
, 1))
4427 /* These address symbols (or PLT slots) relative to the GOT
4428 (not GOT slots!). In general this will exceed the
4429 displacement range so these value belong into the literal
4433 new_rtx
= force_const_mem (Pmode
, orig
);
4436 /* For -fPIC the GOT size might exceed the displacement
4437 range so make sure the value is in the literal pool. */
4440 new_rtx
= force_const_mem (Pmode
, orig
);
4443 /* For @GOTENT larl is used. This is handled like local
4449 /* @PLT is OK as is on 64-bit, must be converted to
4450 GOT-relative @PLTOFF on 31-bit. */
4452 if (!TARGET_CPU_ZARCH
)
4454 rtx temp
= reg
? reg
: gen_reg_rtx (Pmode
);
4456 if (reload_in_progress
|| reload_completed
)
4457 df_set_regs_ever_live (PIC_OFFSET_TABLE_REGNUM
, true);
4459 addr
= XVECEXP (addr
, 0, 0);
4460 addr
= gen_rtx_UNSPEC (Pmode
, gen_rtvec (1, addr
),
4462 if (addend
!= const0_rtx
)
4463 addr
= gen_rtx_PLUS (Pmode
, addr
, addend
);
4464 addr
= gen_rtx_CONST (Pmode
, addr
);
4465 addr
= force_const_mem (Pmode
, addr
);
4466 emit_move_insn (temp
, addr
);
4468 new_rtx
= gen_rtx_PLUS (Pmode
, pic_offset_table_rtx
, temp
);
4471 s390_load_address (reg
, new_rtx
);
4476 /* On 64 bit larl can be used. This case is handled like
4477 local symbol refs. */
4481 /* Everything else cannot happen. */
4486 else if (addend
!= const0_rtx
)
4488 /* Otherwise, compute the sum. */
4490 rtx base
= legitimize_pic_address (addr
, reg
);
4491 new_rtx
= legitimize_pic_address (addend
,
4492 base
== reg
? NULL_RTX
: reg
);
4493 if (GET_CODE (new_rtx
) == CONST_INT
)
4494 new_rtx
= plus_constant (Pmode
, base
, INTVAL (new_rtx
));
4497 if (GET_CODE (new_rtx
) == PLUS
&& CONSTANT_P (XEXP (new_rtx
, 1)))
4499 base
= gen_rtx_PLUS (Pmode
, base
, XEXP (new_rtx
, 0));
4500 new_rtx
= XEXP (new_rtx
, 1);
4502 new_rtx
= gen_rtx_PLUS (Pmode
, base
, new_rtx
);
4505 if (GET_CODE (new_rtx
) == CONST
)
4506 new_rtx
= XEXP (new_rtx
, 0);
4507 new_rtx
= force_operand (new_rtx
, 0);
4513 /* Load the thread pointer into a register. */
4516 s390_get_thread_pointer (void)
4518 rtx tp
= gen_reg_rtx (Pmode
);
4520 emit_move_insn (tp
, gen_rtx_REG (Pmode
, TP_REGNUM
));
4521 mark_reg_pointer (tp
, BITS_PER_WORD
);
4526 /* Emit a tls call insn. The call target is the SYMBOL_REF stored
4527 in s390_tls_symbol which always refers to __tls_get_offset.
4528 The returned offset is written to RESULT_REG and an USE rtx is
4529 generated for TLS_CALL. */
4531 static GTY(()) rtx s390_tls_symbol
;
4534 s390_emit_tls_call_insn (rtx result_reg
, rtx tls_call
)
4539 emit_insn (s390_load_got ());
4541 if (!s390_tls_symbol
)
4542 s390_tls_symbol
= gen_rtx_SYMBOL_REF (Pmode
, "__tls_get_offset");
4544 insn
= s390_emit_call (s390_tls_symbol
, tls_call
, result_reg
,
4545 gen_rtx_REG (Pmode
, RETURN_REGNUM
));
4547 use_reg (&CALL_INSN_FUNCTION_USAGE (insn
), result_reg
);
4548 RTL_CONST_CALL_P (insn
) = 1;
4551 /* ADDR contains a thread-local SYMBOL_REF. Generate code to compute
4552 this (thread-local) address. REG may be used as temporary. */
4555 legitimize_tls_address (rtx addr
, rtx reg
)
4557 rtx new_rtx
, tls_call
, temp
, base
, r2
, insn
;
4559 if (GET_CODE (addr
) == SYMBOL_REF
)
4560 switch (tls_symbolic_operand (addr
))
4562 case TLS_MODEL_GLOBAL_DYNAMIC
:
4564 r2
= gen_rtx_REG (Pmode
, 2);
4565 tls_call
= gen_rtx_UNSPEC (Pmode
, gen_rtvec (1, addr
), UNSPEC_TLSGD
);
4566 new_rtx
= gen_rtx_CONST (Pmode
, tls_call
);
4567 new_rtx
= force_const_mem (Pmode
, new_rtx
);
4568 emit_move_insn (r2
, new_rtx
);
4569 s390_emit_tls_call_insn (r2
, tls_call
);
4570 insn
= get_insns ();
4573 new_rtx
= gen_rtx_UNSPEC (Pmode
, gen_rtvec (1, addr
), UNSPEC_NTPOFF
);
4574 temp
= gen_reg_rtx (Pmode
);
4575 emit_libcall_block (insn
, temp
, r2
, new_rtx
);
4577 new_rtx
= gen_rtx_PLUS (Pmode
, s390_get_thread_pointer (), temp
);
4580 s390_load_address (reg
, new_rtx
);
4585 case TLS_MODEL_LOCAL_DYNAMIC
:
4587 r2
= gen_rtx_REG (Pmode
, 2);
4588 tls_call
= gen_rtx_UNSPEC (Pmode
, gen_rtvec (1, const0_rtx
), UNSPEC_TLSLDM
);
4589 new_rtx
= gen_rtx_CONST (Pmode
, tls_call
);
4590 new_rtx
= force_const_mem (Pmode
, new_rtx
);
4591 emit_move_insn (r2
, new_rtx
);
4592 s390_emit_tls_call_insn (r2
, tls_call
);
4593 insn
= get_insns ();
4596 new_rtx
= gen_rtx_UNSPEC (Pmode
, gen_rtvec (1, const0_rtx
), UNSPEC_TLSLDM_NTPOFF
);
4597 temp
= gen_reg_rtx (Pmode
);
4598 emit_libcall_block (insn
, temp
, r2
, new_rtx
);
4600 new_rtx
= gen_rtx_PLUS (Pmode
, s390_get_thread_pointer (), temp
);
4601 base
= gen_reg_rtx (Pmode
);
4602 s390_load_address (base
, new_rtx
);
4604 new_rtx
= gen_rtx_UNSPEC (Pmode
, gen_rtvec (1, addr
), UNSPEC_DTPOFF
);
4605 new_rtx
= gen_rtx_CONST (Pmode
, new_rtx
);
4606 new_rtx
= force_const_mem (Pmode
, new_rtx
);
4607 temp
= gen_reg_rtx (Pmode
);
4608 emit_move_insn (temp
, new_rtx
);
4610 new_rtx
= gen_rtx_PLUS (Pmode
, base
, temp
);
4613 s390_load_address (reg
, new_rtx
);
4618 case TLS_MODEL_INITIAL_EXEC
:
4621 /* Assume GOT offset < 4k. This is handled the same way
4622 in both 31- and 64-bit code. */
4624 if (reload_in_progress
|| reload_completed
)
4625 df_set_regs_ever_live (PIC_OFFSET_TABLE_REGNUM
, true);
4627 new_rtx
= gen_rtx_UNSPEC (Pmode
, gen_rtvec (1, addr
), UNSPEC_GOTNTPOFF
);
4628 new_rtx
= gen_rtx_CONST (Pmode
, new_rtx
);
4629 new_rtx
= gen_rtx_PLUS (Pmode
, pic_offset_table_rtx
, new_rtx
);
4630 new_rtx
= gen_const_mem (Pmode
, new_rtx
);
4631 temp
= gen_reg_rtx (Pmode
);
4632 emit_move_insn (temp
, new_rtx
);
4634 else if (TARGET_CPU_ZARCH
)
4636 /* If the GOT offset might be >= 4k, we determine the position
4637 of the GOT entry via a PC-relative LARL. */
4639 new_rtx
= gen_rtx_UNSPEC (Pmode
, gen_rtvec (1, addr
), UNSPEC_INDNTPOFF
);
4640 new_rtx
= gen_rtx_CONST (Pmode
, new_rtx
);
4641 temp
= gen_reg_rtx (Pmode
);
4642 emit_move_insn (temp
, new_rtx
);
4644 new_rtx
= gen_const_mem (Pmode
, temp
);
4645 temp
= gen_reg_rtx (Pmode
);
4646 emit_move_insn (temp
, new_rtx
);
4650 /* If the GOT offset might be >= 4k, we have to load it
4651 from the literal pool. */
4653 if (reload_in_progress
|| reload_completed
)
4654 df_set_regs_ever_live (PIC_OFFSET_TABLE_REGNUM
, true);
4656 new_rtx
= gen_rtx_UNSPEC (Pmode
, gen_rtvec (1, addr
), UNSPEC_GOTNTPOFF
);
4657 new_rtx
= gen_rtx_CONST (Pmode
, new_rtx
);
4658 new_rtx
= force_const_mem (Pmode
, new_rtx
);
4659 temp
= gen_reg_rtx (Pmode
);
4660 emit_move_insn (temp
, new_rtx
);
4662 new_rtx
= gen_rtx_PLUS (Pmode
, pic_offset_table_rtx
, temp
);
4663 new_rtx
= gen_const_mem (Pmode
, new_rtx
);
4665 new_rtx
= gen_rtx_UNSPEC (Pmode
, gen_rtvec (2, new_rtx
, addr
), UNSPEC_TLS_LOAD
);
4666 temp
= gen_reg_rtx (Pmode
);
4667 emit_insn (gen_rtx_SET (temp
, new_rtx
));
4671 /* In position-dependent code, load the absolute address of
4672 the GOT entry from the literal pool. */
4674 new_rtx
= gen_rtx_UNSPEC (Pmode
, gen_rtvec (1, addr
), UNSPEC_INDNTPOFF
);
4675 new_rtx
= gen_rtx_CONST (Pmode
, new_rtx
);
4676 new_rtx
= force_const_mem (Pmode
, new_rtx
);
4677 temp
= gen_reg_rtx (Pmode
);
4678 emit_move_insn (temp
, new_rtx
);
4681 new_rtx
= gen_const_mem (Pmode
, new_rtx
);
4682 new_rtx
= gen_rtx_UNSPEC (Pmode
, gen_rtvec (2, new_rtx
, addr
), UNSPEC_TLS_LOAD
);
4683 temp
= gen_reg_rtx (Pmode
);
4684 emit_insn (gen_rtx_SET (temp
, new_rtx
));
4687 new_rtx
= gen_rtx_PLUS (Pmode
, s390_get_thread_pointer (), temp
);
4690 s390_load_address (reg
, new_rtx
);
4695 case TLS_MODEL_LOCAL_EXEC
:
4696 new_rtx
= gen_rtx_UNSPEC (Pmode
, gen_rtvec (1, addr
), UNSPEC_NTPOFF
);
4697 new_rtx
= gen_rtx_CONST (Pmode
, new_rtx
);
4698 new_rtx
= force_const_mem (Pmode
, new_rtx
);
4699 temp
= gen_reg_rtx (Pmode
);
4700 emit_move_insn (temp
, new_rtx
);
4702 new_rtx
= gen_rtx_PLUS (Pmode
, s390_get_thread_pointer (), temp
);
4705 s390_load_address (reg
, new_rtx
);
4714 else if (GET_CODE (addr
) == CONST
&& GET_CODE (XEXP (addr
, 0)) == UNSPEC
)
4716 switch (XINT (XEXP (addr
, 0), 1))
4718 case UNSPEC_INDNTPOFF
:
4719 gcc_assert (TARGET_CPU_ZARCH
);
4728 else if (GET_CODE (addr
) == CONST
&& GET_CODE (XEXP (addr
, 0)) == PLUS
4729 && GET_CODE (XEXP (XEXP (addr
, 0), 1)) == CONST_INT
)
4731 new_rtx
= XEXP (XEXP (addr
, 0), 0);
4732 if (GET_CODE (new_rtx
) != SYMBOL_REF
)
4733 new_rtx
= gen_rtx_CONST (Pmode
, new_rtx
);
4735 new_rtx
= legitimize_tls_address (new_rtx
, reg
);
4736 new_rtx
= plus_constant (Pmode
, new_rtx
,
4737 INTVAL (XEXP (XEXP (addr
, 0), 1)));
4738 new_rtx
= force_operand (new_rtx
, 0);
4742 gcc_unreachable (); /* for now ... */
4747 /* Emit insns making the address in operands[1] valid for a standard
4748 move to operands[0]. operands[1] is replaced by an address which
4749 should be used instead of the former RTX to emit the move
4753 emit_symbolic_move (rtx
*operands
)
4755 rtx temp
= !can_create_pseudo_p () ? operands
[0] : gen_reg_rtx (Pmode
);
4757 if (GET_CODE (operands
[0]) == MEM
)
4758 operands
[1] = force_reg (Pmode
, operands
[1]);
4759 else if (TLS_SYMBOLIC_CONST (operands
[1]))
4760 operands
[1] = legitimize_tls_address (operands
[1], temp
);
4762 operands
[1] = legitimize_pic_address (operands
[1], temp
);
4765 /* Try machine-dependent ways of modifying an illegitimate address X
4766 to be legitimate. If we find one, return the new, valid address.
4768 OLDX is the address as it was before break_out_memory_refs was called.
4769 In some cases it is useful to look at this to decide what needs to be done.
4771 MODE is the mode of the operand pointed to by X.
4773 When -fpic is used, special handling is needed for symbolic references.
4774 See comments by legitimize_pic_address for details. */
4777 s390_legitimize_address (rtx x
, rtx oldx ATTRIBUTE_UNUSED
,
4778 machine_mode mode ATTRIBUTE_UNUSED
)
4780 rtx constant_term
= const0_rtx
;
4782 if (TLS_SYMBOLIC_CONST (x
))
4784 x
= legitimize_tls_address (x
, 0);
4786 if (s390_legitimate_address_p (mode
, x
, FALSE
))
4789 else if (GET_CODE (x
) == PLUS
4790 && (TLS_SYMBOLIC_CONST (XEXP (x
, 0))
4791 || TLS_SYMBOLIC_CONST (XEXP (x
, 1))))
4797 if (SYMBOLIC_CONST (x
)
4798 || (GET_CODE (x
) == PLUS
4799 && (SYMBOLIC_CONST (XEXP (x
, 0))
4800 || SYMBOLIC_CONST (XEXP (x
, 1)))))
4801 x
= legitimize_pic_address (x
, 0);
4803 if (s390_legitimate_address_p (mode
, x
, FALSE
))
4807 x
= eliminate_constant_term (x
, &constant_term
);
4809 /* Optimize loading of large displacements by splitting them
4810 into the multiple of 4K and the rest; this allows the
4811 former to be CSE'd if possible.
4813 Don't do this if the displacement is added to a register
4814 pointing into the stack frame, as the offsets will
4815 change later anyway. */
4817 if (GET_CODE (constant_term
) == CONST_INT
4818 && !TARGET_LONG_DISPLACEMENT
4819 && !DISP_IN_RANGE (INTVAL (constant_term
))
4820 && !(REG_P (x
) && REGNO_PTR_FRAME_P (REGNO (x
))))
4822 HOST_WIDE_INT lower
= INTVAL (constant_term
) & 0xfff;
4823 HOST_WIDE_INT upper
= INTVAL (constant_term
) ^ lower
;
4825 rtx temp
= gen_reg_rtx (Pmode
);
4826 rtx val
= force_operand (GEN_INT (upper
), temp
);
4828 emit_move_insn (temp
, val
);
4830 x
= gen_rtx_PLUS (Pmode
, x
, temp
);
4831 constant_term
= GEN_INT (lower
);
4834 if (GET_CODE (x
) == PLUS
)
4836 if (GET_CODE (XEXP (x
, 0)) == REG
)
4838 rtx temp
= gen_reg_rtx (Pmode
);
4839 rtx val
= force_operand (XEXP (x
, 1), temp
);
4841 emit_move_insn (temp
, val
);
4843 x
= gen_rtx_PLUS (Pmode
, XEXP (x
, 0), temp
);
4846 else if (GET_CODE (XEXP (x
, 1)) == REG
)
4848 rtx temp
= gen_reg_rtx (Pmode
);
4849 rtx val
= force_operand (XEXP (x
, 0), temp
);
4851 emit_move_insn (temp
, val
);
4853 x
= gen_rtx_PLUS (Pmode
, temp
, XEXP (x
, 1));
4857 if (constant_term
!= const0_rtx
)
4858 x
= gen_rtx_PLUS (Pmode
, x
, constant_term
);
4863 /* Try a machine-dependent way of reloading an illegitimate address AD
4864 operand. If we find one, push the reload and return the new address.
4866 MODE is the mode of the enclosing MEM. OPNUM is the operand number
4867 and TYPE is the reload type of the current reload. */
4870 legitimize_reload_address (rtx ad
, machine_mode mode ATTRIBUTE_UNUSED
,
4871 int opnum
, int type
)
4873 if (!optimize
|| TARGET_LONG_DISPLACEMENT
)
4876 if (GET_CODE (ad
) == PLUS
)
4878 rtx tem
= simplify_binary_operation (PLUS
, Pmode
,
4879 XEXP (ad
, 0), XEXP (ad
, 1));
4884 if (GET_CODE (ad
) == PLUS
4885 && GET_CODE (XEXP (ad
, 0)) == REG
4886 && GET_CODE (XEXP (ad
, 1)) == CONST_INT
4887 && !DISP_IN_RANGE (INTVAL (XEXP (ad
, 1))))
4889 HOST_WIDE_INT lower
= INTVAL (XEXP (ad
, 1)) & 0xfff;
4890 HOST_WIDE_INT upper
= INTVAL (XEXP (ad
, 1)) ^ lower
;
4891 rtx cst
, tem
, new_rtx
;
4893 cst
= GEN_INT (upper
);
4894 if (!legitimate_reload_constant_p (cst
))
4895 cst
= force_const_mem (Pmode
, cst
);
4897 tem
= gen_rtx_PLUS (Pmode
, XEXP (ad
, 0), cst
);
4898 new_rtx
= gen_rtx_PLUS (Pmode
, tem
, GEN_INT (lower
));
4900 push_reload (XEXP (tem
, 1), 0, &XEXP (tem
, 1), 0,
4901 BASE_REG_CLASS
, Pmode
, VOIDmode
, 0, 0,
4902 opnum
, (enum reload_type
) type
);
4909 /* Emit code to move LEN bytes from DST to SRC. */
4912 s390_expand_movmem (rtx dst
, rtx src
, rtx len
)
4914 /* When tuning for z10 or higher we rely on the Glibc functions to
4915 do the right thing. Only for constant lengths below 64k we will
4916 generate inline code. */
4917 if (s390_tune
>= PROCESSOR_2097_Z10
4918 && (GET_CODE (len
) != CONST_INT
|| INTVAL (len
) > (1<<16)))
4921 if (GET_CODE (len
) == CONST_INT
&& INTVAL (len
) >= 0 && INTVAL (len
) <= 256)
4923 if (INTVAL (len
) > 0)
4924 emit_insn (gen_movmem_short (dst
, src
, GEN_INT (INTVAL (len
) - 1)));
4927 else if (TARGET_MVCLE
)
4929 emit_insn (gen_movmem_long (dst
, src
, convert_to_mode (Pmode
, len
, 1)));
4934 rtx dst_addr
, src_addr
, count
, blocks
, temp
;
4935 rtx_code_label
*loop_start_label
= gen_label_rtx ();
4936 rtx_code_label
*loop_end_label
= gen_label_rtx ();
4937 rtx_code_label
*end_label
= gen_label_rtx ();
4940 mode
= GET_MODE (len
);
4941 if (mode
== VOIDmode
)
4944 dst_addr
= gen_reg_rtx (Pmode
);
4945 src_addr
= gen_reg_rtx (Pmode
);
4946 count
= gen_reg_rtx (mode
);
4947 blocks
= gen_reg_rtx (mode
);
4949 convert_move (count
, len
, 1);
4950 emit_cmp_and_jump_insns (count
, const0_rtx
,
4951 EQ
, NULL_RTX
, mode
, 1, end_label
);
4953 emit_move_insn (dst_addr
, force_operand (XEXP (dst
, 0), NULL_RTX
));
4954 emit_move_insn (src_addr
, force_operand (XEXP (src
, 0), NULL_RTX
));
4955 dst
= change_address (dst
, VOIDmode
, dst_addr
);
4956 src
= change_address (src
, VOIDmode
, src_addr
);
4958 temp
= expand_binop (mode
, add_optab
, count
, constm1_rtx
, count
, 1,
4961 emit_move_insn (count
, temp
);
4963 temp
= expand_binop (mode
, lshr_optab
, count
, GEN_INT (8), blocks
, 1,
4966 emit_move_insn (blocks
, temp
);
4968 emit_cmp_and_jump_insns (blocks
, const0_rtx
,
4969 EQ
, NULL_RTX
, mode
, 1, loop_end_label
);
4971 emit_label (loop_start_label
);
4974 && (GET_CODE (len
) != CONST_INT
|| INTVAL (len
) > 768))
4978 /* Issue a read prefetch for the +3 cache line. */
4979 prefetch
= gen_prefetch (gen_rtx_PLUS (Pmode
, src_addr
, GEN_INT (768)),
4980 const0_rtx
, const0_rtx
);
4981 PREFETCH_SCHEDULE_BARRIER_P (prefetch
) = true;
4982 emit_insn (prefetch
);
4984 /* Issue a write prefetch for the +3 cache line. */
4985 prefetch
= gen_prefetch (gen_rtx_PLUS (Pmode
, dst_addr
, GEN_INT (768)),
4986 const1_rtx
, const0_rtx
);
4987 PREFETCH_SCHEDULE_BARRIER_P (prefetch
) = true;
4988 emit_insn (prefetch
);
4991 emit_insn (gen_movmem_short (dst
, src
, GEN_INT (255)));
4992 s390_load_address (dst_addr
,
4993 gen_rtx_PLUS (Pmode
, dst_addr
, GEN_INT (256)));
4994 s390_load_address (src_addr
,
4995 gen_rtx_PLUS (Pmode
, src_addr
, GEN_INT (256)));
4997 temp
= expand_binop (mode
, add_optab
, blocks
, constm1_rtx
, blocks
, 1,
5000 emit_move_insn (blocks
, temp
);
5002 emit_cmp_and_jump_insns (blocks
, const0_rtx
,
5003 EQ
, NULL_RTX
, mode
, 1, loop_end_label
);
5005 emit_jump (loop_start_label
);
5006 emit_label (loop_end_label
);
5008 emit_insn (gen_movmem_short (dst
, src
,
5009 convert_to_mode (Pmode
, count
, 1)));
5010 emit_label (end_label
);
5015 /* Emit code to set LEN bytes at DST to VAL.
5016 Make use of clrmem if VAL is zero. */
5019 s390_expand_setmem (rtx dst
, rtx len
, rtx val
)
5021 if (GET_CODE (len
) == CONST_INT
&& INTVAL (len
) == 0)
5024 gcc_assert (GET_CODE (val
) == CONST_INT
|| GET_MODE (val
) == QImode
);
5026 if (GET_CODE (len
) == CONST_INT
&& INTVAL (len
) > 0 && INTVAL (len
) <= 257)
5028 if (val
== const0_rtx
&& INTVAL (len
) <= 256)
5029 emit_insn (gen_clrmem_short (dst
, GEN_INT (INTVAL (len
) - 1)));
5032 /* Initialize memory by storing the first byte. */
5033 emit_move_insn (adjust_address (dst
, QImode
, 0), val
);
5035 if (INTVAL (len
) > 1)
5037 /* Initiate 1 byte overlap move.
5038 The first byte of DST is propagated through DSTP1.
5039 Prepare a movmem for: DST+1 = DST (length = LEN - 1).
5040 DST is set to size 1 so the rest of the memory location
5041 does not count as source operand. */
5042 rtx dstp1
= adjust_address (dst
, VOIDmode
, 1);
5043 set_mem_size (dst
, 1);
5045 emit_insn (gen_movmem_short (dstp1
, dst
,
5046 GEN_INT (INTVAL (len
) - 2)));
5051 else if (TARGET_MVCLE
)
5053 val
= force_not_mem (convert_modes (Pmode
, QImode
, val
, 1));
5054 emit_insn (gen_setmem_long (dst
, convert_to_mode (Pmode
, len
, 1), val
));
5059 rtx dst_addr
, count
, blocks
, temp
, dstp1
= NULL_RTX
;
5060 rtx_code_label
*loop_start_label
= gen_label_rtx ();
5061 rtx_code_label
*loop_end_label
= gen_label_rtx ();
5062 rtx_code_label
*end_label
= gen_label_rtx ();
5065 mode
= GET_MODE (len
);
5066 if (mode
== VOIDmode
)
5069 dst_addr
= gen_reg_rtx (Pmode
);
5070 count
= gen_reg_rtx (mode
);
5071 blocks
= gen_reg_rtx (mode
);
5073 convert_move (count
, len
, 1);
5074 emit_cmp_and_jump_insns (count
, const0_rtx
,
5075 EQ
, NULL_RTX
, mode
, 1, end_label
);
5077 emit_move_insn (dst_addr
, force_operand (XEXP (dst
, 0), NULL_RTX
));
5078 dst
= change_address (dst
, VOIDmode
, dst_addr
);
5080 if (val
== const0_rtx
)
5081 temp
= expand_binop (mode
, add_optab
, count
, constm1_rtx
, count
, 1,
5085 dstp1
= adjust_address (dst
, VOIDmode
, 1);
5086 set_mem_size (dst
, 1);
5088 /* Initialize memory by storing the first byte. */
5089 emit_move_insn (adjust_address (dst
, QImode
, 0), val
);
5091 /* If count is 1 we are done. */
5092 emit_cmp_and_jump_insns (count
, const1_rtx
,
5093 EQ
, NULL_RTX
, mode
, 1, end_label
);
5095 temp
= expand_binop (mode
, add_optab
, count
, GEN_INT (-2), count
, 1,
5099 emit_move_insn (count
, temp
);
5101 temp
= expand_binop (mode
, lshr_optab
, count
, GEN_INT (8), blocks
, 1,
5104 emit_move_insn (blocks
, temp
);
5106 emit_cmp_and_jump_insns (blocks
, const0_rtx
,
5107 EQ
, NULL_RTX
, mode
, 1, loop_end_label
);
5109 emit_label (loop_start_label
);
5112 && (GET_CODE (len
) != CONST_INT
|| INTVAL (len
) > 1024))
5114 /* Issue a write prefetch for the +4 cache line. */
5115 rtx prefetch
= gen_prefetch (gen_rtx_PLUS (Pmode
, dst_addr
,
5117 const1_rtx
, const0_rtx
);
5118 emit_insn (prefetch
);
5119 PREFETCH_SCHEDULE_BARRIER_P (prefetch
) = true;
5122 if (val
== const0_rtx
)
5123 emit_insn (gen_clrmem_short (dst
, GEN_INT (255)));
5125 emit_insn (gen_movmem_short (dstp1
, dst
, GEN_INT (255)));
5126 s390_load_address (dst_addr
,
5127 gen_rtx_PLUS (Pmode
, dst_addr
, GEN_INT (256)));
5129 temp
= expand_binop (mode
, add_optab
, blocks
, constm1_rtx
, blocks
, 1,
5132 emit_move_insn (blocks
, temp
);
5134 emit_cmp_and_jump_insns (blocks
, const0_rtx
,
5135 EQ
, NULL_RTX
, mode
, 1, loop_end_label
);
5137 emit_jump (loop_start_label
);
5138 emit_label (loop_end_label
);
5140 if (val
== const0_rtx
)
5141 emit_insn (gen_clrmem_short (dst
, convert_to_mode (Pmode
, count
, 1)));
5143 emit_insn (gen_movmem_short (dstp1
, dst
, convert_to_mode (Pmode
, count
, 1)));
5144 emit_label (end_label
);
5148 /* Emit code to compare LEN bytes at OP0 with those at OP1,
5149 and return the result in TARGET. */
5152 s390_expand_cmpmem (rtx target
, rtx op0
, rtx op1
, rtx len
)
5154 rtx ccreg
= gen_rtx_REG (CCUmode
, CC_REGNUM
);
5157 /* When tuning for z10 or higher we rely on the Glibc functions to
5158 do the right thing. Only for constant lengths below 64k we will
5159 generate inline code. */
5160 if (s390_tune
>= PROCESSOR_2097_Z10
5161 && (GET_CODE (len
) != CONST_INT
|| INTVAL (len
) > (1<<16)))
5164 /* As the result of CMPINT is inverted compared to what we need,
5165 we have to swap the operands. */
5166 tmp
= op0
; op0
= op1
; op1
= tmp
;
5168 if (GET_CODE (len
) == CONST_INT
&& INTVAL (len
) >= 0 && INTVAL (len
) <= 256)
5170 if (INTVAL (len
) > 0)
5172 emit_insn (gen_cmpmem_short (op0
, op1
, GEN_INT (INTVAL (len
) - 1)));
5173 emit_insn (gen_cmpint (target
, ccreg
));
5176 emit_move_insn (target
, const0_rtx
);
5178 else if (TARGET_MVCLE
)
5180 emit_insn (gen_cmpmem_long (op0
, op1
, convert_to_mode (Pmode
, len
, 1)));
5181 emit_insn (gen_cmpint (target
, ccreg
));
5185 rtx addr0
, addr1
, count
, blocks
, temp
;
5186 rtx_code_label
*loop_start_label
= gen_label_rtx ();
5187 rtx_code_label
*loop_end_label
= gen_label_rtx ();
5188 rtx_code_label
*end_label
= gen_label_rtx ();
5191 mode
= GET_MODE (len
);
5192 if (mode
== VOIDmode
)
5195 addr0
= gen_reg_rtx (Pmode
);
5196 addr1
= gen_reg_rtx (Pmode
);
5197 count
= gen_reg_rtx (mode
);
5198 blocks
= gen_reg_rtx (mode
);
5200 convert_move (count
, len
, 1);
5201 emit_cmp_and_jump_insns (count
, const0_rtx
,
5202 EQ
, NULL_RTX
, mode
, 1, end_label
);
5204 emit_move_insn (addr0
, force_operand (XEXP (op0
, 0), NULL_RTX
));
5205 emit_move_insn (addr1
, force_operand (XEXP (op1
, 0), NULL_RTX
));
5206 op0
= change_address (op0
, VOIDmode
, addr0
);
5207 op1
= change_address (op1
, VOIDmode
, addr1
);
5209 temp
= expand_binop (mode
, add_optab
, count
, constm1_rtx
, count
, 1,
5212 emit_move_insn (count
, temp
);
5214 temp
= expand_binop (mode
, lshr_optab
, count
, GEN_INT (8), blocks
, 1,
5217 emit_move_insn (blocks
, temp
);
5219 emit_cmp_and_jump_insns (blocks
, const0_rtx
,
5220 EQ
, NULL_RTX
, mode
, 1, loop_end_label
);
5222 emit_label (loop_start_label
);
5225 && (GET_CODE (len
) != CONST_INT
|| INTVAL (len
) > 512))
5229 /* Issue a read prefetch for the +2 cache line of operand 1. */
5230 prefetch
= gen_prefetch (gen_rtx_PLUS (Pmode
, addr0
, GEN_INT (512)),
5231 const0_rtx
, const0_rtx
);
5232 emit_insn (prefetch
);
5233 PREFETCH_SCHEDULE_BARRIER_P (prefetch
) = true;
5235 /* Issue a read prefetch for the +2 cache line of operand 2. */
5236 prefetch
= gen_prefetch (gen_rtx_PLUS (Pmode
, addr1
, GEN_INT (512)),
5237 const0_rtx
, const0_rtx
);
5238 emit_insn (prefetch
);
5239 PREFETCH_SCHEDULE_BARRIER_P (prefetch
) = true;
5242 emit_insn (gen_cmpmem_short (op0
, op1
, GEN_INT (255)));
5243 temp
= gen_rtx_NE (VOIDmode
, ccreg
, const0_rtx
);
5244 temp
= gen_rtx_IF_THEN_ELSE (VOIDmode
, temp
,
5245 gen_rtx_LABEL_REF (VOIDmode
, end_label
), pc_rtx
);
5246 temp
= gen_rtx_SET (pc_rtx
, temp
);
5247 emit_jump_insn (temp
);
5249 s390_load_address (addr0
,
5250 gen_rtx_PLUS (Pmode
, addr0
, GEN_INT (256)));
5251 s390_load_address (addr1
,
5252 gen_rtx_PLUS (Pmode
, addr1
, GEN_INT (256)));
5254 temp
= expand_binop (mode
, add_optab
, blocks
, constm1_rtx
, blocks
, 1,
5257 emit_move_insn (blocks
, temp
);
5259 emit_cmp_and_jump_insns (blocks
, const0_rtx
,
5260 EQ
, NULL_RTX
, mode
, 1, loop_end_label
);
5262 emit_jump (loop_start_label
);
5263 emit_label (loop_end_label
);
5265 emit_insn (gen_cmpmem_short (op0
, op1
,
5266 convert_to_mode (Pmode
, count
, 1)));
5267 emit_label (end_label
);
5269 emit_insn (gen_cmpint (target
, ccreg
));
5274 /* Emit a conditional jump to LABEL for condition code mask MASK using
5275 comparsion operator COMPARISON. Return the emitted jump insn. */
5278 s390_emit_ccraw_jump (HOST_WIDE_INT mask
, enum rtx_code comparison
, rtx label
)
5282 gcc_assert (comparison
== EQ
|| comparison
== NE
);
5283 gcc_assert (mask
> 0 && mask
< 15);
5285 temp
= gen_rtx_fmt_ee (comparison
, VOIDmode
,
5286 gen_rtx_REG (CCRAWmode
, CC_REGNUM
), GEN_INT (mask
));
5287 temp
= gen_rtx_IF_THEN_ELSE (VOIDmode
, temp
,
5288 gen_rtx_LABEL_REF (VOIDmode
, label
), pc_rtx
);
5289 temp
= gen_rtx_SET (pc_rtx
, temp
);
5290 return emit_jump_insn (temp
);
5293 /* Emit the instructions to implement strlen of STRING and store the
5294 result in TARGET. The string has the known ALIGNMENT. This
5295 version uses vector instructions and is therefore not appropriate
5296 for targets prior to z13. */
5299 s390_expand_vec_strlen (rtx target
, rtx string
, rtx alignment
)
5301 int very_unlikely
= REG_BR_PROB_BASE
/ 100 - 1;
5302 int very_likely
= REG_BR_PROB_BASE
- 1;
5303 rtx highest_index_to_load_reg
= gen_reg_rtx (Pmode
);
5304 rtx str_reg
= gen_reg_rtx (V16QImode
);
5305 rtx str_addr_base_reg
= gen_reg_rtx (Pmode
);
5306 rtx str_idx_reg
= gen_reg_rtx (Pmode
);
5307 rtx result_reg
= gen_reg_rtx (V16QImode
);
5308 rtx is_aligned_label
= gen_label_rtx ();
5309 rtx into_loop_label
= NULL_RTX
;
5310 rtx loop_start_label
= gen_label_rtx ();
5312 rtx len
= gen_reg_rtx (QImode
);
5315 s390_load_address (str_addr_base_reg
, XEXP (string
, 0));
5316 emit_move_insn (str_idx_reg
, const0_rtx
);
5318 if (INTVAL (alignment
) < 16)
5320 /* Check whether the address happens to be aligned properly so
5321 jump directly to the aligned loop. */
5322 emit_cmp_and_jump_insns (gen_rtx_AND (Pmode
,
5323 str_addr_base_reg
, GEN_INT (15)),
5324 const0_rtx
, EQ
, NULL_RTX
,
5325 Pmode
, 1, is_aligned_label
);
5327 temp
= gen_reg_rtx (Pmode
);
5328 temp
= expand_binop (Pmode
, and_optab
, str_addr_base_reg
,
5329 GEN_INT (15), temp
, 1, OPTAB_DIRECT
);
5330 gcc_assert (REG_P (temp
));
5331 highest_index_to_load_reg
=
5332 expand_binop (Pmode
, sub_optab
, GEN_INT (15), temp
,
5333 highest_index_to_load_reg
, 1, OPTAB_DIRECT
);
5334 gcc_assert (REG_P (highest_index_to_load_reg
));
5335 emit_insn (gen_vllv16qi (str_reg
,
5336 convert_to_mode (SImode
, highest_index_to_load_reg
, 1),
5337 gen_rtx_MEM (BLKmode
, str_addr_base_reg
)));
5339 into_loop_label
= gen_label_rtx ();
5340 s390_emit_jump (into_loop_label
, NULL_RTX
);
5344 emit_label (is_aligned_label
);
5345 LABEL_NUSES (is_aligned_label
) = INTVAL (alignment
) < 16 ? 2 : 1;
5347 /* Reaching this point we are only performing 16 bytes aligned
5349 emit_move_insn (highest_index_to_load_reg
, GEN_INT (15));
5351 emit_label (loop_start_label
);
5352 LABEL_NUSES (loop_start_label
) = 1;
5354 /* Load 16 bytes of the string into VR. */
5355 emit_move_insn (str_reg
,
5356 gen_rtx_MEM (V16QImode
,
5357 gen_rtx_PLUS (Pmode
, str_idx_reg
,
5358 str_addr_base_reg
)));
5359 if (into_loop_label
!= NULL_RTX
)
5361 emit_label (into_loop_label
);
5362 LABEL_NUSES (into_loop_label
) = 1;
5365 /* Increment string index by 16 bytes. */
5366 expand_binop (Pmode
, add_optab
, str_idx_reg
, GEN_INT (16),
5367 str_idx_reg
, 1, OPTAB_DIRECT
);
5369 emit_insn (gen_vec_vfenesv16qi (result_reg
, str_reg
, str_reg
,
5370 GEN_INT (VSTRING_FLAG_ZS
| VSTRING_FLAG_CS
)));
5372 add_int_reg_note (s390_emit_ccraw_jump (8, NE
, loop_start_label
),
5373 REG_BR_PROB
, very_likely
);
5374 emit_insn (gen_vec_extractv16qi (len
, result_reg
, GEN_INT (7)));
5376 /* If the string pointer wasn't aligned we have loaded less then 16
5377 bytes and the remaining bytes got filled with zeros (by vll).
5378 Now we have to check whether the resulting index lies within the
5379 bytes actually part of the string. */
5381 cond
= s390_emit_compare (GT
, convert_to_mode (Pmode
, len
, 1),
5382 highest_index_to_load_reg
);
5383 s390_load_address (highest_index_to_load_reg
,
5384 gen_rtx_PLUS (Pmode
, highest_index_to_load_reg
,
5387 emit_insn (gen_movdicc (str_idx_reg
, cond
,
5388 highest_index_to_load_reg
, str_idx_reg
));
5390 emit_insn (gen_movsicc (str_idx_reg
, cond
,
5391 highest_index_to_load_reg
, str_idx_reg
));
5393 add_int_reg_note (s390_emit_jump (is_aligned_label
, cond
), REG_BR_PROB
,
5396 expand_binop (Pmode
, add_optab
, str_idx_reg
,
5397 GEN_INT (-16), str_idx_reg
, 1, OPTAB_DIRECT
);
5398 /* FIXME: len is already zero extended - so avoid the llgcr emitted
5400 temp
= expand_binop (Pmode
, add_optab
, str_idx_reg
,
5401 convert_to_mode (Pmode
, len
, 1),
5402 target
, 1, OPTAB_DIRECT
);
5404 emit_move_insn (target
, temp
);
5407 /* Expand conditional increment or decrement using alc/slb instructions.
5408 Should generate code setting DST to either SRC or SRC + INCREMENT,
5409 depending on the result of the comparison CMP_OP0 CMP_CODE CMP_OP1.
5410 Returns true if successful, false otherwise.
5412 That makes it possible to implement some if-constructs without jumps e.g.:
5413 (borrow = CC0 | CC1 and carry = CC2 | CC3)
5414 unsigned int a, b, c;
5415 if (a < b) c++; -> CCU b > a -> CC2; c += carry;
5416 if (a < b) c--; -> CCL3 a - b -> borrow; c -= borrow;
5417 if (a <= b) c++; -> CCL3 b - a -> borrow; c += carry;
5418 if (a <= b) c--; -> CCU a <= b -> borrow; c -= borrow;
5420 Checks for EQ and NE with a nonzero value need an additional xor e.g.:
5421 if (a == b) c++; -> CCL3 a ^= b; 0 - a -> borrow; c += carry;
5422 if (a == b) c--; -> CCU a ^= b; a <= 0 -> CC0 | CC1; c -= borrow;
5423 if (a != b) c++; -> CCU a ^= b; a > 0 -> CC2; c += carry;
5424 if (a != b) c--; -> CCL3 a ^= b; 0 - a -> borrow; c -= borrow; */
5427 s390_expand_addcc (enum rtx_code cmp_code
, rtx cmp_op0
, rtx cmp_op1
,
5428 rtx dst
, rtx src
, rtx increment
)
5430 machine_mode cmp_mode
;
5431 machine_mode cc_mode
;
5437 if ((GET_MODE (cmp_op0
) == SImode
|| GET_MODE (cmp_op0
) == VOIDmode
)
5438 && (GET_MODE (cmp_op1
) == SImode
|| GET_MODE (cmp_op1
) == VOIDmode
))
5440 else if ((GET_MODE (cmp_op0
) == DImode
|| GET_MODE (cmp_op0
) == VOIDmode
)
5441 && (GET_MODE (cmp_op1
) == DImode
|| GET_MODE (cmp_op1
) == VOIDmode
))
5446 /* Try ADD LOGICAL WITH CARRY. */
5447 if (increment
== const1_rtx
)
5449 /* Determine CC mode to use. */
5450 if (cmp_code
== EQ
|| cmp_code
== NE
)
5452 if (cmp_op1
!= const0_rtx
)
5454 cmp_op0
= expand_simple_binop (cmp_mode
, XOR
, cmp_op0
, cmp_op1
,
5455 NULL_RTX
, 0, OPTAB_WIDEN
);
5456 cmp_op1
= const0_rtx
;
5459 cmp_code
= cmp_code
== EQ
? LEU
: GTU
;
5462 if (cmp_code
== LTU
|| cmp_code
== LEU
)
5467 cmp_code
= swap_condition (cmp_code
);
5484 /* Emit comparison instruction pattern. */
5485 if (!register_operand (cmp_op0
, cmp_mode
))
5486 cmp_op0
= force_reg (cmp_mode
, cmp_op0
);
5488 insn
= gen_rtx_SET (gen_rtx_REG (cc_mode
, CC_REGNUM
),
5489 gen_rtx_COMPARE (cc_mode
, cmp_op0
, cmp_op1
));
5490 /* We use insn_invalid_p here to add clobbers if required. */
5491 ret
= insn_invalid_p (emit_insn (insn
), false);
5494 /* Emit ALC instruction pattern. */
5495 op_res
= gen_rtx_fmt_ee (cmp_code
, GET_MODE (dst
),
5496 gen_rtx_REG (cc_mode
, CC_REGNUM
),
5499 if (src
!= const0_rtx
)
5501 if (!register_operand (src
, GET_MODE (dst
)))
5502 src
= force_reg (GET_MODE (dst
), src
);
5504 op_res
= gen_rtx_PLUS (GET_MODE (dst
), op_res
, src
);
5505 op_res
= gen_rtx_PLUS (GET_MODE (dst
), op_res
, const0_rtx
);
5508 p
= rtvec_alloc (2);
5510 gen_rtx_SET (dst
, op_res
);
5512 gen_rtx_CLOBBER (VOIDmode
, gen_rtx_REG (CCmode
, CC_REGNUM
));
5513 emit_insn (gen_rtx_PARALLEL (VOIDmode
, p
));
5518 /* Try SUBTRACT LOGICAL WITH BORROW. */
5519 if (increment
== constm1_rtx
)
5521 /* Determine CC mode to use. */
5522 if (cmp_code
== EQ
|| cmp_code
== NE
)
5524 if (cmp_op1
!= const0_rtx
)
5526 cmp_op0
= expand_simple_binop (cmp_mode
, XOR
, cmp_op0
, cmp_op1
,
5527 NULL_RTX
, 0, OPTAB_WIDEN
);
5528 cmp_op1
= const0_rtx
;
5531 cmp_code
= cmp_code
== EQ
? LEU
: GTU
;
5534 if (cmp_code
== GTU
|| cmp_code
== GEU
)
5539 cmp_code
= swap_condition (cmp_code
);
5556 /* Emit comparison instruction pattern. */
5557 if (!register_operand (cmp_op0
, cmp_mode
))
5558 cmp_op0
= force_reg (cmp_mode
, cmp_op0
);
5560 insn
= gen_rtx_SET (gen_rtx_REG (cc_mode
, CC_REGNUM
),
5561 gen_rtx_COMPARE (cc_mode
, cmp_op0
, cmp_op1
));
5562 /* We use insn_invalid_p here to add clobbers if required. */
5563 ret
= insn_invalid_p (emit_insn (insn
), false);
5566 /* Emit SLB instruction pattern. */
5567 if (!register_operand (src
, GET_MODE (dst
)))
5568 src
= force_reg (GET_MODE (dst
), src
);
5570 op_res
= gen_rtx_MINUS (GET_MODE (dst
),
5571 gen_rtx_MINUS (GET_MODE (dst
), src
, const0_rtx
),
5572 gen_rtx_fmt_ee (cmp_code
, GET_MODE (dst
),
5573 gen_rtx_REG (cc_mode
, CC_REGNUM
),
5575 p
= rtvec_alloc (2);
5577 gen_rtx_SET (dst
, op_res
);
5579 gen_rtx_CLOBBER (VOIDmode
, gen_rtx_REG (CCmode
, CC_REGNUM
));
5580 emit_insn (gen_rtx_PARALLEL (VOIDmode
, p
));
5588 /* Expand code for the insv template. Return true if successful. */
5591 s390_expand_insv (rtx dest
, rtx op1
, rtx op2
, rtx src
)
5593 int bitsize
= INTVAL (op1
);
5594 int bitpos
= INTVAL (op2
);
5595 machine_mode mode
= GET_MODE (dest
);
5597 int smode_bsize
, mode_bsize
;
5600 if (bitsize
+ bitpos
> GET_MODE_BITSIZE (mode
))
5603 /* Generate INSERT IMMEDIATE (IILL et al). */
5604 /* (set (ze (reg)) (const_int)). */
5606 && register_operand (dest
, word_mode
)
5607 && (bitpos
% 16) == 0
5608 && (bitsize
% 16) == 0
5609 && const_int_operand (src
, VOIDmode
))
5611 HOST_WIDE_INT val
= INTVAL (src
);
5612 int regpos
= bitpos
+ bitsize
;
5614 while (regpos
> bitpos
)
5616 machine_mode putmode
;
5619 if (TARGET_EXTIMM
&& (regpos
% 32 == 0) && (regpos
>= bitpos
+ 32))
5624 putsize
= GET_MODE_BITSIZE (putmode
);
5626 emit_move_insn (gen_rtx_ZERO_EXTRACT (word_mode
, dest
,
5629 gen_int_mode (val
, putmode
));
5632 gcc_assert (regpos
== bitpos
);
5636 smode
= smallest_mode_for_size (bitsize
, MODE_INT
);
5637 smode_bsize
= GET_MODE_BITSIZE (smode
);
5638 mode_bsize
= GET_MODE_BITSIZE (mode
);
5640 /* Generate STORE CHARACTERS UNDER MASK (STCM et al). */
5642 && (bitsize
% BITS_PER_UNIT
) == 0
5644 && (register_operand (src
, word_mode
)
5645 || const_int_operand (src
, VOIDmode
)))
5647 /* Emit standard pattern if possible. */
5648 if (smode_bsize
== bitsize
)
5650 emit_move_insn (adjust_address (dest
, smode
, 0),
5651 gen_lowpart (smode
, src
));
5655 /* (set (ze (mem)) (const_int)). */
5656 else if (const_int_operand (src
, VOIDmode
))
5658 int size
= bitsize
/ BITS_PER_UNIT
;
5659 rtx src_mem
= adjust_address (force_const_mem (word_mode
, src
),
5661 UNITS_PER_WORD
- size
);
5663 dest
= adjust_address (dest
, BLKmode
, 0);
5664 set_mem_size (dest
, size
);
5665 s390_expand_movmem (dest
, src_mem
, GEN_INT (size
));
5669 /* (set (ze (mem)) (reg)). */
5670 else if (register_operand (src
, word_mode
))
5673 emit_move_insn (gen_rtx_ZERO_EXTRACT (word_mode
, dest
, op1
,
5677 /* Emit st,stcmh sequence. */
5678 int stcmh_width
= bitsize
- 32;
5679 int size
= stcmh_width
/ BITS_PER_UNIT
;
5681 emit_move_insn (adjust_address (dest
, SImode
, size
),
5682 gen_lowpart (SImode
, src
));
5683 set_mem_size (dest
, size
);
5684 emit_move_insn (gen_rtx_ZERO_EXTRACT (word_mode
, dest
,
5685 GEN_INT (stcmh_width
),
5687 gen_rtx_LSHIFTRT (word_mode
, src
, GEN_INT (32)));
5693 /* Generate INSERT CHARACTERS UNDER MASK (IC, ICM et al). */
5694 if ((bitpos
% BITS_PER_UNIT
) == 0
5695 && (bitsize
% BITS_PER_UNIT
) == 0
5696 && (bitpos
& 32) == ((bitpos
+ bitsize
- 1) & 32)
5698 && (mode
== DImode
|| mode
== SImode
)
5699 && register_operand (dest
, mode
))
5701 /* Emit a strict_low_part pattern if possible. */
5702 if (smode_bsize
== bitsize
&& bitpos
== mode_bsize
- smode_bsize
)
5704 op
= gen_rtx_STRICT_LOW_PART (VOIDmode
, gen_lowpart (smode
, dest
));
5705 op
= gen_rtx_SET (op
, gen_lowpart (smode
, src
));
5706 clobber
= gen_rtx_CLOBBER (VOIDmode
, gen_rtx_REG (CCmode
, CC_REGNUM
));
5707 emit_insn (gen_rtx_PARALLEL (VOIDmode
, gen_rtvec (2, op
, clobber
)));
5711 /* ??? There are more powerful versions of ICM that are not
5712 completely represented in the md file. */
5715 /* For z10, generate ROTATE THEN INSERT SELECTED BITS (RISBG et al). */
5716 if (TARGET_Z10
&& (mode
== DImode
|| mode
== SImode
))
5718 machine_mode mode_s
= GET_MODE (src
);
5720 if (mode_s
== VOIDmode
)
5722 /* Assume const_int etc already in the proper mode. */
5723 src
= force_reg (mode
, src
);
5725 else if (mode_s
!= mode
)
5727 gcc_assert (GET_MODE_BITSIZE (mode_s
) >= bitsize
);
5728 src
= force_reg (mode_s
, src
);
5729 src
= gen_lowpart (mode
, src
);
5732 op
= gen_rtx_ZERO_EXTRACT (mode
, dest
, op1
, op2
),
5733 op
= gen_rtx_SET (op
, src
);
5737 clobber
= gen_rtx_CLOBBER (VOIDmode
, gen_rtx_REG (CCmode
, CC_REGNUM
));
5738 op
= gen_rtx_PARALLEL (VOIDmode
, gen_rtvec (2, op
, clobber
));
5748 /* A subroutine of s390_expand_cs_hqi and s390_expand_atomic which returns a
5749 register that holds VAL of mode MODE shifted by COUNT bits. */
5752 s390_expand_mask_and_shift (rtx val
, machine_mode mode
, rtx count
)
5754 val
= expand_simple_binop (SImode
, AND
, val
, GEN_INT (GET_MODE_MASK (mode
)),
5755 NULL_RTX
, 1, OPTAB_DIRECT
);
5756 return expand_simple_binop (SImode
, ASHIFT
, val
, count
,
5757 NULL_RTX
, 1, OPTAB_DIRECT
);
5760 /* Generate a vector comparison COND of CMP_OP1 and CMP_OP2 and store
5761 the result in TARGET. */
5764 s390_expand_vec_compare (rtx target
, enum rtx_code cond
,
5765 rtx cmp_op1
, rtx cmp_op2
)
5767 machine_mode mode
= GET_MODE (target
);
5768 bool neg_p
= false, swap_p
= false;
5771 if (GET_MODE (cmp_op1
) == V2DFmode
)
5775 /* NE a != b -> !(a == b) */
5776 case NE
: cond
= EQ
; neg_p
= true; break;
5777 /* UNGT a u> b -> !(b >= a) */
5778 case UNGT
: cond
= GE
; neg_p
= true; swap_p
= true; break;
5779 /* UNGE a u>= b -> !(b > a) */
5780 case UNGE
: cond
= GT
; neg_p
= true; swap_p
= true; break;
5781 /* LE: a <= b -> b >= a */
5782 case LE
: cond
= GE
; swap_p
= true; break;
5783 /* UNLE: a u<= b -> !(a > b) */
5784 case UNLE
: cond
= GT
; neg_p
= true; break;
5785 /* LT: a < b -> b > a */
5786 case LT
: cond
= GT
; swap_p
= true; break;
5787 /* UNLT: a u< b -> !(a >= b) */
5788 case UNLT
: cond
= GE
; neg_p
= true; break;
5790 emit_insn (gen_vec_cmpuneqv2df (target
, cmp_op1
, cmp_op2
));
5793 emit_insn (gen_vec_cmpltgtv2df (target
, cmp_op1
, cmp_op2
));
5796 emit_insn (gen_vec_orderedv2df (target
, cmp_op1
, cmp_op2
));
5799 emit_insn (gen_vec_unorderedv2df (target
, cmp_op1
, cmp_op2
));
5808 /* NE: a != b -> !(a == b) */
5809 case NE
: cond
= EQ
; neg_p
= true; break;
5810 /* GE: a >= b -> !(b > a) */
5811 case GE
: cond
= GT
; neg_p
= true; swap_p
= true; break;
5812 /* GEU: a >= b -> !(b > a) */
5813 case GEU
: cond
= GTU
; neg_p
= true; swap_p
= true; break;
5814 /* LE: a <= b -> !(a > b) */
5815 case LE
: cond
= GT
; neg_p
= true; break;
5816 /* LEU: a <= b -> !(a > b) */
5817 case LEU
: cond
= GTU
; neg_p
= true; break;
5818 /* LT: a < b -> b > a */
5819 case LT
: cond
= GT
; swap_p
= true; break;
5820 /* LTU: a < b -> b > a */
5821 case LTU
: cond
= GTU
; swap_p
= true; break;
5828 tmp
= cmp_op1
; cmp_op1
= cmp_op2
; cmp_op2
= tmp
;
5831 emit_insn (gen_rtx_SET (target
, gen_rtx_fmt_ee (cond
,
5833 cmp_op1
, cmp_op2
)));
5835 emit_insn (gen_rtx_SET (target
, gen_rtx_NOT (mode
, target
)));
5838 /* Expand the comparison CODE of CMP1 and CMP2 and copy 1 or 0 into
5839 TARGET if either all (ALL_P is true) or any (ALL_P is false) of the
5840 elements in CMP1 and CMP2 fulfill the comparison. */
5842 s390_expand_vec_compare_cc (rtx target
, enum rtx_code code
,
5843 rtx cmp1
, rtx cmp2
, bool all_p
)
5845 enum rtx_code new_code
= code
;
5846 machine_mode cmp_mode
, full_cmp_mode
, scratch_mode
;
5847 rtx tmp_reg
= gen_reg_rtx (SImode
);
5848 bool swap_p
= false;
5850 if (GET_MODE_CLASS (GET_MODE (cmp1
)) == MODE_VECTOR_INT
)
5854 case EQ
: cmp_mode
= CCVEQmode
; break;
5855 case NE
: cmp_mode
= CCVEQmode
; break;
5856 case GT
: cmp_mode
= CCVHmode
; break;
5857 case GE
: cmp_mode
= CCVHmode
; new_code
= LE
; swap_p
= true; break;
5858 case LT
: cmp_mode
= CCVHmode
; new_code
= GT
; swap_p
= true; break;
5859 case LE
: cmp_mode
= CCVHmode
; new_code
= LE
; break;
5860 case GTU
: cmp_mode
= CCVHUmode
; break;
5861 case GEU
: cmp_mode
= CCVHUmode
; new_code
= LEU
; swap_p
= true; break;
5862 case LTU
: cmp_mode
= CCVHUmode
; new_code
= GTU
; swap_p
= true; break;
5863 case LEU
: cmp_mode
= CCVHUmode
; new_code
= LEU
; break;
5864 default: gcc_unreachable ();
5866 scratch_mode
= GET_MODE (cmp1
);
5868 else if (GET_MODE (cmp1
) == V2DFmode
)
5872 case EQ
: cmp_mode
= CCVEQmode
; break;
5873 case NE
: cmp_mode
= CCVEQmode
; break;
5874 case GT
: cmp_mode
= CCVFHmode
; break;
5875 case GE
: cmp_mode
= CCVFHEmode
; break;
5876 case UNLE
: cmp_mode
= CCVFHmode
; break;
5877 case UNLT
: cmp_mode
= CCVFHEmode
; break;
5878 case LT
: cmp_mode
= CCVFHmode
; new_code
= GT
; swap_p
= true; break;
5879 case LE
: cmp_mode
= CCVFHEmode
; new_code
= GE
; swap_p
= true; break;
5880 default: gcc_unreachable ();
5882 scratch_mode
= V2DImode
;
5890 case CCVEQmode
: full_cmp_mode
= CCVEQANYmode
; break;
5891 case CCVHmode
: full_cmp_mode
= CCVHANYmode
; break;
5892 case CCVHUmode
: full_cmp_mode
= CCVHUANYmode
; break;
5893 case CCVFHmode
: full_cmp_mode
= CCVFHANYmode
; break;
5894 case CCVFHEmode
: full_cmp_mode
= CCVFHEANYmode
; break;
5895 default: gcc_unreachable ();
5898 /* The modes without ANY match the ALL modes. */
5899 full_cmp_mode
= cmp_mode
;
5908 emit_insn (gen_rtx_PARALLEL (VOIDmode
,
5909 gen_rtvec (2, gen_rtx_SET (
5910 gen_rtx_REG (cmp_mode
, CC_REGNUM
),
5911 gen_rtx_COMPARE (cmp_mode
, cmp1
, cmp2
)),
5912 gen_rtx_CLOBBER (VOIDmode
,
5913 gen_rtx_SCRATCH (scratch_mode
)))));
5914 emit_move_insn (target
, const0_rtx
);
5915 emit_move_insn (tmp_reg
, const1_rtx
);
5917 emit_move_insn (target
,
5918 gen_rtx_IF_THEN_ELSE (SImode
,
5919 gen_rtx_fmt_ee (new_code
, VOIDmode
,
5920 gen_rtx_REG (full_cmp_mode
, CC_REGNUM
),
5925 /* Generate a vector comparison expression loading either elements of
5926 THEN or ELS into TARGET depending on the comparison COND of CMP_OP1
5930 s390_expand_vcond (rtx target
, rtx then
, rtx els
,
5931 enum rtx_code cond
, rtx cmp_op1
, rtx cmp_op2
)
5934 machine_mode result_mode
;
5937 /* We always use an integral type vector to hold the comparison
5939 result_mode
= GET_MODE (cmp_op1
) == V2DFmode
? V2DImode
: GET_MODE (cmp_op1
);
5940 result_target
= gen_reg_rtx (result_mode
);
5942 /* Alternatively this could be done by reload by lowering the cmp*
5943 predicates. But it appears to be better for scheduling etc. to
5944 have that in early. */
5945 if (!REG_P (cmp_op1
))
5946 cmp_op1
= force_reg (GET_MODE (target
), cmp_op1
);
5948 if (!REG_P (cmp_op2
))
5949 cmp_op2
= force_reg (GET_MODE (target
), cmp_op2
);
5951 s390_expand_vec_compare (result_target
, cond
,
5954 /* If the results are supposed to be either -1 or 0 we are done
5955 since this is what our compare instructions generate anyway. */
5956 if (constm1_operand (then
, GET_MODE (then
))
5957 && const0_operand (els
, GET_MODE (els
)))
5959 emit_move_insn (target
, gen_rtx_SUBREG (GET_MODE (target
),
5964 /* Otherwise we will do a vsel afterwards. */
5965 /* This gets triggered e.g.
5966 with gcc.c-torture/compile/pr53410-1.c */
5968 then
= force_reg (GET_MODE (target
), then
);
5971 els
= force_reg (GET_MODE (target
), els
);
5973 tmp
= gen_rtx_fmt_ee (EQ
, VOIDmode
,
5975 CONST0_RTX (result_mode
));
5977 /* We compared the result against zero above so we have to swap then
5979 tmp
= gen_rtx_IF_THEN_ELSE (GET_MODE (target
), tmp
, els
, then
);
5981 gcc_assert (GET_MODE (target
) == GET_MODE (then
));
5982 emit_insn (gen_rtx_SET (target
, tmp
));
5985 /* Emit the RTX necessary to initialize the vector TARGET with values
5988 s390_expand_vec_init (rtx target
, rtx vals
)
5990 machine_mode mode
= GET_MODE (target
);
5991 machine_mode inner_mode
= GET_MODE_INNER (mode
);
5992 int n_elts
= GET_MODE_NUNITS (mode
);
5993 bool all_same
= true, all_regs
= true, all_const_int
= true;
5997 for (i
= 0; i
< n_elts
; ++i
)
5999 x
= XVECEXP (vals
, 0, i
);
6001 if (!CONST_INT_P (x
))
6002 all_const_int
= false;
6004 if (i
> 0 && !rtx_equal_p (x
, XVECEXP (vals
, 0, 0)))
6011 /* Use vector gen mask or vector gen byte mask if possible. */
6012 if (all_same
&& all_const_int
6013 && (XVECEXP (vals
, 0, 0) == const0_rtx
6014 || s390_contiguous_bitmask_vector_p (XVECEXP (vals
, 0, 0),
6016 || s390_bytemask_vector_p (XVECEXP (vals
, 0, 0), NULL
)))
6018 emit_insn (gen_rtx_SET (target
,
6019 gen_rtx_CONST_VECTOR (mode
, XVEC (vals
, 0))));
6025 emit_insn (gen_rtx_SET (target
,
6026 gen_rtx_VEC_DUPLICATE (mode
,
6027 XVECEXP (vals
, 0, 0))));
6031 if (all_regs
&& REG_P (target
) && n_elts
== 2 && inner_mode
== DImode
)
6033 /* Use vector load pair. */
6034 emit_insn (gen_rtx_SET (target
,
6035 gen_rtx_VEC_CONCAT (mode
,
6036 XVECEXP (vals
, 0, 0),
6037 XVECEXP (vals
, 0, 1))));
6041 /* We are about to set the vector elements one by one. Zero out the
6042 full register first in order to help the data flow framework to
6043 detect it as full VR set. */
6044 emit_insn (gen_rtx_SET (target
, CONST0_RTX (mode
)));
6046 /* Unfortunately the vec_init expander is not allowed to fail. So
6047 we have to implement the fallback ourselves. */
6048 for (i
= 0; i
< n_elts
; i
++)
6049 emit_insn (gen_rtx_SET (target
,
6050 gen_rtx_UNSPEC (mode
,
6051 gen_rtvec (3, XVECEXP (vals
, 0, i
),
6052 GEN_INT (i
), target
),
6056 /* Structure to hold the initial parameters for a compare_and_swap operation
6057 in HImode and QImode. */
6059 struct alignment_context
6061 rtx memsi
; /* SI aligned memory location. */
6062 rtx shift
; /* Bit offset with regard to lsb. */
6063 rtx modemask
; /* Mask of the HQImode shifted by SHIFT bits. */
6064 rtx modemaski
; /* ~modemask */
6065 bool aligned
; /* True if memory is aligned, false else. */
6068 /* A subroutine of s390_expand_cs_hqi and s390_expand_atomic to initialize
6069 structure AC for transparent simplifying, if the memory alignment is known
6070 to be at least 32bit. MEM is the memory location for the actual operation
6071 and MODE its mode. */
6074 init_alignment_context (struct alignment_context
*ac
, rtx mem
,
6077 ac
->shift
= GEN_INT (GET_MODE_SIZE (SImode
) - GET_MODE_SIZE (mode
));
6078 ac
->aligned
= (MEM_ALIGN (mem
) >= GET_MODE_BITSIZE (SImode
));
6081 ac
->memsi
= adjust_address (mem
, SImode
, 0); /* Memory is aligned. */
6084 /* Alignment is unknown. */
6085 rtx byteoffset
, addr
, align
;
6087 /* Force the address into a register. */
6088 addr
= force_reg (Pmode
, XEXP (mem
, 0));
6090 /* Align it to SImode. */
6091 align
= expand_simple_binop (Pmode
, AND
, addr
,
6092 GEN_INT (-GET_MODE_SIZE (SImode
)),
6093 NULL_RTX
, 1, OPTAB_DIRECT
);
6095 ac
->memsi
= gen_rtx_MEM (SImode
, align
);
6096 MEM_VOLATILE_P (ac
->memsi
) = MEM_VOLATILE_P (mem
);
6097 set_mem_alias_set (ac
->memsi
, ALIAS_SET_MEMORY_BARRIER
);
6098 set_mem_align (ac
->memsi
, GET_MODE_BITSIZE (SImode
));
6100 /* Calculate shiftcount. */
6101 byteoffset
= expand_simple_binop (Pmode
, AND
, addr
,
6102 GEN_INT (GET_MODE_SIZE (SImode
) - 1),
6103 NULL_RTX
, 1, OPTAB_DIRECT
);
6104 /* As we already have some offset, evaluate the remaining distance. */
6105 ac
->shift
= expand_simple_binop (SImode
, MINUS
, ac
->shift
, byteoffset
,
6106 NULL_RTX
, 1, OPTAB_DIRECT
);
6109 /* Shift is the byte count, but we need the bitcount. */
6110 ac
->shift
= expand_simple_binop (SImode
, ASHIFT
, ac
->shift
, GEN_INT (3),
6111 NULL_RTX
, 1, OPTAB_DIRECT
);
6113 /* Calculate masks. */
6114 ac
->modemask
= expand_simple_binop (SImode
, ASHIFT
,
6115 GEN_INT (GET_MODE_MASK (mode
)),
6116 ac
->shift
, NULL_RTX
, 1, OPTAB_DIRECT
);
6117 ac
->modemaski
= expand_simple_unop (SImode
, NOT
, ac
->modemask
,
6121 /* A subroutine of s390_expand_cs_hqi. Insert INS into VAL. If possible,
6122 use a single insv insn into SEQ2. Otherwise, put prep insns in SEQ1 and
6123 perform the merge in SEQ2. */
6126 s390_two_part_insv (struct alignment_context
*ac
, rtx
*seq1
, rtx
*seq2
,
6127 machine_mode mode
, rtx val
, rtx ins
)
6134 tmp
= copy_to_mode_reg (SImode
, val
);
6135 if (s390_expand_insv (tmp
, GEN_INT (GET_MODE_BITSIZE (mode
)),
6139 *seq2
= get_insns ();
6146 /* Failed to use insv. Generate a two part shift and mask. */
6148 tmp
= s390_expand_mask_and_shift (ins
, mode
, ac
->shift
);
6149 *seq1
= get_insns ();
6153 tmp
= expand_simple_binop (SImode
, IOR
, tmp
, val
, NULL_RTX
, 1, OPTAB_DIRECT
);
6154 *seq2
= get_insns ();
6160 /* Expand an atomic compare and swap operation for HImode and QImode. MEM is
6161 the memory location, CMP the old value to compare MEM with and NEW_RTX the
6162 value to set if CMP == MEM. */
6165 s390_expand_cs_hqi (machine_mode mode
, rtx btarget
, rtx vtarget
, rtx mem
,
6166 rtx cmp
, rtx new_rtx
, bool is_weak
)
6168 struct alignment_context ac
;
6169 rtx cmpv
, newv
, val
, cc
, seq0
, seq1
, seq2
, seq3
;
6170 rtx res
= gen_reg_rtx (SImode
);
6171 rtx_code_label
*csloop
= NULL
, *csend
= NULL
;
6173 gcc_assert (MEM_P (mem
));
6175 init_alignment_context (&ac
, mem
, mode
);
6177 /* Load full word. Subsequent loads are performed by CS. */
6178 val
= expand_simple_binop (SImode
, AND
, ac
.memsi
, ac
.modemaski
,
6179 NULL_RTX
, 1, OPTAB_DIRECT
);
6181 /* Prepare insertions of cmp and new_rtx into the loaded value. When
6182 possible, we try to use insv to make this happen efficiently. If
6183 that fails we'll generate code both inside and outside the loop. */
6184 cmpv
= s390_two_part_insv (&ac
, &seq0
, &seq2
, mode
, val
, cmp
);
6185 newv
= s390_two_part_insv (&ac
, &seq1
, &seq3
, mode
, val
, new_rtx
);
6192 /* Start CS loop. */
6195 /* Begin assuming success. */
6196 emit_move_insn (btarget
, const1_rtx
);
6198 csloop
= gen_label_rtx ();
6199 csend
= gen_label_rtx ();
6200 emit_label (csloop
);
6203 /* val = "<mem>00..0<mem>"
6204 * cmp = "00..0<cmp>00..0"
6205 * new = "00..0<new>00..0"
6211 cc
= s390_emit_compare_and_swap (EQ
, res
, ac
.memsi
, cmpv
, newv
);
6213 emit_insn (gen_cstorecc4 (btarget
, cc
, XEXP (cc
, 0), XEXP (cc
, 1)));
6218 /* Jump to end if we're done (likely?). */
6219 s390_emit_jump (csend
, cc
);
6221 /* Check for changes outside mode, and loop internal if so.
6222 Arrange the moves so that the compare is adjacent to the
6223 branch so that we can generate CRJ. */
6224 tmp
= copy_to_reg (val
);
6225 force_expand_binop (SImode
, and_optab
, res
, ac
.modemaski
, val
,
6227 cc
= s390_emit_compare (NE
, val
, tmp
);
6228 s390_emit_jump (csloop
, cc
);
6231 emit_move_insn (btarget
, const0_rtx
);
6235 /* Return the correct part of the bitfield. */
6236 convert_move (vtarget
, expand_simple_binop (SImode
, LSHIFTRT
, res
, ac
.shift
,
6237 NULL_RTX
, 1, OPTAB_DIRECT
), 1);
6240 /* Expand an atomic operation CODE of mode MODE. MEM is the memory location
6241 and VAL the value to play with. If AFTER is true then store the value
6242 MEM holds after the operation, if AFTER is false then store the value MEM
6243 holds before the operation. If TARGET is zero then discard that value, else
6244 store it to TARGET. */
6247 s390_expand_atomic (machine_mode mode
, enum rtx_code code
,
6248 rtx target
, rtx mem
, rtx val
, bool after
)
6250 struct alignment_context ac
;
6252 rtx new_rtx
= gen_reg_rtx (SImode
);
6253 rtx orig
= gen_reg_rtx (SImode
);
6254 rtx_code_label
*csloop
= gen_label_rtx ();
6256 gcc_assert (!target
|| register_operand (target
, VOIDmode
));
6257 gcc_assert (MEM_P (mem
));
6259 init_alignment_context (&ac
, mem
, mode
);
6261 /* Shift val to the correct bit positions.
6262 Preserve "icm", but prevent "ex icm". */
6263 if (!(ac
.aligned
&& code
== SET
&& MEM_P (val
)))
6264 val
= s390_expand_mask_and_shift (val
, mode
, ac
.shift
);
6266 /* Further preparation insns. */
6267 if (code
== PLUS
|| code
== MINUS
)
6268 emit_move_insn (orig
, val
);
6269 else if (code
== MULT
|| code
== AND
) /* val = "11..1<val>11..1" */
6270 val
= expand_simple_binop (SImode
, XOR
, val
, ac
.modemaski
,
6271 NULL_RTX
, 1, OPTAB_DIRECT
);
6273 /* Load full word. Subsequent loads are performed by CS. */
6274 cmp
= force_reg (SImode
, ac
.memsi
);
6276 /* Start CS loop. */
6277 emit_label (csloop
);
6278 emit_move_insn (new_rtx
, cmp
);
6280 /* Patch new with val at correct position. */
6285 val
= expand_simple_binop (SImode
, code
, new_rtx
, orig
,
6286 NULL_RTX
, 1, OPTAB_DIRECT
);
6287 val
= expand_simple_binop (SImode
, AND
, val
, ac
.modemask
,
6288 NULL_RTX
, 1, OPTAB_DIRECT
);
6291 if (ac
.aligned
&& MEM_P (val
))
6292 store_bit_field (new_rtx
, GET_MODE_BITSIZE (mode
), 0,
6296 new_rtx
= expand_simple_binop (SImode
, AND
, new_rtx
, ac
.modemaski
,
6297 NULL_RTX
, 1, OPTAB_DIRECT
);
6298 new_rtx
= expand_simple_binop (SImode
, IOR
, new_rtx
, val
,
6299 NULL_RTX
, 1, OPTAB_DIRECT
);
6305 new_rtx
= expand_simple_binop (SImode
, code
, new_rtx
, val
,
6306 NULL_RTX
, 1, OPTAB_DIRECT
);
6308 case MULT
: /* NAND */
6309 new_rtx
= expand_simple_binop (SImode
, AND
, new_rtx
, val
,
6310 NULL_RTX
, 1, OPTAB_DIRECT
);
6311 new_rtx
= expand_simple_binop (SImode
, XOR
, new_rtx
, ac
.modemask
,
6312 NULL_RTX
, 1, OPTAB_DIRECT
);
6318 s390_emit_jump (csloop
, s390_emit_compare_and_swap (NE
, cmp
,
6319 ac
.memsi
, cmp
, new_rtx
));
6321 /* Return the correct part of the bitfield. */
6323 convert_move (target
, expand_simple_binop (SImode
, LSHIFTRT
,
6324 after
? new_rtx
: cmp
, ac
.shift
,
6325 NULL_RTX
, 1, OPTAB_DIRECT
), 1);
6328 /* This is called from dwarf2out.c via TARGET_ASM_OUTPUT_DWARF_DTPREL.
6329 We need to emit DTP-relative relocations. */
6331 static void s390_output_dwarf_dtprel (FILE *, int, rtx
) ATTRIBUTE_UNUSED
;
6334 s390_output_dwarf_dtprel (FILE *file
, int size
, rtx x
)
6339 fputs ("\t.long\t", file
);
6342 fputs ("\t.quad\t", file
);
6347 output_addr_const (file
, x
);
6348 fputs ("@DTPOFF", file
);
6351 /* Return the proper mode for REGNO being represented in the dwarf
6354 s390_dwarf_frame_reg_mode (int regno
)
6356 machine_mode save_mode
= default_dwarf_frame_reg_mode (regno
);
6358 /* The rightmost 64 bits of vector registers are call-clobbered. */
6359 if (GET_MODE_SIZE (save_mode
) > 8)
6365 #ifdef TARGET_ALTERNATE_LONG_DOUBLE_MANGLING
6366 /* Implement TARGET_MANGLE_TYPE. */
6369 s390_mangle_type (const_tree type
)
6371 type
= TYPE_MAIN_VARIANT (type
);
6373 if (TREE_CODE (type
) != VOID_TYPE
&& TREE_CODE (type
) != BOOLEAN_TYPE
6374 && TREE_CODE (type
) != INTEGER_TYPE
&& TREE_CODE (type
) != REAL_TYPE
)
6377 if (type
== s390_builtin_types
[BT_BV16QI
]) return "U6__boolc";
6378 if (type
== s390_builtin_types
[BT_BV8HI
]) return "U6__bools";
6379 if (type
== s390_builtin_types
[BT_BV4SI
]) return "U6__booli";
6380 if (type
== s390_builtin_types
[BT_BV2DI
]) return "U6__booll";
6382 if (TYPE_MAIN_VARIANT (type
) == long_double_type_node
6383 && TARGET_LONG_DOUBLE_128
)
6386 /* For all other types, use normal C++ mangling. */
6391 /* In the name of slightly smaller debug output, and to cater to
6392 general assembler lossage, recognize various UNSPEC sequences
6393 and turn them back into a direct symbol reference. */
6396 s390_delegitimize_address (rtx orig_x
)
6400 orig_x
= delegitimize_mem_from_attrs (orig_x
);
6403 /* Extract the symbol ref from:
6404 (plus:SI (reg:SI 12 %r12)
6405 (const:SI (unspec:SI [(symbol_ref/f:SI ("*.LC0"))]
6406 UNSPEC_GOTOFF/PLTOFF)))
6408 (plus:SI (reg:SI 12 %r12)
6409 (const:SI (plus:SI (unspec:SI [(symbol_ref:SI ("L"))]
6410 UNSPEC_GOTOFF/PLTOFF)
6411 (const_int 4 [0x4])))) */
6412 if (GET_CODE (x
) == PLUS
6413 && REG_P (XEXP (x
, 0))
6414 && REGNO (XEXP (x
, 0)) == PIC_OFFSET_TABLE_REGNUM
6415 && GET_CODE (XEXP (x
, 1)) == CONST
)
6417 HOST_WIDE_INT offset
= 0;
6419 /* The const operand. */
6420 y
= XEXP (XEXP (x
, 1), 0);
6422 if (GET_CODE (y
) == PLUS
6423 && GET_CODE (XEXP (y
, 1)) == CONST_INT
)
6425 offset
= INTVAL (XEXP (y
, 1));
6429 if (GET_CODE (y
) == UNSPEC
6430 && (XINT (y
, 1) == UNSPEC_GOTOFF
6431 || XINT (y
, 1) == UNSPEC_PLTOFF
))
6432 return plus_constant (Pmode
, XVECEXP (y
, 0, 0), offset
);
6435 if (GET_CODE (x
) != MEM
)
6439 if (GET_CODE (x
) == PLUS
6440 && GET_CODE (XEXP (x
, 1)) == CONST
6441 && GET_CODE (XEXP (x
, 0)) == REG
6442 && REGNO (XEXP (x
, 0)) == PIC_OFFSET_TABLE_REGNUM
)
6444 y
= XEXP (XEXP (x
, 1), 0);
6445 if (GET_CODE (y
) == UNSPEC
6446 && XINT (y
, 1) == UNSPEC_GOT
)
6447 y
= XVECEXP (y
, 0, 0);
6451 else if (GET_CODE (x
) == CONST
)
6453 /* Extract the symbol ref from:
6454 (mem:QI (const:DI (unspec:DI [(symbol_ref:DI ("foo"))]
6455 UNSPEC_PLT/GOTENT))) */
6458 if (GET_CODE (y
) == UNSPEC
6459 && (XINT (y
, 1) == UNSPEC_GOTENT
6460 || XINT (y
, 1) == UNSPEC_PLT
))
6461 y
= XVECEXP (y
, 0, 0);
6468 if (GET_MODE (orig_x
) != Pmode
)
6470 if (GET_MODE (orig_x
) == BLKmode
)
6472 y
= lowpart_subreg (GET_MODE (orig_x
), y
, Pmode
);
6479 /* Output operand OP to stdio stream FILE.
6480 OP is an address (register + offset) which is not used to address data;
6481 instead the rightmost bits are interpreted as the value. */
6484 print_shift_count_operand (FILE *file
, rtx op
)
6486 HOST_WIDE_INT offset
;
6489 /* Extract base register and offset. */
6490 if (!s390_decompose_shift_count (op
, &base
, &offset
))
6496 gcc_assert (GET_CODE (base
) == REG
);
6497 gcc_assert (REGNO (base
) < FIRST_PSEUDO_REGISTER
);
6498 gcc_assert (REGNO_REG_CLASS (REGNO (base
)) == ADDR_REGS
);
6501 /* Offsets are constricted to twelve bits. */
6502 fprintf (file
, HOST_WIDE_INT_PRINT_DEC
, offset
& ((1 << 12) - 1));
6504 fprintf (file
, "(%s)", reg_names
[REGNO (base
)]);
6507 /* Assigns the number of NOP halfwords to be emitted before and after the
6508 function label to *HW_BEFORE and *HW_AFTER. Both pointers must not be NULL.
6509 If hotpatching is disabled for the function, the values are set to zero.
6513 s390_function_num_hotpatch_hw (tree decl
,
6519 attr
= lookup_attribute ("hotpatch", DECL_ATTRIBUTES (decl
));
6521 /* Handle the arguments of the hotpatch attribute. The values
6522 specified via attribute might override the cmdline argument
6526 tree args
= TREE_VALUE (attr
);
6528 *hw_before
= TREE_INT_CST_LOW (TREE_VALUE (args
));
6529 *hw_after
= TREE_INT_CST_LOW (TREE_VALUE (TREE_CHAIN (args
)));
6533 /* Use the values specified by the cmdline arguments. */
6534 *hw_before
= s390_hotpatch_hw_before_label
;
6535 *hw_after
= s390_hotpatch_hw_after_label
;
6539 /* Write the extra assembler code needed to declare a function properly. */
6542 s390_asm_output_function_label (FILE *asm_out_file
, const char *fname
,
6545 int hw_before
, hw_after
;
6547 s390_function_num_hotpatch_hw (decl
, &hw_before
, &hw_after
);
6550 unsigned int function_alignment
;
6553 /* Add a trampoline code area before the function label and initialize it
6554 with two-byte nop instructions. This area can be overwritten with code
6555 that jumps to a patched version of the function. */
6556 asm_fprintf (asm_out_file
, "\tnopr\t%%r7"
6557 "\t# pre-label NOPs for hotpatch (%d halfwords)\n",
6559 for (i
= 1; i
< hw_before
; i
++)
6560 fputs ("\tnopr\t%r7\n", asm_out_file
);
6562 /* Note: The function label must be aligned so that (a) the bytes of the
6563 following nop do not cross a cacheline boundary, and (b) a jump address
6564 (eight bytes for 64 bit targets, 4 bytes for 32 bit targets) can be
6565 stored directly before the label without crossing a cacheline
6566 boundary. All this is necessary to make sure the trampoline code can
6567 be changed atomically.
6568 This alignment is done automatically using the FOUNCTION_BOUNDARY, but
6569 if there are NOPs before the function label, the alignment is placed
6570 before them. So it is necessary to duplicate the alignment after the
6572 function_alignment
= MAX (8, DECL_ALIGN (decl
) / BITS_PER_UNIT
);
6573 if (! DECL_USER_ALIGN (decl
))
6574 function_alignment
= MAX (function_alignment
,
6575 (unsigned int) align_functions
);
6576 fputs ("\t# alignment for hotpatch\n", asm_out_file
);
6577 ASM_OUTPUT_ALIGN (asm_out_file
, floor_log2 (function_alignment
));
6580 ASM_OUTPUT_LABEL (asm_out_file
, fname
);
6582 asm_fprintf (asm_out_file
,
6583 "\t# post-label NOPs for hotpatch (%d halfwords)\n",
6587 /* Output machine-dependent UNSPECs occurring in address constant X
6588 in assembler syntax to stdio stream FILE. Returns true if the
6589 constant X could be recognized, false otherwise. */
6592 s390_output_addr_const_extra (FILE *file
, rtx x
)
6594 if (GET_CODE (x
) == UNSPEC
&& XVECLEN (x
, 0) == 1)
6595 switch (XINT (x
, 1))
6598 output_addr_const (file
, XVECEXP (x
, 0, 0));
6599 fprintf (file
, "@GOTENT");
6602 output_addr_const (file
, XVECEXP (x
, 0, 0));
6603 fprintf (file
, "@GOT");
6606 output_addr_const (file
, XVECEXP (x
, 0, 0));
6607 fprintf (file
, "@GOTOFF");
6610 output_addr_const (file
, XVECEXP (x
, 0, 0));
6611 fprintf (file
, "@PLT");
6614 output_addr_const (file
, XVECEXP (x
, 0, 0));
6615 fprintf (file
, "@PLTOFF");
6618 output_addr_const (file
, XVECEXP (x
, 0, 0));
6619 fprintf (file
, "@TLSGD");
6622 assemble_name (file
, get_some_local_dynamic_name ());
6623 fprintf (file
, "@TLSLDM");
6626 output_addr_const (file
, XVECEXP (x
, 0, 0));
6627 fprintf (file
, "@DTPOFF");
6630 output_addr_const (file
, XVECEXP (x
, 0, 0));
6631 fprintf (file
, "@NTPOFF");
6633 case UNSPEC_GOTNTPOFF
:
6634 output_addr_const (file
, XVECEXP (x
, 0, 0));
6635 fprintf (file
, "@GOTNTPOFF");
6637 case UNSPEC_INDNTPOFF
:
6638 output_addr_const (file
, XVECEXP (x
, 0, 0));
6639 fprintf (file
, "@INDNTPOFF");
6643 if (GET_CODE (x
) == UNSPEC
&& XVECLEN (x
, 0) == 2)
6644 switch (XINT (x
, 1))
6646 case UNSPEC_POOL_OFFSET
:
6647 x
= gen_rtx_MINUS (GET_MODE (x
), XVECEXP (x
, 0, 0), XVECEXP (x
, 0, 1));
6648 output_addr_const (file
, x
);
6654 /* Output address operand ADDR in assembler syntax to
6655 stdio stream FILE. */
6658 print_operand_address (FILE *file
, rtx addr
)
6660 struct s390_address ad
;
6662 if (s390_loadrelative_operand_p (addr
, NULL
, NULL
))
6666 output_operand_lossage ("symbolic memory references are "
6667 "only supported on z10 or later");
6670 output_addr_const (file
, addr
);
6674 if (!s390_decompose_address (addr
, &ad
)
6675 || (ad
.base
&& !REGNO_OK_FOR_BASE_P (REGNO (ad
.base
)))
6676 || (ad
.indx
&& !REGNO_OK_FOR_INDEX_P (REGNO (ad
.indx
))))
6677 output_operand_lossage ("cannot decompose address");
6680 output_addr_const (file
, ad
.disp
);
6682 fprintf (file
, "0");
6684 if (ad
.base
&& ad
.indx
)
6685 fprintf (file
, "(%s,%s)", reg_names
[REGNO (ad
.indx
)],
6686 reg_names
[REGNO (ad
.base
)]);
6688 fprintf (file
, "(%s)", reg_names
[REGNO (ad
.base
)]);
6691 /* Output operand X in assembler syntax to stdio stream FILE.
6692 CODE specified the format flag. The following format flags
6695 'C': print opcode suffix for branch condition.
6696 'D': print opcode suffix for inverse branch condition.
6697 'E': print opcode suffix for branch on index instruction.
6698 'G': print the size of the operand in bytes.
6699 'J': print tls_load/tls_gdcall/tls_ldcall suffix
6700 'M': print the second word of a TImode operand.
6701 'N': print the second word of a DImode operand.
6702 'O': print only the displacement of a memory reference or address.
6703 'R': print only the base register of a memory reference or address.
6704 'S': print S-type memory reference (base+displacement).
6705 'Y': print shift count operand.
6707 'b': print integer X as if it's an unsigned byte.
6708 'c': print integer X as if it's an signed byte.
6709 'e': "end" contiguous bitmask X in either DImode or vector inner mode.
6710 'f': "end" contiguous bitmask X in SImode.
6711 'h': print integer X as if it's a signed halfword.
6712 'i': print the first nonzero HImode part of X.
6713 'j': print the first HImode part unequal to -1 of X.
6714 'k': print the first nonzero SImode part of X.
6715 'm': print the first SImode part unequal to -1 of X.
6716 'o': print integer X as if it's an unsigned 32bit word.
6717 's': "start" of contiguous bitmask X in either DImode or vector inner mode.
6718 't': CONST_INT: "start" of contiguous bitmask X in SImode.
6719 CONST_VECTOR: Generate a bitmask for vgbm instruction.
6720 'x': print integer X as if it's an unsigned halfword.
6721 'v': print register number as vector register (v1 instead of f1).
6725 print_operand (FILE *file
, rtx x
, int code
)
6732 fprintf (file
, s390_branch_condition_mnemonic (x
, FALSE
));
6736 fprintf (file
, s390_branch_condition_mnemonic (x
, TRUE
));
6740 if (GET_CODE (x
) == LE
)
6741 fprintf (file
, "l");
6742 else if (GET_CODE (x
) == GT
)
6743 fprintf (file
, "h");
6745 output_operand_lossage ("invalid comparison operator "
6746 "for 'E' output modifier");
6750 if (GET_CODE (x
) == SYMBOL_REF
)
6752 fprintf (file
, "%s", ":tls_load:");
6753 output_addr_const (file
, x
);
6755 else if (GET_CODE (x
) == UNSPEC
&& XINT (x
, 1) == UNSPEC_TLSGD
)
6757 fprintf (file
, "%s", ":tls_gdcall:");
6758 output_addr_const (file
, XVECEXP (x
, 0, 0));
6760 else if (GET_CODE (x
) == UNSPEC
&& XINT (x
, 1) == UNSPEC_TLSLDM
)
6762 fprintf (file
, "%s", ":tls_ldcall:");
6763 const char *name
= get_some_local_dynamic_name ();
6765 assemble_name (file
, name
);
6768 output_operand_lossage ("invalid reference for 'J' output modifier");
6772 fprintf (file
, "%u", GET_MODE_SIZE (GET_MODE (x
)));
6777 struct s390_address ad
;
6780 ret
= s390_decompose_address (MEM_P (x
) ? XEXP (x
, 0) : x
, &ad
);
6783 || (ad
.base
&& !REGNO_OK_FOR_BASE_P (REGNO (ad
.base
)))
6786 output_operand_lossage ("invalid address for 'O' output modifier");
6791 output_addr_const (file
, ad
.disp
);
6793 fprintf (file
, "0");
6799 struct s390_address ad
;
6802 ret
= s390_decompose_address (MEM_P (x
) ? XEXP (x
, 0) : x
, &ad
);
6805 || (ad
.base
&& !REGNO_OK_FOR_BASE_P (REGNO (ad
.base
)))
6808 output_operand_lossage ("invalid address for 'R' output modifier");
6813 fprintf (file
, "%s", reg_names
[REGNO (ad
.base
)]);
6815 fprintf (file
, "0");
6821 struct s390_address ad
;
6826 output_operand_lossage ("memory reference expected for "
6827 "'S' output modifier");
6830 ret
= s390_decompose_address (XEXP (x
, 0), &ad
);
6833 || (ad
.base
&& !REGNO_OK_FOR_BASE_P (REGNO (ad
.base
)))
6836 output_operand_lossage ("invalid address for 'S' output modifier");
6841 output_addr_const (file
, ad
.disp
);
6843 fprintf (file
, "0");
6846 fprintf (file
, "(%s)", reg_names
[REGNO (ad
.base
)]);
6851 if (GET_CODE (x
) == REG
)
6852 x
= gen_rtx_REG (GET_MODE (x
), REGNO (x
) + 1);
6853 else if (GET_CODE (x
) == MEM
)
6854 x
= change_address (x
, VOIDmode
,
6855 plus_constant (Pmode
, XEXP (x
, 0), 4));
6857 output_operand_lossage ("register or memory expression expected "
6858 "for 'N' output modifier");
6862 if (GET_CODE (x
) == REG
)
6863 x
= gen_rtx_REG (GET_MODE (x
), REGNO (x
) + 1);
6864 else if (GET_CODE (x
) == MEM
)
6865 x
= change_address (x
, VOIDmode
,
6866 plus_constant (Pmode
, XEXP (x
, 0), 8));
6868 output_operand_lossage ("register or memory expression expected "
6869 "for 'M' output modifier");
6873 print_shift_count_operand (file
, x
);
6877 switch (GET_CODE (x
))
6880 /* Print FP regs as fx instead of vx when they are accessed
6881 through non-vector mode. */
6883 || VECTOR_NOFP_REG_P (x
)
6884 || (FP_REG_P (x
) && VECTOR_MODE_P (GET_MODE (x
)))
6885 || (VECTOR_REG_P (x
)
6886 && (GET_MODE_SIZE (GET_MODE (x
)) /
6887 s390_class_max_nregs (FP_REGS
, GET_MODE (x
))) > 8))
6888 fprintf (file
, "%%v%s", reg_names
[REGNO (x
)] + 2);
6890 fprintf (file
, "%s", reg_names
[REGNO (x
)]);
6894 output_address (XEXP (x
, 0));
6901 output_addr_const (file
, x
);
6914 ival
= ((ival
& 0xff) ^ 0x80) - 0x80;
6920 ival
= ((ival
& 0xffff) ^ 0x8000) - 0x8000;
6923 ival
= s390_extract_part (x
, HImode
, 0);
6926 ival
= s390_extract_part (x
, HImode
, -1);
6929 ival
= s390_extract_part (x
, SImode
, 0);
6932 ival
= s390_extract_part (x
, SImode
, -1);
6943 len
= (code
== 's' || code
== 'e' ? 64 : 32);
6944 ok
= s390_contiguous_bitmask_p (ival
, len
, &pos
, &len
);
6946 if (code
== 's' || code
== 't')
6947 ival
= 64 - pos
- len
;
6949 ival
= 64 - 1 - pos
;
6953 output_operand_lossage ("invalid constant for output modifier '%c'", code
);
6955 fprintf (file
, HOST_WIDE_INT_PRINT_DEC
, ival
);
6959 gcc_assert (GET_MODE (x
) == VOIDmode
);
6961 fprintf (file
, HOST_WIDE_INT_PRINT_DEC
, CONST_DOUBLE_LOW (x
) & 0xff);
6962 else if (code
== 'x')
6963 fprintf (file
, HOST_WIDE_INT_PRINT_DEC
, CONST_DOUBLE_LOW (x
) & 0xffff);
6964 else if (code
== 'h')
6965 fprintf (file
, HOST_WIDE_INT_PRINT_DEC
,
6966 ((CONST_DOUBLE_LOW (x
) & 0xffff) ^ 0x8000) - 0x8000);
6970 output_operand_lossage ("invalid constant - try using "
6971 "an output modifier");
6973 output_operand_lossage ("invalid constant for output modifier '%c'",
6983 int start
, stop
, inner_len
;
6986 inner_len
= GET_MODE_UNIT_BITSIZE (GET_MODE (x
));
6987 ok
= s390_contiguous_bitmask_vector_p (x
, &start
, &stop
);
6989 if (code
== 's' || code
== 't')
6990 ival
= inner_len
- stop
- 1;
6992 ival
= inner_len
- start
- 1;
6993 fprintf (file
, HOST_WIDE_INT_PRINT_DEC
, ival
);
6999 bool ok
= s390_bytemask_vector_p (x
, &mask
);
7001 fprintf (file
, "%u", mask
);
7006 output_operand_lossage ("invalid constant vector for output "
7007 "modifier '%c'", code
);
7013 output_operand_lossage ("invalid expression - try using "
7014 "an output modifier");
7016 output_operand_lossage ("invalid expression for output "
7017 "modifier '%c'", code
);
7022 /* Target hook for assembling integer objects. We need to define it
7023 here to work a round a bug in some versions of GAS, which couldn't
7024 handle values smaller than INT_MIN when printed in decimal. */
7027 s390_assemble_integer (rtx x
, unsigned int size
, int aligned_p
)
7029 if (size
== 8 && aligned_p
7030 && GET_CODE (x
) == CONST_INT
&& INTVAL (x
) < INT_MIN
)
7032 fprintf (asm_out_file
, "\t.quad\t" HOST_WIDE_INT_PRINT_HEX
"\n",
7036 return default_assemble_integer (x
, size
, aligned_p
);
7039 /* Returns true if register REGNO is used for forming
7040 a memory address in expression X. */
7043 reg_used_in_mem_p (int regno
, rtx x
)
7045 enum rtx_code code
= GET_CODE (x
);
7051 if (refers_to_regno_p (regno
, XEXP (x
, 0)))
7054 else if (code
== SET
7055 && GET_CODE (SET_DEST (x
)) == PC
)
7057 if (refers_to_regno_p (regno
, SET_SRC (x
)))
7061 fmt
= GET_RTX_FORMAT (code
);
7062 for (i
= GET_RTX_LENGTH (code
) - 1; i
>= 0; i
--)
7065 && reg_used_in_mem_p (regno
, XEXP (x
, i
)))
7068 else if (fmt
[i
] == 'E')
7069 for (j
= 0; j
< XVECLEN (x
, i
); j
++)
7070 if (reg_used_in_mem_p (regno
, XVECEXP (x
, i
, j
)))
7076 /* Returns true if expression DEP_RTX sets an address register
7077 used by instruction INSN to address memory. */
7080 addr_generation_dependency_p (rtx dep_rtx
, rtx_insn
*insn
)
7084 if (NONJUMP_INSN_P (dep_rtx
))
7085 dep_rtx
= PATTERN (dep_rtx
);
7087 if (GET_CODE (dep_rtx
) == SET
)
7089 target
= SET_DEST (dep_rtx
);
7090 if (GET_CODE (target
) == STRICT_LOW_PART
)
7091 target
= XEXP (target
, 0);
7092 while (GET_CODE (target
) == SUBREG
)
7093 target
= SUBREG_REG (target
);
7095 if (GET_CODE (target
) == REG
)
7097 int regno
= REGNO (target
);
7099 if (s390_safe_attr_type (insn
) == TYPE_LA
)
7101 pat
= PATTERN (insn
);
7102 if (GET_CODE (pat
) == PARALLEL
)
7104 gcc_assert (XVECLEN (pat
, 0) == 2);
7105 pat
= XVECEXP (pat
, 0, 0);
7107 gcc_assert (GET_CODE (pat
) == SET
);
7108 return refers_to_regno_p (regno
, SET_SRC (pat
));
7110 else if (get_attr_atype (insn
) == ATYPE_AGEN
)
7111 return reg_used_in_mem_p (regno
, PATTERN (insn
));
7117 /* Return 1, if dep_insn sets register used in insn in the agen unit. */
7120 s390_agen_dep_p (rtx_insn
*dep_insn
, rtx_insn
*insn
)
7122 rtx dep_rtx
= PATTERN (dep_insn
);
7125 if (GET_CODE (dep_rtx
) == SET
7126 && addr_generation_dependency_p (dep_rtx
, insn
))
7128 else if (GET_CODE (dep_rtx
) == PARALLEL
)
7130 for (i
= 0; i
< XVECLEN (dep_rtx
, 0); i
++)
7132 if (addr_generation_dependency_p (XVECEXP (dep_rtx
, 0, i
), insn
))
7140 /* A C statement (sans semicolon) to update the integer scheduling priority
7141 INSN_PRIORITY (INSN). Increase the priority to execute the INSN earlier,
7142 reduce the priority to execute INSN later. Do not define this macro if
7143 you do not need to adjust the scheduling priorities of insns.
7145 A STD instruction should be scheduled earlier,
7146 in order to use the bypass. */
7148 s390_adjust_priority (rtx_insn
*insn
, int priority
)
7150 if (! INSN_P (insn
))
7153 if (s390_tune
!= PROCESSOR_2084_Z990
7154 && s390_tune
!= PROCESSOR_2094_Z9_109
7155 && s390_tune
!= PROCESSOR_2097_Z10
7156 && s390_tune
!= PROCESSOR_2817_Z196
7157 && s390_tune
!= PROCESSOR_2827_ZEC12
7158 && s390_tune
!= PROCESSOR_2964_Z13
)
7161 switch (s390_safe_attr_type (insn
))
7165 priority
= priority
<< 3;
7169 priority
= priority
<< 1;
7178 /* The number of instructions that can be issued per cycle. */
7181 s390_issue_rate (void)
7185 case PROCESSOR_2084_Z990
:
7186 case PROCESSOR_2094_Z9_109
:
7187 case PROCESSOR_2817_Z196
:
7189 case PROCESSOR_2097_Z10
:
7191 /* Starting with EC12 we use the sched_reorder hook to take care
7192 of instruction dispatch constraints. The algorithm only
7193 picks the best instruction and assumes only a single
7194 instruction gets issued per cycle. */
7195 case PROCESSOR_2827_ZEC12
:
7202 s390_first_cycle_multipass_dfa_lookahead (void)
7207 /* Annotate every literal pool reference in X by an UNSPEC_LTREF expression.
7208 Fix up MEMs as required. */
7211 annotate_constant_pool_refs (rtx
*x
)
7216 gcc_assert (GET_CODE (*x
) != SYMBOL_REF
7217 || !CONSTANT_POOL_ADDRESS_P (*x
));
7219 /* Literal pool references can only occur inside a MEM ... */
7220 if (GET_CODE (*x
) == MEM
)
7222 rtx memref
= XEXP (*x
, 0);
7224 if (GET_CODE (memref
) == SYMBOL_REF
7225 && CONSTANT_POOL_ADDRESS_P (memref
))
7227 rtx base
= cfun
->machine
->base_reg
;
7228 rtx addr
= gen_rtx_UNSPEC (Pmode
, gen_rtvec (2, memref
, base
),
7231 *x
= replace_equiv_address (*x
, addr
);
7235 if (GET_CODE (memref
) == CONST
7236 && GET_CODE (XEXP (memref
, 0)) == PLUS
7237 && GET_CODE (XEXP (XEXP (memref
, 0), 1)) == CONST_INT
7238 && GET_CODE (XEXP (XEXP (memref
, 0), 0)) == SYMBOL_REF
7239 && CONSTANT_POOL_ADDRESS_P (XEXP (XEXP (memref
, 0), 0)))
7241 HOST_WIDE_INT off
= INTVAL (XEXP (XEXP (memref
, 0), 1));
7242 rtx sym
= XEXP (XEXP (memref
, 0), 0);
7243 rtx base
= cfun
->machine
->base_reg
;
7244 rtx addr
= gen_rtx_UNSPEC (Pmode
, gen_rtvec (2, sym
, base
),
7247 *x
= replace_equiv_address (*x
, plus_constant (Pmode
, addr
, off
));
7252 /* ... or a load-address type pattern. */
7253 if (GET_CODE (*x
) == SET
)
7255 rtx addrref
= SET_SRC (*x
);
7257 if (GET_CODE (addrref
) == SYMBOL_REF
7258 && CONSTANT_POOL_ADDRESS_P (addrref
))
7260 rtx base
= cfun
->machine
->base_reg
;
7261 rtx addr
= gen_rtx_UNSPEC (Pmode
, gen_rtvec (2, addrref
, base
),
7264 SET_SRC (*x
) = addr
;
7268 if (GET_CODE (addrref
) == CONST
7269 && GET_CODE (XEXP (addrref
, 0)) == PLUS
7270 && GET_CODE (XEXP (XEXP (addrref
, 0), 1)) == CONST_INT
7271 && GET_CODE (XEXP (XEXP (addrref
, 0), 0)) == SYMBOL_REF
7272 && CONSTANT_POOL_ADDRESS_P (XEXP (XEXP (addrref
, 0), 0)))
7274 HOST_WIDE_INT off
= INTVAL (XEXP (XEXP (addrref
, 0), 1));
7275 rtx sym
= XEXP (XEXP (addrref
, 0), 0);
7276 rtx base
= cfun
->machine
->base_reg
;
7277 rtx addr
= gen_rtx_UNSPEC (Pmode
, gen_rtvec (2, sym
, base
),
7280 SET_SRC (*x
) = plus_constant (Pmode
, addr
, off
);
7285 /* Annotate LTREL_BASE as well. */
7286 if (GET_CODE (*x
) == UNSPEC
7287 && XINT (*x
, 1) == UNSPEC_LTREL_BASE
)
7289 rtx base
= cfun
->machine
->base_reg
;
7290 *x
= gen_rtx_UNSPEC (Pmode
, gen_rtvec (2, XVECEXP (*x
, 0, 0), base
),
7295 fmt
= GET_RTX_FORMAT (GET_CODE (*x
));
7296 for (i
= GET_RTX_LENGTH (GET_CODE (*x
)) - 1; i
>= 0; i
--)
7300 annotate_constant_pool_refs (&XEXP (*x
, i
));
7302 else if (fmt
[i
] == 'E')
7304 for (j
= 0; j
< XVECLEN (*x
, i
); j
++)
7305 annotate_constant_pool_refs (&XVECEXP (*x
, i
, j
));
7310 /* Split all branches that exceed the maximum distance.
7311 Returns true if this created a new literal pool entry. */
7314 s390_split_branches (void)
7316 rtx temp_reg
= gen_rtx_REG (Pmode
, RETURN_REGNUM
);
7317 int new_literal
= 0, ret
;
7322 /* We need correct insn addresses. */
7324 shorten_branches (get_insns ());
7326 /* Find all branches that exceed 64KB, and split them. */
7328 for (insn
= get_insns (); insn
; insn
= NEXT_INSN (insn
))
7330 if (! JUMP_P (insn
) || tablejump_p (insn
, NULL
, NULL
))
7333 pat
= PATTERN (insn
);
7334 if (GET_CODE (pat
) == PARALLEL
)
7335 pat
= XVECEXP (pat
, 0, 0);
7336 if (GET_CODE (pat
) != SET
|| SET_DEST (pat
) != pc_rtx
)
7339 if (GET_CODE (SET_SRC (pat
)) == LABEL_REF
)
7341 label
= &SET_SRC (pat
);
7343 else if (GET_CODE (SET_SRC (pat
)) == IF_THEN_ELSE
)
7345 if (GET_CODE (XEXP (SET_SRC (pat
), 1)) == LABEL_REF
)
7346 label
= &XEXP (SET_SRC (pat
), 1);
7347 else if (GET_CODE (XEXP (SET_SRC (pat
), 2)) == LABEL_REF
)
7348 label
= &XEXP (SET_SRC (pat
), 2);
7355 if (get_attr_length (insn
) <= 4)
7358 /* We are going to use the return register as scratch register,
7359 make sure it will be saved/restored by the prologue/epilogue. */
7360 cfun_frame_layout
.save_return_addr_p
= 1;
7365 rtx mem
= force_const_mem (Pmode
, *label
);
7366 rtx_insn
*set_insn
= emit_insn_before (gen_rtx_SET (temp_reg
, mem
),
7368 INSN_ADDRESSES_NEW (set_insn
, -1);
7369 annotate_constant_pool_refs (&PATTERN (set_insn
));
7376 target
= gen_rtx_UNSPEC (Pmode
, gen_rtvec (1, *label
),
7377 UNSPEC_LTREL_OFFSET
);
7378 target
= gen_rtx_CONST (Pmode
, target
);
7379 target
= force_const_mem (Pmode
, target
);
7380 rtx_insn
*set_insn
= emit_insn_before (gen_rtx_SET (temp_reg
, target
),
7382 INSN_ADDRESSES_NEW (set_insn
, -1);
7383 annotate_constant_pool_refs (&PATTERN (set_insn
));
7385 target
= gen_rtx_UNSPEC (Pmode
, gen_rtvec (2, XEXP (target
, 0),
7386 cfun
->machine
->base_reg
),
7388 target
= gen_rtx_PLUS (Pmode
, temp_reg
, target
);
7391 ret
= validate_change (insn
, label
, target
, 0);
7399 /* Find an annotated literal pool symbol referenced in RTX X,
7400 and store it at REF. Will abort if X contains references to
7401 more than one such pool symbol; multiple references to the same
7402 symbol are allowed, however.
7404 The rtx pointed to by REF must be initialized to NULL_RTX
7405 by the caller before calling this routine. */
7408 find_constant_pool_ref (rtx x
, rtx
*ref
)
7413 /* Ignore LTREL_BASE references. */
7414 if (GET_CODE (x
) == UNSPEC
7415 && XINT (x
, 1) == UNSPEC_LTREL_BASE
)
7417 /* Likewise POOL_ENTRY insns. */
7418 if (GET_CODE (x
) == UNSPEC_VOLATILE
7419 && XINT (x
, 1) == UNSPECV_POOL_ENTRY
)
7422 gcc_assert (GET_CODE (x
) != SYMBOL_REF
7423 || !CONSTANT_POOL_ADDRESS_P (x
));
7425 if (GET_CODE (x
) == UNSPEC
&& XINT (x
, 1) == UNSPEC_LTREF
)
7427 rtx sym
= XVECEXP (x
, 0, 0);
7428 gcc_assert (GET_CODE (sym
) == SYMBOL_REF
7429 && CONSTANT_POOL_ADDRESS_P (sym
));
7431 if (*ref
== NULL_RTX
)
7434 gcc_assert (*ref
== sym
);
7439 fmt
= GET_RTX_FORMAT (GET_CODE (x
));
7440 for (i
= GET_RTX_LENGTH (GET_CODE (x
)) - 1; i
>= 0; i
--)
7444 find_constant_pool_ref (XEXP (x
, i
), ref
);
7446 else if (fmt
[i
] == 'E')
7448 for (j
= 0; j
< XVECLEN (x
, i
); j
++)
7449 find_constant_pool_ref (XVECEXP (x
, i
, j
), ref
);
7454 /* Replace every reference to the annotated literal pool
7455 symbol REF in X by its base plus OFFSET. */
7458 replace_constant_pool_ref (rtx
*x
, rtx ref
, rtx offset
)
7463 gcc_assert (*x
!= ref
);
7465 if (GET_CODE (*x
) == UNSPEC
7466 && XINT (*x
, 1) == UNSPEC_LTREF
7467 && XVECEXP (*x
, 0, 0) == ref
)
7469 *x
= gen_rtx_PLUS (Pmode
, XVECEXP (*x
, 0, 1), offset
);
7473 if (GET_CODE (*x
) == PLUS
7474 && GET_CODE (XEXP (*x
, 1)) == CONST_INT
7475 && GET_CODE (XEXP (*x
, 0)) == UNSPEC
7476 && XINT (XEXP (*x
, 0), 1) == UNSPEC_LTREF
7477 && XVECEXP (XEXP (*x
, 0), 0, 0) == ref
)
7479 rtx addr
= gen_rtx_PLUS (Pmode
, XVECEXP (XEXP (*x
, 0), 0, 1), offset
);
7480 *x
= plus_constant (Pmode
, addr
, INTVAL (XEXP (*x
, 1)));
7484 fmt
= GET_RTX_FORMAT (GET_CODE (*x
));
7485 for (i
= GET_RTX_LENGTH (GET_CODE (*x
)) - 1; i
>= 0; i
--)
7489 replace_constant_pool_ref (&XEXP (*x
, i
), ref
, offset
);
7491 else if (fmt
[i
] == 'E')
7493 for (j
= 0; j
< XVECLEN (*x
, i
); j
++)
7494 replace_constant_pool_ref (&XVECEXP (*x
, i
, j
), ref
, offset
);
7499 /* Check whether X contains an UNSPEC_LTREL_BASE.
7500 Return its constant pool symbol if found, NULL_RTX otherwise. */
7503 find_ltrel_base (rtx x
)
7508 if (GET_CODE (x
) == UNSPEC
7509 && XINT (x
, 1) == UNSPEC_LTREL_BASE
)
7510 return XVECEXP (x
, 0, 0);
7512 fmt
= GET_RTX_FORMAT (GET_CODE (x
));
7513 for (i
= GET_RTX_LENGTH (GET_CODE (x
)) - 1; i
>= 0; i
--)
7517 rtx fnd
= find_ltrel_base (XEXP (x
, i
));
7521 else if (fmt
[i
] == 'E')
7523 for (j
= 0; j
< XVECLEN (x
, i
); j
++)
7525 rtx fnd
= find_ltrel_base (XVECEXP (x
, i
, j
));
7535 /* Replace any occurrence of UNSPEC_LTREL_BASE in X with its base. */
7538 replace_ltrel_base (rtx
*x
)
7543 if (GET_CODE (*x
) == UNSPEC
7544 && XINT (*x
, 1) == UNSPEC_LTREL_BASE
)
7546 *x
= XVECEXP (*x
, 0, 1);
7550 fmt
= GET_RTX_FORMAT (GET_CODE (*x
));
7551 for (i
= GET_RTX_LENGTH (GET_CODE (*x
)) - 1; i
>= 0; i
--)
7555 replace_ltrel_base (&XEXP (*x
, i
));
7557 else if (fmt
[i
] == 'E')
7559 for (j
= 0; j
< XVECLEN (*x
, i
); j
++)
7560 replace_ltrel_base (&XVECEXP (*x
, i
, j
));
7566 /* We keep a list of constants which we have to add to internal
7567 constant tables in the middle of large functions. */
7569 #define NR_C_MODES 31
7570 machine_mode constant_modes
[NR_C_MODES
] =
7572 TFmode
, TImode
, TDmode
,
7573 V16QImode
, V8HImode
, V4SImode
, V2DImode
, V4SFmode
, V2DFmode
, V1TFmode
,
7574 DFmode
, DImode
, DDmode
,
7575 V8QImode
, V4HImode
, V2SImode
, V1DImode
, V2SFmode
, V1DFmode
,
7576 SFmode
, SImode
, SDmode
,
7577 V4QImode
, V2HImode
, V1SImode
, V1SFmode
,
7586 struct constant
*next
;
7588 rtx_code_label
*label
;
7591 struct constant_pool
7593 struct constant_pool
*next
;
7594 rtx_insn
*first_insn
;
7595 rtx_insn
*pool_insn
;
7597 rtx_insn
*emit_pool_after
;
7599 struct constant
*constants
[NR_C_MODES
];
7600 struct constant
*execute
;
7601 rtx_code_label
*label
;
7605 /* Allocate new constant_pool structure. */
7607 static struct constant_pool
*
7608 s390_alloc_pool (void)
7610 struct constant_pool
*pool
;
7613 pool
= (struct constant_pool
*) xmalloc (sizeof *pool
);
7615 for (i
= 0; i
< NR_C_MODES
; i
++)
7616 pool
->constants
[i
] = NULL
;
7618 pool
->execute
= NULL
;
7619 pool
->label
= gen_label_rtx ();
7620 pool
->first_insn
= NULL
;
7621 pool
->pool_insn
= NULL
;
7622 pool
->insns
= BITMAP_ALLOC (NULL
);
7624 pool
->emit_pool_after
= NULL
;
7629 /* Create new constant pool covering instructions starting at INSN
7630 and chain it to the end of POOL_LIST. */
7632 static struct constant_pool
*
7633 s390_start_pool (struct constant_pool
**pool_list
, rtx_insn
*insn
)
7635 struct constant_pool
*pool
, **prev
;
7637 pool
= s390_alloc_pool ();
7638 pool
->first_insn
= insn
;
7640 for (prev
= pool_list
; *prev
; prev
= &(*prev
)->next
)
7647 /* End range of instructions covered by POOL at INSN and emit
7648 placeholder insn representing the pool. */
7651 s390_end_pool (struct constant_pool
*pool
, rtx_insn
*insn
)
7653 rtx pool_size
= GEN_INT (pool
->size
+ 8 /* alignment slop */);
7656 insn
= get_last_insn ();
7658 pool
->pool_insn
= emit_insn_after (gen_pool (pool_size
), insn
);
7659 INSN_ADDRESSES_NEW (pool
->pool_insn
, -1);
7662 /* Add INSN to the list of insns covered by POOL. */
7665 s390_add_pool_insn (struct constant_pool
*pool
, rtx insn
)
7667 bitmap_set_bit (pool
->insns
, INSN_UID (insn
));
7670 /* Return pool out of POOL_LIST that covers INSN. */
7672 static struct constant_pool
*
7673 s390_find_pool (struct constant_pool
*pool_list
, rtx insn
)
7675 struct constant_pool
*pool
;
7677 for (pool
= pool_list
; pool
; pool
= pool
->next
)
7678 if (bitmap_bit_p (pool
->insns
, INSN_UID (insn
)))
7684 /* Add constant VAL of mode MODE to the constant pool POOL. */
7687 s390_add_constant (struct constant_pool
*pool
, rtx val
, machine_mode mode
)
7692 for (i
= 0; i
< NR_C_MODES
; i
++)
7693 if (constant_modes
[i
] == mode
)
7695 gcc_assert (i
!= NR_C_MODES
);
7697 for (c
= pool
->constants
[i
]; c
!= NULL
; c
= c
->next
)
7698 if (rtx_equal_p (val
, c
->value
))
7703 c
= (struct constant
*) xmalloc (sizeof *c
);
7705 c
->label
= gen_label_rtx ();
7706 c
->next
= pool
->constants
[i
];
7707 pool
->constants
[i
] = c
;
7708 pool
->size
+= GET_MODE_SIZE (mode
);
7712 /* Return an rtx that represents the offset of X from the start of
7716 s390_pool_offset (struct constant_pool
*pool
, rtx x
)
7720 label
= gen_rtx_LABEL_REF (GET_MODE (x
), pool
->label
);
7721 x
= gen_rtx_UNSPEC (GET_MODE (x
), gen_rtvec (2, x
, label
),
7722 UNSPEC_POOL_OFFSET
);
7723 return gen_rtx_CONST (GET_MODE (x
), x
);
7726 /* Find constant VAL of mode MODE in the constant pool POOL.
7727 Return an RTX describing the distance from the start of
7728 the pool to the location of the new constant. */
7731 s390_find_constant (struct constant_pool
*pool
, rtx val
,
7737 for (i
= 0; i
< NR_C_MODES
; i
++)
7738 if (constant_modes
[i
] == mode
)
7740 gcc_assert (i
!= NR_C_MODES
);
7742 for (c
= pool
->constants
[i
]; c
!= NULL
; c
= c
->next
)
7743 if (rtx_equal_p (val
, c
->value
))
7748 return s390_pool_offset (pool
, gen_rtx_LABEL_REF (Pmode
, c
->label
));
7751 /* Check whether INSN is an execute. Return the label_ref to its
7752 execute target template if so, NULL_RTX otherwise. */
7755 s390_execute_label (rtx insn
)
7757 if (NONJUMP_INSN_P (insn
)
7758 && GET_CODE (PATTERN (insn
)) == PARALLEL
7759 && GET_CODE (XVECEXP (PATTERN (insn
), 0, 0)) == UNSPEC
7760 && XINT (XVECEXP (PATTERN (insn
), 0, 0), 1) == UNSPEC_EXECUTE
)
7761 return XVECEXP (XVECEXP (PATTERN (insn
), 0, 0), 0, 2);
7766 /* Add execute target for INSN to the constant pool POOL. */
7769 s390_add_execute (struct constant_pool
*pool
, rtx insn
)
7773 for (c
= pool
->execute
; c
!= NULL
; c
= c
->next
)
7774 if (INSN_UID (insn
) == INSN_UID (c
->value
))
7779 c
= (struct constant
*) xmalloc (sizeof *c
);
7781 c
->label
= gen_label_rtx ();
7782 c
->next
= pool
->execute
;
7788 /* Find execute target for INSN in the constant pool POOL.
7789 Return an RTX describing the distance from the start of
7790 the pool to the location of the execute target. */
7793 s390_find_execute (struct constant_pool
*pool
, rtx insn
)
7797 for (c
= pool
->execute
; c
!= NULL
; c
= c
->next
)
7798 if (INSN_UID (insn
) == INSN_UID (c
->value
))
7803 return s390_pool_offset (pool
, gen_rtx_LABEL_REF (Pmode
, c
->label
));
7806 /* For an execute INSN, extract the execute target template. */
7809 s390_execute_target (rtx insn
)
7811 rtx pattern
= PATTERN (insn
);
7812 gcc_assert (s390_execute_label (insn
));
7814 if (XVECLEN (pattern
, 0) == 2)
7816 pattern
= copy_rtx (XVECEXP (pattern
, 0, 1));
7820 rtvec vec
= rtvec_alloc (XVECLEN (pattern
, 0) - 1);
7823 for (i
= 0; i
< XVECLEN (pattern
, 0) - 1; i
++)
7824 RTVEC_ELT (vec
, i
) = copy_rtx (XVECEXP (pattern
, 0, i
+ 1));
7826 pattern
= gen_rtx_PARALLEL (VOIDmode
, vec
);
7832 /* Indicate that INSN cannot be duplicated. This is the case for
7833 execute insns that carry a unique label. */
7836 s390_cannot_copy_insn_p (rtx_insn
*insn
)
7838 rtx label
= s390_execute_label (insn
);
7839 return label
&& label
!= const0_rtx
;
7842 /* Dump out the constants in POOL. If REMOTE_LABEL is true,
7843 do not emit the pool base label. */
7846 s390_dump_pool (struct constant_pool
*pool
, bool remote_label
)
7849 rtx_insn
*insn
= pool
->pool_insn
;
7852 /* Switch to rodata section. */
7853 if (TARGET_CPU_ZARCH
)
7855 insn
= emit_insn_after (gen_pool_section_start (), insn
);
7856 INSN_ADDRESSES_NEW (insn
, -1);
7859 /* Ensure minimum pool alignment. */
7860 if (TARGET_CPU_ZARCH
)
7861 insn
= emit_insn_after (gen_pool_align (GEN_INT (8)), insn
);
7863 insn
= emit_insn_after (gen_pool_align (GEN_INT (4)), insn
);
7864 INSN_ADDRESSES_NEW (insn
, -1);
7866 /* Emit pool base label. */
7869 insn
= emit_label_after (pool
->label
, insn
);
7870 INSN_ADDRESSES_NEW (insn
, -1);
7873 /* Dump constants in descending alignment requirement order,
7874 ensuring proper alignment for every constant. */
7875 for (i
= 0; i
< NR_C_MODES
; i
++)
7876 for (c
= pool
->constants
[i
]; c
; c
= c
->next
)
7878 /* Convert UNSPEC_LTREL_OFFSET unspecs to pool-relative references. */
7879 rtx value
= copy_rtx (c
->value
);
7880 if (GET_CODE (value
) == CONST
7881 && GET_CODE (XEXP (value
, 0)) == UNSPEC
7882 && XINT (XEXP (value
, 0), 1) == UNSPEC_LTREL_OFFSET
7883 && XVECLEN (XEXP (value
, 0), 0) == 1)
7884 value
= s390_pool_offset (pool
, XVECEXP (XEXP (value
, 0), 0, 0));
7886 insn
= emit_label_after (c
->label
, insn
);
7887 INSN_ADDRESSES_NEW (insn
, -1);
7889 value
= gen_rtx_UNSPEC_VOLATILE (constant_modes
[i
],
7890 gen_rtvec (1, value
),
7891 UNSPECV_POOL_ENTRY
);
7892 insn
= emit_insn_after (value
, insn
);
7893 INSN_ADDRESSES_NEW (insn
, -1);
7896 /* Ensure minimum alignment for instructions. */
7897 insn
= emit_insn_after (gen_pool_align (GEN_INT (2)), insn
);
7898 INSN_ADDRESSES_NEW (insn
, -1);
7900 /* Output in-pool execute template insns. */
7901 for (c
= pool
->execute
; c
; c
= c
->next
)
7903 insn
= emit_label_after (c
->label
, insn
);
7904 INSN_ADDRESSES_NEW (insn
, -1);
7906 insn
= emit_insn_after (s390_execute_target (c
->value
), insn
);
7907 INSN_ADDRESSES_NEW (insn
, -1);
7910 /* Switch back to previous section. */
7911 if (TARGET_CPU_ZARCH
)
7913 insn
= emit_insn_after (gen_pool_section_end (), insn
);
7914 INSN_ADDRESSES_NEW (insn
, -1);
7917 insn
= emit_barrier_after (insn
);
7918 INSN_ADDRESSES_NEW (insn
, -1);
7920 /* Remove placeholder insn. */
7921 remove_insn (pool
->pool_insn
);
7924 /* Free all memory used by POOL. */
7927 s390_free_pool (struct constant_pool
*pool
)
7929 struct constant
*c
, *next
;
7932 for (i
= 0; i
< NR_C_MODES
; i
++)
7933 for (c
= pool
->constants
[i
]; c
; c
= next
)
7939 for (c
= pool
->execute
; c
; c
= next
)
7945 BITMAP_FREE (pool
->insns
);
7950 /* Collect main literal pool. Return NULL on overflow. */
7952 static struct constant_pool
*
7953 s390_mainpool_start (void)
7955 struct constant_pool
*pool
;
7958 pool
= s390_alloc_pool ();
7960 for (insn
= get_insns (); insn
; insn
= NEXT_INSN (insn
))
7962 if (NONJUMP_INSN_P (insn
)
7963 && GET_CODE (PATTERN (insn
)) == SET
7964 && GET_CODE (SET_SRC (PATTERN (insn
))) == UNSPEC_VOLATILE
7965 && XINT (SET_SRC (PATTERN (insn
)), 1) == UNSPECV_MAIN_POOL
)
7967 /* There might be two main_pool instructions if base_reg
7968 is call-clobbered; one for shrink-wrapped code and one
7969 for the rest. We want to keep the first. */
7970 if (pool
->pool_insn
)
7972 insn
= PREV_INSN (insn
);
7973 delete_insn (NEXT_INSN (insn
));
7976 pool
->pool_insn
= insn
;
7979 if (!TARGET_CPU_ZARCH
&& s390_execute_label (insn
))
7981 s390_add_execute (pool
, insn
);
7983 else if (NONJUMP_INSN_P (insn
) || CALL_P (insn
))
7985 rtx pool_ref
= NULL_RTX
;
7986 find_constant_pool_ref (PATTERN (insn
), &pool_ref
);
7989 rtx constant
= get_pool_constant (pool_ref
);
7990 machine_mode mode
= get_pool_mode (pool_ref
);
7991 s390_add_constant (pool
, constant
, mode
);
7995 /* If hot/cold partitioning is enabled we have to make sure that
7996 the literal pool is emitted in the same section where the
7997 initialization of the literal pool base pointer takes place.
7998 emit_pool_after is only used in the non-overflow case on non
7999 Z cpus where we can emit the literal pool at the end of the
8000 function body within the text section. */
8002 && NOTE_KIND (insn
) == NOTE_INSN_SWITCH_TEXT_SECTIONS
8003 && !pool
->emit_pool_after
)
8004 pool
->emit_pool_after
= PREV_INSN (insn
);
8007 gcc_assert (pool
->pool_insn
|| pool
->size
== 0);
8009 if (pool
->size
>= 4096)
8011 /* We're going to chunkify the pool, so remove the main
8012 pool placeholder insn. */
8013 remove_insn (pool
->pool_insn
);
8015 s390_free_pool (pool
);
8019 /* If the functions ends with the section where the literal pool
8020 should be emitted set the marker to its end. */
8021 if (pool
&& !pool
->emit_pool_after
)
8022 pool
->emit_pool_after
= get_last_insn ();
8027 /* POOL holds the main literal pool as collected by s390_mainpool_start.
8028 Modify the current function to output the pool constants as well as
8029 the pool register setup instruction. */
8032 s390_mainpool_finish (struct constant_pool
*pool
)
8034 rtx base_reg
= cfun
->machine
->base_reg
;
8036 /* If the pool is empty, we're done. */
8037 if (pool
->size
== 0)
8039 /* We don't actually need a base register after all. */
8040 cfun
->machine
->base_reg
= NULL_RTX
;
8042 if (pool
->pool_insn
)
8043 remove_insn (pool
->pool_insn
);
8044 s390_free_pool (pool
);
8048 /* We need correct insn addresses. */
8049 shorten_branches (get_insns ());
8051 /* On zSeries, we use a LARL to load the pool register. The pool is
8052 located in the .rodata section, so we emit it after the function. */
8053 if (TARGET_CPU_ZARCH
)
8055 rtx set
= gen_main_base_64 (base_reg
, pool
->label
);
8056 rtx_insn
*insn
= emit_insn_after (set
, pool
->pool_insn
);
8057 INSN_ADDRESSES_NEW (insn
, -1);
8058 remove_insn (pool
->pool_insn
);
8060 insn
= get_last_insn ();
8061 pool
->pool_insn
= emit_insn_after (gen_pool (const0_rtx
), insn
);
8062 INSN_ADDRESSES_NEW (pool
->pool_insn
, -1);
8064 s390_dump_pool (pool
, 0);
8067 /* On S/390, if the total size of the function's code plus literal pool
8068 does not exceed 4096 bytes, we use BASR to set up a function base
8069 pointer, and emit the literal pool at the end of the function. */
8070 else if (INSN_ADDRESSES (INSN_UID (pool
->emit_pool_after
))
8071 + pool
->size
+ 8 /* alignment slop */ < 4096)
8073 rtx set
= gen_main_base_31_small (base_reg
, pool
->label
);
8074 rtx_insn
*insn
= emit_insn_after (set
, pool
->pool_insn
);
8075 INSN_ADDRESSES_NEW (insn
, -1);
8076 remove_insn (pool
->pool_insn
);
8078 insn
= emit_label_after (pool
->label
, insn
);
8079 INSN_ADDRESSES_NEW (insn
, -1);
8081 /* emit_pool_after will be set by s390_mainpool_start to the
8082 last insn of the section where the literal pool should be
8084 insn
= pool
->emit_pool_after
;
8086 pool
->pool_insn
= emit_insn_after (gen_pool (const0_rtx
), insn
);
8087 INSN_ADDRESSES_NEW (pool
->pool_insn
, -1);
8089 s390_dump_pool (pool
, 1);
8092 /* Otherwise, we emit an inline literal pool and use BASR to branch
8093 over it, setting up the pool register at the same time. */
8096 rtx_code_label
*pool_end
= gen_label_rtx ();
8098 rtx pat
= gen_main_base_31_large (base_reg
, pool
->label
, pool_end
);
8099 rtx_insn
*insn
= emit_jump_insn_after (pat
, pool
->pool_insn
);
8100 JUMP_LABEL (insn
) = pool_end
;
8101 INSN_ADDRESSES_NEW (insn
, -1);
8102 remove_insn (pool
->pool_insn
);
8104 insn
= emit_label_after (pool
->label
, insn
);
8105 INSN_ADDRESSES_NEW (insn
, -1);
8107 pool
->pool_insn
= emit_insn_after (gen_pool (const0_rtx
), insn
);
8108 INSN_ADDRESSES_NEW (pool
->pool_insn
, -1);
8110 insn
= emit_label_after (pool_end
, pool
->pool_insn
);
8111 INSN_ADDRESSES_NEW (insn
, -1);
8113 s390_dump_pool (pool
, 1);
8117 /* Replace all literal pool references. */
8119 for (rtx_insn
*insn
= get_insns (); insn
; insn
= NEXT_INSN (insn
))
8122 replace_ltrel_base (&PATTERN (insn
));
8124 if (NONJUMP_INSN_P (insn
) || CALL_P (insn
))
8126 rtx addr
, pool_ref
= NULL_RTX
;
8127 find_constant_pool_ref (PATTERN (insn
), &pool_ref
);
8130 if (s390_execute_label (insn
))
8131 addr
= s390_find_execute (pool
, insn
);
8133 addr
= s390_find_constant (pool
, get_pool_constant (pool_ref
),
8134 get_pool_mode (pool_ref
));
8136 replace_constant_pool_ref (&PATTERN (insn
), pool_ref
, addr
);
8137 INSN_CODE (insn
) = -1;
8143 /* Free the pool. */
8144 s390_free_pool (pool
);
8147 /* POOL holds the main literal pool as collected by s390_mainpool_start.
8148 We have decided we cannot use this pool, so revert all changes
8149 to the current function that were done by s390_mainpool_start. */
8151 s390_mainpool_cancel (struct constant_pool
*pool
)
8153 /* We didn't actually change the instruction stream, so simply
8154 free the pool memory. */
8155 s390_free_pool (pool
);
8159 /* Chunkify the literal pool. */
8161 #define S390_POOL_CHUNK_MIN 0xc00
8162 #define S390_POOL_CHUNK_MAX 0xe00
8164 static struct constant_pool
*
8165 s390_chunkify_start (void)
8167 struct constant_pool
*curr_pool
= NULL
, *pool_list
= NULL
;
8170 rtx pending_ltrel
= NULL_RTX
;
8173 rtx (*gen_reload_base
) (rtx
, rtx
) =
8174 TARGET_CPU_ZARCH
? gen_reload_base_64
: gen_reload_base_31
;
8177 /* We need correct insn addresses. */
8179 shorten_branches (get_insns ());
8181 /* Scan all insns and move literals to pool chunks. */
8183 for (insn
= get_insns (); insn
; insn
= NEXT_INSN (insn
))
8185 bool section_switch_p
= false;
8187 /* Check for pending LTREL_BASE. */
8190 rtx ltrel_base
= find_ltrel_base (PATTERN (insn
));
8193 gcc_assert (ltrel_base
== pending_ltrel
);
8194 pending_ltrel
= NULL_RTX
;
8198 if (!TARGET_CPU_ZARCH
&& s390_execute_label (insn
))
8201 curr_pool
= s390_start_pool (&pool_list
, insn
);
8203 s390_add_execute (curr_pool
, insn
);
8204 s390_add_pool_insn (curr_pool
, insn
);
8206 else if (NONJUMP_INSN_P (insn
) || CALL_P (insn
))
8208 rtx pool_ref
= NULL_RTX
;
8209 find_constant_pool_ref (PATTERN (insn
), &pool_ref
);
8212 rtx constant
= get_pool_constant (pool_ref
);
8213 machine_mode mode
= get_pool_mode (pool_ref
);
8216 curr_pool
= s390_start_pool (&pool_list
, insn
);
8218 s390_add_constant (curr_pool
, constant
, mode
);
8219 s390_add_pool_insn (curr_pool
, insn
);
8221 /* Don't split the pool chunk between a LTREL_OFFSET load
8222 and the corresponding LTREL_BASE. */
8223 if (GET_CODE (constant
) == CONST
8224 && GET_CODE (XEXP (constant
, 0)) == UNSPEC
8225 && XINT (XEXP (constant
, 0), 1) == UNSPEC_LTREL_OFFSET
)
8227 gcc_assert (!pending_ltrel
);
8228 pending_ltrel
= pool_ref
;
8233 if (JUMP_P (insn
) || JUMP_TABLE_DATA_P (insn
) || LABEL_P (insn
))
8236 s390_add_pool_insn (curr_pool
, insn
);
8237 /* An LTREL_BASE must follow within the same basic block. */
8238 gcc_assert (!pending_ltrel
);
8242 switch (NOTE_KIND (insn
))
8244 case NOTE_INSN_SWITCH_TEXT_SECTIONS
:
8245 section_switch_p
= true;
8247 case NOTE_INSN_VAR_LOCATION
:
8248 case NOTE_INSN_CALL_ARG_LOCATION
:
8255 || INSN_ADDRESSES_SIZE () <= (size_t) INSN_UID (insn
)
8256 || INSN_ADDRESSES (INSN_UID (insn
)) == -1)
8259 if (TARGET_CPU_ZARCH
)
8261 if (curr_pool
->size
< S390_POOL_CHUNK_MAX
)
8264 s390_end_pool (curr_pool
, NULL
);
8269 int chunk_size
= INSN_ADDRESSES (INSN_UID (insn
))
8270 - INSN_ADDRESSES (INSN_UID (curr_pool
->first_insn
))
8273 /* We will later have to insert base register reload insns.
8274 Those will have an effect on code size, which we need to
8275 consider here. This calculation makes rather pessimistic
8276 worst-case assumptions. */
8280 if (chunk_size
< S390_POOL_CHUNK_MIN
8281 && curr_pool
->size
< S390_POOL_CHUNK_MIN
8282 && !section_switch_p
)
8285 /* Pool chunks can only be inserted after BARRIERs ... */
8286 if (BARRIER_P (insn
))
8288 s390_end_pool (curr_pool
, insn
);
8293 /* ... so if we don't find one in time, create one. */
8294 else if (chunk_size
> S390_POOL_CHUNK_MAX
8295 || curr_pool
->size
> S390_POOL_CHUNK_MAX
8296 || section_switch_p
)
8298 rtx_insn
*label
, *jump
, *barrier
, *next
, *prev
;
8300 if (!section_switch_p
)
8302 /* We can insert the barrier only after a 'real' insn. */
8303 if (! NONJUMP_INSN_P (insn
) && ! CALL_P (insn
))
8305 if (get_attr_length (insn
) == 0)
8307 /* Don't separate LTREL_BASE from the corresponding
8308 LTREL_OFFSET load. */
8315 next
= NEXT_INSN (insn
);
8319 && (NOTE_KIND (next
) == NOTE_INSN_VAR_LOCATION
8320 || NOTE_KIND (next
) == NOTE_INSN_CALL_ARG_LOCATION
));
8324 gcc_assert (!pending_ltrel
);
8326 /* The old pool has to end before the section switch
8327 note in order to make it part of the current
8329 insn
= PREV_INSN (insn
);
8332 label
= gen_label_rtx ();
8334 if (prev
&& NOTE_P (prev
))
8335 prev
= prev_nonnote_insn (prev
);
8337 jump
= emit_jump_insn_after_setloc (gen_jump (label
), insn
,
8338 INSN_LOCATION (prev
));
8340 jump
= emit_jump_insn_after_noloc (gen_jump (label
), insn
);
8341 barrier
= emit_barrier_after (jump
);
8342 insn
= emit_label_after (label
, barrier
);
8343 JUMP_LABEL (jump
) = label
;
8344 LABEL_NUSES (label
) = 1;
8346 INSN_ADDRESSES_NEW (jump
, -1);
8347 INSN_ADDRESSES_NEW (barrier
, -1);
8348 INSN_ADDRESSES_NEW (insn
, -1);
8350 s390_end_pool (curr_pool
, barrier
);
8358 s390_end_pool (curr_pool
, NULL
);
8359 gcc_assert (!pending_ltrel
);
8361 /* Find all labels that are branched into
8362 from an insn belonging to a different chunk. */
8364 far_labels
= BITMAP_ALLOC (NULL
);
8366 for (insn
= get_insns (); insn
; insn
= NEXT_INSN (insn
))
8368 rtx_jump_table_data
*table
;
8370 /* Labels marked with LABEL_PRESERVE_P can be target
8371 of non-local jumps, so we have to mark them.
8372 The same holds for named labels.
8374 Don't do that, however, if it is the label before
8378 && (LABEL_PRESERVE_P (insn
) || LABEL_NAME (insn
)))
8380 rtx_insn
*vec_insn
= NEXT_INSN (insn
);
8381 if (! vec_insn
|| ! JUMP_TABLE_DATA_P (vec_insn
))
8382 bitmap_set_bit (far_labels
, CODE_LABEL_NUMBER (insn
));
8384 /* Check potential targets in a table jump (casesi_jump). */
8385 else if (tablejump_p (insn
, NULL
, &table
))
8387 rtx vec_pat
= PATTERN (table
);
8388 int i
, diff_p
= GET_CODE (vec_pat
) == ADDR_DIFF_VEC
;
8390 for (i
= 0; i
< XVECLEN (vec_pat
, diff_p
); i
++)
8392 rtx label
= XEXP (XVECEXP (vec_pat
, diff_p
, i
), 0);
8394 if (s390_find_pool (pool_list
, label
)
8395 != s390_find_pool (pool_list
, insn
))
8396 bitmap_set_bit (far_labels
, CODE_LABEL_NUMBER (label
));
8399 /* If we have a direct jump (conditional or unconditional),
8400 check all potential targets. */
8401 else if (JUMP_P (insn
))
8403 rtx pat
= PATTERN (insn
);
8405 if (GET_CODE (pat
) == PARALLEL
)
8406 pat
= XVECEXP (pat
, 0, 0);
8408 if (GET_CODE (pat
) == SET
)
8410 rtx label
= JUMP_LABEL (insn
);
8411 if (label
&& !ANY_RETURN_P (label
))
8413 if (s390_find_pool (pool_list
, label
)
8414 != s390_find_pool (pool_list
, insn
))
8415 bitmap_set_bit (far_labels
, CODE_LABEL_NUMBER (label
));
8421 /* Insert base register reload insns before every pool. */
8423 for (curr_pool
= pool_list
; curr_pool
; curr_pool
= curr_pool
->next
)
8425 rtx new_insn
= gen_reload_base (cfun
->machine
->base_reg
,
8427 rtx_insn
*insn
= curr_pool
->first_insn
;
8428 INSN_ADDRESSES_NEW (emit_insn_before (new_insn
, insn
), -1);
8431 /* Insert base register reload insns at every far label. */
8433 for (insn
= get_insns (); insn
; insn
= NEXT_INSN (insn
))
8435 && bitmap_bit_p (far_labels
, CODE_LABEL_NUMBER (insn
)))
8437 struct constant_pool
*pool
= s390_find_pool (pool_list
, insn
);
8440 rtx new_insn
= gen_reload_base (cfun
->machine
->base_reg
,
8442 INSN_ADDRESSES_NEW (emit_insn_after (new_insn
, insn
), -1);
8447 BITMAP_FREE (far_labels
);
8450 /* Recompute insn addresses. */
8452 init_insn_lengths ();
8453 shorten_branches (get_insns ());
8458 /* POOL_LIST is a chunk list as prepared by s390_chunkify_start.
8459 After we have decided to use this list, finish implementing
8460 all changes to the current function as required. */
8463 s390_chunkify_finish (struct constant_pool
*pool_list
)
8465 struct constant_pool
*curr_pool
= NULL
;
8469 /* Replace all literal pool references. */
8471 for (insn
= get_insns (); insn
; insn
= NEXT_INSN (insn
))
8474 replace_ltrel_base (&PATTERN (insn
));
8476 curr_pool
= s390_find_pool (pool_list
, insn
);
8480 if (NONJUMP_INSN_P (insn
) || CALL_P (insn
))
8482 rtx addr
, pool_ref
= NULL_RTX
;
8483 find_constant_pool_ref (PATTERN (insn
), &pool_ref
);
8486 if (s390_execute_label (insn
))
8487 addr
= s390_find_execute (curr_pool
, insn
);
8489 addr
= s390_find_constant (curr_pool
,
8490 get_pool_constant (pool_ref
),
8491 get_pool_mode (pool_ref
));
8493 replace_constant_pool_ref (&PATTERN (insn
), pool_ref
, addr
);
8494 INSN_CODE (insn
) = -1;
8499 /* Dump out all literal pools. */
8501 for (curr_pool
= pool_list
; curr_pool
; curr_pool
= curr_pool
->next
)
8502 s390_dump_pool (curr_pool
, 0);
8504 /* Free pool list. */
8508 struct constant_pool
*next
= pool_list
->next
;
8509 s390_free_pool (pool_list
);
8514 /* POOL_LIST is a chunk list as prepared by s390_chunkify_start.
8515 We have decided we cannot use this list, so revert all changes
8516 to the current function that were done by s390_chunkify_start. */
8519 s390_chunkify_cancel (struct constant_pool
*pool_list
)
8521 struct constant_pool
*curr_pool
= NULL
;
8524 /* Remove all pool placeholder insns. */
8526 for (curr_pool
= pool_list
; curr_pool
; curr_pool
= curr_pool
->next
)
8528 /* Did we insert an extra barrier? Remove it. */
8529 rtx_insn
*barrier
= PREV_INSN (curr_pool
->pool_insn
);
8530 rtx_insn
*jump
= barrier
? PREV_INSN (barrier
) : NULL
;
8531 rtx_insn
*label
= NEXT_INSN (curr_pool
->pool_insn
);
8533 if (jump
&& JUMP_P (jump
)
8534 && barrier
&& BARRIER_P (barrier
)
8535 && label
&& LABEL_P (label
)
8536 && GET_CODE (PATTERN (jump
)) == SET
8537 && SET_DEST (PATTERN (jump
)) == pc_rtx
8538 && GET_CODE (SET_SRC (PATTERN (jump
))) == LABEL_REF
8539 && XEXP (SET_SRC (PATTERN (jump
)), 0) == label
)
8542 remove_insn (barrier
);
8543 remove_insn (label
);
8546 remove_insn (curr_pool
->pool_insn
);
8549 /* Remove all base register reload insns. */
8551 for (insn
= get_insns (); insn
; )
8553 rtx_insn
*next_insn
= NEXT_INSN (insn
);
8555 if (NONJUMP_INSN_P (insn
)
8556 && GET_CODE (PATTERN (insn
)) == SET
8557 && GET_CODE (SET_SRC (PATTERN (insn
))) == UNSPEC
8558 && XINT (SET_SRC (PATTERN (insn
)), 1) == UNSPEC_RELOAD_BASE
)
8564 /* Free pool list. */
8568 struct constant_pool
*next
= pool_list
->next
;
8569 s390_free_pool (pool_list
);
8574 /* Output the constant pool entry EXP in mode MODE with alignment ALIGN. */
8577 s390_output_pool_entry (rtx exp
, machine_mode mode
, unsigned int align
)
8581 switch (GET_MODE_CLASS (mode
))
8584 case MODE_DECIMAL_FLOAT
:
8585 gcc_assert (GET_CODE (exp
) == CONST_DOUBLE
);
8587 REAL_VALUE_FROM_CONST_DOUBLE (r
, exp
);
8588 assemble_real (r
, mode
, align
);
8592 assemble_integer (exp
, GET_MODE_SIZE (mode
), align
, 1);
8593 mark_symbol_refs_as_used (exp
);
8596 case MODE_VECTOR_INT
:
8597 case MODE_VECTOR_FLOAT
:
8600 machine_mode inner_mode
;
8601 gcc_assert (GET_CODE (exp
) == CONST_VECTOR
);
8603 inner_mode
= GET_MODE_INNER (GET_MODE (exp
));
8604 for (i
= 0; i
< XVECLEN (exp
, 0); i
++)
8605 s390_output_pool_entry (XVECEXP (exp
, 0, i
),
8609 : GET_MODE_BITSIZE (inner_mode
));
8619 /* Return an RTL expression representing the value of the return address
8620 for the frame COUNT steps up from the current frame. FRAME is the
8621 frame pointer of that frame. */
8624 s390_return_addr_rtx (int count
, rtx frame ATTRIBUTE_UNUSED
)
8629 /* Without backchain, we fail for all but the current frame. */
8631 if (!TARGET_BACKCHAIN
&& count
> 0)
8634 /* For the current frame, we need to make sure the initial
8635 value of RETURN_REGNUM is actually saved. */
8639 /* On non-z architectures branch splitting could overwrite r14. */
8640 if (TARGET_CPU_ZARCH
)
8641 return get_hard_reg_initial_val (Pmode
, RETURN_REGNUM
);
8644 cfun_frame_layout
.save_return_addr_p
= true;
8645 return gen_rtx_MEM (Pmode
, return_address_pointer_rtx
);
8649 if (TARGET_PACKED_STACK
)
8650 offset
= -2 * UNITS_PER_LONG
;
8652 offset
= RETURN_REGNUM
* UNITS_PER_LONG
;
8654 addr
= plus_constant (Pmode
, frame
, offset
);
8655 addr
= memory_address (Pmode
, addr
);
8656 return gen_rtx_MEM (Pmode
, addr
);
8659 /* Return an RTL expression representing the back chain stored in
8660 the current stack frame. */
8663 s390_back_chain_rtx (void)
8667 gcc_assert (TARGET_BACKCHAIN
);
8669 if (TARGET_PACKED_STACK
)
8670 chain
= plus_constant (Pmode
, stack_pointer_rtx
,
8671 STACK_POINTER_OFFSET
- UNITS_PER_LONG
);
8673 chain
= stack_pointer_rtx
;
8675 chain
= gen_rtx_MEM (Pmode
, chain
);
8679 /* Find first call clobbered register unused in a function.
8680 This could be used as base register in a leaf function
8681 or for holding the return address before epilogue. */
8684 find_unused_clobbered_reg (void)
8687 for (i
= 0; i
< 6; i
++)
8688 if (!df_regs_ever_live_p (i
))
8694 /* Helper function for s390_regs_ever_clobbered. Sets the fields in DATA for all
8695 clobbered hard regs in SETREG. */
8698 s390_reg_clobbered_rtx (rtx setreg
, const_rtx set_insn ATTRIBUTE_UNUSED
, void *data
)
8700 char *regs_ever_clobbered
= (char *)data
;
8701 unsigned int i
, regno
;
8702 machine_mode mode
= GET_MODE (setreg
);
8704 if (GET_CODE (setreg
) == SUBREG
)
8706 rtx inner
= SUBREG_REG (setreg
);
8707 if (!GENERAL_REG_P (inner
) && !FP_REG_P (inner
))
8709 regno
= subreg_regno (setreg
);
8711 else if (GENERAL_REG_P (setreg
) || FP_REG_P (setreg
))
8712 regno
= REGNO (setreg
);
8717 i
< regno
+ HARD_REGNO_NREGS (regno
, mode
);
8719 regs_ever_clobbered
[i
] = 1;
8722 /* Walks through all basic blocks of the current function looking
8723 for clobbered hard regs using s390_reg_clobbered_rtx. The fields
8724 of the passed integer array REGS_EVER_CLOBBERED are set to one for
8725 each of those regs. */
8728 s390_regs_ever_clobbered (char regs_ever_clobbered
[])
8734 memset (regs_ever_clobbered
, 0, 32);
8736 /* For non-leaf functions we have to consider all call clobbered regs to be
8740 for (i
= 0; i
< 32; i
++)
8741 regs_ever_clobbered
[i
] = call_really_used_regs
[i
];
8744 /* Make the "magic" eh_return registers live if necessary. For regs_ever_live
8745 this work is done by liveness analysis (mark_regs_live_at_end).
8746 Special care is needed for functions containing landing pads. Landing pads
8747 may use the eh registers, but the code which sets these registers is not
8748 contained in that function. Hence s390_regs_ever_clobbered is not able to
8749 deal with this automatically. */
8750 if (crtl
->calls_eh_return
|| cfun
->machine
->has_landing_pad_p
)
8751 for (i
= 0; EH_RETURN_DATA_REGNO (i
) != INVALID_REGNUM
; i
++)
8752 if (crtl
->calls_eh_return
8753 || (cfun
->machine
->has_landing_pad_p
8754 && df_regs_ever_live_p (EH_RETURN_DATA_REGNO (i
))))
8755 regs_ever_clobbered
[EH_RETURN_DATA_REGNO (i
)] = 1;
8757 /* For nonlocal gotos all call-saved registers have to be saved.
8758 This flag is also set for the unwinding code in libgcc.
8759 See expand_builtin_unwind_init. For regs_ever_live this is done by
8761 if (crtl
->saves_all_registers
)
8762 for (i
= 0; i
< 32; i
++)
8763 if (!call_really_used_regs
[i
])
8764 regs_ever_clobbered
[i
] = 1;
8766 FOR_EACH_BB_FN (cur_bb
, cfun
)
8768 FOR_BB_INSNS (cur_bb
, cur_insn
)
8772 if (!INSN_P (cur_insn
))
8775 pat
= PATTERN (cur_insn
);
8777 /* Ignore GPR restore insns. */
8778 if (epilogue_completed
&& RTX_FRAME_RELATED_P (cur_insn
))
8780 if (GET_CODE (pat
) == SET
8781 && GENERAL_REG_P (SET_DEST (pat
)))
8784 if (GET_MODE (SET_SRC (pat
)) == DImode
8785 && FP_REG_P (SET_SRC (pat
)))
8789 if (GET_CODE (SET_SRC (pat
)) == MEM
)
8794 if (GET_CODE (pat
) == PARALLEL
8795 && load_multiple_operation (pat
, VOIDmode
))
8800 s390_reg_clobbered_rtx
,
8801 regs_ever_clobbered
);
8806 /* Determine the frame area which actually has to be accessed
8807 in the function epilogue. The values are stored at the
8808 given pointers AREA_BOTTOM (address of the lowest used stack
8809 address) and AREA_TOP (address of the first item which does
8810 not belong to the stack frame). */
8813 s390_frame_area (int *area_bottom
, int *area_top
)
8820 if (cfun_frame_layout
.first_restore_gpr
!= -1)
8822 b
= (cfun_frame_layout
.gprs_offset
8823 + cfun_frame_layout
.first_restore_gpr
* UNITS_PER_LONG
);
8824 t
= b
+ (cfun_frame_layout
.last_restore_gpr
8825 - cfun_frame_layout
.first_restore_gpr
+ 1) * UNITS_PER_LONG
;
8828 if (TARGET_64BIT
&& cfun_save_high_fprs_p
)
8830 b
= MIN (b
, cfun_frame_layout
.f8_offset
);
8831 t
= MAX (t
, (cfun_frame_layout
.f8_offset
8832 + cfun_frame_layout
.high_fprs
* 8));
8837 if (cfun_fpr_save_p (FPR4_REGNUM
))
8839 b
= MIN (b
, cfun_frame_layout
.f4_offset
);
8840 t
= MAX (t
, cfun_frame_layout
.f4_offset
+ 8);
8842 if (cfun_fpr_save_p (FPR6_REGNUM
))
8844 b
= MIN (b
, cfun_frame_layout
.f4_offset
+ 8);
8845 t
= MAX (t
, cfun_frame_layout
.f4_offset
+ 16);
8851 /* Update gpr_save_slots in the frame layout trying to make use of
8852 FPRs as GPR save slots.
8853 This is a helper routine of s390_register_info. */
8856 s390_register_info_gprtofpr ()
8858 int save_reg_slot
= FPR0_REGNUM
;
8861 if (!TARGET_Z10
|| !TARGET_HARD_FLOAT
|| !crtl
->is_leaf
)
8864 for (i
= 15; i
>= 6; i
--)
8866 if (cfun_gpr_save_slot (i
) == 0)
8869 /* Advance to the next FP register which can be used as a
8871 while ((!call_really_used_regs
[save_reg_slot
]
8872 || df_regs_ever_live_p (save_reg_slot
)
8873 || cfun_fpr_save_p (save_reg_slot
))
8874 && FP_REGNO_P (save_reg_slot
))
8876 if (!FP_REGNO_P (save_reg_slot
))
8878 /* We only want to use ldgr/lgdr if we can get rid of
8879 stm/lm entirely. So undo the gpr slot allocation in
8880 case we ran out of FPR save slots. */
8881 for (j
= 6; j
<= 15; j
++)
8882 if (FP_REGNO_P (cfun_gpr_save_slot (j
)))
8883 cfun_gpr_save_slot (j
) = -1;
8886 cfun_gpr_save_slot (i
) = save_reg_slot
++;
8890 /* Set the bits in fpr_bitmap for FPRs which need to be saved due to
8892 This is a helper routine for s390_register_info. */
8895 s390_register_info_stdarg_fpr ()
8901 /* Save the FP argument regs for stdarg. f0, f2 for 31 bit and
8902 f0-f4 for 64 bit. */
8904 || !TARGET_HARD_FLOAT
8905 || !cfun
->va_list_fpr_size
8906 || crtl
->args
.info
.fprs
>= FP_ARG_NUM_REG
)
8909 min_fpr
= crtl
->args
.info
.fprs
;
8910 max_fpr
= min_fpr
+ cfun
->va_list_fpr_size
;
8911 if (max_fpr
> FP_ARG_NUM_REG
)
8912 max_fpr
= FP_ARG_NUM_REG
;
8914 for (i
= min_fpr
; i
< max_fpr
; i
++)
8915 cfun_set_fpr_save (i
+ FPR0_REGNUM
);
8918 /* Reserve the GPR save slots for GPRs which need to be saved due to
8920 This is a helper routine for s390_register_info. */
8923 s390_register_info_stdarg_gpr ()
8930 || !cfun
->va_list_gpr_size
8931 || crtl
->args
.info
.gprs
>= GP_ARG_NUM_REG
)
8934 min_gpr
= crtl
->args
.info
.gprs
;
8935 max_gpr
= min_gpr
+ cfun
->va_list_gpr_size
;
8936 if (max_gpr
> GP_ARG_NUM_REG
)
8937 max_gpr
= GP_ARG_NUM_REG
;
8939 for (i
= min_gpr
; i
< max_gpr
; i
++)
8940 cfun_gpr_save_slot (2 + i
) = -1;
8943 /* The GPR and FPR save slots in cfun->machine->frame_layout are set
8944 for registers which need to be saved in function prologue.
8945 This function can be used until the insns emitted for save/restore
8946 of the regs are visible in the RTL stream. */
8949 s390_register_info ()
8952 char clobbered_regs
[32];
8954 gcc_assert (!epilogue_completed
);
8956 if (reload_completed
)
8957 /* After reload we rely on our own routine to determine which
8958 registers need saving. */
8959 s390_regs_ever_clobbered (clobbered_regs
);
8961 /* During reload we use regs_ever_live as a base since reload
8962 does changes in there which we otherwise would not be aware
8964 for (i
= 0; i
< 32; i
++)
8965 clobbered_regs
[i
] = df_regs_ever_live_p (i
);
8967 for (i
= 0; i
< 32; i
++)
8968 clobbered_regs
[i
] = clobbered_regs
[i
] && !global_regs
[i
];
8970 /* Mark the call-saved FPRs which need to be saved.
8971 This needs to be done before checking the special GPRs since the
8972 stack pointer usage depends on whether high FPRs have to be saved
8974 cfun_frame_layout
.fpr_bitmap
= 0;
8975 cfun_frame_layout
.high_fprs
= 0;
8976 for (i
= FPR0_REGNUM
; i
<= FPR15_REGNUM
; i
++)
8977 if (clobbered_regs
[i
] && !call_really_used_regs
[i
])
8979 cfun_set_fpr_save (i
);
8980 if (i
>= FPR8_REGNUM
)
8981 cfun_frame_layout
.high_fprs
++;
8985 clobbered_regs
[PIC_OFFSET_TABLE_REGNUM
]
8986 |= !!df_regs_ever_live_p (PIC_OFFSET_TABLE_REGNUM
);
8988 clobbered_regs
[BASE_REGNUM
]
8989 |= (cfun
->machine
->base_reg
8990 && REGNO (cfun
->machine
->base_reg
) == BASE_REGNUM
);
8992 clobbered_regs
[HARD_FRAME_POINTER_REGNUM
]
8993 |= !!frame_pointer_needed
;
8995 /* On pre z900 machines this might take until machine dependent
8997 save_return_addr_p will only be set on non-zarch machines so
8998 there is no risk that r14 goes into an FPR instead of a stack
9000 clobbered_regs
[RETURN_REGNUM
]
9002 || TARGET_TPF_PROFILING
9003 || cfun
->machine
->split_branches_pending_p
9004 || cfun_frame_layout
.save_return_addr_p
9005 || crtl
->calls_eh_return
);
9007 clobbered_regs
[STACK_POINTER_REGNUM
]
9009 || TARGET_TPF_PROFILING
9010 || cfun_save_high_fprs_p
9011 || get_frame_size () > 0
9012 || (reload_completed
&& cfun_frame_layout
.frame_size
> 0)
9013 || cfun
->calls_alloca
);
9015 memset (cfun_frame_layout
.gpr_save_slots
, 0, 16);
9017 for (i
= 6; i
< 16; i
++)
9018 if (clobbered_regs
[i
])
9019 cfun_gpr_save_slot (i
) = -1;
9021 s390_register_info_stdarg_fpr ();
9022 s390_register_info_gprtofpr ();
9024 /* First find the range of GPRs to be restored. Vararg regs don't
9025 need to be restored so we do it before assigning slots to the
9027 for (i
= 0; i
< 16 && cfun_gpr_save_slot (i
) != -1; i
++);
9028 for (j
= 15; j
> i
&& cfun_gpr_save_slot (j
) != -1; j
--);
9029 cfun_frame_layout
.first_restore_gpr
= (i
== 16) ? -1 : i
;
9030 cfun_frame_layout
.last_restore_gpr
= (i
== 16) ? -1 : j
;
9032 /* stdarg functions might need to save GPRs 2 to 6. This might
9033 override the GPR->FPR save decision made above for r6 since
9034 vararg regs must go to the stack. */
9035 s390_register_info_stdarg_gpr ();
9037 /* Now the range of GPRs which need saving. */
9038 for (i
= 0; i
< 16 && cfun_gpr_save_slot (i
) != -1; i
++);
9039 for (j
= 15; j
> i
&& cfun_gpr_save_slot (j
) != -1; j
--);
9040 cfun_frame_layout
.first_save_gpr
= (i
== 16) ? -1 : i
;
9041 cfun_frame_layout
.last_save_gpr
= (i
== 16) ? -1 : j
;
9044 /* This function is called by s390_optimize_prologue in order to get
9045 rid of unnecessary GPR save/restore instructions. The register info
9046 for the GPRs is re-computed and the ranges are re-calculated. */
9049 s390_optimize_register_info ()
9051 char clobbered_regs
[32];
9054 gcc_assert (epilogue_completed
);
9055 gcc_assert (!cfun
->machine
->split_branches_pending_p
);
9057 s390_regs_ever_clobbered (clobbered_regs
);
9059 for (i
= 0; i
< 32; i
++)
9060 clobbered_regs
[i
] = clobbered_regs
[i
] && !global_regs
[i
];
9062 /* There is still special treatment needed for cases invisible to
9063 s390_regs_ever_clobbered. */
9064 clobbered_regs
[RETURN_REGNUM
]
9065 |= (TARGET_TPF_PROFILING
9066 /* When expanding builtin_return_addr in ESA mode we do not
9067 know whether r14 will later be needed as scratch reg when
9068 doing branch splitting. So the builtin always accesses the
9069 r14 save slot and we need to stick to the save/restore
9070 decision for r14 even if it turns out that it didn't get
9072 || cfun_frame_layout
.save_return_addr_p
9073 || crtl
->calls_eh_return
);
9075 memset (cfun_frame_layout
.gpr_save_slots
, 0, 6);
9077 for (i
= 6; i
< 16; i
++)
9078 if (!clobbered_regs
[i
])
9079 cfun_gpr_save_slot (i
) = 0;
9081 for (i
= 0; i
< 16 && cfun_gpr_save_slot (i
) != -1; i
++);
9082 for (j
= 15; j
> i
&& cfun_gpr_save_slot (j
) != -1; j
--);
9083 cfun_frame_layout
.first_restore_gpr
= (i
== 16) ? -1 : i
;
9084 cfun_frame_layout
.last_restore_gpr
= (i
== 16) ? -1 : j
;
9086 s390_register_info_stdarg_gpr ();
9088 for (i
= 0; i
< 16 && cfun_gpr_save_slot (i
) != -1; i
++);
9089 for (j
= 15; j
> i
&& cfun_gpr_save_slot (j
) != -1; j
--);
9090 cfun_frame_layout
.first_save_gpr
= (i
== 16) ? -1 : i
;
9091 cfun_frame_layout
.last_save_gpr
= (i
== 16) ? -1 : j
;
9094 /* Fill cfun->machine with info about frame of current function. */
9097 s390_frame_info (void)
9099 HOST_WIDE_INT lowest_offset
;
9101 cfun_frame_layout
.first_save_gpr_slot
= cfun_frame_layout
.first_save_gpr
;
9102 cfun_frame_layout
.last_save_gpr_slot
= cfun_frame_layout
.last_save_gpr
;
9104 /* The va_arg builtin uses a constant distance of 16 *
9105 UNITS_PER_LONG (r0-r15) to reach the FPRs from the reg_save_area
9106 pointer. So even if we are going to save the stack pointer in an
9107 FPR we need the stack space in order to keep the offsets
9109 if (cfun
->stdarg
&& cfun_save_arg_fprs_p
)
9111 cfun_frame_layout
.last_save_gpr_slot
= STACK_POINTER_REGNUM
;
9113 if (cfun_frame_layout
.first_save_gpr_slot
== -1)
9114 cfun_frame_layout
.first_save_gpr_slot
= STACK_POINTER_REGNUM
;
9117 cfun_frame_layout
.frame_size
= get_frame_size ();
9118 if (!TARGET_64BIT
&& cfun_frame_layout
.frame_size
> 0x7fff0000)
9119 fatal_error (input_location
,
9120 "total size of local variables exceeds architecture limit");
9122 if (!TARGET_PACKED_STACK
)
9124 /* Fixed stack layout. */
9125 cfun_frame_layout
.backchain_offset
= 0;
9126 cfun_frame_layout
.f0_offset
= 16 * UNITS_PER_LONG
;
9127 cfun_frame_layout
.f4_offset
= cfun_frame_layout
.f0_offset
+ 2 * 8;
9128 cfun_frame_layout
.f8_offset
= -cfun_frame_layout
.high_fprs
* 8;
9129 cfun_frame_layout
.gprs_offset
= (cfun_frame_layout
.first_save_gpr_slot
9132 else if (TARGET_BACKCHAIN
)
9134 /* Kernel stack layout - packed stack, backchain, no float */
9135 gcc_assert (TARGET_SOFT_FLOAT
);
9136 cfun_frame_layout
.backchain_offset
= (STACK_POINTER_OFFSET
9139 /* The distance between the backchain and the return address
9140 save slot must not change. So we always need a slot for the
9141 stack pointer which resides in between. */
9142 cfun_frame_layout
.last_save_gpr_slot
= STACK_POINTER_REGNUM
;
9144 cfun_frame_layout
.gprs_offset
9145 = cfun_frame_layout
.backchain_offset
- cfun_gprs_save_area_size
;
9147 /* FPRs will not be saved. Nevertheless pick sane values to
9148 keep area calculations valid. */
9149 cfun_frame_layout
.f0_offset
=
9150 cfun_frame_layout
.f4_offset
=
9151 cfun_frame_layout
.f8_offset
= cfun_frame_layout
.gprs_offset
;
9157 /* Packed stack layout without backchain. */
9159 /* With stdarg FPRs need their dedicated slots. */
9160 num_fprs
= (TARGET_64BIT
&& cfun
->stdarg
? 2
9161 : (cfun_fpr_save_p (FPR4_REGNUM
) +
9162 cfun_fpr_save_p (FPR6_REGNUM
)));
9163 cfun_frame_layout
.f4_offset
= STACK_POINTER_OFFSET
- 8 * num_fprs
;
9165 num_fprs
= (cfun
->stdarg
? 2
9166 : (cfun_fpr_save_p (FPR0_REGNUM
)
9167 + cfun_fpr_save_p (FPR2_REGNUM
)));
9168 cfun_frame_layout
.f0_offset
= cfun_frame_layout
.f4_offset
- 8 * num_fprs
;
9170 cfun_frame_layout
.gprs_offset
9171 = cfun_frame_layout
.f0_offset
- cfun_gprs_save_area_size
;
9173 cfun_frame_layout
.f8_offset
= (cfun_frame_layout
.gprs_offset
9174 - cfun_frame_layout
.high_fprs
* 8);
9177 if (cfun_save_high_fprs_p
)
9178 cfun_frame_layout
.frame_size
+= cfun_frame_layout
.high_fprs
* 8;
9181 cfun_frame_layout
.frame_size
+= crtl
->outgoing_args_size
;
9183 /* In the following cases we have to allocate a STACK_POINTER_OFFSET
9184 sized area at the bottom of the stack. This is required also for
9185 leaf functions. When GCC generates a local stack reference it
9186 will always add STACK_POINTER_OFFSET to all these references. */
9188 && !TARGET_TPF_PROFILING
9189 && cfun_frame_layout
.frame_size
== 0
9190 && !cfun
->calls_alloca
)
9193 /* Calculate the number of bytes we have used in our own register
9194 save area. With the packed stack layout we can re-use the
9195 remaining bytes for normal stack elements. */
9197 if (TARGET_PACKED_STACK
)
9198 lowest_offset
= MIN (MIN (cfun_frame_layout
.f0_offset
,
9199 cfun_frame_layout
.f4_offset
),
9200 cfun_frame_layout
.gprs_offset
);
9204 if (TARGET_BACKCHAIN
)
9205 lowest_offset
= MIN (lowest_offset
, cfun_frame_layout
.backchain_offset
);
9207 cfun_frame_layout
.frame_size
+= STACK_POINTER_OFFSET
- lowest_offset
;
9209 /* If under 31 bit an odd number of gprs has to be saved we have to
9210 adjust the frame size to sustain 8 byte alignment of stack
9212 cfun_frame_layout
.frame_size
= ((cfun_frame_layout
.frame_size
+
9213 STACK_BOUNDARY
/ BITS_PER_UNIT
- 1)
9214 & ~(STACK_BOUNDARY
/ BITS_PER_UNIT
- 1));
9217 /* Generate frame layout. Fills in register and frame data for the current
9218 function in cfun->machine. This routine can be called multiple times;
9219 it will re-do the complete frame layout every time. */
9222 s390_init_frame_layout (void)
9224 HOST_WIDE_INT frame_size
;
9227 gcc_assert (!reload_completed
);
9229 /* On S/390 machines, we may need to perform branch splitting, which
9230 will require both base and return address register. We have no
9231 choice but to assume we're going to need them until right at the
9232 end of the machine dependent reorg phase. */
9233 if (!TARGET_CPU_ZARCH
)
9234 cfun
->machine
->split_branches_pending_p
= true;
9238 frame_size
= cfun_frame_layout
.frame_size
;
9240 /* Try to predict whether we'll need the base register. */
9241 base_used
= cfun
->machine
->split_branches_pending_p
9242 || crtl
->uses_const_pool
9243 || (!DISP_IN_RANGE (frame_size
)
9244 && !CONST_OK_FOR_K (frame_size
));
9246 /* Decide which register to use as literal pool base. In small
9247 leaf functions, try to use an unused call-clobbered register
9248 as base register to avoid save/restore overhead. */
9250 cfun
->machine
->base_reg
= NULL_RTX
;
9251 else if (crtl
->is_leaf
&& !df_regs_ever_live_p (5))
9252 cfun
->machine
->base_reg
= gen_rtx_REG (Pmode
, 5);
9254 cfun
->machine
->base_reg
= gen_rtx_REG (Pmode
, BASE_REGNUM
);
9256 s390_register_info ();
9259 while (frame_size
!= cfun_frame_layout
.frame_size
);
9262 /* Remove the FPR clobbers from a tbegin insn if it can be proven that
9263 the TX is nonescaping. A transaction is considered escaping if
9264 there is at least one path from tbegin returning CC0 to the
9265 function exit block without an tend.
9267 The check so far has some limitations:
9268 - only single tbegin/tend BBs are supported
9269 - the first cond jump after tbegin must separate the CC0 path from ~CC0
9270 - when CC is copied to a GPR and the CC0 check is done with the GPR
9271 this is not supported
9275 s390_optimize_nonescaping_tx (void)
9277 const unsigned int CC0
= 1 << 3;
9278 basic_block tbegin_bb
= NULL
;
9279 basic_block tend_bb
= NULL
;
9284 rtx_insn
*tbegin_insn
= NULL
;
9286 if (!cfun
->machine
->tbegin_p
)
9289 for (bb_index
= 0; bb_index
< n_basic_blocks_for_fn (cfun
); bb_index
++)
9291 bb
= BASIC_BLOCK_FOR_FN (cfun
, bb_index
);
9296 FOR_BB_INSNS (bb
, insn
)
9298 rtx ite
, cc
, pat
, target
;
9299 unsigned HOST_WIDE_INT mask
;
9301 if (!INSN_P (insn
) || INSN_CODE (insn
) <= 0)
9304 pat
= PATTERN (insn
);
9306 if (GET_CODE (pat
) == PARALLEL
)
9307 pat
= XVECEXP (pat
, 0, 0);
9309 if (GET_CODE (pat
) != SET
9310 || GET_CODE (SET_SRC (pat
)) != UNSPEC_VOLATILE
)
9313 if (XINT (SET_SRC (pat
), 1) == UNSPECV_TBEGIN
)
9319 /* Just return if the tbegin doesn't have clobbers. */
9320 if (GET_CODE (PATTERN (insn
)) != PARALLEL
)
9323 if (tbegin_bb
!= NULL
)
9326 /* Find the next conditional jump. */
9327 for (tmp
= NEXT_INSN (insn
);
9329 tmp
= NEXT_INSN (tmp
))
9331 if (reg_set_p (gen_rtx_REG (CCmode
, CC_REGNUM
), tmp
))
9336 ite
= SET_SRC (PATTERN (tmp
));
9337 if (GET_CODE (ite
) != IF_THEN_ELSE
)
9340 cc
= XEXP (XEXP (ite
, 0), 0);
9341 if (!REG_P (cc
) || !CC_REGNO_P (REGNO (cc
))
9342 || GET_MODE (cc
) != CCRAWmode
9343 || GET_CODE (XEXP (XEXP (ite
, 0), 1)) != CONST_INT
)
9346 if (bb
->succs
->length () != 2)
9349 mask
= INTVAL (XEXP (XEXP (ite
, 0), 1));
9350 if (GET_CODE (XEXP (ite
, 0)) == NE
)
9354 target
= XEXP (ite
, 1);
9355 else if (mask
== (CC0
^ 0xf))
9356 target
= XEXP (ite
, 2);
9364 ei
= ei_start (bb
->succs
);
9365 e1
= ei_safe_edge (ei
);
9367 e2
= ei_safe_edge (ei
);
9369 if (e2
->flags
& EDGE_FALLTHRU
)
9372 e1
= ei_safe_edge (ei
);
9375 if (!(e1
->flags
& EDGE_FALLTHRU
))
9378 tbegin_bb
= (target
== pc_rtx
) ? e1
->dest
: e2
->dest
;
9380 if (tmp
== BB_END (bb
))
9385 if (XINT (SET_SRC (pat
), 1) == UNSPECV_TEND
)
9387 if (tend_bb
!= NULL
)
9394 /* Either we successfully remove the FPR clobbers here or we are not
9395 able to do anything for this TX. Both cases don't qualify for
9397 cfun
->machine
->tbegin_p
= false;
9399 if (tbegin_bb
== NULL
|| tend_bb
== NULL
)
9402 calculate_dominance_info (CDI_POST_DOMINATORS
);
9403 result
= dominated_by_p (CDI_POST_DOMINATORS
, tbegin_bb
, tend_bb
);
9404 free_dominance_info (CDI_POST_DOMINATORS
);
9409 PATTERN (tbegin_insn
) = gen_rtx_PARALLEL (VOIDmode
,
9411 XVECEXP (PATTERN (tbegin_insn
), 0, 0),
9412 XVECEXP (PATTERN (tbegin_insn
), 0, 1)));
9413 INSN_CODE (tbegin_insn
) = -1;
9414 df_insn_rescan (tbegin_insn
);
9419 /* Return true if it is legal to put a value with MODE into REGNO. */
9422 s390_hard_regno_mode_ok (unsigned int regno
, machine_mode mode
)
9424 if (!TARGET_VX
&& VECTOR_NOFP_REGNO_P (regno
))
9427 switch (REGNO_REG_CLASS (regno
))
9430 return ((GET_MODE_CLASS (mode
) == MODE_INT
9431 && s390_class_max_nregs (VEC_REGS
, mode
) == 1)
9433 || s390_vector_mode_supported_p (mode
));
9437 && ((GET_MODE_CLASS (mode
) == MODE_INT
9438 && s390_class_max_nregs (FP_REGS
, mode
) == 1)
9440 || s390_vector_mode_supported_p (mode
)))
9443 if (REGNO_PAIR_OK (regno
, mode
))
9445 if (mode
== SImode
|| mode
== DImode
)
9448 if (FLOAT_MODE_P (mode
) && GET_MODE_CLASS (mode
) != MODE_VECTOR_FLOAT
)
9453 if (FRAME_REGNO_P (regno
) && mode
== Pmode
)
9458 if (REGNO_PAIR_OK (regno
, mode
))
9461 || (mode
!= TFmode
&& mode
!= TCmode
&& mode
!= TDmode
))
9466 if (GET_MODE_CLASS (mode
) == MODE_CC
)
9470 if (REGNO_PAIR_OK (regno
, mode
))
9472 if (mode
== SImode
|| mode
== Pmode
)
9483 /* Return nonzero if register OLD_REG can be renamed to register NEW_REG. */
9486 s390_hard_regno_rename_ok (unsigned int old_reg
, unsigned int new_reg
)
9488 /* Once we've decided upon a register to use as base register, it must
9489 no longer be used for any other purpose. */
9490 if (cfun
->machine
->base_reg
)
9491 if (REGNO (cfun
->machine
->base_reg
) == old_reg
9492 || REGNO (cfun
->machine
->base_reg
) == new_reg
)
9495 /* Prevent regrename from using call-saved regs which haven't
9496 actually been saved. This is necessary since regrename assumes
9497 the backend save/restore decisions are based on
9498 df_regs_ever_live. Since we have our own routine we have to tell
9499 regrename manually about it. */
9500 if (GENERAL_REGNO_P (new_reg
)
9501 && !call_really_used_regs
[new_reg
]
9502 && cfun_gpr_save_slot (new_reg
) == 0)
9508 /* Return nonzero if register REGNO can be used as a scratch register
9512 s390_hard_regno_scratch_ok (unsigned int regno
)
9514 /* See s390_hard_regno_rename_ok. */
9515 if (GENERAL_REGNO_P (regno
)
9516 && !call_really_used_regs
[regno
]
9517 && cfun_gpr_save_slot (regno
) == 0)
9523 /* Maximum number of registers to represent a value of mode MODE
9524 in a register of class RCLASS. */
9527 s390_class_max_nregs (enum reg_class rclass
, machine_mode mode
)
9530 bool reg_pair_required_p
= false;
9536 reg_size
= TARGET_VX
? 16 : 8;
9538 /* TF and TD modes would fit into a VR but we put them into a
9539 register pair since we do not have 128bit FP instructions on
9542 && SCALAR_FLOAT_MODE_P (mode
)
9543 && GET_MODE_SIZE (mode
) >= 16)
9544 reg_pair_required_p
= true;
9546 /* Even if complex types would fit into a single FPR/VR we force
9547 them into a register pair to deal with the parts more easily.
9548 (FIXME: What about complex ints?) */
9549 if (GET_MODE_CLASS (mode
) == MODE_COMPLEX_FLOAT
)
9550 reg_pair_required_p
= true;
9556 reg_size
= UNITS_PER_WORD
;
9560 if (reg_pair_required_p
)
9561 return 2 * ((GET_MODE_SIZE (mode
) / 2 + reg_size
- 1) / reg_size
);
9563 return (GET_MODE_SIZE (mode
) + reg_size
- 1) / reg_size
;
9566 /* Return TRUE if changing mode from FROM to TO should not be allowed
9567 for register class CLASS. */
9570 s390_cannot_change_mode_class (machine_mode from_mode
,
9571 machine_mode to_mode
,
9572 enum reg_class rclass
)
9574 machine_mode small_mode
;
9575 machine_mode big_mode
;
9577 if (GET_MODE_SIZE (from_mode
) == GET_MODE_SIZE (to_mode
))
9580 if (GET_MODE_SIZE (from_mode
) < GET_MODE_SIZE (to_mode
))
9582 small_mode
= from_mode
;
9587 small_mode
= to_mode
;
9588 big_mode
= from_mode
;
9591 /* Values residing in VRs are little-endian style. All modes are
9592 placed left-aligned in an VR. This means that we cannot allow
9593 switching between modes with differing sizes. Also if the vector
9594 facility is available we still place TFmode values in VR register
9595 pairs, since the only instructions we have operating on TFmodes
9596 only deal with register pairs. Therefore we have to allow DFmode
9597 subregs of TFmodes to enable the TFmode splitters. */
9598 if (reg_classes_intersect_p (VEC_REGS
, rclass
)
9599 && (GET_MODE_SIZE (small_mode
) < 8
9600 || s390_class_max_nregs (VEC_REGS
, big_mode
) == 1))
9603 /* Likewise for access registers, since they have only half the
9604 word size on 64-bit. */
9605 if (reg_classes_intersect_p (ACCESS_REGS
, rclass
))
9611 /* Return true if we use LRA instead of reload pass. */
9615 return s390_lra_flag
;
9618 /* Return true if register FROM can be eliminated via register TO. */
9621 s390_can_eliminate (const int from
, const int to
)
9623 /* On zSeries machines, we have not marked the base register as fixed.
9624 Instead, we have an elimination rule BASE_REGNUM -> BASE_REGNUM.
9625 If a function requires the base register, we say here that this
9626 elimination cannot be performed. This will cause reload to free
9627 up the base register (as if it were fixed). On the other hand,
9628 if the current function does *not* require the base register, we
9629 say here the elimination succeeds, which in turn allows reload
9630 to allocate the base register for any other purpose. */
9631 if (from
== BASE_REGNUM
&& to
== BASE_REGNUM
)
9633 if (TARGET_CPU_ZARCH
)
9635 s390_init_frame_layout ();
9636 return cfun
->machine
->base_reg
== NULL_RTX
;
9642 /* Everything else must point into the stack frame. */
9643 gcc_assert (to
== STACK_POINTER_REGNUM
9644 || to
== HARD_FRAME_POINTER_REGNUM
);
9646 gcc_assert (from
== FRAME_POINTER_REGNUM
9647 || from
== ARG_POINTER_REGNUM
9648 || from
== RETURN_ADDRESS_POINTER_REGNUM
);
9650 /* Make sure we actually saved the return address. */
9651 if (from
== RETURN_ADDRESS_POINTER_REGNUM
)
9652 if (!crtl
->calls_eh_return
9654 && !cfun_frame_layout
.save_return_addr_p
)
9660 /* Return offset between register FROM and TO initially after prolog. */
9663 s390_initial_elimination_offset (int from
, int to
)
9665 HOST_WIDE_INT offset
;
9667 /* ??? Why are we called for non-eliminable pairs? */
9668 if (!s390_can_eliminate (from
, to
))
9673 case FRAME_POINTER_REGNUM
:
9674 offset
= (get_frame_size()
9675 + STACK_POINTER_OFFSET
9676 + crtl
->outgoing_args_size
);
9679 case ARG_POINTER_REGNUM
:
9680 s390_init_frame_layout ();
9681 offset
= cfun_frame_layout
.frame_size
+ STACK_POINTER_OFFSET
;
9684 case RETURN_ADDRESS_POINTER_REGNUM
:
9685 s390_init_frame_layout ();
9687 if (cfun_frame_layout
.first_save_gpr_slot
== -1)
9689 /* If it turns out that for stdarg nothing went into the reg
9690 save area we also do not need the return address
9692 if (cfun
->stdarg
&& !cfun_save_arg_fprs_p
)
9698 /* In order to make the following work it is not necessary for
9699 r14 to have a save slot. It is sufficient if one other GPR
9700 got one. Since the GPRs are always stored without gaps we
9701 are able to calculate where the r14 save slot would
9703 offset
= (cfun_frame_layout
.frame_size
+ cfun_frame_layout
.gprs_offset
+
9704 (RETURN_REGNUM
- cfun_frame_layout
.first_save_gpr_slot
) *
9719 /* Emit insn to save fpr REGNUM at offset OFFSET relative
9720 to register BASE. Return generated insn. */
9723 save_fpr (rtx base
, int offset
, int regnum
)
9726 addr
= gen_rtx_MEM (DFmode
, plus_constant (Pmode
, base
, offset
));
9728 if (regnum
>= 16 && regnum
<= (16 + FP_ARG_NUM_REG
))
9729 set_mem_alias_set (addr
, get_varargs_alias_set ());
9731 set_mem_alias_set (addr
, get_frame_alias_set ());
9733 return emit_move_insn (addr
, gen_rtx_REG (DFmode
, regnum
));
9736 /* Emit insn to restore fpr REGNUM from offset OFFSET relative
9737 to register BASE. Return generated insn. */
9740 restore_fpr (rtx base
, int offset
, int regnum
)
9743 addr
= gen_rtx_MEM (DFmode
, plus_constant (Pmode
, base
, offset
));
9744 set_mem_alias_set (addr
, get_frame_alias_set ());
9746 return emit_move_insn (gen_rtx_REG (DFmode
, regnum
), addr
);
9749 /* Return true if REGNO is a global register, but not one
9750 of the special ones that need to be saved/restored in anyway. */
9753 global_not_special_regno_p (int regno
)
9755 return (global_regs
[regno
]
9756 /* These registers are special and need to be
9757 restored in any case. */
9758 && !(regno
== STACK_POINTER_REGNUM
9759 || regno
== RETURN_REGNUM
9760 || regno
== BASE_REGNUM
9761 || (flag_pic
&& regno
== (int)PIC_OFFSET_TABLE_REGNUM
)));
9764 /* Generate insn to save registers FIRST to LAST into
9765 the register save area located at offset OFFSET
9766 relative to register BASE. */
9769 save_gprs (rtx base
, int offset
, int first
, int last
)
9771 rtx addr
, insn
, note
;
9774 addr
= plus_constant (Pmode
, base
, offset
);
9775 addr
= gen_rtx_MEM (Pmode
, addr
);
9777 set_mem_alias_set (addr
, get_frame_alias_set ());
9779 /* Special-case single register. */
9783 insn
= gen_movdi (addr
, gen_rtx_REG (Pmode
, first
));
9785 insn
= gen_movsi (addr
, gen_rtx_REG (Pmode
, first
));
9787 if (!global_not_special_regno_p (first
))
9788 RTX_FRAME_RELATED_P (insn
) = 1;
9793 insn
= gen_store_multiple (addr
,
9794 gen_rtx_REG (Pmode
, first
),
9795 GEN_INT (last
- first
+ 1));
9797 if (first
<= 6 && cfun
->stdarg
)
9798 for (i
= 0; i
< XVECLEN (PATTERN (insn
), 0); i
++)
9800 rtx mem
= XEXP (XVECEXP (PATTERN (insn
), 0, i
), 0);
9803 set_mem_alias_set (mem
, get_varargs_alias_set ());
9806 /* We need to set the FRAME_RELATED flag on all SETs
9807 inside the store-multiple pattern.
9809 However, we must not emit DWARF records for registers 2..5
9810 if they are stored for use by variable arguments ...
9812 ??? Unfortunately, it is not enough to simply not the
9813 FRAME_RELATED flags for those SETs, because the first SET
9814 of the PARALLEL is always treated as if it had the flag
9815 set, even if it does not. Therefore we emit a new pattern
9816 without those registers as REG_FRAME_RELATED_EXPR note. */
9818 if (first
>= 6 && !global_not_special_regno_p (first
))
9820 rtx pat
= PATTERN (insn
);
9822 for (i
= 0; i
< XVECLEN (pat
, 0); i
++)
9823 if (GET_CODE (XVECEXP (pat
, 0, i
)) == SET
9824 && !global_not_special_regno_p (REGNO (SET_SRC (XVECEXP (pat
,
9826 RTX_FRAME_RELATED_P (XVECEXP (pat
, 0, i
)) = 1;
9828 RTX_FRAME_RELATED_P (insn
) = 1;
9834 for (start
= first
>= 6 ? first
: 6; start
<= last
; start
++)
9835 if (!global_not_special_regno_p (start
))
9841 addr
= plus_constant (Pmode
, base
,
9842 offset
+ (start
- first
) * UNITS_PER_LONG
);
9847 note
= gen_movdi (gen_rtx_MEM (Pmode
, addr
),
9848 gen_rtx_REG (Pmode
, start
));
9850 note
= gen_movsi (gen_rtx_MEM (Pmode
, addr
),
9851 gen_rtx_REG (Pmode
, start
));
9852 note
= PATTERN (note
);
9854 add_reg_note (insn
, REG_FRAME_RELATED_EXPR
, note
);
9855 RTX_FRAME_RELATED_P (insn
) = 1;
9860 note
= gen_store_multiple (gen_rtx_MEM (Pmode
, addr
),
9861 gen_rtx_REG (Pmode
, start
),
9862 GEN_INT (last
- start
+ 1));
9863 note
= PATTERN (note
);
9865 add_reg_note (insn
, REG_FRAME_RELATED_EXPR
, note
);
9867 for (i
= 0; i
< XVECLEN (note
, 0); i
++)
9868 if (GET_CODE (XVECEXP (note
, 0, i
)) == SET
9869 && !global_not_special_regno_p (REGNO (SET_SRC (XVECEXP (note
,
9871 RTX_FRAME_RELATED_P (XVECEXP (note
, 0, i
)) = 1;
9873 RTX_FRAME_RELATED_P (insn
) = 1;
9879 /* Generate insn to restore registers FIRST to LAST from
9880 the register save area located at offset OFFSET
9881 relative to register BASE. */
9884 restore_gprs (rtx base
, int offset
, int first
, int last
)
9888 addr
= plus_constant (Pmode
, base
, offset
);
9889 addr
= gen_rtx_MEM (Pmode
, addr
);
9890 set_mem_alias_set (addr
, get_frame_alias_set ());
9892 /* Special-case single register. */
9896 insn
= gen_movdi (gen_rtx_REG (Pmode
, first
), addr
);
9898 insn
= gen_movsi (gen_rtx_REG (Pmode
, first
), addr
);
9900 RTX_FRAME_RELATED_P (insn
) = 1;
9904 insn
= gen_load_multiple (gen_rtx_REG (Pmode
, first
),
9906 GEN_INT (last
- first
+ 1));
9907 RTX_FRAME_RELATED_P (insn
) = 1;
9911 /* Return insn sequence to load the GOT register. */
9913 static GTY(()) rtx got_symbol
;
9915 s390_load_got (void)
9919 /* We cannot use pic_offset_table_rtx here since we use this
9920 function also for non-pic if __tls_get_offset is called and in
9921 that case PIC_OFFSET_TABLE_REGNUM as well as pic_offset_table_rtx
9923 rtx got_rtx
= gen_rtx_REG (Pmode
, 12);
9927 got_symbol
= gen_rtx_SYMBOL_REF (Pmode
, "_GLOBAL_OFFSET_TABLE_");
9928 SYMBOL_REF_FLAGS (got_symbol
) = SYMBOL_FLAG_LOCAL
;
9933 if (TARGET_CPU_ZARCH
)
9935 emit_move_insn (got_rtx
, got_symbol
);
9941 offset
= gen_rtx_UNSPEC (Pmode
, gen_rtvec (1, got_symbol
),
9942 UNSPEC_LTREL_OFFSET
);
9943 offset
= gen_rtx_CONST (Pmode
, offset
);
9944 offset
= force_const_mem (Pmode
, offset
);
9946 emit_move_insn (got_rtx
, offset
);
9948 offset
= gen_rtx_UNSPEC (Pmode
, gen_rtvec (1, XEXP (offset
, 0)),
9950 offset
= gen_rtx_PLUS (Pmode
, got_rtx
, offset
);
9952 emit_move_insn (got_rtx
, offset
);
9955 insns
= get_insns ();
9960 /* This ties together stack memory (MEM with an alias set of frame_alias_set)
9961 and the change to the stack pointer. */
9964 s390_emit_stack_tie (void)
9966 rtx mem
= gen_frame_mem (BLKmode
,
9967 gen_rtx_REG (Pmode
, STACK_POINTER_REGNUM
));
9969 emit_insn (gen_stack_tie (mem
));
9972 /* Copy GPRS into FPR save slots. */
9975 s390_save_gprs_to_fprs (void)
9979 if (!TARGET_Z10
|| !TARGET_HARD_FLOAT
|| !crtl
->is_leaf
)
9982 for (i
= 6; i
< 16; i
++)
9984 if (FP_REGNO_P (cfun_gpr_save_slot (i
)))
9987 emit_move_insn (gen_rtx_REG (DImode
, cfun_gpr_save_slot (i
)),
9988 gen_rtx_REG (DImode
, i
));
9989 RTX_FRAME_RELATED_P (insn
) = 1;
9994 /* Restore GPRs from FPR save slots. */
9997 s390_restore_gprs_from_fprs (void)
10001 if (!TARGET_Z10
|| !TARGET_HARD_FLOAT
|| !crtl
->is_leaf
)
10004 for (i
= 6; i
< 16; i
++)
10006 if (FP_REGNO_P (cfun_gpr_save_slot (i
)))
10009 emit_move_insn (gen_rtx_REG (DImode
, i
),
10010 gen_rtx_REG (DImode
, cfun_gpr_save_slot (i
)));
10011 df_set_regs_ever_live (i
, true);
10012 add_reg_note (insn
, REG_CFA_RESTORE
, gen_rtx_REG (DImode
, i
));
10013 if (i
== STACK_POINTER_REGNUM
)
10014 add_reg_note (insn
, REG_CFA_DEF_CFA
,
10015 plus_constant (Pmode
, stack_pointer_rtx
,
10016 STACK_POINTER_OFFSET
));
10017 RTX_FRAME_RELATED_P (insn
) = 1;
10023 /* A pass run immediately before shrink-wrapping and prologue and epilogue
10028 const pass_data pass_data_s390_early_mach
=
10030 RTL_PASS
, /* type */
10031 "early_mach", /* name */
10032 OPTGROUP_NONE
, /* optinfo_flags */
10033 TV_MACH_DEP
, /* tv_id */
10034 0, /* properties_required */
10035 0, /* properties_provided */
10036 0, /* properties_destroyed */
10037 0, /* todo_flags_start */
10038 ( TODO_df_verify
| TODO_df_finish
), /* todo_flags_finish */
10041 class pass_s390_early_mach
: public rtl_opt_pass
10044 pass_s390_early_mach (gcc::context
*ctxt
)
10045 : rtl_opt_pass (pass_data_s390_early_mach
, ctxt
)
10048 /* opt_pass methods: */
10049 virtual unsigned int execute (function
*);
10051 }; // class pass_s390_early_mach
10054 pass_s390_early_mach::execute (function
*fun
)
10058 /* Try to get rid of the FPR clobbers. */
10059 s390_optimize_nonescaping_tx ();
10061 /* Re-compute register info. */
10062 s390_register_info ();
10064 /* If we're using a base register, ensure that it is always valid for
10065 the first non-prologue instruction. */
10066 if (fun
->machine
->base_reg
)
10067 emit_insn_at_entry (gen_main_pool (fun
->machine
->base_reg
));
10069 /* Annotate all constant pool references to let the scheduler know
10070 they implicitly use the base register. */
10071 for (insn
= get_insns (); insn
; insn
= NEXT_INSN (insn
))
10074 annotate_constant_pool_refs (&PATTERN (insn
));
10075 df_insn_rescan (insn
);
10080 } // anon namespace
10082 /* Expand the prologue into a bunch of separate insns. */
10085 s390_emit_prologue (void)
10093 /* Choose best register to use for temp use within prologue.
10094 See below for why TPF must use the register 1. */
10096 if (!has_hard_reg_initial_val (Pmode
, RETURN_REGNUM
)
10098 && !TARGET_TPF_PROFILING
)
10099 temp_reg
= gen_rtx_REG (Pmode
, RETURN_REGNUM
);
10101 temp_reg
= gen_rtx_REG (Pmode
, 1);
10103 s390_save_gprs_to_fprs ();
10105 /* Save call saved gprs. */
10106 if (cfun_frame_layout
.first_save_gpr
!= -1)
10108 insn
= save_gprs (stack_pointer_rtx
,
10109 cfun_frame_layout
.gprs_offset
+
10110 UNITS_PER_LONG
* (cfun_frame_layout
.first_save_gpr
10111 - cfun_frame_layout
.first_save_gpr_slot
),
10112 cfun_frame_layout
.first_save_gpr
,
10113 cfun_frame_layout
.last_save_gpr
);
10117 /* Dummy insn to mark literal pool slot. */
10119 if (cfun
->machine
->base_reg
)
10120 emit_insn (gen_main_pool (cfun
->machine
->base_reg
));
10122 offset
= cfun_frame_layout
.f0_offset
;
10124 /* Save f0 and f2. */
10125 for (i
= FPR0_REGNUM
; i
<= FPR0_REGNUM
+ 1; i
++)
10127 if (cfun_fpr_save_p (i
))
10129 save_fpr (stack_pointer_rtx
, offset
, i
);
10132 else if (!TARGET_PACKED_STACK
|| cfun
->stdarg
)
10136 /* Save f4 and f6. */
10137 offset
= cfun_frame_layout
.f4_offset
;
10138 for (i
= FPR4_REGNUM
; i
<= FPR4_REGNUM
+ 1; i
++)
10140 if (cfun_fpr_save_p (i
))
10142 insn
= save_fpr (stack_pointer_rtx
, offset
, i
);
10145 /* If f4 and f6 are call clobbered they are saved due to
10146 stdargs and therefore are not frame related. */
10147 if (!call_really_used_regs
[i
])
10148 RTX_FRAME_RELATED_P (insn
) = 1;
10150 else if (!TARGET_PACKED_STACK
|| call_really_used_regs
[i
])
10154 if (TARGET_PACKED_STACK
10155 && cfun_save_high_fprs_p
10156 && cfun_frame_layout
.f8_offset
+ cfun_frame_layout
.high_fprs
* 8 > 0)
10158 offset
= (cfun_frame_layout
.f8_offset
10159 + (cfun_frame_layout
.high_fprs
- 1) * 8);
10161 for (i
= FPR15_REGNUM
; i
>= FPR8_REGNUM
&& offset
>= 0; i
--)
10162 if (cfun_fpr_save_p (i
))
10164 insn
= save_fpr (stack_pointer_rtx
, offset
, i
);
10166 RTX_FRAME_RELATED_P (insn
) = 1;
10169 if (offset
>= cfun_frame_layout
.f8_offset
)
10173 if (!TARGET_PACKED_STACK
)
10174 next_fpr
= cfun_save_high_fprs_p
? FPR15_REGNUM
: 0;
10176 if (flag_stack_usage_info
)
10177 current_function_static_stack_size
= cfun_frame_layout
.frame_size
;
10179 /* Decrement stack pointer. */
10181 if (cfun_frame_layout
.frame_size
> 0)
10183 rtx frame_off
= GEN_INT (-cfun_frame_layout
.frame_size
);
10184 rtx real_frame_off
;
10186 if (s390_stack_size
)
10188 HOST_WIDE_INT stack_guard
;
10190 if (s390_stack_guard
)
10191 stack_guard
= s390_stack_guard
;
10194 /* If no value for stack guard is provided the smallest power of 2
10195 larger than the current frame size is chosen. */
10197 while (stack_guard
< cfun_frame_layout
.frame_size
)
10201 if (cfun_frame_layout
.frame_size
>= s390_stack_size
)
10203 warning (0, "frame size of function %qs is %wd"
10204 " bytes exceeding user provided stack limit of "
10206 "An unconditional trap is added.",
10207 current_function_name(), cfun_frame_layout
.frame_size
,
10209 emit_insn (gen_trap ());
10213 /* stack_guard has to be smaller than s390_stack_size.
10214 Otherwise we would emit an AND with zero which would
10215 not match the test under mask pattern. */
10216 if (stack_guard
>= s390_stack_size
)
10218 warning (0, "frame size of function %qs is %wd"
10219 " bytes which is more than half the stack size. "
10220 "The dynamic check would not be reliable. "
10221 "No check emitted for this function.",
10222 current_function_name(),
10223 cfun_frame_layout
.frame_size
);
10227 HOST_WIDE_INT stack_check_mask
= ((s390_stack_size
- 1)
10228 & ~(stack_guard
- 1));
10230 rtx t
= gen_rtx_AND (Pmode
, stack_pointer_rtx
,
10231 GEN_INT (stack_check_mask
));
10233 emit_insn (gen_ctrapdi4 (gen_rtx_EQ (VOIDmode
,
10235 t
, const0_rtx
, const0_rtx
));
10237 emit_insn (gen_ctrapsi4 (gen_rtx_EQ (VOIDmode
,
10239 t
, const0_rtx
, const0_rtx
));
10244 if (s390_warn_framesize
> 0
10245 && cfun_frame_layout
.frame_size
>= s390_warn_framesize
)
10246 warning (0, "frame size of %qs is %wd bytes",
10247 current_function_name (), cfun_frame_layout
.frame_size
);
10249 if (s390_warn_dynamicstack_p
&& cfun
->calls_alloca
)
10250 warning (0, "%qs uses dynamic stack allocation", current_function_name ());
10252 /* Save incoming stack pointer into temp reg. */
10253 if (TARGET_BACKCHAIN
|| next_fpr
)
10254 insn
= emit_insn (gen_move_insn (temp_reg
, stack_pointer_rtx
));
10256 /* Subtract frame size from stack pointer. */
10258 if (DISP_IN_RANGE (INTVAL (frame_off
)))
10260 insn
= gen_rtx_SET (stack_pointer_rtx
,
10261 gen_rtx_PLUS (Pmode
, stack_pointer_rtx
,
10263 insn
= emit_insn (insn
);
10267 if (!CONST_OK_FOR_K (INTVAL (frame_off
)))
10268 frame_off
= force_const_mem (Pmode
, frame_off
);
10270 insn
= emit_insn (gen_add2_insn (stack_pointer_rtx
, frame_off
));
10271 annotate_constant_pool_refs (&PATTERN (insn
));
10274 RTX_FRAME_RELATED_P (insn
) = 1;
10275 real_frame_off
= GEN_INT (-cfun_frame_layout
.frame_size
);
10276 add_reg_note (insn
, REG_FRAME_RELATED_EXPR
,
10277 gen_rtx_SET (stack_pointer_rtx
,
10278 gen_rtx_PLUS (Pmode
, stack_pointer_rtx
,
10281 /* Set backchain. */
10283 if (TARGET_BACKCHAIN
)
10285 if (cfun_frame_layout
.backchain_offset
)
10286 addr
= gen_rtx_MEM (Pmode
,
10287 plus_constant (Pmode
, stack_pointer_rtx
,
10288 cfun_frame_layout
.backchain_offset
));
10290 addr
= gen_rtx_MEM (Pmode
, stack_pointer_rtx
);
10291 set_mem_alias_set (addr
, get_frame_alias_set ());
10292 insn
= emit_insn (gen_move_insn (addr
, temp_reg
));
10295 /* If we support non-call exceptions (e.g. for Java),
10296 we need to make sure the backchain pointer is set up
10297 before any possibly trapping memory access. */
10298 if (TARGET_BACKCHAIN
&& cfun
->can_throw_non_call_exceptions
)
10300 addr
= gen_rtx_MEM (BLKmode
, gen_rtx_SCRATCH (VOIDmode
));
10301 emit_clobber (addr
);
10305 /* Save fprs 8 - 15 (64 bit ABI). */
10307 if (cfun_save_high_fprs_p
&& next_fpr
)
10309 /* If the stack might be accessed through a different register
10310 we have to make sure that the stack pointer decrement is not
10311 moved below the use of the stack slots. */
10312 s390_emit_stack_tie ();
10314 insn
= emit_insn (gen_add2_insn (temp_reg
,
10315 GEN_INT (cfun_frame_layout
.f8_offset
)));
10319 for (i
= FPR8_REGNUM
; i
<= next_fpr
; i
++)
10320 if (cfun_fpr_save_p (i
))
10322 rtx addr
= plus_constant (Pmode
, stack_pointer_rtx
,
10323 cfun_frame_layout
.frame_size
10324 + cfun_frame_layout
.f8_offset
10327 insn
= save_fpr (temp_reg
, offset
, i
);
10329 RTX_FRAME_RELATED_P (insn
) = 1;
10330 add_reg_note (insn
, REG_FRAME_RELATED_EXPR
,
10331 gen_rtx_SET (gen_rtx_MEM (DFmode
, addr
),
10332 gen_rtx_REG (DFmode
, i
)));
10336 /* Set frame pointer, if needed. */
10338 if (frame_pointer_needed
)
10340 insn
= emit_move_insn (hard_frame_pointer_rtx
, stack_pointer_rtx
);
10341 RTX_FRAME_RELATED_P (insn
) = 1;
10344 /* Set up got pointer, if needed. */
10346 if (flag_pic
&& df_regs_ever_live_p (PIC_OFFSET_TABLE_REGNUM
))
10348 rtx_insn
*insns
= s390_load_got ();
10350 for (rtx_insn
*insn
= insns
; insn
; insn
= NEXT_INSN (insn
))
10351 annotate_constant_pool_refs (&PATTERN (insn
));
10356 if (TARGET_TPF_PROFILING
)
10358 /* Generate a BAS instruction to serve as a function
10359 entry intercept to facilitate the use of tracing
10360 algorithms located at the branch target. */
10361 emit_insn (gen_prologue_tpf ());
10363 /* Emit a blockage here so that all code
10364 lies between the profiling mechanisms. */
10365 emit_insn (gen_blockage ());
10369 /* Expand the epilogue into a bunch of separate insns. */
10372 s390_emit_epilogue (bool sibcall
)
10374 rtx frame_pointer
, return_reg
, cfa_restores
= NULL_RTX
;
10375 int area_bottom
, area_top
, offset
= 0;
10380 if (TARGET_TPF_PROFILING
)
10383 /* Generate a BAS instruction to serve as a function
10384 entry intercept to facilitate the use of tracing
10385 algorithms located at the branch target. */
10387 /* Emit a blockage here so that all code
10388 lies between the profiling mechanisms. */
10389 emit_insn (gen_blockage ());
10391 emit_insn (gen_epilogue_tpf ());
10394 /* Check whether to use frame or stack pointer for restore. */
10396 frame_pointer
= (frame_pointer_needed
10397 ? hard_frame_pointer_rtx
: stack_pointer_rtx
);
10399 s390_frame_area (&area_bottom
, &area_top
);
10401 /* Check whether we can access the register save area.
10402 If not, increment the frame pointer as required. */
10404 if (area_top
<= area_bottom
)
10406 /* Nothing to restore. */
10408 else if (DISP_IN_RANGE (cfun_frame_layout
.frame_size
+ area_bottom
)
10409 && DISP_IN_RANGE (cfun_frame_layout
.frame_size
+ area_top
- 1))
10411 /* Area is in range. */
10412 offset
= cfun_frame_layout
.frame_size
;
10416 rtx insn
, frame_off
, cfa
;
10418 offset
= area_bottom
< 0 ? -area_bottom
: 0;
10419 frame_off
= GEN_INT (cfun_frame_layout
.frame_size
- offset
);
10421 cfa
= gen_rtx_SET (frame_pointer
,
10422 gen_rtx_PLUS (Pmode
, frame_pointer
, frame_off
));
10423 if (DISP_IN_RANGE (INTVAL (frame_off
)))
10425 insn
= gen_rtx_SET (frame_pointer
,
10426 gen_rtx_PLUS (Pmode
, frame_pointer
, frame_off
));
10427 insn
= emit_insn (insn
);
10431 if (!CONST_OK_FOR_K (INTVAL (frame_off
)))
10432 frame_off
= force_const_mem (Pmode
, frame_off
);
10434 insn
= emit_insn (gen_add2_insn (frame_pointer
, frame_off
));
10435 annotate_constant_pool_refs (&PATTERN (insn
));
10437 add_reg_note (insn
, REG_CFA_ADJUST_CFA
, cfa
);
10438 RTX_FRAME_RELATED_P (insn
) = 1;
10441 /* Restore call saved fprs. */
10445 if (cfun_save_high_fprs_p
)
10447 next_offset
= cfun_frame_layout
.f8_offset
;
10448 for (i
= FPR8_REGNUM
; i
<= FPR15_REGNUM
; i
++)
10450 if (cfun_fpr_save_p (i
))
10452 restore_fpr (frame_pointer
,
10453 offset
+ next_offset
, i
);
10455 = alloc_reg_note (REG_CFA_RESTORE
,
10456 gen_rtx_REG (DFmode
, i
), cfa_restores
);
10465 next_offset
= cfun_frame_layout
.f4_offset
;
10467 for (i
= FPR4_REGNUM
; i
<= FPR4_REGNUM
+ 1; i
++)
10469 if (cfun_fpr_save_p (i
))
10471 restore_fpr (frame_pointer
,
10472 offset
+ next_offset
, i
);
10474 = alloc_reg_note (REG_CFA_RESTORE
,
10475 gen_rtx_REG (DFmode
, i
), cfa_restores
);
10478 else if (!TARGET_PACKED_STACK
)
10484 /* Return register. */
10486 return_reg
= gen_rtx_REG (Pmode
, RETURN_REGNUM
);
10488 /* Restore call saved gprs. */
10490 if (cfun_frame_layout
.first_restore_gpr
!= -1)
10495 /* Check for global register and save them
10496 to stack location from where they get restored. */
10498 for (i
= cfun_frame_layout
.first_restore_gpr
;
10499 i
<= cfun_frame_layout
.last_restore_gpr
;
10502 if (global_not_special_regno_p (i
))
10504 addr
= plus_constant (Pmode
, frame_pointer
,
10505 offset
+ cfun_frame_layout
.gprs_offset
10506 + (i
- cfun_frame_layout
.first_save_gpr_slot
)
10508 addr
= gen_rtx_MEM (Pmode
, addr
);
10509 set_mem_alias_set (addr
, get_frame_alias_set ());
10510 emit_move_insn (addr
, gen_rtx_REG (Pmode
, i
));
10514 = alloc_reg_note (REG_CFA_RESTORE
,
10515 gen_rtx_REG (Pmode
, i
), cfa_restores
);
10520 /* Fetch return address from stack before load multiple,
10521 this will do good for scheduling.
10523 Only do this if we already decided that r14 needs to be
10524 saved to a stack slot. (And not just because r14 happens to
10525 be in between two GPRs which need saving.) Otherwise it
10526 would be difficult to take that decision back in
10527 s390_optimize_prologue. */
10528 if (cfun_gpr_save_slot (RETURN_REGNUM
) == -1)
10530 int return_regnum
= find_unused_clobbered_reg();
10531 if (!return_regnum
)
10533 return_reg
= gen_rtx_REG (Pmode
, return_regnum
);
10535 addr
= plus_constant (Pmode
, frame_pointer
,
10536 offset
+ cfun_frame_layout
.gprs_offset
10538 - cfun_frame_layout
.first_save_gpr_slot
)
10540 addr
= gen_rtx_MEM (Pmode
, addr
);
10541 set_mem_alias_set (addr
, get_frame_alias_set ());
10542 emit_move_insn (return_reg
, addr
);
10544 /* Once we did that optimization we have to make sure
10545 s390_optimize_prologue does not try to remove the
10546 store of r14 since we will not be able to find the
10547 load issued here. */
10548 cfun_frame_layout
.save_return_addr_p
= true;
10552 insn
= restore_gprs (frame_pointer
,
10553 offset
+ cfun_frame_layout
.gprs_offset
10554 + (cfun_frame_layout
.first_restore_gpr
10555 - cfun_frame_layout
.first_save_gpr_slot
)
10557 cfun_frame_layout
.first_restore_gpr
,
10558 cfun_frame_layout
.last_restore_gpr
);
10559 insn
= emit_insn (insn
);
10560 REG_NOTES (insn
) = cfa_restores
;
10561 add_reg_note (insn
, REG_CFA_DEF_CFA
,
10562 plus_constant (Pmode
, stack_pointer_rtx
,
10563 STACK_POINTER_OFFSET
));
10564 RTX_FRAME_RELATED_P (insn
) = 1;
10567 s390_restore_gprs_from_fprs ();
10572 /* Return to caller. */
10574 p
= rtvec_alloc (2);
10576 RTVEC_ELT (p
, 0) = ret_rtx
;
10577 RTVEC_ELT (p
, 1) = gen_rtx_USE (VOIDmode
, return_reg
);
10578 emit_jump_insn (gen_rtx_PARALLEL (VOIDmode
, p
));
10582 /* Implement TARGET_SET_UP_BY_PROLOGUE. */
10585 s300_set_up_by_prologue (hard_reg_set_container
*regs
)
10587 if (cfun
->machine
->base_reg
10588 && !call_really_used_regs
[REGNO (cfun
->machine
->base_reg
)])
10589 SET_HARD_REG_BIT (regs
->set
, REGNO (cfun
->machine
->base_reg
));
10592 /* Return true if the function can use simple_return to return outside
10593 of a shrink-wrapped region. At present shrink-wrapping is supported
10597 s390_can_use_simple_return_insn (void)
10602 /* Return true if the epilogue is guaranteed to contain only a return
10603 instruction and if a direct return can therefore be used instead.
10604 One of the main advantages of using direct return instructions
10605 is that we can then use conditional returns. */
10608 s390_can_use_return_insn (void)
10612 if (!reload_completed
)
10618 if (TARGET_TPF_PROFILING
)
10621 for (i
= 0; i
< 16; i
++)
10622 if (cfun_gpr_save_slot (i
))
10625 /* For 31 bit this is not covered by the frame_size check below
10626 since f4, f6 are saved in the register save area without needing
10627 additional stack space. */
10629 && (cfun_fpr_save_p (FPR4_REGNUM
) || cfun_fpr_save_p (FPR6_REGNUM
)))
10632 if (cfun
->machine
->base_reg
10633 && !call_really_used_regs
[REGNO (cfun
->machine
->base_reg
)])
10636 return cfun_frame_layout
.frame_size
== 0;
10639 /* The VX ABI differs for vararg functions. Therefore we need the
10640 prototype of the callee to be available when passing vector type
10642 static const char *
10643 s390_invalid_arg_for_unprototyped_fn (const_tree typelist
, const_tree funcdecl
, const_tree val
)
10645 return ((TARGET_VX_ABI
10647 && VECTOR_TYPE_P (TREE_TYPE (val
))
10648 && (funcdecl
== NULL_TREE
10649 || (TREE_CODE (funcdecl
) == FUNCTION_DECL
10650 && DECL_BUILT_IN_CLASS (funcdecl
) != BUILT_IN_MD
)))
10651 ? N_("Vector argument passed to unprototyped function")
10656 /* Return the size in bytes of a function argument of
10657 type TYPE and/or mode MODE. At least one of TYPE or
10658 MODE must be specified. */
10661 s390_function_arg_size (machine_mode mode
, const_tree type
)
10664 return int_size_in_bytes (type
);
10666 /* No type info available for some library calls ... */
10667 if (mode
!= BLKmode
)
10668 return GET_MODE_SIZE (mode
);
10670 /* If we have neither type nor mode, abort */
10671 gcc_unreachable ();
10674 /* Return true if a function argument of type TYPE and mode MODE
10675 is to be passed in a vector register, if available. */
10678 s390_function_arg_vector (machine_mode mode
, const_tree type
)
10680 if (!TARGET_VX_ABI
)
10683 if (s390_function_arg_size (mode
, type
) > 16)
10686 /* No type info available for some library calls ... */
10688 return VECTOR_MODE_P (mode
);
10690 /* The ABI says that record types with a single member are treated
10691 just like that member would be. */
10692 while (TREE_CODE (type
) == RECORD_TYPE
)
10694 tree field
, single
= NULL_TREE
;
10696 for (field
= TYPE_FIELDS (type
); field
; field
= DECL_CHAIN (field
))
10698 if (TREE_CODE (field
) != FIELD_DECL
)
10701 if (single
== NULL_TREE
)
10702 single
= TREE_TYPE (field
);
10707 if (single
== NULL_TREE
)
10711 /* If the field declaration adds extra byte due to
10712 e.g. padding this is not accepted as vector type. */
10713 if (int_size_in_bytes (single
) <= 0
10714 || int_size_in_bytes (single
) != int_size_in_bytes (type
))
10720 return VECTOR_TYPE_P (type
);
10723 /* Return true if a function argument of type TYPE and mode MODE
10724 is to be passed in a floating-point register, if available. */
10727 s390_function_arg_float (machine_mode mode
, const_tree type
)
10729 if (s390_function_arg_size (mode
, type
) > 8)
10732 /* Soft-float changes the ABI: no floating-point registers are used. */
10733 if (TARGET_SOFT_FLOAT
)
10736 /* No type info available for some library calls ... */
10738 return mode
== SFmode
|| mode
== DFmode
|| mode
== SDmode
|| mode
== DDmode
;
10740 /* The ABI says that record types with a single member are treated
10741 just like that member would be. */
10742 while (TREE_CODE (type
) == RECORD_TYPE
)
10744 tree field
, single
= NULL_TREE
;
10746 for (field
= TYPE_FIELDS (type
); field
; field
= DECL_CHAIN (field
))
10748 if (TREE_CODE (field
) != FIELD_DECL
)
10751 if (single
== NULL_TREE
)
10752 single
= TREE_TYPE (field
);
10757 if (single
== NULL_TREE
)
10763 return TREE_CODE (type
) == REAL_TYPE
;
10766 /* Return true if a function argument of type TYPE and mode MODE
10767 is to be passed in an integer register, or a pair of integer
10768 registers, if available. */
10771 s390_function_arg_integer (machine_mode mode
, const_tree type
)
10773 int size
= s390_function_arg_size (mode
, type
);
10777 /* No type info available for some library calls ... */
10779 return GET_MODE_CLASS (mode
) == MODE_INT
10780 || (TARGET_SOFT_FLOAT
&& SCALAR_FLOAT_MODE_P (mode
));
10782 /* We accept small integral (and similar) types. */
10783 if (INTEGRAL_TYPE_P (type
)
10784 || POINTER_TYPE_P (type
)
10785 || TREE_CODE (type
) == NULLPTR_TYPE
10786 || TREE_CODE (type
) == OFFSET_TYPE
10787 || (TARGET_SOFT_FLOAT
&& TREE_CODE (type
) == REAL_TYPE
))
10790 /* We also accept structs of size 1, 2, 4, 8 that are not
10791 passed in floating-point registers. */
10792 if (AGGREGATE_TYPE_P (type
)
10793 && exact_log2 (size
) >= 0
10794 && !s390_function_arg_float (mode
, type
))
10800 /* Return 1 if a function argument of type TYPE and mode MODE
10801 is to be passed by reference. The ABI specifies that only
10802 structures of size 1, 2, 4, or 8 bytes are passed by value,
10803 all other structures (and complex numbers) are passed by
10807 s390_pass_by_reference (cumulative_args_t ca ATTRIBUTE_UNUSED
,
10808 machine_mode mode
, const_tree type
,
10809 bool named ATTRIBUTE_UNUSED
)
10811 int size
= s390_function_arg_size (mode
, type
);
10813 if (s390_function_arg_vector (mode
, type
))
10821 if (AGGREGATE_TYPE_P (type
) && exact_log2 (size
) < 0)
10824 if (TREE_CODE (type
) == COMPLEX_TYPE
10825 || TREE_CODE (type
) == VECTOR_TYPE
)
10832 /* Update the data in CUM to advance over an argument of mode MODE and
10833 data type TYPE. (TYPE is null for libcalls where that information
10834 may not be available.). The boolean NAMED specifies whether the
10835 argument is a named argument (as opposed to an unnamed argument
10836 matching an ellipsis). */
10839 s390_function_arg_advance (cumulative_args_t cum_v
, machine_mode mode
,
10840 const_tree type
, bool named
)
10842 CUMULATIVE_ARGS
*cum
= get_cumulative_args (cum_v
);
10844 if (s390_function_arg_vector (mode
, type
))
10846 /* We are called for unnamed vector stdarg arguments which are
10847 passed on the stack. In this case this hook does not have to
10848 do anything since stack arguments are tracked by common
10854 else if (s390_function_arg_float (mode
, type
))
10858 else if (s390_function_arg_integer (mode
, type
))
10860 int size
= s390_function_arg_size (mode
, type
);
10861 cum
->gprs
+= ((size
+ UNITS_PER_LONG
- 1) / UNITS_PER_LONG
);
10864 gcc_unreachable ();
10867 /* Define where to put the arguments to a function.
10868 Value is zero to push the argument on the stack,
10869 or a hard register in which to store the argument.
10871 MODE is the argument's machine mode.
10872 TYPE is the data type of the argument (as a tree).
10873 This is null for libcalls where that information may
10875 CUM is a variable of type CUMULATIVE_ARGS which gives info about
10876 the preceding args and about the function being called.
10877 NAMED is nonzero if this argument is a named parameter
10878 (otherwise it is an extra parameter matching an ellipsis).
10880 On S/390, we use general purpose registers 2 through 6 to
10881 pass integer, pointer, and certain structure arguments, and
10882 floating point registers 0 and 2 (0, 2, 4, and 6 on 64-bit)
10883 to pass floating point arguments. All remaining arguments
10884 are pushed to the stack. */
10887 s390_function_arg (cumulative_args_t cum_v
, machine_mode mode
,
10888 const_tree type
, bool named
)
10890 CUMULATIVE_ARGS
*cum
= get_cumulative_args (cum_v
);
10893 if (s390_function_arg_vector (mode
, type
))
10895 /* Vector arguments being part of the ellipsis are passed on the
10897 if (!named
|| (cum
->vrs
+ 1 > VEC_ARG_NUM_REG
))
10900 return gen_rtx_REG (mode
, cum
->vrs
+ FIRST_VEC_ARG_REGNO
);
10902 else if (s390_function_arg_float (mode
, type
))
10904 if (cum
->fprs
+ 1 > FP_ARG_NUM_REG
)
10907 return gen_rtx_REG (mode
, cum
->fprs
+ 16);
10909 else if (s390_function_arg_integer (mode
, type
))
10911 int size
= s390_function_arg_size (mode
, type
);
10912 int n_gprs
= (size
+ UNITS_PER_LONG
- 1) / UNITS_PER_LONG
;
10914 if (cum
->gprs
+ n_gprs
> GP_ARG_NUM_REG
)
10916 else if (n_gprs
== 1 || UNITS_PER_WORD
== UNITS_PER_LONG
)
10917 return gen_rtx_REG (mode
, cum
->gprs
+ 2);
10918 else if (n_gprs
== 2)
10920 rtvec p
= rtvec_alloc (2);
10923 = gen_rtx_EXPR_LIST (SImode
, gen_rtx_REG (SImode
, cum
->gprs
+ 2),
10926 = gen_rtx_EXPR_LIST (SImode
, gen_rtx_REG (SImode
, cum
->gprs
+ 3),
10929 return gen_rtx_PARALLEL (mode
, p
);
10933 /* After the real arguments, expand_call calls us once again
10934 with a void_type_node type. Whatever we return here is
10935 passed as operand 2 to the call expanders.
10937 We don't need this feature ... */
10938 else if (type
== void_type_node
)
10941 gcc_unreachable ();
10944 /* Return true if return values of type TYPE should be returned
10945 in a memory buffer whose address is passed by the caller as
10946 hidden first argument. */
10949 s390_return_in_memory (const_tree type
, const_tree fundecl ATTRIBUTE_UNUSED
)
10951 /* We accept small integral (and similar) types. */
10952 if (INTEGRAL_TYPE_P (type
)
10953 || POINTER_TYPE_P (type
)
10954 || TREE_CODE (type
) == OFFSET_TYPE
10955 || TREE_CODE (type
) == REAL_TYPE
)
10956 return int_size_in_bytes (type
) > 8;
10958 /* vector types which fit into a VR. */
10960 && VECTOR_TYPE_P (type
)
10961 && int_size_in_bytes (type
) <= 16)
10964 /* Aggregates and similar constructs are always returned
10966 if (AGGREGATE_TYPE_P (type
)
10967 || TREE_CODE (type
) == COMPLEX_TYPE
10968 || VECTOR_TYPE_P (type
))
10971 /* ??? We get called on all sorts of random stuff from
10972 aggregate_value_p. We can't abort, but it's not clear
10973 what's safe to return. Pretend it's a struct I guess. */
10977 /* Function arguments and return values are promoted to word size. */
10979 static machine_mode
10980 s390_promote_function_mode (const_tree type
, machine_mode mode
,
10982 const_tree fntype ATTRIBUTE_UNUSED
,
10983 int for_return ATTRIBUTE_UNUSED
)
10985 if (INTEGRAL_MODE_P (mode
)
10986 && GET_MODE_SIZE (mode
) < UNITS_PER_LONG
)
10988 if (type
!= NULL_TREE
&& POINTER_TYPE_P (type
))
10989 *punsignedp
= POINTERS_EXTEND_UNSIGNED
;
10996 /* Define where to return a (scalar) value of type RET_TYPE.
10997 If RET_TYPE is null, define where to return a (scalar)
10998 value of mode MODE from a libcall. */
11001 s390_function_and_libcall_value (machine_mode mode
,
11002 const_tree ret_type
,
11003 const_tree fntype_or_decl
,
11004 bool outgoing ATTRIBUTE_UNUSED
)
11006 /* For vector return types it is important to use the RET_TYPE
11007 argument whenever available since the middle-end might have
11008 changed the mode to a scalar mode. */
11009 bool vector_ret_type_p
= ((ret_type
&& VECTOR_TYPE_P (ret_type
))
11010 || (!ret_type
&& VECTOR_MODE_P (mode
)));
11012 /* For normal functions perform the promotion as
11013 promote_function_mode would do. */
11016 int unsignedp
= TYPE_UNSIGNED (ret_type
);
11017 mode
= promote_function_mode (ret_type
, mode
, &unsignedp
,
11018 fntype_or_decl
, 1);
11021 gcc_assert (GET_MODE_CLASS (mode
) == MODE_INT
11022 || SCALAR_FLOAT_MODE_P (mode
)
11023 || (TARGET_VX_ABI
&& vector_ret_type_p
));
11024 gcc_assert (GET_MODE_SIZE (mode
) <= (TARGET_VX_ABI
? 16 : 8));
11026 if (TARGET_VX_ABI
&& vector_ret_type_p
)
11027 return gen_rtx_REG (mode
, FIRST_VEC_ARG_REGNO
);
11028 else if (TARGET_HARD_FLOAT
&& SCALAR_FLOAT_MODE_P (mode
))
11029 return gen_rtx_REG (mode
, 16);
11030 else if (GET_MODE_SIZE (mode
) <= UNITS_PER_LONG
11031 || UNITS_PER_LONG
== UNITS_PER_WORD
)
11032 return gen_rtx_REG (mode
, 2);
11033 else if (GET_MODE_SIZE (mode
) == 2 * UNITS_PER_LONG
)
11035 /* This case is triggered when returning a 64 bit value with
11036 -m31 -mzarch. Although the value would fit into a single
11037 register it has to be forced into a 32 bit register pair in
11038 order to match the ABI. */
11039 rtvec p
= rtvec_alloc (2);
11042 = gen_rtx_EXPR_LIST (SImode
, gen_rtx_REG (SImode
, 2), const0_rtx
);
11044 = gen_rtx_EXPR_LIST (SImode
, gen_rtx_REG (SImode
, 3), GEN_INT (4));
11046 return gen_rtx_PARALLEL (mode
, p
);
11049 gcc_unreachable ();
11052 /* Define where to return a scalar return value of type RET_TYPE. */
11055 s390_function_value (const_tree ret_type
, const_tree fn_decl_or_type
,
11058 return s390_function_and_libcall_value (TYPE_MODE (ret_type
), ret_type
,
11059 fn_decl_or_type
, outgoing
);
11062 /* Define where to return a scalar libcall return value of mode
11066 s390_libcall_value (machine_mode mode
, const_rtx fun ATTRIBUTE_UNUSED
)
11068 return s390_function_and_libcall_value (mode
, NULL_TREE
,
11073 /* Create and return the va_list datatype.
11075 On S/390, va_list is an array type equivalent to
11077 typedef struct __va_list_tag
11081 void *__overflow_arg_area;
11082 void *__reg_save_area;
11085 where __gpr and __fpr hold the number of general purpose
11086 or floating point arguments used up to now, respectively,
11087 __overflow_arg_area points to the stack location of the
11088 next argument passed on the stack, and __reg_save_area
11089 always points to the start of the register area in the
11090 call frame of the current function. The function prologue
11091 saves all registers used for argument passing into this
11092 area if the function uses variable arguments. */
11095 s390_build_builtin_va_list (void)
11097 tree f_gpr
, f_fpr
, f_ovf
, f_sav
, record
, type_decl
;
11099 record
= lang_hooks
.types
.make_type (RECORD_TYPE
);
11102 build_decl (BUILTINS_LOCATION
,
11103 TYPE_DECL
, get_identifier ("__va_list_tag"), record
);
11105 f_gpr
= build_decl (BUILTINS_LOCATION
,
11106 FIELD_DECL
, get_identifier ("__gpr"),
11107 long_integer_type_node
);
11108 f_fpr
= build_decl (BUILTINS_LOCATION
,
11109 FIELD_DECL
, get_identifier ("__fpr"),
11110 long_integer_type_node
);
11111 f_ovf
= build_decl (BUILTINS_LOCATION
,
11112 FIELD_DECL
, get_identifier ("__overflow_arg_area"),
11114 f_sav
= build_decl (BUILTINS_LOCATION
,
11115 FIELD_DECL
, get_identifier ("__reg_save_area"),
11118 va_list_gpr_counter_field
= f_gpr
;
11119 va_list_fpr_counter_field
= f_fpr
;
11121 DECL_FIELD_CONTEXT (f_gpr
) = record
;
11122 DECL_FIELD_CONTEXT (f_fpr
) = record
;
11123 DECL_FIELD_CONTEXT (f_ovf
) = record
;
11124 DECL_FIELD_CONTEXT (f_sav
) = record
;
11126 TYPE_STUB_DECL (record
) = type_decl
;
11127 TYPE_NAME (record
) = type_decl
;
11128 TYPE_FIELDS (record
) = f_gpr
;
11129 DECL_CHAIN (f_gpr
) = f_fpr
;
11130 DECL_CHAIN (f_fpr
) = f_ovf
;
11131 DECL_CHAIN (f_ovf
) = f_sav
;
11133 layout_type (record
);
11135 /* The correct type is an array type of one element. */
11136 return build_array_type (record
, build_index_type (size_zero_node
));
11139 /* Implement va_start by filling the va_list structure VALIST.
11140 STDARG_P is always true, and ignored.
11141 NEXTARG points to the first anonymous stack argument.
11143 The following global variables are used to initialize
11144 the va_list structure:
11147 holds number of gprs and fprs used for named arguments.
11148 crtl->args.arg_offset_rtx:
11149 holds the offset of the first anonymous stack argument
11150 (relative to the virtual arg pointer). */
11153 s390_va_start (tree valist
, rtx nextarg ATTRIBUTE_UNUSED
)
11155 HOST_WIDE_INT n_gpr
, n_fpr
;
11157 tree f_gpr
, f_fpr
, f_ovf
, f_sav
;
11158 tree gpr
, fpr
, ovf
, sav
, t
;
11160 f_gpr
= TYPE_FIELDS (TREE_TYPE (va_list_type_node
));
11161 f_fpr
= DECL_CHAIN (f_gpr
);
11162 f_ovf
= DECL_CHAIN (f_fpr
);
11163 f_sav
= DECL_CHAIN (f_ovf
);
11165 valist
= build_simple_mem_ref (valist
);
11166 gpr
= build3 (COMPONENT_REF
, TREE_TYPE (f_gpr
), valist
, f_gpr
, NULL_TREE
);
11167 fpr
= build3 (COMPONENT_REF
, TREE_TYPE (f_fpr
), valist
, f_fpr
, NULL_TREE
);
11168 ovf
= build3 (COMPONENT_REF
, TREE_TYPE (f_ovf
), valist
, f_ovf
, NULL_TREE
);
11169 sav
= build3 (COMPONENT_REF
, TREE_TYPE (f_sav
), valist
, f_sav
, NULL_TREE
);
11171 /* Count number of gp and fp argument registers used. */
11173 n_gpr
= crtl
->args
.info
.gprs
;
11174 n_fpr
= crtl
->args
.info
.fprs
;
11176 if (cfun
->va_list_gpr_size
)
11178 t
= build2 (MODIFY_EXPR
, TREE_TYPE (gpr
), gpr
,
11179 build_int_cst (NULL_TREE
, n_gpr
));
11180 TREE_SIDE_EFFECTS (t
) = 1;
11181 expand_expr (t
, const0_rtx
, VOIDmode
, EXPAND_NORMAL
);
11184 if (cfun
->va_list_fpr_size
)
11186 t
= build2 (MODIFY_EXPR
, TREE_TYPE (fpr
), fpr
,
11187 build_int_cst (NULL_TREE
, n_fpr
));
11188 TREE_SIDE_EFFECTS (t
) = 1;
11189 expand_expr (t
, const0_rtx
, VOIDmode
, EXPAND_NORMAL
);
11192 /* Find the overflow area.
11193 FIXME: This currently is too pessimistic when the vector ABI is
11194 enabled. In that case we *always* set up the overflow area
11196 if (n_gpr
+ cfun
->va_list_gpr_size
> GP_ARG_NUM_REG
11197 || n_fpr
+ cfun
->va_list_fpr_size
> FP_ARG_NUM_REG
11200 t
= make_tree (TREE_TYPE (ovf
), virtual_incoming_args_rtx
);
11202 off
= INTVAL (crtl
->args
.arg_offset_rtx
);
11203 off
= off
< 0 ? 0 : off
;
11204 if (TARGET_DEBUG_ARG
)
11205 fprintf (stderr
, "va_start: n_gpr = %d, n_fpr = %d off %d\n",
11206 (int)n_gpr
, (int)n_fpr
, off
);
11208 t
= fold_build_pointer_plus_hwi (t
, off
);
11210 t
= build2 (MODIFY_EXPR
, TREE_TYPE (ovf
), ovf
, t
);
11211 TREE_SIDE_EFFECTS (t
) = 1;
11212 expand_expr (t
, const0_rtx
, VOIDmode
, EXPAND_NORMAL
);
11215 /* Find the register save area. */
11216 if ((cfun
->va_list_gpr_size
&& n_gpr
< GP_ARG_NUM_REG
)
11217 || (cfun
->va_list_fpr_size
&& n_fpr
< FP_ARG_NUM_REG
))
11219 t
= make_tree (TREE_TYPE (sav
), return_address_pointer_rtx
);
11220 t
= fold_build_pointer_plus_hwi (t
, -RETURN_REGNUM
* UNITS_PER_LONG
);
11222 t
= build2 (MODIFY_EXPR
, TREE_TYPE (sav
), sav
, t
);
11223 TREE_SIDE_EFFECTS (t
) = 1;
11224 expand_expr (t
, const0_rtx
, VOIDmode
, EXPAND_NORMAL
);
11228 /* Implement va_arg by updating the va_list structure
11229 VALIST as required to retrieve an argument of type
11230 TYPE, and returning that argument.
11232 Generates code equivalent to:
11234 if (integral value) {
11235 if (size <= 4 && args.gpr < 5 ||
11236 size > 4 && args.gpr < 4 )
11237 ret = args.reg_save_area[args.gpr+8]
11239 ret = *args.overflow_arg_area++;
11240 } else if (vector value) {
11241 ret = *args.overflow_arg_area;
11242 args.overflow_arg_area += size / 8;
11243 } else if (float value) {
11245 ret = args.reg_save_area[args.fpr+64]
11247 ret = *args.overflow_arg_area++;
11248 } else if (aggregate value) {
11250 ret = *args.reg_save_area[args.gpr]
11252 ret = **args.overflow_arg_area++;
11256 s390_gimplify_va_arg (tree valist
, tree type
, gimple_seq
*pre_p
,
11257 gimple_seq
*post_p ATTRIBUTE_UNUSED
)
11259 tree f_gpr
, f_fpr
, f_ovf
, f_sav
;
11260 tree gpr
, fpr
, ovf
, sav
, reg
, t
, u
;
11261 int indirect_p
, size
, n_reg
, sav_ofs
, sav_scale
, max_reg
;
11262 tree lab_false
, lab_over
;
11263 tree addr
= create_tmp_var (ptr_type_node
, "addr");
11264 bool left_align_p
; /* How a value < UNITS_PER_LONG is aligned within
11267 f_gpr
= TYPE_FIELDS (TREE_TYPE (va_list_type_node
));
11268 f_fpr
= DECL_CHAIN (f_gpr
);
11269 f_ovf
= DECL_CHAIN (f_fpr
);
11270 f_sav
= DECL_CHAIN (f_ovf
);
11272 gpr
= build3 (COMPONENT_REF
, TREE_TYPE (f_gpr
), valist
, f_gpr
, NULL_TREE
);
11273 fpr
= build3 (COMPONENT_REF
, TREE_TYPE (f_fpr
), valist
, f_fpr
, NULL_TREE
);
11274 sav
= build3 (COMPONENT_REF
, TREE_TYPE (f_sav
), valist
, f_sav
, NULL_TREE
);
11276 /* The tree for args* cannot be shared between gpr/fpr and ovf since
11277 both appear on a lhs. */
11278 valist
= unshare_expr (valist
);
11279 ovf
= build3 (COMPONENT_REF
, TREE_TYPE (f_ovf
), valist
, f_ovf
, NULL_TREE
);
11281 size
= int_size_in_bytes (type
);
11283 if (pass_by_reference (NULL
, TYPE_MODE (type
), type
, false))
11285 if (TARGET_DEBUG_ARG
)
11287 fprintf (stderr
, "va_arg: aggregate type");
11291 /* Aggregates are passed by reference. */
11296 /* kernel stack layout on 31 bit: It is assumed here that no padding
11297 will be added by s390_frame_info because for va_args always an even
11298 number of gprs has to be saved r15-r2 = 14 regs. */
11299 sav_ofs
= 2 * UNITS_PER_LONG
;
11300 sav_scale
= UNITS_PER_LONG
;
11301 size
= UNITS_PER_LONG
;
11302 max_reg
= GP_ARG_NUM_REG
- n_reg
;
11303 left_align_p
= false;
11305 else if (s390_function_arg_vector (TYPE_MODE (type
), type
))
11307 if (TARGET_DEBUG_ARG
)
11309 fprintf (stderr
, "va_arg: vector type");
11319 left_align_p
= true;
11321 else if (s390_function_arg_float (TYPE_MODE (type
), type
))
11323 if (TARGET_DEBUG_ARG
)
11325 fprintf (stderr
, "va_arg: float type");
11329 /* FP args go in FP registers, if present. */
11333 sav_ofs
= 16 * UNITS_PER_LONG
;
11335 max_reg
= FP_ARG_NUM_REG
- n_reg
;
11336 left_align_p
= false;
11340 if (TARGET_DEBUG_ARG
)
11342 fprintf (stderr
, "va_arg: other type");
11346 /* Otherwise into GP registers. */
11349 n_reg
= (size
+ UNITS_PER_LONG
- 1) / UNITS_PER_LONG
;
11351 /* kernel stack layout on 31 bit: It is assumed here that no padding
11352 will be added by s390_frame_info because for va_args always an even
11353 number of gprs has to be saved r15-r2 = 14 regs. */
11354 sav_ofs
= 2 * UNITS_PER_LONG
;
11356 if (size
< UNITS_PER_LONG
)
11357 sav_ofs
+= UNITS_PER_LONG
- size
;
11359 sav_scale
= UNITS_PER_LONG
;
11360 max_reg
= GP_ARG_NUM_REG
- n_reg
;
11361 left_align_p
= false;
11364 /* Pull the value out of the saved registers ... */
11366 if (reg
!= NULL_TREE
)
11369 if (reg > ((typeof (reg))max_reg))
11372 addr = sav + sav_ofs + reg * save_scale;
11379 lab_false
= create_artificial_label (UNKNOWN_LOCATION
);
11380 lab_over
= create_artificial_label (UNKNOWN_LOCATION
);
11382 t
= fold_convert (TREE_TYPE (reg
), size_int (max_reg
));
11383 t
= build2 (GT_EXPR
, boolean_type_node
, reg
, t
);
11384 u
= build1 (GOTO_EXPR
, void_type_node
, lab_false
);
11385 t
= build3 (COND_EXPR
, void_type_node
, t
, u
, NULL_TREE
);
11386 gimplify_and_add (t
, pre_p
);
11388 t
= fold_build_pointer_plus_hwi (sav
, sav_ofs
);
11389 u
= build2 (MULT_EXPR
, TREE_TYPE (reg
), reg
,
11390 fold_convert (TREE_TYPE (reg
), size_int (sav_scale
)));
11391 t
= fold_build_pointer_plus (t
, u
);
11393 gimplify_assign (addr
, t
, pre_p
);
11395 gimple_seq_add_stmt (pre_p
, gimple_build_goto (lab_over
));
11397 gimple_seq_add_stmt (pre_p
, gimple_build_label (lab_false
));
11400 /* ... Otherwise out of the overflow area. */
11403 if (size
< UNITS_PER_LONG
&& !left_align_p
)
11404 t
= fold_build_pointer_plus_hwi (t
, UNITS_PER_LONG
- size
);
11406 gimplify_expr (&t
, pre_p
, NULL
, is_gimple_val
, fb_rvalue
);
11408 gimplify_assign (addr
, t
, pre_p
);
11410 if (size
< UNITS_PER_LONG
&& left_align_p
)
11411 t
= fold_build_pointer_plus_hwi (t
, UNITS_PER_LONG
);
11413 t
= fold_build_pointer_plus_hwi (t
, size
);
11415 gimplify_assign (ovf
, t
, pre_p
);
11417 if (reg
!= NULL_TREE
)
11418 gimple_seq_add_stmt (pre_p
, gimple_build_label (lab_over
));
11421 /* Increment register save count. */
11425 u
= build2 (PREINCREMENT_EXPR
, TREE_TYPE (reg
), reg
,
11426 fold_convert (TREE_TYPE (reg
), size_int (n_reg
)));
11427 gimplify_and_add (u
, pre_p
);
11432 t
= build_pointer_type_for_mode (build_pointer_type (type
),
11434 addr
= fold_convert (t
, addr
);
11435 addr
= build_va_arg_indirect_ref (addr
);
11439 t
= build_pointer_type_for_mode (type
, ptr_mode
, true);
11440 addr
= fold_convert (t
, addr
);
11443 return build_va_arg_indirect_ref (addr
);
11446 /* Emit rtl for the tbegin or tbegin_retry (RETRY != NULL_RTX)
11448 DEST - Register location where CC will be stored.
11449 TDB - Pointer to a 256 byte area where to store the transaction.
11450 diagnostic block. NULL if TDB is not needed.
11451 RETRY - Retry count value. If non-NULL a retry loop for CC2
11453 CLOBBER_FPRS_P - If true clobbers for all FPRs are emitted as part
11454 of the tbegin instruction pattern. */
11457 s390_expand_tbegin (rtx dest
, rtx tdb
, rtx retry
, bool clobber_fprs_p
)
11459 rtx retry_plus_two
= gen_reg_rtx (SImode
);
11460 rtx retry_reg
= gen_reg_rtx (SImode
);
11461 rtx_code_label
*retry_label
= NULL
;
11463 if (retry
!= NULL_RTX
)
11465 emit_move_insn (retry_reg
, retry
);
11466 emit_insn (gen_addsi3 (retry_plus_two
, retry_reg
, const2_rtx
));
11467 emit_insn (gen_addsi3 (retry_reg
, retry_reg
, const1_rtx
));
11468 retry_label
= gen_label_rtx ();
11469 emit_label (retry_label
);
11472 if (clobber_fprs_p
)
11473 emit_insn (gen_tbegin_1 (gen_rtx_CONST_INT (VOIDmode
, TBEGIN_MASK
), tdb
));
11475 emit_insn (gen_tbegin_nofloat_1 (gen_rtx_CONST_INT (VOIDmode
, TBEGIN_MASK
),
11478 emit_move_insn (dest
, gen_rtx_UNSPEC (SImode
,
11479 gen_rtvec (1, gen_rtx_REG (CCRAWmode
,
11481 UNSPEC_CC_TO_INT
));
11482 if (retry
!= NULL_RTX
)
11484 const int CC0
= 1 << 3;
11485 const int CC1
= 1 << 2;
11486 const int CC3
= 1 << 0;
11488 rtx count
= gen_reg_rtx (SImode
);
11489 rtx_code_label
*leave_label
= gen_label_rtx ();
11491 /* Exit for success and permanent failures. */
11492 jump
= s390_emit_jump (leave_label
,
11493 gen_rtx_EQ (VOIDmode
,
11494 gen_rtx_REG (CCRAWmode
, CC_REGNUM
),
11495 gen_rtx_CONST_INT (VOIDmode
, CC0
| CC1
| CC3
)));
11496 LABEL_NUSES (leave_label
) = 1;
11498 /* CC2 - transient failure. Perform retry with ppa. */
11499 emit_move_insn (count
, retry_plus_two
);
11500 emit_insn (gen_subsi3 (count
, count
, retry_reg
));
11501 emit_insn (gen_tx_assist (count
));
11502 jump
= emit_jump_insn (gen_doloop_si64 (retry_label
,
11505 JUMP_LABEL (jump
) = retry_label
;
11506 LABEL_NUSES (retry_label
) = 1;
11507 emit_label (leave_label
);
11512 /* Return the decl for the target specific builtin with the function
11516 s390_builtin_decl (unsigned fcode
, bool initialized_p ATTRIBUTE_UNUSED
)
11518 if (fcode
>= S390_BUILTIN_MAX
)
11519 return error_mark_node
;
11521 return s390_builtin_decls
[fcode
];
11524 /* We call mcount before the function prologue. So a profiled leaf
11525 function should stay a leaf function. */
11528 s390_keep_leaf_when_profiled ()
11533 /* Output assembly code for the trampoline template to
11536 On S/390, we use gpr 1 internally in the trampoline code;
11537 gpr 0 is used to hold the static chain. */
11540 s390_asm_trampoline_template (FILE *file
)
11543 op
[0] = gen_rtx_REG (Pmode
, 0);
11544 op
[1] = gen_rtx_REG (Pmode
, 1);
11548 output_asm_insn ("basr\t%1,0", op
); /* 2 byte */
11549 output_asm_insn ("lmg\t%0,%1,14(%1)", op
); /* 6 byte */
11550 output_asm_insn ("br\t%1", op
); /* 2 byte */
11551 ASM_OUTPUT_SKIP (file
, (HOST_WIDE_INT
)(TRAMPOLINE_SIZE
- 10));
11555 output_asm_insn ("basr\t%1,0", op
); /* 2 byte */
11556 output_asm_insn ("lm\t%0,%1,6(%1)", op
); /* 4 byte */
11557 output_asm_insn ("br\t%1", op
); /* 2 byte */
11558 ASM_OUTPUT_SKIP (file
, (HOST_WIDE_INT
)(TRAMPOLINE_SIZE
- 8));
11562 /* Emit RTL insns to initialize the variable parts of a trampoline.
11563 FNADDR is an RTX for the address of the function's pure code.
11564 CXT is an RTX for the static chain value for the function. */
11567 s390_trampoline_init (rtx m_tramp
, tree fndecl
, rtx cxt
)
11569 rtx fnaddr
= XEXP (DECL_RTL (fndecl
), 0);
11572 emit_block_move (m_tramp
, assemble_trampoline_template (),
11573 GEN_INT (2 * UNITS_PER_LONG
), BLOCK_OP_NORMAL
);
11575 mem
= adjust_address (m_tramp
, Pmode
, 2 * UNITS_PER_LONG
);
11576 emit_move_insn (mem
, cxt
);
11577 mem
= adjust_address (m_tramp
, Pmode
, 3 * UNITS_PER_LONG
);
11578 emit_move_insn (mem
, fnaddr
);
11581 /* Output assembler code to FILE to increment profiler label # LABELNO
11582 for profiling a function entry. */
11585 s390_function_profiler (FILE *file
, int labelno
)
11590 ASM_GENERATE_INTERNAL_LABEL (label
, "LP", labelno
);
11592 fprintf (file
, "# function profiler \n");
11594 op
[0] = gen_rtx_REG (Pmode
, RETURN_REGNUM
);
11595 op
[1] = gen_rtx_REG (Pmode
, STACK_POINTER_REGNUM
);
11596 op
[1] = gen_rtx_MEM (Pmode
, plus_constant (Pmode
, op
[1], UNITS_PER_LONG
));
11598 op
[2] = gen_rtx_REG (Pmode
, 1);
11599 op
[3] = gen_rtx_SYMBOL_REF (Pmode
, label
);
11600 SYMBOL_REF_FLAGS (op
[3]) = SYMBOL_FLAG_LOCAL
;
11602 op
[4] = gen_rtx_SYMBOL_REF (Pmode
, "_mcount");
11605 op
[4] = gen_rtx_UNSPEC (Pmode
, gen_rtvec (1, op
[4]), UNSPEC_PLT
);
11606 op
[4] = gen_rtx_CONST (Pmode
, op
[4]);
11611 output_asm_insn ("stg\t%0,%1", op
);
11612 output_asm_insn ("larl\t%2,%3", op
);
11613 output_asm_insn ("brasl\t%0,%4", op
);
11614 output_asm_insn ("lg\t%0,%1", op
);
11616 else if (!flag_pic
)
11618 op
[6] = gen_label_rtx ();
11620 output_asm_insn ("st\t%0,%1", op
);
11621 output_asm_insn ("bras\t%2,%l6", op
);
11622 output_asm_insn (".long\t%4", op
);
11623 output_asm_insn (".long\t%3", op
);
11624 targetm
.asm_out
.internal_label (file
, "L", CODE_LABEL_NUMBER (op
[6]));
11625 output_asm_insn ("l\t%0,0(%2)", op
);
11626 output_asm_insn ("l\t%2,4(%2)", op
);
11627 output_asm_insn ("basr\t%0,%0", op
);
11628 output_asm_insn ("l\t%0,%1", op
);
11632 op
[5] = gen_label_rtx ();
11633 op
[6] = gen_label_rtx ();
11635 output_asm_insn ("st\t%0,%1", op
);
11636 output_asm_insn ("bras\t%2,%l6", op
);
11637 targetm
.asm_out
.internal_label (file
, "L", CODE_LABEL_NUMBER (op
[5]));
11638 output_asm_insn (".long\t%4-%l5", op
);
11639 output_asm_insn (".long\t%3-%l5", op
);
11640 targetm
.asm_out
.internal_label (file
, "L", CODE_LABEL_NUMBER (op
[6]));
11641 output_asm_insn ("lr\t%0,%2", op
);
11642 output_asm_insn ("a\t%0,0(%2)", op
);
11643 output_asm_insn ("a\t%2,4(%2)", op
);
11644 output_asm_insn ("basr\t%0,%0", op
);
11645 output_asm_insn ("l\t%0,%1", op
);
11649 /* Encode symbol attributes (local vs. global, tls model) of a SYMBOL_REF
11650 into its SYMBOL_REF_FLAGS. */
11653 s390_encode_section_info (tree decl
, rtx rtl
, int first
)
11655 default_encode_section_info (decl
, rtl
, first
);
11657 if (TREE_CODE (decl
) == VAR_DECL
)
11659 /* If a variable has a forced alignment to < 2 bytes, mark it
11660 with SYMBOL_FLAG_ALIGN1 to prevent it from being used as LARL
11662 if (DECL_USER_ALIGN (decl
) && DECL_ALIGN (decl
) < 16)
11663 SYMBOL_REF_FLAGS (XEXP (rtl
, 0)) |= SYMBOL_FLAG_ALIGN1
;
11664 if (!DECL_SIZE (decl
)
11665 || !DECL_ALIGN (decl
)
11666 || !tree_fits_shwi_p (DECL_SIZE (decl
))
11667 || (DECL_ALIGN (decl
) <= 64
11668 && DECL_ALIGN (decl
) != tree_to_shwi (DECL_SIZE (decl
))))
11669 SYMBOL_REF_FLAGS (XEXP (rtl
, 0)) |= SYMBOL_FLAG_NOT_NATURALLY_ALIGNED
;
11672 /* Literal pool references don't have a decl so they are handled
11673 differently here. We rely on the information in the MEM_ALIGN
11674 entry to decide upon natural alignment. */
11676 && GET_CODE (XEXP (rtl
, 0)) == SYMBOL_REF
11677 && TREE_CONSTANT_POOL_ADDRESS_P (XEXP (rtl
, 0))
11678 && (MEM_ALIGN (rtl
) == 0
11679 || GET_MODE_BITSIZE (GET_MODE (rtl
)) == 0
11680 || MEM_ALIGN (rtl
) < GET_MODE_BITSIZE (GET_MODE (rtl
))))
11681 SYMBOL_REF_FLAGS (XEXP (rtl
, 0)) |= SYMBOL_FLAG_NOT_NATURALLY_ALIGNED
;
11684 /* Output thunk to FILE that implements a C++ virtual function call (with
11685 multiple inheritance) to FUNCTION. The thunk adjusts the this pointer
11686 by DELTA, and unless VCALL_OFFSET is zero, applies an additional adjustment
11687 stored at VCALL_OFFSET in the vtable whose address is located at offset 0
11688 relative to the resulting this pointer. */
11691 s390_output_mi_thunk (FILE *file
, tree thunk ATTRIBUTE_UNUSED
,
11692 HOST_WIDE_INT delta
, HOST_WIDE_INT vcall_offset
,
11698 /* Make sure unwind info is emitted for the thunk if needed. */
11699 final_start_function (emit_barrier (), file
, 1);
11701 /* Operand 0 is the target function. */
11702 op
[0] = XEXP (DECL_RTL (function
), 0);
11703 if (flag_pic
&& !SYMBOL_REF_LOCAL_P (op
[0]))
11706 op
[0] = gen_rtx_UNSPEC (Pmode
, gen_rtvec (1, op
[0]),
11707 TARGET_64BIT
? UNSPEC_PLT
: UNSPEC_GOT
);
11708 op
[0] = gen_rtx_CONST (Pmode
, op
[0]);
11711 /* Operand 1 is the 'this' pointer. */
11712 if (aggregate_value_p (TREE_TYPE (TREE_TYPE (function
)), function
))
11713 op
[1] = gen_rtx_REG (Pmode
, 3);
11715 op
[1] = gen_rtx_REG (Pmode
, 2);
11717 /* Operand 2 is the delta. */
11718 op
[2] = GEN_INT (delta
);
11720 /* Operand 3 is the vcall_offset. */
11721 op
[3] = GEN_INT (vcall_offset
);
11723 /* Operand 4 is the temporary register. */
11724 op
[4] = gen_rtx_REG (Pmode
, 1);
11726 /* Operands 5 to 8 can be used as labels. */
11732 /* Operand 9 can be used for temporary register. */
11735 /* Generate code. */
11738 /* Setup literal pool pointer if required. */
11739 if ((!DISP_IN_RANGE (delta
)
11740 && !CONST_OK_FOR_K (delta
)
11741 && !CONST_OK_FOR_Os (delta
))
11742 || (!DISP_IN_RANGE (vcall_offset
)
11743 && !CONST_OK_FOR_K (vcall_offset
)
11744 && !CONST_OK_FOR_Os (vcall_offset
)))
11746 op
[5] = gen_label_rtx ();
11747 output_asm_insn ("larl\t%4,%5", op
);
11750 /* Add DELTA to this pointer. */
11753 if (CONST_OK_FOR_J (delta
))
11754 output_asm_insn ("la\t%1,%2(%1)", op
);
11755 else if (DISP_IN_RANGE (delta
))
11756 output_asm_insn ("lay\t%1,%2(%1)", op
);
11757 else if (CONST_OK_FOR_K (delta
))
11758 output_asm_insn ("aghi\t%1,%2", op
);
11759 else if (CONST_OK_FOR_Os (delta
))
11760 output_asm_insn ("agfi\t%1,%2", op
);
11763 op
[6] = gen_label_rtx ();
11764 output_asm_insn ("agf\t%1,%6-%5(%4)", op
);
11768 /* Perform vcall adjustment. */
11771 if (DISP_IN_RANGE (vcall_offset
))
11773 output_asm_insn ("lg\t%4,0(%1)", op
);
11774 output_asm_insn ("ag\t%1,%3(%4)", op
);
11776 else if (CONST_OK_FOR_K (vcall_offset
))
11778 output_asm_insn ("lghi\t%4,%3", op
);
11779 output_asm_insn ("ag\t%4,0(%1)", op
);
11780 output_asm_insn ("ag\t%1,0(%4)", op
);
11782 else if (CONST_OK_FOR_Os (vcall_offset
))
11784 output_asm_insn ("lgfi\t%4,%3", op
);
11785 output_asm_insn ("ag\t%4,0(%1)", op
);
11786 output_asm_insn ("ag\t%1,0(%4)", op
);
11790 op
[7] = gen_label_rtx ();
11791 output_asm_insn ("llgf\t%4,%7-%5(%4)", op
);
11792 output_asm_insn ("ag\t%4,0(%1)", op
);
11793 output_asm_insn ("ag\t%1,0(%4)", op
);
11797 /* Jump to target. */
11798 output_asm_insn ("jg\t%0", op
);
11800 /* Output literal pool if required. */
11803 output_asm_insn (".align\t4", op
);
11804 targetm
.asm_out
.internal_label (file
, "L",
11805 CODE_LABEL_NUMBER (op
[5]));
11809 targetm
.asm_out
.internal_label (file
, "L",
11810 CODE_LABEL_NUMBER (op
[6]));
11811 output_asm_insn (".long\t%2", op
);
11815 targetm
.asm_out
.internal_label (file
, "L",
11816 CODE_LABEL_NUMBER (op
[7]));
11817 output_asm_insn (".long\t%3", op
);
11822 /* Setup base pointer if required. */
11824 || (!DISP_IN_RANGE (delta
)
11825 && !CONST_OK_FOR_K (delta
)
11826 && !CONST_OK_FOR_Os (delta
))
11827 || (!DISP_IN_RANGE (delta
)
11828 && !CONST_OK_FOR_K (vcall_offset
)
11829 && !CONST_OK_FOR_Os (vcall_offset
)))
11831 op
[5] = gen_label_rtx ();
11832 output_asm_insn ("basr\t%4,0", op
);
11833 targetm
.asm_out
.internal_label (file
, "L",
11834 CODE_LABEL_NUMBER (op
[5]));
11837 /* Add DELTA to this pointer. */
11840 if (CONST_OK_FOR_J (delta
))
11841 output_asm_insn ("la\t%1,%2(%1)", op
);
11842 else if (DISP_IN_RANGE (delta
))
11843 output_asm_insn ("lay\t%1,%2(%1)", op
);
11844 else if (CONST_OK_FOR_K (delta
))
11845 output_asm_insn ("ahi\t%1,%2", op
);
11846 else if (CONST_OK_FOR_Os (delta
))
11847 output_asm_insn ("afi\t%1,%2", op
);
11850 op
[6] = gen_label_rtx ();
11851 output_asm_insn ("a\t%1,%6-%5(%4)", op
);
11855 /* Perform vcall adjustment. */
11858 if (CONST_OK_FOR_J (vcall_offset
))
11860 output_asm_insn ("l\t%4,0(%1)", op
);
11861 output_asm_insn ("a\t%1,%3(%4)", op
);
11863 else if (DISP_IN_RANGE (vcall_offset
))
11865 output_asm_insn ("l\t%4,0(%1)", op
);
11866 output_asm_insn ("ay\t%1,%3(%4)", op
);
11868 else if (CONST_OK_FOR_K (vcall_offset
))
11870 output_asm_insn ("lhi\t%4,%3", op
);
11871 output_asm_insn ("a\t%4,0(%1)", op
);
11872 output_asm_insn ("a\t%1,0(%4)", op
);
11874 else if (CONST_OK_FOR_Os (vcall_offset
))
11876 output_asm_insn ("iilf\t%4,%3", op
);
11877 output_asm_insn ("a\t%4,0(%1)", op
);
11878 output_asm_insn ("a\t%1,0(%4)", op
);
11882 op
[7] = gen_label_rtx ();
11883 output_asm_insn ("l\t%4,%7-%5(%4)", op
);
11884 output_asm_insn ("a\t%4,0(%1)", op
);
11885 output_asm_insn ("a\t%1,0(%4)", op
);
11888 /* We had to clobber the base pointer register.
11889 Re-setup the base pointer (with a different base). */
11890 op
[5] = gen_label_rtx ();
11891 output_asm_insn ("basr\t%4,0", op
);
11892 targetm
.asm_out
.internal_label (file
, "L",
11893 CODE_LABEL_NUMBER (op
[5]));
11896 /* Jump to target. */
11897 op
[8] = gen_label_rtx ();
11900 output_asm_insn ("l\t%4,%8-%5(%4)", op
);
11901 else if (!nonlocal
)
11902 output_asm_insn ("a\t%4,%8-%5(%4)", op
);
11903 /* We cannot call through .plt, since .plt requires %r12 loaded. */
11904 else if (flag_pic
== 1)
11906 output_asm_insn ("a\t%4,%8-%5(%4)", op
);
11907 output_asm_insn ("l\t%4,%0(%4)", op
);
11909 else if (flag_pic
== 2)
11911 op
[9] = gen_rtx_REG (Pmode
, 0);
11912 output_asm_insn ("l\t%9,%8-4-%5(%4)", op
);
11913 output_asm_insn ("a\t%4,%8-%5(%4)", op
);
11914 output_asm_insn ("ar\t%4,%9", op
);
11915 output_asm_insn ("l\t%4,0(%4)", op
);
11918 output_asm_insn ("br\t%4", op
);
11920 /* Output literal pool. */
11921 output_asm_insn (".align\t4", op
);
11923 if (nonlocal
&& flag_pic
== 2)
11924 output_asm_insn (".long\t%0", op
);
11927 op
[0] = gen_rtx_SYMBOL_REF (Pmode
, "_GLOBAL_OFFSET_TABLE_");
11928 SYMBOL_REF_FLAGS (op
[0]) = SYMBOL_FLAG_LOCAL
;
11931 targetm
.asm_out
.internal_label (file
, "L", CODE_LABEL_NUMBER (op
[8]));
11933 output_asm_insn (".long\t%0", op
);
11935 output_asm_insn (".long\t%0-%5", op
);
11939 targetm
.asm_out
.internal_label (file
, "L",
11940 CODE_LABEL_NUMBER (op
[6]));
11941 output_asm_insn (".long\t%2", op
);
11945 targetm
.asm_out
.internal_label (file
, "L",
11946 CODE_LABEL_NUMBER (op
[7]));
11947 output_asm_insn (".long\t%3", op
);
11950 final_end_function ();
11954 s390_valid_pointer_mode (machine_mode mode
)
11956 return (mode
== SImode
|| (TARGET_64BIT
&& mode
== DImode
));
11959 /* Checks whether the given CALL_EXPR would use a caller
11960 saved register. This is used to decide whether sibling call
11961 optimization could be performed on the respective function
11965 s390_call_saved_register_used (tree call_expr
)
11967 CUMULATIVE_ARGS cum_v
;
11968 cumulative_args_t cum
;
11975 INIT_CUMULATIVE_ARGS (cum_v
, NULL
, NULL
, 0, 0);
11976 cum
= pack_cumulative_args (&cum_v
);
11978 for (i
= 0; i
< call_expr_nargs (call_expr
); i
++)
11980 parameter
= CALL_EXPR_ARG (call_expr
, i
);
11981 gcc_assert (parameter
);
11983 /* For an undeclared variable passed as parameter we will get
11984 an ERROR_MARK node here. */
11985 if (TREE_CODE (parameter
) == ERROR_MARK
)
11988 type
= TREE_TYPE (parameter
);
11991 mode
= TYPE_MODE (type
);
11994 /* We assume that in the target function all parameters are
11995 named. This only has an impact on vector argument register
11996 usage none of which is call-saved. */
11997 if (pass_by_reference (&cum_v
, mode
, type
, true))
12000 type
= build_pointer_type (type
);
12003 parm_rtx
= s390_function_arg (cum
, mode
, type
, true);
12005 s390_function_arg_advance (cum
, mode
, type
, true);
12010 if (REG_P (parm_rtx
))
12013 reg
< HARD_REGNO_NREGS (REGNO (parm_rtx
), GET_MODE (parm_rtx
));
12015 if (!call_used_regs
[reg
+ REGNO (parm_rtx
)])
12019 if (GET_CODE (parm_rtx
) == PARALLEL
)
12023 for (i
= 0; i
< XVECLEN (parm_rtx
, 0); i
++)
12025 rtx r
= XEXP (XVECEXP (parm_rtx
, 0, i
), 0);
12027 gcc_assert (REG_P (r
));
12030 reg
< HARD_REGNO_NREGS (REGNO (r
), GET_MODE (r
));
12032 if (!call_used_regs
[reg
+ REGNO (r
)])
12041 /* Return true if the given call expression can be
12042 turned into a sibling call.
12043 DECL holds the declaration of the function to be called whereas
12044 EXP is the call expression itself. */
12047 s390_function_ok_for_sibcall (tree decl
, tree exp
)
12049 /* The TPF epilogue uses register 1. */
12050 if (TARGET_TPF_PROFILING
)
12053 /* The 31 bit PLT code uses register 12 (GOT pointer - caller saved)
12054 which would have to be restored before the sibcall. */
12055 if (!TARGET_64BIT
&& flag_pic
&& decl
&& !targetm
.binds_local_p (decl
))
12058 /* Register 6 on s390 is available as an argument register but unfortunately
12059 "caller saved". This makes functions needing this register for arguments
12060 not suitable for sibcalls. */
12061 return !s390_call_saved_register_used (exp
);
12064 /* Return the fixed registers used for condition codes. */
12067 s390_fixed_condition_code_regs (unsigned int *p1
, unsigned int *p2
)
12070 *p2
= INVALID_REGNUM
;
12075 /* This function is used by the call expanders of the machine description.
12076 It emits the call insn itself together with the necessary operations
12077 to adjust the target address and returns the emitted insn.
12078 ADDR_LOCATION is the target address rtx
12079 TLS_CALL the location of the thread-local symbol
12080 RESULT_REG the register where the result of the call should be stored
12081 RETADDR_REG the register where the return address should be stored
12082 If this parameter is NULL_RTX the call is considered
12083 to be a sibling call. */
12086 s390_emit_call (rtx addr_location
, rtx tls_call
, rtx result_reg
,
12089 bool plt_call
= false;
12095 /* Direct function calls need special treatment. */
12096 if (GET_CODE (addr_location
) == SYMBOL_REF
)
12098 /* When calling a global routine in PIC mode, we must
12099 replace the symbol itself with the PLT stub. */
12100 if (flag_pic
&& !SYMBOL_REF_LOCAL_P (addr_location
))
12102 if (retaddr_reg
!= NULL_RTX
)
12104 addr_location
= gen_rtx_UNSPEC (Pmode
,
12105 gen_rtvec (1, addr_location
),
12107 addr_location
= gen_rtx_CONST (Pmode
, addr_location
);
12111 /* For -fpic code the PLT entries might use r12 which is
12112 call-saved. Therefore we cannot do a sibcall when
12113 calling directly using a symbol ref. When reaching
12114 this point we decided (in s390_function_ok_for_sibcall)
12115 to do a sibcall for a function pointer but one of the
12116 optimizers was able to get rid of the function pointer
12117 by propagating the symbol ref into the call. This
12118 optimization is illegal for S/390 so we turn the direct
12119 call into a indirect call again. */
12120 addr_location
= force_reg (Pmode
, addr_location
);
12123 /* Unless we can use the bras(l) insn, force the
12124 routine address into a register. */
12125 if (!TARGET_SMALL_EXEC
&& !TARGET_CPU_ZARCH
)
12128 addr_location
= legitimize_pic_address (addr_location
, 0);
12130 addr_location
= force_reg (Pmode
, addr_location
);
12134 /* If it is already an indirect call or the code above moved the
12135 SYMBOL_REF to somewhere else make sure the address can be found in
12137 if (retaddr_reg
== NULL_RTX
12138 && GET_CODE (addr_location
) != SYMBOL_REF
12141 emit_move_insn (gen_rtx_REG (Pmode
, SIBCALL_REGNUM
), addr_location
);
12142 addr_location
= gen_rtx_REG (Pmode
, SIBCALL_REGNUM
);
12145 addr_location
= gen_rtx_MEM (QImode
, addr_location
);
12146 call
= gen_rtx_CALL (VOIDmode
, addr_location
, const0_rtx
);
12148 if (result_reg
!= NULL_RTX
)
12149 call
= gen_rtx_SET (result_reg
, call
);
12151 if (retaddr_reg
!= NULL_RTX
)
12153 clobber
= gen_rtx_CLOBBER (VOIDmode
, retaddr_reg
);
12155 if (tls_call
!= NULL_RTX
)
12156 vec
= gen_rtvec (3, call
, clobber
,
12157 gen_rtx_USE (VOIDmode
, tls_call
));
12159 vec
= gen_rtvec (2, call
, clobber
);
12161 call
= gen_rtx_PARALLEL (VOIDmode
, vec
);
12164 insn
= emit_call_insn (call
);
12166 /* 31-bit PLT stubs and tls calls use the GOT register implicitly. */
12167 if ((!TARGET_64BIT
&& plt_call
) || tls_call
!= NULL_RTX
)
12169 /* s390_function_ok_for_sibcall should
12170 have denied sibcalls in this case. */
12171 gcc_assert (retaddr_reg
!= NULL_RTX
);
12172 use_reg (&CALL_INSN_FUNCTION_USAGE (insn
), gen_rtx_REG (Pmode
, 12));
12177 /* Implement TARGET_CONDITIONAL_REGISTER_USAGE. */
12180 s390_conditional_register_usage (void)
12186 fixed_regs
[PIC_OFFSET_TABLE_REGNUM
] = 1;
12187 call_used_regs
[PIC_OFFSET_TABLE_REGNUM
] = 1;
12189 if (TARGET_CPU_ZARCH
)
12191 fixed_regs
[BASE_REGNUM
] = 0;
12192 call_used_regs
[BASE_REGNUM
] = 0;
12193 fixed_regs
[RETURN_REGNUM
] = 0;
12194 call_used_regs
[RETURN_REGNUM
] = 0;
12198 for (i
= FPR8_REGNUM
; i
<= FPR15_REGNUM
; i
++)
12199 call_used_regs
[i
] = call_really_used_regs
[i
] = 0;
12203 call_used_regs
[FPR4_REGNUM
] = call_really_used_regs
[FPR4_REGNUM
] = 0;
12204 call_used_regs
[FPR6_REGNUM
] = call_really_used_regs
[FPR6_REGNUM
] = 0;
12207 if (TARGET_SOFT_FLOAT
)
12209 for (i
= FPR0_REGNUM
; i
<= FPR15_REGNUM
; i
++)
12210 call_used_regs
[i
] = fixed_regs
[i
] = 1;
12213 /* Disable v16 - v31 for non-vector target. */
12216 for (i
= VR16_REGNUM
; i
<= VR31_REGNUM
; i
++)
12217 fixed_regs
[i
] = call_used_regs
[i
] = call_really_used_regs
[i
] = 1;
12221 /* Corresponding function to eh_return expander. */
12223 static GTY(()) rtx s390_tpf_eh_return_symbol
;
12225 s390_emit_tpf_eh_return (rtx target
)
12230 if (!s390_tpf_eh_return_symbol
)
12231 s390_tpf_eh_return_symbol
= gen_rtx_SYMBOL_REF (Pmode
, "__tpf_eh_return");
12233 reg
= gen_rtx_REG (Pmode
, 2);
12234 orig_ra
= gen_rtx_REG (Pmode
, 3);
12236 emit_move_insn (reg
, target
);
12237 emit_move_insn (orig_ra
, get_hard_reg_initial_val (Pmode
, RETURN_REGNUM
));
12238 insn
= s390_emit_call (s390_tpf_eh_return_symbol
, NULL_RTX
, reg
,
12239 gen_rtx_REG (Pmode
, RETURN_REGNUM
));
12240 use_reg (&CALL_INSN_FUNCTION_USAGE (insn
), reg
);
12241 use_reg (&CALL_INSN_FUNCTION_USAGE (insn
), orig_ra
);
12243 emit_move_insn (EH_RETURN_HANDLER_RTX
, reg
);
12246 /* Rework the prologue/epilogue to avoid saving/restoring
12247 registers unnecessarily. */
12250 s390_optimize_prologue (void)
12252 rtx_insn
*insn
, *new_insn
, *next_insn
;
12254 /* Do a final recompute of the frame-related data. */
12255 s390_optimize_register_info ();
12257 /* If all special registers are in fact used, there's nothing we
12258 can do, so no point in walking the insn list. */
12260 if (cfun_frame_layout
.first_save_gpr
<= BASE_REGNUM
12261 && cfun_frame_layout
.last_save_gpr
>= BASE_REGNUM
12262 && (TARGET_CPU_ZARCH
12263 || (cfun_frame_layout
.first_save_gpr
<= RETURN_REGNUM
12264 && cfun_frame_layout
.last_save_gpr
>= RETURN_REGNUM
)))
12267 /* Search for prologue/epilogue insns and replace them. */
12269 for (insn
= get_insns (); insn
; insn
= next_insn
)
12271 int first
, last
, off
;
12272 rtx set
, base
, offset
;
12275 next_insn
= NEXT_INSN (insn
);
12277 if (! NONJUMP_INSN_P (insn
) || ! RTX_FRAME_RELATED_P (insn
))
12280 pat
= PATTERN (insn
);
12282 /* Remove ldgr/lgdr instructions used for saving and restore
12283 GPRs if possible. */
12285 && GET_CODE (pat
) == SET
12286 && GET_MODE (SET_SRC (pat
)) == DImode
12287 && REG_P (SET_SRC (pat
))
12288 && REG_P (SET_DEST (pat
)))
12290 int src_regno
= REGNO (SET_SRC (pat
));
12291 int dest_regno
= REGNO (SET_DEST (pat
));
12295 if (!((GENERAL_REGNO_P (src_regno
) && FP_REGNO_P (dest_regno
))
12296 || (FP_REGNO_P (src_regno
) && GENERAL_REGNO_P (dest_regno
))))
12299 gpr_regno
= GENERAL_REGNO_P (src_regno
) ? src_regno
: dest_regno
;
12300 fpr_regno
= FP_REGNO_P (src_regno
) ? src_regno
: dest_regno
;
12302 /* GPR must be call-saved, FPR must be call-clobbered. */
12303 if (!call_really_used_regs
[fpr_regno
]
12304 || call_really_used_regs
[gpr_regno
])
12307 /* It must not happen that what we once saved in an FPR now
12308 needs a stack slot. */
12309 gcc_assert (cfun_gpr_save_slot (gpr_regno
) != -1);
12311 if (cfun_gpr_save_slot (gpr_regno
) == 0)
12313 remove_insn (insn
);
12318 if (GET_CODE (pat
) == PARALLEL
12319 && store_multiple_operation (pat
, VOIDmode
))
12321 set
= XVECEXP (pat
, 0, 0);
12322 first
= REGNO (SET_SRC (set
));
12323 last
= first
+ XVECLEN (pat
, 0) - 1;
12324 offset
= const0_rtx
;
12325 base
= eliminate_constant_term (XEXP (SET_DEST (set
), 0), &offset
);
12326 off
= INTVAL (offset
);
12328 if (GET_CODE (base
) != REG
|| off
< 0)
12330 if (cfun_frame_layout
.first_save_gpr
!= -1
12331 && (cfun_frame_layout
.first_save_gpr
< first
12332 || cfun_frame_layout
.last_save_gpr
> last
))
12334 if (REGNO (base
) != STACK_POINTER_REGNUM
12335 && REGNO (base
) != HARD_FRAME_POINTER_REGNUM
)
12337 if (first
> BASE_REGNUM
|| last
< BASE_REGNUM
)
12340 if (cfun_frame_layout
.first_save_gpr
!= -1)
12342 rtx s_pat
= save_gprs (base
,
12343 off
+ (cfun_frame_layout
.first_save_gpr
12344 - first
) * UNITS_PER_LONG
,
12345 cfun_frame_layout
.first_save_gpr
,
12346 cfun_frame_layout
.last_save_gpr
);
12347 new_insn
= emit_insn_before (s_pat
, insn
);
12348 INSN_ADDRESSES_NEW (new_insn
, -1);
12351 remove_insn (insn
);
12355 if (cfun_frame_layout
.first_save_gpr
== -1
12356 && GET_CODE (pat
) == SET
12357 && GENERAL_REG_P (SET_SRC (pat
))
12358 && GET_CODE (SET_DEST (pat
)) == MEM
)
12361 first
= REGNO (SET_SRC (set
));
12362 offset
= const0_rtx
;
12363 base
= eliminate_constant_term (XEXP (SET_DEST (set
), 0), &offset
);
12364 off
= INTVAL (offset
);
12366 if (GET_CODE (base
) != REG
|| off
< 0)
12368 if (REGNO (base
) != STACK_POINTER_REGNUM
12369 && REGNO (base
) != HARD_FRAME_POINTER_REGNUM
)
12372 remove_insn (insn
);
12376 if (GET_CODE (pat
) == PARALLEL
12377 && load_multiple_operation (pat
, VOIDmode
))
12379 set
= XVECEXP (pat
, 0, 0);
12380 first
= REGNO (SET_DEST (set
));
12381 last
= first
+ XVECLEN (pat
, 0) - 1;
12382 offset
= const0_rtx
;
12383 base
= eliminate_constant_term (XEXP (SET_SRC (set
), 0), &offset
);
12384 off
= INTVAL (offset
);
12386 if (GET_CODE (base
) != REG
|| off
< 0)
12389 if (cfun_frame_layout
.first_restore_gpr
!= -1
12390 && (cfun_frame_layout
.first_restore_gpr
< first
12391 || cfun_frame_layout
.last_restore_gpr
> last
))
12393 if (REGNO (base
) != STACK_POINTER_REGNUM
12394 && REGNO (base
) != HARD_FRAME_POINTER_REGNUM
)
12396 if (first
> BASE_REGNUM
|| last
< BASE_REGNUM
)
12399 if (cfun_frame_layout
.first_restore_gpr
!= -1)
12401 rtx rpat
= restore_gprs (base
,
12402 off
+ (cfun_frame_layout
.first_restore_gpr
12403 - first
) * UNITS_PER_LONG
,
12404 cfun_frame_layout
.first_restore_gpr
,
12405 cfun_frame_layout
.last_restore_gpr
);
12407 /* Remove REG_CFA_RESTOREs for registers that we no
12408 longer need to save. */
12409 REG_NOTES (rpat
) = REG_NOTES (insn
);
12410 for (rtx
*ptr
= ®_NOTES (rpat
); *ptr
; )
12411 if (REG_NOTE_KIND (*ptr
) == REG_CFA_RESTORE
12412 && ((int) REGNO (XEXP (*ptr
, 0))
12413 < cfun_frame_layout
.first_restore_gpr
))
12414 *ptr
= XEXP (*ptr
, 1);
12416 ptr
= &XEXP (*ptr
, 1);
12417 new_insn
= emit_insn_before (rpat
, insn
);
12418 RTX_FRAME_RELATED_P (new_insn
) = 1;
12419 INSN_ADDRESSES_NEW (new_insn
, -1);
12422 remove_insn (insn
);
12426 if (cfun_frame_layout
.first_restore_gpr
== -1
12427 && GET_CODE (pat
) == SET
12428 && GENERAL_REG_P (SET_DEST (pat
))
12429 && GET_CODE (SET_SRC (pat
)) == MEM
)
12432 first
= REGNO (SET_DEST (set
));
12433 offset
= const0_rtx
;
12434 base
= eliminate_constant_term (XEXP (SET_SRC (set
), 0), &offset
);
12435 off
= INTVAL (offset
);
12437 if (GET_CODE (base
) != REG
|| off
< 0)
12440 if (REGNO (base
) != STACK_POINTER_REGNUM
12441 && REGNO (base
) != HARD_FRAME_POINTER_REGNUM
)
12444 remove_insn (insn
);
12450 /* On z10 and later the dynamic branch prediction must see the
12451 backward jump within a certain windows. If not it falls back to
12452 the static prediction. This function rearranges the loop backward
12453 branch in a way which makes the static prediction always correct.
12454 The function returns true if it added an instruction. */
12456 s390_fix_long_loop_prediction (rtx_insn
*insn
)
12458 rtx set
= single_set (insn
);
12459 rtx code_label
, label_ref
, new_label
;
12460 rtx_insn
*uncond_jump
;
12461 rtx_insn
*cur_insn
;
12465 /* This will exclude branch on count and branch on index patterns
12466 since these are correctly statically predicted. */
12468 || SET_DEST (set
) != pc_rtx
12469 || GET_CODE (SET_SRC(set
)) != IF_THEN_ELSE
)
12472 /* Skip conditional returns. */
12473 if (ANY_RETURN_P (XEXP (SET_SRC (set
), 1))
12474 && XEXP (SET_SRC (set
), 2) == pc_rtx
)
12477 label_ref
= (GET_CODE (XEXP (SET_SRC (set
), 1)) == LABEL_REF
?
12478 XEXP (SET_SRC (set
), 1) : XEXP (SET_SRC (set
), 2));
12480 gcc_assert (GET_CODE (label_ref
) == LABEL_REF
);
12482 code_label
= XEXP (label_ref
, 0);
12484 if (INSN_ADDRESSES (INSN_UID (code_label
)) == -1
12485 || INSN_ADDRESSES (INSN_UID (insn
)) == -1
12486 || (INSN_ADDRESSES (INSN_UID (insn
))
12487 - INSN_ADDRESSES (INSN_UID (code_label
)) < PREDICT_DISTANCE
))
12490 for (distance
= 0, cur_insn
= PREV_INSN (insn
);
12491 distance
< PREDICT_DISTANCE
- 6;
12492 distance
+= get_attr_length (cur_insn
), cur_insn
= PREV_INSN (cur_insn
))
12493 if (!cur_insn
|| JUMP_P (cur_insn
) || LABEL_P (cur_insn
))
12496 new_label
= gen_label_rtx ();
12497 uncond_jump
= emit_jump_insn_after (
12498 gen_rtx_SET (pc_rtx
,
12499 gen_rtx_LABEL_REF (VOIDmode
, code_label
)),
12501 emit_label_after (new_label
, uncond_jump
);
12503 tmp
= XEXP (SET_SRC (set
), 1);
12504 XEXP (SET_SRC (set
), 1) = XEXP (SET_SRC (set
), 2);
12505 XEXP (SET_SRC (set
), 2) = tmp
;
12506 INSN_CODE (insn
) = -1;
12508 XEXP (label_ref
, 0) = new_label
;
12509 JUMP_LABEL (insn
) = new_label
;
12510 JUMP_LABEL (uncond_jump
) = code_label
;
12515 /* Returns 1 if INSN reads the value of REG for purposes not related
12516 to addressing of memory, and 0 otherwise. */
12518 s390_non_addr_reg_read_p (rtx reg
, rtx_insn
*insn
)
12520 return reg_referenced_p (reg
, PATTERN (insn
))
12521 && !reg_used_in_mem_p (REGNO (reg
), PATTERN (insn
));
12524 /* Starting from INSN find_cond_jump looks downwards in the insn
12525 stream for a single jump insn which is the last user of the
12526 condition code set in INSN. */
12528 find_cond_jump (rtx_insn
*insn
)
12530 for (; insn
; insn
= NEXT_INSN (insn
))
12534 if (LABEL_P (insn
))
12537 if (!JUMP_P (insn
))
12539 if (reg_mentioned_p (gen_rtx_REG (CCmode
, CC_REGNUM
), insn
))
12544 /* This will be triggered by a return. */
12545 if (GET_CODE (PATTERN (insn
)) != SET
)
12548 gcc_assert (SET_DEST (PATTERN (insn
)) == pc_rtx
);
12549 ite
= SET_SRC (PATTERN (insn
));
12551 if (GET_CODE (ite
) != IF_THEN_ELSE
)
12554 cc
= XEXP (XEXP (ite
, 0), 0);
12555 if (!REG_P (cc
) || !CC_REGNO_P (REGNO (cc
)))
12558 if (find_reg_note (insn
, REG_DEAD
, cc
))
12566 /* Swap the condition in COND and the operands in OP0 and OP1 so that
12567 the semantics does not change. If NULL_RTX is passed as COND the
12568 function tries to find the conditional jump starting with INSN. */
12570 s390_swap_cmp (rtx cond
, rtx
*op0
, rtx
*op1
, rtx_insn
*insn
)
12574 if (cond
== NULL_RTX
)
12576 rtx_insn
*jump
= find_cond_jump (NEXT_INSN (insn
));
12577 rtx set
= jump
? single_set (jump
) : NULL_RTX
;
12579 if (set
== NULL_RTX
)
12582 cond
= XEXP (SET_SRC (set
), 0);
12587 PUT_CODE (cond
, swap_condition (GET_CODE (cond
)));
12590 /* On z10, instructions of the compare-and-branch family have the
12591 property to access the register occurring as second operand with
12592 its bits complemented. If such a compare is grouped with a second
12593 instruction that accesses the same register non-complemented, and
12594 if that register's value is delivered via a bypass, then the
12595 pipeline recycles, thereby causing significant performance decline.
12596 This function locates such situations and exchanges the two
12597 operands of the compare. The function return true whenever it
12600 s390_z10_optimize_cmp (rtx_insn
*insn
)
12602 rtx_insn
*prev_insn
, *next_insn
;
12603 bool insn_added_p
= false;
12604 rtx cond
, *op0
, *op1
;
12606 if (GET_CODE (PATTERN (insn
)) == PARALLEL
)
12608 /* Handle compare and branch and branch on count
12610 rtx pattern
= single_set (insn
);
12613 || SET_DEST (pattern
) != pc_rtx
12614 || GET_CODE (SET_SRC (pattern
)) != IF_THEN_ELSE
)
12617 cond
= XEXP (SET_SRC (pattern
), 0);
12618 op0
= &XEXP (cond
, 0);
12619 op1
= &XEXP (cond
, 1);
12621 else if (GET_CODE (PATTERN (insn
)) == SET
)
12625 /* Handle normal compare instructions. */
12626 src
= SET_SRC (PATTERN (insn
));
12627 dest
= SET_DEST (PATTERN (insn
));
12630 || !CC_REGNO_P (REGNO (dest
))
12631 || GET_CODE (src
) != COMPARE
)
12634 /* s390_swap_cmp will try to find the conditional
12635 jump when passing NULL_RTX as condition. */
12637 op0
= &XEXP (src
, 0);
12638 op1
= &XEXP (src
, 1);
12643 if (!REG_P (*op0
) || !REG_P (*op1
))
12646 if (GET_MODE_CLASS (GET_MODE (*op0
)) != MODE_INT
)
12649 /* Swap the COMPARE arguments and its mask if there is a
12650 conflicting access in the previous insn. */
12651 prev_insn
= prev_active_insn (insn
);
12652 if (prev_insn
!= NULL_RTX
&& INSN_P (prev_insn
)
12653 && reg_referenced_p (*op1
, PATTERN (prev_insn
)))
12654 s390_swap_cmp (cond
, op0
, op1
, insn
);
12656 /* Check if there is a conflict with the next insn. If there
12657 was no conflict with the previous insn, then swap the
12658 COMPARE arguments and its mask. If we already swapped
12659 the operands, or if swapping them would cause a conflict
12660 with the previous insn, issue a NOP after the COMPARE in
12661 order to separate the two instuctions. */
12662 next_insn
= next_active_insn (insn
);
12663 if (next_insn
!= NULL_RTX
&& INSN_P (next_insn
)
12664 && s390_non_addr_reg_read_p (*op1
, next_insn
))
12666 if (prev_insn
!= NULL_RTX
&& INSN_P (prev_insn
)
12667 && s390_non_addr_reg_read_p (*op0
, prev_insn
))
12669 if (REGNO (*op1
) == 0)
12670 emit_insn_after (gen_nop1 (), insn
);
12672 emit_insn_after (gen_nop (), insn
);
12673 insn_added_p
= true;
12676 s390_swap_cmp (cond
, op0
, op1
, insn
);
12678 return insn_added_p
;
12681 /* Perform machine-dependent processing. */
12686 bool pool_overflow
= false;
12687 int hw_before
, hw_after
;
12689 /* Make sure all splits have been performed; splits after
12690 machine_dependent_reorg might confuse insn length counts. */
12691 split_all_insns_noflow ();
12693 /* Install the main literal pool and the associated base
12694 register load insns.
12696 In addition, there are two problematic situations we need
12699 - the literal pool might be > 4096 bytes in size, so that
12700 some of its elements cannot be directly accessed
12702 - a branch target might be > 64K away from the branch, so that
12703 it is not possible to use a PC-relative instruction.
12705 To fix those, we split the single literal pool into multiple
12706 pool chunks, reloading the pool base register at various
12707 points throughout the function to ensure it always points to
12708 the pool chunk the following code expects, and / or replace
12709 PC-relative branches by absolute branches.
12711 However, the two problems are interdependent: splitting the
12712 literal pool can move a branch further away from its target,
12713 causing the 64K limit to overflow, and on the other hand,
12714 replacing a PC-relative branch by an absolute branch means
12715 we need to put the branch target address into the literal
12716 pool, possibly causing it to overflow.
12718 So, we loop trying to fix up both problems until we manage
12719 to satisfy both conditions at the same time. Note that the
12720 loop is guaranteed to terminate as every pass of the loop
12721 strictly decreases the total number of PC-relative branches
12722 in the function. (This is not completely true as there
12723 might be branch-over-pool insns introduced by chunkify_start.
12724 Those never need to be split however.) */
12728 struct constant_pool
*pool
= NULL
;
12730 /* Collect the literal pool. */
12731 if (!pool_overflow
)
12733 pool
= s390_mainpool_start ();
12735 pool_overflow
= true;
12738 /* If literal pool overflowed, start to chunkify it. */
12740 pool
= s390_chunkify_start ();
12742 /* Split out-of-range branches. If this has created new
12743 literal pool entries, cancel current chunk list and
12744 recompute it. zSeries machines have large branch
12745 instructions, so we never need to split a branch. */
12746 if (!TARGET_CPU_ZARCH
&& s390_split_branches ())
12749 s390_chunkify_cancel (pool
);
12751 s390_mainpool_cancel (pool
);
12756 /* If we made it up to here, both conditions are satisfied.
12757 Finish up literal pool related changes. */
12759 s390_chunkify_finish (pool
);
12761 s390_mainpool_finish (pool
);
12763 /* We're done splitting branches. */
12764 cfun
->machine
->split_branches_pending_p
= false;
12768 /* Generate out-of-pool execute target insns. */
12769 if (TARGET_CPU_ZARCH
)
12771 rtx_insn
*insn
, *target
;
12774 for (insn
= get_insns (); insn
; insn
= NEXT_INSN (insn
))
12776 label
= s390_execute_label (insn
);
12780 gcc_assert (label
!= const0_rtx
);
12782 target
= emit_label (XEXP (label
, 0));
12783 INSN_ADDRESSES_NEW (target
, -1);
12785 target
= emit_insn (s390_execute_target (insn
));
12786 INSN_ADDRESSES_NEW (target
, -1);
12790 /* Try to optimize prologue and epilogue further. */
12791 s390_optimize_prologue ();
12793 /* Walk over the insns and do some >=z10 specific changes. */
12794 if (s390_tune
== PROCESSOR_2097_Z10
12795 || s390_tune
== PROCESSOR_2817_Z196
12796 || s390_tune
== PROCESSOR_2827_ZEC12
12797 || s390_tune
== PROCESSOR_2964_Z13
)
12800 bool insn_added_p
= false;
12802 /* The insn lengths and addresses have to be up to date for the
12803 following manipulations. */
12804 shorten_branches (get_insns ());
12806 for (insn
= get_insns (); insn
; insn
= NEXT_INSN (insn
))
12808 if (!INSN_P (insn
) || INSN_CODE (insn
) <= 0)
12812 insn_added_p
|= s390_fix_long_loop_prediction (insn
);
12814 if ((GET_CODE (PATTERN (insn
)) == PARALLEL
12815 || GET_CODE (PATTERN (insn
)) == SET
)
12816 && s390_tune
== PROCESSOR_2097_Z10
)
12817 insn_added_p
|= s390_z10_optimize_cmp (insn
);
12820 /* Adjust branches if we added new instructions. */
12822 shorten_branches (get_insns ());
12825 s390_function_num_hotpatch_hw (current_function_decl
, &hw_before
, &hw_after
);
12830 /* Insert NOPs for hotpatching. */
12831 for (insn
= get_insns (); insn
; insn
= NEXT_INSN (insn
))
12833 1. inside the area covered by debug information to allow setting
12834 breakpoints at the NOPs,
12835 2. before any insn which results in an asm instruction,
12836 3. before in-function labels to avoid jumping to the NOPs, for
12837 example as part of a loop,
12838 4. before any barrier in case the function is completely empty
12839 (__builtin_unreachable ()) and has neither internal labels nor
12842 if (active_insn_p (insn
) || BARRIER_P (insn
) || LABEL_P (insn
))
12844 /* Output a series of NOPs before the first active insn. */
12845 while (insn
&& hw_after
> 0)
12847 if (hw_after
>= 3 && TARGET_CPU_ZARCH
)
12849 emit_insn_before (gen_nop_6_byte (), insn
);
12852 else if (hw_after
>= 2)
12854 emit_insn_before (gen_nop_4_byte (), insn
);
12859 emit_insn_before (gen_nop_2_byte (), insn
);
12866 /* Return true if INSN is a fp load insn writing register REGNO. */
12868 s390_fpload_toreg (rtx_insn
*insn
, unsigned int regno
)
12871 enum attr_type flag
= s390_safe_attr_type (insn
);
12873 if (flag
!= TYPE_FLOADSF
&& flag
!= TYPE_FLOADDF
)
12876 set
= single_set (insn
);
12878 if (set
== NULL_RTX
)
12881 if (!REG_P (SET_DEST (set
)) || !MEM_P (SET_SRC (set
)))
12884 if (REGNO (SET_DEST (set
)) != regno
)
12890 /* This value describes the distance to be avoided between an
12891 aritmetic fp instruction and an fp load writing the same register.
12892 Z10_EARLYLOAD_DISTANCE - 1 as well as Z10_EARLYLOAD_DISTANCE + 1 is
12893 fine but the exact value has to be avoided. Otherwise the FP
12894 pipeline will throw an exception causing a major penalty. */
12895 #define Z10_EARLYLOAD_DISTANCE 7
12897 /* Rearrange the ready list in order to avoid the situation described
12898 for Z10_EARLYLOAD_DISTANCE. A problematic load instruction is
12899 moved to the very end of the ready list. */
12901 s390_z10_prevent_earlyload_conflicts (rtx_insn
**ready
, int *nready_p
)
12903 unsigned int regno
;
12904 int nready
= *nready_p
;
12909 enum attr_type flag
;
12912 /* Skip DISTANCE - 1 active insns. */
12913 for (insn
= last_scheduled_insn
, distance
= Z10_EARLYLOAD_DISTANCE
- 1;
12914 distance
> 0 && insn
!= NULL_RTX
;
12915 distance
--, insn
= prev_active_insn (insn
))
12916 if (CALL_P (insn
) || JUMP_P (insn
))
12919 if (insn
== NULL_RTX
)
12922 set
= single_set (insn
);
12924 if (set
== NULL_RTX
|| !REG_P (SET_DEST (set
))
12925 || GET_MODE_CLASS (GET_MODE (SET_DEST (set
))) != MODE_FLOAT
)
12928 flag
= s390_safe_attr_type (insn
);
12930 if (flag
== TYPE_FLOADSF
|| flag
== TYPE_FLOADDF
)
12933 regno
= REGNO (SET_DEST (set
));
12936 while (!s390_fpload_toreg (ready
[i
], regno
) && i
> 0)
12943 memmove (&ready
[1], &ready
[0], sizeof (rtx_insn
*) * i
);
12948 /* The s390_sched_state variable tracks the state of the current or
12949 the last instruction group.
12951 0,1,2 number of instructions scheduled in the current group
12952 3 the last group is complete - normal insns
12953 4 the last group was a cracked/expanded insn */
12955 static int s390_sched_state
;
12957 #define S390_OOO_SCHED_STATE_NORMAL 3
12958 #define S390_OOO_SCHED_STATE_CRACKED 4
12960 #define S390_OOO_SCHED_ATTR_MASK_CRACKED 0x1
12961 #define S390_OOO_SCHED_ATTR_MASK_EXPANDED 0x2
12962 #define S390_OOO_SCHED_ATTR_MASK_ENDGROUP 0x4
12963 #define S390_OOO_SCHED_ATTR_MASK_GROUPALONE 0x8
12965 static unsigned int
12966 s390_get_sched_attrmask (rtx_insn
*insn
)
12968 unsigned int mask
= 0;
12970 if (get_attr_ooo_cracked (insn
))
12971 mask
|= S390_OOO_SCHED_ATTR_MASK_CRACKED
;
12972 if (get_attr_ooo_expanded (insn
))
12973 mask
|= S390_OOO_SCHED_ATTR_MASK_EXPANDED
;
12974 if (get_attr_ooo_endgroup (insn
))
12975 mask
|= S390_OOO_SCHED_ATTR_MASK_ENDGROUP
;
12976 if (get_attr_ooo_groupalone (insn
))
12977 mask
|= S390_OOO_SCHED_ATTR_MASK_GROUPALONE
;
12981 /* Return the scheduling score for INSN. The higher the score the
12982 better. The score is calculated from the OOO scheduling attributes
12983 of INSN and the scheduling state s390_sched_state. */
12985 s390_sched_score (rtx_insn
*insn
)
12987 unsigned int mask
= s390_get_sched_attrmask (insn
);
12990 switch (s390_sched_state
)
12993 /* Try to put insns into the first slot which would otherwise
12995 if ((mask
& S390_OOO_SCHED_ATTR_MASK_CRACKED
) != 0
12996 || (mask
& S390_OOO_SCHED_ATTR_MASK_EXPANDED
) != 0)
12998 if ((mask
& S390_OOO_SCHED_ATTR_MASK_GROUPALONE
) != 0)
13001 /* Prefer not cracked insns while trying to put together a
13003 if ((mask
& S390_OOO_SCHED_ATTR_MASK_CRACKED
) == 0
13004 && (mask
& S390_OOO_SCHED_ATTR_MASK_EXPANDED
) == 0
13005 && (mask
& S390_OOO_SCHED_ATTR_MASK_GROUPALONE
) == 0)
13007 if ((mask
& S390_OOO_SCHED_ATTR_MASK_ENDGROUP
) == 0)
13011 /* Prefer not cracked insns while trying to put together a
13013 if ((mask
& S390_OOO_SCHED_ATTR_MASK_CRACKED
) == 0
13014 && (mask
& S390_OOO_SCHED_ATTR_MASK_EXPANDED
) == 0
13015 && (mask
& S390_OOO_SCHED_ATTR_MASK_GROUPALONE
) == 0)
13017 /* Prefer endgroup insns in the last slot. */
13018 if ((mask
& S390_OOO_SCHED_ATTR_MASK_ENDGROUP
) != 0)
13021 case S390_OOO_SCHED_STATE_NORMAL
:
13022 /* Prefer not cracked insns if the last was not cracked. */
13023 if ((mask
& S390_OOO_SCHED_ATTR_MASK_CRACKED
) == 0
13024 && (mask
& S390_OOO_SCHED_ATTR_MASK_EXPANDED
) == 0)
13026 if ((mask
& S390_OOO_SCHED_ATTR_MASK_GROUPALONE
) != 0)
13029 case S390_OOO_SCHED_STATE_CRACKED
:
13030 /* Try to keep cracked insns together to prevent them from
13031 interrupting groups. */
13032 if ((mask
& S390_OOO_SCHED_ATTR_MASK_CRACKED
) != 0
13033 || (mask
& S390_OOO_SCHED_ATTR_MASK_EXPANDED
) != 0)
13040 /* This function is called via hook TARGET_SCHED_REORDER before
13041 issuing one insn from list READY which contains *NREADYP entries.
13042 For target z10 it reorders load instructions to avoid early load
13043 conflicts in the floating point pipeline */
13045 s390_sched_reorder (FILE *file
, int verbose
,
13046 rtx_insn
**ready
, int *nreadyp
, int clock ATTRIBUTE_UNUSED
)
13048 if (s390_tune
== PROCESSOR_2097_Z10
)
13049 if (reload_completed
&& *nreadyp
> 1)
13050 s390_z10_prevent_earlyload_conflicts (ready
, nreadyp
);
13052 if ((s390_tune
== PROCESSOR_2827_ZEC12
13053 || s390_tune
== PROCESSOR_2964_Z13
)
13054 && reload_completed
13058 int last_index
= *nreadyp
- 1;
13059 int max_index
= -1;
13060 int max_score
= -1;
13063 /* Just move the insn with the highest score to the top (the
13064 end) of the list. A full sort is not needed since a conflict
13065 in the hazard recognition cannot happen. So the top insn in
13066 the ready list will always be taken. */
13067 for (i
= last_index
; i
>= 0; i
--)
13071 if (recog_memoized (ready
[i
]) < 0)
13074 score
= s390_sched_score (ready
[i
]);
13075 if (score
> max_score
)
13082 if (max_index
!= -1)
13084 if (max_index
!= last_index
)
13086 tmp
= ready
[max_index
];
13087 ready
[max_index
] = ready
[last_index
];
13088 ready
[last_index
] = tmp
;
13092 "move insn %d to the top of list\n",
13093 INSN_UID (ready
[last_index
]));
13095 else if (verbose
> 5)
13097 "best insn %d already on top\n",
13098 INSN_UID (ready
[last_index
]));
13103 fprintf (file
, "ready list ooo attributes - sched state: %d\n",
13106 for (i
= last_index
; i
>= 0; i
--)
13108 if (recog_memoized (ready
[i
]) < 0)
13110 fprintf (file
, "insn %d score: %d: ", INSN_UID (ready
[i
]),
13111 s390_sched_score (ready
[i
]));
13112 #define PRINT_OOO_ATTR(ATTR) fprintf (file, "%s ", get_attr_##ATTR (ready[i]) ? #ATTR : "!" #ATTR);
13113 PRINT_OOO_ATTR (ooo_cracked
);
13114 PRINT_OOO_ATTR (ooo_expanded
);
13115 PRINT_OOO_ATTR (ooo_endgroup
);
13116 PRINT_OOO_ATTR (ooo_groupalone
);
13117 #undef PRINT_OOO_ATTR
13118 fprintf (file
, "\n");
13123 return s390_issue_rate ();
13127 /* This function is called via hook TARGET_SCHED_VARIABLE_ISSUE after
13128 the scheduler has issued INSN. It stores the last issued insn into
13129 last_scheduled_insn in order to make it available for
13130 s390_sched_reorder. */
13132 s390_sched_variable_issue (FILE *file
, int verbose
, rtx_insn
*insn
, int more
)
13134 last_scheduled_insn
= insn
;
13136 if ((s390_tune
== PROCESSOR_2827_ZEC12
13137 || s390_tune
== PROCESSOR_2964_Z13
)
13138 && reload_completed
13139 && recog_memoized (insn
) >= 0)
13141 unsigned int mask
= s390_get_sched_attrmask (insn
);
13143 if ((mask
& S390_OOO_SCHED_ATTR_MASK_CRACKED
) != 0
13144 || (mask
& S390_OOO_SCHED_ATTR_MASK_EXPANDED
) != 0)
13145 s390_sched_state
= S390_OOO_SCHED_STATE_CRACKED
;
13146 else if ((mask
& S390_OOO_SCHED_ATTR_MASK_ENDGROUP
) != 0
13147 || (mask
& S390_OOO_SCHED_ATTR_MASK_GROUPALONE
) != 0)
13148 s390_sched_state
= S390_OOO_SCHED_STATE_NORMAL
;
13151 /* Only normal insns are left (mask == 0). */
13152 switch (s390_sched_state
)
13157 case S390_OOO_SCHED_STATE_NORMAL
:
13158 if (s390_sched_state
== S390_OOO_SCHED_STATE_NORMAL
)
13159 s390_sched_state
= 1;
13161 s390_sched_state
++;
13164 case S390_OOO_SCHED_STATE_CRACKED
:
13165 s390_sched_state
= S390_OOO_SCHED_STATE_NORMAL
;
13171 fprintf (file
, "insn %d: ", INSN_UID (insn
));
13172 #define PRINT_OOO_ATTR(ATTR) \
13173 fprintf (file, "%s ", get_attr_##ATTR (insn) ? #ATTR : "");
13174 PRINT_OOO_ATTR (ooo_cracked
);
13175 PRINT_OOO_ATTR (ooo_expanded
);
13176 PRINT_OOO_ATTR (ooo_endgroup
);
13177 PRINT_OOO_ATTR (ooo_groupalone
);
13178 #undef PRINT_OOO_ATTR
13179 fprintf (file
, "\n");
13180 fprintf (file
, "sched state: %d\n", s390_sched_state
);
13184 if (GET_CODE (PATTERN (insn
)) != USE
13185 && GET_CODE (PATTERN (insn
)) != CLOBBER
)
13192 s390_sched_init (FILE *file ATTRIBUTE_UNUSED
,
13193 int verbose ATTRIBUTE_UNUSED
,
13194 int max_ready ATTRIBUTE_UNUSED
)
13196 last_scheduled_insn
= NULL
;
13197 s390_sched_state
= 0;
13200 /* This target hook implementation for TARGET_LOOP_UNROLL_ADJUST calculates
13201 a new number struct loop *loop should be unrolled if tuned for cpus with
13202 a built-in stride prefetcher.
13203 The loop is analyzed for memory accesses by calling check_dpu for
13204 each rtx of the loop. Depending on the loop_depth and the amount of
13205 memory accesses a new number <=nunroll is returned to improve the
13206 behaviour of the hardware prefetch unit. */
13208 s390_loop_unroll_adjust (unsigned nunroll
, struct loop
*loop
)
13213 unsigned mem_count
= 0;
13215 if (s390_tune
!= PROCESSOR_2097_Z10
13216 && s390_tune
!= PROCESSOR_2817_Z196
13217 && s390_tune
!= PROCESSOR_2827_ZEC12
13218 && s390_tune
!= PROCESSOR_2964_Z13
)
13221 /* Count the number of memory references within the loop body. */
13222 bbs
= get_loop_body (loop
);
13223 subrtx_iterator::array_type array
;
13224 for (i
= 0; i
< loop
->num_nodes
; i
++)
13225 FOR_BB_INSNS (bbs
[i
], insn
)
13226 if (INSN_P (insn
) && INSN_CODE (insn
) != -1)
13227 FOR_EACH_SUBRTX (iter
, array
, PATTERN (insn
), NONCONST
)
13232 /* Prevent division by zero, and we do not need to adjust nunroll in this case. */
13233 if (mem_count
== 0)
13236 switch (loop_depth(loop
))
13239 return MIN (nunroll
, 28 / mem_count
);
13241 return MIN (nunroll
, 22 / mem_count
);
13243 return MIN (nunroll
, 16 / mem_count
);
13248 s390_option_override (void)
13251 cl_deferred_option
*opt
;
13252 vec
<cl_deferred_option
> *v
=
13253 (vec
<cl_deferred_option
> *) s390_deferred_options
;
13256 FOR_EACH_VEC_ELT (*v
, i
, opt
)
13258 switch (opt
->opt_index
)
13260 case OPT_mhotpatch_
:
13267 strncpy (s
, opt
->arg
, 256);
13269 t
= strchr (s
, ',');
13274 val1
= integral_argument (s
);
13275 val2
= integral_argument (t
);
13282 if (val1
== -1 || val2
== -1)
13284 /* argument is not a plain number */
13285 error ("arguments to %qs should be non-negative integers",
13289 else if (val1
> s390_hotpatch_hw_max
13290 || val2
> s390_hotpatch_hw_max
)
13292 error ("argument to %qs is too large (max. %d)",
13293 "-mhotpatch=n,m", s390_hotpatch_hw_max
);
13296 s390_hotpatch_hw_before_label
= val1
;
13297 s390_hotpatch_hw_after_label
= val2
;
13301 gcc_unreachable ();
13305 /* Set up function hooks. */
13306 init_machine_status
= s390_init_machine_status
;
13308 /* Architecture mode defaults according to ABI. */
13309 if (!(target_flags_explicit
& MASK_ZARCH
))
13312 target_flags
|= MASK_ZARCH
;
13314 target_flags
&= ~MASK_ZARCH
;
13317 /* Set the march default in case it hasn't been specified on
13319 if (s390_arch
== PROCESSOR_max
)
13321 s390_arch_string
= TARGET_ZARCH
? "z900" : "g5";
13322 s390_arch
= TARGET_ZARCH
? PROCESSOR_2064_Z900
: PROCESSOR_9672_G5
;
13323 s390_arch_flags
= processor_flags_table
[(int)s390_arch
];
13326 /* Determine processor to tune for. */
13327 if (s390_tune
== PROCESSOR_max
)
13329 s390_tune
= s390_arch
;
13330 s390_tune_flags
= s390_arch_flags
;
13333 /* Sanity checks. */
13334 if (s390_arch
== PROCESSOR_NATIVE
|| s390_tune
== PROCESSOR_NATIVE
)
13335 gcc_unreachable ();
13336 if (TARGET_ZARCH
&& !TARGET_CPU_ZARCH
)
13337 error ("z/Architecture mode not supported on %s", s390_arch_string
);
13338 if (TARGET_64BIT
&& !TARGET_ZARCH
)
13339 error ("64-bit ABI not supported in ESA/390 mode");
13341 /* Use hardware DFP if available and not explicitly disabled by
13342 user. E.g. with -m31 -march=z10 -mzarch */
13343 if (!(target_flags_explicit
& MASK_HARD_DFP
) && TARGET_DFP
)
13344 target_flags
|= MASK_HARD_DFP
;
13346 /* Enable hardware transactions if available and not explicitly
13347 disabled by user. E.g. with -m31 -march=zEC12 -mzarch */
13348 if (!(target_flags_explicit
& MASK_OPT_HTM
) && TARGET_CPU_HTM
&& TARGET_ZARCH
)
13349 target_flags
|= MASK_OPT_HTM
;
13351 if (target_flags_explicit
& MASK_OPT_VX
)
13355 if (!TARGET_CPU_VX
)
13356 error ("hardware vector support not available on %s",
13358 if (TARGET_SOFT_FLOAT
)
13359 error ("hardware vector support not available with -msoft-float");
13362 else if (TARGET_CPU_VX
)
13363 /* Enable vector support if available and not explicitly disabled
13364 by user. E.g. with -m31 -march=z13 -mzarch */
13365 target_flags
|= MASK_OPT_VX
;
13367 if (TARGET_HARD_DFP
&& !TARGET_DFP
)
13369 if (target_flags_explicit
& MASK_HARD_DFP
)
13371 if (!TARGET_CPU_DFP
)
13372 error ("hardware decimal floating point instructions"
13373 " not available on %s", s390_arch_string
);
13375 error ("hardware decimal floating point instructions"
13376 " not available in ESA/390 mode");
13379 target_flags
&= ~MASK_HARD_DFP
;
13382 if ((target_flags_explicit
& MASK_SOFT_FLOAT
) && TARGET_SOFT_FLOAT
)
13384 if ((target_flags_explicit
& MASK_HARD_DFP
) && TARGET_HARD_DFP
)
13385 error ("-mhard-dfp can%'t be used in conjunction with -msoft-float");
13387 target_flags
&= ~MASK_HARD_DFP
;
13390 /* Set processor cost function. */
13393 case PROCESSOR_2084_Z990
:
13394 s390_cost
= &z990_cost
;
13396 case PROCESSOR_2094_Z9_109
:
13397 s390_cost
= &z9_109_cost
;
13399 case PROCESSOR_2097_Z10
:
13400 s390_cost
= &z10_cost
;
13402 case PROCESSOR_2817_Z196
:
13403 s390_cost
= &z196_cost
;
13405 case PROCESSOR_2827_ZEC12
:
13406 case PROCESSOR_2964_Z13
:
13407 s390_cost
= &zEC12_cost
;
13410 s390_cost
= &z900_cost
;
13413 if (TARGET_BACKCHAIN
&& TARGET_PACKED_STACK
&& TARGET_HARD_FLOAT
)
13414 error ("-mbackchain -mpacked-stack -mhard-float are not supported "
13417 if (s390_stack_size
)
13419 if (s390_stack_guard
>= s390_stack_size
)
13420 error ("stack size must be greater than the stack guard value");
13421 else if (s390_stack_size
> 1 << 16)
13422 error ("stack size must not be greater than 64k");
13424 else if (s390_stack_guard
)
13425 error ("-mstack-guard implies use of -mstack-size");
13427 #ifdef TARGET_DEFAULT_LONG_DOUBLE_128
13428 if (!(target_flags_explicit
& MASK_LONG_DOUBLE_128
))
13429 target_flags
|= MASK_LONG_DOUBLE_128
;
13432 if (s390_tune
== PROCESSOR_2097_Z10
13433 || s390_tune
== PROCESSOR_2817_Z196
13434 || s390_tune
== PROCESSOR_2827_ZEC12
13435 || s390_tune
== PROCESSOR_2964_Z13
)
13437 maybe_set_param_value (PARAM_MAX_UNROLLED_INSNS
, 100,
13438 global_options
.x_param_values
,
13439 global_options_set
.x_param_values
);
13440 maybe_set_param_value (PARAM_MAX_UNROLL_TIMES
, 32,
13441 global_options
.x_param_values
,
13442 global_options_set
.x_param_values
);
13443 maybe_set_param_value (PARAM_MAX_COMPLETELY_PEELED_INSNS
, 2000,
13444 global_options
.x_param_values
,
13445 global_options_set
.x_param_values
);
13446 maybe_set_param_value (PARAM_MAX_COMPLETELY_PEEL_TIMES
, 64,
13447 global_options
.x_param_values
,
13448 global_options_set
.x_param_values
);
13451 maybe_set_param_value (PARAM_MAX_PENDING_LIST_LENGTH
, 256,
13452 global_options
.x_param_values
,
13453 global_options_set
.x_param_values
);
13454 /* values for loop prefetching */
13455 maybe_set_param_value (PARAM_L1_CACHE_LINE_SIZE
, 256,
13456 global_options
.x_param_values
,
13457 global_options_set
.x_param_values
);
13458 maybe_set_param_value (PARAM_L1_CACHE_SIZE
, 128,
13459 global_options
.x_param_values
,
13460 global_options_set
.x_param_values
);
13461 /* s390 has more than 2 levels and the size is much larger. Since
13462 we are always running virtualized assume that we only get a small
13463 part of the caches above l1. */
13464 maybe_set_param_value (PARAM_L2_CACHE_SIZE
, 1500,
13465 global_options
.x_param_values
,
13466 global_options_set
.x_param_values
);
13467 maybe_set_param_value (PARAM_PREFETCH_MIN_INSN_TO_MEM_RATIO
, 2,
13468 global_options
.x_param_values
,
13469 global_options_set
.x_param_values
);
13470 maybe_set_param_value (PARAM_SIMULTANEOUS_PREFETCHES
, 6,
13471 global_options
.x_param_values
,
13472 global_options_set
.x_param_values
);
13474 /* This cannot reside in s390_option_optimization_table since HAVE_prefetch
13475 requires the arch flags to be evaluated already. Since prefetching
13476 is beneficial on s390, we enable it if available. */
13477 if (flag_prefetch_loop_arrays
< 0 && HAVE_prefetch
&& optimize
>= 3)
13478 flag_prefetch_loop_arrays
= 1;
13480 /* Use the alternative scheduling-pressure algorithm by default. */
13481 maybe_set_param_value (PARAM_SCHED_PRESSURE_ALGORITHM
, 2,
13482 global_options
.x_param_values
,
13483 global_options_set
.x_param_values
);
13487 /* Don't emit DWARF3/4 unless specifically selected. The TPF
13488 debuggers do not yet support DWARF 3/4. */
13489 if (!global_options_set
.x_dwarf_strict
)
13491 if (!global_options_set
.x_dwarf_version
)
13495 /* Register a target-specific optimization-and-lowering pass
13496 to run immediately before prologue and epilogue generation.
13498 Registering the pass must be done at start up. It's
13499 convenient to do it here. */
13500 opt_pass
*new_pass
= new pass_s390_early_mach (g
);
13501 struct register_pass_info insert_pass_s390_early_mach
=
13503 new_pass
, /* pass */
13504 "pro_and_epilogue", /* reference_pass_name */
13505 1, /* ref_pass_instance_number */
13506 PASS_POS_INSERT_BEFORE
/* po_op */
13508 register_pass (&insert_pass_s390_early_mach
);
13511 /* Implement TARGET_USE_BY_PIECES_INFRASTRUCTURE_P. */
13514 s390_use_by_pieces_infrastructure_p (unsigned HOST_WIDE_INT size
,
13515 unsigned int align ATTRIBUTE_UNUSED
,
13516 enum by_pieces_operation op ATTRIBUTE_UNUSED
,
13517 bool speed_p ATTRIBUTE_UNUSED
)
13519 return (size
== 1 || size
== 2
13520 || size
== 4 || (TARGET_ZARCH
&& size
== 8));
13523 /* Implement TARGET_ATOMIC_ASSIGN_EXPAND_FENV hook. */
13526 s390_atomic_assign_expand_fenv (tree
*hold
, tree
*clear
, tree
*update
)
13528 tree sfpc
= s390_builtin_decls
[S390_BUILTIN_s390_sfpc
];
13529 tree efpc
= s390_builtin_decls
[S390_BUILTIN_s390_efpc
];
13530 tree call_efpc
= build_call_expr (efpc
, 0);
13531 tree fenv_var
= create_tmp_var (unsigned_type_node
);
13533 #define FPC_EXCEPTION_MASK HOST_WIDE_INT_UC (0xf8000000)
13534 #define FPC_FLAGS_MASK HOST_WIDE_INT_UC (0x00f80000)
13535 #define FPC_DXC_MASK HOST_WIDE_INT_UC (0x0000ff00)
13536 #define FPC_EXCEPTION_MASK_SHIFT HOST_WIDE_INT_UC (24)
13537 #define FPC_FLAGS_SHIFT HOST_WIDE_INT_UC (16)
13538 #define FPC_DXC_SHIFT HOST_WIDE_INT_UC (8)
13540 /* Generates the equivalent of feholdexcept (&fenv_var)
13542 fenv_var = __builtin_s390_efpc ();
13543 __builtin_s390_sfpc (fenv_var & mask) */
13544 tree old_fpc
= build2 (MODIFY_EXPR
, unsigned_type_node
, fenv_var
, call_efpc
);
13546 build2 (BIT_AND_EXPR
, unsigned_type_node
, fenv_var
,
13547 build_int_cst (unsigned_type_node
,
13548 ~(FPC_DXC_MASK
| FPC_FLAGS_MASK
|
13549 FPC_EXCEPTION_MASK
)));
13550 tree set_new_fpc
= build_call_expr (sfpc
, 1, new_fpc
);
13551 *hold
= build2 (COMPOUND_EXPR
, void_type_node
, old_fpc
, set_new_fpc
);
13553 /* Generates the equivalent of feclearexcept (FE_ALL_EXCEPT)
13555 __builtin_s390_sfpc (__builtin_s390_efpc () & mask) */
13556 new_fpc
= build2 (BIT_AND_EXPR
, unsigned_type_node
, call_efpc
,
13557 build_int_cst (unsigned_type_node
,
13558 ~(FPC_DXC_MASK
| FPC_FLAGS_MASK
)));
13559 *clear
= build_call_expr (sfpc
, 1, new_fpc
);
13561 /* Generates the equivalent of feupdateenv (fenv_var)
13563 old_fpc = __builtin_s390_efpc ();
13564 __builtin_s390_sfpc (fenv_var);
13565 __atomic_feraiseexcept ((old_fpc & FPC_FLAGS_MASK) >> FPC_FLAGS_SHIFT); */
13567 old_fpc
= create_tmp_var (unsigned_type_node
);
13568 tree store_old_fpc
= build2 (MODIFY_EXPR
, void_type_node
,
13569 old_fpc
, call_efpc
);
13571 set_new_fpc
= build_call_expr (sfpc
, 1, fenv_var
);
13573 tree raise_old_except
= build2 (BIT_AND_EXPR
, unsigned_type_node
, old_fpc
,
13574 build_int_cst (unsigned_type_node
,
13576 raise_old_except
= build2 (RSHIFT_EXPR
, unsigned_type_node
, raise_old_except
,
13577 build_int_cst (unsigned_type_node
,
13579 tree atomic_feraiseexcept
13580 = builtin_decl_implicit (BUILT_IN_ATOMIC_FERAISEEXCEPT
);
13581 raise_old_except
= build_call_expr (atomic_feraiseexcept
,
13582 1, raise_old_except
);
13584 *update
= build2 (COMPOUND_EXPR
, void_type_node
,
13585 build2 (COMPOUND_EXPR
, void_type_node
,
13586 store_old_fpc
, set_new_fpc
),
13589 #undef FPC_EXCEPTION_MASK
13590 #undef FPC_FLAGS_MASK
13591 #undef FPC_DXC_MASK
13592 #undef FPC_EXCEPTION_MASK_SHIFT
13593 #undef FPC_FLAGS_SHIFT
13594 #undef FPC_DXC_SHIFT
13597 /* Return the vector mode to be used for inner mode MODE when doing
13599 static machine_mode
13600 s390_preferred_simd_mode (machine_mode mode
)
13620 /* Our hardware does not require vectors to be strictly aligned. */
13622 s390_support_vector_misalignment (machine_mode mode ATTRIBUTE_UNUSED
,
13623 const_tree type ATTRIBUTE_UNUSED
,
13624 int misalignment ATTRIBUTE_UNUSED
,
13625 bool is_packed ATTRIBUTE_UNUSED
)
13630 /* The vector ABI requires vector types to be aligned on an 8 byte
13631 boundary (our stack alignment). However, we allow this to be
13632 overriden by the user, while this definitely breaks the ABI. */
13633 static HOST_WIDE_INT
13634 s390_vector_alignment (const_tree type
)
13636 if (!TARGET_VX_ABI
)
13637 return default_vector_alignment (type
);
13639 if (TYPE_USER_ALIGN (type
))
13640 return TYPE_ALIGN (type
);
13642 return MIN (64, tree_to_shwi (TYPE_SIZE (type
)));
13646 /* Return true if TYPE is a vector bool type. */
13648 s390_vector_bool_type_p (const_tree type
)
13650 return TYPE_VECTOR_OPAQUE (type
);
13653 /* Return the diagnostic message string if the binary operation OP is
13654 not permitted on TYPE1 and TYPE2, NULL otherwise. */
13656 s390_invalid_binary_op (int op ATTRIBUTE_UNUSED
, const_tree type1
, const_tree type2
)
13658 bool bool1_p
, bool2_p
;
13662 machine_mode mode1
, mode2
;
13664 if (!TARGET_ZVECTOR
)
13667 if (!VECTOR_TYPE_P (type1
) || !VECTOR_TYPE_P (type2
))
13670 bool1_p
= s390_vector_bool_type_p (type1
);
13671 bool2_p
= s390_vector_bool_type_p (type2
);
13673 /* Mixing signed and unsigned types is forbidden for all
13675 if (!bool1_p
&& !bool2_p
13676 && TYPE_UNSIGNED (type1
) != TYPE_UNSIGNED (type2
))
13677 return N_("types differ in signess");
13679 plusminus_p
= (op
== PLUS_EXPR
|| op
== MINUS_EXPR
);
13680 muldiv_p
= (op
== MULT_EXPR
|| op
== RDIV_EXPR
|| op
== TRUNC_DIV_EXPR
13681 || op
== CEIL_DIV_EXPR
|| op
== FLOOR_DIV_EXPR
13682 || op
== ROUND_DIV_EXPR
);
13683 compare_p
= (op
== LT_EXPR
|| op
== LE_EXPR
|| op
== GT_EXPR
|| op
== GE_EXPR
13684 || op
== EQ_EXPR
|| op
== NE_EXPR
);
13686 if (bool1_p
&& bool2_p
&& (plusminus_p
|| muldiv_p
))
13687 return N_("binary operator does not support two vector bool operands");
13689 if (bool1_p
!= bool2_p
&& (muldiv_p
|| compare_p
))
13690 return N_("binary operator does not support vector bool operand");
13692 mode1
= TYPE_MODE (type1
);
13693 mode2
= TYPE_MODE (type2
);
13695 if (bool1_p
!= bool2_p
&& plusminus_p
13696 && (GET_MODE_CLASS (mode1
) == MODE_VECTOR_FLOAT
13697 || GET_MODE_CLASS (mode2
) == MODE_VECTOR_FLOAT
))
13698 return N_("binary operator does not support mixing vector "
13699 "bool with floating point vector operands");
13704 /* Initialize GCC target structure. */
13706 #undef TARGET_ASM_ALIGNED_HI_OP
13707 #define TARGET_ASM_ALIGNED_HI_OP "\t.word\t"
13708 #undef TARGET_ASM_ALIGNED_DI_OP
13709 #define TARGET_ASM_ALIGNED_DI_OP "\t.quad\t"
13710 #undef TARGET_ASM_INTEGER
13711 #define TARGET_ASM_INTEGER s390_assemble_integer
13713 #undef TARGET_ASM_OPEN_PAREN
13714 #define TARGET_ASM_OPEN_PAREN ""
13716 #undef TARGET_ASM_CLOSE_PAREN
13717 #define TARGET_ASM_CLOSE_PAREN ""
13719 #undef TARGET_OPTION_OVERRIDE
13720 #define TARGET_OPTION_OVERRIDE s390_option_override
13722 #undef TARGET_ENCODE_SECTION_INFO
13723 #define TARGET_ENCODE_SECTION_INFO s390_encode_section_info
13725 #undef TARGET_SCALAR_MODE_SUPPORTED_P
13726 #define TARGET_SCALAR_MODE_SUPPORTED_P s390_scalar_mode_supported_p
13729 #undef TARGET_HAVE_TLS
13730 #define TARGET_HAVE_TLS true
13732 #undef TARGET_CANNOT_FORCE_CONST_MEM
13733 #define TARGET_CANNOT_FORCE_CONST_MEM s390_cannot_force_const_mem
13735 #undef TARGET_DELEGITIMIZE_ADDRESS
13736 #define TARGET_DELEGITIMIZE_ADDRESS s390_delegitimize_address
13738 #undef TARGET_LEGITIMIZE_ADDRESS
13739 #define TARGET_LEGITIMIZE_ADDRESS s390_legitimize_address
13741 #undef TARGET_RETURN_IN_MEMORY
13742 #define TARGET_RETURN_IN_MEMORY s390_return_in_memory
13744 #undef TARGET_INIT_BUILTINS
13745 #define TARGET_INIT_BUILTINS s390_init_builtins
13746 #undef TARGET_EXPAND_BUILTIN
13747 #define TARGET_EXPAND_BUILTIN s390_expand_builtin
13748 #undef TARGET_BUILTIN_DECL
13749 #define TARGET_BUILTIN_DECL s390_builtin_decl
13751 #undef TARGET_ASM_OUTPUT_ADDR_CONST_EXTRA
13752 #define TARGET_ASM_OUTPUT_ADDR_CONST_EXTRA s390_output_addr_const_extra
13754 #undef TARGET_ASM_OUTPUT_MI_THUNK
13755 #define TARGET_ASM_OUTPUT_MI_THUNK s390_output_mi_thunk
13756 #undef TARGET_ASM_CAN_OUTPUT_MI_THUNK
13757 #define TARGET_ASM_CAN_OUTPUT_MI_THUNK hook_bool_const_tree_hwi_hwi_const_tree_true
13759 #undef TARGET_SCHED_ADJUST_PRIORITY
13760 #define TARGET_SCHED_ADJUST_PRIORITY s390_adjust_priority
13761 #undef TARGET_SCHED_ISSUE_RATE
13762 #define TARGET_SCHED_ISSUE_RATE s390_issue_rate
13763 #undef TARGET_SCHED_FIRST_CYCLE_MULTIPASS_DFA_LOOKAHEAD
13764 #define TARGET_SCHED_FIRST_CYCLE_MULTIPASS_DFA_LOOKAHEAD s390_first_cycle_multipass_dfa_lookahead
13766 #undef TARGET_SCHED_VARIABLE_ISSUE
13767 #define TARGET_SCHED_VARIABLE_ISSUE s390_sched_variable_issue
13768 #undef TARGET_SCHED_REORDER
13769 #define TARGET_SCHED_REORDER s390_sched_reorder
13770 #undef TARGET_SCHED_INIT
13771 #define TARGET_SCHED_INIT s390_sched_init
13773 #undef TARGET_CANNOT_COPY_INSN_P
13774 #define TARGET_CANNOT_COPY_INSN_P s390_cannot_copy_insn_p
13775 #undef TARGET_RTX_COSTS
13776 #define TARGET_RTX_COSTS s390_rtx_costs
13777 #undef TARGET_ADDRESS_COST
13778 #define TARGET_ADDRESS_COST s390_address_cost
13779 #undef TARGET_REGISTER_MOVE_COST
13780 #define TARGET_REGISTER_MOVE_COST s390_register_move_cost
13781 #undef TARGET_MEMORY_MOVE_COST
13782 #define TARGET_MEMORY_MOVE_COST s390_memory_move_cost
13784 #undef TARGET_MACHINE_DEPENDENT_REORG
13785 #define TARGET_MACHINE_DEPENDENT_REORG s390_reorg
13787 #undef TARGET_VALID_POINTER_MODE
13788 #define TARGET_VALID_POINTER_MODE s390_valid_pointer_mode
13790 #undef TARGET_BUILD_BUILTIN_VA_LIST
13791 #define TARGET_BUILD_BUILTIN_VA_LIST s390_build_builtin_va_list
13792 #undef TARGET_EXPAND_BUILTIN_VA_START
13793 #define TARGET_EXPAND_BUILTIN_VA_START s390_va_start
13794 #undef TARGET_GIMPLIFY_VA_ARG_EXPR
13795 #define TARGET_GIMPLIFY_VA_ARG_EXPR s390_gimplify_va_arg
13797 #undef TARGET_PROMOTE_FUNCTION_MODE
13798 #define TARGET_PROMOTE_FUNCTION_MODE s390_promote_function_mode
13799 #undef TARGET_PASS_BY_REFERENCE
13800 #define TARGET_PASS_BY_REFERENCE s390_pass_by_reference
13802 #undef TARGET_FUNCTION_OK_FOR_SIBCALL
13803 #define TARGET_FUNCTION_OK_FOR_SIBCALL s390_function_ok_for_sibcall
13804 #undef TARGET_FUNCTION_ARG
13805 #define TARGET_FUNCTION_ARG s390_function_arg
13806 #undef TARGET_FUNCTION_ARG_ADVANCE
13807 #define TARGET_FUNCTION_ARG_ADVANCE s390_function_arg_advance
13808 #undef TARGET_FUNCTION_VALUE
13809 #define TARGET_FUNCTION_VALUE s390_function_value
13810 #undef TARGET_LIBCALL_VALUE
13811 #define TARGET_LIBCALL_VALUE s390_libcall_value
13812 #undef TARGET_STRICT_ARGUMENT_NAMING
13813 #define TARGET_STRICT_ARGUMENT_NAMING hook_bool_CUMULATIVE_ARGS_true
13815 #undef TARGET_KEEP_LEAF_WHEN_PROFILED
13816 #define TARGET_KEEP_LEAF_WHEN_PROFILED s390_keep_leaf_when_profiled
13818 #undef TARGET_FIXED_CONDITION_CODE_REGS
13819 #define TARGET_FIXED_CONDITION_CODE_REGS s390_fixed_condition_code_regs
13821 #undef TARGET_CC_MODES_COMPATIBLE
13822 #define TARGET_CC_MODES_COMPATIBLE s390_cc_modes_compatible
13824 #undef TARGET_INVALID_WITHIN_DOLOOP
13825 #define TARGET_INVALID_WITHIN_DOLOOP hook_constcharptr_const_rtx_insn_null
13828 #undef TARGET_ASM_OUTPUT_DWARF_DTPREL
13829 #define TARGET_ASM_OUTPUT_DWARF_DTPREL s390_output_dwarf_dtprel
13832 #undef TARGET_DWARF_FRAME_REG_MODE
13833 #define TARGET_DWARF_FRAME_REG_MODE s390_dwarf_frame_reg_mode
13835 #ifdef TARGET_ALTERNATE_LONG_DOUBLE_MANGLING
13836 #undef TARGET_MANGLE_TYPE
13837 #define TARGET_MANGLE_TYPE s390_mangle_type
13840 #undef TARGET_SCALAR_MODE_SUPPORTED_P
13841 #define TARGET_SCALAR_MODE_SUPPORTED_P s390_scalar_mode_supported_p
13843 #undef TARGET_VECTOR_MODE_SUPPORTED_P
13844 #define TARGET_VECTOR_MODE_SUPPORTED_P s390_vector_mode_supported_p
13846 #undef TARGET_PREFERRED_RELOAD_CLASS
13847 #define TARGET_PREFERRED_RELOAD_CLASS s390_preferred_reload_class
13849 #undef TARGET_SECONDARY_RELOAD
13850 #define TARGET_SECONDARY_RELOAD s390_secondary_reload
13852 #undef TARGET_LIBGCC_CMP_RETURN_MODE
13853 #define TARGET_LIBGCC_CMP_RETURN_MODE s390_libgcc_cmp_return_mode
13855 #undef TARGET_LIBGCC_SHIFT_COUNT_MODE
13856 #define TARGET_LIBGCC_SHIFT_COUNT_MODE s390_libgcc_shift_count_mode
13858 #undef TARGET_LEGITIMATE_ADDRESS_P
13859 #define TARGET_LEGITIMATE_ADDRESS_P s390_legitimate_address_p
13861 #undef TARGET_LEGITIMATE_CONSTANT_P
13862 #define TARGET_LEGITIMATE_CONSTANT_P s390_legitimate_constant_p
13864 #undef TARGET_LRA_P
13865 #define TARGET_LRA_P s390_lra_p
13867 #undef TARGET_CAN_ELIMINATE
13868 #define TARGET_CAN_ELIMINATE s390_can_eliminate
13870 #undef TARGET_CONDITIONAL_REGISTER_USAGE
13871 #define TARGET_CONDITIONAL_REGISTER_USAGE s390_conditional_register_usage
13873 #undef TARGET_LOOP_UNROLL_ADJUST
13874 #define TARGET_LOOP_UNROLL_ADJUST s390_loop_unroll_adjust
13876 #undef TARGET_ASM_TRAMPOLINE_TEMPLATE
13877 #define TARGET_ASM_TRAMPOLINE_TEMPLATE s390_asm_trampoline_template
13878 #undef TARGET_TRAMPOLINE_INIT
13879 #define TARGET_TRAMPOLINE_INIT s390_trampoline_init
13881 #undef TARGET_UNWIND_WORD_MODE
13882 #define TARGET_UNWIND_WORD_MODE s390_unwind_word_mode
13884 #undef TARGET_CANONICALIZE_COMPARISON
13885 #define TARGET_CANONICALIZE_COMPARISON s390_canonicalize_comparison
13887 #undef TARGET_HARD_REGNO_SCRATCH_OK
13888 #define TARGET_HARD_REGNO_SCRATCH_OK s390_hard_regno_scratch_ok
13890 #undef TARGET_ATTRIBUTE_TABLE
13891 #define TARGET_ATTRIBUTE_TABLE s390_attribute_table
13893 #undef TARGET_FUNCTION_ATTRIBUTE_INLINABLE_P
13894 #define TARGET_FUNCTION_ATTRIBUTE_INLINABLE_P hook_bool_const_tree_true
13896 #undef TARGET_SET_UP_BY_PROLOGUE
13897 #define TARGET_SET_UP_BY_PROLOGUE s300_set_up_by_prologue
13899 #undef TARGET_USE_BY_PIECES_INFRASTRUCTURE_P
13900 #define TARGET_USE_BY_PIECES_INFRASTRUCTURE_P \
13901 s390_use_by_pieces_infrastructure_p
13903 #undef TARGET_ATOMIC_ASSIGN_EXPAND_FENV
13904 #define TARGET_ATOMIC_ASSIGN_EXPAND_FENV s390_atomic_assign_expand_fenv
13906 #undef TARGET_INVALID_ARG_FOR_UNPROTOTYPED_FN
13907 #define TARGET_INVALID_ARG_FOR_UNPROTOTYPED_FN s390_invalid_arg_for_unprototyped_fn
13909 #undef TARGET_VECTORIZE_PREFERRED_SIMD_MODE
13910 #define TARGET_VECTORIZE_PREFERRED_SIMD_MODE s390_preferred_simd_mode
13912 #undef TARGET_VECTORIZE_SUPPORT_VECTOR_MISALIGNMENT
13913 #define TARGET_VECTORIZE_SUPPORT_VECTOR_MISALIGNMENT s390_support_vector_misalignment
13915 #undef TARGET_VECTOR_ALIGNMENT
13916 #define TARGET_VECTOR_ALIGNMENT s390_vector_alignment
13918 #undef TARGET_INVALID_BINARY_OP
13919 #define TARGET_INVALID_BINARY_OP s390_invalid_binary_op
13921 struct gcc_target targetm
= TARGET_INITIALIZER
;
13923 #include "gt-s390.h"