OSDN Git Service

PR other/30182
[pf3gnuchains/gcc-fork.git] / gcc / config / ia64 / ia64.c
1 /* Definitions of target machine for GNU compiler.
2    Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006
3    Free Software Foundation, Inc.
4    Contributed by James E. Wilson <wilson@cygnus.com> and
5                   David Mosberger <davidm@hpl.hp.com>.
6
7 This file is part of GCC.
8
9 GCC is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation; either version 2, or (at your option)
12 any later version.
13
14 GCC is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17 GNU General Public License for more details.
18
19 You should have received a copy of the GNU General Public License
20 along with GCC; see the file COPYING.  If not, write to
21 the Free Software Foundation, 51 Franklin Street, Fifth Floor,
22 Boston, MA 02110-1301, USA.  */
23
24 #include "config.h"
25 #include "system.h"
26 #include "coretypes.h"
27 #include "tm.h"
28 #include "rtl.h"
29 #include "tree.h"
30 #include "regs.h"
31 #include "hard-reg-set.h"
32 #include "real.h"
33 #include "insn-config.h"
34 #include "conditions.h"
35 #include "output.h"
36 #include "insn-attr.h"
37 #include "flags.h"
38 #include "recog.h"
39 #include "expr.h"
40 #include "optabs.h"
41 #include "except.h"
42 #include "function.h"
43 #include "ggc.h"
44 #include "basic-block.h"
45 #include "toplev.h"
46 #include "sched-int.h"
47 #include "timevar.h"
48 #include "target.h"
49 #include "target-def.h"
50 #include "tm_p.h"
51 #include "hashtab.h"
52 #include "langhooks.h"
53 #include "cfglayout.h"
54 #include "tree-gimple.h"
55 #include "intl.h"
56 #include "debug.h"
57 #include "params.h"
58
59 /* This is used for communication between ASM_OUTPUT_LABEL and
60    ASM_OUTPUT_LABELREF.  */
61 int ia64_asm_output_label = 0;
62
63 /* Define the information needed to generate branch and scc insns.  This is
64    stored from the compare operation.  */
65 struct rtx_def * ia64_compare_op0;
66 struct rtx_def * ia64_compare_op1;
67
68 /* Register names for ia64_expand_prologue.  */
69 static const char * const ia64_reg_numbers[96] =
70 { "r32", "r33", "r34", "r35", "r36", "r37", "r38", "r39",
71   "r40", "r41", "r42", "r43", "r44", "r45", "r46", "r47",
72   "r48", "r49", "r50", "r51", "r52", "r53", "r54", "r55",
73   "r56", "r57", "r58", "r59", "r60", "r61", "r62", "r63",
74   "r64", "r65", "r66", "r67", "r68", "r69", "r70", "r71",
75   "r72", "r73", "r74", "r75", "r76", "r77", "r78", "r79",
76   "r80", "r81", "r82", "r83", "r84", "r85", "r86", "r87",
77   "r88", "r89", "r90", "r91", "r92", "r93", "r94", "r95",
78   "r96", "r97", "r98", "r99", "r100","r101","r102","r103",
79   "r104","r105","r106","r107","r108","r109","r110","r111",
80   "r112","r113","r114","r115","r116","r117","r118","r119",
81   "r120","r121","r122","r123","r124","r125","r126","r127"};
82
83 /* ??? These strings could be shared with REGISTER_NAMES.  */
84 static const char * const ia64_input_reg_names[8] =
85 { "in0",  "in1",  "in2",  "in3",  "in4",  "in5",  "in6",  "in7" };
86
87 /* ??? These strings could be shared with REGISTER_NAMES.  */
88 static const char * const ia64_local_reg_names[80] =
89 { "loc0", "loc1", "loc2", "loc3", "loc4", "loc5", "loc6", "loc7",
90   "loc8", "loc9", "loc10","loc11","loc12","loc13","loc14","loc15",
91   "loc16","loc17","loc18","loc19","loc20","loc21","loc22","loc23",
92   "loc24","loc25","loc26","loc27","loc28","loc29","loc30","loc31",
93   "loc32","loc33","loc34","loc35","loc36","loc37","loc38","loc39",
94   "loc40","loc41","loc42","loc43","loc44","loc45","loc46","loc47",
95   "loc48","loc49","loc50","loc51","loc52","loc53","loc54","loc55",
96   "loc56","loc57","loc58","loc59","loc60","loc61","loc62","loc63",
97   "loc64","loc65","loc66","loc67","loc68","loc69","loc70","loc71",
98   "loc72","loc73","loc74","loc75","loc76","loc77","loc78","loc79" };
99
100 /* ??? These strings could be shared with REGISTER_NAMES.  */
101 static const char * const ia64_output_reg_names[8] =
102 { "out0", "out1", "out2", "out3", "out4", "out5", "out6", "out7" };
103
104 /* Which cpu are we scheduling for.  */
105 enum processor_type ia64_tune = PROCESSOR_ITANIUM2;
106
107 /* Determines whether we run our final scheduling pass or not.  We always
108    avoid the normal second scheduling pass.  */
109 static int ia64_flag_schedule_insns2;
110
111 /* Determines whether we run variable tracking in machine dependent
112    reorganization.  */
113 static int ia64_flag_var_tracking;
114
115 /* Variables which are this size or smaller are put in the sdata/sbss
116    sections.  */
117
118 unsigned int ia64_section_threshold;
119
120 /* The following variable is used by the DFA insn scheduler.  The value is
121    TRUE if we do insn bundling instead of insn scheduling.  */
122 int bundling_p = 0;
123
124 /* Structure to be filled in by ia64_compute_frame_size with register
125    save masks and offsets for the current function.  */
126
127 struct ia64_frame_info
128 {
129   HOST_WIDE_INT total_size;     /* size of the stack frame, not including
130                                    the caller's scratch area.  */
131   HOST_WIDE_INT spill_cfa_off;  /* top of the reg spill area from the cfa.  */
132   HOST_WIDE_INT spill_size;     /* size of the gr/br/fr spill area.  */
133   HOST_WIDE_INT extra_spill_size;  /* size of spill area for others.  */
134   HARD_REG_SET mask;            /* mask of saved registers.  */
135   unsigned int gr_used_mask;    /* mask of registers in use as gr spill
136                                    registers or long-term scratches.  */
137   int n_spilled;                /* number of spilled registers.  */
138   int reg_fp;                   /* register for fp.  */
139   int reg_save_b0;              /* save register for b0.  */
140   int reg_save_pr;              /* save register for prs.  */
141   int reg_save_ar_pfs;          /* save register for ar.pfs.  */
142   int reg_save_ar_unat;         /* save register for ar.unat.  */
143   int reg_save_ar_lc;           /* save register for ar.lc.  */
144   int reg_save_gp;              /* save register for gp.  */
145   int n_input_regs;             /* number of input registers used.  */
146   int n_local_regs;             /* number of local registers used.  */
147   int n_output_regs;            /* number of output registers used.  */
148   int n_rotate_regs;            /* number of rotating registers used.  */
149
150   char need_regstk;             /* true if a .regstk directive needed.  */
151   char initialized;             /* true if the data is finalized.  */
152 };
153
154 /* Current frame information calculated by ia64_compute_frame_size.  */
155 static struct ia64_frame_info current_frame_info;
156 \f
157 static int ia64_first_cycle_multipass_dfa_lookahead (void);
158 static void ia64_dependencies_evaluation_hook (rtx, rtx);
159 static void ia64_init_dfa_pre_cycle_insn (void);
160 static rtx ia64_dfa_pre_cycle_insn (void);
161 static int ia64_first_cycle_multipass_dfa_lookahead_guard (rtx);
162 static bool ia64_first_cycle_multipass_dfa_lookahead_guard_spec (rtx);
163 static int ia64_dfa_new_cycle (FILE *, int, rtx, int, int, int *);
164 static void ia64_h_i_d_extended (void);
165 static int ia64_mode_to_int (enum machine_mode);
166 static void ia64_set_sched_flags (spec_info_t);
167 static int ia64_speculate_insn (rtx, ds_t, rtx *);
168 static rtx ia64_gen_spec_insn (rtx, ds_t, int, bool, bool);
169 static bool ia64_needs_block_p (rtx);
170 static rtx ia64_gen_check (rtx, rtx, bool);
171 static int ia64_spec_check_p (rtx);
172 static int ia64_spec_check_src_p (rtx);
173 static rtx gen_tls_get_addr (void);
174 static rtx gen_thread_pointer (void);
175 static int find_gr_spill (int);
176 static int next_scratch_gr_reg (void);
177 static void mark_reg_gr_used_mask (rtx, void *);
178 static void ia64_compute_frame_size (HOST_WIDE_INT);
179 static void setup_spill_pointers (int, rtx, HOST_WIDE_INT);
180 static void finish_spill_pointers (void);
181 static rtx spill_restore_mem (rtx, HOST_WIDE_INT);
182 static void do_spill (rtx (*)(rtx, rtx, rtx), rtx, HOST_WIDE_INT, rtx);
183 static void do_restore (rtx (*)(rtx, rtx, rtx), rtx, HOST_WIDE_INT);
184 static rtx gen_movdi_x (rtx, rtx, rtx);
185 static rtx gen_fr_spill_x (rtx, rtx, rtx);
186 static rtx gen_fr_restore_x (rtx, rtx, rtx);
187
188 static enum machine_mode hfa_element_mode (tree, bool);
189 static void ia64_setup_incoming_varargs (CUMULATIVE_ARGS *, enum machine_mode,
190                                          tree, int *, int);
191 static int ia64_arg_partial_bytes (CUMULATIVE_ARGS *, enum machine_mode,
192                                    tree, bool);
193 static bool ia64_function_ok_for_sibcall (tree, tree);
194 static bool ia64_return_in_memory (tree, tree);
195 static bool ia64_rtx_costs (rtx, int, int, int *);
196 static void fix_range (const char *);
197 static bool ia64_handle_option (size_t, const char *, int);
198 static struct machine_function * ia64_init_machine_status (void);
199 static void emit_insn_group_barriers (FILE *);
200 static void emit_all_insn_group_barriers (FILE *);
201 static void final_emit_insn_group_barriers (FILE *);
202 static void emit_predicate_relation_info (void);
203 static void ia64_reorg (void);
204 static bool ia64_in_small_data_p (tree);
205 static void process_epilogue (FILE *, rtx, bool, bool);
206 static int process_set (FILE *, rtx, rtx, bool, bool);
207
208 static bool ia64_assemble_integer (rtx, unsigned int, int);
209 static void ia64_output_function_prologue (FILE *, HOST_WIDE_INT);
210 static void ia64_output_function_epilogue (FILE *, HOST_WIDE_INT);
211 static void ia64_output_function_end_prologue (FILE *);
212
213 static int ia64_issue_rate (void);
214 static int ia64_adjust_cost_2 (rtx, int, rtx, int);
215 static void ia64_sched_init (FILE *, int, int);
216 static void ia64_sched_init_global (FILE *, int, int);
217 static void ia64_sched_finish_global (FILE *, int);
218 static void ia64_sched_finish (FILE *, int);
219 static int ia64_dfa_sched_reorder (FILE *, int, rtx *, int *, int, int);
220 static int ia64_sched_reorder (FILE *, int, rtx *, int *, int);
221 static int ia64_sched_reorder2 (FILE *, int, rtx *, int *, int);
222 static int ia64_variable_issue (FILE *, int, rtx, int);
223
224 static struct bundle_state *get_free_bundle_state (void);
225 static void free_bundle_state (struct bundle_state *);
226 static void initiate_bundle_states (void);
227 static void finish_bundle_states (void);
228 static unsigned bundle_state_hash (const void *);
229 static int bundle_state_eq_p (const void *, const void *);
230 static int insert_bundle_state (struct bundle_state *);
231 static void initiate_bundle_state_table (void);
232 static void finish_bundle_state_table (void);
233 static int try_issue_nops (struct bundle_state *, int);
234 static int try_issue_insn (struct bundle_state *, rtx);
235 static void issue_nops_and_insn (struct bundle_state *, int, rtx, int, int);
236 static int get_max_pos (state_t);
237 static int get_template (state_t, int);
238
239 static rtx get_next_important_insn (rtx, rtx);
240 static void bundling (FILE *, int, rtx, rtx);
241
242 static void ia64_output_mi_thunk (FILE *, tree, HOST_WIDE_INT,
243                                   HOST_WIDE_INT, tree);
244 static void ia64_file_start (void);
245 static void ia64_globalize_decl_name (FILE *, tree);
246
247 static section *ia64_select_rtx_section (enum machine_mode, rtx,
248                                          unsigned HOST_WIDE_INT);
249 static void ia64_output_dwarf_dtprel (FILE *, int, rtx)
250      ATTRIBUTE_UNUSED;
251 static section *ia64_rwreloc_select_section (tree, int, unsigned HOST_WIDE_INT)
252      ATTRIBUTE_UNUSED;
253 static void ia64_rwreloc_unique_section (tree, int)
254      ATTRIBUTE_UNUSED;
255 static section *ia64_rwreloc_select_rtx_section (enum machine_mode, rtx,
256                                                  unsigned HOST_WIDE_INT)
257      ATTRIBUTE_UNUSED;
258 static unsigned int ia64_section_type_flags (tree, const char *, int);
259 static void ia64_init_libfuncs (void)
260      ATTRIBUTE_UNUSED;
261 static void ia64_hpux_init_libfuncs (void)
262      ATTRIBUTE_UNUSED;
263 static void ia64_sysv4_init_libfuncs (void)
264      ATTRIBUTE_UNUSED;
265 static void ia64_vms_init_libfuncs (void)
266      ATTRIBUTE_UNUSED;
267
268 static tree ia64_handle_model_attribute (tree *, tree, tree, int, bool *);
269 static tree ia64_handle_version_id_attribute (tree *, tree, tree, int, bool *);
270 static void ia64_encode_section_info (tree, rtx, int);
271 static rtx ia64_struct_value_rtx (tree, int);
272 static tree ia64_gimplify_va_arg (tree, tree, tree *, tree *);
273 static bool ia64_scalar_mode_supported_p (enum machine_mode mode);
274 static bool ia64_vector_mode_supported_p (enum machine_mode mode);
275 static bool ia64_cannot_force_const_mem (rtx);
276 static const char *ia64_mangle_fundamental_type (tree);
277 static const char *ia64_invalid_conversion (tree, tree);
278 static const char *ia64_invalid_unary_op (int, tree);
279 static const char *ia64_invalid_binary_op (int, tree, tree);
280 \f
281 /* Table of valid machine attributes.  */
282 static const struct attribute_spec ia64_attribute_table[] =
283 {
284   /* { name, min_len, max_len, decl_req, type_req, fn_type_req, handler } */
285   { "syscall_linkage", 0, 0, false, true,  true,  NULL },
286   { "model",           1, 1, true, false, false, ia64_handle_model_attribute },
287   { "version_id",      1, 1, true, false, false,
288     ia64_handle_version_id_attribute },
289   { NULL,              0, 0, false, false, false, NULL }
290 };
291
292 /* Initialize the GCC target structure.  */
293 #undef TARGET_ATTRIBUTE_TABLE
294 #define TARGET_ATTRIBUTE_TABLE ia64_attribute_table
295
296 #undef TARGET_INIT_BUILTINS
297 #define TARGET_INIT_BUILTINS ia64_init_builtins
298
299 #undef TARGET_EXPAND_BUILTIN
300 #define TARGET_EXPAND_BUILTIN ia64_expand_builtin
301
302 #undef TARGET_ASM_BYTE_OP
303 #define TARGET_ASM_BYTE_OP "\tdata1\t"
304 #undef TARGET_ASM_ALIGNED_HI_OP
305 #define TARGET_ASM_ALIGNED_HI_OP "\tdata2\t"
306 #undef TARGET_ASM_ALIGNED_SI_OP
307 #define TARGET_ASM_ALIGNED_SI_OP "\tdata4\t"
308 #undef TARGET_ASM_ALIGNED_DI_OP
309 #define TARGET_ASM_ALIGNED_DI_OP "\tdata8\t"
310 #undef TARGET_ASM_UNALIGNED_HI_OP
311 #define TARGET_ASM_UNALIGNED_HI_OP "\tdata2.ua\t"
312 #undef TARGET_ASM_UNALIGNED_SI_OP
313 #define TARGET_ASM_UNALIGNED_SI_OP "\tdata4.ua\t"
314 #undef TARGET_ASM_UNALIGNED_DI_OP
315 #define TARGET_ASM_UNALIGNED_DI_OP "\tdata8.ua\t"
316 #undef TARGET_ASM_INTEGER
317 #define TARGET_ASM_INTEGER ia64_assemble_integer
318
319 #undef TARGET_ASM_FUNCTION_PROLOGUE
320 #define TARGET_ASM_FUNCTION_PROLOGUE ia64_output_function_prologue
321 #undef TARGET_ASM_FUNCTION_END_PROLOGUE
322 #define TARGET_ASM_FUNCTION_END_PROLOGUE ia64_output_function_end_prologue
323 #undef TARGET_ASM_FUNCTION_EPILOGUE
324 #define TARGET_ASM_FUNCTION_EPILOGUE ia64_output_function_epilogue
325
326 #undef TARGET_IN_SMALL_DATA_P
327 #define TARGET_IN_SMALL_DATA_P  ia64_in_small_data_p
328
329 #undef TARGET_SCHED_ADJUST_COST_2
330 #define TARGET_SCHED_ADJUST_COST_2 ia64_adjust_cost_2
331 #undef TARGET_SCHED_ISSUE_RATE
332 #define TARGET_SCHED_ISSUE_RATE ia64_issue_rate
333 #undef TARGET_SCHED_VARIABLE_ISSUE
334 #define TARGET_SCHED_VARIABLE_ISSUE ia64_variable_issue
335 #undef TARGET_SCHED_INIT
336 #define TARGET_SCHED_INIT ia64_sched_init
337 #undef TARGET_SCHED_FINISH
338 #define TARGET_SCHED_FINISH ia64_sched_finish
339 #undef TARGET_SCHED_INIT_GLOBAL
340 #define TARGET_SCHED_INIT_GLOBAL ia64_sched_init_global
341 #undef TARGET_SCHED_FINISH_GLOBAL
342 #define TARGET_SCHED_FINISH_GLOBAL ia64_sched_finish_global
343 #undef TARGET_SCHED_REORDER
344 #define TARGET_SCHED_REORDER ia64_sched_reorder
345 #undef TARGET_SCHED_REORDER2
346 #define TARGET_SCHED_REORDER2 ia64_sched_reorder2
347
348 #undef TARGET_SCHED_DEPENDENCIES_EVALUATION_HOOK
349 #define TARGET_SCHED_DEPENDENCIES_EVALUATION_HOOK ia64_dependencies_evaluation_hook
350
351 #undef TARGET_SCHED_FIRST_CYCLE_MULTIPASS_DFA_LOOKAHEAD
352 #define TARGET_SCHED_FIRST_CYCLE_MULTIPASS_DFA_LOOKAHEAD ia64_first_cycle_multipass_dfa_lookahead
353
354 #undef TARGET_SCHED_INIT_DFA_PRE_CYCLE_INSN
355 #define TARGET_SCHED_INIT_DFA_PRE_CYCLE_INSN ia64_init_dfa_pre_cycle_insn
356 #undef TARGET_SCHED_DFA_PRE_CYCLE_INSN
357 #define TARGET_SCHED_DFA_PRE_CYCLE_INSN ia64_dfa_pre_cycle_insn
358
359 #undef TARGET_SCHED_FIRST_CYCLE_MULTIPASS_DFA_LOOKAHEAD_GUARD
360 #define TARGET_SCHED_FIRST_CYCLE_MULTIPASS_DFA_LOOKAHEAD_GUARD\
361   ia64_first_cycle_multipass_dfa_lookahead_guard
362
363 #undef TARGET_SCHED_DFA_NEW_CYCLE
364 #define TARGET_SCHED_DFA_NEW_CYCLE ia64_dfa_new_cycle
365
366 #undef TARGET_SCHED_H_I_D_EXTENDED
367 #define TARGET_SCHED_H_I_D_EXTENDED ia64_h_i_d_extended
368
369 #undef TARGET_SCHED_SET_SCHED_FLAGS
370 #define TARGET_SCHED_SET_SCHED_FLAGS ia64_set_sched_flags
371
372 #undef TARGET_SCHED_SPECULATE_INSN
373 #define TARGET_SCHED_SPECULATE_INSN ia64_speculate_insn
374
375 #undef TARGET_SCHED_NEEDS_BLOCK_P
376 #define TARGET_SCHED_NEEDS_BLOCK_P ia64_needs_block_p
377
378 #undef TARGET_SCHED_GEN_CHECK
379 #define TARGET_SCHED_GEN_CHECK ia64_gen_check
380
381 #undef TARGET_SCHED_FIRST_CYCLE_MULTIPASS_DFA_LOOKAHEAD_GUARD_SPEC
382 #define TARGET_SCHED_FIRST_CYCLE_MULTIPASS_DFA_LOOKAHEAD_GUARD_SPEC\
383   ia64_first_cycle_multipass_dfa_lookahead_guard_spec
384
385 #undef TARGET_FUNCTION_OK_FOR_SIBCALL
386 #define TARGET_FUNCTION_OK_FOR_SIBCALL ia64_function_ok_for_sibcall
387 #undef TARGET_ARG_PARTIAL_BYTES
388 #define TARGET_ARG_PARTIAL_BYTES ia64_arg_partial_bytes
389
390 #undef TARGET_ASM_OUTPUT_MI_THUNK
391 #define TARGET_ASM_OUTPUT_MI_THUNK ia64_output_mi_thunk
392 #undef TARGET_ASM_CAN_OUTPUT_MI_THUNK
393 #define TARGET_ASM_CAN_OUTPUT_MI_THUNK hook_bool_tree_hwi_hwi_tree_true
394
395 #undef TARGET_ASM_FILE_START
396 #define TARGET_ASM_FILE_START ia64_file_start
397
398 #undef TARGET_ASM_GLOBALIZE_DECL_NAME
399 #define TARGET_ASM_GLOBALIZE_DECL_NAME ia64_globalize_decl_name
400
401 #undef TARGET_RTX_COSTS
402 #define TARGET_RTX_COSTS ia64_rtx_costs
403 #undef TARGET_ADDRESS_COST
404 #define TARGET_ADDRESS_COST hook_int_rtx_0
405
406 #undef TARGET_MACHINE_DEPENDENT_REORG
407 #define TARGET_MACHINE_DEPENDENT_REORG ia64_reorg
408
409 #undef TARGET_ENCODE_SECTION_INFO
410 #define TARGET_ENCODE_SECTION_INFO ia64_encode_section_info
411
412 #undef  TARGET_SECTION_TYPE_FLAGS
413 #define TARGET_SECTION_TYPE_FLAGS  ia64_section_type_flags
414
415 #ifdef HAVE_AS_TLS
416 #undef TARGET_ASM_OUTPUT_DWARF_DTPREL
417 #define TARGET_ASM_OUTPUT_DWARF_DTPREL ia64_output_dwarf_dtprel
418 #endif
419
420 /* ??? ABI doesn't allow us to define this.  */
421 #if 0
422 #undef TARGET_PROMOTE_FUNCTION_ARGS
423 #define TARGET_PROMOTE_FUNCTION_ARGS hook_bool_tree_true
424 #endif
425
426 /* ??? ABI doesn't allow us to define this.  */
427 #if 0
428 #undef TARGET_PROMOTE_FUNCTION_RETURN
429 #define TARGET_PROMOTE_FUNCTION_RETURN hook_bool_tree_true
430 #endif
431
432 /* ??? Investigate.  */
433 #if 0
434 #undef TARGET_PROMOTE_PROTOTYPES
435 #define TARGET_PROMOTE_PROTOTYPES hook_bool_tree_true
436 #endif
437
438 #undef TARGET_STRUCT_VALUE_RTX
439 #define TARGET_STRUCT_VALUE_RTX ia64_struct_value_rtx
440 #undef TARGET_RETURN_IN_MEMORY
441 #define TARGET_RETURN_IN_MEMORY ia64_return_in_memory
442 #undef TARGET_SETUP_INCOMING_VARARGS
443 #define TARGET_SETUP_INCOMING_VARARGS ia64_setup_incoming_varargs
444 #undef TARGET_STRICT_ARGUMENT_NAMING
445 #define TARGET_STRICT_ARGUMENT_NAMING hook_bool_CUMULATIVE_ARGS_true
446 #undef TARGET_MUST_PASS_IN_STACK
447 #define TARGET_MUST_PASS_IN_STACK must_pass_in_stack_var_size
448
449 #undef TARGET_GIMPLIFY_VA_ARG_EXPR
450 #define TARGET_GIMPLIFY_VA_ARG_EXPR ia64_gimplify_va_arg
451
452 #undef TARGET_UNWIND_EMIT
453 #define TARGET_UNWIND_EMIT process_for_unwind_directive
454
455 #undef TARGET_SCALAR_MODE_SUPPORTED_P
456 #define TARGET_SCALAR_MODE_SUPPORTED_P ia64_scalar_mode_supported_p
457 #undef TARGET_VECTOR_MODE_SUPPORTED_P
458 #define TARGET_VECTOR_MODE_SUPPORTED_P ia64_vector_mode_supported_p
459
460 /* ia64 architecture manual 4.4.7: ... reads, writes, and flushes may occur
461    in an order different from the specified program order.  */
462 #undef TARGET_RELAXED_ORDERING
463 #define TARGET_RELAXED_ORDERING true
464
465 #undef TARGET_DEFAULT_TARGET_FLAGS
466 #define TARGET_DEFAULT_TARGET_FLAGS (TARGET_DEFAULT | TARGET_CPU_DEFAULT)
467 #undef TARGET_HANDLE_OPTION
468 #define TARGET_HANDLE_OPTION ia64_handle_option
469
470 #undef TARGET_CANNOT_FORCE_CONST_MEM
471 #define TARGET_CANNOT_FORCE_CONST_MEM ia64_cannot_force_const_mem
472
473 #undef TARGET_MANGLE_FUNDAMENTAL_TYPE
474 #define TARGET_MANGLE_FUNDAMENTAL_TYPE ia64_mangle_fundamental_type
475
476 #undef TARGET_INVALID_CONVERSION
477 #define TARGET_INVALID_CONVERSION ia64_invalid_conversion
478 #undef TARGET_INVALID_UNARY_OP
479 #define TARGET_INVALID_UNARY_OP ia64_invalid_unary_op
480 #undef TARGET_INVALID_BINARY_OP
481 #define TARGET_INVALID_BINARY_OP ia64_invalid_binary_op
482
483 struct gcc_target targetm = TARGET_INITIALIZER;
484 \f
485 typedef enum
486   {
487     ADDR_AREA_NORMAL,   /* normal address area */
488     ADDR_AREA_SMALL     /* addressable by "addl" (-2MB < addr < 2MB) */
489   }
490 ia64_addr_area;
491
492 static GTY(()) tree small_ident1;
493 static GTY(()) tree small_ident2;
494
495 static void
496 init_idents (void)
497 {
498   if (small_ident1 == 0)
499     {
500       small_ident1 = get_identifier ("small");
501       small_ident2 = get_identifier ("__small__");
502     }
503 }
504
505 /* Retrieve the address area that has been chosen for the given decl.  */
506
507 static ia64_addr_area
508 ia64_get_addr_area (tree decl)
509 {
510   tree model_attr;
511
512   model_attr = lookup_attribute ("model", DECL_ATTRIBUTES (decl));
513   if (model_attr)
514     {
515       tree id;
516
517       init_idents ();
518       id = TREE_VALUE (TREE_VALUE (model_attr));
519       if (id == small_ident1 || id == small_ident2)
520         return ADDR_AREA_SMALL;
521     }
522   return ADDR_AREA_NORMAL;
523 }
524
525 static tree
526 ia64_handle_model_attribute (tree *node, tree name, tree args,
527                              int flags ATTRIBUTE_UNUSED, bool *no_add_attrs)
528 {
529   ia64_addr_area addr_area = ADDR_AREA_NORMAL;
530   ia64_addr_area area;
531   tree arg, decl = *node;
532
533   init_idents ();
534   arg = TREE_VALUE (args);
535   if (arg == small_ident1 || arg == small_ident2)
536     {
537       addr_area = ADDR_AREA_SMALL;
538     }
539   else
540     {
541       warning (OPT_Wattributes, "invalid argument of %qs attribute",
542                IDENTIFIER_POINTER (name));
543       *no_add_attrs = true;
544     }
545
546   switch (TREE_CODE (decl))
547     {
548     case VAR_DECL:
549       if ((DECL_CONTEXT (decl) && TREE_CODE (DECL_CONTEXT (decl))
550            == FUNCTION_DECL)
551           && !TREE_STATIC (decl))
552         {
553           error ("%Jan address area attribute cannot be specified for "
554                  "local variables", decl);
555           *no_add_attrs = true;
556         }
557       area = ia64_get_addr_area (decl);
558       if (area != ADDR_AREA_NORMAL && addr_area != area)
559         {
560           error ("address area of %q+D conflicts with previous "
561                  "declaration", decl);
562           *no_add_attrs = true;
563         }
564       break;
565
566     case FUNCTION_DECL:
567       error ("%Jaddress area attribute cannot be specified for functions",
568              decl);
569       *no_add_attrs = true;
570       break;
571
572     default:
573       warning (OPT_Wattributes, "%qs attribute ignored",
574                IDENTIFIER_POINTER (name));
575       *no_add_attrs = true;
576       break;
577     }
578
579   return NULL_TREE;
580 }
581
582 static void
583 ia64_encode_addr_area (tree decl, rtx symbol)
584 {
585   int flags;
586
587   flags = SYMBOL_REF_FLAGS (symbol);
588   switch (ia64_get_addr_area (decl))
589     {
590     case ADDR_AREA_NORMAL: break;
591     case ADDR_AREA_SMALL: flags |= SYMBOL_FLAG_SMALL_ADDR; break;
592     default: gcc_unreachable ();
593     }
594   SYMBOL_REF_FLAGS (symbol) = flags;
595 }
596
597 static void
598 ia64_encode_section_info (tree decl, rtx rtl, int first)
599 {
600   default_encode_section_info (decl, rtl, first);
601
602   /* Careful not to prod global register variables.  */
603   if (TREE_CODE (decl) == VAR_DECL
604       && GET_CODE (DECL_RTL (decl)) == MEM
605       && GET_CODE (XEXP (DECL_RTL (decl), 0)) == SYMBOL_REF
606       && (TREE_STATIC (decl) || DECL_EXTERNAL (decl)))
607     ia64_encode_addr_area (decl, XEXP (rtl, 0));
608 }
609 \f
610 /* Implement CONST_OK_FOR_LETTER_P.  */
611
612 bool
613 ia64_const_ok_for_letter_p (HOST_WIDE_INT value, char c)
614 {
615   switch (c)
616     {
617     case 'I':
618       return CONST_OK_FOR_I (value);
619     case 'J':
620       return CONST_OK_FOR_J (value);
621     case 'K':
622       return CONST_OK_FOR_K (value);
623     case 'L':
624       return CONST_OK_FOR_L (value);
625     case 'M':
626       return CONST_OK_FOR_M (value);
627     case 'N':
628       return CONST_OK_FOR_N (value);
629     case 'O':
630       return CONST_OK_FOR_O (value);
631     case 'P':
632       return CONST_OK_FOR_P (value);
633     default:
634       return false;
635     }
636 }
637
638 /* Implement CONST_DOUBLE_OK_FOR_LETTER_P.  */
639
640 bool
641 ia64_const_double_ok_for_letter_p (rtx value, char c)
642 {
643   switch (c)
644     {
645     case 'G':
646       return CONST_DOUBLE_OK_FOR_G (value);
647     default:
648       return false;
649     }
650 }
651
652 /* Implement EXTRA_CONSTRAINT.  */
653
654 bool
655 ia64_extra_constraint (rtx value, char c)
656 {
657   switch (c)
658     {
659     case 'Q':
660       /* Non-volatile memory for FP_REG loads/stores.  */
661       return memory_operand(value, VOIDmode) && !MEM_VOLATILE_P (value);
662
663     case 'R':
664       /* 1..4 for shladd arguments.  */
665       return (GET_CODE (value) == CONST_INT
666               && INTVAL (value) >= 1 && INTVAL (value) <= 4);
667
668     case 'S':
669       /* Non-post-inc memory for asms and other unsavory creatures.  */
670       return (GET_CODE (value) == MEM
671               && GET_RTX_CLASS (GET_CODE (XEXP (value, 0))) != RTX_AUTOINC
672               && (reload_in_progress || memory_operand (value, VOIDmode)));
673
674     case 'T':
675       /* Symbol ref to small-address-area.  */
676       return small_addr_symbolic_operand (value, VOIDmode);
677
678     case 'U':
679       /* Vector zero.  */
680       return value == CONST0_RTX (GET_MODE (value));
681
682     case 'W':
683       /* An integer vector, such that conversion to an integer yields a
684          value appropriate for an integer 'J' constraint.  */
685       if (GET_CODE (value) == CONST_VECTOR
686           && GET_MODE_CLASS (GET_MODE (value)) == MODE_VECTOR_INT)
687         {
688           value = simplify_subreg (DImode, value, GET_MODE (value), 0);
689           return ia64_const_ok_for_letter_p (INTVAL (value), 'J');
690         }
691       return false;
692
693     case 'Y':
694       /* A V2SF vector containing elements that satisfy 'G'.  */
695       return
696         (GET_CODE (value) == CONST_VECTOR
697          && GET_MODE (value) == V2SFmode
698          && ia64_const_double_ok_for_letter_p (XVECEXP (value, 0, 0), 'G')
699          && ia64_const_double_ok_for_letter_p (XVECEXP (value, 0, 1), 'G'));
700
701     default:
702       return false;
703     }
704 }
705 \f
706 /* Return 1 if the operands of a move are ok.  */
707
708 int
709 ia64_move_ok (rtx dst, rtx src)
710 {
711   /* If we're under init_recog_no_volatile, we'll not be able to use
712      memory_operand.  So check the code directly and don't worry about
713      the validity of the underlying address, which should have been
714      checked elsewhere anyway.  */
715   if (GET_CODE (dst) != MEM)
716     return 1;
717   if (GET_CODE (src) == MEM)
718     return 0;
719   if (register_operand (src, VOIDmode))
720     return 1;
721
722   /* Otherwise, this must be a constant, and that either 0 or 0.0 or 1.0.  */
723   if (INTEGRAL_MODE_P (GET_MODE (dst)))
724     return src == const0_rtx;
725   else
726     return GET_CODE (src) == CONST_DOUBLE && CONST_DOUBLE_OK_FOR_G (src);
727 }
728
729 /* Return 1 if the operands are ok for a floating point load pair.  */
730
731 int
732 ia64_load_pair_ok (rtx dst, rtx src)
733 {
734   if (GET_CODE (dst) != REG || !FP_REGNO_P (REGNO (dst)))
735     return 0;
736   if (GET_CODE (src) != MEM || MEM_VOLATILE_P (src))
737     return 0;
738   switch (GET_CODE (XEXP (src, 0)))
739     {
740     case REG:
741     case POST_INC:
742       break;
743     case POST_DEC:
744       return 0;
745     case POST_MODIFY:
746       {
747         rtx adjust = XEXP (XEXP (XEXP (src, 0), 1), 1);
748
749         if (GET_CODE (adjust) != CONST_INT
750             || INTVAL (adjust) != GET_MODE_SIZE (GET_MODE (src)))
751           return 0;
752       }
753       break;
754     default:
755       abort ();
756     }
757   return 1;
758 }
759
760 int
761 addp4_optimize_ok (rtx op1, rtx op2)
762 {
763   return (basereg_operand (op1, GET_MODE(op1)) !=
764           basereg_operand (op2, GET_MODE(op2)));
765 }
766
767 /* Check if OP is a mask suitable for use with SHIFT in a dep.z instruction.
768    Return the length of the field, or <= 0 on failure.  */
769
770 int
771 ia64_depz_field_mask (rtx rop, rtx rshift)
772 {
773   unsigned HOST_WIDE_INT op = INTVAL (rop);
774   unsigned HOST_WIDE_INT shift = INTVAL (rshift);
775
776   /* Get rid of the zero bits we're shifting in.  */
777   op >>= shift;
778
779   /* We must now have a solid block of 1's at bit 0.  */
780   return exact_log2 (op + 1);
781 }
782
783 /* Return the TLS model to use for ADDR.  */
784
785 static enum tls_model
786 tls_symbolic_operand_type (rtx addr)
787 {
788   enum tls_model tls_kind = 0;
789
790   if (GET_CODE (addr) == CONST)
791     {
792       if (GET_CODE (XEXP (addr, 0)) == PLUS
793           && GET_CODE (XEXP (XEXP (addr, 0), 0)) == SYMBOL_REF)
794         tls_kind = SYMBOL_REF_TLS_MODEL (XEXP (XEXP (addr, 0), 0));
795     }
796   else if (GET_CODE (addr) == SYMBOL_REF)
797     tls_kind = SYMBOL_REF_TLS_MODEL (addr);
798
799   return tls_kind;
800 }
801
802 /* Return true if X is a constant that is valid for some immediate
803    field in an instruction.  */
804
805 bool
806 ia64_legitimate_constant_p (rtx x)
807 {
808   switch (GET_CODE (x))
809     {
810     case CONST_INT:
811     case LABEL_REF:
812       return true;
813
814     case CONST_DOUBLE:
815       if (GET_MODE (x) == VOIDmode)
816         return true;
817       return CONST_DOUBLE_OK_FOR_G (x);
818
819     case CONST:
820     case SYMBOL_REF:
821       /* ??? Short term workaround for PR 28490.  We must make the code here
822          match the code in ia64_expand_move and move_operand, even though they
823          are both technically wrong.  */
824       if (tls_symbolic_operand_type (x) == 0)
825         {
826           HOST_WIDE_INT addend = 0;
827           rtx op = x;
828
829           if (GET_CODE (op) == CONST
830               && GET_CODE (XEXP (op, 0)) == PLUS
831               && GET_CODE (XEXP (XEXP (op, 0), 1)) == CONST_INT)
832             {
833               addend = INTVAL (XEXP (XEXP (op, 0), 1));
834               op = XEXP (XEXP (op, 0), 0);
835             }
836
837           if (any_offset_symbol_operand (op, GET_MODE (op))
838               || function_operand (op, GET_MODE (op)))
839             return true;
840           if (aligned_offset_symbol_operand (op, GET_MODE (op)))
841             return (addend & 0x3fff) == 0;
842           return false;
843         }
844       return false;
845
846     case CONST_VECTOR:
847       {
848         enum machine_mode mode = GET_MODE (x);
849
850         if (mode == V2SFmode)
851           return ia64_extra_constraint (x, 'Y');
852
853         return (GET_MODE_CLASS (mode) == MODE_VECTOR_INT
854                 && GET_MODE_SIZE (mode) <= 8);
855       }
856
857     default:
858       return false;
859     }
860 }
861
862 /* Don't allow TLS addresses to get spilled to memory.  */
863
864 static bool
865 ia64_cannot_force_const_mem (rtx x)
866 {
867   return tls_symbolic_operand_type (x) != 0;
868 }
869
870 /* Expand a symbolic constant load.  */
871
872 bool
873 ia64_expand_load_address (rtx dest, rtx src)
874 {
875   gcc_assert (GET_CODE (dest) == REG);
876
877   /* ILP32 mode still loads 64-bits of data from the GOT.  This avoids
878      having to pointer-extend the value afterward.  Other forms of address
879      computation below are also more natural to compute as 64-bit quantities.
880      If we've been given an SImode destination register, change it.  */
881   if (GET_MODE (dest) != Pmode)
882     dest = gen_rtx_REG_offset (dest, Pmode, REGNO (dest), 0);
883
884   if (TARGET_NO_PIC)
885     return false;
886   if (small_addr_symbolic_operand (src, VOIDmode))
887     return false;
888
889   if (TARGET_AUTO_PIC)
890     emit_insn (gen_load_gprel64 (dest, src));
891   else if (GET_CODE (src) == SYMBOL_REF && SYMBOL_REF_FUNCTION_P (src))
892     emit_insn (gen_load_fptr (dest, src));
893   else if (sdata_symbolic_operand (src, VOIDmode))
894     emit_insn (gen_load_gprel (dest, src));
895   else
896     {
897       HOST_WIDE_INT addend = 0;
898       rtx tmp;
899
900       /* We did split constant offsets in ia64_expand_move, and we did try
901          to keep them split in move_operand, but we also allowed reload to
902          rematerialize arbitrary constants rather than spill the value to
903          the stack and reload it.  So we have to be prepared here to split
904          them apart again.  */
905       if (GET_CODE (src) == CONST)
906         {
907           HOST_WIDE_INT hi, lo;
908
909           hi = INTVAL (XEXP (XEXP (src, 0), 1));
910           lo = ((hi & 0x3fff) ^ 0x2000) - 0x2000;
911           hi = hi - lo;
912
913           if (lo != 0)
914             {
915               addend = lo;
916               src = plus_constant (XEXP (XEXP (src, 0), 0), hi);
917             }
918         }
919
920       tmp = gen_rtx_HIGH (Pmode, src);
921       tmp = gen_rtx_PLUS (Pmode, tmp, pic_offset_table_rtx);
922       emit_insn (gen_rtx_SET (VOIDmode, dest, tmp));
923
924       tmp = gen_rtx_LO_SUM (Pmode, dest, src);
925       emit_insn (gen_rtx_SET (VOIDmode, dest, tmp));
926
927       if (addend)
928         {
929           tmp = gen_rtx_PLUS (Pmode, dest, GEN_INT (addend));
930           emit_insn (gen_rtx_SET (VOIDmode, dest, tmp));
931         }
932     }
933
934   return true;
935 }
936
937 static GTY(()) rtx gen_tls_tga;
938 static rtx
939 gen_tls_get_addr (void)
940 {
941   if (!gen_tls_tga)
942     gen_tls_tga = init_one_libfunc ("__tls_get_addr");
943   return gen_tls_tga;
944 }
945
946 static GTY(()) rtx thread_pointer_rtx;
947 static rtx
948 gen_thread_pointer (void)
949 {
950   if (!thread_pointer_rtx)
951     thread_pointer_rtx = gen_rtx_REG (Pmode, 13);
952   return thread_pointer_rtx;
953 }
954
955 static rtx
956 ia64_expand_tls_address (enum tls_model tls_kind, rtx op0, rtx op1,
957                          rtx orig_op1, HOST_WIDE_INT addend)
958 {
959   rtx tga_op1, tga_op2, tga_ret, tga_eqv, tmp, insns;
960   rtx orig_op0 = op0;
961   HOST_WIDE_INT addend_lo, addend_hi;
962
963   switch (tls_kind)
964     {
965     case TLS_MODEL_GLOBAL_DYNAMIC:
966       start_sequence ();
967
968       tga_op1 = gen_reg_rtx (Pmode);
969       emit_insn (gen_load_dtpmod (tga_op1, op1));
970
971       tga_op2 = gen_reg_rtx (Pmode);
972       emit_insn (gen_load_dtprel (tga_op2, op1));
973
974       tga_ret = emit_library_call_value (gen_tls_get_addr (), NULL_RTX,
975                                          LCT_CONST, Pmode, 2, tga_op1,
976                                          Pmode, tga_op2, Pmode);
977
978       insns = get_insns ();
979       end_sequence ();
980
981       if (GET_MODE (op0) != Pmode)
982         op0 = tga_ret;
983       emit_libcall_block (insns, op0, tga_ret, op1);
984       break;
985
986     case TLS_MODEL_LOCAL_DYNAMIC:
987       /* ??? This isn't the completely proper way to do local-dynamic
988          If the call to __tls_get_addr is used only by a single symbol,
989          then we should (somehow) move the dtprel to the second arg
990          to avoid the extra add.  */
991       start_sequence ();
992
993       tga_op1 = gen_reg_rtx (Pmode);
994       emit_insn (gen_load_dtpmod (tga_op1, op1));
995
996       tga_op2 = const0_rtx;
997
998       tga_ret = emit_library_call_value (gen_tls_get_addr (), NULL_RTX,
999                                          LCT_CONST, Pmode, 2, tga_op1,
1000                                          Pmode, tga_op2, Pmode);
1001
1002       insns = get_insns ();
1003       end_sequence ();
1004
1005       tga_eqv = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, const0_rtx),
1006                                 UNSPEC_LD_BASE);
1007       tmp = gen_reg_rtx (Pmode);
1008       emit_libcall_block (insns, tmp, tga_ret, tga_eqv);
1009
1010       if (!register_operand (op0, Pmode))
1011         op0 = gen_reg_rtx (Pmode);
1012       if (TARGET_TLS64)
1013         {
1014           emit_insn (gen_load_dtprel (op0, op1));
1015           emit_insn (gen_adddi3 (op0, tmp, op0));
1016         }
1017       else
1018         emit_insn (gen_add_dtprel (op0, op1, tmp));
1019       break;
1020
1021     case TLS_MODEL_INITIAL_EXEC:
1022       addend_lo = ((addend & 0x3fff) ^ 0x2000) - 0x2000;
1023       addend_hi = addend - addend_lo;
1024
1025       op1 = plus_constant (op1, addend_hi);
1026       addend = addend_lo;
1027
1028       tmp = gen_reg_rtx (Pmode);
1029       emit_insn (gen_load_tprel (tmp, op1));
1030
1031       if (!register_operand (op0, Pmode))
1032         op0 = gen_reg_rtx (Pmode);
1033       emit_insn (gen_adddi3 (op0, tmp, gen_thread_pointer ()));
1034       break;
1035
1036     case TLS_MODEL_LOCAL_EXEC:
1037       if (!register_operand (op0, Pmode))
1038         op0 = gen_reg_rtx (Pmode);
1039
1040       op1 = orig_op1;
1041       addend = 0;
1042       if (TARGET_TLS64)
1043         {
1044           emit_insn (gen_load_tprel (op0, op1));
1045           emit_insn (gen_adddi3 (op0, op0, gen_thread_pointer ()));
1046         }
1047       else
1048         emit_insn (gen_add_tprel (op0, op1, gen_thread_pointer ()));
1049       break;
1050
1051     default:
1052       gcc_unreachable ();
1053     }
1054
1055   if (addend)
1056     op0 = expand_simple_binop (Pmode, PLUS, op0, GEN_INT (addend),
1057                                orig_op0, 1, OPTAB_DIRECT);
1058   if (orig_op0 == op0)
1059     return NULL_RTX;
1060   if (GET_MODE (orig_op0) == Pmode)
1061     return op0;
1062   return gen_lowpart (GET_MODE (orig_op0), op0);
1063 }
1064
1065 rtx
1066 ia64_expand_move (rtx op0, rtx op1)
1067 {
1068   enum machine_mode mode = GET_MODE (op0);
1069
1070   if (!reload_in_progress && !reload_completed && !ia64_move_ok (op0, op1))
1071     op1 = force_reg (mode, op1);
1072
1073   if ((mode == Pmode || mode == ptr_mode) && symbolic_operand (op1, VOIDmode))
1074     {
1075       HOST_WIDE_INT addend = 0;
1076       enum tls_model tls_kind;
1077       rtx sym = op1;
1078
1079       if (GET_CODE (op1) == CONST
1080           && GET_CODE (XEXP (op1, 0)) == PLUS
1081           && GET_CODE (XEXP (XEXP (op1, 0), 1)) == CONST_INT)
1082         {
1083           addend = INTVAL (XEXP (XEXP (op1, 0), 1));
1084           sym = XEXP (XEXP (op1, 0), 0);
1085         }
1086
1087       tls_kind = tls_symbolic_operand_type (sym);
1088       if (tls_kind)
1089         return ia64_expand_tls_address (tls_kind, op0, sym, op1, addend);
1090
1091       if (any_offset_symbol_operand (sym, mode))
1092         addend = 0;
1093       else if (aligned_offset_symbol_operand (sym, mode))
1094         {
1095           HOST_WIDE_INT addend_lo, addend_hi;
1096               
1097           addend_lo = ((addend & 0x3fff) ^ 0x2000) - 0x2000;
1098           addend_hi = addend - addend_lo;
1099
1100           if (addend_lo != 0)
1101             {
1102               op1 = plus_constant (sym, addend_hi);
1103               addend = addend_lo;
1104             }
1105           else
1106             addend = 0;
1107         }
1108       else
1109         op1 = sym;
1110
1111       if (reload_completed)
1112         {
1113           /* We really should have taken care of this offset earlier.  */
1114           gcc_assert (addend == 0);
1115           if (ia64_expand_load_address (op0, op1))
1116             return NULL_RTX;
1117         }
1118
1119       if (addend)
1120         {
1121           rtx subtarget = no_new_pseudos ? op0 : gen_reg_rtx (mode);
1122
1123           emit_insn (gen_rtx_SET (VOIDmode, subtarget, op1));
1124
1125           op1 = expand_simple_binop (mode, PLUS, subtarget,
1126                                      GEN_INT (addend), op0, 1, OPTAB_DIRECT);
1127           if (op0 == op1)
1128             return NULL_RTX;
1129         }
1130     }
1131
1132   return op1;
1133 }
1134
1135 /* Split a move from OP1 to OP0 conditional on COND.  */
1136
1137 void
1138 ia64_emit_cond_move (rtx op0, rtx op1, rtx cond)
1139 {
1140   rtx insn, first = get_last_insn ();
1141
1142   emit_move_insn (op0, op1);
1143
1144   for (insn = get_last_insn (); insn != first; insn = PREV_INSN (insn))
1145     if (INSN_P (insn))
1146       PATTERN (insn) = gen_rtx_COND_EXEC (VOIDmode, copy_rtx (cond),
1147                                           PATTERN (insn));
1148 }
1149
1150 /* Split a post-reload TImode or TFmode reference into two DImode
1151    components.  This is made extra difficult by the fact that we do
1152    not get any scratch registers to work with, because reload cannot
1153    be prevented from giving us a scratch that overlaps the register
1154    pair involved.  So instead, when addressing memory, we tweak the
1155    pointer register up and back down with POST_INCs.  Or up and not
1156    back down when we can get away with it.
1157
1158    REVERSED is true when the loads must be done in reversed order
1159    (high word first) for correctness.  DEAD is true when the pointer
1160    dies with the second insn we generate and therefore the second
1161    address must not carry a postmodify.
1162
1163    May return an insn which is to be emitted after the moves.  */
1164
1165 static rtx
1166 ia64_split_tmode (rtx out[2], rtx in, bool reversed, bool dead)
1167 {
1168   rtx fixup = 0;
1169
1170   switch (GET_CODE (in))
1171     {
1172     case REG:
1173       out[reversed] = gen_rtx_REG (DImode, REGNO (in));
1174       out[!reversed] = gen_rtx_REG (DImode, REGNO (in) + 1);
1175       break;
1176
1177     case CONST_INT:
1178     case CONST_DOUBLE:
1179       /* Cannot occur reversed.  */
1180       gcc_assert (!reversed);
1181       
1182       if (GET_MODE (in) != TFmode)
1183         split_double (in, &out[0], &out[1]);
1184       else
1185         /* split_double does not understand how to split a TFmode
1186            quantity into a pair of DImode constants.  */
1187         {
1188           REAL_VALUE_TYPE r;
1189           unsigned HOST_WIDE_INT p[2];
1190           long l[4];  /* TFmode is 128 bits */
1191
1192           REAL_VALUE_FROM_CONST_DOUBLE (r, in);
1193           real_to_target (l, &r, TFmode);
1194
1195           if (FLOAT_WORDS_BIG_ENDIAN)
1196             {
1197               p[0] = (((unsigned HOST_WIDE_INT) l[0]) << 32) + l[1];
1198               p[1] = (((unsigned HOST_WIDE_INT) l[2]) << 32) + l[3];
1199             }
1200           else
1201             {
1202               p[0] = (((unsigned HOST_WIDE_INT) l[3]) << 32) + l[2];
1203               p[1] = (((unsigned HOST_WIDE_INT) l[1]) << 32) + l[0];
1204             }
1205           out[0] = GEN_INT (p[0]);
1206           out[1] = GEN_INT (p[1]);
1207         }
1208       break;
1209
1210     case MEM:
1211       {
1212         rtx base = XEXP (in, 0);
1213         rtx offset;
1214
1215         switch (GET_CODE (base))
1216           {
1217           case REG:
1218             if (!reversed)
1219               {
1220                 out[0] = adjust_automodify_address
1221                   (in, DImode, gen_rtx_POST_INC (Pmode, base), 0);
1222                 out[1] = adjust_automodify_address
1223                   (in, DImode, dead ? 0 : gen_rtx_POST_DEC (Pmode, base), 8);
1224               }
1225             else
1226               {
1227                 /* Reversal requires a pre-increment, which can only
1228                    be done as a separate insn.  */
1229                 emit_insn (gen_adddi3 (base, base, GEN_INT (8)));
1230                 out[0] = adjust_automodify_address
1231                   (in, DImode, gen_rtx_POST_DEC (Pmode, base), 8);
1232                 out[1] = adjust_address (in, DImode, 0);
1233               }
1234             break;
1235
1236           case POST_INC:
1237             gcc_assert (!reversed && !dead);
1238             
1239             /* Just do the increment in two steps.  */
1240             out[0] = adjust_automodify_address (in, DImode, 0, 0);
1241             out[1] = adjust_automodify_address (in, DImode, 0, 8);
1242             break;
1243
1244           case POST_DEC:
1245             gcc_assert (!reversed && !dead);
1246             
1247             /* Add 8, subtract 24.  */
1248             base = XEXP (base, 0);
1249             out[0] = adjust_automodify_address
1250               (in, DImode, gen_rtx_POST_INC (Pmode, base), 0);
1251             out[1] = adjust_automodify_address
1252               (in, DImode,
1253                gen_rtx_POST_MODIFY (Pmode, base, plus_constant (base, -24)),
1254                8);
1255             break;
1256
1257           case POST_MODIFY:
1258             gcc_assert (!reversed && !dead);
1259
1260             /* Extract and adjust the modification.  This case is
1261                trickier than the others, because we might have an
1262                index register, or we might have a combined offset that
1263                doesn't fit a signed 9-bit displacement field.  We can
1264                assume the incoming expression is already legitimate.  */
1265             offset = XEXP (base, 1);
1266             base = XEXP (base, 0);
1267
1268             out[0] = adjust_automodify_address
1269               (in, DImode, gen_rtx_POST_INC (Pmode, base), 0);
1270
1271             if (GET_CODE (XEXP (offset, 1)) == REG)
1272               {
1273                 /* Can't adjust the postmodify to match.  Emit the
1274                    original, then a separate addition insn.  */
1275                 out[1] = adjust_automodify_address (in, DImode, 0, 8);
1276                 fixup = gen_adddi3 (base, base, GEN_INT (-8));
1277               }
1278             else
1279               {
1280                 gcc_assert (GET_CODE (XEXP (offset, 1)) == CONST_INT);
1281                 if (INTVAL (XEXP (offset, 1)) < -256 + 8)
1282                   {
1283                     /* Again the postmodify cannot be made to match,
1284                        but in this case it's more efficient to get rid
1285                        of the postmodify entirely and fix up with an
1286                        add insn.  */
1287                     out[1] = adjust_automodify_address (in, DImode, base, 8);
1288                     fixup = gen_adddi3
1289                       (base, base, GEN_INT (INTVAL (XEXP (offset, 1)) - 8));
1290                   }
1291                 else
1292                   {
1293                     /* Combined offset still fits in the displacement field.
1294                        (We cannot overflow it at the high end.)  */
1295                     out[1] = adjust_automodify_address
1296                       (in, DImode, gen_rtx_POST_MODIFY
1297                        (Pmode, base, gen_rtx_PLUS
1298                         (Pmode, base,
1299                          GEN_INT (INTVAL (XEXP (offset, 1)) - 8))),
1300                        8);
1301                   }
1302               }
1303             break;
1304
1305           default:
1306             gcc_unreachable ();
1307           }
1308         break;
1309       }
1310
1311     default:
1312       gcc_unreachable ();
1313     }
1314
1315   return fixup;
1316 }
1317
1318 /* Split a TImode or TFmode move instruction after reload.
1319    This is used by *movtf_internal and *movti_internal.  */
1320 void
1321 ia64_split_tmode_move (rtx operands[])
1322 {
1323   rtx in[2], out[2], insn;
1324   rtx fixup[2];
1325   bool dead = false;
1326   bool reversed = false;
1327
1328   /* It is possible for reload to decide to overwrite a pointer with
1329      the value it points to.  In that case we have to do the loads in
1330      the appropriate order so that the pointer is not destroyed too
1331      early.  Also we must not generate a postmodify for that second
1332      load, or rws_access_regno will die.  */
1333   if (GET_CODE (operands[1]) == MEM
1334       && reg_overlap_mentioned_p (operands[0], operands[1]))
1335     {
1336       rtx base = XEXP (operands[1], 0);
1337       while (GET_CODE (base) != REG)
1338         base = XEXP (base, 0);
1339
1340       if (REGNO (base) == REGNO (operands[0]))
1341         reversed = true;
1342       dead = true;
1343     }
1344   /* Another reason to do the moves in reversed order is if the first
1345      element of the target register pair is also the second element of
1346      the source register pair.  */
1347   if (GET_CODE (operands[0]) == REG && GET_CODE (operands[1]) == REG
1348       && REGNO (operands[0]) == REGNO (operands[1]) + 1)
1349     reversed = true;
1350
1351   fixup[0] = ia64_split_tmode (in, operands[1], reversed, dead);
1352   fixup[1] = ia64_split_tmode (out, operands[0], reversed, dead);
1353
1354 #define MAYBE_ADD_REG_INC_NOTE(INSN, EXP)                               \
1355   if (GET_CODE (EXP) == MEM                                             \
1356       && (GET_CODE (XEXP (EXP, 0)) == POST_MODIFY                       \
1357           || GET_CODE (XEXP (EXP, 0)) == POST_INC                       \
1358           || GET_CODE (XEXP (EXP, 0)) == POST_DEC))                     \
1359     REG_NOTES (INSN) = gen_rtx_EXPR_LIST (REG_INC,                      \
1360                                           XEXP (XEXP (EXP, 0), 0),      \
1361                                           REG_NOTES (INSN))
1362
1363   insn = emit_insn (gen_rtx_SET (VOIDmode, out[0], in[0]));
1364   MAYBE_ADD_REG_INC_NOTE (insn, in[0]);
1365   MAYBE_ADD_REG_INC_NOTE (insn, out[0]);
1366
1367   insn = emit_insn (gen_rtx_SET (VOIDmode, out[1], in[1]));
1368   MAYBE_ADD_REG_INC_NOTE (insn, in[1]);
1369   MAYBE_ADD_REG_INC_NOTE (insn, out[1]);
1370
1371   if (fixup[0])
1372     emit_insn (fixup[0]);
1373   if (fixup[1])
1374     emit_insn (fixup[1]);
1375
1376 #undef MAYBE_ADD_REG_INC_NOTE
1377 }
1378
1379 /* ??? Fixing GR->FR XFmode moves during reload is hard.  You need to go
1380    through memory plus an extra GR scratch register.  Except that you can
1381    either get the first from SECONDARY_MEMORY_NEEDED or the second from
1382    SECONDARY_RELOAD_CLASS, but not both.
1383
1384    We got into problems in the first place by allowing a construct like
1385    (subreg:XF (reg:TI)), which we got from a union containing a long double.
1386    This solution attempts to prevent this situation from occurring.  When
1387    we see something like the above, we spill the inner register to memory.  */
1388
1389 static rtx
1390 spill_xfmode_rfmode_operand (rtx in, int force, enum machine_mode mode)
1391 {
1392   if (GET_CODE (in) == SUBREG
1393       && GET_MODE (SUBREG_REG (in)) == TImode
1394       && GET_CODE (SUBREG_REG (in)) == REG)
1395     {
1396       rtx memt = assign_stack_temp (TImode, 16, 0);
1397       emit_move_insn (memt, SUBREG_REG (in));
1398       return adjust_address (memt, mode, 0);
1399     }
1400   else if (force && GET_CODE (in) == REG)
1401     {
1402       rtx memx = assign_stack_temp (mode, 16, 0);
1403       emit_move_insn (memx, in);
1404       return memx;
1405     }
1406   else
1407     return in;
1408 }
1409
1410 /* Expand the movxf or movrf pattern (MODE says which) with the given
1411    OPERANDS, returning true if the pattern should then invoke
1412    DONE.  */
1413
1414 bool
1415 ia64_expand_movxf_movrf (enum machine_mode mode, rtx operands[])
1416 {
1417   rtx op0 = operands[0];
1418
1419   if (GET_CODE (op0) == SUBREG)
1420     op0 = SUBREG_REG (op0);
1421
1422   /* We must support XFmode loads into general registers for stdarg/vararg,
1423      unprototyped calls, and a rare case where a long double is passed as
1424      an argument after a float HFA fills the FP registers.  We split them into
1425      DImode loads for convenience.  We also need to support XFmode stores
1426      for the last case.  This case does not happen for stdarg/vararg routines,
1427      because we do a block store to memory of unnamed arguments.  */
1428
1429   if (GET_CODE (op0) == REG && GR_REGNO_P (REGNO (op0)))
1430     {
1431       rtx out[2];
1432
1433       /* We're hoping to transform everything that deals with XFmode
1434          quantities and GR registers early in the compiler.  */
1435       gcc_assert (!no_new_pseudos);
1436
1437       /* Struct to register can just use TImode instead.  */
1438       if ((GET_CODE (operands[1]) == SUBREG
1439            && GET_MODE (SUBREG_REG (operands[1])) == TImode)
1440           || (GET_CODE (operands[1]) == REG
1441               && GR_REGNO_P (REGNO (operands[1]))))
1442         {
1443           rtx op1 = operands[1];
1444
1445           if (GET_CODE (op1) == SUBREG)
1446             op1 = SUBREG_REG (op1);
1447           else
1448             op1 = gen_rtx_REG (TImode, REGNO (op1));
1449
1450           emit_move_insn (gen_rtx_REG (TImode, REGNO (op0)), op1);
1451           return true;
1452         }
1453
1454       if (GET_CODE (operands[1]) == CONST_DOUBLE)
1455         {
1456           /* Don't word-swap when reading in the constant.  */
1457           emit_move_insn (gen_rtx_REG (DImode, REGNO (op0)),
1458                           operand_subword (operands[1], WORDS_BIG_ENDIAN,
1459                                            0, mode));
1460           emit_move_insn (gen_rtx_REG (DImode, REGNO (op0) + 1),
1461                           operand_subword (operands[1], !WORDS_BIG_ENDIAN,
1462                                            0, mode));
1463           return true;
1464         }
1465
1466       /* If the quantity is in a register not known to be GR, spill it.  */
1467       if (register_operand (operands[1], mode))
1468         operands[1] = spill_xfmode_rfmode_operand (operands[1], 1, mode);
1469
1470       gcc_assert (GET_CODE (operands[1]) == MEM);
1471
1472       /* Don't word-swap when reading in the value.  */
1473       out[0] = gen_rtx_REG (DImode, REGNO (op0));
1474       out[1] = gen_rtx_REG (DImode, REGNO (op0) + 1);
1475
1476       emit_move_insn (out[0], adjust_address (operands[1], DImode, 0));
1477       emit_move_insn (out[1], adjust_address (operands[1], DImode, 8));
1478       return true;
1479     }
1480
1481   if (GET_CODE (operands[1]) == REG && GR_REGNO_P (REGNO (operands[1])))
1482     {
1483       /* We're hoping to transform everything that deals with XFmode
1484          quantities and GR registers early in the compiler.  */
1485       gcc_assert (!no_new_pseudos);
1486
1487       /* Op0 can't be a GR_REG here, as that case is handled above.
1488          If op0 is a register, then we spill op1, so that we now have a
1489          MEM operand.  This requires creating an XFmode subreg of a TImode reg
1490          to force the spill.  */
1491       if (register_operand (operands[0], mode))
1492         {
1493           rtx op1 = gen_rtx_REG (TImode, REGNO (operands[1]));
1494           op1 = gen_rtx_SUBREG (mode, op1, 0);
1495           operands[1] = spill_xfmode_rfmode_operand (op1, 0, mode);
1496         }
1497
1498       else
1499         {
1500           rtx in[2];
1501
1502           gcc_assert (GET_CODE (operands[0]) == MEM);
1503
1504           /* Don't word-swap when writing out the value.  */
1505           in[0] = gen_rtx_REG (DImode, REGNO (operands[1]));
1506           in[1] = gen_rtx_REG (DImode, REGNO (operands[1]) + 1);
1507
1508           emit_move_insn (adjust_address (operands[0], DImode, 0), in[0]);
1509           emit_move_insn (adjust_address (operands[0], DImode, 8), in[1]);
1510           return true;
1511         }
1512     }
1513
1514   if (!reload_in_progress && !reload_completed)
1515     {
1516       operands[1] = spill_xfmode_rfmode_operand (operands[1], 0, mode);
1517
1518       if (GET_MODE (op0) == TImode && GET_CODE (op0) == REG)
1519         {
1520           rtx memt, memx, in = operands[1];
1521           if (CONSTANT_P (in))
1522             in = validize_mem (force_const_mem (mode, in));
1523           if (GET_CODE (in) == MEM)
1524             memt = adjust_address (in, TImode, 0);
1525           else
1526             {
1527               memt = assign_stack_temp (TImode, 16, 0);
1528               memx = adjust_address (memt, mode, 0);
1529               emit_move_insn (memx, in);
1530             }
1531           emit_move_insn (op0, memt);
1532           return true;
1533         }
1534
1535       if (!ia64_move_ok (operands[0], operands[1]))
1536         operands[1] = force_reg (mode, operands[1]);
1537     }
1538
1539   return false;
1540 }
1541
1542 /* Emit comparison instruction if necessary, returning the expression
1543    that holds the compare result in the proper mode.  */
1544
1545 static GTY(()) rtx cmptf_libfunc;
1546
1547 rtx
1548 ia64_expand_compare (enum rtx_code code, enum machine_mode mode)
1549 {
1550   rtx op0 = ia64_compare_op0, op1 = ia64_compare_op1;
1551   rtx cmp;
1552
1553   /* If we have a BImode input, then we already have a compare result, and
1554      do not need to emit another comparison.  */
1555   if (GET_MODE (op0) == BImode)
1556     {
1557       gcc_assert ((code == NE || code == EQ) && op1 == const0_rtx);
1558       cmp = op0;
1559     }
1560   /* HPUX TFmode compare requires a library call to _U_Qfcmp, which takes a
1561      magic number as its third argument, that indicates what to do.
1562      The return value is an integer to be compared against zero.  */
1563   else if (GET_MODE (op0) == TFmode)
1564     {
1565       enum qfcmp_magic {
1566         QCMP_INV = 1,   /* Raise FP_INVALID on SNaN as a side effect.  */
1567         QCMP_UNORD = 2,
1568         QCMP_EQ = 4,
1569         QCMP_LT = 8,
1570         QCMP_GT = 16
1571       } magic;
1572       enum rtx_code ncode;
1573       rtx ret, insns;
1574       
1575       gcc_assert (cmptf_libfunc && GET_MODE (op1) == TFmode);
1576       switch (code)
1577         {
1578           /* 1 = equal, 0 = not equal.  Equality operators do
1579              not raise FP_INVALID when given an SNaN operand.  */
1580         case EQ:        magic = QCMP_EQ;                  ncode = NE; break;
1581         case NE:        magic = QCMP_EQ;                  ncode = EQ; break;
1582           /* isunordered() from C99.  */
1583         case UNORDERED: magic = QCMP_UNORD;               ncode = NE; break;
1584         case ORDERED:   magic = QCMP_UNORD;               ncode = EQ; break;
1585           /* Relational operators raise FP_INVALID when given
1586              an SNaN operand.  */
1587         case LT:        magic = QCMP_LT        |QCMP_INV; ncode = NE; break;
1588         case LE:        magic = QCMP_LT|QCMP_EQ|QCMP_INV; ncode = NE; break;
1589         case GT:        magic = QCMP_GT        |QCMP_INV; ncode = NE; break;
1590         case GE:        magic = QCMP_GT|QCMP_EQ|QCMP_INV; ncode = NE; break;
1591           /* FUTURE: Implement UNEQ, UNLT, UNLE, UNGT, UNGE, LTGT.
1592              Expanders for buneq etc. weuld have to be added to ia64.md
1593              for this to be useful.  */
1594         default: gcc_unreachable ();
1595         }
1596
1597       start_sequence ();
1598
1599       ret = emit_library_call_value (cmptf_libfunc, 0, LCT_CONST, DImode, 3,
1600                                      op0, TFmode, op1, TFmode,
1601                                      GEN_INT (magic), DImode);
1602       cmp = gen_reg_rtx (BImode);
1603       emit_insn (gen_rtx_SET (VOIDmode, cmp,
1604                               gen_rtx_fmt_ee (ncode, BImode,
1605                                               ret, const0_rtx)));
1606
1607       insns = get_insns ();
1608       end_sequence ();
1609
1610       emit_libcall_block (insns, cmp, cmp,
1611                           gen_rtx_fmt_ee (code, BImode, op0, op1));
1612       code = NE;
1613     }
1614   else
1615     {
1616       cmp = gen_reg_rtx (BImode);
1617       emit_insn (gen_rtx_SET (VOIDmode, cmp,
1618                               gen_rtx_fmt_ee (code, BImode, op0, op1)));
1619       code = NE;
1620     }
1621
1622   return gen_rtx_fmt_ee (code, mode, cmp, const0_rtx);
1623 }
1624
1625 /* Generate an integral vector comparison.  Return true if the condition has
1626    been reversed, and so the sense of the comparison should be inverted.  */
1627
1628 static bool
1629 ia64_expand_vecint_compare (enum rtx_code code, enum machine_mode mode,
1630                             rtx dest, rtx op0, rtx op1)
1631 {
1632   bool negate = false;
1633   rtx x;
1634
1635   /* Canonicalize the comparison to EQ, GT, GTU.  */
1636   switch (code)
1637     {
1638     case EQ:
1639     case GT:
1640     case GTU:
1641       break;
1642
1643     case NE:
1644     case LE:
1645     case LEU:
1646       code = reverse_condition (code);
1647       negate = true;
1648       break;
1649
1650     case GE:
1651     case GEU:
1652       code = reverse_condition (code);
1653       negate = true;
1654       /* FALLTHRU */
1655
1656     case LT:
1657     case LTU:
1658       code = swap_condition (code);
1659       x = op0, op0 = op1, op1 = x;
1660       break;
1661
1662     default:
1663       gcc_unreachable ();
1664     }
1665
1666   /* Unsigned parallel compare is not supported by the hardware.  Play some
1667      tricks to turn this into a signed comparison against 0.  */
1668   if (code == GTU)
1669     {
1670       switch (mode)
1671         {
1672         case V2SImode:
1673           {
1674             rtx t1, t2, mask;
1675
1676             /* Perform a parallel modulo subtraction.  */
1677             t1 = gen_reg_rtx (V2SImode);
1678             emit_insn (gen_subv2si3 (t1, op0, op1));
1679
1680             /* Extract the original sign bit of op0.  */
1681             mask = GEN_INT (-0x80000000);
1682             mask = gen_rtx_CONST_VECTOR (V2SImode, gen_rtvec (2, mask, mask));
1683             mask = force_reg (V2SImode, mask);
1684             t2 = gen_reg_rtx (V2SImode);
1685             emit_insn (gen_andv2si3 (t2, op0, mask));
1686
1687             /* XOR it back into the result of the subtraction.  This results
1688                in the sign bit set iff we saw unsigned underflow.  */
1689             x = gen_reg_rtx (V2SImode);
1690             emit_insn (gen_xorv2si3 (x, t1, t2));
1691
1692             code = GT;
1693             op0 = x;
1694             op1 = CONST0_RTX (mode);
1695           }
1696           break;
1697
1698         case V8QImode:
1699         case V4HImode:
1700           /* Perform a parallel unsigned saturating subtraction.  */
1701           x = gen_reg_rtx (mode);
1702           emit_insn (gen_rtx_SET (VOIDmode, x,
1703                                   gen_rtx_US_MINUS (mode, op0, op1)));
1704
1705           code = EQ;
1706           op0 = x;
1707           op1 = CONST0_RTX (mode);
1708           negate = !negate;
1709           break;
1710
1711         default:
1712           gcc_unreachable ();
1713         }
1714     }
1715
1716   x = gen_rtx_fmt_ee (code, mode, op0, op1);
1717   emit_insn (gen_rtx_SET (VOIDmode, dest, x));
1718
1719   return negate;
1720 }
1721
1722 /* Emit an integral vector conditional move.  */
1723
1724 void
1725 ia64_expand_vecint_cmov (rtx operands[])
1726 {
1727   enum machine_mode mode = GET_MODE (operands[0]);
1728   enum rtx_code code = GET_CODE (operands[3]);
1729   bool negate;
1730   rtx cmp, x, ot, of;
1731
1732   cmp = gen_reg_rtx (mode);
1733   negate = ia64_expand_vecint_compare (code, mode, cmp,
1734                                        operands[4], operands[5]);
1735
1736   ot = operands[1+negate];
1737   of = operands[2-negate];
1738
1739   if (ot == CONST0_RTX (mode))
1740     {
1741       if (of == CONST0_RTX (mode))
1742         {
1743           emit_move_insn (operands[0], ot);
1744           return;
1745         }
1746
1747       x = gen_rtx_NOT (mode, cmp);
1748       x = gen_rtx_AND (mode, x, of);
1749       emit_insn (gen_rtx_SET (VOIDmode, operands[0], x));
1750     }
1751   else if (of == CONST0_RTX (mode))
1752     {
1753       x = gen_rtx_AND (mode, cmp, ot);
1754       emit_insn (gen_rtx_SET (VOIDmode, operands[0], x));
1755     }
1756   else
1757     {
1758       rtx t, f;
1759
1760       t = gen_reg_rtx (mode);
1761       x = gen_rtx_AND (mode, cmp, operands[1+negate]);
1762       emit_insn (gen_rtx_SET (VOIDmode, t, x));
1763
1764       f = gen_reg_rtx (mode);
1765       x = gen_rtx_NOT (mode, cmp);
1766       x = gen_rtx_AND (mode, x, operands[2-negate]);
1767       emit_insn (gen_rtx_SET (VOIDmode, f, x));
1768
1769       x = gen_rtx_IOR (mode, t, f);
1770       emit_insn (gen_rtx_SET (VOIDmode, operands[0], x));
1771     }
1772 }
1773
1774 /* Emit an integral vector min or max operation.  Return true if all done.  */
1775
1776 bool
1777 ia64_expand_vecint_minmax (enum rtx_code code, enum machine_mode mode,
1778                            rtx operands[])
1779 {
1780   rtx xops[6];
1781
1782   /* These four combinations are supported directly.  */
1783   if (mode == V8QImode && (code == UMIN || code == UMAX))
1784     return false;
1785   if (mode == V4HImode && (code == SMIN || code == SMAX))
1786     return false;
1787
1788   /* This combination can be implemented with only saturating subtraction.  */
1789   if (mode == V4HImode && code == UMAX)
1790     {
1791       rtx x, tmp = gen_reg_rtx (mode);
1792
1793       x = gen_rtx_US_MINUS (mode, operands[1], operands[2]);
1794       emit_insn (gen_rtx_SET (VOIDmode, tmp, x));
1795
1796       emit_insn (gen_addv4hi3 (operands[0], tmp, operands[2]));
1797       return true;
1798     }
1799
1800   /* Everything else implemented via vector comparisons.  */
1801   xops[0] = operands[0];
1802   xops[4] = xops[1] = operands[1];
1803   xops[5] = xops[2] = operands[2];
1804
1805   switch (code)
1806     {
1807     case UMIN:
1808       code = LTU;
1809       break;
1810     case UMAX:
1811       code = GTU;
1812       break;
1813     case SMIN:
1814       code = LT;
1815       break;
1816     case SMAX:
1817       code = GT;
1818       break;
1819     default:
1820       gcc_unreachable ();
1821     }
1822   xops[3] = gen_rtx_fmt_ee (code, VOIDmode, operands[1], operands[2]);
1823
1824   ia64_expand_vecint_cmov (xops);
1825   return true;
1826 }
1827
1828 /* Emit an integral vector widening sum operations.  */
1829
1830 void
1831 ia64_expand_widen_sum (rtx operands[3], bool unsignedp)
1832 {
1833   rtx l, h, x, s;
1834   enum machine_mode wmode, mode;
1835   rtx (*unpack_l) (rtx, rtx, rtx);
1836   rtx (*unpack_h) (rtx, rtx, rtx);
1837   rtx (*plus) (rtx, rtx, rtx);
1838
1839   wmode = GET_MODE (operands[0]);
1840   mode = GET_MODE (operands[1]);
1841
1842   switch (mode)
1843     {
1844     case V8QImode:
1845       unpack_l = gen_unpack1_l;
1846       unpack_h = gen_unpack1_h;
1847       plus = gen_addv4hi3;
1848       break;
1849     case V4HImode:
1850       unpack_l = gen_unpack2_l;
1851       unpack_h = gen_unpack2_h;
1852       plus = gen_addv2si3;
1853       break;
1854     default:
1855       gcc_unreachable ();
1856     }
1857
1858   /* Fill in x with the sign extension of each element in op1.  */
1859   if (unsignedp)
1860     x = CONST0_RTX (mode);
1861   else
1862     {
1863       bool neg;
1864
1865       x = gen_reg_rtx (mode);
1866
1867       neg = ia64_expand_vecint_compare (LT, mode, x, operands[1],
1868                                         CONST0_RTX (mode));
1869       gcc_assert (!neg);
1870     }
1871
1872   l = gen_reg_rtx (wmode);
1873   h = gen_reg_rtx (wmode);
1874   s = gen_reg_rtx (wmode);
1875
1876   emit_insn (unpack_l (gen_lowpart (mode, l), operands[1], x));
1877   emit_insn (unpack_h (gen_lowpart (mode, h), operands[1], x));
1878   emit_insn (plus (s, l, operands[2]));
1879   emit_insn (plus (operands[0], h, s));
1880 }
1881
1882 /* Emit a signed or unsigned V8QI dot product operation.  */
1883
1884 void
1885 ia64_expand_dot_prod_v8qi (rtx operands[4], bool unsignedp)
1886 {
1887   rtx l1, l2, h1, h2, x1, x2, p1, p2, p3, p4, s1, s2, s3;
1888
1889   /* Fill in x1 and x2 with the sign extension of each element.  */
1890   if (unsignedp)
1891     x1 = x2 = CONST0_RTX (V8QImode);
1892   else
1893     {
1894       bool neg;
1895
1896       x1 = gen_reg_rtx (V8QImode);
1897       x2 = gen_reg_rtx (V8QImode);
1898
1899       neg = ia64_expand_vecint_compare (LT, V8QImode, x1, operands[1],
1900                                         CONST0_RTX (V8QImode));
1901       gcc_assert (!neg);
1902       neg = ia64_expand_vecint_compare (LT, V8QImode, x2, operands[2],
1903                                         CONST0_RTX (V8QImode));
1904       gcc_assert (!neg);
1905     }
1906
1907   l1 = gen_reg_rtx (V4HImode);
1908   l2 = gen_reg_rtx (V4HImode);
1909   h1 = gen_reg_rtx (V4HImode);
1910   h2 = gen_reg_rtx (V4HImode);
1911
1912   emit_insn (gen_unpack1_l (gen_lowpart (V8QImode, l1), operands[1], x1));
1913   emit_insn (gen_unpack1_l (gen_lowpart (V8QImode, l2), operands[2], x2));
1914   emit_insn (gen_unpack1_h (gen_lowpart (V8QImode, h1), operands[1], x1));
1915   emit_insn (gen_unpack1_h (gen_lowpart (V8QImode, h2), operands[2], x2));
1916
1917   p1 = gen_reg_rtx (V2SImode);
1918   p2 = gen_reg_rtx (V2SImode);
1919   p3 = gen_reg_rtx (V2SImode);
1920   p4 = gen_reg_rtx (V2SImode);
1921   emit_insn (gen_pmpy2_r (p1, l1, l2));
1922   emit_insn (gen_pmpy2_l (p2, l1, l2));
1923   emit_insn (gen_pmpy2_r (p3, h1, h2));
1924   emit_insn (gen_pmpy2_l (p4, h1, h2));
1925
1926   s1 = gen_reg_rtx (V2SImode);
1927   s2 = gen_reg_rtx (V2SImode);
1928   s3 = gen_reg_rtx (V2SImode);
1929   emit_insn (gen_addv2si3 (s1, p1, p2));
1930   emit_insn (gen_addv2si3 (s2, p3, p4));
1931   emit_insn (gen_addv2si3 (s3, s1, operands[3]));
1932   emit_insn (gen_addv2si3 (operands[0], s2, s3));
1933 }
1934
1935 /* Emit the appropriate sequence for a call.  */
1936
1937 void
1938 ia64_expand_call (rtx retval, rtx addr, rtx nextarg ATTRIBUTE_UNUSED,
1939                   int sibcall_p)
1940 {
1941   rtx insn, b0;
1942
1943   addr = XEXP (addr, 0);
1944   addr = convert_memory_address (DImode, addr);
1945   b0 = gen_rtx_REG (DImode, R_BR (0));
1946
1947   /* ??? Should do this for functions known to bind local too.  */
1948   if (TARGET_NO_PIC || TARGET_AUTO_PIC)
1949     {
1950       if (sibcall_p)
1951         insn = gen_sibcall_nogp (addr);
1952       else if (! retval)
1953         insn = gen_call_nogp (addr, b0);
1954       else
1955         insn = gen_call_value_nogp (retval, addr, b0);
1956       insn = emit_call_insn (insn);
1957     }
1958   else
1959     {
1960       if (sibcall_p)
1961         insn = gen_sibcall_gp (addr);
1962       else if (! retval)
1963         insn = gen_call_gp (addr, b0);
1964       else
1965         insn = gen_call_value_gp (retval, addr, b0);
1966       insn = emit_call_insn (insn);
1967
1968       use_reg (&CALL_INSN_FUNCTION_USAGE (insn), pic_offset_table_rtx);
1969     }
1970
1971   if (sibcall_p)
1972     use_reg (&CALL_INSN_FUNCTION_USAGE (insn), b0);
1973 }
1974
1975 void
1976 ia64_reload_gp (void)
1977 {
1978   rtx tmp;
1979
1980   if (current_frame_info.reg_save_gp)
1981     tmp = gen_rtx_REG (DImode, current_frame_info.reg_save_gp);
1982   else
1983     {
1984       HOST_WIDE_INT offset;
1985
1986       offset = (current_frame_info.spill_cfa_off
1987                 + current_frame_info.spill_size);
1988       if (frame_pointer_needed)
1989         {
1990           tmp = hard_frame_pointer_rtx;
1991           offset = -offset;
1992         }
1993       else
1994         {
1995           tmp = stack_pointer_rtx;
1996           offset = current_frame_info.total_size - offset;
1997         }
1998
1999       if (CONST_OK_FOR_I (offset))
2000         emit_insn (gen_adddi3 (pic_offset_table_rtx,
2001                                tmp, GEN_INT (offset)));
2002       else
2003         {
2004           emit_move_insn (pic_offset_table_rtx, GEN_INT (offset));
2005           emit_insn (gen_adddi3 (pic_offset_table_rtx,
2006                                  pic_offset_table_rtx, tmp));
2007         }
2008
2009       tmp = gen_rtx_MEM (DImode, pic_offset_table_rtx);
2010     }
2011
2012   emit_move_insn (pic_offset_table_rtx, tmp);
2013 }
2014
2015 void
2016 ia64_split_call (rtx retval, rtx addr, rtx retaddr, rtx scratch_r,
2017                  rtx scratch_b, int noreturn_p, int sibcall_p)
2018 {
2019   rtx insn;
2020   bool is_desc = false;
2021
2022   /* If we find we're calling through a register, then we're actually
2023      calling through a descriptor, so load up the values.  */
2024   if (REG_P (addr) && GR_REGNO_P (REGNO (addr)))
2025     {
2026       rtx tmp;
2027       bool addr_dead_p;
2028
2029       /* ??? We are currently constrained to *not* use peep2, because
2030          we can legitimately change the global lifetime of the GP
2031          (in the form of killing where previously live).  This is
2032          because a call through a descriptor doesn't use the previous
2033          value of the GP, while a direct call does, and we do not
2034          commit to either form until the split here.
2035
2036          That said, this means that we lack precise life info for
2037          whether ADDR is dead after this call.  This is not terribly
2038          important, since we can fix things up essentially for free
2039          with the POST_DEC below, but it's nice to not use it when we
2040          can immediately tell it's not necessary.  */
2041       addr_dead_p = ((noreturn_p || sibcall_p
2042                       || TEST_HARD_REG_BIT (regs_invalidated_by_call,
2043                                             REGNO (addr)))
2044                      && !FUNCTION_ARG_REGNO_P (REGNO (addr)));
2045
2046       /* Load the code address into scratch_b.  */
2047       tmp = gen_rtx_POST_INC (Pmode, addr);
2048       tmp = gen_rtx_MEM (Pmode, tmp);
2049       emit_move_insn (scratch_r, tmp);
2050       emit_move_insn (scratch_b, scratch_r);
2051
2052       /* Load the GP address.  If ADDR is not dead here, then we must
2053          revert the change made above via the POST_INCREMENT.  */
2054       if (!addr_dead_p)
2055         tmp = gen_rtx_POST_DEC (Pmode, addr);
2056       else
2057         tmp = addr;
2058       tmp = gen_rtx_MEM (Pmode, tmp);
2059       emit_move_insn (pic_offset_table_rtx, tmp);
2060
2061       is_desc = true;
2062       addr = scratch_b;
2063     }
2064
2065   if (sibcall_p)
2066     insn = gen_sibcall_nogp (addr);
2067   else if (retval)
2068     insn = gen_call_value_nogp (retval, addr, retaddr);
2069   else
2070     insn = gen_call_nogp (addr, retaddr);
2071   emit_call_insn (insn);
2072
2073   if ((!TARGET_CONST_GP || is_desc) && !noreturn_p && !sibcall_p)
2074     ia64_reload_gp ();
2075 }
2076
2077 /* Expand an atomic operation.  We want to perform MEM <CODE>= VAL atomically.
2078
2079    This differs from the generic code in that we know about the zero-extending
2080    properties of cmpxchg, and the zero-extending requirements of ar.ccv.  We
2081    also know that ld.acq+cmpxchg.rel equals a full barrier.
2082
2083    The loop we want to generate looks like
2084
2085         cmp_reg = mem;
2086       label:
2087         old_reg = cmp_reg;
2088         new_reg = cmp_reg op val;
2089         cmp_reg = compare-and-swap(mem, old_reg, new_reg)
2090         if (cmp_reg != old_reg)
2091           goto label;
2092
2093    Note that we only do the plain load from memory once.  Subsequent
2094    iterations use the value loaded by the compare-and-swap pattern.  */
2095
2096 void
2097 ia64_expand_atomic_op (enum rtx_code code, rtx mem, rtx val,
2098                        rtx old_dst, rtx new_dst)
2099 {
2100   enum machine_mode mode = GET_MODE (mem);
2101   rtx old_reg, new_reg, cmp_reg, ar_ccv, label;
2102   enum insn_code icode;
2103
2104   /* Special case for using fetchadd.  */
2105   if ((mode == SImode || mode == DImode)
2106       && (code == PLUS || code == MINUS)
2107       && fetchadd_operand (val, mode))
2108     {
2109       if (code == MINUS)
2110         val = GEN_INT (-INTVAL (val));
2111
2112       if (!old_dst)
2113         old_dst = gen_reg_rtx (mode);
2114
2115       emit_insn (gen_memory_barrier ());
2116
2117       if (mode == SImode)
2118         icode = CODE_FOR_fetchadd_acq_si;
2119       else
2120         icode = CODE_FOR_fetchadd_acq_di;
2121       emit_insn (GEN_FCN (icode) (old_dst, mem, val));
2122
2123       if (new_dst)
2124         {
2125           new_reg = expand_simple_binop (mode, PLUS, old_dst, val, new_dst,
2126                                          true, OPTAB_WIDEN);
2127           if (new_reg != new_dst)
2128             emit_move_insn (new_dst, new_reg);
2129         }
2130       return;
2131     }
2132
2133   /* Because of the volatile mem read, we get an ld.acq, which is the
2134      front half of the full barrier.  The end half is the cmpxchg.rel.  */
2135   gcc_assert (MEM_VOLATILE_P (mem));
2136
2137   old_reg = gen_reg_rtx (DImode);
2138   cmp_reg = gen_reg_rtx (DImode);
2139   label = gen_label_rtx ();
2140
2141   if (mode != DImode)
2142     {
2143       val = simplify_gen_subreg (DImode, val, mode, 0);
2144       emit_insn (gen_extend_insn (cmp_reg, mem, DImode, mode, 1));
2145     }
2146   else
2147     emit_move_insn (cmp_reg, mem);
2148
2149   emit_label (label);
2150
2151   ar_ccv = gen_rtx_REG (DImode, AR_CCV_REGNUM);
2152   emit_move_insn (old_reg, cmp_reg);
2153   emit_move_insn (ar_ccv, cmp_reg);
2154
2155   if (old_dst)
2156     emit_move_insn (old_dst, gen_lowpart (mode, cmp_reg));
2157
2158   new_reg = cmp_reg;
2159   if (code == NOT)
2160     {
2161       new_reg = expand_simple_unop (DImode, NOT, new_reg, NULL_RTX, true);
2162       code = AND;
2163     }
2164   new_reg = expand_simple_binop (DImode, code, new_reg, val, NULL_RTX,
2165                                  true, OPTAB_DIRECT);
2166
2167   if (mode != DImode)
2168     new_reg = gen_lowpart (mode, new_reg);
2169   if (new_dst)
2170     emit_move_insn (new_dst, new_reg);
2171
2172   switch (mode)
2173     {
2174     case QImode:  icode = CODE_FOR_cmpxchg_rel_qi;  break;
2175     case HImode:  icode = CODE_FOR_cmpxchg_rel_hi;  break;
2176     case SImode:  icode = CODE_FOR_cmpxchg_rel_si;  break;
2177     case DImode:  icode = CODE_FOR_cmpxchg_rel_di;  break;
2178     default:
2179       gcc_unreachable ();
2180     }
2181
2182   emit_insn (GEN_FCN (icode) (cmp_reg, mem, ar_ccv, new_reg));
2183
2184   emit_cmp_and_jump_insns (cmp_reg, old_reg, NE, NULL, DImode, true, label);
2185 }
2186 \f
2187 /* Begin the assembly file.  */
2188
2189 static void
2190 ia64_file_start (void)
2191 {
2192   /* Variable tracking should be run after all optimizations which change order
2193      of insns.  It also needs a valid CFG.  This can't be done in
2194      ia64_override_options, because flag_var_tracking is finalized after
2195      that.  */
2196   ia64_flag_var_tracking = flag_var_tracking;
2197   flag_var_tracking = 0;
2198
2199   default_file_start ();
2200   emit_safe_across_calls ();
2201 }
2202
2203 void
2204 emit_safe_across_calls (void)
2205 {
2206   unsigned int rs, re;
2207   int out_state;
2208
2209   rs = 1;
2210   out_state = 0;
2211   while (1)
2212     {
2213       while (rs < 64 && call_used_regs[PR_REG (rs)])
2214         rs++;
2215       if (rs >= 64)
2216         break;
2217       for (re = rs + 1; re < 64 && ! call_used_regs[PR_REG (re)]; re++)
2218         continue;
2219       if (out_state == 0)
2220         {
2221           fputs ("\t.pred.safe_across_calls ", asm_out_file);
2222           out_state = 1;
2223         }
2224       else
2225         fputc (',', asm_out_file);
2226       if (re == rs + 1)
2227         fprintf (asm_out_file, "p%u", rs);
2228       else
2229         fprintf (asm_out_file, "p%u-p%u", rs, re - 1);
2230       rs = re + 1;
2231     }
2232   if (out_state)
2233     fputc ('\n', asm_out_file);
2234 }
2235
2236 /* Globalize a declaration.  */
2237
2238 static void
2239 ia64_globalize_decl_name (FILE * stream, tree decl)
2240 {
2241   const char *name = XSTR (XEXP (DECL_RTL (decl), 0), 0);
2242   tree version_attr = lookup_attribute ("version_id", DECL_ATTRIBUTES (decl));
2243   if (version_attr)
2244     {
2245       tree v = TREE_VALUE (TREE_VALUE (version_attr));
2246       const char *p = TREE_STRING_POINTER (v);
2247       fprintf (stream, "\t.alias %s#, \"%s{%s}\"\n", name, name, p);
2248     }
2249   targetm.asm_out.globalize_label (stream, name);
2250   if (TREE_CODE (decl) == FUNCTION_DECL)
2251     ASM_OUTPUT_TYPE_DIRECTIVE (stream, name, "function");
2252 }
2253
2254 /* Helper function for ia64_compute_frame_size: find an appropriate general
2255    register to spill some special register to.  SPECIAL_SPILL_MASK contains
2256    bits in GR0 to GR31 that have already been allocated by this routine.
2257    TRY_LOCALS is true if we should attempt to locate a local regnum.  */
2258
2259 static int
2260 find_gr_spill (int try_locals)
2261 {
2262   int regno;
2263
2264   /* If this is a leaf function, first try an otherwise unused
2265      call-clobbered register.  */
2266   if (current_function_is_leaf)
2267     {
2268       for (regno = GR_REG (1); regno <= GR_REG (31); regno++)
2269         if (! regs_ever_live[regno]
2270             && call_used_regs[regno]
2271             && ! fixed_regs[regno]
2272             && ! global_regs[regno]
2273             && ((current_frame_info.gr_used_mask >> regno) & 1) == 0)
2274           {
2275             current_frame_info.gr_used_mask |= 1 << regno;
2276             return regno;
2277           }
2278     }
2279
2280   if (try_locals)
2281     {
2282       regno = current_frame_info.n_local_regs;
2283       /* If there is a frame pointer, then we can't use loc79, because
2284          that is HARD_FRAME_POINTER_REGNUM.  In particular, see the
2285          reg_name switching code in ia64_expand_prologue.  */
2286       if (regno < (80 - frame_pointer_needed))
2287         {
2288           current_frame_info.n_local_regs = regno + 1;
2289           return LOC_REG (0) + regno;
2290         }
2291     }
2292
2293   /* Failed to find a general register to spill to.  Must use stack.  */
2294   return 0;
2295 }
2296
2297 /* In order to make for nice schedules, we try to allocate every temporary
2298    to a different register.  We must of course stay away from call-saved,
2299    fixed, and global registers.  We must also stay away from registers
2300    allocated in current_frame_info.gr_used_mask, since those include regs
2301    used all through the prologue.
2302
2303    Any register allocated here must be used immediately.  The idea is to
2304    aid scheduling, not to solve data flow problems.  */
2305
2306 static int last_scratch_gr_reg;
2307
2308 static int
2309 next_scratch_gr_reg (void)
2310 {
2311   int i, regno;
2312
2313   for (i = 0; i < 32; ++i)
2314     {
2315       regno = (last_scratch_gr_reg + i + 1) & 31;
2316       if (call_used_regs[regno]
2317           && ! fixed_regs[regno]
2318           && ! global_regs[regno]
2319           && ((current_frame_info.gr_used_mask >> regno) & 1) == 0)
2320         {
2321           last_scratch_gr_reg = regno;
2322           return regno;
2323         }
2324     }
2325
2326   /* There must be _something_ available.  */
2327   gcc_unreachable ();
2328 }
2329
2330 /* Helper function for ia64_compute_frame_size, called through
2331    diddle_return_value.  Mark REG in current_frame_info.gr_used_mask.  */
2332
2333 static void
2334 mark_reg_gr_used_mask (rtx reg, void *data ATTRIBUTE_UNUSED)
2335 {
2336   unsigned int regno = REGNO (reg);
2337   if (regno < 32)
2338     {
2339       unsigned int i, n = hard_regno_nregs[regno][GET_MODE (reg)];
2340       for (i = 0; i < n; ++i)
2341         current_frame_info.gr_used_mask |= 1 << (regno + i);
2342     }
2343 }
2344
2345 /* Returns the number of bytes offset between the frame pointer and the stack
2346    pointer for the current function.  SIZE is the number of bytes of space
2347    needed for local variables.  */
2348
2349 static void
2350 ia64_compute_frame_size (HOST_WIDE_INT size)
2351 {
2352   HOST_WIDE_INT total_size;
2353   HOST_WIDE_INT spill_size = 0;
2354   HOST_WIDE_INT extra_spill_size = 0;
2355   HOST_WIDE_INT pretend_args_size;
2356   HARD_REG_SET mask;
2357   int n_spilled = 0;
2358   int spilled_gr_p = 0;
2359   int spilled_fr_p = 0;
2360   unsigned int regno;
2361   int i;
2362
2363   if (current_frame_info.initialized)
2364     return;
2365
2366   memset (&current_frame_info, 0, sizeof current_frame_info);
2367   CLEAR_HARD_REG_SET (mask);
2368
2369   /* Don't allocate scratches to the return register.  */
2370   diddle_return_value (mark_reg_gr_used_mask, NULL);
2371
2372   /* Don't allocate scratches to the EH scratch registers.  */
2373   if (cfun->machine->ia64_eh_epilogue_sp)
2374     mark_reg_gr_used_mask (cfun->machine->ia64_eh_epilogue_sp, NULL);
2375   if (cfun->machine->ia64_eh_epilogue_bsp)
2376     mark_reg_gr_used_mask (cfun->machine->ia64_eh_epilogue_bsp, NULL);
2377
2378   /* Find the size of the register stack frame.  We have only 80 local
2379      registers, because we reserve 8 for the inputs and 8 for the
2380      outputs.  */
2381
2382   /* Skip HARD_FRAME_POINTER_REGNUM (loc79) when frame_pointer_needed,
2383      since we'll be adjusting that down later.  */
2384   regno = LOC_REG (78) + ! frame_pointer_needed;
2385   for (; regno >= LOC_REG (0); regno--)
2386     if (regs_ever_live[regno])
2387       break;
2388   current_frame_info.n_local_regs = regno - LOC_REG (0) + 1;
2389
2390   /* For functions marked with the syscall_linkage attribute, we must mark
2391      all eight input registers as in use, so that locals aren't visible to
2392      the caller.  */
2393
2394   if (cfun->machine->n_varargs > 0
2395       || lookup_attribute ("syscall_linkage",
2396                            TYPE_ATTRIBUTES (TREE_TYPE (current_function_decl))))
2397     current_frame_info.n_input_regs = 8;
2398   else
2399     {
2400       for (regno = IN_REG (7); regno >= IN_REG (0); regno--)
2401         if (regs_ever_live[regno])
2402           break;
2403       current_frame_info.n_input_regs = regno - IN_REG (0) + 1;
2404     }
2405
2406   for (regno = OUT_REG (7); regno >= OUT_REG (0); regno--)
2407     if (regs_ever_live[regno])
2408       break;
2409   i = regno - OUT_REG (0) + 1;
2410
2411 #ifndef PROFILE_HOOK
2412   /* When -p profiling, we need one output register for the mcount argument.
2413      Likewise for -a profiling for the bb_init_func argument.  For -ax
2414      profiling, we need two output registers for the two bb_init_trace_func
2415      arguments.  */
2416   if (current_function_profile)
2417     i = MAX (i, 1);
2418 #endif
2419   current_frame_info.n_output_regs = i;
2420
2421   /* ??? No rotating register support yet.  */
2422   current_frame_info.n_rotate_regs = 0;
2423
2424   /* Discover which registers need spilling, and how much room that
2425      will take.  Begin with floating point and general registers,
2426      which will always wind up on the stack.  */
2427
2428   for (regno = FR_REG (2); regno <= FR_REG (127); regno++)
2429     if (regs_ever_live[regno] && ! call_used_regs[regno])
2430       {
2431         SET_HARD_REG_BIT (mask, regno);
2432         spill_size += 16;
2433         n_spilled += 1;
2434         spilled_fr_p = 1;
2435       }
2436
2437   for (regno = GR_REG (1); regno <= GR_REG (31); regno++)
2438     if (regs_ever_live[regno] && ! call_used_regs[regno])
2439       {
2440         SET_HARD_REG_BIT (mask, regno);
2441         spill_size += 8;
2442         n_spilled += 1;
2443         spilled_gr_p = 1;
2444       }
2445
2446   for (regno = BR_REG (1); regno <= BR_REG (7); regno++)
2447     if (regs_ever_live[regno] && ! call_used_regs[regno])
2448       {
2449         SET_HARD_REG_BIT (mask, regno);
2450         spill_size += 8;
2451         n_spilled += 1;
2452       }
2453
2454   /* Now come all special registers that might get saved in other
2455      general registers.  */
2456
2457   if (frame_pointer_needed)
2458     {
2459       current_frame_info.reg_fp = find_gr_spill (1);
2460       /* If we did not get a register, then we take LOC79.  This is guaranteed
2461          to be free, even if regs_ever_live is already set, because this is
2462          HARD_FRAME_POINTER_REGNUM.  This requires incrementing n_local_regs,
2463          as we don't count loc79 above.  */
2464       if (current_frame_info.reg_fp == 0)
2465         {
2466           current_frame_info.reg_fp = LOC_REG (79);
2467           current_frame_info.n_local_regs++;
2468         }
2469     }
2470
2471   if (! current_function_is_leaf)
2472     {
2473       /* Emit a save of BR0 if we call other functions.  Do this even
2474          if this function doesn't return, as EH depends on this to be
2475          able to unwind the stack.  */
2476       SET_HARD_REG_BIT (mask, BR_REG (0));
2477
2478       current_frame_info.reg_save_b0 = find_gr_spill (1);
2479       if (current_frame_info.reg_save_b0 == 0)
2480         {
2481           extra_spill_size += 8;
2482           n_spilled += 1;
2483         }
2484
2485       /* Similarly for ar.pfs.  */
2486       SET_HARD_REG_BIT (mask, AR_PFS_REGNUM);
2487       current_frame_info.reg_save_ar_pfs = find_gr_spill (1);
2488       if (current_frame_info.reg_save_ar_pfs == 0)
2489         {
2490           extra_spill_size += 8;
2491           n_spilled += 1;
2492         }
2493
2494       /* Similarly for gp.  Note that if we're calling setjmp, the stacked
2495          registers are clobbered, so we fall back to the stack.  */
2496       current_frame_info.reg_save_gp
2497         = (current_function_calls_setjmp ? 0 : find_gr_spill (1));
2498       if (current_frame_info.reg_save_gp == 0)
2499         {
2500           SET_HARD_REG_BIT (mask, GR_REG (1));
2501           spill_size += 8;
2502           n_spilled += 1;
2503         }
2504     }
2505   else
2506     {
2507       if (regs_ever_live[BR_REG (0)] && ! call_used_regs[BR_REG (0)])
2508         {
2509           SET_HARD_REG_BIT (mask, BR_REG (0));
2510           extra_spill_size += 8;
2511           n_spilled += 1;
2512         }
2513
2514       if (regs_ever_live[AR_PFS_REGNUM])
2515         {
2516           SET_HARD_REG_BIT (mask, AR_PFS_REGNUM);
2517           current_frame_info.reg_save_ar_pfs = find_gr_spill (1);
2518           if (current_frame_info.reg_save_ar_pfs == 0)
2519             {
2520               extra_spill_size += 8;
2521               n_spilled += 1;
2522             }
2523         }
2524     }
2525
2526   /* Unwind descriptor hackery: things are most efficient if we allocate
2527      consecutive GR save registers for RP, PFS, FP in that order. However,
2528      it is absolutely critical that FP get the only hard register that's
2529      guaranteed to be free, so we allocated it first.  If all three did
2530      happen to be allocated hard regs, and are consecutive, rearrange them
2531      into the preferred order now.  */
2532   if (current_frame_info.reg_fp != 0
2533       && current_frame_info.reg_save_b0 == current_frame_info.reg_fp + 1
2534       && current_frame_info.reg_save_ar_pfs == current_frame_info.reg_fp + 2)
2535     {
2536       current_frame_info.reg_save_b0 = current_frame_info.reg_fp;
2537       current_frame_info.reg_save_ar_pfs = current_frame_info.reg_fp + 1;
2538       current_frame_info.reg_fp = current_frame_info.reg_fp + 2;
2539     }
2540
2541   /* See if we need to store the predicate register block.  */
2542   for (regno = PR_REG (0); regno <= PR_REG (63); regno++)
2543     if (regs_ever_live[regno] && ! call_used_regs[regno])
2544       break;
2545   if (regno <= PR_REG (63))
2546     {
2547       SET_HARD_REG_BIT (mask, PR_REG (0));
2548       current_frame_info.reg_save_pr = find_gr_spill (1);
2549       if (current_frame_info.reg_save_pr == 0)
2550         {
2551           extra_spill_size += 8;
2552           n_spilled += 1;
2553         }
2554
2555       /* ??? Mark them all as used so that register renaming and such
2556          are free to use them.  */
2557       for (regno = PR_REG (0); regno <= PR_REG (63); regno++)
2558         regs_ever_live[regno] = 1;
2559     }
2560
2561   /* If we're forced to use st8.spill, we're forced to save and restore
2562      ar.unat as well.  The check for existing liveness allows inline asm
2563      to touch ar.unat.  */
2564   if (spilled_gr_p || cfun->machine->n_varargs
2565       || regs_ever_live[AR_UNAT_REGNUM])
2566     {
2567       regs_ever_live[AR_UNAT_REGNUM] = 1;
2568       SET_HARD_REG_BIT (mask, AR_UNAT_REGNUM);
2569       current_frame_info.reg_save_ar_unat = find_gr_spill (spill_size == 0);
2570       if (current_frame_info.reg_save_ar_unat == 0)
2571         {
2572           extra_spill_size += 8;
2573           n_spilled += 1;
2574         }
2575     }
2576
2577   if (regs_ever_live[AR_LC_REGNUM])
2578     {
2579       SET_HARD_REG_BIT (mask, AR_LC_REGNUM);
2580       current_frame_info.reg_save_ar_lc = find_gr_spill (spill_size == 0);
2581       if (current_frame_info.reg_save_ar_lc == 0)
2582         {
2583           extra_spill_size += 8;
2584           n_spilled += 1;
2585         }
2586     }
2587
2588   /* If we have an odd number of words of pretend arguments written to
2589      the stack, then the FR save area will be unaligned.  We round the
2590      size of this area up to keep things 16 byte aligned.  */
2591   if (spilled_fr_p)
2592     pretend_args_size = IA64_STACK_ALIGN (current_function_pretend_args_size);
2593   else
2594     pretend_args_size = current_function_pretend_args_size;
2595
2596   total_size = (spill_size + extra_spill_size + size + pretend_args_size
2597                 + current_function_outgoing_args_size);
2598   total_size = IA64_STACK_ALIGN (total_size);
2599
2600   /* We always use the 16-byte scratch area provided by the caller, but
2601      if we are a leaf function, there's no one to which we need to provide
2602      a scratch area.  */
2603   if (current_function_is_leaf)
2604     total_size = MAX (0, total_size - 16);
2605
2606   current_frame_info.total_size = total_size;
2607   current_frame_info.spill_cfa_off = pretend_args_size - 16;
2608   current_frame_info.spill_size = spill_size;
2609   current_frame_info.extra_spill_size = extra_spill_size;
2610   COPY_HARD_REG_SET (current_frame_info.mask, mask);
2611   current_frame_info.n_spilled = n_spilled;
2612   current_frame_info.initialized = reload_completed;
2613 }
2614
2615 /* Compute the initial difference between the specified pair of registers.  */
2616
2617 HOST_WIDE_INT
2618 ia64_initial_elimination_offset (int from, int to)
2619 {
2620   HOST_WIDE_INT offset;
2621
2622   ia64_compute_frame_size (get_frame_size ());
2623   switch (from)
2624     {
2625     case FRAME_POINTER_REGNUM:
2626       switch (to)
2627         {
2628         case HARD_FRAME_POINTER_REGNUM:
2629           if (current_function_is_leaf)
2630             offset = -current_frame_info.total_size;
2631           else
2632             offset = -(current_frame_info.total_size
2633                        - current_function_outgoing_args_size - 16);
2634           break;
2635
2636         case STACK_POINTER_REGNUM:
2637           if (current_function_is_leaf)
2638             offset = 0;
2639           else
2640             offset = 16 + current_function_outgoing_args_size;
2641           break;
2642
2643         default:
2644           gcc_unreachable ();
2645         }
2646       break;
2647
2648     case ARG_POINTER_REGNUM:
2649       /* Arguments start above the 16 byte save area, unless stdarg
2650          in which case we store through the 16 byte save area.  */
2651       switch (to)
2652         {
2653         case HARD_FRAME_POINTER_REGNUM:
2654           offset = 16 - current_function_pretend_args_size;
2655           break;
2656
2657         case STACK_POINTER_REGNUM:
2658           offset = (current_frame_info.total_size
2659                     + 16 - current_function_pretend_args_size);
2660           break;
2661
2662         default:
2663           gcc_unreachable ();
2664         }
2665       break;
2666
2667     default:
2668       gcc_unreachable ();
2669     }
2670
2671   return offset;
2672 }
2673
2674 /* If there are more than a trivial number of register spills, we use
2675    two interleaved iterators so that we can get two memory references
2676    per insn group.
2677
2678    In order to simplify things in the prologue and epilogue expanders,
2679    we use helper functions to fix up the memory references after the
2680    fact with the appropriate offsets to a POST_MODIFY memory mode.
2681    The following data structure tracks the state of the two iterators
2682    while insns are being emitted.  */
2683
2684 struct spill_fill_data
2685 {
2686   rtx init_after;               /* point at which to emit initializations */
2687   rtx init_reg[2];              /* initial base register */
2688   rtx iter_reg[2];              /* the iterator registers */
2689   rtx *prev_addr[2];            /* address of last memory use */
2690   rtx prev_insn[2];             /* the insn corresponding to prev_addr */
2691   HOST_WIDE_INT prev_off[2];    /* last offset */
2692   int n_iter;                   /* number of iterators in use */
2693   int next_iter;                /* next iterator to use */
2694   unsigned int save_gr_used_mask;
2695 };
2696
2697 static struct spill_fill_data spill_fill_data;
2698
2699 static void
2700 setup_spill_pointers (int n_spills, rtx init_reg, HOST_WIDE_INT cfa_off)
2701 {
2702   int i;
2703
2704   spill_fill_data.init_after = get_last_insn ();
2705   spill_fill_data.init_reg[0] = init_reg;
2706   spill_fill_data.init_reg[1] = init_reg;
2707   spill_fill_data.prev_addr[0] = NULL;
2708   spill_fill_data.prev_addr[1] = NULL;
2709   spill_fill_data.prev_insn[0] = NULL;
2710   spill_fill_data.prev_insn[1] = NULL;
2711   spill_fill_data.prev_off[0] = cfa_off;
2712   spill_fill_data.prev_off[1] = cfa_off;
2713   spill_fill_data.next_iter = 0;
2714   spill_fill_data.save_gr_used_mask = current_frame_info.gr_used_mask;
2715
2716   spill_fill_data.n_iter = 1 + (n_spills > 2);
2717   for (i = 0; i < spill_fill_data.n_iter; ++i)
2718     {
2719       int regno = next_scratch_gr_reg ();
2720       spill_fill_data.iter_reg[i] = gen_rtx_REG (DImode, regno);
2721       current_frame_info.gr_used_mask |= 1 << regno;
2722     }
2723 }
2724
2725 static void
2726 finish_spill_pointers (void)
2727 {
2728   current_frame_info.gr_used_mask = spill_fill_data.save_gr_used_mask;
2729 }
2730
2731 static rtx
2732 spill_restore_mem (rtx reg, HOST_WIDE_INT cfa_off)
2733 {
2734   int iter = spill_fill_data.next_iter;
2735   HOST_WIDE_INT disp = spill_fill_data.prev_off[iter] - cfa_off;
2736   rtx disp_rtx = GEN_INT (disp);
2737   rtx mem;
2738
2739   if (spill_fill_data.prev_addr[iter])
2740     {
2741       if (CONST_OK_FOR_N (disp))
2742         {
2743           *spill_fill_data.prev_addr[iter]
2744             = gen_rtx_POST_MODIFY (DImode, spill_fill_data.iter_reg[iter],
2745                                    gen_rtx_PLUS (DImode,
2746                                                  spill_fill_data.iter_reg[iter],
2747                                                  disp_rtx));
2748           REG_NOTES (spill_fill_data.prev_insn[iter])
2749             = gen_rtx_EXPR_LIST (REG_INC, spill_fill_data.iter_reg[iter],
2750                                  REG_NOTES (spill_fill_data.prev_insn[iter]));
2751         }
2752       else
2753         {
2754           /* ??? Could use register post_modify for loads.  */
2755           if (! CONST_OK_FOR_I (disp))
2756             {
2757               rtx tmp = gen_rtx_REG (DImode, next_scratch_gr_reg ());
2758               emit_move_insn (tmp, disp_rtx);
2759               disp_rtx = tmp;
2760             }
2761           emit_insn (gen_adddi3 (spill_fill_data.iter_reg[iter],
2762                                  spill_fill_data.iter_reg[iter], disp_rtx));
2763         }
2764     }
2765   /* Micro-optimization: if we've created a frame pointer, it's at
2766      CFA 0, which may allow the real iterator to be initialized lower,
2767      slightly increasing parallelism.  Also, if there are few saves
2768      it may eliminate the iterator entirely.  */
2769   else if (disp == 0
2770            && spill_fill_data.init_reg[iter] == stack_pointer_rtx
2771            && frame_pointer_needed)
2772     {
2773       mem = gen_rtx_MEM (GET_MODE (reg), hard_frame_pointer_rtx);
2774       set_mem_alias_set (mem, get_varargs_alias_set ());
2775       return mem;
2776     }
2777   else
2778     {
2779       rtx seq, insn;
2780
2781       if (disp == 0)
2782         seq = gen_movdi (spill_fill_data.iter_reg[iter],
2783                          spill_fill_data.init_reg[iter]);
2784       else
2785         {
2786           start_sequence ();
2787
2788           if (! CONST_OK_FOR_I (disp))
2789             {
2790               rtx tmp = gen_rtx_REG (DImode, next_scratch_gr_reg ());
2791               emit_move_insn (tmp, disp_rtx);
2792               disp_rtx = tmp;
2793             }
2794
2795           emit_insn (gen_adddi3 (spill_fill_data.iter_reg[iter],
2796                                  spill_fill_data.init_reg[iter],
2797                                  disp_rtx));
2798
2799           seq = get_insns ();
2800           end_sequence ();
2801         }
2802
2803       /* Careful for being the first insn in a sequence.  */
2804       if (spill_fill_data.init_after)
2805         insn = emit_insn_after (seq, spill_fill_data.init_after);
2806       else
2807         {
2808           rtx first = get_insns ();
2809           if (first)
2810             insn = emit_insn_before (seq, first);
2811           else
2812             insn = emit_insn (seq);
2813         }
2814       spill_fill_data.init_after = insn;
2815
2816       /* If DISP is 0, we may or may not have a further adjustment
2817          afterward.  If we do, then the load/store insn may be modified
2818          to be a post-modify.  If we don't, then this copy may be
2819          eliminated by copyprop_hardreg_forward, which makes this
2820          insn garbage, which runs afoul of the sanity check in
2821          propagate_one_insn.  So mark this insn as legal to delete.  */
2822       if (disp == 0)
2823         REG_NOTES(insn) = gen_rtx_EXPR_LIST (REG_MAYBE_DEAD, const0_rtx,
2824                                              REG_NOTES (insn));
2825     }
2826
2827   mem = gen_rtx_MEM (GET_MODE (reg), spill_fill_data.iter_reg[iter]);
2828
2829   /* ??? Not all of the spills are for varargs, but some of them are.
2830      The rest of the spills belong in an alias set of their own.  But
2831      it doesn't actually hurt to include them here.  */
2832   set_mem_alias_set (mem, get_varargs_alias_set ());
2833
2834   spill_fill_data.prev_addr[iter] = &XEXP (mem, 0);
2835   spill_fill_data.prev_off[iter] = cfa_off;
2836
2837   if (++iter >= spill_fill_data.n_iter)
2838     iter = 0;
2839   spill_fill_data.next_iter = iter;
2840
2841   return mem;
2842 }
2843
2844 static void
2845 do_spill (rtx (*move_fn) (rtx, rtx, rtx), rtx reg, HOST_WIDE_INT cfa_off,
2846           rtx frame_reg)
2847 {
2848   int iter = spill_fill_data.next_iter;
2849   rtx mem, insn;
2850
2851   mem = spill_restore_mem (reg, cfa_off);
2852   insn = emit_insn ((*move_fn) (mem, reg, GEN_INT (cfa_off)));
2853   spill_fill_data.prev_insn[iter] = insn;
2854
2855   if (frame_reg)
2856     {
2857       rtx base;
2858       HOST_WIDE_INT off;
2859
2860       RTX_FRAME_RELATED_P (insn) = 1;
2861
2862       /* Don't even pretend that the unwind code can intuit its way
2863          through a pair of interleaved post_modify iterators.  Just
2864          provide the correct answer.  */
2865
2866       if (frame_pointer_needed)
2867         {
2868           base = hard_frame_pointer_rtx;
2869           off = - cfa_off;
2870         }
2871       else
2872         {
2873           base = stack_pointer_rtx;
2874           off = current_frame_info.total_size - cfa_off;
2875         }
2876
2877       REG_NOTES (insn)
2878         = gen_rtx_EXPR_LIST (REG_FRAME_RELATED_EXPR,
2879                 gen_rtx_SET (VOIDmode,
2880                              gen_rtx_MEM (GET_MODE (reg),
2881                                           plus_constant (base, off)),
2882                              frame_reg),
2883                 REG_NOTES (insn));
2884     }
2885 }
2886
2887 static void
2888 do_restore (rtx (*move_fn) (rtx, rtx, rtx), rtx reg, HOST_WIDE_INT cfa_off)
2889 {
2890   int iter = spill_fill_data.next_iter;
2891   rtx insn;
2892
2893   insn = emit_insn ((*move_fn) (reg, spill_restore_mem (reg, cfa_off),
2894                                 GEN_INT (cfa_off)));
2895   spill_fill_data.prev_insn[iter] = insn;
2896 }
2897
2898 /* Wrapper functions that discards the CONST_INT spill offset.  These
2899    exist so that we can give gr_spill/gr_fill the offset they need and
2900    use a consistent function interface.  */
2901
2902 static rtx
2903 gen_movdi_x (rtx dest, rtx src, rtx offset ATTRIBUTE_UNUSED)
2904 {
2905   return gen_movdi (dest, src);
2906 }
2907
2908 static rtx
2909 gen_fr_spill_x (rtx dest, rtx src, rtx offset ATTRIBUTE_UNUSED)
2910 {
2911   return gen_fr_spill (dest, src);
2912 }
2913
2914 static rtx
2915 gen_fr_restore_x (rtx dest, rtx src, rtx offset ATTRIBUTE_UNUSED)
2916 {
2917   return gen_fr_restore (dest, src);
2918 }
2919
2920 /* Called after register allocation to add any instructions needed for the
2921    prologue.  Using a prologue insn is favored compared to putting all of the
2922    instructions in output_function_prologue(), since it allows the scheduler
2923    to intermix instructions with the saves of the caller saved registers.  In
2924    some cases, it might be necessary to emit a barrier instruction as the last
2925    insn to prevent such scheduling.
2926
2927    Also any insns generated here should have RTX_FRAME_RELATED_P(insn) = 1
2928    so that the debug info generation code can handle them properly.
2929
2930    The register save area is layed out like so:
2931    cfa+16
2932         [ varargs spill area ]
2933         [ fr register spill area ]
2934         [ br register spill area ]
2935         [ ar register spill area ]
2936         [ pr register spill area ]
2937         [ gr register spill area ] */
2938
2939 /* ??? Get inefficient code when the frame size is larger than can fit in an
2940    adds instruction.  */
2941
2942 void
2943 ia64_expand_prologue (void)
2944 {
2945   rtx insn, ar_pfs_save_reg, ar_unat_save_reg;
2946   int i, epilogue_p, regno, alt_regno, cfa_off, n_varargs;
2947   rtx reg, alt_reg;
2948
2949   ia64_compute_frame_size (get_frame_size ());
2950   last_scratch_gr_reg = 15;
2951
2952   /* If there is no epilogue, then we don't need some prologue insns.
2953      We need to avoid emitting the dead prologue insns, because flow
2954      will complain about them.  */
2955   if (optimize)
2956     {
2957       edge e;
2958       edge_iterator ei;
2959
2960       FOR_EACH_EDGE (e, ei, EXIT_BLOCK_PTR->preds)
2961         if ((e->flags & EDGE_FAKE) == 0
2962             && (e->flags & EDGE_FALLTHRU) != 0)
2963           break;
2964       epilogue_p = (e != NULL);
2965     }
2966   else
2967     epilogue_p = 1;
2968
2969   /* Set the local, input, and output register names.  We need to do this
2970      for GNU libc, which creates crti.S/crtn.S by splitting initfini.c in
2971      half.  If we use in/loc/out register names, then we get assembler errors
2972      in crtn.S because there is no alloc insn or regstk directive in there.  */
2973   if (! TARGET_REG_NAMES)
2974     {
2975       int inputs = current_frame_info.n_input_regs;
2976       int locals = current_frame_info.n_local_regs;
2977       int outputs = current_frame_info.n_output_regs;
2978
2979       for (i = 0; i < inputs; i++)
2980         reg_names[IN_REG (i)] = ia64_reg_numbers[i];
2981       for (i = 0; i < locals; i++)
2982         reg_names[LOC_REG (i)] = ia64_reg_numbers[inputs + i];
2983       for (i = 0; i < outputs; i++)
2984         reg_names[OUT_REG (i)] = ia64_reg_numbers[inputs + locals + i];
2985     }
2986
2987   /* Set the frame pointer register name.  The regnum is logically loc79,
2988      but of course we'll not have allocated that many locals.  Rather than
2989      worrying about renumbering the existing rtxs, we adjust the name.  */
2990   /* ??? This code means that we can never use one local register when
2991      there is a frame pointer.  loc79 gets wasted in this case, as it is
2992      renamed to a register that will never be used.  See also the try_locals
2993      code in find_gr_spill.  */
2994   if (current_frame_info.reg_fp)
2995     {
2996       const char *tmp = reg_names[HARD_FRAME_POINTER_REGNUM];
2997       reg_names[HARD_FRAME_POINTER_REGNUM]
2998         = reg_names[current_frame_info.reg_fp];
2999       reg_names[current_frame_info.reg_fp] = tmp;
3000     }
3001
3002   /* We don't need an alloc instruction if we've used no outputs or locals.  */
3003   if (current_frame_info.n_local_regs == 0
3004       && current_frame_info.n_output_regs == 0
3005       && current_frame_info.n_input_regs <= current_function_args_info.int_regs
3006       && !TEST_HARD_REG_BIT (current_frame_info.mask, AR_PFS_REGNUM))
3007     {
3008       /* If there is no alloc, but there are input registers used, then we
3009          need a .regstk directive.  */
3010       current_frame_info.need_regstk = (TARGET_REG_NAMES != 0);
3011       ar_pfs_save_reg = NULL_RTX;
3012     }
3013   else
3014     {
3015       current_frame_info.need_regstk = 0;
3016
3017       if (current_frame_info.reg_save_ar_pfs)
3018         regno = current_frame_info.reg_save_ar_pfs;
3019       else
3020         regno = next_scratch_gr_reg ();
3021       ar_pfs_save_reg = gen_rtx_REG (DImode, regno);
3022
3023       insn = emit_insn (gen_alloc (ar_pfs_save_reg,
3024                                    GEN_INT (current_frame_info.n_input_regs),
3025                                    GEN_INT (current_frame_info.n_local_regs),
3026                                    GEN_INT (current_frame_info.n_output_regs),
3027                                    GEN_INT (current_frame_info.n_rotate_regs)));
3028       RTX_FRAME_RELATED_P (insn) = (current_frame_info.reg_save_ar_pfs != 0);
3029     }
3030
3031   /* Set up frame pointer, stack pointer, and spill iterators.  */
3032
3033   n_varargs = cfun->machine->n_varargs;
3034   setup_spill_pointers (current_frame_info.n_spilled + n_varargs,
3035                         stack_pointer_rtx, 0);
3036
3037   if (frame_pointer_needed)
3038     {
3039       insn = emit_move_insn (hard_frame_pointer_rtx, stack_pointer_rtx);
3040       RTX_FRAME_RELATED_P (insn) = 1;
3041     }
3042
3043   if (current_frame_info.total_size != 0)
3044     {
3045       rtx frame_size_rtx = GEN_INT (- current_frame_info.total_size);
3046       rtx offset;
3047
3048       if (CONST_OK_FOR_I (- current_frame_info.total_size))
3049         offset = frame_size_rtx;
3050       else
3051         {
3052           regno = next_scratch_gr_reg ();
3053           offset = gen_rtx_REG (DImode, regno);
3054           emit_move_insn (offset, frame_size_rtx);
3055         }
3056
3057       insn = emit_insn (gen_adddi3 (stack_pointer_rtx,
3058                                     stack_pointer_rtx, offset));
3059
3060       if (! frame_pointer_needed)
3061         {
3062           RTX_FRAME_RELATED_P (insn) = 1;
3063           if (GET_CODE (offset) != CONST_INT)
3064             {
3065               REG_NOTES (insn)
3066                 = gen_rtx_EXPR_LIST (REG_FRAME_RELATED_EXPR,
3067                         gen_rtx_SET (VOIDmode,
3068                                      stack_pointer_rtx,
3069                                      gen_rtx_PLUS (DImode,
3070                                                    stack_pointer_rtx,
3071                                                    frame_size_rtx)),
3072                         REG_NOTES (insn));
3073             }
3074         }
3075
3076       /* ??? At this point we must generate a magic insn that appears to
3077          modify the stack pointer, the frame pointer, and all spill
3078          iterators.  This would allow the most scheduling freedom.  For
3079          now, just hard stop.  */
3080       emit_insn (gen_blockage ());
3081     }
3082
3083   /* Must copy out ar.unat before doing any integer spills.  */
3084   if (TEST_HARD_REG_BIT (current_frame_info.mask, AR_UNAT_REGNUM))
3085     {
3086       if (current_frame_info.reg_save_ar_unat)
3087         ar_unat_save_reg
3088           = gen_rtx_REG (DImode, current_frame_info.reg_save_ar_unat);
3089       else
3090         {
3091           alt_regno = next_scratch_gr_reg ();
3092           ar_unat_save_reg = gen_rtx_REG (DImode, alt_regno);
3093           current_frame_info.gr_used_mask |= 1 << alt_regno;
3094         }
3095
3096       reg = gen_rtx_REG (DImode, AR_UNAT_REGNUM);
3097       insn = emit_move_insn (ar_unat_save_reg, reg);
3098       RTX_FRAME_RELATED_P (insn) = (current_frame_info.reg_save_ar_unat != 0);
3099
3100       /* Even if we're not going to generate an epilogue, we still
3101          need to save the register so that EH works.  */
3102       if (! epilogue_p && current_frame_info.reg_save_ar_unat)
3103         emit_insn (gen_prologue_use (ar_unat_save_reg));
3104     }
3105   else
3106     ar_unat_save_reg = NULL_RTX;
3107
3108   /* Spill all varargs registers.  Do this before spilling any GR registers,
3109      since we want the UNAT bits for the GR registers to override the UNAT
3110      bits from varargs, which we don't care about.  */
3111
3112   cfa_off = -16;
3113   for (regno = GR_ARG_FIRST + 7; n_varargs > 0; --n_varargs, --regno)
3114     {
3115       reg = gen_rtx_REG (DImode, regno);
3116       do_spill (gen_gr_spill, reg, cfa_off += 8, NULL_RTX);
3117     }
3118
3119   /* Locate the bottom of the register save area.  */
3120   cfa_off = (current_frame_info.spill_cfa_off
3121              + current_frame_info.spill_size
3122              + current_frame_info.extra_spill_size);
3123
3124   /* Save the predicate register block either in a register or in memory.  */
3125   if (TEST_HARD_REG_BIT (current_frame_info.mask, PR_REG (0)))
3126     {
3127       reg = gen_rtx_REG (DImode, PR_REG (0));
3128       if (current_frame_info.reg_save_pr != 0)
3129         {
3130           alt_reg = gen_rtx_REG (DImode, current_frame_info.reg_save_pr);
3131           insn = emit_move_insn (alt_reg, reg);
3132
3133           /* ??? Denote pr spill/fill by a DImode move that modifies all
3134              64 hard registers.  */
3135           RTX_FRAME_RELATED_P (insn) = 1;
3136           REG_NOTES (insn)
3137             = gen_rtx_EXPR_LIST (REG_FRAME_RELATED_EXPR,
3138                         gen_rtx_SET (VOIDmode, alt_reg, reg),
3139                         REG_NOTES (insn));
3140
3141           /* Even if we're not going to generate an epilogue, we still
3142              need to save the register so that EH works.  */
3143           if (! epilogue_p)
3144             emit_insn (gen_prologue_use (alt_reg));
3145         }
3146       else
3147         {
3148           alt_regno = next_scratch_gr_reg ();
3149           alt_reg = gen_rtx_REG (DImode, alt_regno);
3150           insn = emit_move_insn (alt_reg, reg);
3151           do_spill (gen_movdi_x, alt_reg, cfa_off, reg);
3152           cfa_off -= 8;
3153         }
3154     }
3155
3156   /* Handle AR regs in numerical order.  All of them get special handling.  */
3157   if (TEST_HARD_REG_BIT (current_frame_info.mask, AR_UNAT_REGNUM)
3158       && current_frame_info.reg_save_ar_unat == 0)
3159     {
3160       reg = gen_rtx_REG (DImode, AR_UNAT_REGNUM);
3161       do_spill (gen_movdi_x, ar_unat_save_reg, cfa_off, reg);
3162       cfa_off -= 8;
3163     }
3164
3165   /* The alloc insn already copied ar.pfs into a general register.  The
3166      only thing we have to do now is copy that register to a stack slot
3167      if we'd not allocated a local register for the job.  */
3168   if (TEST_HARD_REG_BIT (current_frame_info.mask, AR_PFS_REGNUM)
3169       && current_frame_info.reg_save_ar_pfs == 0)
3170     {
3171       reg = gen_rtx_REG (DImode, AR_PFS_REGNUM);
3172       do_spill (gen_movdi_x, ar_pfs_save_reg, cfa_off, reg);
3173       cfa_off -= 8;
3174     }
3175
3176   if (TEST_HARD_REG_BIT (current_frame_info.mask, AR_LC_REGNUM))
3177     {
3178       reg = gen_rtx_REG (DImode, AR_LC_REGNUM);
3179       if (current_frame_info.reg_save_ar_lc != 0)
3180         {
3181           alt_reg = gen_rtx_REG (DImode, current_frame_info.reg_save_ar_lc);
3182           insn = emit_move_insn (alt_reg, reg);
3183           RTX_FRAME_RELATED_P (insn) = 1;
3184
3185           /* Even if we're not going to generate an epilogue, we still
3186              need to save the register so that EH works.  */
3187           if (! epilogue_p)
3188             emit_insn (gen_prologue_use (alt_reg));
3189         }
3190       else
3191         {
3192           alt_regno = next_scratch_gr_reg ();
3193           alt_reg = gen_rtx_REG (DImode, alt_regno);
3194           emit_move_insn (alt_reg, reg);
3195           do_spill (gen_movdi_x, alt_reg, cfa_off, reg);
3196           cfa_off -= 8;
3197         }
3198     }
3199
3200   /* Save the return pointer.  */
3201   if (TEST_HARD_REG_BIT (current_frame_info.mask, BR_REG (0)))
3202     {
3203       reg = gen_rtx_REG (DImode, BR_REG (0));
3204       if (current_frame_info.reg_save_b0 != 0)
3205         {
3206           alt_reg = gen_rtx_REG (DImode, current_frame_info.reg_save_b0);
3207           insn = emit_move_insn (alt_reg, reg);
3208           RTX_FRAME_RELATED_P (insn) = 1;
3209
3210           /* Even if we're not going to generate an epilogue, we still
3211              need to save the register so that EH works.  */
3212           if (! epilogue_p)
3213             emit_insn (gen_prologue_use (alt_reg));
3214         }
3215       else
3216         {
3217           alt_regno = next_scratch_gr_reg ();
3218           alt_reg = gen_rtx_REG (DImode, alt_regno);
3219           emit_move_insn (alt_reg, reg);
3220           do_spill (gen_movdi_x, alt_reg, cfa_off, reg);
3221           cfa_off -= 8;
3222         }
3223     }
3224
3225   if (current_frame_info.reg_save_gp)
3226     {
3227       insn = emit_move_insn (gen_rtx_REG (DImode,
3228                                           current_frame_info.reg_save_gp),
3229                              pic_offset_table_rtx);
3230       /* We don't know for sure yet if this is actually needed, since
3231          we've not split the PIC call patterns.  If all of the calls
3232          are indirect, and not followed by any uses of the gp, then
3233          this save is dead.  Allow it to go away.  */
3234       REG_NOTES (insn)
3235         = gen_rtx_EXPR_LIST (REG_MAYBE_DEAD, const0_rtx, REG_NOTES (insn));
3236     }
3237
3238   /* We should now be at the base of the gr/br/fr spill area.  */
3239   gcc_assert (cfa_off == (current_frame_info.spill_cfa_off
3240                           + current_frame_info.spill_size));
3241
3242   /* Spill all general registers.  */
3243   for (regno = GR_REG (1); regno <= GR_REG (31); ++regno)
3244     if (TEST_HARD_REG_BIT (current_frame_info.mask, regno))
3245       {
3246         reg = gen_rtx_REG (DImode, regno);
3247         do_spill (gen_gr_spill, reg, cfa_off, reg);
3248         cfa_off -= 8;
3249       }
3250
3251   /* Spill the rest of the BR registers.  */
3252   for (regno = BR_REG (1); regno <= BR_REG (7); ++regno)
3253     if (TEST_HARD_REG_BIT (current_frame_info.mask, regno))
3254       {
3255         alt_regno = next_scratch_gr_reg ();
3256         alt_reg = gen_rtx_REG (DImode, alt_regno);
3257         reg = gen_rtx_REG (DImode, regno);
3258         emit_move_insn (alt_reg, reg);
3259         do_spill (gen_movdi_x, alt_reg, cfa_off, reg);
3260         cfa_off -= 8;
3261       }
3262
3263   /* Align the frame and spill all FR registers.  */
3264   for (regno = FR_REG (2); regno <= FR_REG (127); ++regno)
3265     if (TEST_HARD_REG_BIT (current_frame_info.mask, regno))
3266       {
3267         gcc_assert (!(cfa_off & 15));
3268         reg = gen_rtx_REG (XFmode, regno);
3269         do_spill (gen_fr_spill_x, reg, cfa_off, reg);
3270         cfa_off -= 16;
3271       }
3272
3273   gcc_assert (cfa_off == current_frame_info.spill_cfa_off);
3274
3275   finish_spill_pointers ();
3276 }
3277
3278 /* Called after register allocation to add any instructions needed for the
3279    epilogue.  Using an epilogue insn is favored compared to putting all of the
3280    instructions in output_function_prologue(), since it allows the scheduler
3281    to intermix instructions with the saves of the caller saved registers.  In
3282    some cases, it might be necessary to emit a barrier instruction as the last
3283    insn to prevent such scheduling.  */
3284
3285 void
3286 ia64_expand_epilogue (int sibcall_p)
3287 {
3288   rtx insn, reg, alt_reg, ar_unat_save_reg;
3289   int regno, alt_regno, cfa_off;
3290
3291   ia64_compute_frame_size (get_frame_size ());
3292
3293   /* If there is a frame pointer, then we use it instead of the stack
3294      pointer, so that the stack pointer does not need to be valid when
3295      the epilogue starts.  See EXIT_IGNORE_STACK.  */
3296   if (frame_pointer_needed)
3297     setup_spill_pointers (current_frame_info.n_spilled,
3298                           hard_frame_pointer_rtx, 0);
3299   else
3300     setup_spill_pointers (current_frame_info.n_spilled, stack_pointer_rtx,
3301                           current_frame_info.total_size);
3302
3303   if (current_frame_info.total_size != 0)
3304     {
3305       /* ??? At this point we must generate a magic insn that appears to
3306          modify the spill iterators and the frame pointer.  This would
3307          allow the most scheduling freedom.  For now, just hard stop.  */
3308       emit_insn (gen_blockage ());
3309     }
3310
3311   /* Locate the bottom of the register save area.  */
3312   cfa_off = (current_frame_info.spill_cfa_off
3313              + current_frame_info.spill_size
3314              + current_frame_info.extra_spill_size);
3315
3316   /* Restore the predicate registers.  */
3317   if (TEST_HARD_REG_BIT (current_frame_info.mask, PR_REG (0)))
3318     {
3319       if (current_frame_info.reg_save_pr != 0)
3320         alt_reg = gen_rtx_REG (DImode, current_frame_info.reg_save_pr);
3321       else
3322         {
3323           alt_regno = next_scratch_gr_reg ();
3324           alt_reg = gen_rtx_REG (DImode, alt_regno);
3325           do_restore (gen_movdi_x, alt_reg, cfa_off);
3326           cfa_off -= 8;
3327         }
3328       reg = gen_rtx_REG (DImode, PR_REG (0));
3329       emit_move_insn (reg, alt_reg);
3330     }
3331
3332   /* Restore the application registers.  */
3333
3334   /* Load the saved unat from the stack, but do not restore it until
3335      after the GRs have been restored.  */
3336   if (TEST_HARD_REG_BIT (current_frame_info.mask, AR_UNAT_REGNUM))
3337     {
3338       if (current_frame_info.reg_save_ar_unat != 0)
3339         ar_unat_save_reg
3340           = gen_rtx_REG (DImode, current_frame_info.reg_save_ar_unat);
3341       else
3342         {
3343           alt_regno = next_scratch_gr_reg ();
3344           ar_unat_save_reg = gen_rtx_REG (DImode, alt_regno);
3345           current_frame_info.gr_used_mask |= 1 << alt_regno;
3346           do_restore (gen_movdi_x, ar_unat_save_reg, cfa_off);
3347           cfa_off -= 8;
3348         }
3349     }
3350   else
3351     ar_unat_save_reg = NULL_RTX;
3352
3353   if (current_frame_info.reg_save_ar_pfs != 0)
3354     {
3355       alt_reg = gen_rtx_REG (DImode, current_frame_info.reg_save_ar_pfs);
3356       reg = gen_rtx_REG (DImode, AR_PFS_REGNUM);
3357       emit_move_insn (reg, alt_reg);
3358     }
3359   else if (TEST_HARD_REG_BIT (current_frame_info.mask, AR_PFS_REGNUM))
3360     {
3361       alt_regno = next_scratch_gr_reg ();
3362       alt_reg = gen_rtx_REG (DImode, alt_regno);
3363       do_restore (gen_movdi_x, alt_reg, cfa_off);
3364       cfa_off -= 8;
3365       reg = gen_rtx_REG (DImode, AR_PFS_REGNUM);
3366       emit_move_insn (reg, alt_reg);
3367     }
3368
3369   if (TEST_HARD_REG_BIT (current_frame_info.mask, AR_LC_REGNUM))
3370     {
3371       if (current_frame_info.reg_save_ar_lc != 0)
3372         alt_reg = gen_rtx_REG (DImode, current_frame_info.reg_save_ar_lc);
3373       else
3374         {
3375           alt_regno = next_scratch_gr_reg ();
3376           alt_reg = gen_rtx_REG (DImode, alt_regno);
3377           do_restore (gen_movdi_x, alt_reg, cfa_off);
3378           cfa_off -= 8;
3379         }
3380       reg = gen_rtx_REG (DImode, AR_LC_REGNUM);
3381       emit_move_insn (reg, alt_reg);
3382     }
3383
3384   /* Restore the return pointer.  */
3385   if (TEST_HARD_REG_BIT (current_frame_info.mask, BR_REG (0)))
3386     {
3387       if (current_frame_info.reg_save_b0 != 0)
3388         alt_reg = gen_rtx_REG (DImode, current_frame_info.reg_save_b0);
3389       else
3390         {
3391           alt_regno = next_scratch_gr_reg ();
3392           alt_reg = gen_rtx_REG (DImode, alt_regno);
3393           do_restore (gen_movdi_x, alt_reg, cfa_off);
3394           cfa_off -= 8;
3395         }
3396       reg = gen_rtx_REG (DImode, BR_REG (0));
3397       emit_move_insn (reg, alt_reg);
3398     }
3399
3400   /* We should now be at the base of the gr/br/fr spill area.  */
3401   gcc_assert (cfa_off == (current_frame_info.spill_cfa_off
3402                           + current_frame_info.spill_size));
3403
3404   /* The GP may be stored on the stack in the prologue, but it's
3405      never restored in the epilogue.  Skip the stack slot.  */
3406   if (TEST_HARD_REG_BIT (current_frame_info.mask, GR_REG (1)))
3407     cfa_off -= 8;
3408
3409   /* Restore all general registers.  */
3410   for (regno = GR_REG (2); regno <= GR_REG (31); ++regno)
3411     if (TEST_HARD_REG_BIT (current_frame_info.mask, regno))
3412       {
3413         reg = gen_rtx_REG (DImode, regno);
3414         do_restore (gen_gr_restore, reg, cfa_off);
3415         cfa_off -= 8;
3416       }
3417
3418   /* Restore the branch registers.  */
3419   for (regno = BR_REG (1); regno <= BR_REG (7); ++regno)
3420     if (TEST_HARD_REG_BIT (current_frame_info.mask, regno))
3421       {
3422         alt_regno = next_scratch_gr_reg ();
3423         alt_reg = gen_rtx_REG (DImode, alt_regno);
3424         do_restore (gen_movdi_x, alt_reg, cfa_off);
3425         cfa_off -= 8;
3426         reg = gen_rtx_REG (DImode, regno);
3427         emit_move_insn (reg, alt_reg);
3428       }
3429
3430   /* Restore floating point registers.  */
3431   for (regno = FR_REG (2); regno <= FR_REG (127); ++regno)
3432     if (TEST_HARD_REG_BIT (current_frame_info.mask, regno))
3433       {
3434         gcc_assert (!(cfa_off & 15));
3435         reg = gen_rtx_REG (XFmode, regno);
3436         do_restore (gen_fr_restore_x, reg, cfa_off);
3437         cfa_off -= 16;
3438       }
3439
3440   /* Restore ar.unat for real.  */
3441   if (TEST_HARD_REG_BIT (current_frame_info.mask, AR_UNAT_REGNUM))
3442     {
3443       reg = gen_rtx_REG (DImode, AR_UNAT_REGNUM);
3444       emit_move_insn (reg, ar_unat_save_reg);
3445     }
3446
3447   gcc_assert (cfa_off == current_frame_info.spill_cfa_off);
3448
3449   finish_spill_pointers ();
3450
3451   if (current_frame_info.total_size || cfun->machine->ia64_eh_epilogue_sp)
3452     {
3453       /* ??? At this point we must generate a magic insn that appears to
3454          modify the spill iterators, the stack pointer, and the frame
3455          pointer.  This would allow the most scheduling freedom.  For now,
3456          just hard stop.  */
3457       emit_insn (gen_blockage ());
3458     }
3459
3460   if (cfun->machine->ia64_eh_epilogue_sp)
3461     emit_move_insn (stack_pointer_rtx, cfun->machine->ia64_eh_epilogue_sp);
3462   else if (frame_pointer_needed)
3463     {
3464       insn = emit_move_insn (stack_pointer_rtx, hard_frame_pointer_rtx);
3465       RTX_FRAME_RELATED_P (insn) = 1;
3466     }
3467   else if (current_frame_info.total_size)
3468     {
3469       rtx offset, frame_size_rtx;
3470
3471       frame_size_rtx = GEN_INT (current_frame_info.total_size);
3472       if (CONST_OK_FOR_I (current_frame_info.total_size))
3473         offset = frame_size_rtx;
3474       else
3475         {
3476           regno = next_scratch_gr_reg ();
3477           offset = gen_rtx_REG (DImode, regno);
3478           emit_move_insn (offset, frame_size_rtx);
3479         }
3480
3481       insn = emit_insn (gen_adddi3 (stack_pointer_rtx, stack_pointer_rtx,
3482                                     offset));
3483
3484       RTX_FRAME_RELATED_P (insn) = 1;
3485       if (GET_CODE (offset) != CONST_INT)
3486         {
3487           REG_NOTES (insn)
3488             = gen_rtx_EXPR_LIST (REG_FRAME_RELATED_EXPR,
3489                         gen_rtx_SET (VOIDmode,
3490                                      stack_pointer_rtx,
3491                                      gen_rtx_PLUS (DImode,
3492                                                    stack_pointer_rtx,
3493                                                    frame_size_rtx)),
3494                         REG_NOTES (insn));
3495         }
3496     }
3497
3498   if (cfun->machine->ia64_eh_epilogue_bsp)
3499     emit_insn (gen_set_bsp (cfun->machine->ia64_eh_epilogue_bsp));
3500
3501   if (! sibcall_p)
3502     emit_jump_insn (gen_return_internal (gen_rtx_REG (DImode, BR_REG (0))));
3503   else
3504     {
3505       int fp = GR_REG (2);
3506       /* We need a throw away register here, r0 and r1 are reserved, so r2 is the
3507          first available call clobbered register.  If there was a frame_pointer
3508          register, we may have swapped the names of r2 and HARD_FRAME_POINTER_REGNUM,
3509          so we have to make sure we're using the string "r2" when emitting
3510          the register name for the assembler.  */
3511       if (current_frame_info.reg_fp && current_frame_info.reg_fp == GR_REG (2))
3512         fp = HARD_FRAME_POINTER_REGNUM;
3513
3514       /* We must emit an alloc to force the input registers to become output
3515          registers.  Otherwise, if the callee tries to pass its parameters
3516          through to another call without an intervening alloc, then these
3517          values get lost.  */
3518       /* ??? We don't need to preserve all input registers.  We only need to
3519          preserve those input registers used as arguments to the sibling call.
3520          It is unclear how to compute that number here.  */
3521       if (current_frame_info.n_input_regs != 0)
3522         {
3523           rtx n_inputs = GEN_INT (current_frame_info.n_input_regs);
3524           insn = emit_insn (gen_alloc (gen_rtx_REG (DImode, fp),
3525                                 const0_rtx, const0_rtx,
3526                                 n_inputs, const0_rtx));
3527           RTX_FRAME_RELATED_P (insn) = 1;
3528         }
3529     }
3530 }
3531
3532 /* Return 1 if br.ret can do all the work required to return from a
3533    function.  */
3534
3535 int
3536 ia64_direct_return (void)
3537 {
3538   if (reload_completed && ! frame_pointer_needed)
3539     {
3540       ia64_compute_frame_size (get_frame_size ());
3541
3542       return (current_frame_info.total_size == 0
3543               && current_frame_info.n_spilled == 0
3544               && current_frame_info.reg_save_b0 == 0
3545               && current_frame_info.reg_save_pr == 0
3546               && current_frame_info.reg_save_ar_pfs == 0
3547               && current_frame_info.reg_save_ar_unat == 0
3548               && current_frame_info.reg_save_ar_lc == 0);
3549     }
3550   return 0;
3551 }
3552
3553 /* Return the magic cookie that we use to hold the return address
3554    during early compilation.  */
3555
3556 rtx
3557 ia64_return_addr_rtx (HOST_WIDE_INT count, rtx frame ATTRIBUTE_UNUSED)
3558 {
3559   if (count != 0)
3560     return NULL;
3561   return gen_rtx_UNSPEC (Pmode, gen_rtvec (1, const0_rtx), UNSPEC_RET_ADDR);
3562 }
3563
3564 /* Split this value after reload, now that we know where the return
3565    address is saved.  */
3566
3567 void
3568 ia64_split_return_addr_rtx (rtx dest)
3569 {
3570   rtx src;
3571
3572   if (TEST_HARD_REG_BIT (current_frame_info.mask, BR_REG (0)))
3573     {
3574       if (current_frame_info.reg_save_b0 != 0)
3575         src = gen_rtx_REG (DImode, current_frame_info.reg_save_b0);
3576       else
3577         {
3578           HOST_WIDE_INT off;
3579           unsigned int regno;
3580
3581           /* Compute offset from CFA for BR0.  */
3582           /* ??? Must be kept in sync with ia64_expand_prologue.  */
3583           off = (current_frame_info.spill_cfa_off
3584                  + current_frame_info.spill_size);
3585           for (regno = GR_REG (1); regno <= GR_REG (31); ++regno)
3586             if (TEST_HARD_REG_BIT (current_frame_info.mask, regno))
3587               off -= 8;
3588
3589           /* Convert CFA offset to a register based offset.  */
3590           if (frame_pointer_needed)
3591             src = hard_frame_pointer_rtx;
3592           else
3593             {
3594               src = stack_pointer_rtx;
3595               off += current_frame_info.total_size;
3596             }
3597
3598           /* Load address into scratch register.  */
3599           if (CONST_OK_FOR_I (off))
3600             emit_insn (gen_adddi3 (dest, src, GEN_INT (off)));
3601           else
3602             {
3603               emit_move_insn (dest, GEN_INT (off));
3604               emit_insn (gen_adddi3 (dest, src, dest));
3605             }
3606
3607           src = gen_rtx_MEM (Pmode, dest);
3608         }
3609     }
3610   else
3611     src = gen_rtx_REG (DImode, BR_REG (0));
3612
3613   emit_move_insn (dest, src);
3614 }
3615
3616 int
3617 ia64_hard_regno_rename_ok (int from, int to)
3618 {
3619   /* Don't clobber any of the registers we reserved for the prologue.  */
3620   if (to == current_frame_info.reg_fp
3621       || to == current_frame_info.reg_save_b0
3622       || to == current_frame_info.reg_save_pr
3623       || to == current_frame_info.reg_save_ar_pfs
3624       || to == current_frame_info.reg_save_ar_unat
3625       || to == current_frame_info.reg_save_ar_lc)
3626     return 0;
3627
3628   if (from == current_frame_info.reg_fp
3629       || from == current_frame_info.reg_save_b0
3630       || from == current_frame_info.reg_save_pr
3631       || from == current_frame_info.reg_save_ar_pfs
3632       || from == current_frame_info.reg_save_ar_unat
3633       || from == current_frame_info.reg_save_ar_lc)
3634     return 0;
3635
3636   /* Don't use output registers outside the register frame.  */
3637   if (OUT_REGNO_P (to) && to >= OUT_REG (current_frame_info.n_output_regs))
3638     return 0;
3639
3640   /* Retain even/oddness on predicate register pairs.  */
3641   if (PR_REGNO_P (from) && PR_REGNO_P (to))
3642     return (from & 1) == (to & 1);
3643
3644   return 1;
3645 }
3646
3647 /* Target hook for assembling integer objects.  Handle word-sized
3648    aligned objects and detect the cases when @fptr is needed.  */
3649
3650 static bool
3651 ia64_assemble_integer (rtx x, unsigned int size, int aligned_p)
3652 {
3653   if (size == POINTER_SIZE / BITS_PER_UNIT
3654       && !(TARGET_NO_PIC || TARGET_AUTO_PIC)
3655       && GET_CODE (x) == SYMBOL_REF
3656       && SYMBOL_REF_FUNCTION_P (x))
3657     {
3658       static const char * const directive[2][2] = {
3659           /* 64-bit pointer */  /* 32-bit pointer */
3660         { "\tdata8.ua\t@fptr(", "\tdata4.ua\t@fptr("},  /* unaligned */
3661         { "\tdata8\t@fptr(",    "\tdata4\t@fptr("}      /* aligned */
3662       };
3663       fputs (directive[(aligned_p != 0)][POINTER_SIZE == 32], asm_out_file);
3664       output_addr_const (asm_out_file, x);
3665       fputs (")\n", asm_out_file);
3666       return true;
3667     }
3668   return default_assemble_integer (x, size, aligned_p);
3669 }
3670
3671 /* Emit the function prologue.  */
3672
3673 static void
3674 ia64_output_function_prologue (FILE *file, HOST_WIDE_INT size ATTRIBUTE_UNUSED)
3675 {
3676   int mask, grsave, grsave_prev;
3677
3678   if (current_frame_info.need_regstk)
3679     fprintf (file, "\t.regstk %d, %d, %d, %d\n",
3680              current_frame_info.n_input_regs,
3681              current_frame_info.n_local_regs,
3682              current_frame_info.n_output_regs,
3683              current_frame_info.n_rotate_regs);
3684
3685   if (!flag_unwind_tables && (!flag_exceptions || USING_SJLJ_EXCEPTIONS))
3686     return;
3687
3688   /* Emit the .prologue directive.  */
3689
3690   mask = 0;
3691   grsave = grsave_prev = 0;
3692   if (current_frame_info.reg_save_b0 != 0)
3693     {
3694       mask |= 8;
3695       grsave = grsave_prev = current_frame_info.reg_save_b0;
3696     }
3697   if (current_frame_info.reg_save_ar_pfs != 0
3698       && (grsave_prev == 0
3699           || current_frame_info.reg_save_ar_pfs == grsave_prev + 1))
3700     {
3701       mask |= 4;
3702       if (grsave_prev == 0)
3703         grsave = current_frame_info.reg_save_ar_pfs;
3704       grsave_prev = current_frame_info.reg_save_ar_pfs;
3705     }
3706   if (current_frame_info.reg_fp != 0
3707       && (grsave_prev == 0
3708           || current_frame_info.reg_fp == grsave_prev + 1))
3709     {
3710       mask |= 2;
3711       if (grsave_prev == 0)
3712         grsave = HARD_FRAME_POINTER_REGNUM;
3713       grsave_prev = current_frame_info.reg_fp;
3714     }
3715   if (current_frame_info.reg_save_pr != 0
3716       && (grsave_prev == 0
3717           || current_frame_info.reg_save_pr == grsave_prev + 1))
3718     {
3719       mask |= 1;
3720       if (grsave_prev == 0)
3721         grsave = current_frame_info.reg_save_pr;
3722     }
3723
3724   if (mask && TARGET_GNU_AS)
3725     fprintf (file, "\t.prologue %d, %d\n", mask,
3726              ia64_dbx_register_number (grsave));
3727   else
3728     fputs ("\t.prologue\n", file);
3729
3730   /* Emit a .spill directive, if necessary, to relocate the base of
3731      the register spill area.  */
3732   if (current_frame_info.spill_cfa_off != -16)
3733     fprintf (file, "\t.spill %ld\n",
3734              (long) (current_frame_info.spill_cfa_off
3735                      + current_frame_info.spill_size));
3736 }
3737
3738 /* Emit the .body directive at the scheduled end of the prologue.  */
3739
3740 static void
3741 ia64_output_function_end_prologue (FILE *file)
3742 {
3743   if (!flag_unwind_tables && (!flag_exceptions || USING_SJLJ_EXCEPTIONS))
3744     return;
3745
3746   fputs ("\t.body\n", file);
3747 }
3748
3749 /* Emit the function epilogue.  */
3750
3751 static void
3752 ia64_output_function_epilogue (FILE *file ATTRIBUTE_UNUSED,
3753                                HOST_WIDE_INT size ATTRIBUTE_UNUSED)
3754 {
3755   int i;
3756
3757   if (current_frame_info.reg_fp)
3758     {
3759       const char *tmp = reg_names[HARD_FRAME_POINTER_REGNUM];
3760       reg_names[HARD_FRAME_POINTER_REGNUM]
3761         = reg_names[current_frame_info.reg_fp];
3762       reg_names[current_frame_info.reg_fp] = tmp;
3763     }
3764   if (! TARGET_REG_NAMES)
3765     {
3766       for (i = 0; i < current_frame_info.n_input_regs; i++)
3767         reg_names[IN_REG (i)] = ia64_input_reg_names[i];
3768       for (i = 0; i < current_frame_info.n_local_regs; i++)
3769         reg_names[LOC_REG (i)] = ia64_local_reg_names[i];
3770       for (i = 0; i < current_frame_info.n_output_regs; i++)
3771         reg_names[OUT_REG (i)] = ia64_output_reg_names[i];
3772     }
3773
3774   current_frame_info.initialized = 0;
3775 }
3776
3777 int
3778 ia64_dbx_register_number (int regno)
3779 {
3780   /* In ia64_expand_prologue we quite literally renamed the frame pointer
3781      from its home at loc79 to something inside the register frame.  We
3782      must perform the same renumbering here for the debug info.  */
3783   if (current_frame_info.reg_fp)
3784     {
3785       if (regno == HARD_FRAME_POINTER_REGNUM)
3786         regno = current_frame_info.reg_fp;
3787       else if (regno == current_frame_info.reg_fp)
3788         regno = HARD_FRAME_POINTER_REGNUM;
3789     }
3790
3791   if (IN_REGNO_P (regno))
3792     return 32 + regno - IN_REG (0);
3793   else if (LOC_REGNO_P (regno))
3794     return 32 + current_frame_info.n_input_regs + regno - LOC_REG (0);
3795   else if (OUT_REGNO_P (regno))
3796     return (32 + current_frame_info.n_input_regs
3797             + current_frame_info.n_local_regs + regno - OUT_REG (0));
3798   else
3799     return regno;
3800 }
3801
3802 void
3803 ia64_initialize_trampoline (rtx addr, rtx fnaddr, rtx static_chain)
3804 {
3805   rtx addr_reg, eight = GEN_INT (8);
3806
3807   /* The Intel assembler requires that the global __ia64_trampoline symbol
3808      be declared explicitly */
3809   if (!TARGET_GNU_AS)
3810     {
3811       static bool declared_ia64_trampoline = false;
3812
3813       if (!declared_ia64_trampoline)
3814         {
3815           declared_ia64_trampoline = true;
3816           (*targetm.asm_out.globalize_label) (asm_out_file,
3817                                               "__ia64_trampoline");
3818         }
3819     }
3820
3821   /* Make sure addresses are Pmode even if we are in ILP32 mode. */
3822   addr = convert_memory_address (Pmode, addr);
3823   fnaddr = convert_memory_address (Pmode, fnaddr);
3824   static_chain = convert_memory_address (Pmode, static_chain);
3825
3826   /* Load up our iterator.  */
3827   addr_reg = gen_reg_rtx (Pmode);
3828   emit_move_insn (addr_reg, addr);
3829
3830   /* The first two words are the fake descriptor:
3831      __ia64_trampoline, ADDR+16.  */
3832   emit_move_insn (gen_rtx_MEM (Pmode, addr_reg),
3833                   gen_rtx_SYMBOL_REF (Pmode, "__ia64_trampoline"));
3834   emit_insn (gen_adddi3 (addr_reg, addr_reg, eight));
3835
3836   emit_move_insn (gen_rtx_MEM (Pmode, addr_reg),
3837                   copy_to_reg (plus_constant (addr, 16)));
3838   emit_insn (gen_adddi3 (addr_reg, addr_reg, eight));
3839
3840   /* The third word is the target descriptor.  */
3841   emit_move_insn (gen_rtx_MEM (Pmode, addr_reg), fnaddr);
3842   emit_insn (gen_adddi3 (addr_reg, addr_reg, eight));
3843
3844   /* The fourth word is the static chain.  */
3845   emit_move_insn (gen_rtx_MEM (Pmode, addr_reg), static_chain);
3846 }
3847 \f
3848 /* Do any needed setup for a variadic function.  CUM has not been updated
3849    for the last named argument which has type TYPE and mode MODE.
3850
3851    We generate the actual spill instructions during prologue generation.  */
3852
3853 static void
3854 ia64_setup_incoming_varargs (CUMULATIVE_ARGS *cum, enum machine_mode mode,
3855                              tree type, int * pretend_size,
3856                              int second_time ATTRIBUTE_UNUSED)
3857 {
3858   CUMULATIVE_ARGS next_cum = *cum;
3859
3860   /* Skip the current argument.  */
3861   ia64_function_arg_advance (&next_cum, mode, type, 1);
3862
3863   if (next_cum.words < MAX_ARGUMENT_SLOTS)
3864     {
3865       int n = MAX_ARGUMENT_SLOTS - next_cum.words;
3866       *pretend_size = n * UNITS_PER_WORD;
3867       cfun->machine->n_varargs = n;
3868     }
3869 }
3870
3871 /* Check whether TYPE is a homogeneous floating point aggregate.  If
3872    it is, return the mode of the floating point type that appears
3873    in all leafs.  If it is not, return VOIDmode.
3874
3875    An aggregate is a homogeneous floating point aggregate is if all
3876    fields/elements in it have the same floating point type (e.g,
3877    SFmode).  128-bit quad-precision floats are excluded.
3878
3879    Variable sized aggregates should never arrive here, since we should
3880    have already decided to pass them by reference.  Top-level zero-sized
3881    aggregates are excluded because our parallels crash the middle-end.  */
3882
3883 static enum machine_mode
3884 hfa_element_mode (tree type, bool nested)
3885 {
3886   enum machine_mode element_mode = VOIDmode;
3887   enum machine_mode mode;
3888   enum tree_code code = TREE_CODE (type);
3889   int know_element_mode = 0;
3890   tree t;
3891
3892   if (!nested && (!TYPE_SIZE (type) || integer_zerop (TYPE_SIZE (type))))
3893     return VOIDmode;
3894
3895   switch (code)
3896     {
3897     case VOID_TYPE:     case INTEGER_TYPE:      case ENUMERAL_TYPE:
3898     case BOOLEAN_TYPE:  case POINTER_TYPE:
3899     case OFFSET_TYPE:   case REFERENCE_TYPE:    case METHOD_TYPE:
3900     case LANG_TYPE:             case FUNCTION_TYPE:
3901       return VOIDmode;
3902
3903       /* Fortran complex types are supposed to be HFAs, so we need to handle
3904          gcc's COMPLEX_TYPEs as HFAs.  We need to exclude the integral complex
3905          types though.  */
3906     case COMPLEX_TYPE:
3907       if (GET_MODE_CLASS (TYPE_MODE (type)) == MODE_COMPLEX_FLOAT
3908           && TYPE_MODE (type) != TCmode)
3909         return GET_MODE_INNER (TYPE_MODE (type));
3910       else
3911         return VOIDmode;
3912
3913     case REAL_TYPE:
3914       /* We want to return VOIDmode for raw REAL_TYPEs, but the actual
3915          mode if this is contained within an aggregate.  */
3916       if (nested && TYPE_MODE (type) != TFmode)
3917         return TYPE_MODE (type);
3918       else
3919         return VOIDmode;
3920
3921     case ARRAY_TYPE:
3922       return hfa_element_mode (TREE_TYPE (type), 1);
3923
3924     case RECORD_TYPE:
3925     case UNION_TYPE:
3926     case QUAL_UNION_TYPE:
3927       for (t = TYPE_FIELDS (type); t; t = TREE_CHAIN (t))
3928         {
3929           if (TREE_CODE (t) != FIELD_DECL)
3930             continue;
3931
3932           mode = hfa_element_mode (TREE_TYPE (t), 1);
3933           if (know_element_mode)
3934             {
3935               if (mode != element_mode)
3936                 return VOIDmode;
3937             }
3938           else if (GET_MODE_CLASS (mode) != MODE_FLOAT)
3939             return VOIDmode;
3940           else
3941             {
3942               know_element_mode = 1;
3943               element_mode = mode;
3944             }
3945         }
3946       return element_mode;
3947
3948     default:
3949       /* If we reach here, we probably have some front-end specific type
3950          that the backend doesn't know about.  This can happen via the
3951          aggregate_value_p call in init_function_start.  All we can do is
3952          ignore unknown tree types.  */
3953       return VOIDmode;
3954     }
3955
3956   return VOIDmode;
3957 }
3958
3959 /* Return the number of words required to hold a quantity of TYPE and MODE
3960    when passed as an argument.  */
3961 static int
3962 ia64_function_arg_words (tree type, enum machine_mode mode)
3963 {
3964   int words;
3965
3966   if (mode == BLKmode)
3967     words = int_size_in_bytes (type);
3968   else
3969     words = GET_MODE_SIZE (mode);
3970
3971   return (words + UNITS_PER_WORD - 1) / UNITS_PER_WORD;  /* round up */
3972 }
3973
3974 /* Return the number of registers that should be skipped so the current
3975    argument (described by TYPE and WORDS) will be properly aligned.
3976
3977    Integer and float arguments larger than 8 bytes start at the next
3978    even boundary.  Aggregates larger than 8 bytes start at the next
3979    even boundary if the aggregate has 16 byte alignment.  Note that
3980    in the 32-bit ABI, TImode and TFmode have only 8-byte alignment
3981    but are still to be aligned in registers.
3982
3983    ??? The ABI does not specify how to handle aggregates with
3984    alignment from 9 to 15 bytes, or greater than 16.  We handle them
3985    all as if they had 16 byte alignment.  Such aggregates can occur
3986    only if gcc extensions are used.  */
3987 static int
3988 ia64_function_arg_offset (CUMULATIVE_ARGS *cum, tree type, int words)
3989 {
3990   if ((cum->words & 1) == 0)
3991     return 0;
3992
3993   if (type
3994       && TREE_CODE (type) != INTEGER_TYPE
3995       && TREE_CODE (type) != REAL_TYPE)
3996     return TYPE_ALIGN (type) > 8 * BITS_PER_UNIT;
3997   else
3998     return words > 1;
3999 }
4000
4001 /* Return rtx for register where argument is passed, or zero if it is passed
4002    on the stack.  */
4003 /* ??? 128-bit quad-precision floats are always passed in general
4004    registers.  */
4005
4006 rtx
4007 ia64_function_arg (CUMULATIVE_ARGS *cum, enum machine_mode mode, tree type,
4008                    int named, int incoming)
4009 {
4010   int basereg = (incoming ? GR_ARG_FIRST : AR_ARG_FIRST);
4011   int words = ia64_function_arg_words (type, mode);
4012   int offset = ia64_function_arg_offset (cum, type, words);
4013   enum machine_mode hfa_mode = VOIDmode;
4014
4015   /* If all argument slots are used, then it must go on the stack.  */
4016   if (cum->words + offset >= MAX_ARGUMENT_SLOTS)
4017     return 0;
4018
4019   /* Check for and handle homogeneous FP aggregates.  */
4020   if (type)
4021     hfa_mode = hfa_element_mode (type, 0);
4022
4023   /* Unnamed prototyped hfas are passed as usual.  Named prototyped hfas
4024      and unprototyped hfas are passed specially.  */
4025   if (hfa_mode != VOIDmode && (! cum->prototype || named))
4026     {
4027       rtx loc[16];
4028       int i = 0;
4029       int fp_regs = cum->fp_regs;
4030       int int_regs = cum->words + offset;
4031       int hfa_size = GET_MODE_SIZE (hfa_mode);
4032       int byte_size;
4033       int args_byte_size;
4034
4035       /* If prototyped, pass it in FR regs then GR regs.
4036          If not prototyped, pass it in both FR and GR regs.
4037
4038          If this is an SFmode aggregate, then it is possible to run out of
4039          FR regs while GR regs are still left.  In that case, we pass the
4040          remaining part in the GR regs.  */
4041
4042       /* Fill the FP regs.  We do this always.  We stop if we reach the end
4043          of the argument, the last FP register, or the last argument slot.  */
4044
4045       byte_size = ((mode == BLKmode)
4046                    ? int_size_in_bytes (type) : GET_MODE_SIZE (mode));
4047       args_byte_size = int_regs * UNITS_PER_WORD;
4048       offset = 0;
4049       for (; (offset < byte_size && fp_regs < MAX_ARGUMENT_SLOTS
4050               && args_byte_size < (MAX_ARGUMENT_SLOTS * UNITS_PER_WORD)); i++)
4051         {
4052           loc[i] = gen_rtx_EXPR_LIST (VOIDmode,
4053                                       gen_rtx_REG (hfa_mode, (FR_ARG_FIRST
4054                                                               + fp_regs)),
4055                                       GEN_INT (offset));
4056           offset += hfa_size;
4057           args_byte_size += hfa_size;
4058           fp_regs++;
4059         }
4060
4061       /* If no prototype, then the whole thing must go in GR regs.  */
4062       if (! cum->prototype)
4063         offset = 0;
4064       /* If this is an SFmode aggregate, then we might have some left over
4065          that needs to go in GR regs.  */
4066       else if (byte_size != offset)
4067         int_regs += offset / UNITS_PER_WORD;
4068
4069       /* Fill in the GR regs.  We must use DImode here, not the hfa mode.  */
4070
4071       for (; offset < byte_size && int_regs < MAX_ARGUMENT_SLOTS; i++)
4072         {
4073           enum machine_mode gr_mode = DImode;
4074           unsigned int gr_size;
4075
4076           /* If we have an odd 4 byte hunk because we ran out of FR regs,
4077              then this goes in a GR reg left adjusted/little endian, right
4078              adjusted/big endian.  */
4079           /* ??? Currently this is handled wrong, because 4-byte hunks are
4080              always right adjusted/little endian.  */
4081           if (offset & 0x4)
4082             gr_mode = SImode;
4083           /* If we have an even 4 byte hunk because the aggregate is a
4084              multiple of 4 bytes in size, then this goes in a GR reg right
4085              adjusted/little endian.  */
4086           else if (byte_size - offset == 4)
4087             gr_mode = SImode;
4088
4089           loc[i] = gen_rtx_EXPR_LIST (VOIDmode,
4090                                       gen_rtx_REG (gr_mode, (basereg
4091                                                              + int_regs)),
4092                                       GEN_INT (offset));
4093
4094           gr_size = GET_MODE_SIZE (gr_mode);
4095           offset += gr_size;
4096           if (gr_size == UNITS_PER_WORD
4097               || (gr_size < UNITS_PER_WORD && offset % UNITS_PER_WORD == 0))
4098             int_regs++;
4099           else if (gr_size > UNITS_PER_WORD)
4100             int_regs += gr_size / UNITS_PER_WORD;
4101         }
4102       return gen_rtx_PARALLEL (mode, gen_rtvec_v (i, loc));
4103     }
4104
4105   /* Integral and aggregates go in general registers.  If we have run out of
4106      FR registers, then FP values must also go in general registers.  This can
4107      happen when we have a SFmode HFA.  */
4108   else if (mode == TFmode || mode == TCmode
4109            || (! FLOAT_MODE_P (mode) || cum->fp_regs == MAX_ARGUMENT_SLOTS))
4110     {
4111       int byte_size = ((mode == BLKmode)
4112                        ? int_size_in_bytes (type) : GET_MODE_SIZE (mode));
4113       if (BYTES_BIG_ENDIAN
4114         && (mode == BLKmode || (type && AGGREGATE_TYPE_P (type)))
4115         && byte_size < UNITS_PER_WORD
4116         && byte_size > 0)
4117         {
4118           rtx gr_reg = gen_rtx_EXPR_LIST (VOIDmode,
4119                                           gen_rtx_REG (DImode,
4120                                                        (basereg + cum->words
4121                                                         + offset)),
4122                                           const0_rtx);
4123           return gen_rtx_PARALLEL (mode, gen_rtvec (1, gr_reg));
4124         }
4125       else
4126         return gen_rtx_REG (mode, basereg + cum->words + offset);
4127
4128     }
4129
4130   /* If there is a prototype, then FP values go in a FR register when
4131      named, and in a GR register when unnamed.  */
4132   else if (cum->prototype)
4133     {
4134       if (named)
4135         return gen_rtx_REG (mode, FR_ARG_FIRST + cum->fp_regs);
4136       /* In big-endian mode, an anonymous SFmode value must be represented
4137          as (parallel:SF [(expr_list (reg:DI n) (const_int 0))]) to force
4138          the value into the high half of the general register.  */
4139       else if (BYTES_BIG_ENDIAN && mode == SFmode)
4140         return gen_rtx_PARALLEL (mode,
4141                  gen_rtvec (1,
4142                    gen_rtx_EXPR_LIST (VOIDmode,
4143                      gen_rtx_REG (DImode, basereg + cum->words + offset),
4144                                       const0_rtx)));
4145       else
4146         return gen_rtx_REG (mode, basereg + cum->words + offset);
4147     }
4148   /* If there is no prototype, then FP values go in both FR and GR
4149      registers.  */
4150   else
4151     {
4152       /* See comment above.  */
4153       enum machine_mode inner_mode =
4154         (BYTES_BIG_ENDIAN && mode == SFmode) ? DImode : mode;
4155
4156       rtx fp_reg = gen_rtx_EXPR_LIST (VOIDmode,
4157                                       gen_rtx_REG (mode, (FR_ARG_FIRST
4158                                                           + cum->fp_regs)),
4159                                       const0_rtx);
4160       rtx gr_reg = gen_rtx_EXPR_LIST (VOIDmode,
4161                                       gen_rtx_REG (inner_mode,
4162                                                    (basereg + cum->words
4163                                                     + offset)),
4164                                       const0_rtx);
4165
4166       return gen_rtx_PARALLEL (mode, gen_rtvec (2, fp_reg, gr_reg));
4167     }
4168 }
4169
4170 /* Return number of bytes, at the beginning of the argument, that must be
4171    put in registers.  0 is the argument is entirely in registers or entirely
4172    in memory.  */
4173
4174 static int
4175 ia64_arg_partial_bytes (CUMULATIVE_ARGS *cum, enum machine_mode mode,
4176                         tree type, bool named ATTRIBUTE_UNUSED)
4177 {
4178   int words = ia64_function_arg_words (type, mode);
4179   int offset = ia64_function_arg_offset (cum, type, words);
4180
4181   /* If all argument slots are used, then it must go on the stack.  */
4182   if (cum->words + offset >= MAX_ARGUMENT_SLOTS)
4183     return 0;
4184
4185   /* It doesn't matter whether the argument goes in FR or GR regs.  If
4186      it fits within the 8 argument slots, then it goes entirely in
4187      registers.  If it extends past the last argument slot, then the rest
4188      goes on the stack.  */
4189
4190   if (words + cum->words + offset <= MAX_ARGUMENT_SLOTS)
4191     return 0;
4192
4193   return (MAX_ARGUMENT_SLOTS - cum->words - offset) * UNITS_PER_WORD;
4194 }
4195
4196 /* Update CUM to point after this argument.  This is patterned after
4197    ia64_function_arg.  */
4198
4199 void
4200 ia64_function_arg_advance (CUMULATIVE_ARGS *cum, enum machine_mode mode,
4201                            tree type, int named)
4202 {
4203   int words = ia64_function_arg_words (type, mode);
4204   int offset = ia64_function_arg_offset (cum, type, words);
4205   enum machine_mode hfa_mode = VOIDmode;
4206
4207   /* If all arg slots are already full, then there is nothing to do.  */
4208   if (cum->words >= MAX_ARGUMENT_SLOTS)
4209     return;
4210
4211   cum->words += words + offset;
4212
4213   /* Check for and handle homogeneous FP aggregates.  */
4214   if (type)
4215     hfa_mode = hfa_element_mode (type, 0);
4216
4217   /* Unnamed prototyped hfas are passed as usual.  Named prototyped hfas
4218      and unprototyped hfas are passed specially.  */
4219   if (hfa_mode != VOIDmode && (! cum->prototype || named))
4220     {
4221       int fp_regs = cum->fp_regs;
4222       /* This is the original value of cum->words + offset.  */
4223       int int_regs = cum->words - words;
4224       int hfa_size = GET_MODE_SIZE (hfa_mode);
4225       int byte_size;
4226       int args_byte_size;
4227
4228       /* If prototyped, pass it in FR regs then GR regs.
4229          If not prototyped, pass it in both FR and GR regs.
4230
4231          If this is an SFmode aggregate, then it is possible to run out of
4232          FR regs while GR regs are still left.  In that case, we pass the
4233          remaining part in the GR regs.  */
4234
4235       /* Fill the FP regs.  We do this always.  We stop if we reach the end
4236          of the argument, the last FP register, or the last argument slot.  */
4237
4238       byte_size = ((mode == BLKmode)
4239                    ? int_size_in_bytes (type) : GET_MODE_SIZE (mode));
4240       args_byte_size = int_regs * UNITS_PER_WORD;
4241       offset = 0;
4242       for (; (offset < byte_size && fp_regs < MAX_ARGUMENT_SLOTS
4243               && args_byte_size < (MAX_ARGUMENT_SLOTS * UNITS_PER_WORD));)
4244         {
4245           offset += hfa_size;
4246           args_byte_size += hfa_size;
4247           fp_regs++;
4248         }
4249
4250       cum->fp_regs = fp_regs;
4251     }
4252
4253   /* Integral and aggregates go in general registers.  So do TFmode FP values.
4254      If we have run out of FR registers, then other FP values must also go in
4255      general registers.  This can happen when we have a SFmode HFA.  */
4256   else if (mode == TFmode || mode == TCmode
4257            || (! FLOAT_MODE_P (mode) || cum->fp_regs == MAX_ARGUMENT_SLOTS))
4258     cum->int_regs = cum->words;
4259
4260   /* If there is a prototype, then FP values go in a FR register when
4261      named, and in a GR register when unnamed.  */
4262   else if (cum->prototype)
4263     {
4264       if (! named)
4265         cum->int_regs = cum->words;
4266       else
4267         /* ??? Complex types should not reach here.  */
4268         cum->fp_regs += (GET_MODE_CLASS (mode) == MODE_COMPLEX_FLOAT ? 2 : 1);
4269     }
4270   /* If there is no prototype, then FP values go in both FR and GR
4271      registers.  */
4272   else
4273     {
4274       /* ??? Complex types should not reach here.  */
4275       cum->fp_regs += (GET_MODE_CLASS (mode) == MODE_COMPLEX_FLOAT ? 2 : 1);
4276       cum->int_regs = cum->words;
4277     }
4278 }
4279
4280 /* Arguments with alignment larger than 8 bytes start at the next even
4281    boundary.  On ILP32 HPUX, TFmode arguments start on next even boundary
4282    even though their normal alignment is 8 bytes.  See ia64_function_arg.  */
4283
4284 int
4285 ia64_function_arg_boundary (enum machine_mode mode, tree type)
4286 {
4287
4288   if (mode == TFmode && TARGET_HPUX && TARGET_ILP32)
4289     return PARM_BOUNDARY * 2;
4290
4291   if (type)
4292     {
4293       if (TYPE_ALIGN (type) > PARM_BOUNDARY)
4294         return PARM_BOUNDARY * 2;
4295       else
4296         return PARM_BOUNDARY;
4297     }
4298
4299   if (GET_MODE_BITSIZE (mode) > PARM_BOUNDARY)
4300     return PARM_BOUNDARY * 2;
4301   else
4302     return PARM_BOUNDARY;
4303 }
4304
4305 /* True if it is OK to do sibling call optimization for the specified
4306    call expression EXP.  DECL will be the called function, or NULL if
4307    this is an indirect call.  */
4308 static bool
4309 ia64_function_ok_for_sibcall (tree decl, tree exp ATTRIBUTE_UNUSED)
4310 {
4311   /* We can't perform a sibcall if the current function has the syscall_linkage
4312      attribute.  */
4313   if (lookup_attribute ("syscall_linkage",
4314                         TYPE_ATTRIBUTES (TREE_TYPE (current_function_decl))))
4315     return false;
4316
4317   /* We must always return with our current GP.  This means we can
4318      only sibcall to functions defined in the current module.  */
4319   return decl && (*targetm.binds_local_p) (decl);
4320 }
4321 \f
4322
4323 /* Implement va_arg.  */
4324
4325 static tree
4326 ia64_gimplify_va_arg (tree valist, tree type, tree *pre_p, tree *post_p)
4327 {
4328   /* Variable sized types are passed by reference.  */
4329   if (pass_by_reference (NULL, TYPE_MODE (type), type, false))
4330     {
4331       tree ptrtype = build_pointer_type (type);
4332       tree addr = std_gimplify_va_arg_expr (valist, ptrtype, pre_p, post_p);
4333       return build_va_arg_indirect_ref (addr);
4334     }
4335
4336   /* Aggregate arguments with alignment larger than 8 bytes start at
4337      the next even boundary.  Integer and floating point arguments
4338      do so if they are larger than 8 bytes, whether or not they are
4339      also aligned larger than 8 bytes.  */
4340   if ((TREE_CODE (type) == REAL_TYPE || TREE_CODE (type) == INTEGER_TYPE)
4341       ? int_size_in_bytes (type) > 8 : TYPE_ALIGN (type) > 8 * BITS_PER_UNIT)
4342     {
4343       tree t = build2 (PLUS_EXPR, TREE_TYPE (valist), valist,
4344                        build_int_cst (NULL_TREE, 2 * UNITS_PER_WORD - 1));
4345       t = build2 (BIT_AND_EXPR, TREE_TYPE (t), t,
4346                   build_int_cst (NULL_TREE, -2 * UNITS_PER_WORD));
4347       t = build2 (GIMPLE_MODIFY_STMT, TREE_TYPE (valist), valist, t);
4348       gimplify_and_add (t, pre_p);
4349     }
4350
4351   return std_gimplify_va_arg_expr (valist, type, pre_p, post_p);
4352 }
4353 \f
4354 /* Return 1 if function return value returned in memory.  Return 0 if it is
4355    in a register.  */
4356
4357 static bool
4358 ia64_return_in_memory (tree valtype, tree fntype ATTRIBUTE_UNUSED)
4359 {
4360   enum machine_mode mode;
4361   enum machine_mode hfa_mode;
4362   HOST_WIDE_INT byte_size;
4363
4364   mode = TYPE_MODE (valtype);
4365   byte_size = GET_MODE_SIZE (mode);
4366   if (mode == BLKmode)
4367     {
4368       byte_size = int_size_in_bytes (valtype);
4369       if (byte_size < 0)
4370         return true;
4371     }
4372
4373   /* Hfa's with up to 8 elements are returned in the FP argument registers.  */
4374
4375   hfa_mode = hfa_element_mode (valtype, 0);
4376   if (hfa_mode != VOIDmode)
4377     {
4378       int hfa_size = GET_MODE_SIZE (hfa_mode);
4379
4380       if (byte_size / hfa_size > MAX_ARGUMENT_SLOTS)
4381         return true;
4382       else
4383         return false;
4384     }
4385   else if (byte_size > UNITS_PER_WORD * MAX_INT_RETURN_SLOTS)
4386     return true;
4387   else
4388     return false;
4389 }
4390
4391 /* Return rtx for register that holds the function return value.  */
4392
4393 rtx
4394 ia64_function_value (tree valtype, tree func ATTRIBUTE_UNUSED)
4395 {
4396   enum machine_mode mode;
4397   enum machine_mode hfa_mode;
4398
4399   mode = TYPE_MODE (valtype);
4400   hfa_mode = hfa_element_mode (valtype, 0);
4401
4402   if (hfa_mode != VOIDmode)
4403     {
4404       rtx loc[8];
4405       int i;
4406       int hfa_size;
4407       int byte_size;
4408       int offset;
4409
4410       hfa_size = GET_MODE_SIZE (hfa_mode);
4411       byte_size = ((mode == BLKmode)
4412                    ? int_size_in_bytes (valtype) : GET_MODE_SIZE (mode));
4413       offset = 0;
4414       for (i = 0; offset < byte_size; i++)
4415         {
4416           loc[i] = gen_rtx_EXPR_LIST (VOIDmode,
4417                                       gen_rtx_REG (hfa_mode, FR_ARG_FIRST + i),
4418                                       GEN_INT (offset));
4419           offset += hfa_size;
4420         }
4421       return gen_rtx_PARALLEL (mode, gen_rtvec_v (i, loc));
4422     }
4423   else if (FLOAT_TYPE_P (valtype) && mode != TFmode && mode != TCmode)
4424     return gen_rtx_REG (mode, FR_ARG_FIRST);
4425   else
4426     {
4427       bool need_parallel = false;
4428
4429       /* In big-endian mode, we need to manage the layout of aggregates
4430          in the registers so that we get the bits properly aligned in
4431          the highpart of the registers.  */
4432       if (BYTES_BIG_ENDIAN
4433           && (mode == BLKmode || (valtype && AGGREGATE_TYPE_P (valtype))))
4434         need_parallel = true;
4435
4436       /* Something like struct S { long double x; char a[0] } is not an
4437          HFA structure, and therefore doesn't go in fp registers.  But
4438          the middle-end will give it XFmode anyway, and XFmode values
4439          don't normally fit in integer registers.  So we need to smuggle
4440          the value inside a parallel.  */
4441       else if (mode == XFmode || mode == XCmode || mode == RFmode)
4442         need_parallel = true;
4443
4444       if (need_parallel)
4445         {
4446           rtx loc[8];
4447           int offset;
4448           int bytesize;
4449           int i;
4450
4451           offset = 0;
4452           bytesize = int_size_in_bytes (valtype);
4453           /* An empty PARALLEL is invalid here, but the return value
4454              doesn't matter for empty structs.  */
4455           if (bytesize == 0)
4456             return gen_rtx_REG (mode, GR_RET_FIRST);
4457           for (i = 0; offset < bytesize; i++)
4458             {
4459               loc[i] = gen_rtx_EXPR_LIST (VOIDmode,
4460                                           gen_rtx_REG (DImode,
4461                                                        GR_RET_FIRST + i),
4462                                           GEN_INT (offset));
4463               offset += UNITS_PER_WORD;
4464             }
4465           return gen_rtx_PARALLEL (mode, gen_rtvec_v (i, loc));
4466         }
4467
4468       return gen_rtx_REG (mode, GR_RET_FIRST);
4469     }
4470 }
4471
4472 /* This is called from dwarf2out.c via TARGET_ASM_OUTPUT_DWARF_DTPREL.
4473    We need to emit DTP-relative relocations.  */
4474
4475 static void
4476 ia64_output_dwarf_dtprel (FILE *file, int size, rtx x)
4477 {
4478   gcc_assert (size == 4 || size == 8);
4479   if (size == 4)
4480     fputs ("\tdata4.ua\t@dtprel(", file);
4481   else
4482     fputs ("\tdata8.ua\t@dtprel(", file);
4483   output_addr_const (file, x);
4484   fputs (")", file);
4485 }
4486
4487 /* Print a memory address as an operand to reference that memory location.  */
4488
4489 /* ??? Do we need this?  It gets used only for 'a' operands.  We could perhaps
4490    also call this from ia64_print_operand for memory addresses.  */
4491
4492 void
4493 ia64_print_operand_address (FILE * stream ATTRIBUTE_UNUSED,
4494                             rtx address ATTRIBUTE_UNUSED)
4495 {
4496 }
4497
4498 /* Print an operand to an assembler instruction.
4499    C    Swap and print a comparison operator.
4500    D    Print an FP comparison operator.
4501    E    Print 32 - constant, for SImode shifts as extract.
4502    e    Print 64 - constant, for DImode rotates.
4503    F    A floating point constant 0.0 emitted as f0, or 1.0 emitted as f1, or
4504         a floating point register emitted normally.
4505    I    Invert a predicate register by adding 1.
4506    J    Select the proper predicate register for a condition.
4507    j    Select the inverse predicate register for a condition.
4508    O    Append .acq for volatile load.
4509    P    Postincrement of a MEM.
4510    Q    Append .rel for volatile store.
4511    S    Shift amount for shladd instruction.
4512    T    Print an 8-bit sign extended number (K) as a 32-bit unsigned number
4513         for Intel assembler.
4514    U    Print an 8-bit sign extended number (K) as a 64-bit unsigned number
4515         for Intel assembler.
4516    X    A pair of floating point registers.
4517    r    Print register name, or constant 0 as r0.  HP compatibility for
4518         Linux kernel.
4519    v    Print vector constant value as an 8-byte integer value.  */
4520
4521 void
4522 ia64_print_operand (FILE * file, rtx x, int code)
4523 {
4524   const char *str;
4525
4526   switch (code)
4527     {
4528     case 0:
4529       /* Handled below.  */
4530       break;
4531
4532     case 'C':
4533       {
4534         enum rtx_code c = swap_condition (GET_CODE (x));
4535         fputs (GET_RTX_NAME (c), file);
4536         return;
4537       }
4538
4539     case 'D':
4540       switch (GET_CODE (x))
4541         {
4542         case NE:
4543           str = "neq";
4544           break;
4545         case UNORDERED:
4546           str = "unord";
4547           break;
4548         case ORDERED:
4549           str = "ord";
4550           break;
4551         default:
4552           str = GET_RTX_NAME (GET_CODE (x));
4553           break;
4554         }
4555       fputs (str, file);
4556       return;
4557
4558     case 'E':
4559       fprintf (file, HOST_WIDE_INT_PRINT_DEC, 32 - INTVAL (x));
4560       return;
4561
4562     case 'e':
4563       fprintf (file, HOST_WIDE_INT_PRINT_DEC, 64 - INTVAL (x));
4564       return;
4565
4566     case 'F':
4567       if (x == CONST0_RTX (GET_MODE (x)))
4568         str = reg_names [FR_REG (0)];
4569       else if (x == CONST1_RTX (GET_MODE (x)))
4570         str = reg_names [FR_REG (1)];
4571       else
4572         {
4573           gcc_assert (GET_CODE (x) == REG);
4574           str = reg_names [REGNO (x)];
4575         }
4576       fputs (str, file);
4577       return;
4578
4579     case 'I':
4580       fputs (reg_names [REGNO (x) + 1], file);
4581       return;
4582
4583     case 'J':
4584     case 'j':
4585       {
4586         unsigned int regno = REGNO (XEXP (x, 0));
4587         if (GET_CODE (x) == EQ)
4588           regno += 1;
4589         if (code == 'j')
4590           regno ^= 1;
4591         fputs (reg_names [regno], file);
4592       }
4593       return;
4594
4595     case 'O':
4596       if (MEM_VOLATILE_P (x))
4597         fputs(".acq", file);
4598       return;
4599
4600     case 'P':
4601       {
4602         HOST_WIDE_INT value;
4603
4604         switch (GET_CODE (XEXP (x, 0)))
4605           {
4606           default:
4607             return;
4608
4609           case POST_MODIFY:
4610             x = XEXP (XEXP (XEXP (x, 0), 1), 1);
4611             if (GET_CODE (x) == CONST_INT)
4612               value = INTVAL (x);
4613             else
4614               {
4615                 gcc_assert (GET_CODE (x) == REG);
4616                 fprintf (file, ", %s", reg_names[REGNO (x)]);
4617                 return;
4618               }
4619             break;
4620
4621           case POST_INC:
4622             value = GET_MODE_SIZE (GET_MODE (x));
4623             break;
4624
4625           case POST_DEC:
4626             value = - (HOST_WIDE_INT) GET_MODE_SIZE (GET_MODE (x));
4627             break;
4628           }
4629
4630         fprintf (file, ", " HOST_WIDE_INT_PRINT_DEC, value);
4631         return;
4632       }
4633
4634     case 'Q':
4635       if (MEM_VOLATILE_P (x))
4636         fputs(".rel", file);
4637       return;
4638
4639     case 'S':
4640       fprintf (file, "%d", exact_log2 (INTVAL (x)));
4641       return;
4642
4643     case 'T':
4644       if (! TARGET_GNU_AS && GET_CODE (x) == CONST_INT)
4645         {
4646           fprintf (file, "0x%x", (int) INTVAL (x) & 0xffffffff);
4647           return;
4648         }
4649       break;
4650
4651     case 'U':
4652       if (! TARGET_GNU_AS && GET_CODE (x) == CONST_INT)
4653         {
4654           const char *prefix = "0x";
4655           if (INTVAL (x) & 0x80000000)
4656             {
4657               fprintf (file, "0xffffffff");
4658               prefix = "";
4659             }
4660           fprintf (file, "%s%x", prefix, (int) INTVAL (x) & 0xffffffff);
4661           return;
4662         }
4663       break;
4664
4665     case 'X':
4666       {
4667         unsigned int regno = REGNO (x);
4668         fprintf (file, "%s, %s", reg_names [regno], reg_names [regno + 1]);
4669       }
4670       return;
4671
4672     case 'r':
4673       /* If this operand is the constant zero, write it as register zero.
4674          Any register, zero, or CONST_INT value is OK here.  */
4675       if (GET_CODE (x) == REG)
4676         fputs (reg_names[REGNO (x)], file);
4677       else if (x == CONST0_RTX (GET_MODE (x)))
4678         fputs ("r0", file);
4679       else if (GET_CODE (x) == CONST_INT)
4680         output_addr_const (file, x);
4681       else
4682         output_operand_lossage ("invalid %%r value");
4683       return;
4684
4685     case 'v':
4686       gcc_assert (GET_CODE (x) == CONST_VECTOR);
4687       x = simplify_subreg (DImode, x, GET_MODE (x), 0);
4688       break;
4689
4690     case '+':
4691       {
4692         const char *which;
4693
4694         /* For conditional branches, returns or calls, substitute
4695            sptk, dptk, dpnt, or spnt for %s.  */
4696         x = find_reg_note (current_output_insn, REG_BR_PROB, 0);
4697         if (x)
4698           {
4699             int pred_val = INTVAL (XEXP (x, 0));
4700
4701             /* Guess top and bottom 10% statically predicted.  */
4702             if (pred_val < REG_BR_PROB_BASE / 50
4703                 && br_prob_note_reliable_p (x))
4704               which = ".spnt";
4705             else if (pred_val < REG_BR_PROB_BASE / 2)
4706               which = ".dpnt";
4707             else if (pred_val < REG_BR_PROB_BASE / 100 * 98
4708                      || !br_prob_note_reliable_p (x))
4709               which = ".dptk";
4710             else
4711               which = ".sptk";
4712           }
4713         else if (GET_CODE (current_output_insn) == CALL_INSN)
4714           which = ".sptk";
4715         else
4716           which = ".dptk";
4717
4718         fputs (which, file);
4719         return;
4720       }
4721
4722     case ',':
4723       x = current_insn_predicate;
4724       if (x)
4725         {
4726           unsigned int regno = REGNO (XEXP (x, 0));
4727           if (GET_CODE (x) == EQ)
4728             regno += 1;
4729           fprintf (file, "(%s) ", reg_names [regno]);
4730         }
4731       return;
4732
4733     default:
4734       output_operand_lossage ("ia64_print_operand: unknown code");
4735       return;
4736     }
4737
4738   switch (GET_CODE (x))
4739     {
4740       /* This happens for the spill/restore instructions.  */
4741     case POST_INC:
4742     case POST_DEC:
4743     case POST_MODIFY:
4744       x = XEXP (x, 0);
4745       /* ... fall through ...  */
4746
4747     case REG:
4748       fputs (reg_names [REGNO (x)], file);
4749       break;
4750
4751     case MEM:
4752       {
4753         rtx addr = XEXP (x, 0);
4754         if (GET_RTX_CLASS (GET_CODE (addr)) == RTX_AUTOINC)
4755           addr = XEXP (addr, 0);
4756         fprintf (file, "[%s]", reg_names [REGNO (addr)]);
4757         break;
4758       }
4759
4760     default:
4761       output_addr_const (file, x);
4762       break;
4763     }
4764
4765   return;
4766 }
4767 \f
4768 /* Compute a (partial) cost for rtx X.  Return true if the complete
4769    cost has been computed, and false if subexpressions should be
4770    scanned.  In either case, *TOTAL contains the cost result.  */
4771 /* ??? This is incomplete.  */
4772
4773 static bool
4774 ia64_rtx_costs (rtx x, int code, int outer_code, int *total)
4775 {
4776   switch (code)
4777     {
4778     case CONST_INT:
4779       switch (outer_code)
4780         {
4781         case SET:
4782           *total = CONST_OK_FOR_J (INTVAL (x)) ? 0 : COSTS_N_INSNS (1);
4783           return true;
4784         case PLUS:
4785           if (CONST_OK_FOR_I (INTVAL (x)))
4786             *total = 0;
4787           else if (CONST_OK_FOR_J (INTVAL (x)))
4788             *total = 1;
4789           else
4790             *total = COSTS_N_INSNS (1);
4791           return true;
4792         default:
4793           if (CONST_OK_FOR_K (INTVAL (x)) || CONST_OK_FOR_L (INTVAL (x)))
4794             *total = 0;
4795           else
4796             *total = COSTS_N_INSNS (1);
4797           return true;
4798         }
4799
4800     case CONST_DOUBLE:
4801       *total = COSTS_N_INSNS (1);
4802       return true;
4803
4804     case CONST:
4805     case SYMBOL_REF:
4806     case LABEL_REF:
4807       *total = COSTS_N_INSNS (3);
4808       return true;
4809
4810     case MULT:
4811       /* For multiplies wider than HImode, we have to go to the FPU,
4812          which normally involves copies.  Plus there's the latency
4813          of the multiply itself, and the latency of the instructions to
4814          transfer integer regs to FP regs.  */
4815       /* ??? Check for FP mode.  */
4816       if (GET_MODE_SIZE (GET_MODE (x)) > 2)
4817         *total = COSTS_N_INSNS (10);
4818       else
4819         *total = COSTS_N_INSNS (2);
4820       return true;
4821
4822     case PLUS:
4823     case MINUS:
4824     case ASHIFT:
4825     case ASHIFTRT:
4826     case LSHIFTRT:
4827       *total = COSTS_N_INSNS (1);
4828       return true;
4829
4830     case DIV:
4831     case UDIV:
4832     case MOD:
4833     case UMOD:
4834       /* We make divide expensive, so that divide-by-constant will be
4835          optimized to a multiply.  */
4836       *total = COSTS_N_INSNS (60);
4837       return true;
4838
4839     default:
4840       return false;
4841     }
4842 }
4843
4844 /* Calculate the cost of moving data from a register in class FROM to
4845    one in class TO, using MODE.  */
4846
4847 int
4848 ia64_register_move_cost (enum machine_mode mode, enum reg_class from,
4849                          enum reg_class to)
4850 {
4851   /* ADDL_REGS is the same as GR_REGS for movement purposes.  */
4852   if (to == ADDL_REGS)
4853     to = GR_REGS;
4854   if (from == ADDL_REGS)
4855     from = GR_REGS;
4856
4857   /* All costs are symmetric, so reduce cases by putting the
4858      lower number class as the destination.  */
4859   if (from < to)
4860     {
4861       enum reg_class tmp = to;
4862       to = from, from = tmp;
4863     }
4864
4865   /* Moving from FR<->GR in XFmode must be more expensive than 2,
4866      so that we get secondary memory reloads.  Between FR_REGS,
4867      we have to make this at least as expensive as MEMORY_MOVE_COST
4868      to avoid spectacularly poor register class preferencing.  */
4869   if (mode == XFmode || mode == RFmode)
4870     {
4871       if (to != GR_REGS || from != GR_REGS)
4872         return MEMORY_MOVE_COST (mode, to, 0);
4873       else
4874         return 3;
4875     }
4876
4877   switch (to)
4878     {
4879     case PR_REGS:
4880       /* Moving between PR registers takes two insns.  */
4881       if (from == PR_REGS)
4882         return 3;
4883       /* Moving between PR and anything but GR is impossible.  */
4884       if (from != GR_REGS)
4885         return MEMORY_MOVE_COST (mode, to, 0);
4886       break;
4887
4888     case BR_REGS:
4889       /* Moving between BR and anything but GR is impossible.  */
4890       if (from != GR_REGS && from != GR_AND_BR_REGS)
4891         return MEMORY_MOVE_COST (mode, to, 0);
4892       break;
4893
4894     case AR_I_REGS:
4895     case AR_M_REGS:
4896       /* Moving between AR and anything but GR is impossible.  */
4897       if (from != GR_REGS)
4898         return MEMORY_MOVE_COST (mode, to, 0);
4899       break;
4900
4901     case GR_REGS:
4902     case FR_REGS:
4903     case FP_REGS:
4904     case GR_AND_FR_REGS:
4905     case GR_AND_BR_REGS:
4906     case ALL_REGS:
4907       break;
4908
4909     default:
4910       gcc_unreachable ();
4911     }
4912
4913   return 2;
4914 }
4915
4916 /* Implement PREFERRED_RELOAD_CLASS.  Place additional restrictions on CLASS
4917    to use when copying X into that class.  */
4918
4919 enum reg_class
4920 ia64_preferred_reload_class (rtx x, enum reg_class class)
4921 {
4922   switch (class)
4923     {
4924     case FR_REGS:
4925     case FP_REGS:
4926       /* Don't allow volatile mem reloads into floating point registers.
4927          This is defined to force reload to choose the r/m case instead
4928          of the f/f case when reloading (set (reg fX) (mem/v)).  */
4929       if (MEM_P (x) && MEM_VOLATILE_P (x))
4930         return NO_REGS;
4931       
4932       /* Force all unrecognized constants into the constant pool.  */
4933       if (CONSTANT_P (x))
4934         return NO_REGS;
4935       break;
4936
4937     case AR_M_REGS:
4938     case AR_I_REGS:
4939       if (!OBJECT_P (x))
4940         return NO_REGS;
4941       break;
4942
4943     default:
4944       break;
4945     }
4946
4947   return class;
4948 }
4949
4950 /* This function returns the register class required for a secondary
4951    register when copying between one of the registers in CLASS, and X,
4952    using MODE.  A return value of NO_REGS means that no secondary register
4953    is required.  */
4954
4955 enum reg_class
4956 ia64_secondary_reload_class (enum reg_class class,
4957                              enum machine_mode mode ATTRIBUTE_UNUSED, rtx x)
4958 {
4959   int regno = -1;
4960
4961   if (GET_CODE (x) == REG || GET_CODE (x) == SUBREG)
4962     regno = true_regnum (x);
4963
4964   switch (class)
4965     {
4966     case BR_REGS:
4967     case AR_M_REGS:
4968     case AR_I_REGS:
4969       /* ??? BR<->BR register copies can happen due to a bad gcse/cse/global
4970          interaction.  We end up with two pseudos with overlapping lifetimes
4971          both of which are equiv to the same constant, and both which need
4972          to be in BR_REGS.  This seems to be a cse bug.  cse_basic_block_end
4973          changes depending on the path length, which means the qty_first_reg
4974          check in make_regs_eqv can give different answers at different times.
4975          At some point I'll probably need a reload_indi pattern to handle
4976          this.
4977
4978          We can also get GR_AND_FR_REGS to BR_REGS/AR_REGS copies, where we
4979          wound up with a FP register from GR_AND_FR_REGS.  Extend that to all
4980          non-general registers for good measure.  */
4981       if (regno >= 0 && ! GENERAL_REGNO_P (regno))
4982         return GR_REGS;
4983
4984       /* This is needed if a pseudo used as a call_operand gets spilled to a
4985          stack slot.  */
4986       if (GET_CODE (x) == MEM)
4987         return GR_REGS;
4988       break;
4989
4990     case FR_REGS:
4991     case FP_REGS:
4992       /* Need to go through general registers to get to other class regs.  */
4993       if (regno >= 0 && ! (FR_REGNO_P (regno) || GENERAL_REGNO_P (regno)))
4994         return GR_REGS;
4995
4996       /* This can happen when a paradoxical subreg is an operand to the
4997          muldi3 pattern.  */
4998       /* ??? This shouldn't be necessary after instruction scheduling is
4999          enabled, because paradoxical subregs are not accepted by
5000          register_operand when INSN_SCHEDULING is defined.  Or alternatively,
5001          stop the paradoxical subreg stupidity in the *_operand functions
5002          in recog.c.  */
5003       if (GET_CODE (x) == MEM
5004           && (GET_MODE (x) == SImode || GET_MODE (x) == HImode
5005               || GET_MODE (x) == QImode))
5006         return GR_REGS;
5007
5008       /* This can happen because of the ior/and/etc patterns that accept FP
5009          registers as operands.  If the third operand is a constant, then it
5010          needs to be reloaded into a FP register.  */
5011       if (GET_CODE (x) == CONST_INT)
5012         return GR_REGS;
5013
5014       /* This can happen because of register elimination in a muldi3 insn.
5015          E.g. `26107 * (unsigned long)&u'.  */
5016       if (GET_CODE (x) == PLUS)
5017         return GR_REGS;
5018       break;
5019
5020     case PR_REGS:
5021       /* ??? This happens if we cse/gcse a BImode value across a call,
5022          and the function has a nonlocal goto.  This is because global
5023          does not allocate call crossing pseudos to hard registers when
5024          current_function_has_nonlocal_goto is true.  This is relatively
5025          common for C++ programs that use exceptions.  To reproduce,
5026          return NO_REGS and compile libstdc++.  */
5027       if (GET_CODE (x) == MEM)
5028         return GR_REGS;
5029
5030       /* This can happen when we take a BImode subreg of a DImode value,
5031          and that DImode value winds up in some non-GR register.  */
5032       if (regno >= 0 && ! GENERAL_REGNO_P (regno) && ! PR_REGNO_P (regno))
5033         return GR_REGS;
5034       break;
5035
5036     default:
5037       break;
5038     }
5039
5040   return NO_REGS;
5041 }
5042
5043 \f
5044 /* Parse the -mfixed-range= option string.  */
5045
5046 static void
5047 fix_range (const char *const_str)
5048 {
5049   int i, first, last;
5050   char *str, *dash, *comma;
5051
5052   /* str must be of the form REG1'-'REG2{,REG1'-'REG} where REG1 and
5053      REG2 are either register names or register numbers.  The effect
5054      of this option is to mark the registers in the range from REG1 to
5055      REG2 as ``fixed'' so they won't be used by the compiler.  This is
5056      used, e.g., to ensure that kernel mode code doesn't use f32-f127.  */
5057
5058   i = strlen (const_str);
5059   str = (char *) alloca (i + 1);
5060   memcpy (str, const_str, i + 1);
5061
5062   while (1)
5063     {
5064       dash = strchr (str, '-');
5065       if (!dash)
5066         {
5067           warning (0, "value of -mfixed-range must have form REG1-REG2");
5068           return;
5069         }
5070       *dash = '\0';
5071
5072       comma = strchr (dash + 1, ',');
5073       if (comma)
5074         *comma = '\0';
5075
5076       first = decode_reg_name (str);
5077       if (first < 0)
5078         {
5079           warning (0, "unknown register name: %s", str);
5080           return;
5081         }
5082
5083       last = decode_reg_name (dash + 1);
5084       if (last < 0)
5085         {
5086           warning (0, "unknown register name: %s", dash + 1);
5087           return;
5088         }
5089
5090       *dash = '-';
5091
5092       if (first > last)
5093         {
5094           warning (0, "%s-%s is an empty range", str, dash + 1);
5095           return;
5096         }
5097
5098       for (i = first; i <= last; ++i)
5099         fixed_regs[i] = call_used_regs[i] = 1;
5100
5101       if (!comma)
5102         break;
5103
5104       *comma = ',';
5105       str = comma + 1;
5106     }
5107 }
5108
5109 /* Implement TARGET_HANDLE_OPTION.  */
5110
5111 static bool
5112 ia64_handle_option (size_t code, const char *arg, int value)
5113 {
5114   switch (code)
5115     {
5116     case OPT_mfixed_range_:
5117       fix_range (arg);
5118       return true;
5119
5120     case OPT_mtls_size_:
5121       if (value != 14 && value != 22 && value != 64)
5122         error ("bad value %<%s%> for -mtls-size= switch", arg);
5123       return true;
5124
5125     case OPT_mtune_:
5126       {
5127         static struct pta
5128           {
5129             const char *name;           /* processor name or nickname.  */
5130             enum processor_type processor;
5131           }
5132         const processor_alias_table[] =
5133           {
5134             {"itanium", PROCESSOR_ITANIUM},
5135             {"itanium1", PROCESSOR_ITANIUM},
5136             {"merced", PROCESSOR_ITANIUM},
5137             {"itanium2", PROCESSOR_ITANIUM2},
5138             {"mckinley", PROCESSOR_ITANIUM2},
5139           };
5140         int const pta_size = ARRAY_SIZE (processor_alias_table);
5141         int i;
5142
5143         for (i = 0; i < pta_size; i++)
5144           if (!strcmp (arg, processor_alias_table[i].name))
5145             {
5146               ia64_tune = processor_alias_table[i].processor;
5147               break;
5148             }
5149         if (i == pta_size)
5150           error ("bad value %<%s%> for -mtune= switch", arg);
5151         return true;
5152       }
5153
5154     default:
5155       return true;
5156     }
5157 }
5158
5159 /* Implement OVERRIDE_OPTIONS.  */
5160
5161 void
5162 ia64_override_options (void)
5163 {
5164   if (TARGET_AUTO_PIC)
5165     target_flags |= MASK_CONST_GP;
5166
5167   if (TARGET_INLINE_SQRT == INL_MIN_LAT)
5168     {
5169       warning (0, "not yet implemented: latency-optimized inline square root");
5170       TARGET_INLINE_SQRT = INL_MAX_THR;
5171     }
5172
5173   ia64_flag_schedule_insns2 = flag_schedule_insns_after_reload;
5174   flag_schedule_insns_after_reload = 0;
5175
5176   ia64_section_threshold = g_switch_set ? g_switch_value : IA64_DEFAULT_GVALUE;
5177
5178   init_machine_status = ia64_init_machine_status;
5179 }
5180
5181 static struct machine_function *
5182 ia64_init_machine_status (void)
5183 {
5184   return ggc_alloc_cleared (sizeof (struct machine_function));
5185 }
5186 \f
5187 static enum attr_itanium_class ia64_safe_itanium_class (rtx);
5188 static enum attr_type ia64_safe_type (rtx);
5189
5190 static enum attr_itanium_class
5191 ia64_safe_itanium_class (rtx insn)
5192 {
5193   if (recog_memoized (insn) >= 0)
5194     return get_attr_itanium_class (insn);
5195   else
5196     return ITANIUM_CLASS_UNKNOWN;
5197 }
5198
5199 static enum attr_type
5200 ia64_safe_type (rtx insn)
5201 {
5202   if (recog_memoized (insn) >= 0)
5203     return get_attr_type (insn);
5204   else
5205     return TYPE_UNKNOWN;
5206 }
5207 \f
5208 /* The following collection of routines emit instruction group stop bits as
5209    necessary to avoid dependencies.  */
5210
5211 /* Need to track some additional registers as far as serialization is
5212    concerned so we can properly handle br.call and br.ret.  We could
5213    make these registers visible to gcc, but since these registers are
5214    never explicitly used in gcc generated code, it seems wasteful to
5215    do so (plus it would make the call and return patterns needlessly
5216    complex).  */
5217 #define REG_RP          (BR_REG (0))
5218 #define REG_AR_CFM      (FIRST_PSEUDO_REGISTER + 1)
5219 /* This is used for volatile asms which may require a stop bit immediately
5220    before and after them.  */
5221 #define REG_VOLATILE    (FIRST_PSEUDO_REGISTER + 2)
5222 #define AR_UNAT_BIT_0   (FIRST_PSEUDO_REGISTER + 3)
5223 #define NUM_REGS        (AR_UNAT_BIT_0 + 64)
5224
5225 /* For each register, we keep track of how it has been written in the
5226    current instruction group.
5227
5228    If a register is written unconditionally (no qualifying predicate),
5229    WRITE_COUNT is set to 2 and FIRST_PRED is ignored.
5230
5231    If a register is written if its qualifying predicate P is true, we
5232    set WRITE_COUNT to 1 and FIRST_PRED to P.  Later on, the same register
5233    may be written again by the complement of P (P^1) and when this happens,
5234    WRITE_COUNT gets set to 2.
5235
5236    The result of this is that whenever an insn attempts to write a register
5237    whose WRITE_COUNT is two, we need to issue an insn group barrier first.
5238
5239    If a predicate register is written by a floating-point insn, we set
5240    WRITTEN_BY_FP to true.
5241
5242    If a predicate register is written by an AND.ORCM we set WRITTEN_BY_AND
5243    to true; if it was written by an OR.ANDCM we set WRITTEN_BY_OR to true.  */
5244
5245 struct reg_write_state
5246 {
5247   unsigned int write_count : 2;
5248   unsigned int first_pred : 16;
5249   unsigned int written_by_fp : 1;
5250   unsigned int written_by_and : 1;
5251   unsigned int written_by_or : 1;
5252 };
5253
5254 /* Cumulative info for the current instruction group.  */
5255 struct reg_write_state rws_sum[NUM_REGS];
5256 /* Info for the current instruction.  This gets copied to rws_sum after a
5257    stop bit is emitted.  */
5258 struct reg_write_state rws_insn[NUM_REGS];
5259
5260 /* Indicates whether this is the first instruction after a stop bit,
5261    in which case we don't need another stop bit.  Without this,
5262    ia64_variable_issue will die when scheduling an alloc.  */
5263 static int first_instruction;
5264
5265 /* Misc flags needed to compute RAW/WAW dependencies while we are traversing
5266    RTL for one instruction.  */
5267 struct reg_flags
5268 {
5269   unsigned int is_write : 1;    /* Is register being written?  */
5270   unsigned int is_fp : 1;       /* Is register used as part of an fp op?  */
5271   unsigned int is_branch : 1;   /* Is register used as part of a branch?  */
5272   unsigned int is_and : 1;      /* Is register used as part of and.orcm?  */
5273   unsigned int is_or : 1;       /* Is register used as part of or.andcm?  */
5274   unsigned int is_sibcall : 1;  /* Is this a sibling or normal call?  */
5275 };
5276
5277 static void rws_update (struct reg_write_state *, int, struct reg_flags, int);
5278 static int rws_access_regno (int, struct reg_flags, int);
5279 static int rws_access_reg (rtx, struct reg_flags, int);
5280 static void update_set_flags (rtx, struct reg_flags *);
5281 static int set_src_needs_barrier (rtx, struct reg_flags, int);
5282 static int rtx_needs_barrier (rtx, struct reg_flags, int);
5283 static void init_insn_group_barriers (void);
5284 static int group_barrier_needed (rtx);
5285 static int safe_group_barrier_needed (rtx);
5286
5287 /* Update *RWS for REGNO, which is being written by the current instruction,
5288    with predicate PRED, and associated register flags in FLAGS.  */
5289
5290 static void
5291 rws_update (struct reg_write_state *rws, int regno, struct reg_flags flags, int pred)
5292 {
5293   if (pred)
5294     rws[regno].write_count++;
5295   else
5296     rws[regno].write_count = 2;
5297   rws[regno].written_by_fp |= flags.is_fp;
5298   /* ??? Not tracking and/or across differing predicates.  */
5299   rws[regno].written_by_and = flags.is_and;
5300   rws[regno].written_by_or = flags.is_or;
5301   rws[regno].first_pred = pred;
5302 }
5303
5304 /* Handle an access to register REGNO of type FLAGS using predicate register
5305    PRED.  Update rws_insn and rws_sum arrays.  Return 1 if this access creates
5306    a dependency with an earlier instruction in the same group.  */
5307
5308 static int
5309 rws_access_regno (int regno, struct reg_flags flags, int pred)
5310 {
5311   int need_barrier = 0;
5312
5313   gcc_assert (regno < NUM_REGS);
5314
5315   if (! PR_REGNO_P (regno))
5316     flags.is_and = flags.is_or = 0;
5317
5318   if (flags.is_write)
5319     {
5320       int write_count;
5321
5322       /* One insn writes same reg multiple times?  */
5323       gcc_assert (!rws_insn[regno].write_count);
5324
5325       /* Update info for current instruction.  */
5326       rws_update (rws_insn, regno, flags, pred);
5327       write_count = rws_sum[regno].write_count;
5328
5329       switch (write_count)
5330         {
5331         case 0:
5332           /* The register has not been written yet.  */
5333           rws_update (rws_sum, regno, flags, pred);
5334           break;
5335
5336         case 1:
5337           /* The register has been written via a predicate.  If this is
5338              not a complementary predicate, then we need a barrier.  */
5339           /* ??? This assumes that P and P+1 are always complementary
5340              predicates for P even.  */
5341           if (flags.is_and && rws_sum[regno].written_by_and)
5342             ;
5343           else if (flags.is_or && rws_sum[regno].written_by_or)
5344             ;
5345           else if ((rws_sum[regno].first_pred ^ 1) != pred)
5346             need_barrier = 1;
5347           rws_update (rws_sum, regno, flags, pred);
5348           break;
5349
5350         case 2:
5351           /* The register has been unconditionally written already.  We
5352              need a barrier.  */
5353           if (flags.is_and && rws_sum[regno].written_by_and)
5354             ;
5355           else if (flags.is_or && rws_sum[regno].written_by_or)
5356             ;
5357           else
5358             need_barrier = 1;
5359           rws_sum[regno].written_by_and = flags.is_and;
5360           rws_sum[regno].written_by_or = flags.is_or;
5361           break;
5362
5363         default:
5364           gcc_unreachable ();
5365         }
5366     }
5367   else
5368     {
5369       if (flags.is_branch)
5370         {
5371           /* Branches have several RAW exceptions that allow to avoid
5372              barriers.  */
5373
5374           if (REGNO_REG_CLASS (regno) == BR_REGS || regno == AR_PFS_REGNUM)
5375             /* RAW dependencies on branch regs are permissible as long
5376                as the writer is a non-branch instruction.  Since we
5377                never generate code that uses a branch register written
5378                by a branch instruction, handling this case is
5379                easy.  */
5380             return 0;
5381
5382           if (REGNO_REG_CLASS (regno) == PR_REGS
5383               && ! rws_sum[regno].written_by_fp)
5384             /* The predicates of a branch are available within the
5385                same insn group as long as the predicate was written by
5386                something other than a floating-point instruction.  */
5387             return 0;
5388         }
5389
5390       if (flags.is_and && rws_sum[regno].written_by_and)
5391         return 0;
5392       if (flags.is_or && rws_sum[regno].written_by_or)
5393         return 0;
5394
5395       switch (rws_sum[regno].write_count)
5396         {
5397         case 0:
5398           /* The register has not been written yet.  */
5399           break;
5400
5401         case 1:
5402           /* The register has been written via a predicate.  If this is
5403              not a complementary predicate, then we need a barrier.  */
5404           /* ??? This assumes that P and P+1 are always complementary
5405              predicates for P even.  */
5406           if ((rws_sum[regno].first_pred ^ 1) != pred)
5407             need_barrier = 1;
5408           break;
5409
5410         case 2:
5411           /* The register has been unconditionally written already.  We
5412              need a barrier.  */
5413           need_barrier = 1;
5414           break;
5415
5416         default:
5417           gcc_unreachable ();
5418         }
5419     }
5420
5421   return need_barrier;
5422 }
5423
5424 static int
5425 rws_access_reg (rtx reg, struct reg_flags flags, int pred)
5426 {
5427   int regno = REGNO (reg);
5428   int n = HARD_REGNO_NREGS (REGNO (reg), GET_MODE (reg));
5429
5430   if (n == 1)
5431     return rws_access_regno (regno, flags, pred);
5432   else
5433     {
5434       int need_barrier = 0;
5435       while (--n >= 0)
5436         need_barrier |= rws_access_regno (regno + n, flags, pred);
5437       return need_barrier;
5438     }
5439 }
5440
5441 /* Examine X, which is a SET rtx, and update the flags, the predicate, and
5442    the condition, stored in *PFLAGS, *PPRED and *PCOND.  */
5443
5444 static void
5445 update_set_flags (rtx x, struct reg_flags *pflags)
5446 {
5447   rtx src = SET_SRC (x);
5448
5449   switch (GET_CODE (src))
5450     {
5451     case CALL:
5452       return;
5453
5454     case IF_THEN_ELSE:
5455       /* There are four cases here:
5456          (1) The destination is (pc), in which case this is a branch,
5457          nothing here applies.
5458          (2) The destination is ar.lc, in which case this is a
5459          doloop_end_internal,
5460          (3) The destination is an fp register, in which case this is
5461          an fselect instruction.
5462          (4) The condition has (unspec [(reg)] UNSPEC_LDC), in which case 
5463          this is a check load.
5464          In all cases, nothing we do in this function applies.  */
5465       return;
5466
5467     default:
5468       if (COMPARISON_P (src)
5469           && SCALAR_FLOAT_MODE_P (GET_MODE (XEXP (src, 0))))
5470         /* Set pflags->is_fp to 1 so that we know we're dealing
5471            with a floating point comparison when processing the
5472            destination of the SET.  */
5473         pflags->is_fp = 1;
5474
5475       /* Discover if this is a parallel comparison.  We only handle
5476          and.orcm and or.andcm at present, since we must retain a
5477          strict inverse on the predicate pair.  */
5478       else if (GET_CODE (src) == AND)
5479         pflags->is_and = 1;
5480       else if (GET_CODE (src) == IOR)
5481         pflags->is_or = 1;
5482
5483       break;
5484     }
5485 }
5486
5487 /* Subroutine of rtx_needs_barrier; this function determines whether the
5488    source of a given SET rtx found in X needs a barrier.  FLAGS and PRED
5489    are as in rtx_needs_barrier.  COND is an rtx that holds the condition
5490    for this insn.  */
5491
5492 static int
5493 set_src_needs_barrier (rtx x, struct reg_flags flags, int pred)
5494 {
5495   int need_barrier = 0;
5496   rtx dst;
5497   rtx src = SET_SRC (x);
5498
5499   if (GET_CODE (src) == CALL)
5500     /* We don't need to worry about the result registers that
5501        get written by subroutine call.  */
5502     return rtx_needs_barrier (src, flags, pred);
5503   else if (SET_DEST (x) == pc_rtx)
5504     {
5505       /* X is a conditional branch.  */
5506       /* ??? This seems redundant, as the caller sets this bit for
5507          all JUMP_INSNs.  */
5508       if (!ia64_spec_check_src_p (src))
5509         flags.is_branch = 1;
5510       return rtx_needs_barrier (src, flags, pred);
5511     }
5512
5513   if (ia64_spec_check_src_p (src))
5514     /* Avoid checking one register twice (in condition 
5515        and in 'then' section) for ldc pattern.  */
5516     {
5517       gcc_assert (REG_P (XEXP (src, 2)));
5518       need_barrier = rtx_needs_barrier (XEXP (src, 2), flags, pred);
5519                   
5520       /* We process MEM below.  */
5521       src = XEXP (src, 1);
5522     }
5523
5524   need_barrier |= rtx_needs_barrier (src, flags, pred);
5525
5526   dst = SET_DEST (x);
5527   if (GET_CODE (dst) == ZERO_EXTRACT)
5528     {
5529       need_barrier |= rtx_needs_barrier (XEXP (dst, 1), flags, pred);
5530       need_barrier |= rtx_needs_barrier (XEXP (dst, 2), flags, pred);
5531     }
5532   return need_barrier;
5533 }
5534
5535 /* Handle an access to rtx X of type FLAGS using predicate register
5536    PRED.  Return 1 if this access creates a dependency with an earlier
5537    instruction in the same group.  */
5538
5539 static int
5540 rtx_needs_barrier (rtx x, struct reg_flags flags, int pred)
5541 {
5542   int i, j;
5543   int is_complemented = 0;
5544   int need_barrier = 0;
5545   const char *format_ptr;
5546   struct reg_flags new_flags;
5547   rtx cond;
5548
5549   if (! x)
5550     return 0;
5551
5552   new_flags = flags;
5553
5554   switch (GET_CODE (x))
5555     {
5556     case SET:
5557       update_set_flags (x, &new_flags);
5558       need_barrier = set_src_needs_barrier (x, new_flags, pred);
5559       if (GET_CODE (SET_SRC (x)) != CALL)
5560         {
5561           new_flags.is_write = 1;
5562           need_barrier |= rtx_needs_barrier (SET_DEST (x), new_flags, pred);
5563         }
5564       break;
5565
5566     case CALL:
5567       new_flags.is_write = 0;
5568       need_barrier |= rws_access_regno (AR_EC_REGNUM, new_flags, pred);
5569
5570       /* Avoid multiple register writes, in case this is a pattern with
5571          multiple CALL rtx.  This avoids a failure in rws_access_reg.  */
5572       if (! flags.is_sibcall && ! rws_insn[REG_AR_CFM].write_count)
5573         {
5574           new_flags.is_write = 1;
5575           need_barrier |= rws_access_regno (REG_RP, new_flags, pred);
5576           need_barrier |= rws_access_regno (AR_PFS_REGNUM, new_flags, pred);
5577           need_barrier |= rws_access_regno (REG_AR_CFM, new_flags, pred);
5578         }
5579       break;
5580
5581     case COND_EXEC:
5582       /* X is a predicated instruction.  */
5583
5584       cond = COND_EXEC_TEST (x);
5585       gcc_assert (!pred);
5586       need_barrier = rtx_needs_barrier (cond, flags, 0);
5587
5588       if (GET_CODE (cond) == EQ)
5589         is_complemented = 1;
5590       cond = XEXP (cond, 0);
5591       gcc_assert (GET_CODE (cond) == REG
5592                   && REGNO_REG_CLASS (REGNO (cond)) == PR_REGS);
5593       pred = REGNO (cond);
5594       if (is_complemented)
5595         ++pred;
5596
5597       need_barrier |= rtx_needs_barrier (COND_EXEC_CODE (x), flags, pred);
5598       return need_barrier;
5599
5600     case CLOBBER:
5601     case USE:
5602       /* Clobber & use are for earlier compiler-phases only.  */
5603       break;
5604
5605     case ASM_OPERANDS:
5606     case ASM_INPUT:
5607       /* We always emit stop bits for traditional asms.  We emit stop bits
5608          for volatile extended asms if TARGET_VOL_ASM_STOP is true.  */
5609       if (GET_CODE (x) != ASM_OPERANDS
5610           || (MEM_VOLATILE_P (x) && TARGET_VOL_ASM_STOP))
5611         {
5612           /* Avoid writing the register multiple times if we have multiple
5613              asm outputs.  This avoids a failure in rws_access_reg.  */
5614           if (! rws_insn[REG_VOLATILE].write_count)
5615             {
5616               new_flags.is_write = 1;
5617               rws_access_regno (REG_VOLATILE, new_flags, pred);
5618             }
5619           return 1;
5620         }
5621
5622       /* For all ASM_OPERANDS, we must traverse the vector of input operands.
5623          We cannot just fall through here since then we would be confused
5624          by the ASM_INPUT rtx inside ASM_OPERANDS, which do not indicate
5625          traditional asms unlike their normal usage.  */
5626
5627       for (i = ASM_OPERANDS_INPUT_LENGTH (x) - 1; i >= 0; --i)
5628         if (rtx_needs_barrier (ASM_OPERANDS_INPUT (x, i), flags, pred))
5629           need_barrier = 1;
5630       break;
5631
5632     case PARALLEL:
5633       for (i = XVECLEN (x, 0) - 1; i >= 0; --i)
5634         {
5635           rtx pat = XVECEXP (x, 0, i);
5636           switch (GET_CODE (pat))
5637             {
5638             case SET:
5639               update_set_flags (pat, &new_flags);
5640               need_barrier |= set_src_needs_barrier (pat, new_flags, pred);
5641               break;
5642
5643             case USE:
5644             case CALL:
5645             case ASM_OPERANDS:
5646               need_barrier |= rtx_needs_barrier (pat, flags, pred);
5647               break;
5648
5649             case CLOBBER:
5650             case RETURN:
5651               break;
5652
5653             default:
5654               gcc_unreachable ();
5655             }
5656         }
5657       for (i = XVECLEN (x, 0) - 1; i >= 0; --i)
5658         {
5659           rtx pat = XVECEXP (x, 0, i);
5660           if (GET_CODE (pat) == SET)
5661             {
5662               if (GET_CODE (SET_SRC (pat)) != CALL)
5663                 {
5664                   new_flags.is_write = 1;
5665                   need_barrier |= rtx_needs_barrier (SET_DEST (pat), new_flags,
5666                                                      pred);
5667                 }
5668             }
5669           else if (GET_CODE (pat) == CLOBBER || GET_CODE (pat) == RETURN)
5670             need_barrier |= rtx_needs_barrier (pat, flags, pred);
5671         }
5672       break;
5673
5674     case SUBREG:
5675       need_barrier |= rtx_needs_barrier (SUBREG_REG (x), flags, pred);
5676       break;
5677     case REG:
5678       if (REGNO (x) == AR_UNAT_REGNUM)
5679         {
5680           for (i = 0; i < 64; ++i)
5681             need_barrier |= rws_access_regno (AR_UNAT_BIT_0 + i, flags, pred);
5682         }
5683       else
5684         need_barrier = rws_access_reg (x, flags, pred);
5685       break;
5686
5687     case MEM:
5688       /* Find the regs used in memory address computation.  */
5689       new_flags.is_write = 0;
5690       need_barrier = rtx_needs_barrier (XEXP (x, 0), new_flags, pred);
5691       break;
5692
5693     case CONST_INT:   case CONST_DOUBLE:  case CONST_VECTOR:
5694     case SYMBOL_REF:  case LABEL_REF:     case CONST:
5695       break;
5696
5697       /* Operators with side-effects.  */
5698     case POST_INC:    case POST_DEC:
5699       gcc_assert (GET_CODE (XEXP (x, 0)) == REG);
5700
5701       new_flags.is_write = 0;
5702       need_barrier  = rws_access_reg (XEXP (x, 0), new_flags, pred);
5703       new_flags.is_write = 1;
5704       need_barrier |= rws_access_reg (XEXP (x, 0), new_flags, pred);
5705       break;
5706
5707     case POST_MODIFY:
5708       gcc_assert (GET_CODE (XEXP (x, 0)) == REG);
5709
5710       new_flags.is_write = 0;
5711       need_barrier  = rws_access_reg (XEXP (x, 0), new_flags, pred);
5712       need_barrier |= rtx_needs_barrier (XEXP (x, 1), new_flags, pred);
5713       new_flags.is_write = 1;
5714       need_barrier |= rws_access_reg (XEXP (x, 0), new_flags, pred);
5715       break;
5716
5717       /* Handle common unary and binary ops for efficiency.  */
5718     case COMPARE:  case PLUS:    case MINUS:   case MULT:      case DIV:
5719     case MOD:      case UDIV:    case UMOD:    case AND:       case IOR:
5720     case XOR:      case ASHIFT:  case ROTATE:  case ASHIFTRT:  case LSHIFTRT:
5721     case ROTATERT: case SMIN:    case SMAX:    case UMIN:      case UMAX:
5722     case NE:       case EQ:      case GE:      case GT:        case LE:
5723     case LT:       case GEU:     case GTU:     case LEU:       case LTU:
5724       need_barrier = rtx_needs_barrier (XEXP (x, 0), new_flags, pred);
5725       need_barrier |= rtx_needs_barrier (XEXP (x, 1), new_flags, pred);
5726       break;
5727
5728     case NEG:      case NOT:            case SIGN_EXTEND:     case ZERO_EXTEND:
5729     case TRUNCATE: case FLOAT_EXTEND:   case FLOAT_TRUNCATE:  case FLOAT:
5730     case FIX:      case UNSIGNED_FLOAT: case UNSIGNED_FIX:    case ABS:
5731     case SQRT:     case FFS:            case POPCOUNT:
5732       need_barrier = rtx_needs_barrier (XEXP (x, 0), flags, pred);
5733       break;
5734
5735     case VEC_SELECT:
5736       /* VEC_SELECT's second argument is a PARALLEL with integers that
5737          describe the elements selected.  On ia64, those integers are
5738          always constants.  Avoid walking the PARALLEL so that we don't
5739          get confused with "normal" parallels and then die.  */
5740       need_barrier = rtx_needs_barrier (XEXP (x, 0), flags, pred);
5741       break;
5742
5743     case UNSPEC:
5744       switch (XINT (x, 1))
5745         {
5746         case UNSPEC_LTOFF_DTPMOD:
5747         case UNSPEC_LTOFF_DTPREL:
5748         case UNSPEC_DTPREL:
5749         case UNSPEC_LTOFF_TPREL:
5750         case UNSPEC_TPREL:
5751         case UNSPEC_PRED_REL_MUTEX:
5752         case UNSPEC_PIC_CALL:
5753         case UNSPEC_MF:
5754         case UNSPEC_FETCHADD_ACQ:
5755         case UNSPEC_BSP_VALUE:
5756         case UNSPEC_FLUSHRS:
5757         case UNSPEC_BUNDLE_SELECTOR:
5758           break;
5759
5760         case UNSPEC_GR_SPILL:
5761         case UNSPEC_GR_RESTORE:
5762           {
5763             HOST_WIDE_INT offset = INTVAL (XVECEXP (x, 0, 1));
5764             HOST_WIDE_INT bit = (offset >> 3) & 63;
5765
5766             need_barrier = rtx_needs_barrier (XVECEXP (x, 0, 0), flags, pred);
5767             new_flags.is_write = (XINT (x, 1) == UNSPEC_GR_SPILL);
5768             need_barrier |= rws_access_regno (AR_UNAT_BIT_0 + bit,
5769                                               new_flags, pred);
5770             break;
5771           }
5772
5773         case UNSPEC_FR_SPILL:
5774         case UNSPEC_FR_RESTORE:
5775         case UNSPEC_GETF_EXP:
5776         case UNSPEC_SETF_EXP:
5777         case UNSPEC_ADDP4:
5778         case UNSPEC_FR_SQRT_RECIP_APPROX:
5779         case UNSPEC_LDA:
5780         case UNSPEC_LDS:
5781         case UNSPEC_LDSA:
5782         case UNSPEC_CHKACLR:
5783         case UNSPEC_CHKS:
5784           need_barrier = rtx_needs_barrier (XVECEXP (x, 0, 0), flags, pred);
5785           break;
5786
5787         case UNSPEC_FR_RECIP_APPROX:
5788         case UNSPEC_SHRP:
5789         case UNSPEC_COPYSIGN:
5790           need_barrier = rtx_needs_barrier (XVECEXP (x, 0, 0), flags, pred);
5791           need_barrier |= rtx_needs_barrier (XVECEXP (x, 0, 1), flags, pred);
5792           break;
5793
5794         case UNSPEC_CMPXCHG_ACQ:
5795           need_barrier = rtx_needs_barrier (XVECEXP (x, 0, 1), flags, pred);
5796           need_barrier |= rtx_needs_barrier (XVECEXP (x, 0, 2), flags, pred);
5797           break;
5798
5799         default:
5800           gcc_unreachable ();
5801         }
5802       break;
5803
5804     case UNSPEC_VOLATILE:
5805       switch (XINT (x, 1))
5806         {
5807         case UNSPECV_ALLOC:
5808           /* Alloc must always be the first instruction of a group.
5809              We force this by always returning true.  */
5810           /* ??? We might get better scheduling if we explicitly check for
5811              input/local/output register dependencies, and modify the
5812              scheduler so that alloc is always reordered to the start of
5813              the current group.  We could then eliminate all of the
5814              first_instruction code.  */
5815           rws_access_regno (AR_PFS_REGNUM, flags, pred);
5816
5817           new_flags.is_write = 1;
5818           rws_access_regno (REG_AR_CFM, new_flags, pred);
5819           return 1;
5820
5821         case UNSPECV_SET_BSP:
5822           need_barrier = 1;
5823           break;
5824
5825         case UNSPECV_BLOCKAGE:
5826         case UNSPECV_INSN_GROUP_BARRIER:
5827         case UNSPECV_BREAK:
5828         case UNSPECV_PSAC_ALL:
5829         case UNSPECV_PSAC_NORMAL:
5830           return 0;
5831
5832         default:
5833           gcc_unreachable ();
5834         }
5835       break;
5836
5837     case RETURN:
5838       new_flags.is_write = 0;
5839       need_barrier  = rws_access_regno (REG_RP, flags, pred);
5840       need_barrier |= rws_access_regno (AR_PFS_REGNUM, flags, pred);
5841
5842       new_flags.is_write = 1;
5843       need_barrier |= rws_access_regno (AR_EC_REGNUM, new_flags, pred);
5844       need_barrier |= rws_access_regno (REG_AR_CFM, new_flags, pred);
5845       break;
5846
5847     default:
5848       format_ptr = GET_RTX_FORMAT (GET_CODE (x));
5849       for (i = GET_RTX_LENGTH (GET_CODE (x)) - 1; i >= 0; i--)
5850         switch (format_ptr[i])
5851           {
5852           case '0':     /* unused field */
5853           case 'i':     /* integer */
5854           case 'n':     /* note */
5855           case 'w':     /* wide integer */
5856           case 's':     /* pointer to string */
5857           case 'S':     /* optional pointer to string */
5858             break;
5859
5860           case 'e':
5861             if (rtx_needs_barrier (XEXP (x, i), flags, pred))
5862               need_barrier = 1;
5863             break;
5864
5865           case 'E':
5866             for (j = XVECLEN (x, i) - 1; j >= 0; --j)
5867               if (rtx_needs_barrier (XVECEXP (x, i, j), flags, pred))
5868                 need_barrier = 1;
5869             break;
5870
5871           default:
5872             gcc_unreachable ();
5873           }
5874       break;
5875     }
5876   return need_barrier;
5877 }
5878
5879 /* Clear out the state for group_barrier_needed at the start of a
5880    sequence of insns.  */
5881
5882 static void
5883 init_insn_group_barriers (void)
5884 {
5885   memset (rws_sum, 0, sizeof (rws_sum));
5886   first_instruction = 1;
5887 }
5888
5889 /* Given the current state, determine whether a group barrier (a stop bit) is
5890    necessary before INSN.  Return nonzero if so.  This modifies the state to
5891    include the effects of INSN as a side-effect.  */
5892
5893 static int
5894 group_barrier_needed (rtx insn)
5895 {
5896   rtx pat;
5897   int need_barrier = 0;
5898   struct reg_flags flags;
5899
5900   memset (&flags, 0, sizeof (flags));
5901   switch (GET_CODE (insn))
5902     {
5903     case NOTE:
5904       break;
5905
5906     case BARRIER:
5907       /* A barrier doesn't imply an instruction group boundary.  */
5908       break;
5909
5910     case CODE_LABEL:
5911       memset (rws_insn, 0, sizeof (rws_insn));
5912       return 1;
5913
5914     case CALL_INSN:
5915       flags.is_branch = 1;
5916       flags.is_sibcall = SIBLING_CALL_P (insn);
5917       memset (rws_insn, 0, sizeof (rws_insn));
5918
5919       /* Don't bundle a call following another call.  */
5920       if ((pat = prev_active_insn (insn))
5921           && GET_CODE (pat) == CALL_INSN)
5922         {
5923           need_barrier = 1;
5924           break;
5925         }
5926
5927       need_barrier = rtx_needs_barrier (PATTERN (insn), flags, 0);
5928       break;
5929
5930     case JUMP_INSN:
5931       if (!ia64_spec_check_p (insn))
5932         flags.is_branch = 1;
5933
5934       /* Don't bundle a jump following a call.  */
5935       if ((pat = prev_active_insn (insn))
5936           && GET_CODE (pat) == CALL_INSN)
5937         {
5938           need_barrier = 1;
5939           break;
5940         }
5941       /* FALLTHRU */
5942
5943     case INSN:
5944       if (GET_CODE (PATTERN (insn)) == USE
5945           || GET_CODE (PATTERN (insn)) == CLOBBER)
5946         /* Don't care about USE and CLOBBER "insns"---those are used to
5947            indicate to the optimizer that it shouldn't get rid of
5948            certain operations.  */
5949         break;
5950
5951       pat = PATTERN (insn);
5952
5953       /* Ug.  Hack hacks hacked elsewhere.  */
5954       switch (recog_memoized (insn))
5955         {
5956           /* We play dependency tricks with the epilogue in order
5957              to get proper schedules.  Undo this for dv analysis.  */
5958         case CODE_FOR_epilogue_deallocate_stack:
5959         case CODE_FOR_prologue_allocate_stack:
5960           pat = XVECEXP (pat, 0, 0);
5961           break;
5962
5963           /* The pattern we use for br.cloop confuses the code above.
5964              The second element of the vector is representative.  */
5965         case CODE_FOR_doloop_end_internal:
5966           pat = XVECEXP (pat, 0, 1);
5967           break;
5968
5969           /* Doesn't generate code.  */
5970         case CODE_FOR_pred_rel_mutex:
5971         case CODE_FOR_prologue_use:
5972           return 0;
5973
5974         default:
5975           break;
5976         }
5977
5978       memset (rws_insn, 0, sizeof (rws_insn));
5979       need_barrier = rtx_needs_barrier (pat, flags, 0);
5980
5981       /* Check to see if the previous instruction was a volatile
5982          asm.  */
5983       if (! need_barrier)
5984         need_barrier = rws_access_regno (REG_VOLATILE, flags, 0);
5985       break;
5986
5987     default:
5988       gcc_unreachable ();
5989     }
5990
5991   if (first_instruction && INSN_P (insn)
5992       && ia64_safe_itanium_class (insn) != ITANIUM_CLASS_IGNORE
5993       && GET_CODE (PATTERN (insn)) != USE
5994       && GET_CODE (PATTERN (insn)) != CLOBBER)
5995     {
5996       need_barrier = 0;
5997       first_instruction = 0;
5998     }
5999
6000   return need_barrier;
6001 }
6002
6003 /* Like group_barrier_needed, but do not clobber the current state.  */
6004
6005 static int
6006 safe_group_barrier_needed (rtx insn)
6007 {
6008   struct reg_write_state rws_saved[NUM_REGS];
6009   int saved_first_instruction;
6010   int t;
6011
6012   memcpy (rws_saved, rws_sum, NUM_REGS * sizeof *rws_saved);
6013   saved_first_instruction = first_instruction;
6014
6015   t = group_barrier_needed (insn);
6016
6017   memcpy (rws_sum, rws_saved, NUM_REGS * sizeof *rws_saved);
6018   first_instruction = saved_first_instruction;
6019
6020   return t;
6021 }
6022
6023 /* Scan the current function and insert stop bits as necessary to
6024    eliminate dependencies.  This function assumes that a final
6025    instruction scheduling pass has been run which has already
6026    inserted most of the necessary stop bits.  This function only
6027    inserts new ones at basic block boundaries, since these are
6028    invisible to the scheduler.  */
6029
6030 static void
6031 emit_insn_group_barriers (FILE *dump)
6032 {
6033   rtx insn;
6034   rtx last_label = 0;
6035   int insns_since_last_label = 0;
6036
6037   init_insn_group_barriers ();
6038
6039   for (insn = get_insns (); insn; insn = NEXT_INSN (insn))
6040     {
6041       if (GET_CODE (insn) == CODE_LABEL)
6042         {
6043           if (insns_since_last_label)
6044             last_label = insn;
6045           insns_since_last_label = 0;
6046         }
6047       else if (GET_CODE (insn) == NOTE
6048                && NOTE_LINE_NUMBER (insn) == NOTE_INSN_BASIC_BLOCK)
6049         {
6050           if (insns_since_last_label)
6051             last_label = insn;
6052           insns_since_last_label = 0;
6053         }
6054       else if (GET_CODE (insn) == INSN
6055                && GET_CODE (PATTERN (insn)) == UNSPEC_VOLATILE
6056                && XINT (PATTERN (insn), 1) == UNSPECV_INSN_GROUP_BARRIER)
6057         {
6058           init_insn_group_barriers ();
6059           last_label = 0;
6060         }
6061       else if (INSN_P (insn))
6062         {
6063           insns_since_last_label = 1;
6064
6065           if (group_barrier_needed (insn))
6066             {
6067               if (last_label)
6068                 {
6069                   if (dump)
6070                     fprintf (dump, "Emitting stop before label %d\n",
6071                              INSN_UID (last_label));
6072                   emit_insn_before (gen_insn_group_barrier (GEN_INT (3)), last_label);
6073                   insn = last_label;
6074
6075                   init_insn_group_barriers ();
6076                   last_label = 0;
6077                 }
6078             }
6079         }
6080     }
6081 }
6082
6083 /* Like emit_insn_group_barriers, but run if no final scheduling pass was run.
6084    This function has to emit all necessary group barriers.  */
6085
6086 static void
6087 emit_all_insn_group_barriers (FILE *dump ATTRIBUTE_UNUSED)
6088 {
6089   rtx insn;
6090
6091   init_insn_group_barriers ();
6092
6093   for (insn = get_insns (); insn; insn = NEXT_INSN (insn))
6094     {
6095       if (GET_CODE (insn) == BARRIER)
6096         {
6097           rtx last = prev_active_insn (insn);
6098
6099           if (! last)
6100             continue;
6101           if (GET_CODE (last) == JUMP_INSN
6102               && GET_CODE (PATTERN (last)) == ADDR_DIFF_VEC)
6103             last = prev_active_insn (last);
6104           if (recog_memoized (last) != CODE_FOR_insn_group_barrier)
6105             emit_insn_after (gen_insn_group_barrier (GEN_INT (3)), last);
6106
6107           init_insn_group_barriers ();
6108         }
6109       else if (INSN_P (insn))
6110         {
6111           if (recog_memoized (insn) == CODE_FOR_insn_group_barrier)
6112             init_insn_group_barriers ();
6113           else if (group_barrier_needed (insn))
6114             {
6115               emit_insn_before (gen_insn_group_barrier (GEN_INT (3)), insn);
6116               init_insn_group_barriers ();
6117               group_barrier_needed (insn);
6118             }
6119         }
6120     }
6121 }
6122
6123 \f
6124
6125 /* Instruction scheduling support.  */
6126
6127 #define NR_BUNDLES 10
6128
6129 /* A list of names of all available bundles.  */
6130
6131 static const char *bundle_name [NR_BUNDLES] =
6132 {
6133   ".mii",
6134   ".mmi",
6135   ".mfi",
6136   ".mmf",
6137 #if NR_BUNDLES == 10
6138   ".bbb",
6139   ".mbb",
6140 #endif
6141   ".mib",
6142   ".mmb",
6143   ".mfb",
6144   ".mlx"
6145 };
6146
6147 /* Nonzero if we should insert stop bits into the schedule.  */
6148
6149 int ia64_final_schedule = 0;
6150
6151 /* Codes of the corresponding queried units: */
6152
6153 static int _0mii_, _0mmi_, _0mfi_, _0mmf_;
6154 static int _0bbb_, _0mbb_, _0mib_, _0mmb_, _0mfb_, _0mlx_;
6155
6156 static int _1mii_, _1mmi_, _1mfi_, _1mmf_;
6157 static int _1bbb_, _1mbb_, _1mib_, _1mmb_, _1mfb_, _1mlx_;
6158
6159 static int pos_1, pos_2, pos_3, pos_4, pos_5, pos_6;
6160
6161 /* The following variable value is an insn group barrier.  */
6162
6163 static rtx dfa_stop_insn;
6164
6165 /* The following variable value is the last issued insn.  */
6166
6167 static rtx last_scheduled_insn;
6168
6169 /* The following variable value is size of the DFA state.  */
6170
6171 static size_t dfa_state_size;
6172
6173 /* The following variable value is pointer to a DFA state used as
6174    temporary variable.  */
6175
6176 static state_t temp_dfa_state = NULL;
6177
6178 /* The following variable value is DFA state after issuing the last
6179    insn.  */
6180
6181 static state_t prev_cycle_state = NULL;
6182
6183 /* The following array element values are TRUE if the corresponding
6184    insn requires to add stop bits before it.  */
6185
6186 static char *stops_p = NULL;
6187
6188 /* The following array element values are ZERO for non-speculative
6189    instructions and hold corresponding speculation check number for
6190    speculative instructions.  */
6191 static int *spec_check_no = NULL;
6192
6193 /* Size of spec_check_no array.  */
6194 static int max_uid = 0;
6195
6196 /* The following variable is used to set up the mentioned above array.  */
6197
6198 static int stop_before_p = 0;
6199
6200 /* The following variable value is length of the arrays `clocks' and
6201    `add_cycles'. */
6202
6203 static int clocks_length;
6204
6205 /* The following array element values are cycles on which the
6206    corresponding insn will be issued.  The array is used only for
6207    Itanium1.  */
6208
6209 static int *clocks;
6210
6211 /* The following array element values are numbers of cycles should be
6212    added to improve insn scheduling for MM_insns for Itanium1.  */
6213
6214 static int *add_cycles;
6215
6216 /* The following variable value is number of data speculations in progress.  */
6217 static int pending_data_specs = 0;
6218
6219 static rtx ia64_single_set (rtx);
6220 static void ia64_emit_insn_before (rtx, rtx);
6221
6222 /* Map a bundle number to its pseudo-op.  */
6223
6224 const char *
6225 get_bundle_name (int b)
6226 {
6227   return bundle_name[b];
6228 }
6229
6230
6231 /* Return the maximum number of instructions a cpu can issue.  */
6232
6233 static int
6234 ia64_issue_rate (void)
6235 {
6236   return 6;
6237 }
6238
6239 /* Helper function - like single_set, but look inside COND_EXEC.  */
6240
6241 static rtx
6242 ia64_single_set (rtx insn)
6243 {
6244   rtx x = PATTERN (insn), ret;
6245   if (GET_CODE (x) == COND_EXEC)
6246     x = COND_EXEC_CODE (x);
6247   if (GET_CODE (x) == SET)
6248     return x;
6249
6250   /* Special case here prologue_allocate_stack and epilogue_deallocate_stack.
6251      Although they are not classical single set, the second set is there just
6252      to protect it from moving past FP-relative stack accesses.  */
6253   switch (recog_memoized (insn))
6254     {
6255     case CODE_FOR_prologue_allocate_stack:
6256     case CODE_FOR_epilogue_deallocate_stack:
6257       ret = XVECEXP (x, 0, 0);
6258       break;
6259
6260     default:
6261       ret = single_set_2 (insn, x);
6262       break;
6263     }
6264
6265   return ret;
6266 }
6267
6268 /* Adjust the cost of a scheduling dependency.
6269    Return the new cost of a dependency of type DEP_TYPE or INSN on DEP_INSN.
6270    COST is the current cost.  */
6271
6272 static int
6273 ia64_adjust_cost_2 (rtx insn, int dep_type1, rtx dep_insn, int cost)
6274 {
6275   enum reg_note dep_type = (enum reg_note) dep_type1;
6276   enum attr_itanium_class dep_class;
6277   enum attr_itanium_class insn_class;
6278
6279   if (dep_type != REG_DEP_OUTPUT)
6280     return cost;
6281
6282   insn_class = ia64_safe_itanium_class (insn);
6283   dep_class = ia64_safe_itanium_class (dep_insn);
6284   if (dep_class == ITANIUM_CLASS_ST || dep_class == ITANIUM_CLASS_STF
6285       || insn_class == ITANIUM_CLASS_ST || insn_class == ITANIUM_CLASS_STF)
6286     return 0;
6287
6288   return cost;
6289 }
6290
6291 /* Like emit_insn_before, but skip cycle_display notes.
6292    ??? When cycle display notes are implemented, update this.  */
6293
6294 static void
6295 ia64_emit_insn_before (rtx insn, rtx before)
6296 {
6297   emit_insn_before (insn, before);
6298 }
6299
6300 /* The following function marks insns who produce addresses for load
6301    and store insns.  Such insns will be placed into M slots because it
6302    decrease latency time for Itanium1 (see function
6303    `ia64_produce_address_p' and the DFA descriptions).  */
6304
6305 static void
6306 ia64_dependencies_evaluation_hook (rtx head, rtx tail)
6307 {
6308   rtx insn, link, next, next_tail;
6309
6310   /* Before reload, which_alternative is not set, which means that
6311      ia64_safe_itanium_class will produce wrong results for (at least)
6312      move instructions.  */
6313   if (!reload_completed)
6314     return;
6315
6316   next_tail = NEXT_INSN (tail);
6317   for (insn = head; insn != next_tail; insn = NEXT_INSN (insn))
6318     if (INSN_P (insn))
6319       insn->call = 0;
6320   for (insn = head; insn != next_tail; insn = NEXT_INSN (insn))
6321     if (INSN_P (insn)
6322         && ia64_safe_itanium_class (insn) == ITANIUM_CLASS_IALU)
6323       {
6324         for (link = INSN_DEPEND (insn); link != 0; link = XEXP (link, 1))
6325           {
6326             enum attr_itanium_class c;
6327
6328             if (REG_NOTE_KIND (link) != REG_DEP_TRUE)
6329               continue;
6330             next = XEXP (link, 0);
6331             c = ia64_safe_itanium_class (next);
6332             if ((c == ITANIUM_CLASS_ST
6333                  || c == ITANIUM_CLASS_STF)
6334                 && ia64_st_address_bypass_p (insn, next))
6335               break;
6336             else if ((c == ITANIUM_CLASS_LD
6337                       || c == ITANIUM_CLASS_FLD
6338                       || c == ITANIUM_CLASS_FLDP)
6339                      && ia64_ld_address_bypass_p (insn, next))
6340               break;
6341           }
6342         insn->call = link != 0;
6343       }
6344 }
6345
6346 /* We're beginning a new block.  Initialize data structures as necessary.  */
6347
6348 static void
6349 ia64_sched_init (FILE *dump ATTRIBUTE_UNUSED,
6350                  int sched_verbose ATTRIBUTE_UNUSED,
6351                  int max_ready ATTRIBUTE_UNUSED)
6352 {
6353 #ifdef ENABLE_CHECKING
6354   rtx insn;
6355
6356   if (reload_completed)
6357     for (insn = NEXT_INSN (current_sched_info->prev_head);
6358          insn != current_sched_info->next_tail;
6359          insn = NEXT_INSN (insn))
6360       gcc_assert (!SCHED_GROUP_P (insn));
6361 #endif
6362   last_scheduled_insn = NULL_RTX;
6363   init_insn_group_barriers ();
6364 }
6365
6366 /* We're beginning a scheduling pass.  Check assertion.  */
6367
6368 static void
6369 ia64_sched_init_global (FILE *dump ATTRIBUTE_UNUSED,
6370                         int sched_verbose ATTRIBUTE_UNUSED,
6371                         int max_ready ATTRIBUTE_UNUSED)
6372 {  
6373   gcc_assert (!pending_data_specs);
6374 }
6375
6376 /* Scheduling pass is now finished.  Free/reset static variable.  */
6377 static void
6378 ia64_sched_finish_global (FILE *dump ATTRIBUTE_UNUSED,
6379                           int sched_verbose ATTRIBUTE_UNUSED)
6380 {
6381   free (spec_check_no);
6382   spec_check_no = 0;
6383   max_uid = 0;
6384 }
6385
6386 /* We are about to being issuing insns for this clock cycle.
6387    Override the default sort algorithm to better slot instructions.  */
6388
6389 static int
6390 ia64_dfa_sched_reorder (FILE *dump, int sched_verbose, rtx *ready,
6391                         int *pn_ready, int clock_var ATTRIBUTE_UNUSED,
6392                         int reorder_type)
6393 {
6394   int n_asms;
6395   int n_ready = *pn_ready;
6396   rtx *e_ready = ready + n_ready;
6397   rtx *insnp;
6398
6399   if (sched_verbose)
6400     fprintf (dump, "// ia64_dfa_sched_reorder (type %d):\n", reorder_type);
6401
6402   if (reorder_type == 0)
6403     {
6404       /* First, move all USEs, CLOBBERs and other crud out of the way.  */
6405       n_asms = 0;
6406       for (insnp = ready; insnp < e_ready; insnp++)
6407         if (insnp < e_ready)
6408           {
6409             rtx insn = *insnp;
6410             enum attr_type t = ia64_safe_type (insn);
6411             if (t == TYPE_UNKNOWN)
6412               {
6413                 if (GET_CODE (PATTERN (insn)) == ASM_INPUT
6414                     || asm_noperands (PATTERN (insn)) >= 0)
6415                   {
6416                     rtx lowest = ready[n_asms];
6417                     ready[n_asms] = insn;
6418                     *insnp = lowest;
6419                     n_asms++;
6420                   }
6421                 else
6422                   {
6423                     rtx highest = ready[n_ready - 1];
6424                     ready[n_ready - 1] = insn;
6425                     *insnp = highest;
6426                     return 1;
6427                   }
6428               }
6429           }
6430
6431       if (n_asms < n_ready)
6432         {
6433           /* Some normal insns to process.  Skip the asms.  */
6434           ready += n_asms;
6435           n_ready -= n_asms;
6436         }
6437       else if (n_ready > 0)
6438         return 1;
6439     }
6440
6441   if (ia64_final_schedule)
6442     {
6443       int deleted = 0;
6444       int nr_need_stop = 0;
6445
6446       for (insnp = ready; insnp < e_ready; insnp++)
6447         if (safe_group_barrier_needed (*insnp))
6448           nr_need_stop++;
6449
6450       if (reorder_type == 1 && n_ready == nr_need_stop)
6451         return 0;
6452       if (reorder_type == 0)
6453         return 1;
6454       insnp = e_ready;
6455       /* Move down everything that needs a stop bit, preserving
6456          relative order.  */
6457       while (insnp-- > ready + deleted)
6458         while (insnp >= ready + deleted)
6459           {
6460             rtx insn = *insnp;
6461             if (! safe_group_barrier_needed (insn))
6462               break;
6463             memmove (ready + 1, ready, (insnp - ready) * sizeof (rtx));
6464             *ready = insn;
6465             deleted++;
6466           }
6467       n_ready -= deleted;
6468       ready += deleted;
6469     }
6470
6471   return 1;
6472 }
6473
6474 /* We are about to being issuing insns for this clock cycle.  Override
6475    the default sort algorithm to better slot instructions.  */
6476
6477 static int
6478 ia64_sched_reorder (FILE *dump, int sched_verbose, rtx *ready, int *pn_ready,
6479                     int clock_var)
6480 {
6481   return ia64_dfa_sched_reorder (dump, sched_verbose, ready,
6482                                  pn_ready, clock_var, 0);
6483 }
6484
6485 /* Like ia64_sched_reorder, but called after issuing each insn.
6486    Override the default sort algorithm to better slot instructions.  */
6487
6488 static int
6489 ia64_sched_reorder2 (FILE *dump ATTRIBUTE_UNUSED,
6490                      int sched_verbose ATTRIBUTE_UNUSED, rtx *ready,
6491                      int *pn_ready, int clock_var)
6492 {
6493   if (ia64_tune == PROCESSOR_ITANIUM && reload_completed && last_scheduled_insn)
6494     clocks [INSN_UID (last_scheduled_insn)] = clock_var;
6495   return ia64_dfa_sched_reorder (dump, sched_verbose, ready, pn_ready,
6496                                  clock_var, 1);
6497 }
6498
6499 /* We are about to issue INSN.  Return the number of insns left on the
6500    ready queue that can be issued this cycle.  */
6501
6502 static int
6503 ia64_variable_issue (FILE *dump ATTRIBUTE_UNUSED,
6504                      int sched_verbose ATTRIBUTE_UNUSED,
6505                      rtx insn ATTRIBUTE_UNUSED,
6506                      int can_issue_more ATTRIBUTE_UNUSED)
6507 {
6508   if (current_sched_info->flags & DO_SPECULATION)
6509     /* Modulo scheduling does not extend h_i_d when emitting
6510        new instructions.  Deal with it.  */
6511     {
6512       if (DONE_SPEC (insn) & BEGIN_DATA)
6513         pending_data_specs++;
6514       if (CHECK_SPEC (insn) & BEGIN_DATA)
6515         pending_data_specs--;
6516     }
6517
6518   last_scheduled_insn = insn;
6519   memcpy (prev_cycle_state, curr_state, dfa_state_size);
6520   if (reload_completed)
6521     {
6522       int needed = group_barrier_needed (insn);
6523       
6524       gcc_assert (!needed);
6525       if (GET_CODE (insn) == CALL_INSN)
6526         init_insn_group_barriers ();
6527       stops_p [INSN_UID (insn)] = stop_before_p;
6528       stop_before_p = 0;
6529     }
6530   return 1;
6531 }
6532
6533 /* We are choosing insn from the ready queue.  Return nonzero if INSN
6534    can be chosen.  */
6535
6536 static int
6537 ia64_first_cycle_multipass_dfa_lookahead_guard (rtx insn)
6538 {
6539   gcc_assert (insn  && INSN_P (insn));
6540   return ((!reload_completed
6541            || !safe_group_barrier_needed (insn))
6542           && ia64_first_cycle_multipass_dfa_lookahead_guard_spec (insn));
6543 }
6544
6545 /* We are choosing insn from the ready queue.  Return nonzero if INSN
6546    can be chosen.  */
6547
6548 static bool
6549 ia64_first_cycle_multipass_dfa_lookahead_guard_spec (rtx insn)
6550 {
6551   gcc_assert (insn  && INSN_P (insn));
6552   /* Size of ALAT is 32.  As far as we perform conservative data speculation,
6553      we keep ALAT half-empty.  */
6554   return (pending_data_specs < 16
6555           || !(TODO_SPEC (insn) & BEGIN_DATA));
6556 }
6557
6558 /* The following variable value is pseudo-insn used by the DFA insn
6559    scheduler to change the DFA state when the simulated clock is
6560    increased.  */
6561
6562 static rtx dfa_pre_cycle_insn;
6563
6564 /* We are about to being issuing INSN.  Return nonzero if we cannot
6565    issue it on given cycle CLOCK and return zero if we should not sort
6566    the ready queue on the next clock start.  */
6567
6568 static int
6569 ia64_dfa_new_cycle (FILE *dump, int verbose, rtx insn, int last_clock,
6570                     int clock, int *sort_p)
6571 {
6572   int setup_clocks_p = FALSE;
6573
6574   gcc_assert (insn && INSN_P (insn));
6575   if ((reload_completed && safe_group_barrier_needed (insn))
6576       || (last_scheduled_insn
6577           && (GET_CODE (last_scheduled_insn) == CALL_INSN
6578               || GET_CODE (PATTERN (last_scheduled_insn)) == ASM_INPUT
6579               || asm_noperands (PATTERN (last_scheduled_insn)) >= 0)))
6580     {
6581       init_insn_group_barriers ();
6582       if (verbose && dump)
6583         fprintf (dump, "//    Stop should be before %d%s\n", INSN_UID (insn),
6584                  last_clock == clock ? " + cycle advance" : "");
6585       stop_before_p = 1;
6586       if (last_clock == clock)
6587         {
6588           state_transition (curr_state, dfa_stop_insn);
6589           if (TARGET_EARLY_STOP_BITS)
6590             *sort_p = (last_scheduled_insn == NULL_RTX
6591                        || GET_CODE (last_scheduled_insn) != CALL_INSN);
6592           else
6593             *sort_p = 0;
6594           return 1;
6595         }
6596       else if (reload_completed)
6597         setup_clocks_p = TRUE;
6598       if (GET_CODE (PATTERN (last_scheduled_insn)) == ASM_INPUT
6599           || asm_noperands (PATTERN (last_scheduled_insn)) >= 0)
6600         state_reset (curr_state);
6601       else
6602         {
6603           memcpy (curr_state, prev_cycle_state, dfa_state_size);
6604           state_transition (curr_state, dfa_stop_insn);
6605           state_transition (curr_state, dfa_pre_cycle_insn);
6606           state_transition (curr_state, NULL);
6607         }
6608     }
6609   else if (reload_completed)
6610     setup_clocks_p = TRUE;
6611   if (setup_clocks_p && ia64_tune == PROCESSOR_ITANIUM
6612       && GET_CODE (PATTERN (insn)) != ASM_INPUT
6613       && asm_noperands (PATTERN (insn)) < 0)
6614     {
6615       enum attr_itanium_class c = ia64_safe_itanium_class (insn);
6616
6617       if (c != ITANIUM_CLASS_MMMUL && c != ITANIUM_CLASS_MMSHF)
6618         {
6619           rtx link;
6620           int d = -1;
6621
6622           for (link = LOG_LINKS (insn); link; link = XEXP (link, 1))
6623             if (REG_NOTE_KIND (link) == 0)
6624               {
6625                 enum attr_itanium_class dep_class;
6626                 rtx dep_insn = XEXP (link, 0);
6627
6628                 dep_class = ia64_safe_itanium_class (dep_insn);
6629                 if ((dep_class == ITANIUM_CLASS_MMMUL
6630                      || dep_class == ITANIUM_CLASS_MMSHF)
6631                     && last_clock - clocks [INSN_UID (dep_insn)] < 4
6632                     && (d < 0
6633                         || last_clock - clocks [INSN_UID (dep_insn)] < d))
6634                   d = last_clock - clocks [INSN_UID (dep_insn)];
6635               }
6636           if (d >= 0)
6637             add_cycles [INSN_UID (insn)] = 3 - d;
6638         }
6639     }
6640   return 0;
6641 }
6642
6643 /* Implement targetm.sched.h_i_d_extended hook.
6644    Extend internal data structures.  */
6645 static void
6646 ia64_h_i_d_extended (void)
6647 {
6648   if (current_sched_info->flags & DO_SPECULATION)
6649     {
6650       int new_max_uid = get_max_uid () + 1;
6651
6652       spec_check_no = xrecalloc (spec_check_no, new_max_uid,
6653                                  max_uid, sizeof (*spec_check_no));
6654       max_uid = new_max_uid;
6655     }
6656
6657   if (stops_p != NULL) 
6658     {
6659       int new_clocks_length = get_max_uid () + 1;
6660       
6661       stops_p = xrecalloc (stops_p, new_clocks_length, clocks_length, 1);
6662       
6663       if (ia64_tune == PROCESSOR_ITANIUM)
6664         {
6665           clocks = xrecalloc (clocks, new_clocks_length, clocks_length,
6666                               sizeof (int));
6667           add_cycles = xrecalloc (add_cycles, new_clocks_length, clocks_length,
6668                                   sizeof (int));
6669         }
6670       
6671       clocks_length = new_clocks_length;
6672     }
6673 }
6674
6675 /* Constants that help mapping 'enum machine_mode' to int.  */
6676 enum SPEC_MODES
6677   {
6678     SPEC_MODE_INVALID = -1,
6679     SPEC_MODE_FIRST = 0,
6680     SPEC_MODE_FOR_EXTEND_FIRST = 1,
6681     SPEC_MODE_FOR_EXTEND_LAST = 3,
6682     SPEC_MODE_LAST = 8
6683   };
6684
6685 /* Return index of the MODE.  */
6686 static int
6687 ia64_mode_to_int (enum machine_mode mode)
6688 {
6689   switch (mode)
6690     {
6691     case BImode: return 0; /* SPEC_MODE_FIRST  */
6692     case QImode: return 1; /* SPEC_MODE_FOR_EXTEND_FIRST  */
6693     case HImode: return 2;
6694     case SImode: return 3; /* SPEC_MODE_FOR_EXTEND_LAST  */
6695     case DImode: return 4;
6696     case SFmode: return 5;
6697     case DFmode: return 6;
6698     case XFmode: return 7;
6699     case TImode:
6700       /* ??? This mode needs testing.  Bypasses for ldfp8 instruction are not
6701          mentioned in itanium[12].md.  Predicate fp_register_operand also
6702          needs to be defined.  Bottom line: better disable for now.  */
6703       return SPEC_MODE_INVALID;
6704     default:     return SPEC_MODE_INVALID;
6705     }
6706 }
6707
6708 /* Provide information about speculation capabilities.  */
6709 static void
6710 ia64_set_sched_flags (spec_info_t spec_info)
6711 {
6712   unsigned int *flags = &(current_sched_info->flags);
6713
6714   if (*flags & SCHED_RGN
6715       || *flags & SCHED_EBB)  
6716     {
6717       int mask = 0;
6718
6719       if ((mflag_sched_br_data_spec && !reload_completed && optimize > 0)
6720           || (mflag_sched_ar_data_spec && reload_completed))
6721         {
6722           mask |= BEGIN_DATA;
6723           
6724           if ((mflag_sched_br_in_data_spec && !reload_completed)
6725               || (mflag_sched_ar_in_data_spec && reload_completed))
6726             mask |= BE_IN_DATA;
6727         }
6728       
6729       if (mflag_sched_control_spec)
6730         {
6731           mask |= BEGIN_CONTROL;
6732           
6733           if (mflag_sched_in_control_spec)
6734             mask |= BE_IN_CONTROL;
6735         }
6736
6737       gcc_assert (*flags & USE_GLAT);
6738
6739       if (mask)
6740         {
6741           *flags |= USE_DEPS_LIST | DETACH_LIFE_INFO | DO_SPECULATION;
6742           
6743           spec_info->mask = mask;
6744           spec_info->flags = 0;
6745       
6746           if ((mask & DATA_SPEC) && mflag_sched_prefer_non_data_spec_insns)
6747             spec_info->flags |= PREFER_NON_DATA_SPEC;
6748
6749           if ((mask & CONTROL_SPEC)
6750               && mflag_sched_prefer_non_control_spec_insns)
6751             spec_info->flags |= PREFER_NON_CONTROL_SPEC;
6752
6753           if (mflag_sched_spec_verbose)
6754             {
6755               if (sched_verbose >= 1)
6756                 spec_info->dump = sched_dump;
6757               else
6758                 spec_info->dump = stderr;
6759             }
6760           else
6761             spec_info->dump = 0;
6762           
6763           if (mflag_sched_count_spec_in_critical_path)
6764             spec_info->flags |= COUNT_SPEC_IN_CRITICAL_PATH;
6765         }
6766     }
6767 }
6768
6769 /* Implement targetm.sched.speculate_insn hook.
6770    Check if the INSN can be TS speculative.
6771    If 'no' - return -1.
6772    If 'yes' - generate speculative pattern in the NEW_PAT and return 1.
6773    If current pattern of the INSN already provides TS speculation, return 0.  */
6774 static int
6775 ia64_speculate_insn (rtx insn, ds_t ts, rtx *new_pat)
6776 {  
6777   rtx pat, reg, mem, mem_reg;
6778   int mode_no, gen_p = 1;
6779   bool extend_p;
6780   
6781   gcc_assert (!(ts & ~BEGIN_SPEC) && ts);
6782            
6783   pat = PATTERN (insn);
6784
6785   if (GET_CODE (pat) == COND_EXEC)
6786     pat = COND_EXEC_CODE (pat);
6787
6788   if (GET_CODE (pat) != SET)
6789     return -1;
6790   reg = SET_DEST (pat);
6791   if (!REG_P (reg))
6792     return -1;
6793
6794   mem = SET_SRC (pat);  
6795   if (GET_CODE (mem) == ZERO_EXTEND)
6796     {
6797       mem = XEXP (mem, 0);
6798       extend_p = true;      
6799     }
6800   else
6801     extend_p = false;
6802
6803   if (GET_CODE (mem) == UNSPEC)
6804     {
6805       int code;
6806       
6807       code = XINT (mem, 1);
6808       if (code != UNSPEC_LDA && code != UNSPEC_LDS && code != UNSPEC_LDSA)
6809         return -1;
6810
6811       if ((code == UNSPEC_LDA && !(ts & BEGIN_CONTROL))
6812           || (code == UNSPEC_LDS && !(ts & BEGIN_DATA))
6813           || code == UNSPEC_LDSA)
6814         gen_p = 0;
6815
6816       mem = XVECEXP (mem, 0, 0);
6817       gcc_assert (MEM_P (mem));
6818     }
6819   if (!MEM_P (mem))
6820     return -1;
6821   mem_reg = XEXP (mem, 0);
6822   if (!REG_P (mem_reg))
6823     return -1;
6824      
6825   /* We should use MEM's mode since REG's mode in presence of ZERO_EXTEND
6826      will always be DImode.  */
6827   mode_no = ia64_mode_to_int (GET_MODE (mem));
6828   
6829   if (mode_no == SPEC_MODE_INVALID
6830       || (extend_p
6831           && !(SPEC_MODE_FOR_EXTEND_FIRST <= mode_no
6832                && mode_no <= SPEC_MODE_FOR_EXTEND_LAST)))
6833     return -1;
6834
6835   extract_insn_cached (insn);
6836   gcc_assert (reg == recog_data.operand[0] && mem == recog_data.operand[1]);
6837   *new_pat = ia64_gen_spec_insn (insn, ts, mode_no, gen_p != 0, extend_p);
6838
6839   return gen_p;
6840 }
6841
6842 enum
6843   {
6844     /* Offset to reach ZERO_EXTEND patterns.  */
6845     SPEC_GEN_EXTEND_OFFSET = SPEC_MODE_LAST - SPEC_MODE_FOR_EXTEND_FIRST + 1,
6846     /* Number of patterns for each speculation mode.  */
6847     SPEC_N = (SPEC_MODE_LAST
6848               + SPEC_MODE_FOR_EXTEND_LAST - SPEC_MODE_FOR_EXTEND_FIRST + 2)
6849   };
6850
6851 enum SPEC_GEN_LD_MAP
6852   {
6853     /* Offset to ld.a patterns.  */
6854     SPEC_GEN_A = 0 * SPEC_N,
6855     /* Offset to ld.s patterns.  */
6856     SPEC_GEN_S = 1 * SPEC_N,
6857     /* Offset to ld.sa patterns.  */
6858     SPEC_GEN_SA = 2 * SPEC_N,
6859     /* Offset to ld.sa patterns.  For this patterns corresponding ld.c will
6860        mutate to chk.s.  */
6861     SPEC_GEN_SA_FOR_S = 3 * SPEC_N
6862   };
6863
6864 /* These offsets are used to get (4 * SPEC_N).  */
6865 enum SPEC_GEN_CHECK_OFFSET
6866   {
6867     SPEC_GEN_CHKA_FOR_A_OFFSET = 4 * SPEC_N - SPEC_GEN_A,
6868     SPEC_GEN_CHKA_FOR_SA_OFFSET = 4 * SPEC_N - SPEC_GEN_SA
6869   };
6870
6871 /* If GEN_P is true, calculate the index of needed speculation check and return
6872    speculative pattern for INSN with speculative mode TS, machine mode
6873    MODE_NO and with ZERO_EXTEND (if EXTEND_P is true).
6874    If GEN_P is false, just calculate the index of needed speculation check.  */
6875 static rtx
6876 ia64_gen_spec_insn (rtx insn, ds_t ts, int mode_no, bool gen_p, bool extend_p)
6877 {
6878   rtx pat, new_pat;
6879   int load_no;
6880   int shift = 0;
6881
6882   static rtx (* const gen_load[]) (rtx, rtx) = {
6883     gen_movbi_advanced,
6884     gen_movqi_advanced,
6885     gen_movhi_advanced,
6886     gen_movsi_advanced,
6887     gen_movdi_advanced,
6888     gen_movsf_advanced,
6889     gen_movdf_advanced,
6890     gen_movxf_advanced,
6891     gen_movti_advanced,
6892     gen_zero_extendqidi2_advanced,
6893     gen_zero_extendhidi2_advanced,
6894     gen_zero_extendsidi2_advanced,
6895
6896     gen_movbi_speculative,
6897     gen_movqi_speculative,
6898     gen_movhi_speculative,
6899     gen_movsi_speculative,
6900     gen_movdi_speculative,
6901     gen_movsf_speculative,
6902     gen_movdf_speculative,
6903     gen_movxf_speculative,
6904     gen_movti_speculative,
6905     gen_zero_extendqidi2_speculative,
6906     gen_zero_extendhidi2_speculative,
6907     gen_zero_extendsidi2_speculative,
6908
6909     gen_movbi_speculative_advanced,
6910     gen_movqi_speculative_advanced,
6911     gen_movhi_speculative_advanced,
6912     gen_movsi_speculative_advanced,
6913     gen_movdi_speculative_advanced,
6914     gen_movsf_speculative_advanced,
6915     gen_movdf_speculative_advanced,
6916     gen_movxf_speculative_advanced,
6917     gen_movti_speculative_advanced,
6918     gen_zero_extendqidi2_speculative_advanced,
6919     gen_zero_extendhidi2_speculative_advanced,
6920     gen_zero_extendsidi2_speculative_advanced,
6921
6922     gen_movbi_speculative_advanced,
6923     gen_movqi_speculative_advanced,
6924     gen_movhi_speculative_advanced,
6925     gen_movsi_speculative_advanced,
6926     gen_movdi_speculative_advanced,
6927     gen_movsf_speculative_advanced,
6928     gen_movdf_speculative_advanced,
6929     gen_movxf_speculative_advanced,
6930     gen_movti_speculative_advanced,
6931     gen_zero_extendqidi2_speculative_advanced,
6932     gen_zero_extendhidi2_speculative_advanced,
6933     gen_zero_extendsidi2_speculative_advanced
6934   };
6935
6936   load_no = extend_p ? mode_no + SPEC_GEN_EXTEND_OFFSET : mode_no;
6937
6938   if (ts & BEGIN_DATA)
6939     {
6940       /* We don't need recovery because even if this is ld.sa
6941          ALAT entry will be allocated only if NAT bit is set to zero. 
6942          So it is enough to use ld.c here.  */    
6943
6944       if (ts & BEGIN_CONTROL)
6945         {             
6946           load_no += SPEC_GEN_SA;
6947
6948           if (!mflag_sched_ldc)
6949             shift = SPEC_GEN_CHKA_FOR_SA_OFFSET;
6950         }
6951       else
6952         {
6953           load_no += SPEC_GEN_A;
6954
6955           if (!mflag_sched_ldc)         
6956             shift = SPEC_GEN_CHKA_FOR_A_OFFSET;
6957         }
6958     }
6959   else if (ts & BEGIN_CONTROL)
6960     {
6961       /* ld.sa can be used instead of ld.s to avoid basic block splitting.  */
6962       if (!mflag_control_ldc)
6963         load_no += SPEC_GEN_S;
6964       else
6965         {
6966           gcc_assert (mflag_sched_ldc);
6967           load_no += SPEC_GEN_SA_FOR_S;
6968         }
6969     }
6970   else
6971     gcc_unreachable ();
6972
6973   /* Set the desired check index.  We add '1', because zero element in this
6974      array means, that instruction with such uid is non-speculative.  */
6975   spec_check_no[INSN_UID (insn)] = load_no + shift + 1;
6976
6977   if (!gen_p)
6978     return 0;
6979
6980   new_pat = gen_load[load_no] (copy_rtx (recog_data.operand[0]),
6981                                copy_rtx (recog_data.operand[1]));
6982
6983   pat = PATTERN (insn);
6984   if (GET_CODE (pat) == COND_EXEC)
6985     new_pat = gen_rtx_COND_EXEC (VOIDmode, copy_rtx 
6986                                  (COND_EXEC_TEST (pat)), new_pat);
6987
6988   return new_pat;
6989 }
6990
6991 /* Offset to branchy checks.  */
6992 enum { SPEC_GEN_CHECK_MUTATION_OFFSET = 5 * SPEC_N };
6993
6994 /* Return nonzero, if INSN needs branchy recovery check.  */
6995 static bool
6996 ia64_needs_block_p (rtx insn)
6997 {
6998   int check_no;
6999
7000   check_no = spec_check_no[INSN_UID(insn)] - 1;
7001   gcc_assert (0 <= check_no && check_no < SPEC_GEN_CHECK_MUTATION_OFFSET);
7002
7003   return ((SPEC_GEN_S <= check_no && check_no < SPEC_GEN_S + SPEC_N)
7004           || (4 * SPEC_N <= check_no && check_no < 4 * SPEC_N + SPEC_N));
7005 }
7006
7007 /* Generate (or regenerate, if (MUTATE_P)) recovery check for INSN.
7008    If (LABEL != 0 || MUTATE_P), generate branchy recovery check.
7009    Otherwise, generate a simple check.  */
7010 static rtx
7011 ia64_gen_check (rtx insn, rtx label, bool mutate_p)
7012 {
7013   rtx op1, pat, check_pat;
7014
7015   static rtx (* const gen_check[]) (rtx, rtx) = {
7016     gen_movbi_clr,
7017     gen_movqi_clr,
7018     gen_movhi_clr,
7019     gen_movsi_clr,
7020     gen_movdi_clr,
7021     gen_movsf_clr,
7022     gen_movdf_clr,
7023     gen_movxf_clr,
7024     gen_movti_clr,
7025     gen_zero_extendqidi2_clr,
7026     gen_zero_extendhidi2_clr,
7027     gen_zero_extendsidi2_clr,
7028
7029     gen_speculation_check_bi,
7030     gen_speculation_check_qi,
7031     gen_speculation_check_hi,
7032     gen_speculation_check_si,
7033     gen_speculation_check_di,
7034     gen_speculation_check_sf,
7035     gen_speculation_check_df,
7036     gen_speculation_check_xf,
7037     gen_speculation_check_ti,
7038     gen_speculation_check_di,
7039     gen_speculation_check_di,
7040     gen_speculation_check_di,
7041
7042     gen_movbi_clr,
7043     gen_movqi_clr,
7044     gen_movhi_clr,
7045     gen_movsi_clr,
7046     gen_movdi_clr,
7047     gen_movsf_clr,
7048     gen_movdf_clr,
7049     gen_movxf_clr,
7050     gen_movti_clr,
7051     gen_zero_extendqidi2_clr,
7052     gen_zero_extendhidi2_clr,
7053     gen_zero_extendsidi2_clr,
7054
7055     gen_movbi_clr,
7056     gen_movqi_clr,
7057     gen_movhi_clr,
7058     gen_movsi_clr,
7059     gen_movdi_clr,
7060     gen_movsf_clr,
7061     gen_movdf_clr,
7062     gen_movxf_clr,
7063     gen_movti_clr,
7064     gen_zero_extendqidi2_clr,
7065     gen_zero_extendhidi2_clr,
7066     gen_zero_extendsidi2_clr,
7067
7068     gen_advanced_load_check_clr_bi,
7069     gen_advanced_load_check_clr_qi,
7070     gen_advanced_load_check_clr_hi,
7071     gen_advanced_load_check_clr_si,
7072     gen_advanced_load_check_clr_di,
7073     gen_advanced_load_check_clr_sf,
7074     gen_advanced_load_check_clr_df,
7075     gen_advanced_load_check_clr_xf,
7076     gen_advanced_load_check_clr_ti,
7077     gen_advanced_load_check_clr_di,
7078     gen_advanced_load_check_clr_di,
7079     gen_advanced_load_check_clr_di,
7080
7081     /* Following checks are generated during mutation.  */
7082     gen_advanced_load_check_clr_bi,
7083     gen_advanced_load_check_clr_qi,
7084     gen_advanced_load_check_clr_hi,
7085     gen_advanced_load_check_clr_si,
7086     gen_advanced_load_check_clr_di,
7087     gen_advanced_load_check_clr_sf,
7088     gen_advanced_load_check_clr_df,
7089     gen_advanced_load_check_clr_xf,
7090     gen_advanced_load_check_clr_ti,
7091     gen_advanced_load_check_clr_di,
7092     gen_advanced_load_check_clr_di,
7093     gen_advanced_load_check_clr_di,
7094
7095     0,0,0,0,0,0,0,0,0,0,0,0,
7096
7097     gen_advanced_load_check_clr_bi,
7098     gen_advanced_load_check_clr_qi,
7099     gen_advanced_load_check_clr_hi,
7100     gen_advanced_load_check_clr_si,
7101     gen_advanced_load_check_clr_di,
7102     gen_advanced_load_check_clr_sf,
7103     gen_advanced_load_check_clr_df,
7104     gen_advanced_load_check_clr_xf,
7105     gen_advanced_load_check_clr_ti,
7106     gen_advanced_load_check_clr_di,
7107     gen_advanced_load_check_clr_di,
7108     gen_advanced_load_check_clr_di,
7109
7110     gen_speculation_check_bi,
7111     gen_speculation_check_qi,
7112     gen_speculation_check_hi,
7113     gen_speculation_check_si,
7114     gen_speculation_check_di,
7115     gen_speculation_check_sf,
7116     gen_speculation_check_df,
7117     gen_speculation_check_xf,
7118     gen_speculation_check_ti,
7119     gen_speculation_check_di,
7120     gen_speculation_check_di,
7121     gen_speculation_check_di
7122   };
7123
7124   extract_insn_cached (insn);
7125
7126   if (label)
7127     {
7128       gcc_assert (mutate_p || ia64_needs_block_p (insn));
7129       op1 = label;
7130     }
7131   else
7132     {
7133       gcc_assert (!mutate_p && !ia64_needs_block_p (insn));
7134       op1 = copy_rtx (recog_data.operand[1]);
7135     }
7136       
7137   if (mutate_p)
7138     /* INSN is ld.c.
7139        Find the speculation check number by searching for original
7140        speculative load in the RESOLVED_DEPS list of INSN.
7141        As long as patterns are unique for each instruction, this can be
7142        accomplished by matching ORIG_PAT fields.  */
7143     {
7144       rtx link;
7145       int check_no = 0;
7146       rtx orig_pat = ORIG_PAT (insn);
7147
7148       for (link = RESOLVED_DEPS (insn); link; link = XEXP (link, 1))
7149         {
7150           rtx x = XEXP (link, 0);
7151
7152           if (ORIG_PAT (x) == orig_pat)
7153             check_no = spec_check_no[INSN_UID (x)];
7154         }
7155       gcc_assert (check_no);
7156
7157       spec_check_no[INSN_UID (insn)] = (check_no
7158                                         + SPEC_GEN_CHECK_MUTATION_OFFSET);
7159     }
7160
7161   check_pat = (gen_check[spec_check_no[INSN_UID (insn)] - 1]
7162                (copy_rtx (recog_data.operand[0]), op1));
7163     
7164   pat = PATTERN (insn);
7165   if (GET_CODE (pat) == COND_EXEC)
7166     check_pat = gen_rtx_COND_EXEC (VOIDmode, copy_rtx (COND_EXEC_TEST (pat)),
7167                                    check_pat);
7168
7169   return check_pat;
7170 }
7171
7172 /* Return nonzero, if X is branchy recovery check.  */
7173 static int
7174 ia64_spec_check_p (rtx x)
7175 {
7176   x = PATTERN (x);
7177   if (GET_CODE (x) == COND_EXEC)
7178     x = COND_EXEC_CODE (x);
7179   if (GET_CODE (x) == SET)
7180     return ia64_spec_check_src_p (SET_SRC (x));
7181   return 0;
7182 }
7183
7184 /* Return nonzero, if SRC belongs to recovery check.  */
7185 static int
7186 ia64_spec_check_src_p (rtx src)
7187 {
7188   if (GET_CODE (src) == IF_THEN_ELSE)
7189     {
7190       rtx t;
7191
7192       t = XEXP (src, 0);
7193       if (GET_CODE (t) == NE)
7194         {
7195           t = XEXP (t, 0);          
7196
7197           if (GET_CODE (t) == UNSPEC)
7198             {
7199               int code;
7200               
7201               code = XINT (t, 1);
7202              
7203               if (code == UNSPEC_CHKACLR
7204                   || code == UNSPEC_CHKS
7205                   || code == UNSPEC_LDCCLR)
7206                 {
7207                   gcc_assert (code != 0);
7208                   return code;
7209                 }
7210             }
7211         }
7212     }
7213   return 0;
7214 }
7215 \f
7216
7217 /* The following page contains abstract data `bundle states' which are
7218    used for bundling insns (inserting nops and template generation).  */
7219
7220 /* The following describes state of insn bundling.  */
7221
7222 struct bundle_state
7223 {
7224   /* Unique bundle state number to identify them in the debugging
7225      output  */
7226   int unique_num;
7227   rtx insn;     /* corresponding insn, NULL for the 1st and the last state  */
7228   /* number nops before and after the insn  */
7229   short before_nops_num, after_nops_num;
7230   int insn_num; /* insn number (0 - for initial state, 1 - for the 1st
7231                    insn */
7232   int cost;     /* cost of the state in cycles */
7233   int accumulated_insns_num; /* number of all previous insns including
7234                                 nops.  L is considered as 2 insns */
7235   int branch_deviation; /* deviation of previous branches from 3rd slots  */
7236   struct bundle_state *next;  /* next state with the same insn_num  */
7237   struct bundle_state *originator; /* originator (previous insn state)  */
7238   /* All bundle states are in the following chain.  */
7239   struct bundle_state *allocated_states_chain;
7240   /* The DFA State after issuing the insn and the nops.  */
7241   state_t dfa_state;
7242 };
7243
7244 /* The following is map insn number to the corresponding bundle state.  */
7245
7246 static struct bundle_state **index_to_bundle_states;
7247
7248 /* The unique number of next bundle state.  */
7249
7250 static int bundle_states_num;
7251
7252 /* All allocated bundle states are in the following chain.  */
7253
7254 static struct bundle_state *allocated_bundle_states_chain;
7255
7256 /* All allocated but not used bundle states are in the following
7257    chain.  */
7258
7259 static struct bundle_state *free_bundle_state_chain;
7260
7261
7262 /* The following function returns a free bundle state.  */
7263
7264 static struct bundle_state *
7265 get_free_bundle_state (void)
7266 {
7267   struct bundle_state *result;
7268
7269   if (free_bundle_state_chain != NULL)
7270     {
7271       result = free_bundle_state_chain;
7272       free_bundle_state_chain = result->next;
7273     }
7274   else
7275     {
7276       result = xmalloc (sizeof (struct bundle_state));
7277       result->dfa_state = xmalloc (dfa_state_size);
7278       result->allocated_states_chain = allocated_bundle_states_chain;
7279       allocated_bundle_states_chain = result;
7280     }
7281   result->unique_num = bundle_states_num++;
7282   return result;
7283
7284 }
7285
7286 /* The following function frees given bundle state.  */
7287
7288 static void
7289 free_bundle_state (struct bundle_state *state)
7290 {
7291   state->next = free_bundle_state_chain;
7292   free_bundle_state_chain = state;
7293 }
7294
7295 /* Start work with abstract data `bundle states'.  */
7296
7297 static void
7298 initiate_bundle_states (void)
7299 {
7300   bundle_states_num = 0;
7301   free_bundle_state_chain = NULL;
7302   allocated_bundle_states_chain = NULL;
7303 }
7304
7305 /* Finish work with abstract data `bundle states'.  */
7306
7307 static void
7308 finish_bundle_states (void)
7309 {
7310   struct bundle_state *curr_state, *next_state;
7311
7312   for (curr_state = allocated_bundle_states_chain;
7313        curr_state != NULL;
7314        curr_state = next_state)
7315     {
7316       next_state = curr_state->allocated_states_chain;
7317       free (curr_state->dfa_state);
7318       free (curr_state);
7319     }
7320 }
7321
7322 /* Hash table of the bundle states.  The key is dfa_state and insn_num
7323    of the bundle states.  */
7324
7325 static htab_t bundle_state_table;
7326
7327 /* The function returns hash of BUNDLE_STATE.  */
7328
7329 static unsigned
7330 bundle_state_hash (const void *bundle_state)
7331 {
7332   const struct bundle_state *state = (struct bundle_state *) bundle_state;
7333   unsigned result, i;
7334
7335   for (result = i = 0; i < dfa_state_size; i++)
7336     result += (((unsigned char *) state->dfa_state) [i]
7337                << ((i % CHAR_BIT) * 3 + CHAR_BIT));
7338   return result + state->insn_num;
7339 }
7340
7341 /* The function returns nonzero if the bundle state keys are equal.  */
7342
7343 static int
7344 bundle_state_eq_p (const void *bundle_state_1, const void *bundle_state_2)
7345 {
7346   const struct bundle_state * state1 = (struct bundle_state *) bundle_state_1;
7347   const struct bundle_state * state2 = (struct bundle_state *) bundle_state_2;
7348
7349   return (state1->insn_num == state2->insn_num
7350           && memcmp (state1->dfa_state, state2->dfa_state,
7351                      dfa_state_size) == 0);
7352 }
7353
7354 /* The function inserts the BUNDLE_STATE into the hash table.  The
7355    function returns nonzero if the bundle has been inserted into the
7356    table.  The table contains the best bundle state with given key.  */
7357
7358 static int
7359 insert_bundle_state (struct bundle_state *bundle_state)
7360 {
7361   void **entry_ptr;
7362
7363   entry_ptr = htab_find_slot (bundle_state_table, bundle_state, 1);
7364   if (*entry_ptr == NULL)
7365     {
7366       bundle_state->next = index_to_bundle_states [bundle_state->insn_num];
7367       index_to_bundle_states [bundle_state->insn_num] = bundle_state;
7368       *entry_ptr = (void *) bundle_state;
7369       return TRUE;
7370     }
7371   else if (bundle_state->cost < ((struct bundle_state *) *entry_ptr)->cost
7372            || (bundle_state->cost == ((struct bundle_state *) *entry_ptr)->cost
7373                && (((struct bundle_state *)*entry_ptr)->accumulated_insns_num
7374                    > bundle_state->accumulated_insns_num
7375                    || (((struct bundle_state *)
7376                         *entry_ptr)->accumulated_insns_num
7377                        == bundle_state->accumulated_insns_num
7378                        && ((struct bundle_state *)
7379                            *entry_ptr)->branch_deviation
7380                        > bundle_state->branch_deviation))))
7381
7382     {
7383       struct bundle_state temp;
7384
7385       temp = *(struct bundle_state *) *entry_ptr;
7386       *(struct bundle_state *) *entry_ptr = *bundle_state;
7387       ((struct bundle_state *) *entry_ptr)->next = temp.next;
7388       *bundle_state = temp;
7389     }
7390   return FALSE;
7391 }
7392
7393 /* Start work with the hash table.  */
7394
7395 static void
7396 initiate_bundle_state_table (void)
7397 {
7398   bundle_state_table = htab_create (50, bundle_state_hash, bundle_state_eq_p,
7399                                     (htab_del) 0);
7400 }
7401
7402 /* Finish work with the hash table.  */
7403
7404 static void
7405 finish_bundle_state_table (void)
7406 {
7407   htab_delete (bundle_state_table);
7408 }
7409
7410 \f
7411
7412 /* The following variable is a insn `nop' used to check bundle states
7413    with different number of inserted nops.  */
7414
7415 static rtx ia64_nop;
7416
7417 /* The following function tries to issue NOPS_NUM nops for the current
7418    state without advancing processor cycle.  If it failed, the
7419    function returns FALSE and frees the current state.  */
7420
7421 static int
7422 try_issue_nops (struct bundle_state *curr_state, int nops_num)
7423 {
7424   int i;
7425
7426   for (i = 0; i < nops_num; i++)
7427     if (state_transition (curr_state->dfa_state, ia64_nop) >= 0)
7428       {
7429         free_bundle_state (curr_state);
7430         return FALSE;
7431       }
7432   return TRUE;
7433 }
7434
7435 /* The following function tries to issue INSN for the current
7436    state without advancing processor cycle.  If it failed, the
7437    function returns FALSE and frees the current state.  */
7438
7439 static int
7440 try_issue_insn (struct bundle_state *curr_state, rtx insn)
7441 {
7442   if (insn && state_transition (curr_state->dfa_state, insn) >= 0)
7443     {
7444       free_bundle_state (curr_state);
7445       return FALSE;
7446     }
7447   return TRUE;
7448 }
7449
7450 /* The following function tries to issue BEFORE_NOPS_NUM nops and INSN
7451    starting with ORIGINATOR without advancing processor cycle.  If
7452    TRY_BUNDLE_END_P is TRUE, the function also/only (if
7453    ONLY_BUNDLE_END_P is TRUE) tries to issue nops to fill all bundle.
7454    If it was successful, the function creates new bundle state and
7455    insert into the hash table and into `index_to_bundle_states'.  */
7456
7457 static void
7458 issue_nops_and_insn (struct bundle_state *originator, int before_nops_num,
7459                      rtx insn, int try_bundle_end_p, int only_bundle_end_p)
7460 {
7461   struct bundle_state *curr_state;
7462
7463   curr_state = get_free_bundle_state ();
7464   memcpy (curr_state->dfa_state, originator->dfa_state, dfa_state_size);
7465   curr_state->insn = insn;
7466   curr_state->insn_num = originator->insn_num + 1;
7467   curr_state->cost = originator->cost;
7468   curr_state->originator = originator;
7469   curr_state->before_nops_num = before_nops_num;
7470   curr_state->after_nops_num = 0;
7471   curr_state->accumulated_insns_num
7472     = originator->accumulated_insns_num + before_nops_num;
7473   curr_state->branch_deviation = originator->branch_deviation;
7474   gcc_assert (insn);
7475   if (INSN_CODE (insn) == CODE_FOR_insn_group_barrier)
7476     {
7477       gcc_assert (GET_MODE (insn) != TImode);
7478       if (!try_issue_nops (curr_state, before_nops_num))
7479         return;
7480       if (!try_issue_insn (curr_state, insn))
7481         return;
7482       memcpy (temp_dfa_state, curr_state->dfa_state, dfa_state_size);
7483       if (state_transition (temp_dfa_state, dfa_pre_cycle_insn) >= 0
7484           && curr_state->accumulated_insns_num % 3 != 0)
7485         {
7486           free_bundle_state (curr_state);
7487           return;
7488         }
7489     }
7490   else if (GET_MODE (insn) != TImode)
7491     {
7492       if (!try_issue_nops (curr_state, before_nops_num))
7493         return;
7494       if (!try_issue_insn (curr_state, insn))
7495         return;
7496       curr_state->accumulated_insns_num++;
7497       gcc_assert (GET_CODE (PATTERN (insn)) != ASM_INPUT
7498                   && asm_noperands (PATTERN (insn)) < 0);
7499
7500       if (ia64_safe_type (insn) == TYPE_L)
7501         curr_state->accumulated_insns_num++;
7502     }
7503   else
7504     {
7505       /* If this is an insn that must be first in a group, then don't allow
7506          nops to be emitted before it.  Currently, alloc is the only such
7507          supported instruction.  */
7508       /* ??? The bundling automatons should handle this for us, but they do
7509          not yet have support for the first_insn attribute.  */
7510       if (before_nops_num > 0 && get_attr_first_insn (insn) == FIRST_INSN_YES)
7511         {
7512           free_bundle_state (curr_state);
7513           return;
7514         }
7515
7516       state_transition (curr_state->dfa_state, dfa_pre_cycle_insn);
7517       state_transition (curr_state->dfa_state, NULL);
7518       curr_state->cost++;
7519       if (!try_issue_nops (curr_state, before_nops_num))
7520         return;
7521       if (!try_issue_insn (curr_state, insn))
7522         return;
7523       curr_state->accumulated_insns_num++;
7524       if (GET_CODE (PATTERN (insn)) == ASM_INPUT
7525           || asm_noperands (PATTERN (insn)) >= 0)
7526         {
7527           /* Finish bundle containing asm insn.  */
7528           curr_state->after_nops_num
7529             = 3 - curr_state->accumulated_insns_num % 3;
7530           curr_state->accumulated_insns_num
7531             += 3 - curr_state->accumulated_insns_num % 3;
7532         }
7533       else if (ia64_safe_type (insn) == TYPE_L)
7534         curr_state->accumulated_insns_num++;
7535     }
7536   if (ia64_safe_type (insn) == TYPE_B)
7537     curr_state->branch_deviation
7538       += 2 - (curr_state->accumulated_insns_num - 1) % 3;
7539   if (try_bundle_end_p && curr_state->accumulated_insns_num % 3 != 0)
7540     {
7541       if (!only_bundle_end_p && insert_bundle_state (curr_state))
7542         {
7543           state_t dfa_state;
7544           struct bundle_state *curr_state1;
7545           struct bundle_state *allocated_states_chain;
7546
7547           curr_state1 = get_free_bundle_state ();
7548           dfa_state = curr_state1->dfa_state;
7549           allocated_states_chain = curr_state1->allocated_states_chain;
7550           *curr_state1 = *curr_state;
7551           curr_state1->dfa_state = dfa_state;
7552           curr_state1->allocated_states_chain = allocated_states_chain;
7553           memcpy (curr_state1->dfa_state, curr_state->dfa_state,
7554                   dfa_state_size);
7555           curr_state = curr_state1;
7556         }
7557       if (!try_issue_nops (curr_state,
7558                            3 - curr_state->accumulated_insns_num % 3))
7559         return;
7560       curr_state->after_nops_num
7561         = 3 - curr_state->accumulated_insns_num % 3;
7562       curr_state->accumulated_insns_num
7563         += 3 - curr_state->accumulated_insns_num % 3;
7564     }
7565   if (!insert_bundle_state (curr_state))
7566     free_bundle_state (curr_state);
7567   return;
7568 }
7569
7570 /* The following function returns position in the two window bundle
7571    for given STATE.  */
7572
7573 static int
7574 get_max_pos (state_t state)
7575 {
7576   if (cpu_unit_reservation_p (state, pos_6))
7577     return 6;
7578   else if (cpu_unit_reservation_p (state, pos_5))
7579     return 5;
7580   else if (cpu_unit_reservation_p (state, pos_4))
7581     return 4;
7582   else if (cpu_unit_reservation_p (state, pos_3))
7583     return 3;
7584   else if (cpu_unit_reservation_p (state, pos_2))
7585     return 2;
7586   else if (cpu_unit_reservation_p (state, pos_1))
7587     return 1;
7588   else
7589     return 0;
7590 }
7591
7592 /* The function returns code of a possible template for given position
7593    and state.  The function should be called only with 2 values of
7594    position equal to 3 or 6.  We avoid generating F NOPs by putting
7595    templates containing F insns at the end of the template search
7596    because undocumented anomaly in McKinley derived cores which can
7597    cause stalls if an F-unit insn (including a NOP) is issued within a
7598    six-cycle window after reading certain application registers (such
7599    as ar.bsp).  Furthermore, power-considerations also argue against
7600    the use of F-unit instructions unless they're really needed.  */
7601
7602 static int
7603 get_template (state_t state, int pos)
7604 {
7605   switch (pos)
7606     {
7607     case 3:
7608       if (cpu_unit_reservation_p (state, _0mmi_))
7609         return 1;
7610       else if (cpu_unit_reservation_p (state, _0mii_))
7611         return 0;
7612       else if (cpu_unit_reservation_p (state, _0mmb_))
7613         return 7;
7614       else if (cpu_unit_reservation_p (state, _0mib_))
7615         return 6;
7616       else if (cpu_unit_reservation_p (state, _0mbb_))
7617         return 5;
7618       else if (cpu_unit_reservation_p (state, _0bbb_))
7619         return 4;
7620       else if (cpu_unit_reservation_p (state, _0mmf_))
7621         return 3;
7622       else if (cpu_unit_reservation_p (state, _0mfi_))
7623         return 2;
7624       else if (cpu_unit_reservation_p (state, _0mfb_))
7625         return 8;
7626       else if (cpu_unit_reservation_p (state, _0mlx_))
7627         return 9;
7628       else
7629         gcc_unreachable ();
7630     case 6:
7631       if (cpu_unit_reservation_p (state, _1mmi_))
7632         return 1;
7633       else if (cpu_unit_reservation_p (state, _1mii_))
7634         return 0;
7635       else if (cpu_unit_reservation_p (state, _1mmb_))
7636         return 7;
7637       else if (cpu_unit_reservation_p (state, _1mib_))
7638         return 6;
7639       else if (cpu_unit_reservation_p (state, _1mbb_))
7640         return 5;
7641       else if (cpu_unit_reservation_p (state, _1bbb_))
7642         return 4;
7643       else if (_1mmf_ >= 0 && cpu_unit_reservation_p (state, _1mmf_))
7644         return 3;
7645       else if (cpu_unit_reservation_p (state, _1mfi_))
7646         return 2;
7647       else if (cpu_unit_reservation_p (state, _1mfb_))
7648         return 8;
7649       else if (cpu_unit_reservation_p (state, _1mlx_))
7650         return 9;
7651       else
7652         gcc_unreachable ();
7653     default:
7654       gcc_unreachable ();
7655     }
7656 }
7657
7658 /* The following function returns an insn important for insn bundling
7659    followed by INSN and before TAIL.  */
7660
7661 static rtx
7662 get_next_important_insn (rtx insn, rtx tail)
7663 {
7664   for (; insn && insn != tail; insn = NEXT_INSN (insn))
7665     if (INSN_P (insn)
7666         && ia64_safe_itanium_class (insn) != ITANIUM_CLASS_IGNORE
7667         && GET_CODE (PATTERN (insn)) != USE
7668         && GET_CODE (PATTERN (insn)) != CLOBBER)
7669       return insn;
7670   return NULL_RTX;
7671 }
7672
7673 /* Add a bundle selector TEMPLATE0 before INSN.  */
7674
7675 static void
7676 ia64_add_bundle_selector_before (int template0, rtx insn)
7677 {
7678   rtx b = gen_bundle_selector (GEN_INT (template0));
7679
7680   ia64_emit_insn_before (b, insn);
7681 #if NR_BUNDLES == 10
7682   if ((template0 == 4 || template0 == 5)
7683       && (flag_unwind_tables || (flag_exceptions && !USING_SJLJ_EXCEPTIONS)))
7684     {
7685       int i;
7686       rtx note = NULL_RTX;
7687
7688       /* In .mbb and .bbb bundles, check if CALL_INSN isn't in the
7689          first or second slot.  If it is and has REG_EH_NOTE set, copy it
7690          to following nops, as br.call sets rp to the address of following
7691          bundle and therefore an EH region end must be on a bundle
7692          boundary.  */
7693       insn = PREV_INSN (insn);
7694       for (i = 0; i < 3; i++)
7695         {
7696           do
7697             insn = next_active_insn (insn);
7698           while (GET_CODE (insn) == INSN
7699                  && get_attr_empty (insn) == EMPTY_YES);
7700           if (GET_CODE (insn) == CALL_INSN)
7701             note = find_reg_note (insn, REG_EH_REGION, NULL_RTX);
7702           else if (note)
7703             {
7704               int code;
7705
7706               gcc_assert ((code = recog_memoized (insn)) == CODE_FOR_nop
7707                           || code == CODE_FOR_nop_b);
7708               if (find_reg_note (insn, REG_EH_REGION, NULL_RTX))
7709                 note = NULL_RTX;
7710               else
7711                 REG_NOTES (insn)
7712                   = gen_rtx_EXPR_LIST (REG_EH_REGION, XEXP (note, 0),
7713                                        REG_NOTES (insn));
7714             }
7715         }
7716     }
7717 #endif
7718 }
7719
7720 /* The following function does insn bundling.  Bundling means
7721    inserting templates and nop insns to fit insn groups into permitted
7722    templates.  Instruction scheduling uses NDFA (non-deterministic
7723    finite automata) encoding informations about the templates and the
7724    inserted nops.  Nondeterminism of the automata permits follows
7725    all possible insn sequences very fast.
7726
7727    Unfortunately it is not possible to get information about inserting
7728    nop insns and used templates from the automata states.  The
7729    automata only says that we can issue an insn possibly inserting
7730    some nops before it and using some template.  Therefore insn
7731    bundling in this function is implemented by using DFA
7732    (deterministic finite automata).  We follow all possible insn
7733    sequences by inserting 0-2 nops (that is what the NDFA describe for
7734    insn scheduling) before/after each insn being bundled.  We know the
7735    start of simulated processor cycle from insn scheduling (insn
7736    starting a new cycle has TImode).
7737
7738    Simple implementation of insn bundling would create enormous
7739    number of possible insn sequences satisfying information about new
7740    cycle ticks taken from the insn scheduling.  To make the algorithm
7741    practical we use dynamic programming.  Each decision (about
7742    inserting nops and implicitly about previous decisions) is described
7743    by structure bundle_state (see above).  If we generate the same
7744    bundle state (key is automaton state after issuing the insns and
7745    nops for it), we reuse already generated one.  As consequence we
7746    reject some decisions which cannot improve the solution and
7747    reduce memory for the algorithm.
7748
7749    When we reach the end of EBB (extended basic block), we choose the
7750    best sequence and then, moving back in EBB, insert templates for
7751    the best alternative.  The templates are taken from querying
7752    automaton state for each insn in chosen bundle states.
7753
7754    So the algorithm makes two (forward and backward) passes through
7755    EBB.  There is an additional forward pass through EBB for Itanium1
7756    processor.  This pass inserts more nops to make dependency between
7757    a producer insn and MMMUL/MMSHF at least 4 cycles long.  */
7758
7759 static void
7760 bundling (FILE *dump, int verbose, rtx prev_head_insn, rtx tail)
7761 {
7762   struct bundle_state *curr_state, *next_state, *best_state;
7763   rtx insn, next_insn;
7764   int insn_num;
7765   int i, bundle_end_p, only_bundle_end_p, asm_p;
7766   int pos = 0, max_pos, template0, template1;
7767   rtx b;
7768   rtx nop;
7769   enum attr_type type;
7770
7771   insn_num = 0;
7772   /* Count insns in the EBB.  */
7773   for (insn = NEXT_INSN (prev_head_insn);
7774        insn && insn != tail;
7775        insn = NEXT_INSN (insn))
7776     if (INSN_P (insn))
7777       insn_num++;
7778   if (insn_num == 0)
7779     return;
7780   bundling_p = 1;
7781   dfa_clean_insn_cache ();
7782   initiate_bundle_state_table ();
7783   index_to_bundle_states = xmalloc ((insn_num + 2)
7784                                     * sizeof (struct bundle_state *));
7785   /* First (forward) pass -- generation of bundle states.  */
7786   curr_state = get_free_bundle_state ();
7787   curr_state->insn = NULL;
7788   curr_state->before_nops_num = 0;
7789   curr_state->after_nops_num = 0;
7790   curr_state->insn_num = 0;
7791   curr_state->cost = 0;
7792   curr_state->accumulated_insns_num = 0;
7793   curr_state->branch_deviation = 0;
7794   curr_state->next = NULL;
7795   curr_state->originator = NULL;
7796   state_reset (curr_state->dfa_state);
7797   index_to_bundle_states [0] = curr_state;
7798   insn_num = 0;
7799   /* Shift cycle mark if it is put on insn which could be ignored.  */
7800   for (insn = NEXT_INSN (prev_head_insn);
7801        insn != tail;
7802        insn = NEXT_INSN (insn))
7803     if (INSN_P (insn)
7804         && (ia64_safe_itanium_class (insn) == ITANIUM_CLASS_IGNORE
7805             || GET_CODE (PATTERN (insn)) == USE
7806             || GET_CODE (PATTERN (insn)) == CLOBBER)
7807         && GET_MODE (insn) == TImode)
7808       {
7809         PUT_MODE (insn, VOIDmode);
7810         for (next_insn = NEXT_INSN (insn);
7811              next_insn != tail;
7812              next_insn = NEXT_INSN (next_insn))
7813           if (INSN_P (next_insn)
7814               && ia64_safe_itanium_class (next_insn) != ITANIUM_CLASS_IGNORE
7815               && GET_CODE (PATTERN (next_insn)) != USE
7816               && GET_CODE (PATTERN (next_insn)) != CLOBBER)
7817             {
7818               PUT_MODE (next_insn, TImode);
7819               break;
7820             }
7821       }
7822   /* Forward pass: generation of bundle states.  */
7823   for (insn = get_next_important_insn (NEXT_INSN (prev_head_insn), tail);
7824        insn != NULL_RTX;
7825        insn = next_insn)
7826     {
7827       gcc_assert (INSN_P (insn)
7828                   && ia64_safe_itanium_class (insn) != ITANIUM_CLASS_IGNORE
7829                   && GET_CODE (PATTERN (insn)) != USE
7830                   && GET_CODE (PATTERN (insn)) != CLOBBER);
7831       type = ia64_safe_type (insn);
7832       next_insn = get_next_important_insn (NEXT_INSN (insn), tail);
7833       insn_num++;
7834       index_to_bundle_states [insn_num] = NULL;
7835       for (curr_state = index_to_bundle_states [insn_num - 1];
7836            curr_state != NULL;
7837            curr_state = next_state)
7838         {
7839           pos = curr_state->accumulated_insns_num % 3;
7840           next_state = curr_state->next;
7841           /* We must fill up the current bundle in order to start a
7842              subsequent asm insn in a new bundle.  Asm insn is always
7843              placed in a separate bundle.  */
7844           only_bundle_end_p
7845             = (next_insn != NULL_RTX
7846                && INSN_CODE (insn) == CODE_FOR_insn_group_barrier
7847                && ia64_safe_type (next_insn) == TYPE_UNKNOWN);
7848           /* We may fill up the current bundle if it is the cycle end
7849              without a group barrier.  */
7850           bundle_end_p
7851             = (only_bundle_end_p || next_insn == NULL_RTX
7852                || (GET_MODE (next_insn) == TImode
7853                    && INSN_CODE (insn) != CODE_FOR_insn_group_barrier));
7854           if (type == TYPE_F || type == TYPE_B || type == TYPE_L
7855               || type == TYPE_S
7856               /* We need to insert 2 nops for cases like M_MII.  To
7857                  guarantee issuing all insns on the same cycle for
7858                  Itanium 1, we need to issue 2 nops after the first M
7859                  insn (MnnMII where n is a nop insn).  */
7860               || ((type == TYPE_M || type == TYPE_A)
7861                   && ia64_tune == PROCESSOR_ITANIUM
7862                   && !bundle_end_p && pos == 1))
7863             issue_nops_and_insn (curr_state, 2, insn, bundle_end_p,
7864                                  only_bundle_end_p);
7865           issue_nops_and_insn (curr_state, 1, insn, bundle_end_p,
7866                                only_bundle_end_p);
7867           issue_nops_and_insn (curr_state, 0, insn, bundle_end_p,
7868                                only_bundle_end_p);
7869         }
7870       gcc_assert (index_to_bundle_states [insn_num]);
7871       for (curr_state = index_to_bundle_states [insn_num];
7872            curr_state != NULL;
7873            curr_state = curr_state->next)
7874         if (verbose >= 2 && dump)
7875           {
7876             /* This structure is taken from generated code of the
7877                pipeline hazard recognizer (see file insn-attrtab.c).
7878                Please don't forget to change the structure if a new
7879                automaton is added to .md file.  */
7880             struct DFA_chip
7881             {
7882               unsigned short one_automaton_state;
7883               unsigned short oneb_automaton_state;
7884               unsigned short two_automaton_state;
7885               unsigned short twob_automaton_state;
7886             };
7887
7888             fprintf
7889               (dump,
7890                "//    Bundle state %d (orig %d, cost %d, nops %d/%d, insns %d, branch %d, state %d) for %d\n",
7891                curr_state->unique_num,
7892                (curr_state->originator == NULL
7893                 ? -1 : curr_state->originator->unique_num),
7894                curr_state->cost,
7895                curr_state->before_nops_num, curr_state->after_nops_num,
7896                curr_state->accumulated_insns_num, curr_state->branch_deviation,
7897                (ia64_tune == PROCESSOR_ITANIUM
7898                 ? ((struct DFA_chip *) curr_state->dfa_state)->oneb_automaton_state
7899                 : ((struct DFA_chip *) curr_state->dfa_state)->twob_automaton_state),
7900                INSN_UID (insn));
7901           }
7902     }
7903   
7904   /* We should find a solution because the 2nd insn scheduling has
7905      found one.  */
7906   gcc_assert (index_to_bundle_states [insn_num]);
7907   /* Find a state corresponding to the best insn sequence.  */
7908   best_state = NULL;
7909   for (curr_state = index_to_bundle_states [insn_num];
7910        curr_state != NULL;
7911        curr_state = curr_state->next)
7912     /* We are just looking at the states with fully filled up last
7913        bundle.  The first we prefer insn sequences with minimal cost
7914        then with minimal inserted nops and finally with branch insns
7915        placed in the 3rd slots.  */
7916     if (curr_state->accumulated_insns_num % 3 == 0
7917         && (best_state == NULL || best_state->cost > curr_state->cost
7918             || (best_state->cost == curr_state->cost
7919                 && (curr_state->accumulated_insns_num
7920                     < best_state->accumulated_insns_num
7921                     || (curr_state->accumulated_insns_num
7922                         == best_state->accumulated_insns_num
7923                         && curr_state->branch_deviation
7924                         < best_state->branch_deviation)))))
7925       best_state = curr_state;
7926   /* Second (backward) pass: adding nops and templates.  */
7927   insn_num = best_state->before_nops_num;
7928   template0 = template1 = -1;
7929   for (curr_state = best_state;
7930        curr_state->originator != NULL;
7931        curr_state = curr_state->originator)
7932     {
7933       insn = curr_state->insn;
7934       asm_p = (GET_CODE (PATTERN (insn)) == ASM_INPUT
7935                || asm_noperands (PATTERN (insn)) >= 0);
7936       insn_num++;
7937       if (verbose >= 2 && dump)
7938         {
7939           struct DFA_chip
7940           {
7941             unsigned short one_automaton_state;
7942             unsigned short oneb_automaton_state;
7943             unsigned short two_automaton_state;
7944             unsigned short twob_automaton_state;
7945           };
7946
7947           fprintf
7948             (dump,
7949              "//    Best %d (orig %d, cost %d, nops %d/%d, insns %d, branch %d, state %d) for %d\n",
7950              curr_state->unique_num,
7951              (curr_state->originator == NULL
7952               ? -1 : curr_state->originator->unique_num),
7953              curr_state->cost,
7954              curr_state->before_nops_num, curr_state->after_nops_num,
7955              curr_state->accumulated_insns_num, curr_state->branch_deviation,
7956              (ia64_tune == PROCESSOR_ITANIUM
7957               ? ((struct DFA_chip *) curr_state->dfa_state)->oneb_automaton_state
7958               : ((struct DFA_chip *) curr_state->dfa_state)->twob_automaton_state),
7959              INSN_UID (insn));
7960         }
7961       /* Find the position in the current bundle window.  The window can
7962          contain at most two bundles.  Two bundle window means that
7963          the processor will make two bundle rotation.  */
7964       max_pos = get_max_pos (curr_state->dfa_state);
7965       if (max_pos == 6
7966           /* The following (negative template number) means that the
7967              processor did one bundle rotation.  */
7968           || (max_pos == 3 && template0 < 0))
7969         {
7970           /* We are at the end of the window -- find template(s) for
7971              its bundle(s).  */
7972           pos = max_pos;
7973           if (max_pos == 3)
7974             template0 = get_template (curr_state->dfa_state, 3);
7975           else
7976             {
7977               template1 = get_template (curr_state->dfa_state, 3);
7978               template0 = get_template (curr_state->dfa_state, 6);
7979             }
7980         }
7981       if (max_pos > 3 && template1 < 0)
7982         /* It may happen when we have the stop inside a bundle.  */
7983         {
7984           gcc_assert (pos <= 3);
7985           template1 = get_template (curr_state->dfa_state, 3);
7986           pos += 3;
7987         }
7988       if (!asm_p)
7989         /* Emit nops after the current insn.  */
7990         for (i = 0; i < curr_state->after_nops_num; i++)
7991           {
7992             nop = gen_nop ();
7993             emit_insn_after (nop, insn);
7994             pos--;
7995             gcc_assert (pos >= 0);
7996             if (pos % 3 == 0)
7997               {
7998                 /* We are at the start of a bundle: emit the template
7999                    (it should be defined).  */
8000                 gcc_assert (template0 >= 0);
8001                 ia64_add_bundle_selector_before (template0, nop);
8002                 /* If we have two bundle window, we make one bundle
8003                    rotation.  Otherwise template0 will be undefined
8004                    (negative value).  */
8005                 template0 = template1;
8006                 template1 = -1;
8007               }
8008           }
8009       /* Move the position backward in the window.  Group barrier has
8010          no slot.  Asm insn takes all bundle.  */
8011       if (INSN_CODE (insn) != CODE_FOR_insn_group_barrier
8012           && GET_CODE (PATTERN (insn)) != ASM_INPUT
8013           && asm_noperands (PATTERN (insn)) < 0)
8014         pos--;
8015       /* Long insn takes 2 slots.  */
8016       if (ia64_safe_type (insn) == TYPE_L)
8017         pos--;
8018       gcc_assert (pos >= 0);
8019       if (pos % 3 == 0
8020           && INSN_CODE (insn) != CODE_FOR_insn_group_barrier
8021           && GET_CODE (PATTERN (insn)) != ASM_INPUT
8022           && asm_noperands (PATTERN (insn)) < 0)
8023         {
8024           /* The current insn is at the bundle start: emit the
8025              template.  */
8026           gcc_assert (template0 >= 0);
8027           ia64_add_bundle_selector_before (template0, insn);
8028           b = PREV_INSN (insn);
8029           insn = b;
8030           /* See comment above in analogous place for emitting nops
8031              after the insn.  */
8032           template0 = template1;
8033           template1 = -1;
8034         }
8035       /* Emit nops after the current insn.  */
8036       for (i = 0; i < curr_state->before_nops_num; i++)
8037         {
8038           nop = gen_nop ();
8039           ia64_emit_insn_before (nop, insn);
8040           nop = PREV_INSN (insn);
8041           insn = nop;
8042           pos--;
8043           gcc_assert (pos >= 0);
8044           if (pos % 3 == 0)
8045             {
8046               /* See comment above in analogous place for emitting nops
8047                  after the insn.  */
8048               gcc_assert (template0 >= 0);
8049               ia64_add_bundle_selector_before (template0, insn);
8050               b = PREV_INSN (insn);
8051               insn = b;
8052               template0 = template1;
8053               template1 = -1;
8054             }
8055         }
8056     }
8057   if (ia64_tune == PROCESSOR_ITANIUM)
8058     /* Insert additional cycles for MM-insns (MMMUL and MMSHF).
8059        Itanium1 has a strange design, if the distance between an insn
8060        and dependent MM-insn is less 4 then we have a 6 additional
8061        cycles stall.  So we make the distance equal to 4 cycles if it
8062        is less.  */
8063     for (insn = get_next_important_insn (NEXT_INSN (prev_head_insn), tail);
8064          insn != NULL_RTX;
8065          insn = next_insn)
8066       {
8067         gcc_assert (INSN_P (insn)
8068                     && ia64_safe_itanium_class (insn) != ITANIUM_CLASS_IGNORE
8069                     && GET_CODE (PATTERN (insn)) != USE
8070                     && GET_CODE (PATTERN (insn)) != CLOBBER);
8071         next_insn = get_next_important_insn (NEXT_INSN (insn), tail);
8072         if (INSN_UID (insn) < clocks_length && add_cycles [INSN_UID (insn)])
8073           /* We found a MM-insn which needs additional cycles.  */
8074           {
8075             rtx last;
8076             int i, j, n;
8077             int pred_stop_p;
8078
8079             /* Now we are searching for a template of the bundle in
8080                which the MM-insn is placed and the position of the
8081                insn in the bundle (0, 1, 2).  Also we are searching
8082                for that there is a stop before the insn.  */
8083             last = prev_active_insn (insn);
8084             pred_stop_p = recog_memoized (last) == CODE_FOR_insn_group_barrier;
8085             if (pred_stop_p)
8086               last = prev_active_insn (last);
8087             n = 0;
8088             for (;; last = prev_active_insn (last))
8089               if (recog_memoized (last) == CODE_FOR_bundle_selector)
8090                 {
8091                   template0 = XINT (XVECEXP (PATTERN (last), 0, 0), 0);
8092                   if (template0 == 9)
8093                     /* The insn is in MLX bundle.  Change the template
8094                        onto MFI because we will add nops before the
8095                        insn.  It simplifies subsequent code a lot.  */
8096                     PATTERN (last)
8097                       = gen_bundle_selector (const2_rtx); /* -> MFI */
8098                   break;
8099                 }
8100               else if (recog_memoized (last) != CODE_FOR_insn_group_barrier
8101                        && (ia64_safe_itanium_class (last)
8102                            != ITANIUM_CLASS_IGNORE))
8103                 n++;
8104             /* Some check of correctness: the stop is not at the
8105                bundle start, there are no more 3 insns in the bundle,
8106                and the MM-insn is not at the start of bundle with
8107                template MLX.  */
8108             gcc_assert ((!pred_stop_p || n)
8109                         && n <= 2
8110                         && (template0 != 9 || !n));
8111             /* Put nops after the insn in the bundle.  */
8112             for (j = 3 - n; j > 0; j --)
8113               ia64_emit_insn_before (gen_nop (), insn);
8114             /* It takes into account that we will add more N nops
8115                before the insn lately -- please see code below.  */
8116             add_cycles [INSN_UID (insn)]--;
8117             if (!pred_stop_p || add_cycles [INSN_UID (insn)])
8118               ia64_emit_insn_before (gen_insn_group_barrier (GEN_INT (3)),
8119                                      insn);
8120             if (pred_stop_p)
8121               add_cycles [INSN_UID (insn)]--;
8122             for (i = add_cycles [INSN_UID (insn)]; i > 0; i--)
8123               {
8124                 /* Insert "MII;" template.  */
8125                 ia64_emit_insn_before (gen_bundle_selector (const0_rtx),
8126                                        insn);
8127                 ia64_emit_insn_before (gen_nop (), insn);
8128                 ia64_emit_insn_before (gen_nop (), insn);
8129                 if (i > 1)
8130                   {
8131                     /* To decrease code size, we use "MI;I;"
8132                        template.  */
8133                     ia64_emit_insn_before
8134                       (gen_insn_group_barrier (GEN_INT (3)), insn);
8135                     i--;
8136                   }
8137                 ia64_emit_insn_before (gen_nop (), insn);
8138                 ia64_emit_insn_before (gen_insn_group_barrier (GEN_INT (3)),
8139                                        insn);
8140               }
8141             /* Put the MM-insn in the same slot of a bundle with the
8142                same template as the original one.  */
8143             ia64_add_bundle_selector_before (template0, insn);
8144             /* To put the insn in the same slot, add necessary number
8145                of nops.  */
8146             for (j = n; j > 0; j --)
8147               ia64_emit_insn_before (gen_nop (), insn);
8148             /* Put the stop if the original bundle had it.  */
8149             if (pred_stop_p)
8150               ia64_emit_insn_before (gen_insn_group_barrier (GEN_INT (3)),
8151                                      insn);
8152           }
8153       }
8154   free (index_to_bundle_states);
8155   finish_bundle_state_table ();
8156   bundling_p = 0;
8157   dfa_clean_insn_cache ();
8158 }
8159
8160 /* The following function is called at the end of scheduling BB or
8161    EBB.  After reload, it inserts stop bits and does insn bundling.  */
8162
8163 static void
8164 ia64_sched_finish (FILE *dump, int sched_verbose)
8165 {
8166   if (sched_verbose)
8167     fprintf (dump, "// Finishing schedule.\n");
8168   if (!reload_completed)
8169     return;
8170   if (reload_completed)
8171     {
8172       final_emit_insn_group_barriers (dump);
8173       bundling (dump, sched_verbose, current_sched_info->prev_head,
8174                 current_sched_info->next_tail);
8175       if (sched_verbose && dump)
8176         fprintf (dump, "//    finishing %d-%d\n",
8177                  INSN_UID (NEXT_INSN (current_sched_info->prev_head)),
8178                  INSN_UID (PREV_INSN (current_sched_info->next_tail)));
8179
8180       return;
8181     }
8182 }
8183
8184 /* The following function inserts stop bits in scheduled BB or EBB.  */
8185
8186 static void
8187 final_emit_insn_group_barriers (FILE *dump ATTRIBUTE_UNUSED)
8188 {
8189   rtx insn;
8190   int need_barrier_p = 0;
8191   rtx prev_insn = NULL_RTX;
8192
8193   init_insn_group_barriers ();
8194
8195   for (insn = NEXT_INSN (current_sched_info->prev_head);
8196        insn != current_sched_info->next_tail;
8197        insn = NEXT_INSN (insn))
8198     {
8199       if (GET_CODE (insn) == BARRIER)
8200         {
8201           rtx last = prev_active_insn (insn);
8202
8203           if (! last)
8204             continue;
8205           if (GET_CODE (last) == JUMP_INSN
8206               && GET_CODE (PATTERN (last)) == ADDR_DIFF_VEC)
8207             last = prev_active_insn (last);
8208           if (recog_memoized (last) != CODE_FOR_insn_group_barrier)
8209             emit_insn_after (gen_insn_group_barrier (GEN_INT (3)), last);
8210
8211           init_insn_group_barriers ();
8212           need_barrier_p = 0;
8213           prev_insn = NULL_RTX;
8214         }
8215       else if (INSN_P (insn))
8216         {
8217           if (recog_memoized (insn) == CODE_FOR_insn_group_barrier)
8218             {
8219               init_insn_group_barriers ();
8220               need_barrier_p = 0;
8221               prev_insn = NULL_RTX;
8222             }
8223           else if (need_barrier_p || group_barrier_needed (insn))
8224             {
8225               if (TARGET_EARLY_STOP_BITS)
8226                 {
8227                   rtx last;
8228
8229                   for (last = insn;
8230                        last != current_sched_info->prev_head;
8231                        last = PREV_INSN (last))
8232                     if (INSN_P (last) && GET_MODE (last) == TImode
8233                         && stops_p [INSN_UID (last)])
8234                       break;
8235                   if (last == current_sched_info->prev_head)
8236                     last = insn;
8237                   last = prev_active_insn (last);
8238                   if (last
8239                       && recog_memoized (last) != CODE_FOR_insn_group_barrier)
8240                     emit_insn_after (gen_insn_group_barrier (GEN_INT (3)),
8241                                      last);
8242                   init_insn_group_barriers ();
8243                   for (last = NEXT_INSN (last);
8244                        last != insn;
8245                        last = NEXT_INSN (last))
8246                     if (INSN_P (last))
8247                       group_barrier_needed (last);
8248                 }
8249               else
8250                 {
8251                   emit_insn_before (gen_insn_group_barrier (GEN_INT (3)),
8252                                     insn);
8253                   init_insn_group_barriers ();
8254                 }
8255               group_barrier_needed (insn);
8256               prev_insn = NULL_RTX;
8257             }
8258           else if (recog_memoized (insn) >= 0)
8259             prev_insn = insn;
8260           need_barrier_p = (GET_CODE (insn) == CALL_INSN
8261                             || GET_CODE (PATTERN (insn)) == ASM_INPUT
8262                             || asm_noperands (PATTERN (insn)) >= 0);
8263         }
8264     }
8265 }
8266
8267 \f
8268
8269 /* If the following function returns TRUE, we will use the DFA
8270    insn scheduler.  */
8271
8272 static int
8273 ia64_first_cycle_multipass_dfa_lookahead (void)
8274 {
8275   return (reload_completed ? 6 : 4);
8276 }
8277
8278 /* The following function initiates variable `dfa_pre_cycle_insn'.  */
8279
8280 static void
8281 ia64_init_dfa_pre_cycle_insn (void)
8282 {
8283   if (temp_dfa_state == NULL)
8284     {
8285       dfa_state_size = state_size ();
8286       temp_dfa_state = xmalloc (dfa_state_size);
8287       prev_cycle_state = xmalloc (dfa_state_size);
8288     }
8289   dfa_pre_cycle_insn = make_insn_raw (gen_pre_cycle ());
8290   PREV_INSN (dfa_pre_cycle_insn) = NEXT_INSN (dfa_pre_cycle_insn) = NULL_RTX;
8291   recog_memoized (dfa_pre_cycle_insn);
8292   dfa_stop_insn = make_insn_raw (gen_insn_group_barrier (GEN_INT (3)));
8293   PREV_INSN (dfa_stop_insn) = NEXT_INSN (dfa_stop_insn) = NULL_RTX;
8294   recog_memoized (dfa_stop_insn);
8295 }
8296
8297 /* The following function returns the pseudo insn DFA_PRE_CYCLE_INSN
8298    used by the DFA insn scheduler.  */
8299
8300 static rtx
8301 ia64_dfa_pre_cycle_insn (void)
8302 {
8303   return dfa_pre_cycle_insn;
8304 }
8305
8306 /* The following function returns TRUE if PRODUCER (of type ilog or
8307    ld) produces address for CONSUMER (of type st or stf). */
8308
8309 int
8310 ia64_st_address_bypass_p (rtx producer, rtx consumer)
8311 {
8312   rtx dest, reg, mem;
8313
8314   gcc_assert (producer && consumer);
8315   dest = ia64_single_set (producer);
8316   gcc_assert (dest);
8317   reg = SET_DEST (dest);
8318   gcc_assert (reg);
8319   if (GET_CODE (reg) == SUBREG)
8320     reg = SUBREG_REG (reg);
8321   gcc_assert (GET_CODE (reg) == REG);
8322   
8323   dest = ia64_single_set (consumer);
8324   gcc_assert (dest);
8325   mem = SET_DEST (dest);
8326   gcc_assert (mem && GET_CODE (mem) == MEM);
8327   return reg_mentioned_p (reg, mem);
8328 }
8329
8330 /* The following function returns TRUE if PRODUCER (of type ilog or
8331    ld) produces address for CONSUMER (of type ld or fld). */
8332
8333 int
8334 ia64_ld_address_bypass_p (rtx producer, rtx consumer)
8335 {
8336   rtx dest, src, reg, mem;
8337
8338   gcc_assert (producer && consumer);
8339   dest = ia64_single_set (producer);
8340   gcc_assert (dest);
8341   reg = SET_DEST (dest);
8342   gcc_assert (reg);
8343   if (GET_CODE (reg) == SUBREG)
8344     reg = SUBREG_REG (reg);
8345   gcc_assert (GET_CODE (reg) == REG);
8346   
8347   src = ia64_single_set (consumer);
8348   gcc_assert (src);
8349   mem = SET_SRC (src);
8350   gcc_assert (mem);
8351  
8352   if (GET_CODE (mem) == UNSPEC && XVECLEN (mem, 0) > 0)
8353     mem = XVECEXP (mem, 0, 0);
8354   else if (GET_CODE (mem) == IF_THEN_ELSE)
8355     /* ??? Is this bypass necessary for ld.c?  */
8356     {
8357       gcc_assert (XINT (XEXP (XEXP (mem, 0), 0), 1) == UNSPEC_LDCCLR);
8358       mem = XEXP (mem, 1);
8359     }
8360      
8361   while (GET_CODE (mem) == SUBREG || GET_CODE (mem) == ZERO_EXTEND)
8362     mem = XEXP (mem, 0);
8363
8364   if (GET_CODE (mem) == UNSPEC)
8365     {
8366       int c = XINT (mem, 1);
8367
8368       gcc_assert (c == UNSPEC_LDA || c == UNSPEC_LDS || c == UNSPEC_LDSA);
8369       mem = XVECEXP (mem, 0, 0);
8370     }
8371
8372   /* Note that LO_SUM is used for GOT loads.  */
8373   gcc_assert (GET_CODE (mem) == LO_SUM || GET_CODE (mem) == MEM);
8374
8375   return reg_mentioned_p (reg, mem);
8376 }
8377
8378 /* The following function returns TRUE if INSN produces address for a
8379    load/store insn.  We will place such insns into M slot because it
8380    decreases its latency time.  */
8381
8382 int
8383 ia64_produce_address_p (rtx insn)
8384 {
8385   return insn->call;
8386 }
8387
8388 \f
8389 /* Emit pseudo-ops for the assembler to describe predicate relations.
8390    At present this assumes that we only consider predicate pairs to
8391    be mutex, and that the assembler can deduce proper values from
8392    straight-line code.  */
8393
8394 static void
8395 emit_predicate_relation_info (void)
8396 {
8397   basic_block bb;
8398
8399   FOR_EACH_BB_REVERSE (bb)
8400     {
8401       int r;
8402       rtx head = BB_HEAD (bb);
8403
8404       /* We only need such notes at code labels.  */
8405       if (GET_CODE (head) != CODE_LABEL)
8406         continue;
8407       if (GET_CODE (NEXT_INSN (head)) == NOTE
8408           && NOTE_LINE_NUMBER (NEXT_INSN (head)) == NOTE_INSN_BASIC_BLOCK)
8409         head = NEXT_INSN (head);
8410
8411       /* Skip p0, which may be thought to be live due to (reg:DI p0)
8412          grabbing the entire block of predicate registers.  */
8413       for (r = PR_REG (2); r < PR_REG (64); r += 2)
8414         if (REGNO_REG_SET_P (bb->il.rtl->global_live_at_start, r))
8415           {
8416             rtx p = gen_rtx_REG (BImode, r);
8417             rtx n = emit_insn_after (gen_pred_rel_mutex (p), head);
8418             if (head == BB_END (bb))
8419               BB_END (bb) = n;
8420             head = n;
8421           }
8422     }
8423
8424   /* Look for conditional calls that do not return, and protect predicate
8425      relations around them.  Otherwise the assembler will assume the call
8426      returns, and complain about uses of call-clobbered predicates after
8427      the call.  */
8428   FOR_EACH_BB_REVERSE (bb)
8429     {
8430       rtx insn = BB_HEAD (bb);
8431
8432       while (1)
8433         {
8434           if (GET_CODE (insn) == CALL_INSN
8435               && GET_CODE (PATTERN (insn)) == COND_EXEC
8436               && find_reg_note (insn, REG_NORETURN, NULL_RTX))
8437             {
8438               rtx b = emit_insn_before (gen_safe_across_calls_all (), insn);
8439               rtx a = emit_insn_after (gen_safe_across_calls_normal (), insn);
8440               if (BB_HEAD (bb) == insn)
8441                 BB_HEAD (bb) = b;
8442               if (BB_END (bb) == insn)
8443                 BB_END (bb) = a;
8444             }
8445
8446           if (insn == BB_END (bb))
8447             break;
8448           insn = NEXT_INSN (insn);
8449         }
8450     }
8451 }
8452
8453 /* Perform machine dependent operations on the rtl chain INSNS.  */
8454
8455 static void
8456 ia64_reorg (void)
8457 {
8458   /* We are freeing block_for_insn in the toplev to keep compatibility
8459      with old MDEP_REORGS that are not CFG based.  Recompute it now.  */
8460   compute_bb_for_insn ();
8461
8462   /* If optimizing, we'll have split before scheduling.  */
8463   if (optimize == 0)
8464     split_all_insns (0);
8465
8466   /* ??? update_life_info_in_dirty_blocks fails to terminate during
8467      non-optimizing bootstrap.  */
8468   update_life_info (NULL, UPDATE_LIFE_GLOBAL_RM_NOTES, PROP_DEATH_NOTES);
8469
8470   if (optimize && ia64_flag_schedule_insns2)
8471     {
8472       timevar_push (TV_SCHED2);
8473       ia64_final_schedule = 1;
8474
8475       initiate_bundle_states ();
8476       ia64_nop = make_insn_raw (gen_nop ());
8477       PREV_INSN (ia64_nop) = NEXT_INSN (ia64_nop) = NULL_RTX;
8478       recog_memoized (ia64_nop);
8479       clocks_length = get_max_uid () + 1;
8480       stops_p = xcalloc (1, clocks_length);
8481       if (ia64_tune == PROCESSOR_ITANIUM)
8482         {
8483           clocks = xcalloc (clocks_length, sizeof (int));
8484           add_cycles = xcalloc (clocks_length, sizeof (int));
8485         }
8486       if (ia64_tune == PROCESSOR_ITANIUM2)
8487         {
8488           pos_1 = get_cpu_unit_code ("2_1");
8489           pos_2 = get_cpu_unit_code ("2_2");
8490           pos_3 = get_cpu_unit_code ("2_3");
8491           pos_4 = get_cpu_unit_code ("2_4");
8492           pos_5 = get_cpu_unit_code ("2_5");
8493           pos_6 = get_cpu_unit_code ("2_6");
8494           _0mii_ = get_cpu_unit_code ("2b_0mii.");
8495           _0mmi_ = get_cpu_unit_code ("2b_0mmi.");
8496           _0mfi_ = get_cpu_unit_code ("2b_0mfi.");
8497           _0mmf_ = get_cpu_unit_code ("2b_0mmf.");
8498           _0bbb_ = get_cpu_unit_code ("2b_0bbb.");
8499           _0mbb_ = get_cpu_unit_code ("2b_0mbb.");
8500           _0mib_ = get_cpu_unit_code ("2b_0mib.");
8501           _0mmb_ = get_cpu_unit_code ("2b_0mmb.");
8502           _0mfb_ = get_cpu_unit_code ("2b_0mfb.");
8503           _0mlx_ = get_cpu_unit_code ("2b_0mlx.");
8504           _1mii_ = get_cpu_unit_code ("2b_1mii.");
8505           _1mmi_ = get_cpu_unit_code ("2b_1mmi.");
8506           _1mfi_ = get_cpu_unit_code ("2b_1mfi.");
8507           _1mmf_ = get_cpu_unit_code ("2b_1mmf.");
8508           _1bbb_ = get_cpu_unit_code ("2b_1bbb.");
8509           _1mbb_ = get_cpu_unit_code ("2b_1mbb.");
8510           _1mib_ = get_cpu_unit_code ("2b_1mib.");
8511           _1mmb_ = get_cpu_unit_code ("2b_1mmb.");
8512           _1mfb_ = get_cpu_unit_code ("2b_1mfb.");
8513           _1mlx_ = get_cpu_unit_code ("2b_1mlx.");
8514         }
8515       else
8516         {
8517           pos_1 = get_cpu_unit_code ("1_1");
8518           pos_2 = get_cpu_unit_code ("1_2");
8519           pos_3 = get_cpu_unit_code ("1_3");
8520           pos_4 = get_cpu_unit_code ("1_4");
8521           pos_5 = get_cpu_unit_code ("1_5");
8522           pos_6 = get_cpu_unit_code ("1_6");
8523           _0mii_ = get_cpu_unit_code ("1b_0mii.");
8524           _0mmi_ = get_cpu_unit_code ("1b_0mmi.");
8525           _0mfi_ = get_cpu_unit_code ("1b_0mfi.");
8526           _0mmf_ = get_cpu_unit_code ("1b_0mmf.");
8527           _0bbb_ = get_cpu_unit_code ("1b_0bbb.");
8528           _0mbb_ = get_cpu_unit_code ("1b_0mbb.");
8529           _0mib_ = get_cpu_unit_code ("1b_0mib.");
8530           _0mmb_ = get_cpu_unit_code ("1b_0mmb.");
8531           _0mfb_ = get_cpu_unit_code ("1b_0mfb.");
8532           _0mlx_ = get_cpu_unit_code ("1b_0mlx.");
8533           _1mii_ = get_cpu_unit_code ("1b_1mii.");
8534           _1mmi_ = get_cpu_unit_code ("1b_1mmi.");
8535           _1mfi_ = get_cpu_unit_code ("1b_1mfi.");
8536           _1mmf_ = get_cpu_unit_code ("1b_1mmf.");
8537           _1bbb_ = get_cpu_unit_code ("1b_1bbb.");
8538           _1mbb_ = get_cpu_unit_code ("1b_1mbb.");
8539           _1mib_ = get_cpu_unit_code ("1b_1mib.");
8540           _1mmb_ = get_cpu_unit_code ("1b_1mmb.");
8541           _1mfb_ = get_cpu_unit_code ("1b_1mfb.");
8542           _1mlx_ = get_cpu_unit_code ("1b_1mlx.");
8543         }
8544       schedule_ebbs ();
8545       finish_bundle_states ();
8546       if (ia64_tune == PROCESSOR_ITANIUM)
8547         {
8548           free (add_cycles);
8549           free (clocks);
8550         }
8551       free (stops_p);
8552       stops_p = NULL;
8553       emit_insn_group_barriers (dump_file);
8554
8555       ia64_final_schedule = 0;
8556       timevar_pop (TV_SCHED2);
8557     }
8558   else
8559     emit_all_insn_group_barriers (dump_file);
8560
8561   /* A call must not be the last instruction in a function, so that the
8562      return address is still within the function, so that unwinding works
8563      properly.  Note that IA-64 differs from dwarf2 on this point.  */
8564   if (flag_unwind_tables || (flag_exceptions && !USING_SJLJ_EXCEPTIONS))
8565     {
8566       rtx insn;
8567       int saw_stop = 0;
8568
8569       insn = get_last_insn ();
8570       if (! INSN_P (insn))
8571         insn = prev_active_insn (insn);
8572       /* Skip over insns that expand to nothing.  */
8573       while (GET_CODE (insn) == INSN && get_attr_empty (insn) == EMPTY_YES)
8574         {
8575           if (GET_CODE (PATTERN (insn)) == UNSPEC_VOLATILE
8576               && XINT (PATTERN (insn), 1) == UNSPECV_INSN_GROUP_BARRIER)
8577             saw_stop = 1;
8578           insn = prev_active_insn (insn);
8579         }
8580       if (GET_CODE (insn) == CALL_INSN)
8581         {
8582           if (! saw_stop)
8583             emit_insn (gen_insn_group_barrier (GEN_INT (3)));
8584           emit_insn (gen_break_f ());
8585           emit_insn (gen_insn_group_barrier (GEN_INT (3)));
8586         }
8587     }
8588
8589   emit_predicate_relation_info ();
8590
8591   if (ia64_flag_var_tracking)
8592     {
8593       timevar_push (TV_VAR_TRACKING);
8594       variable_tracking_main ();
8595       timevar_pop (TV_VAR_TRACKING);
8596     }
8597 }
8598 \f
8599 /* Return true if REGNO is used by the epilogue.  */
8600
8601 int
8602 ia64_epilogue_uses (int regno)
8603 {
8604   switch (regno)
8605     {
8606     case R_GR (1):
8607       /* With a call to a function in another module, we will write a new
8608          value to "gp".  After returning from such a call, we need to make
8609          sure the function restores the original gp-value, even if the
8610          function itself does not use the gp anymore.  */
8611       return !(TARGET_AUTO_PIC || TARGET_NO_PIC);
8612
8613     case IN_REG (0): case IN_REG (1): case IN_REG (2): case IN_REG (3):
8614     case IN_REG (4): case IN_REG (5): case IN_REG (6): case IN_REG (7):
8615       /* For functions defined with the syscall_linkage attribute, all
8616          input registers are marked as live at all function exits.  This
8617          prevents the register allocator from using the input registers,
8618          which in turn makes it possible to restart a system call after
8619          an interrupt without having to save/restore the input registers.
8620          This also prevents kernel data from leaking to application code.  */
8621       return lookup_attribute ("syscall_linkage",
8622            TYPE_ATTRIBUTES (TREE_TYPE (current_function_decl))) != NULL;
8623
8624     case R_BR (0):
8625       /* Conditional return patterns can't represent the use of `b0' as
8626          the return address, so we force the value live this way.  */
8627       return 1;
8628
8629     case AR_PFS_REGNUM:
8630       /* Likewise for ar.pfs, which is used by br.ret.  */
8631       return 1;
8632
8633     default:
8634       return 0;
8635     }
8636 }
8637
8638 /* Return true if REGNO is used by the frame unwinder.  */
8639
8640 int
8641 ia64_eh_uses (int regno)
8642 {
8643   if (! reload_completed)
8644     return 0;
8645
8646   if (current_frame_info.reg_save_b0
8647       && regno == current_frame_info.reg_save_b0)
8648     return 1;
8649   if (current_frame_info.reg_save_pr
8650       && regno == current_frame_info.reg_save_pr)
8651     return 1;
8652   if (current_frame_info.reg_save_ar_pfs
8653       && regno == current_frame_info.reg_save_ar_pfs)
8654     return 1;
8655   if (current_frame_info.reg_save_ar_unat
8656       && regno == current_frame_info.reg_save_ar_unat)
8657     return 1;
8658   if (current_frame_info.reg_save_ar_lc
8659       && regno == current_frame_info.reg_save_ar_lc)
8660     return 1;
8661
8662   return 0;
8663 }
8664 \f
8665 /* Return true if this goes in small data/bss.  */
8666
8667 /* ??? We could also support own long data here.  Generating movl/add/ld8
8668    instead of addl,ld8/ld8.  This makes the code bigger, but should make the
8669    code faster because there is one less load.  This also includes incomplete
8670    types which can't go in sdata/sbss.  */
8671
8672 static bool
8673 ia64_in_small_data_p (tree exp)
8674 {
8675   if (TARGET_NO_SDATA)
8676     return false;
8677
8678   /* We want to merge strings, so we never consider them small data.  */
8679   if (TREE_CODE (exp) == STRING_CST)
8680     return false;
8681
8682   /* Functions are never small data.  */
8683   if (TREE_CODE (exp) == FUNCTION_DECL)
8684     return false;
8685
8686   if (TREE_CODE (exp) == VAR_DECL && DECL_SECTION_NAME (exp))
8687     {
8688       const char *section = TREE_STRING_POINTER (DECL_SECTION_NAME (exp));
8689
8690       if (strcmp (section, ".sdata") == 0
8691           || strncmp (section, ".sdata.", 7) == 0
8692           || strncmp (section, ".gnu.linkonce.s.", 16) == 0
8693           || strcmp (section, ".sbss") == 0
8694           || strncmp (section, ".sbss.", 6) == 0
8695           || strncmp (section, ".gnu.linkonce.sb.", 17) == 0)
8696         return true;
8697     }
8698   else
8699     {
8700       HOST_WIDE_INT size = int_size_in_bytes (TREE_TYPE (exp));
8701
8702       /* If this is an incomplete type with size 0, then we can't put it
8703          in sdata because it might be too big when completed.  */
8704       if (size > 0 && size <= ia64_section_threshold)
8705         return true;
8706     }
8707
8708   return false;
8709 }
8710 \f
8711 /* Output assembly directives for prologue regions.  */
8712
8713 /* The current basic block number.  */
8714
8715 static bool last_block;
8716
8717 /* True if we need a copy_state command at the start of the next block.  */
8718
8719 static bool need_copy_state;
8720
8721 #ifndef MAX_ARTIFICIAL_LABEL_BYTES
8722 # define MAX_ARTIFICIAL_LABEL_BYTES 30
8723 #endif
8724
8725 /* Emit a debugging label after a call-frame-related insn.  We'd
8726    rather output the label right away, but we'd have to output it
8727    after, not before, the instruction, and the instruction has not
8728    been output yet.  So we emit the label after the insn, delete it to
8729    avoid introducing basic blocks, and mark it as preserved, such that
8730    it is still output, given that it is referenced in debug info.  */
8731
8732 static const char *
8733 ia64_emit_deleted_label_after_insn (rtx insn)
8734 {
8735   char label[MAX_ARTIFICIAL_LABEL_BYTES];
8736   rtx lb = gen_label_rtx ();
8737   rtx label_insn = emit_label_after (lb, insn);
8738
8739   LABEL_PRESERVE_P (lb) = 1;
8740
8741   delete_insn (label_insn);
8742
8743   ASM_GENERATE_INTERNAL_LABEL (label, "L", CODE_LABEL_NUMBER (label_insn));
8744
8745   return xstrdup (label);
8746 }
8747
8748 /* Define the CFA after INSN with the steady-state definition.  */
8749
8750 static void
8751 ia64_dwarf2out_def_steady_cfa (rtx insn)
8752 {
8753   rtx fp = frame_pointer_needed
8754     ? hard_frame_pointer_rtx
8755     : stack_pointer_rtx;
8756
8757   dwarf2out_def_cfa
8758     (ia64_emit_deleted_label_after_insn (insn),
8759      REGNO (fp),
8760      ia64_initial_elimination_offset
8761      (REGNO (arg_pointer_rtx), REGNO (fp))
8762      + ARG_POINTER_CFA_OFFSET (current_function_decl));
8763 }
8764
8765 /* The generic dwarf2 frame debug info generator does not define a
8766    separate region for the very end of the epilogue, so refrain from
8767    doing so in the IA64-specific code as well.  */
8768
8769 #define IA64_CHANGE_CFA_IN_EPILOGUE 0
8770
8771 /* The function emits unwind directives for the start of an epilogue.  */
8772
8773 static void
8774 process_epilogue (FILE *asm_out_file, rtx insn, bool unwind, bool frame)
8775 {
8776   /* If this isn't the last block of the function, then we need to label the
8777      current state, and copy it back in at the start of the next block.  */
8778
8779   if (!last_block)
8780     {
8781       if (unwind)
8782         fprintf (asm_out_file, "\t.label_state %d\n",
8783                  ++cfun->machine->state_num);
8784       need_copy_state = true;
8785     }
8786
8787   if (unwind)
8788     fprintf (asm_out_file, "\t.restore sp\n");
8789   if (IA64_CHANGE_CFA_IN_EPILOGUE && frame)
8790     dwarf2out_def_cfa (ia64_emit_deleted_label_after_insn (insn),
8791                        STACK_POINTER_REGNUM, INCOMING_FRAME_SP_OFFSET);
8792 }
8793
8794 /* This function processes a SET pattern looking for specific patterns
8795    which result in emitting an assembly directive required for unwinding.  */
8796
8797 static int
8798 process_set (FILE *asm_out_file, rtx pat, rtx insn, bool unwind, bool frame)
8799 {
8800   rtx src = SET_SRC (pat);
8801   rtx dest = SET_DEST (pat);
8802   int src_regno, dest_regno;
8803
8804   /* Look for the ALLOC insn.  */
8805   if (GET_CODE (src) == UNSPEC_VOLATILE
8806       && XINT (src, 1) == UNSPECV_ALLOC
8807       && GET_CODE (dest) == REG)
8808     {
8809       dest_regno = REGNO (dest);
8810
8811       /* If this is the final destination for ar.pfs, then this must
8812          be the alloc in the prologue.  */
8813       if (dest_regno == current_frame_info.reg_save_ar_pfs)
8814         {
8815           if (unwind)
8816             fprintf (asm_out_file, "\t.save ar.pfs, r%d\n",
8817                      ia64_dbx_register_number (dest_regno));
8818         }
8819       else
8820         {
8821           /* This must be an alloc before a sibcall.  We must drop the
8822              old frame info.  The easiest way to drop the old frame
8823              info is to ensure we had a ".restore sp" directive
8824              followed by a new prologue.  If the procedure doesn't
8825              have a memory-stack frame, we'll issue a dummy ".restore
8826              sp" now.  */
8827           if (current_frame_info.total_size == 0 && !frame_pointer_needed)
8828             /* if haven't done process_epilogue() yet, do it now */
8829             process_epilogue (asm_out_file, insn, unwind, frame);
8830           if (unwind)
8831             fprintf (asm_out_file, "\t.prologue\n");
8832         }
8833       return 1;
8834     }
8835
8836   /* Look for SP = ....  */
8837   if (GET_CODE (dest) == REG && REGNO (dest) == STACK_POINTER_REGNUM)
8838     {
8839       if (GET_CODE (src) == PLUS)
8840         {
8841           rtx op0 = XEXP (src, 0);
8842           rtx op1 = XEXP (src, 1);
8843           
8844           gcc_assert (op0 == dest && GET_CODE (op1) == CONST_INT);
8845           
8846           if (INTVAL (op1) < 0)
8847             {
8848               gcc_assert (!frame_pointer_needed);
8849               if (unwind)
8850                 fprintf (asm_out_file, "\t.fframe "HOST_WIDE_INT_PRINT_DEC"\n",
8851                          -INTVAL (op1));
8852               if (frame)
8853                 ia64_dwarf2out_def_steady_cfa (insn);
8854             }
8855           else
8856             process_epilogue (asm_out_file, insn, unwind, frame);
8857         }
8858       else
8859         {
8860           gcc_assert (GET_CODE (src) == REG
8861                       && REGNO (src) == HARD_FRAME_POINTER_REGNUM);
8862           process_epilogue (asm_out_file, insn, unwind, frame);
8863         }
8864
8865       return 1;
8866     }
8867
8868   /* Register move we need to look at.  */
8869   if (GET_CODE (dest) == REG && GET_CODE (src) == REG)
8870     {
8871       src_regno = REGNO (src);
8872       dest_regno = REGNO (dest);
8873
8874       switch (src_regno)
8875         {
8876         case BR_REG (0):
8877           /* Saving return address pointer.  */
8878           gcc_assert (dest_regno == current_frame_info.reg_save_b0);
8879           if (unwind)
8880             fprintf (asm_out_file, "\t.save rp, r%d\n",
8881                      ia64_dbx_register_number (dest_regno));
8882           return 1;
8883
8884         case PR_REG (0):
8885           gcc_assert (dest_regno == current_frame_info.reg_save_pr);
8886           if (unwind)
8887             fprintf (asm_out_file, "\t.save pr, r%d\n",
8888                      ia64_dbx_register_number (dest_regno));
8889           return 1;
8890
8891         case AR_UNAT_REGNUM:
8892           gcc_assert (dest_regno == current_frame_info.reg_save_ar_unat);
8893           if (unwind)
8894             fprintf (asm_out_file, "\t.save ar.unat, r%d\n",
8895                      ia64_dbx_register_number (dest_regno));
8896           return 1;
8897
8898         case AR_LC_REGNUM:
8899           gcc_assert (dest_regno == current_frame_info.reg_save_ar_lc);
8900           if (unwind)
8901             fprintf (asm_out_file, "\t.save ar.lc, r%d\n",
8902                      ia64_dbx_register_number (dest_regno));
8903           return 1;
8904
8905         case STACK_POINTER_REGNUM:
8906           gcc_assert (dest_regno == HARD_FRAME_POINTER_REGNUM
8907                       && frame_pointer_needed);
8908           if (unwind)
8909             fprintf (asm_out_file, "\t.vframe r%d\n",
8910                      ia64_dbx_register_number (dest_regno));
8911           if (frame)
8912             ia64_dwarf2out_def_steady_cfa (insn);
8913           return 1;
8914
8915         default:
8916           /* Everything else should indicate being stored to memory.  */
8917           gcc_unreachable ();
8918         }
8919     }
8920
8921   /* Memory store we need to look at.  */
8922   if (GET_CODE (dest) == MEM && GET_CODE (src) == REG)
8923     {
8924       long off;
8925       rtx base;
8926       const char *saveop;
8927
8928       if (GET_CODE (XEXP (dest, 0)) == REG)
8929         {
8930           base = XEXP (dest, 0);
8931           off = 0;
8932         }
8933       else
8934         {
8935           gcc_assert (GET_CODE (XEXP (dest, 0)) == PLUS
8936                       && GET_CODE (XEXP (XEXP (dest, 0), 1)) == CONST_INT);
8937           base = XEXP (XEXP (dest, 0), 0);
8938           off = INTVAL (XEXP (XEXP (dest, 0), 1));
8939         }
8940
8941       if (base == hard_frame_pointer_rtx)
8942         {
8943           saveop = ".savepsp";
8944           off = - off;
8945         }
8946       else
8947         {
8948           gcc_assert (base == stack_pointer_rtx);
8949           saveop = ".savesp";
8950         }
8951
8952       src_regno = REGNO (src);
8953       switch (src_regno)
8954         {
8955         case BR_REG (0):
8956           gcc_assert (!current_frame_info.reg_save_b0);
8957           if (unwind)
8958             fprintf (asm_out_file, "\t%s rp, %ld\n", saveop, off);
8959           return 1;
8960
8961         case PR_REG (0):
8962           gcc_assert (!current_frame_info.reg_save_pr);
8963           if (unwind)
8964             fprintf (asm_out_file, "\t%s pr, %ld\n", saveop, off);
8965           return 1;
8966
8967         case AR_LC_REGNUM:
8968           gcc_assert (!current_frame_info.reg_save_ar_lc);
8969           if (unwind)
8970             fprintf (asm_out_file, "\t%s ar.lc, %ld\n", saveop, off);
8971           return 1;
8972
8973         case AR_PFS_REGNUM:
8974           gcc_assert (!current_frame_info.reg_save_ar_pfs);
8975           if (unwind)
8976             fprintf (asm_out_file, "\t%s ar.pfs, %ld\n", saveop, off);
8977           return 1;
8978
8979         case AR_UNAT_REGNUM:
8980           gcc_assert (!current_frame_info.reg_save_ar_unat);
8981           if (unwind)
8982             fprintf (asm_out_file, "\t%s ar.unat, %ld\n", saveop, off);
8983           return 1;
8984
8985         case GR_REG (4):
8986         case GR_REG (5):
8987         case GR_REG (6):
8988         case GR_REG (7):
8989           if (unwind)
8990             fprintf (asm_out_file, "\t.save.g 0x%x\n",
8991                      1 << (src_regno - GR_REG (4)));
8992           return 1;
8993
8994         case BR_REG (1):
8995         case BR_REG (2):
8996         case BR_REG (3):
8997         case BR_REG (4):
8998         case BR_REG (5):
8999           if (unwind)
9000             fprintf (asm_out_file, "\t.save.b 0x%x\n",
9001                      1 << (src_regno - BR_REG (1)));
9002           return 1;
9003
9004         case FR_REG (2):
9005         case FR_REG (3):
9006         case FR_REG (4):
9007         case FR_REG (5):
9008           if (unwind)
9009             fprintf (asm_out_file, "\t.save.f 0x%x\n",
9010                      1 << (src_regno - FR_REG (2)));
9011           return 1;
9012
9013         case FR_REG (16): case FR_REG (17): case FR_REG (18): case FR_REG (19):
9014         case FR_REG (20): case FR_REG (21): case FR_REG (22): case FR_REG (23):
9015         case FR_REG (24): case FR_REG (25): case FR_REG (26): case FR_REG (27):
9016         case FR_REG (28): case FR_REG (29): case FR_REG (30): case FR_REG (31):
9017           if (unwind)
9018             fprintf (asm_out_file, "\t.save.gf 0x0, 0x%x\n",
9019                      1 << (src_regno - FR_REG (12)));
9020           return 1;
9021
9022         default:
9023           return 0;
9024         }
9025     }
9026
9027   return 0;
9028 }
9029
9030
9031 /* This function looks at a single insn and emits any directives
9032    required to unwind this insn.  */
9033 void
9034 process_for_unwind_directive (FILE *asm_out_file, rtx insn)
9035 {
9036   bool unwind = (flag_unwind_tables
9037                  || (flag_exceptions && !USING_SJLJ_EXCEPTIONS));
9038   bool frame = dwarf2out_do_frame ();
9039
9040   if (unwind || frame)
9041     {
9042       rtx pat;
9043
9044       if (GET_CODE (insn) == NOTE
9045           && NOTE_LINE_NUMBER (insn) == NOTE_INSN_BASIC_BLOCK)
9046         {
9047           last_block = NOTE_BASIC_BLOCK (insn)->next_bb == EXIT_BLOCK_PTR;
9048
9049           /* Restore unwind state from immediately before the epilogue.  */
9050           if (need_copy_state)
9051             {
9052               if (unwind)
9053                 {
9054                   fprintf (asm_out_file, "\t.body\n");
9055                   fprintf (asm_out_file, "\t.copy_state %d\n",
9056                            cfun->machine->state_num);
9057                 }
9058               if (IA64_CHANGE_CFA_IN_EPILOGUE && frame)
9059                 ia64_dwarf2out_def_steady_cfa (insn);
9060               need_copy_state = false;
9061             }
9062         }
9063
9064       if (GET_CODE (insn) == NOTE || ! RTX_FRAME_RELATED_P (insn))
9065         return;
9066
9067       pat = find_reg_note (insn, REG_FRAME_RELATED_EXPR, NULL_RTX);
9068       if (pat)
9069         pat = XEXP (pat, 0);
9070       else
9071         pat = PATTERN (insn);
9072
9073       switch (GET_CODE (pat))
9074         {
9075         case SET:
9076           process_set (asm_out_file, pat, insn, unwind, frame);
9077           break;
9078
9079         case PARALLEL:
9080           {
9081             int par_index;
9082             int limit = XVECLEN (pat, 0);
9083             for (par_index = 0; par_index < limit; par_index++)
9084               {
9085                 rtx x = XVECEXP (pat, 0, par_index);
9086                 if (GET_CODE (x) == SET)
9087                   process_set (asm_out_file, x, insn, unwind, frame);
9088               }
9089             break;
9090           }
9091
9092         default:
9093           gcc_unreachable ();
9094         }
9095     }
9096 }
9097
9098 \f
9099 enum ia64_builtins
9100 {
9101   IA64_BUILTIN_BSP,
9102   IA64_BUILTIN_FLUSHRS
9103 };
9104
9105 void
9106 ia64_init_builtins (void)
9107 {
9108   tree fpreg_type;
9109   tree float80_type;
9110
9111   /* The __fpreg type.  */
9112   fpreg_type = make_node (REAL_TYPE);
9113   TYPE_PRECISION (fpreg_type) = 82;
9114   layout_type (fpreg_type);
9115   (*lang_hooks.types.register_builtin_type) (fpreg_type, "__fpreg");
9116
9117   /* The __float80 type.  */
9118   float80_type = make_node (REAL_TYPE);
9119   TYPE_PRECISION (float80_type) = 80;
9120   layout_type (float80_type);
9121   (*lang_hooks.types.register_builtin_type) (float80_type, "__float80");
9122
9123   /* The __float128 type.  */
9124   if (!TARGET_HPUX)
9125     {
9126       tree float128_type = make_node (REAL_TYPE);
9127       TYPE_PRECISION (float128_type) = 128;
9128       layout_type (float128_type);
9129       (*lang_hooks.types.register_builtin_type) (float128_type, "__float128");
9130     }
9131   else
9132     /* Under HPUX, this is a synonym for "long double".  */
9133     (*lang_hooks.types.register_builtin_type) (long_double_type_node,
9134                                                "__float128");
9135
9136 #define def_builtin(name, type, code)                                   \
9137   add_builtin_function ((name), (type), (code), BUILT_IN_MD,    \
9138                        NULL, NULL_TREE)
9139
9140   def_builtin ("__builtin_ia64_bsp",
9141                build_function_type (ptr_type_node, void_list_node),
9142                IA64_BUILTIN_BSP);
9143
9144   def_builtin ("__builtin_ia64_flushrs",
9145                build_function_type (void_type_node, void_list_node),
9146                IA64_BUILTIN_FLUSHRS);
9147
9148 #undef def_builtin
9149
9150   if (TARGET_HPUX)
9151     {
9152       if (built_in_decls [BUILT_IN_FINITE])
9153         set_user_assembler_name (built_in_decls [BUILT_IN_FINITE],
9154           "_Isfinite");
9155       if (built_in_decls [BUILT_IN_FINITEF])
9156         set_user_assembler_name (built_in_decls [BUILT_IN_FINITEF],
9157           "_Isfinitef");
9158       if (built_in_decls [BUILT_IN_FINITEL])
9159         set_user_assembler_name (built_in_decls [BUILT_IN_FINITEL],
9160           "_Isfinitef128");
9161     }
9162 }
9163
9164 rtx
9165 ia64_expand_builtin (tree exp, rtx target, rtx subtarget ATTRIBUTE_UNUSED,
9166                      enum machine_mode mode ATTRIBUTE_UNUSED,
9167                      int ignore ATTRIBUTE_UNUSED)
9168 {
9169   tree fndecl = TREE_OPERAND (TREE_OPERAND (exp, 0), 0);
9170   unsigned int fcode = DECL_FUNCTION_CODE (fndecl);
9171
9172   switch (fcode)
9173     {
9174     case IA64_BUILTIN_BSP:
9175       if (! target || ! register_operand (target, DImode))
9176         target = gen_reg_rtx (DImode);
9177       emit_insn (gen_bsp_value (target));
9178 #ifdef POINTERS_EXTEND_UNSIGNED
9179       target = convert_memory_address (ptr_mode, target);
9180 #endif
9181       return target;
9182
9183     case IA64_BUILTIN_FLUSHRS:
9184       emit_insn (gen_flushrs ());
9185       return const0_rtx;
9186
9187     default:
9188       break;
9189     }
9190
9191   return NULL_RTX;
9192 }
9193
9194 /* For the HP-UX IA64 aggregate parameters are passed stored in the
9195    most significant bits of the stack slot.  */
9196
9197 enum direction
9198 ia64_hpux_function_arg_padding (enum machine_mode mode, tree type)
9199 {
9200    /* Exception to normal case for structures/unions/etc.  */
9201
9202    if (type && AGGREGATE_TYPE_P (type)
9203        && int_size_in_bytes (type) < UNITS_PER_WORD)
9204      return upward;
9205
9206    /* Fall back to the default.  */
9207    return DEFAULT_FUNCTION_ARG_PADDING (mode, type);
9208 }
9209
9210 /* Emit text to declare externally defined variables and functions, because
9211    the Intel assembler does not support undefined externals.  */
9212
9213 void
9214 ia64_asm_output_external (FILE *file, tree decl, const char *name)
9215 {
9216   /* We output the name if and only if TREE_SYMBOL_REFERENCED is
9217      set in order to avoid putting out names that are never really
9218      used. */
9219   if (TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (decl)))
9220     {
9221       /* maybe_assemble_visibility will return 1 if the assembler
9222          visibility directive is output.  */
9223       int need_visibility = ((*targetm.binds_local_p) (decl)
9224                              && maybe_assemble_visibility (decl));
9225
9226       /* GNU as does not need anything here, but the HP linker does
9227          need something for external functions.  */
9228       if ((TARGET_HPUX_LD || !TARGET_GNU_AS)
9229           && TREE_CODE (decl) == FUNCTION_DECL)
9230           (*targetm.asm_out.globalize_decl_name) (file, decl);
9231       else if (need_visibility && !TARGET_GNU_AS)
9232         (*targetm.asm_out.globalize_label) (file, name);
9233     }
9234 }
9235
9236 /* Set SImode div/mod functions, init_integral_libfuncs only initializes
9237    modes of word_mode and larger.  Rename the TFmode libfuncs using the
9238    HPUX conventions. __divtf3 is used for XFmode. We need to keep it for
9239    backward compatibility. */
9240
9241 static void
9242 ia64_init_libfuncs (void)
9243 {
9244   set_optab_libfunc (sdiv_optab, SImode, "__divsi3");
9245   set_optab_libfunc (udiv_optab, SImode, "__udivsi3");
9246   set_optab_libfunc (smod_optab, SImode, "__modsi3");
9247   set_optab_libfunc (umod_optab, SImode, "__umodsi3");
9248
9249   set_optab_libfunc (add_optab, TFmode, "_U_Qfadd");
9250   set_optab_libfunc (sub_optab, TFmode, "_U_Qfsub");
9251   set_optab_libfunc (smul_optab, TFmode, "_U_Qfmpy");
9252   set_optab_libfunc (sdiv_optab, TFmode, "_U_Qfdiv");
9253   set_optab_libfunc (neg_optab, TFmode, "_U_Qfneg");
9254
9255   set_conv_libfunc (sext_optab, TFmode, SFmode, "_U_Qfcnvff_sgl_to_quad");
9256   set_conv_libfunc (sext_optab, TFmode, DFmode, "_U_Qfcnvff_dbl_to_quad");
9257   set_conv_libfunc (sext_optab, TFmode, XFmode, "_U_Qfcnvff_f80_to_quad");
9258   set_conv_libfunc (trunc_optab, SFmode, TFmode, "_U_Qfcnvff_quad_to_sgl");
9259   set_conv_libfunc (trunc_optab, DFmode, TFmode, "_U_Qfcnvff_quad_to_dbl");
9260   set_conv_libfunc (trunc_optab, XFmode, TFmode, "_U_Qfcnvff_quad_to_f80");
9261
9262   set_conv_libfunc (sfix_optab, SImode, TFmode, "_U_Qfcnvfxt_quad_to_sgl");
9263   set_conv_libfunc (sfix_optab, DImode, TFmode, "_U_Qfcnvfxt_quad_to_dbl");
9264   set_conv_libfunc (sfix_optab, TImode, TFmode, "_U_Qfcnvfxt_quad_to_quad");
9265   set_conv_libfunc (ufix_optab, SImode, TFmode, "_U_Qfcnvfxut_quad_to_sgl");
9266   set_conv_libfunc (ufix_optab, DImode, TFmode, "_U_Qfcnvfxut_quad_to_dbl");
9267
9268   set_conv_libfunc (sfloat_optab, TFmode, SImode, "_U_Qfcnvxf_sgl_to_quad");
9269   set_conv_libfunc (sfloat_optab, TFmode, DImode, "_U_Qfcnvxf_dbl_to_quad");
9270   set_conv_libfunc (sfloat_optab, TFmode, TImode, "_U_Qfcnvxf_quad_to_quad");
9271   /* HP-UX 11.23 libc does not have a function for unsigned
9272      SImode-to-TFmode conversion.  */
9273   set_conv_libfunc (ufloat_optab, TFmode, DImode, "_U_Qfcnvxuf_dbl_to_quad");
9274 }
9275
9276 /* Rename all the TFmode libfuncs using the HPUX conventions.  */
9277
9278 static void
9279 ia64_hpux_init_libfuncs (void)
9280 {
9281   ia64_init_libfuncs ();
9282
9283   /* The HP SI millicode division and mod functions expect DI arguments.
9284      By turning them off completely we avoid using both libgcc and the
9285      non-standard millicode routines and use the HP DI millicode routines
9286      instead.  */
9287
9288   set_optab_libfunc (sdiv_optab, SImode, 0);
9289   set_optab_libfunc (udiv_optab, SImode, 0);
9290   set_optab_libfunc (smod_optab, SImode, 0);
9291   set_optab_libfunc (umod_optab, SImode, 0);
9292
9293   set_optab_libfunc (sdiv_optab, DImode, "__milli_divI");
9294   set_optab_libfunc (udiv_optab, DImode, "__milli_divU");
9295   set_optab_libfunc (smod_optab, DImode, "__milli_remI");
9296   set_optab_libfunc (umod_optab, DImode, "__milli_remU");
9297
9298   /* HP-UX libc has TF min/max/abs routines in it.  */
9299   set_optab_libfunc (smin_optab, TFmode, "_U_Qfmin");
9300   set_optab_libfunc (smax_optab, TFmode, "_U_Qfmax");
9301   set_optab_libfunc (abs_optab, TFmode, "_U_Qfabs");
9302
9303   /* ia64_expand_compare uses this.  */
9304   cmptf_libfunc = init_one_libfunc ("_U_Qfcmp");
9305
9306   /* These should never be used.  */
9307   set_optab_libfunc (eq_optab, TFmode, 0);
9308   set_optab_libfunc (ne_optab, TFmode, 0);
9309   set_optab_libfunc (gt_optab, TFmode, 0);
9310   set_optab_libfunc (ge_optab, TFmode, 0);
9311   set_optab_libfunc (lt_optab, TFmode, 0);
9312   set_optab_libfunc (le_optab, TFmode, 0);
9313 }
9314
9315 /* Rename the division and modulus functions in VMS.  */
9316
9317 static void
9318 ia64_vms_init_libfuncs (void)
9319 {
9320   set_optab_libfunc (sdiv_optab, SImode, "OTS$DIV_I");
9321   set_optab_libfunc (sdiv_optab, DImode, "OTS$DIV_L");
9322   set_optab_libfunc (udiv_optab, SImode, "OTS$DIV_UI");
9323   set_optab_libfunc (udiv_optab, DImode, "OTS$DIV_UL");
9324   set_optab_libfunc (smod_optab, SImode, "OTS$REM_I");
9325   set_optab_libfunc (smod_optab, DImode, "OTS$REM_L");
9326   set_optab_libfunc (umod_optab, SImode, "OTS$REM_UI");
9327   set_optab_libfunc (umod_optab, DImode, "OTS$REM_UL");
9328 }
9329
9330 /* Rename the TFmode libfuncs available from soft-fp in glibc using
9331    the HPUX conventions.  */
9332
9333 static void
9334 ia64_sysv4_init_libfuncs (void)
9335 {
9336   ia64_init_libfuncs ();
9337
9338   /* These functions are not part of the HPUX TFmode interface.  We
9339      use them instead of _U_Qfcmp, which doesn't work the way we
9340      expect.  */
9341   set_optab_libfunc (eq_optab, TFmode, "_U_Qfeq");
9342   set_optab_libfunc (ne_optab, TFmode, "_U_Qfne");
9343   set_optab_libfunc (gt_optab, TFmode, "_U_Qfgt");
9344   set_optab_libfunc (ge_optab, TFmode, "_U_Qfge");
9345   set_optab_libfunc (lt_optab, TFmode, "_U_Qflt");
9346   set_optab_libfunc (le_optab, TFmode, "_U_Qfle");
9347
9348   /* We leave out _U_Qfmin, _U_Qfmax and _U_Qfabs since soft-fp in
9349      glibc doesn't have them.  */
9350 }
9351 \f
9352 /* Return the section to use for X.  The only special thing we do here
9353    is to honor small data.  */
9354
9355 static section *
9356 ia64_select_rtx_section (enum machine_mode mode, rtx x,
9357                          unsigned HOST_WIDE_INT align)
9358 {
9359   if (GET_MODE_SIZE (mode) > 0
9360       && GET_MODE_SIZE (mode) <= ia64_section_threshold
9361       && !TARGET_NO_SDATA)
9362     return sdata_section;
9363   else
9364     return default_elf_select_rtx_section (mode, x, align);
9365 }
9366
9367 /* It is illegal to have relocations in shared segments on AIX and HPUX.
9368    Pretend flag_pic is always set.  */
9369
9370 static section *
9371 ia64_rwreloc_select_section (tree exp, int reloc, unsigned HOST_WIDE_INT align)
9372 {
9373   return default_elf_select_section_1 (exp, reloc, align, true);
9374 }
9375
9376 static void
9377 ia64_rwreloc_unique_section (tree decl, int reloc)
9378 {
9379   default_unique_section_1 (decl, reloc, true);
9380 }
9381
9382 static section *
9383 ia64_rwreloc_select_rtx_section (enum machine_mode mode, rtx x,
9384                                  unsigned HOST_WIDE_INT align)
9385 {
9386   section *sect;
9387   int save_pic = flag_pic;
9388   flag_pic = 1;
9389   sect = ia64_select_rtx_section (mode, x, align);
9390   flag_pic = save_pic;
9391   return sect;
9392 }
9393
9394 #ifndef TARGET_RWRELOC
9395 #define TARGET_RWRELOC flag_pic
9396 #endif
9397
9398 static unsigned int
9399 ia64_section_type_flags (tree decl, const char *name, int reloc)
9400 {
9401   unsigned int flags = 0;
9402
9403   if (strcmp (name, ".sdata") == 0
9404       || strncmp (name, ".sdata.", 7) == 0
9405       || strncmp (name, ".gnu.linkonce.s.", 16) == 0
9406       || strncmp (name, ".sdata2.", 8) == 0
9407       || strncmp (name, ".gnu.linkonce.s2.", 17) == 0
9408       || strcmp (name, ".sbss") == 0
9409       || strncmp (name, ".sbss.", 6) == 0
9410       || strncmp (name, ".gnu.linkonce.sb.", 17) == 0)
9411     flags = SECTION_SMALL;
9412
9413   flags |= default_section_type_flags_1 (decl, name, reloc, TARGET_RWRELOC);
9414   return flags;
9415 }
9416
9417 /* Returns true if FNTYPE (a FUNCTION_TYPE or a METHOD_TYPE) returns a
9418    structure type and that the address of that type should be passed
9419    in out0, rather than in r8.  */
9420
9421 static bool
9422 ia64_struct_retval_addr_is_first_parm_p (tree fntype)
9423 {
9424   tree ret_type = TREE_TYPE (fntype);
9425
9426   /* The Itanium C++ ABI requires that out0, rather than r8, be used
9427      as the structure return address parameter, if the return value
9428      type has a non-trivial copy constructor or destructor.  It is not
9429      clear if this same convention should be used for other
9430      programming languages.  Until G++ 3.4, we incorrectly used r8 for
9431      these return values.  */
9432   return (abi_version_at_least (2)
9433           && ret_type
9434           && TYPE_MODE (ret_type) == BLKmode 
9435           && TREE_ADDRESSABLE (ret_type)
9436           && strcmp (lang_hooks.name, "GNU C++") == 0);
9437 }
9438
9439 /* Output the assembler code for a thunk function.  THUNK_DECL is the
9440    declaration for the thunk function itself, FUNCTION is the decl for
9441    the target function.  DELTA is an immediate constant offset to be
9442    added to THIS.  If VCALL_OFFSET is nonzero, the word at
9443    *(*this + vcall_offset) should be added to THIS.  */
9444
9445 static void
9446 ia64_output_mi_thunk (FILE *file, tree thunk ATTRIBUTE_UNUSED,
9447                       HOST_WIDE_INT delta, HOST_WIDE_INT vcall_offset,
9448                       tree function)
9449 {
9450   rtx this, insn, funexp;
9451   unsigned int this_parmno;
9452   unsigned int this_regno;
9453
9454   reload_completed = 1;
9455   epilogue_completed = 1;
9456   no_new_pseudos = 1;
9457   reset_block_changes ();
9458
9459   /* Set things up as ia64_expand_prologue might.  */
9460   last_scratch_gr_reg = 15;
9461
9462   memset (&current_frame_info, 0, sizeof (current_frame_info));
9463   current_frame_info.spill_cfa_off = -16;
9464   current_frame_info.n_input_regs = 1;
9465   current_frame_info.need_regstk = (TARGET_REG_NAMES != 0);
9466
9467   /* Mark the end of the (empty) prologue.  */
9468   emit_note (NOTE_INSN_PROLOGUE_END);
9469
9470   /* Figure out whether "this" will be the first parameter (the
9471      typical case) or the second parameter (as happens when the
9472      virtual function returns certain class objects).  */
9473   this_parmno
9474     = (ia64_struct_retval_addr_is_first_parm_p (TREE_TYPE (thunk))
9475        ? 1 : 0);
9476   this_regno = IN_REG (this_parmno);
9477   if (!TARGET_REG_NAMES)
9478     reg_names[this_regno] = ia64_reg_numbers[this_parmno];
9479
9480   this = gen_rtx_REG (Pmode, this_regno);
9481   if (TARGET_ILP32)
9482     {
9483       rtx tmp = gen_rtx_REG (ptr_mode, this_regno);
9484       REG_POINTER (tmp) = 1;
9485       if (delta && CONST_OK_FOR_I (delta))
9486         {
9487           emit_insn (gen_ptr_extend_plus_imm (this, tmp, GEN_INT (delta)));
9488           delta = 0;
9489         }
9490       else
9491         emit_insn (gen_ptr_extend (this, tmp));
9492     }
9493
9494   /* Apply the constant offset, if required.  */
9495   if (delta)
9496     {
9497       rtx delta_rtx = GEN_INT (delta);
9498
9499       if (!CONST_OK_FOR_I (delta))
9500         {
9501           rtx tmp = gen_rtx_REG (Pmode, 2);
9502           emit_move_insn (tmp, delta_rtx);
9503           delta_rtx = tmp;
9504         }
9505       emit_insn (gen_adddi3 (this, this, delta_rtx));
9506     }
9507
9508   /* Apply the offset from the vtable, if required.  */
9509   if (vcall_offset)
9510     {
9511       rtx vcall_offset_rtx = GEN_INT (vcall_offset);
9512       rtx tmp = gen_rtx_REG (Pmode, 2);
9513
9514       if (TARGET_ILP32)
9515         {
9516           rtx t = gen_rtx_REG (ptr_mode, 2);
9517           REG_POINTER (t) = 1;
9518           emit_move_insn (t, gen_rtx_MEM (ptr_mode, this));
9519           if (CONST_OK_FOR_I (vcall_offset))
9520             {
9521               emit_insn (gen_ptr_extend_plus_imm (tmp, t, 
9522                                                   vcall_offset_rtx));
9523               vcall_offset = 0;
9524             }
9525           else
9526             emit_insn (gen_ptr_extend (tmp, t));
9527         }
9528       else
9529         emit_move_insn (tmp, gen_rtx_MEM (Pmode, this));
9530
9531       if (vcall_offset)
9532         {
9533           if (!CONST_OK_FOR_J (vcall_offset))
9534             {
9535               rtx tmp2 = gen_rtx_REG (Pmode, next_scratch_gr_reg ());
9536               emit_move_insn (tmp2, vcall_offset_rtx);
9537               vcall_offset_rtx = tmp2;
9538             }
9539           emit_insn (gen_adddi3 (tmp, tmp, vcall_offset_rtx));
9540         }
9541
9542       if (TARGET_ILP32)
9543         emit_move_insn (gen_rtx_REG (ptr_mode, 2), 
9544                         gen_rtx_MEM (ptr_mode, tmp));
9545       else
9546         emit_move_insn (tmp, gen_rtx_MEM (Pmode, tmp));
9547
9548       emit_insn (gen_adddi3 (this, this, tmp));
9549     }
9550
9551   /* Generate a tail call to the target function.  */
9552   if (! TREE_USED (function))
9553     {
9554       assemble_external (function);
9555       TREE_USED (function) = 1;
9556     }
9557   funexp = XEXP (DECL_RTL (function), 0);
9558   funexp = gen_rtx_MEM (FUNCTION_MODE, funexp);
9559   ia64_expand_call (NULL_RTX, funexp, NULL_RTX, 1);
9560   insn = get_last_insn ();
9561   SIBLING_CALL_P (insn) = 1;
9562
9563   /* Code generation for calls relies on splitting.  */
9564   reload_completed = 1;
9565   epilogue_completed = 1;
9566   try_split (PATTERN (insn), insn, 0);
9567
9568   emit_barrier ();
9569
9570   /* Run just enough of rest_of_compilation to get the insns emitted.
9571      There's not really enough bulk here to make other passes such as
9572      instruction scheduling worth while.  Note that use_thunk calls
9573      assemble_start_function and assemble_end_function.  */
9574
9575   insn_locators_initialize ();
9576   emit_all_insn_group_barriers (NULL);
9577   insn = get_insns ();
9578   shorten_branches (insn);
9579   final_start_function (insn, file, 1);
9580   final (insn, file, 1);
9581   final_end_function ();
9582
9583   reload_completed = 0;
9584   epilogue_completed = 0;
9585   no_new_pseudos = 0;
9586 }
9587
9588 /* Worker function for TARGET_STRUCT_VALUE_RTX.  */
9589
9590 static rtx
9591 ia64_struct_value_rtx (tree fntype,
9592                        int incoming ATTRIBUTE_UNUSED)
9593 {
9594   if (fntype && ia64_struct_retval_addr_is_first_parm_p (fntype))
9595     return NULL_RTX;
9596   return gen_rtx_REG (Pmode, GR_REG (8));
9597 }
9598
9599 static bool
9600 ia64_scalar_mode_supported_p (enum machine_mode mode)
9601 {
9602   switch (mode)
9603     {
9604     case QImode:
9605     case HImode:
9606     case SImode:
9607     case DImode:
9608     case TImode:
9609       return true;
9610
9611     case SFmode:
9612     case DFmode:
9613     case XFmode:
9614     case RFmode:
9615       return true;
9616
9617     case TFmode:
9618       return TARGET_HPUX;
9619
9620     default:
9621       return false;
9622     }
9623 }
9624
9625 static bool
9626 ia64_vector_mode_supported_p (enum machine_mode mode)
9627 {
9628   switch (mode)
9629     {
9630     case V8QImode:
9631     case V4HImode:
9632     case V2SImode:
9633       return true;
9634
9635     case V2SFmode:
9636       return true;
9637
9638     default:
9639       return false;
9640     }
9641 }
9642
9643 /* Implement the FUNCTION_PROFILER macro.  */
9644
9645 void
9646 ia64_output_function_profiler (FILE *file, int labelno)
9647 {
9648   bool indirect_call;
9649
9650   /* If the function needs a static chain and the static chain
9651      register is r15, we use an indirect call so as to bypass
9652      the PLT stub in case the executable is dynamically linked,
9653      because the stub clobbers r15 as per 5.3.6 of the psABI.
9654      We don't need to do that in non canonical PIC mode.  */
9655
9656   if (cfun->static_chain_decl && !TARGET_NO_PIC && !TARGET_AUTO_PIC)
9657     {
9658       gcc_assert (STATIC_CHAIN_REGNUM == 15);
9659       indirect_call = true;
9660     }
9661   else
9662     indirect_call = false;
9663
9664   if (TARGET_GNU_AS)
9665     fputs ("\t.prologue 4, r40\n", file);
9666   else
9667     fputs ("\t.prologue\n\t.save ar.pfs, r40\n", file);
9668   fputs ("\talloc out0 = ar.pfs, 8, 0, 4, 0\n", file);
9669
9670   if (NO_PROFILE_COUNTERS)
9671     fputs ("\tmov out3 = r0\n", file);
9672   else
9673     {
9674       char buf[20];
9675       ASM_GENERATE_INTERNAL_LABEL (buf, "LP", labelno);
9676
9677       if (TARGET_AUTO_PIC)
9678         fputs ("\tmovl out3 = @gprel(", file);
9679       else
9680         fputs ("\taddl out3 = @ltoff(", file);
9681       assemble_name (file, buf);
9682       if (TARGET_AUTO_PIC)
9683         fputs (")\n", file);
9684       else
9685         fputs ("), r1\n", file);
9686     }
9687
9688   if (indirect_call)
9689     fputs ("\taddl r14 = @ltoff(@fptr(_mcount)), r1\n", file);
9690   fputs ("\t;;\n", file);
9691
9692   fputs ("\t.save rp, r42\n", file);
9693   fputs ("\tmov out2 = b0\n", file);
9694   if (indirect_call)
9695     fputs ("\tld8 r14 = [r14]\n\t;;\n", file);
9696   fputs ("\t.body\n", file);
9697   fputs ("\tmov out1 = r1\n", file);
9698   if (indirect_call)
9699     {
9700       fputs ("\tld8 r16 = [r14], 8\n\t;;\n", file);
9701       fputs ("\tmov b6 = r16\n", file);
9702       fputs ("\tld8 r1 = [r14]\n", file);
9703       fputs ("\tbr.call.sptk.many b0 = b6\n\t;;\n", file);
9704     }
9705   else
9706     fputs ("\tbr.call.sptk.many b0 = _mcount\n\t;;\n", file);
9707 }
9708
9709 static GTY(()) rtx mcount_func_rtx;
9710 static rtx
9711 gen_mcount_func_rtx (void)
9712 {
9713   if (!mcount_func_rtx)
9714     mcount_func_rtx = init_one_libfunc ("_mcount");
9715   return mcount_func_rtx;
9716 }
9717
9718 void
9719 ia64_profile_hook (int labelno)
9720 {
9721   rtx label, ip;
9722
9723   if (NO_PROFILE_COUNTERS)
9724     label = const0_rtx;
9725   else
9726     {
9727       char buf[30];
9728       const char *label_name;
9729       ASM_GENERATE_INTERNAL_LABEL (buf, "LP", labelno);
9730       label_name = (*targetm.strip_name_encoding) (ggc_strdup (buf));
9731       label = gen_rtx_SYMBOL_REF (Pmode, label_name);
9732       SYMBOL_REF_FLAGS (label) = SYMBOL_FLAG_LOCAL;
9733     }
9734   ip = gen_reg_rtx (Pmode);
9735   emit_insn (gen_ip_value (ip));
9736   emit_library_call (gen_mcount_func_rtx (), LCT_NORMAL,
9737                      VOIDmode, 3,
9738                      gen_rtx_REG (Pmode, BR_REG (0)), Pmode,
9739                      ip, Pmode,
9740                      label, Pmode);
9741 }
9742
9743 /* Return the mangling of TYPE if it is an extended fundamental type.  */
9744
9745 static const char *
9746 ia64_mangle_fundamental_type (tree type)
9747 {
9748   /* On HP-UX, "long double" is mangled as "e" so __float128 is
9749      mangled as "e".  */
9750   if (!TARGET_HPUX && TYPE_MODE (type) == TFmode)
9751     return "g";
9752   /* On HP-UX, "e" is not available as a mangling of __float80 so use
9753      an extended mangling.  Elsewhere, "e" is available since long
9754      double is 80 bits.  */
9755   if (TYPE_MODE (type) == XFmode)
9756     return TARGET_HPUX ? "u9__float80" : "e";
9757   if (TYPE_MODE (type) == RFmode)
9758     return "u7__fpreg";
9759   return NULL;
9760 }
9761
9762 /* Return the diagnostic message string if conversion from FROMTYPE to
9763    TOTYPE is not allowed, NULL otherwise.  */
9764 static const char *
9765 ia64_invalid_conversion (tree fromtype, tree totype)
9766 {
9767   /* Reject nontrivial conversion to or from __fpreg.  */
9768   if (TYPE_MODE (fromtype) == RFmode
9769       && TYPE_MODE (totype) != RFmode
9770       && TYPE_MODE (totype) != VOIDmode)
9771     return N_("invalid conversion from %<__fpreg%>");
9772   if (TYPE_MODE (totype) == RFmode
9773       && TYPE_MODE (fromtype) != RFmode)
9774     return N_("invalid conversion to %<__fpreg%>");
9775   return NULL;
9776 }
9777
9778 /* Return the diagnostic message string if the unary operation OP is
9779    not permitted on TYPE, NULL otherwise.  */
9780 static const char *
9781 ia64_invalid_unary_op (int op, tree type)
9782 {
9783   /* Reject operations on __fpreg other than unary + or &.  */
9784   if (TYPE_MODE (type) == RFmode
9785       && op != CONVERT_EXPR
9786       && op != ADDR_EXPR)
9787     return N_("invalid operation on %<__fpreg%>");
9788   return NULL;
9789 }
9790
9791 /* Return the diagnostic message string if the binary operation OP is
9792    not permitted on TYPE1 and TYPE2, NULL otherwise.  */
9793 static const char *
9794 ia64_invalid_binary_op (int op ATTRIBUTE_UNUSED, tree type1, tree type2)
9795 {
9796   /* Reject operations on __fpreg.  */
9797   if (TYPE_MODE (type1) == RFmode || TYPE_MODE (type2) == RFmode)
9798     return N_("invalid operation on %<__fpreg%>");
9799   return NULL;
9800 }
9801
9802 /* Implement overriding of the optimization options.  */
9803 void
9804 ia64_optimization_options (int level ATTRIBUTE_UNUSED,
9805                            int size ATTRIBUTE_UNUSED)
9806 {
9807   /* Let the scheduler form additional regions.  */
9808   set_param_value ("max-sched-extend-regions-iters", 2);
9809
9810   /* Set the default values for cache-related parameters.  */
9811   set_param_value ("simultaneous-prefetches", 6);
9812   set_param_value ("l1-cache-line-size", 32);
9813
9814 }
9815
9816 /* HP-UX version_id attribute.
9817    For object foo, if the version_id is set to 1234 put out an alias
9818    of '.alias foo "foo{1234}"  We can't use "foo{1234}" in anything
9819    other than an alias statement because it is an illegal symbol name.  */
9820
9821 static tree
9822 ia64_handle_version_id_attribute (tree *node ATTRIBUTE_UNUSED,
9823                                  tree name ATTRIBUTE_UNUSED,
9824                                  tree args,
9825                                  int flags ATTRIBUTE_UNUSED,
9826                                  bool *no_add_attrs)
9827 {
9828   tree arg = TREE_VALUE (args);
9829
9830   if (TREE_CODE (arg) != STRING_CST)
9831     {
9832       error("version attribute is not a string");
9833       *no_add_attrs = true;
9834       return NULL_TREE;
9835     }
9836   return NULL_TREE;
9837 }
9838
9839 #include "gt-ia64.h"