ia64.cc revision 1.1.1.1 1 1.1 mrg /* Definitions of target machine for GNU compiler.
2 1.1 mrg Copyright (C) 1999-2022 Free Software Foundation, Inc.
3 1.1 mrg Contributed by James E. Wilson <wilson (at) cygnus.com> and
4 1.1 mrg David Mosberger <davidm (at) hpl.hp.com>.
5 1.1 mrg
6 1.1 mrg This file is part of GCC.
7 1.1 mrg
8 1.1 mrg GCC is free software; you can redistribute it and/or modify
9 1.1 mrg it under the terms of the GNU General Public License as published by
10 1.1 mrg the Free Software Foundation; either version 3, or (at your option)
11 1.1 mrg any later version.
12 1.1 mrg
13 1.1 mrg GCC is distributed in the hope that it will be useful,
14 1.1 mrg but WITHOUT ANY WARRANTY; without even the implied warranty of
15 1.1 mrg MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 1.1 mrg GNU General Public License for more details.
17 1.1 mrg
18 1.1 mrg You should have received a copy of the GNU General Public License
19 1.1 mrg along with GCC; see the file COPYING3. If not see
20 1.1 mrg <http://www.gnu.org/licenses/>. */
21 1.1 mrg
22 1.1 mrg #define IN_TARGET_CODE 1
23 1.1 mrg
24 1.1 mrg #include "config.h"
25 1.1 mrg #include "system.h"
26 1.1 mrg #include "coretypes.h"
27 1.1 mrg #include "backend.h"
28 1.1 mrg #include "target.h"
29 1.1 mrg #include "rtl.h"
30 1.1 mrg #include "tree.h"
31 1.1 mrg #include "memmodel.h"
32 1.1 mrg #include "cfghooks.h"
33 1.1 mrg #include "df.h"
34 1.1 mrg #include "tm_p.h"
35 1.1 mrg #include "stringpool.h"
36 1.1 mrg #include "attribs.h"
37 1.1 mrg #include "optabs.h"
38 1.1 mrg #include "regs.h"
39 1.1 mrg #include "emit-rtl.h"
40 1.1 mrg #include "recog.h"
41 1.1 mrg #include "diagnostic-core.h"
42 1.1 mrg #include "alias.h"
43 1.1 mrg #include "fold-const.h"
44 1.1 mrg #include "stor-layout.h"
45 1.1 mrg #include "calls.h"
46 1.1 mrg #include "varasm.h"
47 1.1 mrg #include "output.h"
48 1.1 mrg #include "insn-attr.h"
49 1.1 mrg #include "flags.h"
50 1.1 mrg #include "explow.h"
51 1.1 mrg #include "expr.h"
52 1.1 mrg #include "cfgrtl.h"
53 1.1 mrg #include "libfuncs.h"
54 1.1 mrg #include "sched-int.h"
55 1.1 mrg #include "common/common-target.h"
56 1.1 mrg #include "langhooks.h"
57 1.1 mrg #include "gimplify.h"
58 1.1 mrg #include "intl.h"
59 1.1 mrg #include "debug.h"
60 1.1 mrg #include "dbgcnt.h"
61 1.1 mrg #include "tm-constrs.h"
62 1.1 mrg #include "sel-sched.h"
63 1.1 mrg #include "reload.h"
64 1.1 mrg #include "opts.h"
65 1.1 mrg #include "dumpfile.h"
66 1.1 mrg #include "builtins.h"
67 1.1 mrg
68 1.1 mrg /* This file should be included last. */
69 1.1 mrg #include "target-def.h"
70 1.1 mrg
71 1.1 mrg /* This is used for communication between ASM_OUTPUT_LABEL and
72 1.1 mrg ASM_OUTPUT_LABELREF. */
73 1.1 mrg int ia64_asm_output_label = 0;
74 1.1 mrg
75 1.1 mrg /* Register names for ia64_expand_prologue. */
76 1.1 mrg static const char * const ia64_reg_numbers[96] =
77 1.1 mrg { "r32", "r33", "r34", "r35", "r36", "r37", "r38", "r39",
78 1.1 mrg "r40", "r41", "r42", "r43", "r44", "r45", "r46", "r47",
79 1.1 mrg "r48", "r49", "r50", "r51", "r52", "r53", "r54", "r55",
80 1.1 mrg "r56", "r57", "r58", "r59", "r60", "r61", "r62", "r63",
81 1.1 mrg "r64", "r65", "r66", "r67", "r68", "r69", "r70", "r71",
82 1.1 mrg "r72", "r73", "r74", "r75", "r76", "r77", "r78", "r79",
83 1.1 mrg "r80", "r81", "r82", "r83", "r84", "r85", "r86", "r87",
84 1.1 mrg "r88", "r89", "r90", "r91", "r92", "r93", "r94", "r95",
85 1.1 mrg "r96", "r97", "r98", "r99", "r100","r101","r102","r103",
86 1.1 mrg "r104","r105","r106","r107","r108","r109","r110","r111",
87 1.1 mrg "r112","r113","r114","r115","r116","r117","r118","r119",
88 1.1 mrg "r120","r121","r122","r123","r124","r125","r126","r127"};
89 1.1 mrg
90 1.1 mrg /* ??? These strings could be shared with REGISTER_NAMES. */
91 1.1 mrg static const char * const ia64_input_reg_names[8] =
92 1.1 mrg { "in0", "in1", "in2", "in3", "in4", "in5", "in6", "in7" };
93 1.1 mrg
94 1.1 mrg /* ??? These strings could be shared with REGISTER_NAMES. */
95 1.1 mrg static const char * const ia64_local_reg_names[80] =
96 1.1 mrg { "loc0", "loc1", "loc2", "loc3", "loc4", "loc5", "loc6", "loc7",
97 1.1 mrg "loc8", "loc9", "loc10","loc11","loc12","loc13","loc14","loc15",
98 1.1 mrg "loc16","loc17","loc18","loc19","loc20","loc21","loc22","loc23",
99 1.1 mrg "loc24","loc25","loc26","loc27","loc28","loc29","loc30","loc31",
100 1.1 mrg "loc32","loc33","loc34","loc35","loc36","loc37","loc38","loc39",
101 1.1 mrg "loc40","loc41","loc42","loc43","loc44","loc45","loc46","loc47",
102 1.1 mrg "loc48","loc49","loc50","loc51","loc52","loc53","loc54","loc55",
103 1.1 mrg "loc56","loc57","loc58","loc59","loc60","loc61","loc62","loc63",
104 1.1 mrg "loc64","loc65","loc66","loc67","loc68","loc69","loc70","loc71",
105 1.1 mrg "loc72","loc73","loc74","loc75","loc76","loc77","loc78","loc79" };
106 1.1 mrg
107 1.1 mrg /* ??? These strings could be shared with REGISTER_NAMES. */
108 1.1 mrg static const char * const ia64_output_reg_names[8] =
109 1.1 mrg { "out0", "out1", "out2", "out3", "out4", "out5", "out6", "out7" };
110 1.1 mrg
111 1.1 mrg /* Variables which are this size or smaller are put in the sdata/sbss
112 1.1 mrg sections. */
113 1.1 mrg
114 1.1 mrg unsigned int ia64_section_threshold;
115 1.1 mrg
116 1.1 mrg /* The following variable is used by the DFA insn scheduler. The value is
117 1.1 mrg TRUE if we do insn bundling instead of insn scheduling. */
118 1.1 mrg int bundling_p = 0;
119 1.1 mrg
120 1.1 mrg enum ia64_frame_regs
121 1.1 mrg {
122 1.1 mrg reg_fp,
123 1.1 mrg reg_save_b0,
124 1.1 mrg reg_save_pr,
125 1.1 mrg reg_save_ar_pfs,
126 1.1 mrg reg_save_ar_unat,
127 1.1 mrg reg_save_ar_lc,
128 1.1 mrg reg_save_gp,
129 1.1 mrg number_of_ia64_frame_regs
130 1.1 mrg };
131 1.1 mrg
132 1.1 mrg /* Structure to be filled in by ia64_compute_frame_size with register
133 1.1 mrg save masks and offsets for the current function. */
134 1.1 mrg
135 1.1 mrg struct ia64_frame_info
136 1.1 mrg {
137 1.1 mrg HOST_WIDE_INT total_size; /* size of the stack frame, not including
138 1.1 mrg the caller's scratch area. */
139 1.1 mrg HOST_WIDE_INT spill_cfa_off; /* top of the reg spill area from the cfa. */
140 1.1 mrg HOST_WIDE_INT spill_size; /* size of the gr/br/fr spill area. */
141 1.1 mrg HOST_WIDE_INT extra_spill_size; /* size of spill area for others. */
142 1.1 mrg HARD_REG_SET mask; /* mask of saved registers. */
143 1.1 mrg unsigned int gr_used_mask; /* mask of registers in use as gr spill
144 1.1 mrg registers or long-term scratches. */
145 1.1 mrg int n_spilled; /* number of spilled registers. */
146 1.1 mrg int r[number_of_ia64_frame_regs]; /* Frame related registers. */
147 1.1 mrg int n_input_regs; /* number of input registers used. */
148 1.1 mrg int n_local_regs; /* number of local registers used. */
149 1.1 mrg int n_output_regs; /* number of output registers used. */
150 1.1 mrg int n_rotate_regs; /* number of rotating registers used. */
151 1.1 mrg
152 1.1 mrg char need_regstk; /* true if a .regstk directive needed. */
153 1.1 mrg char initialized; /* true if the data is finalized. */
154 1.1 mrg };
155 1.1 mrg
156 1.1 mrg /* Current frame information calculated by ia64_compute_frame_size. */
157 1.1 mrg static struct ia64_frame_info current_frame_info;
158 1.1 mrg /* The actual registers that are emitted. */
159 1.1 mrg static int emitted_frame_related_regs[number_of_ia64_frame_regs];
160 1.1 mrg
161 1.1 mrg static int ia64_first_cycle_multipass_dfa_lookahead (void);
163 1.1 mrg static void ia64_dependencies_evaluation_hook (rtx_insn *, rtx_insn *);
164 1.1 mrg static void ia64_init_dfa_pre_cycle_insn (void);
165 1.1 mrg static rtx ia64_dfa_pre_cycle_insn (void);
166 1.1 mrg static int ia64_first_cycle_multipass_dfa_lookahead_guard (rtx_insn *, int);
167 1.1 mrg static int ia64_dfa_new_cycle (FILE *, int, rtx_insn *, int, int, int *);
168 1.1 mrg static void ia64_h_i_d_extended (void);
169 1.1 mrg static void * ia64_alloc_sched_context (void);
170 1.1 mrg static void ia64_init_sched_context (void *, bool);
171 1.1 mrg static void ia64_set_sched_context (void *);
172 1.1 mrg static void ia64_clear_sched_context (void *);
173 1.1 mrg static void ia64_free_sched_context (void *);
174 1.1 mrg static int ia64_mode_to_int (machine_mode);
175 1.1 mrg static void ia64_set_sched_flags (spec_info_t);
176 1.1 mrg static ds_t ia64_get_insn_spec_ds (rtx_insn *);
177 1.1 mrg static ds_t ia64_get_insn_checked_ds (rtx_insn *);
178 1.1 mrg static bool ia64_skip_rtx_p (const_rtx);
179 1.1 mrg static int ia64_speculate_insn (rtx_insn *, ds_t, rtx *);
180 1.1 mrg static bool ia64_needs_block_p (ds_t);
181 1.1 mrg static rtx ia64_gen_spec_check (rtx_insn *, rtx_insn *, ds_t);
182 1.1 mrg static int ia64_spec_check_p (rtx);
183 1.1 mrg static int ia64_spec_check_src_p (rtx);
184 1.1 mrg static rtx gen_tls_get_addr (void);
185 1.1 mrg static rtx gen_thread_pointer (void);
186 1.1 mrg static int find_gr_spill (enum ia64_frame_regs, int);
187 1.1 mrg static int next_scratch_gr_reg (void);
188 1.1 mrg static void mark_reg_gr_used_mask (rtx, void *);
189 1.1 mrg static void ia64_compute_frame_size (HOST_WIDE_INT);
190 1.1 mrg static void setup_spill_pointers (int, rtx, HOST_WIDE_INT);
191 1.1 mrg static void finish_spill_pointers (void);
192 1.1 mrg static rtx spill_restore_mem (rtx, HOST_WIDE_INT);
193 1.1 mrg static void do_spill (rtx (*)(rtx, rtx, rtx), rtx, HOST_WIDE_INT, rtx);
194 1.1 mrg static void do_restore (rtx (*)(rtx, rtx, rtx), rtx, HOST_WIDE_INT);
195 1.1 mrg static rtx gen_movdi_x (rtx, rtx, rtx);
196 1.1 mrg static rtx gen_fr_spill_x (rtx, rtx, rtx);
197 1.1 mrg static rtx gen_fr_restore_x (rtx, rtx, rtx);
198 1.1 mrg
199 1.1 mrg static void ia64_option_override (void);
200 1.1 mrg static bool ia64_can_eliminate (const int, const int);
201 1.1 mrg static machine_mode hfa_element_mode (const_tree, bool);
202 1.1 mrg static void ia64_setup_incoming_varargs (cumulative_args_t,
203 1.1 mrg const function_arg_info &,
204 1.1 mrg int *, int);
205 1.1 mrg static int ia64_arg_partial_bytes (cumulative_args_t,
206 1.1 mrg const function_arg_info &);
207 1.1 mrg static rtx ia64_function_arg (cumulative_args_t, const function_arg_info &);
208 1.1 mrg static rtx ia64_function_incoming_arg (cumulative_args_t,
209 1.1 mrg const function_arg_info &);
210 1.1 mrg static void ia64_function_arg_advance (cumulative_args_t,
211 1.1 mrg const function_arg_info &);
212 1.1 mrg static pad_direction ia64_function_arg_padding (machine_mode, const_tree);
213 1.1 mrg static unsigned int ia64_function_arg_boundary (machine_mode,
214 1.1 mrg const_tree);
215 1.1 mrg static bool ia64_function_ok_for_sibcall (tree, tree);
216 1.1 mrg static bool ia64_return_in_memory (const_tree, const_tree);
217 1.1 mrg static rtx ia64_function_value (const_tree, const_tree, bool);
218 1.1 mrg static rtx ia64_libcall_value (machine_mode, const_rtx);
219 1.1 mrg static bool ia64_function_value_regno_p (const unsigned int);
220 1.1 mrg static int ia64_register_move_cost (machine_mode, reg_class_t,
221 1.1 mrg reg_class_t);
222 1.1 mrg static int ia64_memory_move_cost (machine_mode mode, reg_class_t,
223 1.1 mrg bool);
224 1.1 mrg static bool ia64_rtx_costs (rtx, machine_mode, int, int, int *, bool);
225 1.1 mrg static int ia64_unspec_may_trap_p (const_rtx, unsigned);
226 1.1 mrg static void fix_range (const char *);
227 1.1 mrg static struct machine_function * ia64_init_machine_status (void);
228 1.1 mrg static void emit_insn_group_barriers (FILE *);
229 1.1 mrg static void emit_all_insn_group_barriers (FILE *);
230 1.1 mrg static void final_emit_insn_group_barriers (FILE *);
231 1.1 mrg static void emit_predicate_relation_info (void);
232 1.1 mrg static void ia64_reorg (void);
233 1.1 mrg static bool ia64_in_small_data_p (const_tree);
234 1.1 mrg static void process_epilogue (FILE *, rtx, bool, bool);
235 1.1 mrg
236 1.1 mrg static bool ia64_assemble_integer (rtx, unsigned int, int);
237 1.1 mrg static void ia64_output_function_prologue (FILE *);
238 1.1 mrg static void ia64_output_function_epilogue (FILE *);
239 1.1 mrg static void ia64_output_function_end_prologue (FILE *);
240 1.1 mrg
241 1.1 mrg static void ia64_print_operand (FILE *, rtx, int);
242 1.1 mrg static void ia64_print_operand_address (FILE *, machine_mode, rtx);
243 1.1 mrg static bool ia64_print_operand_punct_valid_p (unsigned char code);
244 1.1 mrg
245 1.1 mrg static int ia64_issue_rate (void);
246 1.1 mrg static int ia64_adjust_cost (rtx_insn *, int, rtx_insn *, int, dw_t);
247 1.1 mrg static void ia64_sched_init (FILE *, int, int);
248 1.1 mrg static void ia64_sched_init_global (FILE *, int, int);
249 1.1 mrg static void ia64_sched_finish_global (FILE *, int);
250 1.1 mrg static void ia64_sched_finish (FILE *, int);
251 1.1 mrg static int ia64_dfa_sched_reorder (FILE *, int, rtx_insn **, int *, int, int);
252 1.1 mrg static int ia64_sched_reorder (FILE *, int, rtx_insn **, int *, int);
253 1.1 mrg static int ia64_sched_reorder2 (FILE *, int, rtx_insn **, int *, int);
254 1.1 mrg static int ia64_variable_issue (FILE *, int, rtx_insn *, int);
255 1.1 mrg
256 1.1 mrg static void ia64_asm_unwind_emit (FILE *, rtx_insn *);
257 1.1 mrg static void ia64_asm_emit_except_personality (rtx);
258 1.1 mrg static void ia64_asm_init_sections (void);
259 1.1 mrg
260 1.1 mrg static enum unwind_info_type ia64_debug_unwind_info (void);
261 1.1 mrg
262 1.1 mrg static struct bundle_state *get_free_bundle_state (void);
263 1.1 mrg static void free_bundle_state (struct bundle_state *);
264 1.1 mrg static void initiate_bundle_states (void);
265 1.1 mrg static void finish_bundle_states (void);
266 1.1 mrg static int insert_bundle_state (struct bundle_state *);
267 1.1 mrg static void initiate_bundle_state_table (void);
268 1.1 mrg static void finish_bundle_state_table (void);
269 1.1 mrg static int try_issue_nops (struct bundle_state *, int);
270 1.1 mrg static int try_issue_insn (struct bundle_state *, rtx);
271 1.1 mrg static void issue_nops_and_insn (struct bundle_state *, int, rtx_insn *,
272 1.1 mrg int, int);
273 1.1 mrg static int get_max_pos (state_t);
274 1.1 mrg static int get_template (state_t, int);
275 1.1 mrg
276 1.1 mrg static rtx_insn *get_next_important_insn (rtx_insn *, rtx_insn *);
277 1.1 mrg static bool important_for_bundling_p (rtx_insn *);
278 1.1 mrg static bool unknown_for_bundling_p (rtx_insn *);
279 1.1 mrg static void bundling (FILE *, int, rtx_insn *, rtx_insn *);
280 1.1 mrg
281 1.1 mrg static void ia64_output_mi_thunk (FILE *, tree, HOST_WIDE_INT,
282 1.1 mrg HOST_WIDE_INT, tree);
283 1.1 mrg static void ia64_file_start (void);
284 1.1 mrg static void ia64_globalize_decl_name (FILE *, tree);
285 1.1 mrg
286 1.1 mrg static int ia64_hpux_reloc_rw_mask (void) ATTRIBUTE_UNUSED;
287 1.1 mrg static int ia64_reloc_rw_mask (void) ATTRIBUTE_UNUSED;
288 1.1 mrg static section *ia64_select_rtx_section (machine_mode, rtx,
289 1.1 mrg unsigned HOST_WIDE_INT);
290 1.1 mrg static void ia64_output_dwarf_dtprel (FILE *, int, rtx)
291 1.1 mrg ATTRIBUTE_UNUSED;
292 1.1 mrg static unsigned int ia64_section_type_flags (tree, const char *, int);
293 1.1 mrg static void ia64_init_libfuncs (void)
294 1.1 mrg ATTRIBUTE_UNUSED;
295 1.1 mrg static void ia64_hpux_init_libfuncs (void)
296 1.1 mrg ATTRIBUTE_UNUSED;
297 1.1 mrg static void ia64_sysv4_init_libfuncs (void)
298 1.1 mrg ATTRIBUTE_UNUSED;
299 1.1 mrg static void ia64_vms_init_libfuncs (void)
300 1.1 mrg ATTRIBUTE_UNUSED;
301 1.1 mrg static void ia64_soft_fp_init_libfuncs (void)
302 1.1 mrg ATTRIBUTE_UNUSED;
303 1.1 mrg static bool ia64_vms_valid_pointer_mode (scalar_int_mode mode)
304 1.1 mrg ATTRIBUTE_UNUSED;
305 1.1 mrg static tree ia64_vms_common_object_attribute (tree *, tree, tree, int, bool *)
306 1.1 mrg ATTRIBUTE_UNUSED;
307 1.1 mrg
308 1.1 mrg static bool ia64_attribute_takes_identifier_p (const_tree);
309 1.1 mrg static tree ia64_handle_model_attribute (tree *, tree, tree, int, bool *);
310 1.1 mrg static tree ia64_handle_version_id_attribute (tree *, tree, tree, int, bool *);
311 1.1 mrg static void ia64_encode_section_info (tree, rtx, int);
312 1.1 mrg static rtx ia64_struct_value_rtx (tree, int);
313 1.1 mrg static tree ia64_gimplify_va_arg (tree, tree, gimple_seq *, gimple_seq *);
314 1.1 mrg static bool ia64_scalar_mode_supported_p (scalar_mode mode);
315 1.1 mrg static bool ia64_vector_mode_supported_p (machine_mode mode);
316 1.1 mrg static bool ia64_legitimate_constant_p (machine_mode, rtx);
317 1.1 mrg static bool ia64_legitimate_address_p (machine_mode, rtx, bool);
318 1.1 mrg static bool ia64_cannot_force_const_mem (machine_mode, rtx);
319 1.1 mrg static const char *ia64_mangle_type (const_tree);
320 1.1 mrg static const char *ia64_invalid_conversion (const_tree, const_tree);
321 1.1 mrg static const char *ia64_invalid_unary_op (int, const_tree);
322 1.1 mrg static const char *ia64_invalid_binary_op (int, const_tree, const_tree);
323 1.1 mrg static machine_mode ia64_c_mode_for_suffix (char);
324 1.1 mrg static void ia64_trampoline_init (rtx, tree, rtx);
325 1.1 mrg static void ia64_override_options_after_change (void);
326 1.1 mrg static bool ia64_member_type_forces_blk (const_tree, machine_mode);
327 1.1 mrg
328 1.1 mrg static tree ia64_fold_builtin (tree, int, tree *, bool);
329 1.1 mrg static tree ia64_builtin_decl (unsigned, bool);
330 1.1 mrg
331 1.1 mrg static reg_class_t ia64_preferred_reload_class (rtx, reg_class_t);
332 1.1 mrg static fixed_size_mode ia64_get_reg_raw_mode (int regno);
333 1.1 mrg static section * ia64_hpux_function_section (tree, enum node_frequency,
334 1.1 mrg bool, bool);
335 1.1 mrg
336 1.1 mrg static bool ia64_vectorize_vec_perm_const (machine_mode, rtx, rtx, rtx,
337 1.1 mrg const vec_perm_indices &);
338 1.1 mrg
339 1.1 mrg static unsigned int ia64_hard_regno_nregs (unsigned int, machine_mode);
340 1.1 mrg static bool ia64_hard_regno_mode_ok (unsigned int, machine_mode);
341 1.1 mrg static bool ia64_modes_tieable_p (machine_mode, machine_mode);
342 1.1 mrg static bool ia64_can_change_mode_class (machine_mode, machine_mode,
343 1.1 mrg reg_class_t);
344 1.1 mrg
345 1.1 mrg #define MAX_VECT_LEN 8
346 1.1 mrg
347 1.1 mrg struct expand_vec_perm_d
348 1.1 mrg {
349 1.1 mrg rtx target, op0, op1;
350 1.1 mrg unsigned char perm[MAX_VECT_LEN];
351 1.1 mrg machine_mode vmode;
352 1.1 mrg unsigned char nelt;
353 1.1 mrg bool one_operand_p;
354 1.1 mrg bool testing_p;
355 1.1 mrg };
356 1.1 mrg
357 1.1 mrg static bool ia64_expand_vec_perm_const_1 (struct expand_vec_perm_d *d);
358 1.1 mrg
359 1.1 mrg
360 1.1 mrg /* Table of valid machine attributes. */
362 1.1 mrg static const struct attribute_spec ia64_attribute_table[] =
363 1.1 mrg {
364 1.1 mrg /* { name, min_len, max_len, decl_req, type_req, fn_type_req,
365 1.1 mrg affects_type_identity, handler, exclude } */
366 1.1 mrg { "syscall_linkage", 0, 0, false, true, true, false, NULL, NULL },
367 1.1 mrg { "model", 1, 1, true, false, false, false,
368 1.1 mrg ia64_handle_model_attribute, NULL },
369 1.1 mrg #if TARGET_ABI_OPEN_VMS
370 1.1 mrg { "common_object", 1, 1, true, false, false, false,
371 1.1 mrg ia64_vms_common_object_attribute, NULL },
372 1.1 mrg #endif
373 1.1 mrg { "version_id", 1, 1, true, false, false, false,
374 1.1 mrg ia64_handle_version_id_attribute, NULL },
375 1.1 mrg { NULL, 0, 0, false, false, false, false, NULL, NULL }
376 1.1 mrg };
377 1.1 mrg
378 1.1 mrg /* Initialize the GCC target structure. */
379 1.1 mrg #undef TARGET_ATTRIBUTE_TABLE
380 1.1 mrg #define TARGET_ATTRIBUTE_TABLE ia64_attribute_table
381 1.1 mrg
382 1.1 mrg #undef TARGET_INIT_BUILTINS
383 1.1 mrg #define TARGET_INIT_BUILTINS ia64_init_builtins
384 1.1 mrg
385 1.1 mrg #undef TARGET_FOLD_BUILTIN
386 1.1 mrg #define TARGET_FOLD_BUILTIN ia64_fold_builtin
387 1.1 mrg
388 1.1 mrg #undef TARGET_EXPAND_BUILTIN
389 1.1 mrg #define TARGET_EXPAND_BUILTIN ia64_expand_builtin
390 1.1 mrg
391 1.1 mrg #undef TARGET_BUILTIN_DECL
392 1.1 mrg #define TARGET_BUILTIN_DECL ia64_builtin_decl
393 1.1 mrg
394 1.1 mrg #undef TARGET_ASM_BYTE_OP
395 1.1 mrg #define TARGET_ASM_BYTE_OP "\tdata1\t"
396 1.1 mrg #undef TARGET_ASM_ALIGNED_HI_OP
397 1.1 mrg #define TARGET_ASM_ALIGNED_HI_OP "\tdata2\t"
398 1.1 mrg #undef TARGET_ASM_ALIGNED_SI_OP
399 1.1 mrg #define TARGET_ASM_ALIGNED_SI_OP "\tdata4\t"
400 1.1 mrg #undef TARGET_ASM_ALIGNED_DI_OP
401 1.1 mrg #define TARGET_ASM_ALIGNED_DI_OP "\tdata8\t"
402 1.1 mrg #undef TARGET_ASM_UNALIGNED_HI_OP
403 1.1 mrg #define TARGET_ASM_UNALIGNED_HI_OP "\tdata2.ua\t"
404 1.1 mrg #undef TARGET_ASM_UNALIGNED_SI_OP
405 1.1 mrg #define TARGET_ASM_UNALIGNED_SI_OP "\tdata4.ua\t"
406 1.1 mrg #undef TARGET_ASM_UNALIGNED_DI_OP
407 1.1 mrg #define TARGET_ASM_UNALIGNED_DI_OP "\tdata8.ua\t"
408 1.1 mrg #undef TARGET_ASM_INTEGER
409 1.1 mrg #define TARGET_ASM_INTEGER ia64_assemble_integer
410 1.1 mrg
411 1.1 mrg #undef TARGET_OPTION_OVERRIDE
412 1.1 mrg #define TARGET_OPTION_OVERRIDE ia64_option_override
413 1.1 mrg
414 1.1 mrg #undef TARGET_ASM_FUNCTION_PROLOGUE
415 1.1 mrg #define TARGET_ASM_FUNCTION_PROLOGUE ia64_output_function_prologue
416 1.1 mrg #undef TARGET_ASM_FUNCTION_END_PROLOGUE
417 1.1 mrg #define TARGET_ASM_FUNCTION_END_PROLOGUE ia64_output_function_end_prologue
418 1.1 mrg #undef TARGET_ASM_FUNCTION_EPILOGUE
419 1.1 mrg #define TARGET_ASM_FUNCTION_EPILOGUE ia64_output_function_epilogue
420 1.1 mrg
421 1.1 mrg #undef TARGET_PRINT_OPERAND
422 1.1 mrg #define TARGET_PRINT_OPERAND ia64_print_operand
423 1.1 mrg #undef TARGET_PRINT_OPERAND_ADDRESS
424 1.1 mrg #define TARGET_PRINT_OPERAND_ADDRESS ia64_print_operand_address
425 1.1 mrg #undef TARGET_PRINT_OPERAND_PUNCT_VALID_P
426 1.1 mrg #define TARGET_PRINT_OPERAND_PUNCT_VALID_P ia64_print_operand_punct_valid_p
427 1.1 mrg
428 1.1 mrg #undef TARGET_IN_SMALL_DATA_P
429 1.1 mrg #define TARGET_IN_SMALL_DATA_P ia64_in_small_data_p
430 1.1 mrg
431 1.1 mrg #undef TARGET_SCHED_ADJUST_COST
432 1.1 mrg #define TARGET_SCHED_ADJUST_COST ia64_adjust_cost
433 1.1 mrg #undef TARGET_SCHED_ISSUE_RATE
434 1.1 mrg #define TARGET_SCHED_ISSUE_RATE ia64_issue_rate
435 1.1 mrg #undef TARGET_SCHED_VARIABLE_ISSUE
436 1.1 mrg #define TARGET_SCHED_VARIABLE_ISSUE ia64_variable_issue
437 1.1 mrg #undef TARGET_SCHED_INIT
438 1.1 mrg #define TARGET_SCHED_INIT ia64_sched_init
439 1.1 mrg #undef TARGET_SCHED_FINISH
440 1.1 mrg #define TARGET_SCHED_FINISH ia64_sched_finish
441 1.1 mrg #undef TARGET_SCHED_INIT_GLOBAL
442 1.1 mrg #define TARGET_SCHED_INIT_GLOBAL ia64_sched_init_global
443 1.1 mrg #undef TARGET_SCHED_FINISH_GLOBAL
444 1.1 mrg #define TARGET_SCHED_FINISH_GLOBAL ia64_sched_finish_global
445 1.1 mrg #undef TARGET_SCHED_REORDER
446 1.1 mrg #define TARGET_SCHED_REORDER ia64_sched_reorder
447 1.1 mrg #undef TARGET_SCHED_REORDER2
448 1.1 mrg #define TARGET_SCHED_REORDER2 ia64_sched_reorder2
449 1.1 mrg
450 1.1 mrg #undef TARGET_SCHED_DEPENDENCIES_EVALUATION_HOOK
451 1.1 mrg #define TARGET_SCHED_DEPENDENCIES_EVALUATION_HOOK ia64_dependencies_evaluation_hook
452 1.1 mrg
453 1.1 mrg #undef TARGET_SCHED_FIRST_CYCLE_MULTIPASS_DFA_LOOKAHEAD
454 1.1 mrg #define TARGET_SCHED_FIRST_CYCLE_MULTIPASS_DFA_LOOKAHEAD ia64_first_cycle_multipass_dfa_lookahead
455 1.1 mrg
456 1.1 mrg #undef TARGET_SCHED_INIT_DFA_PRE_CYCLE_INSN
457 1.1 mrg #define TARGET_SCHED_INIT_DFA_PRE_CYCLE_INSN ia64_init_dfa_pre_cycle_insn
458 1.1 mrg #undef TARGET_SCHED_DFA_PRE_CYCLE_INSN
459 1.1 mrg #define TARGET_SCHED_DFA_PRE_CYCLE_INSN ia64_dfa_pre_cycle_insn
460 1.1 mrg
461 1.1 mrg #undef TARGET_SCHED_FIRST_CYCLE_MULTIPASS_DFA_LOOKAHEAD_GUARD
462 1.1 mrg #define TARGET_SCHED_FIRST_CYCLE_MULTIPASS_DFA_LOOKAHEAD_GUARD\
463 1.1 mrg ia64_first_cycle_multipass_dfa_lookahead_guard
464 1.1 mrg
465 1.1 mrg #undef TARGET_SCHED_DFA_NEW_CYCLE
466 1.1 mrg #define TARGET_SCHED_DFA_NEW_CYCLE ia64_dfa_new_cycle
467 1.1 mrg
468 1.1 mrg #undef TARGET_SCHED_H_I_D_EXTENDED
469 1.1 mrg #define TARGET_SCHED_H_I_D_EXTENDED ia64_h_i_d_extended
470 1.1 mrg
471 1.1 mrg #undef TARGET_SCHED_ALLOC_SCHED_CONTEXT
472 1.1 mrg #define TARGET_SCHED_ALLOC_SCHED_CONTEXT ia64_alloc_sched_context
473 1.1 mrg
474 1.1 mrg #undef TARGET_SCHED_INIT_SCHED_CONTEXT
475 1.1 mrg #define TARGET_SCHED_INIT_SCHED_CONTEXT ia64_init_sched_context
476 1.1 mrg
477 1.1 mrg #undef TARGET_SCHED_SET_SCHED_CONTEXT
478 1.1 mrg #define TARGET_SCHED_SET_SCHED_CONTEXT ia64_set_sched_context
479 1.1 mrg
480 1.1 mrg #undef TARGET_SCHED_CLEAR_SCHED_CONTEXT
481 1.1 mrg #define TARGET_SCHED_CLEAR_SCHED_CONTEXT ia64_clear_sched_context
482 1.1 mrg
483 1.1 mrg #undef TARGET_SCHED_FREE_SCHED_CONTEXT
484 1.1 mrg #define TARGET_SCHED_FREE_SCHED_CONTEXT ia64_free_sched_context
485 1.1 mrg
486 1.1 mrg #undef TARGET_SCHED_SET_SCHED_FLAGS
487 1.1 mrg #define TARGET_SCHED_SET_SCHED_FLAGS ia64_set_sched_flags
488 1.1 mrg
489 1.1 mrg #undef TARGET_SCHED_GET_INSN_SPEC_DS
490 1.1 mrg #define TARGET_SCHED_GET_INSN_SPEC_DS ia64_get_insn_spec_ds
491 1.1 mrg
492 1.1 mrg #undef TARGET_SCHED_GET_INSN_CHECKED_DS
493 1.1 mrg #define TARGET_SCHED_GET_INSN_CHECKED_DS ia64_get_insn_checked_ds
494 1.1 mrg
495 1.1 mrg #undef TARGET_SCHED_SPECULATE_INSN
496 1.1 mrg #define TARGET_SCHED_SPECULATE_INSN ia64_speculate_insn
497 1.1 mrg
498 1.1 mrg #undef TARGET_SCHED_NEEDS_BLOCK_P
499 1.1 mrg #define TARGET_SCHED_NEEDS_BLOCK_P ia64_needs_block_p
500 1.1 mrg
501 1.1 mrg #undef TARGET_SCHED_GEN_SPEC_CHECK
502 1.1 mrg #define TARGET_SCHED_GEN_SPEC_CHECK ia64_gen_spec_check
503 1.1 mrg
504 1.1 mrg #undef TARGET_SCHED_SKIP_RTX_P
505 1.1 mrg #define TARGET_SCHED_SKIP_RTX_P ia64_skip_rtx_p
506 1.1 mrg
507 1.1 mrg #undef TARGET_FUNCTION_OK_FOR_SIBCALL
508 1.1 mrg #define TARGET_FUNCTION_OK_FOR_SIBCALL ia64_function_ok_for_sibcall
509 1.1 mrg #undef TARGET_ARG_PARTIAL_BYTES
510 1.1 mrg #define TARGET_ARG_PARTIAL_BYTES ia64_arg_partial_bytes
511 1.1 mrg #undef TARGET_FUNCTION_ARG
512 1.1 mrg #define TARGET_FUNCTION_ARG ia64_function_arg
513 1.1 mrg #undef TARGET_FUNCTION_INCOMING_ARG
514 1.1 mrg #define TARGET_FUNCTION_INCOMING_ARG ia64_function_incoming_arg
515 1.1 mrg #undef TARGET_FUNCTION_ARG_ADVANCE
516 1.1 mrg #define TARGET_FUNCTION_ARG_ADVANCE ia64_function_arg_advance
517 1.1 mrg #undef TARGET_FUNCTION_ARG_PADDING
518 1.1 mrg #define TARGET_FUNCTION_ARG_PADDING ia64_function_arg_padding
519 1.1 mrg #undef TARGET_FUNCTION_ARG_BOUNDARY
520 1.1 mrg #define TARGET_FUNCTION_ARG_BOUNDARY ia64_function_arg_boundary
521 1.1 mrg
522 1.1 mrg #undef TARGET_ASM_OUTPUT_MI_THUNK
523 1.1 mrg #define TARGET_ASM_OUTPUT_MI_THUNK ia64_output_mi_thunk
524 1.1 mrg #undef TARGET_ASM_CAN_OUTPUT_MI_THUNK
525 1.1 mrg #define TARGET_ASM_CAN_OUTPUT_MI_THUNK hook_bool_const_tree_hwi_hwi_const_tree_true
526 1.1 mrg
527 1.1 mrg #undef TARGET_ASM_FILE_START
528 1.1 mrg #define TARGET_ASM_FILE_START ia64_file_start
529 1.1 mrg
530 1.1 mrg #undef TARGET_ASM_GLOBALIZE_DECL_NAME
531 1.1 mrg #define TARGET_ASM_GLOBALIZE_DECL_NAME ia64_globalize_decl_name
532 1.1 mrg
533 1.1 mrg #undef TARGET_REGISTER_MOVE_COST
534 1.1 mrg #define TARGET_REGISTER_MOVE_COST ia64_register_move_cost
535 1.1 mrg #undef TARGET_MEMORY_MOVE_COST
536 1.1 mrg #define TARGET_MEMORY_MOVE_COST ia64_memory_move_cost
537 1.1 mrg #undef TARGET_RTX_COSTS
538 1.1 mrg #define TARGET_RTX_COSTS ia64_rtx_costs
539 1.1 mrg #undef TARGET_ADDRESS_COST
540 1.1 mrg #define TARGET_ADDRESS_COST hook_int_rtx_mode_as_bool_0
541 1.1 mrg
542 1.1 mrg #undef TARGET_UNSPEC_MAY_TRAP_P
543 1.1 mrg #define TARGET_UNSPEC_MAY_TRAP_P ia64_unspec_may_trap_p
544 1.1 mrg
545 1.1 mrg #undef TARGET_MACHINE_DEPENDENT_REORG
546 1.1 mrg #define TARGET_MACHINE_DEPENDENT_REORG ia64_reorg
547 1.1 mrg
548 1.1 mrg #undef TARGET_ENCODE_SECTION_INFO
549 1.1 mrg #define TARGET_ENCODE_SECTION_INFO ia64_encode_section_info
550 1.1 mrg
551 1.1 mrg #undef TARGET_SECTION_TYPE_FLAGS
552 1.1 mrg #define TARGET_SECTION_TYPE_FLAGS ia64_section_type_flags
553 1.1 mrg
554 1.1 mrg #ifdef HAVE_AS_TLS
555 1.1 mrg #undef TARGET_ASM_OUTPUT_DWARF_DTPREL
556 1.1 mrg #define TARGET_ASM_OUTPUT_DWARF_DTPREL ia64_output_dwarf_dtprel
557 1.1 mrg #endif
558 1.1 mrg
559 1.1 mrg /* ??? Investigate. */
560 1.1 mrg #if 0
561 1.1 mrg #undef TARGET_PROMOTE_PROTOTYPES
562 1.1 mrg #define TARGET_PROMOTE_PROTOTYPES hook_bool_tree_true
563 1.1 mrg #endif
564 1.1 mrg
565 1.1 mrg #undef TARGET_FUNCTION_VALUE
566 1.1 mrg #define TARGET_FUNCTION_VALUE ia64_function_value
567 1.1 mrg #undef TARGET_LIBCALL_VALUE
568 1.1 mrg #define TARGET_LIBCALL_VALUE ia64_libcall_value
569 1.1 mrg #undef TARGET_FUNCTION_VALUE_REGNO_P
570 1.1 mrg #define TARGET_FUNCTION_VALUE_REGNO_P ia64_function_value_regno_p
571 1.1 mrg
572 1.1 mrg #undef TARGET_STRUCT_VALUE_RTX
573 1.1 mrg #define TARGET_STRUCT_VALUE_RTX ia64_struct_value_rtx
574 1.1 mrg #undef TARGET_RETURN_IN_MEMORY
575 1.1 mrg #define TARGET_RETURN_IN_MEMORY ia64_return_in_memory
576 1.1 mrg #undef TARGET_SETUP_INCOMING_VARARGS
577 1.1 mrg #define TARGET_SETUP_INCOMING_VARARGS ia64_setup_incoming_varargs
578 1.1 mrg #undef TARGET_STRICT_ARGUMENT_NAMING
579 1.1 mrg #define TARGET_STRICT_ARGUMENT_NAMING hook_bool_CUMULATIVE_ARGS_true
580 1.1 mrg #undef TARGET_MUST_PASS_IN_STACK
581 1.1 mrg #define TARGET_MUST_PASS_IN_STACK must_pass_in_stack_var_size
582 1.1 mrg #undef TARGET_GET_RAW_RESULT_MODE
583 1.1 mrg #define TARGET_GET_RAW_RESULT_MODE ia64_get_reg_raw_mode
584 1.1 mrg #undef TARGET_GET_RAW_ARG_MODE
585 1.1 mrg #define TARGET_GET_RAW_ARG_MODE ia64_get_reg_raw_mode
586 1.1 mrg
587 1.1 mrg #undef TARGET_MEMBER_TYPE_FORCES_BLK
588 1.1 mrg #define TARGET_MEMBER_TYPE_FORCES_BLK ia64_member_type_forces_blk
589 1.1 mrg
590 1.1 mrg #undef TARGET_GIMPLIFY_VA_ARG_EXPR
591 1.1 mrg #define TARGET_GIMPLIFY_VA_ARG_EXPR ia64_gimplify_va_arg
592 1.1 mrg
593 1.1 mrg #undef TARGET_ASM_UNWIND_EMIT
594 1.1 mrg #define TARGET_ASM_UNWIND_EMIT ia64_asm_unwind_emit
595 1.1 mrg #undef TARGET_ASM_EMIT_EXCEPT_PERSONALITY
596 1.1 mrg #define TARGET_ASM_EMIT_EXCEPT_PERSONALITY ia64_asm_emit_except_personality
597 1.1 mrg #undef TARGET_ASM_INIT_SECTIONS
598 1.1 mrg #define TARGET_ASM_INIT_SECTIONS ia64_asm_init_sections
599 1.1 mrg
600 1.1 mrg #undef TARGET_DEBUG_UNWIND_INFO
601 1.1 mrg #define TARGET_DEBUG_UNWIND_INFO ia64_debug_unwind_info
602 1.1 mrg
603 1.1 mrg #undef TARGET_SCALAR_MODE_SUPPORTED_P
604 1.1 mrg #define TARGET_SCALAR_MODE_SUPPORTED_P ia64_scalar_mode_supported_p
605 1.1 mrg #undef TARGET_VECTOR_MODE_SUPPORTED_P
606 1.1 mrg #define TARGET_VECTOR_MODE_SUPPORTED_P ia64_vector_mode_supported_p
607 1.1 mrg
608 1.1 mrg #undef TARGET_LEGITIMATE_CONSTANT_P
609 1.1 mrg #define TARGET_LEGITIMATE_CONSTANT_P ia64_legitimate_constant_p
610 1.1 mrg #undef TARGET_LEGITIMATE_ADDRESS_P
611 1.1 mrg #define TARGET_LEGITIMATE_ADDRESS_P ia64_legitimate_address_p
612 1.1 mrg
613 1.1 mrg #undef TARGET_LRA_P
614 1.1 mrg #define TARGET_LRA_P hook_bool_void_false
615 1.1 mrg
616 1.1 mrg #undef TARGET_CANNOT_FORCE_CONST_MEM
617 1.1 mrg #define TARGET_CANNOT_FORCE_CONST_MEM ia64_cannot_force_const_mem
618 1.1 mrg
619 1.1 mrg #undef TARGET_MANGLE_TYPE
620 1.1 mrg #define TARGET_MANGLE_TYPE ia64_mangle_type
621 1.1 mrg
622 1.1 mrg #undef TARGET_INVALID_CONVERSION
623 1.1 mrg #define TARGET_INVALID_CONVERSION ia64_invalid_conversion
624 1.1 mrg #undef TARGET_INVALID_UNARY_OP
625 1.1 mrg #define TARGET_INVALID_UNARY_OP ia64_invalid_unary_op
626 1.1 mrg #undef TARGET_INVALID_BINARY_OP
627 1.1 mrg #define TARGET_INVALID_BINARY_OP ia64_invalid_binary_op
628 1.1 mrg
629 1.1 mrg #undef TARGET_C_MODE_FOR_SUFFIX
630 1.1 mrg #define TARGET_C_MODE_FOR_SUFFIX ia64_c_mode_for_suffix
631 1.1 mrg
632 1.1 mrg #undef TARGET_CAN_ELIMINATE
633 1.1 mrg #define TARGET_CAN_ELIMINATE ia64_can_eliminate
634 1.1 mrg
635 1.1 mrg #undef TARGET_TRAMPOLINE_INIT
636 1.1 mrg #define TARGET_TRAMPOLINE_INIT ia64_trampoline_init
637 1.1 mrg
638 1.1 mrg #undef TARGET_CAN_USE_DOLOOP_P
639 1.1 mrg #define TARGET_CAN_USE_DOLOOP_P can_use_doloop_if_innermost
640 1.1 mrg #undef TARGET_INVALID_WITHIN_DOLOOP
641 1.1 mrg #define TARGET_INVALID_WITHIN_DOLOOP hook_constcharptr_const_rtx_insn_null
642 1.1 mrg
643 1.1 mrg #undef TARGET_OVERRIDE_OPTIONS_AFTER_CHANGE
644 1.1 mrg #define TARGET_OVERRIDE_OPTIONS_AFTER_CHANGE ia64_override_options_after_change
645 1.1 mrg
646 1.1 mrg #undef TARGET_PREFERRED_RELOAD_CLASS
647 1.1 mrg #define TARGET_PREFERRED_RELOAD_CLASS ia64_preferred_reload_class
648 1.1 mrg
649 1.1 mrg #undef TARGET_DELAY_SCHED2
650 1.1 mrg #define TARGET_DELAY_SCHED2 true
651 1.1 mrg
652 1.1 mrg /* Variable tracking should be run after all optimizations which
653 1.1 mrg change order of insns. It also needs a valid CFG. */
654 1.1 mrg #undef TARGET_DELAY_VARTRACK
655 1.1 mrg #define TARGET_DELAY_VARTRACK true
656 1.1 mrg
657 1.1 mrg #undef TARGET_VECTORIZE_VEC_PERM_CONST
658 1.1 mrg #define TARGET_VECTORIZE_VEC_PERM_CONST ia64_vectorize_vec_perm_const
659 1.1 mrg
660 1.1 mrg #undef TARGET_ATTRIBUTE_TAKES_IDENTIFIER_P
661 1.1 mrg #define TARGET_ATTRIBUTE_TAKES_IDENTIFIER_P ia64_attribute_takes_identifier_p
662 1.1 mrg
663 1.1 mrg #undef TARGET_CUSTOM_FUNCTION_DESCRIPTORS
664 1.1 mrg #define TARGET_CUSTOM_FUNCTION_DESCRIPTORS 0
665 1.1 mrg
666 1.1 mrg #undef TARGET_HARD_REGNO_NREGS
667 1.1 mrg #define TARGET_HARD_REGNO_NREGS ia64_hard_regno_nregs
668 1.1 mrg #undef TARGET_HARD_REGNO_MODE_OK
669 1.1 mrg #define TARGET_HARD_REGNO_MODE_OK ia64_hard_regno_mode_ok
670 1.1 mrg
671 1.1 mrg #undef TARGET_MODES_TIEABLE_P
672 1.1 mrg #define TARGET_MODES_TIEABLE_P ia64_modes_tieable_p
673 1.1 mrg
674 1.1 mrg #undef TARGET_CAN_CHANGE_MODE_CLASS
675 1.1 mrg #define TARGET_CAN_CHANGE_MODE_CLASS ia64_can_change_mode_class
676 1.1 mrg
677 1.1 mrg #undef TARGET_CONSTANT_ALIGNMENT
678 1.1 mrg #define TARGET_CONSTANT_ALIGNMENT constant_alignment_word_strings
679 1.1 mrg
680 1.1 mrg struct gcc_target targetm = TARGET_INITIALIZER;
681 1.1 mrg
682 1.1 mrg /* Returns TRUE iff the target attribute indicated by ATTR_ID takes a plain
684 1.1 mrg identifier as an argument, so the front end shouldn't look it up. */
685 1.1 mrg
686 1.1 mrg static bool
687 1.1 mrg ia64_attribute_takes_identifier_p (const_tree attr_id)
688 1.1 mrg {
689 1.1 mrg if (is_attribute_p ("model", attr_id))
690 1.1 mrg return true;
691 1.1 mrg #if TARGET_ABI_OPEN_VMS
692 1.1 mrg if (is_attribute_p ("common_object", attr_id))
693 1.1 mrg return true;
694 1.1 mrg #endif
695 1.1 mrg return false;
696 1.1 mrg }
697 1.1 mrg
698 1.1 mrg typedef enum
699 1.1 mrg {
700 1.1 mrg ADDR_AREA_NORMAL, /* normal address area */
701 1.1 mrg ADDR_AREA_SMALL /* addressable by "addl" (-2MB < addr < 2MB) */
702 1.1 mrg }
703 1.1 mrg ia64_addr_area;
704 1.1 mrg
705 1.1 mrg static GTY(()) tree small_ident1;
706 1.1 mrg static GTY(()) tree small_ident2;
707 1.1 mrg
708 1.1 mrg static void
709 1.1 mrg init_idents (void)
710 1.1 mrg {
711 1.1 mrg if (small_ident1 == 0)
712 1.1 mrg {
713 1.1 mrg small_ident1 = get_identifier ("small");
714 1.1 mrg small_ident2 = get_identifier ("__small__");
715 1.1 mrg }
716 1.1 mrg }
717 1.1 mrg
718 1.1 mrg /* Retrieve the address area that has been chosen for the given decl. */
719 1.1 mrg
720 1.1 mrg static ia64_addr_area
721 1.1 mrg ia64_get_addr_area (tree decl)
722 1.1 mrg {
723 1.1 mrg tree model_attr;
724 1.1 mrg
725 1.1 mrg model_attr = lookup_attribute ("model", DECL_ATTRIBUTES (decl));
726 1.1 mrg if (model_attr)
727 1.1 mrg {
728 1.1 mrg tree id;
729 1.1 mrg
730 1.1 mrg init_idents ();
731 1.1 mrg id = TREE_VALUE (TREE_VALUE (model_attr));
732 1.1 mrg if (id == small_ident1 || id == small_ident2)
733 1.1 mrg return ADDR_AREA_SMALL;
734 1.1 mrg }
735 1.1 mrg return ADDR_AREA_NORMAL;
736 1.1 mrg }
737 1.1 mrg
738 1.1 mrg static tree
739 1.1 mrg ia64_handle_model_attribute (tree *node, tree name, tree args,
740 1.1 mrg int flags ATTRIBUTE_UNUSED, bool *no_add_attrs)
741 1.1 mrg {
742 1.1 mrg ia64_addr_area addr_area = ADDR_AREA_NORMAL;
743 1.1 mrg ia64_addr_area area;
744 1.1 mrg tree arg, decl = *node;
745 1.1 mrg
746 1.1 mrg init_idents ();
747 1.1 mrg arg = TREE_VALUE (args);
748 1.1 mrg if (arg == small_ident1 || arg == small_ident2)
749 1.1 mrg {
750 1.1 mrg addr_area = ADDR_AREA_SMALL;
751 1.1 mrg }
752 1.1 mrg else
753 1.1 mrg {
754 1.1 mrg warning (OPT_Wattributes, "invalid argument of %qE attribute",
755 1.1 mrg name);
756 1.1 mrg *no_add_attrs = true;
757 1.1 mrg }
758 1.1 mrg
759 1.1 mrg switch (TREE_CODE (decl))
760 1.1 mrg {
761 1.1 mrg case VAR_DECL:
762 1.1 mrg if ((DECL_CONTEXT (decl) && TREE_CODE (DECL_CONTEXT (decl))
763 1.1 mrg == FUNCTION_DECL)
764 1.1 mrg && !TREE_STATIC (decl))
765 1.1 mrg {
766 1.1 mrg error_at (DECL_SOURCE_LOCATION (decl),
767 1.1 mrg "an address area attribute cannot be specified for "
768 1.1 mrg "local variables");
769 1.1 mrg *no_add_attrs = true;
770 1.1 mrg }
771 1.1 mrg area = ia64_get_addr_area (decl);
772 1.1 mrg if (area != ADDR_AREA_NORMAL && addr_area != area)
773 1.1 mrg {
774 1.1 mrg error ("address area of %q+D conflicts with previous "
775 1.1 mrg "declaration", decl);
776 1.1 mrg *no_add_attrs = true;
777 1.1 mrg }
778 1.1 mrg break;
779 1.1 mrg
780 1.1 mrg case FUNCTION_DECL:
781 1.1 mrg error_at (DECL_SOURCE_LOCATION (decl),
782 1.1 mrg "address area attribute cannot be specified for "
783 1.1 mrg "functions");
784 1.1 mrg *no_add_attrs = true;
785 1.1 mrg break;
786 1.1 mrg
787 1.1 mrg default:
788 1.1 mrg warning (OPT_Wattributes, "%qE attribute ignored",
789 1.1 mrg name);
790 1.1 mrg *no_add_attrs = true;
791 1.1 mrg break;
792 1.1 mrg }
793 1.1 mrg
794 1.1 mrg return NULL_TREE;
795 1.1 mrg }
796 1.1 mrg
797 1.1 mrg /* Part of the low level implementation of DEC Ada pragma Common_Object which
798 1.1 mrg enables the shared use of variables stored in overlaid linker areas
799 1.1 mrg corresponding to the use of Fortran COMMON. */
800 1.1 mrg
801 1.1 mrg static tree
802 1.1 mrg ia64_vms_common_object_attribute (tree *node, tree name, tree args,
803 1.1 mrg int flags ATTRIBUTE_UNUSED,
804 1.1 mrg bool *no_add_attrs)
805 1.1 mrg {
806 1.1 mrg tree decl = *node;
807 1.1 mrg tree id;
808 1.1 mrg
809 1.1 mrg gcc_assert (DECL_P (decl));
810 1.1 mrg
811 1.1 mrg DECL_COMMON (decl) = 1;
812 1.1 mrg id = TREE_VALUE (args);
813 1.1 mrg if (TREE_CODE (id) != IDENTIFIER_NODE && TREE_CODE (id) != STRING_CST)
814 1.1 mrg {
815 1.1 mrg error ("%qE attribute requires a string constant argument", name);
816 1.1 mrg *no_add_attrs = true;
817 1.1 mrg return NULL_TREE;
818 1.1 mrg }
819 1.1 mrg return NULL_TREE;
820 1.1 mrg }
821 1.1 mrg
822 1.1 mrg /* Part of the low level implementation of DEC Ada pragma Common_Object. */
823 1.1 mrg
824 1.1 mrg void
825 1.1 mrg ia64_vms_output_aligned_decl_common (FILE *file, tree decl, const char *name,
826 1.1 mrg unsigned HOST_WIDE_INT size,
827 1.1 mrg unsigned int align)
828 1.1 mrg {
829 1.1 mrg tree attr = DECL_ATTRIBUTES (decl);
830 1.1 mrg
831 1.1 mrg if (attr)
832 1.1 mrg attr = lookup_attribute ("common_object", attr);
833 1.1 mrg if (attr)
834 1.1 mrg {
835 1.1 mrg tree id = TREE_VALUE (TREE_VALUE (attr));
836 1.1 mrg const char *name;
837 1.1 mrg
838 1.1 mrg if (TREE_CODE (id) == IDENTIFIER_NODE)
839 1.1 mrg name = IDENTIFIER_POINTER (id);
840 1.1 mrg else if (TREE_CODE (id) == STRING_CST)
841 1.1 mrg name = TREE_STRING_POINTER (id);
842 1.1 mrg else
843 1.1 mrg abort ();
844 1.1 mrg
845 1.1 mrg fprintf (file, "\t.vms_common\t\"%s\",", name);
846 1.1 mrg }
847 1.1 mrg else
848 1.1 mrg fprintf (file, "%s", COMMON_ASM_OP);
849 1.1 mrg
850 1.1 mrg /* Code from elfos.h. */
851 1.1 mrg assemble_name (file, name);
852 1.1 mrg fprintf (file, "," HOST_WIDE_INT_PRINT_UNSIGNED",%u",
853 1.1 mrg size, align / BITS_PER_UNIT);
854 1.1 mrg
855 1.1 mrg fputc ('\n', file);
856 1.1 mrg }
857 1.1 mrg
858 1.1 mrg static void
859 1.1 mrg ia64_encode_addr_area (tree decl, rtx symbol)
860 1.1 mrg {
861 1.1 mrg int flags;
862 1.1 mrg
863 1.1 mrg flags = SYMBOL_REF_FLAGS (symbol);
864 1.1 mrg switch (ia64_get_addr_area (decl))
865 1.1 mrg {
866 1.1 mrg case ADDR_AREA_NORMAL: break;
867 1.1 mrg case ADDR_AREA_SMALL: flags |= SYMBOL_FLAG_SMALL_ADDR; break;
868 1.1 mrg default: gcc_unreachable ();
869 1.1 mrg }
870 1.1 mrg SYMBOL_REF_FLAGS (symbol) = flags;
871 1.1 mrg }
872 1.1 mrg
873 1.1 mrg static void
874 1.1 mrg ia64_encode_section_info (tree decl, rtx rtl, int first)
875 1.1 mrg {
876 1.1 mrg default_encode_section_info (decl, rtl, first);
877 1.1 mrg
878 1.1 mrg /* Careful not to prod global register variables. */
879 1.1 mrg if (TREE_CODE (decl) == VAR_DECL
880 1.1 mrg && GET_CODE (DECL_RTL (decl)) == MEM
881 1.1 mrg && GET_CODE (XEXP (DECL_RTL (decl), 0)) == SYMBOL_REF
882 1.1 mrg && (TREE_STATIC (decl) || DECL_EXTERNAL (decl)))
883 1.1 mrg ia64_encode_addr_area (decl, XEXP (rtl, 0));
884 1.1 mrg }
885 1.1 mrg
886 1.1 mrg /* Return 1 if the operands of a move are ok. */
888 1.1 mrg
889 1.1 mrg int
890 1.1 mrg ia64_move_ok (rtx dst, rtx src)
891 1.1 mrg {
892 1.1 mrg /* If we're under init_recog_no_volatile, we'll not be able to use
893 1.1 mrg memory_operand. So check the code directly and don't worry about
894 1.1 mrg the validity of the underlying address, which should have been
895 1.1 mrg checked elsewhere anyway. */
896 1.1 mrg if (GET_CODE (dst) != MEM)
897 1.1 mrg return 1;
898 1.1 mrg if (GET_CODE (src) == MEM)
899 1.1 mrg return 0;
900 1.1 mrg if (register_operand (src, VOIDmode))
901 1.1 mrg return 1;
902 1.1 mrg
903 1.1 mrg /* Otherwise, this must be a constant, and that either 0 or 0.0 or 1.0. */
904 1.1 mrg if (INTEGRAL_MODE_P (GET_MODE (dst)))
905 1.1 mrg return src == const0_rtx;
906 1.1 mrg else
907 1.1 mrg return satisfies_constraint_G (src);
908 1.1 mrg }
909 1.1 mrg
910 1.1 mrg /* Return 1 if the operands are ok for a floating point load pair. */
911 1.1 mrg
912 1.1 mrg int
913 1.1 mrg ia64_load_pair_ok (rtx dst, rtx src)
914 1.1 mrg {
915 1.1 mrg /* ??? There is a thinko in the implementation of the "x" constraint and the
916 1.1 mrg FP_REGS class. The constraint will also reject (reg f30:TI) so we must
917 1.1 mrg also return false for it. */
918 1.1 mrg if (GET_CODE (dst) != REG
919 1.1 mrg || !(FP_REGNO_P (REGNO (dst)) && FP_REGNO_P (REGNO (dst) + 1)))
920 1.1 mrg return 0;
921 1.1 mrg if (GET_CODE (src) != MEM || MEM_VOLATILE_P (src))
922 1.1 mrg return 0;
923 1.1 mrg switch (GET_CODE (XEXP (src, 0)))
924 1.1 mrg {
925 1.1 mrg case REG:
926 1.1 mrg case POST_INC:
927 1.1 mrg break;
928 1.1 mrg case POST_DEC:
929 1.1 mrg return 0;
930 1.1 mrg case POST_MODIFY:
931 1.1 mrg {
932 1.1 mrg rtx adjust = XEXP (XEXP (XEXP (src, 0), 1), 1);
933 1.1 mrg
934 1.1 mrg if (GET_CODE (adjust) != CONST_INT
935 1.1 mrg || INTVAL (adjust) != GET_MODE_SIZE (GET_MODE (src)))
936 1.1 mrg return 0;
937 1.1 mrg }
938 1.1 mrg break;
939 1.1 mrg default:
940 1.1 mrg abort ();
941 1.1 mrg }
942 1.1 mrg return 1;
943 1.1 mrg }
944 1.1 mrg
945 1.1 mrg int
946 1.1 mrg addp4_optimize_ok (rtx op1, rtx op2)
947 1.1 mrg {
948 1.1 mrg return (basereg_operand (op1, GET_MODE(op1)) !=
949 1.1 mrg basereg_operand (op2, GET_MODE(op2)));
950 1.1 mrg }
951 1.1 mrg
952 1.1 mrg /* Check if OP is a mask suitable for use with SHIFT in a dep.z instruction.
953 1.1 mrg Return the length of the field, or <= 0 on failure. */
954 1.1 mrg
955 1.1 mrg int
956 1.1 mrg ia64_depz_field_mask (rtx rop, rtx rshift)
957 1.1 mrg {
958 1.1 mrg unsigned HOST_WIDE_INT op = INTVAL (rop);
959 1.1 mrg unsigned HOST_WIDE_INT shift = INTVAL (rshift);
960 1.1 mrg
961 1.1 mrg /* Get rid of the zero bits we're shifting in. */
962 1.1 mrg op >>= shift;
963 1.1 mrg
964 1.1 mrg /* We must now have a solid block of 1's at bit 0. */
965 1.1 mrg return exact_log2 (op + 1);
966 1.1 mrg }
967 1.1 mrg
968 1.1 mrg /* Return the TLS model to use for ADDR. */
969 1.1 mrg
970 1.1 mrg static enum tls_model
971 1.1 mrg tls_symbolic_operand_type (rtx addr)
972 1.1 mrg {
973 1.1 mrg enum tls_model tls_kind = TLS_MODEL_NONE;
974 1.1 mrg
975 1.1 mrg if (GET_CODE (addr) == CONST)
976 1.1 mrg {
977 1.1 mrg if (GET_CODE (XEXP (addr, 0)) == PLUS
978 1.1 mrg && GET_CODE (XEXP (XEXP (addr, 0), 0)) == SYMBOL_REF)
979 1.1 mrg tls_kind = SYMBOL_REF_TLS_MODEL (XEXP (XEXP (addr, 0), 0));
980 1.1 mrg }
981 1.1 mrg else if (GET_CODE (addr) == SYMBOL_REF)
982 1.1 mrg tls_kind = SYMBOL_REF_TLS_MODEL (addr);
983 1.1 mrg
984 1.1 mrg return tls_kind;
985 1.1 mrg }
986 1.1 mrg
987 1.1 mrg /* Returns true if REG (assumed to be a `reg' RTX) is valid for use
988 1.1 mrg as a base register. */
989 1.1 mrg
990 1.1 mrg static inline bool
991 1.1 mrg ia64_reg_ok_for_base_p (const_rtx reg, bool strict)
992 1.1 mrg {
993 1.1 mrg if (strict
994 1.1 mrg && REGNO_OK_FOR_BASE_P (REGNO (reg)))
995 1.1 mrg return true;
996 1.1 mrg else if (!strict
997 1.1 mrg && (GENERAL_REGNO_P (REGNO (reg))
998 1.1 mrg || !HARD_REGISTER_P (reg)))
999 1.1 mrg return true;
1000 1.1 mrg else
1001 1.1 mrg return false;
1002 1.1 mrg }
1003 1.1 mrg
1004 1.1 mrg static bool
1005 1.1 mrg ia64_legitimate_address_reg (const_rtx reg, bool strict)
1006 1.1 mrg {
1007 1.1 mrg if ((REG_P (reg) && ia64_reg_ok_for_base_p (reg, strict))
1008 1.1 mrg || (GET_CODE (reg) == SUBREG && REG_P (XEXP (reg, 0))
1009 1.1 mrg && ia64_reg_ok_for_base_p (XEXP (reg, 0), strict)))
1010 1.1 mrg return true;
1011 1.1 mrg
1012 1.1 mrg return false;
1013 1.1 mrg }
1014 1.1 mrg
1015 1.1 mrg static bool
1016 1.1 mrg ia64_legitimate_address_disp (const_rtx reg, const_rtx disp, bool strict)
1017 1.1 mrg {
1018 1.1 mrg if (GET_CODE (disp) == PLUS
1019 1.1 mrg && rtx_equal_p (reg, XEXP (disp, 0))
1020 1.1 mrg && (ia64_legitimate_address_reg (XEXP (disp, 1), strict)
1021 1.1 mrg || (CONST_INT_P (XEXP (disp, 1))
1022 1.1 mrg && IN_RANGE (INTVAL (XEXP (disp, 1)), -256, 255))))
1023 1.1 mrg return true;
1024 1.1 mrg
1025 1.1 mrg return false;
1026 1.1 mrg }
1027 1.1 mrg
1028 1.1 mrg /* Implement TARGET_LEGITIMATE_ADDRESS_P. */
1029 1.1 mrg
1030 1.1 mrg static bool
1031 1.1 mrg ia64_legitimate_address_p (machine_mode mode ATTRIBUTE_UNUSED,
1032 1.1 mrg rtx x, bool strict)
1033 1.1 mrg {
1034 1.1 mrg if (ia64_legitimate_address_reg (x, strict))
1035 1.1 mrg return true;
1036 1.1 mrg else if ((GET_CODE (x) == POST_INC || GET_CODE (x) == POST_DEC)
1037 1.1 mrg && ia64_legitimate_address_reg (XEXP (x, 0), strict)
1038 1.1 mrg && XEXP (x, 0) != arg_pointer_rtx)
1039 1.1 mrg return true;
1040 1.1 mrg else if (GET_CODE (x) == POST_MODIFY
1041 1.1 mrg && ia64_legitimate_address_reg (XEXP (x, 0), strict)
1042 1.1 mrg && XEXP (x, 0) != arg_pointer_rtx
1043 1.1 mrg && ia64_legitimate_address_disp (XEXP (x, 0), XEXP (x, 1), strict))
1044 1.1 mrg return true;
1045 1.1 mrg else
1046 1.1 mrg return false;
1047 1.1 mrg }
1048 1.1 mrg
1049 1.1 mrg /* Return true if X is a constant that is valid for some immediate
1050 1.1 mrg field in an instruction. */
1051 1.1 mrg
1052 1.1 mrg static bool
1053 1.1 mrg ia64_legitimate_constant_p (machine_mode mode, rtx x)
1054 1.1 mrg {
1055 1.1 mrg switch (GET_CODE (x))
1056 1.1 mrg {
1057 1.1 mrg case CONST_INT:
1058 1.1 mrg case LABEL_REF:
1059 1.1 mrg return true;
1060 1.1 mrg
1061 1.1 mrg case CONST_DOUBLE:
1062 1.1 mrg if (GET_MODE (x) == VOIDmode || mode == SFmode || mode == DFmode)
1063 1.1 mrg return true;
1064 1.1 mrg return satisfies_constraint_G (x);
1065 1.1 mrg
1066 1.1 mrg case CONST:
1067 1.1 mrg case SYMBOL_REF:
1068 1.1 mrg /* ??? Short term workaround for PR 28490. We must make the code here
1069 1.1 mrg match the code in ia64_expand_move and move_operand, even though they
1070 1.1 mrg are both technically wrong. */
1071 1.1 mrg if (tls_symbolic_operand_type (x) == 0)
1072 1.1 mrg {
1073 1.1 mrg HOST_WIDE_INT addend = 0;
1074 1.1 mrg rtx op = x;
1075 1.1 mrg
1076 1.1 mrg if (GET_CODE (op) == CONST
1077 1.1 mrg && GET_CODE (XEXP (op, 0)) == PLUS
1078 1.1 mrg && GET_CODE (XEXP (XEXP (op, 0), 1)) == CONST_INT)
1079 1.1 mrg {
1080 1.1 mrg addend = INTVAL (XEXP (XEXP (op, 0), 1));
1081 1.1 mrg op = XEXP (XEXP (op, 0), 0);
1082 1.1 mrg }
1083 1.1 mrg
1084 1.1 mrg if (any_offset_symbol_operand (op, mode)
1085 1.1 mrg || function_operand (op, mode))
1086 1.1 mrg return true;
1087 1.1 mrg if (aligned_offset_symbol_operand (op, mode))
1088 1.1 mrg return (addend & 0x3fff) == 0;
1089 1.1 mrg return false;
1090 1.1 mrg }
1091 1.1 mrg return false;
1092 1.1 mrg
1093 1.1 mrg case CONST_VECTOR:
1094 1.1 mrg if (mode == V2SFmode)
1095 1.1 mrg return satisfies_constraint_Y (x);
1096 1.1 mrg
1097 1.1 mrg return (GET_MODE_CLASS (mode) == MODE_VECTOR_INT
1098 1.1 mrg && GET_MODE_SIZE (mode) <= 8);
1099 1.1 mrg
1100 1.1 mrg default:
1101 1.1 mrg return false;
1102 1.1 mrg }
1103 1.1 mrg }
1104 1.1 mrg
1105 1.1 mrg /* Don't allow TLS addresses to get spilled to memory. */
1106 1.1 mrg
1107 1.1 mrg static bool
1108 1.1 mrg ia64_cannot_force_const_mem (machine_mode mode, rtx x)
1109 1.1 mrg {
1110 1.1 mrg if (mode == RFmode)
1111 1.1 mrg return true;
1112 1.1 mrg return tls_symbolic_operand_type (x) != 0;
1113 1.1 mrg }
1114 1.1 mrg
1115 1.1 mrg /* Expand a symbolic constant load. */
1116 1.1 mrg
1117 1.1 mrg bool
1118 1.1 mrg ia64_expand_load_address (rtx dest, rtx src)
1119 1.1 mrg {
1120 1.1 mrg gcc_assert (GET_CODE (dest) == REG);
1121 1.1 mrg
1122 1.1 mrg /* ILP32 mode still loads 64-bits of data from the GOT. This avoids
1123 1.1 mrg having to pointer-extend the value afterward. Other forms of address
1124 1.1 mrg computation below are also more natural to compute as 64-bit quantities.
1125 1.1 mrg If we've been given an SImode destination register, change it. */
1126 1.1 mrg if (GET_MODE (dest) != Pmode)
1127 1.1 mrg dest = gen_rtx_REG_offset (dest, Pmode, REGNO (dest),
1128 1.1 mrg byte_lowpart_offset (Pmode, GET_MODE (dest)));
1129 1.1 mrg
1130 1.1 mrg if (TARGET_NO_PIC)
1131 1.1 mrg return false;
1132 1.1 mrg if (small_addr_symbolic_operand (src, VOIDmode))
1133 1.1 mrg return false;
1134 1.1 mrg
1135 1.1 mrg if (TARGET_AUTO_PIC)
1136 1.1 mrg emit_insn (gen_load_gprel64 (dest, src));
1137 1.1 mrg else if (GET_CODE (src) == SYMBOL_REF && SYMBOL_REF_FUNCTION_P (src))
1138 1.1 mrg emit_insn (gen_load_fptr (dest, src));
1139 1.1 mrg else if (sdata_symbolic_operand (src, VOIDmode))
1140 1.1 mrg emit_insn (gen_load_gprel (dest, src));
1141 1.1 mrg else if (local_symbolic_operand64 (src, VOIDmode))
1142 1.1 mrg {
1143 1.1 mrg /* We want to use @gprel rather than @ltoff relocations for local
1144 1.1 mrg symbols:
1145 1.1 mrg - @gprel does not require dynamic linker
1146 1.1 mrg - and does not use .sdata section
1147 1.1 mrg https://gcc.gnu.org/bugzilla/60465 */
1148 1.1 mrg emit_insn (gen_load_gprel64 (dest, src));
1149 1.1 mrg }
1150 1.1 mrg else
1151 1.1 mrg {
1152 1.1 mrg HOST_WIDE_INT addend = 0;
1153 1.1 mrg rtx tmp;
1154 1.1 mrg
1155 1.1 mrg /* We did split constant offsets in ia64_expand_move, and we did try
1156 1.1 mrg to keep them split in move_operand, but we also allowed reload to
1157 1.1 mrg rematerialize arbitrary constants rather than spill the value to
1158 1.1 mrg the stack and reload it. So we have to be prepared here to split
1159 1.1 mrg them apart again. */
1160 1.1 mrg if (GET_CODE (src) == CONST)
1161 1.1 mrg {
1162 1.1 mrg HOST_WIDE_INT hi, lo;
1163 1.1 mrg
1164 1.1 mrg hi = INTVAL (XEXP (XEXP (src, 0), 1));
1165 1.1 mrg lo = ((hi & 0x3fff) ^ 0x2000) - 0x2000;
1166 1.1 mrg hi = hi - lo;
1167 1.1 mrg
1168 1.1 mrg if (lo != 0)
1169 1.1 mrg {
1170 1.1 mrg addend = lo;
1171 1.1 mrg src = plus_constant (Pmode, XEXP (XEXP (src, 0), 0), hi);
1172 1.1 mrg }
1173 1.1 mrg }
1174 1.1 mrg
1175 1.1 mrg tmp = gen_rtx_HIGH (Pmode, src);
1176 1.1 mrg tmp = gen_rtx_PLUS (Pmode, tmp, pic_offset_table_rtx);
1177 1.1 mrg emit_insn (gen_rtx_SET (dest, tmp));
1178 1.1 mrg
1179 1.1 mrg tmp = gen_rtx_LO_SUM (Pmode, gen_const_mem (Pmode, dest), src);
1180 1.1 mrg emit_insn (gen_rtx_SET (dest, tmp));
1181 1.1 mrg
1182 1.1 mrg if (addend)
1183 1.1 mrg {
1184 1.1 mrg tmp = gen_rtx_PLUS (Pmode, dest, GEN_INT (addend));
1185 1.1 mrg emit_insn (gen_rtx_SET (dest, tmp));
1186 1.1 mrg }
1187 1.1 mrg }
1188 1.1 mrg
1189 1.1 mrg return true;
1190 1.1 mrg }
1191 1.1 mrg
1192 1.1 mrg static GTY(()) rtx gen_tls_tga;
1193 1.1 mrg static rtx
1194 1.1 mrg gen_tls_get_addr (void)
1195 1.1 mrg {
1196 1.1 mrg if (!gen_tls_tga)
1197 1.1 mrg gen_tls_tga = init_one_libfunc ("__tls_get_addr");
1198 1.1 mrg return gen_tls_tga;
1199 1.1 mrg }
1200 1.1 mrg
1201 1.1 mrg static GTY(()) rtx thread_pointer_rtx;
1202 1.1 mrg static rtx
1203 1.1 mrg gen_thread_pointer (void)
1204 1.1 mrg {
1205 1.1 mrg if (!thread_pointer_rtx)
1206 1.1 mrg thread_pointer_rtx = gen_rtx_REG (Pmode, 13);
1207 1.1 mrg return thread_pointer_rtx;
1208 1.1 mrg }
1209 1.1 mrg
1210 1.1 mrg static rtx
1211 1.1 mrg ia64_expand_tls_address (enum tls_model tls_kind, rtx op0, rtx op1,
1212 1.1 mrg rtx orig_op1, HOST_WIDE_INT addend)
1213 1.1 mrg {
1214 1.1 mrg rtx tga_op1, tga_op2, tga_ret, tga_eqv, tmp;
1215 1.1 mrg rtx_insn *insns;
1216 1.1 mrg rtx orig_op0 = op0;
1217 1.1 mrg HOST_WIDE_INT addend_lo, addend_hi;
1218 1.1 mrg
1219 1.1 mrg switch (tls_kind)
1220 1.1 mrg {
1221 1.1 mrg case TLS_MODEL_GLOBAL_DYNAMIC:
1222 1.1 mrg start_sequence ();
1223 1.1 mrg
1224 1.1 mrg tga_op1 = gen_reg_rtx (Pmode);
1225 1.1 mrg emit_insn (gen_load_dtpmod (tga_op1, op1));
1226 1.1 mrg
1227 1.1 mrg tga_op2 = gen_reg_rtx (Pmode);
1228 1.1 mrg emit_insn (gen_load_dtprel (tga_op2, op1));
1229 1.1 mrg
1230 1.1 mrg tga_ret = emit_library_call_value (gen_tls_get_addr (), NULL_RTX,
1231 1.1 mrg LCT_CONST, Pmode,
1232 1.1 mrg tga_op1, Pmode, tga_op2, Pmode);
1233 1.1 mrg
1234 1.1 mrg insns = get_insns ();
1235 1.1 mrg end_sequence ();
1236 1.1 mrg
1237 1.1 mrg if (GET_MODE (op0) != Pmode)
1238 1.1 mrg op0 = tga_ret;
1239 1.1 mrg emit_libcall_block (insns, op0, tga_ret, op1);
1240 1.1 mrg break;
1241 1.1 mrg
1242 1.1 mrg case TLS_MODEL_LOCAL_DYNAMIC:
1243 1.1 mrg /* ??? This isn't the completely proper way to do local-dynamic
1244 1.1 mrg If the call to __tls_get_addr is used only by a single symbol,
1245 1.1 mrg then we should (somehow) move the dtprel to the second arg
1246 1.1 mrg to avoid the extra add. */
1247 1.1 mrg start_sequence ();
1248 1.1 mrg
1249 1.1 mrg tga_op1 = gen_reg_rtx (Pmode);
1250 1.1 mrg emit_insn (gen_load_dtpmod (tga_op1, op1));
1251 1.1 mrg
1252 1.1 mrg tga_op2 = const0_rtx;
1253 1.1 mrg
1254 1.1 mrg tga_ret = emit_library_call_value (gen_tls_get_addr (), NULL_RTX,
1255 1.1 mrg LCT_CONST, Pmode,
1256 1.1 mrg tga_op1, Pmode, tga_op2, Pmode);
1257 1.1 mrg
1258 1.1 mrg insns = get_insns ();
1259 1.1 mrg end_sequence ();
1260 1.1 mrg
1261 1.1 mrg tga_eqv = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, const0_rtx),
1262 1.1 mrg UNSPEC_LD_BASE);
1263 1.1 mrg tmp = gen_reg_rtx (Pmode);
1264 1.1 mrg emit_libcall_block (insns, tmp, tga_ret, tga_eqv);
1265 1.1 mrg
1266 1.1 mrg if (!register_operand (op0, Pmode))
1267 1.1 mrg op0 = gen_reg_rtx (Pmode);
1268 1.1 mrg if (TARGET_TLS64)
1269 1.1 mrg {
1270 1.1 mrg emit_insn (gen_load_dtprel (op0, op1));
1271 1.1 mrg emit_insn (gen_adddi3 (op0, tmp, op0));
1272 1.1 mrg }
1273 1.1 mrg else
1274 1.1 mrg emit_insn (gen_add_dtprel (op0, op1, tmp));
1275 1.1 mrg break;
1276 1.1 mrg
1277 1.1 mrg case TLS_MODEL_INITIAL_EXEC:
1278 1.1 mrg addend_lo = ((addend & 0x3fff) ^ 0x2000) - 0x2000;
1279 1.1 mrg addend_hi = addend - addend_lo;
1280 1.1 mrg
1281 1.1 mrg op1 = plus_constant (Pmode, op1, addend_hi);
1282 1.1 mrg addend = addend_lo;
1283 1.1 mrg
1284 1.1 mrg tmp = gen_reg_rtx (Pmode);
1285 1.1 mrg emit_insn (gen_load_tprel (tmp, op1));
1286 1.1 mrg
1287 1.1 mrg if (!register_operand (op0, Pmode))
1288 1.1 mrg op0 = gen_reg_rtx (Pmode);
1289 1.1 mrg emit_insn (gen_adddi3 (op0, tmp, gen_thread_pointer ()));
1290 1.1 mrg break;
1291 1.1 mrg
1292 1.1 mrg case TLS_MODEL_LOCAL_EXEC:
1293 1.1 mrg if (!register_operand (op0, Pmode))
1294 1.1 mrg op0 = gen_reg_rtx (Pmode);
1295 1.1 mrg
1296 1.1 mrg op1 = orig_op1;
1297 1.1 mrg addend = 0;
1298 1.1 mrg if (TARGET_TLS64)
1299 1.1 mrg {
1300 1.1 mrg emit_insn (gen_load_tprel (op0, op1));
1301 1.1 mrg emit_insn (gen_adddi3 (op0, op0, gen_thread_pointer ()));
1302 1.1 mrg }
1303 1.1 mrg else
1304 1.1 mrg emit_insn (gen_add_tprel (op0, op1, gen_thread_pointer ()));
1305 1.1 mrg break;
1306 1.1 mrg
1307 1.1 mrg default:
1308 1.1 mrg gcc_unreachable ();
1309 1.1 mrg }
1310 1.1 mrg
1311 1.1 mrg if (addend)
1312 1.1 mrg op0 = expand_simple_binop (Pmode, PLUS, op0, GEN_INT (addend),
1313 1.1 mrg orig_op0, 1, OPTAB_DIRECT);
1314 1.1 mrg if (orig_op0 == op0)
1315 1.1 mrg return NULL_RTX;
1316 1.1 mrg if (GET_MODE (orig_op0) == Pmode)
1317 1.1 mrg return op0;
1318 1.1 mrg return gen_lowpart (GET_MODE (orig_op0), op0);
1319 1.1 mrg }
1320 1.1 mrg
1321 1.1 mrg rtx
1322 1.1 mrg ia64_expand_move (rtx op0, rtx op1)
1323 1.1 mrg {
1324 1.1 mrg machine_mode mode = GET_MODE (op0);
1325 1.1 mrg
1326 1.1 mrg if (!reload_in_progress && !reload_completed && !ia64_move_ok (op0, op1))
1327 1.1 mrg op1 = force_reg (mode, op1);
1328 1.1 mrg
1329 1.1 mrg if ((mode == Pmode || mode == ptr_mode) && symbolic_operand (op1, VOIDmode))
1330 1.1 mrg {
1331 1.1 mrg HOST_WIDE_INT addend = 0;
1332 1.1 mrg enum tls_model tls_kind;
1333 1.1 mrg rtx sym = op1;
1334 1.1 mrg
1335 1.1 mrg if (GET_CODE (op1) == CONST
1336 1.1 mrg && GET_CODE (XEXP (op1, 0)) == PLUS
1337 1.1 mrg && GET_CODE (XEXP (XEXP (op1, 0), 1)) == CONST_INT)
1338 1.1 mrg {
1339 1.1 mrg addend = INTVAL (XEXP (XEXP (op1, 0), 1));
1340 1.1 mrg sym = XEXP (XEXP (op1, 0), 0);
1341 1.1 mrg }
1342 1.1 mrg
1343 1.1 mrg tls_kind = tls_symbolic_operand_type (sym);
1344 1.1 mrg if (tls_kind)
1345 1.1 mrg return ia64_expand_tls_address (tls_kind, op0, sym, op1, addend);
1346 1.1 mrg
1347 1.1 mrg if (any_offset_symbol_operand (sym, mode))
1348 1.1 mrg addend = 0;
1349 1.1 mrg else if (aligned_offset_symbol_operand (sym, mode))
1350 1.1 mrg {
1351 1.1 mrg HOST_WIDE_INT addend_lo, addend_hi;
1352 1.1 mrg
1353 1.1 mrg addend_lo = ((addend & 0x3fff) ^ 0x2000) - 0x2000;
1354 1.1 mrg addend_hi = addend - addend_lo;
1355 1.1 mrg
1356 1.1 mrg if (addend_lo != 0)
1357 1.1 mrg {
1358 1.1 mrg op1 = plus_constant (mode, sym, addend_hi);
1359 1.1 mrg addend = addend_lo;
1360 1.1 mrg }
1361 1.1 mrg else
1362 1.1 mrg addend = 0;
1363 1.1 mrg }
1364 1.1 mrg else
1365 1.1 mrg op1 = sym;
1366 1.1 mrg
1367 1.1 mrg if (reload_completed)
1368 1.1 mrg {
1369 1.1 mrg /* We really should have taken care of this offset earlier. */
1370 1.1 mrg gcc_assert (addend == 0);
1371 1.1 mrg if (ia64_expand_load_address (op0, op1))
1372 1.1 mrg return NULL_RTX;
1373 1.1 mrg }
1374 1.1 mrg
1375 1.1 mrg if (addend)
1376 1.1 mrg {
1377 1.1 mrg rtx subtarget = !can_create_pseudo_p () ? op0 : gen_reg_rtx (mode);
1378 1.1 mrg
1379 1.1 mrg emit_insn (gen_rtx_SET (subtarget, op1));
1380 1.1 mrg
1381 1.1 mrg op1 = expand_simple_binop (mode, PLUS, subtarget,
1382 1.1 mrg GEN_INT (addend), op0, 1, OPTAB_DIRECT);
1383 1.1 mrg if (op0 == op1)
1384 1.1 mrg return NULL_RTX;
1385 1.1 mrg }
1386 1.1 mrg }
1387 1.1 mrg
1388 1.1 mrg return op1;
1389 1.1 mrg }
1390 1.1 mrg
1391 1.1 mrg /* Split a move from OP1 to OP0 conditional on COND. */
1392 1.1 mrg
1393 1.1 mrg void
1394 1.1 mrg ia64_emit_cond_move (rtx op0, rtx op1, rtx cond)
1395 1.1 mrg {
1396 1.1 mrg rtx_insn *insn, *first = get_last_insn ();
1397 1.1 mrg
1398 1.1 mrg emit_move_insn (op0, op1);
1399 1.1 mrg
1400 1.1 mrg for (insn = get_last_insn (); insn != first; insn = PREV_INSN (insn))
1401 1.1 mrg if (INSN_P (insn))
1402 1.1 mrg PATTERN (insn) = gen_rtx_COND_EXEC (VOIDmode, copy_rtx (cond),
1403 1.1 mrg PATTERN (insn));
1404 1.1 mrg }
1405 1.1 mrg
1406 1.1 mrg /* Split a post-reload TImode or TFmode reference into two DImode
1407 1.1 mrg components. This is made extra difficult by the fact that we do
1408 1.1 mrg not get any scratch registers to work with, because reload cannot
1409 1.1 mrg be prevented from giving us a scratch that overlaps the register
1410 1.1 mrg pair involved. So instead, when addressing memory, we tweak the
1411 1.1 mrg pointer register up and back down with POST_INCs. Or up and not
1412 1.1 mrg back down when we can get away with it.
1413 1.1 mrg
1414 1.1 mrg REVERSED is true when the loads must be done in reversed order
1415 1.1 mrg (high word first) for correctness. DEAD is true when the pointer
1416 1.1 mrg dies with the second insn we generate and therefore the second
1417 1.1 mrg address must not carry a postmodify.
1418 1.1 mrg
1419 1.1 mrg May return an insn which is to be emitted after the moves. */
1420 1.1 mrg
1421 1.1 mrg static rtx
1422 1.1 mrg ia64_split_tmode (rtx out[2], rtx in, bool reversed, bool dead)
1423 1.1 mrg {
1424 1.1 mrg rtx fixup = 0;
1425 1.1 mrg
1426 1.1 mrg switch (GET_CODE (in))
1427 1.1 mrg {
1428 1.1 mrg case REG:
1429 1.1 mrg out[reversed] = gen_rtx_REG (DImode, REGNO (in));
1430 1.1 mrg out[!reversed] = gen_rtx_REG (DImode, REGNO (in) + 1);
1431 1.1 mrg break;
1432 1.1 mrg
1433 1.1 mrg case CONST_INT:
1434 1.1 mrg case CONST_DOUBLE:
1435 1.1 mrg /* Cannot occur reversed. */
1436 1.1 mrg gcc_assert (!reversed);
1437 1.1 mrg
1438 1.1 mrg if (GET_MODE (in) != TFmode)
1439 1.1 mrg split_double (in, &out[0], &out[1]);
1440 1.1 mrg else
1441 1.1 mrg /* split_double does not understand how to split a TFmode
1442 1.1 mrg quantity into a pair of DImode constants. */
1443 1.1 mrg {
1444 1.1 mrg unsigned HOST_WIDE_INT p[2];
1445 1.1 mrg long l[4]; /* TFmode is 128 bits */
1446 1.1 mrg
1447 1.1 mrg real_to_target (l, CONST_DOUBLE_REAL_VALUE (in), TFmode);
1448 1.1 mrg
1449 1.1 mrg if (FLOAT_WORDS_BIG_ENDIAN)
1450 1.1 mrg {
1451 1.1 mrg p[0] = (((unsigned HOST_WIDE_INT) l[0]) << 32) + l[1];
1452 1.1 mrg p[1] = (((unsigned HOST_WIDE_INT) l[2]) << 32) + l[3];
1453 1.1 mrg }
1454 1.1 mrg else
1455 1.1 mrg {
1456 1.1 mrg p[0] = (((unsigned HOST_WIDE_INT) l[1]) << 32) + l[0];
1457 1.1 mrg p[1] = (((unsigned HOST_WIDE_INT) l[3]) << 32) + l[2];
1458 1.1 mrg }
1459 1.1 mrg out[0] = GEN_INT (p[0]);
1460 1.1 mrg out[1] = GEN_INT (p[1]);
1461 1.1 mrg }
1462 1.1 mrg break;
1463 1.1 mrg
1464 1.1 mrg case MEM:
1465 1.1 mrg {
1466 1.1 mrg rtx base = XEXP (in, 0);
1467 1.1 mrg rtx offset;
1468 1.1 mrg
1469 1.1 mrg switch (GET_CODE (base))
1470 1.1 mrg {
1471 1.1 mrg case REG:
1472 1.1 mrg if (!reversed)
1473 1.1 mrg {
1474 1.1 mrg out[0] = adjust_automodify_address
1475 1.1 mrg (in, DImode, gen_rtx_POST_INC (Pmode, base), 0);
1476 1.1 mrg out[1] = adjust_automodify_address
1477 1.1 mrg (in, DImode, dead ? 0 : gen_rtx_POST_DEC (Pmode, base), 8);
1478 1.1 mrg }
1479 1.1 mrg else
1480 1.1 mrg {
1481 1.1 mrg /* Reversal requires a pre-increment, which can only
1482 1.1 mrg be done as a separate insn. */
1483 1.1 mrg emit_insn (gen_adddi3 (base, base, GEN_INT (8)));
1484 1.1 mrg out[0] = adjust_automodify_address
1485 1.1 mrg (in, DImode, gen_rtx_POST_DEC (Pmode, base), 8);
1486 1.1 mrg out[1] = adjust_address (in, DImode, 0);
1487 1.1 mrg }
1488 1.1 mrg break;
1489 1.1 mrg
1490 1.1 mrg case POST_INC:
1491 1.1 mrg gcc_assert (!reversed && !dead);
1492 1.1 mrg
1493 1.1 mrg /* Just do the increment in two steps. */
1494 1.1 mrg out[0] = adjust_automodify_address (in, DImode, 0, 0);
1495 1.1 mrg out[1] = adjust_automodify_address (in, DImode, 0, 8);
1496 1.1 mrg break;
1497 1.1 mrg
1498 1.1 mrg case POST_DEC:
1499 1.1 mrg gcc_assert (!reversed && !dead);
1500 1.1 mrg
1501 1.1 mrg /* Add 8, subtract 24. */
1502 1.1 mrg base = XEXP (base, 0);
1503 1.1 mrg out[0] = adjust_automodify_address
1504 1.1 mrg (in, DImode, gen_rtx_POST_INC (Pmode, base), 0);
1505 1.1 mrg out[1] = adjust_automodify_address
1506 1.1 mrg (in, DImode,
1507 1.1 mrg gen_rtx_POST_MODIFY (Pmode, base,
1508 1.1 mrg plus_constant (Pmode, base, -24)),
1509 1.1 mrg 8);
1510 1.1 mrg break;
1511 1.1 mrg
1512 1.1 mrg case POST_MODIFY:
1513 1.1 mrg gcc_assert (!reversed && !dead);
1514 1.1 mrg
1515 1.1 mrg /* Extract and adjust the modification. This case is
1516 1.1 mrg trickier than the others, because we might have an
1517 1.1 mrg index register, or we might have a combined offset that
1518 1.1 mrg doesn't fit a signed 9-bit displacement field. We can
1519 1.1 mrg assume the incoming expression is already legitimate. */
1520 1.1 mrg offset = XEXP (base, 1);
1521 1.1 mrg base = XEXP (base, 0);
1522 1.1 mrg
1523 1.1 mrg out[0] = adjust_automodify_address
1524 1.1 mrg (in, DImode, gen_rtx_POST_INC (Pmode, base), 0);
1525 1.1 mrg
1526 1.1 mrg if (GET_CODE (XEXP (offset, 1)) == REG)
1527 1.1 mrg {
1528 1.1 mrg /* Can't adjust the postmodify to match. Emit the
1529 1.1 mrg original, then a separate addition insn. */
1530 1.1 mrg out[1] = adjust_automodify_address (in, DImode, 0, 8);
1531 1.1 mrg fixup = gen_adddi3 (base, base, GEN_INT (-8));
1532 1.1 mrg }
1533 1.1 mrg else
1534 1.1 mrg {
1535 1.1 mrg gcc_assert (GET_CODE (XEXP (offset, 1)) == CONST_INT);
1536 1.1 mrg if (INTVAL (XEXP (offset, 1)) < -256 + 8)
1537 1.1 mrg {
1538 1.1 mrg /* Again the postmodify cannot be made to match,
1539 1.1 mrg but in this case it's more efficient to get rid
1540 1.1 mrg of the postmodify entirely and fix up with an
1541 1.1 mrg add insn. */
1542 1.1 mrg out[1] = adjust_automodify_address (in, DImode, base, 8);
1543 1.1 mrg fixup = gen_adddi3
1544 1.1 mrg (base, base, GEN_INT (INTVAL (XEXP (offset, 1)) - 8));
1545 1.1 mrg }
1546 1.1 mrg else
1547 1.1 mrg {
1548 1.1 mrg /* Combined offset still fits in the displacement field.
1549 1.1 mrg (We cannot overflow it at the high end.) */
1550 1.1 mrg out[1] = adjust_automodify_address
1551 1.1 mrg (in, DImode, gen_rtx_POST_MODIFY
1552 1.1 mrg (Pmode, base, gen_rtx_PLUS
1553 1.1 mrg (Pmode, base,
1554 1.1 mrg GEN_INT (INTVAL (XEXP (offset, 1)) - 8))),
1555 1.1 mrg 8);
1556 1.1 mrg }
1557 1.1 mrg }
1558 1.1 mrg break;
1559 1.1 mrg
1560 1.1 mrg default:
1561 1.1 mrg gcc_unreachable ();
1562 1.1 mrg }
1563 1.1 mrg break;
1564 1.1 mrg }
1565 1.1 mrg
1566 1.1 mrg default:
1567 1.1 mrg gcc_unreachable ();
1568 1.1 mrg }
1569 1.1 mrg
1570 1.1 mrg return fixup;
1571 1.1 mrg }
1572 1.1 mrg
1573 1.1 mrg /* Split a TImode or TFmode move instruction after reload.
1574 1.1 mrg This is used by *movtf_internal and *movti_internal. */
1575 1.1 mrg void
1576 1.1 mrg ia64_split_tmode_move (rtx operands[])
1577 1.1 mrg {
1578 1.1 mrg rtx in[2], out[2], insn;
1579 1.1 mrg rtx fixup[2];
1580 1.1 mrg bool dead = false;
1581 1.1 mrg bool reversed = false;
1582 1.1 mrg
1583 1.1 mrg /* It is possible for reload to decide to overwrite a pointer with
1584 1.1 mrg the value it points to. In that case we have to do the loads in
1585 1.1 mrg the appropriate order so that the pointer is not destroyed too
1586 1.1 mrg early. Also we must not generate a postmodify for that second
1587 1.1 mrg load, or rws_access_regno will die. And we must not generate a
1588 1.1 mrg postmodify for the second load if the destination register
1589 1.1 mrg overlaps with the base register. */
1590 1.1 mrg if (GET_CODE (operands[1]) == MEM
1591 1.1 mrg && reg_overlap_mentioned_p (operands[0], operands[1]))
1592 1.1 mrg {
1593 1.1 mrg rtx base = XEXP (operands[1], 0);
1594 1.1 mrg while (GET_CODE (base) != REG)
1595 1.1 mrg base = XEXP (base, 0);
1596 1.1 mrg
1597 1.1 mrg if (REGNO (base) == REGNO (operands[0]))
1598 1.1 mrg reversed = true;
1599 1.1 mrg
1600 1.1 mrg if (refers_to_regno_p (REGNO (operands[0]),
1601 1.1 mrg REGNO (operands[0])+2,
1602 1.1 mrg base, 0))
1603 1.1 mrg dead = true;
1604 1.1 mrg }
1605 1.1 mrg /* Another reason to do the moves in reversed order is if the first
1606 1.1 mrg element of the target register pair is also the second element of
1607 1.1 mrg the source register pair. */
1608 1.1 mrg if (GET_CODE (operands[0]) == REG && GET_CODE (operands[1]) == REG
1609 1.1 mrg && REGNO (operands[0]) == REGNO (operands[1]) + 1)
1610 1.1 mrg reversed = true;
1611 1.1 mrg
1612 1.1 mrg fixup[0] = ia64_split_tmode (in, operands[1], reversed, dead);
1613 1.1 mrg fixup[1] = ia64_split_tmode (out, operands[0], reversed, dead);
1614 1.1 mrg
1615 1.1 mrg #define MAYBE_ADD_REG_INC_NOTE(INSN, EXP) \
1616 1.1 mrg if (GET_CODE (EXP) == MEM \
1617 1.1 mrg && (GET_CODE (XEXP (EXP, 0)) == POST_MODIFY \
1618 1.1 mrg || GET_CODE (XEXP (EXP, 0)) == POST_INC \
1619 1.1 mrg || GET_CODE (XEXP (EXP, 0)) == POST_DEC)) \
1620 1.1 mrg add_reg_note (insn, REG_INC, XEXP (XEXP (EXP, 0), 0))
1621 1.1 mrg
1622 1.1 mrg insn = emit_insn (gen_rtx_SET (out[0], in[0]));
1623 1.1 mrg MAYBE_ADD_REG_INC_NOTE (insn, in[0]);
1624 1.1 mrg MAYBE_ADD_REG_INC_NOTE (insn, out[0]);
1625 1.1 mrg
1626 1.1 mrg insn = emit_insn (gen_rtx_SET (out[1], in[1]));
1627 1.1 mrg MAYBE_ADD_REG_INC_NOTE (insn, in[1]);
1628 1.1 mrg MAYBE_ADD_REG_INC_NOTE (insn, out[1]);
1629 1.1 mrg
1630 1.1 mrg if (fixup[0])
1631 1.1 mrg emit_insn (fixup[0]);
1632 1.1 mrg if (fixup[1])
1633 1.1 mrg emit_insn (fixup[1]);
1634 1.1 mrg
1635 1.1 mrg #undef MAYBE_ADD_REG_INC_NOTE
1636 1.1 mrg }
1637 1.1 mrg
1638 1.1 mrg /* ??? Fixing GR->FR XFmode moves during reload is hard. You need to go
1639 1.1 mrg through memory plus an extra GR scratch register. Except that you can
1640 1.1 mrg either get the first from TARGET_SECONDARY_MEMORY_NEEDED or the second
1641 1.1 mrg from SECONDARY_RELOAD_CLASS, but not both.
1642 1.1 mrg
1643 1.1 mrg We got into problems in the first place by allowing a construct like
1644 1.1 mrg (subreg:XF (reg:TI)), which we got from a union containing a long double.
1645 1.1 mrg This solution attempts to prevent this situation from occurring. When
1646 1.1 mrg we see something like the above, we spill the inner register to memory. */
1647 1.1 mrg
1648 1.1 mrg static rtx
1649 1.1 mrg spill_xfmode_rfmode_operand (rtx in, int force, machine_mode mode)
1650 1.1 mrg {
1651 1.1 mrg if (GET_CODE (in) == SUBREG
1652 1.1 mrg && GET_MODE (SUBREG_REG (in)) == TImode
1653 1.1 mrg && GET_CODE (SUBREG_REG (in)) == REG)
1654 1.1 mrg {
1655 1.1 mrg rtx memt = assign_stack_temp (TImode, 16);
1656 1.1 mrg emit_move_insn (memt, SUBREG_REG (in));
1657 1.1 mrg return adjust_address (memt, mode, 0);
1658 1.1 mrg }
1659 1.1 mrg else if (force && GET_CODE (in) == REG)
1660 1.1 mrg {
1661 1.1 mrg rtx memx = assign_stack_temp (mode, 16);
1662 1.1 mrg emit_move_insn (memx, in);
1663 1.1 mrg return memx;
1664 1.1 mrg }
1665 1.1 mrg else
1666 1.1 mrg return in;
1667 1.1 mrg }
1668 1.1 mrg
1669 1.1 mrg /* Expand the movxf or movrf pattern (MODE says which) with the given
1670 1.1 mrg OPERANDS, returning true if the pattern should then invoke
1671 1.1 mrg DONE. */
1672 1.1 mrg
1673 1.1 mrg bool
1674 1.1 mrg ia64_expand_movxf_movrf (machine_mode mode, rtx operands[])
1675 1.1 mrg {
1676 1.1 mrg rtx op0 = operands[0];
1677 1.1 mrg
1678 1.1 mrg if (GET_CODE (op0) == SUBREG)
1679 1.1 mrg op0 = SUBREG_REG (op0);
1680 1.1 mrg
1681 1.1 mrg /* We must support XFmode loads into general registers for stdarg/vararg,
1682 1.1 mrg unprototyped calls, and a rare case where a long double is passed as
1683 1.1 mrg an argument after a float HFA fills the FP registers. We split them into
1684 1.1 mrg DImode loads for convenience. We also need to support XFmode stores
1685 1.1 mrg for the last case. This case does not happen for stdarg/vararg routines,
1686 1.1 mrg because we do a block store to memory of unnamed arguments. */
1687 1.1 mrg
1688 1.1 mrg if (GET_CODE (op0) == REG && GR_REGNO_P (REGNO (op0)))
1689 1.1 mrg {
1690 1.1 mrg rtx out[2];
1691 1.1 mrg
1692 1.1 mrg /* We're hoping to transform everything that deals with XFmode
1693 1.1 mrg quantities and GR registers early in the compiler. */
1694 1.1 mrg gcc_assert (can_create_pseudo_p ());
1695 1.1 mrg
1696 1.1 mrg /* Struct to register can just use TImode instead. */
1697 1.1 mrg if ((GET_CODE (operands[1]) == SUBREG
1698 1.1 mrg && GET_MODE (SUBREG_REG (operands[1])) == TImode)
1699 1.1 mrg || (GET_CODE (operands[1]) == REG
1700 1.1 mrg && GR_REGNO_P (REGNO (operands[1]))))
1701 1.1 mrg {
1702 1.1 mrg rtx op1 = operands[1];
1703 1.1 mrg
1704 1.1 mrg if (GET_CODE (op1) == SUBREG)
1705 1.1 mrg op1 = SUBREG_REG (op1);
1706 1.1 mrg else
1707 1.1 mrg op1 = gen_rtx_REG (TImode, REGNO (op1));
1708 1.1 mrg
1709 1.1 mrg emit_move_insn (gen_rtx_REG (TImode, REGNO (op0)), op1);
1710 1.1 mrg return true;
1711 1.1 mrg }
1712 1.1 mrg
1713 1.1 mrg if (GET_CODE (operands[1]) == CONST_DOUBLE)
1714 1.1 mrg {
1715 1.1 mrg /* Don't word-swap when reading in the constant. */
1716 1.1 mrg emit_move_insn (gen_rtx_REG (DImode, REGNO (op0)),
1717 1.1 mrg operand_subword (operands[1], WORDS_BIG_ENDIAN,
1718 1.1 mrg 0, mode));
1719 1.1 mrg emit_move_insn (gen_rtx_REG (DImode, REGNO (op0) + 1),
1720 1.1 mrg operand_subword (operands[1], !WORDS_BIG_ENDIAN,
1721 1.1 mrg 0, mode));
1722 1.1 mrg return true;
1723 1.1 mrg }
1724 1.1 mrg
1725 1.1 mrg /* If the quantity is in a register not known to be GR, spill it. */
1726 1.1 mrg if (register_operand (operands[1], mode))
1727 1.1 mrg operands[1] = spill_xfmode_rfmode_operand (operands[1], 1, mode);
1728 1.1 mrg
1729 1.1 mrg gcc_assert (GET_CODE (operands[1]) == MEM);
1730 1.1 mrg
1731 1.1 mrg /* Don't word-swap when reading in the value. */
1732 1.1 mrg out[0] = gen_rtx_REG (DImode, REGNO (op0));
1733 1.1 mrg out[1] = gen_rtx_REG (DImode, REGNO (op0) + 1);
1734 1.1 mrg
1735 1.1 mrg emit_move_insn (out[0], adjust_address (operands[1], DImode, 0));
1736 1.1 mrg emit_move_insn (out[1], adjust_address (operands[1], DImode, 8));
1737 1.1 mrg return true;
1738 1.1 mrg }
1739 1.1 mrg
1740 1.1 mrg if (GET_CODE (operands[1]) == REG && GR_REGNO_P (REGNO (operands[1])))
1741 1.1 mrg {
1742 1.1 mrg /* We're hoping to transform everything that deals with XFmode
1743 1.1 mrg quantities and GR registers early in the compiler. */
1744 1.1 mrg gcc_assert (can_create_pseudo_p ());
1745 1.1 mrg
1746 1.1 mrg /* Op0 can't be a GR_REG here, as that case is handled above.
1747 1.1 mrg If op0 is a register, then we spill op1, so that we now have a
1748 1.1 mrg MEM operand. This requires creating an XFmode subreg of a TImode reg
1749 1.1 mrg to force the spill. */
1750 1.1 mrg if (register_operand (operands[0], mode))
1751 1.1 mrg {
1752 1.1 mrg rtx op1 = gen_rtx_REG (TImode, REGNO (operands[1]));
1753 1.1 mrg op1 = gen_rtx_SUBREG (mode, op1, 0);
1754 1.1 mrg operands[1] = spill_xfmode_rfmode_operand (op1, 0, mode);
1755 1.1 mrg }
1756 1.1 mrg
1757 1.1 mrg else
1758 1.1 mrg {
1759 1.1 mrg rtx in[2];
1760 1.1 mrg
1761 1.1 mrg gcc_assert (GET_CODE (operands[0]) == MEM);
1762 1.1 mrg
1763 1.1 mrg /* Don't word-swap when writing out the value. */
1764 1.1 mrg in[0] = gen_rtx_REG (DImode, REGNO (operands[1]));
1765 1.1 mrg in[1] = gen_rtx_REG (DImode, REGNO (operands[1]) + 1);
1766 1.1 mrg
1767 1.1 mrg emit_move_insn (adjust_address (operands[0], DImode, 0), in[0]);
1768 1.1 mrg emit_move_insn (adjust_address (operands[0], DImode, 8), in[1]);
1769 1.1 mrg return true;
1770 1.1 mrg }
1771 1.1 mrg }
1772 1.1 mrg
1773 1.1 mrg if (!reload_in_progress && !reload_completed)
1774 1.1 mrg {
1775 1.1 mrg operands[1] = spill_xfmode_rfmode_operand (operands[1], 0, mode);
1776 1.1 mrg
1777 1.1 mrg if (GET_MODE (op0) == TImode && GET_CODE (op0) == REG)
1778 1.1 mrg {
1779 1.1 mrg rtx memt, memx, in = operands[1];
1780 1.1 mrg if (CONSTANT_P (in))
1781 1.1 mrg in = validize_mem (force_const_mem (mode, in));
1782 1.1 mrg if (GET_CODE (in) == MEM)
1783 1.1 mrg memt = adjust_address (in, TImode, 0);
1784 1.1 mrg else
1785 1.1 mrg {
1786 1.1 mrg memt = assign_stack_temp (TImode, 16);
1787 1.1 mrg memx = adjust_address (memt, mode, 0);
1788 1.1 mrg emit_move_insn (memx, in);
1789 1.1 mrg }
1790 1.1 mrg emit_move_insn (op0, memt);
1791 1.1 mrg return true;
1792 1.1 mrg }
1793 1.1 mrg
1794 1.1 mrg if (!ia64_move_ok (operands[0], operands[1]))
1795 1.1 mrg operands[1] = force_reg (mode, operands[1]);
1796 1.1 mrg }
1797 1.1 mrg
1798 1.1 mrg return false;
1799 1.1 mrg }
1800 1.1 mrg
1801 1.1 mrg /* Emit comparison instruction if necessary, replacing *EXPR, *OP0, *OP1
1802 1.1 mrg with the expression that holds the compare result (in VOIDmode). */
1803 1.1 mrg
1804 1.1 mrg static GTY(()) rtx cmptf_libfunc;
1805 1.1 mrg
1806 1.1 mrg void
1807 1.1 mrg ia64_expand_compare (rtx *expr, rtx *op0, rtx *op1)
1808 1.1 mrg {
1809 1.1 mrg enum rtx_code code = GET_CODE (*expr);
1810 1.1 mrg rtx cmp;
1811 1.1 mrg
1812 1.1 mrg /* If we have a BImode input, then we already have a compare result, and
1813 1.1 mrg do not need to emit another comparison. */
1814 1.1 mrg if (GET_MODE (*op0) == BImode)
1815 1.1 mrg {
1816 1.1 mrg gcc_assert ((code == NE || code == EQ) && *op1 == const0_rtx);
1817 1.1 mrg cmp = *op0;
1818 1.1 mrg }
1819 1.1 mrg /* HPUX TFmode compare requires a library call to _U_Qfcmp, which takes a
1820 1.1 mrg magic number as its third argument, that indicates what to do.
1821 1.1 mrg The return value is an integer to be compared against zero. */
1822 1.1 mrg else if (TARGET_HPUX && GET_MODE (*op0) == TFmode)
1823 1.1 mrg {
1824 1.1 mrg enum qfcmp_magic {
1825 1.1 mrg QCMP_INV = 1, /* Raise FP_INVALID on NaNs as a side effect. */
1826 1.1 mrg QCMP_UNORD = 2,
1827 1.1 mrg QCMP_EQ = 4,
1828 1.1 mrg QCMP_LT = 8,
1829 1.1 mrg QCMP_GT = 16
1830 1.1 mrg };
1831 1.1 mrg int magic;
1832 1.1 mrg enum rtx_code ncode;
1833 1.1 mrg rtx ret;
1834 1.1 mrg
1835 1.1 mrg gcc_assert (cmptf_libfunc && GET_MODE (*op1) == TFmode);
1836 1.1 mrg switch (code)
1837 1.1 mrg {
1838 1.1 mrg /* 1 = equal, 0 = not equal. Equality operators do
1839 1.1 mrg not raise FP_INVALID when given a NaN operand. */
1840 1.1 mrg case EQ: magic = QCMP_EQ; ncode = NE; break;
1841 1.1 mrg case NE: magic = QCMP_EQ; ncode = EQ; break;
1842 1.1 mrg /* isunordered() from C99. */
1843 1.1 mrg case UNORDERED: magic = QCMP_UNORD; ncode = NE; break;
1844 1.1 mrg case ORDERED: magic = QCMP_UNORD; ncode = EQ; break;
1845 1.1 mrg /* Relational operators raise FP_INVALID when given
1846 1.1 mrg a NaN operand. */
1847 1.1 mrg case LT: magic = QCMP_LT |QCMP_INV; ncode = NE; break;
1848 1.1 mrg case LE: magic = QCMP_LT|QCMP_EQ|QCMP_INV; ncode = NE; break;
1849 1.1 mrg case GT: magic = QCMP_GT |QCMP_INV; ncode = NE; break;
1850 1.1 mrg case GE: magic = QCMP_GT|QCMP_EQ|QCMP_INV; ncode = NE; break;
1851 1.1 mrg /* Unordered relational operators do not raise FP_INVALID
1852 1.1 mrg when given a NaN operand. */
1853 1.1 mrg case UNLT: magic = QCMP_LT |QCMP_UNORD; ncode = NE; break;
1854 1.1 mrg case UNLE: magic = QCMP_LT|QCMP_EQ|QCMP_UNORD; ncode = NE; break;
1855 1.1 mrg case UNGT: magic = QCMP_GT |QCMP_UNORD; ncode = NE; break;
1856 1.1 mrg case UNGE: magic = QCMP_GT|QCMP_EQ|QCMP_UNORD; ncode = NE; break;
1857 1.1 mrg /* Not supported. */
1858 1.1 mrg case UNEQ:
1859 1.1 mrg case LTGT:
1860 1.1 mrg default: gcc_unreachable ();
1861 1.1 mrg }
1862 1.1 mrg
1863 1.1 mrg start_sequence ();
1864 1.1 mrg
1865 1.1 mrg ret = emit_library_call_value (cmptf_libfunc, 0, LCT_CONST, DImode,
1866 1.1 mrg *op0, TFmode, *op1, TFmode,
1867 1.1 mrg GEN_INT (magic), DImode);
1868 1.1 mrg cmp = gen_reg_rtx (BImode);
1869 1.1 mrg emit_insn (gen_rtx_SET (cmp, gen_rtx_fmt_ee (ncode, BImode,
1870 1.1 mrg ret, const0_rtx)));
1871 1.1 mrg
1872 1.1 mrg rtx_insn *insns = get_insns ();
1873 1.1 mrg end_sequence ();
1874 1.1 mrg
1875 1.1 mrg emit_libcall_block (insns, cmp, cmp,
1876 1.1 mrg gen_rtx_fmt_ee (code, BImode, *op0, *op1));
1877 1.1 mrg code = NE;
1878 1.1 mrg }
1879 1.1 mrg else
1880 1.1 mrg {
1881 1.1 mrg cmp = gen_reg_rtx (BImode);
1882 1.1 mrg emit_insn (gen_rtx_SET (cmp, gen_rtx_fmt_ee (code, BImode, *op0, *op1)));
1883 1.1 mrg code = NE;
1884 1.1 mrg }
1885 1.1 mrg
1886 1.1 mrg *expr = gen_rtx_fmt_ee (code, VOIDmode, cmp, const0_rtx);
1887 1.1 mrg *op0 = cmp;
1888 1.1 mrg *op1 = const0_rtx;
1889 1.1 mrg }
1890 1.1 mrg
1891 1.1 mrg /* Generate an integral vector comparison. Return true if the condition has
1892 1.1 mrg been reversed, and so the sense of the comparison should be inverted. */
1893 1.1 mrg
1894 1.1 mrg static bool
1895 1.1 mrg ia64_expand_vecint_compare (enum rtx_code code, machine_mode mode,
1896 1.1 mrg rtx dest, rtx op0, rtx op1)
1897 1.1 mrg {
1898 1.1 mrg bool negate = false;
1899 1.1 mrg rtx x;
1900 1.1 mrg
1901 1.1 mrg /* Canonicalize the comparison to EQ, GT, GTU. */
1902 1.1 mrg switch (code)
1903 1.1 mrg {
1904 1.1 mrg case EQ:
1905 1.1 mrg case GT:
1906 1.1 mrg case GTU:
1907 1.1 mrg break;
1908 1.1 mrg
1909 1.1 mrg case NE:
1910 1.1 mrg case LE:
1911 1.1 mrg case LEU:
1912 1.1 mrg code = reverse_condition (code);
1913 1.1 mrg negate = true;
1914 1.1 mrg break;
1915 1.1 mrg
1916 1.1 mrg case GE:
1917 1.1 mrg case GEU:
1918 1.1 mrg code = reverse_condition (code);
1919 1.1 mrg negate = true;
1920 1.1 mrg /* FALLTHRU */
1921 1.1 mrg
1922 1.1 mrg case LT:
1923 1.1 mrg case LTU:
1924 1.1 mrg code = swap_condition (code);
1925 1.1 mrg x = op0, op0 = op1, op1 = x;
1926 1.1 mrg break;
1927 1.1 mrg
1928 1.1 mrg default:
1929 1.1 mrg gcc_unreachable ();
1930 1.1 mrg }
1931 1.1 mrg
1932 1.1 mrg /* Unsigned parallel compare is not supported by the hardware. Play some
1933 1.1 mrg tricks to turn this into a signed comparison against 0. */
1934 1.1 mrg if (code == GTU)
1935 1.1 mrg {
1936 1.1 mrg switch (mode)
1937 1.1 mrg {
1938 1.1 mrg case E_V2SImode:
1939 1.1 mrg {
1940 1.1 mrg rtx t1, t2, mask;
1941 1.1 mrg
1942 1.1 mrg /* Subtract (-(INT MAX) - 1) from both operands to make
1943 1.1 mrg them signed. */
1944 1.1 mrg mask = gen_int_mode (0x80000000, SImode);
1945 1.1 mrg mask = gen_const_vec_duplicate (V2SImode, mask);
1946 1.1 mrg mask = force_reg (mode, mask);
1947 1.1 mrg t1 = gen_reg_rtx (mode);
1948 1.1 mrg emit_insn (gen_subv2si3 (t1, op0, mask));
1949 1.1 mrg t2 = gen_reg_rtx (mode);
1950 1.1 mrg emit_insn (gen_subv2si3 (t2, op1, mask));
1951 1.1 mrg op0 = t1;
1952 1.1 mrg op1 = t2;
1953 1.1 mrg code = GT;
1954 1.1 mrg }
1955 1.1 mrg break;
1956 1.1 mrg
1957 1.1 mrg case E_V8QImode:
1958 1.1 mrg case E_V4HImode:
1959 1.1 mrg /* Perform a parallel unsigned saturating subtraction. */
1960 1.1 mrg x = gen_reg_rtx (mode);
1961 1.1 mrg emit_insn (gen_rtx_SET (x, gen_rtx_US_MINUS (mode, op0, op1)));
1962 1.1 mrg
1963 1.1 mrg code = EQ;
1964 1.1 mrg op0 = x;
1965 1.1 mrg op1 = CONST0_RTX (mode);
1966 1.1 mrg negate = !negate;
1967 1.1 mrg break;
1968 1.1 mrg
1969 1.1 mrg default:
1970 1.1 mrg gcc_unreachable ();
1971 1.1 mrg }
1972 1.1 mrg }
1973 1.1 mrg
1974 1.1 mrg x = gen_rtx_fmt_ee (code, mode, op0, op1);
1975 1.1 mrg emit_insn (gen_rtx_SET (dest, x));
1976 1.1 mrg
1977 1.1 mrg return negate;
1978 1.1 mrg }
1979 1.1 mrg
1980 1.1 mrg /* Emit an integral vector conditional move. */
1981 1.1 mrg
1982 1.1 mrg void
1983 1.1 mrg ia64_expand_vecint_cmov (rtx operands[])
1984 1.1 mrg {
1985 1.1 mrg machine_mode mode = GET_MODE (operands[0]);
1986 1.1 mrg enum rtx_code code = GET_CODE (operands[3]);
1987 1.1 mrg bool negate;
1988 1.1 mrg rtx cmp, x, ot, of;
1989 1.1 mrg
1990 1.1 mrg cmp = gen_reg_rtx (mode);
1991 1.1 mrg negate = ia64_expand_vecint_compare (code, mode, cmp,
1992 1.1 mrg operands[4], operands[5]);
1993 1.1 mrg
1994 1.1 mrg ot = operands[1+negate];
1995 1.1 mrg of = operands[2-negate];
1996 1.1 mrg
1997 1.1 mrg if (ot == CONST0_RTX (mode))
1998 1.1 mrg {
1999 1.1 mrg if (of == CONST0_RTX (mode))
2000 1.1 mrg {
2001 1.1 mrg emit_move_insn (operands[0], ot);
2002 1.1 mrg return;
2003 1.1 mrg }
2004 1.1 mrg
2005 1.1 mrg x = gen_rtx_NOT (mode, cmp);
2006 1.1 mrg x = gen_rtx_AND (mode, x, of);
2007 1.1 mrg emit_insn (gen_rtx_SET (operands[0], x));
2008 1.1 mrg }
2009 1.1 mrg else if (of == CONST0_RTX (mode))
2010 1.1 mrg {
2011 1.1 mrg x = gen_rtx_AND (mode, cmp, ot);
2012 1.1 mrg emit_insn (gen_rtx_SET (operands[0], x));
2013 1.1 mrg }
2014 1.1 mrg else
2015 1.1 mrg {
2016 1.1 mrg rtx t, f;
2017 1.1 mrg
2018 1.1 mrg t = gen_reg_rtx (mode);
2019 1.1 mrg x = gen_rtx_AND (mode, cmp, operands[1+negate]);
2020 1.1 mrg emit_insn (gen_rtx_SET (t, x));
2021 1.1 mrg
2022 1.1 mrg f = gen_reg_rtx (mode);
2023 1.1 mrg x = gen_rtx_NOT (mode, cmp);
2024 1.1 mrg x = gen_rtx_AND (mode, x, operands[2-negate]);
2025 1.1 mrg emit_insn (gen_rtx_SET (f, x));
2026 1.1 mrg
2027 1.1 mrg x = gen_rtx_IOR (mode, t, f);
2028 1.1 mrg emit_insn (gen_rtx_SET (operands[0], x));
2029 1.1 mrg }
2030 1.1 mrg }
2031 1.1 mrg
2032 1.1 mrg /* Emit an integral vector min or max operation. Return true if all done. */
2033 1.1 mrg
2034 1.1 mrg bool
2035 1.1 mrg ia64_expand_vecint_minmax (enum rtx_code code, machine_mode mode,
2036 1.1 mrg rtx operands[])
2037 1.1 mrg {
2038 1.1 mrg rtx xops[6];
2039 1.1 mrg
2040 1.1 mrg /* These four combinations are supported directly. */
2041 1.1 mrg if (mode == V8QImode && (code == UMIN || code == UMAX))
2042 1.1 mrg return false;
2043 1.1 mrg if (mode == V4HImode && (code == SMIN || code == SMAX))
2044 1.1 mrg return false;
2045 1.1 mrg
2046 1.1 mrg /* This combination can be implemented with only saturating subtraction. */
2047 1.1 mrg if (mode == V4HImode && code == UMAX)
2048 1.1 mrg {
2049 1.1 mrg rtx x, tmp = gen_reg_rtx (mode);
2050 1.1 mrg
2051 1.1 mrg x = gen_rtx_US_MINUS (mode, operands[1], operands[2]);
2052 1.1 mrg emit_insn (gen_rtx_SET (tmp, x));
2053 1.1 mrg
2054 1.1 mrg emit_insn (gen_addv4hi3 (operands[0], tmp, operands[2]));
2055 1.1 mrg return true;
2056 1.1 mrg }
2057 1.1 mrg
2058 1.1 mrg /* Everything else implemented via vector comparisons. */
2059 1.1 mrg xops[0] = operands[0];
2060 1.1 mrg xops[4] = xops[1] = operands[1];
2061 1.1 mrg xops[5] = xops[2] = operands[2];
2062 1.1 mrg
2063 1.1 mrg switch (code)
2064 1.1 mrg {
2065 1.1 mrg case UMIN:
2066 1.1 mrg code = LTU;
2067 1.1 mrg break;
2068 1.1 mrg case UMAX:
2069 1.1 mrg code = GTU;
2070 1.1 mrg break;
2071 1.1 mrg case SMIN:
2072 1.1 mrg code = LT;
2073 1.1 mrg break;
2074 1.1 mrg case SMAX:
2075 1.1 mrg code = GT;
2076 1.1 mrg break;
2077 1.1 mrg default:
2078 1.1 mrg gcc_unreachable ();
2079 1.1 mrg }
2080 1.1 mrg xops[3] = gen_rtx_fmt_ee (code, VOIDmode, operands[1], operands[2]);
2081 1.1 mrg
2082 1.1 mrg ia64_expand_vecint_cmov (xops);
2083 1.1 mrg return true;
2084 1.1 mrg }
2085 1.1 mrg
2086 1.1 mrg /* The vectors LO and HI each contain N halves of a double-wide vector.
2087 1.1 mrg Reassemble either the first N/2 or the second N/2 elements. */
2088 1.1 mrg
2089 1.1 mrg void
2090 1.1 mrg ia64_unpack_assemble (rtx out, rtx lo, rtx hi, bool highp)
2091 1.1 mrg {
2092 1.1 mrg machine_mode vmode = GET_MODE (lo);
2093 1.1 mrg unsigned int i, high, nelt = GET_MODE_NUNITS (vmode);
2094 1.1 mrg struct expand_vec_perm_d d;
2095 1.1 mrg bool ok;
2096 1.1 mrg
2097 1.1 mrg d.target = gen_lowpart (vmode, out);
2098 1.1 mrg d.op0 = (TARGET_BIG_ENDIAN ? hi : lo);
2099 1.1 mrg d.op1 = (TARGET_BIG_ENDIAN ? lo : hi);
2100 1.1 mrg d.vmode = vmode;
2101 1.1 mrg d.nelt = nelt;
2102 1.1 mrg d.one_operand_p = false;
2103 1.1 mrg d.testing_p = false;
2104 1.1 mrg
2105 1.1 mrg high = (highp ? nelt / 2 : 0);
2106 1.1 mrg for (i = 0; i < nelt / 2; ++i)
2107 1.1 mrg {
2108 1.1 mrg d.perm[i * 2] = i + high;
2109 1.1 mrg d.perm[i * 2 + 1] = i + high + nelt;
2110 1.1 mrg }
2111 1.1 mrg
2112 1.1 mrg ok = ia64_expand_vec_perm_const_1 (&d);
2113 1.1 mrg gcc_assert (ok);
2114 1.1 mrg }
2115 1.1 mrg
2116 1.1 mrg /* Return a vector of the sign-extension of VEC. */
2117 1.1 mrg
2118 1.1 mrg static rtx
2119 1.1 mrg ia64_unpack_sign (rtx vec, bool unsignedp)
2120 1.1 mrg {
2121 1.1 mrg machine_mode mode = GET_MODE (vec);
2122 1.1 mrg rtx zero = CONST0_RTX (mode);
2123 1.1 mrg
2124 1.1 mrg if (unsignedp)
2125 1.1 mrg return zero;
2126 1.1 mrg else
2127 1.1 mrg {
2128 1.1 mrg rtx sign = gen_reg_rtx (mode);
2129 1.1 mrg bool neg;
2130 1.1 mrg
2131 1.1 mrg neg = ia64_expand_vecint_compare (LT, mode, sign, vec, zero);
2132 1.1 mrg gcc_assert (!neg);
2133 1.1 mrg
2134 1.1 mrg return sign;
2135 1.1 mrg }
2136 1.1 mrg }
2137 1.1 mrg
2138 1.1 mrg /* Emit an integral vector unpack operation. */
2139 1.1 mrg
2140 1.1 mrg void
2141 1.1 mrg ia64_expand_unpack (rtx operands[3], bool unsignedp, bool highp)
2142 1.1 mrg {
2143 1.1 mrg rtx sign = ia64_unpack_sign (operands[1], unsignedp);
2144 1.1 mrg ia64_unpack_assemble (operands[0], operands[1], sign, highp);
2145 1.1 mrg }
2146 1.1 mrg
2147 1.1 mrg /* Emit an integral vector widening sum operations. */
2148 1.1 mrg
2149 1.1 mrg void
2150 1.1 mrg ia64_expand_widen_sum (rtx operands[3], bool unsignedp)
2151 1.1 mrg {
2152 1.1 mrg machine_mode wmode;
2153 1.1 mrg rtx l, h, t, sign;
2154 1.1 mrg
2155 1.1 mrg sign = ia64_unpack_sign (operands[1], unsignedp);
2156 1.1 mrg
2157 1.1 mrg wmode = GET_MODE (operands[0]);
2158 1.1 mrg l = gen_reg_rtx (wmode);
2159 1.1 mrg h = gen_reg_rtx (wmode);
2160 1.1 mrg
2161 1.1 mrg ia64_unpack_assemble (l, operands[1], sign, false);
2162 1.1 mrg ia64_unpack_assemble (h, operands[1], sign, true);
2163 1.1 mrg
2164 1.1 mrg t = expand_binop (wmode, add_optab, l, operands[2], NULL, 0, OPTAB_DIRECT);
2165 1.1 mrg t = expand_binop (wmode, add_optab, h, t, operands[0], 0, OPTAB_DIRECT);
2166 1.1 mrg if (t != operands[0])
2167 1.1 mrg emit_move_insn (operands[0], t);
2168 1.1 mrg }
2169 1.1 mrg
2170 1.1 mrg /* Emit the appropriate sequence for a call. */
2171 1.1 mrg
2172 1.1 mrg void
2173 1.1 mrg ia64_expand_call (rtx retval, rtx addr, rtx nextarg ATTRIBUTE_UNUSED,
2174 1.1 mrg int sibcall_p)
2175 1.1 mrg {
2176 1.1 mrg rtx insn, b0;
2177 1.1 mrg
2178 1.1 mrg addr = XEXP (addr, 0);
2179 1.1 mrg addr = convert_memory_address (DImode, addr);
2180 1.1 mrg b0 = gen_rtx_REG (DImode, R_BR (0));
2181 1.1 mrg
2182 1.1 mrg /* ??? Should do this for functions known to bind local too. */
2183 1.1 mrg if (TARGET_NO_PIC || TARGET_AUTO_PIC)
2184 1.1 mrg {
2185 1.1 mrg if (sibcall_p)
2186 1.1 mrg insn = gen_sibcall_nogp (addr);
2187 1.1 mrg else if (! retval)
2188 1.1 mrg insn = gen_call_nogp (addr, b0);
2189 1.1 mrg else
2190 1.1 mrg insn = gen_call_value_nogp (retval, addr, b0);
2191 1.1 mrg insn = emit_call_insn (insn);
2192 1.1 mrg }
2193 1.1 mrg else
2194 1.1 mrg {
2195 1.1 mrg if (sibcall_p)
2196 1.1 mrg insn = gen_sibcall_gp (addr);
2197 1.1 mrg else if (! retval)
2198 1.1 mrg insn = gen_call_gp (addr, b0);
2199 1.1 mrg else
2200 1.1 mrg insn = gen_call_value_gp (retval, addr, b0);
2201 1.1 mrg insn = emit_call_insn (insn);
2202 1.1 mrg
2203 1.1 mrg use_reg (&CALL_INSN_FUNCTION_USAGE (insn), pic_offset_table_rtx);
2204 1.1 mrg }
2205 1.1 mrg
2206 1.1 mrg if (sibcall_p)
2207 1.1 mrg use_reg (&CALL_INSN_FUNCTION_USAGE (insn), b0);
2208 1.1 mrg
2209 1.1 mrg if (TARGET_ABI_OPEN_VMS)
2210 1.1 mrg use_reg (&CALL_INSN_FUNCTION_USAGE (insn),
2211 1.1 mrg gen_rtx_REG (DImode, GR_REG (25)));
2212 1.1 mrg }
2213 1.1 mrg
2214 1.1 mrg static void
2215 1.1 mrg reg_emitted (enum ia64_frame_regs r)
2216 1.1 mrg {
2217 1.1 mrg if (emitted_frame_related_regs[r] == 0)
2218 1.1 mrg emitted_frame_related_regs[r] = current_frame_info.r[r];
2219 1.1 mrg else
2220 1.1 mrg gcc_assert (emitted_frame_related_regs[r] == current_frame_info.r[r]);
2221 1.1 mrg }
2222 1.1 mrg
2223 1.1 mrg static int
2224 1.1 mrg get_reg (enum ia64_frame_regs r)
2225 1.1 mrg {
2226 1.1 mrg reg_emitted (r);
2227 1.1 mrg return current_frame_info.r[r];
2228 1.1 mrg }
2229 1.1 mrg
2230 1.1 mrg static bool
2231 1.1 mrg is_emitted (int regno)
2232 1.1 mrg {
2233 1.1 mrg unsigned int r;
2234 1.1 mrg
2235 1.1 mrg for (r = reg_fp; r < number_of_ia64_frame_regs; r++)
2236 1.1 mrg if (emitted_frame_related_regs[r] == regno)
2237 1.1 mrg return true;
2238 1.1 mrg return false;
2239 1.1 mrg }
2240 1.1 mrg
2241 1.1 mrg void
2242 1.1 mrg ia64_reload_gp (void)
2243 1.1 mrg {
2244 1.1 mrg rtx tmp;
2245 1.1 mrg
2246 1.1 mrg if (current_frame_info.r[reg_save_gp])
2247 1.1 mrg {
2248 1.1 mrg tmp = gen_rtx_REG (DImode, get_reg (reg_save_gp));
2249 1.1 mrg }
2250 1.1 mrg else
2251 1.1 mrg {
2252 1.1 mrg HOST_WIDE_INT offset;
2253 1.1 mrg rtx offset_r;
2254 1.1 mrg
2255 1.1 mrg offset = (current_frame_info.spill_cfa_off
2256 1.1 mrg + current_frame_info.spill_size);
2257 1.1 mrg if (frame_pointer_needed)
2258 1.1 mrg {
2259 1.1 mrg tmp = hard_frame_pointer_rtx;
2260 1.1 mrg offset = -offset;
2261 1.1 mrg }
2262 1.1 mrg else
2263 1.1 mrg {
2264 1.1 mrg tmp = stack_pointer_rtx;
2265 1.1 mrg offset = current_frame_info.total_size - offset;
2266 1.1 mrg }
2267 1.1 mrg
2268 1.1 mrg offset_r = GEN_INT (offset);
2269 1.1 mrg if (satisfies_constraint_I (offset_r))
2270 1.1 mrg emit_insn (gen_adddi3 (pic_offset_table_rtx, tmp, offset_r));
2271 1.1 mrg else
2272 1.1 mrg {
2273 1.1 mrg emit_move_insn (pic_offset_table_rtx, offset_r);
2274 1.1 mrg emit_insn (gen_adddi3 (pic_offset_table_rtx,
2275 1.1 mrg pic_offset_table_rtx, tmp));
2276 1.1 mrg }
2277 1.1 mrg
2278 1.1 mrg tmp = gen_rtx_MEM (DImode, pic_offset_table_rtx);
2279 1.1 mrg }
2280 1.1 mrg
2281 1.1 mrg emit_move_insn (pic_offset_table_rtx, tmp);
2282 1.1 mrg }
2283 1.1 mrg
2284 1.1 mrg void
2285 1.1 mrg ia64_split_call (rtx retval, rtx addr, rtx retaddr, rtx scratch_r,
2286 1.1 mrg rtx scratch_b, int noreturn_p, int sibcall_p)
2287 1.1 mrg {
2288 1.1 mrg rtx insn;
2289 1.1 mrg bool is_desc = false;
2290 1.1 mrg
2291 1.1 mrg /* If we find we're calling through a register, then we're actually
2292 1.1 mrg calling through a descriptor, so load up the values. */
2293 1.1 mrg if (REG_P (addr) && GR_REGNO_P (REGNO (addr)))
2294 1.1 mrg {
2295 1.1 mrg rtx tmp;
2296 1.1 mrg bool addr_dead_p;
2297 1.1 mrg
2298 1.1 mrg /* ??? We are currently constrained to *not* use peep2, because
2299 1.1 mrg we can legitimately change the global lifetime of the GP
2300 1.1 mrg (in the form of killing where previously live). This is
2301 1.1 mrg because a call through a descriptor doesn't use the previous
2302 1.1 mrg value of the GP, while a direct call does, and we do not
2303 1.1 mrg commit to either form until the split here.
2304 1.1 mrg
2305 1.1 mrg That said, this means that we lack precise life info for
2306 1.1 mrg whether ADDR is dead after this call. This is not terribly
2307 1.1 mrg important, since we can fix things up essentially for free
2308 1.1 mrg with the POST_DEC below, but it's nice to not use it when we
2309 1.1 mrg can immediately tell it's not necessary. */
2310 1.1 mrg addr_dead_p = ((noreturn_p || sibcall_p
2311 1.1 mrg || TEST_HARD_REG_BIT (regs_invalidated_by_call,
2312 1.1 mrg REGNO (addr)))
2313 1.1 mrg && !FUNCTION_ARG_REGNO_P (REGNO (addr)));
2314 1.1 mrg
2315 1.1 mrg /* Load the code address into scratch_b. */
2316 1.1 mrg tmp = gen_rtx_POST_INC (Pmode, addr);
2317 1.1 mrg tmp = gen_rtx_MEM (Pmode, tmp);
2318 1.1 mrg emit_move_insn (scratch_r, tmp);
2319 1.1 mrg emit_move_insn (scratch_b, scratch_r);
2320 1.1 mrg
2321 1.1 mrg /* Load the GP address. If ADDR is not dead here, then we must
2322 1.1 mrg revert the change made above via the POST_INCREMENT. */
2323 1.1 mrg if (!addr_dead_p)
2324 1.1 mrg tmp = gen_rtx_POST_DEC (Pmode, addr);
2325 1.1 mrg else
2326 1.1 mrg tmp = addr;
2327 1.1 mrg tmp = gen_rtx_MEM (Pmode, tmp);
2328 1.1 mrg emit_move_insn (pic_offset_table_rtx, tmp);
2329 1.1 mrg
2330 1.1 mrg is_desc = true;
2331 1.1 mrg addr = scratch_b;
2332 1.1 mrg }
2333 1.1 mrg
2334 1.1 mrg if (sibcall_p)
2335 1.1 mrg insn = gen_sibcall_nogp (addr);
2336 1.1 mrg else if (retval)
2337 1.1 mrg insn = gen_call_value_nogp (retval, addr, retaddr);
2338 1.1 mrg else
2339 1.1 mrg insn = gen_call_nogp (addr, retaddr);
2340 1.1 mrg emit_call_insn (insn);
2341 1.1 mrg
2342 1.1 mrg if ((!TARGET_CONST_GP || is_desc) && !noreturn_p && !sibcall_p)
2343 1.1 mrg ia64_reload_gp ();
2344 1.1 mrg }
2345 1.1 mrg
2346 1.1 mrg /* Expand an atomic operation. We want to perform MEM <CODE>= VAL atomically.
2347 1.1 mrg
2348 1.1 mrg This differs from the generic code in that we know about the zero-extending
2349 1.1 mrg properties of cmpxchg, and the zero-extending requirements of ar.ccv. We
2350 1.1 mrg also know that ld.acq+cmpxchg.rel equals a full barrier.
2351 1.1 mrg
2352 1.1 mrg The loop we want to generate looks like
2353 1.1 mrg
2354 1.1 mrg cmp_reg = mem;
2355 1.1 mrg label:
2356 1.1 mrg old_reg = cmp_reg;
2357 1.1 mrg new_reg = cmp_reg op val;
2358 1.1 mrg cmp_reg = compare-and-swap(mem, old_reg, new_reg)
2359 1.1 mrg if (cmp_reg != old_reg)
2360 1.1 mrg goto label;
2361 1.1 mrg
2362 1.1 mrg Note that we only do the plain load from memory once. Subsequent
2363 1.1 mrg iterations use the value loaded by the compare-and-swap pattern. */
2364 1.1 mrg
2365 1.1 mrg void
2366 1.1 mrg ia64_expand_atomic_op (enum rtx_code code, rtx mem, rtx val,
2367 1.1 mrg rtx old_dst, rtx new_dst, enum memmodel model)
2368 1.1 mrg {
2369 1.1 mrg machine_mode mode = GET_MODE (mem);
2370 1.1 mrg rtx old_reg, new_reg, cmp_reg, ar_ccv, label;
2371 1.1 mrg enum insn_code icode;
2372 1.1 mrg
2373 1.1 mrg /* Special case for using fetchadd. */
2374 1.1 mrg if ((mode == SImode || mode == DImode)
2375 1.1 mrg && (code == PLUS || code == MINUS)
2376 1.1 mrg && fetchadd_operand (val, mode))
2377 1.1 mrg {
2378 1.1 mrg if (code == MINUS)
2379 1.1 mrg val = GEN_INT (-INTVAL (val));
2380 1.1 mrg
2381 1.1 mrg if (!old_dst)
2382 1.1 mrg old_dst = gen_reg_rtx (mode);
2383 1.1 mrg
2384 1.1 mrg switch (model)
2385 1.1 mrg {
2386 1.1 mrg case MEMMODEL_ACQ_REL:
2387 1.1 mrg case MEMMODEL_SEQ_CST:
2388 1.1 mrg case MEMMODEL_SYNC_SEQ_CST:
2389 1.1 mrg emit_insn (gen_memory_barrier ());
2390 1.1 mrg /* FALLTHRU */
2391 1.1 mrg case MEMMODEL_RELAXED:
2392 1.1 mrg case MEMMODEL_ACQUIRE:
2393 1.1 mrg case MEMMODEL_SYNC_ACQUIRE:
2394 1.1 mrg case MEMMODEL_CONSUME:
2395 1.1 mrg if (mode == SImode)
2396 1.1 mrg icode = CODE_FOR_fetchadd_acq_si;
2397 1.1 mrg else
2398 1.1 mrg icode = CODE_FOR_fetchadd_acq_di;
2399 1.1 mrg break;
2400 1.1 mrg case MEMMODEL_RELEASE:
2401 1.1 mrg case MEMMODEL_SYNC_RELEASE:
2402 1.1 mrg if (mode == SImode)
2403 1.1 mrg icode = CODE_FOR_fetchadd_rel_si;
2404 1.1 mrg else
2405 1.1 mrg icode = CODE_FOR_fetchadd_rel_di;
2406 1.1 mrg break;
2407 1.1 mrg
2408 1.1 mrg default:
2409 1.1 mrg gcc_unreachable ();
2410 1.1 mrg }
2411 1.1 mrg
2412 1.1 mrg emit_insn (GEN_FCN (icode) (old_dst, mem, val));
2413 1.1 mrg
2414 1.1 mrg if (new_dst)
2415 1.1 mrg {
2416 1.1 mrg new_reg = expand_simple_binop (mode, PLUS, old_dst, val, new_dst,
2417 1.1 mrg true, OPTAB_WIDEN);
2418 1.1 mrg if (new_reg != new_dst)
2419 1.1 mrg emit_move_insn (new_dst, new_reg);
2420 1.1 mrg }
2421 1.1 mrg return;
2422 1.1 mrg }
2423 1.1 mrg
2424 1.1 mrg /* Because of the volatile mem read, we get an ld.acq, which is the
2425 1.1 mrg front half of the full barrier. The end half is the cmpxchg.rel.
2426 1.1 mrg For relaxed and release memory models, we don't need this. But we
2427 1.1 mrg also don't bother trying to prevent it either. */
2428 1.1 mrg gcc_assert (is_mm_relaxed (model) || is_mm_release (model)
2429 1.1 mrg || MEM_VOLATILE_P (mem));
2430 1.1 mrg
2431 1.1 mrg old_reg = gen_reg_rtx (DImode);
2432 1.1 mrg cmp_reg = gen_reg_rtx (DImode);
2433 1.1 mrg label = gen_label_rtx ();
2434 1.1 mrg
2435 1.1 mrg if (mode != DImode)
2436 1.1 mrg {
2437 1.1 mrg val = simplify_gen_subreg (DImode, val, mode, 0);
2438 1.1 mrg emit_insn (gen_extend_insn (cmp_reg, mem, DImode, mode, 1));
2439 1.1 mrg }
2440 1.1 mrg else
2441 1.1 mrg emit_move_insn (cmp_reg, mem);
2442 1.1 mrg
2443 1.1 mrg emit_label (label);
2444 1.1 mrg
2445 1.1 mrg ar_ccv = gen_rtx_REG (DImode, AR_CCV_REGNUM);
2446 1.1 mrg emit_move_insn (old_reg, cmp_reg);
2447 1.1 mrg emit_move_insn (ar_ccv, cmp_reg);
2448 1.1 mrg
2449 1.1 mrg if (old_dst)
2450 1.1 mrg emit_move_insn (old_dst, gen_lowpart (mode, cmp_reg));
2451 1.1 mrg
2452 1.1 mrg new_reg = cmp_reg;
2453 1.1 mrg if (code == NOT)
2454 1.1 mrg {
2455 1.1 mrg new_reg = expand_simple_binop (DImode, AND, new_reg, val, NULL_RTX,
2456 1.1 mrg true, OPTAB_DIRECT);
2457 1.1 mrg new_reg = expand_simple_unop (DImode, code, new_reg, NULL_RTX, true);
2458 1.1 mrg }
2459 1.1 mrg else
2460 1.1 mrg new_reg = expand_simple_binop (DImode, code, new_reg, val, NULL_RTX,
2461 1.1 mrg true, OPTAB_DIRECT);
2462 1.1 mrg
2463 1.1 mrg if (mode != DImode)
2464 1.1 mrg new_reg = gen_lowpart (mode, new_reg);
2465 1.1 mrg if (new_dst)
2466 1.1 mrg emit_move_insn (new_dst, new_reg);
2467 1.1 mrg
2468 1.1 mrg switch (model)
2469 1.1 mrg {
2470 1.1 mrg case MEMMODEL_RELAXED:
2471 1.1 mrg case MEMMODEL_ACQUIRE:
2472 1.1 mrg case MEMMODEL_SYNC_ACQUIRE:
2473 1.1 mrg case MEMMODEL_CONSUME:
2474 1.1 mrg switch (mode)
2475 1.1 mrg {
2476 1.1 mrg case E_QImode: icode = CODE_FOR_cmpxchg_acq_qi; break;
2477 1.1 mrg case E_HImode: icode = CODE_FOR_cmpxchg_acq_hi; break;
2478 1.1 mrg case E_SImode: icode = CODE_FOR_cmpxchg_acq_si; break;
2479 1.1 mrg case E_DImode: icode = CODE_FOR_cmpxchg_acq_di; break;
2480 1.1 mrg default:
2481 1.1 mrg gcc_unreachable ();
2482 1.1 mrg }
2483 1.1 mrg break;
2484 1.1 mrg
2485 1.1 mrg case MEMMODEL_RELEASE:
2486 1.1 mrg case MEMMODEL_SYNC_RELEASE:
2487 1.1 mrg case MEMMODEL_ACQ_REL:
2488 1.1 mrg case MEMMODEL_SEQ_CST:
2489 1.1 mrg case MEMMODEL_SYNC_SEQ_CST:
2490 1.1 mrg switch (mode)
2491 1.1 mrg {
2492 1.1 mrg case E_QImode: icode = CODE_FOR_cmpxchg_rel_qi; break;
2493 1.1 mrg case E_HImode: icode = CODE_FOR_cmpxchg_rel_hi; break;
2494 1.1 mrg case E_SImode: icode = CODE_FOR_cmpxchg_rel_si; break;
2495 1.1 mrg case E_DImode: icode = CODE_FOR_cmpxchg_rel_di; break;
2496 1.1 mrg default:
2497 1.1 mrg gcc_unreachable ();
2498 1.1 mrg }
2499 1.1 mrg break;
2500 1.1 mrg
2501 1.1 mrg default:
2502 1.1 mrg gcc_unreachable ();
2503 1.1 mrg }
2504 1.1 mrg
2505 1.1 mrg emit_insn (GEN_FCN (icode) (cmp_reg, mem, ar_ccv, new_reg));
2506 1.1 mrg
2507 1.1 mrg emit_cmp_and_jump_insns (cmp_reg, old_reg, NE, NULL, DImode, true, label);
2508 1.1 mrg }
2509 1.1 mrg
2510 1.1 mrg /* Begin the assembly file. */
2512 1.1 mrg
2513 1.1 mrg static void
2514 1.1 mrg ia64_file_start (void)
2515 1.1 mrg {
2516 1.1 mrg default_file_start ();
2517 1.1 mrg emit_safe_across_calls ();
2518 1.1 mrg }
2519 1.1 mrg
2520 1.1 mrg void
2521 1.1 mrg emit_safe_across_calls (void)
2522 1.1 mrg {
2523 1.1 mrg unsigned int rs, re;
2524 1.1 mrg int out_state;
2525 1.1 mrg
2526 1.1 mrg rs = 1;
2527 1.1 mrg out_state = 0;
2528 1.1 mrg while (1)
2529 1.1 mrg {
2530 1.1 mrg while (rs < 64 && call_used_or_fixed_reg_p (PR_REG (rs)))
2531 1.1 mrg rs++;
2532 1.1 mrg if (rs >= 64)
2533 1.1 mrg break;
2534 1.1 mrg for (re = rs + 1;
2535 1.1 mrg re < 64 && ! call_used_or_fixed_reg_p (PR_REG (re)); re++)
2536 1.1 mrg continue;
2537 1.1 mrg if (out_state == 0)
2538 1.1 mrg {
2539 1.1 mrg fputs ("\t.pred.safe_across_calls ", asm_out_file);
2540 1.1 mrg out_state = 1;
2541 1.1 mrg }
2542 1.1 mrg else
2543 1.1 mrg fputc (',', asm_out_file);
2544 1.1 mrg if (re == rs + 1)
2545 1.1 mrg fprintf (asm_out_file, "p%u", rs);
2546 1.1 mrg else
2547 1.1 mrg fprintf (asm_out_file, "p%u-p%u", rs, re - 1);
2548 1.1 mrg rs = re + 1;
2549 1.1 mrg }
2550 1.1 mrg if (out_state)
2551 1.1 mrg fputc ('\n', asm_out_file);
2552 1.1 mrg }
2553 1.1 mrg
2554 1.1 mrg /* Globalize a declaration. */
2555 1.1 mrg
2556 1.1 mrg static void
2557 1.1 mrg ia64_globalize_decl_name (FILE * stream, tree decl)
2558 1.1 mrg {
2559 1.1 mrg const char *name = XSTR (XEXP (DECL_RTL (decl), 0), 0);
2560 1.1 mrg tree version_attr = lookup_attribute ("version_id", DECL_ATTRIBUTES (decl));
2561 1.1 mrg if (version_attr)
2562 1.1 mrg {
2563 1.1 mrg tree v = TREE_VALUE (TREE_VALUE (version_attr));
2564 1.1 mrg const char *p = TREE_STRING_POINTER (v);
2565 1.1 mrg fprintf (stream, "\t.alias %s#, \"%s{%s}\"\n", name, name, p);
2566 1.1 mrg }
2567 1.1 mrg targetm.asm_out.globalize_label (stream, name);
2568 1.1 mrg if (TREE_CODE (decl) == FUNCTION_DECL)
2569 1.1 mrg ASM_OUTPUT_TYPE_DIRECTIVE (stream, name, "function");
2570 1.1 mrg }
2571 1.1 mrg
2572 1.1 mrg /* Helper function for ia64_compute_frame_size: find an appropriate general
2573 1.1 mrg register to spill some special register to. SPECIAL_SPILL_MASK contains
2574 1.1 mrg bits in GR0 to GR31 that have already been allocated by this routine.
2575 1.1 mrg TRY_LOCALS is true if we should attempt to locate a local regnum. */
2576 1.1 mrg
2577 1.1 mrg static int
2578 1.1 mrg find_gr_spill (enum ia64_frame_regs r, int try_locals)
2579 1.1 mrg {
2580 1.1 mrg int regno;
2581 1.1 mrg
2582 1.1 mrg if (emitted_frame_related_regs[r] != 0)
2583 1.1 mrg {
2584 1.1 mrg regno = emitted_frame_related_regs[r];
2585 1.1 mrg if (regno >= LOC_REG (0) && regno < LOC_REG (80 - frame_pointer_needed)
2586 1.1 mrg && current_frame_info.n_local_regs < regno - LOC_REG (0) + 1)
2587 1.1 mrg current_frame_info.n_local_regs = regno - LOC_REG (0) + 1;
2588 1.1 mrg else if (crtl->is_leaf
2589 1.1 mrg && regno >= GR_REG (1) && regno <= GR_REG (31))
2590 1.1 mrg current_frame_info.gr_used_mask |= 1 << regno;
2591 1.1 mrg
2592 1.1 mrg return regno;
2593 1.1 mrg }
2594 1.1 mrg
2595 1.1 mrg /* If this is a leaf function, first try an otherwise unused
2596 1.1 mrg call-clobbered register. */
2597 1.1 mrg if (crtl->is_leaf)
2598 1.1 mrg {
2599 1.1 mrg for (regno = GR_REG (1); regno <= GR_REG (31); regno++)
2600 1.1 mrg if (! df_regs_ever_live_p (regno)
2601 1.1 mrg && call_used_or_fixed_reg_p (regno)
2602 1.1 mrg && ! fixed_regs[regno]
2603 1.1 mrg && ! global_regs[regno]
2604 1.1 mrg && ((current_frame_info.gr_used_mask >> regno) & 1) == 0
2605 1.1 mrg && ! is_emitted (regno))
2606 1.1 mrg {
2607 1.1 mrg current_frame_info.gr_used_mask |= 1 << regno;
2608 1.1 mrg return regno;
2609 1.1 mrg }
2610 1.1 mrg }
2611 1.1 mrg
2612 1.1 mrg if (try_locals)
2613 1.1 mrg {
2614 1.1 mrg regno = current_frame_info.n_local_regs;
2615 1.1 mrg /* If there is a frame pointer, then we can't use loc79, because
2616 1.1 mrg that is HARD_FRAME_POINTER_REGNUM. In particular, see the
2617 1.1 mrg reg_name switching code in ia64_expand_prologue. */
2618 1.1 mrg while (regno < (80 - frame_pointer_needed))
2619 1.1 mrg if (! is_emitted (LOC_REG (regno++)))
2620 1.1 mrg {
2621 1.1 mrg current_frame_info.n_local_regs = regno;
2622 1.1 mrg return LOC_REG (regno - 1);
2623 1.1 mrg }
2624 1.1 mrg }
2625 1.1 mrg
2626 1.1 mrg /* Failed to find a general register to spill to. Must use stack. */
2627 1.1 mrg return 0;
2628 1.1 mrg }
2629 1.1 mrg
2630 1.1 mrg /* In order to make for nice schedules, we try to allocate every temporary
2631 1.1 mrg to a different register. We must of course stay away from call-saved,
2632 1.1 mrg fixed, and global registers. We must also stay away from registers
2633 1.1 mrg allocated in current_frame_info.gr_used_mask, since those include regs
2634 1.1 mrg used all through the prologue.
2635 1.1 mrg
2636 1.1 mrg Any register allocated here must be used immediately. The idea is to
2637 1.1 mrg aid scheduling, not to solve data flow problems. */
2638 1.1 mrg
2639 1.1 mrg static int last_scratch_gr_reg;
2640 1.1 mrg
2641 1.1 mrg static int
2642 1.1 mrg next_scratch_gr_reg (void)
2643 1.1 mrg {
2644 1.1 mrg int i, regno;
2645 1.1 mrg
2646 1.1 mrg for (i = 0; i < 32; ++i)
2647 1.1 mrg {
2648 1.1 mrg regno = (last_scratch_gr_reg + i + 1) & 31;
2649 1.1 mrg if (call_used_or_fixed_reg_p (regno)
2650 1.1 mrg && ! fixed_regs[regno]
2651 1.1 mrg && ! global_regs[regno]
2652 1.1 mrg && ((current_frame_info.gr_used_mask >> regno) & 1) == 0)
2653 1.1 mrg {
2654 1.1 mrg last_scratch_gr_reg = regno;
2655 1.1 mrg return regno;
2656 1.1 mrg }
2657 1.1 mrg }
2658 1.1 mrg
2659 1.1 mrg /* There must be _something_ available. */
2660 1.1 mrg gcc_unreachable ();
2661 1.1 mrg }
2662 1.1 mrg
2663 1.1 mrg /* Helper function for ia64_compute_frame_size, called through
2664 1.1 mrg diddle_return_value. Mark REG in current_frame_info.gr_used_mask. */
2665 1.1 mrg
2666 1.1 mrg static void
2667 1.1 mrg mark_reg_gr_used_mask (rtx reg, void *data ATTRIBUTE_UNUSED)
2668 1.1 mrg {
2669 1.1 mrg unsigned int regno = REGNO (reg);
2670 1.1 mrg if (regno < 32)
2671 1.1 mrg {
2672 1.1 mrg unsigned int i, n = REG_NREGS (reg);
2673 1.1 mrg for (i = 0; i < n; ++i)
2674 1.1 mrg current_frame_info.gr_used_mask |= 1 << (regno + i);
2675 1.1 mrg }
2676 1.1 mrg }
2677 1.1 mrg
2678 1.1 mrg
2679 1.1 mrg /* Returns the number of bytes offset between the frame pointer and the stack
2680 1.1 mrg pointer for the current function. SIZE is the number of bytes of space
2681 1.1 mrg needed for local variables. */
2682 1.1 mrg
2683 1.1 mrg static void
2684 1.1 mrg ia64_compute_frame_size (HOST_WIDE_INT size)
2685 1.1 mrg {
2686 1.1 mrg HOST_WIDE_INT total_size;
2687 1.1 mrg HOST_WIDE_INT spill_size = 0;
2688 1.1 mrg HOST_WIDE_INT extra_spill_size = 0;
2689 1.1 mrg HOST_WIDE_INT pretend_args_size;
2690 1.1 mrg HARD_REG_SET mask;
2691 1.1 mrg int n_spilled = 0;
2692 1.1 mrg int spilled_gr_p = 0;
2693 1.1 mrg int spilled_fr_p = 0;
2694 1.1 mrg unsigned int regno;
2695 1.1 mrg int min_regno;
2696 1.1 mrg int max_regno;
2697 1.1 mrg int i;
2698 1.1 mrg
2699 1.1 mrg if (current_frame_info.initialized)
2700 1.1 mrg return;
2701 1.1 mrg
2702 1.1 mrg memset (¤t_frame_info, 0, sizeof current_frame_info);
2703 1.1 mrg CLEAR_HARD_REG_SET (mask);
2704 1.1 mrg
2705 1.1 mrg /* Don't allocate scratches to the return register. */
2706 1.1 mrg diddle_return_value (mark_reg_gr_used_mask, NULL);
2707 1.1 mrg
2708 1.1 mrg /* Don't allocate scratches to the EH scratch registers. */
2709 1.1 mrg if (cfun->machine->ia64_eh_epilogue_sp)
2710 1.1 mrg mark_reg_gr_used_mask (cfun->machine->ia64_eh_epilogue_sp, NULL);
2711 1.1 mrg if (cfun->machine->ia64_eh_epilogue_bsp)
2712 1.1 mrg mark_reg_gr_used_mask (cfun->machine->ia64_eh_epilogue_bsp, NULL);
2713 1.1 mrg
2714 1.1 mrg /* Static stack checking uses r2 and r3. */
2715 1.1 mrg if (flag_stack_check == STATIC_BUILTIN_STACK_CHECK
2716 1.1 mrg || flag_stack_clash_protection)
2717 1.1 mrg current_frame_info.gr_used_mask |= 0xc;
2718 1.1 mrg
2719 1.1 mrg /* Find the size of the register stack frame. We have only 80 local
2720 1.1 mrg registers, because we reserve 8 for the inputs and 8 for the
2721 1.1 mrg outputs. */
2722 1.1 mrg
2723 1.1 mrg /* Skip HARD_FRAME_POINTER_REGNUM (loc79) when frame_pointer_needed,
2724 1.1 mrg since we'll be adjusting that down later. */
2725 1.1 mrg regno = LOC_REG (78) + ! frame_pointer_needed;
2726 1.1 mrg for (; regno >= LOC_REG (0); regno--)
2727 1.1 mrg if (df_regs_ever_live_p (regno) && !is_emitted (regno))
2728 1.1 mrg break;
2729 1.1 mrg current_frame_info.n_local_regs = regno - LOC_REG (0) + 1;
2730 1.1 mrg
2731 1.1 mrg /* For functions marked with the syscall_linkage attribute, we must mark
2732 1.1 mrg all eight input registers as in use, so that locals aren't visible to
2733 1.1 mrg the caller. */
2734 1.1 mrg
2735 1.1 mrg if (cfun->machine->n_varargs > 0
2736 1.1 mrg || lookup_attribute ("syscall_linkage",
2737 1.1 mrg TYPE_ATTRIBUTES (TREE_TYPE (current_function_decl))))
2738 1.1 mrg current_frame_info.n_input_regs = 8;
2739 1.1 mrg else
2740 1.1 mrg {
2741 1.1 mrg for (regno = IN_REG (7); regno >= IN_REG (0); regno--)
2742 1.1 mrg if (df_regs_ever_live_p (regno))
2743 1.1 mrg break;
2744 1.1 mrg current_frame_info.n_input_regs = regno - IN_REG (0) + 1;
2745 1.1 mrg }
2746 1.1 mrg
2747 1.1 mrg for (regno = OUT_REG (7); regno >= OUT_REG (0); regno--)
2748 1.1 mrg if (df_regs_ever_live_p (regno))
2749 1.1 mrg break;
2750 1.1 mrg i = regno - OUT_REG (0) + 1;
2751 1.1 mrg
2752 1.1 mrg #ifndef PROFILE_HOOK
2753 1.1 mrg /* When -p profiling, we need one output register for the mcount argument.
2754 1.1 mrg Likewise for -a profiling for the bb_init_func argument. For -ax
2755 1.1 mrg profiling, we need two output registers for the two bb_init_trace_func
2756 1.1 mrg arguments. */
2757 1.1 mrg if (crtl->profile)
2758 1.1 mrg i = MAX (i, 1);
2759 1.1 mrg #endif
2760 1.1 mrg current_frame_info.n_output_regs = i;
2761 1.1 mrg
2762 1.1 mrg /* ??? No rotating register support yet. */
2763 1.1 mrg current_frame_info.n_rotate_regs = 0;
2764 1.1 mrg
2765 1.1 mrg /* Discover which registers need spilling, and how much room that
2766 1.1 mrg will take. Begin with floating point and general registers,
2767 1.1 mrg which will always wind up on the stack. */
2768 1.1 mrg
2769 1.1 mrg for (regno = FR_REG (2); regno <= FR_REG (127); regno++)
2770 1.1 mrg if (df_regs_ever_live_p (regno) && ! call_used_or_fixed_reg_p (regno))
2771 1.1 mrg {
2772 1.1 mrg SET_HARD_REG_BIT (mask, regno);
2773 1.1 mrg spill_size += 16;
2774 1.1 mrg n_spilled += 1;
2775 1.1 mrg spilled_fr_p = 1;
2776 1.1 mrg }
2777 1.1 mrg
2778 1.1 mrg for (regno = GR_REG (1); regno <= GR_REG (31); regno++)
2779 1.1 mrg if (df_regs_ever_live_p (regno) && ! call_used_or_fixed_reg_p (regno))
2780 1.1 mrg {
2781 1.1 mrg SET_HARD_REG_BIT (mask, regno);
2782 1.1 mrg spill_size += 8;
2783 1.1 mrg n_spilled += 1;
2784 1.1 mrg spilled_gr_p = 1;
2785 1.1 mrg }
2786 1.1 mrg
2787 1.1 mrg for (regno = BR_REG (1); regno <= BR_REG (7); regno++)
2788 1.1 mrg if (df_regs_ever_live_p (regno) && ! call_used_or_fixed_reg_p (regno))
2789 1.1 mrg {
2790 1.1 mrg SET_HARD_REG_BIT (mask, regno);
2791 1.1 mrg spill_size += 8;
2792 1.1 mrg n_spilled += 1;
2793 1.1 mrg }
2794 1.1 mrg
2795 1.1 mrg /* Now come all special registers that might get saved in other
2796 1.1 mrg general registers. */
2797 1.1 mrg
2798 1.1 mrg if (frame_pointer_needed)
2799 1.1 mrg {
2800 1.1 mrg current_frame_info.r[reg_fp] = find_gr_spill (reg_fp, 1);
2801 1.1 mrg /* If we did not get a register, then we take LOC79. This is guaranteed
2802 1.1 mrg to be free, even if regs_ever_live is already set, because this is
2803 1.1 mrg HARD_FRAME_POINTER_REGNUM. This requires incrementing n_local_regs,
2804 1.1 mrg as we don't count loc79 above. */
2805 1.1 mrg if (current_frame_info.r[reg_fp] == 0)
2806 1.1 mrg {
2807 1.1 mrg current_frame_info.r[reg_fp] = LOC_REG (79);
2808 1.1 mrg current_frame_info.n_local_regs = LOC_REG (79) - LOC_REG (0) + 1;
2809 1.1 mrg }
2810 1.1 mrg }
2811 1.1 mrg
2812 1.1 mrg if (! crtl->is_leaf)
2813 1.1 mrg {
2814 1.1 mrg /* Emit a save of BR0 if we call other functions. Do this even
2815 1.1 mrg if this function doesn't return, as EH depends on this to be
2816 1.1 mrg able to unwind the stack. */
2817 1.1 mrg SET_HARD_REG_BIT (mask, BR_REG (0));
2818 1.1 mrg
2819 1.1 mrg current_frame_info.r[reg_save_b0] = find_gr_spill (reg_save_b0, 1);
2820 1.1 mrg if (current_frame_info.r[reg_save_b0] == 0)
2821 1.1 mrg {
2822 1.1 mrg extra_spill_size += 8;
2823 1.1 mrg n_spilled += 1;
2824 1.1 mrg }
2825 1.1 mrg
2826 1.1 mrg /* Similarly for ar.pfs. */
2827 1.1 mrg SET_HARD_REG_BIT (mask, AR_PFS_REGNUM);
2828 1.1 mrg current_frame_info.r[reg_save_ar_pfs] = find_gr_spill (reg_save_ar_pfs, 1);
2829 1.1 mrg if (current_frame_info.r[reg_save_ar_pfs] == 0)
2830 1.1 mrg {
2831 1.1 mrg extra_spill_size += 8;
2832 1.1 mrg n_spilled += 1;
2833 1.1 mrg }
2834 1.1 mrg
2835 1.1 mrg /* Similarly for gp. Note that if we're calling setjmp, the stacked
2836 1.1 mrg registers are clobbered, so we fall back to the stack. */
2837 1.1 mrg current_frame_info.r[reg_save_gp]
2838 1.1 mrg = (cfun->calls_setjmp ? 0 : find_gr_spill (reg_save_gp, 1));
2839 1.1 mrg if (current_frame_info.r[reg_save_gp] == 0)
2840 1.1 mrg {
2841 1.1 mrg SET_HARD_REG_BIT (mask, GR_REG (1));
2842 1.1 mrg spill_size += 8;
2843 1.1 mrg n_spilled += 1;
2844 1.1 mrg }
2845 1.1 mrg }
2846 1.1 mrg else
2847 1.1 mrg {
2848 1.1 mrg if (df_regs_ever_live_p (BR_REG (0))
2849 1.1 mrg && ! call_used_or_fixed_reg_p (BR_REG (0)))
2850 1.1 mrg {
2851 1.1 mrg SET_HARD_REG_BIT (mask, BR_REG (0));
2852 1.1 mrg extra_spill_size += 8;
2853 1.1 mrg n_spilled += 1;
2854 1.1 mrg }
2855 1.1 mrg
2856 1.1 mrg if (df_regs_ever_live_p (AR_PFS_REGNUM))
2857 1.1 mrg {
2858 1.1 mrg SET_HARD_REG_BIT (mask, AR_PFS_REGNUM);
2859 1.1 mrg current_frame_info.r[reg_save_ar_pfs]
2860 1.1 mrg = find_gr_spill (reg_save_ar_pfs, 1);
2861 1.1 mrg if (current_frame_info.r[reg_save_ar_pfs] == 0)
2862 1.1 mrg {
2863 1.1 mrg extra_spill_size += 8;
2864 1.1 mrg n_spilled += 1;
2865 1.1 mrg }
2866 1.1 mrg }
2867 1.1 mrg }
2868 1.1 mrg
2869 1.1 mrg /* Unwind descriptor hackery: things are most efficient if we allocate
2870 1.1 mrg consecutive GR save registers for RP, PFS, FP in that order. However,
2871 1.1 mrg it is absolutely critical that FP get the only hard register that's
2872 1.1 mrg guaranteed to be free, so we allocated it first. If all three did
2873 1.1 mrg happen to be allocated hard regs, and are consecutive, rearrange them
2874 1.1 mrg into the preferred order now.
2875 1.1 mrg
2876 1.1 mrg If we have already emitted code for any of those registers,
2877 1.1 mrg then it's already too late to change. */
2878 1.1 mrg min_regno = MIN (current_frame_info.r[reg_fp],
2879 1.1 mrg MIN (current_frame_info.r[reg_save_b0],
2880 1.1 mrg current_frame_info.r[reg_save_ar_pfs]));
2881 1.1 mrg max_regno = MAX (current_frame_info.r[reg_fp],
2882 1.1 mrg MAX (current_frame_info.r[reg_save_b0],
2883 1.1 mrg current_frame_info.r[reg_save_ar_pfs]));
2884 1.1 mrg if (min_regno > 0
2885 1.1 mrg && min_regno + 2 == max_regno
2886 1.1 mrg && (current_frame_info.r[reg_fp] == min_regno + 1
2887 1.1 mrg || current_frame_info.r[reg_save_b0] == min_regno + 1
2888 1.1 mrg || current_frame_info.r[reg_save_ar_pfs] == min_regno + 1)
2889 1.1 mrg && (emitted_frame_related_regs[reg_save_b0] == 0
2890 1.1 mrg || emitted_frame_related_regs[reg_save_b0] == min_regno)
2891 1.1 mrg && (emitted_frame_related_regs[reg_save_ar_pfs] == 0
2892 1.1 mrg || emitted_frame_related_regs[reg_save_ar_pfs] == min_regno + 1)
2893 1.1 mrg && (emitted_frame_related_regs[reg_fp] == 0
2894 1.1 mrg || emitted_frame_related_regs[reg_fp] == min_regno + 2))
2895 1.1 mrg {
2896 1.1 mrg current_frame_info.r[reg_save_b0] = min_regno;
2897 1.1 mrg current_frame_info.r[reg_save_ar_pfs] = min_regno + 1;
2898 1.1 mrg current_frame_info.r[reg_fp] = min_regno + 2;
2899 1.1 mrg }
2900 1.1 mrg
2901 1.1 mrg /* See if we need to store the predicate register block. */
2902 1.1 mrg for (regno = PR_REG (0); regno <= PR_REG (63); regno++)
2903 1.1 mrg if (df_regs_ever_live_p (regno) && ! call_used_or_fixed_reg_p (regno))
2904 1.1 mrg break;
2905 1.1 mrg if (regno <= PR_REG (63))
2906 1.1 mrg {
2907 1.1 mrg SET_HARD_REG_BIT (mask, PR_REG (0));
2908 1.1 mrg current_frame_info.r[reg_save_pr] = find_gr_spill (reg_save_pr, 1);
2909 1.1 mrg if (current_frame_info.r[reg_save_pr] == 0)
2910 1.1 mrg {
2911 1.1 mrg extra_spill_size += 8;
2912 1.1 mrg n_spilled += 1;
2913 1.1 mrg }
2914 1.1 mrg
2915 1.1 mrg /* ??? Mark them all as used so that register renaming and such
2916 1.1 mrg are free to use them. */
2917 1.1 mrg for (regno = PR_REG (0); regno <= PR_REG (63); regno++)
2918 1.1 mrg df_set_regs_ever_live (regno, true);
2919 1.1 mrg }
2920 1.1 mrg
2921 1.1 mrg /* If we're forced to use st8.spill, we're forced to save and restore
2922 1.1 mrg ar.unat as well. The check for existing liveness allows inline asm
2923 1.1 mrg to touch ar.unat. */
2924 1.1 mrg if (spilled_gr_p || cfun->machine->n_varargs
2925 1.1 mrg || df_regs_ever_live_p (AR_UNAT_REGNUM))
2926 1.1 mrg {
2927 1.1 mrg df_set_regs_ever_live (AR_UNAT_REGNUM, true);
2928 1.1 mrg SET_HARD_REG_BIT (mask, AR_UNAT_REGNUM);
2929 1.1 mrg current_frame_info.r[reg_save_ar_unat]
2930 1.1 mrg = find_gr_spill (reg_save_ar_unat, spill_size == 0);
2931 1.1 mrg if (current_frame_info.r[reg_save_ar_unat] == 0)
2932 1.1 mrg {
2933 1.1 mrg extra_spill_size += 8;
2934 1.1 mrg n_spilled += 1;
2935 1.1 mrg }
2936 1.1 mrg }
2937 1.1 mrg
2938 1.1 mrg if (df_regs_ever_live_p (AR_LC_REGNUM))
2939 1.1 mrg {
2940 1.1 mrg SET_HARD_REG_BIT (mask, AR_LC_REGNUM);
2941 1.1 mrg current_frame_info.r[reg_save_ar_lc]
2942 1.1 mrg = find_gr_spill (reg_save_ar_lc, spill_size == 0);
2943 1.1 mrg if (current_frame_info.r[reg_save_ar_lc] == 0)
2944 1.1 mrg {
2945 1.1 mrg extra_spill_size += 8;
2946 1.1 mrg n_spilled += 1;
2947 1.1 mrg }
2948 1.1 mrg }
2949 1.1 mrg
2950 1.1 mrg /* If we have an odd number of words of pretend arguments written to
2951 1.1 mrg the stack, then the FR save area will be unaligned. We round the
2952 1.1 mrg size of this area up to keep things 16 byte aligned. */
2953 1.1 mrg if (spilled_fr_p)
2954 1.1 mrg pretend_args_size = IA64_STACK_ALIGN (crtl->args.pretend_args_size);
2955 1.1 mrg else
2956 1.1 mrg pretend_args_size = crtl->args.pretend_args_size;
2957 1.1 mrg
2958 1.1 mrg total_size = (spill_size + extra_spill_size + size + pretend_args_size
2959 1.1 mrg + crtl->outgoing_args_size);
2960 1.1 mrg total_size = IA64_STACK_ALIGN (total_size);
2961 1.1 mrg
2962 1.1 mrg /* We always use the 16-byte scratch area provided by the caller, but
2963 1.1 mrg if we are a leaf function, there's no one to which we need to provide
2964 1.1 mrg a scratch area. However, if the function allocates dynamic stack space,
2965 1.1 mrg the dynamic offset is computed early and contains STACK_POINTER_OFFSET,
2966 1.1 mrg so we need to cope. */
2967 1.1 mrg if (crtl->is_leaf && !cfun->calls_alloca)
2968 1.1 mrg total_size = MAX (0, total_size - 16);
2969 1.1 mrg
2970 1.1 mrg current_frame_info.total_size = total_size;
2971 1.1 mrg current_frame_info.spill_cfa_off = pretend_args_size - 16;
2972 1.1 mrg current_frame_info.spill_size = spill_size;
2973 1.1 mrg current_frame_info.extra_spill_size = extra_spill_size;
2974 1.1 mrg current_frame_info.mask = mask;
2975 1.1 mrg current_frame_info.n_spilled = n_spilled;
2976 1.1 mrg current_frame_info.initialized = reload_completed;
2977 1.1 mrg }
2978 1.1 mrg
2979 1.1 mrg /* Worker function for TARGET_CAN_ELIMINATE. */
2980 1.1 mrg
2981 1.1 mrg bool
2982 1.1 mrg ia64_can_eliminate (const int from ATTRIBUTE_UNUSED, const int to)
2983 1.1 mrg {
2984 1.1 mrg return (to == BR_REG (0) ? crtl->is_leaf : true);
2985 1.1 mrg }
2986 1.1 mrg
2987 1.1 mrg /* Compute the initial difference between the specified pair of registers. */
2988 1.1 mrg
2989 1.1 mrg HOST_WIDE_INT
2990 1.1 mrg ia64_initial_elimination_offset (int from, int to)
2991 1.1 mrg {
2992 1.1 mrg HOST_WIDE_INT offset;
2993 1.1 mrg
2994 1.1 mrg ia64_compute_frame_size (get_frame_size ());
2995 1.1 mrg switch (from)
2996 1.1 mrg {
2997 1.1 mrg case FRAME_POINTER_REGNUM:
2998 1.1 mrg switch (to)
2999 1.1 mrg {
3000 1.1 mrg case HARD_FRAME_POINTER_REGNUM:
3001 1.1 mrg offset = -current_frame_info.total_size;
3002 1.1 mrg if (!crtl->is_leaf || cfun->calls_alloca)
3003 1.1 mrg offset += 16 + crtl->outgoing_args_size;
3004 1.1 mrg break;
3005 1.1 mrg
3006 1.1 mrg case STACK_POINTER_REGNUM:
3007 1.1 mrg offset = 0;
3008 1.1 mrg if (!crtl->is_leaf || cfun->calls_alloca)
3009 1.1 mrg offset += 16 + crtl->outgoing_args_size;
3010 1.1 mrg break;
3011 1.1 mrg
3012 1.1 mrg default:
3013 1.1 mrg gcc_unreachable ();
3014 1.1 mrg }
3015 1.1 mrg break;
3016 1.1 mrg
3017 1.1 mrg case ARG_POINTER_REGNUM:
3018 1.1 mrg /* Arguments start above the 16 byte save area, unless stdarg
3019 1.1 mrg in which case we store through the 16 byte save area. */
3020 1.1 mrg switch (to)
3021 1.1 mrg {
3022 1.1 mrg case HARD_FRAME_POINTER_REGNUM:
3023 1.1 mrg offset = 16 - crtl->args.pretend_args_size;
3024 1.1 mrg break;
3025 1.1 mrg
3026 1.1 mrg case STACK_POINTER_REGNUM:
3027 1.1 mrg offset = (current_frame_info.total_size
3028 1.1 mrg + 16 - crtl->args.pretend_args_size);
3029 1.1 mrg break;
3030 1.1 mrg
3031 1.1 mrg default:
3032 1.1 mrg gcc_unreachable ();
3033 1.1 mrg }
3034 1.1 mrg break;
3035 1.1 mrg
3036 1.1 mrg default:
3037 1.1 mrg gcc_unreachable ();
3038 1.1 mrg }
3039 1.1 mrg
3040 1.1 mrg return offset;
3041 1.1 mrg }
3042 1.1 mrg
3043 1.1 mrg /* If there are more than a trivial number of register spills, we use
3044 1.1 mrg two interleaved iterators so that we can get two memory references
3045 1.1 mrg per insn group.
3046 1.1 mrg
3047 1.1 mrg In order to simplify things in the prologue and epilogue expanders,
3048 1.1 mrg we use helper functions to fix up the memory references after the
3049 1.1 mrg fact with the appropriate offsets to a POST_MODIFY memory mode.
3050 1.1 mrg The following data structure tracks the state of the two iterators
3051 1.1 mrg while insns are being emitted. */
3052 1.1 mrg
3053 1.1 mrg struct spill_fill_data
3054 1.1 mrg {
3055 1.1 mrg rtx_insn *init_after; /* point at which to emit initializations */
3056 1.1 mrg rtx init_reg[2]; /* initial base register */
3057 1.1 mrg rtx iter_reg[2]; /* the iterator registers */
3058 1.1 mrg rtx *prev_addr[2]; /* address of last memory use */
3059 1.1 mrg rtx_insn *prev_insn[2]; /* the insn corresponding to prev_addr */
3060 1.1 mrg HOST_WIDE_INT prev_off[2]; /* last offset */
3061 1.1 mrg int n_iter; /* number of iterators in use */
3062 1.1 mrg int next_iter; /* next iterator to use */
3063 1.1 mrg unsigned int save_gr_used_mask;
3064 1.1 mrg };
3065 1.1 mrg
3066 1.1 mrg static struct spill_fill_data spill_fill_data;
3067 1.1 mrg
3068 1.1 mrg static void
3069 1.1 mrg setup_spill_pointers (int n_spills, rtx init_reg, HOST_WIDE_INT cfa_off)
3070 1.1 mrg {
3071 1.1 mrg int i;
3072 1.1 mrg
3073 1.1 mrg spill_fill_data.init_after = get_last_insn ();
3074 1.1 mrg spill_fill_data.init_reg[0] = init_reg;
3075 1.1 mrg spill_fill_data.init_reg[1] = init_reg;
3076 1.1 mrg spill_fill_data.prev_addr[0] = NULL;
3077 1.1 mrg spill_fill_data.prev_addr[1] = NULL;
3078 1.1 mrg spill_fill_data.prev_insn[0] = NULL;
3079 1.1 mrg spill_fill_data.prev_insn[1] = NULL;
3080 1.1 mrg spill_fill_data.prev_off[0] = cfa_off;
3081 1.1 mrg spill_fill_data.prev_off[1] = cfa_off;
3082 1.1 mrg spill_fill_data.next_iter = 0;
3083 1.1 mrg spill_fill_data.save_gr_used_mask = current_frame_info.gr_used_mask;
3084 1.1 mrg
3085 1.1 mrg spill_fill_data.n_iter = 1 + (n_spills > 2);
3086 1.1 mrg for (i = 0; i < spill_fill_data.n_iter; ++i)
3087 1.1 mrg {
3088 1.1 mrg int regno = next_scratch_gr_reg ();
3089 1.1 mrg spill_fill_data.iter_reg[i] = gen_rtx_REG (DImode, regno);
3090 1.1 mrg current_frame_info.gr_used_mask |= 1 << regno;
3091 1.1 mrg }
3092 1.1 mrg }
3093 1.1 mrg
3094 1.1 mrg static void
3095 1.1 mrg finish_spill_pointers (void)
3096 1.1 mrg {
3097 1.1 mrg current_frame_info.gr_used_mask = spill_fill_data.save_gr_used_mask;
3098 1.1 mrg }
3099 1.1 mrg
3100 1.1 mrg static rtx
3101 1.1 mrg spill_restore_mem (rtx reg, HOST_WIDE_INT cfa_off)
3102 1.1 mrg {
3103 1.1 mrg int iter = spill_fill_data.next_iter;
3104 1.1 mrg HOST_WIDE_INT disp = spill_fill_data.prev_off[iter] - cfa_off;
3105 1.1 mrg rtx disp_rtx = GEN_INT (disp);
3106 1.1 mrg rtx mem;
3107 1.1 mrg
3108 1.1 mrg if (spill_fill_data.prev_addr[iter])
3109 1.1 mrg {
3110 1.1 mrg if (satisfies_constraint_N (disp_rtx))
3111 1.1 mrg {
3112 1.1 mrg *spill_fill_data.prev_addr[iter]
3113 1.1 mrg = gen_rtx_POST_MODIFY (DImode, spill_fill_data.iter_reg[iter],
3114 1.1 mrg gen_rtx_PLUS (DImode,
3115 1.1 mrg spill_fill_data.iter_reg[iter],
3116 1.1 mrg disp_rtx));
3117 1.1 mrg add_reg_note (spill_fill_data.prev_insn[iter],
3118 1.1 mrg REG_INC, spill_fill_data.iter_reg[iter]);
3119 1.1 mrg }
3120 1.1 mrg else
3121 1.1 mrg {
3122 1.1 mrg /* ??? Could use register post_modify for loads. */
3123 1.1 mrg if (!satisfies_constraint_I (disp_rtx))
3124 1.1 mrg {
3125 1.1 mrg rtx tmp = gen_rtx_REG (DImode, next_scratch_gr_reg ());
3126 1.1 mrg emit_move_insn (tmp, disp_rtx);
3127 1.1 mrg disp_rtx = tmp;
3128 1.1 mrg }
3129 1.1 mrg emit_insn (gen_adddi3 (spill_fill_data.iter_reg[iter],
3130 1.1 mrg spill_fill_data.iter_reg[iter], disp_rtx));
3131 1.1 mrg }
3132 1.1 mrg }
3133 1.1 mrg /* Micro-optimization: if we've created a frame pointer, it's at
3134 1.1 mrg CFA 0, which may allow the real iterator to be initialized lower,
3135 1.1 mrg slightly increasing parallelism. Also, if there are few saves
3136 1.1 mrg it may eliminate the iterator entirely. */
3137 1.1 mrg else if (disp == 0
3138 1.1 mrg && spill_fill_data.init_reg[iter] == stack_pointer_rtx
3139 1.1 mrg && frame_pointer_needed)
3140 1.1 mrg {
3141 1.1 mrg mem = gen_rtx_MEM (GET_MODE (reg), hard_frame_pointer_rtx);
3142 1.1 mrg set_mem_alias_set (mem, get_varargs_alias_set ());
3143 1.1 mrg return mem;
3144 1.1 mrg }
3145 1.1 mrg else
3146 1.1 mrg {
3147 1.1 mrg rtx seq;
3148 1.1 mrg rtx_insn *insn;
3149 1.1 mrg
3150 1.1 mrg if (disp == 0)
3151 1.1 mrg seq = gen_movdi (spill_fill_data.iter_reg[iter],
3152 1.1 mrg spill_fill_data.init_reg[iter]);
3153 1.1 mrg else
3154 1.1 mrg {
3155 1.1 mrg start_sequence ();
3156 1.1 mrg
3157 1.1 mrg if (!satisfies_constraint_I (disp_rtx))
3158 1.1 mrg {
3159 1.1 mrg rtx tmp = gen_rtx_REG (DImode, next_scratch_gr_reg ());
3160 1.1 mrg emit_move_insn (tmp, disp_rtx);
3161 1.1 mrg disp_rtx = tmp;
3162 1.1 mrg }
3163 1.1 mrg
3164 1.1 mrg emit_insn (gen_adddi3 (spill_fill_data.iter_reg[iter],
3165 1.1 mrg spill_fill_data.init_reg[iter],
3166 1.1 mrg disp_rtx));
3167 1.1 mrg
3168 1.1 mrg seq = get_insns ();
3169 1.1 mrg end_sequence ();
3170 1.1 mrg }
3171 1.1 mrg
3172 1.1 mrg /* Careful for being the first insn in a sequence. */
3173 1.1 mrg if (spill_fill_data.init_after)
3174 1.1 mrg insn = emit_insn_after (seq, spill_fill_data.init_after);
3175 1.1 mrg else
3176 1.1 mrg {
3177 1.1 mrg rtx_insn *first = get_insns ();
3178 1.1 mrg if (first)
3179 1.1 mrg insn = emit_insn_before (seq, first);
3180 1.1 mrg else
3181 1.1 mrg insn = emit_insn (seq);
3182 1.1 mrg }
3183 1.1 mrg spill_fill_data.init_after = insn;
3184 1.1 mrg }
3185 1.1 mrg
3186 1.1 mrg mem = gen_rtx_MEM (GET_MODE (reg), spill_fill_data.iter_reg[iter]);
3187 1.1 mrg
3188 1.1 mrg /* ??? Not all of the spills are for varargs, but some of them are.
3189 1.1 mrg The rest of the spills belong in an alias set of their own. But
3190 1.1 mrg it doesn't actually hurt to include them here. */
3191 1.1 mrg set_mem_alias_set (mem, get_varargs_alias_set ());
3192 1.1 mrg
3193 1.1 mrg spill_fill_data.prev_addr[iter] = &XEXP (mem, 0);
3194 1.1 mrg spill_fill_data.prev_off[iter] = cfa_off;
3195 1.1 mrg
3196 1.1 mrg if (++iter >= spill_fill_data.n_iter)
3197 1.1 mrg iter = 0;
3198 1.1 mrg spill_fill_data.next_iter = iter;
3199 1.1 mrg
3200 1.1 mrg return mem;
3201 1.1 mrg }
3202 1.1 mrg
3203 1.1 mrg static void
3204 1.1 mrg do_spill (rtx (*move_fn) (rtx, rtx, rtx), rtx reg, HOST_WIDE_INT cfa_off,
3205 1.1 mrg rtx frame_reg)
3206 1.1 mrg {
3207 1.1 mrg int iter = spill_fill_data.next_iter;
3208 1.1 mrg rtx mem;
3209 1.1 mrg rtx_insn *insn;
3210 1.1 mrg
3211 1.1 mrg mem = spill_restore_mem (reg, cfa_off);
3212 1.1 mrg insn = emit_insn ((*move_fn) (mem, reg, GEN_INT (cfa_off)));
3213 1.1 mrg spill_fill_data.prev_insn[iter] = insn;
3214 1.1 mrg
3215 1.1 mrg if (frame_reg)
3216 1.1 mrg {
3217 1.1 mrg rtx base;
3218 1.1 mrg HOST_WIDE_INT off;
3219 1.1 mrg
3220 1.1 mrg RTX_FRAME_RELATED_P (insn) = 1;
3221 1.1 mrg
3222 1.1 mrg /* Don't even pretend that the unwind code can intuit its way
3223 1.1 mrg through a pair of interleaved post_modify iterators. Just
3224 1.1 mrg provide the correct answer. */
3225 1.1 mrg
3226 1.1 mrg if (frame_pointer_needed)
3227 1.1 mrg {
3228 1.1 mrg base = hard_frame_pointer_rtx;
3229 1.1 mrg off = - cfa_off;
3230 1.1 mrg }
3231 1.1 mrg else
3232 1.1 mrg {
3233 1.1 mrg base = stack_pointer_rtx;
3234 1.1 mrg off = current_frame_info.total_size - cfa_off;
3235 1.1 mrg }
3236 1.1 mrg
3237 1.1 mrg add_reg_note (insn, REG_CFA_OFFSET,
3238 1.1 mrg gen_rtx_SET (gen_rtx_MEM (GET_MODE (reg),
3239 1.1 mrg plus_constant (Pmode,
3240 1.1 mrg base, off)),
3241 1.1 mrg frame_reg));
3242 1.1 mrg }
3243 1.1 mrg }
3244 1.1 mrg
3245 1.1 mrg static void
3246 1.1 mrg do_restore (rtx (*move_fn) (rtx, rtx, rtx), rtx reg, HOST_WIDE_INT cfa_off)
3247 1.1 mrg {
3248 1.1 mrg int iter = spill_fill_data.next_iter;
3249 1.1 mrg rtx_insn *insn;
3250 1.1 mrg
3251 1.1 mrg insn = emit_insn ((*move_fn) (reg, spill_restore_mem (reg, cfa_off),
3252 1.1 mrg GEN_INT (cfa_off)));
3253 1.1 mrg spill_fill_data.prev_insn[iter] = insn;
3254 1.1 mrg }
3255 1.1 mrg
3256 1.1 mrg /* Wrapper functions that discards the CONST_INT spill offset. These
3257 1.1 mrg exist so that we can give gr_spill/gr_fill the offset they need and
3258 1.1 mrg use a consistent function interface. */
3259 1.1 mrg
3260 1.1 mrg static rtx
3261 1.1 mrg gen_movdi_x (rtx dest, rtx src, rtx offset ATTRIBUTE_UNUSED)
3262 1.1 mrg {
3263 1.1 mrg return gen_movdi (dest, src);
3264 1.1 mrg }
3265 1.1 mrg
3266 1.1 mrg static rtx
3267 1.1 mrg gen_fr_spill_x (rtx dest, rtx src, rtx offset ATTRIBUTE_UNUSED)
3268 1.1 mrg {
3269 1.1 mrg return gen_fr_spill (dest, src);
3270 1.1 mrg }
3271 1.1 mrg
3272 1.1 mrg static rtx
3273 1.1 mrg gen_fr_restore_x (rtx dest, rtx src, rtx offset ATTRIBUTE_UNUSED)
3274 1.1 mrg {
3275 1.1 mrg return gen_fr_restore (dest, src);
3276 1.1 mrg }
3277 1.1 mrg
3278 1.1 mrg #define PROBE_INTERVAL (1 << STACK_CHECK_PROBE_INTERVAL_EXP)
3279 1.1 mrg
3280 1.1 mrg /* See Table 6.2 of the IA-64 Software Developer Manual, Volume 2. */
3281 1.1 mrg #define BACKING_STORE_SIZE(N) ((N) > 0 ? ((N) + (N)/63 + 1) * 8 : 0)
3282 1.1 mrg
3283 1.1 mrg /* Emit code to probe a range of stack addresses from FIRST to FIRST+SIZE,
3284 1.1 mrg inclusive. These are offsets from the current stack pointer. BS_SIZE
3285 1.1 mrg is the size of the backing store. ??? This clobbers r2 and r3. */
3286 1.1 mrg
3287 1.1 mrg static void
3288 1.1 mrg ia64_emit_probe_stack_range (HOST_WIDE_INT first, HOST_WIDE_INT size,
3289 1.1 mrg int bs_size)
3290 1.1 mrg {
3291 1.1 mrg rtx r2 = gen_rtx_REG (Pmode, GR_REG (2));
3292 1.1 mrg rtx r3 = gen_rtx_REG (Pmode, GR_REG (3));
3293 1.1 mrg rtx p6 = gen_rtx_REG (BImode, PR_REG (6));
3294 1.1 mrg
3295 1.1 mrg /* On the IA-64 there is a second stack in memory, namely the Backing Store
3296 1.1 mrg of the Register Stack Engine. We also need to probe it after checking
3297 1.1 mrg that the 2 stacks don't overlap. */
3298 1.1 mrg emit_insn (gen_bsp_value (r3));
3299 1.1 mrg emit_move_insn (r2, GEN_INT (-(first + size)));
3300 1.1 mrg
3301 1.1 mrg /* Compare current value of BSP and SP registers. */
3302 1.1 mrg emit_insn (gen_rtx_SET (p6, gen_rtx_fmt_ee (LTU, BImode,
3303 1.1 mrg r3, stack_pointer_rtx)));
3304 1.1 mrg
3305 1.1 mrg /* Compute the address of the probe for the Backing Store (which grows
3306 1.1 mrg towards higher addresses). We probe only at the first offset of
3307 1.1 mrg the next page because some OS (eg Linux/ia64) only extend the
3308 1.1 mrg backing store when this specific address is hit (but generate a SEGV
3309 1.1 mrg on other address). Page size is the worst case (4KB). The reserve
3310 1.1 mrg size is at least 4096 - (96 + 2) * 8 = 3312 bytes, which is enough.
3311 1.1 mrg Also compute the address of the last probe for the memory stack
3312 1.1 mrg (which grows towards lower addresses). */
3313 1.1 mrg emit_insn (gen_rtx_SET (r3, plus_constant (Pmode, r3, 4095)));
3314 1.1 mrg emit_insn (gen_rtx_SET (r2, gen_rtx_PLUS (Pmode, stack_pointer_rtx, r2)));
3315 1.1 mrg
3316 1.1 mrg /* Compare them and raise SEGV if the former has topped the latter. */
3317 1.1 mrg emit_insn (gen_rtx_COND_EXEC (VOIDmode,
3318 1.1 mrg gen_rtx_fmt_ee (NE, VOIDmode, p6, const0_rtx),
3319 1.1 mrg gen_rtx_SET (p6, gen_rtx_fmt_ee (GEU, BImode,
3320 1.1 mrg r3, r2))));
3321 1.1 mrg emit_insn (gen_rtx_SET (gen_rtx_ZERO_EXTRACT (DImode, r3, GEN_INT (12),
3322 1.1 mrg const0_rtx),
3323 1.1 mrg const0_rtx));
3324 1.1 mrg emit_insn (gen_rtx_COND_EXEC (VOIDmode,
3325 1.1 mrg gen_rtx_fmt_ee (NE, VOIDmode, p6, const0_rtx),
3326 1.1 mrg gen_rtx_TRAP_IF (VOIDmode, const1_rtx,
3327 1.1 mrg GEN_INT (11))));
3328 1.1 mrg
3329 1.1 mrg /* Probe the Backing Store if necessary. */
3330 1.1 mrg if (bs_size > 0)
3331 1.1 mrg emit_stack_probe (r3);
3332 1.1 mrg
3333 1.1 mrg /* Probe the memory stack if necessary. */
3334 1.1 mrg if (size == 0)
3335 1.1 mrg ;
3336 1.1 mrg
3337 1.1 mrg /* See if we have a constant small number of probes to generate. If so,
3338 1.1 mrg that's the easy case. */
3339 1.1 mrg else if (size <= PROBE_INTERVAL)
3340 1.1 mrg emit_stack_probe (r2);
3341 1.1 mrg
3342 1.1 mrg /* The run-time loop is made up of 9 insns in the generic case while this
3343 1.1 mrg compile-time loop is made up of 5+2*(n-2) insns for n # of intervals. */
3344 1.1 mrg else if (size <= 4 * PROBE_INTERVAL)
3345 1.1 mrg {
3346 1.1 mrg HOST_WIDE_INT i;
3347 1.1 mrg
3348 1.1 mrg emit_move_insn (r2, GEN_INT (-(first + PROBE_INTERVAL)));
3349 1.1 mrg emit_insn (gen_rtx_SET (r2,
3350 1.1 mrg gen_rtx_PLUS (Pmode, stack_pointer_rtx, r2)));
3351 1.1 mrg emit_stack_probe (r2);
3352 1.1 mrg
3353 1.1 mrg /* Probe at FIRST + N * PROBE_INTERVAL for values of N from 2 until
3354 1.1 mrg it exceeds SIZE. If only two probes are needed, this will not
3355 1.1 mrg generate any code. Then probe at FIRST + SIZE. */
3356 1.1 mrg for (i = 2 * PROBE_INTERVAL; i < size; i += PROBE_INTERVAL)
3357 1.1 mrg {
3358 1.1 mrg emit_insn (gen_rtx_SET (r2,
3359 1.1 mrg plus_constant (Pmode, r2, -PROBE_INTERVAL)));
3360 1.1 mrg emit_stack_probe (r2);
3361 1.1 mrg }
3362 1.1 mrg
3363 1.1 mrg emit_insn (gen_rtx_SET (r2,
3364 1.1 mrg plus_constant (Pmode, r2,
3365 1.1 mrg (i - PROBE_INTERVAL) - size)));
3366 1.1 mrg emit_stack_probe (r2);
3367 1.1 mrg }
3368 1.1 mrg
3369 1.1 mrg /* Otherwise, do the same as above, but in a loop. Note that we must be
3370 1.1 mrg extra careful with variables wrapping around because we might be at
3371 1.1 mrg the very top (or the very bottom) of the address space and we have
3372 1.1 mrg to be able to handle this case properly; in particular, we use an
3373 1.1 mrg equality test for the loop condition. */
3374 1.1 mrg else
3375 1.1 mrg {
3376 1.1 mrg HOST_WIDE_INT rounded_size;
3377 1.1 mrg
3378 1.1 mrg emit_move_insn (r2, GEN_INT (-first));
3379 1.1 mrg
3380 1.1 mrg
3381 1.1 mrg /* Step 1: round SIZE to the previous multiple of the interval. */
3382 1.1 mrg
3383 1.1 mrg rounded_size = size & -PROBE_INTERVAL;
3384 1.1 mrg
3385 1.1 mrg
3386 1.1 mrg /* Step 2: compute initial and final value of the loop counter. */
3387 1.1 mrg
3388 1.1 mrg /* TEST_ADDR = SP + FIRST. */
3389 1.1 mrg emit_insn (gen_rtx_SET (r2,
3390 1.1 mrg gen_rtx_PLUS (Pmode, stack_pointer_rtx, r2)));
3391 1.1 mrg
3392 1.1 mrg /* LAST_ADDR = SP + FIRST + ROUNDED_SIZE. */
3393 1.1 mrg if (rounded_size > (1 << 21))
3394 1.1 mrg {
3395 1.1 mrg emit_move_insn (r3, GEN_INT (-rounded_size));
3396 1.1 mrg emit_insn (gen_rtx_SET (r3, gen_rtx_PLUS (Pmode, r2, r3)));
3397 1.1 mrg }
3398 1.1 mrg else
3399 1.1 mrg emit_insn (gen_rtx_SET (r3, gen_rtx_PLUS (Pmode, r2,
3400 1.1 mrg GEN_INT (-rounded_size))));
3401 1.1 mrg
3402 1.1 mrg
3403 1.1 mrg /* Step 3: the loop
3404 1.1 mrg
3405 1.1 mrg do
3406 1.1 mrg {
3407 1.1 mrg TEST_ADDR = TEST_ADDR + PROBE_INTERVAL
3408 1.1 mrg probe at TEST_ADDR
3409 1.1 mrg }
3410 1.1 mrg while (TEST_ADDR != LAST_ADDR)
3411 1.1 mrg
3412 1.1 mrg probes at FIRST + N * PROBE_INTERVAL for values of N from 1
3413 1.1 mrg until it is equal to ROUNDED_SIZE. */
3414 1.1 mrg
3415 1.1 mrg emit_insn (gen_probe_stack_range (r2, r2, r3));
3416 1.1 mrg
3417 1.1 mrg
3418 1.1 mrg /* Step 4: probe at FIRST + SIZE if we cannot assert at compile-time
3419 1.1 mrg that SIZE is equal to ROUNDED_SIZE. */
3420 1.1 mrg
3421 1.1 mrg /* TEMP = SIZE - ROUNDED_SIZE. */
3422 1.1 mrg if (size != rounded_size)
3423 1.1 mrg {
3424 1.1 mrg emit_insn (gen_rtx_SET (r2, plus_constant (Pmode, r2,
3425 1.1 mrg rounded_size - size)));
3426 1.1 mrg emit_stack_probe (r2);
3427 1.1 mrg }
3428 1.1 mrg }
3429 1.1 mrg
3430 1.1 mrg /* Make sure nothing is scheduled before we are done. */
3431 1.1 mrg emit_insn (gen_blockage ());
3432 1.1 mrg }
3433 1.1 mrg
3434 1.1 mrg /* Probe a range of stack addresses from REG1 to REG2 inclusive. These are
3435 1.1 mrg absolute addresses. */
3436 1.1 mrg
3437 1.1 mrg const char *
3438 1.1 mrg output_probe_stack_range (rtx reg1, rtx reg2)
3439 1.1 mrg {
3440 1.1 mrg static int labelno = 0;
3441 1.1 mrg char loop_lab[32];
3442 1.1 mrg rtx xops[3];
3443 1.1 mrg
3444 1.1 mrg ASM_GENERATE_INTERNAL_LABEL (loop_lab, "LPSRL", labelno++);
3445 1.1 mrg
3446 1.1 mrg /* Loop. */
3447 1.1 mrg ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, loop_lab);
3448 1.1 mrg
3449 1.1 mrg /* TEST_ADDR = TEST_ADDR + PROBE_INTERVAL. */
3450 1.1 mrg xops[0] = reg1;
3451 1.1 mrg xops[1] = GEN_INT (-PROBE_INTERVAL);
3452 1.1 mrg output_asm_insn ("addl %0 = %1, %0", xops);
3453 1.1 mrg fputs ("\t;;\n", asm_out_file);
3454 1.1 mrg
3455 1.1 mrg /* Probe at TEST_ADDR. */
3456 1.1 mrg output_asm_insn ("probe.w.fault %0, 0", xops);
3457 1.1 mrg
3458 1.1 mrg /* Test if TEST_ADDR == LAST_ADDR. */
3459 1.1 mrg xops[1] = reg2;
3460 1.1 mrg xops[2] = gen_rtx_REG (BImode, PR_REG (6));
3461 1.1 mrg output_asm_insn ("cmp.eq %2, %I2 = %0, %1", xops);
3462 1.1 mrg
3463 1.1 mrg /* Branch. */
3464 1.1 mrg fprintf (asm_out_file, "\t(%s) br.cond.dpnt ", reg_names [PR_REG (7)]);
3465 1.1 mrg assemble_name_raw (asm_out_file, loop_lab);
3466 1.1 mrg fputc ('\n', asm_out_file);
3467 1.1 mrg
3468 1.1 mrg return "";
3469 1.1 mrg }
3470 1.1 mrg
3471 1.1 mrg /* Called after register allocation to add any instructions needed for the
3472 1.1 mrg prologue. Using a prologue insn is favored compared to putting all of the
3473 1.1 mrg instructions in output_function_prologue(), since it allows the scheduler
3474 1.1 mrg to intermix instructions with the saves of the caller saved registers. In
3475 1.1 mrg some cases, it might be necessary to emit a barrier instruction as the last
3476 1.1 mrg insn to prevent such scheduling.
3477 1.1 mrg
3478 1.1 mrg Also any insns generated here should have RTX_FRAME_RELATED_P(insn) = 1
3479 1.1 mrg so that the debug info generation code can handle them properly.
3480 1.1 mrg
3481 1.1 mrg The register save area is laid out like so:
3482 1.1 mrg cfa+16
3483 1.1 mrg [ varargs spill area ]
3484 1.1 mrg [ fr register spill area ]
3485 1.1 mrg [ br register spill area ]
3486 1.1 mrg [ ar register spill area ]
3487 1.1 mrg [ pr register spill area ]
3488 1.1 mrg [ gr register spill area ] */
3489 1.1 mrg
3490 1.1 mrg /* ??? Get inefficient code when the frame size is larger than can fit in an
3491 1.1 mrg adds instruction. */
3492 1.1 mrg
3493 1.1 mrg void
3494 1.1 mrg ia64_expand_prologue (void)
3495 1.1 mrg {
3496 1.1 mrg rtx_insn *insn;
3497 1.1 mrg rtx ar_pfs_save_reg, ar_unat_save_reg;
3498 1.1 mrg int i, epilogue_p, regno, alt_regno, cfa_off, n_varargs;
3499 1.1 mrg rtx reg, alt_reg;
3500 1.1 mrg
3501 1.1 mrg ia64_compute_frame_size (get_frame_size ());
3502 1.1 mrg last_scratch_gr_reg = 15;
3503 1.1 mrg
3504 1.1 mrg if (flag_stack_usage_info)
3505 1.1 mrg current_function_static_stack_size = current_frame_info.total_size;
3506 1.1 mrg
3507 1.1 mrg if (flag_stack_check == STATIC_BUILTIN_STACK_CHECK
3508 1.1 mrg || flag_stack_clash_protection)
3509 1.1 mrg {
3510 1.1 mrg HOST_WIDE_INT size = current_frame_info.total_size;
3511 1.1 mrg int bs_size = BACKING_STORE_SIZE (current_frame_info.n_input_regs
3512 1.1 mrg + current_frame_info.n_local_regs);
3513 1.1 mrg
3514 1.1 mrg if (crtl->is_leaf && !cfun->calls_alloca)
3515 1.1 mrg {
3516 1.1 mrg if (size > PROBE_INTERVAL && size > get_stack_check_protect ())
3517 1.1 mrg ia64_emit_probe_stack_range (get_stack_check_protect (),
3518 1.1 mrg size - get_stack_check_protect (),
3519 1.1 mrg bs_size);
3520 1.1 mrg else if (size + bs_size > get_stack_check_protect ())
3521 1.1 mrg ia64_emit_probe_stack_range (get_stack_check_protect (),
3522 1.1 mrg 0, bs_size);
3523 1.1 mrg }
3524 1.1 mrg else if (size + bs_size > 0)
3525 1.1 mrg ia64_emit_probe_stack_range (get_stack_check_protect (), size, bs_size);
3526 1.1 mrg }
3527 1.1 mrg
3528 1.1 mrg if (dump_file)
3529 1.1 mrg {
3530 1.1 mrg fprintf (dump_file, "ia64 frame related registers "
3531 1.1 mrg "recorded in current_frame_info.r[]:\n");
3532 1.1 mrg #define PRINTREG(a) if (current_frame_info.r[a]) \
3533 1.1 mrg fprintf(dump_file, "%s = %d\n", #a, current_frame_info.r[a])
3534 1.1 mrg PRINTREG(reg_fp);
3535 1.1 mrg PRINTREG(reg_save_b0);
3536 1.1 mrg PRINTREG(reg_save_pr);
3537 1.1 mrg PRINTREG(reg_save_ar_pfs);
3538 1.1 mrg PRINTREG(reg_save_ar_unat);
3539 1.1 mrg PRINTREG(reg_save_ar_lc);
3540 1.1 mrg PRINTREG(reg_save_gp);
3541 1.1 mrg #undef PRINTREG
3542 1.1 mrg }
3543 1.1 mrg
3544 1.1 mrg /* If there is no epilogue, then we don't need some prologue insns.
3545 1.1 mrg We need to avoid emitting the dead prologue insns, because flow
3546 1.1 mrg will complain about them. */
3547 1.1 mrg if (optimize)
3548 1.1 mrg {
3549 1.1 mrg edge e;
3550 1.1 mrg edge_iterator ei;
3551 1.1 mrg
3552 1.1 mrg FOR_EACH_EDGE (e, ei, EXIT_BLOCK_PTR_FOR_FN (cfun)->preds)
3553 1.1 mrg if ((e->flags & EDGE_FAKE) == 0
3554 1.1 mrg && (e->flags & EDGE_FALLTHRU) != 0)
3555 1.1 mrg break;
3556 1.1 mrg epilogue_p = (e != NULL);
3557 1.1 mrg }
3558 1.1 mrg else
3559 1.1 mrg epilogue_p = 1;
3560 1.1 mrg
3561 1.1 mrg /* Set the local, input, and output register names. We need to do this
3562 1.1 mrg for GNU libc, which creates crti.S/crtn.S by splitting initfini.c in
3563 1.1 mrg half. If we use in/loc/out register names, then we get assembler errors
3564 1.1 mrg in crtn.S because there is no alloc insn or regstk directive in there. */
3565 1.1 mrg if (! TARGET_REG_NAMES)
3566 1.1 mrg {
3567 1.1 mrg int inputs = current_frame_info.n_input_regs;
3568 1.1 mrg int locals = current_frame_info.n_local_regs;
3569 1.1 mrg int outputs = current_frame_info.n_output_regs;
3570 1.1 mrg
3571 1.1 mrg for (i = 0; i < inputs; i++)
3572 1.1 mrg reg_names[IN_REG (i)] = ia64_reg_numbers[i];
3573 1.1 mrg for (i = 0; i < locals; i++)
3574 1.1 mrg reg_names[LOC_REG (i)] = ia64_reg_numbers[inputs + i];
3575 1.1 mrg for (i = 0; i < outputs; i++)
3576 1.1 mrg reg_names[OUT_REG (i)] = ia64_reg_numbers[inputs + locals + i];
3577 1.1 mrg }
3578 1.1 mrg
3579 1.1 mrg /* Set the frame pointer register name. The regnum is logically loc79,
3580 1.1 mrg but of course we'll not have allocated that many locals. Rather than
3581 1.1 mrg worrying about renumbering the existing rtxs, we adjust the name. */
3582 1.1 mrg /* ??? This code means that we can never use one local register when
3583 1.1 mrg there is a frame pointer. loc79 gets wasted in this case, as it is
3584 1.1 mrg renamed to a register that will never be used. See also the try_locals
3585 1.1 mrg code in find_gr_spill. */
3586 1.1 mrg if (current_frame_info.r[reg_fp])
3587 1.1 mrg {
3588 1.1 mrg const char *tmp = reg_names[HARD_FRAME_POINTER_REGNUM];
3589 1.1 mrg reg_names[HARD_FRAME_POINTER_REGNUM]
3590 1.1 mrg = reg_names[current_frame_info.r[reg_fp]];
3591 1.1 mrg reg_names[current_frame_info.r[reg_fp]] = tmp;
3592 1.1 mrg }
3593 1.1 mrg
3594 1.1 mrg /* We don't need an alloc instruction if we've used no outputs or locals. */
3595 1.1 mrg if (current_frame_info.n_local_regs == 0
3596 1.1 mrg && current_frame_info.n_output_regs == 0
3597 1.1 mrg && current_frame_info.n_input_regs <= crtl->args.info.int_regs
3598 1.1 mrg && !TEST_HARD_REG_BIT (current_frame_info.mask, AR_PFS_REGNUM))
3599 1.1 mrg {
3600 1.1 mrg /* If there is no alloc, but there are input registers used, then we
3601 1.1 mrg need a .regstk directive. */
3602 1.1 mrg current_frame_info.need_regstk = (TARGET_REG_NAMES != 0);
3603 1.1 mrg ar_pfs_save_reg = NULL_RTX;
3604 1.1 mrg }
3605 1.1 mrg else
3606 1.1 mrg {
3607 1.1 mrg current_frame_info.need_regstk = 0;
3608 1.1 mrg
3609 1.1 mrg if (current_frame_info.r[reg_save_ar_pfs])
3610 1.1 mrg {
3611 1.1 mrg regno = current_frame_info.r[reg_save_ar_pfs];
3612 1.1 mrg reg_emitted (reg_save_ar_pfs);
3613 1.1 mrg }
3614 1.1 mrg else
3615 1.1 mrg regno = next_scratch_gr_reg ();
3616 1.1 mrg ar_pfs_save_reg = gen_rtx_REG (DImode, regno);
3617 1.1 mrg
3618 1.1 mrg insn = emit_insn (gen_alloc (ar_pfs_save_reg,
3619 1.1 mrg GEN_INT (current_frame_info.n_input_regs),
3620 1.1 mrg GEN_INT (current_frame_info.n_local_regs),
3621 1.1 mrg GEN_INT (current_frame_info.n_output_regs),
3622 1.1 mrg GEN_INT (current_frame_info.n_rotate_regs)));
3623 1.1 mrg if (current_frame_info.r[reg_save_ar_pfs])
3624 1.1 mrg {
3625 1.1 mrg RTX_FRAME_RELATED_P (insn) = 1;
3626 1.1 mrg add_reg_note (insn, REG_CFA_REGISTER,
3627 1.1 mrg gen_rtx_SET (ar_pfs_save_reg,
3628 1.1 mrg gen_rtx_REG (DImode, AR_PFS_REGNUM)));
3629 1.1 mrg }
3630 1.1 mrg }
3631 1.1 mrg
3632 1.1 mrg /* Set up frame pointer, stack pointer, and spill iterators. */
3633 1.1 mrg
3634 1.1 mrg n_varargs = cfun->machine->n_varargs;
3635 1.1 mrg setup_spill_pointers (current_frame_info.n_spilled + n_varargs,
3636 1.1 mrg stack_pointer_rtx, 0);
3637 1.1 mrg
3638 1.1 mrg if (frame_pointer_needed)
3639 1.1 mrg {
3640 1.1 mrg insn = emit_move_insn (hard_frame_pointer_rtx, stack_pointer_rtx);
3641 1.1 mrg RTX_FRAME_RELATED_P (insn) = 1;
3642 1.1 mrg
3643 1.1 mrg /* Force the unwind info to recognize this as defining a new CFA,
3644 1.1 mrg rather than some temp register setup. */
3645 1.1 mrg add_reg_note (insn, REG_CFA_ADJUST_CFA, NULL_RTX);
3646 1.1 mrg }
3647 1.1 mrg
3648 1.1 mrg if (current_frame_info.total_size != 0)
3649 1.1 mrg {
3650 1.1 mrg rtx frame_size_rtx = GEN_INT (- current_frame_info.total_size);
3651 1.1 mrg rtx offset;
3652 1.1 mrg
3653 1.1 mrg if (satisfies_constraint_I (frame_size_rtx))
3654 1.1 mrg offset = frame_size_rtx;
3655 1.1 mrg else
3656 1.1 mrg {
3657 1.1 mrg regno = next_scratch_gr_reg ();
3658 1.1 mrg offset = gen_rtx_REG (DImode, regno);
3659 1.1 mrg emit_move_insn (offset, frame_size_rtx);
3660 1.1 mrg }
3661 1.1 mrg
3662 1.1 mrg insn = emit_insn (gen_adddi3 (stack_pointer_rtx,
3663 1.1 mrg stack_pointer_rtx, offset));
3664 1.1 mrg
3665 1.1 mrg if (! frame_pointer_needed)
3666 1.1 mrg {
3667 1.1 mrg RTX_FRAME_RELATED_P (insn) = 1;
3668 1.1 mrg add_reg_note (insn, REG_CFA_ADJUST_CFA,
3669 1.1 mrg gen_rtx_SET (stack_pointer_rtx,
3670 1.1 mrg gen_rtx_PLUS (DImode,
3671 1.1 mrg stack_pointer_rtx,
3672 1.1 mrg frame_size_rtx)));
3673 1.1 mrg }
3674 1.1 mrg
3675 1.1 mrg /* ??? At this point we must generate a magic insn that appears to
3676 1.1 mrg modify the stack pointer, the frame pointer, and all spill
3677 1.1 mrg iterators. This would allow the most scheduling freedom. For
3678 1.1 mrg now, just hard stop. */
3679 1.1 mrg emit_insn (gen_blockage ());
3680 1.1 mrg }
3681 1.1 mrg
3682 1.1 mrg /* Must copy out ar.unat before doing any integer spills. */
3683 1.1 mrg if (TEST_HARD_REG_BIT (current_frame_info.mask, AR_UNAT_REGNUM))
3684 1.1 mrg {
3685 1.1 mrg if (current_frame_info.r[reg_save_ar_unat])
3686 1.1 mrg {
3687 1.1 mrg ar_unat_save_reg
3688 1.1 mrg = gen_rtx_REG (DImode, current_frame_info.r[reg_save_ar_unat]);
3689 1.1 mrg reg_emitted (reg_save_ar_unat);
3690 1.1 mrg }
3691 1.1 mrg else
3692 1.1 mrg {
3693 1.1 mrg alt_regno = next_scratch_gr_reg ();
3694 1.1 mrg ar_unat_save_reg = gen_rtx_REG (DImode, alt_regno);
3695 1.1 mrg current_frame_info.gr_used_mask |= 1 << alt_regno;
3696 1.1 mrg }
3697 1.1 mrg
3698 1.1 mrg reg = gen_rtx_REG (DImode, AR_UNAT_REGNUM);
3699 1.1 mrg insn = emit_move_insn (ar_unat_save_reg, reg);
3700 1.1 mrg if (current_frame_info.r[reg_save_ar_unat])
3701 1.1 mrg {
3702 1.1 mrg RTX_FRAME_RELATED_P (insn) = 1;
3703 1.1 mrg add_reg_note (insn, REG_CFA_REGISTER, NULL_RTX);
3704 1.1 mrg }
3705 1.1 mrg
3706 1.1 mrg /* Even if we're not going to generate an epilogue, we still
3707 1.1 mrg need to save the register so that EH works. */
3708 1.1 mrg if (! epilogue_p && current_frame_info.r[reg_save_ar_unat])
3709 1.1 mrg emit_insn (gen_prologue_use (ar_unat_save_reg));
3710 1.1 mrg }
3711 1.1 mrg else
3712 1.1 mrg ar_unat_save_reg = NULL_RTX;
3713 1.1 mrg
3714 1.1 mrg /* Spill all varargs registers. Do this before spilling any GR registers,
3715 1.1 mrg since we want the UNAT bits for the GR registers to override the UNAT
3716 1.1 mrg bits from varargs, which we don't care about. */
3717 1.1 mrg
3718 1.1 mrg cfa_off = -16;
3719 1.1 mrg for (regno = GR_ARG_FIRST + 7; n_varargs > 0; --n_varargs, --regno)
3720 1.1 mrg {
3721 1.1 mrg reg = gen_rtx_REG (DImode, regno);
3722 1.1 mrg do_spill (gen_gr_spill, reg, cfa_off += 8, NULL_RTX);
3723 1.1 mrg }
3724 1.1 mrg
3725 1.1 mrg /* Locate the bottom of the register save area. */
3726 1.1 mrg cfa_off = (current_frame_info.spill_cfa_off
3727 1.1 mrg + current_frame_info.spill_size
3728 1.1 mrg + current_frame_info.extra_spill_size);
3729 1.1 mrg
3730 1.1 mrg /* Save the predicate register block either in a register or in memory. */
3731 1.1 mrg if (TEST_HARD_REG_BIT (current_frame_info.mask, PR_REG (0)))
3732 1.1 mrg {
3733 1.1 mrg reg = gen_rtx_REG (DImode, PR_REG (0));
3734 1.1 mrg if (current_frame_info.r[reg_save_pr] != 0)
3735 1.1 mrg {
3736 1.1 mrg alt_reg = gen_rtx_REG (DImode, current_frame_info.r[reg_save_pr]);
3737 1.1 mrg reg_emitted (reg_save_pr);
3738 1.1 mrg insn = emit_move_insn (alt_reg, reg);
3739 1.1 mrg
3740 1.1 mrg /* ??? Denote pr spill/fill by a DImode move that modifies all
3741 1.1 mrg 64 hard registers. */
3742 1.1 mrg RTX_FRAME_RELATED_P (insn) = 1;
3743 1.1 mrg add_reg_note (insn, REG_CFA_REGISTER, NULL_RTX);
3744 1.1 mrg
3745 1.1 mrg /* Even if we're not going to generate an epilogue, we still
3746 1.1 mrg need to save the register so that EH works. */
3747 1.1 mrg if (! epilogue_p)
3748 1.1 mrg emit_insn (gen_prologue_use (alt_reg));
3749 1.1 mrg }
3750 1.1 mrg else
3751 1.1 mrg {
3752 1.1 mrg alt_regno = next_scratch_gr_reg ();
3753 1.1 mrg alt_reg = gen_rtx_REG (DImode, alt_regno);
3754 1.1 mrg insn = emit_move_insn (alt_reg, reg);
3755 1.1 mrg do_spill (gen_movdi_x, alt_reg, cfa_off, reg);
3756 1.1 mrg cfa_off -= 8;
3757 1.1 mrg }
3758 1.1 mrg }
3759 1.1 mrg
3760 1.1 mrg /* Handle AR regs in numerical order. All of them get special handling. */
3761 1.1 mrg if (TEST_HARD_REG_BIT (current_frame_info.mask, AR_UNAT_REGNUM)
3762 1.1 mrg && current_frame_info.r[reg_save_ar_unat] == 0)
3763 1.1 mrg {
3764 1.1 mrg reg = gen_rtx_REG (DImode, AR_UNAT_REGNUM);
3765 1.1 mrg do_spill (gen_movdi_x, ar_unat_save_reg, cfa_off, reg);
3766 1.1 mrg cfa_off -= 8;
3767 1.1 mrg }
3768 1.1 mrg
3769 1.1 mrg /* The alloc insn already copied ar.pfs into a general register. The
3770 1.1 mrg only thing we have to do now is copy that register to a stack slot
3771 1.1 mrg if we'd not allocated a local register for the job. */
3772 1.1 mrg if (TEST_HARD_REG_BIT (current_frame_info.mask, AR_PFS_REGNUM)
3773 1.1 mrg && current_frame_info.r[reg_save_ar_pfs] == 0)
3774 1.1 mrg {
3775 1.1 mrg reg = gen_rtx_REG (DImode, AR_PFS_REGNUM);
3776 1.1 mrg do_spill (gen_movdi_x, ar_pfs_save_reg, cfa_off, reg);
3777 1.1 mrg cfa_off -= 8;
3778 1.1 mrg }
3779 1.1 mrg
3780 1.1 mrg if (TEST_HARD_REG_BIT (current_frame_info.mask, AR_LC_REGNUM))
3781 1.1 mrg {
3782 1.1 mrg reg = gen_rtx_REG (DImode, AR_LC_REGNUM);
3783 1.1 mrg if (current_frame_info.r[reg_save_ar_lc] != 0)
3784 1.1 mrg {
3785 1.1 mrg alt_reg = gen_rtx_REG (DImode, current_frame_info.r[reg_save_ar_lc]);
3786 1.1 mrg reg_emitted (reg_save_ar_lc);
3787 1.1 mrg insn = emit_move_insn (alt_reg, reg);
3788 1.1 mrg RTX_FRAME_RELATED_P (insn) = 1;
3789 1.1 mrg add_reg_note (insn, REG_CFA_REGISTER, NULL_RTX);
3790 1.1 mrg
3791 1.1 mrg /* Even if we're not going to generate an epilogue, we still
3792 1.1 mrg need to save the register so that EH works. */
3793 1.1 mrg if (! epilogue_p)
3794 1.1 mrg emit_insn (gen_prologue_use (alt_reg));
3795 1.1 mrg }
3796 1.1 mrg else
3797 1.1 mrg {
3798 1.1 mrg alt_regno = next_scratch_gr_reg ();
3799 1.1 mrg alt_reg = gen_rtx_REG (DImode, alt_regno);
3800 1.1 mrg emit_move_insn (alt_reg, reg);
3801 1.1 mrg do_spill (gen_movdi_x, alt_reg, cfa_off, reg);
3802 1.1 mrg cfa_off -= 8;
3803 1.1 mrg }
3804 1.1 mrg }
3805 1.1 mrg
3806 1.1 mrg /* Save the return pointer. */
3807 1.1 mrg if (TEST_HARD_REG_BIT (current_frame_info.mask, BR_REG (0)))
3808 1.1 mrg {
3809 1.1 mrg reg = gen_rtx_REG (DImode, BR_REG (0));
3810 1.1 mrg if (current_frame_info.r[reg_save_b0] != 0)
3811 1.1 mrg {
3812 1.1 mrg alt_reg = gen_rtx_REG (DImode, current_frame_info.r[reg_save_b0]);
3813 1.1 mrg reg_emitted (reg_save_b0);
3814 1.1 mrg insn = emit_move_insn (alt_reg, reg);
3815 1.1 mrg RTX_FRAME_RELATED_P (insn) = 1;
3816 1.1 mrg add_reg_note (insn, REG_CFA_REGISTER, gen_rtx_SET (alt_reg, pc_rtx));
3817 1.1 mrg
3818 1.1 mrg /* Even if we're not going to generate an epilogue, we still
3819 1.1 mrg need to save the register so that EH works. */
3820 1.1 mrg if (! epilogue_p)
3821 1.1 mrg emit_insn (gen_prologue_use (alt_reg));
3822 1.1 mrg }
3823 1.1 mrg else
3824 1.1 mrg {
3825 1.1 mrg alt_regno = next_scratch_gr_reg ();
3826 1.1 mrg alt_reg = gen_rtx_REG (DImode, alt_regno);
3827 1.1 mrg emit_move_insn (alt_reg, reg);
3828 1.1 mrg do_spill (gen_movdi_x, alt_reg, cfa_off, reg);
3829 1.1 mrg cfa_off -= 8;
3830 1.1 mrg }
3831 1.1 mrg }
3832 1.1 mrg
3833 1.1 mrg if (current_frame_info.r[reg_save_gp])
3834 1.1 mrg {
3835 1.1 mrg reg_emitted (reg_save_gp);
3836 1.1 mrg insn = emit_move_insn (gen_rtx_REG (DImode,
3837 1.1 mrg current_frame_info.r[reg_save_gp]),
3838 1.1 mrg pic_offset_table_rtx);
3839 1.1 mrg }
3840 1.1 mrg
3841 1.1 mrg /* We should now be at the base of the gr/br/fr spill area. */
3842 1.1 mrg gcc_assert (cfa_off == (current_frame_info.spill_cfa_off
3843 1.1 mrg + current_frame_info.spill_size));
3844 1.1 mrg
3845 1.1 mrg /* Spill all general registers. */
3846 1.1 mrg for (regno = GR_REG (1); regno <= GR_REG (31); ++regno)
3847 1.1 mrg if (TEST_HARD_REG_BIT (current_frame_info.mask, regno))
3848 1.1 mrg {
3849 1.1 mrg reg = gen_rtx_REG (DImode, regno);
3850 1.1 mrg do_spill (gen_gr_spill, reg, cfa_off, reg);
3851 1.1 mrg cfa_off -= 8;
3852 1.1 mrg }
3853 1.1 mrg
3854 1.1 mrg /* Spill the rest of the BR registers. */
3855 1.1 mrg for (regno = BR_REG (1); regno <= BR_REG (7); ++regno)
3856 1.1 mrg if (TEST_HARD_REG_BIT (current_frame_info.mask, regno))
3857 1.1 mrg {
3858 1.1 mrg alt_regno = next_scratch_gr_reg ();
3859 1.1 mrg alt_reg = gen_rtx_REG (DImode, alt_regno);
3860 1.1 mrg reg = gen_rtx_REG (DImode, regno);
3861 1.1 mrg emit_move_insn (alt_reg, reg);
3862 1.1 mrg do_spill (gen_movdi_x, alt_reg, cfa_off, reg);
3863 1.1 mrg cfa_off -= 8;
3864 1.1 mrg }
3865 1.1 mrg
3866 1.1 mrg /* Align the frame and spill all FR registers. */
3867 1.1 mrg for (regno = FR_REG (2); regno <= FR_REG (127); ++regno)
3868 1.1 mrg if (TEST_HARD_REG_BIT (current_frame_info.mask, regno))
3869 1.1 mrg {
3870 1.1 mrg gcc_assert (!(cfa_off & 15));
3871 1.1 mrg reg = gen_rtx_REG (XFmode, regno);
3872 1.1 mrg do_spill (gen_fr_spill_x, reg, cfa_off, reg);
3873 1.1 mrg cfa_off -= 16;
3874 1.1 mrg }
3875 1.1 mrg
3876 1.1 mrg gcc_assert (cfa_off == current_frame_info.spill_cfa_off);
3877 1.1 mrg
3878 1.1 mrg finish_spill_pointers ();
3879 1.1 mrg }
3880 1.1 mrg
3881 1.1 mrg /* Output the textual info surrounding the prologue. */
3882 1.1 mrg
3883 1.1 mrg void
3884 1.1 mrg ia64_start_function (FILE *file, const char *fnname,
3885 1.1 mrg tree decl ATTRIBUTE_UNUSED)
3886 1.1 mrg {
3887 1.1 mrg #if TARGET_ABI_OPEN_VMS
3888 1.1 mrg vms_start_function (fnname);
3889 1.1 mrg #endif
3890 1.1 mrg
3891 1.1 mrg fputs ("\t.proc ", file);
3892 1.1 mrg assemble_name (file, fnname);
3893 1.1 mrg fputc ('\n', file);
3894 1.1 mrg ASM_OUTPUT_LABEL (file, fnname);
3895 1.1 mrg }
3896 1.1 mrg
3897 1.1 mrg /* Called after register allocation to add any instructions needed for the
3898 1.1 mrg epilogue. Using an epilogue insn is favored compared to putting all of the
3899 1.1 mrg instructions in output_function_prologue(), since it allows the scheduler
3900 1.1 mrg to intermix instructions with the saves of the caller saved registers. In
3901 1.1 mrg some cases, it might be necessary to emit a barrier instruction as the last
3902 1.1 mrg insn to prevent such scheduling. */
3903 1.1 mrg
3904 1.1 mrg void
3905 1.1 mrg ia64_expand_epilogue (int sibcall_p)
3906 1.1 mrg {
3907 1.1 mrg rtx_insn *insn;
3908 1.1 mrg rtx reg, alt_reg, ar_unat_save_reg;
3909 1.1 mrg int regno, alt_regno, cfa_off;
3910 1.1 mrg
3911 1.1 mrg ia64_compute_frame_size (get_frame_size ());
3912 1.1 mrg
3913 1.1 mrg /* If there is a frame pointer, then we use it instead of the stack
3914 1.1 mrg pointer, so that the stack pointer does not need to be valid when
3915 1.1 mrg the epilogue starts. See EXIT_IGNORE_STACK. */
3916 1.1 mrg if (frame_pointer_needed)
3917 1.1 mrg setup_spill_pointers (current_frame_info.n_spilled,
3918 1.1 mrg hard_frame_pointer_rtx, 0);
3919 1.1 mrg else
3920 1.1 mrg setup_spill_pointers (current_frame_info.n_spilled, stack_pointer_rtx,
3921 1.1 mrg current_frame_info.total_size);
3922 1.1 mrg
3923 1.1 mrg if (current_frame_info.total_size != 0)
3924 1.1 mrg {
3925 1.1 mrg /* ??? At this point we must generate a magic insn that appears to
3926 1.1 mrg modify the spill iterators and the frame pointer. This would
3927 1.1 mrg allow the most scheduling freedom. For now, just hard stop. */
3928 1.1 mrg emit_insn (gen_blockage ());
3929 1.1 mrg }
3930 1.1 mrg
3931 1.1 mrg /* Locate the bottom of the register save area. */
3932 1.1 mrg cfa_off = (current_frame_info.spill_cfa_off
3933 1.1 mrg + current_frame_info.spill_size
3934 1.1 mrg + current_frame_info.extra_spill_size);
3935 1.1 mrg
3936 1.1 mrg /* Restore the predicate registers. */
3937 1.1 mrg if (TEST_HARD_REG_BIT (current_frame_info.mask, PR_REG (0)))
3938 1.1 mrg {
3939 1.1 mrg if (current_frame_info.r[reg_save_pr] != 0)
3940 1.1 mrg {
3941 1.1 mrg alt_reg = gen_rtx_REG (DImode, current_frame_info.r[reg_save_pr]);
3942 1.1 mrg reg_emitted (reg_save_pr);
3943 1.1 mrg }
3944 1.1 mrg else
3945 1.1 mrg {
3946 1.1 mrg alt_regno = next_scratch_gr_reg ();
3947 1.1 mrg alt_reg = gen_rtx_REG (DImode, alt_regno);
3948 1.1 mrg do_restore (gen_movdi_x, alt_reg, cfa_off);
3949 1.1 mrg cfa_off -= 8;
3950 1.1 mrg }
3951 1.1 mrg reg = gen_rtx_REG (DImode, PR_REG (0));
3952 1.1 mrg emit_move_insn (reg, alt_reg);
3953 1.1 mrg }
3954 1.1 mrg
3955 1.1 mrg /* Restore the application registers. */
3956 1.1 mrg
3957 1.1 mrg /* Load the saved unat from the stack, but do not restore it until
3958 1.1 mrg after the GRs have been restored. */
3959 1.1 mrg if (TEST_HARD_REG_BIT (current_frame_info.mask, AR_UNAT_REGNUM))
3960 1.1 mrg {
3961 1.1 mrg if (current_frame_info.r[reg_save_ar_unat] != 0)
3962 1.1 mrg {
3963 1.1 mrg ar_unat_save_reg
3964 1.1 mrg = gen_rtx_REG (DImode, current_frame_info.r[reg_save_ar_unat]);
3965 1.1 mrg reg_emitted (reg_save_ar_unat);
3966 1.1 mrg }
3967 1.1 mrg else
3968 1.1 mrg {
3969 1.1 mrg alt_regno = next_scratch_gr_reg ();
3970 1.1 mrg ar_unat_save_reg = gen_rtx_REG (DImode, alt_regno);
3971 1.1 mrg current_frame_info.gr_used_mask |= 1 << alt_regno;
3972 1.1 mrg do_restore (gen_movdi_x, ar_unat_save_reg, cfa_off);
3973 1.1 mrg cfa_off -= 8;
3974 1.1 mrg }
3975 1.1 mrg }
3976 1.1 mrg else
3977 1.1 mrg ar_unat_save_reg = NULL_RTX;
3978 1.1 mrg
3979 1.1 mrg if (current_frame_info.r[reg_save_ar_pfs] != 0)
3980 1.1 mrg {
3981 1.1 mrg reg_emitted (reg_save_ar_pfs);
3982 1.1 mrg alt_reg = gen_rtx_REG (DImode, current_frame_info.r[reg_save_ar_pfs]);
3983 1.1 mrg reg = gen_rtx_REG (DImode, AR_PFS_REGNUM);
3984 1.1 mrg emit_move_insn (reg, alt_reg);
3985 1.1 mrg }
3986 1.1 mrg else if (TEST_HARD_REG_BIT (current_frame_info.mask, AR_PFS_REGNUM))
3987 1.1 mrg {
3988 1.1 mrg alt_regno = next_scratch_gr_reg ();
3989 1.1 mrg alt_reg = gen_rtx_REG (DImode, alt_regno);
3990 1.1 mrg do_restore (gen_movdi_x, alt_reg, cfa_off);
3991 1.1 mrg cfa_off -= 8;
3992 1.1 mrg reg = gen_rtx_REG (DImode, AR_PFS_REGNUM);
3993 1.1 mrg emit_move_insn (reg, alt_reg);
3994 1.1 mrg }
3995 1.1 mrg
3996 1.1 mrg if (TEST_HARD_REG_BIT (current_frame_info.mask, AR_LC_REGNUM))
3997 1.1 mrg {
3998 1.1 mrg if (current_frame_info.r[reg_save_ar_lc] != 0)
3999 1.1 mrg {
4000 1.1 mrg alt_reg = gen_rtx_REG (DImode, current_frame_info.r[reg_save_ar_lc]);
4001 1.1 mrg reg_emitted (reg_save_ar_lc);
4002 1.1 mrg }
4003 1.1 mrg else
4004 1.1 mrg {
4005 1.1 mrg alt_regno = next_scratch_gr_reg ();
4006 1.1 mrg alt_reg = gen_rtx_REG (DImode, alt_regno);
4007 1.1 mrg do_restore (gen_movdi_x, alt_reg, cfa_off);
4008 1.1 mrg cfa_off -= 8;
4009 1.1 mrg }
4010 1.1 mrg reg = gen_rtx_REG (DImode, AR_LC_REGNUM);
4011 1.1 mrg emit_move_insn (reg, alt_reg);
4012 1.1 mrg }
4013 1.1 mrg
4014 1.1 mrg /* Restore the return pointer. */
4015 1.1 mrg if (TEST_HARD_REG_BIT (current_frame_info.mask, BR_REG (0)))
4016 1.1 mrg {
4017 1.1 mrg if (current_frame_info.r[reg_save_b0] != 0)
4018 1.1 mrg {
4019 1.1 mrg alt_reg = gen_rtx_REG (DImode, current_frame_info.r[reg_save_b0]);
4020 1.1 mrg reg_emitted (reg_save_b0);
4021 1.1 mrg }
4022 1.1 mrg else
4023 1.1 mrg {
4024 1.1 mrg alt_regno = next_scratch_gr_reg ();
4025 1.1 mrg alt_reg = gen_rtx_REG (DImode, alt_regno);
4026 1.1 mrg do_restore (gen_movdi_x, alt_reg, cfa_off);
4027 1.1 mrg cfa_off -= 8;
4028 1.1 mrg }
4029 1.1 mrg reg = gen_rtx_REG (DImode, BR_REG (0));
4030 1.1 mrg emit_move_insn (reg, alt_reg);
4031 1.1 mrg }
4032 1.1 mrg
4033 1.1 mrg /* We should now be at the base of the gr/br/fr spill area. */
4034 1.1 mrg gcc_assert (cfa_off == (current_frame_info.spill_cfa_off
4035 1.1 mrg + current_frame_info.spill_size));
4036 1.1 mrg
4037 1.1 mrg /* The GP may be stored on the stack in the prologue, but it's
4038 1.1 mrg never restored in the epilogue. Skip the stack slot. */
4039 1.1 mrg if (TEST_HARD_REG_BIT (current_frame_info.mask, GR_REG (1)))
4040 1.1 mrg cfa_off -= 8;
4041 1.1 mrg
4042 1.1 mrg /* Restore all general registers. */
4043 1.1 mrg for (regno = GR_REG (2); regno <= GR_REG (31); ++regno)
4044 1.1 mrg if (TEST_HARD_REG_BIT (current_frame_info.mask, regno))
4045 1.1 mrg {
4046 1.1 mrg reg = gen_rtx_REG (DImode, regno);
4047 1.1 mrg do_restore (gen_gr_restore, reg, cfa_off);
4048 1.1 mrg cfa_off -= 8;
4049 1.1 mrg }
4050 1.1 mrg
4051 1.1 mrg /* Restore the branch registers. */
4052 1.1 mrg for (regno = BR_REG (1); regno <= BR_REG (7); ++regno)
4053 1.1 mrg if (TEST_HARD_REG_BIT (current_frame_info.mask, regno))
4054 1.1 mrg {
4055 1.1 mrg alt_regno = next_scratch_gr_reg ();
4056 1.1 mrg alt_reg = gen_rtx_REG (DImode, alt_regno);
4057 1.1 mrg do_restore (gen_movdi_x, alt_reg, cfa_off);
4058 1.1 mrg cfa_off -= 8;
4059 1.1 mrg reg = gen_rtx_REG (DImode, regno);
4060 1.1 mrg emit_move_insn (reg, alt_reg);
4061 1.1 mrg }
4062 1.1 mrg
4063 1.1 mrg /* Restore floating point registers. */
4064 1.1 mrg for (regno = FR_REG (2); regno <= FR_REG (127); ++regno)
4065 1.1 mrg if (TEST_HARD_REG_BIT (current_frame_info.mask, regno))
4066 1.1 mrg {
4067 1.1 mrg gcc_assert (!(cfa_off & 15));
4068 1.1 mrg reg = gen_rtx_REG (XFmode, regno);
4069 1.1 mrg do_restore (gen_fr_restore_x, reg, cfa_off);
4070 1.1 mrg cfa_off -= 16;
4071 1.1 mrg }
4072 1.1 mrg
4073 1.1 mrg /* Restore ar.unat for real. */
4074 1.1 mrg if (TEST_HARD_REG_BIT (current_frame_info.mask, AR_UNAT_REGNUM))
4075 1.1 mrg {
4076 1.1 mrg reg = gen_rtx_REG (DImode, AR_UNAT_REGNUM);
4077 1.1 mrg emit_move_insn (reg, ar_unat_save_reg);
4078 1.1 mrg }
4079 1.1 mrg
4080 1.1 mrg gcc_assert (cfa_off == current_frame_info.spill_cfa_off);
4081 1.1 mrg
4082 1.1 mrg finish_spill_pointers ();
4083 1.1 mrg
4084 1.1 mrg if (current_frame_info.total_size
4085 1.1 mrg || cfun->machine->ia64_eh_epilogue_sp
4086 1.1 mrg || frame_pointer_needed)
4087 1.1 mrg {
4088 1.1 mrg /* ??? At this point we must generate a magic insn that appears to
4089 1.1 mrg modify the spill iterators, the stack pointer, and the frame
4090 1.1 mrg pointer. This would allow the most scheduling freedom. For now,
4091 1.1 mrg just hard stop. */
4092 1.1 mrg emit_insn (gen_blockage ());
4093 1.1 mrg }
4094 1.1 mrg
4095 1.1 mrg if (cfun->machine->ia64_eh_epilogue_sp)
4096 1.1 mrg emit_move_insn (stack_pointer_rtx, cfun->machine->ia64_eh_epilogue_sp);
4097 1.1 mrg else if (frame_pointer_needed)
4098 1.1 mrg {
4099 1.1 mrg insn = emit_move_insn (stack_pointer_rtx, hard_frame_pointer_rtx);
4100 1.1 mrg RTX_FRAME_RELATED_P (insn) = 1;
4101 1.1 mrg add_reg_note (insn, REG_CFA_ADJUST_CFA, NULL);
4102 1.1 mrg }
4103 1.1 mrg else if (current_frame_info.total_size)
4104 1.1 mrg {
4105 1.1 mrg rtx offset, frame_size_rtx;
4106 1.1 mrg
4107 1.1 mrg frame_size_rtx = GEN_INT (current_frame_info.total_size);
4108 1.1 mrg if (satisfies_constraint_I (frame_size_rtx))
4109 1.1 mrg offset = frame_size_rtx;
4110 1.1 mrg else
4111 1.1 mrg {
4112 1.1 mrg regno = next_scratch_gr_reg ();
4113 1.1 mrg offset = gen_rtx_REG (DImode, regno);
4114 1.1 mrg emit_move_insn (offset, frame_size_rtx);
4115 1.1 mrg }
4116 1.1 mrg
4117 1.1 mrg insn = emit_insn (gen_adddi3 (stack_pointer_rtx, stack_pointer_rtx,
4118 1.1 mrg offset));
4119 1.1 mrg
4120 1.1 mrg RTX_FRAME_RELATED_P (insn) = 1;
4121 1.1 mrg add_reg_note (insn, REG_CFA_ADJUST_CFA,
4122 1.1 mrg gen_rtx_SET (stack_pointer_rtx,
4123 1.1 mrg gen_rtx_PLUS (DImode,
4124 1.1 mrg stack_pointer_rtx,
4125 1.1 mrg frame_size_rtx)));
4126 1.1 mrg }
4127 1.1 mrg
4128 1.1 mrg if (cfun->machine->ia64_eh_epilogue_bsp)
4129 1.1 mrg emit_insn (gen_set_bsp (cfun->machine->ia64_eh_epilogue_bsp));
4130 1.1 mrg
4131 1.1 mrg if (! sibcall_p)
4132 1.1 mrg emit_jump_insn (gen_return_internal (gen_rtx_REG (DImode, BR_REG (0))));
4133 1.1 mrg else
4134 1.1 mrg {
4135 1.1 mrg int fp = GR_REG (2);
4136 1.1 mrg /* We need a throw away register here, r0 and r1 are reserved,
4137 1.1 mrg so r2 is the first available call clobbered register. If
4138 1.1 mrg there was a frame_pointer register, we may have swapped the
4139 1.1 mrg names of r2 and HARD_FRAME_POINTER_REGNUM, so we have to make
4140 1.1 mrg sure we're using the string "r2" when emitting the register
4141 1.1 mrg name for the assembler. */
4142 1.1 mrg if (current_frame_info.r[reg_fp]
4143 1.1 mrg && current_frame_info.r[reg_fp] == GR_REG (2))
4144 1.1 mrg fp = HARD_FRAME_POINTER_REGNUM;
4145 1.1 mrg
4146 1.1 mrg /* We must emit an alloc to force the input registers to become output
4147 1.1 mrg registers. Otherwise, if the callee tries to pass its parameters
4148 1.1 mrg through to another call without an intervening alloc, then these
4149 1.1 mrg values get lost. */
4150 1.1 mrg /* ??? We don't need to preserve all input registers. We only need to
4151 1.1 mrg preserve those input registers used as arguments to the sibling call.
4152 1.1 mrg It is unclear how to compute that number here. */
4153 1.1 mrg if (current_frame_info.n_input_regs != 0)
4154 1.1 mrg {
4155 1.1 mrg rtx n_inputs = GEN_INT (current_frame_info.n_input_regs);
4156 1.1 mrg
4157 1.1 mrg insn = emit_insn (gen_alloc (gen_rtx_REG (DImode, fp),
4158 1.1 mrg const0_rtx, const0_rtx,
4159 1.1 mrg n_inputs, const0_rtx));
4160 1.1 mrg RTX_FRAME_RELATED_P (insn) = 1;
4161 1.1 mrg
4162 1.1 mrg /* ??? We need to mark the alloc as frame-related so that it gets
4163 1.1 mrg passed into ia64_asm_unwind_emit for ia64-specific unwinding.
4164 1.1 mrg But there's nothing dwarf2 related to be done wrt the register
4165 1.1 mrg windows. If we do nothing, dwarf2out will abort on the UNSPEC;
4166 1.1 mrg the empty parallel means dwarf2out will not see anything. */
4167 1.1 mrg add_reg_note (insn, REG_FRAME_RELATED_EXPR,
4168 1.1 mrg gen_rtx_PARALLEL (VOIDmode, rtvec_alloc (0)));
4169 1.1 mrg }
4170 1.1 mrg }
4171 1.1 mrg }
4172 1.1 mrg
4173 1.1 mrg /* Return 1 if br.ret can do all the work required to return from a
4174 1.1 mrg function. */
4175 1.1 mrg
4176 1.1 mrg int
4177 1.1 mrg ia64_direct_return (void)
4178 1.1 mrg {
4179 1.1 mrg if (reload_completed && ! frame_pointer_needed)
4180 1.1 mrg {
4181 1.1 mrg ia64_compute_frame_size (get_frame_size ());
4182 1.1 mrg
4183 1.1 mrg return (current_frame_info.total_size == 0
4184 1.1 mrg && current_frame_info.n_spilled == 0
4185 1.1 mrg && current_frame_info.r[reg_save_b0] == 0
4186 1.1 mrg && current_frame_info.r[reg_save_pr] == 0
4187 1.1 mrg && current_frame_info.r[reg_save_ar_pfs] == 0
4188 1.1 mrg && current_frame_info.r[reg_save_ar_unat] == 0
4189 1.1 mrg && current_frame_info.r[reg_save_ar_lc] == 0);
4190 1.1 mrg }
4191 1.1 mrg return 0;
4192 1.1 mrg }
4193 1.1 mrg
4194 1.1 mrg /* Return the magic cookie that we use to hold the return address
4195 1.1 mrg during early compilation. */
4196 1.1 mrg
4197 1.1 mrg rtx
4198 1.1 mrg ia64_return_addr_rtx (HOST_WIDE_INT count, rtx frame ATTRIBUTE_UNUSED)
4199 1.1 mrg {
4200 1.1 mrg if (count != 0)
4201 1.1 mrg return NULL;
4202 1.1 mrg return gen_rtx_UNSPEC (Pmode, gen_rtvec (1, const0_rtx), UNSPEC_RET_ADDR);
4203 1.1 mrg }
4204 1.1 mrg
4205 1.1 mrg /* Split this value after reload, now that we know where the return
4206 1.1 mrg address is saved. */
4207 1.1 mrg
4208 1.1 mrg void
4209 1.1 mrg ia64_split_return_addr_rtx (rtx dest)
4210 1.1 mrg {
4211 1.1 mrg rtx src;
4212 1.1 mrg
4213 1.1 mrg if (TEST_HARD_REG_BIT (current_frame_info.mask, BR_REG (0)))
4214 1.1 mrg {
4215 1.1 mrg if (current_frame_info.r[reg_save_b0] != 0)
4216 1.1 mrg {
4217 1.1 mrg src = gen_rtx_REG (DImode, current_frame_info.r[reg_save_b0]);
4218 1.1 mrg reg_emitted (reg_save_b0);
4219 1.1 mrg }
4220 1.1 mrg else
4221 1.1 mrg {
4222 1.1 mrg HOST_WIDE_INT off;
4223 1.1 mrg unsigned int regno;
4224 1.1 mrg rtx off_r;
4225 1.1 mrg
4226 1.1 mrg /* Compute offset from CFA for BR0. */
4227 1.1 mrg /* ??? Must be kept in sync with ia64_expand_prologue. */
4228 1.1 mrg off = (current_frame_info.spill_cfa_off
4229 1.1 mrg + current_frame_info.spill_size);
4230 1.1 mrg for (regno = GR_REG (1); regno <= GR_REG (31); ++regno)
4231 1.1 mrg if (TEST_HARD_REG_BIT (current_frame_info.mask, regno))
4232 1.1 mrg off -= 8;
4233 1.1 mrg
4234 1.1 mrg /* Convert CFA offset to a register based offset. */
4235 1.1 mrg if (frame_pointer_needed)
4236 1.1 mrg src = hard_frame_pointer_rtx;
4237 1.1 mrg else
4238 1.1 mrg {
4239 1.1 mrg src = stack_pointer_rtx;
4240 1.1 mrg off += current_frame_info.total_size;
4241 1.1 mrg }
4242 1.1 mrg
4243 1.1 mrg /* Load address into scratch register. */
4244 1.1 mrg off_r = GEN_INT (off);
4245 1.1 mrg if (satisfies_constraint_I (off_r))
4246 1.1 mrg emit_insn (gen_adddi3 (dest, src, off_r));
4247 1.1 mrg else
4248 1.1 mrg {
4249 1.1 mrg emit_move_insn (dest, off_r);
4250 1.1 mrg emit_insn (gen_adddi3 (dest, src, dest));
4251 1.1 mrg }
4252 1.1 mrg
4253 1.1 mrg src = gen_rtx_MEM (Pmode, dest);
4254 1.1 mrg }
4255 1.1 mrg }
4256 1.1 mrg else
4257 1.1 mrg src = gen_rtx_REG (DImode, BR_REG (0));
4258 1.1 mrg
4259 1.1 mrg emit_move_insn (dest, src);
4260 1.1 mrg }
4261 1.1 mrg
4262 1.1 mrg int
4263 1.1 mrg ia64_hard_regno_rename_ok (int from, int to)
4264 1.1 mrg {
4265 1.1 mrg /* Don't clobber any of the registers we reserved for the prologue. */
4266 1.1 mrg unsigned int r;
4267 1.1 mrg
4268 1.1 mrg for (r = reg_fp; r <= reg_save_ar_lc; r++)
4269 1.1 mrg if (to == current_frame_info.r[r]
4270 1.1 mrg || from == current_frame_info.r[r]
4271 1.1 mrg || to == emitted_frame_related_regs[r]
4272 1.1 mrg || from == emitted_frame_related_regs[r])
4273 1.1 mrg return 0;
4274 1.1 mrg
4275 1.1 mrg /* Don't use output registers outside the register frame. */
4276 1.1 mrg if (OUT_REGNO_P (to) && to >= OUT_REG (current_frame_info.n_output_regs))
4277 1.1 mrg return 0;
4278 1.1 mrg
4279 1.1 mrg /* Retain even/oddness on predicate register pairs. */
4280 1.1 mrg if (PR_REGNO_P (from) && PR_REGNO_P (to))
4281 1.1 mrg return (from & 1) == (to & 1);
4282 1.1 mrg
4283 1.1 mrg return 1;
4284 1.1 mrg }
4285 1.1 mrg
4286 1.1 mrg /* Implement TARGET_HARD_REGNO_NREGS.
4287 1.1 mrg
4288 1.1 mrg ??? We say that BImode PR values require two registers. This allows us to
4289 1.1 mrg easily store the normal and inverted values. We use CCImode to indicate
4290 1.1 mrg a single predicate register. */
4291 1.1 mrg
4292 1.1 mrg static unsigned int
4293 1.1 mrg ia64_hard_regno_nregs (unsigned int regno, machine_mode mode)
4294 1.1 mrg {
4295 1.1 mrg if (regno == PR_REG (0) && mode == DImode)
4296 1.1 mrg return 64;
4297 1.1 mrg if (PR_REGNO_P (regno) && (mode) == BImode)
4298 1.1 mrg return 2;
4299 1.1 mrg if ((PR_REGNO_P (regno) || GR_REGNO_P (regno)) && mode == CCImode)
4300 1.1 mrg return 1;
4301 1.1 mrg if (FR_REGNO_P (regno) && mode == XFmode)
4302 1.1 mrg return 1;
4303 1.1 mrg if (FR_REGNO_P (regno) && mode == RFmode)
4304 1.1 mrg return 1;
4305 1.1 mrg if (FR_REGNO_P (regno) && mode == XCmode)
4306 1.1 mrg return 2;
4307 1.1 mrg return CEIL (GET_MODE_SIZE (mode), UNITS_PER_WORD);
4308 1.1 mrg }
4309 1.1 mrg
4310 1.1 mrg /* Implement TARGET_HARD_REGNO_MODE_OK. */
4311 1.1 mrg
4312 1.1 mrg static bool
4313 1.1 mrg ia64_hard_regno_mode_ok (unsigned int regno, machine_mode mode)
4314 1.1 mrg {
4315 1.1 mrg if (FR_REGNO_P (regno))
4316 1.1 mrg return (GET_MODE_CLASS (mode) != MODE_CC
4317 1.1 mrg && mode != BImode
4318 1.1 mrg && mode != TFmode);
4319 1.1 mrg
4320 1.1 mrg if (PR_REGNO_P (regno))
4321 1.1 mrg return mode == BImode || GET_MODE_CLASS (mode) == MODE_CC;
4322 1.1 mrg
4323 1.1 mrg if (GR_REGNO_P (regno))
4324 1.1 mrg return mode != XFmode && mode != XCmode && mode != RFmode;
4325 1.1 mrg
4326 1.1 mrg if (AR_REGNO_P (regno))
4327 1.1 mrg return mode == DImode;
4328 1.1 mrg
4329 1.1 mrg if (BR_REGNO_P (regno))
4330 1.1 mrg return mode == DImode;
4331 1.1 mrg
4332 1.1 mrg return false;
4333 1.1 mrg }
4334 1.1 mrg
4335 1.1 mrg /* Implement TARGET_MODES_TIEABLE_P.
4336 1.1 mrg
4337 1.1 mrg Don't tie integer and FP modes, as that causes us to get integer registers
4338 1.1 mrg allocated for FP instructions. XFmode only supported in FP registers so
4339 1.1 mrg we can't tie it with any other modes. */
4340 1.1 mrg
4341 1.1 mrg static bool
4342 1.1 mrg ia64_modes_tieable_p (machine_mode mode1, machine_mode mode2)
4343 1.1 mrg {
4344 1.1 mrg return (GET_MODE_CLASS (mode1) == GET_MODE_CLASS (mode2)
4345 1.1 mrg && ((mode1 == XFmode || mode1 == XCmode || mode1 == RFmode)
4346 1.1 mrg == (mode2 == XFmode || mode2 == XCmode || mode2 == RFmode))
4347 1.1 mrg && (mode1 == BImode) == (mode2 == BImode));
4348 1.1 mrg }
4349 1.1 mrg
4350 1.1 mrg /* Target hook for assembling integer objects. Handle word-sized
4351 1.1 mrg aligned objects and detect the cases when @fptr is needed. */
4352 1.1 mrg
4353 1.1 mrg static bool
4354 1.1 mrg ia64_assemble_integer (rtx x, unsigned int size, int aligned_p)
4355 1.1 mrg {
4356 1.1 mrg if (size == POINTER_SIZE / BITS_PER_UNIT
4357 1.1 mrg && !(TARGET_NO_PIC || TARGET_AUTO_PIC)
4358 1.1 mrg && GET_CODE (x) == SYMBOL_REF
4359 1.1 mrg && SYMBOL_REF_FUNCTION_P (x))
4360 1.1 mrg {
4361 1.1 mrg static const char * const directive[2][2] = {
4362 1.1 mrg /* 64-bit pointer */ /* 32-bit pointer */
4363 1.1 mrg { "\tdata8.ua\t@fptr(", "\tdata4.ua\t@fptr("}, /* unaligned */
4364 1.1 mrg { "\tdata8\t@fptr(", "\tdata4\t@fptr("} /* aligned */
4365 1.1 mrg };
4366 1.1 mrg fputs (directive[(aligned_p != 0)][POINTER_SIZE == 32], asm_out_file);
4367 1.1 mrg output_addr_const (asm_out_file, x);
4368 1.1 mrg fputs (")\n", asm_out_file);
4369 1.1 mrg return true;
4370 1.1 mrg }
4371 1.1 mrg return default_assemble_integer (x, size, aligned_p);
4372 1.1 mrg }
4373 1.1 mrg
4374 1.1 mrg /* Emit the function prologue. */
4375 1.1 mrg
4376 1.1 mrg static void
4377 1.1 mrg ia64_output_function_prologue (FILE *file)
4378 1.1 mrg {
4379 1.1 mrg int mask, grsave, grsave_prev;
4380 1.1 mrg
4381 1.1 mrg if (current_frame_info.need_regstk)
4382 1.1 mrg fprintf (file, "\t.regstk %d, %d, %d, %d\n",
4383 1.1 mrg current_frame_info.n_input_regs,
4384 1.1 mrg current_frame_info.n_local_regs,
4385 1.1 mrg current_frame_info.n_output_regs,
4386 1.1 mrg current_frame_info.n_rotate_regs);
4387 1.1 mrg
4388 1.1 mrg if (ia64_except_unwind_info (&global_options) != UI_TARGET)
4389 1.1 mrg return;
4390 1.1 mrg
4391 1.1 mrg /* Emit the .prologue directive. */
4392 1.1 mrg
4393 1.1 mrg mask = 0;
4394 1.1 mrg grsave = grsave_prev = 0;
4395 1.1 mrg if (current_frame_info.r[reg_save_b0] != 0)
4396 1.1 mrg {
4397 1.1 mrg mask |= 8;
4398 1.1 mrg grsave = grsave_prev = current_frame_info.r[reg_save_b0];
4399 1.1 mrg }
4400 1.1 mrg if (current_frame_info.r[reg_save_ar_pfs] != 0
4401 1.1 mrg && (grsave_prev == 0
4402 1.1 mrg || current_frame_info.r[reg_save_ar_pfs] == grsave_prev + 1))
4403 1.1 mrg {
4404 1.1 mrg mask |= 4;
4405 1.1 mrg if (grsave_prev == 0)
4406 1.1 mrg grsave = current_frame_info.r[reg_save_ar_pfs];
4407 1.1 mrg grsave_prev = current_frame_info.r[reg_save_ar_pfs];
4408 1.1 mrg }
4409 1.1 mrg if (current_frame_info.r[reg_fp] != 0
4410 1.1 mrg && (grsave_prev == 0
4411 1.1 mrg || current_frame_info.r[reg_fp] == grsave_prev + 1))
4412 1.1 mrg {
4413 1.1 mrg mask |= 2;
4414 1.1 mrg if (grsave_prev == 0)
4415 1.1 mrg grsave = HARD_FRAME_POINTER_REGNUM;
4416 1.1 mrg grsave_prev = current_frame_info.r[reg_fp];
4417 1.1 mrg }
4418 1.1 mrg if (current_frame_info.r[reg_save_pr] != 0
4419 1.1 mrg && (grsave_prev == 0
4420 1.1 mrg || current_frame_info.r[reg_save_pr] == grsave_prev + 1))
4421 1.1 mrg {
4422 1.1 mrg mask |= 1;
4423 1.1 mrg if (grsave_prev == 0)
4424 1.1 mrg grsave = current_frame_info.r[reg_save_pr];
4425 1.1 mrg }
4426 1.1 mrg
4427 1.1 mrg if (mask && TARGET_GNU_AS)
4428 1.1 mrg fprintf (file, "\t.prologue %d, %d\n", mask,
4429 1.1 mrg ia64_dbx_register_number (grsave));
4430 1.1 mrg else
4431 1.1 mrg fputs ("\t.prologue\n", file);
4432 1.1 mrg
4433 1.1 mrg /* Emit a .spill directive, if necessary, to relocate the base of
4434 1.1 mrg the register spill area. */
4435 1.1 mrg if (current_frame_info.spill_cfa_off != -16)
4436 1.1 mrg fprintf (file, "\t.spill %ld\n",
4437 1.1 mrg (long) (current_frame_info.spill_cfa_off
4438 1.1 mrg + current_frame_info.spill_size));
4439 1.1 mrg }
4440 1.1 mrg
4441 1.1 mrg /* Emit the .body directive at the scheduled end of the prologue. */
4442 1.1 mrg
4443 1.1 mrg static void
4444 1.1 mrg ia64_output_function_end_prologue (FILE *file)
4445 1.1 mrg {
4446 1.1 mrg if (ia64_except_unwind_info (&global_options) != UI_TARGET)
4447 1.1 mrg return;
4448 1.1 mrg
4449 1.1 mrg fputs ("\t.body\n", file);
4450 1.1 mrg }
4451 1.1 mrg
4452 1.1 mrg /* Emit the function epilogue. */
4453 1.1 mrg
4454 1.1 mrg static void
4455 1.1 mrg ia64_output_function_epilogue (FILE *)
4456 1.1 mrg {
4457 1.1 mrg int i;
4458 1.1 mrg
4459 1.1 mrg if (current_frame_info.r[reg_fp])
4460 1.1 mrg {
4461 1.1 mrg const char *tmp = reg_names[HARD_FRAME_POINTER_REGNUM];
4462 1.1 mrg reg_names[HARD_FRAME_POINTER_REGNUM]
4463 1.1 mrg = reg_names[current_frame_info.r[reg_fp]];
4464 1.1 mrg reg_names[current_frame_info.r[reg_fp]] = tmp;
4465 1.1 mrg reg_emitted (reg_fp);
4466 1.1 mrg }
4467 1.1 mrg if (! TARGET_REG_NAMES)
4468 1.1 mrg {
4469 1.1 mrg for (i = 0; i < current_frame_info.n_input_regs; i++)
4470 1.1 mrg reg_names[IN_REG (i)] = ia64_input_reg_names[i];
4471 1.1 mrg for (i = 0; i < current_frame_info.n_local_regs; i++)
4472 1.1 mrg reg_names[LOC_REG (i)] = ia64_local_reg_names[i];
4473 1.1 mrg for (i = 0; i < current_frame_info.n_output_regs; i++)
4474 1.1 mrg reg_names[OUT_REG (i)] = ia64_output_reg_names[i];
4475 1.1 mrg }
4476 1.1 mrg
4477 1.1 mrg current_frame_info.initialized = 0;
4478 1.1 mrg }
4479 1.1 mrg
4480 1.1 mrg int
4481 1.1 mrg ia64_dbx_register_number (int regno)
4482 1.1 mrg {
4483 1.1 mrg /* In ia64_expand_prologue we quite literally renamed the frame pointer
4484 1.1 mrg from its home at loc79 to something inside the register frame. We
4485 1.1 mrg must perform the same renumbering here for the debug info. */
4486 1.1 mrg if (current_frame_info.r[reg_fp])
4487 1.1 mrg {
4488 1.1 mrg if (regno == HARD_FRAME_POINTER_REGNUM)
4489 1.1 mrg regno = current_frame_info.r[reg_fp];
4490 1.1 mrg else if (regno == current_frame_info.r[reg_fp])
4491 1.1 mrg regno = HARD_FRAME_POINTER_REGNUM;
4492 1.1 mrg }
4493 1.1 mrg
4494 1.1 mrg if (IN_REGNO_P (regno))
4495 1.1 mrg return 32 + regno - IN_REG (0);
4496 1.1 mrg else if (LOC_REGNO_P (regno))
4497 1.1 mrg return 32 + current_frame_info.n_input_regs + regno - LOC_REG (0);
4498 1.1 mrg else if (OUT_REGNO_P (regno))
4499 1.1 mrg return (32 + current_frame_info.n_input_regs
4500 1.1 mrg + current_frame_info.n_local_regs + regno - OUT_REG (0));
4501 1.1 mrg else
4502 1.1 mrg return regno;
4503 1.1 mrg }
4504 1.1 mrg
4505 1.1 mrg /* Implement TARGET_TRAMPOLINE_INIT.
4506 1.1 mrg
4507 1.1 mrg The trampoline should set the static chain pointer to value placed
4508 1.1 mrg into the trampoline and should branch to the specified routine.
4509 1.1 mrg To make the normal indirect-subroutine calling convention work,
4510 1.1 mrg the trampoline must look like a function descriptor; the first
4511 1.1 mrg word being the target address and the second being the target's
4512 1.1 mrg global pointer.
4513 1.1 mrg
4514 1.1 mrg We abuse the concept of a global pointer by arranging for it
4515 1.1 mrg to point to the data we need to load. The complete trampoline
4516 1.1 mrg has the following form:
4517 1.1 mrg
4518 1.1 mrg +-------------------+ \
4519 1.1 mrg TRAMP: | __ia64_trampoline | |
4520 1.1 mrg +-------------------+ > fake function descriptor
4521 1.1 mrg | TRAMP+16 | |
4522 1.1 mrg +-------------------+ /
4523 1.1 mrg | target descriptor |
4524 1.1 mrg +-------------------+
4525 1.1 mrg | static link |
4526 1.1 mrg +-------------------+
4527 1.1 mrg */
4528 1.1 mrg
4529 1.1 mrg static void
4530 1.1 mrg ia64_trampoline_init (rtx m_tramp, tree fndecl, rtx static_chain)
4531 1.1 mrg {
4532 1.1 mrg rtx fnaddr = XEXP (DECL_RTL (fndecl), 0);
4533 1.1 mrg rtx addr, addr_reg, tramp, eight = GEN_INT (8);
4534 1.1 mrg
4535 1.1 mrg /* The Intel assembler requires that the global __ia64_trampoline symbol
4536 1.1 mrg be declared explicitly */
4537 1.1 mrg if (!TARGET_GNU_AS)
4538 1.1 mrg {
4539 1.1 mrg static bool declared_ia64_trampoline = false;
4540 1.1 mrg
4541 1.1 mrg if (!declared_ia64_trampoline)
4542 1.1 mrg {
4543 1.1 mrg declared_ia64_trampoline = true;
4544 1.1 mrg (*targetm.asm_out.globalize_label) (asm_out_file,
4545 1.1 mrg "__ia64_trampoline");
4546 1.1 mrg }
4547 1.1 mrg }
4548 1.1 mrg
4549 1.1 mrg /* Make sure addresses are Pmode even if we are in ILP32 mode. */
4550 1.1 mrg addr = convert_memory_address (Pmode, XEXP (m_tramp, 0));
4551 1.1 mrg fnaddr = convert_memory_address (Pmode, fnaddr);
4552 1.1 mrg static_chain = convert_memory_address (Pmode, static_chain);
4553 1.1 mrg
4554 1.1 mrg /* Load up our iterator. */
4555 1.1 mrg addr_reg = copy_to_reg (addr);
4556 1.1 mrg m_tramp = adjust_automodify_address (m_tramp, Pmode, addr_reg, 0);
4557 1.1 mrg
4558 1.1 mrg /* The first two words are the fake descriptor:
4559 1.1 mrg __ia64_trampoline, ADDR+16. */
4560 1.1 mrg tramp = gen_rtx_SYMBOL_REF (Pmode, "__ia64_trampoline");
4561 1.1 mrg if (TARGET_ABI_OPEN_VMS)
4562 1.1 mrg {
4563 1.1 mrg /* HP decided to break the ELF ABI on VMS (to deal with an ambiguity
4564 1.1 mrg in the Macro-32 compiler) and changed the semantics of the LTOFF22
4565 1.1 mrg relocation against function symbols to make it identical to the
4566 1.1 mrg LTOFF_FPTR22 relocation. Emit the latter directly to stay within
4567 1.1 mrg strict ELF and dereference to get the bare code address. */
4568 1.1 mrg rtx reg = gen_reg_rtx (Pmode);
4569 1.1 mrg SYMBOL_REF_FLAGS (tramp) |= SYMBOL_FLAG_FUNCTION;
4570 1.1 mrg emit_move_insn (reg, tramp);
4571 1.1 mrg emit_move_insn (reg, gen_rtx_MEM (Pmode, reg));
4572 1.1 mrg tramp = reg;
4573 1.1 mrg }
4574 1.1 mrg emit_move_insn (m_tramp, tramp);
4575 1.1 mrg emit_insn (gen_adddi3 (addr_reg, addr_reg, eight));
4576 1.1 mrg m_tramp = adjust_automodify_address (m_tramp, VOIDmode, NULL, 8);
4577 1.1 mrg
4578 1.1 mrg emit_move_insn (m_tramp, force_reg (Pmode, plus_constant (Pmode, addr, 16)));
4579 1.1 mrg emit_insn (gen_adddi3 (addr_reg, addr_reg, eight));
4580 1.1 mrg m_tramp = adjust_automodify_address (m_tramp, VOIDmode, NULL, 8);
4581 1.1 mrg
4582 1.1 mrg /* The third word is the target descriptor. */
4583 1.1 mrg emit_move_insn (m_tramp, force_reg (Pmode, fnaddr));
4584 1.1 mrg emit_insn (gen_adddi3 (addr_reg, addr_reg, eight));
4585 1.1 mrg m_tramp = adjust_automodify_address (m_tramp, VOIDmode, NULL, 8);
4586 1.1 mrg
4587 1.1 mrg /* The fourth word is the static chain. */
4588 1.1 mrg emit_move_insn (m_tramp, static_chain);
4589 1.1 mrg }
4590 1.1 mrg
4591 1.1 mrg /* Do any needed setup for a variadic function. CUM has not been updated
4593 1.1 mrg for the last named argument, which is given by ARG.
4594 1.1 mrg
4595 1.1 mrg We generate the actual spill instructions during prologue generation. */
4596 1.1 mrg
4597 1.1 mrg static void
4598 1.1 mrg ia64_setup_incoming_varargs (cumulative_args_t cum,
4599 1.1 mrg const function_arg_info &arg,
4600 1.1 mrg int *pretend_size,
4601 1.1 mrg int second_time ATTRIBUTE_UNUSED)
4602 1.1 mrg {
4603 1.1 mrg CUMULATIVE_ARGS next_cum = *get_cumulative_args (cum);
4604 1.1 mrg
4605 1.1 mrg /* Skip the current argument. */
4606 1.1 mrg ia64_function_arg_advance (pack_cumulative_args (&next_cum), arg);
4607 1.1 mrg
4608 1.1 mrg if (next_cum.words < MAX_ARGUMENT_SLOTS)
4609 1.1 mrg {
4610 1.1 mrg int n = MAX_ARGUMENT_SLOTS - next_cum.words;
4611 1.1 mrg *pretend_size = n * UNITS_PER_WORD;
4612 1.1 mrg cfun->machine->n_varargs = n;
4613 1.1 mrg }
4614 1.1 mrg }
4615 1.1 mrg
4616 1.1 mrg /* Check whether TYPE is a homogeneous floating point aggregate. If
4617 1.1 mrg it is, return the mode of the floating point type that appears
4618 1.1 mrg in all leafs. If it is not, return VOIDmode.
4619 1.1 mrg
4620 1.1 mrg An aggregate is a homogeneous floating point aggregate is if all
4621 1.1 mrg fields/elements in it have the same floating point type (e.g,
4622 1.1 mrg SFmode). 128-bit quad-precision floats are excluded.
4623 1.1 mrg
4624 1.1 mrg Variable sized aggregates should never arrive here, since we should
4625 1.1 mrg have already decided to pass them by reference. Top-level zero-sized
4626 1.1 mrg aggregates are excluded because our parallels crash the middle-end. */
4627 1.1 mrg
4628 1.1 mrg static machine_mode
4629 1.1 mrg hfa_element_mode (const_tree type, bool nested)
4630 1.1 mrg {
4631 1.1 mrg machine_mode element_mode = VOIDmode;
4632 1.1 mrg machine_mode mode;
4633 1.1 mrg enum tree_code code = TREE_CODE (type);
4634 1.1 mrg int know_element_mode = 0;
4635 1.1 mrg tree t;
4636 1.1 mrg
4637 1.1 mrg if (!nested && (!TYPE_SIZE (type) || integer_zerop (TYPE_SIZE (type))))
4638 1.1 mrg return VOIDmode;
4639 1.1 mrg
4640 1.1 mrg switch (code)
4641 1.1 mrg {
4642 1.1 mrg case VOID_TYPE: case INTEGER_TYPE: case ENUMERAL_TYPE:
4643 1.1 mrg case BOOLEAN_TYPE: case POINTER_TYPE:
4644 1.1 mrg case OFFSET_TYPE: case REFERENCE_TYPE: case METHOD_TYPE:
4645 1.1 mrg case LANG_TYPE: case FUNCTION_TYPE:
4646 1.1 mrg return VOIDmode;
4647 1.1 mrg
4648 1.1 mrg /* Fortran complex types are supposed to be HFAs, so we need to handle
4649 1.1 mrg gcc's COMPLEX_TYPEs as HFAs. We need to exclude the integral complex
4650 1.1 mrg types though. */
4651 1.1 mrg case COMPLEX_TYPE:
4652 1.1 mrg if (GET_MODE_CLASS (TYPE_MODE (type)) == MODE_COMPLEX_FLOAT
4653 1.1 mrg && TYPE_MODE (type) != TCmode)
4654 1.1 mrg return GET_MODE_INNER (TYPE_MODE (type));
4655 1.1 mrg else
4656 1.1 mrg return VOIDmode;
4657 1.1 mrg
4658 1.1 mrg case REAL_TYPE:
4659 1.1 mrg /* We want to return VOIDmode for raw REAL_TYPEs, but the actual
4660 1.1 mrg mode if this is contained within an aggregate. */
4661 1.1 mrg if (nested && TYPE_MODE (type) != TFmode)
4662 1.1 mrg return TYPE_MODE (type);
4663 1.1 mrg else
4664 1.1 mrg return VOIDmode;
4665 1.1 mrg
4666 1.1 mrg case ARRAY_TYPE:
4667 1.1 mrg return hfa_element_mode (TREE_TYPE (type), 1);
4668 1.1 mrg
4669 1.1 mrg case RECORD_TYPE:
4670 1.1 mrg case UNION_TYPE:
4671 1.1 mrg case QUAL_UNION_TYPE:
4672 1.1 mrg for (t = TYPE_FIELDS (type); t; t = DECL_CHAIN (t))
4673 1.1 mrg {
4674 1.1 mrg if (TREE_CODE (t) != FIELD_DECL || DECL_FIELD_ABI_IGNORED (t))
4675 1.1 mrg continue;
4676 1.1 mrg
4677 1.1 mrg mode = hfa_element_mode (TREE_TYPE (t), 1);
4678 1.1 mrg if (know_element_mode)
4679 1.1 mrg {
4680 1.1 mrg if (mode != element_mode)
4681 1.1 mrg return VOIDmode;
4682 1.1 mrg }
4683 1.1 mrg else if (GET_MODE_CLASS (mode) != MODE_FLOAT)
4684 1.1 mrg return VOIDmode;
4685 1.1 mrg else
4686 1.1 mrg {
4687 1.1 mrg know_element_mode = 1;
4688 1.1 mrg element_mode = mode;
4689 1.1 mrg }
4690 1.1 mrg }
4691 1.1 mrg return element_mode;
4692 1.1 mrg
4693 1.1 mrg default:
4694 1.1 mrg /* If we reach here, we probably have some front-end specific type
4695 1.1 mrg that the backend doesn't know about. This can happen via the
4696 1.1 mrg aggregate_value_p call in init_function_start. All we can do is
4697 1.1 mrg ignore unknown tree types. */
4698 1.1 mrg return VOIDmode;
4699 1.1 mrg }
4700 1.1 mrg
4701 1.1 mrg return VOIDmode;
4702 1.1 mrg }
4703 1.1 mrg
4704 1.1 mrg /* Return the number of words required to hold a quantity of TYPE and MODE
4705 1.1 mrg when passed as an argument. */
4706 1.1 mrg static int
4707 1.1 mrg ia64_function_arg_words (const_tree type, machine_mode mode)
4708 1.1 mrg {
4709 1.1 mrg int words;
4710 1.1 mrg
4711 1.1 mrg if (mode == BLKmode)
4712 1.1 mrg words = int_size_in_bytes (type);
4713 1.1 mrg else
4714 1.1 mrg words = GET_MODE_SIZE (mode);
4715 1.1 mrg
4716 1.1 mrg return (words + UNITS_PER_WORD - 1) / UNITS_PER_WORD; /* round up */
4717 1.1 mrg }
4718 1.1 mrg
4719 1.1 mrg /* Return the number of registers that should be skipped so the current
4720 1.1 mrg argument (described by TYPE and WORDS) will be properly aligned.
4721 1.1 mrg
4722 1.1 mrg Integer and float arguments larger than 8 bytes start at the next
4723 1.1 mrg even boundary. Aggregates larger than 8 bytes start at the next
4724 1.1 mrg even boundary if the aggregate has 16 byte alignment. Note that
4725 1.1 mrg in the 32-bit ABI, TImode and TFmode have only 8-byte alignment
4726 1.1 mrg but are still to be aligned in registers.
4727 1.1 mrg
4728 1.1 mrg ??? The ABI does not specify how to handle aggregates with
4729 1.1 mrg alignment from 9 to 15 bytes, or greater than 16. We handle them
4730 1.1 mrg all as if they had 16 byte alignment. Such aggregates can occur
4731 1.1 mrg only if gcc extensions are used. */
4732 1.1 mrg static int
4733 1.1 mrg ia64_function_arg_offset (const CUMULATIVE_ARGS *cum,
4734 1.1 mrg const_tree type, int words)
4735 1.1 mrg {
4736 1.1 mrg /* No registers are skipped on VMS. */
4737 1.1 mrg if (TARGET_ABI_OPEN_VMS || (cum->words & 1) == 0)
4738 1.1 mrg return 0;
4739 1.1 mrg
4740 1.1 mrg if (type
4741 1.1 mrg && TREE_CODE (type) != INTEGER_TYPE
4742 1.1 mrg && TREE_CODE (type) != REAL_TYPE)
4743 1.1 mrg return TYPE_ALIGN (type) > 8 * BITS_PER_UNIT;
4744 1.1 mrg else
4745 1.1 mrg return words > 1;
4746 1.1 mrg }
4747 1.1 mrg
4748 1.1 mrg /* Return rtx for register where argument is passed, or zero if it is passed
4749 1.1 mrg on the stack. */
4750 1.1 mrg /* ??? 128-bit quad-precision floats are always passed in general
4751 1.1 mrg registers. */
4752 1.1 mrg
4753 1.1 mrg static rtx
4754 1.1 mrg ia64_function_arg_1 (cumulative_args_t cum_v, const function_arg_info &arg,
4755 1.1 mrg bool incoming)
4756 1.1 mrg {
4757 1.1 mrg const CUMULATIVE_ARGS *cum = get_cumulative_args (cum_v);
4758 1.1 mrg
4759 1.1 mrg int basereg = (incoming ? GR_ARG_FIRST : AR_ARG_FIRST);
4760 1.1 mrg int words = ia64_function_arg_words (arg.type, arg.mode);
4761 1.1 mrg int offset = ia64_function_arg_offset (cum, arg.type, words);
4762 1.1 mrg machine_mode hfa_mode = VOIDmode;
4763 1.1 mrg
4764 1.1 mrg /* For OPEN VMS, emit the instruction setting up the argument register here,
4765 1.1 mrg when we know this will be together with the other arguments setup related
4766 1.1 mrg insns. This is not the conceptually best place to do this, but this is
4767 1.1 mrg the easiest as we have convenient access to cumulative args info. */
4768 1.1 mrg
4769 1.1 mrg if (TARGET_ABI_OPEN_VMS && arg.end_marker_p ())
4770 1.1 mrg {
4771 1.1 mrg unsigned HOST_WIDE_INT regval = cum->words;
4772 1.1 mrg int i;
4773 1.1 mrg
4774 1.1 mrg for (i = 0; i < 8; i++)
4775 1.1 mrg regval |= ((int) cum->atypes[i]) << (i * 3 + 8);
4776 1.1 mrg
4777 1.1 mrg emit_move_insn (gen_rtx_REG (DImode, GR_REG (25)),
4778 1.1 mrg GEN_INT (regval));
4779 1.1 mrg }
4780 1.1 mrg
4781 1.1 mrg /* If all argument slots are used, then it must go on the stack. */
4782 1.1 mrg if (cum->words + offset >= MAX_ARGUMENT_SLOTS)
4783 1.1 mrg return 0;
4784 1.1 mrg
4785 1.1 mrg /* On OpenVMS argument is either in Rn or Fn. */
4786 1.1 mrg if (TARGET_ABI_OPEN_VMS)
4787 1.1 mrg {
4788 1.1 mrg if (FLOAT_MODE_P (arg.mode))
4789 1.1 mrg return gen_rtx_REG (arg.mode, FR_ARG_FIRST + cum->words);
4790 1.1 mrg else
4791 1.1 mrg return gen_rtx_REG (arg.mode, basereg + cum->words);
4792 1.1 mrg }
4793 1.1 mrg
4794 1.1 mrg /* Check for and handle homogeneous FP aggregates. */
4795 1.1 mrg if (arg.type)
4796 1.1 mrg hfa_mode = hfa_element_mode (arg.type, 0);
4797 1.1 mrg
4798 1.1 mrg /* Unnamed prototyped hfas are passed as usual. Named prototyped hfas
4799 1.1 mrg and unprototyped hfas are passed specially. */
4800 1.1 mrg if (hfa_mode != VOIDmode && (! cum->prototype || arg.named))
4801 1.1 mrg {
4802 1.1 mrg rtx loc[16];
4803 1.1 mrg int i = 0;
4804 1.1 mrg int fp_regs = cum->fp_regs;
4805 1.1 mrg int int_regs = cum->words + offset;
4806 1.1 mrg int hfa_size = GET_MODE_SIZE (hfa_mode);
4807 1.1 mrg int byte_size;
4808 1.1 mrg int args_byte_size;
4809 1.1 mrg
4810 1.1 mrg /* If prototyped, pass it in FR regs then GR regs.
4811 1.1 mrg If not prototyped, pass it in both FR and GR regs.
4812 1.1 mrg
4813 1.1 mrg If this is an SFmode aggregate, then it is possible to run out of
4814 1.1 mrg FR regs while GR regs are still left. In that case, we pass the
4815 1.1 mrg remaining part in the GR regs. */
4816 1.1 mrg
4817 1.1 mrg /* Fill the FP regs. We do this always. We stop if we reach the end
4818 1.1 mrg of the argument, the last FP register, or the last argument slot. */
4819 1.1 mrg
4820 1.1 mrg byte_size = arg.promoted_size_in_bytes ();
4821 1.1 mrg args_byte_size = int_regs * UNITS_PER_WORD;
4822 1.1 mrg offset = 0;
4823 1.1 mrg for (; (offset < byte_size && fp_regs < MAX_ARGUMENT_SLOTS
4824 1.1 mrg && args_byte_size < (MAX_ARGUMENT_SLOTS * UNITS_PER_WORD)); i++)
4825 1.1 mrg {
4826 1.1 mrg loc[i] = gen_rtx_EXPR_LIST (VOIDmode,
4827 1.1 mrg gen_rtx_REG (hfa_mode, (FR_ARG_FIRST
4828 1.1 mrg + fp_regs)),
4829 1.1 mrg GEN_INT (offset));
4830 1.1 mrg offset += hfa_size;
4831 1.1 mrg args_byte_size += hfa_size;
4832 1.1 mrg fp_regs++;
4833 1.1 mrg }
4834 1.1 mrg
4835 1.1 mrg /* If no prototype, then the whole thing must go in GR regs. */
4836 1.1 mrg if (! cum->prototype)
4837 1.1 mrg offset = 0;
4838 1.1 mrg /* If this is an SFmode aggregate, then we might have some left over
4839 1.1 mrg that needs to go in GR regs. */
4840 1.1 mrg else if (byte_size != offset)
4841 1.1 mrg int_regs += offset / UNITS_PER_WORD;
4842 1.1 mrg
4843 1.1 mrg /* Fill in the GR regs. We must use DImode here, not the hfa mode. */
4844 1.1 mrg
4845 1.1 mrg for (; offset < byte_size && int_regs < MAX_ARGUMENT_SLOTS; i++)
4846 1.1 mrg {
4847 1.1 mrg machine_mode gr_mode = DImode;
4848 1.1 mrg unsigned int gr_size;
4849 1.1 mrg
4850 1.1 mrg /* If we have an odd 4 byte hunk because we ran out of FR regs,
4851 1.1 mrg then this goes in a GR reg left adjusted/little endian, right
4852 1.1 mrg adjusted/big endian. */
4853 1.1 mrg /* ??? Currently this is handled wrong, because 4-byte hunks are
4854 1.1 mrg always right adjusted/little endian. */
4855 1.1 mrg if (offset & 0x4)
4856 1.1 mrg gr_mode = SImode;
4857 1.1 mrg /* If we have an even 4 byte hunk because the aggregate is a
4858 1.1 mrg multiple of 4 bytes in size, then this goes in a GR reg right
4859 1.1 mrg adjusted/little endian. */
4860 1.1 mrg else if (byte_size - offset == 4)
4861 1.1 mrg gr_mode = SImode;
4862 1.1 mrg
4863 1.1 mrg loc[i] = gen_rtx_EXPR_LIST (VOIDmode,
4864 1.1 mrg gen_rtx_REG (gr_mode, (basereg
4865 1.1 mrg + int_regs)),
4866 1.1 mrg GEN_INT (offset));
4867 1.1 mrg
4868 1.1 mrg gr_size = GET_MODE_SIZE (gr_mode);
4869 1.1 mrg offset += gr_size;
4870 1.1 mrg if (gr_size == UNITS_PER_WORD
4871 1.1 mrg || (gr_size < UNITS_PER_WORD && offset % UNITS_PER_WORD == 0))
4872 1.1 mrg int_regs++;
4873 1.1 mrg else if (gr_size > UNITS_PER_WORD)
4874 1.1 mrg int_regs += gr_size / UNITS_PER_WORD;
4875 1.1 mrg }
4876 1.1 mrg return gen_rtx_PARALLEL (arg.mode, gen_rtvec_v (i, loc));
4877 1.1 mrg }
4878 1.1 mrg
4879 1.1 mrg /* Integral and aggregates go in general registers. If we have run out of
4880 1.1 mrg FR registers, then FP values must also go in general registers. This can
4881 1.1 mrg happen when we have a SFmode HFA. */
4882 1.1 mrg else if (arg.mode == TFmode || arg.mode == TCmode
4883 1.1 mrg || !FLOAT_MODE_P (arg.mode)
4884 1.1 mrg || cum->fp_regs == MAX_ARGUMENT_SLOTS)
4885 1.1 mrg {
4886 1.1 mrg int byte_size = arg.promoted_size_in_bytes ();
4887 1.1 mrg if (BYTES_BIG_ENDIAN
4888 1.1 mrg && (arg.mode == BLKmode || arg.aggregate_type_p ())
4889 1.1 mrg && byte_size < UNITS_PER_WORD
4890 1.1 mrg && byte_size > 0)
4891 1.1 mrg {
4892 1.1 mrg rtx gr_reg = gen_rtx_EXPR_LIST (VOIDmode,
4893 1.1 mrg gen_rtx_REG (DImode,
4894 1.1 mrg (basereg + cum->words
4895 1.1 mrg + offset)),
4896 1.1 mrg const0_rtx);
4897 1.1 mrg return gen_rtx_PARALLEL (arg.mode, gen_rtvec (1, gr_reg));
4898 1.1 mrg }
4899 1.1 mrg else
4900 1.1 mrg return gen_rtx_REG (arg.mode, basereg + cum->words + offset);
4901 1.1 mrg
4902 1.1 mrg }
4903 1.1 mrg
4904 1.1 mrg /* If there is a prototype, then FP values go in a FR register when
4905 1.1 mrg named, and in a GR register when unnamed. */
4906 1.1 mrg else if (cum->prototype)
4907 1.1 mrg {
4908 1.1 mrg if (arg.named)
4909 1.1 mrg return gen_rtx_REG (arg.mode, FR_ARG_FIRST + cum->fp_regs);
4910 1.1 mrg /* In big-endian mode, an anonymous SFmode value must be represented
4911 1.1 mrg as (parallel:SF [(expr_list (reg:DI n) (const_int 0))]) to force
4912 1.1 mrg the value into the high half of the general register. */
4913 1.1 mrg else if (BYTES_BIG_ENDIAN && arg.mode == SFmode)
4914 1.1 mrg return gen_rtx_PARALLEL (arg.mode,
4915 1.1 mrg gen_rtvec (1,
4916 1.1 mrg gen_rtx_EXPR_LIST (VOIDmode,
4917 1.1 mrg gen_rtx_REG (DImode, basereg + cum->words + offset),
4918 1.1 mrg const0_rtx)));
4919 1.1 mrg else
4920 1.1 mrg return gen_rtx_REG (arg.mode, basereg + cum->words + offset);
4921 1.1 mrg }
4922 1.1 mrg /* If there is no prototype, then FP values go in both FR and GR
4923 1.1 mrg registers. */
4924 1.1 mrg else
4925 1.1 mrg {
4926 1.1 mrg /* See comment above. */
4927 1.1 mrg machine_mode inner_mode =
4928 1.1 mrg (BYTES_BIG_ENDIAN && arg.mode == SFmode) ? DImode : arg.mode;
4929 1.1 mrg
4930 1.1 mrg rtx fp_reg = gen_rtx_EXPR_LIST (VOIDmode,
4931 1.1 mrg gen_rtx_REG (arg.mode, (FR_ARG_FIRST
4932 1.1 mrg + cum->fp_regs)),
4933 1.1 mrg const0_rtx);
4934 1.1 mrg rtx gr_reg = gen_rtx_EXPR_LIST (VOIDmode,
4935 1.1 mrg gen_rtx_REG (inner_mode,
4936 1.1 mrg (basereg + cum->words
4937 1.1 mrg + offset)),
4938 1.1 mrg const0_rtx);
4939 1.1 mrg
4940 1.1 mrg return gen_rtx_PARALLEL (arg.mode, gen_rtvec (2, fp_reg, gr_reg));
4941 1.1 mrg }
4942 1.1 mrg }
4943 1.1 mrg
4944 1.1 mrg /* Implement TARGET_FUNCION_ARG target hook. */
4945 1.1 mrg
4946 1.1 mrg static rtx
4947 1.1 mrg ia64_function_arg (cumulative_args_t cum, const function_arg_info &arg)
4948 1.1 mrg {
4949 1.1 mrg return ia64_function_arg_1 (cum, arg, false);
4950 1.1 mrg }
4951 1.1 mrg
4952 1.1 mrg /* Implement TARGET_FUNCION_INCOMING_ARG target hook. */
4953 1.1 mrg
4954 1.1 mrg static rtx
4955 1.1 mrg ia64_function_incoming_arg (cumulative_args_t cum,
4956 1.1 mrg const function_arg_info &arg)
4957 1.1 mrg {
4958 1.1 mrg return ia64_function_arg_1 (cum, arg, true);
4959 1.1 mrg }
4960 1.1 mrg
4961 1.1 mrg /* Return number of bytes, at the beginning of the argument, that must be
4962 1.1 mrg put in registers. 0 is the argument is entirely in registers or entirely
4963 1.1 mrg in memory. */
4964 1.1 mrg
4965 1.1 mrg static int
4966 1.1 mrg ia64_arg_partial_bytes (cumulative_args_t cum_v, const function_arg_info &arg)
4967 1.1 mrg {
4968 1.1 mrg CUMULATIVE_ARGS *cum = get_cumulative_args (cum_v);
4969 1.1 mrg
4970 1.1 mrg int words = ia64_function_arg_words (arg.type, arg.mode);
4971 1.1 mrg int offset = ia64_function_arg_offset (cum, arg.type, words);
4972 1.1 mrg
4973 1.1 mrg /* If all argument slots are used, then it must go on the stack. */
4974 1.1 mrg if (cum->words + offset >= MAX_ARGUMENT_SLOTS)
4975 1.1 mrg return 0;
4976 1.1 mrg
4977 1.1 mrg /* It doesn't matter whether the argument goes in FR or GR regs. If
4978 1.1 mrg it fits within the 8 argument slots, then it goes entirely in
4979 1.1 mrg registers. If it extends past the last argument slot, then the rest
4980 1.1 mrg goes on the stack. */
4981 1.1 mrg
4982 1.1 mrg if (words + cum->words + offset <= MAX_ARGUMENT_SLOTS)
4983 1.1 mrg return 0;
4984 1.1 mrg
4985 1.1 mrg return (MAX_ARGUMENT_SLOTS - cum->words - offset) * UNITS_PER_WORD;
4986 1.1 mrg }
4987 1.1 mrg
4988 1.1 mrg /* Return ivms_arg_type based on machine_mode. */
4989 1.1 mrg
4990 1.1 mrg static enum ivms_arg_type
4991 1.1 mrg ia64_arg_type (machine_mode mode)
4992 1.1 mrg {
4993 1.1 mrg switch (mode)
4994 1.1 mrg {
4995 1.1 mrg case E_SFmode:
4996 1.1 mrg return FS;
4997 1.1 mrg case E_DFmode:
4998 1.1 mrg return FT;
4999 1.1 mrg default:
5000 1.1 mrg return I64;
5001 1.1 mrg }
5002 1.1 mrg }
5003 1.1 mrg
5004 1.1 mrg /* Update CUM to point after this argument. This is patterned after
5005 1.1 mrg ia64_function_arg. */
5006 1.1 mrg
5007 1.1 mrg static void
5008 1.1 mrg ia64_function_arg_advance (cumulative_args_t cum_v,
5009 1.1 mrg const function_arg_info &arg)
5010 1.1 mrg {
5011 1.1 mrg CUMULATIVE_ARGS *cum = get_cumulative_args (cum_v);
5012 1.1 mrg int words = ia64_function_arg_words (arg.type, arg.mode);
5013 1.1 mrg int offset = ia64_function_arg_offset (cum, arg.type, words);
5014 1.1 mrg machine_mode hfa_mode = VOIDmode;
5015 1.1 mrg
5016 1.1 mrg /* If all arg slots are already full, then there is nothing to do. */
5017 1.1 mrg if (cum->words >= MAX_ARGUMENT_SLOTS)
5018 1.1 mrg {
5019 1.1 mrg cum->words += words + offset;
5020 1.1 mrg return;
5021 1.1 mrg }
5022 1.1 mrg
5023 1.1 mrg cum->atypes[cum->words] = ia64_arg_type (arg.mode);
5024 1.1 mrg cum->words += words + offset;
5025 1.1 mrg
5026 1.1 mrg /* On OpenVMS argument is either in Rn or Fn. */
5027 1.1 mrg if (TARGET_ABI_OPEN_VMS)
5028 1.1 mrg {
5029 1.1 mrg cum->int_regs = cum->words;
5030 1.1 mrg cum->fp_regs = cum->words;
5031 1.1 mrg return;
5032 1.1 mrg }
5033 1.1 mrg
5034 1.1 mrg /* Check for and handle homogeneous FP aggregates. */
5035 1.1 mrg if (arg.type)
5036 1.1 mrg hfa_mode = hfa_element_mode (arg.type, 0);
5037 1.1 mrg
5038 1.1 mrg /* Unnamed prototyped hfas are passed as usual. Named prototyped hfas
5039 1.1 mrg and unprototyped hfas are passed specially. */
5040 1.1 mrg if (hfa_mode != VOIDmode && (! cum->prototype || arg.named))
5041 1.1 mrg {
5042 1.1 mrg int fp_regs = cum->fp_regs;
5043 1.1 mrg /* This is the original value of cum->words + offset. */
5044 1.1 mrg int int_regs = cum->words - words;
5045 1.1 mrg int hfa_size = GET_MODE_SIZE (hfa_mode);
5046 1.1 mrg int byte_size;
5047 1.1 mrg int args_byte_size;
5048 1.1 mrg
5049 1.1 mrg /* If prototyped, pass it in FR regs then GR regs.
5050 1.1 mrg If not prototyped, pass it in both FR and GR regs.
5051 1.1 mrg
5052 1.1 mrg If this is an SFmode aggregate, then it is possible to run out of
5053 1.1 mrg FR regs while GR regs are still left. In that case, we pass the
5054 1.1 mrg remaining part in the GR regs. */
5055 1.1 mrg
5056 1.1 mrg /* Fill the FP regs. We do this always. We stop if we reach the end
5057 1.1 mrg of the argument, the last FP register, or the last argument slot. */
5058 1.1 mrg
5059 1.1 mrg byte_size = arg.promoted_size_in_bytes ();
5060 1.1 mrg args_byte_size = int_regs * UNITS_PER_WORD;
5061 1.1 mrg offset = 0;
5062 1.1 mrg for (; (offset < byte_size && fp_regs < MAX_ARGUMENT_SLOTS
5063 1.1 mrg && args_byte_size < (MAX_ARGUMENT_SLOTS * UNITS_PER_WORD));)
5064 1.1 mrg {
5065 1.1 mrg offset += hfa_size;
5066 1.1 mrg args_byte_size += hfa_size;
5067 1.1 mrg fp_regs++;
5068 1.1 mrg }
5069 1.1 mrg
5070 1.1 mrg cum->fp_regs = fp_regs;
5071 1.1 mrg }
5072 1.1 mrg
5073 1.1 mrg /* Integral and aggregates go in general registers. So do TFmode FP values.
5074 1.1 mrg If we have run out of FR registers, then other FP values must also go in
5075 1.1 mrg general registers. This can happen when we have a SFmode HFA. */
5076 1.1 mrg else if (arg.mode == TFmode || arg.mode == TCmode
5077 1.1 mrg || !FLOAT_MODE_P (arg.mode)
5078 1.1 mrg || cum->fp_regs == MAX_ARGUMENT_SLOTS)
5079 1.1 mrg cum->int_regs = cum->words;
5080 1.1 mrg
5081 1.1 mrg /* If there is a prototype, then FP values go in a FR register when
5082 1.1 mrg named, and in a GR register when unnamed. */
5083 1.1 mrg else if (cum->prototype)
5084 1.1 mrg {
5085 1.1 mrg if (! arg.named)
5086 1.1 mrg cum->int_regs = cum->words;
5087 1.1 mrg else
5088 1.1 mrg /* ??? Complex types should not reach here. */
5089 1.1 mrg cum->fp_regs
5090 1.1 mrg += (GET_MODE_CLASS (arg.mode) == MODE_COMPLEX_FLOAT ? 2 : 1);
5091 1.1 mrg }
5092 1.1 mrg /* If there is no prototype, then FP values go in both FR and GR
5093 1.1 mrg registers. */
5094 1.1 mrg else
5095 1.1 mrg {
5096 1.1 mrg /* ??? Complex types should not reach here. */
5097 1.1 mrg cum->fp_regs
5098 1.1 mrg += (GET_MODE_CLASS (arg.mode) == MODE_COMPLEX_FLOAT ? 2 : 1);
5099 1.1 mrg cum->int_regs = cum->words;
5100 1.1 mrg }
5101 1.1 mrg }
5102 1.1 mrg
5103 1.1 mrg /* Arguments with alignment larger than 8 bytes start at the next even
5104 1.1 mrg boundary. On ILP32 HPUX, TFmode arguments start on next even boundary
5105 1.1 mrg even though their normal alignment is 8 bytes. See ia64_function_arg. */
5106 1.1 mrg
5107 1.1 mrg static unsigned int
5108 1.1 mrg ia64_function_arg_boundary (machine_mode mode, const_tree type)
5109 1.1 mrg {
5110 1.1 mrg if (mode == TFmode && TARGET_HPUX && TARGET_ILP32)
5111 1.1 mrg return PARM_BOUNDARY * 2;
5112 1.1 mrg
5113 1.1 mrg if (type)
5114 1.1 mrg {
5115 1.1 mrg if (TYPE_ALIGN (type) > PARM_BOUNDARY)
5116 1.1 mrg return PARM_BOUNDARY * 2;
5117 1.1 mrg else
5118 1.1 mrg return PARM_BOUNDARY;
5119 1.1 mrg }
5120 1.1 mrg
5121 1.1 mrg if (GET_MODE_BITSIZE (mode) > PARM_BOUNDARY)
5122 1.1 mrg return PARM_BOUNDARY * 2;
5123 1.1 mrg else
5124 1.1 mrg return PARM_BOUNDARY;
5125 1.1 mrg }
5126 1.1 mrg
5127 1.1 mrg /* True if it is OK to do sibling call optimization for the specified
5128 1.1 mrg call expression EXP. DECL will be the called function, or NULL if
5129 1.1 mrg this is an indirect call. */
5130 1.1 mrg static bool
5131 1.1 mrg ia64_function_ok_for_sibcall (tree decl, tree exp ATTRIBUTE_UNUSED)
5132 1.1 mrg {
5133 1.1 mrg /* We can't perform a sibcall if the current function has the syscall_linkage
5134 1.1 mrg attribute. */
5135 1.1 mrg if (lookup_attribute ("syscall_linkage",
5136 1.1 mrg TYPE_ATTRIBUTES (TREE_TYPE (current_function_decl))))
5137 1.1 mrg return false;
5138 1.1 mrg
5139 1.1 mrg /* We must always return with our current GP. This means we can
5140 1.1 mrg only sibcall to functions defined in the current module unless
5141 1.1 mrg TARGET_CONST_GP is set to true. */
5142 1.1 mrg return (decl && (*targetm.binds_local_p) (decl)) || TARGET_CONST_GP;
5143 1.1 mrg }
5144 1.1 mrg
5145 1.1 mrg
5147 1.1 mrg /* Implement va_arg. */
5148 1.1 mrg
5149 1.1 mrg static tree
5150 1.1 mrg ia64_gimplify_va_arg (tree valist, tree type, gimple_seq *pre_p,
5151 1.1 mrg gimple_seq *post_p)
5152 1.1 mrg {
5153 1.1 mrg /* Variable sized types are passed by reference. */
5154 1.1 mrg if (pass_va_arg_by_reference (type))
5155 1.1 mrg {
5156 1.1 mrg tree ptrtype = build_pointer_type (type);
5157 1.1 mrg tree addr = std_gimplify_va_arg_expr (valist, ptrtype, pre_p, post_p);
5158 1.1 mrg return build_va_arg_indirect_ref (addr);
5159 1.1 mrg }
5160 1.1 mrg
5161 1.1 mrg /* Aggregate arguments with alignment larger than 8 bytes start at
5162 1.1 mrg the next even boundary. Integer and floating point arguments
5163 1.1 mrg do so if they are larger than 8 bytes, whether or not they are
5164 1.1 mrg also aligned larger than 8 bytes. */
5165 1.1 mrg if ((TREE_CODE (type) == REAL_TYPE || TREE_CODE (type) == INTEGER_TYPE)
5166 1.1 mrg ? int_size_in_bytes (type) > 8 : TYPE_ALIGN (type) > 8 * BITS_PER_UNIT)
5167 1.1 mrg {
5168 1.1 mrg tree t = fold_build_pointer_plus_hwi (valist, 2 * UNITS_PER_WORD - 1);
5169 1.1 mrg t = build2 (BIT_AND_EXPR, TREE_TYPE (t), t,
5170 1.1 mrg build_int_cst (TREE_TYPE (t), -2 * UNITS_PER_WORD));
5171 1.1 mrg gimplify_assign (unshare_expr (valist), t, pre_p);
5172 1.1 mrg }
5173 1.1 mrg
5174 1.1 mrg return std_gimplify_va_arg_expr (valist, type, pre_p, post_p);
5175 1.1 mrg }
5176 1.1 mrg
5177 1.1 mrg /* Return 1 if function return value returned in memory. Return 0 if it is
5179 1.1 mrg in a register. */
5180 1.1 mrg
5181 1.1 mrg static bool
5182 1.1 mrg ia64_return_in_memory (const_tree valtype, const_tree fntype ATTRIBUTE_UNUSED)
5183 1.1 mrg {
5184 1.1 mrg machine_mode mode;
5185 1.1 mrg machine_mode hfa_mode;
5186 1.1 mrg HOST_WIDE_INT byte_size;
5187 1.1 mrg
5188 1.1 mrg mode = TYPE_MODE (valtype);
5189 1.1 mrg byte_size = GET_MODE_SIZE (mode);
5190 1.1 mrg if (mode == BLKmode)
5191 1.1 mrg {
5192 1.1 mrg byte_size = int_size_in_bytes (valtype);
5193 1.1 mrg if (byte_size < 0)
5194 1.1 mrg return true;
5195 1.1 mrg }
5196 1.1 mrg
5197 1.1 mrg /* Hfa's with up to 8 elements are returned in the FP argument registers. */
5198 1.1 mrg
5199 1.1 mrg hfa_mode = hfa_element_mode (valtype, 0);
5200 1.1 mrg if (hfa_mode != VOIDmode)
5201 1.1 mrg {
5202 1.1 mrg int hfa_size = GET_MODE_SIZE (hfa_mode);
5203 1.1 mrg
5204 1.1 mrg if (byte_size / hfa_size > MAX_ARGUMENT_SLOTS)
5205 1.1 mrg return true;
5206 1.1 mrg else
5207 1.1 mrg return false;
5208 1.1 mrg }
5209 1.1 mrg else if (byte_size > UNITS_PER_WORD * MAX_INT_RETURN_SLOTS)
5210 1.1 mrg return true;
5211 1.1 mrg else
5212 1.1 mrg return false;
5213 1.1 mrg }
5214 1.1 mrg
5215 1.1 mrg /* Return rtx for register that holds the function return value. */
5216 1.1 mrg
5217 1.1 mrg static rtx
5218 1.1 mrg ia64_function_value (const_tree valtype,
5219 1.1 mrg const_tree fn_decl_or_type,
5220 1.1 mrg bool outgoing ATTRIBUTE_UNUSED)
5221 1.1 mrg {
5222 1.1 mrg machine_mode mode;
5223 1.1 mrg machine_mode hfa_mode;
5224 1.1 mrg int unsignedp;
5225 1.1 mrg const_tree func = fn_decl_or_type;
5226 1.1 mrg
5227 1.1 mrg if (fn_decl_or_type
5228 1.1 mrg && !DECL_P (fn_decl_or_type))
5229 1.1 mrg func = NULL;
5230 1.1 mrg
5231 1.1 mrg mode = TYPE_MODE (valtype);
5232 1.1 mrg hfa_mode = hfa_element_mode (valtype, 0);
5233 1.1 mrg
5234 1.1 mrg if (hfa_mode != VOIDmode)
5235 1.1 mrg {
5236 1.1 mrg rtx loc[8];
5237 1.1 mrg int i;
5238 1.1 mrg int hfa_size;
5239 1.1 mrg int byte_size;
5240 1.1 mrg int offset;
5241 1.1 mrg
5242 1.1 mrg hfa_size = GET_MODE_SIZE (hfa_mode);
5243 1.1 mrg byte_size = ((mode == BLKmode)
5244 1.1 mrg ? int_size_in_bytes (valtype) : GET_MODE_SIZE (mode));
5245 1.1 mrg offset = 0;
5246 1.1 mrg for (i = 0; offset < byte_size; i++)
5247 1.1 mrg {
5248 1.1 mrg loc[i] = gen_rtx_EXPR_LIST (VOIDmode,
5249 1.1 mrg gen_rtx_REG (hfa_mode, FR_ARG_FIRST + i),
5250 1.1 mrg GEN_INT (offset));
5251 1.1 mrg offset += hfa_size;
5252 1.1 mrg }
5253 1.1 mrg return gen_rtx_PARALLEL (mode, gen_rtvec_v (i, loc));
5254 1.1 mrg }
5255 1.1 mrg else if (FLOAT_TYPE_P (valtype) && mode != TFmode && mode != TCmode)
5256 1.1 mrg return gen_rtx_REG (mode, FR_ARG_FIRST);
5257 1.1 mrg else
5258 1.1 mrg {
5259 1.1 mrg bool need_parallel = false;
5260 1.1 mrg
5261 1.1 mrg /* In big-endian mode, we need to manage the layout of aggregates
5262 1.1 mrg in the registers so that we get the bits properly aligned in
5263 1.1 mrg the highpart of the registers. */
5264 1.1 mrg if (BYTES_BIG_ENDIAN
5265 1.1 mrg && (mode == BLKmode || (valtype && AGGREGATE_TYPE_P (valtype))))
5266 1.1 mrg need_parallel = true;
5267 1.1 mrg
5268 1.1 mrg /* Something like struct S { long double x; char a[0] } is not an
5269 1.1 mrg HFA structure, and therefore doesn't go in fp registers. But
5270 1.1 mrg the middle-end will give it XFmode anyway, and XFmode values
5271 1.1 mrg don't normally fit in integer registers. So we need to smuggle
5272 1.1 mrg the value inside a parallel. */
5273 1.1 mrg else if (mode == XFmode || mode == XCmode || mode == RFmode)
5274 1.1 mrg need_parallel = true;
5275 1.1 mrg
5276 1.1 mrg if (need_parallel)
5277 1.1 mrg {
5278 1.1 mrg rtx loc[8];
5279 1.1 mrg int offset;
5280 1.1 mrg int bytesize;
5281 1.1 mrg int i;
5282 1.1 mrg
5283 1.1 mrg offset = 0;
5284 1.1 mrg bytesize = int_size_in_bytes (valtype);
5285 1.1 mrg /* An empty PARALLEL is invalid here, but the return value
5286 1.1 mrg doesn't matter for empty structs. */
5287 1.1 mrg if (bytesize == 0)
5288 1.1 mrg return gen_rtx_REG (mode, GR_RET_FIRST);
5289 1.1 mrg for (i = 0; offset < bytesize; i++)
5290 1.1 mrg {
5291 1.1 mrg loc[i] = gen_rtx_EXPR_LIST (VOIDmode,
5292 1.1 mrg gen_rtx_REG (DImode,
5293 1.1 mrg GR_RET_FIRST + i),
5294 1.1 mrg GEN_INT (offset));
5295 1.1 mrg offset += UNITS_PER_WORD;
5296 1.1 mrg }
5297 1.1 mrg return gen_rtx_PARALLEL (mode, gen_rtvec_v (i, loc));
5298 1.1 mrg }
5299 1.1 mrg
5300 1.1 mrg mode = promote_function_mode (valtype, mode, &unsignedp,
5301 1.1 mrg func ? TREE_TYPE (func) : NULL_TREE,
5302 1.1 mrg true);
5303 1.1 mrg
5304 1.1 mrg return gen_rtx_REG (mode, GR_RET_FIRST);
5305 1.1 mrg }
5306 1.1 mrg }
5307 1.1 mrg
5308 1.1 mrg /* Worker function for TARGET_LIBCALL_VALUE. */
5309 1.1 mrg
5310 1.1 mrg static rtx
5311 1.1 mrg ia64_libcall_value (machine_mode mode,
5312 1.1 mrg const_rtx fun ATTRIBUTE_UNUSED)
5313 1.1 mrg {
5314 1.1 mrg return gen_rtx_REG (mode,
5315 1.1 mrg (((GET_MODE_CLASS (mode) == MODE_FLOAT
5316 1.1 mrg || GET_MODE_CLASS (mode) == MODE_COMPLEX_FLOAT)
5317 1.1 mrg && (mode) != TFmode)
5318 1.1 mrg ? FR_RET_FIRST : GR_RET_FIRST));
5319 1.1 mrg }
5320 1.1 mrg
5321 1.1 mrg /* Worker function for FUNCTION_VALUE_REGNO_P. */
5322 1.1 mrg
5323 1.1 mrg static bool
5324 1.1 mrg ia64_function_value_regno_p (const unsigned int regno)
5325 1.1 mrg {
5326 1.1 mrg return ((regno >= GR_RET_FIRST && regno <= GR_RET_LAST)
5327 1.1 mrg || (regno >= FR_RET_FIRST && regno <= FR_RET_LAST));
5328 1.1 mrg }
5329 1.1 mrg
5330 1.1 mrg /* This is called from dwarf2out.cc via TARGET_ASM_OUTPUT_DWARF_DTPREL.
5331 1.1 mrg We need to emit DTP-relative relocations. */
5332 1.1 mrg
5333 1.1 mrg static void
5334 1.1 mrg ia64_output_dwarf_dtprel (FILE *file, int size, rtx x)
5335 1.1 mrg {
5336 1.1 mrg gcc_assert (size == 4 || size == 8);
5337 1.1 mrg if (size == 4)
5338 1.1 mrg fputs ("\tdata4.ua\t@dtprel(", file);
5339 1.1 mrg else
5340 1.1 mrg fputs ("\tdata8.ua\t@dtprel(", file);
5341 1.1 mrg output_addr_const (file, x);
5342 1.1 mrg fputs (")", file);
5343 1.1 mrg }
5344 1.1 mrg
5345 1.1 mrg /* Print a memory address as an operand to reference that memory location. */
5346 1.1 mrg
5347 1.1 mrg /* ??? Do we need this? It gets used only for 'a' operands. We could perhaps
5348 1.1 mrg also call this from ia64_print_operand for memory addresses. */
5349 1.1 mrg
5350 1.1 mrg static void
5351 1.1 mrg ia64_print_operand_address (FILE * stream ATTRIBUTE_UNUSED,
5352 1.1 mrg machine_mode /*mode*/,
5353 1.1 mrg rtx address ATTRIBUTE_UNUSED)
5354 1.1 mrg {
5355 1.1 mrg }
5356 1.1 mrg
5357 1.1 mrg /* Print an operand to an assembler instruction.
5358 1.1 mrg C Swap and print a comparison operator.
5359 1.1 mrg D Print an FP comparison operator.
5360 1.1 mrg E Print 32 - constant, for SImode shifts as extract.
5361 1.1 mrg e Print 64 - constant, for DImode rotates.
5362 1.1 mrg F A floating point constant 0.0 emitted as f0, or 1.0 emitted as f1, or
5363 1.1 mrg a floating point register emitted normally.
5364 1.1 mrg G A floating point constant.
5365 1.1 mrg I Invert a predicate register by adding 1.
5366 1.1 mrg J Select the proper predicate register for a condition.
5367 1.1 mrg j Select the inverse predicate register for a condition.
5368 1.1 mrg O Append .acq for volatile load.
5369 1.1 mrg P Postincrement of a MEM.
5370 1.1 mrg Q Append .rel for volatile store.
5371 1.1 mrg R Print .s .d or nothing for a single, double or no truncation.
5372 1.1 mrg S Shift amount for shladd instruction.
5373 1.1 mrg T Print an 8-bit sign extended number (K) as a 32-bit unsigned number
5374 1.1 mrg for Intel assembler.
5375 1.1 mrg U Print an 8-bit sign extended number (K) as a 64-bit unsigned number
5376 1.1 mrg for Intel assembler.
5377 1.1 mrg X A pair of floating point registers.
5378 1.1 mrg r Print register name, or constant 0 as r0. HP compatibility for
5379 1.1 mrg Linux kernel.
5380 1.1 mrg v Print vector constant value as an 8-byte integer value. */
5381 1.1 mrg
5382 1.1 mrg static void
5383 1.1 mrg ia64_print_operand (FILE * file, rtx x, int code)
5384 1.1 mrg {
5385 1.1 mrg const char *str;
5386 1.1 mrg
5387 1.1 mrg switch (code)
5388 1.1 mrg {
5389 1.1 mrg case 0:
5390 1.1 mrg /* Handled below. */
5391 1.1 mrg break;
5392 1.1 mrg
5393 1.1 mrg case 'C':
5394 1.1 mrg {
5395 1.1 mrg enum rtx_code c = swap_condition (GET_CODE (x));
5396 1.1 mrg fputs (GET_RTX_NAME (c), file);
5397 1.1 mrg return;
5398 1.1 mrg }
5399 1.1 mrg
5400 1.1 mrg case 'D':
5401 1.1 mrg switch (GET_CODE (x))
5402 1.1 mrg {
5403 1.1 mrg case NE:
5404 1.1 mrg str = "neq";
5405 1.1 mrg break;
5406 1.1 mrg case UNORDERED:
5407 1.1 mrg str = "unord";
5408 1.1 mrg break;
5409 1.1 mrg case ORDERED:
5410 1.1 mrg str = "ord";
5411 1.1 mrg break;
5412 1.1 mrg case UNLT:
5413 1.1 mrg str = "nge";
5414 1.1 mrg break;
5415 1.1 mrg case UNLE:
5416 1.1 mrg str = "ngt";
5417 1.1 mrg break;
5418 1.1 mrg case UNGT:
5419 1.1 mrg str = "nle";
5420 1.1 mrg break;
5421 1.1 mrg case UNGE:
5422 1.1 mrg str = "nlt";
5423 1.1 mrg break;
5424 1.1 mrg case UNEQ:
5425 1.1 mrg case LTGT:
5426 1.1 mrg gcc_unreachable ();
5427 1.1 mrg default:
5428 1.1 mrg str = GET_RTX_NAME (GET_CODE (x));
5429 1.1 mrg break;
5430 1.1 mrg }
5431 1.1 mrg fputs (str, file);
5432 1.1 mrg return;
5433 1.1 mrg
5434 1.1 mrg case 'E':
5435 1.1 mrg fprintf (file, HOST_WIDE_INT_PRINT_DEC, 32 - INTVAL (x));
5436 1.1 mrg return;
5437 1.1 mrg
5438 1.1 mrg case 'e':
5439 1.1 mrg fprintf (file, HOST_WIDE_INT_PRINT_DEC, 64 - INTVAL (x));
5440 1.1 mrg return;
5441 1.1 mrg
5442 1.1 mrg case 'F':
5443 1.1 mrg if (x == CONST0_RTX (GET_MODE (x)))
5444 1.1 mrg str = reg_names [FR_REG (0)];
5445 1.1 mrg else if (x == CONST1_RTX (GET_MODE (x)))
5446 1.1 mrg str = reg_names [FR_REG (1)];
5447 1.1 mrg else
5448 1.1 mrg {
5449 1.1 mrg gcc_assert (GET_CODE (x) == REG);
5450 1.1 mrg str = reg_names [REGNO (x)];
5451 1.1 mrg }
5452 1.1 mrg fputs (str, file);
5453 1.1 mrg return;
5454 1.1 mrg
5455 1.1 mrg case 'G':
5456 1.1 mrg {
5457 1.1 mrg long val[4];
5458 1.1 mrg real_to_target (val, CONST_DOUBLE_REAL_VALUE (x), GET_MODE (x));
5459 1.1 mrg if (GET_MODE (x) == SFmode)
5460 1.1 mrg fprintf (file, "0x%08lx", val[0] & 0xffffffff);
5461 1.1 mrg else if (GET_MODE (x) == DFmode)
5462 1.1 mrg fprintf (file, "0x%08lx%08lx", (WORDS_BIG_ENDIAN ? val[0] : val[1])
5463 1.1 mrg & 0xffffffff,
5464 1.1 mrg (WORDS_BIG_ENDIAN ? val[1] : val[0])
5465 1.1 mrg & 0xffffffff);
5466 1.1 mrg else
5467 1.1 mrg output_operand_lossage ("invalid %%G mode");
5468 1.1 mrg }
5469 1.1 mrg return;
5470 1.1 mrg
5471 1.1 mrg case 'I':
5472 1.1 mrg fputs (reg_names [REGNO (x) + 1], file);
5473 1.1 mrg return;
5474 1.1 mrg
5475 1.1 mrg case 'J':
5476 1.1 mrg case 'j':
5477 1.1 mrg {
5478 1.1 mrg unsigned int regno = REGNO (XEXP (x, 0));
5479 1.1 mrg if (GET_CODE (x) == EQ)
5480 1.1 mrg regno += 1;
5481 1.1 mrg if (code == 'j')
5482 1.1 mrg regno ^= 1;
5483 1.1 mrg fputs (reg_names [regno], file);
5484 1.1 mrg }
5485 1.1 mrg return;
5486 1.1 mrg
5487 1.1 mrg case 'O':
5488 1.1 mrg if (MEM_VOLATILE_P (x))
5489 1.1 mrg fputs(".acq", file);
5490 1.1 mrg return;
5491 1.1 mrg
5492 1.1 mrg case 'P':
5493 1.1 mrg {
5494 1.1 mrg HOST_WIDE_INT value;
5495 1.1 mrg
5496 1.1 mrg switch (GET_CODE (XEXP (x, 0)))
5497 1.1 mrg {
5498 1.1 mrg default:
5499 1.1 mrg return;
5500 1.1 mrg
5501 1.1 mrg case POST_MODIFY:
5502 1.1 mrg x = XEXP (XEXP (XEXP (x, 0), 1), 1);
5503 1.1 mrg if (GET_CODE (x) == CONST_INT)
5504 1.1 mrg value = INTVAL (x);
5505 1.1 mrg else
5506 1.1 mrg {
5507 1.1 mrg gcc_assert (GET_CODE (x) == REG);
5508 1.1 mrg fprintf (file, ", %s", reg_names[REGNO (x)]);
5509 1.1 mrg return;
5510 1.1 mrg }
5511 1.1 mrg break;
5512 1.1 mrg
5513 1.1 mrg case POST_INC:
5514 1.1 mrg value = GET_MODE_SIZE (GET_MODE (x));
5515 1.1 mrg break;
5516 1.1 mrg
5517 1.1 mrg case POST_DEC:
5518 1.1 mrg value = - (HOST_WIDE_INT) GET_MODE_SIZE (GET_MODE (x));
5519 1.1 mrg break;
5520 1.1 mrg }
5521 1.1 mrg
5522 1.1 mrg fprintf (file, ", " HOST_WIDE_INT_PRINT_DEC, value);
5523 1.1 mrg return;
5524 1.1 mrg }
5525 1.1 mrg
5526 1.1 mrg case 'Q':
5527 1.1 mrg if (MEM_VOLATILE_P (x))
5528 1.1 mrg fputs(".rel", file);
5529 1.1 mrg return;
5530 1.1 mrg
5531 1.1 mrg case 'R':
5532 1.1 mrg if (x == CONST0_RTX (GET_MODE (x)))
5533 1.1 mrg fputs(".s", file);
5534 1.1 mrg else if (x == CONST1_RTX (GET_MODE (x)))
5535 1.1 mrg fputs(".d", file);
5536 1.1 mrg else if (x == CONST2_RTX (GET_MODE (x)))
5537 1.1 mrg ;
5538 1.1 mrg else
5539 1.1 mrg output_operand_lossage ("invalid %%R value");
5540 1.1 mrg return;
5541 1.1 mrg
5542 1.1 mrg case 'S':
5543 1.1 mrg fprintf (file, "%d", exact_log2 (INTVAL (x)));
5544 1.1 mrg return;
5545 1.1 mrg
5546 1.1 mrg case 'T':
5547 1.1 mrg if (! TARGET_GNU_AS && GET_CODE (x) == CONST_INT)
5548 1.1 mrg {
5549 1.1 mrg fprintf (file, "0x%x", (int) INTVAL (x) & 0xffffffff);
5550 1.1 mrg return;
5551 1.1 mrg }
5552 1.1 mrg break;
5553 1.1 mrg
5554 1.1 mrg case 'U':
5555 1.1 mrg if (! TARGET_GNU_AS && GET_CODE (x) == CONST_INT)
5556 1.1 mrg {
5557 1.1 mrg const char *prefix = "0x";
5558 1.1 mrg if (INTVAL (x) & 0x80000000)
5559 1.1 mrg {
5560 1.1 mrg fprintf (file, "0xffffffff");
5561 1.1 mrg prefix = "";
5562 1.1 mrg }
5563 1.1 mrg fprintf (file, "%s%x", prefix, (int) INTVAL (x) & 0xffffffff);
5564 1.1 mrg return;
5565 1.1 mrg }
5566 1.1 mrg break;
5567 1.1 mrg
5568 1.1 mrg case 'X':
5569 1.1 mrg {
5570 1.1 mrg unsigned int regno = REGNO (x);
5571 1.1 mrg fprintf (file, "%s, %s", reg_names [regno], reg_names [regno + 1]);
5572 1.1 mrg }
5573 1.1 mrg return;
5574 1.1 mrg
5575 1.1 mrg case 'r':
5576 1.1 mrg /* If this operand is the constant zero, write it as register zero.
5577 1.1 mrg Any register, zero, or CONST_INT value is OK here. */
5578 1.1 mrg if (GET_CODE (x) == REG)
5579 1.1 mrg fputs (reg_names[REGNO (x)], file);
5580 1.1 mrg else if (x == CONST0_RTX (GET_MODE (x)))
5581 1.1 mrg fputs ("r0", file);
5582 1.1 mrg else if (GET_CODE (x) == CONST_INT)
5583 1.1 mrg output_addr_const (file, x);
5584 1.1 mrg else
5585 1.1 mrg output_operand_lossage ("invalid %%r value");
5586 1.1 mrg return;
5587 1.1 mrg
5588 1.1 mrg case 'v':
5589 1.1 mrg gcc_assert (GET_CODE (x) == CONST_VECTOR);
5590 1.1 mrg x = simplify_subreg (DImode, x, GET_MODE (x), 0);
5591 1.1 mrg break;
5592 1.1 mrg
5593 1.1 mrg case '+':
5594 1.1 mrg {
5595 1.1 mrg const char *which;
5596 1.1 mrg
5597 1.1 mrg /* For conditional branches, returns or calls, substitute
5598 1.1 mrg sptk, dptk, dpnt, or spnt for %s. */
5599 1.1 mrg x = find_reg_note (current_output_insn, REG_BR_PROB, 0);
5600 1.1 mrg if (x)
5601 1.1 mrg {
5602 1.1 mrg int pred_val = profile_probability::from_reg_br_prob_note
5603 1.1 mrg (XINT (x, 0)).to_reg_br_prob_base ();
5604 1.1 mrg
5605 1.1 mrg /* Guess top and bottom 10% statically predicted. */
5606 1.1 mrg if (pred_val < REG_BR_PROB_BASE / 50
5607 1.1 mrg && br_prob_note_reliable_p (x))
5608 1.1 mrg which = ".spnt";
5609 1.1 mrg else if (pred_val < REG_BR_PROB_BASE / 2)
5610 1.1 mrg which = ".dpnt";
5611 1.1 mrg else if (pred_val < REG_BR_PROB_BASE / 100 * 98
5612 1.1 mrg || !br_prob_note_reliable_p (x))
5613 1.1 mrg which = ".dptk";
5614 1.1 mrg else
5615 1.1 mrg which = ".sptk";
5616 1.1 mrg }
5617 1.1 mrg else if (CALL_P (current_output_insn))
5618 1.1 mrg which = ".sptk";
5619 1.1 mrg else
5620 1.1 mrg which = ".dptk";
5621 1.1 mrg
5622 1.1 mrg fputs (which, file);
5623 1.1 mrg return;
5624 1.1 mrg }
5625 1.1 mrg
5626 1.1 mrg case ',':
5627 1.1 mrg x = current_insn_predicate;
5628 1.1 mrg if (x)
5629 1.1 mrg {
5630 1.1 mrg unsigned int regno = REGNO (XEXP (x, 0));
5631 1.1 mrg if (GET_CODE (x) == EQ)
5632 1.1 mrg regno += 1;
5633 1.1 mrg fprintf (file, "(%s) ", reg_names [regno]);
5634 1.1 mrg }
5635 1.1 mrg return;
5636 1.1 mrg
5637 1.1 mrg default:
5638 1.1 mrg output_operand_lossage ("ia64_print_operand: unknown code");
5639 1.1 mrg return;
5640 1.1 mrg }
5641 1.1 mrg
5642 1.1 mrg switch (GET_CODE (x))
5643 1.1 mrg {
5644 1.1 mrg /* This happens for the spill/restore instructions. */
5645 1.1 mrg case POST_INC:
5646 1.1 mrg case POST_DEC:
5647 1.1 mrg case POST_MODIFY:
5648 1.1 mrg x = XEXP (x, 0);
5649 1.1 mrg /* fall through */
5650 1.1 mrg
5651 1.1 mrg case REG:
5652 1.1 mrg fputs (reg_names [REGNO (x)], file);
5653 1.1 mrg break;
5654 1.1 mrg
5655 1.1 mrg case MEM:
5656 1.1 mrg {
5657 1.1 mrg rtx addr = XEXP (x, 0);
5658 1.1 mrg if (GET_RTX_CLASS (GET_CODE (addr)) == RTX_AUTOINC)
5659 1.1 mrg addr = XEXP (addr, 0);
5660 1.1 mrg fprintf (file, "[%s]", reg_names [REGNO (addr)]);
5661 1.1 mrg break;
5662 1.1 mrg }
5663 1.1 mrg
5664 1.1 mrg default:
5665 1.1 mrg output_addr_const (file, x);
5666 1.1 mrg break;
5667 1.1 mrg }
5668 1.1 mrg
5669 1.1 mrg return;
5670 1.1 mrg }
5671 1.1 mrg
5672 1.1 mrg /* Worker function for TARGET_PRINT_OPERAND_PUNCT_VALID_P. */
5673 1.1 mrg
5674 1.1 mrg static bool
5675 1.1 mrg ia64_print_operand_punct_valid_p (unsigned char code)
5676 1.1 mrg {
5677 1.1 mrg return (code == '+' || code == ',');
5678 1.1 mrg }
5679 1.1 mrg
5680 1.1 mrg /* Compute a (partial) cost for rtx X. Return true if the complete
5682 1.1 mrg cost has been computed, and false if subexpressions should be
5683 1.1 mrg scanned. In either case, *TOTAL contains the cost result. */
5684 1.1 mrg /* ??? This is incomplete. */
5685 1.1 mrg
5686 1.1 mrg static bool
5687 1.1 mrg ia64_rtx_costs (rtx x, machine_mode mode, int outer_code,
5688 1.1 mrg int opno ATTRIBUTE_UNUSED,
5689 1.1 mrg int *total, bool speed ATTRIBUTE_UNUSED)
5690 1.1 mrg {
5691 1.1 mrg int code = GET_CODE (x);
5692 1.1 mrg
5693 1.1 mrg switch (code)
5694 1.1 mrg {
5695 1.1 mrg case CONST_INT:
5696 1.1 mrg switch (outer_code)
5697 1.1 mrg {
5698 1.1 mrg case SET:
5699 1.1 mrg *total = satisfies_constraint_J (x) ? 0 : COSTS_N_INSNS (1);
5700 1.1 mrg return true;
5701 1.1 mrg case PLUS:
5702 1.1 mrg if (satisfies_constraint_I (x))
5703 1.1 mrg *total = 0;
5704 1.1 mrg else if (satisfies_constraint_J (x))
5705 1.1 mrg *total = 1;
5706 1.1 mrg else
5707 1.1 mrg *total = COSTS_N_INSNS (1);
5708 1.1 mrg return true;
5709 1.1 mrg default:
5710 1.1 mrg if (satisfies_constraint_K (x) || satisfies_constraint_L (x))
5711 1.1 mrg *total = 0;
5712 1.1 mrg else
5713 1.1 mrg *total = COSTS_N_INSNS (1);
5714 1.1 mrg return true;
5715 1.1 mrg }
5716 1.1 mrg
5717 1.1 mrg case CONST_DOUBLE:
5718 1.1 mrg *total = COSTS_N_INSNS (1);
5719 1.1 mrg return true;
5720 1.1 mrg
5721 1.1 mrg case CONST:
5722 1.1 mrg case SYMBOL_REF:
5723 1.1 mrg case LABEL_REF:
5724 1.1 mrg *total = COSTS_N_INSNS (3);
5725 1.1 mrg return true;
5726 1.1 mrg
5727 1.1 mrg case FMA:
5728 1.1 mrg *total = COSTS_N_INSNS (4);
5729 1.1 mrg return true;
5730 1.1 mrg
5731 1.1 mrg case MULT:
5732 1.1 mrg /* For multiplies wider than HImode, we have to go to the FPU,
5733 1.1 mrg which normally involves copies. Plus there's the latency
5734 1.1 mrg of the multiply itself, and the latency of the instructions to
5735 1.1 mrg transfer integer regs to FP regs. */
5736 1.1 mrg if (FLOAT_MODE_P (mode))
5737 1.1 mrg *total = COSTS_N_INSNS (4);
5738 1.1 mrg else if (GET_MODE_SIZE (mode) > 2)
5739 1.1 mrg *total = COSTS_N_INSNS (10);
5740 1.1 mrg else
5741 1.1 mrg *total = COSTS_N_INSNS (2);
5742 1.1 mrg return true;
5743 1.1 mrg
5744 1.1 mrg case PLUS:
5745 1.1 mrg case MINUS:
5746 1.1 mrg if (FLOAT_MODE_P (mode))
5747 1.1 mrg {
5748 1.1 mrg *total = COSTS_N_INSNS (4);
5749 1.1 mrg return true;
5750 1.1 mrg }
5751 1.1 mrg /* FALLTHRU */
5752 1.1 mrg
5753 1.1 mrg case ASHIFT:
5754 1.1 mrg case ASHIFTRT:
5755 1.1 mrg case LSHIFTRT:
5756 1.1 mrg *total = COSTS_N_INSNS (1);
5757 1.1 mrg return true;
5758 1.1 mrg
5759 1.1 mrg case DIV:
5760 1.1 mrg case UDIV:
5761 1.1 mrg case MOD:
5762 1.1 mrg case UMOD:
5763 1.1 mrg /* We make divide expensive, so that divide-by-constant will be
5764 1.1 mrg optimized to a multiply. */
5765 1.1 mrg *total = COSTS_N_INSNS (60);
5766 1.1 mrg return true;
5767 1.1 mrg
5768 1.1 mrg default:
5769 1.1 mrg return false;
5770 1.1 mrg }
5771 1.1 mrg }
5772 1.1 mrg
5773 1.1 mrg /* Calculate the cost of moving data from a register in class FROM to
5774 1.1 mrg one in class TO, using MODE. */
5775 1.1 mrg
5776 1.1 mrg static int
5777 1.1 mrg ia64_register_move_cost (machine_mode mode, reg_class_t from,
5778 1.1 mrg reg_class_t to)
5779 1.1 mrg {
5780 1.1 mrg /* ADDL_REGS is the same as GR_REGS for movement purposes. */
5781 1.1 mrg if (to == ADDL_REGS)
5782 1.1 mrg to = GR_REGS;
5783 1.1 mrg if (from == ADDL_REGS)
5784 1.1 mrg from = GR_REGS;
5785 1.1 mrg
5786 1.1 mrg /* All costs are symmetric, so reduce cases by putting the
5787 1.1 mrg lower number class as the destination. */
5788 1.1 mrg if (from < to)
5789 1.1 mrg {
5790 1.1 mrg reg_class_t tmp = to;
5791 1.1 mrg to = from, from = tmp;
5792 1.1 mrg }
5793 1.1 mrg
5794 1.1 mrg /* Moving from FR<->GR in XFmode must be more expensive than 2,
5795 1.1 mrg so that we get secondary memory reloads. Between FR_REGS,
5796 1.1 mrg we have to make this at least as expensive as memory_move_cost
5797 1.1 mrg to avoid spectacularly poor register class preferencing. */
5798 1.1 mrg if (mode == XFmode || mode == RFmode)
5799 1.1 mrg {
5800 1.1 mrg if (to != GR_REGS || from != GR_REGS)
5801 1.1 mrg return memory_move_cost (mode, to, false);
5802 1.1 mrg else
5803 1.1 mrg return 3;
5804 1.1 mrg }
5805 1.1 mrg
5806 1.1 mrg switch (to)
5807 1.1 mrg {
5808 1.1 mrg case PR_REGS:
5809 1.1 mrg /* Moving between PR registers takes two insns. */
5810 1.1 mrg if (from == PR_REGS)
5811 1.1 mrg return 3;
5812 1.1 mrg /* Moving between PR and anything but GR is impossible. */
5813 1.1 mrg if (from != GR_REGS)
5814 1.1 mrg return memory_move_cost (mode, to, false);
5815 1.1 mrg break;
5816 1.1 mrg
5817 1.1 mrg case BR_REGS:
5818 1.1 mrg /* Moving between BR and anything but GR is impossible. */
5819 1.1 mrg if (from != GR_REGS && from != GR_AND_BR_REGS)
5820 1.1 mrg return memory_move_cost (mode, to, false);
5821 1.1 mrg break;
5822 1.1 mrg
5823 1.1 mrg case AR_I_REGS:
5824 1.1 mrg case AR_M_REGS:
5825 1.1 mrg /* Moving between AR and anything but GR is impossible. */
5826 1.1 mrg if (from != GR_REGS)
5827 1.1 mrg return memory_move_cost (mode, to, false);
5828 1.1 mrg break;
5829 1.1 mrg
5830 1.1 mrg case GR_REGS:
5831 1.1 mrg case FR_REGS:
5832 1.1 mrg case FP_REGS:
5833 1.1 mrg case GR_AND_FR_REGS:
5834 1.1 mrg case GR_AND_BR_REGS:
5835 1.1 mrg case ALL_REGS:
5836 1.1 mrg break;
5837 1.1 mrg
5838 1.1 mrg default:
5839 1.1 mrg gcc_unreachable ();
5840 1.1 mrg }
5841 1.1 mrg
5842 1.1 mrg return 2;
5843 1.1 mrg }
5844 1.1 mrg
5845 1.1 mrg /* Calculate the cost of moving data of MODE from a register to or from
5846 1.1 mrg memory. */
5847 1.1 mrg
5848 1.1 mrg static int
5849 1.1 mrg ia64_memory_move_cost (machine_mode mode ATTRIBUTE_UNUSED,
5850 1.1 mrg reg_class_t rclass,
5851 1.1 mrg bool in ATTRIBUTE_UNUSED)
5852 1.1 mrg {
5853 1.1 mrg if (rclass == GENERAL_REGS
5854 1.1 mrg || rclass == FR_REGS
5855 1.1 mrg || rclass == FP_REGS
5856 1.1 mrg || rclass == GR_AND_FR_REGS)
5857 1.1 mrg return 4;
5858 1.1 mrg else
5859 1.1 mrg return 10;
5860 1.1 mrg }
5861 1.1 mrg
5862 1.1 mrg /* Implement TARGET_PREFERRED_RELOAD_CLASS. Place additional restrictions
5863 1.1 mrg on RCLASS to use when copying X into that class. */
5864 1.1 mrg
5865 1.1 mrg static reg_class_t
5866 1.1 mrg ia64_preferred_reload_class (rtx x, reg_class_t rclass)
5867 1.1 mrg {
5868 1.1 mrg switch (rclass)
5869 1.1 mrg {
5870 1.1 mrg case FR_REGS:
5871 1.1 mrg case FP_REGS:
5872 1.1 mrg /* Don't allow volatile mem reloads into floating point registers.
5873 1.1 mrg This is defined to force reload to choose the r/m case instead
5874 1.1 mrg of the f/f case when reloading (set (reg fX) (mem/v)). */
5875 1.1 mrg if (MEM_P (x) && MEM_VOLATILE_P (x))
5876 1.1 mrg return NO_REGS;
5877 1.1 mrg
5878 1.1 mrg /* Force all unrecognized constants into the constant pool. */
5879 1.1 mrg if (CONSTANT_P (x))
5880 1.1 mrg return NO_REGS;
5881 1.1 mrg break;
5882 1.1 mrg
5883 1.1 mrg case AR_M_REGS:
5884 1.1 mrg case AR_I_REGS:
5885 1.1 mrg if (!OBJECT_P (x))
5886 1.1 mrg return NO_REGS;
5887 1.1 mrg break;
5888 1.1 mrg
5889 1.1 mrg default:
5890 1.1 mrg break;
5891 1.1 mrg }
5892 1.1 mrg
5893 1.1 mrg return rclass;
5894 1.1 mrg }
5895 1.1 mrg
5896 1.1 mrg /* This function returns the register class required for a secondary
5897 1.1 mrg register when copying between one of the registers in RCLASS, and X,
5898 1.1 mrg using MODE. A return value of NO_REGS means that no secondary register
5899 1.1 mrg is required. */
5900 1.1 mrg
5901 1.1 mrg enum reg_class
5902 1.1 mrg ia64_secondary_reload_class (enum reg_class rclass,
5903 1.1 mrg machine_mode mode ATTRIBUTE_UNUSED, rtx x)
5904 1.1 mrg {
5905 1.1 mrg int regno = -1;
5906 1.1 mrg
5907 1.1 mrg if (GET_CODE (x) == REG || GET_CODE (x) == SUBREG)
5908 1.1 mrg regno = true_regnum (x);
5909 1.1 mrg
5910 1.1 mrg switch (rclass)
5911 1.1 mrg {
5912 1.1 mrg case BR_REGS:
5913 1.1 mrg case AR_M_REGS:
5914 1.1 mrg case AR_I_REGS:
5915 1.1 mrg /* ??? BR<->BR register copies can happen due to a bad gcse/cse/global
5916 1.1 mrg interaction. We end up with two pseudos with overlapping lifetimes
5917 1.1 mrg both of which are equiv to the same constant, and both which need
5918 1.1 mrg to be in BR_REGS. This seems to be a cse bug. cse_basic_block_end
5919 1.1 mrg changes depending on the path length, which means the qty_first_reg
5920 1.1 mrg check in make_regs_eqv can give different answers at different times.
5921 1.1 mrg At some point I'll probably need a reload_indi pattern to handle
5922 1.1 mrg this.
5923 1.1 mrg
5924 1.1 mrg We can also get GR_AND_FR_REGS to BR_REGS/AR_REGS copies, where we
5925 1.1 mrg wound up with a FP register from GR_AND_FR_REGS. Extend that to all
5926 1.1 mrg non-general registers for good measure. */
5927 1.1 mrg if (regno >= 0 && ! GENERAL_REGNO_P (regno))
5928 1.1 mrg return GR_REGS;
5929 1.1 mrg
5930 1.1 mrg /* This is needed if a pseudo used as a call_operand gets spilled to a
5931 1.1 mrg stack slot. */
5932 1.1 mrg if (GET_CODE (x) == MEM)
5933 1.1 mrg return GR_REGS;
5934 1.1 mrg break;
5935 1.1 mrg
5936 1.1 mrg case FR_REGS:
5937 1.1 mrg case FP_REGS:
5938 1.1 mrg /* Need to go through general registers to get to other class regs. */
5939 1.1 mrg if (regno >= 0 && ! (FR_REGNO_P (regno) || GENERAL_REGNO_P (regno)))
5940 1.1 mrg return GR_REGS;
5941 1.1 mrg
5942 1.1 mrg /* This can happen when a paradoxical subreg is an operand to the
5943 1.1 mrg muldi3 pattern. */
5944 1.1 mrg /* ??? This shouldn't be necessary after instruction scheduling is
5945 1.1 mrg enabled, because paradoxical subregs are not accepted by
5946 1.1 mrg register_operand when INSN_SCHEDULING is defined. Or alternatively,
5947 1.1 mrg stop the paradoxical subreg stupidity in the *_operand functions
5948 1.1 mrg in recog.cc. */
5949 1.1 mrg if (GET_CODE (x) == MEM
5950 1.1 mrg && (GET_MODE (x) == SImode || GET_MODE (x) == HImode
5951 1.1 mrg || GET_MODE (x) == QImode))
5952 1.1 mrg return GR_REGS;
5953 1.1 mrg
5954 1.1 mrg /* This can happen because of the ior/and/etc patterns that accept FP
5955 1.1 mrg registers as operands. If the third operand is a constant, then it
5956 1.1 mrg needs to be reloaded into a FP register. */
5957 1.1 mrg if (GET_CODE (x) == CONST_INT)
5958 1.1 mrg return GR_REGS;
5959 1.1 mrg
5960 1.1 mrg /* This can happen because of register elimination in a muldi3 insn.
5961 1.1 mrg E.g. `26107 * (unsigned long)&u'. */
5962 1.1 mrg if (GET_CODE (x) == PLUS)
5963 1.1 mrg return GR_REGS;
5964 1.1 mrg break;
5965 1.1 mrg
5966 1.1 mrg case PR_REGS:
5967 1.1 mrg /* ??? This happens if we cse/gcse a BImode value across a call,
5968 1.1 mrg and the function has a nonlocal goto. This is because global
5969 1.1 mrg does not allocate call crossing pseudos to hard registers when
5970 1.1 mrg crtl->has_nonlocal_goto is true. This is relatively
5971 1.1 mrg common for C++ programs that use exceptions. To reproduce,
5972 1.1 mrg return NO_REGS and compile libstdc++. */
5973 1.1 mrg if (GET_CODE (x) == MEM)
5974 1.1 mrg return GR_REGS;
5975 1.1 mrg
5976 1.1 mrg /* This can happen when we take a BImode subreg of a DImode value,
5977 1.1 mrg and that DImode value winds up in some non-GR register. */
5978 1.1 mrg if (regno >= 0 && ! GENERAL_REGNO_P (regno) && ! PR_REGNO_P (regno))
5979 1.1 mrg return GR_REGS;
5980 1.1 mrg break;
5981 1.1 mrg
5982 1.1 mrg default:
5983 1.1 mrg break;
5984 1.1 mrg }
5985 1.1 mrg
5986 1.1 mrg return NO_REGS;
5987 1.1 mrg }
5988 1.1 mrg
5989 1.1 mrg
5990 1.1 mrg /* Implement targetm.unspec_may_trap_p hook. */
5992 1.1 mrg static int
5993 1.1 mrg ia64_unspec_may_trap_p (const_rtx x, unsigned flags)
5994 1.1 mrg {
5995 1.1 mrg switch (XINT (x, 1))
5996 1.1 mrg {
5997 1.1 mrg case UNSPEC_LDA:
5998 1.1 mrg case UNSPEC_LDS:
5999 1.1 mrg case UNSPEC_LDSA:
6000 1.1 mrg case UNSPEC_LDCCLR:
6001 1.1 mrg case UNSPEC_CHKACLR:
6002 1.1 mrg case UNSPEC_CHKS:
6003 1.1 mrg /* These unspecs are just wrappers. */
6004 1.1 mrg return may_trap_p_1 (XVECEXP (x, 0, 0), flags);
6005 1.1 mrg }
6006 1.1 mrg
6007 1.1 mrg return default_unspec_may_trap_p (x, flags);
6008 1.1 mrg }
6009 1.1 mrg
6010 1.1 mrg
6011 1.1 mrg /* Parse the -mfixed-range= option string. */
6013 1.1 mrg
6014 1.1 mrg static void
6015 1.1 mrg fix_range (const char *const_str)
6016 1.1 mrg {
6017 1.1 mrg int i, first, last;
6018 1.1 mrg char *str, *dash, *comma;
6019 1.1 mrg
6020 1.1 mrg /* str must be of the form REG1'-'REG2{,REG1'-'REG} where REG1 and
6021 1.1 mrg REG2 are either register names or register numbers. The effect
6022 1.1 mrg of this option is to mark the registers in the range from REG1 to
6023 1.1 mrg REG2 as ``fixed'' so they won't be used by the compiler. This is
6024 1.1 mrg used, e.g., to ensure that kernel mode code doesn't use f32-f127. */
6025 1.1 mrg
6026 1.1 mrg i = strlen (const_str);
6027 1.1 mrg str = (char *) alloca (i + 1);
6028 1.1 mrg memcpy (str, const_str, i + 1);
6029 1.1 mrg
6030 1.1 mrg while (1)
6031 1.1 mrg {
6032 1.1 mrg dash = strchr (str, '-');
6033 1.1 mrg if (!dash)
6034 1.1 mrg {
6035 1.1 mrg warning (0, "value of %<-mfixed-range%> must have form REG1-REG2");
6036 1.1 mrg return;
6037 1.1 mrg }
6038 1.1 mrg *dash = '\0';
6039 1.1 mrg
6040 1.1 mrg comma = strchr (dash + 1, ',');
6041 1.1 mrg if (comma)
6042 1.1 mrg *comma = '\0';
6043 1.1 mrg
6044 1.1 mrg first = decode_reg_name (str);
6045 1.1 mrg if (first < 0)
6046 1.1 mrg {
6047 1.1 mrg warning (0, "unknown register name: %s", str);
6048 1.1 mrg return;
6049 1.1 mrg }
6050 1.1 mrg
6051 1.1 mrg last = decode_reg_name (dash + 1);
6052 1.1 mrg if (last < 0)
6053 1.1 mrg {
6054 1.1 mrg warning (0, "unknown register name: %s", dash + 1);
6055 1.1 mrg return;
6056 1.1 mrg }
6057 1.1 mrg
6058 1.1 mrg *dash = '-';
6059 1.1 mrg
6060 1.1 mrg if (first > last)
6061 1.1 mrg {
6062 1.1 mrg warning (0, "%s-%s is an empty range", str, dash + 1);
6063 1.1 mrg return;
6064 1.1 mrg }
6065 1.1 mrg
6066 1.1 mrg for (i = first; i <= last; ++i)
6067 1.1 mrg fixed_regs[i] = 1;
6068 1.1 mrg
6069 1.1 mrg if (!comma)
6070 1.1 mrg break;
6071 1.1 mrg
6072 1.1 mrg *comma = ',';
6073 1.1 mrg str = comma + 1;
6074 1.1 mrg }
6075 1.1 mrg }
6076 1.1 mrg
6077 1.1 mrg /* Implement TARGET_OPTION_OVERRIDE. */
6078 1.1 mrg
6079 1.1 mrg static void
6080 1.1 mrg ia64_option_override (void)
6081 1.1 mrg {
6082 1.1 mrg unsigned int i;
6083 1.1 mrg cl_deferred_option *opt;
6084 1.1 mrg vec<cl_deferred_option> *v
6085 1.1 mrg = (vec<cl_deferred_option> *) ia64_deferred_options;
6086 1.1 mrg
6087 1.1 mrg if (v)
6088 1.1 mrg FOR_EACH_VEC_ELT (*v, i, opt)
6089 1.1 mrg {
6090 1.1 mrg switch (opt->opt_index)
6091 1.1 mrg {
6092 1.1 mrg case OPT_mfixed_range_:
6093 1.1 mrg fix_range (opt->arg);
6094 1.1 mrg break;
6095 1.1 mrg
6096 1.1 mrg default:
6097 1.1 mrg gcc_unreachable ();
6098 1.1 mrg }
6099 1.1 mrg }
6100 1.1 mrg
6101 1.1 mrg if (TARGET_AUTO_PIC)
6102 1.1 mrg target_flags |= MASK_CONST_GP;
6103 1.1 mrg
6104 1.1 mrg /* Numerous experiment shows that IRA based loop pressure
6105 1.1 mrg calculation works better for RTL loop invariant motion on targets
6106 1.1 mrg with enough (>= 32) registers. It is an expensive optimization.
6107 1.1 mrg So it is on only for peak performance. */
6108 1.1 mrg if (optimize >= 3)
6109 1.1 mrg flag_ira_loop_pressure = 1;
6110 1.1 mrg
6111 1.1 mrg
6112 1.1 mrg ia64_section_threshold = (OPTION_SET_P (g_switch_value)
6113 1.1 mrg ? g_switch_value
6114 1.1 mrg : IA64_DEFAULT_GVALUE);
6115 1.1 mrg
6116 1.1 mrg init_machine_status = ia64_init_machine_status;
6117 1.1 mrg
6118 1.1 mrg if (flag_align_functions && !str_align_functions)
6119 1.1 mrg str_align_functions = "64";
6120 1.1 mrg if (flag_align_loops && !str_align_loops)
6121 1.1 mrg str_align_loops = "32";
6122 1.1 mrg if (TARGET_ABI_OPEN_VMS)
6123 1.1 mrg flag_no_common = 1;
6124 1.1 mrg
6125 1.1 mrg ia64_override_options_after_change();
6126 1.1 mrg }
6127 1.1 mrg
6128 1.1 mrg /* Implement targetm.override_options_after_change. */
6129 1.1 mrg
6130 1.1 mrg static void
6131 1.1 mrg ia64_override_options_after_change (void)
6132 1.1 mrg {
6133 1.1 mrg if (optimize >= 3
6134 1.1 mrg && !OPTION_SET_P (flag_selective_scheduling)
6135 1.1 mrg && !OPTION_SET_P (flag_selective_scheduling2))
6136 1.1 mrg {
6137 1.1 mrg flag_selective_scheduling2 = 1;
6138 1.1 mrg flag_sel_sched_pipelining = 1;
6139 1.1 mrg }
6140 1.1 mrg if (mflag_sched_control_spec == 2)
6141 1.1 mrg {
6142 1.1 mrg /* Control speculation is on by default for the selective scheduler,
6143 1.1 mrg but not for the Haifa scheduler. */
6144 1.1 mrg mflag_sched_control_spec = flag_selective_scheduling2 ? 1 : 0;
6145 1.1 mrg }
6146 1.1 mrg if (flag_sel_sched_pipelining && flag_auto_inc_dec)
6147 1.1 mrg {
6148 1.1 mrg /* FIXME: remove this when we'd implement breaking autoinsns as
6149 1.1 mrg a transformation. */
6150 1.1 mrg flag_auto_inc_dec = 0;
6151 1.1 mrg }
6152 1.1 mrg }
6153 1.1 mrg
6154 1.1 mrg /* Initialize the record of emitted frame related registers. */
6155 1.1 mrg
6156 1.1 mrg void ia64_init_expanders (void)
6157 1.1 mrg {
6158 1.1 mrg memset (&emitted_frame_related_regs, 0, sizeof (emitted_frame_related_regs));
6159 1.1 mrg }
6160 1.1 mrg
6161 1.1 mrg static struct machine_function *
6162 1.1 mrg ia64_init_machine_status (void)
6163 1.1 mrg {
6164 1.1 mrg return ggc_cleared_alloc<machine_function> ();
6165 1.1 mrg }
6166 1.1 mrg
6167 1.1 mrg static enum attr_itanium_class ia64_safe_itanium_class (rtx_insn *);
6169 1.1 mrg static enum attr_type ia64_safe_type (rtx_insn *);
6170 1.1 mrg
6171 1.1 mrg static enum attr_itanium_class
6172 1.1 mrg ia64_safe_itanium_class (rtx_insn *insn)
6173 1.1 mrg {
6174 1.1 mrg if (recog_memoized (insn) >= 0)
6175 1.1 mrg return get_attr_itanium_class (insn);
6176 1.1 mrg else if (DEBUG_INSN_P (insn))
6177 1.1 mrg return ITANIUM_CLASS_IGNORE;
6178 1.1 mrg else
6179 1.1 mrg return ITANIUM_CLASS_UNKNOWN;
6180 1.1 mrg }
6181 1.1 mrg
6182 1.1 mrg static enum attr_type
6183 1.1 mrg ia64_safe_type (rtx_insn *insn)
6184 1.1 mrg {
6185 1.1 mrg if (recog_memoized (insn) >= 0)
6186 1.1 mrg return get_attr_type (insn);
6187 1.1 mrg else
6188 1.1 mrg return TYPE_UNKNOWN;
6189 1.1 mrg }
6190 1.1 mrg
6191 1.1 mrg /* The following collection of routines emit instruction group stop bits as
6193 1.1 mrg necessary to avoid dependencies. */
6194 1.1 mrg
6195 1.1 mrg /* Need to track some additional registers as far as serialization is
6196 1.1 mrg concerned so we can properly handle br.call and br.ret. We could
6197 1.1 mrg make these registers visible to gcc, but since these registers are
6198 1.1 mrg never explicitly used in gcc generated code, it seems wasteful to
6199 1.1 mrg do so (plus it would make the call and return patterns needlessly
6200 1.1 mrg complex). */
6201 1.1 mrg #define REG_RP (BR_REG (0))
6202 1.1 mrg #define REG_AR_CFM (FIRST_PSEUDO_REGISTER + 1)
6203 1.1 mrg /* This is used for volatile asms which may require a stop bit immediately
6204 1.1 mrg before and after them. */
6205 1.1 mrg #define REG_VOLATILE (FIRST_PSEUDO_REGISTER + 2)
6206 1.1 mrg #define AR_UNAT_BIT_0 (FIRST_PSEUDO_REGISTER + 3)
6207 1.1 mrg #define NUM_REGS (AR_UNAT_BIT_0 + 64)
6208 1.1 mrg
6209 1.1 mrg /* For each register, we keep track of how it has been written in the
6210 1.1 mrg current instruction group.
6211 1.1 mrg
6212 1.1 mrg If a register is written unconditionally (no qualifying predicate),
6213 1.1 mrg WRITE_COUNT is set to 2 and FIRST_PRED is ignored.
6214 1.1 mrg
6215 1.1 mrg If a register is written if its qualifying predicate P is true, we
6216 1.1 mrg set WRITE_COUNT to 1 and FIRST_PRED to P. Later on, the same register
6217 1.1 mrg may be written again by the complement of P (P^1) and when this happens,
6218 1.1 mrg WRITE_COUNT gets set to 2.
6219 1.1 mrg
6220 1.1 mrg The result of this is that whenever an insn attempts to write a register
6221 1.1 mrg whose WRITE_COUNT is two, we need to issue an insn group barrier first.
6222 1.1 mrg
6223 1.1 mrg If a predicate register is written by a floating-point insn, we set
6224 1.1 mrg WRITTEN_BY_FP to true.
6225 1.1 mrg
6226 1.1 mrg If a predicate register is written by an AND.ORCM we set WRITTEN_BY_AND
6227 1.1 mrg to true; if it was written by an OR.ANDCM we set WRITTEN_BY_OR to true. */
6228 1.1 mrg
6229 1.1 mrg #if GCC_VERSION >= 4000
6230 1.1 mrg #define RWS_FIELD_TYPE __extension__ unsigned short
6231 1.1 mrg #else
6232 1.1 mrg #define RWS_FIELD_TYPE unsigned int
6233 1.1 mrg #endif
6234 1.1 mrg struct reg_write_state
6235 1.1 mrg {
6236 1.1 mrg RWS_FIELD_TYPE write_count : 2;
6237 1.1 mrg RWS_FIELD_TYPE first_pred : 10;
6238 1.1 mrg RWS_FIELD_TYPE written_by_fp : 1;
6239 1.1 mrg RWS_FIELD_TYPE written_by_and : 1;
6240 1.1 mrg RWS_FIELD_TYPE written_by_or : 1;
6241 1.1 mrg };
6242 1.1 mrg
6243 1.1 mrg /* Cumulative info for the current instruction group. */
6244 1.1 mrg struct reg_write_state rws_sum[NUM_REGS];
6245 1.1 mrg #if CHECKING_P
6246 1.1 mrg /* Bitmap whether a register has been written in the current insn. */
6247 1.1 mrg unsigned HOST_WIDEST_FAST_INT rws_insn
6248 1.1 mrg [(NUM_REGS + HOST_BITS_PER_WIDEST_FAST_INT - 1)
6249 1.1 mrg / HOST_BITS_PER_WIDEST_FAST_INT];
6250 1.1 mrg
6251 1.1 mrg static inline void
6252 1.1 mrg rws_insn_set (unsigned int regno)
6253 1.1 mrg {
6254 1.1 mrg unsigned int elt = regno / HOST_BITS_PER_WIDEST_FAST_INT;
6255 1.1 mrg unsigned int bit = regno % HOST_BITS_PER_WIDEST_FAST_INT;
6256 1.1 mrg gcc_assert (!((rws_insn[elt] >> bit) & 1));
6257 1.1 mrg rws_insn[elt] |= (unsigned HOST_WIDEST_FAST_INT) 1 << bit;
6258 1.1 mrg }
6259 1.1 mrg
6260 1.1 mrg static inline int
6261 1.1 mrg rws_insn_test (unsigned int regno)
6262 1.1 mrg {
6263 1.1 mrg unsigned int elt = regno / HOST_BITS_PER_WIDEST_FAST_INT;
6264 1.1 mrg unsigned int bit = regno % HOST_BITS_PER_WIDEST_FAST_INT;
6265 1.1 mrg return (rws_insn[elt] >> bit) & 1;
6266 1.1 mrg }
6267 1.1 mrg #else
6268 1.1 mrg /* When not checking, track just REG_AR_CFM and REG_VOLATILE. */
6269 1.1 mrg unsigned char rws_insn[2];
6270 1.1 mrg
6271 1.1 mrg static inline void
6272 1.1 mrg rws_insn_set (int regno)
6273 1.1 mrg {
6274 1.1 mrg if (regno == REG_AR_CFM)
6275 1.1 mrg rws_insn[0] = 1;
6276 1.1 mrg else if (regno == REG_VOLATILE)
6277 1.1 mrg rws_insn[1] = 1;
6278 1.1 mrg }
6279 1.1 mrg
6280 1.1 mrg static inline int
6281 1.1 mrg rws_insn_test (int regno)
6282 1.1 mrg {
6283 1.1 mrg if (regno == REG_AR_CFM)
6284 1.1 mrg return rws_insn[0];
6285 1.1 mrg if (regno == REG_VOLATILE)
6286 1.1 mrg return rws_insn[1];
6287 1.1 mrg return 0;
6288 1.1 mrg }
6289 1.1 mrg #endif
6290 1.1 mrg
6291 1.1 mrg /* Indicates whether this is the first instruction after a stop bit,
6292 1.1 mrg in which case we don't need another stop bit. Without this,
6293 1.1 mrg ia64_variable_issue will die when scheduling an alloc. */
6294 1.1 mrg static int first_instruction;
6295 1.1 mrg
6296 1.1 mrg /* Misc flags needed to compute RAW/WAW dependencies while we are traversing
6297 1.1 mrg RTL for one instruction. */
6298 1.1 mrg struct reg_flags
6299 1.1 mrg {
6300 1.1 mrg unsigned int is_write : 1; /* Is register being written? */
6301 1.1 mrg unsigned int is_fp : 1; /* Is register used as part of an fp op? */
6302 1.1 mrg unsigned int is_branch : 1; /* Is register used as part of a branch? */
6303 1.1 mrg unsigned int is_and : 1; /* Is register used as part of and.orcm? */
6304 1.1 mrg unsigned int is_or : 1; /* Is register used as part of or.andcm? */
6305 1.1 mrg unsigned int is_sibcall : 1; /* Is this a sibling or normal call? */
6306 1.1 mrg };
6307 1.1 mrg
6308 1.1 mrg static void rws_update (int, struct reg_flags, int);
6309 1.1 mrg static int rws_access_regno (int, struct reg_flags, int);
6310 1.1 mrg static int rws_access_reg (rtx, struct reg_flags, int);
6311 1.1 mrg static void update_set_flags (rtx, struct reg_flags *);
6312 1.1 mrg static int set_src_needs_barrier (rtx, struct reg_flags, int);
6313 1.1 mrg static int rtx_needs_barrier (rtx, struct reg_flags, int);
6314 1.1 mrg static void init_insn_group_barriers (void);
6315 1.1 mrg static int group_barrier_needed (rtx_insn *);
6316 1.1 mrg static int safe_group_barrier_needed (rtx_insn *);
6317 1.1 mrg static int in_safe_group_barrier;
6318 1.1 mrg
6319 1.1 mrg /* Update *RWS for REGNO, which is being written by the current instruction,
6320 1.1 mrg with predicate PRED, and associated register flags in FLAGS. */
6321 1.1 mrg
6322 1.1 mrg static void
6323 1.1 mrg rws_update (int regno, struct reg_flags flags, int pred)
6324 1.1 mrg {
6325 1.1 mrg if (pred)
6326 1.1 mrg rws_sum[regno].write_count++;
6327 1.1 mrg else
6328 1.1 mrg rws_sum[regno].write_count = 2;
6329 1.1 mrg rws_sum[regno].written_by_fp |= flags.is_fp;
6330 1.1 mrg /* ??? Not tracking and/or across differing predicates. */
6331 1.1 mrg rws_sum[regno].written_by_and = flags.is_and;
6332 1.1 mrg rws_sum[regno].written_by_or = flags.is_or;
6333 1.1 mrg rws_sum[regno].first_pred = pred;
6334 1.1 mrg }
6335 1.1 mrg
6336 1.1 mrg /* Handle an access to register REGNO of type FLAGS using predicate register
6337 1.1 mrg PRED. Update rws_sum array. Return 1 if this access creates
6338 1.1 mrg a dependency with an earlier instruction in the same group. */
6339 1.1 mrg
6340 1.1 mrg static int
6341 1.1 mrg rws_access_regno (int regno, struct reg_flags flags, int pred)
6342 1.1 mrg {
6343 1.1 mrg int need_barrier = 0;
6344 1.1 mrg
6345 1.1 mrg gcc_assert (regno < NUM_REGS);
6346 1.1 mrg
6347 1.1 mrg if (! PR_REGNO_P (regno))
6348 1.1 mrg flags.is_and = flags.is_or = 0;
6349 1.1 mrg
6350 1.1 mrg if (flags.is_write)
6351 1.1 mrg {
6352 1.1 mrg int write_count;
6353 1.1 mrg
6354 1.1 mrg rws_insn_set (regno);
6355 1.1 mrg write_count = rws_sum[regno].write_count;
6356 1.1 mrg
6357 1.1 mrg switch (write_count)
6358 1.1 mrg {
6359 1.1 mrg case 0:
6360 1.1 mrg /* The register has not been written yet. */
6361 1.1 mrg if (!in_safe_group_barrier)
6362 1.1 mrg rws_update (regno, flags, pred);
6363 1.1 mrg break;
6364 1.1 mrg
6365 1.1 mrg case 1:
6366 1.1 mrg /* The register has been written via a predicate. Treat
6367 1.1 mrg it like a unconditional write and do not try to check
6368 1.1 mrg for complementary pred reg in earlier write. */
6369 1.1 mrg if (flags.is_and && rws_sum[regno].written_by_and)
6370 1.1 mrg ;
6371 1.1 mrg else if (flags.is_or && rws_sum[regno].written_by_or)
6372 1.1 mrg ;
6373 1.1 mrg else
6374 1.1 mrg need_barrier = 1;
6375 1.1 mrg if (!in_safe_group_barrier)
6376 1.1 mrg rws_update (regno, flags, pred);
6377 1.1 mrg break;
6378 1.1 mrg
6379 1.1 mrg case 2:
6380 1.1 mrg /* The register has been unconditionally written already. We
6381 1.1 mrg need a barrier. */
6382 1.1 mrg if (flags.is_and && rws_sum[regno].written_by_and)
6383 1.1 mrg ;
6384 1.1 mrg else if (flags.is_or && rws_sum[regno].written_by_or)
6385 1.1 mrg ;
6386 1.1 mrg else
6387 1.1 mrg need_barrier = 1;
6388 1.1 mrg if (!in_safe_group_barrier)
6389 1.1 mrg {
6390 1.1 mrg rws_sum[regno].written_by_and = flags.is_and;
6391 1.1 mrg rws_sum[regno].written_by_or = flags.is_or;
6392 1.1 mrg }
6393 1.1 mrg break;
6394 1.1 mrg
6395 1.1 mrg default:
6396 1.1 mrg gcc_unreachable ();
6397 1.1 mrg }
6398 1.1 mrg }
6399 1.1 mrg else
6400 1.1 mrg {
6401 1.1 mrg if (flags.is_branch)
6402 1.1 mrg {
6403 1.1 mrg /* Branches have several RAW exceptions that allow to avoid
6404 1.1 mrg barriers. */
6405 1.1 mrg
6406 1.1 mrg if (REGNO_REG_CLASS (regno) == BR_REGS || regno == AR_PFS_REGNUM)
6407 1.1 mrg /* RAW dependencies on branch regs are permissible as long
6408 1.1 mrg as the writer is a non-branch instruction. Since we
6409 1.1 mrg never generate code that uses a branch register written
6410 1.1 mrg by a branch instruction, handling this case is
6411 1.1 mrg easy. */
6412 1.1 mrg return 0;
6413 1.1 mrg
6414 1.1 mrg if (REGNO_REG_CLASS (regno) == PR_REGS
6415 1.1 mrg && ! rws_sum[regno].written_by_fp)
6416 1.1 mrg /* The predicates of a branch are available within the
6417 1.1 mrg same insn group as long as the predicate was written by
6418 1.1 mrg something other than a floating-point instruction. */
6419 1.1 mrg return 0;
6420 1.1 mrg }
6421 1.1 mrg
6422 1.1 mrg if (flags.is_and && rws_sum[regno].written_by_and)
6423 1.1 mrg return 0;
6424 1.1 mrg if (flags.is_or && rws_sum[regno].written_by_or)
6425 1.1 mrg return 0;
6426 1.1 mrg
6427 1.1 mrg switch (rws_sum[regno].write_count)
6428 1.1 mrg {
6429 1.1 mrg case 0:
6430 1.1 mrg /* The register has not been written yet. */
6431 1.1 mrg break;
6432 1.1 mrg
6433 1.1 mrg case 1:
6434 1.1 mrg /* The register has been written via a predicate, assume we
6435 1.1 mrg need a barrier (don't check for complementary regs). */
6436 1.1 mrg need_barrier = 1;
6437 1.1 mrg break;
6438 1.1 mrg
6439 1.1 mrg case 2:
6440 1.1 mrg /* The register has been unconditionally written already. We
6441 1.1 mrg need a barrier. */
6442 1.1 mrg need_barrier = 1;
6443 1.1 mrg break;
6444 1.1 mrg
6445 1.1 mrg default:
6446 1.1 mrg gcc_unreachable ();
6447 1.1 mrg }
6448 1.1 mrg }
6449 1.1 mrg
6450 1.1 mrg return need_barrier;
6451 1.1 mrg }
6452 1.1 mrg
6453 1.1 mrg static int
6454 1.1 mrg rws_access_reg (rtx reg, struct reg_flags flags, int pred)
6455 1.1 mrg {
6456 1.1 mrg int regno = REGNO (reg);
6457 1.1 mrg int n = REG_NREGS (reg);
6458 1.1 mrg
6459 1.1 mrg if (n == 1)
6460 1.1 mrg return rws_access_regno (regno, flags, pred);
6461 1.1 mrg else
6462 1.1 mrg {
6463 1.1 mrg int need_barrier = 0;
6464 1.1 mrg while (--n >= 0)
6465 1.1 mrg need_barrier |= rws_access_regno (regno + n, flags, pred);
6466 1.1 mrg return need_barrier;
6467 1.1 mrg }
6468 1.1 mrg }
6469 1.1 mrg
6470 1.1 mrg /* Examine X, which is a SET rtx, and update the flags, the predicate, and
6471 1.1 mrg the condition, stored in *PFLAGS, *PPRED and *PCOND. */
6472 1.1 mrg
6473 1.1 mrg static void
6474 1.1 mrg update_set_flags (rtx x, struct reg_flags *pflags)
6475 1.1 mrg {
6476 1.1 mrg rtx src = SET_SRC (x);
6477 1.1 mrg
6478 1.1 mrg switch (GET_CODE (src))
6479 1.1 mrg {
6480 1.1 mrg case CALL:
6481 1.1 mrg return;
6482 1.1 mrg
6483 1.1 mrg case IF_THEN_ELSE:
6484 1.1 mrg /* There are four cases here:
6485 1.1 mrg (1) The destination is (pc), in which case this is a branch,
6486 1.1 mrg nothing here applies.
6487 1.1 mrg (2) The destination is ar.lc, in which case this is a
6488 1.1 mrg doloop_end_internal,
6489 1.1 mrg (3) The destination is an fp register, in which case this is
6490 1.1 mrg an fselect instruction.
6491 1.1 mrg (4) The condition has (unspec [(reg)] UNSPEC_LDC), in which case
6492 1.1 mrg this is a check load.
6493 1.1 mrg In all cases, nothing we do in this function applies. */
6494 1.1 mrg return;
6495 1.1 mrg
6496 1.1 mrg default:
6497 1.1 mrg if (COMPARISON_P (src)
6498 1.1 mrg && SCALAR_FLOAT_MODE_P (GET_MODE (XEXP (src, 0))))
6499 1.1 mrg /* Set pflags->is_fp to 1 so that we know we're dealing
6500 1.1 mrg with a floating point comparison when processing the
6501 1.1 mrg destination of the SET. */
6502 1.1 mrg pflags->is_fp = 1;
6503 1.1 mrg
6504 1.1 mrg /* Discover if this is a parallel comparison. We only handle
6505 1.1 mrg and.orcm and or.andcm at present, since we must retain a
6506 1.1 mrg strict inverse on the predicate pair. */
6507 1.1 mrg else if (GET_CODE (src) == AND)
6508 1.1 mrg pflags->is_and = 1;
6509 1.1 mrg else if (GET_CODE (src) == IOR)
6510 1.1 mrg pflags->is_or = 1;
6511 1.1 mrg
6512 1.1 mrg break;
6513 1.1 mrg }
6514 1.1 mrg }
6515 1.1 mrg
6516 1.1 mrg /* Subroutine of rtx_needs_barrier; this function determines whether the
6517 1.1 mrg source of a given SET rtx found in X needs a barrier. FLAGS and PRED
6518 1.1 mrg are as in rtx_needs_barrier. COND is an rtx that holds the condition
6519 1.1 mrg for this insn. */
6520 1.1 mrg
6521 1.1 mrg static int
6522 1.1 mrg set_src_needs_barrier (rtx x, struct reg_flags flags, int pred)
6523 1.1 mrg {
6524 1.1 mrg int need_barrier = 0;
6525 1.1 mrg rtx dst;
6526 1.1 mrg rtx src = SET_SRC (x);
6527 1.1 mrg
6528 1.1 mrg if (GET_CODE (src) == CALL)
6529 1.1 mrg /* We don't need to worry about the result registers that
6530 1.1 mrg get written by subroutine call. */
6531 1.1 mrg return rtx_needs_barrier (src, flags, pred);
6532 1.1 mrg else if (SET_DEST (x) == pc_rtx)
6533 1.1 mrg {
6534 1.1 mrg /* X is a conditional branch. */
6535 1.1 mrg /* ??? This seems redundant, as the caller sets this bit for
6536 1.1 mrg all JUMP_INSNs. */
6537 1.1 mrg if (!ia64_spec_check_src_p (src))
6538 1.1 mrg flags.is_branch = 1;
6539 1.1 mrg return rtx_needs_barrier (src, flags, pred);
6540 1.1 mrg }
6541 1.1 mrg
6542 1.1 mrg if (ia64_spec_check_src_p (src))
6543 1.1 mrg /* Avoid checking one register twice (in condition
6544 1.1 mrg and in 'then' section) for ldc pattern. */
6545 1.1 mrg {
6546 1.1 mrg gcc_assert (REG_P (XEXP (src, 2)));
6547 1.1 mrg need_barrier = rtx_needs_barrier (XEXP (src, 2), flags, pred);
6548 1.1 mrg
6549 1.1 mrg /* We process MEM below. */
6550 1.1 mrg src = XEXP (src, 1);
6551 1.1 mrg }
6552 1.1 mrg
6553 1.1 mrg need_barrier |= rtx_needs_barrier (src, flags, pred);
6554 1.1 mrg
6555 1.1 mrg dst = SET_DEST (x);
6556 1.1 mrg if (GET_CODE (dst) == ZERO_EXTRACT)
6557 1.1 mrg {
6558 1.1 mrg need_barrier |= rtx_needs_barrier (XEXP (dst, 1), flags, pred);
6559 1.1 mrg need_barrier |= rtx_needs_barrier (XEXP (dst, 2), flags, pred);
6560 1.1 mrg }
6561 1.1 mrg return need_barrier;
6562 1.1 mrg }
6563 1.1 mrg
6564 1.1 mrg /* Handle an access to rtx X of type FLAGS using predicate register
6565 1.1 mrg PRED. Return 1 if this access creates a dependency with an earlier
6566 1.1 mrg instruction in the same group. */
6567 1.1 mrg
6568 1.1 mrg static int
6569 1.1 mrg rtx_needs_barrier (rtx x, struct reg_flags flags, int pred)
6570 1.1 mrg {
6571 1.1 mrg int i, j;
6572 1.1 mrg int is_complemented = 0;
6573 1.1 mrg int need_barrier = 0;
6574 1.1 mrg const char *format_ptr;
6575 1.1 mrg struct reg_flags new_flags;
6576 1.1 mrg rtx cond;
6577 1.1 mrg
6578 1.1 mrg if (! x)
6579 1.1 mrg return 0;
6580 1.1 mrg
6581 1.1 mrg new_flags = flags;
6582 1.1 mrg
6583 1.1 mrg switch (GET_CODE (x))
6584 1.1 mrg {
6585 1.1 mrg case SET:
6586 1.1 mrg update_set_flags (x, &new_flags);
6587 1.1 mrg need_barrier = set_src_needs_barrier (x, new_flags, pred);
6588 1.1 mrg if (GET_CODE (SET_SRC (x)) != CALL)
6589 1.1 mrg {
6590 1.1 mrg new_flags.is_write = 1;
6591 1.1 mrg need_barrier |= rtx_needs_barrier (SET_DEST (x), new_flags, pred);
6592 1.1 mrg }
6593 1.1 mrg break;
6594 1.1 mrg
6595 1.1 mrg case CALL:
6596 1.1 mrg new_flags.is_write = 0;
6597 1.1 mrg need_barrier |= rws_access_regno (AR_EC_REGNUM, new_flags, pred);
6598 1.1 mrg
6599 1.1 mrg /* Avoid multiple register writes, in case this is a pattern with
6600 1.1 mrg multiple CALL rtx. This avoids a failure in rws_access_reg. */
6601 1.1 mrg if (! flags.is_sibcall && ! rws_insn_test (REG_AR_CFM))
6602 1.1 mrg {
6603 1.1 mrg new_flags.is_write = 1;
6604 1.1 mrg need_barrier |= rws_access_regno (REG_RP, new_flags, pred);
6605 1.1 mrg need_barrier |= rws_access_regno (AR_PFS_REGNUM, new_flags, pred);
6606 1.1 mrg need_barrier |= rws_access_regno (REG_AR_CFM, new_flags, pred);
6607 1.1 mrg }
6608 1.1 mrg break;
6609 1.1 mrg
6610 1.1 mrg case COND_EXEC:
6611 1.1 mrg /* X is a predicated instruction. */
6612 1.1 mrg
6613 1.1 mrg cond = COND_EXEC_TEST (x);
6614 1.1 mrg gcc_assert (!pred);
6615 1.1 mrg need_barrier = rtx_needs_barrier (cond, flags, 0);
6616 1.1 mrg
6617 1.1 mrg if (GET_CODE (cond) == EQ)
6618 1.1 mrg is_complemented = 1;
6619 1.1 mrg cond = XEXP (cond, 0);
6620 1.1 mrg gcc_assert (GET_CODE (cond) == REG
6621 1.1 mrg && REGNO_REG_CLASS (REGNO (cond)) == PR_REGS);
6622 1.1 mrg pred = REGNO (cond);
6623 1.1 mrg if (is_complemented)
6624 1.1 mrg ++pred;
6625 1.1 mrg
6626 1.1 mrg need_barrier |= rtx_needs_barrier (COND_EXEC_CODE (x), flags, pred);
6627 1.1 mrg return need_barrier;
6628 1.1 mrg
6629 1.1 mrg case CLOBBER:
6630 1.1 mrg case USE:
6631 1.1 mrg /* Clobber & use are for earlier compiler-phases only. */
6632 1.1 mrg break;
6633 1.1 mrg
6634 1.1 mrg case ASM_OPERANDS:
6635 1.1 mrg case ASM_INPUT:
6636 1.1 mrg /* We always emit stop bits for traditional asms. We emit stop bits
6637 1.1 mrg for volatile extended asms if TARGET_VOL_ASM_STOP is true. */
6638 1.1 mrg if (GET_CODE (x) != ASM_OPERANDS
6639 1.1 mrg || (MEM_VOLATILE_P (x) && TARGET_VOL_ASM_STOP))
6640 1.1 mrg {
6641 1.1 mrg /* Avoid writing the register multiple times if we have multiple
6642 1.1 mrg asm outputs. This avoids a failure in rws_access_reg. */
6643 1.1 mrg if (! rws_insn_test (REG_VOLATILE))
6644 1.1 mrg {
6645 1.1 mrg new_flags.is_write = 1;
6646 1.1 mrg rws_access_regno (REG_VOLATILE, new_flags, pred);
6647 1.1 mrg }
6648 1.1 mrg return 1;
6649 1.1 mrg }
6650 1.1 mrg
6651 1.1 mrg /* For all ASM_OPERANDS, we must traverse the vector of input operands.
6652 1.1 mrg We cannot just fall through here since then we would be confused
6653 1.1 mrg by the ASM_INPUT rtx inside ASM_OPERANDS, which do not indicate
6654 1.1 mrg traditional asms unlike their normal usage. */
6655 1.1 mrg
6656 1.1 mrg for (i = ASM_OPERANDS_INPUT_LENGTH (x) - 1; i >= 0; --i)
6657 1.1 mrg if (rtx_needs_barrier (ASM_OPERANDS_INPUT (x, i), flags, pred))
6658 1.1 mrg need_barrier = 1;
6659 1.1 mrg break;
6660 1.1 mrg
6661 1.1 mrg case PARALLEL:
6662 1.1 mrg for (i = XVECLEN (x, 0) - 1; i >= 0; --i)
6663 1.1 mrg {
6664 1.1 mrg rtx pat = XVECEXP (x, 0, i);
6665 1.1 mrg switch (GET_CODE (pat))
6666 1.1 mrg {
6667 1.1 mrg case SET:
6668 1.1 mrg update_set_flags (pat, &new_flags);
6669 1.1 mrg need_barrier |= set_src_needs_barrier (pat, new_flags, pred);
6670 1.1 mrg break;
6671 1.1 mrg
6672 1.1 mrg case USE:
6673 1.1 mrg case CALL:
6674 1.1 mrg case ASM_OPERANDS:
6675 1.1 mrg case ASM_INPUT:
6676 1.1 mrg need_barrier |= rtx_needs_barrier (pat, flags, pred);
6677 1.1 mrg break;
6678 1.1 mrg
6679 1.1 mrg case CLOBBER:
6680 1.1 mrg if (REG_P (XEXP (pat, 0))
6681 1.1 mrg && extract_asm_operands (x) != NULL_RTX
6682 1.1 mrg && REGNO (XEXP (pat, 0)) != AR_UNAT_REGNUM)
6683 1.1 mrg {
6684 1.1 mrg new_flags.is_write = 1;
6685 1.1 mrg need_barrier |= rtx_needs_barrier (XEXP (pat, 0),
6686 1.1 mrg new_flags, pred);
6687 1.1 mrg new_flags = flags;
6688 1.1 mrg }
6689 1.1 mrg break;
6690 1.1 mrg
6691 1.1 mrg case RETURN:
6692 1.1 mrg break;
6693 1.1 mrg
6694 1.1 mrg default:
6695 1.1 mrg gcc_unreachable ();
6696 1.1 mrg }
6697 1.1 mrg }
6698 1.1 mrg for (i = XVECLEN (x, 0) - 1; i >= 0; --i)
6699 1.1 mrg {
6700 1.1 mrg rtx pat = XVECEXP (x, 0, i);
6701 1.1 mrg if (GET_CODE (pat) == SET)
6702 1.1 mrg {
6703 1.1 mrg if (GET_CODE (SET_SRC (pat)) != CALL)
6704 1.1 mrg {
6705 1.1 mrg new_flags.is_write = 1;
6706 1.1 mrg need_barrier |= rtx_needs_barrier (SET_DEST (pat), new_flags,
6707 1.1 mrg pred);
6708 1.1 mrg }
6709 1.1 mrg }
6710 1.1 mrg else if (GET_CODE (pat) == CLOBBER || GET_CODE (pat) == RETURN)
6711 1.1 mrg need_barrier |= rtx_needs_barrier (pat, flags, pred);
6712 1.1 mrg }
6713 1.1 mrg break;
6714 1.1 mrg
6715 1.1 mrg case SUBREG:
6716 1.1 mrg need_barrier |= rtx_needs_barrier (SUBREG_REG (x), flags, pred);
6717 1.1 mrg break;
6718 1.1 mrg case REG:
6719 1.1 mrg if (REGNO (x) == AR_UNAT_REGNUM)
6720 1.1 mrg {
6721 1.1 mrg for (i = 0; i < 64; ++i)
6722 1.1 mrg need_barrier |= rws_access_regno (AR_UNAT_BIT_0 + i, flags, pred);
6723 1.1 mrg }
6724 1.1 mrg else
6725 1.1 mrg need_barrier = rws_access_reg (x, flags, pred);
6726 1.1 mrg break;
6727 1.1 mrg
6728 1.1 mrg case MEM:
6729 1.1 mrg /* Find the regs used in memory address computation. */
6730 1.1 mrg new_flags.is_write = 0;
6731 1.1 mrg need_barrier = rtx_needs_barrier (XEXP (x, 0), new_flags, pred);
6732 1.1 mrg break;
6733 1.1 mrg
6734 1.1 mrg case CONST_INT: case CONST_DOUBLE: case CONST_VECTOR:
6735 1.1 mrg case SYMBOL_REF: case LABEL_REF: case CONST:
6736 1.1 mrg break;
6737 1.1 mrg
6738 1.1 mrg /* Operators with side-effects. */
6739 1.1 mrg case POST_INC: case POST_DEC:
6740 1.1 mrg gcc_assert (GET_CODE (XEXP (x, 0)) == REG);
6741 1.1 mrg
6742 1.1 mrg new_flags.is_write = 0;
6743 1.1 mrg need_barrier = rws_access_reg (XEXP (x, 0), new_flags, pred);
6744 1.1 mrg new_flags.is_write = 1;
6745 1.1 mrg need_barrier |= rws_access_reg (XEXP (x, 0), new_flags, pred);
6746 1.1 mrg break;
6747 1.1 mrg
6748 1.1 mrg case POST_MODIFY:
6749 1.1 mrg gcc_assert (GET_CODE (XEXP (x, 0)) == REG);
6750 1.1 mrg
6751 1.1 mrg new_flags.is_write = 0;
6752 1.1 mrg need_barrier = rws_access_reg (XEXP (x, 0), new_flags, pred);
6753 1.1 mrg need_barrier |= rtx_needs_barrier (XEXP (x, 1), new_flags, pred);
6754 1.1 mrg new_flags.is_write = 1;
6755 1.1 mrg need_barrier |= rws_access_reg (XEXP (x, 0), new_flags, pred);
6756 1.1 mrg break;
6757 1.1 mrg
6758 1.1 mrg /* Handle common unary and binary ops for efficiency. */
6759 1.1 mrg case COMPARE: case PLUS: case MINUS: case MULT: case DIV:
6760 1.1 mrg case MOD: case UDIV: case UMOD: case AND: case IOR:
6761 1.1 mrg case XOR: case ASHIFT: case ROTATE: case ASHIFTRT: case LSHIFTRT:
6762 1.1 mrg case ROTATERT: case SMIN: case SMAX: case UMIN: case UMAX:
6763 1.1 mrg case NE: case EQ: case GE: case GT: case LE:
6764 1.1 mrg case LT: case GEU: case GTU: case LEU: case LTU:
6765 1.1 mrg need_barrier = rtx_needs_barrier (XEXP (x, 0), new_flags, pred);
6766 1.1 mrg need_barrier |= rtx_needs_barrier (XEXP (x, 1), new_flags, pred);
6767 1.1 mrg break;
6768 1.1 mrg
6769 1.1 mrg case NEG: case NOT: case SIGN_EXTEND: case ZERO_EXTEND:
6770 1.1 mrg case TRUNCATE: case FLOAT_EXTEND: case FLOAT_TRUNCATE: case FLOAT:
6771 1.1 mrg case FIX: case UNSIGNED_FLOAT: case UNSIGNED_FIX: case ABS:
6772 1.1 mrg case SQRT: case FFS: case POPCOUNT:
6773 1.1 mrg need_barrier = rtx_needs_barrier (XEXP (x, 0), flags, pred);
6774 1.1 mrg break;
6775 1.1 mrg
6776 1.1 mrg case VEC_SELECT:
6777 1.1 mrg /* VEC_SELECT's second argument is a PARALLEL with integers that
6778 1.1 mrg describe the elements selected. On ia64, those integers are
6779 1.1 mrg always constants. Avoid walking the PARALLEL so that we don't
6780 1.1 mrg get confused with "normal" parallels and then die. */
6781 1.1 mrg need_barrier = rtx_needs_barrier (XEXP (x, 0), flags, pred);
6782 1.1 mrg break;
6783 1.1 mrg
6784 1.1 mrg case UNSPEC:
6785 1.1 mrg switch (XINT (x, 1))
6786 1.1 mrg {
6787 1.1 mrg case UNSPEC_LTOFF_DTPMOD:
6788 1.1 mrg case UNSPEC_LTOFF_DTPREL:
6789 1.1 mrg case UNSPEC_DTPREL:
6790 1.1 mrg case UNSPEC_LTOFF_TPREL:
6791 1.1 mrg case UNSPEC_TPREL:
6792 1.1 mrg case UNSPEC_PRED_REL_MUTEX:
6793 1.1 mrg case UNSPEC_PIC_CALL:
6794 1.1 mrg case UNSPEC_MF:
6795 1.1 mrg case UNSPEC_FETCHADD_ACQ:
6796 1.1 mrg case UNSPEC_FETCHADD_REL:
6797 1.1 mrg case UNSPEC_BSP_VALUE:
6798 1.1 mrg case UNSPEC_FLUSHRS:
6799 1.1 mrg case UNSPEC_BUNDLE_SELECTOR:
6800 1.1 mrg break;
6801 1.1 mrg
6802 1.1 mrg case UNSPEC_GR_SPILL:
6803 1.1 mrg case UNSPEC_GR_RESTORE:
6804 1.1 mrg {
6805 1.1 mrg HOST_WIDE_INT offset = INTVAL (XVECEXP (x, 0, 1));
6806 1.1 mrg HOST_WIDE_INT bit = (offset >> 3) & 63;
6807 1.1 mrg
6808 1.1 mrg need_barrier = rtx_needs_barrier (XVECEXP (x, 0, 0), flags, pred);
6809 1.1 mrg new_flags.is_write = (XINT (x, 1) == UNSPEC_GR_SPILL);
6810 1.1 mrg need_barrier |= rws_access_regno (AR_UNAT_BIT_0 + bit,
6811 1.1 mrg new_flags, pred);
6812 1.1 mrg break;
6813 1.1 mrg }
6814 1.1 mrg
6815 1.1 mrg case UNSPEC_FR_SPILL:
6816 1.1 mrg case UNSPEC_FR_RESTORE:
6817 1.1 mrg case UNSPEC_GETF_EXP:
6818 1.1 mrg case UNSPEC_SETF_EXP:
6819 1.1 mrg case UNSPEC_ADDP4:
6820 1.1 mrg case UNSPEC_FR_SQRT_RECIP_APPROX:
6821 1.1 mrg case UNSPEC_FR_SQRT_RECIP_APPROX_RES:
6822 1.1 mrg case UNSPEC_LDA:
6823 1.1 mrg case UNSPEC_LDS:
6824 1.1 mrg case UNSPEC_LDS_A:
6825 1.1 mrg case UNSPEC_LDSA:
6826 1.1 mrg case UNSPEC_CHKACLR:
6827 1.1 mrg case UNSPEC_CHKS:
6828 1.1 mrg need_barrier = rtx_needs_barrier (XVECEXP (x, 0, 0), flags, pred);
6829 1.1 mrg break;
6830 1.1 mrg
6831 1.1 mrg case UNSPEC_FR_RECIP_APPROX:
6832 1.1 mrg case UNSPEC_SHRP:
6833 1.1 mrg case UNSPEC_COPYSIGN:
6834 1.1 mrg case UNSPEC_FR_RECIP_APPROX_RES:
6835 1.1 mrg need_barrier = rtx_needs_barrier (XVECEXP (x, 0, 0), flags, pred);
6836 1.1 mrg need_barrier |= rtx_needs_barrier (XVECEXP (x, 0, 1), flags, pred);
6837 1.1 mrg break;
6838 1.1 mrg
6839 1.1 mrg case UNSPEC_CMPXCHG_ACQ:
6840 1.1 mrg case UNSPEC_CMPXCHG_REL:
6841 1.1 mrg need_barrier = rtx_needs_barrier (XVECEXP (x, 0, 1), flags, pred);
6842 1.1 mrg need_barrier |= rtx_needs_barrier (XVECEXP (x, 0, 2), flags, pred);
6843 1.1 mrg break;
6844 1.1 mrg
6845 1.1 mrg default:
6846 1.1 mrg gcc_unreachable ();
6847 1.1 mrg }
6848 1.1 mrg break;
6849 1.1 mrg
6850 1.1 mrg case UNSPEC_VOLATILE:
6851 1.1 mrg switch (XINT (x, 1))
6852 1.1 mrg {
6853 1.1 mrg case UNSPECV_ALLOC:
6854 1.1 mrg /* Alloc must always be the first instruction of a group.
6855 1.1 mrg We force this by always returning true. */
6856 1.1 mrg /* ??? We might get better scheduling if we explicitly check for
6857 1.1 mrg input/local/output register dependencies, and modify the
6858 1.1 mrg scheduler so that alloc is always reordered to the start of
6859 1.1 mrg the current group. We could then eliminate all of the
6860 1.1 mrg first_instruction code. */
6861 1.1 mrg rws_access_regno (AR_PFS_REGNUM, flags, pred);
6862 1.1 mrg
6863 1.1 mrg new_flags.is_write = 1;
6864 1.1 mrg rws_access_regno (REG_AR_CFM, new_flags, pred);
6865 1.1 mrg return 1;
6866 1.1 mrg
6867 1.1 mrg case UNSPECV_SET_BSP:
6868 1.1 mrg case UNSPECV_PROBE_STACK_RANGE:
6869 1.1 mrg need_barrier = 1;
6870 1.1 mrg break;
6871 1.1 mrg
6872 1.1 mrg case UNSPECV_BLOCKAGE:
6873 1.1 mrg case UNSPECV_INSN_GROUP_BARRIER:
6874 1.1 mrg case UNSPECV_BREAK:
6875 1.1 mrg case UNSPECV_PSAC_ALL:
6876 1.1 mrg case UNSPECV_PSAC_NORMAL:
6877 1.1 mrg return 0;
6878 1.1 mrg
6879 1.1 mrg case UNSPECV_PROBE_STACK_ADDRESS:
6880 1.1 mrg need_barrier = rtx_needs_barrier (XVECEXP (x, 0, 0), flags, pred);
6881 1.1 mrg break;
6882 1.1 mrg
6883 1.1 mrg default:
6884 1.1 mrg gcc_unreachable ();
6885 1.1 mrg }
6886 1.1 mrg break;
6887 1.1 mrg
6888 1.1 mrg case RETURN:
6889 1.1 mrg new_flags.is_write = 0;
6890 1.1 mrg need_barrier = rws_access_regno (REG_RP, flags, pred);
6891 1.1 mrg need_barrier |= rws_access_regno (AR_PFS_REGNUM, flags, pred);
6892 1.1 mrg
6893 1.1 mrg new_flags.is_write = 1;
6894 1.1 mrg need_barrier |= rws_access_regno (AR_EC_REGNUM, new_flags, pred);
6895 1.1 mrg need_barrier |= rws_access_regno (REG_AR_CFM, new_flags, pred);
6896 1.1 mrg break;
6897 1.1 mrg
6898 1.1 mrg default:
6899 1.1 mrg format_ptr = GET_RTX_FORMAT (GET_CODE (x));
6900 1.1 mrg for (i = GET_RTX_LENGTH (GET_CODE (x)) - 1; i >= 0; i--)
6901 1.1 mrg switch (format_ptr[i])
6902 1.1 mrg {
6903 1.1 mrg case '0': /* unused field */
6904 1.1 mrg case 'i': /* integer */
6905 1.1 mrg case 'n': /* note */
6906 1.1 mrg case 'w': /* wide integer */
6907 1.1 mrg case 's': /* pointer to string */
6908 1.1 mrg case 'S': /* optional pointer to string */
6909 1.1 mrg break;
6910 1.1 mrg
6911 1.1 mrg case 'e':
6912 1.1 mrg if (rtx_needs_barrier (XEXP (x, i), flags, pred))
6913 1.1 mrg need_barrier = 1;
6914 1.1 mrg break;
6915 1.1 mrg
6916 1.1 mrg case 'E':
6917 1.1 mrg for (j = XVECLEN (x, i) - 1; j >= 0; --j)
6918 1.1 mrg if (rtx_needs_barrier (XVECEXP (x, i, j), flags, pred))
6919 1.1 mrg need_barrier = 1;
6920 1.1 mrg break;
6921 1.1 mrg
6922 1.1 mrg default:
6923 1.1 mrg gcc_unreachable ();
6924 1.1 mrg }
6925 1.1 mrg break;
6926 1.1 mrg }
6927 1.1 mrg return need_barrier;
6928 1.1 mrg }
6929 1.1 mrg
6930 1.1 mrg /* Clear out the state for group_barrier_needed at the start of a
6931 1.1 mrg sequence of insns. */
6932 1.1 mrg
6933 1.1 mrg static void
6934 1.1 mrg init_insn_group_barriers (void)
6935 1.1 mrg {
6936 1.1 mrg memset (rws_sum, 0, sizeof (rws_sum));
6937 1.1 mrg first_instruction = 1;
6938 1.1 mrg }
6939 1.1 mrg
6940 1.1 mrg /* Given the current state, determine whether a group barrier (a stop bit) is
6941 1.1 mrg necessary before INSN. Return nonzero if so. This modifies the state to
6942 1.1 mrg include the effects of INSN as a side-effect. */
6943 1.1 mrg
6944 1.1 mrg static int
6945 1.1 mrg group_barrier_needed (rtx_insn *insn)
6946 1.1 mrg {
6947 1.1 mrg rtx pat;
6948 1.1 mrg int need_barrier = 0;
6949 1.1 mrg struct reg_flags flags;
6950 1.1 mrg
6951 1.1 mrg memset (&flags, 0, sizeof (flags));
6952 1.1 mrg switch (GET_CODE (insn))
6953 1.1 mrg {
6954 1.1 mrg case NOTE:
6955 1.1 mrg case DEBUG_INSN:
6956 1.1 mrg break;
6957 1.1 mrg
6958 1.1 mrg case BARRIER:
6959 1.1 mrg /* A barrier doesn't imply an instruction group boundary. */
6960 1.1 mrg break;
6961 1.1 mrg
6962 1.1 mrg case CODE_LABEL:
6963 1.1 mrg memset (rws_insn, 0, sizeof (rws_insn));
6964 1.1 mrg return 1;
6965 1.1 mrg
6966 1.1 mrg case CALL_INSN:
6967 1.1 mrg flags.is_branch = 1;
6968 1.1 mrg flags.is_sibcall = SIBLING_CALL_P (insn);
6969 1.1 mrg memset (rws_insn, 0, sizeof (rws_insn));
6970 1.1 mrg
6971 1.1 mrg /* Don't bundle a call following another call. */
6972 1.1 mrg if ((pat = prev_active_insn (insn)) && CALL_P (pat))
6973 1.1 mrg {
6974 1.1 mrg need_barrier = 1;
6975 1.1 mrg break;
6976 1.1 mrg }
6977 1.1 mrg
6978 1.1 mrg need_barrier = rtx_needs_barrier (PATTERN (insn), flags, 0);
6979 1.1 mrg break;
6980 1.1 mrg
6981 1.1 mrg case JUMP_INSN:
6982 1.1 mrg if (!ia64_spec_check_p (insn))
6983 1.1 mrg flags.is_branch = 1;
6984 1.1 mrg
6985 1.1 mrg /* Don't bundle a jump following a call. */
6986 1.1 mrg if ((pat = prev_active_insn (insn)) && CALL_P (pat))
6987 1.1 mrg {
6988 1.1 mrg need_barrier = 1;
6989 1.1 mrg break;
6990 1.1 mrg }
6991 1.1 mrg /* FALLTHRU */
6992 1.1 mrg
6993 1.1 mrg case INSN:
6994 1.1 mrg if (GET_CODE (PATTERN (insn)) == USE
6995 1.1 mrg || GET_CODE (PATTERN (insn)) == CLOBBER)
6996 1.1 mrg /* Don't care about USE and CLOBBER "insns"---those are used to
6997 1.1 mrg indicate to the optimizer that it shouldn't get rid of
6998 1.1 mrg certain operations. */
6999 1.1 mrg break;
7000 1.1 mrg
7001 1.1 mrg pat = PATTERN (insn);
7002 1.1 mrg
7003 1.1 mrg /* Ug. Hack hacks hacked elsewhere. */
7004 1.1 mrg switch (recog_memoized (insn))
7005 1.1 mrg {
7006 1.1 mrg /* We play dependency tricks with the epilogue in order
7007 1.1 mrg to get proper schedules. Undo this for dv analysis. */
7008 1.1 mrg case CODE_FOR_epilogue_deallocate_stack:
7009 1.1 mrg case CODE_FOR_prologue_allocate_stack:
7010 1.1 mrg pat = XVECEXP (pat, 0, 0);
7011 1.1 mrg break;
7012 1.1 mrg
7013 1.1 mrg /* The pattern we use for br.cloop confuses the code above.
7014 1.1 mrg The second element of the vector is representative. */
7015 1.1 mrg case CODE_FOR_doloop_end_internal:
7016 1.1 mrg pat = XVECEXP (pat, 0, 1);
7017 1.1 mrg break;
7018 1.1 mrg
7019 1.1 mrg /* Doesn't generate code. */
7020 1.1 mrg case CODE_FOR_pred_rel_mutex:
7021 1.1 mrg case CODE_FOR_prologue_use:
7022 1.1 mrg return 0;
7023 1.1 mrg
7024 1.1 mrg default:
7025 1.1 mrg break;
7026 1.1 mrg }
7027 1.1 mrg
7028 1.1 mrg memset (rws_insn, 0, sizeof (rws_insn));
7029 1.1 mrg need_barrier = rtx_needs_barrier (pat, flags, 0);
7030 1.1 mrg
7031 1.1 mrg /* Check to see if the previous instruction was a volatile
7032 1.1 mrg asm. */
7033 1.1 mrg if (! need_barrier)
7034 1.1 mrg need_barrier = rws_access_regno (REG_VOLATILE, flags, 0);
7035 1.1 mrg
7036 1.1 mrg break;
7037 1.1 mrg
7038 1.1 mrg default:
7039 1.1 mrg gcc_unreachable ();
7040 1.1 mrg }
7041 1.1 mrg
7042 1.1 mrg if (first_instruction && important_for_bundling_p (insn))
7043 1.1 mrg {
7044 1.1 mrg need_barrier = 0;
7045 1.1 mrg first_instruction = 0;
7046 1.1 mrg }
7047 1.1 mrg
7048 1.1 mrg return need_barrier;
7049 1.1 mrg }
7050 1.1 mrg
7051 1.1 mrg /* Like group_barrier_needed, but do not clobber the current state. */
7052 1.1 mrg
7053 1.1 mrg static int
7054 1.1 mrg safe_group_barrier_needed (rtx_insn *insn)
7055 1.1 mrg {
7056 1.1 mrg int saved_first_instruction;
7057 1.1 mrg int t;
7058 1.1 mrg
7059 1.1 mrg saved_first_instruction = first_instruction;
7060 1.1 mrg in_safe_group_barrier = 1;
7061 1.1 mrg
7062 1.1 mrg t = group_barrier_needed (insn);
7063 1.1 mrg
7064 1.1 mrg first_instruction = saved_first_instruction;
7065 1.1 mrg in_safe_group_barrier = 0;
7066 1.1 mrg
7067 1.1 mrg return t;
7068 1.1 mrg }
7069 1.1 mrg
7070 1.1 mrg /* Scan the current function and insert stop bits as necessary to
7071 1.1 mrg eliminate dependencies. This function assumes that a final
7072 1.1 mrg instruction scheduling pass has been run which has already
7073 1.1 mrg inserted most of the necessary stop bits. This function only
7074 1.1 mrg inserts new ones at basic block boundaries, since these are
7075 1.1 mrg invisible to the scheduler. */
7076 1.1 mrg
7077 1.1 mrg static void
7078 1.1 mrg emit_insn_group_barriers (FILE *dump)
7079 1.1 mrg {
7080 1.1 mrg rtx_insn *insn;
7081 1.1 mrg rtx_insn *last_label = 0;
7082 1.1 mrg int insns_since_last_label = 0;
7083 1.1 mrg
7084 1.1 mrg init_insn_group_barriers ();
7085 1.1 mrg
7086 1.1 mrg for (insn = get_insns (); insn; insn = NEXT_INSN (insn))
7087 1.1 mrg {
7088 1.1 mrg if (LABEL_P (insn))
7089 1.1 mrg {
7090 1.1 mrg if (insns_since_last_label)
7091 1.1 mrg last_label = insn;
7092 1.1 mrg insns_since_last_label = 0;
7093 1.1 mrg }
7094 1.1 mrg else if (NOTE_P (insn)
7095 1.1 mrg && NOTE_KIND (insn) == NOTE_INSN_BASIC_BLOCK)
7096 1.1 mrg {
7097 1.1 mrg if (insns_since_last_label)
7098 1.1 mrg last_label = insn;
7099 1.1 mrg insns_since_last_label = 0;
7100 1.1 mrg }
7101 1.1 mrg else if (NONJUMP_INSN_P (insn)
7102 1.1 mrg && GET_CODE (PATTERN (insn)) == UNSPEC_VOLATILE
7103 1.1 mrg && XINT (PATTERN (insn), 1) == UNSPECV_INSN_GROUP_BARRIER)
7104 1.1 mrg {
7105 1.1 mrg init_insn_group_barriers ();
7106 1.1 mrg last_label = 0;
7107 1.1 mrg }
7108 1.1 mrg else if (NONDEBUG_INSN_P (insn))
7109 1.1 mrg {
7110 1.1 mrg insns_since_last_label = 1;
7111 1.1 mrg
7112 1.1 mrg if (group_barrier_needed (insn))
7113 1.1 mrg {
7114 1.1 mrg if (last_label)
7115 1.1 mrg {
7116 1.1 mrg if (dump)
7117 1.1 mrg fprintf (dump, "Emitting stop before label %d\n",
7118 1.1 mrg INSN_UID (last_label));
7119 1.1 mrg emit_insn_before (gen_insn_group_barrier (GEN_INT (3)), last_label);
7120 1.1 mrg insn = last_label;
7121 1.1 mrg
7122 1.1 mrg init_insn_group_barriers ();
7123 1.1 mrg last_label = 0;
7124 1.1 mrg }
7125 1.1 mrg }
7126 1.1 mrg }
7127 1.1 mrg }
7128 1.1 mrg }
7129 1.1 mrg
7130 1.1 mrg /* Like emit_insn_group_barriers, but run if no final scheduling pass was run.
7131 1.1 mrg This function has to emit all necessary group barriers. */
7132 1.1 mrg
7133 1.1 mrg static void
7134 1.1 mrg emit_all_insn_group_barriers (FILE *dump ATTRIBUTE_UNUSED)
7135 1.1 mrg {
7136 1.1 mrg rtx_insn *insn;
7137 1.1 mrg
7138 1.1 mrg init_insn_group_barriers ();
7139 1.1 mrg
7140 1.1 mrg for (insn = get_insns (); insn; insn = NEXT_INSN (insn))
7141 1.1 mrg {
7142 1.1 mrg if (BARRIER_P (insn))
7143 1.1 mrg {
7144 1.1 mrg rtx_insn *last = prev_active_insn (insn);
7145 1.1 mrg
7146 1.1 mrg if (! last)
7147 1.1 mrg continue;
7148 1.1 mrg if (JUMP_TABLE_DATA_P (last))
7149 1.1 mrg last = prev_active_insn (last);
7150 1.1 mrg if (recog_memoized (last) != CODE_FOR_insn_group_barrier)
7151 1.1 mrg emit_insn_after (gen_insn_group_barrier (GEN_INT (3)), last);
7152 1.1 mrg
7153 1.1 mrg init_insn_group_barriers ();
7154 1.1 mrg }
7155 1.1 mrg else if (NONDEBUG_INSN_P (insn))
7156 1.1 mrg {
7157 1.1 mrg if (recog_memoized (insn) == CODE_FOR_insn_group_barrier)
7158 1.1 mrg init_insn_group_barriers ();
7159 1.1 mrg else if (group_barrier_needed (insn))
7160 1.1 mrg {
7161 1.1 mrg emit_insn_before (gen_insn_group_barrier (GEN_INT (3)), insn);
7162 1.1 mrg init_insn_group_barriers ();
7163 1.1 mrg group_barrier_needed (insn);
7164 1.1 mrg }
7165 1.1 mrg }
7166 1.1 mrg }
7167 1.1 mrg }
7168 1.1 mrg
7169 1.1 mrg
7170 1.1 mrg
7172 1.1 mrg /* Instruction scheduling support. */
7173 1.1 mrg
7174 1.1 mrg #define NR_BUNDLES 10
7175 1.1 mrg
7176 1.1 mrg /* A list of names of all available bundles. */
7177 1.1 mrg
7178 1.1 mrg static const char *bundle_name [NR_BUNDLES] =
7179 1.1 mrg {
7180 1.1 mrg ".mii",
7181 1.1 mrg ".mmi",
7182 1.1 mrg ".mfi",
7183 1.1 mrg ".mmf",
7184 1.1 mrg #if NR_BUNDLES == 10
7185 1.1 mrg ".bbb",
7186 1.1 mrg ".mbb",
7187 1.1 mrg #endif
7188 1.1 mrg ".mib",
7189 1.1 mrg ".mmb",
7190 1.1 mrg ".mfb",
7191 1.1 mrg ".mlx"
7192 1.1 mrg };
7193 1.1 mrg
7194 1.1 mrg /* Nonzero if we should insert stop bits into the schedule. */
7195 1.1 mrg
7196 1.1 mrg int ia64_final_schedule = 0;
7197 1.1 mrg
7198 1.1 mrg /* Codes of the corresponding queried units: */
7199 1.1 mrg
7200 1.1 mrg static int _0mii_, _0mmi_, _0mfi_, _0mmf_;
7201 1.1 mrg static int _0bbb_, _0mbb_, _0mib_, _0mmb_, _0mfb_, _0mlx_;
7202 1.1 mrg
7203 1.1 mrg static int _1mii_, _1mmi_, _1mfi_, _1mmf_;
7204 1.1 mrg static int _1bbb_, _1mbb_, _1mib_, _1mmb_, _1mfb_, _1mlx_;
7205 1.1 mrg
7206 1.1 mrg static int pos_1, pos_2, pos_3, pos_4, pos_5, pos_6;
7207 1.1 mrg
7208 1.1 mrg /* The following variable value is an insn group barrier. */
7209 1.1 mrg
7210 1.1 mrg static rtx_insn *dfa_stop_insn;
7211 1.1 mrg
7212 1.1 mrg /* The following variable value is the last issued insn. */
7213 1.1 mrg
7214 1.1 mrg static rtx_insn *last_scheduled_insn;
7215 1.1 mrg
7216 1.1 mrg /* The following variable value is pointer to a DFA state used as
7217 1.1 mrg temporary variable. */
7218 1.1 mrg
7219 1.1 mrg static state_t temp_dfa_state = NULL;
7220 1.1 mrg
7221 1.1 mrg /* The following variable value is DFA state after issuing the last
7222 1.1 mrg insn. */
7223 1.1 mrg
7224 1.1 mrg static state_t prev_cycle_state = NULL;
7225 1.1 mrg
7226 1.1 mrg /* The following array element values are TRUE if the corresponding
7227 1.1 mrg insn requires to add stop bits before it. */
7228 1.1 mrg
7229 1.1 mrg static char *stops_p = NULL;
7230 1.1 mrg
7231 1.1 mrg /* The following variable is used to set up the mentioned above array. */
7232 1.1 mrg
7233 1.1 mrg static int stop_before_p = 0;
7234 1.1 mrg
7235 1.1 mrg /* The following variable value is length of the arrays `clocks' and
7236 1.1 mrg `add_cycles'. */
7237 1.1 mrg
7238 1.1 mrg static int clocks_length;
7239 1.1 mrg
7240 1.1 mrg /* The following variable value is number of data speculations in progress. */
7241 1.1 mrg static int pending_data_specs = 0;
7242 1.1 mrg
7243 1.1 mrg /* Number of memory references on current and three future processor cycles. */
7244 1.1 mrg static char mem_ops_in_group[4];
7245 1.1 mrg
7246 1.1 mrg /* Number of current processor cycle (from scheduler's point of view). */
7247 1.1 mrg static int current_cycle;
7248 1.1 mrg
7249 1.1 mrg static rtx ia64_single_set (rtx_insn *);
7250 1.1 mrg static void ia64_emit_insn_before (rtx, rtx_insn *);
7251 1.1 mrg
7252 1.1 mrg /* Map a bundle number to its pseudo-op. */
7253 1.1 mrg
7254 1.1 mrg const char *
7255 1.1 mrg get_bundle_name (int b)
7256 1.1 mrg {
7257 1.1 mrg return bundle_name[b];
7258 1.1 mrg }
7259 1.1 mrg
7260 1.1 mrg
7261 1.1 mrg /* Return the maximum number of instructions a cpu can issue. */
7262 1.1 mrg
7263 1.1 mrg static int
7264 1.1 mrg ia64_issue_rate (void)
7265 1.1 mrg {
7266 1.1 mrg return 6;
7267 1.1 mrg }
7268 1.1 mrg
7269 1.1 mrg /* Helper function - like single_set, but look inside COND_EXEC. */
7270 1.1 mrg
7271 1.1 mrg static rtx
7272 1.1 mrg ia64_single_set (rtx_insn *insn)
7273 1.1 mrg {
7274 1.1 mrg rtx x = PATTERN (insn), ret;
7275 1.1 mrg if (GET_CODE (x) == COND_EXEC)
7276 1.1 mrg x = COND_EXEC_CODE (x);
7277 1.1 mrg if (GET_CODE (x) == SET)
7278 1.1 mrg return x;
7279 1.1 mrg
7280 1.1 mrg /* Special case here prologue_allocate_stack and epilogue_deallocate_stack.
7281 1.1 mrg Although they are not classical single set, the second set is there just
7282 1.1 mrg to protect it from moving past FP-relative stack accesses. */
7283 1.1 mrg switch (recog_memoized (insn))
7284 1.1 mrg {
7285 1.1 mrg case CODE_FOR_prologue_allocate_stack:
7286 1.1 mrg case CODE_FOR_prologue_allocate_stack_pr:
7287 1.1 mrg case CODE_FOR_epilogue_deallocate_stack:
7288 1.1 mrg case CODE_FOR_epilogue_deallocate_stack_pr:
7289 1.1 mrg ret = XVECEXP (x, 0, 0);
7290 1.1 mrg break;
7291 1.1 mrg
7292 1.1 mrg default:
7293 1.1 mrg ret = single_set_2 (insn, x);
7294 1.1 mrg break;
7295 1.1 mrg }
7296 1.1 mrg
7297 1.1 mrg return ret;
7298 1.1 mrg }
7299 1.1 mrg
7300 1.1 mrg /* Adjust the cost of a scheduling dependency.
7301 1.1 mrg Return the new cost of a dependency of type DEP_TYPE or INSN on DEP_INSN.
7302 1.1 mrg COST is the current cost, DW is dependency weakness. */
7303 1.1 mrg static int
7304 1.1 mrg ia64_adjust_cost (rtx_insn *insn, int dep_type1, rtx_insn *dep_insn,
7305 1.1 mrg int cost, dw_t dw)
7306 1.1 mrg {
7307 1.1 mrg enum reg_note dep_type = (enum reg_note) dep_type1;
7308 1.1 mrg enum attr_itanium_class dep_class;
7309 1.1 mrg enum attr_itanium_class insn_class;
7310 1.1 mrg
7311 1.1 mrg insn_class = ia64_safe_itanium_class (insn);
7312 1.1 mrg dep_class = ia64_safe_itanium_class (dep_insn);
7313 1.1 mrg
7314 1.1 mrg /* Treat true memory dependencies separately. Ignore apparent true
7315 1.1 mrg dependence between store and call (call has a MEM inside a SYMBOL_REF). */
7316 1.1 mrg if (dep_type == REG_DEP_TRUE
7317 1.1 mrg && (dep_class == ITANIUM_CLASS_ST || dep_class == ITANIUM_CLASS_STF)
7318 1.1 mrg && (insn_class == ITANIUM_CLASS_BR || insn_class == ITANIUM_CLASS_SCALL))
7319 1.1 mrg return 0;
7320 1.1 mrg
7321 1.1 mrg if (dw == MIN_DEP_WEAK)
7322 1.1 mrg /* Store and load are likely to alias, use higher cost to avoid stall. */
7323 1.1 mrg return param_sched_mem_true_dep_cost;
7324 1.1 mrg else if (dw > MIN_DEP_WEAK)
7325 1.1 mrg {
7326 1.1 mrg /* Store and load are less likely to alias. */
7327 1.1 mrg if (mflag_sched_fp_mem_deps_zero_cost && dep_class == ITANIUM_CLASS_STF)
7328 1.1 mrg /* Assume there will be no cache conflict for floating-point data.
7329 1.1 mrg For integer data, L1 conflict penalty is huge (17 cycles), so we
7330 1.1 mrg never assume it will not cause a conflict. */
7331 1.1 mrg return 0;
7332 1.1 mrg else
7333 1.1 mrg return cost;
7334 1.1 mrg }
7335 1.1 mrg
7336 1.1 mrg if (dep_type != REG_DEP_OUTPUT)
7337 1.1 mrg return cost;
7338 1.1 mrg
7339 1.1 mrg if (dep_class == ITANIUM_CLASS_ST || dep_class == ITANIUM_CLASS_STF
7340 1.1 mrg || insn_class == ITANIUM_CLASS_ST || insn_class == ITANIUM_CLASS_STF)
7341 1.1 mrg return 0;
7342 1.1 mrg
7343 1.1 mrg return cost;
7344 1.1 mrg }
7345 1.1 mrg
7346 1.1 mrg /* Like emit_insn_before, but skip cycle_display notes.
7347 1.1 mrg ??? When cycle display notes are implemented, update this. */
7348 1.1 mrg
7349 1.1 mrg static void
7350 1.1 mrg ia64_emit_insn_before (rtx insn, rtx_insn *before)
7351 1.1 mrg {
7352 1.1 mrg emit_insn_before (insn, before);
7353 1.1 mrg }
7354 1.1 mrg
7355 1.1 mrg /* The following function marks insns who produce addresses for load
7356 1.1 mrg and store insns. Such insns will be placed into M slots because it
7357 1.1 mrg decrease latency time for Itanium1 (see function
7358 1.1 mrg `ia64_produce_address_p' and the DFA descriptions). */
7359 1.1 mrg
7360 1.1 mrg static void
7361 1.1 mrg ia64_dependencies_evaluation_hook (rtx_insn *head, rtx_insn *tail)
7362 1.1 mrg {
7363 1.1 mrg rtx_insn *insn, *next, *next_tail;
7364 1.1 mrg
7365 1.1 mrg /* Before reload, which_alternative is not set, which means that
7366 1.1 mrg ia64_safe_itanium_class will produce wrong results for (at least)
7367 1.1 mrg move instructions. */
7368 1.1 mrg if (!reload_completed)
7369 1.1 mrg return;
7370 1.1 mrg
7371 1.1 mrg next_tail = NEXT_INSN (tail);
7372 1.1 mrg for (insn = head; insn != next_tail; insn = NEXT_INSN (insn))
7373 1.1 mrg if (INSN_P (insn))
7374 1.1 mrg insn->call = 0;
7375 1.1 mrg for (insn = head; insn != next_tail; insn = NEXT_INSN (insn))
7376 1.1 mrg if (INSN_P (insn)
7377 1.1 mrg && ia64_safe_itanium_class (insn) == ITANIUM_CLASS_IALU)
7378 1.1 mrg {
7379 1.1 mrg sd_iterator_def sd_it;
7380 1.1 mrg dep_t dep;
7381 1.1 mrg bool has_mem_op_consumer_p = false;
7382 1.1 mrg
7383 1.1 mrg FOR_EACH_DEP (insn, SD_LIST_FORW, sd_it, dep)
7384 1.1 mrg {
7385 1.1 mrg enum attr_itanium_class c;
7386 1.1 mrg
7387 1.1 mrg if (DEP_TYPE (dep) != REG_DEP_TRUE)
7388 1.1 mrg continue;
7389 1.1 mrg
7390 1.1 mrg next = DEP_CON (dep);
7391 1.1 mrg c = ia64_safe_itanium_class (next);
7392 1.1 mrg if ((c == ITANIUM_CLASS_ST
7393 1.1 mrg || c == ITANIUM_CLASS_STF)
7394 1.1 mrg && ia64_st_address_bypass_p (insn, next))
7395 1.1 mrg {
7396 1.1 mrg has_mem_op_consumer_p = true;
7397 1.1 mrg break;
7398 1.1 mrg }
7399 1.1 mrg else if ((c == ITANIUM_CLASS_LD
7400 1.1 mrg || c == ITANIUM_CLASS_FLD
7401 1.1 mrg || c == ITANIUM_CLASS_FLDP)
7402 1.1 mrg && ia64_ld_address_bypass_p (insn, next))
7403 1.1 mrg {
7404 1.1 mrg has_mem_op_consumer_p = true;
7405 1.1 mrg break;
7406 1.1 mrg }
7407 1.1 mrg }
7408 1.1 mrg
7409 1.1 mrg insn->call = has_mem_op_consumer_p;
7410 1.1 mrg }
7411 1.1 mrg }
7412 1.1 mrg
7413 1.1 mrg /* We're beginning a new block. Initialize data structures as necessary. */
7414 1.1 mrg
7415 1.1 mrg static void
7416 1.1 mrg ia64_sched_init (FILE *dump ATTRIBUTE_UNUSED,
7417 1.1 mrg int sched_verbose ATTRIBUTE_UNUSED,
7418 1.1 mrg int max_ready ATTRIBUTE_UNUSED)
7419 1.1 mrg {
7420 1.1 mrg if (flag_checking && !sel_sched_p () && reload_completed)
7421 1.1 mrg {
7422 1.1 mrg for (rtx_insn *insn = NEXT_INSN (current_sched_info->prev_head);
7423 1.1 mrg insn != current_sched_info->next_tail;
7424 1.1 mrg insn = NEXT_INSN (insn))
7425 1.1 mrg gcc_assert (!SCHED_GROUP_P (insn));
7426 1.1 mrg }
7427 1.1 mrg last_scheduled_insn = NULL;
7428 1.1 mrg init_insn_group_barriers ();
7429 1.1 mrg
7430 1.1 mrg current_cycle = 0;
7431 1.1 mrg memset (mem_ops_in_group, 0, sizeof (mem_ops_in_group));
7432 1.1 mrg }
7433 1.1 mrg
7434 1.1 mrg /* We're beginning a scheduling pass. Check assertion. */
7435 1.1 mrg
7436 1.1 mrg static void
7437 1.1 mrg ia64_sched_init_global (FILE *dump ATTRIBUTE_UNUSED,
7438 1.1 mrg int sched_verbose ATTRIBUTE_UNUSED,
7439 1.1 mrg int max_ready ATTRIBUTE_UNUSED)
7440 1.1 mrg {
7441 1.1 mrg gcc_assert (pending_data_specs == 0);
7442 1.1 mrg }
7443 1.1 mrg
7444 1.1 mrg /* Scheduling pass is now finished. Free/reset static variable. */
7445 1.1 mrg static void
7446 1.1 mrg ia64_sched_finish_global (FILE *dump ATTRIBUTE_UNUSED,
7447 1.1 mrg int sched_verbose ATTRIBUTE_UNUSED)
7448 1.1 mrg {
7449 1.1 mrg gcc_assert (pending_data_specs == 0);
7450 1.1 mrg }
7451 1.1 mrg
7452 1.1 mrg /* Return TRUE if INSN is a load (either normal or speculative, but not a
7453 1.1 mrg speculation check), FALSE otherwise. */
7454 1.1 mrg static bool
7455 1.1 mrg is_load_p (rtx_insn *insn)
7456 1.1 mrg {
7457 1.1 mrg enum attr_itanium_class insn_class = ia64_safe_itanium_class (insn);
7458 1.1 mrg
7459 1.1 mrg return
7460 1.1 mrg ((insn_class == ITANIUM_CLASS_LD || insn_class == ITANIUM_CLASS_FLD)
7461 1.1 mrg && get_attr_check_load (insn) == CHECK_LOAD_NO);
7462 1.1 mrg }
7463 1.1 mrg
7464 1.1 mrg /* If INSN is a memory reference, memoize it in MEM_OPS_IN_GROUP global array
7465 1.1 mrg (taking account for 3-cycle cache reference postponing for stores: Intel
7466 1.1 mrg Itanium 2 Reference Manual for Software Development and Optimization,
7467 1.1 mrg 6.7.3.1). */
7468 1.1 mrg static void
7469 1.1 mrg record_memory_reference (rtx_insn *insn)
7470 1.1 mrg {
7471 1.1 mrg enum attr_itanium_class insn_class = ia64_safe_itanium_class (insn);
7472 1.1 mrg
7473 1.1 mrg switch (insn_class) {
7474 1.1 mrg case ITANIUM_CLASS_FLD:
7475 1.1 mrg case ITANIUM_CLASS_LD:
7476 1.1 mrg mem_ops_in_group[current_cycle % 4]++;
7477 1.1 mrg break;
7478 1.1 mrg case ITANIUM_CLASS_STF:
7479 1.1 mrg case ITANIUM_CLASS_ST:
7480 1.1 mrg mem_ops_in_group[(current_cycle + 3) % 4]++;
7481 1.1 mrg break;
7482 1.1 mrg default:;
7483 1.1 mrg }
7484 1.1 mrg }
7485 1.1 mrg
7486 1.1 mrg /* We are about to being issuing insns for this clock cycle.
7487 1.1 mrg Override the default sort algorithm to better slot instructions. */
7488 1.1 mrg
7489 1.1 mrg static int
7490 1.1 mrg ia64_dfa_sched_reorder (FILE *dump, int sched_verbose, rtx_insn **ready,
7491 1.1 mrg int *pn_ready, int clock_var,
7492 1.1 mrg int reorder_type)
7493 1.1 mrg {
7494 1.1 mrg int n_asms;
7495 1.1 mrg int n_ready = *pn_ready;
7496 1.1 mrg rtx_insn **e_ready = ready + n_ready;
7497 1.1 mrg rtx_insn **insnp;
7498 1.1 mrg
7499 1.1 mrg if (sched_verbose)
7500 1.1 mrg fprintf (dump, "// ia64_dfa_sched_reorder (type %d):\n", reorder_type);
7501 1.1 mrg
7502 1.1 mrg if (reorder_type == 0)
7503 1.1 mrg {
7504 1.1 mrg /* First, move all USEs, CLOBBERs and other crud out of the way. */
7505 1.1 mrg n_asms = 0;
7506 1.1 mrg for (insnp = ready; insnp < e_ready; insnp++)
7507 1.1 mrg if (insnp < e_ready)
7508 1.1 mrg {
7509 1.1 mrg rtx_insn *insn = *insnp;
7510 1.1 mrg enum attr_type t = ia64_safe_type (insn);
7511 1.1 mrg if (t == TYPE_UNKNOWN)
7512 1.1 mrg {
7513 1.1 mrg if (GET_CODE (PATTERN (insn)) == ASM_INPUT
7514 1.1 mrg || asm_noperands (PATTERN (insn)) >= 0)
7515 1.1 mrg {
7516 1.1 mrg rtx_insn *lowest = ready[n_asms];
7517 1.1 mrg ready[n_asms] = insn;
7518 1.1 mrg *insnp = lowest;
7519 1.1 mrg n_asms++;
7520 1.1 mrg }
7521 1.1 mrg else
7522 1.1 mrg {
7523 1.1 mrg rtx_insn *highest = ready[n_ready - 1];
7524 1.1 mrg ready[n_ready - 1] = insn;
7525 1.1 mrg *insnp = highest;
7526 1.1 mrg return 1;
7527 1.1 mrg }
7528 1.1 mrg }
7529 1.1 mrg }
7530 1.1 mrg
7531 1.1 mrg if (n_asms < n_ready)
7532 1.1 mrg {
7533 1.1 mrg /* Some normal insns to process. Skip the asms. */
7534 1.1 mrg ready += n_asms;
7535 1.1 mrg n_ready -= n_asms;
7536 1.1 mrg }
7537 1.1 mrg else if (n_ready > 0)
7538 1.1 mrg return 1;
7539 1.1 mrg }
7540 1.1 mrg
7541 1.1 mrg if (ia64_final_schedule)
7542 1.1 mrg {
7543 1.1 mrg int deleted = 0;
7544 1.1 mrg int nr_need_stop = 0;
7545 1.1 mrg
7546 1.1 mrg for (insnp = ready; insnp < e_ready; insnp++)
7547 1.1 mrg if (safe_group_barrier_needed (*insnp))
7548 1.1 mrg nr_need_stop++;
7549 1.1 mrg
7550 1.1 mrg if (reorder_type == 1 && n_ready == nr_need_stop)
7551 1.1 mrg return 0;
7552 1.1 mrg if (reorder_type == 0)
7553 1.1 mrg return 1;
7554 1.1 mrg insnp = e_ready;
7555 1.1 mrg /* Move down everything that needs a stop bit, preserving
7556 1.1 mrg relative order. */
7557 1.1 mrg while (insnp-- > ready + deleted)
7558 1.1 mrg while (insnp >= ready + deleted)
7559 1.1 mrg {
7560 1.1 mrg rtx_insn *insn = *insnp;
7561 1.1 mrg if (! safe_group_barrier_needed (insn))
7562 1.1 mrg break;
7563 1.1 mrg memmove (ready + 1, ready, (insnp - ready) * sizeof (rtx));
7564 1.1 mrg *ready = insn;
7565 1.1 mrg deleted++;
7566 1.1 mrg }
7567 1.1 mrg n_ready -= deleted;
7568 1.1 mrg ready += deleted;
7569 1.1 mrg }
7570 1.1 mrg
7571 1.1 mrg current_cycle = clock_var;
7572 1.1 mrg if (reload_completed && mem_ops_in_group[clock_var % 4] >= ia64_max_memory_insns)
7573 1.1 mrg {
7574 1.1 mrg int moved = 0;
7575 1.1 mrg
7576 1.1 mrg insnp = e_ready;
7577 1.1 mrg /* Move down loads/stores, preserving relative order. */
7578 1.1 mrg while (insnp-- > ready + moved)
7579 1.1 mrg while (insnp >= ready + moved)
7580 1.1 mrg {
7581 1.1 mrg rtx_insn *insn = *insnp;
7582 1.1 mrg if (! is_load_p (insn))
7583 1.1 mrg break;
7584 1.1 mrg memmove (ready + 1, ready, (insnp - ready) * sizeof (rtx));
7585 1.1 mrg *ready = insn;
7586 1.1 mrg moved++;
7587 1.1 mrg }
7588 1.1 mrg n_ready -= moved;
7589 1.1 mrg ready += moved;
7590 1.1 mrg }
7591 1.1 mrg
7592 1.1 mrg return 1;
7593 1.1 mrg }
7594 1.1 mrg
7595 1.1 mrg /* We are about to being issuing insns for this clock cycle. Override
7596 1.1 mrg the default sort algorithm to better slot instructions. */
7597 1.1 mrg
7598 1.1 mrg static int
7599 1.1 mrg ia64_sched_reorder (FILE *dump, int sched_verbose, rtx_insn **ready,
7600 1.1 mrg int *pn_ready, int clock_var)
7601 1.1 mrg {
7602 1.1 mrg return ia64_dfa_sched_reorder (dump, sched_verbose, ready,
7603 1.1 mrg pn_ready, clock_var, 0);
7604 1.1 mrg }
7605 1.1 mrg
7606 1.1 mrg /* Like ia64_sched_reorder, but called after issuing each insn.
7607 1.1 mrg Override the default sort algorithm to better slot instructions. */
7608 1.1 mrg
7609 1.1 mrg static int
7610 1.1 mrg ia64_sched_reorder2 (FILE *dump ATTRIBUTE_UNUSED,
7611 1.1 mrg int sched_verbose ATTRIBUTE_UNUSED, rtx_insn **ready,
7612 1.1 mrg int *pn_ready, int clock_var)
7613 1.1 mrg {
7614 1.1 mrg return ia64_dfa_sched_reorder (dump, sched_verbose, ready, pn_ready,
7615 1.1 mrg clock_var, 1);
7616 1.1 mrg }
7617 1.1 mrg
7618 1.1 mrg /* We are about to issue INSN. Return the number of insns left on the
7619 1.1 mrg ready queue that can be issued this cycle. */
7620 1.1 mrg
7621 1.1 mrg static int
7622 1.1 mrg ia64_variable_issue (FILE *dump ATTRIBUTE_UNUSED,
7623 1.1 mrg int sched_verbose ATTRIBUTE_UNUSED,
7624 1.1 mrg rtx_insn *insn,
7625 1.1 mrg int can_issue_more ATTRIBUTE_UNUSED)
7626 1.1 mrg {
7627 1.1 mrg if (sched_deps_info->generate_spec_deps && !sel_sched_p ())
7628 1.1 mrg /* Modulo scheduling does not extend h_i_d when emitting
7629 1.1 mrg new instructions. Don't use h_i_d, if we don't have to. */
7630 1.1 mrg {
7631 1.1 mrg if (DONE_SPEC (insn) & BEGIN_DATA)
7632 1.1 mrg pending_data_specs++;
7633 1.1 mrg if (CHECK_SPEC (insn) & BEGIN_DATA)
7634 1.1 mrg pending_data_specs--;
7635 1.1 mrg }
7636 1.1 mrg
7637 1.1 mrg if (DEBUG_INSN_P (insn))
7638 1.1 mrg return 1;
7639 1.1 mrg
7640 1.1 mrg last_scheduled_insn = insn;
7641 1.1 mrg memcpy (prev_cycle_state, curr_state, dfa_state_size);
7642 1.1 mrg if (reload_completed)
7643 1.1 mrg {
7644 1.1 mrg int needed = group_barrier_needed (insn);
7645 1.1 mrg
7646 1.1 mrg gcc_assert (!needed);
7647 1.1 mrg if (CALL_P (insn))
7648 1.1 mrg init_insn_group_barriers ();
7649 1.1 mrg stops_p [INSN_UID (insn)] = stop_before_p;
7650 1.1 mrg stop_before_p = 0;
7651 1.1 mrg
7652 1.1 mrg record_memory_reference (insn);
7653 1.1 mrg }
7654 1.1 mrg return 1;
7655 1.1 mrg }
7656 1.1 mrg
7657 1.1 mrg /* We are choosing insn from the ready queue. Return zero if INSN
7658 1.1 mrg can be chosen. */
7659 1.1 mrg
7660 1.1 mrg static int
7661 1.1 mrg ia64_first_cycle_multipass_dfa_lookahead_guard (rtx_insn *insn, int ready_index)
7662 1.1 mrg {
7663 1.1 mrg gcc_assert (insn && INSN_P (insn));
7664 1.1 mrg
7665 1.1 mrg /* Size of ALAT is 32. As far as we perform conservative
7666 1.1 mrg data speculation, we keep ALAT half-empty. */
7667 1.1 mrg if (pending_data_specs >= 16 && (TODO_SPEC (insn) & BEGIN_DATA))
7668 1.1 mrg return ready_index == 0 ? -1 : 1;
7669 1.1 mrg
7670 1.1 mrg if (ready_index == 0)
7671 1.1 mrg return 0;
7672 1.1 mrg
7673 1.1 mrg if ((!reload_completed
7674 1.1 mrg || !safe_group_barrier_needed (insn))
7675 1.1 mrg && (!mflag_sched_mem_insns_hard_limit
7676 1.1 mrg || !is_load_p (insn)
7677 1.1 mrg || mem_ops_in_group[current_cycle % 4] < ia64_max_memory_insns))
7678 1.1 mrg return 0;
7679 1.1 mrg
7680 1.1 mrg return 1;
7681 1.1 mrg }
7682 1.1 mrg
7683 1.1 mrg /* The following variable value is pseudo-insn used by the DFA insn
7684 1.1 mrg scheduler to change the DFA state when the simulated clock is
7685 1.1 mrg increased. */
7686 1.1 mrg
7687 1.1 mrg static rtx_insn *dfa_pre_cycle_insn;
7688 1.1 mrg
7689 1.1 mrg /* Returns 1 when a meaningful insn was scheduled between the last group
7690 1.1 mrg barrier and LAST. */
7691 1.1 mrg static int
7692 1.1 mrg scheduled_good_insn (rtx_insn *last)
7693 1.1 mrg {
7694 1.1 mrg if (last && recog_memoized (last) >= 0)
7695 1.1 mrg return 1;
7696 1.1 mrg
7697 1.1 mrg for ( ;
7698 1.1 mrg last != NULL && !NOTE_INSN_BASIC_BLOCK_P (last)
7699 1.1 mrg && !stops_p[INSN_UID (last)];
7700 1.1 mrg last = PREV_INSN (last))
7701 1.1 mrg /* We could hit a NOTE_INSN_DELETED here which is actually outside
7702 1.1 mrg the ebb we're scheduling. */
7703 1.1 mrg if (INSN_P (last) && recog_memoized (last) >= 0)
7704 1.1 mrg return 1;
7705 1.1 mrg
7706 1.1 mrg return 0;
7707 1.1 mrg }
7708 1.1 mrg
7709 1.1 mrg /* We are about to being issuing INSN. Return nonzero if we cannot
7710 1.1 mrg issue it on given cycle CLOCK and return zero if we should not sort
7711 1.1 mrg the ready queue on the next clock start. */
7712 1.1 mrg
7713 1.1 mrg static int
7714 1.1 mrg ia64_dfa_new_cycle (FILE *dump, int verbose, rtx_insn *insn, int last_clock,
7715 1.1 mrg int clock, int *sort_p)
7716 1.1 mrg {
7717 1.1 mrg gcc_assert (insn && INSN_P (insn));
7718 1.1 mrg
7719 1.1 mrg if (DEBUG_INSN_P (insn))
7720 1.1 mrg return 0;
7721 1.1 mrg
7722 1.1 mrg /* When a group barrier is needed for insn, last_scheduled_insn
7723 1.1 mrg should be set. */
7724 1.1 mrg gcc_assert (!(reload_completed && safe_group_barrier_needed (insn))
7725 1.1 mrg || last_scheduled_insn);
7726 1.1 mrg
7727 1.1 mrg if ((reload_completed
7728 1.1 mrg && (safe_group_barrier_needed (insn)
7729 1.1 mrg || (mflag_sched_stop_bits_after_every_cycle
7730 1.1 mrg && last_clock != clock
7731 1.1 mrg && last_scheduled_insn
7732 1.1 mrg && scheduled_good_insn (last_scheduled_insn))))
7733 1.1 mrg || (last_scheduled_insn
7734 1.1 mrg && (CALL_P (last_scheduled_insn)
7735 1.1 mrg || unknown_for_bundling_p (last_scheduled_insn))))
7736 1.1 mrg {
7737 1.1 mrg init_insn_group_barriers ();
7738 1.1 mrg
7739 1.1 mrg if (verbose && dump)
7740 1.1 mrg fprintf (dump, "// Stop should be before %d%s\n", INSN_UID (insn),
7741 1.1 mrg last_clock == clock ? " + cycle advance" : "");
7742 1.1 mrg
7743 1.1 mrg stop_before_p = 1;
7744 1.1 mrg current_cycle = clock;
7745 1.1 mrg mem_ops_in_group[current_cycle % 4] = 0;
7746 1.1 mrg
7747 1.1 mrg if (last_clock == clock)
7748 1.1 mrg {
7749 1.1 mrg state_transition (curr_state, dfa_stop_insn);
7750 1.1 mrg if (TARGET_EARLY_STOP_BITS)
7751 1.1 mrg *sort_p = (last_scheduled_insn == NULL_RTX
7752 1.1 mrg || ! CALL_P (last_scheduled_insn));
7753 1.1 mrg else
7754 1.1 mrg *sort_p = 0;
7755 1.1 mrg return 1;
7756 1.1 mrg }
7757 1.1 mrg
7758 1.1 mrg if (last_scheduled_insn)
7759 1.1 mrg {
7760 1.1 mrg if (unknown_for_bundling_p (last_scheduled_insn))
7761 1.1 mrg state_reset (curr_state);
7762 1.1 mrg else
7763 1.1 mrg {
7764 1.1 mrg memcpy (curr_state, prev_cycle_state, dfa_state_size);
7765 1.1 mrg state_transition (curr_state, dfa_stop_insn);
7766 1.1 mrg state_transition (curr_state, dfa_pre_cycle_insn);
7767 1.1 mrg state_transition (curr_state, NULL);
7768 1.1 mrg }
7769 1.1 mrg }
7770 1.1 mrg }
7771 1.1 mrg return 0;
7772 1.1 mrg }
7773 1.1 mrg
7774 1.1 mrg /* Implement targetm.sched.h_i_d_extended hook.
7775 1.1 mrg Extend internal data structures. */
7776 1.1 mrg static void
7777 1.1 mrg ia64_h_i_d_extended (void)
7778 1.1 mrg {
7779 1.1 mrg if (stops_p != NULL)
7780 1.1 mrg {
7781 1.1 mrg int new_clocks_length = get_max_uid () * 3 / 2;
7782 1.1 mrg stops_p = (char *) xrecalloc (stops_p, new_clocks_length, clocks_length, 1);
7783 1.1 mrg clocks_length = new_clocks_length;
7784 1.1 mrg }
7785 1.1 mrg }
7786 1.1 mrg
7787 1.1 mrg
7789 1.1 mrg /* This structure describes the data used by the backend to guide scheduling.
7790 1.1 mrg When the current scheduling point is switched, this data should be saved
7791 1.1 mrg and restored later, if the scheduler returns to this point. */
7792 1.1 mrg struct _ia64_sched_context
7793 1.1 mrg {
7794 1.1 mrg state_t prev_cycle_state;
7795 1.1 mrg rtx_insn *last_scheduled_insn;
7796 1.1 mrg struct reg_write_state rws_sum[NUM_REGS];
7797 1.1 mrg struct reg_write_state rws_insn[NUM_REGS];
7798 1.1 mrg int first_instruction;
7799 1.1 mrg int pending_data_specs;
7800 1.1 mrg int current_cycle;
7801 1.1 mrg char mem_ops_in_group[4];
7802 1.1 mrg };
7803 1.1 mrg typedef struct _ia64_sched_context *ia64_sched_context_t;
7804 1.1 mrg
7805 1.1 mrg /* Allocates a scheduling context. */
7806 1.1 mrg static void *
7807 1.1 mrg ia64_alloc_sched_context (void)
7808 1.1 mrg {
7809 1.1 mrg return xmalloc (sizeof (struct _ia64_sched_context));
7810 1.1 mrg }
7811 1.1 mrg
7812 1.1 mrg /* Initializes the _SC context with clean data, if CLEAN_P, and from
7813 1.1 mrg the global context otherwise. */
7814 1.1 mrg static void
7815 1.1 mrg ia64_init_sched_context (void *_sc, bool clean_p)
7816 1.1 mrg {
7817 1.1 mrg ia64_sched_context_t sc = (ia64_sched_context_t) _sc;
7818 1.1 mrg
7819 1.1 mrg sc->prev_cycle_state = xmalloc (dfa_state_size);
7820 1.1 mrg if (clean_p)
7821 1.1 mrg {
7822 1.1 mrg state_reset (sc->prev_cycle_state);
7823 1.1 mrg sc->last_scheduled_insn = NULL;
7824 1.1 mrg memset (sc->rws_sum, 0, sizeof (rws_sum));
7825 1.1 mrg memset (sc->rws_insn, 0, sizeof (rws_insn));
7826 1.1 mrg sc->first_instruction = 1;
7827 1.1 mrg sc->pending_data_specs = 0;
7828 1.1 mrg sc->current_cycle = 0;
7829 1.1 mrg memset (sc->mem_ops_in_group, 0, sizeof (mem_ops_in_group));
7830 1.1 mrg }
7831 1.1 mrg else
7832 1.1 mrg {
7833 1.1 mrg memcpy (sc->prev_cycle_state, prev_cycle_state, dfa_state_size);
7834 1.1 mrg sc->last_scheduled_insn = last_scheduled_insn;
7835 1.1 mrg memcpy (sc->rws_sum, rws_sum, sizeof (rws_sum));
7836 1.1 mrg memcpy (sc->rws_insn, rws_insn, sizeof (rws_insn));
7837 1.1 mrg sc->first_instruction = first_instruction;
7838 1.1 mrg sc->pending_data_specs = pending_data_specs;
7839 1.1 mrg sc->current_cycle = current_cycle;
7840 1.1 mrg memcpy (sc->mem_ops_in_group, mem_ops_in_group, sizeof (mem_ops_in_group));
7841 1.1 mrg }
7842 1.1 mrg }
7843 1.1 mrg
7844 1.1 mrg /* Sets the global scheduling context to the one pointed to by _SC. */
7845 1.1 mrg static void
7846 1.1 mrg ia64_set_sched_context (void *_sc)
7847 1.1 mrg {
7848 1.1 mrg ia64_sched_context_t sc = (ia64_sched_context_t) _sc;
7849 1.1 mrg
7850 1.1 mrg gcc_assert (sc != NULL);
7851 1.1 mrg
7852 1.1 mrg memcpy (prev_cycle_state, sc->prev_cycle_state, dfa_state_size);
7853 1.1 mrg last_scheduled_insn = sc->last_scheduled_insn;
7854 1.1 mrg memcpy (rws_sum, sc->rws_sum, sizeof (rws_sum));
7855 1.1 mrg memcpy (rws_insn, sc->rws_insn, sizeof (rws_insn));
7856 1.1 mrg first_instruction = sc->first_instruction;
7857 1.1 mrg pending_data_specs = sc->pending_data_specs;
7858 1.1 mrg current_cycle = sc->current_cycle;
7859 1.1 mrg memcpy (mem_ops_in_group, sc->mem_ops_in_group, sizeof (mem_ops_in_group));
7860 1.1 mrg }
7861 1.1 mrg
7862 1.1 mrg /* Clears the data in the _SC scheduling context. */
7863 1.1 mrg static void
7864 1.1 mrg ia64_clear_sched_context (void *_sc)
7865 1.1 mrg {
7866 1.1 mrg ia64_sched_context_t sc = (ia64_sched_context_t) _sc;
7867 1.1 mrg
7868 1.1 mrg free (sc->prev_cycle_state);
7869 1.1 mrg sc->prev_cycle_state = NULL;
7870 1.1 mrg }
7871 1.1 mrg
7872 1.1 mrg /* Frees the _SC scheduling context. */
7873 1.1 mrg static void
7874 1.1 mrg ia64_free_sched_context (void *_sc)
7875 1.1 mrg {
7876 1.1 mrg gcc_assert (_sc != NULL);
7877 1.1 mrg
7878 1.1 mrg free (_sc);
7879 1.1 mrg }
7880 1.1 mrg
7881 1.1 mrg typedef rtx (* gen_func_t) (rtx, rtx);
7882 1.1 mrg
7883 1.1 mrg /* Return a function that will generate a load of mode MODE_NO
7884 1.1 mrg with speculation types TS. */
7885 1.1 mrg static gen_func_t
7886 1.1 mrg get_spec_load_gen_function (ds_t ts, int mode_no)
7887 1.1 mrg {
7888 1.1 mrg static gen_func_t gen_ld_[] = {
7889 1.1 mrg gen_movbi,
7890 1.1 mrg gen_movqi_internal,
7891 1.1 mrg gen_movhi_internal,
7892 1.1 mrg gen_movsi_internal,
7893 1.1 mrg gen_movdi_internal,
7894 1.1 mrg gen_movsf_internal,
7895 1.1 mrg gen_movdf_internal,
7896 1.1 mrg gen_movxf_internal,
7897 1.1 mrg gen_movti_internal,
7898 1.1 mrg gen_zero_extendqidi2,
7899 1.1 mrg gen_zero_extendhidi2,
7900 1.1 mrg gen_zero_extendsidi2,
7901 1.1 mrg };
7902 1.1 mrg
7903 1.1 mrg static gen_func_t gen_ld_a[] = {
7904 1.1 mrg gen_movbi_advanced,
7905 1.1 mrg gen_movqi_advanced,
7906 1.1 mrg gen_movhi_advanced,
7907 1.1 mrg gen_movsi_advanced,
7908 1.1 mrg gen_movdi_advanced,
7909 1.1 mrg gen_movsf_advanced,
7910 1.1 mrg gen_movdf_advanced,
7911 1.1 mrg gen_movxf_advanced,
7912 1.1 mrg gen_movti_advanced,
7913 1.1 mrg gen_zero_extendqidi2_advanced,
7914 1.1 mrg gen_zero_extendhidi2_advanced,
7915 1.1 mrg gen_zero_extendsidi2_advanced,
7916 1.1 mrg };
7917 1.1 mrg static gen_func_t gen_ld_s[] = {
7918 1.1 mrg gen_movbi_speculative,
7919 1.1 mrg gen_movqi_speculative,
7920 1.1 mrg gen_movhi_speculative,
7921 1.1 mrg gen_movsi_speculative,
7922 1.1 mrg gen_movdi_speculative,
7923 1.1 mrg gen_movsf_speculative,
7924 1.1 mrg gen_movdf_speculative,
7925 1.1 mrg gen_movxf_speculative,
7926 1.1 mrg gen_movti_speculative,
7927 1.1 mrg gen_zero_extendqidi2_speculative,
7928 1.1 mrg gen_zero_extendhidi2_speculative,
7929 1.1 mrg gen_zero_extendsidi2_speculative,
7930 1.1 mrg };
7931 1.1 mrg static gen_func_t gen_ld_sa[] = {
7932 1.1 mrg gen_movbi_speculative_advanced,
7933 1.1 mrg gen_movqi_speculative_advanced,
7934 1.1 mrg gen_movhi_speculative_advanced,
7935 1.1 mrg gen_movsi_speculative_advanced,
7936 1.1 mrg gen_movdi_speculative_advanced,
7937 1.1 mrg gen_movsf_speculative_advanced,
7938 1.1 mrg gen_movdf_speculative_advanced,
7939 1.1 mrg gen_movxf_speculative_advanced,
7940 1.1 mrg gen_movti_speculative_advanced,
7941 1.1 mrg gen_zero_extendqidi2_speculative_advanced,
7942 1.1 mrg gen_zero_extendhidi2_speculative_advanced,
7943 1.1 mrg gen_zero_extendsidi2_speculative_advanced,
7944 1.1 mrg };
7945 1.1 mrg static gen_func_t gen_ld_s_a[] = {
7946 1.1 mrg gen_movbi_speculative_a,
7947 1.1 mrg gen_movqi_speculative_a,
7948 1.1 mrg gen_movhi_speculative_a,
7949 1.1 mrg gen_movsi_speculative_a,
7950 1.1 mrg gen_movdi_speculative_a,
7951 1.1 mrg gen_movsf_speculative_a,
7952 1.1 mrg gen_movdf_speculative_a,
7953 1.1 mrg gen_movxf_speculative_a,
7954 1.1 mrg gen_movti_speculative_a,
7955 1.1 mrg gen_zero_extendqidi2_speculative_a,
7956 1.1 mrg gen_zero_extendhidi2_speculative_a,
7957 1.1 mrg gen_zero_extendsidi2_speculative_a,
7958 1.1 mrg };
7959 1.1 mrg
7960 1.1 mrg gen_func_t *gen_ld;
7961 1.1 mrg
7962 1.1 mrg if (ts & BEGIN_DATA)
7963 1.1 mrg {
7964 1.1 mrg if (ts & BEGIN_CONTROL)
7965 1.1 mrg gen_ld = gen_ld_sa;
7966 1.1 mrg else
7967 1.1 mrg gen_ld = gen_ld_a;
7968 1.1 mrg }
7969 1.1 mrg else if (ts & BEGIN_CONTROL)
7970 1.1 mrg {
7971 1.1 mrg if ((spec_info->flags & SEL_SCHED_SPEC_DONT_CHECK_CONTROL)
7972 1.1 mrg || ia64_needs_block_p (ts))
7973 1.1 mrg gen_ld = gen_ld_s;
7974 1.1 mrg else
7975 1.1 mrg gen_ld = gen_ld_s_a;
7976 1.1 mrg }
7977 1.1 mrg else if (ts == 0)
7978 1.1 mrg gen_ld = gen_ld_;
7979 1.1 mrg else
7980 1.1 mrg gcc_unreachable ();
7981 1.1 mrg
7982 1.1 mrg return gen_ld[mode_no];
7983 1.1 mrg }
7984 1.1 mrg
7985 1.1 mrg /* Constants that help mapping 'machine_mode' to int. */
7986 1.1 mrg enum SPEC_MODES
7987 1.1 mrg {
7988 1.1 mrg SPEC_MODE_INVALID = -1,
7989 1.1 mrg SPEC_MODE_FIRST = 0,
7990 1.1 mrg SPEC_MODE_FOR_EXTEND_FIRST = 1,
7991 1.1 mrg SPEC_MODE_FOR_EXTEND_LAST = 3,
7992 1.1 mrg SPEC_MODE_LAST = 8
7993 1.1 mrg };
7994 1.1 mrg
7995 1.1 mrg enum
7996 1.1 mrg {
7997 1.1 mrg /* Offset to reach ZERO_EXTEND patterns. */
7998 1.1 mrg SPEC_GEN_EXTEND_OFFSET = SPEC_MODE_LAST - SPEC_MODE_FOR_EXTEND_FIRST + 1
7999 1.1 mrg };
8000 1.1 mrg
8001 1.1 mrg /* Return index of the MODE. */
8002 1.1 mrg static int
8003 1.1 mrg ia64_mode_to_int (machine_mode mode)
8004 1.1 mrg {
8005 1.1 mrg switch (mode)
8006 1.1 mrg {
8007 1.1 mrg case E_BImode: return 0; /* SPEC_MODE_FIRST */
8008 1.1 mrg case E_QImode: return 1; /* SPEC_MODE_FOR_EXTEND_FIRST */
8009 1.1 mrg case E_HImode: return 2;
8010 1.1 mrg case E_SImode: return 3; /* SPEC_MODE_FOR_EXTEND_LAST */
8011 1.1 mrg case E_DImode: return 4;
8012 1.1 mrg case E_SFmode: return 5;
8013 1.1 mrg case E_DFmode: return 6;
8014 1.1 mrg case E_XFmode: return 7;
8015 1.1 mrg case E_TImode:
8016 1.1 mrg /* ??? This mode needs testing. Bypasses for ldfp8 instruction are not
8017 1.1 mrg mentioned in itanium[12].md. Predicate fp_register_operand also
8018 1.1 mrg needs to be defined. Bottom line: better disable for now. */
8019 1.1 mrg return SPEC_MODE_INVALID;
8020 1.1 mrg default: return SPEC_MODE_INVALID;
8021 1.1 mrg }
8022 1.1 mrg }
8023 1.1 mrg
8024 1.1 mrg /* Provide information about speculation capabilities. */
8025 1.1 mrg static void
8026 1.1 mrg ia64_set_sched_flags (spec_info_t spec_info)
8027 1.1 mrg {
8028 1.1 mrg unsigned int *flags = &(current_sched_info->flags);
8029 1.1 mrg
8030 1.1 mrg if (*flags & SCHED_RGN
8031 1.1 mrg || *flags & SCHED_EBB
8032 1.1 mrg || *flags & SEL_SCHED)
8033 1.1 mrg {
8034 1.1 mrg int mask = 0;
8035 1.1 mrg
8036 1.1 mrg if ((mflag_sched_br_data_spec && !reload_completed && optimize > 0)
8037 1.1 mrg || (mflag_sched_ar_data_spec && reload_completed))
8038 1.1 mrg {
8039 1.1 mrg mask |= BEGIN_DATA;
8040 1.1 mrg
8041 1.1 mrg if (!sel_sched_p ()
8042 1.1 mrg && ((mflag_sched_br_in_data_spec && !reload_completed)
8043 1.1 mrg || (mflag_sched_ar_in_data_spec && reload_completed)))
8044 1.1 mrg mask |= BE_IN_DATA;
8045 1.1 mrg }
8046 1.1 mrg
8047 1.1 mrg if (mflag_sched_control_spec
8048 1.1 mrg && (!sel_sched_p ()
8049 1.1 mrg || reload_completed))
8050 1.1 mrg {
8051 1.1 mrg mask |= BEGIN_CONTROL;
8052 1.1 mrg
8053 1.1 mrg if (!sel_sched_p () && mflag_sched_in_control_spec)
8054 1.1 mrg mask |= BE_IN_CONTROL;
8055 1.1 mrg }
8056 1.1 mrg
8057 1.1 mrg spec_info->mask = mask;
8058 1.1 mrg
8059 1.1 mrg if (mask)
8060 1.1 mrg {
8061 1.1 mrg *flags |= USE_DEPS_LIST | DO_SPECULATION;
8062 1.1 mrg
8063 1.1 mrg if (mask & BE_IN_SPEC)
8064 1.1 mrg *flags |= NEW_BBS;
8065 1.1 mrg
8066 1.1 mrg spec_info->flags = 0;
8067 1.1 mrg
8068 1.1 mrg if ((mask & CONTROL_SPEC)
8069 1.1 mrg && sel_sched_p () && mflag_sel_sched_dont_check_control_spec)
8070 1.1 mrg spec_info->flags |= SEL_SCHED_SPEC_DONT_CHECK_CONTROL;
8071 1.1 mrg
8072 1.1 mrg if (sched_verbose >= 1)
8073 1.1 mrg spec_info->dump = sched_dump;
8074 1.1 mrg else
8075 1.1 mrg spec_info->dump = 0;
8076 1.1 mrg
8077 1.1 mrg if (mflag_sched_count_spec_in_critical_path)
8078 1.1 mrg spec_info->flags |= COUNT_SPEC_IN_CRITICAL_PATH;
8079 1.1 mrg }
8080 1.1 mrg }
8081 1.1 mrg else
8082 1.1 mrg spec_info->mask = 0;
8083 1.1 mrg }
8084 1.1 mrg
8085 1.1 mrg /* If INSN is an appropriate load return its mode.
8086 1.1 mrg Return -1 otherwise. */
8087 1.1 mrg static int
8088 1.1 mrg get_mode_no_for_insn (rtx_insn *insn)
8089 1.1 mrg {
8090 1.1 mrg rtx reg, mem, mode_rtx;
8091 1.1 mrg int mode_no;
8092 1.1 mrg bool extend_p;
8093 1.1 mrg
8094 1.1 mrg extract_insn_cached (insn);
8095 1.1 mrg
8096 1.1 mrg /* We use WHICH_ALTERNATIVE only after reload. This will
8097 1.1 mrg guarantee that reload won't touch a speculative insn. */
8098 1.1 mrg
8099 1.1 mrg if (recog_data.n_operands != 2)
8100 1.1 mrg return -1;
8101 1.1 mrg
8102 1.1 mrg reg = recog_data.operand[0];
8103 1.1 mrg mem = recog_data.operand[1];
8104 1.1 mrg
8105 1.1 mrg /* We should use MEM's mode since REG's mode in presence of
8106 1.1 mrg ZERO_EXTEND will always be DImode. */
8107 1.1 mrg if (get_attr_speculable1 (insn) == SPECULABLE1_YES)
8108 1.1 mrg /* Process non-speculative ld. */
8109 1.1 mrg {
8110 1.1 mrg if (!reload_completed)
8111 1.1 mrg {
8112 1.1 mrg /* Do not speculate into regs like ar.lc. */
8113 1.1 mrg if (!REG_P (reg) || AR_REGNO_P (REGNO (reg)))
8114 1.1 mrg return -1;
8115 1.1 mrg
8116 1.1 mrg if (!MEM_P (mem))
8117 1.1 mrg return -1;
8118 1.1 mrg
8119 1.1 mrg {
8120 1.1 mrg rtx mem_reg = XEXP (mem, 0);
8121 1.1 mrg
8122 1.1 mrg if (!REG_P (mem_reg))
8123 1.1 mrg return -1;
8124 1.1 mrg }
8125 1.1 mrg
8126 1.1 mrg mode_rtx = mem;
8127 1.1 mrg }
8128 1.1 mrg else if (get_attr_speculable2 (insn) == SPECULABLE2_YES)
8129 1.1 mrg {
8130 1.1 mrg gcc_assert (REG_P (reg) && MEM_P (mem));
8131 1.1 mrg mode_rtx = mem;
8132 1.1 mrg }
8133 1.1 mrg else
8134 1.1 mrg return -1;
8135 1.1 mrg }
8136 1.1 mrg else if (get_attr_data_speculative (insn) == DATA_SPECULATIVE_YES
8137 1.1 mrg || get_attr_control_speculative (insn) == CONTROL_SPECULATIVE_YES
8138 1.1 mrg || get_attr_check_load (insn) == CHECK_LOAD_YES)
8139 1.1 mrg /* Process speculative ld or ld.c. */
8140 1.1 mrg {
8141 1.1 mrg gcc_assert (REG_P (reg) && MEM_P (mem));
8142 1.1 mrg mode_rtx = mem;
8143 1.1 mrg }
8144 1.1 mrg else
8145 1.1 mrg {
8146 1.1 mrg enum attr_itanium_class attr_class = get_attr_itanium_class (insn);
8147 1.1 mrg
8148 1.1 mrg if (attr_class == ITANIUM_CLASS_CHK_A
8149 1.1 mrg || attr_class == ITANIUM_CLASS_CHK_S_I
8150 1.1 mrg || attr_class == ITANIUM_CLASS_CHK_S_F)
8151 1.1 mrg /* Process chk. */
8152 1.1 mrg mode_rtx = reg;
8153 1.1 mrg else
8154 1.1 mrg return -1;
8155 1.1 mrg }
8156 1.1 mrg
8157 1.1 mrg mode_no = ia64_mode_to_int (GET_MODE (mode_rtx));
8158 1.1 mrg
8159 1.1 mrg if (mode_no == SPEC_MODE_INVALID)
8160 1.1 mrg return -1;
8161 1.1 mrg
8162 1.1 mrg extend_p = (GET_MODE (reg) != GET_MODE (mode_rtx));
8163 1.1 mrg
8164 1.1 mrg if (extend_p)
8165 1.1 mrg {
8166 1.1 mrg if (!(SPEC_MODE_FOR_EXTEND_FIRST <= mode_no
8167 1.1 mrg && mode_no <= SPEC_MODE_FOR_EXTEND_LAST))
8168 1.1 mrg return -1;
8169 1.1 mrg
8170 1.1 mrg mode_no += SPEC_GEN_EXTEND_OFFSET;
8171 1.1 mrg }
8172 1.1 mrg
8173 1.1 mrg return mode_no;
8174 1.1 mrg }
8175 1.1 mrg
8176 1.1 mrg /* If X is an unspec part of a speculative load, return its code.
8177 1.1 mrg Return -1 otherwise. */
8178 1.1 mrg static int
8179 1.1 mrg get_spec_unspec_code (const_rtx x)
8180 1.1 mrg {
8181 1.1 mrg if (GET_CODE (x) != UNSPEC)
8182 1.1 mrg return -1;
8183 1.1 mrg
8184 1.1 mrg {
8185 1.1 mrg int code;
8186 1.1 mrg
8187 1.1 mrg code = XINT (x, 1);
8188 1.1 mrg
8189 1.1 mrg switch (code)
8190 1.1 mrg {
8191 1.1 mrg case UNSPEC_LDA:
8192 1.1 mrg case UNSPEC_LDS:
8193 1.1 mrg case UNSPEC_LDS_A:
8194 1.1 mrg case UNSPEC_LDSA:
8195 1.1 mrg return code;
8196 1.1 mrg
8197 1.1 mrg default:
8198 1.1 mrg return -1;
8199 1.1 mrg }
8200 1.1 mrg }
8201 1.1 mrg }
8202 1.1 mrg
8203 1.1 mrg /* Implement skip_rtx_p hook. */
8204 1.1 mrg static bool
8205 1.1 mrg ia64_skip_rtx_p (const_rtx x)
8206 1.1 mrg {
8207 1.1 mrg return get_spec_unspec_code (x) != -1;
8208 1.1 mrg }
8209 1.1 mrg
8210 1.1 mrg /* If INSN is a speculative load, return its UNSPEC code.
8211 1.1 mrg Return -1 otherwise. */
8212 1.1 mrg static int
8213 1.1 mrg get_insn_spec_code (const_rtx insn)
8214 1.1 mrg {
8215 1.1 mrg rtx pat, reg, mem;
8216 1.1 mrg
8217 1.1 mrg pat = PATTERN (insn);
8218 1.1 mrg
8219 1.1 mrg if (GET_CODE (pat) == COND_EXEC)
8220 1.1 mrg pat = COND_EXEC_CODE (pat);
8221 1.1 mrg
8222 1.1 mrg if (GET_CODE (pat) != SET)
8223 1.1 mrg return -1;
8224 1.1 mrg
8225 1.1 mrg reg = SET_DEST (pat);
8226 1.1 mrg if (!REG_P (reg))
8227 1.1 mrg return -1;
8228 1.1 mrg
8229 1.1 mrg mem = SET_SRC (pat);
8230 1.1 mrg if (GET_CODE (mem) == ZERO_EXTEND)
8231 1.1 mrg mem = XEXP (mem, 0);
8232 1.1 mrg
8233 1.1 mrg return get_spec_unspec_code (mem);
8234 1.1 mrg }
8235 1.1 mrg
8236 1.1 mrg /* If INSN is a speculative load, return a ds with the speculation types.
8237 1.1 mrg Otherwise [if INSN is a normal instruction] return 0. */
8238 1.1 mrg static ds_t
8239 1.1 mrg ia64_get_insn_spec_ds (rtx_insn *insn)
8240 1.1 mrg {
8241 1.1 mrg int code = get_insn_spec_code (insn);
8242 1.1 mrg
8243 1.1 mrg switch (code)
8244 1.1 mrg {
8245 1.1 mrg case UNSPEC_LDA:
8246 1.1 mrg return BEGIN_DATA;
8247 1.1 mrg
8248 1.1 mrg case UNSPEC_LDS:
8249 1.1 mrg case UNSPEC_LDS_A:
8250 1.1 mrg return BEGIN_CONTROL;
8251 1.1 mrg
8252 1.1 mrg case UNSPEC_LDSA:
8253 1.1 mrg return BEGIN_DATA | BEGIN_CONTROL;
8254 1.1 mrg
8255 1.1 mrg default:
8256 1.1 mrg return 0;
8257 1.1 mrg }
8258 1.1 mrg }
8259 1.1 mrg
8260 1.1 mrg /* If INSN is a speculative load return a ds with the speculation types that
8261 1.1 mrg will be checked.
8262 1.1 mrg Otherwise [if INSN is a normal instruction] return 0. */
8263 1.1 mrg static ds_t
8264 1.1 mrg ia64_get_insn_checked_ds (rtx_insn *insn)
8265 1.1 mrg {
8266 1.1 mrg int code = get_insn_spec_code (insn);
8267 1.1 mrg
8268 1.1 mrg switch (code)
8269 1.1 mrg {
8270 1.1 mrg case UNSPEC_LDA:
8271 1.1 mrg return BEGIN_DATA | BEGIN_CONTROL;
8272 1.1 mrg
8273 1.1 mrg case UNSPEC_LDS:
8274 1.1 mrg return BEGIN_CONTROL;
8275 1.1 mrg
8276 1.1 mrg case UNSPEC_LDS_A:
8277 1.1 mrg case UNSPEC_LDSA:
8278 1.1 mrg return BEGIN_DATA | BEGIN_CONTROL;
8279 1.1 mrg
8280 1.1 mrg default:
8281 1.1 mrg return 0;
8282 1.1 mrg }
8283 1.1 mrg }
8284 1.1 mrg
8285 1.1 mrg /* If GEN_P is true, calculate the index of needed speculation check and return
8286 1.1 mrg speculative pattern for INSN with speculative mode TS, machine mode
8287 1.1 mrg MODE_NO and with ZERO_EXTEND (if EXTEND_P is true).
8288 1.1 mrg If GEN_P is false, just calculate the index of needed speculation check. */
8289 1.1 mrg static rtx
8290 1.1 mrg ia64_gen_spec_load (rtx insn, ds_t ts, int mode_no)
8291 1.1 mrg {
8292 1.1 mrg rtx pat, new_pat;
8293 1.1 mrg gen_func_t gen_load;
8294 1.1 mrg
8295 1.1 mrg gen_load = get_spec_load_gen_function (ts, mode_no);
8296 1.1 mrg
8297 1.1 mrg new_pat = gen_load (copy_rtx (recog_data.operand[0]),
8298 1.1 mrg copy_rtx (recog_data.operand[1]));
8299 1.1 mrg
8300 1.1 mrg pat = PATTERN (insn);
8301 1.1 mrg if (GET_CODE (pat) == COND_EXEC)
8302 1.1 mrg new_pat = gen_rtx_COND_EXEC (VOIDmode, copy_rtx (COND_EXEC_TEST (pat)),
8303 1.1 mrg new_pat);
8304 1.1 mrg
8305 1.1 mrg return new_pat;
8306 1.1 mrg }
8307 1.1 mrg
8308 1.1 mrg static bool
8309 1.1 mrg insn_can_be_in_speculative_p (rtx insn ATTRIBUTE_UNUSED,
8310 1.1 mrg ds_t ds ATTRIBUTE_UNUSED)
8311 1.1 mrg {
8312 1.1 mrg return false;
8313 1.1 mrg }
8314 1.1 mrg
8315 1.1 mrg /* Implement targetm.sched.speculate_insn hook.
8316 1.1 mrg Check if the INSN can be TS speculative.
8317 1.1 mrg If 'no' - return -1.
8318 1.1 mrg If 'yes' - generate speculative pattern in the NEW_PAT and return 1.
8319 1.1 mrg If current pattern of the INSN already provides TS speculation,
8320 1.1 mrg return 0. */
8321 1.1 mrg static int
8322 1.1 mrg ia64_speculate_insn (rtx_insn *insn, ds_t ts, rtx *new_pat)
8323 1.1 mrg {
8324 1.1 mrg int mode_no;
8325 1.1 mrg int res;
8326 1.1 mrg
8327 1.1 mrg gcc_assert (!(ts & ~SPECULATIVE));
8328 1.1 mrg
8329 1.1 mrg if (ia64_spec_check_p (insn))
8330 1.1 mrg return -1;
8331 1.1 mrg
8332 1.1 mrg if ((ts & BE_IN_SPEC)
8333 1.1 mrg && !insn_can_be_in_speculative_p (insn, ts))
8334 1.1 mrg return -1;
8335 1.1 mrg
8336 1.1 mrg mode_no = get_mode_no_for_insn (insn);
8337 1.1 mrg
8338 1.1 mrg if (mode_no != SPEC_MODE_INVALID)
8339 1.1 mrg {
8340 1.1 mrg if (ia64_get_insn_spec_ds (insn) == ds_get_speculation_types (ts))
8341 1.1 mrg res = 0;
8342 1.1 mrg else
8343 1.1 mrg {
8344 1.1 mrg res = 1;
8345 1.1 mrg *new_pat = ia64_gen_spec_load (insn, ts, mode_no);
8346 1.1 mrg }
8347 1.1 mrg }
8348 1.1 mrg else
8349 1.1 mrg res = -1;
8350 1.1 mrg
8351 1.1 mrg return res;
8352 1.1 mrg }
8353 1.1 mrg
8354 1.1 mrg /* Return a function that will generate a check for speculation TS with mode
8355 1.1 mrg MODE_NO.
8356 1.1 mrg If simple check is needed, pass true for SIMPLE_CHECK_P.
8357 1.1 mrg If clearing check is needed, pass true for CLEARING_CHECK_P. */
8358 1.1 mrg static gen_func_t
8359 1.1 mrg get_spec_check_gen_function (ds_t ts, int mode_no,
8360 1.1 mrg bool simple_check_p, bool clearing_check_p)
8361 1.1 mrg {
8362 1.1 mrg static gen_func_t gen_ld_c_clr[] = {
8363 1.1 mrg gen_movbi_clr,
8364 1.1 mrg gen_movqi_clr,
8365 1.1 mrg gen_movhi_clr,
8366 1.1 mrg gen_movsi_clr,
8367 1.1 mrg gen_movdi_clr,
8368 1.1 mrg gen_movsf_clr,
8369 1.1 mrg gen_movdf_clr,
8370 1.1 mrg gen_movxf_clr,
8371 1.1 mrg gen_movti_clr,
8372 1.1 mrg gen_zero_extendqidi2_clr,
8373 1.1 mrg gen_zero_extendhidi2_clr,
8374 1.1 mrg gen_zero_extendsidi2_clr,
8375 1.1 mrg };
8376 1.1 mrg static gen_func_t gen_ld_c_nc[] = {
8377 1.1 mrg gen_movbi_nc,
8378 1.1 mrg gen_movqi_nc,
8379 1.1 mrg gen_movhi_nc,
8380 1.1 mrg gen_movsi_nc,
8381 1.1 mrg gen_movdi_nc,
8382 1.1 mrg gen_movsf_nc,
8383 1.1 mrg gen_movdf_nc,
8384 1.1 mrg gen_movxf_nc,
8385 1.1 mrg gen_movti_nc,
8386 1.1 mrg gen_zero_extendqidi2_nc,
8387 1.1 mrg gen_zero_extendhidi2_nc,
8388 1.1 mrg gen_zero_extendsidi2_nc,
8389 1.1 mrg };
8390 1.1 mrg static gen_func_t gen_chk_a_clr[] = {
8391 1.1 mrg gen_advanced_load_check_clr_bi,
8392 1.1 mrg gen_advanced_load_check_clr_qi,
8393 1.1 mrg gen_advanced_load_check_clr_hi,
8394 1.1 mrg gen_advanced_load_check_clr_si,
8395 1.1 mrg gen_advanced_load_check_clr_di,
8396 1.1 mrg gen_advanced_load_check_clr_sf,
8397 1.1 mrg gen_advanced_load_check_clr_df,
8398 1.1 mrg gen_advanced_load_check_clr_xf,
8399 1.1 mrg gen_advanced_load_check_clr_ti,
8400 1.1 mrg gen_advanced_load_check_clr_di,
8401 1.1 mrg gen_advanced_load_check_clr_di,
8402 1.1 mrg gen_advanced_load_check_clr_di,
8403 1.1 mrg };
8404 1.1 mrg static gen_func_t gen_chk_a_nc[] = {
8405 1.1 mrg gen_advanced_load_check_nc_bi,
8406 1.1 mrg gen_advanced_load_check_nc_qi,
8407 1.1 mrg gen_advanced_load_check_nc_hi,
8408 1.1 mrg gen_advanced_load_check_nc_si,
8409 1.1 mrg gen_advanced_load_check_nc_di,
8410 1.1 mrg gen_advanced_load_check_nc_sf,
8411 1.1 mrg gen_advanced_load_check_nc_df,
8412 1.1 mrg gen_advanced_load_check_nc_xf,
8413 1.1 mrg gen_advanced_load_check_nc_ti,
8414 1.1 mrg gen_advanced_load_check_nc_di,
8415 1.1 mrg gen_advanced_load_check_nc_di,
8416 1.1 mrg gen_advanced_load_check_nc_di,
8417 1.1 mrg };
8418 1.1 mrg static gen_func_t gen_chk_s[] = {
8419 1.1 mrg gen_speculation_check_bi,
8420 1.1 mrg gen_speculation_check_qi,
8421 1.1 mrg gen_speculation_check_hi,
8422 1.1 mrg gen_speculation_check_si,
8423 1.1 mrg gen_speculation_check_di,
8424 1.1 mrg gen_speculation_check_sf,
8425 1.1 mrg gen_speculation_check_df,
8426 1.1 mrg gen_speculation_check_xf,
8427 1.1 mrg gen_speculation_check_ti,
8428 1.1 mrg gen_speculation_check_di,
8429 1.1 mrg gen_speculation_check_di,
8430 1.1 mrg gen_speculation_check_di,
8431 1.1 mrg };
8432 1.1 mrg
8433 1.1 mrg gen_func_t *gen_check;
8434 1.1 mrg
8435 1.1 mrg if (ts & BEGIN_DATA)
8436 1.1 mrg {
8437 1.1 mrg /* We don't need recovery because even if this is ld.sa
8438 1.1 mrg ALAT entry will be allocated only if NAT bit is set to zero.
8439 1.1 mrg So it is enough to use ld.c here. */
8440 1.1 mrg
8441 1.1 mrg if (simple_check_p)
8442 1.1 mrg {
8443 1.1 mrg gcc_assert (mflag_sched_spec_ldc);
8444 1.1 mrg
8445 1.1 mrg if (clearing_check_p)
8446 1.1 mrg gen_check = gen_ld_c_clr;
8447 1.1 mrg else
8448 1.1 mrg gen_check = gen_ld_c_nc;
8449 1.1 mrg }
8450 1.1 mrg else
8451 1.1 mrg {
8452 1.1 mrg if (clearing_check_p)
8453 1.1 mrg gen_check = gen_chk_a_clr;
8454 1.1 mrg else
8455 1.1 mrg gen_check = gen_chk_a_nc;
8456 1.1 mrg }
8457 1.1 mrg }
8458 1.1 mrg else if (ts & BEGIN_CONTROL)
8459 1.1 mrg {
8460 1.1 mrg if (simple_check_p)
8461 1.1 mrg /* We might want to use ld.sa -> ld.c instead of
8462 1.1 mrg ld.s -> chk.s. */
8463 1.1 mrg {
8464 1.1 mrg gcc_assert (!ia64_needs_block_p (ts));
8465 1.1 mrg
8466 1.1 mrg if (clearing_check_p)
8467 1.1 mrg gen_check = gen_ld_c_clr;
8468 1.1 mrg else
8469 1.1 mrg gen_check = gen_ld_c_nc;
8470 1.1 mrg }
8471 1.1 mrg else
8472 1.1 mrg {
8473 1.1 mrg gen_check = gen_chk_s;
8474 1.1 mrg }
8475 1.1 mrg }
8476 1.1 mrg else
8477 1.1 mrg gcc_unreachable ();
8478 1.1 mrg
8479 1.1 mrg gcc_assert (mode_no >= 0);
8480 1.1 mrg return gen_check[mode_no];
8481 1.1 mrg }
8482 1.1 mrg
8483 1.1 mrg /* Return nonzero, if INSN needs branchy recovery check. */
8484 1.1 mrg static bool
8485 1.1 mrg ia64_needs_block_p (ds_t ts)
8486 1.1 mrg {
8487 1.1 mrg if (ts & BEGIN_DATA)
8488 1.1 mrg return !mflag_sched_spec_ldc;
8489 1.1 mrg
8490 1.1 mrg gcc_assert ((ts & BEGIN_CONTROL) != 0);
8491 1.1 mrg
8492 1.1 mrg return !(mflag_sched_spec_control_ldc && mflag_sched_spec_ldc);
8493 1.1 mrg }
8494 1.1 mrg
8495 1.1 mrg /* Generate (or regenerate) a recovery check for INSN. */
8496 1.1 mrg static rtx
8497 1.1 mrg ia64_gen_spec_check (rtx_insn *insn, rtx_insn *label, ds_t ds)
8498 1.1 mrg {
8499 1.1 mrg rtx op1, pat, check_pat;
8500 1.1 mrg gen_func_t gen_check;
8501 1.1 mrg int mode_no;
8502 1.1 mrg
8503 1.1 mrg mode_no = get_mode_no_for_insn (insn);
8504 1.1 mrg gcc_assert (mode_no >= 0);
8505 1.1 mrg
8506 1.1 mrg if (label)
8507 1.1 mrg op1 = label;
8508 1.1 mrg else
8509 1.1 mrg {
8510 1.1 mrg gcc_assert (!ia64_needs_block_p (ds));
8511 1.1 mrg op1 = copy_rtx (recog_data.operand[1]);
8512 1.1 mrg }
8513 1.1 mrg
8514 1.1 mrg gen_check = get_spec_check_gen_function (ds, mode_no, label == NULL_RTX,
8515 1.1 mrg true);
8516 1.1 mrg
8517 1.1 mrg check_pat = gen_check (copy_rtx (recog_data.operand[0]), op1);
8518 1.1 mrg
8519 1.1 mrg pat = PATTERN (insn);
8520 1.1 mrg if (GET_CODE (pat) == COND_EXEC)
8521 1.1 mrg check_pat = gen_rtx_COND_EXEC (VOIDmode, copy_rtx (COND_EXEC_TEST (pat)),
8522 1.1 mrg check_pat);
8523 1.1 mrg
8524 1.1 mrg return check_pat;
8525 1.1 mrg }
8526 1.1 mrg
8527 1.1 mrg /* Return nonzero, if X is branchy recovery check. */
8528 1.1 mrg static int
8529 1.1 mrg ia64_spec_check_p (rtx x)
8530 1.1 mrg {
8531 1.1 mrg x = PATTERN (x);
8532 1.1 mrg if (GET_CODE (x) == COND_EXEC)
8533 1.1 mrg x = COND_EXEC_CODE (x);
8534 1.1 mrg if (GET_CODE (x) == SET)
8535 1.1 mrg return ia64_spec_check_src_p (SET_SRC (x));
8536 1.1 mrg return 0;
8537 1.1 mrg }
8538 1.1 mrg
8539 1.1 mrg /* Return nonzero, if SRC belongs to recovery check. */
8540 1.1 mrg static int
8541 1.1 mrg ia64_spec_check_src_p (rtx src)
8542 1.1 mrg {
8543 1.1 mrg if (GET_CODE (src) == IF_THEN_ELSE)
8544 1.1 mrg {
8545 1.1 mrg rtx t;
8546 1.1 mrg
8547 1.1 mrg t = XEXP (src, 0);
8548 1.1 mrg if (GET_CODE (t) == NE)
8549 1.1 mrg {
8550 1.1 mrg t = XEXP (t, 0);
8551 1.1 mrg
8552 1.1 mrg if (GET_CODE (t) == UNSPEC)
8553 1.1 mrg {
8554 1.1 mrg int code;
8555 1.1 mrg
8556 1.1 mrg code = XINT (t, 1);
8557 1.1 mrg
8558 1.1 mrg if (code == UNSPEC_LDCCLR
8559 1.1 mrg || code == UNSPEC_LDCNC
8560 1.1 mrg || code == UNSPEC_CHKACLR
8561 1.1 mrg || code == UNSPEC_CHKANC
8562 1.1 mrg || code == UNSPEC_CHKS)
8563 1.1 mrg {
8564 1.1 mrg gcc_assert (code != 0);
8565 1.1 mrg return code;
8566 1.1 mrg }
8567 1.1 mrg }
8568 1.1 mrg }
8569 1.1 mrg }
8570 1.1 mrg return 0;
8571 1.1 mrg }
8572 1.1 mrg
8573 1.1 mrg
8575 1.1 mrg /* The following page contains abstract data `bundle states' which are
8576 1.1 mrg used for bundling insns (inserting nops and template generation). */
8577 1.1 mrg
8578 1.1 mrg /* The following describes state of insn bundling. */
8579 1.1 mrg
8580 1.1 mrg struct bundle_state
8581 1.1 mrg {
8582 1.1 mrg /* Unique bundle state number to identify them in the debugging
8583 1.1 mrg output */
8584 1.1 mrg int unique_num;
8585 1.1 mrg rtx_insn *insn; /* corresponding insn, NULL for the 1st and the last state */
8586 1.1 mrg /* number nops before and after the insn */
8587 1.1 mrg short before_nops_num, after_nops_num;
8588 1.1 mrg int insn_num; /* insn number (0 - for initial state, 1 - for the 1st
8589 1.1 mrg insn */
8590 1.1 mrg int cost; /* cost of the state in cycles */
8591 1.1 mrg int accumulated_insns_num; /* number of all previous insns including
8592 1.1 mrg nops. L is considered as 2 insns */
8593 1.1 mrg int branch_deviation; /* deviation of previous branches from 3rd slots */
8594 1.1 mrg int middle_bundle_stops; /* number of stop bits in the middle of bundles */
8595 1.1 mrg struct bundle_state *next; /* next state with the same insn_num */
8596 1.1 mrg struct bundle_state *originator; /* originator (previous insn state) */
8597 1.1 mrg /* All bundle states are in the following chain. */
8598 1.1 mrg struct bundle_state *allocated_states_chain;
8599 1.1 mrg /* The DFA State after issuing the insn and the nops. */
8600 1.1 mrg state_t dfa_state;
8601 1.1 mrg };
8602 1.1 mrg
8603 1.1 mrg /* The following is map insn number to the corresponding bundle state. */
8604 1.1 mrg
8605 1.1 mrg static struct bundle_state **index_to_bundle_states;
8606 1.1 mrg
8607 1.1 mrg /* The unique number of next bundle state. */
8608 1.1 mrg
8609 1.1 mrg static int bundle_states_num;
8610 1.1 mrg
8611 1.1 mrg /* All allocated bundle states are in the following chain. */
8612 1.1 mrg
8613 1.1 mrg static struct bundle_state *allocated_bundle_states_chain;
8614 1.1 mrg
8615 1.1 mrg /* All allocated but not used bundle states are in the following
8616 1.1 mrg chain. */
8617 1.1 mrg
8618 1.1 mrg static struct bundle_state *free_bundle_state_chain;
8619 1.1 mrg
8620 1.1 mrg
8621 1.1 mrg /* The following function returns a free bundle state. */
8622 1.1 mrg
8623 1.1 mrg static struct bundle_state *
8624 1.1 mrg get_free_bundle_state (void)
8625 1.1 mrg {
8626 1.1 mrg struct bundle_state *result;
8627 1.1 mrg
8628 1.1 mrg if (free_bundle_state_chain != NULL)
8629 1.1 mrg {
8630 1.1 mrg result = free_bundle_state_chain;
8631 1.1 mrg free_bundle_state_chain = result->next;
8632 1.1 mrg }
8633 1.1 mrg else
8634 1.1 mrg {
8635 1.1 mrg result = XNEW (struct bundle_state);
8636 1.1 mrg result->dfa_state = xmalloc (dfa_state_size);
8637 1.1 mrg result->allocated_states_chain = allocated_bundle_states_chain;
8638 1.1 mrg allocated_bundle_states_chain = result;
8639 1.1 mrg }
8640 1.1 mrg result->unique_num = bundle_states_num++;
8641 1.1 mrg return result;
8642 1.1 mrg
8643 1.1 mrg }
8644 1.1 mrg
8645 1.1 mrg /* The following function frees given bundle state. */
8646 1.1 mrg
8647 1.1 mrg static void
8648 1.1 mrg free_bundle_state (struct bundle_state *state)
8649 1.1 mrg {
8650 1.1 mrg state->next = free_bundle_state_chain;
8651 1.1 mrg free_bundle_state_chain = state;
8652 1.1 mrg }
8653 1.1 mrg
8654 1.1 mrg /* Start work with abstract data `bundle states'. */
8655 1.1 mrg
8656 1.1 mrg static void
8657 1.1 mrg initiate_bundle_states (void)
8658 1.1 mrg {
8659 1.1 mrg bundle_states_num = 0;
8660 1.1 mrg free_bundle_state_chain = NULL;
8661 1.1 mrg allocated_bundle_states_chain = NULL;
8662 1.1 mrg }
8663 1.1 mrg
8664 1.1 mrg /* Finish work with abstract data `bundle states'. */
8665 1.1 mrg
8666 1.1 mrg static void
8667 1.1 mrg finish_bundle_states (void)
8668 1.1 mrg {
8669 1.1 mrg struct bundle_state *curr_state, *next_state;
8670 1.1 mrg
8671 1.1 mrg for (curr_state = allocated_bundle_states_chain;
8672 1.1 mrg curr_state != NULL;
8673 1.1 mrg curr_state = next_state)
8674 1.1 mrg {
8675 1.1 mrg next_state = curr_state->allocated_states_chain;
8676 1.1 mrg free (curr_state->dfa_state);
8677 1.1 mrg free (curr_state);
8678 1.1 mrg }
8679 1.1 mrg }
8680 1.1 mrg
8681 1.1 mrg /* Hashtable helpers. */
8682 1.1 mrg
8683 1.1 mrg struct bundle_state_hasher : nofree_ptr_hash <bundle_state>
8684 1.1 mrg {
8685 1.1 mrg static inline hashval_t hash (const bundle_state *);
8686 1.1 mrg static inline bool equal (const bundle_state *, const bundle_state *);
8687 1.1 mrg };
8688 1.1 mrg
8689 1.1 mrg /* The function returns hash of BUNDLE_STATE. */
8690 1.1 mrg
8691 1.1 mrg inline hashval_t
8692 1.1 mrg bundle_state_hasher::hash (const bundle_state *state)
8693 1.1 mrg {
8694 1.1 mrg unsigned result, i;
8695 1.1 mrg
8696 1.1 mrg for (result = i = 0; i < dfa_state_size; i++)
8697 1.1 mrg result += (((unsigned char *) state->dfa_state) [i]
8698 1.1 mrg << ((i % CHAR_BIT) * 3 + CHAR_BIT));
8699 1.1 mrg return result + state->insn_num;
8700 1.1 mrg }
8701 1.1 mrg
8702 1.1 mrg /* The function returns nonzero if the bundle state keys are equal. */
8703 1.1 mrg
8704 1.1 mrg inline bool
8705 1.1 mrg bundle_state_hasher::equal (const bundle_state *state1,
8706 1.1 mrg const bundle_state *state2)
8707 1.1 mrg {
8708 1.1 mrg return (state1->insn_num == state2->insn_num
8709 1.1 mrg && memcmp (state1->dfa_state, state2->dfa_state,
8710 1.1 mrg dfa_state_size) == 0);
8711 1.1 mrg }
8712 1.1 mrg
8713 1.1 mrg /* Hash table of the bundle states. The key is dfa_state and insn_num
8714 1.1 mrg of the bundle states. */
8715 1.1 mrg
8716 1.1 mrg static hash_table<bundle_state_hasher> *bundle_state_table;
8717 1.1 mrg
8718 1.1 mrg /* The function inserts the BUNDLE_STATE into the hash table. The
8719 1.1 mrg function returns nonzero if the bundle has been inserted into the
8720 1.1 mrg table. The table contains the best bundle state with given key. */
8721 1.1 mrg
8722 1.1 mrg static int
8723 1.1 mrg insert_bundle_state (struct bundle_state *bundle_state)
8724 1.1 mrg {
8725 1.1 mrg struct bundle_state **entry_ptr;
8726 1.1 mrg
8727 1.1 mrg entry_ptr = bundle_state_table->find_slot (bundle_state, INSERT);
8728 1.1 mrg if (*entry_ptr == NULL)
8729 1.1 mrg {
8730 1.1 mrg bundle_state->next = index_to_bundle_states [bundle_state->insn_num];
8731 1.1 mrg index_to_bundle_states [bundle_state->insn_num] = bundle_state;
8732 1.1 mrg *entry_ptr = bundle_state;
8733 1.1 mrg return TRUE;
8734 1.1 mrg }
8735 1.1 mrg else if (bundle_state->cost < (*entry_ptr)->cost
8736 1.1 mrg || (bundle_state->cost == (*entry_ptr)->cost
8737 1.1 mrg && ((*entry_ptr)->accumulated_insns_num
8738 1.1 mrg > bundle_state->accumulated_insns_num
8739 1.1 mrg || ((*entry_ptr)->accumulated_insns_num
8740 1.1 mrg == bundle_state->accumulated_insns_num
8741 1.1 mrg && ((*entry_ptr)->branch_deviation
8742 1.1 mrg > bundle_state->branch_deviation
8743 1.1 mrg || ((*entry_ptr)->branch_deviation
8744 1.1 mrg == bundle_state->branch_deviation
8745 1.1 mrg && (*entry_ptr)->middle_bundle_stops
8746 1.1 mrg > bundle_state->middle_bundle_stops))))))
8747 1.1 mrg
8748 1.1 mrg {
8749 1.1 mrg struct bundle_state temp;
8750 1.1 mrg
8751 1.1 mrg temp = **entry_ptr;
8752 1.1 mrg **entry_ptr = *bundle_state;
8753 1.1 mrg (*entry_ptr)->next = temp.next;
8754 1.1 mrg *bundle_state = temp;
8755 1.1 mrg }
8756 1.1 mrg return FALSE;
8757 1.1 mrg }
8758 1.1 mrg
8759 1.1 mrg /* Start work with the hash table. */
8760 1.1 mrg
8761 1.1 mrg static void
8762 1.1 mrg initiate_bundle_state_table (void)
8763 1.1 mrg {
8764 1.1 mrg bundle_state_table = new hash_table<bundle_state_hasher> (50);
8765 1.1 mrg }
8766 1.1 mrg
8767 1.1 mrg /* Finish work with the hash table. */
8768 1.1 mrg
8769 1.1 mrg static void
8770 1.1 mrg finish_bundle_state_table (void)
8771 1.1 mrg {
8772 1.1 mrg delete bundle_state_table;
8773 1.1 mrg bundle_state_table = NULL;
8774 1.1 mrg }
8775 1.1 mrg
8776 1.1 mrg
8777 1.1 mrg
8779 1.1 mrg /* The following variable is a insn `nop' used to check bundle states
8780 1.1 mrg with different number of inserted nops. */
8781 1.1 mrg
8782 1.1 mrg static rtx_insn *ia64_nop;
8783 1.1 mrg
8784 1.1 mrg /* The following function tries to issue NOPS_NUM nops for the current
8785 1.1 mrg state without advancing processor cycle. If it failed, the
8786 1.1 mrg function returns FALSE and frees the current state. */
8787 1.1 mrg
8788 1.1 mrg static int
8789 1.1 mrg try_issue_nops (struct bundle_state *curr_state, int nops_num)
8790 1.1 mrg {
8791 1.1 mrg int i;
8792 1.1 mrg
8793 1.1 mrg for (i = 0; i < nops_num; i++)
8794 1.1 mrg if (state_transition (curr_state->dfa_state, ia64_nop) >= 0)
8795 1.1 mrg {
8796 1.1 mrg free_bundle_state (curr_state);
8797 1.1 mrg return FALSE;
8798 1.1 mrg }
8799 1.1 mrg return TRUE;
8800 1.1 mrg }
8801 1.1 mrg
8802 1.1 mrg /* The following function tries to issue INSN for the current
8803 1.1 mrg state without advancing processor cycle. If it failed, the
8804 1.1 mrg function returns FALSE and frees the current state. */
8805 1.1 mrg
8806 1.1 mrg static int
8807 1.1 mrg try_issue_insn (struct bundle_state *curr_state, rtx insn)
8808 1.1 mrg {
8809 1.1 mrg if (insn && state_transition (curr_state->dfa_state, insn) >= 0)
8810 1.1 mrg {
8811 1.1 mrg free_bundle_state (curr_state);
8812 1.1 mrg return FALSE;
8813 1.1 mrg }
8814 1.1 mrg return TRUE;
8815 1.1 mrg }
8816 1.1 mrg
8817 1.1 mrg /* The following function tries to issue BEFORE_NOPS_NUM nops and INSN
8818 1.1 mrg starting with ORIGINATOR without advancing processor cycle. If
8819 1.1 mrg TRY_BUNDLE_END_P is TRUE, the function also/only (if
8820 1.1 mrg ONLY_BUNDLE_END_P is TRUE) tries to issue nops to fill all bundle.
8821 1.1 mrg If it was successful, the function creates new bundle state and
8822 1.1 mrg insert into the hash table and into `index_to_bundle_states'. */
8823 1.1 mrg
8824 1.1 mrg static void
8825 1.1 mrg issue_nops_and_insn (struct bundle_state *originator, int before_nops_num,
8826 1.1 mrg rtx_insn *insn, int try_bundle_end_p,
8827 1.1 mrg int only_bundle_end_p)
8828 1.1 mrg {
8829 1.1 mrg struct bundle_state *curr_state;
8830 1.1 mrg
8831 1.1 mrg curr_state = get_free_bundle_state ();
8832 1.1 mrg memcpy (curr_state->dfa_state, originator->dfa_state, dfa_state_size);
8833 1.1 mrg curr_state->insn = insn;
8834 1.1 mrg curr_state->insn_num = originator->insn_num + 1;
8835 1.1 mrg curr_state->cost = originator->cost;
8836 1.1 mrg curr_state->originator = originator;
8837 1.1 mrg curr_state->before_nops_num = before_nops_num;
8838 1.1 mrg curr_state->after_nops_num = 0;
8839 1.1 mrg curr_state->accumulated_insns_num
8840 1.1 mrg = originator->accumulated_insns_num + before_nops_num;
8841 1.1 mrg curr_state->branch_deviation = originator->branch_deviation;
8842 1.1 mrg curr_state->middle_bundle_stops = originator->middle_bundle_stops;
8843 1.1 mrg gcc_assert (insn);
8844 1.1 mrg if (INSN_CODE (insn) == CODE_FOR_insn_group_barrier)
8845 1.1 mrg {
8846 1.1 mrg gcc_assert (GET_MODE (insn) != TImode);
8847 1.1 mrg if (!try_issue_nops (curr_state, before_nops_num))
8848 1.1 mrg return;
8849 1.1 mrg if (!try_issue_insn (curr_state, insn))
8850 1.1 mrg return;
8851 1.1 mrg memcpy (temp_dfa_state, curr_state->dfa_state, dfa_state_size);
8852 1.1 mrg if (curr_state->accumulated_insns_num % 3 != 0)
8853 1.1 mrg curr_state->middle_bundle_stops++;
8854 1.1 mrg if (state_transition (temp_dfa_state, dfa_pre_cycle_insn) >= 0
8855 1.1 mrg && curr_state->accumulated_insns_num % 3 != 0)
8856 1.1 mrg {
8857 1.1 mrg free_bundle_state (curr_state);
8858 1.1 mrg return;
8859 1.1 mrg }
8860 1.1 mrg }
8861 1.1 mrg else if (GET_MODE (insn) != TImode)
8862 1.1 mrg {
8863 1.1 mrg if (!try_issue_nops (curr_state, before_nops_num))
8864 1.1 mrg return;
8865 1.1 mrg if (!try_issue_insn (curr_state, insn))
8866 1.1 mrg return;
8867 1.1 mrg curr_state->accumulated_insns_num++;
8868 1.1 mrg gcc_assert (!unknown_for_bundling_p (insn));
8869 1.1 mrg
8870 1.1 mrg if (ia64_safe_type (insn) == TYPE_L)
8871 1.1 mrg curr_state->accumulated_insns_num++;
8872 1.1 mrg }
8873 1.1 mrg else
8874 1.1 mrg {
8875 1.1 mrg /* If this is an insn that must be first in a group, then don't allow
8876 1.1 mrg nops to be emitted before it. Currently, alloc is the only such
8877 1.1 mrg supported instruction. */
8878 1.1 mrg /* ??? The bundling automatons should handle this for us, but they do
8879 1.1 mrg not yet have support for the first_insn attribute. */
8880 1.1 mrg if (before_nops_num > 0 && get_attr_first_insn (insn) == FIRST_INSN_YES)
8881 1.1 mrg {
8882 1.1 mrg free_bundle_state (curr_state);
8883 1.1 mrg return;
8884 1.1 mrg }
8885 1.1 mrg
8886 1.1 mrg state_transition (curr_state->dfa_state, dfa_pre_cycle_insn);
8887 1.1 mrg state_transition (curr_state->dfa_state, NULL);
8888 1.1 mrg curr_state->cost++;
8889 1.1 mrg if (!try_issue_nops (curr_state, before_nops_num))
8890 1.1 mrg return;
8891 1.1 mrg if (!try_issue_insn (curr_state, insn))
8892 1.1 mrg return;
8893 1.1 mrg curr_state->accumulated_insns_num++;
8894 1.1 mrg if (unknown_for_bundling_p (insn))
8895 1.1 mrg {
8896 1.1 mrg /* Finish bundle containing asm insn. */
8897 1.1 mrg curr_state->after_nops_num
8898 1.1 mrg = 3 - curr_state->accumulated_insns_num % 3;
8899 1.1 mrg curr_state->accumulated_insns_num
8900 1.1 mrg += 3 - curr_state->accumulated_insns_num % 3;
8901 1.1 mrg }
8902 1.1 mrg else if (ia64_safe_type (insn) == TYPE_L)
8903 1.1 mrg curr_state->accumulated_insns_num++;
8904 1.1 mrg }
8905 1.1 mrg if (ia64_safe_type (insn) == TYPE_B)
8906 1.1 mrg curr_state->branch_deviation
8907 1.1 mrg += 2 - (curr_state->accumulated_insns_num - 1) % 3;
8908 1.1 mrg if (try_bundle_end_p && curr_state->accumulated_insns_num % 3 != 0)
8909 1.1 mrg {
8910 1.1 mrg if (!only_bundle_end_p && insert_bundle_state (curr_state))
8911 1.1 mrg {
8912 1.1 mrg state_t dfa_state;
8913 1.1 mrg struct bundle_state *curr_state1;
8914 1.1 mrg struct bundle_state *allocated_states_chain;
8915 1.1 mrg
8916 1.1 mrg curr_state1 = get_free_bundle_state ();
8917 1.1 mrg dfa_state = curr_state1->dfa_state;
8918 1.1 mrg allocated_states_chain = curr_state1->allocated_states_chain;
8919 1.1 mrg *curr_state1 = *curr_state;
8920 1.1 mrg curr_state1->dfa_state = dfa_state;
8921 1.1 mrg curr_state1->allocated_states_chain = allocated_states_chain;
8922 1.1 mrg memcpy (curr_state1->dfa_state, curr_state->dfa_state,
8923 1.1 mrg dfa_state_size);
8924 1.1 mrg curr_state = curr_state1;
8925 1.1 mrg }
8926 1.1 mrg if (!try_issue_nops (curr_state,
8927 1.1 mrg 3 - curr_state->accumulated_insns_num % 3))
8928 1.1 mrg return;
8929 1.1 mrg curr_state->after_nops_num
8930 1.1 mrg = 3 - curr_state->accumulated_insns_num % 3;
8931 1.1 mrg curr_state->accumulated_insns_num
8932 1.1 mrg += 3 - curr_state->accumulated_insns_num % 3;
8933 1.1 mrg }
8934 1.1 mrg if (!insert_bundle_state (curr_state))
8935 1.1 mrg free_bundle_state (curr_state);
8936 1.1 mrg return;
8937 1.1 mrg }
8938 1.1 mrg
8939 1.1 mrg /* The following function returns position in the two window bundle
8940 1.1 mrg for given STATE. */
8941 1.1 mrg
8942 1.1 mrg static int
8943 1.1 mrg get_max_pos (state_t state)
8944 1.1 mrg {
8945 1.1 mrg if (cpu_unit_reservation_p (state, pos_6))
8946 1.1 mrg return 6;
8947 1.1 mrg else if (cpu_unit_reservation_p (state, pos_5))
8948 1.1 mrg return 5;
8949 1.1 mrg else if (cpu_unit_reservation_p (state, pos_4))
8950 1.1 mrg return 4;
8951 1.1 mrg else if (cpu_unit_reservation_p (state, pos_3))
8952 1.1 mrg return 3;
8953 1.1 mrg else if (cpu_unit_reservation_p (state, pos_2))
8954 1.1 mrg return 2;
8955 1.1 mrg else if (cpu_unit_reservation_p (state, pos_1))
8956 1.1 mrg return 1;
8957 1.1 mrg else
8958 1.1 mrg return 0;
8959 1.1 mrg }
8960 1.1 mrg
8961 1.1 mrg /* The function returns code of a possible template for given position
8962 1.1 mrg and state. The function should be called only with 2 values of
8963 1.1 mrg position equal to 3 or 6. We avoid generating F NOPs by putting
8964 1.1 mrg templates containing F insns at the end of the template search
8965 1.1 mrg because undocumented anomaly in McKinley derived cores which can
8966 1.1 mrg cause stalls if an F-unit insn (including a NOP) is issued within a
8967 1.1 mrg six-cycle window after reading certain application registers (such
8968 1.1 mrg as ar.bsp). Furthermore, power-considerations also argue against
8969 1.1 mrg the use of F-unit instructions unless they're really needed. */
8970 1.1 mrg
8971 1.1 mrg static int
8972 1.1 mrg get_template (state_t state, int pos)
8973 1.1 mrg {
8974 1.1 mrg switch (pos)
8975 1.1 mrg {
8976 1.1 mrg case 3:
8977 1.1 mrg if (cpu_unit_reservation_p (state, _0mmi_))
8978 1.1 mrg return 1;
8979 1.1 mrg else if (cpu_unit_reservation_p (state, _0mii_))
8980 1.1 mrg return 0;
8981 1.1 mrg else if (cpu_unit_reservation_p (state, _0mmb_))
8982 1.1 mrg return 7;
8983 1.1 mrg else if (cpu_unit_reservation_p (state, _0mib_))
8984 1.1 mrg return 6;
8985 1.1 mrg else if (cpu_unit_reservation_p (state, _0mbb_))
8986 1.1 mrg return 5;
8987 1.1 mrg else if (cpu_unit_reservation_p (state, _0bbb_))
8988 1.1 mrg return 4;
8989 1.1 mrg else if (cpu_unit_reservation_p (state, _0mmf_))
8990 1.1 mrg return 3;
8991 1.1 mrg else if (cpu_unit_reservation_p (state, _0mfi_))
8992 1.1 mrg return 2;
8993 1.1 mrg else if (cpu_unit_reservation_p (state, _0mfb_))
8994 1.1 mrg return 8;
8995 1.1 mrg else if (cpu_unit_reservation_p (state, _0mlx_))
8996 1.1 mrg return 9;
8997 1.1 mrg else
8998 1.1 mrg gcc_unreachable ();
8999 1.1 mrg case 6:
9000 1.1 mrg if (cpu_unit_reservation_p (state, _1mmi_))
9001 1.1 mrg return 1;
9002 1.1 mrg else if (cpu_unit_reservation_p (state, _1mii_))
9003 1.1 mrg return 0;
9004 1.1 mrg else if (cpu_unit_reservation_p (state, _1mmb_))
9005 1.1 mrg return 7;
9006 1.1 mrg else if (cpu_unit_reservation_p (state, _1mib_))
9007 1.1 mrg return 6;
9008 1.1 mrg else if (cpu_unit_reservation_p (state, _1mbb_))
9009 1.1 mrg return 5;
9010 1.1 mrg else if (cpu_unit_reservation_p (state, _1bbb_))
9011 1.1 mrg return 4;
9012 1.1 mrg else if (_1mmf_ >= 0 && cpu_unit_reservation_p (state, _1mmf_))
9013 1.1 mrg return 3;
9014 1.1 mrg else if (cpu_unit_reservation_p (state, _1mfi_))
9015 1.1 mrg return 2;
9016 1.1 mrg else if (cpu_unit_reservation_p (state, _1mfb_))
9017 1.1 mrg return 8;
9018 1.1 mrg else if (cpu_unit_reservation_p (state, _1mlx_))
9019 1.1 mrg return 9;
9020 1.1 mrg else
9021 1.1 mrg gcc_unreachable ();
9022 1.1 mrg default:
9023 1.1 mrg gcc_unreachable ();
9024 1.1 mrg }
9025 1.1 mrg }
9026 1.1 mrg
9027 1.1 mrg /* True when INSN is important for bundling. */
9028 1.1 mrg
9029 1.1 mrg static bool
9030 1.1 mrg important_for_bundling_p (rtx_insn *insn)
9031 1.1 mrg {
9032 1.1 mrg return (INSN_P (insn)
9033 1.1 mrg && ia64_safe_itanium_class (insn) != ITANIUM_CLASS_IGNORE
9034 1.1 mrg && GET_CODE (PATTERN (insn)) != USE
9035 1.1 mrg && GET_CODE (PATTERN (insn)) != CLOBBER);
9036 1.1 mrg }
9037 1.1 mrg
9038 1.1 mrg /* The following function returns an insn important for insn bundling
9039 1.1 mrg followed by INSN and before TAIL. */
9040 1.1 mrg
9041 1.1 mrg static rtx_insn *
9042 1.1 mrg get_next_important_insn (rtx_insn *insn, rtx_insn *tail)
9043 1.1 mrg {
9044 1.1 mrg for (; insn && insn != tail; insn = NEXT_INSN (insn))
9045 1.1 mrg if (important_for_bundling_p (insn))
9046 1.1 mrg return insn;
9047 1.1 mrg return NULL;
9048 1.1 mrg }
9049 1.1 mrg
9050 1.1 mrg /* True when INSN is unknown, but important, for bundling. */
9051 1.1 mrg
9052 1.1 mrg static bool
9053 1.1 mrg unknown_for_bundling_p (rtx_insn *insn)
9054 1.1 mrg {
9055 1.1 mrg return (INSN_P (insn)
9056 1.1 mrg && ia64_safe_itanium_class (insn) == ITANIUM_CLASS_UNKNOWN
9057 1.1 mrg && GET_CODE (PATTERN (insn)) != USE
9058 1.1 mrg && GET_CODE (PATTERN (insn)) != CLOBBER);
9059 1.1 mrg }
9060 1.1 mrg
9061 1.1 mrg /* Add a bundle selector TEMPLATE0 before INSN. */
9062 1.1 mrg
9063 1.1 mrg static void
9064 1.1 mrg ia64_add_bundle_selector_before (int template0, rtx_insn *insn)
9065 1.1 mrg {
9066 1.1 mrg rtx b = gen_bundle_selector (GEN_INT (template0));
9067 1.1 mrg
9068 1.1 mrg ia64_emit_insn_before (b, insn);
9069 1.1 mrg #if NR_BUNDLES == 10
9070 1.1 mrg if ((template0 == 4 || template0 == 5)
9071 1.1 mrg && ia64_except_unwind_info (&global_options) == UI_TARGET)
9072 1.1 mrg {
9073 1.1 mrg int i;
9074 1.1 mrg rtx note = NULL_RTX;
9075 1.1 mrg
9076 1.1 mrg /* In .mbb and .bbb bundles, check if CALL_INSN isn't in the
9077 1.1 mrg first or second slot. If it is and has REG_EH_NOTE set, copy it
9078 1.1 mrg to following nops, as br.call sets rp to the address of following
9079 1.1 mrg bundle and therefore an EH region end must be on a bundle
9080 1.1 mrg boundary. */
9081 1.1 mrg insn = PREV_INSN (insn);
9082 1.1 mrg for (i = 0; i < 3; i++)
9083 1.1 mrg {
9084 1.1 mrg do
9085 1.1 mrg insn = next_active_insn (insn);
9086 1.1 mrg while (NONJUMP_INSN_P (insn)
9087 1.1 mrg && get_attr_empty (insn) == EMPTY_YES);
9088 1.1 mrg if (CALL_P (insn))
9089 1.1 mrg note = find_reg_note (insn, REG_EH_REGION, NULL_RTX);
9090 1.1 mrg else if (note)
9091 1.1 mrg {
9092 1.1 mrg int code;
9093 1.1 mrg
9094 1.1 mrg gcc_assert ((code = recog_memoized (insn)) == CODE_FOR_nop
9095 1.1 mrg || code == CODE_FOR_nop_b);
9096 1.1 mrg if (find_reg_note (insn, REG_EH_REGION, NULL_RTX))
9097 1.1 mrg note = NULL_RTX;
9098 1.1 mrg else
9099 1.1 mrg add_reg_note (insn, REG_EH_REGION, XEXP (note, 0));
9100 1.1 mrg }
9101 1.1 mrg }
9102 1.1 mrg }
9103 1.1 mrg #endif
9104 1.1 mrg }
9105 1.1 mrg
9106 1.1 mrg /* The following function does insn bundling. Bundling means
9107 1.1 mrg inserting templates and nop insns to fit insn groups into permitted
9108 1.1 mrg templates. Instruction scheduling uses NDFA (non-deterministic
9109 1.1 mrg finite automata) encoding informations about the templates and the
9110 1.1 mrg inserted nops. Nondeterminism of the automata permits follows
9111 1.1 mrg all possible insn sequences very fast.
9112 1.1 mrg
9113 1.1 mrg Unfortunately it is not possible to get information about inserting
9114 1.1 mrg nop insns and used templates from the automata states. The
9115 1.1 mrg automata only says that we can issue an insn possibly inserting
9116 1.1 mrg some nops before it and using some template. Therefore insn
9117 1.1 mrg bundling in this function is implemented by using DFA
9118 1.1 mrg (deterministic finite automata). We follow all possible insn
9119 1.1 mrg sequences by inserting 0-2 nops (that is what the NDFA describe for
9120 1.1 mrg insn scheduling) before/after each insn being bundled. We know the
9121 1.1 mrg start of simulated processor cycle from insn scheduling (insn
9122 1.1 mrg starting a new cycle has TImode).
9123 1.1 mrg
9124 1.1 mrg Simple implementation of insn bundling would create enormous
9125 1.1 mrg number of possible insn sequences satisfying information about new
9126 1.1 mrg cycle ticks taken from the insn scheduling. To make the algorithm
9127 1.1 mrg practical we use dynamic programming. Each decision (about
9128 1.1 mrg inserting nops and implicitly about previous decisions) is described
9129 1.1 mrg by structure bundle_state (see above). If we generate the same
9130 1.1 mrg bundle state (key is automaton state after issuing the insns and
9131 1.1 mrg nops for it), we reuse already generated one. As consequence we
9132 1.1 mrg reject some decisions which cannot improve the solution and
9133 1.1 mrg reduce memory for the algorithm.
9134 1.1 mrg
9135 1.1 mrg When we reach the end of EBB (extended basic block), we choose the
9136 1.1 mrg best sequence and then, moving back in EBB, insert templates for
9137 1.1 mrg the best alternative. The templates are taken from querying
9138 1.1 mrg automaton state for each insn in chosen bundle states.
9139 1.1 mrg
9140 1.1 mrg So the algorithm makes two (forward and backward) passes through
9141 1.1 mrg EBB. */
9142 1.1 mrg
9143 1.1 mrg static void
9144 1.1 mrg bundling (FILE *dump, int verbose, rtx_insn *prev_head_insn, rtx_insn *tail)
9145 1.1 mrg {
9146 1.1 mrg struct bundle_state *curr_state, *next_state, *best_state;
9147 1.1 mrg rtx_insn *insn, *next_insn;
9148 1.1 mrg int insn_num;
9149 1.1 mrg int i, bundle_end_p, only_bundle_end_p, asm_p;
9150 1.1 mrg int pos = 0, max_pos, template0, template1;
9151 1.1 mrg rtx_insn *b;
9152 1.1 mrg enum attr_type type;
9153 1.1 mrg
9154 1.1 mrg insn_num = 0;
9155 1.1 mrg /* Count insns in the EBB. */
9156 1.1 mrg for (insn = NEXT_INSN (prev_head_insn);
9157 1.1 mrg insn && insn != tail;
9158 1.1 mrg insn = NEXT_INSN (insn))
9159 1.1 mrg if (INSN_P (insn))
9160 1.1 mrg insn_num++;
9161 1.1 mrg if (insn_num == 0)
9162 1.1 mrg return;
9163 1.1 mrg bundling_p = 1;
9164 1.1 mrg dfa_clean_insn_cache ();
9165 1.1 mrg initiate_bundle_state_table ();
9166 1.1 mrg index_to_bundle_states = XNEWVEC (struct bundle_state *, insn_num + 2);
9167 1.1 mrg /* First (forward) pass -- generation of bundle states. */
9168 1.1 mrg curr_state = get_free_bundle_state ();
9169 1.1 mrg curr_state->insn = NULL;
9170 1.1 mrg curr_state->before_nops_num = 0;
9171 1.1 mrg curr_state->after_nops_num = 0;
9172 1.1 mrg curr_state->insn_num = 0;
9173 1.1 mrg curr_state->cost = 0;
9174 1.1 mrg curr_state->accumulated_insns_num = 0;
9175 1.1 mrg curr_state->branch_deviation = 0;
9176 1.1 mrg curr_state->middle_bundle_stops = 0;
9177 1.1 mrg curr_state->next = NULL;
9178 1.1 mrg curr_state->originator = NULL;
9179 1.1 mrg state_reset (curr_state->dfa_state);
9180 1.1 mrg index_to_bundle_states [0] = curr_state;
9181 1.1 mrg insn_num = 0;
9182 1.1 mrg /* Shift cycle mark if it is put on insn which could be ignored. */
9183 1.1 mrg for (insn = NEXT_INSN (prev_head_insn);
9184 1.1 mrg insn != tail;
9185 1.1 mrg insn = NEXT_INSN (insn))
9186 1.1 mrg if (INSN_P (insn)
9187 1.1 mrg && !important_for_bundling_p (insn)
9188 1.1 mrg && GET_MODE (insn) == TImode)
9189 1.1 mrg {
9190 1.1 mrg PUT_MODE (insn, VOIDmode);
9191 1.1 mrg for (next_insn = NEXT_INSN (insn);
9192 1.1 mrg next_insn != tail;
9193 1.1 mrg next_insn = NEXT_INSN (next_insn))
9194 1.1 mrg if (important_for_bundling_p (next_insn)
9195 1.1 mrg && INSN_CODE (next_insn) != CODE_FOR_insn_group_barrier)
9196 1.1 mrg {
9197 1.1 mrg PUT_MODE (next_insn, TImode);
9198 1.1 mrg break;
9199 1.1 mrg }
9200 1.1 mrg }
9201 1.1 mrg /* Forward pass: generation of bundle states. */
9202 1.1 mrg for (insn = get_next_important_insn (NEXT_INSN (prev_head_insn), tail);
9203 1.1 mrg insn != NULL_RTX;
9204 1.1 mrg insn = next_insn)
9205 1.1 mrg {
9206 1.1 mrg gcc_assert (important_for_bundling_p (insn));
9207 1.1 mrg type = ia64_safe_type (insn);
9208 1.1 mrg next_insn = get_next_important_insn (NEXT_INSN (insn), tail);
9209 1.1 mrg insn_num++;
9210 1.1 mrg index_to_bundle_states [insn_num] = NULL;
9211 1.1 mrg for (curr_state = index_to_bundle_states [insn_num - 1];
9212 1.1 mrg curr_state != NULL;
9213 1.1 mrg curr_state = next_state)
9214 1.1 mrg {
9215 1.1 mrg pos = curr_state->accumulated_insns_num % 3;
9216 1.1 mrg next_state = curr_state->next;
9217 1.1 mrg /* We must fill up the current bundle in order to start a
9218 1.1 mrg subsequent asm insn in a new bundle. Asm insn is always
9219 1.1 mrg placed in a separate bundle. */
9220 1.1 mrg only_bundle_end_p
9221 1.1 mrg = (next_insn != NULL_RTX
9222 1.1 mrg && INSN_CODE (insn) == CODE_FOR_insn_group_barrier
9223 1.1 mrg && unknown_for_bundling_p (next_insn));
9224 1.1 mrg /* We may fill up the current bundle if it is the cycle end
9225 1.1 mrg without a group barrier. */
9226 1.1 mrg bundle_end_p
9227 1.1 mrg = (only_bundle_end_p || next_insn == NULL_RTX
9228 1.1 mrg || (GET_MODE (next_insn) == TImode
9229 1.1 mrg && INSN_CODE (insn) != CODE_FOR_insn_group_barrier));
9230 1.1 mrg if (type == TYPE_F || type == TYPE_B || type == TYPE_L
9231 1.1 mrg || type == TYPE_S)
9232 1.1 mrg issue_nops_and_insn (curr_state, 2, insn, bundle_end_p,
9233 1.1 mrg only_bundle_end_p);
9234 1.1 mrg issue_nops_and_insn (curr_state, 1, insn, bundle_end_p,
9235 1.1 mrg only_bundle_end_p);
9236 1.1 mrg issue_nops_and_insn (curr_state, 0, insn, bundle_end_p,
9237 1.1 mrg only_bundle_end_p);
9238 1.1 mrg }
9239 1.1 mrg gcc_assert (index_to_bundle_states [insn_num]);
9240 1.1 mrg for (curr_state = index_to_bundle_states [insn_num];
9241 1.1 mrg curr_state != NULL;
9242 1.1 mrg curr_state = curr_state->next)
9243 1.1 mrg if (verbose >= 2 && dump)
9244 1.1 mrg {
9245 1.1 mrg /* This structure is taken from generated code of the
9246 1.1 mrg pipeline hazard recognizer (see file insn-attrtab.cc).
9247 1.1 mrg Please don't forget to change the structure if a new
9248 1.1 mrg automaton is added to .md file. */
9249 1.1 mrg struct DFA_chip
9250 1.1 mrg {
9251 1.1 mrg unsigned short one_automaton_state;
9252 1.1 mrg unsigned short oneb_automaton_state;
9253 1.1 mrg unsigned short two_automaton_state;
9254 1.1 mrg unsigned short twob_automaton_state;
9255 1.1 mrg };
9256 1.1 mrg
9257 1.1 mrg fprintf
9258 1.1 mrg (dump,
9259 1.1 mrg "// Bundle state %d (orig %d, cost %d, nops %d/%d, insns %d, branch %d, mid.stops %d state %d) for %d\n",
9260 1.1 mrg curr_state->unique_num,
9261 1.1 mrg (curr_state->originator == NULL
9262 1.1 mrg ? -1 : curr_state->originator->unique_num),
9263 1.1 mrg curr_state->cost,
9264 1.1 mrg curr_state->before_nops_num, curr_state->after_nops_num,
9265 1.1 mrg curr_state->accumulated_insns_num, curr_state->branch_deviation,
9266 1.1 mrg curr_state->middle_bundle_stops,
9267 1.1 mrg ((struct DFA_chip *) curr_state->dfa_state)->twob_automaton_state,
9268 1.1 mrg INSN_UID (insn));
9269 1.1 mrg }
9270 1.1 mrg }
9271 1.1 mrg
9272 1.1 mrg /* We should find a solution because the 2nd insn scheduling has
9273 1.1 mrg found one. */
9274 1.1 mrg gcc_assert (index_to_bundle_states [insn_num]);
9275 1.1 mrg /* Find a state corresponding to the best insn sequence. */
9276 1.1 mrg best_state = NULL;
9277 1.1 mrg for (curr_state = index_to_bundle_states [insn_num];
9278 1.1 mrg curr_state != NULL;
9279 1.1 mrg curr_state = curr_state->next)
9280 1.1 mrg /* We are just looking at the states with fully filled up last
9281 1.1 mrg bundle. The first we prefer insn sequences with minimal cost
9282 1.1 mrg then with minimal inserted nops and finally with branch insns
9283 1.1 mrg placed in the 3rd slots. */
9284 1.1 mrg if (curr_state->accumulated_insns_num % 3 == 0
9285 1.1 mrg && (best_state == NULL || best_state->cost > curr_state->cost
9286 1.1 mrg || (best_state->cost == curr_state->cost
9287 1.1 mrg && (curr_state->accumulated_insns_num
9288 1.1 mrg < best_state->accumulated_insns_num
9289 1.1 mrg || (curr_state->accumulated_insns_num
9290 1.1 mrg == best_state->accumulated_insns_num
9291 1.1 mrg && (curr_state->branch_deviation
9292 1.1 mrg < best_state->branch_deviation
9293 1.1 mrg || (curr_state->branch_deviation
9294 1.1 mrg == best_state->branch_deviation
9295 1.1 mrg && curr_state->middle_bundle_stops
9296 1.1 mrg < best_state->middle_bundle_stops)))))))
9297 1.1 mrg best_state = curr_state;
9298 1.1 mrg /* Second (backward) pass: adding nops and templates. */
9299 1.1 mrg gcc_assert (best_state);
9300 1.1 mrg insn_num = best_state->before_nops_num;
9301 1.1 mrg template0 = template1 = -1;
9302 1.1 mrg for (curr_state = best_state;
9303 1.1 mrg curr_state->originator != NULL;
9304 1.1 mrg curr_state = curr_state->originator)
9305 1.1 mrg {
9306 1.1 mrg insn = curr_state->insn;
9307 1.1 mrg asm_p = unknown_for_bundling_p (insn);
9308 1.1 mrg insn_num++;
9309 1.1 mrg if (verbose >= 2 && dump)
9310 1.1 mrg {
9311 1.1 mrg struct DFA_chip
9312 1.1 mrg {
9313 1.1 mrg unsigned short one_automaton_state;
9314 1.1 mrg unsigned short oneb_automaton_state;
9315 1.1 mrg unsigned short two_automaton_state;
9316 1.1 mrg unsigned short twob_automaton_state;
9317 1.1 mrg };
9318 1.1 mrg
9319 1.1 mrg fprintf
9320 1.1 mrg (dump,
9321 1.1 mrg "// Best %d (orig %d, cost %d, nops %d/%d, insns %d, branch %d, mid.stops %d, state %d) for %d\n",
9322 1.1 mrg curr_state->unique_num,
9323 1.1 mrg (curr_state->originator == NULL
9324 1.1 mrg ? -1 : curr_state->originator->unique_num),
9325 1.1 mrg curr_state->cost,
9326 1.1 mrg curr_state->before_nops_num, curr_state->after_nops_num,
9327 1.1 mrg curr_state->accumulated_insns_num, curr_state->branch_deviation,
9328 1.1 mrg curr_state->middle_bundle_stops,
9329 1.1 mrg ((struct DFA_chip *) curr_state->dfa_state)->twob_automaton_state,
9330 1.1 mrg INSN_UID (insn));
9331 1.1 mrg }
9332 1.1 mrg /* Find the position in the current bundle window. The window can
9333 1.1 mrg contain at most two bundles. Two bundle window means that
9334 1.1 mrg the processor will make two bundle rotation. */
9335 1.1 mrg max_pos = get_max_pos (curr_state->dfa_state);
9336 1.1 mrg if (max_pos == 6
9337 1.1 mrg /* The following (negative template number) means that the
9338 1.1 mrg processor did one bundle rotation. */
9339 1.1 mrg || (max_pos == 3 && template0 < 0))
9340 1.1 mrg {
9341 1.1 mrg /* We are at the end of the window -- find template(s) for
9342 1.1 mrg its bundle(s). */
9343 1.1 mrg pos = max_pos;
9344 1.1 mrg if (max_pos == 3)
9345 1.1 mrg template0 = get_template (curr_state->dfa_state, 3);
9346 1.1 mrg else
9347 1.1 mrg {
9348 1.1 mrg template1 = get_template (curr_state->dfa_state, 3);
9349 1.1 mrg template0 = get_template (curr_state->dfa_state, 6);
9350 1.1 mrg }
9351 1.1 mrg }
9352 1.1 mrg if (max_pos > 3 && template1 < 0)
9353 1.1 mrg /* It may happen when we have the stop inside a bundle. */
9354 1.1 mrg {
9355 1.1 mrg gcc_assert (pos <= 3);
9356 1.1 mrg template1 = get_template (curr_state->dfa_state, 3);
9357 1.1 mrg pos += 3;
9358 1.1 mrg }
9359 1.1 mrg if (!asm_p)
9360 1.1 mrg /* Emit nops after the current insn. */
9361 1.1 mrg for (i = 0; i < curr_state->after_nops_num; i++)
9362 1.1 mrg {
9363 1.1 mrg rtx nop_pat = gen_nop ();
9364 1.1 mrg rtx_insn *nop = emit_insn_after (nop_pat, insn);
9365 1.1 mrg pos--;
9366 1.1 mrg gcc_assert (pos >= 0);
9367 1.1 mrg if (pos % 3 == 0)
9368 1.1 mrg {
9369 1.1 mrg /* We are at the start of a bundle: emit the template
9370 1.1 mrg (it should be defined). */
9371 1.1 mrg gcc_assert (template0 >= 0);
9372 1.1 mrg ia64_add_bundle_selector_before (template0, nop);
9373 1.1 mrg /* If we have two bundle window, we make one bundle
9374 1.1 mrg rotation. Otherwise template0 will be undefined
9375 1.1 mrg (negative value). */
9376 1.1 mrg template0 = template1;
9377 1.1 mrg template1 = -1;
9378 1.1 mrg }
9379 1.1 mrg }
9380 1.1 mrg /* Move the position backward in the window. Group barrier has
9381 1.1 mrg no slot. Asm insn takes all bundle. */
9382 1.1 mrg if (INSN_CODE (insn) != CODE_FOR_insn_group_barrier
9383 1.1 mrg && !unknown_for_bundling_p (insn))
9384 1.1 mrg pos--;
9385 1.1 mrg /* Long insn takes 2 slots. */
9386 1.1 mrg if (ia64_safe_type (insn) == TYPE_L)
9387 1.1 mrg pos--;
9388 1.1 mrg gcc_assert (pos >= 0);
9389 1.1 mrg if (pos % 3 == 0
9390 1.1 mrg && INSN_CODE (insn) != CODE_FOR_insn_group_barrier
9391 1.1 mrg && !unknown_for_bundling_p (insn))
9392 1.1 mrg {
9393 1.1 mrg /* The current insn is at the bundle start: emit the
9394 1.1 mrg template. */
9395 1.1 mrg gcc_assert (template0 >= 0);
9396 1.1 mrg ia64_add_bundle_selector_before (template0, insn);
9397 1.1 mrg b = PREV_INSN (insn);
9398 1.1 mrg insn = b;
9399 1.1 mrg /* See comment above in analogous place for emitting nops
9400 1.1 mrg after the insn. */
9401 1.1 mrg template0 = template1;
9402 1.1 mrg template1 = -1;
9403 1.1 mrg }
9404 1.1 mrg /* Emit nops after the current insn. */
9405 1.1 mrg for (i = 0; i < curr_state->before_nops_num; i++)
9406 1.1 mrg {
9407 1.1 mrg rtx nop_pat = gen_nop ();
9408 1.1 mrg ia64_emit_insn_before (nop_pat, insn);
9409 1.1 mrg rtx_insn *nop = PREV_INSN (insn);
9410 1.1 mrg insn = nop;
9411 1.1 mrg pos--;
9412 1.1 mrg gcc_assert (pos >= 0);
9413 1.1 mrg if (pos % 3 == 0)
9414 1.1 mrg {
9415 1.1 mrg /* See comment above in analogous place for emitting nops
9416 1.1 mrg after the insn. */
9417 1.1 mrg gcc_assert (template0 >= 0);
9418 1.1 mrg ia64_add_bundle_selector_before (template0, insn);
9419 1.1 mrg b = PREV_INSN (insn);
9420 1.1 mrg insn = b;
9421 1.1 mrg template0 = template1;
9422 1.1 mrg template1 = -1;
9423 1.1 mrg }
9424 1.1 mrg }
9425 1.1 mrg }
9426 1.1 mrg
9427 1.1 mrg if (flag_checking)
9428 1.1 mrg {
9429 1.1 mrg /* Assert right calculation of middle_bundle_stops. */
9430 1.1 mrg int num = best_state->middle_bundle_stops;
9431 1.1 mrg bool start_bundle = true, end_bundle = false;
9432 1.1 mrg
9433 1.1 mrg for (insn = NEXT_INSN (prev_head_insn);
9434 1.1 mrg insn && insn != tail;
9435 1.1 mrg insn = NEXT_INSN (insn))
9436 1.1 mrg {
9437 1.1 mrg if (!INSN_P (insn))
9438 1.1 mrg continue;
9439 1.1 mrg if (recog_memoized (insn) == CODE_FOR_bundle_selector)
9440 1.1 mrg start_bundle = true;
9441 1.1 mrg else
9442 1.1 mrg {
9443 1.1 mrg rtx_insn *next_insn;
9444 1.1 mrg
9445 1.1 mrg for (next_insn = NEXT_INSN (insn);
9446 1.1 mrg next_insn && next_insn != tail;
9447 1.1 mrg next_insn = NEXT_INSN (next_insn))
9448 1.1 mrg if (INSN_P (next_insn)
9449 1.1 mrg && (ia64_safe_itanium_class (next_insn)
9450 1.1 mrg != ITANIUM_CLASS_IGNORE
9451 1.1 mrg || recog_memoized (next_insn)
9452 1.1 mrg == CODE_FOR_bundle_selector)
9453 1.1 mrg && GET_CODE (PATTERN (next_insn)) != USE
9454 1.1 mrg && GET_CODE (PATTERN (next_insn)) != CLOBBER)
9455 1.1 mrg break;
9456 1.1 mrg
9457 1.1 mrg end_bundle = next_insn == NULL_RTX
9458 1.1 mrg || next_insn == tail
9459 1.1 mrg || (INSN_P (next_insn)
9460 1.1 mrg && recog_memoized (next_insn) == CODE_FOR_bundle_selector);
9461 1.1 mrg if (recog_memoized (insn) == CODE_FOR_insn_group_barrier
9462 1.1 mrg && !start_bundle && !end_bundle
9463 1.1 mrg && next_insn
9464 1.1 mrg && !unknown_for_bundling_p (next_insn))
9465 1.1 mrg num--;
9466 1.1 mrg
9467 1.1 mrg start_bundle = false;
9468 1.1 mrg }
9469 1.1 mrg }
9470 1.1 mrg
9471 1.1 mrg gcc_assert (num == 0);
9472 1.1 mrg }
9473 1.1 mrg
9474 1.1 mrg free (index_to_bundle_states);
9475 1.1 mrg finish_bundle_state_table ();
9476 1.1 mrg bundling_p = 0;
9477 1.1 mrg dfa_clean_insn_cache ();
9478 1.1 mrg }
9479 1.1 mrg
9480 1.1 mrg /* The following function is called at the end of scheduling BB or
9481 1.1 mrg EBB. After reload, it inserts stop bits and does insn bundling. */
9482 1.1 mrg
9483 1.1 mrg static void
9484 1.1 mrg ia64_sched_finish (FILE *dump, int sched_verbose)
9485 1.1 mrg {
9486 1.1 mrg if (sched_verbose)
9487 1.1 mrg fprintf (dump, "// Finishing schedule.\n");
9488 1.1 mrg if (!reload_completed)
9489 1.1 mrg return;
9490 1.1 mrg if (reload_completed)
9491 1.1 mrg {
9492 1.1 mrg final_emit_insn_group_barriers (dump);
9493 1.1 mrg bundling (dump, sched_verbose, current_sched_info->prev_head,
9494 1.1 mrg current_sched_info->next_tail);
9495 1.1 mrg if (sched_verbose && dump)
9496 1.1 mrg fprintf (dump, "// finishing %d-%d\n",
9497 1.1 mrg INSN_UID (NEXT_INSN (current_sched_info->prev_head)),
9498 1.1 mrg INSN_UID (PREV_INSN (current_sched_info->next_tail)));
9499 1.1 mrg
9500 1.1 mrg return;
9501 1.1 mrg }
9502 1.1 mrg }
9503 1.1 mrg
9504 1.1 mrg /* The following function inserts stop bits in scheduled BB or EBB. */
9505 1.1 mrg
9506 1.1 mrg static void
9507 1.1 mrg final_emit_insn_group_barriers (FILE *dump ATTRIBUTE_UNUSED)
9508 1.1 mrg {
9509 1.1 mrg rtx_insn *insn;
9510 1.1 mrg int need_barrier_p = 0;
9511 1.1 mrg int seen_good_insn = 0;
9512 1.1 mrg
9513 1.1 mrg init_insn_group_barriers ();
9514 1.1 mrg
9515 1.1 mrg for (insn = NEXT_INSN (current_sched_info->prev_head);
9516 1.1 mrg insn != current_sched_info->next_tail;
9517 1.1 mrg insn = NEXT_INSN (insn))
9518 1.1 mrg {
9519 1.1 mrg if (BARRIER_P (insn))
9520 1.1 mrg {
9521 1.1 mrg rtx_insn *last = prev_active_insn (insn);
9522 1.1 mrg
9523 1.1 mrg if (! last)
9524 1.1 mrg continue;
9525 1.1 mrg if (JUMP_TABLE_DATA_P (last))
9526 1.1 mrg last = prev_active_insn (last);
9527 1.1 mrg if (recog_memoized (last) != CODE_FOR_insn_group_barrier)
9528 1.1 mrg emit_insn_after (gen_insn_group_barrier (GEN_INT (3)), last);
9529 1.1 mrg
9530 1.1 mrg init_insn_group_barriers ();
9531 1.1 mrg seen_good_insn = 0;
9532 1.1 mrg need_barrier_p = 0;
9533 1.1 mrg }
9534 1.1 mrg else if (NONDEBUG_INSN_P (insn))
9535 1.1 mrg {
9536 1.1 mrg if (recog_memoized (insn) == CODE_FOR_insn_group_barrier)
9537 1.1 mrg {
9538 1.1 mrg init_insn_group_barriers ();
9539 1.1 mrg seen_good_insn = 0;
9540 1.1 mrg need_barrier_p = 0;
9541 1.1 mrg }
9542 1.1 mrg else if (need_barrier_p || group_barrier_needed (insn)
9543 1.1 mrg || (mflag_sched_stop_bits_after_every_cycle
9544 1.1 mrg && GET_MODE (insn) == TImode
9545 1.1 mrg && seen_good_insn))
9546 1.1 mrg {
9547 1.1 mrg if (TARGET_EARLY_STOP_BITS)
9548 1.1 mrg {
9549 1.1 mrg rtx_insn *last;
9550 1.1 mrg
9551 1.1 mrg for (last = insn;
9552 1.1 mrg last != current_sched_info->prev_head;
9553 1.1 mrg last = PREV_INSN (last))
9554 1.1 mrg if (INSN_P (last) && GET_MODE (last) == TImode
9555 1.1 mrg && stops_p [INSN_UID (last)])
9556 1.1 mrg break;
9557 1.1 mrg if (last == current_sched_info->prev_head)
9558 1.1 mrg last = insn;
9559 1.1 mrg last = prev_active_insn (last);
9560 1.1 mrg if (last
9561 1.1 mrg && recog_memoized (last) != CODE_FOR_insn_group_barrier)
9562 1.1 mrg emit_insn_after (gen_insn_group_barrier (GEN_INT (3)),
9563 1.1 mrg last);
9564 1.1 mrg init_insn_group_barriers ();
9565 1.1 mrg for (last = NEXT_INSN (last);
9566 1.1 mrg last != insn;
9567 1.1 mrg last = NEXT_INSN (last))
9568 1.1 mrg if (INSN_P (last))
9569 1.1 mrg {
9570 1.1 mrg group_barrier_needed (last);
9571 1.1 mrg if (recog_memoized (last) >= 0
9572 1.1 mrg && important_for_bundling_p (last))
9573 1.1 mrg seen_good_insn = 1;
9574 1.1 mrg }
9575 1.1 mrg }
9576 1.1 mrg else
9577 1.1 mrg {
9578 1.1 mrg emit_insn_before (gen_insn_group_barrier (GEN_INT (3)),
9579 1.1 mrg insn);
9580 1.1 mrg init_insn_group_barriers ();
9581 1.1 mrg seen_good_insn = 0;
9582 1.1 mrg }
9583 1.1 mrg group_barrier_needed (insn);
9584 1.1 mrg if (recog_memoized (insn) >= 0
9585 1.1 mrg && important_for_bundling_p (insn))
9586 1.1 mrg seen_good_insn = 1;
9587 1.1 mrg }
9588 1.1 mrg else if (recog_memoized (insn) >= 0
9589 1.1 mrg && important_for_bundling_p (insn))
9590 1.1 mrg seen_good_insn = 1;
9591 1.1 mrg need_barrier_p = (CALL_P (insn) || unknown_for_bundling_p (insn));
9592 1.1 mrg }
9593 1.1 mrg }
9594 1.1 mrg }
9595 1.1 mrg
9596 1.1 mrg
9597 1.1 mrg
9599 1.1 mrg /* If the following function returns TRUE, we will use the DFA
9600 1.1 mrg insn scheduler. */
9601 1.1 mrg
9602 1.1 mrg static int
9603 1.1 mrg ia64_first_cycle_multipass_dfa_lookahead (void)
9604 1.1 mrg {
9605 1.1 mrg return (reload_completed ? 6 : 4);
9606 1.1 mrg }
9607 1.1 mrg
9608 1.1 mrg /* The following function initiates variable `dfa_pre_cycle_insn'. */
9609 1.1 mrg
9610 1.1 mrg static void
9611 1.1 mrg ia64_init_dfa_pre_cycle_insn (void)
9612 1.1 mrg {
9613 1.1 mrg if (temp_dfa_state == NULL)
9614 1.1 mrg {
9615 1.1 mrg dfa_state_size = state_size ();
9616 1.1 mrg temp_dfa_state = xmalloc (dfa_state_size);
9617 1.1 mrg prev_cycle_state = xmalloc (dfa_state_size);
9618 1.1 mrg }
9619 1.1 mrg dfa_pre_cycle_insn = make_insn_raw (gen_pre_cycle ());
9620 1.1 mrg SET_PREV_INSN (dfa_pre_cycle_insn) = SET_NEXT_INSN (dfa_pre_cycle_insn) = NULL_RTX;
9621 1.1 mrg recog_memoized (dfa_pre_cycle_insn);
9622 1.1 mrg dfa_stop_insn = make_insn_raw (gen_insn_group_barrier (GEN_INT (3)));
9623 1.1 mrg SET_PREV_INSN (dfa_stop_insn) = SET_NEXT_INSN (dfa_stop_insn) = NULL_RTX;
9624 1.1 mrg recog_memoized (dfa_stop_insn);
9625 1.1 mrg }
9626 1.1 mrg
9627 1.1 mrg /* The following function returns the pseudo insn DFA_PRE_CYCLE_INSN
9628 1.1 mrg used by the DFA insn scheduler. */
9629 1.1 mrg
9630 1.1 mrg static rtx
9631 1.1 mrg ia64_dfa_pre_cycle_insn (void)
9632 1.1 mrg {
9633 1.1 mrg return dfa_pre_cycle_insn;
9634 1.1 mrg }
9635 1.1 mrg
9636 1.1 mrg /* The following function returns TRUE if PRODUCER (of type ilog or
9637 1.1 mrg ld) produces address for CONSUMER (of type st or stf). */
9638 1.1 mrg
9639 1.1 mrg int
9640 1.1 mrg ia64_st_address_bypass_p (rtx_insn *producer, rtx_insn *consumer)
9641 1.1 mrg {
9642 1.1 mrg rtx dest, reg, mem;
9643 1.1 mrg
9644 1.1 mrg gcc_assert (producer && consumer);
9645 1.1 mrg dest = ia64_single_set (producer);
9646 1.1 mrg gcc_assert (dest);
9647 1.1 mrg reg = SET_DEST (dest);
9648 1.1 mrg gcc_assert (reg);
9649 1.1 mrg if (GET_CODE (reg) == SUBREG)
9650 1.1 mrg reg = SUBREG_REG (reg);
9651 1.1 mrg gcc_assert (GET_CODE (reg) == REG);
9652 1.1 mrg
9653 1.1 mrg dest = ia64_single_set (consumer);
9654 1.1 mrg gcc_assert (dest);
9655 1.1 mrg mem = SET_DEST (dest);
9656 1.1 mrg gcc_assert (mem && GET_CODE (mem) == MEM);
9657 1.1 mrg return reg_mentioned_p (reg, mem);
9658 1.1 mrg }
9659 1.1 mrg
9660 1.1 mrg /* The following function returns TRUE if PRODUCER (of type ilog or
9661 1.1 mrg ld) produces address for CONSUMER (of type ld or fld). */
9662 1.1 mrg
9663 1.1 mrg int
9664 1.1 mrg ia64_ld_address_bypass_p (rtx_insn *producer, rtx_insn *consumer)
9665 1.1 mrg {
9666 1.1 mrg rtx dest, src, reg, mem;
9667 1.1 mrg
9668 1.1 mrg gcc_assert (producer && consumer);
9669 1.1 mrg dest = ia64_single_set (producer);
9670 1.1 mrg gcc_assert (dest);
9671 1.1 mrg reg = SET_DEST (dest);
9672 1.1 mrg gcc_assert (reg);
9673 1.1 mrg if (GET_CODE (reg) == SUBREG)
9674 1.1 mrg reg = SUBREG_REG (reg);
9675 1.1 mrg gcc_assert (GET_CODE (reg) == REG);
9676 1.1 mrg
9677 1.1 mrg src = ia64_single_set (consumer);
9678 1.1 mrg gcc_assert (src);
9679 1.1 mrg mem = SET_SRC (src);
9680 1.1 mrg gcc_assert (mem);
9681 1.1 mrg
9682 1.1 mrg if (GET_CODE (mem) == UNSPEC && XVECLEN (mem, 0) > 0)
9683 1.1 mrg mem = XVECEXP (mem, 0, 0);
9684 1.1 mrg else if (GET_CODE (mem) == IF_THEN_ELSE)
9685 1.1 mrg /* ??? Is this bypass necessary for ld.c? */
9686 1.1 mrg {
9687 1.1 mrg gcc_assert (XINT (XEXP (XEXP (mem, 0), 0), 1) == UNSPEC_LDCCLR);
9688 1.1 mrg mem = XEXP (mem, 1);
9689 1.1 mrg }
9690 1.1 mrg
9691 1.1 mrg while (GET_CODE (mem) == SUBREG || GET_CODE (mem) == ZERO_EXTEND)
9692 1.1 mrg mem = XEXP (mem, 0);
9693 1.1 mrg
9694 1.1 mrg if (GET_CODE (mem) == UNSPEC)
9695 1.1 mrg {
9696 1.1 mrg int c = XINT (mem, 1);
9697 1.1 mrg
9698 1.1 mrg gcc_assert (c == UNSPEC_LDA || c == UNSPEC_LDS || c == UNSPEC_LDS_A
9699 1.1 mrg || c == UNSPEC_LDSA);
9700 1.1 mrg mem = XVECEXP (mem, 0, 0);
9701 1.1 mrg }
9702 1.1 mrg
9703 1.1 mrg /* Note that LO_SUM is used for GOT loads. */
9704 1.1 mrg gcc_assert (GET_CODE (mem) == LO_SUM || GET_CODE (mem) == MEM);
9705 1.1 mrg
9706 1.1 mrg return reg_mentioned_p (reg, mem);
9707 1.1 mrg }
9708 1.1 mrg
9709 1.1 mrg /* The following function returns TRUE if INSN produces address for a
9710 1.1 mrg load/store insn. We will place such insns into M slot because it
9711 1.1 mrg decreases its latency time. */
9712 1.1 mrg
9713 1.1 mrg int
9714 1.1 mrg ia64_produce_address_p (rtx insn)
9715 1.1 mrg {
9716 1.1 mrg return insn->call;
9717 1.1 mrg }
9718 1.1 mrg
9719 1.1 mrg
9720 1.1 mrg /* Emit pseudo-ops for the assembler to describe predicate relations.
9722 1.1 mrg At present this assumes that we only consider predicate pairs to
9723 1.1 mrg be mutex, and that the assembler can deduce proper values from
9724 1.1 mrg straight-line code. */
9725 1.1 mrg
9726 1.1 mrg static void
9727 1.1 mrg emit_predicate_relation_info (void)
9728 1.1 mrg {
9729 1.1 mrg basic_block bb;
9730 1.1 mrg
9731 1.1 mrg FOR_EACH_BB_REVERSE_FN (bb, cfun)
9732 1.1 mrg {
9733 1.1 mrg int r;
9734 1.1 mrg rtx_insn *head = BB_HEAD (bb);
9735 1.1 mrg
9736 1.1 mrg /* We only need such notes at code labels. */
9737 1.1 mrg if (! LABEL_P (head))
9738 1.1 mrg continue;
9739 1.1 mrg if (NOTE_INSN_BASIC_BLOCK_P (NEXT_INSN (head)))
9740 1.1 mrg head = NEXT_INSN (head);
9741 1.1 mrg
9742 1.1 mrg /* Skip p0, which may be thought to be live due to (reg:DI p0)
9743 1.1 mrg grabbing the entire block of predicate registers. */
9744 1.1 mrg for (r = PR_REG (2); r < PR_REG (64); r += 2)
9745 1.1 mrg if (REGNO_REG_SET_P (df_get_live_in (bb), r))
9746 1.1 mrg {
9747 1.1 mrg rtx p = gen_rtx_REG (BImode, r);
9748 1.1 mrg rtx_insn *n = emit_insn_after (gen_pred_rel_mutex (p), head);
9749 1.1 mrg if (head == BB_END (bb))
9750 1.1 mrg BB_END (bb) = n;
9751 1.1 mrg head = n;
9752 1.1 mrg }
9753 1.1 mrg }
9754 1.1 mrg
9755 1.1 mrg /* Look for conditional calls that do not return, and protect predicate
9756 1.1 mrg relations around them. Otherwise the assembler will assume the call
9757 1.1 mrg returns, and complain about uses of call-clobbered predicates after
9758 1.1 mrg the call. */
9759 1.1 mrg FOR_EACH_BB_REVERSE_FN (bb, cfun)
9760 1.1 mrg {
9761 1.1 mrg rtx_insn *insn = BB_HEAD (bb);
9762 1.1 mrg
9763 1.1 mrg while (1)
9764 1.1 mrg {
9765 1.1 mrg if (CALL_P (insn)
9766 1.1 mrg && GET_CODE (PATTERN (insn)) == COND_EXEC
9767 1.1 mrg && find_reg_note (insn, REG_NORETURN, NULL_RTX))
9768 1.1 mrg {
9769 1.1 mrg rtx_insn *b =
9770 1.1 mrg emit_insn_before (gen_safe_across_calls_all (), insn);
9771 1.1 mrg rtx_insn *a = emit_insn_after (gen_safe_across_calls_normal (), insn);
9772 1.1 mrg if (BB_HEAD (bb) == insn)
9773 1.1 mrg BB_HEAD (bb) = b;
9774 1.1 mrg if (BB_END (bb) == insn)
9775 1.1 mrg BB_END (bb) = a;
9776 1.1 mrg }
9777 1.1 mrg
9778 1.1 mrg if (insn == BB_END (bb))
9779 1.1 mrg break;
9780 1.1 mrg insn = NEXT_INSN (insn);
9781 1.1 mrg }
9782 1.1 mrg }
9783 1.1 mrg }
9784 1.1 mrg
9785 1.1 mrg /* Perform machine dependent operations on the rtl chain INSNS. */
9786 1.1 mrg
9787 1.1 mrg static void
9788 1.1 mrg ia64_reorg (void)
9789 1.1 mrg {
9790 1.1 mrg /* We are freeing block_for_insn in the toplev to keep compatibility
9791 1.1 mrg with old MDEP_REORGS that are not CFG based. Recompute it now. */
9792 1.1 mrg compute_bb_for_insn ();
9793 1.1 mrg
9794 1.1 mrg /* If optimizing, we'll have split before scheduling. */
9795 1.1 mrg if (optimize == 0)
9796 1.1 mrg split_all_insns ();
9797 1.1 mrg
9798 1.1 mrg if (optimize && flag_schedule_insns_after_reload
9799 1.1 mrg && dbg_cnt (ia64_sched2))
9800 1.1 mrg {
9801 1.1 mrg basic_block bb;
9802 1.1 mrg timevar_push (TV_SCHED2);
9803 1.1 mrg ia64_final_schedule = 1;
9804 1.1 mrg
9805 1.1 mrg /* We can't let modulo-sched prevent us from scheduling any bbs,
9806 1.1 mrg since we need the final schedule to produce bundle information. */
9807 1.1 mrg FOR_EACH_BB_FN (bb, cfun)
9808 1.1 mrg bb->flags &= ~BB_DISABLE_SCHEDULE;
9809 1.1 mrg
9810 1.1 mrg initiate_bundle_states ();
9811 1.1 mrg ia64_nop = make_insn_raw (gen_nop ());
9812 1.1 mrg SET_PREV_INSN (ia64_nop) = SET_NEXT_INSN (ia64_nop) = NULL_RTX;
9813 1.1 mrg recog_memoized (ia64_nop);
9814 1.1 mrg clocks_length = get_max_uid () + 1;
9815 1.1 mrg stops_p = XCNEWVEC (char, clocks_length);
9816 1.1 mrg
9817 1.1 mrg if (ia64_tune == PROCESSOR_ITANIUM2)
9818 1.1 mrg {
9819 1.1 mrg pos_1 = get_cpu_unit_code ("2_1");
9820 1.1 mrg pos_2 = get_cpu_unit_code ("2_2");
9821 1.1 mrg pos_3 = get_cpu_unit_code ("2_3");
9822 1.1 mrg pos_4 = get_cpu_unit_code ("2_4");
9823 1.1 mrg pos_5 = get_cpu_unit_code ("2_5");
9824 1.1 mrg pos_6 = get_cpu_unit_code ("2_6");
9825 1.1 mrg _0mii_ = get_cpu_unit_code ("2b_0mii.");
9826 1.1 mrg _0mmi_ = get_cpu_unit_code ("2b_0mmi.");
9827 1.1 mrg _0mfi_ = get_cpu_unit_code ("2b_0mfi.");
9828 1.1 mrg _0mmf_ = get_cpu_unit_code ("2b_0mmf.");
9829 1.1 mrg _0bbb_ = get_cpu_unit_code ("2b_0bbb.");
9830 1.1 mrg _0mbb_ = get_cpu_unit_code ("2b_0mbb.");
9831 1.1 mrg _0mib_ = get_cpu_unit_code ("2b_0mib.");
9832 1.1 mrg _0mmb_ = get_cpu_unit_code ("2b_0mmb.");
9833 1.1 mrg _0mfb_ = get_cpu_unit_code ("2b_0mfb.");
9834 1.1 mrg _0mlx_ = get_cpu_unit_code ("2b_0mlx.");
9835 1.1 mrg _1mii_ = get_cpu_unit_code ("2b_1mii.");
9836 1.1 mrg _1mmi_ = get_cpu_unit_code ("2b_1mmi.");
9837 1.1 mrg _1mfi_ = get_cpu_unit_code ("2b_1mfi.");
9838 1.1 mrg _1mmf_ = get_cpu_unit_code ("2b_1mmf.");
9839 1.1 mrg _1bbb_ = get_cpu_unit_code ("2b_1bbb.");
9840 1.1 mrg _1mbb_ = get_cpu_unit_code ("2b_1mbb.");
9841 1.1 mrg _1mib_ = get_cpu_unit_code ("2b_1mib.");
9842 1.1 mrg _1mmb_ = get_cpu_unit_code ("2b_1mmb.");
9843 1.1 mrg _1mfb_ = get_cpu_unit_code ("2b_1mfb.");
9844 1.1 mrg _1mlx_ = get_cpu_unit_code ("2b_1mlx.");
9845 1.1 mrg }
9846 1.1 mrg else
9847 1.1 mrg {
9848 1.1 mrg pos_1 = get_cpu_unit_code ("1_1");
9849 1.1 mrg pos_2 = get_cpu_unit_code ("1_2");
9850 1.1 mrg pos_3 = get_cpu_unit_code ("1_3");
9851 1.1 mrg pos_4 = get_cpu_unit_code ("1_4");
9852 1.1 mrg pos_5 = get_cpu_unit_code ("1_5");
9853 1.1 mrg pos_6 = get_cpu_unit_code ("1_6");
9854 1.1 mrg _0mii_ = get_cpu_unit_code ("1b_0mii.");
9855 1.1 mrg _0mmi_ = get_cpu_unit_code ("1b_0mmi.");
9856 1.1 mrg _0mfi_ = get_cpu_unit_code ("1b_0mfi.");
9857 1.1 mrg _0mmf_ = get_cpu_unit_code ("1b_0mmf.");
9858 1.1 mrg _0bbb_ = get_cpu_unit_code ("1b_0bbb.");
9859 1.1 mrg _0mbb_ = get_cpu_unit_code ("1b_0mbb.");
9860 1.1 mrg _0mib_ = get_cpu_unit_code ("1b_0mib.");
9861 1.1 mrg _0mmb_ = get_cpu_unit_code ("1b_0mmb.");
9862 1.1 mrg _0mfb_ = get_cpu_unit_code ("1b_0mfb.");
9863 1.1 mrg _0mlx_ = get_cpu_unit_code ("1b_0mlx.");
9864 1.1 mrg _1mii_ = get_cpu_unit_code ("1b_1mii.");
9865 1.1 mrg _1mmi_ = get_cpu_unit_code ("1b_1mmi.");
9866 1.1 mrg _1mfi_ = get_cpu_unit_code ("1b_1mfi.");
9867 1.1 mrg _1mmf_ = get_cpu_unit_code ("1b_1mmf.");
9868 1.1 mrg _1bbb_ = get_cpu_unit_code ("1b_1bbb.");
9869 1.1 mrg _1mbb_ = get_cpu_unit_code ("1b_1mbb.");
9870 1.1 mrg _1mib_ = get_cpu_unit_code ("1b_1mib.");
9871 1.1 mrg _1mmb_ = get_cpu_unit_code ("1b_1mmb.");
9872 1.1 mrg _1mfb_ = get_cpu_unit_code ("1b_1mfb.");
9873 1.1 mrg _1mlx_ = get_cpu_unit_code ("1b_1mlx.");
9874 1.1 mrg }
9875 1.1 mrg
9876 1.1 mrg if (flag_selective_scheduling2
9877 1.1 mrg && !maybe_skip_selective_scheduling ())
9878 1.1 mrg run_selective_scheduling ();
9879 1.1 mrg else
9880 1.1 mrg schedule_ebbs ();
9881 1.1 mrg
9882 1.1 mrg /* Redo alignment computation, as it might gone wrong. */
9883 1.1 mrg compute_alignments ();
9884 1.1 mrg
9885 1.1 mrg /* We cannot reuse this one because it has been corrupted by the
9886 1.1 mrg evil glat. */
9887 1.1 mrg finish_bundle_states ();
9888 1.1 mrg free (stops_p);
9889 1.1 mrg stops_p = NULL;
9890 1.1 mrg emit_insn_group_barriers (dump_file);
9891 1.1 mrg
9892 1.1 mrg ia64_final_schedule = 0;
9893 1.1 mrg timevar_pop (TV_SCHED2);
9894 1.1 mrg }
9895 1.1 mrg else
9896 1.1 mrg emit_all_insn_group_barriers (dump_file);
9897 1.1 mrg
9898 1.1 mrg df_analyze ();
9899 1.1 mrg
9900 1.1 mrg /* A call must not be the last instruction in a function, so that the
9901 1.1 mrg return address is still within the function, so that unwinding works
9902 1.1 mrg properly. Note that IA-64 differs from dwarf2 on this point. */
9903 1.1 mrg if (ia64_except_unwind_info (&global_options) == UI_TARGET)
9904 1.1 mrg {
9905 1.1 mrg rtx_insn *insn;
9906 1.1 mrg int saw_stop = 0;
9907 1.1 mrg
9908 1.1 mrg insn = get_last_insn ();
9909 1.1 mrg if (! INSN_P (insn))
9910 1.1 mrg insn = prev_active_insn (insn);
9911 1.1 mrg if (insn)
9912 1.1 mrg {
9913 1.1 mrg /* Skip over insns that expand to nothing. */
9914 1.1 mrg while (NONJUMP_INSN_P (insn)
9915 1.1 mrg && get_attr_empty (insn) == EMPTY_YES)
9916 1.1 mrg {
9917 1.1 mrg if (GET_CODE (PATTERN (insn)) == UNSPEC_VOLATILE
9918 1.1 mrg && XINT (PATTERN (insn), 1) == UNSPECV_INSN_GROUP_BARRIER)
9919 1.1 mrg saw_stop = 1;
9920 1.1 mrg insn = prev_active_insn (insn);
9921 1.1 mrg }
9922 1.1 mrg if (CALL_P (insn))
9923 1.1 mrg {
9924 1.1 mrg if (! saw_stop)
9925 1.1 mrg emit_insn (gen_insn_group_barrier (GEN_INT (3)));
9926 1.1 mrg emit_insn (gen_break_f ());
9927 1.1 mrg emit_insn (gen_insn_group_barrier (GEN_INT (3)));
9928 1.1 mrg }
9929 1.1 mrg }
9930 1.1 mrg }
9931 1.1 mrg
9932 1.1 mrg emit_predicate_relation_info ();
9933 1.1 mrg
9934 1.1 mrg if (flag_var_tracking)
9935 1.1 mrg {
9936 1.1 mrg timevar_push (TV_VAR_TRACKING);
9937 1.1 mrg variable_tracking_main ();
9938 1.1 mrg timevar_pop (TV_VAR_TRACKING);
9939 1.1 mrg }
9940 1.1 mrg df_finish_pass (false);
9941 1.1 mrg }
9942 1.1 mrg
9943 1.1 mrg /* Return true if REGNO is used by the epilogue. */
9945 1.1 mrg
9946 1.1 mrg int
9947 1.1 mrg ia64_epilogue_uses (int regno)
9948 1.1 mrg {
9949 1.1 mrg switch (regno)
9950 1.1 mrg {
9951 1.1 mrg case R_GR (1):
9952 1.1 mrg /* With a call to a function in another module, we will write a new
9953 1.1 mrg value to "gp". After returning from such a call, we need to make
9954 1.1 mrg sure the function restores the original gp-value, even if the
9955 1.1 mrg function itself does not use the gp anymore. */
9956 1.1 mrg return !(TARGET_AUTO_PIC || TARGET_NO_PIC);
9957 1.1 mrg
9958 1.1 mrg case IN_REG (0): case IN_REG (1): case IN_REG (2): case IN_REG (3):
9959 1.1 mrg case IN_REG (4): case IN_REG (5): case IN_REG (6): case IN_REG (7):
9960 1.1 mrg /* For functions defined with the syscall_linkage attribute, all
9961 1.1 mrg input registers are marked as live at all function exits. This
9962 1.1 mrg prevents the register allocator from using the input registers,
9963 1.1 mrg which in turn makes it possible to restart a system call after
9964 1.1 mrg an interrupt without having to save/restore the input registers.
9965 1.1 mrg This also prevents kernel data from leaking to application code. */
9966 1.1 mrg return lookup_attribute ("syscall_linkage",
9967 1.1 mrg TYPE_ATTRIBUTES (TREE_TYPE (current_function_decl))) != NULL;
9968 1.1 mrg
9969 1.1 mrg case R_BR (0):
9970 1.1 mrg /* Conditional return patterns can't represent the use of `b0' as
9971 1.1 mrg the return address, so we force the value live this way. */
9972 1.1 mrg return 1;
9973 1.1 mrg
9974 1.1 mrg case AR_PFS_REGNUM:
9975 1.1 mrg /* Likewise for ar.pfs, which is used by br.ret. */
9976 1.1 mrg return 1;
9977 1.1 mrg
9978 1.1 mrg default:
9979 1.1 mrg return 0;
9980 1.1 mrg }
9981 1.1 mrg }
9982 1.1 mrg
9983 1.1 mrg /* Return true if REGNO is used by the frame unwinder. */
9984 1.1 mrg
9985 1.1 mrg int
9986 1.1 mrg ia64_eh_uses (int regno)
9987 1.1 mrg {
9988 1.1 mrg unsigned int r;
9989 1.1 mrg
9990 1.1 mrg if (! reload_completed)
9991 1.1 mrg return 0;
9992 1.1 mrg
9993 1.1 mrg if (regno == 0)
9994 1.1 mrg return 0;
9995 1.1 mrg
9996 1.1 mrg for (r = reg_save_b0; r <= reg_save_ar_lc; r++)
9997 1.1 mrg if (regno == current_frame_info.r[r]
9998 1.1 mrg || regno == emitted_frame_related_regs[r])
9999 1.1 mrg return 1;
10000 1.1 mrg
10001 1.1 mrg return 0;
10002 1.1 mrg }
10003 1.1 mrg
10004 1.1 mrg /* Return true if this goes in small data/bss. */
10006 1.1 mrg
10007 1.1 mrg /* ??? We could also support own long data here. Generating movl/add/ld8
10008 1.1 mrg instead of addl,ld8/ld8. This makes the code bigger, but should make the
10009 1.1 mrg code faster because there is one less load. This also includes incomplete
10010 1.1 mrg types which can't go in sdata/sbss. */
10011 1.1 mrg
10012 1.1 mrg static bool
10013 1.1 mrg ia64_in_small_data_p (const_tree exp)
10014 1.1 mrg {
10015 1.1 mrg if (TARGET_NO_SDATA)
10016 1.1 mrg return false;
10017 1.1 mrg
10018 1.1 mrg /* We want to merge strings, so we never consider them small data. */
10019 1.1 mrg if (TREE_CODE (exp) == STRING_CST)
10020 1.1 mrg return false;
10021 1.1 mrg
10022 1.1 mrg /* Functions are never small data. */
10023 1.1 mrg if (TREE_CODE (exp) == FUNCTION_DECL)
10024 1.1 mrg return false;
10025 1.1 mrg
10026 1.1 mrg if (TREE_CODE (exp) == VAR_DECL && DECL_SECTION_NAME (exp))
10027 1.1 mrg {
10028 1.1 mrg const char *section = DECL_SECTION_NAME (exp);
10029 1.1 mrg
10030 1.1 mrg if (strcmp (section, ".sdata") == 0
10031 1.1 mrg || startswith (section, ".sdata.")
10032 1.1 mrg || startswith (section, ".gnu.linkonce.s.")
10033 1.1 mrg || strcmp (section, ".sbss") == 0
10034 1.1 mrg || startswith (section, ".sbss.")
10035 1.1 mrg || startswith (section, ".gnu.linkonce.sb."))
10036 1.1 mrg return true;
10037 1.1 mrg }
10038 1.1 mrg else
10039 1.1 mrg {
10040 1.1 mrg HOST_WIDE_INT size = int_size_in_bytes (TREE_TYPE (exp));
10041 1.1 mrg
10042 1.1 mrg /* If this is an incomplete type with size 0, then we can't put it
10043 1.1 mrg in sdata because it might be too big when completed. */
10044 1.1 mrg if (size > 0 && size <= ia64_section_threshold)
10045 1.1 mrg return true;
10046 1.1 mrg }
10047 1.1 mrg
10048 1.1 mrg return false;
10049 1.1 mrg }
10050 1.1 mrg
10051 1.1 mrg /* Output assembly directives for prologue regions. */
10053 1.1 mrg
10054 1.1 mrg /* The current basic block number. */
10055 1.1 mrg
10056 1.1 mrg static bool last_block;
10057 1.1 mrg
10058 1.1 mrg /* True if we need a copy_state command at the start of the next block. */
10059 1.1 mrg
10060 1.1 mrg static bool need_copy_state;
10061 1.1 mrg
10062 1.1 mrg #ifndef MAX_ARTIFICIAL_LABEL_BYTES
10063 1.1 mrg # define MAX_ARTIFICIAL_LABEL_BYTES 30
10064 1.1 mrg #endif
10065 1.1 mrg
10066 1.1 mrg /* The function emits unwind directives for the start of an epilogue. */
10067 1.1 mrg
10068 1.1 mrg static void
10069 1.1 mrg process_epilogue (FILE *out_file, rtx insn ATTRIBUTE_UNUSED,
10070 1.1 mrg bool unwind, bool frame ATTRIBUTE_UNUSED)
10071 1.1 mrg {
10072 1.1 mrg /* If this isn't the last block of the function, then we need to label the
10073 1.1 mrg current state, and copy it back in at the start of the next block. */
10074 1.1 mrg
10075 1.1 mrg if (!last_block)
10076 1.1 mrg {
10077 1.1 mrg if (unwind)
10078 1.1 mrg fprintf (out_file, "\t.label_state %d\n",
10079 1.1 mrg ++cfun->machine->state_num);
10080 1.1 mrg need_copy_state = true;
10081 1.1 mrg }
10082 1.1 mrg
10083 1.1 mrg if (unwind)
10084 1.1 mrg fprintf (out_file, "\t.restore sp\n");
10085 1.1 mrg }
10086 1.1 mrg
10087 1.1 mrg /* This function processes a SET pattern for REG_CFA_ADJUST_CFA. */
10088 1.1 mrg
10089 1.1 mrg static void
10090 1.1 mrg process_cfa_adjust_cfa (FILE *out_file, rtx pat, rtx insn,
10091 1.1 mrg bool unwind, bool frame)
10092 1.1 mrg {
10093 1.1 mrg rtx dest = SET_DEST (pat);
10094 1.1 mrg rtx src = SET_SRC (pat);
10095 1.1 mrg
10096 1.1 mrg if (dest == stack_pointer_rtx)
10097 1.1 mrg {
10098 1.1 mrg if (GET_CODE (src) == PLUS)
10099 1.1 mrg {
10100 1.1 mrg rtx op0 = XEXP (src, 0);
10101 1.1 mrg rtx op1 = XEXP (src, 1);
10102 1.1 mrg
10103 1.1 mrg gcc_assert (op0 == dest && GET_CODE (op1) == CONST_INT);
10104 1.1 mrg
10105 1.1 mrg if (INTVAL (op1) < 0)
10106 1.1 mrg {
10107 1.1 mrg gcc_assert (!frame_pointer_needed);
10108 1.1 mrg if (unwind)
10109 1.1 mrg fprintf (out_file,
10110 1.1 mrg "\t.fframe " HOST_WIDE_INT_PRINT_DEC"\n",
10111 1.1 mrg -INTVAL (op1));
10112 1.1 mrg }
10113 1.1 mrg else
10114 1.1 mrg process_epilogue (out_file, insn, unwind, frame);
10115 1.1 mrg }
10116 1.1 mrg else
10117 1.1 mrg {
10118 1.1 mrg gcc_assert (src == hard_frame_pointer_rtx);
10119 1.1 mrg process_epilogue (out_file, insn, unwind, frame);
10120 1.1 mrg }
10121 1.1 mrg }
10122 1.1 mrg else if (dest == hard_frame_pointer_rtx)
10123 1.1 mrg {
10124 1.1 mrg gcc_assert (src == stack_pointer_rtx);
10125 1.1 mrg gcc_assert (frame_pointer_needed);
10126 1.1 mrg
10127 1.1 mrg if (unwind)
10128 1.1 mrg fprintf (out_file, "\t.vframe r%d\n",
10129 1.1 mrg ia64_dbx_register_number (REGNO (dest)));
10130 1.1 mrg }
10131 1.1 mrg else
10132 1.1 mrg gcc_unreachable ();
10133 1.1 mrg }
10134 1.1 mrg
10135 1.1 mrg /* This function processes a SET pattern for REG_CFA_REGISTER. */
10136 1.1 mrg
10137 1.1 mrg static void
10138 1.1 mrg process_cfa_register (FILE *out_file, rtx pat, bool unwind)
10139 1.1 mrg {
10140 1.1 mrg rtx dest = SET_DEST (pat);
10141 1.1 mrg rtx src = SET_SRC (pat);
10142 1.1 mrg int dest_regno = REGNO (dest);
10143 1.1 mrg int src_regno;
10144 1.1 mrg
10145 1.1 mrg if (src == pc_rtx)
10146 1.1 mrg {
10147 1.1 mrg /* Saving return address pointer. */
10148 1.1 mrg if (unwind)
10149 1.1 mrg fprintf (out_file, "\t.save rp, r%d\n",
10150 1.1 mrg ia64_dbx_register_number (dest_regno));
10151 1.1 mrg return;
10152 1.1 mrg }
10153 1.1 mrg
10154 1.1 mrg src_regno = REGNO (src);
10155 1.1 mrg
10156 1.1 mrg switch (src_regno)
10157 1.1 mrg {
10158 1.1 mrg case PR_REG (0):
10159 1.1 mrg gcc_assert (dest_regno == current_frame_info.r[reg_save_pr]);
10160 1.1 mrg if (unwind)
10161 1.1 mrg fprintf (out_file, "\t.save pr, r%d\n",
10162 1.1 mrg ia64_dbx_register_number (dest_regno));
10163 1.1 mrg break;
10164 1.1 mrg
10165 1.1 mrg case AR_UNAT_REGNUM:
10166 1.1 mrg gcc_assert (dest_regno == current_frame_info.r[reg_save_ar_unat]);
10167 1.1 mrg if (unwind)
10168 1.1 mrg fprintf (out_file, "\t.save ar.unat, r%d\n",
10169 1.1 mrg ia64_dbx_register_number (dest_regno));
10170 1.1 mrg break;
10171 1.1 mrg
10172 1.1 mrg case AR_LC_REGNUM:
10173 1.1 mrg gcc_assert (dest_regno == current_frame_info.r[reg_save_ar_lc]);
10174 1.1 mrg if (unwind)
10175 1.1 mrg fprintf (out_file, "\t.save ar.lc, r%d\n",
10176 1.1 mrg ia64_dbx_register_number (dest_regno));
10177 1.1 mrg break;
10178 1.1 mrg
10179 1.1 mrg default:
10180 1.1 mrg /* Everything else should indicate being stored to memory. */
10181 1.1 mrg gcc_unreachable ();
10182 1.1 mrg }
10183 1.1 mrg }
10184 1.1 mrg
10185 1.1 mrg /* This function processes a SET pattern for REG_CFA_OFFSET. */
10186 1.1 mrg
10187 1.1 mrg static void
10188 1.1 mrg process_cfa_offset (FILE *out_file, rtx pat, bool unwind)
10189 1.1 mrg {
10190 1.1 mrg rtx dest = SET_DEST (pat);
10191 1.1 mrg rtx src = SET_SRC (pat);
10192 1.1 mrg int src_regno = REGNO (src);
10193 1.1 mrg const char *saveop;
10194 1.1 mrg HOST_WIDE_INT off;
10195 1.1 mrg rtx base;
10196 1.1 mrg
10197 1.1 mrg gcc_assert (MEM_P (dest));
10198 1.1 mrg if (GET_CODE (XEXP (dest, 0)) == REG)
10199 1.1 mrg {
10200 1.1 mrg base = XEXP (dest, 0);
10201 1.1 mrg off = 0;
10202 1.1 mrg }
10203 1.1 mrg else
10204 1.1 mrg {
10205 1.1 mrg gcc_assert (GET_CODE (XEXP (dest, 0)) == PLUS
10206 1.1 mrg && GET_CODE (XEXP (XEXP (dest, 0), 1)) == CONST_INT);
10207 1.1 mrg base = XEXP (XEXP (dest, 0), 0);
10208 1.1 mrg off = INTVAL (XEXP (XEXP (dest, 0), 1));
10209 1.1 mrg }
10210 1.1 mrg
10211 1.1 mrg if (base == hard_frame_pointer_rtx)
10212 1.1 mrg {
10213 1.1 mrg saveop = ".savepsp";
10214 1.1 mrg off = - off;
10215 1.1 mrg }
10216 1.1 mrg else
10217 1.1 mrg {
10218 1.1 mrg gcc_assert (base == stack_pointer_rtx);
10219 1.1 mrg saveop = ".savesp";
10220 1.1 mrg }
10221 1.1 mrg
10222 1.1 mrg src_regno = REGNO (src);
10223 1.1 mrg switch (src_regno)
10224 1.1 mrg {
10225 1.1 mrg case BR_REG (0):
10226 1.1 mrg gcc_assert (!current_frame_info.r[reg_save_b0]);
10227 1.1 mrg if (unwind)
10228 1.1 mrg fprintf (out_file, "\t%s rp, " HOST_WIDE_INT_PRINT_DEC "\n",
10229 1.1 mrg saveop, off);
10230 1.1 mrg break;
10231 1.1 mrg
10232 1.1 mrg case PR_REG (0):
10233 1.1 mrg gcc_assert (!current_frame_info.r[reg_save_pr]);
10234 1.1 mrg if (unwind)
10235 1.1 mrg fprintf (out_file, "\t%s pr, " HOST_WIDE_INT_PRINT_DEC "\n",
10236 1.1 mrg saveop, off);
10237 1.1 mrg break;
10238 1.1 mrg
10239 1.1 mrg case AR_LC_REGNUM:
10240 1.1 mrg gcc_assert (!current_frame_info.r[reg_save_ar_lc]);
10241 1.1 mrg if (unwind)
10242 1.1 mrg fprintf (out_file, "\t%s ar.lc, " HOST_WIDE_INT_PRINT_DEC "\n",
10243 1.1 mrg saveop, off);
10244 1.1 mrg break;
10245 1.1 mrg
10246 1.1 mrg case AR_PFS_REGNUM:
10247 1.1 mrg gcc_assert (!current_frame_info.r[reg_save_ar_pfs]);
10248 1.1 mrg if (unwind)
10249 1.1 mrg fprintf (out_file, "\t%s ar.pfs, " HOST_WIDE_INT_PRINT_DEC "\n",
10250 1.1 mrg saveop, off);
10251 1.1 mrg break;
10252 1.1 mrg
10253 1.1 mrg case AR_UNAT_REGNUM:
10254 1.1 mrg gcc_assert (!current_frame_info.r[reg_save_ar_unat]);
10255 1.1 mrg if (unwind)
10256 1.1 mrg fprintf (out_file, "\t%s ar.unat, " HOST_WIDE_INT_PRINT_DEC "\n",
10257 1.1 mrg saveop, off);
10258 1.1 mrg break;
10259 1.1 mrg
10260 1.1 mrg case GR_REG (4):
10261 1.1 mrg case GR_REG (5):
10262 1.1 mrg case GR_REG (6):
10263 1.1 mrg case GR_REG (7):
10264 1.1 mrg if (unwind)
10265 1.1 mrg fprintf (out_file, "\t.save.g 0x%x\n",
10266 1.1 mrg 1 << (src_regno - GR_REG (4)));
10267 1.1 mrg break;
10268 1.1 mrg
10269 1.1 mrg case BR_REG (1):
10270 1.1 mrg case BR_REG (2):
10271 1.1 mrg case BR_REG (3):
10272 1.1 mrg case BR_REG (4):
10273 1.1 mrg case BR_REG (5):
10274 1.1 mrg if (unwind)
10275 1.1 mrg fprintf (out_file, "\t.save.b 0x%x\n",
10276 1.1 mrg 1 << (src_regno - BR_REG (1)));
10277 1.1 mrg break;
10278 1.1 mrg
10279 1.1 mrg case FR_REG (2):
10280 1.1 mrg case FR_REG (3):
10281 1.1 mrg case FR_REG (4):
10282 1.1 mrg case FR_REG (5):
10283 1.1 mrg if (unwind)
10284 1.1 mrg fprintf (out_file, "\t.save.f 0x%x\n",
10285 1.1 mrg 1 << (src_regno - FR_REG (2)));
10286 1.1 mrg break;
10287 1.1 mrg
10288 1.1 mrg case FR_REG (16): case FR_REG (17): case FR_REG (18): case FR_REG (19):
10289 1.1 mrg case FR_REG (20): case FR_REG (21): case FR_REG (22): case FR_REG (23):
10290 1.1 mrg case FR_REG (24): case FR_REG (25): case FR_REG (26): case FR_REG (27):
10291 1.1 mrg case FR_REG (28): case FR_REG (29): case FR_REG (30): case FR_REG (31):
10292 1.1 mrg if (unwind)
10293 1.1 mrg fprintf (out_file, "\t.save.gf 0x0, 0x%x\n",
10294 1.1 mrg 1 << (src_regno - FR_REG (12)));
10295 1.1 mrg break;
10296 1.1 mrg
10297 1.1 mrg default:
10298 1.1 mrg /* ??? For some reason we mark other general registers, even those
10299 1.1 mrg we can't represent in the unwind info. Ignore them. */
10300 1.1 mrg break;
10301 1.1 mrg }
10302 1.1 mrg }
10303 1.1 mrg
10304 1.1 mrg /* This function looks at a single insn and emits any directives
10305 1.1 mrg required to unwind this insn. */
10306 1.1 mrg
10307 1.1 mrg static void
10308 1.1 mrg ia64_asm_unwind_emit (FILE *out_file, rtx_insn *insn)
10309 1.1 mrg {
10310 1.1 mrg bool unwind = ia64_except_unwind_info (&global_options) == UI_TARGET;
10311 1.1 mrg bool frame = dwarf2out_do_frame ();
10312 1.1 mrg rtx note, pat;
10313 1.1 mrg bool handled_one;
10314 1.1 mrg
10315 1.1 mrg if (!unwind && !frame)
10316 1.1 mrg return;
10317 1.1 mrg
10318 1.1 mrg if (NOTE_INSN_BASIC_BLOCK_P (insn))
10319 1.1 mrg {
10320 1.1 mrg last_block = NOTE_BASIC_BLOCK (insn)->next_bb
10321 1.1 mrg == EXIT_BLOCK_PTR_FOR_FN (cfun);
10322 1.1 mrg
10323 1.1 mrg /* Restore unwind state from immediately before the epilogue. */
10324 1.1 mrg if (need_copy_state)
10325 1.1 mrg {
10326 1.1 mrg if (unwind)
10327 1.1 mrg {
10328 1.1 mrg fprintf (out_file, "\t.body\n");
10329 1.1 mrg fprintf (out_file, "\t.copy_state %d\n",
10330 1.1 mrg cfun->machine->state_num);
10331 1.1 mrg }
10332 1.1 mrg need_copy_state = false;
10333 1.1 mrg }
10334 1.1 mrg }
10335 1.1 mrg
10336 1.1 mrg if (NOTE_P (insn) || ! RTX_FRAME_RELATED_P (insn))
10337 1.1 mrg return;
10338 1.1 mrg
10339 1.1 mrg /* Look for the ALLOC insn. */
10340 1.1 mrg if (INSN_CODE (insn) == CODE_FOR_alloc)
10341 1.1 mrg {
10342 1.1 mrg rtx dest = SET_DEST (XVECEXP (PATTERN (insn), 0, 0));
10343 1.1 mrg int dest_regno = REGNO (dest);
10344 1.1 mrg
10345 1.1 mrg /* If this is the final destination for ar.pfs, then this must
10346 1.1 mrg be the alloc in the prologue. */
10347 1.1 mrg if (dest_regno == current_frame_info.r[reg_save_ar_pfs])
10348 1.1 mrg {
10349 1.1 mrg if (unwind)
10350 1.1 mrg fprintf (out_file, "\t.save ar.pfs, r%d\n",
10351 1.1 mrg ia64_dbx_register_number (dest_regno));
10352 1.1 mrg }
10353 1.1 mrg else
10354 1.1 mrg {
10355 1.1 mrg /* This must be an alloc before a sibcall. We must drop the
10356 1.1 mrg old frame info. The easiest way to drop the old frame
10357 1.1 mrg info is to ensure we had a ".restore sp" directive
10358 1.1 mrg followed by a new prologue. If the procedure doesn't
10359 1.1 mrg have a memory-stack frame, we'll issue a dummy ".restore
10360 1.1 mrg sp" now. */
10361 1.1 mrg if (current_frame_info.total_size == 0 && !frame_pointer_needed)
10362 1.1 mrg /* if haven't done process_epilogue() yet, do it now */
10363 1.1 mrg process_epilogue (out_file, insn, unwind, frame);
10364 1.1 mrg if (unwind)
10365 1.1 mrg fprintf (out_file, "\t.prologue\n");
10366 1.1 mrg }
10367 1.1 mrg return;
10368 1.1 mrg }
10369 1.1 mrg
10370 1.1 mrg handled_one = false;
10371 1.1 mrg for (note = REG_NOTES (insn); note; note = XEXP (note, 1))
10372 1.1 mrg switch (REG_NOTE_KIND (note))
10373 1.1 mrg {
10374 1.1 mrg case REG_CFA_ADJUST_CFA:
10375 1.1 mrg pat = XEXP (note, 0);
10376 1.1 mrg if (pat == NULL)
10377 1.1 mrg pat = PATTERN (insn);
10378 1.1 mrg process_cfa_adjust_cfa (out_file, pat, insn, unwind, frame);
10379 1.1 mrg handled_one = true;
10380 1.1 mrg break;
10381 1.1 mrg
10382 1.1 mrg case REG_CFA_OFFSET:
10383 1.1 mrg pat = XEXP (note, 0);
10384 1.1 mrg if (pat == NULL)
10385 1.1 mrg pat = PATTERN (insn);
10386 1.1 mrg process_cfa_offset (out_file, pat, unwind);
10387 1.1 mrg handled_one = true;
10388 1.1 mrg break;
10389 1.1 mrg
10390 1.1 mrg case REG_CFA_REGISTER:
10391 1.1 mrg pat = XEXP (note, 0);
10392 1.1 mrg if (pat == NULL)
10393 1.1 mrg pat = PATTERN (insn);
10394 1.1 mrg process_cfa_register (out_file, pat, unwind);
10395 1.1 mrg handled_one = true;
10396 1.1 mrg break;
10397 1.1 mrg
10398 1.1 mrg case REG_FRAME_RELATED_EXPR:
10399 1.1 mrg case REG_CFA_DEF_CFA:
10400 1.1 mrg case REG_CFA_EXPRESSION:
10401 1.1 mrg case REG_CFA_RESTORE:
10402 1.1 mrg case REG_CFA_SET_VDRAP:
10403 1.1 mrg /* Not used in the ia64 port. */
10404 1.1 mrg gcc_unreachable ();
10405 1.1 mrg
10406 1.1 mrg default:
10407 1.1 mrg /* Not a frame-related note. */
10408 1.1 mrg break;
10409 1.1 mrg }
10410 1.1 mrg
10411 1.1 mrg /* All REG_FRAME_RELATED_P insns, besides ALLOC, are marked with the
10412 1.1 mrg explicit action to take. No guessing required. */
10413 1.1 mrg gcc_assert (handled_one);
10414 1.1 mrg }
10415 1.1 mrg
10416 1.1 mrg /* Implement TARGET_ASM_EMIT_EXCEPT_PERSONALITY. */
10417 1.1 mrg
10418 1.1 mrg static void
10419 1.1 mrg ia64_asm_emit_except_personality (rtx personality)
10420 1.1 mrg {
10421 1.1 mrg fputs ("\t.personality\t", asm_out_file);
10422 1.1 mrg output_addr_const (asm_out_file, personality);
10423 1.1 mrg fputc ('\n', asm_out_file);
10424 1.1 mrg }
10425 1.1 mrg
10426 1.1 mrg /* Implement TARGET_ASM_INITIALIZE_SECTIONS. */
10427 1.1 mrg
10428 1.1 mrg static void
10429 1.1 mrg ia64_asm_init_sections (void)
10430 1.1 mrg {
10431 1.1 mrg exception_section = get_unnamed_section (0, output_section_asm_op,
10432 1.1 mrg "\t.handlerdata");
10433 1.1 mrg }
10434 1.1 mrg
10435 1.1 mrg /* Implement TARGET_DEBUG_UNWIND_INFO. */
10436 1.1 mrg
10437 1.1 mrg static enum unwind_info_type
10438 1.1 mrg ia64_debug_unwind_info (void)
10439 1.1 mrg {
10440 1.1 mrg return UI_TARGET;
10441 1.1 mrg }
10442 1.1 mrg
10443 1.1 mrg enum ia64_builtins
10445 1.1 mrg {
10446 1.1 mrg IA64_BUILTIN_BSP,
10447 1.1 mrg IA64_BUILTIN_COPYSIGNQ,
10448 1.1 mrg IA64_BUILTIN_FABSQ,
10449 1.1 mrg IA64_BUILTIN_FLUSHRS,
10450 1.1 mrg IA64_BUILTIN_INFQ,
10451 1.1 mrg IA64_BUILTIN_HUGE_VALQ,
10452 1.1 mrg IA64_BUILTIN_NANQ,
10453 1.1 mrg IA64_BUILTIN_NANSQ,
10454 1.1 mrg IA64_BUILTIN_max
10455 1.1 mrg };
10456 1.1 mrg
10457 1.1 mrg static GTY(()) tree ia64_builtins[(int) IA64_BUILTIN_max];
10458 1.1 mrg
10459 1.1 mrg void
10460 1.1 mrg ia64_init_builtins (void)
10461 1.1 mrg {
10462 1.1 mrg tree fpreg_type;
10463 1.1 mrg tree float80_type;
10464 1.1 mrg tree decl;
10465 1.1 mrg
10466 1.1 mrg /* The __fpreg type. */
10467 1.1 mrg fpreg_type = make_node (REAL_TYPE);
10468 1.1 mrg TYPE_PRECISION (fpreg_type) = 82;
10469 1.1 mrg layout_type (fpreg_type);
10470 1.1 mrg (*lang_hooks.types.register_builtin_type) (fpreg_type, "__fpreg");
10471 1.1 mrg
10472 1.1 mrg /* The __float80 type. */
10473 1.1 mrg if (float64x_type_node != NULL_TREE
10474 1.1 mrg && TYPE_MODE (float64x_type_node) == XFmode)
10475 1.1 mrg float80_type = float64x_type_node;
10476 1.1 mrg else
10477 1.1 mrg {
10478 1.1 mrg float80_type = make_node (REAL_TYPE);
10479 1.1 mrg TYPE_PRECISION (float80_type) = 80;
10480 1.1 mrg layout_type (float80_type);
10481 1.1 mrg }
10482 1.1 mrg (*lang_hooks.types.register_builtin_type) (float80_type, "__float80");
10483 1.1 mrg
10484 1.1 mrg /* The __float128 type. */
10485 1.1 mrg if (!TARGET_HPUX)
10486 1.1 mrg {
10487 1.1 mrg tree ftype;
10488 1.1 mrg tree const_string_type
10489 1.1 mrg = build_pointer_type (build_qualified_type
10490 1.1 mrg (char_type_node, TYPE_QUAL_CONST));
10491 1.1 mrg
10492 1.1 mrg (*lang_hooks.types.register_builtin_type) (float128_type_node,
10493 1.1 mrg "__float128");
10494 1.1 mrg
10495 1.1 mrg /* TFmode support builtins. */
10496 1.1 mrg ftype = build_function_type_list (float128_type_node, NULL_TREE);
10497 1.1 mrg decl = add_builtin_function ("__builtin_infq", ftype,
10498 1.1 mrg IA64_BUILTIN_INFQ, BUILT_IN_MD,
10499 1.1 mrg NULL, NULL_TREE);
10500 1.1 mrg ia64_builtins[IA64_BUILTIN_INFQ] = decl;
10501 1.1 mrg
10502 1.1 mrg decl = add_builtin_function ("__builtin_huge_valq", ftype,
10503 1.1 mrg IA64_BUILTIN_HUGE_VALQ, BUILT_IN_MD,
10504 1.1 mrg NULL, NULL_TREE);
10505 1.1 mrg ia64_builtins[IA64_BUILTIN_HUGE_VALQ] = decl;
10506 1.1 mrg
10507 1.1 mrg ftype = build_function_type_list (float128_type_node,
10508 1.1 mrg const_string_type,
10509 1.1 mrg NULL_TREE);
10510 1.1 mrg decl = add_builtin_function ("__builtin_nanq", ftype,
10511 1.1 mrg IA64_BUILTIN_NANQ, BUILT_IN_MD,
10512 1.1 mrg "nanq", NULL_TREE);
10513 1.1 mrg TREE_READONLY (decl) = 1;
10514 1.1 mrg ia64_builtins[IA64_BUILTIN_NANQ] = decl;
10515 1.1 mrg
10516 1.1 mrg decl = add_builtin_function ("__builtin_nansq", ftype,
10517 1.1 mrg IA64_BUILTIN_NANSQ, BUILT_IN_MD,
10518 1.1 mrg "nansq", NULL_TREE);
10519 1.1 mrg TREE_READONLY (decl) = 1;
10520 1.1 mrg ia64_builtins[IA64_BUILTIN_NANSQ] = decl;
10521 1.1 mrg
10522 1.1 mrg ftype = build_function_type_list (float128_type_node,
10523 1.1 mrg float128_type_node,
10524 1.1 mrg NULL_TREE);
10525 1.1 mrg decl = add_builtin_function ("__builtin_fabsq", ftype,
10526 1.1 mrg IA64_BUILTIN_FABSQ, BUILT_IN_MD,
10527 1.1 mrg "__fabstf2", NULL_TREE);
10528 1.1 mrg TREE_READONLY (decl) = 1;
10529 1.1 mrg ia64_builtins[IA64_BUILTIN_FABSQ] = decl;
10530 1.1 mrg
10531 1.1 mrg ftype = build_function_type_list (float128_type_node,
10532 1.1 mrg float128_type_node,
10533 1.1 mrg float128_type_node,
10534 1.1 mrg NULL_TREE);
10535 1.1 mrg decl = add_builtin_function ("__builtin_copysignq", ftype,
10536 1.1 mrg IA64_BUILTIN_COPYSIGNQ, BUILT_IN_MD,
10537 1.1 mrg "__copysigntf3", NULL_TREE);
10538 1.1 mrg TREE_READONLY (decl) = 1;
10539 1.1 mrg ia64_builtins[IA64_BUILTIN_COPYSIGNQ] = decl;
10540 1.1 mrg }
10541 1.1 mrg else
10542 1.1 mrg /* Under HPUX, this is a synonym for "long double". */
10543 1.1 mrg (*lang_hooks.types.register_builtin_type) (long_double_type_node,
10544 1.1 mrg "__float128");
10545 1.1 mrg
10546 1.1 mrg /* Fwrite on VMS is non-standard. */
10547 1.1 mrg #if TARGET_ABI_OPEN_VMS
10548 1.1 mrg vms_patch_builtins ();
10549 1.1 mrg #endif
10550 1.1 mrg
10551 1.1 mrg #define def_builtin(name, type, code) \
10552 1.1 mrg add_builtin_function ((name), (type), (code), BUILT_IN_MD, \
10553 1.1 mrg NULL, NULL_TREE)
10554 1.1 mrg
10555 1.1 mrg decl = def_builtin ("__builtin_ia64_bsp",
10556 1.1 mrg build_function_type_list (ptr_type_node, NULL_TREE),
10557 1.1 mrg IA64_BUILTIN_BSP);
10558 1.1 mrg ia64_builtins[IA64_BUILTIN_BSP] = decl;
10559 1.1 mrg
10560 1.1 mrg decl = def_builtin ("__builtin_ia64_flushrs",
10561 1.1 mrg build_function_type_list (void_type_node, NULL_TREE),
10562 1.1 mrg IA64_BUILTIN_FLUSHRS);
10563 1.1 mrg ia64_builtins[IA64_BUILTIN_FLUSHRS] = decl;
10564 1.1 mrg
10565 1.1 mrg #undef def_builtin
10566 1.1 mrg
10567 1.1 mrg if (TARGET_HPUX)
10568 1.1 mrg {
10569 1.1 mrg if ((decl = builtin_decl_explicit (BUILT_IN_FINITE)) != NULL_TREE)
10570 1.1 mrg set_user_assembler_name (decl, "_Isfinite");
10571 1.1 mrg if ((decl = builtin_decl_explicit (BUILT_IN_FINITEF)) != NULL_TREE)
10572 1.1 mrg set_user_assembler_name (decl, "_Isfinitef");
10573 1.1 mrg if ((decl = builtin_decl_explicit (BUILT_IN_FINITEL)) != NULL_TREE)
10574 1.1 mrg set_user_assembler_name (decl, "_Isfinitef128");
10575 1.1 mrg }
10576 1.1 mrg }
10577 1.1 mrg
10578 1.1 mrg static tree
10579 1.1 mrg ia64_fold_builtin (tree fndecl, int n_args ATTRIBUTE_UNUSED,
10580 1.1 mrg tree *args, bool ignore ATTRIBUTE_UNUSED)
10581 1.1 mrg {
10582 1.1 mrg if (DECL_BUILT_IN_CLASS (fndecl) == BUILT_IN_MD)
10583 1.1 mrg {
10584 1.1 mrg enum ia64_builtins fn_code
10585 1.1 mrg = (enum ia64_builtins) DECL_MD_FUNCTION_CODE (fndecl);
10586 1.1 mrg switch (fn_code)
10587 1.1 mrg {
10588 1.1 mrg case IA64_BUILTIN_NANQ:
10589 1.1 mrg case IA64_BUILTIN_NANSQ:
10590 1.1 mrg {
10591 1.1 mrg tree type = TREE_TYPE (TREE_TYPE (fndecl));
10592 1.1 mrg const char *str = c_getstr (*args);
10593 1.1 mrg int quiet = fn_code == IA64_BUILTIN_NANQ;
10594 1.1 mrg REAL_VALUE_TYPE real;
10595 1.1 mrg
10596 1.1 mrg if (str && real_nan (&real, str, quiet, TYPE_MODE (type)))
10597 1.1 mrg return build_real (type, real);
10598 1.1 mrg return NULL_TREE;
10599 1.1 mrg }
10600 1.1 mrg
10601 1.1 mrg default:
10602 1.1 mrg break;
10603 1.1 mrg }
10604 1.1 mrg }
10605 1.1 mrg
10606 1.1 mrg #ifdef SUBTARGET_FOLD_BUILTIN
10607 1.1 mrg return SUBTARGET_FOLD_BUILTIN (fndecl, n_args, args, ignore);
10608 1.1 mrg #endif
10609 1.1 mrg
10610 1.1 mrg return NULL_TREE;
10611 1.1 mrg }
10612 1.1 mrg
10613 1.1 mrg rtx
10614 1.1 mrg ia64_expand_builtin (tree exp, rtx target, rtx subtarget ATTRIBUTE_UNUSED,
10615 1.1 mrg machine_mode mode ATTRIBUTE_UNUSED,
10616 1.1 mrg int ignore ATTRIBUTE_UNUSED)
10617 1.1 mrg {
10618 1.1 mrg tree fndecl = TREE_OPERAND (CALL_EXPR_FN (exp), 0);
10619 1.1 mrg unsigned int fcode = DECL_MD_FUNCTION_CODE (fndecl);
10620 1.1 mrg
10621 1.1 mrg switch (fcode)
10622 1.1 mrg {
10623 1.1 mrg case IA64_BUILTIN_BSP:
10624 1.1 mrg if (! target || ! register_operand (target, DImode))
10625 1.1 mrg target = gen_reg_rtx (DImode);
10626 1.1 mrg emit_insn (gen_bsp_value (target));
10627 1.1 mrg #ifdef POINTERS_EXTEND_UNSIGNED
10628 1.1 mrg target = convert_memory_address (ptr_mode, target);
10629 1.1 mrg #endif
10630 1.1 mrg return target;
10631 1.1 mrg
10632 1.1 mrg case IA64_BUILTIN_FLUSHRS:
10633 1.1 mrg emit_insn (gen_flushrs ());
10634 1.1 mrg return const0_rtx;
10635 1.1 mrg
10636 1.1 mrg case IA64_BUILTIN_INFQ:
10637 1.1 mrg case IA64_BUILTIN_HUGE_VALQ:
10638 1.1 mrg {
10639 1.1 mrg machine_mode target_mode = TYPE_MODE (TREE_TYPE (exp));
10640 1.1 mrg REAL_VALUE_TYPE inf;
10641 1.1 mrg rtx tmp;
10642 1.1 mrg
10643 1.1 mrg real_inf (&inf);
10644 1.1 mrg tmp = const_double_from_real_value (inf, target_mode);
10645 1.1 mrg
10646 1.1 mrg tmp = validize_mem (force_const_mem (target_mode, tmp));
10647 1.1 mrg
10648 1.1 mrg if (target == 0)
10649 1.1 mrg target = gen_reg_rtx (target_mode);
10650 1.1 mrg
10651 1.1 mrg emit_move_insn (target, tmp);
10652 1.1 mrg return target;
10653 1.1 mrg }
10654 1.1 mrg
10655 1.1 mrg case IA64_BUILTIN_NANQ:
10656 1.1 mrg case IA64_BUILTIN_NANSQ:
10657 1.1 mrg case IA64_BUILTIN_FABSQ:
10658 1.1 mrg case IA64_BUILTIN_COPYSIGNQ:
10659 1.1 mrg return expand_call (exp, target, ignore);
10660 1.1 mrg
10661 1.1 mrg default:
10662 1.1 mrg gcc_unreachable ();
10663 1.1 mrg }
10664 1.1 mrg
10665 1.1 mrg return NULL_RTX;
10666 1.1 mrg }
10667 1.1 mrg
10668 1.1 mrg /* Return the ia64 builtin for CODE. */
10669 1.1 mrg
10670 1.1 mrg static tree
10671 1.1 mrg ia64_builtin_decl (unsigned code, bool initialize_p ATTRIBUTE_UNUSED)
10672 1.1 mrg {
10673 1.1 mrg if (code >= IA64_BUILTIN_max)
10674 1.1 mrg return error_mark_node;
10675 1.1 mrg
10676 1.1 mrg return ia64_builtins[code];
10677 1.1 mrg }
10678 1.1 mrg
10679 1.1 mrg /* Implement TARGET_FUNCTION_ARG_PADDING.
10680 1.1 mrg
10681 1.1 mrg For the HP-UX IA64 aggregate parameters are passed stored in the
10682 1.1 mrg most significant bits of the stack slot. */
10683 1.1 mrg
10684 1.1 mrg static pad_direction
10685 1.1 mrg ia64_function_arg_padding (machine_mode mode, const_tree type)
10686 1.1 mrg {
10687 1.1 mrg /* Exception to normal case for structures/unions/etc. */
10688 1.1 mrg if (TARGET_HPUX
10689 1.1 mrg && type
10690 1.1 mrg && AGGREGATE_TYPE_P (type)
10691 1.1 mrg && int_size_in_bytes (type) < UNITS_PER_WORD)
10692 1.1 mrg return PAD_UPWARD;
10693 1.1 mrg
10694 1.1 mrg /* Fall back to the default. */
10695 1.1 mrg return default_function_arg_padding (mode, type);
10696 1.1 mrg }
10697 1.1 mrg
10698 1.1 mrg /* Emit text to declare externally defined variables and functions, because
10699 1.1 mrg the Intel assembler does not support undefined externals. */
10700 1.1 mrg
10701 1.1 mrg void
10702 1.1 mrg ia64_asm_output_external (FILE *file, tree decl, const char *name)
10703 1.1 mrg {
10704 1.1 mrg /* We output the name if and only if TREE_SYMBOL_REFERENCED is
10705 1.1 mrg set in order to avoid putting out names that are never really
10706 1.1 mrg used. */
10707 1.1 mrg if (TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (decl)))
10708 1.1 mrg {
10709 1.1 mrg /* maybe_assemble_visibility will return 1 if the assembler
10710 1.1 mrg visibility directive is output. */
10711 1.1 mrg int need_visibility = ((*targetm.binds_local_p) (decl)
10712 1.1 mrg && maybe_assemble_visibility (decl));
10713 1.1 mrg
10714 1.1 mrg /* GNU as does not need anything here, but the HP linker does
10715 1.1 mrg need something for external functions. */
10716 1.1 mrg if ((TARGET_HPUX_LD || !TARGET_GNU_AS)
10717 1.1 mrg && TREE_CODE (decl) == FUNCTION_DECL)
10718 1.1 mrg (*targetm.asm_out.globalize_decl_name) (file, decl);
10719 1.1 mrg else if (need_visibility && !TARGET_GNU_AS)
10720 1.1 mrg (*targetm.asm_out.globalize_label) (file, name);
10721 1.1 mrg }
10722 1.1 mrg }
10723 1.1 mrg
10724 1.1 mrg /* Set SImode div/mod functions, init_integral_libfuncs only initializes
10725 1.1 mrg modes of word_mode and larger. Rename the TFmode libfuncs using the
10726 1.1 mrg HPUX conventions. __divtf3 is used for XFmode. We need to keep it for
10727 1.1 mrg backward compatibility. */
10728 1.1 mrg
10729 1.1 mrg static void
10730 1.1 mrg ia64_init_libfuncs (void)
10731 1.1 mrg {
10732 1.1 mrg set_optab_libfunc (sdiv_optab, SImode, "__divsi3");
10733 1.1 mrg set_optab_libfunc (udiv_optab, SImode, "__udivsi3");
10734 1.1 mrg set_optab_libfunc (smod_optab, SImode, "__modsi3");
10735 1.1 mrg set_optab_libfunc (umod_optab, SImode, "__umodsi3");
10736 1.1 mrg
10737 1.1 mrg set_optab_libfunc (add_optab, TFmode, "_U_Qfadd");
10738 1.1 mrg set_optab_libfunc (sub_optab, TFmode, "_U_Qfsub");
10739 1.1 mrg set_optab_libfunc (smul_optab, TFmode, "_U_Qfmpy");
10740 1.1 mrg set_optab_libfunc (sdiv_optab, TFmode, "_U_Qfdiv");
10741 1.1 mrg set_optab_libfunc (neg_optab, TFmode, "_U_Qfneg");
10742 1.1 mrg
10743 1.1 mrg set_conv_libfunc (sext_optab, TFmode, SFmode, "_U_Qfcnvff_sgl_to_quad");
10744 1.1 mrg set_conv_libfunc (sext_optab, TFmode, DFmode, "_U_Qfcnvff_dbl_to_quad");
10745 1.1 mrg set_conv_libfunc (sext_optab, TFmode, XFmode, "_U_Qfcnvff_f80_to_quad");
10746 1.1 mrg set_conv_libfunc (trunc_optab, SFmode, TFmode, "_U_Qfcnvff_quad_to_sgl");
10747 1.1 mrg set_conv_libfunc (trunc_optab, DFmode, TFmode, "_U_Qfcnvff_quad_to_dbl");
10748 1.1 mrg set_conv_libfunc (trunc_optab, XFmode, TFmode, "_U_Qfcnvff_quad_to_f80");
10749 1.1 mrg
10750 1.1 mrg set_conv_libfunc (sfix_optab, SImode, TFmode, "_U_Qfcnvfxt_quad_to_sgl");
10751 1.1 mrg set_conv_libfunc (sfix_optab, DImode, TFmode, "_U_Qfcnvfxt_quad_to_dbl");
10752 1.1 mrg set_conv_libfunc (sfix_optab, TImode, TFmode, "_U_Qfcnvfxt_quad_to_quad");
10753 1.1 mrg set_conv_libfunc (ufix_optab, SImode, TFmode, "_U_Qfcnvfxut_quad_to_sgl");
10754 1.1 mrg set_conv_libfunc (ufix_optab, DImode, TFmode, "_U_Qfcnvfxut_quad_to_dbl");
10755 1.1 mrg
10756 1.1 mrg set_conv_libfunc (sfloat_optab, TFmode, SImode, "_U_Qfcnvxf_sgl_to_quad");
10757 1.1 mrg set_conv_libfunc (sfloat_optab, TFmode, DImode, "_U_Qfcnvxf_dbl_to_quad");
10758 1.1 mrg set_conv_libfunc (sfloat_optab, TFmode, TImode, "_U_Qfcnvxf_quad_to_quad");
10759 1.1 mrg /* HP-UX 11.23 libc does not have a function for unsigned
10760 1.1 mrg SImode-to-TFmode conversion. */
10761 1.1 mrg set_conv_libfunc (ufloat_optab, TFmode, DImode, "_U_Qfcnvxuf_dbl_to_quad");
10762 1.1 mrg }
10763 1.1 mrg
10764 1.1 mrg /* Rename all the TFmode libfuncs using the HPUX conventions. */
10765 1.1 mrg
10766 1.1 mrg static void
10767 1.1 mrg ia64_hpux_init_libfuncs (void)
10768 1.1 mrg {
10769 1.1 mrg ia64_init_libfuncs ();
10770 1.1 mrg
10771 1.1 mrg /* The HP SI millicode division and mod functions expect DI arguments.
10772 1.1 mrg By turning them off completely we avoid using both libgcc and the
10773 1.1 mrg non-standard millicode routines and use the HP DI millicode routines
10774 1.1 mrg instead. */
10775 1.1 mrg
10776 1.1 mrg set_optab_libfunc (sdiv_optab, SImode, 0);
10777 1.1 mrg set_optab_libfunc (udiv_optab, SImode, 0);
10778 1.1 mrg set_optab_libfunc (smod_optab, SImode, 0);
10779 1.1 mrg set_optab_libfunc (umod_optab, SImode, 0);
10780 1.1 mrg
10781 1.1 mrg set_optab_libfunc (sdiv_optab, DImode, "__milli_divI");
10782 1.1 mrg set_optab_libfunc (udiv_optab, DImode, "__milli_divU");
10783 1.1 mrg set_optab_libfunc (smod_optab, DImode, "__milli_remI");
10784 1.1 mrg set_optab_libfunc (umod_optab, DImode, "__milli_remU");
10785 1.1 mrg
10786 1.1 mrg /* HP-UX libc has TF min/max/abs routines in it. */
10787 1.1 mrg set_optab_libfunc (smin_optab, TFmode, "_U_Qfmin");
10788 1.1 mrg set_optab_libfunc (smax_optab, TFmode, "_U_Qfmax");
10789 1.1 mrg set_optab_libfunc (abs_optab, TFmode, "_U_Qfabs");
10790 1.1 mrg
10791 1.1 mrg /* ia64_expand_compare uses this. */
10792 1.1 mrg cmptf_libfunc = init_one_libfunc ("_U_Qfcmp");
10793 1.1 mrg
10794 1.1 mrg /* These should never be used. */
10795 1.1 mrg set_optab_libfunc (eq_optab, TFmode, 0);
10796 1.1 mrg set_optab_libfunc (ne_optab, TFmode, 0);
10797 1.1 mrg set_optab_libfunc (gt_optab, TFmode, 0);
10798 1.1 mrg set_optab_libfunc (ge_optab, TFmode, 0);
10799 1.1 mrg set_optab_libfunc (lt_optab, TFmode, 0);
10800 1.1 mrg set_optab_libfunc (le_optab, TFmode, 0);
10801 1.1 mrg }
10802 1.1 mrg
10803 1.1 mrg /* Rename the division and modulus functions in VMS. */
10804 1.1 mrg
10805 1.1 mrg static void
10806 1.1 mrg ia64_vms_init_libfuncs (void)
10807 1.1 mrg {
10808 1.1 mrg set_optab_libfunc (sdiv_optab, SImode, "OTS$DIV_I");
10809 1.1 mrg set_optab_libfunc (sdiv_optab, DImode, "OTS$DIV_L");
10810 1.1 mrg set_optab_libfunc (udiv_optab, SImode, "OTS$DIV_UI");
10811 1.1 mrg set_optab_libfunc (udiv_optab, DImode, "OTS$DIV_UL");
10812 1.1 mrg set_optab_libfunc (smod_optab, SImode, "OTS$REM_I");
10813 1.1 mrg set_optab_libfunc (smod_optab, DImode, "OTS$REM_L");
10814 1.1 mrg set_optab_libfunc (umod_optab, SImode, "OTS$REM_UI");
10815 1.1 mrg set_optab_libfunc (umod_optab, DImode, "OTS$REM_UL");
10816 1.1 mrg #ifdef MEM_LIBFUNCS_INIT
10817 1.1 mrg MEM_LIBFUNCS_INIT;
10818 1.1 mrg #endif
10819 1.1 mrg }
10820 1.1 mrg
10821 1.1 mrg /* Rename the TFmode libfuncs available from soft-fp in glibc using
10822 1.1 mrg the HPUX conventions. */
10823 1.1 mrg
10824 1.1 mrg static void
10825 1.1 mrg ia64_sysv4_init_libfuncs (void)
10826 1.1 mrg {
10827 1.1 mrg ia64_init_libfuncs ();
10828 1.1 mrg
10829 1.1 mrg /* These functions are not part of the HPUX TFmode interface. We
10830 1.1 mrg use them instead of _U_Qfcmp, which doesn't work the way we
10831 1.1 mrg expect. */
10832 1.1 mrg set_optab_libfunc (eq_optab, TFmode, "_U_Qfeq");
10833 1.1 mrg set_optab_libfunc (ne_optab, TFmode, "_U_Qfne");
10834 1.1 mrg set_optab_libfunc (gt_optab, TFmode, "_U_Qfgt");
10835 1.1 mrg set_optab_libfunc (ge_optab, TFmode, "_U_Qfge");
10836 1.1 mrg set_optab_libfunc (lt_optab, TFmode, "_U_Qflt");
10837 1.1 mrg set_optab_libfunc (le_optab, TFmode, "_U_Qfle");
10838 1.1 mrg
10839 1.1 mrg /* We leave out _U_Qfmin, _U_Qfmax and _U_Qfabs since soft-fp in
10840 1.1 mrg glibc doesn't have them. */
10841 1.1 mrg }
10842 1.1 mrg
10843 1.1 mrg /* Use soft-fp. */
10844 1.1 mrg
10845 1.1 mrg static void
10846 1.1 mrg ia64_soft_fp_init_libfuncs (void)
10847 1.1 mrg {
10848 1.1 mrg }
10849 1.1 mrg
10850 1.1 mrg static bool
10851 1.1 mrg ia64_vms_valid_pointer_mode (scalar_int_mode mode)
10852 1.1 mrg {
10853 1.1 mrg return (mode == SImode || mode == DImode);
10854 1.1 mrg }
10855 1.1 mrg
10856 1.1 mrg /* For HPUX, it is illegal to have relocations in shared segments. */
10858 1.1 mrg
10859 1.1 mrg static int
10860 1.1 mrg ia64_hpux_reloc_rw_mask (void)
10861 1.1 mrg {
10862 1.1 mrg return 3;
10863 1.1 mrg }
10864 1.1 mrg
10865 1.1 mrg /* For others, relax this so that relocations to local data goes in
10866 1.1 mrg read-only segments, but we still cannot allow global relocations
10867 1.1 mrg in read-only segments. */
10868 1.1 mrg
10869 1.1 mrg static int
10870 1.1 mrg ia64_reloc_rw_mask (void)
10871 1.1 mrg {
10872 1.1 mrg return flag_pic ? 3 : 2;
10873 1.1 mrg }
10874 1.1 mrg
10875 1.1 mrg /* Return the section to use for X. The only special thing we do here
10876 1.1 mrg is to honor small data. */
10877 1.1 mrg
10878 1.1 mrg static section *
10879 1.1 mrg ia64_select_rtx_section (machine_mode mode, rtx x,
10880 1.1 mrg unsigned HOST_WIDE_INT align)
10881 1.1 mrg {
10882 1.1 mrg if (GET_MODE_SIZE (mode) > 0
10883 1.1 mrg && GET_MODE_SIZE (mode) <= ia64_section_threshold
10884 1.1 mrg && !TARGET_NO_SDATA)
10885 1.1 mrg return sdata_section;
10886 1.1 mrg else
10887 1.1 mrg return default_elf_select_rtx_section (mode, x, align);
10888 1.1 mrg }
10889 1.1 mrg
10890 1.1 mrg static unsigned int
10891 1.1 mrg ia64_section_type_flags (tree decl, const char *name, int reloc)
10892 1.1 mrg {
10893 1.1 mrg unsigned int flags = 0;
10894 1.1 mrg
10895 1.1 mrg if (strcmp (name, ".sdata") == 0
10896 1.1 mrg || startswith (name, ".sdata.")
10897 1.1 mrg || startswith (name, ".gnu.linkonce.s.")
10898 1.1 mrg || startswith (name, ".sdata2.")
10899 1.1 mrg || startswith (name, ".gnu.linkonce.s2.")
10900 1.1 mrg || strcmp (name, ".sbss") == 0
10901 1.1 mrg || startswith (name, ".sbss.")
10902 1.1 mrg || startswith (name, ".gnu.linkonce.sb."))
10903 1.1 mrg flags = SECTION_SMALL;
10904 1.1 mrg
10905 1.1 mrg flags |= default_section_type_flags (decl, name, reloc);
10906 1.1 mrg return flags;
10907 1.1 mrg }
10908 1.1 mrg
10909 1.1 mrg /* Returns true if FNTYPE (a FUNCTION_TYPE or a METHOD_TYPE) returns a
10910 1.1 mrg structure type and that the address of that type should be passed
10911 1.1 mrg in out0, rather than in r8. */
10912 1.1 mrg
10913 1.1 mrg static bool
10914 1.1 mrg ia64_struct_retval_addr_is_first_parm_p (tree fntype)
10915 1.1 mrg {
10916 1.1 mrg tree ret_type = TREE_TYPE (fntype);
10917 1.1 mrg
10918 1.1 mrg /* The Itanium C++ ABI requires that out0, rather than r8, be used
10919 1.1 mrg as the structure return address parameter, if the return value
10920 1.1 mrg type has a non-trivial copy constructor or destructor. It is not
10921 1.1 mrg clear if this same convention should be used for other
10922 1.1 mrg programming languages. Until G++ 3.4, we incorrectly used r8 for
10923 1.1 mrg these return values. */
10924 1.1 mrg return (abi_version_at_least (2)
10925 1.1 mrg && ret_type
10926 1.1 mrg && TYPE_MODE (ret_type) == BLKmode
10927 1.1 mrg && TREE_ADDRESSABLE (ret_type)
10928 1.1 mrg && lang_GNU_CXX ());
10929 1.1 mrg }
10930 1.1 mrg
10931 1.1 mrg /* Output the assembler code for a thunk function. THUNK_DECL is the
10932 1.1 mrg declaration for the thunk function itself, FUNCTION is the decl for
10933 1.1 mrg the target function. DELTA is an immediate constant offset to be
10934 1.1 mrg added to THIS. If VCALL_OFFSET is nonzero, the word at
10935 1.1 mrg *(*this + vcall_offset) should be added to THIS. */
10936 1.1 mrg
10937 1.1 mrg static void
10938 1.1 mrg ia64_output_mi_thunk (FILE *file, tree thunk ATTRIBUTE_UNUSED,
10939 1.1 mrg HOST_WIDE_INT delta, HOST_WIDE_INT vcall_offset,
10940 1.1 mrg tree function)
10941 1.1 mrg {
10942 1.1 mrg const char *fnname = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (thunk));
10943 1.1 mrg rtx this_rtx, funexp;
10944 1.1 mrg rtx_insn *insn;
10945 1.1 mrg unsigned int this_parmno;
10946 1.1 mrg unsigned int this_regno;
10947 1.1 mrg rtx delta_rtx;
10948 1.1 mrg
10949 1.1 mrg reload_completed = 1;
10950 1.1 mrg epilogue_completed = 1;
10951 1.1 mrg
10952 1.1 mrg /* Set things up as ia64_expand_prologue might. */
10953 1.1 mrg last_scratch_gr_reg = 15;
10954 1.1 mrg
10955 1.1 mrg memset (¤t_frame_info, 0, sizeof (current_frame_info));
10956 1.1 mrg current_frame_info.spill_cfa_off = -16;
10957 1.1 mrg current_frame_info.n_input_regs = 1;
10958 1.1 mrg current_frame_info.need_regstk = (TARGET_REG_NAMES != 0);
10959 1.1 mrg
10960 1.1 mrg /* Mark the end of the (empty) prologue. */
10961 1.1 mrg emit_note (NOTE_INSN_PROLOGUE_END);
10962 1.1 mrg
10963 1.1 mrg /* Figure out whether "this" will be the first parameter (the
10964 1.1 mrg typical case) or the second parameter (as happens when the
10965 1.1 mrg virtual function returns certain class objects). */
10966 1.1 mrg this_parmno
10967 1.1 mrg = (ia64_struct_retval_addr_is_first_parm_p (TREE_TYPE (thunk))
10968 1.1 mrg ? 1 : 0);
10969 1.1 mrg this_regno = IN_REG (this_parmno);
10970 1.1 mrg if (!TARGET_REG_NAMES)
10971 1.1 mrg reg_names[this_regno] = ia64_reg_numbers[this_parmno];
10972 1.1 mrg
10973 1.1 mrg this_rtx = gen_rtx_REG (Pmode, this_regno);
10974 1.1 mrg
10975 1.1 mrg /* Apply the constant offset, if required. */
10976 1.1 mrg delta_rtx = GEN_INT (delta);
10977 1.1 mrg if (TARGET_ILP32)
10978 1.1 mrg {
10979 1.1 mrg rtx tmp = gen_rtx_REG (ptr_mode, this_regno);
10980 1.1 mrg REG_POINTER (tmp) = 1;
10981 1.1 mrg if (delta && satisfies_constraint_I (delta_rtx))
10982 1.1 mrg {
10983 1.1 mrg emit_insn (gen_ptr_extend_plus_imm (this_rtx, tmp, delta_rtx));
10984 1.1 mrg delta = 0;
10985 1.1 mrg }
10986 1.1 mrg else
10987 1.1 mrg emit_insn (gen_ptr_extend (this_rtx, tmp));
10988 1.1 mrg }
10989 1.1 mrg if (delta)
10990 1.1 mrg {
10991 1.1 mrg if (!satisfies_constraint_I (delta_rtx))
10992 1.1 mrg {
10993 1.1 mrg rtx tmp = gen_rtx_REG (Pmode, 2);
10994 1.1 mrg emit_move_insn (tmp, delta_rtx);
10995 1.1 mrg delta_rtx = tmp;
10996 1.1 mrg }
10997 1.1 mrg emit_insn (gen_adddi3 (this_rtx, this_rtx, delta_rtx));
10998 1.1 mrg }
10999 1.1 mrg
11000 1.1 mrg /* Apply the offset from the vtable, if required. */
11001 1.1 mrg if (vcall_offset)
11002 1.1 mrg {
11003 1.1 mrg rtx vcall_offset_rtx = GEN_INT (vcall_offset);
11004 1.1 mrg rtx tmp = gen_rtx_REG (Pmode, 2);
11005 1.1 mrg
11006 1.1 mrg if (TARGET_ILP32)
11007 1.1 mrg {
11008 1.1 mrg rtx t = gen_rtx_REG (ptr_mode, 2);
11009 1.1 mrg REG_POINTER (t) = 1;
11010 1.1 mrg emit_move_insn (t, gen_rtx_MEM (ptr_mode, this_rtx));
11011 1.1 mrg if (satisfies_constraint_I (vcall_offset_rtx))
11012 1.1 mrg {
11013 1.1 mrg emit_insn (gen_ptr_extend_plus_imm (tmp, t, vcall_offset_rtx));
11014 1.1 mrg vcall_offset = 0;
11015 1.1 mrg }
11016 1.1 mrg else
11017 1.1 mrg emit_insn (gen_ptr_extend (tmp, t));
11018 1.1 mrg }
11019 1.1 mrg else
11020 1.1 mrg emit_move_insn (tmp, gen_rtx_MEM (Pmode, this_rtx));
11021 1.1 mrg
11022 1.1 mrg if (vcall_offset)
11023 1.1 mrg {
11024 1.1 mrg if (!satisfies_constraint_J (vcall_offset_rtx))
11025 1.1 mrg {
11026 1.1 mrg rtx tmp2 = gen_rtx_REG (Pmode, next_scratch_gr_reg ());
11027 1.1 mrg emit_move_insn (tmp2, vcall_offset_rtx);
11028 1.1 mrg vcall_offset_rtx = tmp2;
11029 1.1 mrg }
11030 1.1 mrg emit_insn (gen_adddi3 (tmp, tmp, vcall_offset_rtx));
11031 1.1 mrg }
11032 1.1 mrg
11033 1.1 mrg if (TARGET_ILP32)
11034 1.1 mrg emit_insn (gen_zero_extendsidi2 (tmp, gen_rtx_MEM (ptr_mode, tmp)));
11035 1.1 mrg else
11036 1.1 mrg emit_move_insn (tmp, gen_rtx_MEM (Pmode, tmp));
11037 1.1 mrg
11038 1.1 mrg emit_insn (gen_adddi3 (this_rtx, this_rtx, tmp));
11039 1.1 mrg }
11040 1.1 mrg
11041 1.1 mrg /* Generate a tail call to the target function. */
11042 1.1 mrg if (! TREE_USED (function))
11043 1.1 mrg {
11044 1.1 mrg assemble_external (function);
11045 1.1 mrg TREE_USED (function) = 1;
11046 1.1 mrg }
11047 1.1 mrg funexp = XEXP (DECL_RTL (function), 0);
11048 1.1 mrg funexp = gen_rtx_MEM (FUNCTION_MODE, funexp);
11049 1.1 mrg ia64_expand_call (NULL_RTX, funexp, NULL_RTX, 1);
11050 1.1 mrg insn = get_last_insn ();
11051 1.1 mrg SIBLING_CALL_P (insn) = 1;
11052 1.1 mrg
11053 1.1 mrg /* Code generation for calls relies on splitting. */
11054 1.1 mrg reload_completed = 1;
11055 1.1 mrg epilogue_completed = 1;
11056 1.1 mrg try_split (PATTERN (insn), insn, 0);
11057 1.1 mrg
11058 1.1 mrg emit_barrier ();
11059 1.1 mrg
11060 1.1 mrg /* Run just enough of rest_of_compilation to get the insns emitted.
11061 1.1 mrg There's not really enough bulk here to make other passes such as
11062 1.1 mrg instruction scheduling worth while. */
11063 1.1 mrg
11064 1.1 mrg emit_all_insn_group_barriers (NULL);
11065 1.1 mrg insn = get_insns ();
11066 1.1 mrg shorten_branches (insn);
11067 1.1 mrg assemble_start_function (thunk, fnname);
11068 1.1 mrg final_start_function (insn, file, 1);
11069 1.1 mrg final (insn, file, 1);
11070 1.1 mrg final_end_function ();
11071 1.1 mrg assemble_end_function (thunk, fnname);
11072 1.1 mrg
11073 1.1 mrg reload_completed = 0;
11074 1.1 mrg epilogue_completed = 0;
11075 1.1 mrg }
11076 1.1 mrg
11077 1.1 mrg /* Worker function for TARGET_STRUCT_VALUE_RTX. */
11078 1.1 mrg
11079 1.1 mrg static rtx
11080 1.1 mrg ia64_struct_value_rtx (tree fntype,
11081 1.1 mrg int incoming ATTRIBUTE_UNUSED)
11082 1.1 mrg {
11083 1.1 mrg if (TARGET_ABI_OPEN_VMS ||
11084 1.1 mrg (fntype && ia64_struct_retval_addr_is_first_parm_p (fntype)))
11085 1.1 mrg return NULL_RTX;
11086 1.1 mrg return gen_rtx_REG (Pmode, GR_REG (8));
11087 1.1 mrg }
11088 1.1 mrg
11089 1.1 mrg static bool
11090 1.1 mrg ia64_scalar_mode_supported_p (scalar_mode mode)
11091 1.1 mrg {
11092 1.1 mrg switch (mode)
11093 1.1 mrg {
11094 1.1 mrg case E_QImode:
11095 1.1 mrg case E_HImode:
11096 1.1 mrg case E_SImode:
11097 1.1 mrg case E_DImode:
11098 1.1 mrg case E_TImode:
11099 1.1 mrg return true;
11100 1.1 mrg
11101 1.1 mrg case E_SFmode:
11102 1.1 mrg case E_DFmode:
11103 1.1 mrg case E_XFmode:
11104 1.1 mrg case E_RFmode:
11105 1.1 mrg return true;
11106 1.1 mrg
11107 1.1 mrg case E_TFmode:
11108 1.1 mrg return true;
11109 1.1 mrg
11110 1.1 mrg default:
11111 1.1 mrg return false;
11112 1.1 mrg }
11113 1.1 mrg }
11114 1.1 mrg
11115 1.1 mrg static bool
11116 1.1 mrg ia64_vector_mode_supported_p (machine_mode mode)
11117 1.1 mrg {
11118 1.1 mrg switch (mode)
11119 1.1 mrg {
11120 1.1 mrg case E_V8QImode:
11121 1.1 mrg case E_V4HImode:
11122 1.1 mrg case E_V2SImode:
11123 1.1 mrg return true;
11124 1.1 mrg
11125 1.1 mrg case E_V2SFmode:
11126 1.1 mrg return true;
11127 1.1 mrg
11128 1.1 mrg default:
11129 1.1 mrg return false;
11130 1.1 mrg }
11131 1.1 mrg }
11132 1.1 mrg
11133 1.1 mrg /* Implement the FUNCTION_PROFILER macro. */
11134 1.1 mrg
11135 1.1 mrg void
11136 1.1 mrg ia64_output_function_profiler (FILE *file, int labelno)
11137 1.1 mrg {
11138 1.1 mrg bool indirect_call;
11139 1.1 mrg
11140 1.1 mrg /* If the function needs a static chain and the static chain
11141 1.1 mrg register is r15, we use an indirect call so as to bypass
11142 1.1 mrg the PLT stub in case the executable is dynamically linked,
11143 1.1 mrg because the stub clobbers r15 as per 5.3.6 of the psABI.
11144 1.1 mrg We don't need to do that in non canonical PIC mode. */
11145 1.1 mrg
11146 1.1 mrg if (cfun->static_chain_decl && !TARGET_NO_PIC && !TARGET_AUTO_PIC)
11147 1.1 mrg {
11148 1.1 mrg gcc_assert (STATIC_CHAIN_REGNUM == 15);
11149 1.1 mrg indirect_call = true;
11150 1.1 mrg }
11151 1.1 mrg else
11152 1.1 mrg indirect_call = false;
11153 1.1 mrg
11154 1.1 mrg if (TARGET_GNU_AS)
11155 1.1 mrg fputs ("\t.prologue 4, r40\n", file);
11156 1.1 mrg else
11157 1.1 mrg fputs ("\t.prologue\n\t.save ar.pfs, r40\n", file);
11158 1.1 mrg fputs ("\talloc out0 = ar.pfs, 8, 0, 4, 0\n", file);
11159 1.1 mrg
11160 1.1 mrg if (NO_PROFILE_COUNTERS)
11161 1.1 mrg fputs ("\tmov out3 = r0\n", file);
11162 1.1 mrg else
11163 1.1 mrg {
11164 1.1 mrg char buf[20];
11165 1.1 mrg ASM_GENERATE_INTERNAL_LABEL (buf, "LP", labelno);
11166 1.1 mrg
11167 1.1 mrg if (TARGET_AUTO_PIC)
11168 1.1 mrg fputs ("\tmovl out3 = @gprel(", file);
11169 1.1 mrg else
11170 1.1 mrg fputs ("\taddl out3 = @ltoff(", file);
11171 1.1 mrg assemble_name (file, buf);
11172 1.1 mrg if (TARGET_AUTO_PIC)
11173 1.1 mrg fputs (")\n", file);
11174 1.1 mrg else
11175 1.1 mrg fputs ("), r1\n", file);
11176 1.1 mrg }
11177 1.1 mrg
11178 1.1 mrg if (indirect_call)
11179 1.1 mrg fputs ("\taddl r14 = @ltoff(@fptr(_mcount)), r1\n", file);
11180 1.1 mrg fputs ("\t;;\n", file);
11181 1.1 mrg
11182 1.1 mrg fputs ("\t.save rp, r42\n", file);
11183 1.1 mrg fputs ("\tmov out2 = b0\n", file);
11184 1.1 mrg if (indirect_call)
11185 1.1 mrg fputs ("\tld8 r14 = [r14]\n\t;;\n", file);
11186 1.1 mrg fputs ("\t.body\n", file);
11187 1.1 mrg fputs ("\tmov out1 = r1\n", file);
11188 1.1 mrg if (indirect_call)
11189 1.1 mrg {
11190 1.1 mrg fputs ("\tld8 r16 = [r14], 8\n\t;;\n", file);
11191 1.1 mrg fputs ("\tmov b6 = r16\n", file);
11192 1.1 mrg fputs ("\tld8 r1 = [r14]\n", file);
11193 1.1 mrg fputs ("\tbr.call.sptk.many b0 = b6\n\t;;\n", file);
11194 1.1 mrg }
11195 1.1 mrg else
11196 1.1 mrg fputs ("\tbr.call.sptk.many b0 = _mcount\n\t;;\n", file);
11197 1.1 mrg }
11198 1.1 mrg
11199 1.1 mrg static GTY(()) rtx mcount_func_rtx;
11200 1.1 mrg static rtx
11201 1.1 mrg gen_mcount_func_rtx (void)
11202 1.1 mrg {
11203 1.1 mrg if (!mcount_func_rtx)
11204 1.1 mrg mcount_func_rtx = init_one_libfunc ("_mcount");
11205 1.1 mrg return mcount_func_rtx;
11206 1.1 mrg }
11207 1.1 mrg
11208 1.1 mrg void
11209 1.1 mrg ia64_profile_hook (int labelno)
11210 1.1 mrg {
11211 1.1 mrg rtx label, ip;
11212 1.1 mrg
11213 1.1 mrg if (NO_PROFILE_COUNTERS)
11214 1.1 mrg label = const0_rtx;
11215 1.1 mrg else
11216 1.1 mrg {
11217 1.1 mrg char buf[30];
11218 1.1 mrg const char *label_name;
11219 1.1 mrg ASM_GENERATE_INTERNAL_LABEL (buf, "LP", labelno);
11220 1.1 mrg label_name = ggc_strdup ((*targetm.strip_name_encoding) (buf));
11221 1.1 mrg label = gen_rtx_SYMBOL_REF (Pmode, label_name);
11222 1.1 mrg SYMBOL_REF_FLAGS (label) = SYMBOL_FLAG_LOCAL;
11223 1.1 mrg }
11224 1.1 mrg ip = gen_reg_rtx (Pmode);
11225 1.1 mrg emit_insn (gen_ip_value (ip));
11226 1.1 mrg emit_library_call (gen_mcount_func_rtx (), LCT_NORMAL,
11227 1.1 mrg VOIDmode,
11228 1.1 mrg gen_rtx_REG (Pmode, BR_REG (0)), Pmode,
11229 1.1 mrg ip, Pmode,
11230 1.1 mrg label, Pmode);
11231 1.1 mrg }
11232 1.1 mrg
11233 1.1 mrg /* Return the mangling of TYPE if it is an extended fundamental type. */
11234 1.1 mrg
11235 1.1 mrg static const char *
11236 1.1 mrg ia64_mangle_type (const_tree type)
11237 1.1 mrg {
11238 1.1 mrg type = TYPE_MAIN_VARIANT (type);
11239 1.1 mrg
11240 1.1 mrg if (TREE_CODE (type) != VOID_TYPE && TREE_CODE (type) != BOOLEAN_TYPE
11241 1.1 mrg && TREE_CODE (type) != INTEGER_TYPE && TREE_CODE (type) != REAL_TYPE)
11242 1.1 mrg return NULL;
11243 1.1 mrg
11244 1.1 mrg /* On HP-UX, "long double" is mangled as "e" so __float128 is
11245 1.1 mrg mangled as "e". */
11246 1.1 mrg if (!TARGET_HPUX && TYPE_MODE (type) == TFmode)
11247 1.1 mrg return "g";
11248 1.1 mrg /* On HP-UX, "e" is not available as a mangling of __float80 so use
11249 1.1 mrg an extended mangling. Elsewhere, "e" is available since long
11250 1.1 mrg double is 80 bits. */
11251 1.1 mrg if (TYPE_MODE (type) == XFmode)
11252 1.1 mrg return TARGET_HPUX ? "u9__float80" : "e";
11253 1.1 mrg if (TYPE_MODE (type) == RFmode)
11254 1.1 mrg return "u7__fpreg";
11255 1.1 mrg return NULL;
11256 1.1 mrg }
11257 1.1 mrg
11258 1.1 mrg /* Return the diagnostic message string if conversion from FROMTYPE to
11259 1.1 mrg TOTYPE is not allowed, NULL otherwise. */
11260 1.1 mrg static const char *
11261 1.1 mrg ia64_invalid_conversion (const_tree fromtype, const_tree totype)
11262 1.1 mrg {
11263 1.1 mrg /* Reject nontrivial conversion to or from __fpreg. */
11264 1.1 mrg if (TYPE_MODE (fromtype) == RFmode
11265 1.1 mrg && TYPE_MODE (totype) != RFmode
11266 1.1 mrg && TYPE_MODE (totype) != VOIDmode)
11267 1.1 mrg return N_("invalid conversion from %<__fpreg%>");
11268 1.1 mrg if (TYPE_MODE (totype) == RFmode
11269 1.1 mrg && TYPE_MODE (fromtype) != RFmode)
11270 1.1 mrg return N_("invalid conversion to %<__fpreg%>");
11271 1.1 mrg return NULL;
11272 1.1 mrg }
11273 1.1 mrg
11274 1.1 mrg /* Return the diagnostic message string if the unary operation OP is
11275 1.1 mrg not permitted on TYPE, NULL otherwise. */
11276 1.1 mrg static const char *
11277 1.1 mrg ia64_invalid_unary_op (int op, const_tree type)
11278 1.1 mrg {
11279 1.1 mrg /* Reject operations on __fpreg other than unary + or &. */
11280 1.1 mrg if (TYPE_MODE (type) == RFmode
11281 1.1 mrg && op != CONVERT_EXPR
11282 1.1 mrg && op != ADDR_EXPR)
11283 1.1 mrg return N_("invalid operation on %<__fpreg%>");
11284 1.1 mrg return NULL;
11285 1.1 mrg }
11286 1.1 mrg
11287 1.1 mrg /* Return the diagnostic message string if the binary operation OP is
11288 1.1 mrg not permitted on TYPE1 and TYPE2, NULL otherwise. */
11289 1.1 mrg static const char *
11290 1.1 mrg ia64_invalid_binary_op (int op ATTRIBUTE_UNUSED, const_tree type1, const_tree type2)
11291 1.1 mrg {
11292 1.1 mrg /* Reject operations on __fpreg. */
11293 1.1 mrg if (TYPE_MODE (type1) == RFmode || TYPE_MODE (type2) == RFmode)
11294 1.1 mrg return N_("invalid operation on %<__fpreg%>");
11295 1.1 mrg return NULL;
11296 1.1 mrg }
11297 1.1 mrg
11298 1.1 mrg /* HP-UX version_id attribute.
11299 1.1 mrg For object foo, if the version_id is set to 1234 put out an alias
11300 1.1 mrg of '.alias foo "foo{1234}" We can't use "foo{1234}" in anything
11301 1.1 mrg other than an alias statement because it is an illegal symbol name. */
11302 1.1 mrg
11303 1.1 mrg static tree
11304 1.1 mrg ia64_handle_version_id_attribute (tree *node ATTRIBUTE_UNUSED,
11305 1.1 mrg tree name ATTRIBUTE_UNUSED,
11306 1.1 mrg tree args,
11307 1.1 mrg int flags ATTRIBUTE_UNUSED,
11308 1.1 mrg bool *no_add_attrs)
11309 1.1 mrg {
11310 1.1 mrg tree arg = TREE_VALUE (args);
11311 1.1 mrg
11312 1.1 mrg if (TREE_CODE (arg) != STRING_CST)
11313 1.1 mrg {
11314 1.1 mrg error("version attribute is not a string");
11315 1.1 mrg *no_add_attrs = true;
11316 1.1 mrg return NULL_TREE;
11317 1.1 mrg }
11318 1.1 mrg return NULL_TREE;
11319 1.1 mrg }
11320 1.1 mrg
11321 1.1 mrg /* Target hook for c_mode_for_suffix. */
11322 1.1 mrg
11323 1.1 mrg static machine_mode
11324 1.1 mrg ia64_c_mode_for_suffix (char suffix)
11325 1.1 mrg {
11326 1.1 mrg if (suffix == 'q')
11327 1.1 mrg return TFmode;
11328 1.1 mrg if (suffix == 'w')
11329 1.1 mrg return XFmode;
11330 1.1 mrg
11331 1.1 mrg return VOIDmode;
11332 1.1 mrg }
11333 1.1 mrg
11334 1.1 mrg static GTY(()) rtx ia64_dconst_0_5_rtx;
11335 1.1 mrg
11336 1.1 mrg rtx
11337 1.1 mrg ia64_dconst_0_5 (void)
11338 1.1 mrg {
11339 1.1 mrg if (! ia64_dconst_0_5_rtx)
11340 1.1 mrg {
11341 1.1 mrg REAL_VALUE_TYPE rv;
11342 1.1 mrg real_from_string (&rv, "0.5");
11343 1.1 mrg ia64_dconst_0_5_rtx = const_double_from_real_value (rv, DFmode);
11344 1.1 mrg }
11345 1.1 mrg return ia64_dconst_0_5_rtx;
11346 1.1 mrg }
11347 1.1 mrg
11348 1.1 mrg static GTY(()) rtx ia64_dconst_0_375_rtx;
11349 1.1 mrg
11350 1.1 mrg rtx
11351 1.1 mrg ia64_dconst_0_375 (void)
11352 1.1 mrg {
11353 1.1 mrg if (! ia64_dconst_0_375_rtx)
11354 1.1 mrg {
11355 1.1 mrg REAL_VALUE_TYPE rv;
11356 1.1 mrg real_from_string (&rv, "0.375");
11357 1.1 mrg ia64_dconst_0_375_rtx = const_double_from_real_value (rv, DFmode);
11358 1.1 mrg }
11359 1.1 mrg return ia64_dconst_0_375_rtx;
11360 1.1 mrg }
11361 1.1 mrg
11362 1.1 mrg static fixed_size_mode
11363 1.1 mrg ia64_get_reg_raw_mode (int regno)
11364 1.1 mrg {
11365 1.1 mrg if (FR_REGNO_P (regno))
11366 1.1 mrg return XFmode;
11367 1.1 mrg return default_get_reg_raw_mode(regno);
11368 1.1 mrg }
11369 1.1 mrg
11370 1.1 mrg /* Implement TARGET_MEMBER_TYPE_FORCES_BLK. ??? Might not be needed
11371 1.1 mrg anymore. */
11372 1.1 mrg
11373 1.1 mrg bool
11374 1.1 mrg ia64_member_type_forces_blk (const_tree, machine_mode mode)
11375 1.1 mrg {
11376 1.1 mrg return TARGET_HPUX && mode == TFmode;
11377 1.1 mrg }
11378 1.1 mrg
11379 1.1 mrg /* Always default to .text section until HP-UX linker is fixed. */
11380 1.1 mrg
11381 1.1 mrg ATTRIBUTE_UNUSED static section *
11382 1.1 mrg ia64_hpux_function_section (tree decl ATTRIBUTE_UNUSED,
11383 1.1 mrg enum node_frequency freq ATTRIBUTE_UNUSED,
11384 1.1 mrg bool startup ATTRIBUTE_UNUSED,
11385 1.1 mrg bool exit ATTRIBUTE_UNUSED)
11386 1.1 mrg {
11387 1.1 mrg return NULL;
11388 1.1 mrg }
11389 1.1 mrg
11390 1.1 mrg /* Construct (set target (vec_select op0 (parallel perm))) and
11392 1.1 mrg return true if that's a valid instruction in the active ISA. */
11393 1.1 mrg
11394 1.1 mrg static bool
11395 1.1 mrg expand_vselect (rtx target, rtx op0, const unsigned char *perm, unsigned nelt)
11396 1.1 mrg {
11397 1.1 mrg rtx rperm[MAX_VECT_LEN], x;
11398 1.1 mrg unsigned i;
11399 1.1 mrg
11400 1.1 mrg for (i = 0; i < nelt; ++i)
11401 1.1 mrg rperm[i] = GEN_INT (perm[i]);
11402 1.1 mrg
11403 1.1 mrg x = gen_rtx_PARALLEL (VOIDmode, gen_rtvec_v (nelt, rperm));
11404 1.1 mrg x = gen_rtx_VEC_SELECT (GET_MODE (target), op0, x);
11405 1.1 mrg x = gen_rtx_SET (target, x);
11406 1.1 mrg
11407 1.1 mrg rtx_insn *insn = emit_insn (x);
11408 1.1 mrg if (recog_memoized (insn) < 0)
11409 1.1 mrg {
11410 1.1 mrg remove_insn (insn);
11411 1.1 mrg return false;
11412 1.1 mrg }
11413 1.1 mrg return true;
11414 1.1 mrg }
11415 1.1 mrg
11416 1.1 mrg /* Similar, but generate a vec_concat from op0 and op1 as well. */
11417 1.1 mrg
11418 1.1 mrg static bool
11419 1.1 mrg expand_vselect_vconcat (rtx target, rtx op0, rtx op1,
11420 1.1 mrg const unsigned char *perm, unsigned nelt)
11421 1.1 mrg {
11422 1.1 mrg machine_mode v2mode;
11423 1.1 mrg rtx x;
11424 1.1 mrg
11425 1.1 mrg if (!GET_MODE_2XWIDER_MODE (GET_MODE (op0)).exists (&v2mode))
11426 1.1 mrg return false;
11427 1.1 mrg x = gen_rtx_VEC_CONCAT (v2mode, op0, op1);
11428 1.1 mrg return expand_vselect (target, x, perm, nelt);
11429 1.1 mrg }
11430 1.1 mrg
11431 1.1 mrg /* Try to expand a no-op permutation. */
11432 1.1 mrg
11433 1.1 mrg static bool
11434 1.1 mrg expand_vec_perm_identity (struct expand_vec_perm_d *d)
11435 1.1 mrg {
11436 1.1 mrg unsigned i, nelt = d->nelt;
11437 1.1 mrg
11438 1.1 mrg for (i = 0; i < nelt; ++i)
11439 1.1 mrg if (d->perm[i] != i)
11440 1.1 mrg return false;
11441 1.1 mrg
11442 1.1 mrg if (!d->testing_p)
11443 1.1 mrg emit_move_insn (d->target, d->op0);
11444 1.1 mrg
11445 1.1 mrg return true;
11446 1.1 mrg }
11447 1.1 mrg
11448 1.1 mrg /* Try to expand D via a shrp instruction. */
11449 1.1 mrg
11450 1.1 mrg static bool
11451 1.1 mrg expand_vec_perm_shrp (struct expand_vec_perm_d *d)
11452 1.1 mrg {
11453 1.1 mrg unsigned i, nelt = d->nelt, shift, mask;
11454 1.1 mrg rtx tmp, hi, lo;
11455 1.1 mrg
11456 1.1 mrg /* ??? Don't force V2SFmode into the integer registers. */
11457 1.1 mrg if (d->vmode == V2SFmode)
11458 1.1 mrg return false;
11459 1.1 mrg
11460 1.1 mrg mask = (d->one_operand_p ? nelt - 1 : 2 * nelt - 1);
11461 1.1 mrg
11462 1.1 mrg shift = d->perm[0];
11463 1.1 mrg if (BYTES_BIG_ENDIAN && shift > nelt)
11464 1.1 mrg return false;
11465 1.1 mrg
11466 1.1 mrg for (i = 1; i < nelt; ++i)
11467 1.1 mrg if (d->perm[i] != ((shift + i) & mask))
11468 1.1 mrg return false;
11469 1.1 mrg
11470 1.1 mrg if (d->testing_p)
11471 1.1 mrg return true;
11472 1.1 mrg
11473 1.1 mrg hi = shift < nelt ? d->op1 : d->op0;
11474 1.1 mrg lo = shift < nelt ? d->op0 : d->op1;
11475 1.1 mrg
11476 1.1 mrg shift %= nelt;
11477 1.1 mrg
11478 1.1 mrg shift *= GET_MODE_UNIT_SIZE (d->vmode) * BITS_PER_UNIT;
11479 1.1 mrg
11480 1.1 mrg /* We've eliminated the shift 0 case via expand_vec_perm_identity. */
11481 1.1 mrg gcc_assert (IN_RANGE (shift, 1, 63));
11482 1.1 mrg
11483 1.1 mrg /* Recall that big-endian elements are numbered starting at the top of
11484 1.1 mrg the register. Ideally we'd have a shift-left-pair. But since we
11485 1.1 mrg don't, convert to a shift the other direction. */
11486 1.1 mrg if (BYTES_BIG_ENDIAN)
11487 1.1 mrg shift = 64 - shift;
11488 1.1 mrg
11489 1.1 mrg tmp = gen_reg_rtx (DImode);
11490 1.1 mrg hi = gen_lowpart (DImode, hi);
11491 1.1 mrg lo = gen_lowpart (DImode, lo);
11492 1.1 mrg emit_insn (gen_shrp (tmp, hi, lo, GEN_INT (shift)));
11493 1.1 mrg
11494 1.1 mrg emit_move_insn (d->target, gen_lowpart (d->vmode, tmp));
11495 1.1 mrg return true;
11496 1.1 mrg }
11497 1.1 mrg
11498 1.1 mrg /* Try to instantiate D in a single instruction. */
11499 1.1 mrg
11500 1.1 mrg static bool
11501 1.1 mrg expand_vec_perm_1 (struct expand_vec_perm_d *d)
11502 1.1 mrg {
11503 1.1 mrg unsigned i, nelt = d->nelt;
11504 1.1 mrg unsigned char perm2[MAX_VECT_LEN];
11505 1.1 mrg
11506 1.1 mrg /* Try single-operand selections. */
11507 1.1 mrg if (d->one_operand_p)
11508 1.1 mrg {
11509 1.1 mrg if (expand_vec_perm_identity (d))
11510 1.1 mrg return true;
11511 1.1 mrg if (expand_vselect (d->target, d->op0, d->perm, nelt))
11512 1.1 mrg return true;
11513 1.1 mrg }
11514 1.1 mrg
11515 1.1 mrg /* Try two operand selections. */
11516 1.1 mrg if (expand_vselect_vconcat (d->target, d->op0, d->op1, d->perm, nelt))
11517 1.1 mrg return true;
11518 1.1 mrg
11519 1.1 mrg /* Recognize interleave style patterns with reversed operands. */
11520 1.1 mrg if (!d->one_operand_p)
11521 1.1 mrg {
11522 1.1 mrg for (i = 0; i < nelt; ++i)
11523 1.1 mrg {
11524 1.1 mrg unsigned e = d->perm[i];
11525 1.1 mrg if (e >= nelt)
11526 1.1 mrg e -= nelt;
11527 1.1 mrg else
11528 1.1 mrg e += nelt;
11529 1.1 mrg perm2[i] = e;
11530 1.1 mrg }
11531 1.1 mrg
11532 1.1 mrg if (expand_vselect_vconcat (d->target, d->op1, d->op0, perm2, nelt))
11533 1.1 mrg return true;
11534 1.1 mrg }
11535 1.1 mrg
11536 1.1 mrg if (expand_vec_perm_shrp (d))
11537 1.1 mrg return true;
11538 1.1 mrg
11539 1.1 mrg /* ??? Look for deposit-like permutations where most of the result
11540 1.1 mrg comes from one vector unchanged and the rest comes from a
11541 1.1 mrg sequential hunk of the other vector. */
11542 1.1 mrg
11543 1.1 mrg return false;
11544 1.1 mrg }
11545 1.1 mrg
11546 1.1 mrg /* Pattern match broadcast permutations. */
11547 1.1 mrg
11548 1.1 mrg static bool
11549 1.1 mrg expand_vec_perm_broadcast (struct expand_vec_perm_d *d)
11550 1.1 mrg {
11551 1.1 mrg unsigned i, elt, nelt = d->nelt;
11552 1.1 mrg unsigned char perm2[2];
11553 1.1 mrg rtx temp;
11554 1.1 mrg bool ok;
11555 1.1 mrg
11556 1.1 mrg if (!d->one_operand_p)
11557 1.1 mrg return false;
11558 1.1 mrg
11559 1.1 mrg elt = d->perm[0];
11560 1.1 mrg for (i = 1; i < nelt; ++i)
11561 1.1 mrg if (d->perm[i] != elt)
11562 1.1 mrg return false;
11563 1.1 mrg
11564 1.1 mrg switch (d->vmode)
11565 1.1 mrg {
11566 1.1 mrg case E_V2SImode:
11567 1.1 mrg case E_V2SFmode:
11568 1.1 mrg /* Implementable by interleave. */
11569 1.1 mrg perm2[0] = elt;
11570 1.1 mrg perm2[1] = elt + 2;
11571 1.1 mrg ok = expand_vselect_vconcat (d->target, d->op0, d->op0, perm2, 2);
11572 1.1 mrg gcc_assert (ok);
11573 1.1 mrg break;
11574 1.1 mrg
11575 1.1 mrg case E_V8QImode:
11576 1.1 mrg /* Implementable by extract + broadcast. */
11577 1.1 mrg if (BYTES_BIG_ENDIAN)
11578 1.1 mrg elt = 7 - elt;
11579 1.1 mrg elt *= BITS_PER_UNIT;
11580 1.1 mrg temp = gen_reg_rtx (DImode);
11581 1.1 mrg emit_insn (gen_extzv (temp, gen_lowpart (DImode, d->op0),
11582 1.1 mrg GEN_INT (8), GEN_INT (elt)));
11583 1.1 mrg emit_insn (gen_mux1_brcst_qi (d->target, gen_lowpart (QImode, temp)));
11584 1.1 mrg break;
11585 1.1 mrg
11586 1.1 mrg case E_V4HImode:
11587 1.1 mrg /* Should have been matched directly by vec_select. */
11588 1.1 mrg default:
11589 1.1 mrg gcc_unreachable ();
11590 1.1 mrg }
11591 1.1 mrg
11592 1.1 mrg return true;
11593 1.1 mrg }
11594 1.1 mrg
11595 1.1 mrg /* A subroutine of ia64_expand_vec_perm_const_1. Try to simplify a
11596 1.1 mrg two vector permutation into a single vector permutation by using
11597 1.1 mrg an interleave operation to merge the vectors. */
11598 1.1 mrg
11599 1.1 mrg static bool
11600 1.1 mrg expand_vec_perm_interleave_2 (struct expand_vec_perm_d *d)
11601 1.1 mrg {
11602 1.1 mrg struct expand_vec_perm_d dremap, dfinal;
11603 1.1 mrg unsigned char remap[2 * MAX_VECT_LEN];
11604 1.1 mrg unsigned contents, i, nelt, nelt2;
11605 1.1 mrg unsigned h0, h1, h2, h3;
11606 1.1 mrg rtx_insn *seq;
11607 1.1 mrg bool ok;
11608 1.1 mrg
11609 1.1 mrg if (d->one_operand_p)
11610 1.1 mrg return false;
11611 1.1 mrg
11612 1.1 mrg nelt = d->nelt;
11613 1.1 mrg nelt2 = nelt / 2;
11614 1.1 mrg
11615 1.1 mrg /* Examine from whence the elements come. */
11616 1.1 mrg contents = 0;
11617 1.1 mrg for (i = 0; i < nelt; ++i)
11618 1.1 mrg contents |= 1u << d->perm[i];
11619 1.1 mrg
11620 1.1 mrg memset (remap, 0xff, sizeof (remap));
11621 1.1 mrg dremap = *d;
11622 1.1 mrg
11623 1.1 mrg h0 = (1u << nelt2) - 1;
11624 1.1 mrg h1 = h0 << nelt2;
11625 1.1 mrg h2 = h0 << nelt;
11626 1.1 mrg h3 = h0 << (nelt + nelt2);
11627 1.1 mrg
11628 1.1 mrg if ((contents & (h0 | h2)) == contents) /* punpck even halves */
11629 1.1 mrg {
11630 1.1 mrg for (i = 0; i < nelt; ++i)
11631 1.1 mrg {
11632 1.1 mrg unsigned which = i / 2 + (i & 1 ? nelt : 0);
11633 1.1 mrg remap[which] = i;
11634 1.1 mrg dremap.perm[i] = which;
11635 1.1 mrg }
11636 1.1 mrg }
11637 1.1 mrg else if ((contents & (h1 | h3)) == contents) /* punpck odd halves */
11638 1.1 mrg {
11639 1.1 mrg for (i = 0; i < nelt; ++i)
11640 1.1 mrg {
11641 1.1 mrg unsigned which = i / 2 + nelt2 + (i & 1 ? nelt : 0);
11642 1.1 mrg remap[which] = i;
11643 1.1 mrg dremap.perm[i] = which;
11644 1.1 mrg }
11645 1.1 mrg }
11646 1.1 mrg else if ((contents & 0x5555) == contents) /* mix even elements */
11647 1.1 mrg {
11648 1.1 mrg for (i = 0; i < nelt; ++i)
11649 1.1 mrg {
11650 1.1 mrg unsigned which = (i & ~1) + (i & 1 ? nelt : 0);
11651 1.1 mrg remap[which] = i;
11652 1.1 mrg dremap.perm[i] = which;
11653 1.1 mrg }
11654 1.1 mrg }
11655 1.1 mrg else if ((contents & 0xaaaa) == contents) /* mix odd elements */
11656 1.1 mrg {
11657 1.1 mrg for (i = 0; i < nelt; ++i)
11658 1.1 mrg {
11659 1.1 mrg unsigned which = (i | 1) + (i & 1 ? nelt : 0);
11660 1.1 mrg remap[which] = i;
11661 1.1 mrg dremap.perm[i] = which;
11662 1.1 mrg }
11663 1.1 mrg }
11664 1.1 mrg else if (floor_log2 (contents) - ctz_hwi (contents) < (int)nelt) /* shrp */
11665 1.1 mrg {
11666 1.1 mrg unsigned shift = ctz_hwi (contents);
11667 1.1 mrg for (i = 0; i < nelt; ++i)
11668 1.1 mrg {
11669 1.1 mrg unsigned which = (i + shift) & (2 * nelt - 1);
11670 1.1 mrg remap[which] = i;
11671 1.1 mrg dremap.perm[i] = which;
11672 1.1 mrg }
11673 1.1 mrg }
11674 1.1 mrg else
11675 1.1 mrg return false;
11676 1.1 mrg
11677 1.1 mrg /* Use the remapping array set up above to move the elements from their
11678 1.1 mrg swizzled locations into their final destinations. */
11679 1.1 mrg dfinal = *d;
11680 1.1 mrg for (i = 0; i < nelt; ++i)
11681 1.1 mrg {
11682 1.1 mrg unsigned e = remap[d->perm[i]];
11683 1.1 mrg gcc_assert (e < nelt);
11684 1.1 mrg dfinal.perm[i] = e;
11685 1.1 mrg }
11686 1.1 mrg if (d->testing_p)
11687 1.1 mrg dfinal.op0 = gen_raw_REG (dfinal.vmode, LAST_VIRTUAL_REGISTER + 1);
11688 1.1 mrg else
11689 1.1 mrg dfinal.op0 = gen_reg_rtx (dfinal.vmode);
11690 1.1 mrg dfinal.op1 = dfinal.op0;
11691 1.1 mrg dfinal.one_operand_p = true;
11692 1.1 mrg dremap.target = dfinal.op0;
11693 1.1 mrg
11694 1.1 mrg /* Test if the final remap can be done with a single insn. For V4HImode
11695 1.1 mrg this *will* succeed. For V8QImode or V2SImode it may not. */
11696 1.1 mrg start_sequence ();
11697 1.1 mrg ok = expand_vec_perm_1 (&dfinal);
11698 1.1 mrg seq = get_insns ();
11699 1.1 mrg end_sequence ();
11700 1.1 mrg if (!ok)
11701 1.1 mrg return false;
11702 1.1 mrg if (d->testing_p)
11703 1.1 mrg return true;
11704 1.1 mrg
11705 1.1 mrg ok = expand_vec_perm_1 (&dremap);
11706 1.1 mrg gcc_assert (ok);
11707 1.1 mrg
11708 1.1 mrg emit_insn (seq);
11709 1.1 mrg return true;
11710 1.1 mrg }
11711 1.1 mrg
11712 1.1 mrg /* A subroutine of ia64_expand_vec_perm_const_1. Emit a full V4HImode
11713 1.1 mrg constant permutation via two mux2 and a merge. */
11714 1.1 mrg
11715 1.1 mrg static bool
11716 1.1 mrg expand_vec_perm_v4hi_5 (struct expand_vec_perm_d *d)
11717 1.1 mrg {
11718 1.1 mrg unsigned char perm2[4];
11719 1.1 mrg rtx rmask[4];
11720 1.1 mrg unsigned i;
11721 1.1 mrg rtx t0, t1, mask, x;
11722 1.1 mrg bool ok;
11723 1.1 mrg
11724 1.1 mrg if (d->vmode != V4HImode || d->one_operand_p)
11725 1.1 mrg return false;
11726 1.1 mrg if (d->testing_p)
11727 1.1 mrg return true;
11728 1.1 mrg
11729 1.1 mrg for (i = 0; i < 4; ++i)
11730 1.1 mrg {
11731 1.1 mrg perm2[i] = d->perm[i] & 3;
11732 1.1 mrg rmask[i] = (d->perm[i] & 4 ? const0_rtx : constm1_rtx);
11733 1.1 mrg }
11734 1.1 mrg mask = gen_rtx_CONST_VECTOR (V4HImode, gen_rtvec_v (4, rmask));
11735 1.1 mrg mask = force_reg (V4HImode, mask);
11736 1.1 mrg
11737 1.1 mrg t0 = gen_reg_rtx (V4HImode);
11738 1.1 mrg t1 = gen_reg_rtx (V4HImode);
11739 1.1 mrg
11740 1.1 mrg ok = expand_vselect (t0, d->op0, perm2, 4);
11741 1.1 mrg gcc_assert (ok);
11742 1.1 mrg ok = expand_vselect (t1, d->op1, perm2, 4);
11743 1.1 mrg gcc_assert (ok);
11744 1.1 mrg
11745 1.1 mrg x = gen_rtx_AND (V4HImode, mask, t0);
11746 1.1 mrg emit_insn (gen_rtx_SET (t0, x));
11747 1.1 mrg
11748 1.1 mrg x = gen_rtx_NOT (V4HImode, mask);
11749 1.1 mrg x = gen_rtx_AND (V4HImode, x, t1);
11750 1.1 mrg emit_insn (gen_rtx_SET (t1, x));
11751 1.1 mrg
11752 1.1 mrg x = gen_rtx_IOR (V4HImode, t0, t1);
11753 1.1 mrg emit_insn (gen_rtx_SET (d->target, x));
11754 1.1 mrg
11755 1.1 mrg return true;
11756 1.1 mrg }
11757 1.1 mrg
11758 1.1 mrg /* The guts of ia64_expand_vec_perm_const, also used by the ok hook.
11759 1.1 mrg With all of the interface bits taken care of, perform the expansion
11760 1.1 mrg in D and return true on success. */
11761 1.1 mrg
11762 1.1 mrg static bool
11763 1.1 mrg ia64_expand_vec_perm_const_1 (struct expand_vec_perm_d *d)
11764 1.1 mrg {
11765 1.1 mrg if (expand_vec_perm_1 (d))
11766 1.1 mrg return true;
11767 1.1 mrg if (expand_vec_perm_broadcast (d))
11768 1.1 mrg return true;
11769 1.1 mrg if (expand_vec_perm_interleave_2 (d))
11770 1.1 mrg return true;
11771 1.1 mrg if (expand_vec_perm_v4hi_5 (d))
11772 1.1 mrg return true;
11773 1.1 mrg return false;
11774 1.1 mrg }
11775 1.1 mrg
11776 1.1 mrg /* Implement TARGET_VECTORIZE_VEC_PERM_CONST. */
11777 1.1 mrg
11778 1.1 mrg static bool
11779 1.1 mrg ia64_vectorize_vec_perm_const (machine_mode vmode, rtx target, rtx op0,
11780 1.1 mrg rtx op1, const vec_perm_indices &sel)
11781 1.1 mrg {
11782 1.1 mrg struct expand_vec_perm_d d;
11783 1.1 mrg unsigned char perm[MAX_VECT_LEN];
11784 1.1 mrg unsigned int i, nelt, which;
11785 1.1 mrg
11786 1.1 mrg d.target = target;
11787 1.1 mrg if (op0)
11788 1.1 mrg {
11789 1.1 mrg rtx nop0 = force_reg (vmode, op0);
11790 1.1 mrg if (op0 == op1)
11791 1.1 mrg op1 = nop0;
11792 1.1 mrg op0 = nop0;
11793 1.1 mrg }
11794 1.1 mrg if (op1)
11795 1.1 mrg op1 = force_reg (vmode, op1);
11796 1.1 mrg d.op0 = op0;
11797 1.1 mrg d.op1 = op1;
11798 1.1 mrg
11799 1.1 mrg d.vmode = vmode;
11800 1.1 mrg gcc_assert (VECTOR_MODE_P (d.vmode));
11801 1.1 mrg d.nelt = nelt = GET_MODE_NUNITS (d.vmode);
11802 1.1 mrg d.testing_p = !target;
11803 1.1 mrg
11804 1.1 mrg gcc_assert (sel.length () == nelt);
11805 1.1 mrg gcc_checking_assert (sizeof (d.perm) == sizeof (perm));
11806 1.1 mrg
11807 1.1 mrg for (i = which = 0; i < nelt; ++i)
11808 1.1 mrg {
11809 1.1 mrg unsigned int ei = sel[i] & (2 * nelt - 1);
11810 1.1 mrg
11811 1.1 mrg which |= (ei < nelt ? 1 : 2);
11812 1.1 mrg d.perm[i] = ei;
11813 1.1 mrg perm[i] = ei;
11814 1.1 mrg }
11815 1.1 mrg
11816 1.1 mrg switch (which)
11817 1.1 mrg {
11818 1.1 mrg default:
11819 1.1 mrg gcc_unreachable();
11820 1.1 mrg
11821 1.1 mrg case 3:
11822 1.1 mrg if (d.testing_p || !rtx_equal_p (d.op0, d.op1))
11823 1.1 mrg {
11824 1.1 mrg d.one_operand_p = false;
11825 1.1 mrg break;
11826 1.1 mrg }
11827 1.1 mrg
11828 1.1 mrg /* The elements of PERM do not suggest that only the first operand
11829 1.1 mrg is used, but both operands are identical. Allow easier matching
11830 1.1 mrg of the permutation by folding the permutation into the single
11831 1.1 mrg input vector. */
11832 1.1 mrg for (i = 0; i < nelt; ++i)
11833 1.1 mrg if (d.perm[i] >= nelt)
11834 1.1 mrg d.perm[i] -= nelt;
11835 1.1 mrg /* FALLTHRU */
11836 1.1 mrg
11837 1.1 mrg case 1:
11838 1.1 mrg d.op1 = d.op0;
11839 1.1 mrg d.one_operand_p = true;
11840 1.1 mrg break;
11841 1.1 mrg
11842 1.1 mrg case 2:
11843 1.1 mrg for (i = 0; i < nelt; ++i)
11844 1.1 mrg d.perm[i] -= nelt;
11845 1.1 mrg d.op0 = d.op1;
11846 1.1 mrg d.one_operand_p = true;
11847 1.1 mrg break;
11848 1.1 mrg }
11849 1.1 mrg
11850 1.1 mrg if (d.testing_p)
11851 1.1 mrg {
11852 1.1 mrg /* We have to go through the motions and see if we can
11853 1.1 mrg figure out how to generate the requested permutation. */
11854 1.1 mrg d.target = gen_raw_REG (d.vmode, LAST_VIRTUAL_REGISTER + 1);
11855 1.1 mrg d.op1 = d.op0 = gen_raw_REG (d.vmode, LAST_VIRTUAL_REGISTER + 2);
11856 1.1 mrg if (!d.one_operand_p)
11857 1.1 mrg d.op1 = gen_raw_REG (d.vmode, LAST_VIRTUAL_REGISTER + 3);
11858 1.1 mrg
11859 1.1 mrg start_sequence ();
11860 1.1 mrg bool ret = ia64_expand_vec_perm_const_1 (&d);
11861 1.1 mrg end_sequence ();
11862 1.1 mrg
11863 1.1 mrg return ret;
11864 1.1 mrg }
11865 1.1 mrg
11866 1.1 mrg if (ia64_expand_vec_perm_const_1 (&d))
11867 1.1 mrg return true;
11868 1.1 mrg
11869 1.1 mrg /* If the mask says both arguments are needed, but they are the same,
11870 1.1 mrg the above tried to expand with one_operand_p true. If that didn't
11871 1.1 mrg work, retry with one_operand_p false, as that's what we used in _ok. */
11872 1.1 mrg if (which == 3 && d.one_operand_p)
11873 1.1 mrg {
11874 1.1 mrg memcpy (d.perm, perm, sizeof (perm));
11875 1.1 mrg d.one_operand_p = false;
11876 1.1 mrg return ia64_expand_vec_perm_const_1 (&d);
11877 1.1 mrg }
11878 1.1 mrg
11879 1.1 mrg return false;
11880 1.1 mrg }
11881 1.1 mrg
11882 1.1 mrg void
11883 1.1 mrg ia64_expand_vec_setv2sf (rtx operands[3])
11884 1.1 mrg {
11885 1.1 mrg struct expand_vec_perm_d d;
11886 1.1 mrg unsigned int which;
11887 1.1 mrg bool ok;
11888 1.1 mrg
11889 1.1 mrg d.target = operands[0];
11890 1.1 mrg d.op0 = operands[0];
11891 1.1 mrg d.op1 = gen_reg_rtx (V2SFmode);
11892 1.1 mrg d.vmode = V2SFmode;
11893 1.1 mrg d.nelt = 2;
11894 1.1 mrg d.one_operand_p = false;
11895 1.1 mrg d.testing_p = false;
11896 1.1 mrg
11897 1.1 mrg which = INTVAL (operands[2]);
11898 1.1 mrg gcc_assert (which <= 1);
11899 1.1 mrg d.perm[0] = 1 - which;
11900 1.1 mrg d.perm[1] = which + 2;
11901 1.1 mrg
11902 1.1 mrg emit_insn (gen_fpack (d.op1, operands[1], CONST0_RTX (SFmode)));
11903 1.1 mrg
11904 1.1 mrg ok = ia64_expand_vec_perm_const_1 (&d);
11905 1.1 mrg gcc_assert (ok);
11906 1.1 mrg }
11907 1.1 mrg
11908 1.1 mrg void
11909 1.1 mrg ia64_expand_vec_perm_even_odd (rtx target, rtx op0, rtx op1, int odd)
11910 1.1 mrg {
11911 1.1 mrg struct expand_vec_perm_d d;
11912 1.1 mrg machine_mode vmode = GET_MODE (target);
11913 1.1 mrg unsigned int i, nelt = GET_MODE_NUNITS (vmode);
11914 1.1 mrg bool ok;
11915 1.1 mrg
11916 1.1 mrg d.target = target;
11917 1.1 mrg d.op0 = op0;
11918 1.1 mrg d.op1 = op1;
11919 1.1 mrg d.vmode = vmode;
11920 1.1 mrg d.nelt = nelt;
11921 1.1 mrg d.one_operand_p = false;
11922 1.1 mrg d.testing_p = false;
11923 1.1 mrg
11924 for (i = 0; i < nelt; ++i)
11925 d.perm[i] = i * 2 + odd;
11926
11927 ok = ia64_expand_vec_perm_const_1 (&d);
11928 gcc_assert (ok);
11929 }
11930
11931 /* Implement TARGET_CAN_CHANGE_MODE_CLASS.
11932
11933 In BR regs, we can't change the DImode at all.
11934 In FP regs, we can't change FP values to integer values and vice versa,
11935 but we can change e.g. DImode to SImode, and V2SFmode into DImode. */
11936
11937 static bool
11938 ia64_can_change_mode_class (machine_mode from, machine_mode to,
11939 reg_class_t rclass)
11940 {
11941 if (reg_classes_intersect_p (rclass, BR_REGS))
11942 return from == to;
11943 if (SCALAR_FLOAT_MODE_P (from) != SCALAR_FLOAT_MODE_P (to))
11944 return !reg_classes_intersect_p (rclass, FR_REGS);
11945 return true;
11946 }
11947
11948 #include "gt-ia64.h"
11949