Home | History | Annotate | Line # | Download | only in ia64
ia64.cc revision 1.1
      1  1.1  mrg /* Definitions of target machine for GNU compiler.
      2  1.1  mrg    Copyright (C) 1999-2022 Free Software Foundation, Inc.
      3  1.1  mrg    Contributed by James E. Wilson <wilson (at) cygnus.com> and
      4  1.1  mrg 		  David Mosberger <davidm (at) hpl.hp.com>.
      5  1.1  mrg 
      6  1.1  mrg This file is part of GCC.
      7  1.1  mrg 
      8  1.1  mrg GCC is free software; you can redistribute it and/or modify
      9  1.1  mrg it under the terms of the GNU General Public License as published by
     10  1.1  mrg the Free Software Foundation; either version 3, or (at your option)
     11  1.1  mrg any later version.
     12  1.1  mrg 
     13  1.1  mrg GCC is distributed in the hope that it will be useful,
     14  1.1  mrg but WITHOUT ANY WARRANTY; without even the implied warranty of
     15  1.1  mrg MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     16  1.1  mrg GNU General Public License for more details.
     17  1.1  mrg 
     18  1.1  mrg You should have received a copy of the GNU General Public License
     19  1.1  mrg along with GCC; see the file COPYING3.  If not see
     20  1.1  mrg <http://www.gnu.org/licenses/>.  */
     21  1.1  mrg 
     22  1.1  mrg #define IN_TARGET_CODE 1
     23  1.1  mrg 
     24  1.1  mrg #include "config.h"
     25  1.1  mrg #include "system.h"
     26  1.1  mrg #include "coretypes.h"
     27  1.1  mrg #include "backend.h"
     28  1.1  mrg #include "target.h"
     29  1.1  mrg #include "rtl.h"
     30  1.1  mrg #include "tree.h"
     31  1.1  mrg #include "memmodel.h"
     32  1.1  mrg #include "cfghooks.h"
     33  1.1  mrg #include "df.h"
     34  1.1  mrg #include "tm_p.h"
     35  1.1  mrg #include "stringpool.h"
     36  1.1  mrg #include "attribs.h"
     37  1.1  mrg #include "optabs.h"
     38  1.1  mrg #include "regs.h"
     39  1.1  mrg #include "emit-rtl.h"
     40  1.1  mrg #include "recog.h"
     41  1.1  mrg #include "diagnostic-core.h"
     42  1.1  mrg #include "alias.h"
     43  1.1  mrg #include "fold-const.h"
     44  1.1  mrg #include "stor-layout.h"
     45  1.1  mrg #include "calls.h"
     46  1.1  mrg #include "varasm.h"
     47  1.1  mrg #include "output.h"
     48  1.1  mrg #include "insn-attr.h"
     49  1.1  mrg #include "flags.h"
     50  1.1  mrg #include "explow.h"
     51  1.1  mrg #include "expr.h"
     52  1.1  mrg #include "cfgrtl.h"
     53  1.1  mrg #include "libfuncs.h"
     54  1.1  mrg #include "sched-int.h"
     55  1.1  mrg #include "common/common-target.h"
     56  1.1  mrg #include "langhooks.h"
     57  1.1  mrg #include "gimplify.h"
     58  1.1  mrg #include "intl.h"
     59  1.1  mrg #include "debug.h"
     60  1.1  mrg #include "dbgcnt.h"
     61  1.1  mrg #include "tm-constrs.h"
     62  1.1  mrg #include "sel-sched.h"
     63  1.1  mrg #include "reload.h"
     64  1.1  mrg #include "opts.h"
     65  1.1  mrg #include "dumpfile.h"
     66  1.1  mrg #include "builtins.h"
     67  1.1  mrg 
     68  1.1  mrg /* This file should be included last.  */
     69  1.1  mrg #include "target-def.h"
     70  1.1  mrg 
     71  1.1  mrg /* This is used for communication between ASM_OUTPUT_LABEL and
     72  1.1  mrg    ASM_OUTPUT_LABELREF.  */
     73  1.1  mrg int ia64_asm_output_label = 0;
     74  1.1  mrg 
     75  1.1  mrg /* Register names for ia64_expand_prologue.  */
     76  1.1  mrg static const char * const ia64_reg_numbers[96] =
     77  1.1  mrg { "r32", "r33", "r34", "r35", "r36", "r37", "r38", "r39",
     78  1.1  mrg   "r40", "r41", "r42", "r43", "r44", "r45", "r46", "r47",
     79  1.1  mrg   "r48", "r49", "r50", "r51", "r52", "r53", "r54", "r55",
     80  1.1  mrg   "r56", "r57", "r58", "r59", "r60", "r61", "r62", "r63",
     81  1.1  mrg   "r64", "r65", "r66", "r67", "r68", "r69", "r70", "r71",
     82  1.1  mrg   "r72", "r73", "r74", "r75", "r76", "r77", "r78", "r79",
     83  1.1  mrg   "r80", "r81", "r82", "r83", "r84", "r85", "r86", "r87",
     84  1.1  mrg   "r88", "r89", "r90", "r91", "r92", "r93", "r94", "r95",
     85  1.1  mrg   "r96", "r97", "r98", "r99", "r100","r101","r102","r103",
     86  1.1  mrg   "r104","r105","r106","r107","r108","r109","r110","r111",
     87  1.1  mrg   "r112","r113","r114","r115","r116","r117","r118","r119",
     88  1.1  mrg   "r120","r121","r122","r123","r124","r125","r126","r127"};
     89  1.1  mrg 
     90  1.1  mrg /* ??? These strings could be shared with REGISTER_NAMES.  */
     91  1.1  mrg static const char * const ia64_input_reg_names[8] =
     92  1.1  mrg { "in0",  "in1",  "in2",  "in3",  "in4",  "in5",  "in6",  "in7" };
     93  1.1  mrg 
     94  1.1  mrg /* ??? These strings could be shared with REGISTER_NAMES.  */
     95  1.1  mrg static const char * const ia64_local_reg_names[80] =
     96  1.1  mrg { "loc0", "loc1", "loc2", "loc3", "loc4", "loc5", "loc6", "loc7",
     97  1.1  mrg   "loc8", "loc9", "loc10","loc11","loc12","loc13","loc14","loc15",
     98  1.1  mrg   "loc16","loc17","loc18","loc19","loc20","loc21","loc22","loc23",
     99  1.1  mrg   "loc24","loc25","loc26","loc27","loc28","loc29","loc30","loc31",
    100  1.1  mrg   "loc32","loc33","loc34","loc35","loc36","loc37","loc38","loc39",
    101  1.1  mrg   "loc40","loc41","loc42","loc43","loc44","loc45","loc46","loc47",
    102  1.1  mrg   "loc48","loc49","loc50","loc51","loc52","loc53","loc54","loc55",
    103  1.1  mrg   "loc56","loc57","loc58","loc59","loc60","loc61","loc62","loc63",
    104  1.1  mrg   "loc64","loc65","loc66","loc67","loc68","loc69","loc70","loc71",
    105  1.1  mrg   "loc72","loc73","loc74","loc75","loc76","loc77","loc78","loc79" };
    106  1.1  mrg 
    107  1.1  mrg /* ??? These strings could be shared with REGISTER_NAMES.  */
    108  1.1  mrg static const char * const ia64_output_reg_names[8] =
    109  1.1  mrg { "out0", "out1", "out2", "out3", "out4", "out5", "out6", "out7" };
    110  1.1  mrg 
    111  1.1  mrg /* Variables which are this size or smaller are put in the sdata/sbss
    112  1.1  mrg    sections.  */
    113  1.1  mrg 
    114  1.1  mrg unsigned int ia64_section_threshold;
    115  1.1  mrg 
    116  1.1  mrg /* The following variable is used by the DFA insn scheduler.  The value is
    117  1.1  mrg    TRUE if we do insn bundling instead of insn scheduling.  */
    118  1.1  mrg int bundling_p = 0;
    119  1.1  mrg 
    120  1.1  mrg enum ia64_frame_regs
    121  1.1  mrg {
    122  1.1  mrg    reg_fp,
    123  1.1  mrg    reg_save_b0,
    124  1.1  mrg    reg_save_pr,
    125  1.1  mrg    reg_save_ar_pfs,
    126  1.1  mrg    reg_save_ar_unat,
    127  1.1  mrg    reg_save_ar_lc,
    128  1.1  mrg    reg_save_gp,
    129  1.1  mrg    number_of_ia64_frame_regs
    130  1.1  mrg };
    131  1.1  mrg 
    132  1.1  mrg /* Structure to be filled in by ia64_compute_frame_size with register
    133  1.1  mrg    save masks and offsets for the current function.  */
    134  1.1  mrg 
    135  1.1  mrg struct ia64_frame_info
    136  1.1  mrg {
    137  1.1  mrg   HOST_WIDE_INT total_size;	/* size of the stack frame, not including
    138  1.1  mrg 				   the caller's scratch area.  */
    139  1.1  mrg   HOST_WIDE_INT spill_cfa_off;	/* top of the reg spill area from the cfa.  */
    140  1.1  mrg   HOST_WIDE_INT spill_size;	/* size of the gr/br/fr spill area.  */
    141  1.1  mrg   HOST_WIDE_INT extra_spill_size;  /* size of spill area for others.  */
    142  1.1  mrg   HARD_REG_SET mask;		/* mask of saved registers.  */
    143  1.1  mrg   unsigned int gr_used_mask;	/* mask of registers in use as gr spill
    144  1.1  mrg 				   registers or long-term scratches.  */
    145  1.1  mrg   int n_spilled;		/* number of spilled registers.  */
    146  1.1  mrg   int r[number_of_ia64_frame_regs];  /* Frame related registers.  */
    147  1.1  mrg   int n_input_regs;		/* number of input registers used.  */
    148  1.1  mrg   int n_local_regs;		/* number of local registers used.  */
    149  1.1  mrg   int n_output_regs;		/* number of output registers used.  */
    150  1.1  mrg   int n_rotate_regs;		/* number of rotating registers used.  */
    151  1.1  mrg 
    152  1.1  mrg   char need_regstk;		/* true if a .regstk directive needed.  */
    153  1.1  mrg   char initialized;		/* true if the data is finalized.  */
    154  1.1  mrg };
    155  1.1  mrg 
    156  1.1  mrg /* Current frame information calculated by ia64_compute_frame_size.  */
    157  1.1  mrg static struct ia64_frame_info current_frame_info;
    158  1.1  mrg /* The actual registers that are emitted.  */
    159  1.1  mrg static int emitted_frame_related_regs[number_of_ia64_frame_regs];
    160  1.1  mrg 
    161  1.1  mrg static int ia64_first_cycle_multipass_dfa_lookahead (void);
    163  1.1  mrg static void ia64_dependencies_evaluation_hook (rtx_insn *, rtx_insn *);
    164  1.1  mrg static void ia64_init_dfa_pre_cycle_insn (void);
    165  1.1  mrg static rtx ia64_dfa_pre_cycle_insn (void);
    166  1.1  mrg static int ia64_first_cycle_multipass_dfa_lookahead_guard (rtx_insn *, int);
    167  1.1  mrg static int ia64_dfa_new_cycle (FILE *, int, rtx_insn *, int, int, int *);
    168  1.1  mrg static void ia64_h_i_d_extended (void);
    169  1.1  mrg static void * ia64_alloc_sched_context (void);
    170  1.1  mrg static void ia64_init_sched_context (void *, bool);
    171  1.1  mrg static void ia64_set_sched_context (void *);
    172  1.1  mrg static void ia64_clear_sched_context (void *);
    173  1.1  mrg static void ia64_free_sched_context (void *);
    174  1.1  mrg static int ia64_mode_to_int (machine_mode);
    175  1.1  mrg static void ia64_set_sched_flags (spec_info_t);
    176  1.1  mrg static ds_t ia64_get_insn_spec_ds (rtx_insn *);
    177  1.1  mrg static ds_t ia64_get_insn_checked_ds (rtx_insn *);
    178  1.1  mrg static bool ia64_skip_rtx_p (const_rtx);
    179  1.1  mrg static int ia64_speculate_insn (rtx_insn *, ds_t, rtx *);
    180  1.1  mrg static bool ia64_needs_block_p (ds_t);
    181  1.1  mrg static rtx ia64_gen_spec_check (rtx_insn *, rtx_insn *, ds_t);
    182  1.1  mrg static int ia64_spec_check_p (rtx);
    183  1.1  mrg static int ia64_spec_check_src_p (rtx);
    184  1.1  mrg static rtx gen_tls_get_addr (void);
    185  1.1  mrg static rtx gen_thread_pointer (void);
    186  1.1  mrg static int find_gr_spill (enum ia64_frame_regs, int);
    187  1.1  mrg static int next_scratch_gr_reg (void);
    188  1.1  mrg static void mark_reg_gr_used_mask (rtx, void *);
    189  1.1  mrg static void ia64_compute_frame_size (HOST_WIDE_INT);
    190  1.1  mrg static void setup_spill_pointers (int, rtx, HOST_WIDE_INT);
    191  1.1  mrg static void finish_spill_pointers (void);
    192  1.1  mrg static rtx spill_restore_mem (rtx, HOST_WIDE_INT);
    193  1.1  mrg static void do_spill (rtx (*)(rtx, rtx, rtx), rtx, HOST_WIDE_INT, rtx);
    194  1.1  mrg static void do_restore (rtx (*)(rtx, rtx, rtx), rtx, HOST_WIDE_INT);
    195  1.1  mrg static rtx gen_movdi_x (rtx, rtx, rtx);
    196  1.1  mrg static rtx gen_fr_spill_x (rtx, rtx, rtx);
    197  1.1  mrg static rtx gen_fr_restore_x (rtx, rtx, rtx);
    198  1.1  mrg 
    199  1.1  mrg static void ia64_option_override (void);
    200  1.1  mrg static bool ia64_can_eliminate (const int, const int);
    201  1.1  mrg static machine_mode hfa_element_mode (const_tree, bool);
    202  1.1  mrg static void ia64_setup_incoming_varargs (cumulative_args_t,
    203  1.1  mrg 					 const function_arg_info &,
    204  1.1  mrg 					 int *, int);
    205  1.1  mrg static int ia64_arg_partial_bytes (cumulative_args_t,
    206  1.1  mrg 				   const function_arg_info &);
    207  1.1  mrg static rtx ia64_function_arg (cumulative_args_t, const function_arg_info &);
    208  1.1  mrg static rtx ia64_function_incoming_arg (cumulative_args_t,
    209  1.1  mrg 				       const function_arg_info &);
    210  1.1  mrg static void ia64_function_arg_advance (cumulative_args_t,
    211  1.1  mrg 				       const function_arg_info &);
    212  1.1  mrg static pad_direction ia64_function_arg_padding (machine_mode, const_tree);
    213  1.1  mrg static unsigned int ia64_function_arg_boundary (machine_mode,
    214  1.1  mrg 						const_tree);
    215  1.1  mrg static bool ia64_function_ok_for_sibcall (tree, tree);
    216  1.1  mrg static bool ia64_return_in_memory (const_tree, const_tree);
    217  1.1  mrg static rtx ia64_function_value (const_tree, const_tree, bool);
    218  1.1  mrg static rtx ia64_libcall_value (machine_mode, const_rtx);
    219  1.1  mrg static bool ia64_function_value_regno_p (const unsigned int);
    220  1.1  mrg static int ia64_register_move_cost (machine_mode, reg_class_t,
    221  1.1  mrg                                     reg_class_t);
    222  1.1  mrg static int ia64_memory_move_cost (machine_mode mode, reg_class_t,
    223  1.1  mrg 				  bool);
    224  1.1  mrg static bool ia64_rtx_costs (rtx, machine_mode, int, int, int *, bool);
    225  1.1  mrg static int ia64_unspec_may_trap_p (const_rtx, unsigned);
    226  1.1  mrg static void fix_range (const char *);
    227  1.1  mrg static struct machine_function * ia64_init_machine_status (void);
    228  1.1  mrg static void emit_insn_group_barriers (FILE *);
    229  1.1  mrg static void emit_all_insn_group_barriers (FILE *);
    230  1.1  mrg static void final_emit_insn_group_barriers (FILE *);
    231  1.1  mrg static void emit_predicate_relation_info (void);
    232  1.1  mrg static void ia64_reorg (void);
    233  1.1  mrg static bool ia64_in_small_data_p (const_tree);
    234  1.1  mrg static void process_epilogue (FILE *, rtx, bool, bool);
    235  1.1  mrg 
    236  1.1  mrg static bool ia64_assemble_integer (rtx, unsigned int, int);
    237  1.1  mrg static void ia64_output_function_prologue (FILE *);
    238  1.1  mrg static void ia64_output_function_epilogue (FILE *);
    239  1.1  mrg static void ia64_output_function_end_prologue (FILE *);
    240  1.1  mrg 
    241  1.1  mrg static void ia64_print_operand (FILE *, rtx, int);
    242  1.1  mrg static void ia64_print_operand_address (FILE *, machine_mode, rtx);
    243  1.1  mrg static bool ia64_print_operand_punct_valid_p (unsigned char code);
    244  1.1  mrg 
    245  1.1  mrg static int ia64_issue_rate (void);
    246  1.1  mrg static int ia64_adjust_cost (rtx_insn *, int, rtx_insn *, int, dw_t);
    247  1.1  mrg static void ia64_sched_init (FILE *, int, int);
    248  1.1  mrg static void ia64_sched_init_global (FILE *, int, int);
    249  1.1  mrg static void ia64_sched_finish_global (FILE *, int);
    250  1.1  mrg static void ia64_sched_finish (FILE *, int);
    251  1.1  mrg static int ia64_dfa_sched_reorder (FILE *, int, rtx_insn **, int *, int, int);
    252  1.1  mrg static int ia64_sched_reorder (FILE *, int, rtx_insn **, int *, int);
    253  1.1  mrg static int ia64_sched_reorder2 (FILE *, int, rtx_insn **, int *, int);
    254  1.1  mrg static int ia64_variable_issue (FILE *, int, rtx_insn *, int);
    255  1.1  mrg 
    256  1.1  mrg static void ia64_asm_unwind_emit (FILE *, rtx_insn *);
    257  1.1  mrg static void ia64_asm_emit_except_personality (rtx);
    258  1.1  mrg static void ia64_asm_init_sections (void);
    259  1.1  mrg 
    260  1.1  mrg static enum unwind_info_type ia64_debug_unwind_info (void);
    261  1.1  mrg 
    262  1.1  mrg static struct bundle_state *get_free_bundle_state (void);
    263  1.1  mrg static void free_bundle_state (struct bundle_state *);
    264  1.1  mrg static void initiate_bundle_states (void);
    265  1.1  mrg static void finish_bundle_states (void);
    266  1.1  mrg static int insert_bundle_state (struct bundle_state *);
    267  1.1  mrg static void initiate_bundle_state_table (void);
    268  1.1  mrg static void finish_bundle_state_table (void);
    269  1.1  mrg static int try_issue_nops (struct bundle_state *, int);
    270  1.1  mrg static int try_issue_insn (struct bundle_state *, rtx);
    271  1.1  mrg static void issue_nops_and_insn (struct bundle_state *, int, rtx_insn *,
    272  1.1  mrg 				 int, int);
    273  1.1  mrg static int get_max_pos (state_t);
    274  1.1  mrg static int get_template (state_t, int);
    275  1.1  mrg 
    276  1.1  mrg static rtx_insn *get_next_important_insn (rtx_insn *, rtx_insn *);
    277  1.1  mrg static bool important_for_bundling_p (rtx_insn *);
    278  1.1  mrg static bool unknown_for_bundling_p (rtx_insn *);
    279  1.1  mrg static void bundling (FILE *, int, rtx_insn *, rtx_insn *);
    280  1.1  mrg 
    281  1.1  mrg static void ia64_output_mi_thunk (FILE *, tree, HOST_WIDE_INT,
    282  1.1  mrg 				  HOST_WIDE_INT, tree);
    283  1.1  mrg static void ia64_file_start (void);
    284  1.1  mrg static void ia64_globalize_decl_name (FILE *, tree);
    285  1.1  mrg 
    286  1.1  mrg static int ia64_hpux_reloc_rw_mask (void) ATTRIBUTE_UNUSED;
    287  1.1  mrg static int ia64_reloc_rw_mask (void) ATTRIBUTE_UNUSED;
    288  1.1  mrg static section *ia64_select_rtx_section (machine_mode, rtx,
    289  1.1  mrg 					 unsigned HOST_WIDE_INT);
    290  1.1  mrg static void ia64_output_dwarf_dtprel (FILE *, int, rtx)
    291  1.1  mrg      ATTRIBUTE_UNUSED;
    292  1.1  mrg static unsigned int ia64_section_type_flags (tree, const char *, int);
    293  1.1  mrg static void ia64_init_libfuncs (void)
    294  1.1  mrg      ATTRIBUTE_UNUSED;
    295  1.1  mrg static void ia64_hpux_init_libfuncs (void)
    296  1.1  mrg      ATTRIBUTE_UNUSED;
    297  1.1  mrg static void ia64_sysv4_init_libfuncs (void)
    298  1.1  mrg      ATTRIBUTE_UNUSED;
    299  1.1  mrg static void ia64_vms_init_libfuncs (void)
    300  1.1  mrg      ATTRIBUTE_UNUSED;
    301  1.1  mrg static void ia64_soft_fp_init_libfuncs (void)
    302  1.1  mrg      ATTRIBUTE_UNUSED;
    303  1.1  mrg static bool ia64_vms_valid_pointer_mode (scalar_int_mode mode)
    304  1.1  mrg      ATTRIBUTE_UNUSED;
    305  1.1  mrg static tree ia64_vms_common_object_attribute (tree *, tree, tree, int, bool *)
    306  1.1  mrg      ATTRIBUTE_UNUSED;
    307  1.1  mrg 
    308  1.1  mrg static bool ia64_attribute_takes_identifier_p (const_tree);
    309  1.1  mrg static tree ia64_handle_model_attribute (tree *, tree, tree, int, bool *);
    310  1.1  mrg static tree ia64_handle_version_id_attribute (tree *, tree, tree, int, bool *);
    311  1.1  mrg static void ia64_encode_section_info (tree, rtx, int);
    312  1.1  mrg static rtx ia64_struct_value_rtx (tree, int);
    313  1.1  mrg static tree ia64_gimplify_va_arg (tree, tree, gimple_seq *, gimple_seq *);
    314  1.1  mrg static bool ia64_scalar_mode_supported_p (scalar_mode mode);
    315  1.1  mrg static bool ia64_vector_mode_supported_p (machine_mode mode);
    316  1.1  mrg static bool ia64_legitimate_constant_p (machine_mode, rtx);
    317  1.1  mrg static bool ia64_legitimate_address_p (machine_mode, rtx, bool);
    318  1.1  mrg static bool ia64_cannot_force_const_mem (machine_mode, rtx);
    319  1.1  mrg static const char *ia64_mangle_type (const_tree);
    320  1.1  mrg static const char *ia64_invalid_conversion (const_tree, const_tree);
    321  1.1  mrg static const char *ia64_invalid_unary_op (int, const_tree);
    322  1.1  mrg static const char *ia64_invalid_binary_op (int, const_tree, const_tree);
    323  1.1  mrg static machine_mode ia64_c_mode_for_suffix (char);
    324  1.1  mrg static void ia64_trampoline_init (rtx, tree, rtx);
    325  1.1  mrg static void ia64_override_options_after_change (void);
    326  1.1  mrg static bool ia64_member_type_forces_blk (const_tree, machine_mode);
    327  1.1  mrg 
    328  1.1  mrg static tree ia64_fold_builtin (tree, int, tree *, bool);
    329  1.1  mrg static tree ia64_builtin_decl (unsigned, bool);
    330  1.1  mrg 
    331  1.1  mrg static reg_class_t ia64_preferred_reload_class (rtx, reg_class_t);
    332  1.1  mrg static fixed_size_mode ia64_get_reg_raw_mode (int regno);
    333  1.1  mrg static section * ia64_hpux_function_section (tree, enum node_frequency,
    334  1.1  mrg 					     bool, bool);
    335  1.1  mrg 
    336  1.1  mrg static bool ia64_vectorize_vec_perm_const (machine_mode, rtx, rtx, rtx,
    337  1.1  mrg 					   const vec_perm_indices &);
    338  1.1  mrg 
    339  1.1  mrg static unsigned int ia64_hard_regno_nregs (unsigned int, machine_mode);
    340  1.1  mrg static bool ia64_hard_regno_mode_ok (unsigned int, machine_mode);
    341  1.1  mrg static bool ia64_modes_tieable_p (machine_mode, machine_mode);
    342  1.1  mrg static bool ia64_can_change_mode_class (machine_mode, machine_mode,
    343  1.1  mrg 					reg_class_t);
    344  1.1  mrg 
    345  1.1  mrg #define MAX_VECT_LEN	8
    346  1.1  mrg 
    347  1.1  mrg struct expand_vec_perm_d
    348  1.1  mrg {
    349  1.1  mrg   rtx target, op0, op1;
    350  1.1  mrg   unsigned char perm[MAX_VECT_LEN];
    351  1.1  mrg   machine_mode vmode;
    352  1.1  mrg   unsigned char nelt;
    353  1.1  mrg   bool one_operand_p;
    354  1.1  mrg   bool testing_p;
    355  1.1  mrg };
    356  1.1  mrg 
    357  1.1  mrg static bool ia64_expand_vec_perm_const_1 (struct expand_vec_perm_d *d);
    358  1.1  mrg 
    359  1.1  mrg 
    360  1.1  mrg /* Table of valid machine attributes.  */
    362  1.1  mrg static const struct attribute_spec ia64_attribute_table[] =
    363  1.1  mrg {
    364  1.1  mrg   /* { name, min_len, max_len, decl_req, type_req, fn_type_req,
    365  1.1  mrg        affects_type_identity, handler, exclude } */
    366  1.1  mrg   { "syscall_linkage", 0, 0, false, true,  true,  false, NULL, NULL },
    367  1.1  mrg   { "model",	       1, 1, true, false, false,  false,
    368  1.1  mrg     ia64_handle_model_attribute, NULL },
    369  1.1  mrg #if TARGET_ABI_OPEN_VMS
    370  1.1  mrg   { "common_object",   1, 1, true, false, false, false,
    371  1.1  mrg     ia64_vms_common_object_attribute, NULL },
    372  1.1  mrg #endif
    373  1.1  mrg   { "version_id",      1, 1, true, false, false, false,
    374  1.1  mrg     ia64_handle_version_id_attribute, NULL },
    375  1.1  mrg   { NULL,	       0, 0, false, false, false, false, NULL, NULL }
    376  1.1  mrg };
    377  1.1  mrg 
    378  1.1  mrg /* Initialize the GCC target structure.  */
    379  1.1  mrg #undef TARGET_ATTRIBUTE_TABLE
    380  1.1  mrg #define TARGET_ATTRIBUTE_TABLE ia64_attribute_table
    381  1.1  mrg 
    382  1.1  mrg #undef TARGET_INIT_BUILTINS
    383  1.1  mrg #define TARGET_INIT_BUILTINS ia64_init_builtins
    384  1.1  mrg 
    385  1.1  mrg #undef TARGET_FOLD_BUILTIN
    386  1.1  mrg #define TARGET_FOLD_BUILTIN ia64_fold_builtin
    387  1.1  mrg 
    388  1.1  mrg #undef TARGET_EXPAND_BUILTIN
    389  1.1  mrg #define TARGET_EXPAND_BUILTIN ia64_expand_builtin
    390  1.1  mrg 
    391  1.1  mrg #undef TARGET_BUILTIN_DECL
    392  1.1  mrg #define TARGET_BUILTIN_DECL ia64_builtin_decl
    393  1.1  mrg 
    394  1.1  mrg #undef TARGET_ASM_BYTE_OP
    395  1.1  mrg #define TARGET_ASM_BYTE_OP "\tdata1\t"
    396  1.1  mrg #undef TARGET_ASM_ALIGNED_HI_OP
    397  1.1  mrg #define TARGET_ASM_ALIGNED_HI_OP "\tdata2\t"
    398  1.1  mrg #undef TARGET_ASM_ALIGNED_SI_OP
    399  1.1  mrg #define TARGET_ASM_ALIGNED_SI_OP "\tdata4\t"
    400  1.1  mrg #undef TARGET_ASM_ALIGNED_DI_OP
    401  1.1  mrg #define TARGET_ASM_ALIGNED_DI_OP "\tdata8\t"
    402  1.1  mrg #undef TARGET_ASM_UNALIGNED_HI_OP
    403  1.1  mrg #define TARGET_ASM_UNALIGNED_HI_OP "\tdata2.ua\t"
    404  1.1  mrg #undef TARGET_ASM_UNALIGNED_SI_OP
    405  1.1  mrg #define TARGET_ASM_UNALIGNED_SI_OP "\tdata4.ua\t"
    406  1.1  mrg #undef TARGET_ASM_UNALIGNED_DI_OP
    407  1.1  mrg #define TARGET_ASM_UNALIGNED_DI_OP "\tdata8.ua\t"
    408  1.1  mrg #undef TARGET_ASM_INTEGER
    409  1.1  mrg #define TARGET_ASM_INTEGER ia64_assemble_integer
    410  1.1  mrg 
    411  1.1  mrg #undef TARGET_OPTION_OVERRIDE
    412  1.1  mrg #define TARGET_OPTION_OVERRIDE ia64_option_override
    413  1.1  mrg 
    414  1.1  mrg #undef TARGET_ASM_FUNCTION_PROLOGUE
    415  1.1  mrg #define TARGET_ASM_FUNCTION_PROLOGUE ia64_output_function_prologue
    416  1.1  mrg #undef TARGET_ASM_FUNCTION_END_PROLOGUE
    417  1.1  mrg #define TARGET_ASM_FUNCTION_END_PROLOGUE ia64_output_function_end_prologue
    418  1.1  mrg #undef TARGET_ASM_FUNCTION_EPILOGUE
    419  1.1  mrg #define TARGET_ASM_FUNCTION_EPILOGUE ia64_output_function_epilogue
    420  1.1  mrg 
    421  1.1  mrg #undef TARGET_PRINT_OPERAND
    422  1.1  mrg #define TARGET_PRINT_OPERAND ia64_print_operand
    423  1.1  mrg #undef TARGET_PRINT_OPERAND_ADDRESS
    424  1.1  mrg #define TARGET_PRINT_OPERAND_ADDRESS ia64_print_operand_address
    425  1.1  mrg #undef TARGET_PRINT_OPERAND_PUNCT_VALID_P
    426  1.1  mrg #define TARGET_PRINT_OPERAND_PUNCT_VALID_P ia64_print_operand_punct_valid_p
    427  1.1  mrg 
    428  1.1  mrg #undef TARGET_IN_SMALL_DATA_P
    429  1.1  mrg #define TARGET_IN_SMALL_DATA_P  ia64_in_small_data_p
    430  1.1  mrg 
    431  1.1  mrg #undef TARGET_SCHED_ADJUST_COST
    432  1.1  mrg #define TARGET_SCHED_ADJUST_COST ia64_adjust_cost
    433  1.1  mrg #undef TARGET_SCHED_ISSUE_RATE
    434  1.1  mrg #define TARGET_SCHED_ISSUE_RATE ia64_issue_rate
    435  1.1  mrg #undef TARGET_SCHED_VARIABLE_ISSUE
    436  1.1  mrg #define TARGET_SCHED_VARIABLE_ISSUE ia64_variable_issue
    437  1.1  mrg #undef TARGET_SCHED_INIT
    438  1.1  mrg #define TARGET_SCHED_INIT ia64_sched_init
    439  1.1  mrg #undef TARGET_SCHED_FINISH
    440  1.1  mrg #define TARGET_SCHED_FINISH ia64_sched_finish
    441  1.1  mrg #undef TARGET_SCHED_INIT_GLOBAL
    442  1.1  mrg #define TARGET_SCHED_INIT_GLOBAL ia64_sched_init_global
    443  1.1  mrg #undef TARGET_SCHED_FINISH_GLOBAL
    444  1.1  mrg #define TARGET_SCHED_FINISH_GLOBAL ia64_sched_finish_global
    445  1.1  mrg #undef TARGET_SCHED_REORDER
    446  1.1  mrg #define TARGET_SCHED_REORDER ia64_sched_reorder
    447  1.1  mrg #undef TARGET_SCHED_REORDER2
    448  1.1  mrg #define TARGET_SCHED_REORDER2 ia64_sched_reorder2
    449  1.1  mrg 
    450  1.1  mrg #undef TARGET_SCHED_DEPENDENCIES_EVALUATION_HOOK
    451  1.1  mrg #define TARGET_SCHED_DEPENDENCIES_EVALUATION_HOOK ia64_dependencies_evaluation_hook
    452  1.1  mrg 
    453  1.1  mrg #undef TARGET_SCHED_FIRST_CYCLE_MULTIPASS_DFA_LOOKAHEAD
    454  1.1  mrg #define TARGET_SCHED_FIRST_CYCLE_MULTIPASS_DFA_LOOKAHEAD ia64_first_cycle_multipass_dfa_lookahead
    455  1.1  mrg 
    456  1.1  mrg #undef TARGET_SCHED_INIT_DFA_PRE_CYCLE_INSN
    457  1.1  mrg #define TARGET_SCHED_INIT_DFA_PRE_CYCLE_INSN ia64_init_dfa_pre_cycle_insn
    458  1.1  mrg #undef TARGET_SCHED_DFA_PRE_CYCLE_INSN
    459  1.1  mrg #define TARGET_SCHED_DFA_PRE_CYCLE_INSN ia64_dfa_pre_cycle_insn
    460  1.1  mrg 
    461  1.1  mrg #undef TARGET_SCHED_FIRST_CYCLE_MULTIPASS_DFA_LOOKAHEAD_GUARD
    462  1.1  mrg #define TARGET_SCHED_FIRST_CYCLE_MULTIPASS_DFA_LOOKAHEAD_GUARD\
    463  1.1  mrg   ia64_first_cycle_multipass_dfa_lookahead_guard
    464  1.1  mrg 
    465  1.1  mrg #undef TARGET_SCHED_DFA_NEW_CYCLE
    466  1.1  mrg #define TARGET_SCHED_DFA_NEW_CYCLE ia64_dfa_new_cycle
    467  1.1  mrg 
    468  1.1  mrg #undef TARGET_SCHED_H_I_D_EXTENDED
    469  1.1  mrg #define TARGET_SCHED_H_I_D_EXTENDED ia64_h_i_d_extended
    470  1.1  mrg 
    471  1.1  mrg #undef TARGET_SCHED_ALLOC_SCHED_CONTEXT
    472  1.1  mrg #define TARGET_SCHED_ALLOC_SCHED_CONTEXT ia64_alloc_sched_context
    473  1.1  mrg 
    474  1.1  mrg #undef TARGET_SCHED_INIT_SCHED_CONTEXT
    475  1.1  mrg #define TARGET_SCHED_INIT_SCHED_CONTEXT ia64_init_sched_context
    476  1.1  mrg 
    477  1.1  mrg #undef TARGET_SCHED_SET_SCHED_CONTEXT
    478  1.1  mrg #define TARGET_SCHED_SET_SCHED_CONTEXT ia64_set_sched_context
    479  1.1  mrg 
    480  1.1  mrg #undef TARGET_SCHED_CLEAR_SCHED_CONTEXT
    481  1.1  mrg #define TARGET_SCHED_CLEAR_SCHED_CONTEXT ia64_clear_sched_context
    482  1.1  mrg 
    483  1.1  mrg #undef TARGET_SCHED_FREE_SCHED_CONTEXT
    484  1.1  mrg #define TARGET_SCHED_FREE_SCHED_CONTEXT ia64_free_sched_context
    485  1.1  mrg 
    486  1.1  mrg #undef TARGET_SCHED_SET_SCHED_FLAGS
    487  1.1  mrg #define TARGET_SCHED_SET_SCHED_FLAGS ia64_set_sched_flags
    488  1.1  mrg 
    489  1.1  mrg #undef TARGET_SCHED_GET_INSN_SPEC_DS
    490  1.1  mrg #define TARGET_SCHED_GET_INSN_SPEC_DS ia64_get_insn_spec_ds
    491  1.1  mrg 
    492  1.1  mrg #undef TARGET_SCHED_GET_INSN_CHECKED_DS
    493  1.1  mrg #define TARGET_SCHED_GET_INSN_CHECKED_DS ia64_get_insn_checked_ds
    494  1.1  mrg 
    495  1.1  mrg #undef TARGET_SCHED_SPECULATE_INSN
    496  1.1  mrg #define TARGET_SCHED_SPECULATE_INSN ia64_speculate_insn
    497  1.1  mrg 
    498  1.1  mrg #undef TARGET_SCHED_NEEDS_BLOCK_P
    499  1.1  mrg #define TARGET_SCHED_NEEDS_BLOCK_P ia64_needs_block_p
    500  1.1  mrg 
    501  1.1  mrg #undef TARGET_SCHED_GEN_SPEC_CHECK
    502  1.1  mrg #define TARGET_SCHED_GEN_SPEC_CHECK ia64_gen_spec_check
    503  1.1  mrg 
    504  1.1  mrg #undef TARGET_SCHED_SKIP_RTX_P
    505  1.1  mrg #define TARGET_SCHED_SKIP_RTX_P ia64_skip_rtx_p
    506  1.1  mrg 
    507  1.1  mrg #undef TARGET_FUNCTION_OK_FOR_SIBCALL
    508  1.1  mrg #define TARGET_FUNCTION_OK_FOR_SIBCALL ia64_function_ok_for_sibcall
    509  1.1  mrg #undef TARGET_ARG_PARTIAL_BYTES
    510  1.1  mrg #define TARGET_ARG_PARTIAL_BYTES ia64_arg_partial_bytes
    511  1.1  mrg #undef TARGET_FUNCTION_ARG
    512  1.1  mrg #define TARGET_FUNCTION_ARG ia64_function_arg
    513  1.1  mrg #undef TARGET_FUNCTION_INCOMING_ARG
    514  1.1  mrg #define TARGET_FUNCTION_INCOMING_ARG ia64_function_incoming_arg
    515  1.1  mrg #undef TARGET_FUNCTION_ARG_ADVANCE
    516  1.1  mrg #define TARGET_FUNCTION_ARG_ADVANCE ia64_function_arg_advance
    517  1.1  mrg #undef TARGET_FUNCTION_ARG_PADDING
    518  1.1  mrg #define TARGET_FUNCTION_ARG_PADDING ia64_function_arg_padding
    519  1.1  mrg #undef TARGET_FUNCTION_ARG_BOUNDARY
    520  1.1  mrg #define TARGET_FUNCTION_ARG_BOUNDARY ia64_function_arg_boundary
    521  1.1  mrg 
    522  1.1  mrg #undef TARGET_ASM_OUTPUT_MI_THUNK
    523  1.1  mrg #define TARGET_ASM_OUTPUT_MI_THUNK ia64_output_mi_thunk
    524  1.1  mrg #undef TARGET_ASM_CAN_OUTPUT_MI_THUNK
    525  1.1  mrg #define TARGET_ASM_CAN_OUTPUT_MI_THUNK hook_bool_const_tree_hwi_hwi_const_tree_true
    526  1.1  mrg 
    527  1.1  mrg #undef TARGET_ASM_FILE_START
    528  1.1  mrg #define TARGET_ASM_FILE_START ia64_file_start
    529  1.1  mrg 
    530  1.1  mrg #undef TARGET_ASM_GLOBALIZE_DECL_NAME
    531  1.1  mrg #define TARGET_ASM_GLOBALIZE_DECL_NAME ia64_globalize_decl_name
    532  1.1  mrg 
    533  1.1  mrg #undef TARGET_REGISTER_MOVE_COST
    534  1.1  mrg #define TARGET_REGISTER_MOVE_COST ia64_register_move_cost
    535  1.1  mrg #undef TARGET_MEMORY_MOVE_COST
    536  1.1  mrg #define TARGET_MEMORY_MOVE_COST ia64_memory_move_cost
    537  1.1  mrg #undef TARGET_RTX_COSTS
    538  1.1  mrg #define TARGET_RTX_COSTS ia64_rtx_costs
    539  1.1  mrg #undef TARGET_ADDRESS_COST
    540  1.1  mrg #define TARGET_ADDRESS_COST hook_int_rtx_mode_as_bool_0
    541  1.1  mrg 
    542  1.1  mrg #undef TARGET_UNSPEC_MAY_TRAP_P
    543  1.1  mrg #define TARGET_UNSPEC_MAY_TRAP_P ia64_unspec_may_trap_p
    544  1.1  mrg 
    545  1.1  mrg #undef TARGET_MACHINE_DEPENDENT_REORG
    546  1.1  mrg #define TARGET_MACHINE_DEPENDENT_REORG ia64_reorg
    547  1.1  mrg 
    548  1.1  mrg #undef TARGET_ENCODE_SECTION_INFO
    549  1.1  mrg #define TARGET_ENCODE_SECTION_INFO ia64_encode_section_info
    550  1.1  mrg 
    551  1.1  mrg #undef  TARGET_SECTION_TYPE_FLAGS
    552  1.1  mrg #define TARGET_SECTION_TYPE_FLAGS  ia64_section_type_flags
    553  1.1  mrg 
    554  1.1  mrg #ifdef HAVE_AS_TLS
    555  1.1  mrg #undef TARGET_ASM_OUTPUT_DWARF_DTPREL
    556  1.1  mrg #define TARGET_ASM_OUTPUT_DWARF_DTPREL ia64_output_dwarf_dtprel
    557  1.1  mrg #endif
    558  1.1  mrg 
    559  1.1  mrg /* ??? Investigate.  */
    560  1.1  mrg #if 0
    561  1.1  mrg #undef TARGET_PROMOTE_PROTOTYPES
    562  1.1  mrg #define TARGET_PROMOTE_PROTOTYPES hook_bool_tree_true
    563  1.1  mrg #endif
    564  1.1  mrg 
    565  1.1  mrg #undef TARGET_FUNCTION_VALUE
    566  1.1  mrg #define TARGET_FUNCTION_VALUE ia64_function_value
    567  1.1  mrg #undef TARGET_LIBCALL_VALUE
    568  1.1  mrg #define TARGET_LIBCALL_VALUE ia64_libcall_value
    569  1.1  mrg #undef TARGET_FUNCTION_VALUE_REGNO_P
    570  1.1  mrg #define TARGET_FUNCTION_VALUE_REGNO_P ia64_function_value_regno_p
    571  1.1  mrg 
    572  1.1  mrg #undef TARGET_STRUCT_VALUE_RTX
    573  1.1  mrg #define TARGET_STRUCT_VALUE_RTX ia64_struct_value_rtx
    574  1.1  mrg #undef TARGET_RETURN_IN_MEMORY
    575  1.1  mrg #define TARGET_RETURN_IN_MEMORY ia64_return_in_memory
    576  1.1  mrg #undef TARGET_SETUP_INCOMING_VARARGS
    577  1.1  mrg #define TARGET_SETUP_INCOMING_VARARGS ia64_setup_incoming_varargs
    578  1.1  mrg #undef TARGET_STRICT_ARGUMENT_NAMING
    579  1.1  mrg #define TARGET_STRICT_ARGUMENT_NAMING hook_bool_CUMULATIVE_ARGS_true
    580  1.1  mrg #undef TARGET_MUST_PASS_IN_STACK
    581  1.1  mrg #define TARGET_MUST_PASS_IN_STACK must_pass_in_stack_var_size
    582  1.1  mrg #undef TARGET_GET_RAW_RESULT_MODE
    583  1.1  mrg #define TARGET_GET_RAW_RESULT_MODE ia64_get_reg_raw_mode
    584  1.1  mrg #undef TARGET_GET_RAW_ARG_MODE
    585  1.1  mrg #define TARGET_GET_RAW_ARG_MODE ia64_get_reg_raw_mode
    586  1.1  mrg 
    587  1.1  mrg #undef TARGET_MEMBER_TYPE_FORCES_BLK
    588  1.1  mrg #define TARGET_MEMBER_TYPE_FORCES_BLK ia64_member_type_forces_blk
    589  1.1  mrg 
    590  1.1  mrg #undef TARGET_GIMPLIFY_VA_ARG_EXPR
    591  1.1  mrg #define TARGET_GIMPLIFY_VA_ARG_EXPR ia64_gimplify_va_arg
    592  1.1  mrg 
    593  1.1  mrg #undef TARGET_ASM_UNWIND_EMIT
    594  1.1  mrg #define TARGET_ASM_UNWIND_EMIT ia64_asm_unwind_emit
    595  1.1  mrg #undef TARGET_ASM_EMIT_EXCEPT_PERSONALITY
    596  1.1  mrg #define TARGET_ASM_EMIT_EXCEPT_PERSONALITY  ia64_asm_emit_except_personality
    597  1.1  mrg #undef TARGET_ASM_INIT_SECTIONS
    598  1.1  mrg #define TARGET_ASM_INIT_SECTIONS  ia64_asm_init_sections
    599  1.1  mrg 
    600  1.1  mrg #undef TARGET_DEBUG_UNWIND_INFO
    601  1.1  mrg #define TARGET_DEBUG_UNWIND_INFO  ia64_debug_unwind_info
    602  1.1  mrg 
    603  1.1  mrg #undef TARGET_SCALAR_MODE_SUPPORTED_P
    604  1.1  mrg #define TARGET_SCALAR_MODE_SUPPORTED_P ia64_scalar_mode_supported_p
    605  1.1  mrg #undef TARGET_VECTOR_MODE_SUPPORTED_P
    606  1.1  mrg #define TARGET_VECTOR_MODE_SUPPORTED_P ia64_vector_mode_supported_p
    607  1.1  mrg 
    608  1.1  mrg #undef TARGET_LEGITIMATE_CONSTANT_P
    609  1.1  mrg #define TARGET_LEGITIMATE_CONSTANT_P ia64_legitimate_constant_p
    610  1.1  mrg #undef TARGET_LEGITIMATE_ADDRESS_P
    611  1.1  mrg #define TARGET_LEGITIMATE_ADDRESS_P ia64_legitimate_address_p
    612  1.1  mrg 
    613  1.1  mrg #undef TARGET_LRA_P
    614  1.1  mrg #define TARGET_LRA_P hook_bool_void_false
    615  1.1  mrg 
    616  1.1  mrg #undef TARGET_CANNOT_FORCE_CONST_MEM
    617  1.1  mrg #define TARGET_CANNOT_FORCE_CONST_MEM ia64_cannot_force_const_mem
    618  1.1  mrg 
    619  1.1  mrg #undef TARGET_MANGLE_TYPE
    620  1.1  mrg #define TARGET_MANGLE_TYPE ia64_mangle_type
    621  1.1  mrg 
    622  1.1  mrg #undef TARGET_INVALID_CONVERSION
    623  1.1  mrg #define TARGET_INVALID_CONVERSION ia64_invalid_conversion
    624  1.1  mrg #undef TARGET_INVALID_UNARY_OP
    625  1.1  mrg #define TARGET_INVALID_UNARY_OP ia64_invalid_unary_op
    626  1.1  mrg #undef TARGET_INVALID_BINARY_OP
    627  1.1  mrg #define TARGET_INVALID_BINARY_OP ia64_invalid_binary_op
    628  1.1  mrg 
    629  1.1  mrg #undef TARGET_C_MODE_FOR_SUFFIX
    630  1.1  mrg #define TARGET_C_MODE_FOR_SUFFIX ia64_c_mode_for_suffix
    631  1.1  mrg 
    632  1.1  mrg #undef TARGET_CAN_ELIMINATE
    633  1.1  mrg #define TARGET_CAN_ELIMINATE ia64_can_eliminate
    634  1.1  mrg 
    635  1.1  mrg #undef TARGET_TRAMPOLINE_INIT
    636  1.1  mrg #define TARGET_TRAMPOLINE_INIT ia64_trampoline_init
    637  1.1  mrg 
    638  1.1  mrg #undef TARGET_CAN_USE_DOLOOP_P
    639  1.1  mrg #define TARGET_CAN_USE_DOLOOP_P can_use_doloop_if_innermost
    640  1.1  mrg #undef TARGET_INVALID_WITHIN_DOLOOP
    641  1.1  mrg #define TARGET_INVALID_WITHIN_DOLOOP hook_constcharptr_const_rtx_insn_null
    642  1.1  mrg 
    643  1.1  mrg #undef TARGET_OVERRIDE_OPTIONS_AFTER_CHANGE
    644  1.1  mrg #define TARGET_OVERRIDE_OPTIONS_AFTER_CHANGE ia64_override_options_after_change
    645  1.1  mrg 
    646  1.1  mrg #undef TARGET_PREFERRED_RELOAD_CLASS
    647  1.1  mrg #define TARGET_PREFERRED_RELOAD_CLASS ia64_preferred_reload_class
    648  1.1  mrg 
    649  1.1  mrg #undef TARGET_DELAY_SCHED2
    650  1.1  mrg #define TARGET_DELAY_SCHED2 true
    651  1.1  mrg 
    652  1.1  mrg /* Variable tracking should be run after all optimizations which
    653  1.1  mrg    change order of insns.  It also needs a valid CFG.  */
    654  1.1  mrg #undef TARGET_DELAY_VARTRACK
    655  1.1  mrg #define TARGET_DELAY_VARTRACK true
    656  1.1  mrg 
    657  1.1  mrg #undef TARGET_VECTORIZE_VEC_PERM_CONST
    658  1.1  mrg #define TARGET_VECTORIZE_VEC_PERM_CONST ia64_vectorize_vec_perm_const
    659  1.1  mrg 
    660  1.1  mrg #undef TARGET_ATTRIBUTE_TAKES_IDENTIFIER_P
    661  1.1  mrg #define TARGET_ATTRIBUTE_TAKES_IDENTIFIER_P ia64_attribute_takes_identifier_p
    662  1.1  mrg 
    663  1.1  mrg #undef TARGET_CUSTOM_FUNCTION_DESCRIPTORS
    664  1.1  mrg #define TARGET_CUSTOM_FUNCTION_DESCRIPTORS 0
    665  1.1  mrg 
    666  1.1  mrg #undef TARGET_HARD_REGNO_NREGS
    667  1.1  mrg #define TARGET_HARD_REGNO_NREGS ia64_hard_regno_nregs
    668  1.1  mrg #undef TARGET_HARD_REGNO_MODE_OK
    669  1.1  mrg #define TARGET_HARD_REGNO_MODE_OK ia64_hard_regno_mode_ok
    670  1.1  mrg 
    671  1.1  mrg #undef TARGET_MODES_TIEABLE_P
    672  1.1  mrg #define TARGET_MODES_TIEABLE_P ia64_modes_tieable_p
    673  1.1  mrg 
    674  1.1  mrg #undef TARGET_CAN_CHANGE_MODE_CLASS
    675  1.1  mrg #define TARGET_CAN_CHANGE_MODE_CLASS ia64_can_change_mode_class
    676  1.1  mrg 
    677  1.1  mrg #undef TARGET_CONSTANT_ALIGNMENT
    678  1.1  mrg #define TARGET_CONSTANT_ALIGNMENT constant_alignment_word_strings
    679  1.1  mrg 
    680  1.1  mrg struct gcc_target targetm = TARGET_INITIALIZER;
    681  1.1  mrg 
    682  1.1  mrg /* Returns TRUE iff the target attribute indicated by ATTR_ID takes a plain
    684  1.1  mrg    identifier as an argument, so the front end shouldn't look it up.  */
    685  1.1  mrg 
    686  1.1  mrg static bool
    687  1.1  mrg ia64_attribute_takes_identifier_p (const_tree attr_id)
    688  1.1  mrg {
    689  1.1  mrg   if (is_attribute_p ("model", attr_id))
    690  1.1  mrg     return true;
    691  1.1  mrg #if TARGET_ABI_OPEN_VMS
    692  1.1  mrg   if (is_attribute_p ("common_object", attr_id))
    693  1.1  mrg     return true;
    694  1.1  mrg #endif
    695  1.1  mrg   return false;
    696  1.1  mrg }
    697  1.1  mrg 
    698  1.1  mrg typedef enum
    699  1.1  mrg   {
    700  1.1  mrg     ADDR_AREA_NORMAL,	/* normal address area */
    701  1.1  mrg     ADDR_AREA_SMALL	/* addressable by "addl" (-2MB < addr < 2MB) */
    702  1.1  mrg   }
    703  1.1  mrg ia64_addr_area;
    704  1.1  mrg 
    705  1.1  mrg static GTY(()) tree small_ident1;
    706  1.1  mrg static GTY(()) tree small_ident2;
    707  1.1  mrg 
    708  1.1  mrg static void
    709  1.1  mrg init_idents (void)
    710  1.1  mrg {
    711  1.1  mrg   if (small_ident1 == 0)
    712  1.1  mrg     {
    713  1.1  mrg       small_ident1 = get_identifier ("small");
    714  1.1  mrg       small_ident2 = get_identifier ("__small__");
    715  1.1  mrg     }
    716  1.1  mrg }
    717  1.1  mrg 
    718  1.1  mrg /* Retrieve the address area that has been chosen for the given decl.  */
    719  1.1  mrg 
    720  1.1  mrg static ia64_addr_area
    721  1.1  mrg ia64_get_addr_area (tree decl)
    722  1.1  mrg {
    723  1.1  mrg   tree model_attr;
    724  1.1  mrg 
    725  1.1  mrg   model_attr = lookup_attribute ("model", DECL_ATTRIBUTES (decl));
    726  1.1  mrg   if (model_attr)
    727  1.1  mrg     {
    728  1.1  mrg       tree id;
    729  1.1  mrg 
    730  1.1  mrg       init_idents ();
    731  1.1  mrg       id = TREE_VALUE (TREE_VALUE (model_attr));
    732  1.1  mrg       if (id == small_ident1 || id == small_ident2)
    733  1.1  mrg 	return ADDR_AREA_SMALL;
    734  1.1  mrg     }
    735  1.1  mrg   return ADDR_AREA_NORMAL;
    736  1.1  mrg }
    737  1.1  mrg 
    738  1.1  mrg static tree
    739  1.1  mrg ia64_handle_model_attribute (tree *node, tree name, tree args,
    740  1.1  mrg 			     int flags ATTRIBUTE_UNUSED, bool *no_add_attrs)
    741  1.1  mrg {
    742  1.1  mrg   ia64_addr_area addr_area = ADDR_AREA_NORMAL;
    743  1.1  mrg   ia64_addr_area area;
    744  1.1  mrg   tree arg, decl = *node;
    745  1.1  mrg 
    746  1.1  mrg   init_idents ();
    747  1.1  mrg   arg = TREE_VALUE (args);
    748  1.1  mrg   if (arg == small_ident1 || arg == small_ident2)
    749  1.1  mrg     {
    750  1.1  mrg       addr_area = ADDR_AREA_SMALL;
    751  1.1  mrg     }
    752  1.1  mrg   else
    753  1.1  mrg     {
    754  1.1  mrg       warning (OPT_Wattributes, "invalid argument of %qE attribute",
    755  1.1  mrg 	       name);
    756  1.1  mrg       *no_add_attrs = true;
    757  1.1  mrg     }
    758  1.1  mrg 
    759  1.1  mrg   switch (TREE_CODE (decl))
    760  1.1  mrg     {
    761  1.1  mrg     case VAR_DECL:
    762  1.1  mrg       if ((DECL_CONTEXT (decl) && TREE_CODE (DECL_CONTEXT (decl))
    763  1.1  mrg 	   == FUNCTION_DECL)
    764  1.1  mrg 	  && !TREE_STATIC (decl))
    765  1.1  mrg 	{
    766  1.1  mrg 	  error_at (DECL_SOURCE_LOCATION (decl),
    767  1.1  mrg 		    "an address area attribute cannot be specified for "
    768  1.1  mrg 		    "local variables");
    769  1.1  mrg 	  *no_add_attrs = true;
    770  1.1  mrg 	}
    771  1.1  mrg       area = ia64_get_addr_area (decl);
    772  1.1  mrg       if (area != ADDR_AREA_NORMAL && addr_area != area)
    773  1.1  mrg 	{
    774  1.1  mrg 	  error ("address area of %q+D conflicts with previous "
    775  1.1  mrg 		 "declaration", decl);
    776  1.1  mrg 	  *no_add_attrs = true;
    777  1.1  mrg 	}
    778  1.1  mrg       break;
    779  1.1  mrg 
    780  1.1  mrg     case FUNCTION_DECL:
    781  1.1  mrg       error_at (DECL_SOURCE_LOCATION (decl),
    782  1.1  mrg 		"address area attribute cannot be specified for "
    783  1.1  mrg 		"functions");
    784  1.1  mrg       *no_add_attrs = true;
    785  1.1  mrg       break;
    786  1.1  mrg 
    787  1.1  mrg     default:
    788  1.1  mrg       warning (OPT_Wattributes, "%qE attribute ignored",
    789  1.1  mrg 	       name);
    790  1.1  mrg       *no_add_attrs = true;
    791  1.1  mrg       break;
    792  1.1  mrg     }
    793  1.1  mrg 
    794  1.1  mrg   return NULL_TREE;
    795  1.1  mrg }
    796  1.1  mrg 
    797  1.1  mrg /* Part of the low level implementation of DEC Ada pragma Common_Object which
    798  1.1  mrg    enables the shared use of variables stored in overlaid linker areas
    799  1.1  mrg    corresponding to the use of Fortran COMMON.  */
    800  1.1  mrg 
    801  1.1  mrg static tree
    802  1.1  mrg ia64_vms_common_object_attribute (tree *node, tree name, tree args,
    803  1.1  mrg 				  int flags ATTRIBUTE_UNUSED,
    804  1.1  mrg 				  bool *no_add_attrs)
    805  1.1  mrg {
    806  1.1  mrg     tree decl = *node;
    807  1.1  mrg     tree id;
    808  1.1  mrg 
    809  1.1  mrg     gcc_assert (DECL_P (decl));
    810  1.1  mrg 
    811  1.1  mrg     DECL_COMMON (decl) = 1;
    812  1.1  mrg     id = TREE_VALUE (args);
    813  1.1  mrg     if (TREE_CODE (id) != IDENTIFIER_NODE && TREE_CODE (id) != STRING_CST)
    814  1.1  mrg       {
    815  1.1  mrg 	error ("%qE attribute requires a string constant argument", name);
    816  1.1  mrg 	*no_add_attrs = true;
    817  1.1  mrg 	return NULL_TREE;
    818  1.1  mrg       }
    819  1.1  mrg     return NULL_TREE;
    820  1.1  mrg }
    821  1.1  mrg 
    822  1.1  mrg /* Part of the low level implementation of DEC Ada pragma Common_Object.  */
    823  1.1  mrg 
    824  1.1  mrg void
    825  1.1  mrg ia64_vms_output_aligned_decl_common (FILE *file, tree decl, const char *name,
    826  1.1  mrg 				     unsigned HOST_WIDE_INT size,
    827  1.1  mrg 				     unsigned int align)
    828  1.1  mrg {
    829  1.1  mrg   tree attr = DECL_ATTRIBUTES (decl);
    830  1.1  mrg 
    831  1.1  mrg   if (attr)
    832  1.1  mrg     attr = lookup_attribute ("common_object", attr);
    833  1.1  mrg   if (attr)
    834  1.1  mrg     {
    835  1.1  mrg       tree id = TREE_VALUE (TREE_VALUE (attr));
    836  1.1  mrg       const char *name;
    837  1.1  mrg 
    838  1.1  mrg       if (TREE_CODE (id) == IDENTIFIER_NODE)
    839  1.1  mrg         name = IDENTIFIER_POINTER (id);
    840  1.1  mrg       else if (TREE_CODE (id) == STRING_CST)
    841  1.1  mrg         name = TREE_STRING_POINTER (id);
    842  1.1  mrg       else
    843  1.1  mrg         abort ();
    844  1.1  mrg 
    845  1.1  mrg       fprintf (file, "\t.vms_common\t\"%s\",", name);
    846  1.1  mrg     }
    847  1.1  mrg   else
    848  1.1  mrg     fprintf (file, "%s", COMMON_ASM_OP);
    849  1.1  mrg 
    850  1.1  mrg   /*  Code from elfos.h.  */
    851  1.1  mrg   assemble_name (file, name);
    852  1.1  mrg   fprintf (file, "," HOST_WIDE_INT_PRINT_UNSIGNED",%u",
    853  1.1  mrg            size, align / BITS_PER_UNIT);
    854  1.1  mrg 
    855  1.1  mrg   fputc ('\n', file);
    856  1.1  mrg }
    857  1.1  mrg 
    858  1.1  mrg static void
    859  1.1  mrg ia64_encode_addr_area (tree decl, rtx symbol)
    860  1.1  mrg {
    861  1.1  mrg   int flags;
    862  1.1  mrg 
    863  1.1  mrg   flags = SYMBOL_REF_FLAGS (symbol);
    864  1.1  mrg   switch (ia64_get_addr_area (decl))
    865  1.1  mrg     {
    866  1.1  mrg     case ADDR_AREA_NORMAL: break;
    867  1.1  mrg     case ADDR_AREA_SMALL: flags |= SYMBOL_FLAG_SMALL_ADDR; break;
    868  1.1  mrg     default: gcc_unreachable ();
    869  1.1  mrg     }
    870  1.1  mrg   SYMBOL_REF_FLAGS (symbol) = flags;
    871  1.1  mrg }
    872  1.1  mrg 
    873  1.1  mrg static void
    874  1.1  mrg ia64_encode_section_info (tree decl, rtx rtl, int first)
    875  1.1  mrg {
    876  1.1  mrg   default_encode_section_info (decl, rtl, first);
    877  1.1  mrg 
    878  1.1  mrg   /* Careful not to prod global register variables.  */
    879  1.1  mrg   if (TREE_CODE (decl) == VAR_DECL
    880  1.1  mrg       && GET_CODE (DECL_RTL (decl)) == MEM
    881  1.1  mrg       && GET_CODE (XEXP (DECL_RTL (decl), 0)) == SYMBOL_REF
    882  1.1  mrg       && (TREE_STATIC (decl) || DECL_EXTERNAL (decl)))
    883  1.1  mrg     ia64_encode_addr_area (decl, XEXP (rtl, 0));
    884  1.1  mrg }
    885  1.1  mrg 
    886  1.1  mrg /* Return 1 if the operands of a move are ok.  */
    888  1.1  mrg 
    889  1.1  mrg int
    890  1.1  mrg ia64_move_ok (rtx dst, rtx src)
    891  1.1  mrg {
    892  1.1  mrg   /* If we're under init_recog_no_volatile, we'll not be able to use
    893  1.1  mrg      memory_operand.  So check the code directly and don't worry about
    894  1.1  mrg      the validity of the underlying address, which should have been
    895  1.1  mrg      checked elsewhere anyway.  */
    896  1.1  mrg   if (GET_CODE (dst) != MEM)
    897  1.1  mrg     return 1;
    898  1.1  mrg   if (GET_CODE (src) == MEM)
    899  1.1  mrg     return 0;
    900  1.1  mrg   if (register_operand (src, VOIDmode))
    901  1.1  mrg     return 1;
    902  1.1  mrg 
    903  1.1  mrg   /* Otherwise, this must be a constant, and that either 0 or 0.0 or 1.0.  */
    904  1.1  mrg   if (INTEGRAL_MODE_P (GET_MODE (dst)))
    905  1.1  mrg     return src == const0_rtx;
    906  1.1  mrg   else
    907  1.1  mrg     return satisfies_constraint_G (src);
    908  1.1  mrg }
    909  1.1  mrg 
    910  1.1  mrg /* Return 1 if the operands are ok for a floating point load pair.  */
    911  1.1  mrg 
    912  1.1  mrg int
    913  1.1  mrg ia64_load_pair_ok (rtx dst, rtx src)
    914  1.1  mrg {
    915  1.1  mrg   /* ??? There is a thinko in the implementation of the "x" constraint and the
    916  1.1  mrg      FP_REGS class.  The constraint will also reject (reg f30:TI) so we must
    917  1.1  mrg      also return false for it.  */
    918  1.1  mrg   if (GET_CODE (dst) != REG
    919  1.1  mrg       || !(FP_REGNO_P (REGNO (dst)) && FP_REGNO_P (REGNO (dst) + 1)))
    920  1.1  mrg     return 0;
    921  1.1  mrg   if (GET_CODE (src) != MEM || MEM_VOLATILE_P (src))
    922  1.1  mrg     return 0;
    923  1.1  mrg   switch (GET_CODE (XEXP (src, 0)))
    924  1.1  mrg     {
    925  1.1  mrg     case REG:
    926  1.1  mrg     case POST_INC:
    927  1.1  mrg       break;
    928  1.1  mrg     case POST_DEC:
    929  1.1  mrg       return 0;
    930  1.1  mrg     case POST_MODIFY:
    931  1.1  mrg       {
    932  1.1  mrg 	rtx adjust = XEXP (XEXP (XEXP (src, 0), 1), 1);
    933  1.1  mrg 
    934  1.1  mrg 	if (GET_CODE (adjust) != CONST_INT
    935  1.1  mrg 	    || INTVAL (adjust) != GET_MODE_SIZE (GET_MODE (src)))
    936  1.1  mrg 	  return 0;
    937  1.1  mrg       }
    938  1.1  mrg       break;
    939  1.1  mrg     default:
    940  1.1  mrg       abort ();
    941  1.1  mrg     }
    942  1.1  mrg   return 1;
    943  1.1  mrg }
    944  1.1  mrg 
    945  1.1  mrg int
    946  1.1  mrg addp4_optimize_ok (rtx op1, rtx op2)
    947  1.1  mrg {
    948  1.1  mrg   return (basereg_operand (op1, GET_MODE(op1)) !=
    949  1.1  mrg 	  basereg_operand (op2, GET_MODE(op2)));
    950  1.1  mrg }
    951  1.1  mrg 
    952  1.1  mrg /* Check if OP is a mask suitable for use with SHIFT in a dep.z instruction.
    953  1.1  mrg    Return the length of the field, or <= 0 on failure.  */
    954  1.1  mrg 
    955  1.1  mrg int
    956  1.1  mrg ia64_depz_field_mask (rtx rop, rtx rshift)
    957  1.1  mrg {
    958  1.1  mrg   unsigned HOST_WIDE_INT op = INTVAL (rop);
    959  1.1  mrg   unsigned HOST_WIDE_INT shift = INTVAL (rshift);
    960  1.1  mrg 
    961  1.1  mrg   /* Get rid of the zero bits we're shifting in.  */
    962  1.1  mrg   op >>= shift;
    963  1.1  mrg 
    964  1.1  mrg   /* We must now have a solid block of 1's at bit 0.  */
    965  1.1  mrg   return exact_log2 (op + 1);
    966  1.1  mrg }
    967  1.1  mrg 
    968  1.1  mrg /* Return the TLS model to use for ADDR.  */
    969  1.1  mrg 
    970  1.1  mrg static enum tls_model
    971  1.1  mrg tls_symbolic_operand_type (rtx addr)
    972  1.1  mrg {
    973  1.1  mrg   enum tls_model tls_kind = TLS_MODEL_NONE;
    974  1.1  mrg 
    975  1.1  mrg   if (GET_CODE (addr) == CONST)
    976  1.1  mrg     {
    977  1.1  mrg       if (GET_CODE (XEXP (addr, 0)) == PLUS
    978  1.1  mrg 	  && GET_CODE (XEXP (XEXP (addr, 0), 0)) == SYMBOL_REF)
    979  1.1  mrg         tls_kind = SYMBOL_REF_TLS_MODEL (XEXP (XEXP (addr, 0), 0));
    980  1.1  mrg     }
    981  1.1  mrg   else if (GET_CODE (addr) == SYMBOL_REF)
    982  1.1  mrg     tls_kind = SYMBOL_REF_TLS_MODEL (addr);
    983  1.1  mrg 
    984  1.1  mrg   return tls_kind;
    985  1.1  mrg }
    986  1.1  mrg 
    987  1.1  mrg /* Returns true if REG (assumed to be a `reg' RTX) is valid for use
    988  1.1  mrg    as a base register.  */
    989  1.1  mrg 
    990  1.1  mrg static inline bool
    991  1.1  mrg ia64_reg_ok_for_base_p (const_rtx reg, bool strict)
    992  1.1  mrg {
    993  1.1  mrg   if (strict
    994  1.1  mrg       && REGNO_OK_FOR_BASE_P (REGNO (reg)))
    995  1.1  mrg     return true;
    996  1.1  mrg   else if (!strict
    997  1.1  mrg 	   && (GENERAL_REGNO_P (REGNO (reg))
    998  1.1  mrg 	       || !HARD_REGISTER_P (reg)))
    999  1.1  mrg     return true;
   1000  1.1  mrg   else
   1001  1.1  mrg     return false;
   1002  1.1  mrg }
   1003  1.1  mrg 
   1004  1.1  mrg static bool
   1005  1.1  mrg ia64_legitimate_address_reg (const_rtx reg, bool strict)
   1006  1.1  mrg {
   1007  1.1  mrg   if ((REG_P (reg) && ia64_reg_ok_for_base_p (reg, strict))
   1008  1.1  mrg       || (GET_CODE (reg) == SUBREG && REG_P (XEXP (reg, 0))
   1009  1.1  mrg 	  && ia64_reg_ok_for_base_p (XEXP (reg, 0), strict)))
   1010  1.1  mrg     return true;
   1011  1.1  mrg 
   1012  1.1  mrg   return false;
   1013  1.1  mrg }
   1014  1.1  mrg 
   1015  1.1  mrg static bool
   1016  1.1  mrg ia64_legitimate_address_disp (const_rtx reg, const_rtx disp, bool strict)
   1017  1.1  mrg {
   1018  1.1  mrg   if (GET_CODE (disp) == PLUS
   1019  1.1  mrg       && rtx_equal_p (reg, XEXP (disp, 0))
   1020  1.1  mrg       && (ia64_legitimate_address_reg (XEXP (disp, 1), strict)
   1021  1.1  mrg 	  || (CONST_INT_P (XEXP (disp, 1))
   1022  1.1  mrg 	      && IN_RANGE (INTVAL (XEXP (disp, 1)), -256, 255))))
   1023  1.1  mrg     return true;
   1024  1.1  mrg 
   1025  1.1  mrg   return false;
   1026  1.1  mrg }
   1027  1.1  mrg 
   1028  1.1  mrg /* Implement TARGET_LEGITIMATE_ADDRESS_P.  */
   1029  1.1  mrg 
   1030  1.1  mrg static bool
   1031  1.1  mrg ia64_legitimate_address_p (machine_mode mode ATTRIBUTE_UNUSED,
   1032  1.1  mrg 			   rtx x, bool strict)
   1033  1.1  mrg {
   1034  1.1  mrg   if (ia64_legitimate_address_reg (x, strict))
   1035  1.1  mrg     return true;
   1036  1.1  mrg   else if ((GET_CODE (x) == POST_INC || GET_CODE (x) == POST_DEC)
   1037  1.1  mrg 	   && ia64_legitimate_address_reg (XEXP (x, 0), strict)
   1038  1.1  mrg 	   && XEXP (x, 0) != arg_pointer_rtx)
   1039  1.1  mrg     return true;
   1040  1.1  mrg   else if (GET_CODE (x) == POST_MODIFY
   1041  1.1  mrg 	   && ia64_legitimate_address_reg (XEXP (x, 0), strict)
   1042  1.1  mrg 	   && XEXP (x, 0) != arg_pointer_rtx
   1043  1.1  mrg 	   && ia64_legitimate_address_disp (XEXP (x, 0), XEXP (x, 1), strict))
   1044  1.1  mrg     return true;
   1045  1.1  mrg   else
   1046  1.1  mrg     return false;
   1047  1.1  mrg }
   1048  1.1  mrg 
   1049  1.1  mrg /* Return true if X is a constant that is valid for some immediate
   1050  1.1  mrg    field in an instruction.  */
   1051  1.1  mrg 
   1052  1.1  mrg static bool
   1053  1.1  mrg ia64_legitimate_constant_p (machine_mode mode, rtx x)
   1054  1.1  mrg {
   1055  1.1  mrg   switch (GET_CODE (x))
   1056  1.1  mrg     {
   1057  1.1  mrg     case CONST_INT:
   1058  1.1  mrg     case LABEL_REF:
   1059  1.1  mrg       return true;
   1060  1.1  mrg 
   1061  1.1  mrg     case CONST_DOUBLE:
   1062  1.1  mrg       if (GET_MODE (x) == VOIDmode || mode == SFmode || mode == DFmode)
   1063  1.1  mrg 	return true;
   1064  1.1  mrg       return satisfies_constraint_G (x);
   1065  1.1  mrg 
   1066  1.1  mrg     case CONST:
   1067  1.1  mrg     case SYMBOL_REF:
   1068  1.1  mrg       /* ??? Short term workaround for PR 28490.  We must make the code here
   1069  1.1  mrg 	 match the code in ia64_expand_move and move_operand, even though they
   1070  1.1  mrg 	 are both technically wrong.  */
   1071  1.1  mrg       if (tls_symbolic_operand_type (x) == 0)
   1072  1.1  mrg 	{
   1073  1.1  mrg 	  HOST_WIDE_INT addend = 0;
   1074  1.1  mrg 	  rtx op = x;
   1075  1.1  mrg 
   1076  1.1  mrg 	  if (GET_CODE (op) == CONST
   1077  1.1  mrg 	      && GET_CODE (XEXP (op, 0)) == PLUS
   1078  1.1  mrg 	      && GET_CODE (XEXP (XEXP (op, 0), 1)) == CONST_INT)
   1079  1.1  mrg 	    {
   1080  1.1  mrg 	      addend = INTVAL (XEXP (XEXP (op, 0), 1));
   1081  1.1  mrg 	      op = XEXP (XEXP (op, 0), 0);
   1082  1.1  mrg 	    }
   1083  1.1  mrg 
   1084  1.1  mrg           if (any_offset_symbol_operand (op, mode)
   1085  1.1  mrg               || function_operand (op, mode))
   1086  1.1  mrg             return true;
   1087  1.1  mrg 	  if (aligned_offset_symbol_operand (op, mode))
   1088  1.1  mrg 	    return (addend & 0x3fff) == 0;
   1089  1.1  mrg 	  return false;
   1090  1.1  mrg 	}
   1091  1.1  mrg       return false;
   1092  1.1  mrg 
   1093  1.1  mrg     case CONST_VECTOR:
   1094  1.1  mrg       if (mode == V2SFmode)
   1095  1.1  mrg 	return satisfies_constraint_Y (x);
   1096  1.1  mrg 
   1097  1.1  mrg       return (GET_MODE_CLASS (mode) == MODE_VECTOR_INT
   1098  1.1  mrg 	      && GET_MODE_SIZE (mode) <= 8);
   1099  1.1  mrg 
   1100  1.1  mrg     default:
   1101  1.1  mrg       return false;
   1102  1.1  mrg     }
   1103  1.1  mrg }
   1104  1.1  mrg 
   1105  1.1  mrg /* Don't allow TLS addresses to get spilled to memory.  */
   1106  1.1  mrg 
   1107  1.1  mrg static bool
   1108  1.1  mrg ia64_cannot_force_const_mem (machine_mode mode, rtx x)
   1109  1.1  mrg {
   1110  1.1  mrg   if (mode == RFmode)
   1111  1.1  mrg     return true;
   1112  1.1  mrg   return tls_symbolic_operand_type (x) != 0;
   1113  1.1  mrg }
   1114  1.1  mrg 
   1115  1.1  mrg /* Expand a symbolic constant load.  */
   1116  1.1  mrg 
   1117  1.1  mrg bool
   1118  1.1  mrg ia64_expand_load_address (rtx dest, rtx src)
   1119  1.1  mrg {
   1120  1.1  mrg   gcc_assert (GET_CODE (dest) == REG);
   1121  1.1  mrg 
   1122  1.1  mrg   /* ILP32 mode still loads 64-bits of data from the GOT.  This avoids
   1123  1.1  mrg      having to pointer-extend the value afterward.  Other forms of address
   1124  1.1  mrg      computation below are also more natural to compute as 64-bit quantities.
   1125  1.1  mrg      If we've been given an SImode destination register, change it.  */
   1126  1.1  mrg   if (GET_MODE (dest) != Pmode)
   1127  1.1  mrg     dest = gen_rtx_REG_offset (dest, Pmode, REGNO (dest),
   1128  1.1  mrg 			       byte_lowpart_offset (Pmode, GET_MODE (dest)));
   1129  1.1  mrg 
   1130  1.1  mrg   if (TARGET_NO_PIC)
   1131  1.1  mrg     return false;
   1132  1.1  mrg   if (small_addr_symbolic_operand (src, VOIDmode))
   1133  1.1  mrg     return false;
   1134  1.1  mrg 
   1135  1.1  mrg   if (TARGET_AUTO_PIC)
   1136  1.1  mrg     emit_insn (gen_load_gprel64 (dest, src));
   1137  1.1  mrg   else if (GET_CODE (src) == SYMBOL_REF && SYMBOL_REF_FUNCTION_P (src))
   1138  1.1  mrg     emit_insn (gen_load_fptr (dest, src));
   1139  1.1  mrg   else if (sdata_symbolic_operand (src, VOIDmode))
   1140  1.1  mrg     emit_insn (gen_load_gprel (dest, src));
   1141  1.1  mrg   else if (local_symbolic_operand64 (src, VOIDmode))
   1142  1.1  mrg     {
   1143  1.1  mrg       /* We want to use @gprel rather than @ltoff relocations for local
   1144  1.1  mrg 	 symbols:
   1145  1.1  mrg 	  - @gprel does not require dynamic linker
   1146  1.1  mrg 	  - and does not use .sdata section
   1147  1.1  mrg 	 https://gcc.gnu.org/bugzilla/60465 */
   1148  1.1  mrg       emit_insn (gen_load_gprel64 (dest, src));
   1149  1.1  mrg     }
   1150  1.1  mrg   else
   1151  1.1  mrg     {
   1152  1.1  mrg       HOST_WIDE_INT addend = 0;
   1153  1.1  mrg       rtx tmp;
   1154  1.1  mrg 
   1155  1.1  mrg       /* We did split constant offsets in ia64_expand_move, and we did try
   1156  1.1  mrg 	 to keep them split in move_operand, but we also allowed reload to
   1157  1.1  mrg 	 rematerialize arbitrary constants rather than spill the value to
   1158  1.1  mrg 	 the stack and reload it.  So we have to be prepared here to split
   1159  1.1  mrg 	 them apart again.  */
   1160  1.1  mrg       if (GET_CODE (src) == CONST)
   1161  1.1  mrg 	{
   1162  1.1  mrg 	  HOST_WIDE_INT hi, lo;
   1163  1.1  mrg 
   1164  1.1  mrg 	  hi = INTVAL (XEXP (XEXP (src, 0), 1));
   1165  1.1  mrg 	  lo = ((hi & 0x3fff) ^ 0x2000) - 0x2000;
   1166  1.1  mrg 	  hi = hi - lo;
   1167  1.1  mrg 
   1168  1.1  mrg 	  if (lo != 0)
   1169  1.1  mrg 	    {
   1170  1.1  mrg 	      addend = lo;
   1171  1.1  mrg 	      src = plus_constant (Pmode, XEXP (XEXP (src, 0), 0), hi);
   1172  1.1  mrg 	    }
   1173  1.1  mrg 	}
   1174  1.1  mrg 
   1175  1.1  mrg       tmp = gen_rtx_HIGH (Pmode, src);
   1176  1.1  mrg       tmp = gen_rtx_PLUS (Pmode, tmp, pic_offset_table_rtx);
   1177  1.1  mrg       emit_insn (gen_rtx_SET (dest, tmp));
   1178  1.1  mrg 
   1179  1.1  mrg       tmp = gen_rtx_LO_SUM (Pmode, gen_const_mem (Pmode, dest), src);
   1180  1.1  mrg       emit_insn (gen_rtx_SET (dest, tmp));
   1181  1.1  mrg 
   1182  1.1  mrg       if (addend)
   1183  1.1  mrg 	{
   1184  1.1  mrg 	  tmp = gen_rtx_PLUS (Pmode, dest, GEN_INT (addend));
   1185  1.1  mrg 	  emit_insn (gen_rtx_SET (dest, tmp));
   1186  1.1  mrg 	}
   1187  1.1  mrg     }
   1188  1.1  mrg 
   1189  1.1  mrg   return true;
   1190  1.1  mrg }
   1191  1.1  mrg 
   1192  1.1  mrg static GTY(()) rtx gen_tls_tga;
   1193  1.1  mrg static rtx
   1194  1.1  mrg gen_tls_get_addr (void)
   1195  1.1  mrg {
   1196  1.1  mrg   if (!gen_tls_tga)
   1197  1.1  mrg     gen_tls_tga = init_one_libfunc ("__tls_get_addr");
   1198  1.1  mrg   return gen_tls_tga;
   1199  1.1  mrg }
   1200  1.1  mrg 
   1201  1.1  mrg static GTY(()) rtx thread_pointer_rtx;
   1202  1.1  mrg static rtx
   1203  1.1  mrg gen_thread_pointer (void)
   1204  1.1  mrg {
   1205  1.1  mrg   if (!thread_pointer_rtx)
   1206  1.1  mrg     thread_pointer_rtx = gen_rtx_REG (Pmode, 13);
   1207  1.1  mrg   return thread_pointer_rtx;
   1208  1.1  mrg }
   1209  1.1  mrg 
   1210  1.1  mrg static rtx
   1211  1.1  mrg ia64_expand_tls_address (enum tls_model tls_kind, rtx op0, rtx op1,
   1212  1.1  mrg 			 rtx orig_op1, HOST_WIDE_INT addend)
   1213  1.1  mrg {
   1214  1.1  mrg   rtx tga_op1, tga_op2, tga_ret, tga_eqv, tmp;
   1215  1.1  mrg   rtx_insn *insns;
   1216  1.1  mrg   rtx orig_op0 = op0;
   1217  1.1  mrg   HOST_WIDE_INT addend_lo, addend_hi;
   1218  1.1  mrg 
   1219  1.1  mrg   switch (tls_kind)
   1220  1.1  mrg     {
   1221  1.1  mrg     case TLS_MODEL_GLOBAL_DYNAMIC:
   1222  1.1  mrg       start_sequence ();
   1223  1.1  mrg 
   1224  1.1  mrg       tga_op1 = gen_reg_rtx (Pmode);
   1225  1.1  mrg       emit_insn (gen_load_dtpmod (tga_op1, op1));
   1226  1.1  mrg 
   1227  1.1  mrg       tga_op2 = gen_reg_rtx (Pmode);
   1228  1.1  mrg       emit_insn (gen_load_dtprel (tga_op2, op1));
   1229  1.1  mrg 
   1230  1.1  mrg       tga_ret = emit_library_call_value (gen_tls_get_addr (), NULL_RTX,
   1231  1.1  mrg 					 LCT_CONST, Pmode,
   1232  1.1  mrg 					 tga_op1, Pmode, tga_op2, Pmode);
   1233  1.1  mrg 
   1234  1.1  mrg       insns = get_insns ();
   1235  1.1  mrg       end_sequence ();
   1236  1.1  mrg 
   1237  1.1  mrg       if (GET_MODE (op0) != Pmode)
   1238  1.1  mrg 	op0 = tga_ret;
   1239  1.1  mrg       emit_libcall_block (insns, op0, tga_ret, op1);
   1240  1.1  mrg       break;
   1241  1.1  mrg 
   1242  1.1  mrg     case TLS_MODEL_LOCAL_DYNAMIC:
   1243  1.1  mrg       /* ??? This isn't the completely proper way to do local-dynamic
   1244  1.1  mrg 	 If the call to __tls_get_addr is used only by a single symbol,
   1245  1.1  mrg 	 then we should (somehow) move the dtprel to the second arg
   1246  1.1  mrg 	 to avoid the extra add.  */
   1247  1.1  mrg       start_sequence ();
   1248  1.1  mrg 
   1249  1.1  mrg       tga_op1 = gen_reg_rtx (Pmode);
   1250  1.1  mrg       emit_insn (gen_load_dtpmod (tga_op1, op1));
   1251  1.1  mrg 
   1252  1.1  mrg       tga_op2 = const0_rtx;
   1253  1.1  mrg 
   1254  1.1  mrg       tga_ret = emit_library_call_value (gen_tls_get_addr (), NULL_RTX,
   1255  1.1  mrg 					 LCT_CONST, Pmode,
   1256  1.1  mrg 					 tga_op1, Pmode, tga_op2, Pmode);
   1257  1.1  mrg 
   1258  1.1  mrg       insns = get_insns ();
   1259  1.1  mrg       end_sequence ();
   1260  1.1  mrg 
   1261  1.1  mrg       tga_eqv = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, const0_rtx),
   1262  1.1  mrg 				UNSPEC_LD_BASE);
   1263  1.1  mrg       tmp = gen_reg_rtx (Pmode);
   1264  1.1  mrg       emit_libcall_block (insns, tmp, tga_ret, tga_eqv);
   1265  1.1  mrg 
   1266  1.1  mrg       if (!register_operand (op0, Pmode))
   1267  1.1  mrg 	op0 = gen_reg_rtx (Pmode);
   1268  1.1  mrg       if (TARGET_TLS64)
   1269  1.1  mrg 	{
   1270  1.1  mrg 	  emit_insn (gen_load_dtprel (op0, op1));
   1271  1.1  mrg 	  emit_insn (gen_adddi3 (op0, tmp, op0));
   1272  1.1  mrg 	}
   1273  1.1  mrg       else
   1274  1.1  mrg 	emit_insn (gen_add_dtprel (op0, op1, tmp));
   1275  1.1  mrg       break;
   1276  1.1  mrg 
   1277  1.1  mrg     case TLS_MODEL_INITIAL_EXEC:
   1278  1.1  mrg       addend_lo = ((addend & 0x3fff) ^ 0x2000) - 0x2000;
   1279  1.1  mrg       addend_hi = addend - addend_lo;
   1280  1.1  mrg 
   1281  1.1  mrg       op1 = plus_constant (Pmode, op1, addend_hi);
   1282  1.1  mrg       addend = addend_lo;
   1283  1.1  mrg 
   1284  1.1  mrg       tmp = gen_reg_rtx (Pmode);
   1285  1.1  mrg       emit_insn (gen_load_tprel (tmp, op1));
   1286  1.1  mrg 
   1287  1.1  mrg       if (!register_operand (op0, Pmode))
   1288  1.1  mrg 	op0 = gen_reg_rtx (Pmode);
   1289  1.1  mrg       emit_insn (gen_adddi3 (op0, tmp, gen_thread_pointer ()));
   1290  1.1  mrg       break;
   1291  1.1  mrg 
   1292  1.1  mrg     case TLS_MODEL_LOCAL_EXEC:
   1293  1.1  mrg       if (!register_operand (op0, Pmode))
   1294  1.1  mrg 	op0 = gen_reg_rtx (Pmode);
   1295  1.1  mrg 
   1296  1.1  mrg       op1 = orig_op1;
   1297  1.1  mrg       addend = 0;
   1298  1.1  mrg       if (TARGET_TLS64)
   1299  1.1  mrg 	{
   1300  1.1  mrg 	  emit_insn (gen_load_tprel (op0, op1));
   1301  1.1  mrg 	  emit_insn (gen_adddi3 (op0, op0, gen_thread_pointer ()));
   1302  1.1  mrg 	}
   1303  1.1  mrg       else
   1304  1.1  mrg 	emit_insn (gen_add_tprel (op0, op1, gen_thread_pointer ()));
   1305  1.1  mrg       break;
   1306  1.1  mrg 
   1307  1.1  mrg     default:
   1308  1.1  mrg       gcc_unreachable ();
   1309  1.1  mrg     }
   1310  1.1  mrg 
   1311  1.1  mrg   if (addend)
   1312  1.1  mrg     op0 = expand_simple_binop (Pmode, PLUS, op0, GEN_INT (addend),
   1313  1.1  mrg 			       orig_op0, 1, OPTAB_DIRECT);
   1314  1.1  mrg   if (orig_op0 == op0)
   1315  1.1  mrg     return NULL_RTX;
   1316  1.1  mrg   if (GET_MODE (orig_op0) == Pmode)
   1317  1.1  mrg     return op0;
   1318  1.1  mrg   return gen_lowpart (GET_MODE (orig_op0), op0);
   1319  1.1  mrg }
   1320  1.1  mrg 
   1321  1.1  mrg rtx
   1322  1.1  mrg ia64_expand_move (rtx op0, rtx op1)
   1323  1.1  mrg {
   1324  1.1  mrg   machine_mode mode = GET_MODE (op0);
   1325  1.1  mrg 
   1326  1.1  mrg   if (!reload_in_progress && !reload_completed && !ia64_move_ok (op0, op1))
   1327  1.1  mrg     op1 = force_reg (mode, op1);
   1328  1.1  mrg 
   1329  1.1  mrg   if ((mode == Pmode || mode == ptr_mode) && symbolic_operand (op1, VOIDmode))
   1330  1.1  mrg     {
   1331  1.1  mrg       HOST_WIDE_INT addend = 0;
   1332  1.1  mrg       enum tls_model tls_kind;
   1333  1.1  mrg       rtx sym = op1;
   1334  1.1  mrg 
   1335  1.1  mrg       if (GET_CODE (op1) == CONST
   1336  1.1  mrg 	  && GET_CODE (XEXP (op1, 0)) == PLUS
   1337  1.1  mrg 	  && GET_CODE (XEXP (XEXP (op1, 0), 1)) == CONST_INT)
   1338  1.1  mrg 	{
   1339  1.1  mrg 	  addend = INTVAL (XEXP (XEXP (op1, 0), 1));
   1340  1.1  mrg 	  sym = XEXP (XEXP (op1, 0), 0);
   1341  1.1  mrg 	}
   1342  1.1  mrg 
   1343  1.1  mrg       tls_kind = tls_symbolic_operand_type (sym);
   1344  1.1  mrg       if (tls_kind)
   1345  1.1  mrg 	return ia64_expand_tls_address (tls_kind, op0, sym, op1, addend);
   1346  1.1  mrg 
   1347  1.1  mrg       if (any_offset_symbol_operand (sym, mode))
   1348  1.1  mrg 	addend = 0;
   1349  1.1  mrg       else if (aligned_offset_symbol_operand (sym, mode))
   1350  1.1  mrg 	{
   1351  1.1  mrg 	  HOST_WIDE_INT addend_lo, addend_hi;
   1352  1.1  mrg 
   1353  1.1  mrg 	  addend_lo = ((addend & 0x3fff) ^ 0x2000) - 0x2000;
   1354  1.1  mrg 	  addend_hi = addend - addend_lo;
   1355  1.1  mrg 
   1356  1.1  mrg 	  if (addend_lo != 0)
   1357  1.1  mrg 	    {
   1358  1.1  mrg 	      op1 = plus_constant (mode, sym, addend_hi);
   1359  1.1  mrg 	      addend = addend_lo;
   1360  1.1  mrg 	    }
   1361  1.1  mrg 	  else
   1362  1.1  mrg 	    addend = 0;
   1363  1.1  mrg 	}
   1364  1.1  mrg       else
   1365  1.1  mrg 	op1 = sym;
   1366  1.1  mrg 
   1367  1.1  mrg       if (reload_completed)
   1368  1.1  mrg 	{
   1369  1.1  mrg 	  /* We really should have taken care of this offset earlier.  */
   1370  1.1  mrg 	  gcc_assert (addend == 0);
   1371  1.1  mrg 	  if (ia64_expand_load_address (op0, op1))
   1372  1.1  mrg 	    return NULL_RTX;
   1373  1.1  mrg 	}
   1374  1.1  mrg 
   1375  1.1  mrg       if (addend)
   1376  1.1  mrg 	{
   1377  1.1  mrg 	  rtx subtarget = !can_create_pseudo_p () ? op0 : gen_reg_rtx (mode);
   1378  1.1  mrg 
   1379  1.1  mrg 	  emit_insn (gen_rtx_SET (subtarget, op1));
   1380  1.1  mrg 
   1381  1.1  mrg 	  op1 = expand_simple_binop (mode, PLUS, subtarget,
   1382  1.1  mrg 				     GEN_INT (addend), op0, 1, OPTAB_DIRECT);
   1383  1.1  mrg 	  if (op0 == op1)
   1384  1.1  mrg 	    return NULL_RTX;
   1385  1.1  mrg 	}
   1386  1.1  mrg     }
   1387  1.1  mrg 
   1388  1.1  mrg   return op1;
   1389  1.1  mrg }
   1390  1.1  mrg 
   1391  1.1  mrg /* Split a move from OP1 to OP0 conditional on COND.  */
   1392  1.1  mrg 
   1393  1.1  mrg void
   1394  1.1  mrg ia64_emit_cond_move (rtx op0, rtx op1, rtx cond)
   1395  1.1  mrg {
   1396  1.1  mrg   rtx_insn *insn, *first = get_last_insn ();
   1397  1.1  mrg 
   1398  1.1  mrg   emit_move_insn (op0, op1);
   1399  1.1  mrg 
   1400  1.1  mrg   for (insn = get_last_insn (); insn != first; insn = PREV_INSN (insn))
   1401  1.1  mrg     if (INSN_P (insn))
   1402  1.1  mrg       PATTERN (insn) = gen_rtx_COND_EXEC (VOIDmode, copy_rtx (cond),
   1403  1.1  mrg 					  PATTERN (insn));
   1404  1.1  mrg }
   1405  1.1  mrg 
   1406  1.1  mrg /* Split a post-reload TImode or TFmode reference into two DImode
   1407  1.1  mrg    components.  This is made extra difficult by the fact that we do
   1408  1.1  mrg    not get any scratch registers to work with, because reload cannot
   1409  1.1  mrg    be prevented from giving us a scratch that overlaps the register
   1410  1.1  mrg    pair involved.  So instead, when addressing memory, we tweak the
   1411  1.1  mrg    pointer register up and back down with POST_INCs.  Or up and not
   1412  1.1  mrg    back down when we can get away with it.
   1413  1.1  mrg 
   1414  1.1  mrg    REVERSED is true when the loads must be done in reversed order
   1415  1.1  mrg    (high word first) for correctness.  DEAD is true when the pointer
   1416  1.1  mrg    dies with the second insn we generate and therefore the second
   1417  1.1  mrg    address must not carry a postmodify.
   1418  1.1  mrg 
   1419  1.1  mrg    May return an insn which is to be emitted after the moves.  */
   1420  1.1  mrg 
   1421  1.1  mrg static rtx
   1422  1.1  mrg ia64_split_tmode (rtx out[2], rtx in, bool reversed, bool dead)
   1423  1.1  mrg {
   1424  1.1  mrg   rtx fixup = 0;
   1425  1.1  mrg 
   1426  1.1  mrg   switch (GET_CODE (in))
   1427  1.1  mrg     {
   1428  1.1  mrg     case REG:
   1429  1.1  mrg       out[reversed] = gen_rtx_REG (DImode, REGNO (in));
   1430  1.1  mrg       out[!reversed] = gen_rtx_REG (DImode, REGNO (in) + 1);
   1431  1.1  mrg       break;
   1432  1.1  mrg 
   1433  1.1  mrg     case CONST_INT:
   1434  1.1  mrg     case CONST_DOUBLE:
   1435  1.1  mrg       /* Cannot occur reversed.  */
   1436  1.1  mrg       gcc_assert (!reversed);
   1437  1.1  mrg 
   1438  1.1  mrg       if (GET_MODE (in) != TFmode)
   1439  1.1  mrg 	split_double (in, &out[0], &out[1]);
   1440  1.1  mrg       else
   1441  1.1  mrg 	/* split_double does not understand how to split a TFmode
   1442  1.1  mrg 	   quantity into a pair of DImode constants.  */
   1443  1.1  mrg 	{
   1444  1.1  mrg 	  unsigned HOST_WIDE_INT p[2];
   1445  1.1  mrg 	  long l[4];  /* TFmode is 128 bits */
   1446  1.1  mrg 
   1447  1.1  mrg 	  real_to_target (l, CONST_DOUBLE_REAL_VALUE (in), TFmode);
   1448  1.1  mrg 
   1449  1.1  mrg 	  if (FLOAT_WORDS_BIG_ENDIAN)
   1450  1.1  mrg 	    {
   1451  1.1  mrg 	      p[0] = (((unsigned HOST_WIDE_INT) l[0]) << 32) + l[1];
   1452  1.1  mrg 	      p[1] = (((unsigned HOST_WIDE_INT) l[2]) << 32) + l[3];
   1453  1.1  mrg 	    }
   1454  1.1  mrg 	  else
   1455  1.1  mrg 	    {
   1456  1.1  mrg 	      p[0] = (((unsigned HOST_WIDE_INT) l[1]) << 32) + l[0];
   1457  1.1  mrg 	      p[1] = (((unsigned HOST_WIDE_INT) l[3]) << 32) + l[2];
   1458  1.1  mrg 	    }
   1459  1.1  mrg 	  out[0] = GEN_INT (p[0]);
   1460  1.1  mrg 	  out[1] = GEN_INT (p[1]);
   1461  1.1  mrg 	}
   1462  1.1  mrg       break;
   1463  1.1  mrg 
   1464  1.1  mrg     case MEM:
   1465  1.1  mrg       {
   1466  1.1  mrg 	rtx base = XEXP (in, 0);
   1467  1.1  mrg 	rtx offset;
   1468  1.1  mrg 
   1469  1.1  mrg 	switch (GET_CODE (base))
   1470  1.1  mrg 	  {
   1471  1.1  mrg 	  case REG:
   1472  1.1  mrg 	    if (!reversed)
   1473  1.1  mrg 	      {
   1474  1.1  mrg 		out[0] = adjust_automodify_address
   1475  1.1  mrg 		  (in, DImode, gen_rtx_POST_INC (Pmode, base), 0);
   1476  1.1  mrg 		out[1] = adjust_automodify_address
   1477  1.1  mrg 		  (in, DImode, dead ? 0 : gen_rtx_POST_DEC (Pmode, base), 8);
   1478  1.1  mrg 	      }
   1479  1.1  mrg 	    else
   1480  1.1  mrg 	      {
   1481  1.1  mrg 		/* Reversal requires a pre-increment, which can only
   1482  1.1  mrg 		   be done as a separate insn.  */
   1483  1.1  mrg 		emit_insn (gen_adddi3 (base, base, GEN_INT (8)));
   1484  1.1  mrg 		out[0] = adjust_automodify_address
   1485  1.1  mrg 		  (in, DImode, gen_rtx_POST_DEC (Pmode, base), 8);
   1486  1.1  mrg 		out[1] = adjust_address (in, DImode, 0);
   1487  1.1  mrg 	      }
   1488  1.1  mrg 	    break;
   1489  1.1  mrg 
   1490  1.1  mrg 	  case POST_INC:
   1491  1.1  mrg 	    gcc_assert (!reversed && !dead);
   1492  1.1  mrg 
   1493  1.1  mrg 	    /* Just do the increment in two steps.  */
   1494  1.1  mrg 	    out[0] = adjust_automodify_address (in, DImode, 0, 0);
   1495  1.1  mrg 	    out[1] = adjust_automodify_address (in, DImode, 0, 8);
   1496  1.1  mrg 	    break;
   1497  1.1  mrg 
   1498  1.1  mrg 	  case POST_DEC:
   1499  1.1  mrg 	    gcc_assert (!reversed && !dead);
   1500  1.1  mrg 
   1501  1.1  mrg 	    /* Add 8, subtract 24.  */
   1502  1.1  mrg 	    base = XEXP (base, 0);
   1503  1.1  mrg 	    out[0] = adjust_automodify_address
   1504  1.1  mrg 	      (in, DImode, gen_rtx_POST_INC (Pmode, base), 0);
   1505  1.1  mrg 	    out[1] = adjust_automodify_address
   1506  1.1  mrg 	      (in, DImode,
   1507  1.1  mrg 	       gen_rtx_POST_MODIFY (Pmode, base,
   1508  1.1  mrg 				    plus_constant (Pmode, base, -24)),
   1509  1.1  mrg 	       8);
   1510  1.1  mrg 	    break;
   1511  1.1  mrg 
   1512  1.1  mrg 	  case POST_MODIFY:
   1513  1.1  mrg 	    gcc_assert (!reversed && !dead);
   1514  1.1  mrg 
   1515  1.1  mrg 	    /* Extract and adjust the modification.  This case is
   1516  1.1  mrg 	       trickier than the others, because we might have an
   1517  1.1  mrg 	       index register, or we might have a combined offset that
   1518  1.1  mrg 	       doesn't fit a signed 9-bit displacement field.  We can
   1519  1.1  mrg 	       assume the incoming expression is already legitimate.  */
   1520  1.1  mrg 	    offset = XEXP (base, 1);
   1521  1.1  mrg 	    base = XEXP (base, 0);
   1522  1.1  mrg 
   1523  1.1  mrg 	    out[0] = adjust_automodify_address
   1524  1.1  mrg 	      (in, DImode, gen_rtx_POST_INC (Pmode, base), 0);
   1525  1.1  mrg 
   1526  1.1  mrg 	    if (GET_CODE (XEXP (offset, 1)) == REG)
   1527  1.1  mrg 	      {
   1528  1.1  mrg 		/* Can't adjust the postmodify to match.  Emit the
   1529  1.1  mrg 		   original, then a separate addition insn.  */
   1530  1.1  mrg 		out[1] = adjust_automodify_address (in, DImode, 0, 8);
   1531  1.1  mrg 		fixup = gen_adddi3 (base, base, GEN_INT (-8));
   1532  1.1  mrg 	      }
   1533  1.1  mrg 	    else
   1534  1.1  mrg 	      {
   1535  1.1  mrg 		gcc_assert (GET_CODE (XEXP (offset, 1)) == CONST_INT);
   1536  1.1  mrg 		if (INTVAL (XEXP (offset, 1)) < -256 + 8)
   1537  1.1  mrg 		  {
   1538  1.1  mrg 		    /* Again the postmodify cannot be made to match,
   1539  1.1  mrg 		       but in this case it's more efficient to get rid
   1540  1.1  mrg 		       of the postmodify entirely and fix up with an
   1541  1.1  mrg 		       add insn.  */
   1542  1.1  mrg 		    out[1] = adjust_automodify_address (in, DImode, base, 8);
   1543  1.1  mrg 		    fixup = gen_adddi3
   1544  1.1  mrg 		      (base, base, GEN_INT (INTVAL (XEXP (offset, 1)) - 8));
   1545  1.1  mrg 		  }
   1546  1.1  mrg 		else
   1547  1.1  mrg 		  {
   1548  1.1  mrg 		    /* Combined offset still fits in the displacement field.
   1549  1.1  mrg 		       (We cannot overflow it at the high end.)  */
   1550  1.1  mrg 		    out[1] = adjust_automodify_address
   1551  1.1  mrg 		      (in, DImode, gen_rtx_POST_MODIFY
   1552  1.1  mrg 		       (Pmode, base, gen_rtx_PLUS
   1553  1.1  mrg 			(Pmode, base,
   1554  1.1  mrg 			 GEN_INT (INTVAL (XEXP (offset, 1)) - 8))),
   1555  1.1  mrg 		       8);
   1556  1.1  mrg 		  }
   1557  1.1  mrg 	      }
   1558  1.1  mrg 	    break;
   1559  1.1  mrg 
   1560  1.1  mrg 	  default:
   1561  1.1  mrg 	    gcc_unreachable ();
   1562  1.1  mrg 	  }
   1563  1.1  mrg 	break;
   1564  1.1  mrg       }
   1565  1.1  mrg 
   1566  1.1  mrg     default:
   1567  1.1  mrg       gcc_unreachable ();
   1568  1.1  mrg     }
   1569  1.1  mrg 
   1570  1.1  mrg   return fixup;
   1571  1.1  mrg }
   1572  1.1  mrg 
   1573  1.1  mrg /* Split a TImode or TFmode move instruction after reload.
   1574  1.1  mrg    This is used by *movtf_internal and *movti_internal.  */
   1575  1.1  mrg void
   1576  1.1  mrg ia64_split_tmode_move (rtx operands[])
   1577  1.1  mrg {
   1578  1.1  mrg   rtx in[2], out[2], insn;
   1579  1.1  mrg   rtx fixup[2];
   1580  1.1  mrg   bool dead = false;
   1581  1.1  mrg   bool reversed = false;
   1582  1.1  mrg 
   1583  1.1  mrg   /* It is possible for reload to decide to overwrite a pointer with
   1584  1.1  mrg      the value it points to.  In that case we have to do the loads in
   1585  1.1  mrg      the appropriate order so that the pointer is not destroyed too
   1586  1.1  mrg      early.  Also we must not generate a postmodify for that second
   1587  1.1  mrg      load, or rws_access_regno will die.  And we must not generate a
   1588  1.1  mrg      postmodify for the second load if the destination register
   1589  1.1  mrg      overlaps with the base register.  */
   1590  1.1  mrg   if (GET_CODE (operands[1]) == MEM
   1591  1.1  mrg       && reg_overlap_mentioned_p (operands[0], operands[1]))
   1592  1.1  mrg     {
   1593  1.1  mrg       rtx base = XEXP (operands[1], 0);
   1594  1.1  mrg       while (GET_CODE (base) != REG)
   1595  1.1  mrg 	base = XEXP (base, 0);
   1596  1.1  mrg 
   1597  1.1  mrg       if (REGNO (base) == REGNO (operands[0]))
   1598  1.1  mrg 	reversed = true;
   1599  1.1  mrg 
   1600  1.1  mrg       if (refers_to_regno_p (REGNO (operands[0]),
   1601  1.1  mrg 			     REGNO (operands[0])+2,
   1602  1.1  mrg 			     base, 0))
   1603  1.1  mrg 	dead = true;
   1604  1.1  mrg     }
   1605  1.1  mrg   /* Another reason to do the moves in reversed order is if the first
   1606  1.1  mrg      element of the target register pair is also the second element of
   1607  1.1  mrg      the source register pair.  */
   1608  1.1  mrg   if (GET_CODE (operands[0]) == REG && GET_CODE (operands[1]) == REG
   1609  1.1  mrg       && REGNO (operands[0]) == REGNO (operands[1]) + 1)
   1610  1.1  mrg     reversed = true;
   1611  1.1  mrg 
   1612  1.1  mrg   fixup[0] = ia64_split_tmode (in, operands[1], reversed, dead);
   1613  1.1  mrg   fixup[1] = ia64_split_tmode (out, operands[0], reversed, dead);
   1614  1.1  mrg 
   1615  1.1  mrg #define MAYBE_ADD_REG_INC_NOTE(INSN, EXP)				\
   1616  1.1  mrg   if (GET_CODE (EXP) == MEM						\
   1617  1.1  mrg       && (GET_CODE (XEXP (EXP, 0)) == POST_MODIFY			\
   1618  1.1  mrg 	  || GET_CODE (XEXP (EXP, 0)) == POST_INC			\
   1619  1.1  mrg 	  || GET_CODE (XEXP (EXP, 0)) == POST_DEC))			\
   1620  1.1  mrg     add_reg_note (insn, REG_INC, XEXP (XEXP (EXP, 0), 0))
   1621  1.1  mrg 
   1622  1.1  mrg   insn = emit_insn (gen_rtx_SET (out[0], in[0]));
   1623  1.1  mrg   MAYBE_ADD_REG_INC_NOTE (insn, in[0]);
   1624  1.1  mrg   MAYBE_ADD_REG_INC_NOTE (insn, out[0]);
   1625  1.1  mrg 
   1626  1.1  mrg   insn = emit_insn (gen_rtx_SET (out[1], in[1]));
   1627  1.1  mrg   MAYBE_ADD_REG_INC_NOTE (insn, in[1]);
   1628  1.1  mrg   MAYBE_ADD_REG_INC_NOTE (insn, out[1]);
   1629  1.1  mrg 
   1630  1.1  mrg   if (fixup[0])
   1631  1.1  mrg     emit_insn (fixup[0]);
   1632  1.1  mrg   if (fixup[1])
   1633  1.1  mrg     emit_insn (fixup[1]);
   1634  1.1  mrg 
   1635  1.1  mrg #undef MAYBE_ADD_REG_INC_NOTE
   1636  1.1  mrg }
   1637  1.1  mrg 
   1638  1.1  mrg /* ??? Fixing GR->FR XFmode moves during reload is hard.  You need to go
   1639  1.1  mrg    through memory plus an extra GR scratch register.  Except that you can
   1640  1.1  mrg    either get the first from TARGET_SECONDARY_MEMORY_NEEDED or the second
   1641  1.1  mrg    from SECONDARY_RELOAD_CLASS, but not both.
   1642  1.1  mrg 
   1643  1.1  mrg    We got into problems in the first place by allowing a construct like
   1644  1.1  mrg    (subreg:XF (reg:TI)), which we got from a union containing a long double.
   1645  1.1  mrg    This solution attempts to prevent this situation from occurring.  When
   1646  1.1  mrg    we see something like the above, we spill the inner register to memory.  */
   1647  1.1  mrg 
   1648  1.1  mrg static rtx
   1649  1.1  mrg spill_xfmode_rfmode_operand (rtx in, int force, machine_mode mode)
   1650  1.1  mrg {
   1651  1.1  mrg   if (GET_CODE (in) == SUBREG
   1652  1.1  mrg       && GET_MODE (SUBREG_REG (in)) == TImode
   1653  1.1  mrg       && GET_CODE (SUBREG_REG (in)) == REG)
   1654  1.1  mrg     {
   1655  1.1  mrg       rtx memt = assign_stack_temp (TImode, 16);
   1656  1.1  mrg       emit_move_insn (memt, SUBREG_REG (in));
   1657  1.1  mrg       return adjust_address (memt, mode, 0);
   1658  1.1  mrg     }
   1659  1.1  mrg   else if (force && GET_CODE (in) == REG)
   1660  1.1  mrg     {
   1661  1.1  mrg       rtx memx = assign_stack_temp (mode, 16);
   1662  1.1  mrg       emit_move_insn (memx, in);
   1663  1.1  mrg       return memx;
   1664  1.1  mrg     }
   1665  1.1  mrg   else
   1666  1.1  mrg     return in;
   1667  1.1  mrg }
   1668  1.1  mrg 
   1669  1.1  mrg /* Expand the movxf or movrf pattern (MODE says which) with the given
   1670  1.1  mrg    OPERANDS, returning true if the pattern should then invoke
   1671  1.1  mrg    DONE.  */
   1672  1.1  mrg 
   1673  1.1  mrg bool
   1674  1.1  mrg ia64_expand_movxf_movrf (machine_mode mode, rtx operands[])
   1675  1.1  mrg {
   1676  1.1  mrg   rtx op0 = operands[0];
   1677  1.1  mrg 
   1678  1.1  mrg   if (GET_CODE (op0) == SUBREG)
   1679  1.1  mrg     op0 = SUBREG_REG (op0);
   1680  1.1  mrg 
   1681  1.1  mrg   /* We must support XFmode loads into general registers for stdarg/vararg,
   1682  1.1  mrg      unprototyped calls, and a rare case where a long double is passed as
   1683  1.1  mrg      an argument after a float HFA fills the FP registers.  We split them into
   1684  1.1  mrg      DImode loads for convenience.  We also need to support XFmode stores
   1685  1.1  mrg      for the last case.  This case does not happen for stdarg/vararg routines,
   1686  1.1  mrg      because we do a block store to memory of unnamed arguments.  */
   1687  1.1  mrg 
   1688  1.1  mrg   if (GET_CODE (op0) == REG && GR_REGNO_P (REGNO (op0)))
   1689  1.1  mrg     {
   1690  1.1  mrg       rtx out[2];
   1691  1.1  mrg 
   1692  1.1  mrg       /* We're hoping to transform everything that deals with XFmode
   1693  1.1  mrg 	 quantities and GR registers early in the compiler.  */
   1694  1.1  mrg       gcc_assert (can_create_pseudo_p ());
   1695  1.1  mrg 
   1696  1.1  mrg       /* Struct to register can just use TImode instead.  */
   1697  1.1  mrg       if ((GET_CODE (operands[1]) == SUBREG
   1698  1.1  mrg 	   && GET_MODE (SUBREG_REG (operands[1])) == TImode)
   1699  1.1  mrg 	  || (GET_CODE (operands[1]) == REG
   1700  1.1  mrg 	      && GR_REGNO_P (REGNO (operands[1]))))
   1701  1.1  mrg 	{
   1702  1.1  mrg 	  rtx op1 = operands[1];
   1703  1.1  mrg 
   1704  1.1  mrg 	  if (GET_CODE (op1) == SUBREG)
   1705  1.1  mrg 	    op1 = SUBREG_REG (op1);
   1706  1.1  mrg 	  else
   1707  1.1  mrg 	    op1 = gen_rtx_REG (TImode, REGNO (op1));
   1708  1.1  mrg 
   1709  1.1  mrg 	  emit_move_insn (gen_rtx_REG (TImode, REGNO (op0)), op1);
   1710  1.1  mrg 	  return true;
   1711  1.1  mrg 	}
   1712  1.1  mrg 
   1713  1.1  mrg       if (GET_CODE (operands[1]) == CONST_DOUBLE)
   1714  1.1  mrg 	{
   1715  1.1  mrg 	  /* Don't word-swap when reading in the constant.  */
   1716  1.1  mrg 	  emit_move_insn (gen_rtx_REG (DImode, REGNO (op0)),
   1717  1.1  mrg 			  operand_subword (operands[1], WORDS_BIG_ENDIAN,
   1718  1.1  mrg 					   0, mode));
   1719  1.1  mrg 	  emit_move_insn (gen_rtx_REG (DImode, REGNO (op0) + 1),
   1720  1.1  mrg 			  operand_subword (operands[1], !WORDS_BIG_ENDIAN,
   1721  1.1  mrg 					   0, mode));
   1722  1.1  mrg 	  return true;
   1723  1.1  mrg 	}
   1724  1.1  mrg 
   1725  1.1  mrg       /* If the quantity is in a register not known to be GR, spill it.  */
   1726  1.1  mrg       if (register_operand (operands[1], mode))
   1727  1.1  mrg 	operands[1] = spill_xfmode_rfmode_operand (operands[1], 1, mode);
   1728  1.1  mrg 
   1729  1.1  mrg       gcc_assert (GET_CODE (operands[1]) == MEM);
   1730  1.1  mrg 
   1731  1.1  mrg       /* Don't word-swap when reading in the value.  */
   1732  1.1  mrg       out[0] = gen_rtx_REG (DImode, REGNO (op0));
   1733  1.1  mrg       out[1] = gen_rtx_REG (DImode, REGNO (op0) + 1);
   1734  1.1  mrg 
   1735  1.1  mrg       emit_move_insn (out[0], adjust_address (operands[1], DImode, 0));
   1736  1.1  mrg       emit_move_insn (out[1], adjust_address (operands[1], DImode, 8));
   1737  1.1  mrg       return true;
   1738  1.1  mrg     }
   1739  1.1  mrg 
   1740  1.1  mrg   if (GET_CODE (operands[1]) == REG && GR_REGNO_P (REGNO (operands[1])))
   1741  1.1  mrg     {
   1742  1.1  mrg       /* We're hoping to transform everything that deals with XFmode
   1743  1.1  mrg 	 quantities and GR registers early in the compiler.  */
   1744  1.1  mrg       gcc_assert (can_create_pseudo_p ());
   1745  1.1  mrg 
   1746  1.1  mrg       /* Op0 can't be a GR_REG here, as that case is handled above.
   1747  1.1  mrg 	 If op0 is a register, then we spill op1, so that we now have a
   1748  1.1  mrg 	 MEM operand.  This requires creating an XFmode subreg of a TImode reg
   1749  1.1  mrg 	 to force the spill.  */
   1750  1.1  mrg       if (register_operand (operands[0], mode))
   1751  1.1  mrg 	{
   1752  1.1  mrg 	  rtx op1 = gen_rtx_REG (TImode, REGNO (operands[1]));
   1753  1.1  mrg 	  op1 = gen_rtx_SUBREG (mode, op1, 0);
   1754  1.1  mrg 	  operands[1] = spill_xfmode_rfmode_operand (op1, 0, mode);
   1755  1.1  mrg 	}
   1756  1.1  mrg 
   1757  1.1  mrg       else
   1758  1.1  mrg 	{
   1759  1.1  mrg 	  rtx in[2];
   1760  1.1  mrg 
   1761  1.1  mrg 	  gcc_assert (GET_CODE (operands[0]) == MEM);
   1762  1.1  mrg 
   1763  1.1  mrg 	  /* Don't word-swap when writing out the value.  */
   1764  1.1  mrg 	  in[0] = gen_rtx_REG (DImode, REGNO (operands[1]));
   1765  1.1  mrg 	  in[1] = gen_rtx_REG (DImode, REGNO (operands[1]) + 1);
   1766  1.1  mrg 
   1767  1.1  mrg 	  emit_move_insn (adjust_address (operands[0], DImode, 0), in[0]);
   1768  1.1  mrg 	  emit_move_insn (adjust_address (operands[0], DImode, 8), in[1]);
   1769  1.1  mrg 	  return true;
   1770  1.1  mrg 	}
   1771  1.1  mrg     }
   1772  1.1  mrg 
   1773  1.1  mrg   if (!reload_in_progress && !reload_completed)
   1774  1.1  mrg     {
   1775  1.1  mrg       operands[1] = spill_xfmode_rfmode_operand (operands[1], 0, mode);
   1776  1.1  mrg 
   1777  1.1  mrg       if (GET_MODE (op0) == TImode && GET_CODE (op0) == REG)
   1778  1.1  mrg 	{
   1779  1.1  mrg 	  rtx memt, memx, in = operands[1];
   1780  1.1  mrg 	  if (CONSTANT_P (in))
   1781  1.1  mrg 	    in = validize_mem (force_const_mem (mode, in));
   1782  1.1  mrg 	  if (GET_CODE (in) == MEM)
   1783  1.1  mrg 	    memt = adjust_address (in, TImode, 0);
   1784  1.1  mrg 	  else
   1785  1.1  mrg 	    {
   1786  1.1  mrg 	      memt = assign_stack_temp (TImode, 16);
   1787  1.1  mrg 	      memx = adjust_address (memt, mode, 0);
   1788  1.1  mrg 	      emit_move_insn (memx, in);
   1789  1.1  mrg 	    }
   1790  1.1  mrg 	  emit_move_insn (op0, memt);
   1791  1.1  mrg 	  return true;
   1792  1.1  mrg 	}
   1793  1.1  mrg 
   1794  1.1  mrg       if (!ia64_move_ok (operands[0], operands[1]))
   1795  1.1  mrg 	operands[1] = force_reg (mode, operands[1]);
   1796  1.1  mrg     }
   1797  1.1  mrg 
   1798  1.1  mrg   return false;
   1799  1.1  mrg }
   1800  1.1  mrg 
   1801  1.1  mrg /* Emit comparison instruction if necessary, replacing *EXPR, *OP0, *OP1
   1802  1.1  mrg    with the expression that holds the compare result (in VOIDmode).  */
   1803  1.1  mrg 
   1804  1.1  mrg static GTY(()) rtx cmptf_libfunc;
   1805  1.1  mrg 
   1806  1.1  mrg void
   1807  1.1  mrg ia64_expand_compare (rtx *expr, rtx *op0, rtx *op1)
   1808  1.1  mrg {
   1809  1.1  mrg   enum rtx_code code = GET_CODE (*expr);
   1810  1.1  mrg   rtx cmp;
   1811  1.1  mrg 
   1812  1.1  mrg   /* If we have a BImode input, then we already have a compare result, and
   1813  1.1  mrg      do not need to emit another comparison.  */
   1814  1.1  mrg   if (GET_MODE (*op0) == BImode)
   1815  1.1  mrg     {
   1816  1.1  mrg       gcc_assert ((code == NE || code == EQ) && *op1 == const0_rtx);
   1817  1.1  mrg       cmp = *op0;
   1818  1.1  mrg     }
   1819  1.1  mrg   /* HPUX TFmode compare requires a library call to _U_Qfcmp, which takes a
   1820  1.1  mrg      magic number as its third argument, that indicates what to do.
   1821  1.1  mrg      The return value is an integer to be compared against zero.  */
   1822  1.1  mrg   else if (TARGET_HPUX && GET_MODE (*op0) == TFmode)
   1823  1.1  mrg     {
   1824  1.1  mrg       enum qfcmp_magic {
   1825  1.1  mrg 	QCMP_INV = 1,	/* Raise FP_INVALID on NaNs as a side effect.  */
   1826  1.1  mrg 	QCMP_UNORD = 2,
   1827  1.1  mrg 	QCMP_EQ = 4,
   1828  1.1  mrg 	QCMP_LT = 8,
   1829  1.1  mrg 	QCMP_GT = 16
   1830  1.1  mrg       };
   1831  1.1  mrg       int magic;
   1832  1.1  mrg       enum rtx_code ncode;
   1833  1.1  mrg       rtx ret;
   1834  1.1  mrg 
   1835  1.1  mrg       gcc_assert (cmptf_libfunc && GET_MODE (*op1) == TFmode);
   1836  1.1  mrg       switch (code)
   1837  1.1  mrg 	{
   1838  1.1  mrg 	  /* 1 = equal, 0 = not equal.  Equality operators do
   1839  1.1  mrg 	     not raise FP_INVALID when given a NaN operand.  */
   1840  1.1  mrg 	case EQ:        magic = QCMP_EQ;                  ncode = NE; break;
   1841  1.1  mrg 	case NE:        magic = QCMP_EQ;                  ncode = EQ; break;
   1842  1.1  mrg 	  /* isunordered() from C99.  */
   1843  1.1  mrg 	case UNORDERED: magic = QCMP_UNORD;               ncode = NE; break;
   1844  1.1  mrg 	case ORDERED:   magic = QCMP_UNORD;               ncode = EQ; break;
   1845  1.1  mrg 	  /* Relational operators raise FP_INVALID when given
   1846  1.1  mrg 	     a NaN operand.  */
   1847  1.1  mrg 	case LT:        magic = QCMP_LT        |QCMP_INV; ncode = NE; break;
   1848  1.1  mrg 	case LE:        magic = QCMP_LT|QCMP_EQ|QCMP_INV; ncode = NE; break;
   1849  1.1  mrg 	case GT:        magic = QCMP_GT        |QCMP_INV; ncode = NE; break;
   1850  1.1  mrg 	case GE:        magic = QCMP_GT|QCMP_EQ|QCMP_INV; ncode = NE; break;
   1851  1.1  mrg           /* Unordered relational operators do not raise FP_INVALID
   1852  1.1  mrg 	     when given a NaN operand.  */
   1853  1.1  mrg 	case UNLT:    magic = QCMP_LT        |QCMP_UNORD; ncode = NE; break;
   1854  1.1  mrg 	case UNLE:    magic = QCMP_LT|QCMP_EQ|QCMP_UNORD; ncode = NE; break;
   1855  1.1  mrg 	case UNGT:    magic = QCMP_GT        |QCMP_UNORD; ncode = NE; break;
   1856  1.1  mrg 	case UNGE:    magic = QCMP_GT|QCMP_EQ|QCMP_UNORD; ncode = NE; break;
   1857  1.1  mrg 	  /* Not supported.  */
   1858  1.1  mrg 	case UNEQ:
   1859  1.1  mrg 	case LTGT:
   1860  1.1  mrg 	default: gcc_unreachable ();
   1861  1.1  mrg 	}
   1862  1.1  mrg 
   1863  1.1  mrg       start_sequence ();
   1864  1.1  mrg 
   1865  1.1  mrg       ret = emit_library_call_value (cmptf_libfunc, 0, LCT_CONST, DImode,
   1866  1.1  mrg 				     *op0, TFmode, *op1, TFmode,
   1867  1.1  mrg 				     GEN_INT (magic), DImode);
   1868  1.1  mrg       cmp = gen_reg_rtx (BImode);
   1869  1.1  mrg       emit_insn (gen_rtx_SET (cmp, gen_rtx_fmt_ee (ncode, BImode,
   1870  1.1  mrg 						   ret, const0_rtx)));
   1871  1.1  mrg 
   1872  1.1  mrg       rtx_insn *insns = get_insns ();
   1873  1.1  mrg       end_sequence ();
   1874  1.1  mrg 
   1875  1.1  mrg       emit_libcall_block (insns, cmp, cmp,
   1876  1.1  mrg 			  gen_rtx_fmt_ee (code, BImode, *op0, *op1));
   1877  1.1  mrg       code = NE;
   1878  1.1  mrg     }
   1879  1.1  mrg   else
   1880  1.1  mrg     {
   1881  1.1  mrg       cmp = gen_reg_rtx (BImode);
   1882  1.1  mrg       emit_insn (gen_rtx_SET (cmp, gen_rtx_fmt_ee (code, BImode, *op0, *op1)));
   1883  1.1  mrg       code = NE;
   1884  1.1  mrg     }
   1885  1.1  mrg 
   1886  1.1  mrg   *expr = gen_rtx_fmt_ee (code, VOIDmode, cmp, const0_rtx);
   1887  1.1  mrg   *op0 = cmp;
   1888  1.1  mrg   *op1 = const0_rtx;
   1889  1.1  mrg }
   1890  1.1  mrg 
   1891  1.1  mrg /* Generate an integral vector comparison.  Return true if the condition has
   1892  1.1  mrg    been reversed, and so the sense of the comparison should be inverted.  */
   1893  1.1  mrg 
   1894  1.1  mrg static bool
   1895  1.1  mrg ia64_expand_vecint_compare (enum rtx_code code, machine_mode mode,
   1896  1.1  mrg 			    rtx dest, rtx op0, rtx op1)
   1897  1.1  mrg {
   1898  1.1  mrg   bool negate = false;
   1899  1.1  mrg   rtx x;
   1900  1.1  mrg 
   1901  1.1  mrg   /* Canonicalize the comparison to EQ, GT, GTU.  */
   1902  1.1  mrg   switch (code)
   1903  1.1  mrg     {
   1904  1.1  mrg     case EQ:
   1905  1.1  mrg     case GT:
   1906  1.1  mrg     case GTU:
   1907  1.1  mrg       break;
   1908  1.1  mrg 
   1909  1.1  mrg     case NE:
   1910  1.1  mrg     case LE:
   1911  1.1  mrg     case LEU:
   1912  1.1  mrg       code = reverse_condition (code);
   1913  1.1  mrg       negate = true;
   1914  1.1  mrg       break;
   1915  1.1  mrg 
   1916  1.1  mrg     case GE:
   1917  1.1  mrg     case GEU:
   1918  1.1  mrg       code = reverse_condition (code);
   1919  1.1  mrg       negate = true;
   1920  1.1  mrg       /* FALLTHRU */
   1921  1.1  mrg 
   1922  1.1  mrg     case LT:
   1923  1.1  mrg     case LTU:
   1924  1.1  mrg       code = swap_condition (code);
   1925  1.1  mrg       x = op0, op0 = op1, op1 = x;
   1926  1.1  mrg       break;
   1927  1.1  mrg 
   1928  1.1  mrg     default:
   1929  1.1  mrg       gcc_unreachable ();
   1930  1.1  mrg     }
   1931  1.1  mrg 
   1932  1.1  mrg   /* Unsigned parallel compare is not supported by the hardware.  Play some
   1933  1.1  mrg      tricks to turn this into a signed comparison against 0.  */
   1934  1.1  mrg   if (code == GTU)
   1935  1.1  mrg     {
   1936  1.1  mrg       switch (mode)
   1937  1.1  mrg 	{
   1938  1.1  mrg 	case E_V2SImode:
   1939  1.1  mrg 	  {
   1940  1.1  mrg 	    rtx t1, t2, mask;
   1941  1.1  mrg 
   1942  1.1  mrg 	    /* Subtract (-(INT MAX) - 1) from both operands to make
   1943  1.1  mrg 	       them signed.  */
   1944  1.1  mrg 	    mask = gen_int_mode (0x80000000, SImode);
   1945  1.1  mrg 	    mask = gen_const_vec_duplicate (V2SImode, mask);
   1946  1.1  mrg 	    mask = force_reg (mode, mask);
   1947  1.1  mrg 	    t1 = gen_reg_rtx (mode);
   1948  1.1  mrg 	    emit_insn (gen_subv2si3 (t1, op0, mask));
   1949  1.1  mrg 	    t2 = gen_reg_rtx (mode);
   1950  1.1  mrg 	    emit_insn (gen_subv2si3 (t2, op1, mask));
   1951  1.1  mrg 	    op0 = t1;
   1952  1.1  mrg 	    op1 = t2;
   1953  1.1  mrg 	    code = GT;
   1954  1.1  mrg 	  }
   1955  1.1  mrg 	  break;
   1956  1.1  mrg 
   1957  1.1  mrg 	case E_V8QImode:
   1958  1.1  mrg 	case E_V4HImode:
   1959  1.1  mrg 	  /* Perform a parallel unsigned saturating subtraction.  */
   1960  1.1  mrg 	  x = gen_reg_rtx (mode);
   1961  1.1  mrg 	  emit_insn (gen_rtx_SET (x, gen_rtx_US_MINUS (mode, op0, op1)));
   1962  1.1  mrg 
   1963  1.1  mrg 	  code = EQ;
   1964  1.1  mrg 	  op0 = x;
   1965  1.1  mrg 	  op1 = CONST0_RTX (mode);
   1966  1.1  mrg 	  negate = !negate;
   1967  1.1  mrg 	  break;
   1968  1.1  mrg 
   1969  1.1  mrg 	default:
   1970  1.1  mrg 	  gcc_unreachable ();
   1971  1.1  mrg 	}
   1972  1.1  mrg     }
   1973  1.1  mrg 
   1974  1.1  mrg   x = gen_rtx_fmt_ee (code, mode, op0, op1);
   1975  1.1  mrg   emit_insn (gen_rtx_SET (dest, x));
   1976  1.1  mrg 
   1977  1.1  mrg   return negate;
   1978  1.1  mrg }
   1979  1.1  mrg 
   1980  1.1  mrg /* Emit an integral vector conditional move.  */
   1981  1.1  mrg 
   1982  1.1  mrg void
   1983  1.1  mrg ia64_expand_vecint_cmov (rtx operands[])
   1984  1.1  mrg {
   1985  1.1  mrg   machine_mode mode = GET_MODE (operands[0]);
   1986  1.1  mrg   enum rtx_code code = GET_CODE (operands[3]);
   1987  1.1  mrg   bool negate;
   1988  1.1  mrg   rtx cmp, x, ot, of;
   1989  1.1  mrg 
   1990  1.1  mrg   cmp = gen_reg_rtx (mode);
   1991  1.1  mrg   negate = ia64_expand_vecint_compare (code, mode, cmp,
   1992  1.1  mrg 				       operands[4], operands[5]);
   1993  1.1  mrg 
   1994  1.1  mrg   ot = operands[1+negate];
   1995  1.1  mrg   of = operands[2-negate];
   1996  1.1  mrg 
   1997  1.1  mrg   if (ot == CONST0_RTX (mode))
   1998  1.1  mrg     {
   1999  1.1  mrg       if (of == CONST0_RTX (mode))
   2000  1.1  mrg 	{
   2001  1.1  mrg 	  emit_move_insn (operands[0], ot);
   2002  1.1  mrg 	  return;
   2003  1.1  mrg 	}
   2004  1.1  mrg 
   2005  1.1  mrg       x = gen_rtx_NOT (mode, cmp);
   2006  1.1  mrg       x = gen_rtx_AND (mode, x, of);
   2007  1.1  mrg       emit_insn (gen_rtx_SET (operands[0], x));
   2008  1.1  mrg     }
   2009  1.1  mrg   else if (of == CONST0_RTX (mode))
   2010  1.1  mrg     {
   2011  1.1  mrg       x = gen_rtx_AND (mode, cmp, ot);
   2012  1.1  mrg       emit_insn (gen_rtx_SET (operands[0], x));
   2013  1.1  mrg     }
   2014  1.1  mrg   else
   2015  1.1  mrg     {
   2016  1.1  mrg       rtx t, f;
   2017  1.1  mrg 
   2018  1.1  mrg       t = gen_reg_rtx (mode);
   2019  1.1  mrg       x = gen_rtx_AND (mode, cmp, operands[1+negate]);
   2020  1.1  mrg       emit_insn (gen_rtx_SET (t, x));
   2021  1.1  mrg 
   2022  1.1  mrg       f = gen_reg_rtx (mode);
   2023  1.1  mrg       x = gen_rtx_NOT (mode, cmp);
   2024  1.1  mrg       x = gen_rtx_AND (mode, x, operands[2-negate]);
   2025  1.1  mrg       emit_insn (gen_rtx_SET (f, x));
   2026  1.1  mrg 
   2027  1.1  mrg       x = gen_rtx_IOR (mode, t, f);
   2028  1.1  mrg       emit_insn (gen_rtx_SET (operands[0], x));
   2029  1.1  mrg     }
   2030  1.1  mrg }
   2031  1.1  mrg 
   2032  1.1  mrg /* Emit an integral vector min or max operation.  Return true if all done.  */
   2033  1.1  mrg 
   2034  1.1  mrg bool
   2035  1.1  mrg ia64_expand_vecint_minmax (enum rtx_code code, machine_mode mode,
   2036  1.1  mrg 			   rtx operands[])
   2037  1.1  mrg {
   2038  1.1  mrg   rtx xops[6];
   2039  1.1  mrg 
   2040  1.1  mrg   /* These four combinations are supported directly.  */
   2041  1.1  mrg   if (mode == V8QImode && (code == UMIN || code == UMAX))
   2042  1.1  mrg     return false;
   2043  1.1  mrg   if (mode == V4HImode && (code == SMIN || code == SMAX))
   2044  1.1  mrg     return false;
   2045  1.1  mrg 
   2046  1.1  mrg   /* This combination can be implemented with only saturating subtraction.  */
   2047  1.1  mrg   if (mode == V4HImode && code == UMAX)
   2048  1.1  mrg     {
   2049  1.1  mrg       rtx x, tmp = gen_reg_rtx (mode);
   2050  1.1  mrg 
   2051  1.1  mrg       x = gen_rtx_US_MINUS (mode, operands[1], operands[2]);
   2052  1.1  mrg       emit_insn (gen_rtx_SET (tmp, x));
   2053  1.1  mrg 
   2054  1.1  mrg       emit_insn (gen_addv4hi3 (operands[0], tmp, operands[2]));
   2055  1.1  mrg       return true;
   2056  1.1  mrg     }
   2057  1.1  mrg 
   2058  1.1  mrg   /* Everything else implemented via vector comparisons.  */
   2059  1.1  mrg   xops[0] = operands[0];
   2060  1.1  mrg   xops[4] = xops[1] = operands[1];
   2061  1.1  mrg   xops[5] = xops[2] = operands[2];
   2062  1.1  mrg 
   2063  1.1  mrg   switch (code)
   2064  1.1  mrg     {
   2065  1.1  mrg     case UMIN:
   2066  1.1  mrg       code = LTU;
   2067  1.1  mrg       break;
   2068  1.1  mrg     case UMAX:
   2069  1.1  mrg       code = GTU;
   2070  1.1  mrg       break;
   2071  1.1  mrg     case SMIN:
   2072  1.1  mrg       code = LT;
   2073  1.1  mrg       break;
   2074  1.1  mrg     case SMAX:
   2075  1.1  mrg       code = GT;
   2076  1.1  mrg       break;
   2077  1.1  mrg     default:
   2078  1.1  mrg       gcc_unreachable ();
   2079  1.1  mrg     }
   2080  1.1  mrg   xops[3] = gen_rtx_fmt_ee (code, VOIDmode, operands[1], operands[2]);
   2081  1.1  mrg 
   2082  1.1  mrg   ia64_expand_vecint_cmov (xops);
   2083  1.1  mrg   return true;
   2084  1.1  mrg }
   2085  1.1  mrg 
   2086  1.1  mrg /* The vectors LO and HI each contain N halves of a double-wide vector.
   2087  1.1  mrg    Reassemble either the first N/2 or the second N/2 elements.  */
   2088  1.1  mrg 
   2089  1.1  mrg void
   2090  1.1  mrg ia64_unpack_assemble (rtx out, rtx lo, rtx hi, bool highp)
   2091  1.1  mrg {
   2092  1.1  mrg   machine_mode vmode = GET_MODE (lo);
   2093  1.1  mrg   unsigned int i, high, nelt = GET_MODE_NUNITS (vmode);
   2094  1.1  mrg   struct expand_vec_perm_d d;
   2095  1.1  mrg   bool ok;
   2096  1.1  mrg 
   2097  1.1  mrg   d.target = gen_lowpart (vmode, out);
   2098  1.1  mrg   d.op0 = (TARGET_BIG_ENDIAN ? hi : lo);
   2099  1.1  mrg   d.op1 = (TARGET_BIG_ENDIAN ? lo : hi);
   2100  1.1  mrg   d.vmode = vmode;
   2101  1.1  mrg   d.nelt = nelt;
   2102  1.1  mrg   d.one_operand_p = false;
   2103  1.1  mrg   d.testing_p = false;
   2104  1.1  mrg 
   2105  1.1  mrg   high = (highp ? nelt / 2 : 0);
   2106  1.1  mrg   for (i = 0; i < nelt / 2; ++i)
   2107  1.1  mrg     {
   2108  1.1  mrg       d.perm[i * 2] = i + high;
   2109  1.1  mrg       d.perm[i * 2 + 1] = i + high + nelt;
   2110  1.1  mrg     }
   2111  1.1  mrg 
   2112  1.1  mrg   ok = ia64_expand_vec_perm_const_1 (&d);
   2113  1.1  mrg   gcc_assert (ok);
   2114  1.1  mrg }
   2115  1.1  mrg 
   2116  1.1  mrg /* Return a vector of the sign-extension of VEC.  */
   2117  1.1  mrg 
   2118  1.1  mrg static rtx
   2119  1.1  mrg ia64_unpack_sign (rtx vec, bool unsignedp)
   2120  1.1  mrg {
   2121  1.1  mrg   machine_mode mode = GET_MODE (vec);
   2122  1.1  mrg   rtx zero = CONST0_RTX (mode);
   2123  1.1  mrg 
   2124  1.1  mrg   if (unsignedp)
   2125  1.1  mrg     return zero;
   2126  1.1  mrg   else
   2127  1.1  mrg     {
   2128  1.1  mrg       rtx sign = gen_reg_rtx (mode);
   2129  1.1  mrg       bool neg;
   2130  1.1  mrg 
   2131  1.1  mrg       neg = ia64_expand_vecint_compare (LT, mode, sign, vec, zero);
   2132  1.1  mrg       gcc_assert (!neg);
   2133  1.1  mrg 
   2134  1.1  mrg       return sign;
   2135  1.1  mrg     }
   2136  1.1  mrg }
   2137  1.1  mrg 
   2138  1.1  mrg /* Emit an integral vector unpack operation.  */
   2139  1.1  mrg 
   2140  1.1  mrg void
   2141  1.1  mrg ia64_expand_unpack (rtx operands[3], bool unsignedp, bool highp)
   2142  1.1  mrg {
   2143  1.1  mrg   rtx sign = ia64_unpack_sign (operands[1], unsignedp);
   2144  1.1  mrg   ia64_unpack_assemble (operands[0], operands[1], sign, highp);
   2145  1.1  mrg }
   2146  1.1  mrg 
   2147  1.1  mrg /* Emit an integral vector widening sum operations.  */
   2148  1.1  mrg 
   2149  1.1  mrg void
   2150  1.1  mrg ia64_expand_widen_sum (rtx operands[3], bool unsignedp)
   2151  1.1  mrg {
   2152  1.1  mrg   machine_mode wmode;
   2153  1.1  mrg   rtx l, h, t, sign;
   2154  1.1  mrg 
   2155  1.1  mrg   sign = ia64_unpack_sign (operands[1], unsignedp);
   2156  1.1  mrg 
   2157  1.1  mrg   wmode = GET_MODE (operands[0]);
   2158  1.1  mrg   l = gen_reg_rtx (wmode);
   2159  1.1  mrg   h = gen_reg_rtx (wmode);
   2160  1.1  mrg 
   2161  1.1  mrg   ia64_unpack_assemble (l, operands[1], sign, false);
   2162  1.1  mrg   ia64_unpack_assemble (h, operands[1], sign, true);
   2163  1.1  mrg 
   2164  1.1  mrg   t = expand_binop (wmode, add_optab, l, operands[2], NULL, 0, OPTAB_DIRECT);
   2165  1.1  mrg   t = expand_binop (wmode, add_optab, h, t, operands[0], 0, OPTAB_DIRECT);
   2166  1.1  mrg   if (t != operands[0])
   2167  1.1  mrg     emit_move_insn (operands[0], t);
   2168  1.1  mrg }
   2169  1.1  mrg 
   2170  1.1  mrg /* Emit the appropriate sequence for a call.  */
   2171  1.1  mrg 
   2172  1.1  mrg void
   2173  1.1  mrg ia64_expand_call (rtx retval, rtx addr, rtx nextarg ATTRIBUTE_UNUSED,
   2174  1.1  mrg 		  int sibcall_p)
   2175  1.1  mrg {
   2176  1.1  mrg   rtx insn, b0;
   2177  1.1  mrg 
   2178  1.1  mrg   addr = XEXP (addr, 0);
   2179  1.1  mrg   addr = convert_memory_address (DImode, addr);
   2180  1.1  mrg   b0 = gen_rtx_REG (DImode, R_BR (0));
   2181  1.1  mrg 
   2182  1.1  mrg   /* ??? Should do this for functions known to bind local too.  */
   2183  1.1  mrg   if (TARGET_NO_PIC || TARGET_AUTO_PIC)
   2184  1.1  mrg     {
   2185  1.1  mrg       if (sibcall_p)
   2186  1.1  mrg 	insn = gen_sibcall_nogp (addr);
   2187  1.1  mrg       else if (! retval)
   2188  1.1  mrg 	insn = gen_call_nogp (addr, b0);
   2189  1.1  mrg       else
   2190  1.1  mrg 	insn = gen_call_value_nogp (retval, addr, b0);
   2191  1.1  mrg       insn = emit_call_insn (insn);
   2192  1.1  mrg     }
   2193  1.1  mrg   else
   2194  1.1  mrg     {
   2195  1.1  mrg       if (sibcall_p)
   2196  1.1  mrg 	insn = gen_sibcall_gp (addr);
   2197  1.1  mrg       else if (! retval)
   2198  1.1  mrg 	insn = gen_call_gp (addr, b0);
   2199  1.1  mrg       else
   2200  1.1  mrg 	insn = gen_call_value_gp (retval, addr, b0);
   2201  1.1  mrg       insn = emit_call_insn (insn);
   2202  1.1  mrg 
   2203  1.1  mrg       use_reg (&CALL_INSN_FUNCTION_USAGE (insn), pic_offset_table_rtx);
   2204  1.1  mrg     }
   2205  1.1  mrg 
   2206  1.1  mrg   if (sibcall_p)
   2207  1.1  mrg     use_reg (&CALL_INSN_FUNCTION_USAGE (insn), b0);
   2208  1.1  mrg 
   2209  1.1  mrg   if (TARGET_ABI_OPEN_VMS)
   2210  1.1  mrg     use_reg (&CALL_INSN_FUNCTION_USAGE (insn),
   2211  1.1  mrg 	     gen_rtx_REG (DImode, GR_REG (25)));
   2212  1.1  mrg }
   2213  1.1  mrg 
   2214  1.1  mrg static void
   2215  1.1  mrg reg_emitted (enum ia64_frame_regs r)
   2216  1.1  mrg {
   2217  1.1  mrg   if (emitted_frame_related_regs[r] == 0)
   2218  1.1  mrg     emitted_frame_related_regs[r] = current_frame_info.r[r];
   2219  1.1  mrg   else
   2220  1.1  mrg     gcc_assert (emitted_frame_related_regs[r] == current_frame_info.r[r]);
   2221  1.1  mrg }
   2222  1.1  mrg 
   2223  1.1  mrg static int
   2224  1.1  mrg get_reg (enum ia64_frame_regs r)
   2225  1.1  mrg {
   2226  1.1  mrg   reg_emitted (r);
   2227  1.1  mrg   return current_frame_info.r[r];
   2228  1.1  mrg }
   2229  1.1  mrg 
   2230  1.1  mrg static bool
   2231  1.1  mrg is_emitted (int regno)
   2232  1.1  mrg {
   2233  1.1  mrg   unsigned int r;
   2234  1.1  mrg 
   2235  1.1  mrg   for (r = reg_fp; r < number_of_ia64_frame_regs; r++)
   2236  1.1  mrg     if (emitted_frame_related_regs[r] == regno)
   2237  1.1  mrg       return true;
   2238  1.1  mrg   return false;
   2239  1.1  mrg }
   2240  1.1  mrg 
   2241  1.1  mrg void
   2242  1.1  mrg ia64_reload_gp (void)
   2243  1.1  mrg {
   2244  1.1  mrg   rtx tmp;
   2245  1.1  mrg 
   2246  1.1  mrg   if (current_frame_info.r[reg_save_gp])
   2247  1.1  mrg     {
   2248  1.1  mrg       tmp = gen_rtx_REG (DImode, get_reg (reg_save_gp));
   2249  1.1  mrg     }
   2250  1.1  mrg   else
   2251  1.1  mrg     {
   2252  1.1  mrg       HOST_WIDE_INT offset;
   2253  1.1  mrg       rtx offset_r;
   2254  1.1  mrg 
   2255  1.1  mrg       offset = (current_frame_info.spill_cfa_off
   2256  1.1  mrg 	        + current_frame_info.spill_size);
   2257  1.1  mrg       if (frame_pointer_needed)
   2258  1.1  mrg         {
   2259  1.1  mrg           tmp = hard_frame_pointer_rtx;
   2260  1.1  mrg           offset = -offset;
   2261  1.1  mrg         }
   2262  1.1  mrg       else
   2263  1.1  mrg         {
   2264  1.1  mrg           tmp = stack_pointer_rtx;
   2265  1.1  mrg           offset = current_frame_info.total_size - offset;
   2266  1.1  mrg         }
   2267  1.1  mrg 
   2268  1.1  mrg       offset_r = GEN_INT (offset);
   2269  1.1  mrg       if (satisfies_constraint_I (offset_r))
   2270  1.1  mrg         emit_insn (gen_adddi3 (pic_offset_table_rtx, tmp, offset_r));
   2271  1.1  mrg       else
   2272  1.1  mrg         {
   2273  1.1  mrg           emit_move_insn (pic_offset_table_rtx, offset_r);
   2274  1.1  mrg           emit_insn (gen_adddi3 (pic_offset_table_rtx,
   2275  1.1  mrg 			         pic_offset_table_rtx, tmp));
   2276  1.1  mrg         }
   2277  1.1  mrg 
   2278  1.1  mrg       tmp = gen_rtx_MEM (DImode, pic_offset_table_rtx);
   2279  1.1  mrg     }
   2280  1.1  mrg 
   2281  1.1  mrg   emit_move_insn (pic_offset_table_rtx, tmp);
   2282  1.1  mrg }
   2283  1.1  mrg 
   2284  1.1  mrg void
   2285  1.1  mrg ia64_split_call (rtx retval, rtx addr, rtx retaddr, rtx scratch_r,
   2286  1.1  mrg 		 rtx scratch_b, int noreturn_p, int sibcall_p)
   2287  1.1  mrg {
   2288  1.1  mrg   rtx insn;
   2289  1.1  mrg   bool is_desc = false;
   2290  1.1  mrg 
   2291  1.1  mrg   /* If we find we're calling through a register, then we're actually
   2292  1.1  mrg      calling through a descriptor, so load up the values.  */
   2293  1.1  mrg   if (REG_P (addr) && GR_REGNO_P (REGNO (addr)))
   2294  1.1  mrg     {
   2295  1.1  mrg       rtx tmp;
   2296  1.1  mrg       bool addr_dead_p;
   2297  1.1  mrg 
   2298  1.1  mrg       /* ??? We are currently constrained to *not* use peep2, because
   2299  1.1  mrg 	 we can legitimately change the global lifetime of the GP
   2300  1.1  mrg 	 (in the form of killing where previously live).  This is
   2301  1.1  mrg 	 because a call through a descriptor doesn't use the previous
   2302  1.1  mrg 	 value of the GP, while a direct call does, and we do not
   2303  1.1  mrg 	 commit to either form until the split here.
   2304  1.1  mrg 
   2305  1.1  mrg 	 That said, this means that we lack precise life info for
   2306  1.1  mrg 	 whether ADDR is dead after this call.  This is not terribly
   2307  1.1  mrg 	 important, since we can fix things up essentially for free
   2308  1.1  mrg 	 with the POST_DEC below, but it's nice to not use it when we
   2309  1.1  mrg 	 can immediately tell it's not necessary.  */
   2310  1.1  mrg       addr_dead_p = ((noreturn_p || sibcall_p
   2311  1.1  mrg 		      || TEST_HARD_REG_BIT (regs_invalidated_by_call,
   2312  1.1  mrg 					    REGNO (addr)))
   2313  1.1  mrg 		     && !FUNCTION_ARG_REGNO_P (REGNO (addr)));
   2314  1.1  mrg 
   2315  1.1  mrg       /* Load the code address into scratch_b.  */
   2316  1.1  mrg       tmp = gen_rtx_POST_INC (Pmode, addr);
   2317  1.1  mrg       tmp = gen_rtx_MEM (Pmode, tmp);
   2318  1.1  mrg       emit_move_insn (scratch_r, tmp);
   2319  1.1  mrg       emit_move_insn (scratch_b, scratch_r);
   2320  1.1  mrg 
   2321  1.1  mrg       /* Load the GP address.  If ADDR is not dead here, then we must
   2322  1.1  mrg 	 revert the change made above via the POST_INCREMENT.  */
   2323  1.1  mrg       if (!addr_dead_p)
   2324  1.1  mrg 	tmp = gen_rtx_POST_DEC (Pmode, addr);
   2325  1.1  mrg       else
   2326  1.1  mrg 	tmp = addr;
   2327  1.1  mrg       tmp = gen_rtx_MEM (Pmode, tmp);
   2328  1.1  mrg       emit_move_insn (pic_offset_table_rtx, tmp);
   2329  1.1  mrg 
   2330  1.1  mrg       is_desc = true;
   2331  1.1  mrg       addr = scratch_b;
   2332  1.1  mrg     }
   2333  1.1  mrg 
   2334  1.1  mrg   if (sibcall_p)
   2335  1.1  mrg     insn = gen_sibcall_nogp (addr);
   2336  1.1  mrg   else if (retval)
   2337  1.1  mrg     insn = gen_call_value_nogp (retval, addr, retaddr);
   2338  1.1  mrg   else
   2339  1.1  mrg     insn = gen_call_nogp (addr, retaddr);
   2340  1.1  mrg   emit_call_insn (insn);
   2341  1.1  mrg 
   2342  1.1  mrg   if ((!TARGET_CONST_GP || is_desc) && !noreturn_p && !sibcall_p)
   2343  1.1  mrg     ia64_reload_gp ();
   2344  1.1  mrg }
   2345  1.1  mrg 
   2346  1.1  mrg /* Expand an atomic operation.  We want to perform MEM <CODE>= VAL atomically.
   2347  1.1  mrg 
   2348  1.1  mrg    This differs from the generic code in that we know about the zero-extending
   2349  1.1  mrg    properties of cmpxchg, and the zero-extending requirements of ar.ccv.  We
   2350  1.1  mrg    also know that ld.acq+cmpxchg.rel equals a full barrier.
   2351  1.1  mrg 
   2352  1.1  mrg    The loop we want to generate looks like
   2353  1.1  mrg 
   2354  1.1  mrg 	cmp_reg = mem;
   2355  1.1  mrg       label:
   2356  1.1  mrg         old_reg = cmp_reg;
   2357  1.1  mrg 	new_reg = cmp_reg op val;
   2358  1.1  mrg 	cmp_reg = compare-and-swap(mem, old_reg, new_reg)
   2359  1.1  mrg 	if (cmp_reg != old_reg)
   2360  1.1  mrg 	  goto label;
   2361  1.1  mrg 
   2362  1.1  mrg    Note that we only do the plain load from memory once.  Subsequent
   2363  1.1  mrg    iterations use the value loaded by the compare-and-swap pattern.  */
   2364  1.1  mrg 
   2365  1.1  mrg void
   2366  1.1  mrg ia64_expand_atomic_op (enum rtx_code code, rtx mem, rtx val,
   2367  1.1  mrg 		       rtx old_dst, rtx new_dst, enum memmodel model)
   2368  1.1  mrg {
   2369  1.1  mrg   machine_mode mode = GET_MODE (mem);
   2370  1.1  mrg   rtx old_reg, new_reg, cmp_reg, ar_ccv, label;
   2371  1.1  mrg   enum insn_code icode;
   2372  1.1  mrg 
   2373  1.1  mrg   /* Special case for using fetchadd.  */
   2374  1.1  mrg   if ((mode == SImode || mode == DImode)
   2375  1.1  mrg       && (code == PLUS || code == MINUS)
   2376  1.1  mrg       && fetchadd_operand (val, mode))
   2377  1.1  mrg     {
   2378  1.1  mrg       if (code == MINUS)
   2379  1.1  mrg 	val = GEN_INT (-INTVAL (val));
   2380  1.1  mrg 
   2381  1.1  mrg       if (!old_dst)
   2382  1.1  mrg         old_dst = gen_reg_rtx (mode);
   2383  1.1  mrg 
   2384  1.1  mrg       switch (model)
   2385  1.1  mrg 	{
   2386  1.1  mrg 	case MEMMODEL_ACQ_REL:
   2387  1.1  mrg 	case MEMMODEL_SEQ_CST:
   2388  1.1  mrg 	case MEMMODEL_SYNC_SEQ_CST:
   2389  1.1  mrg 	  emit_insn (gen_memory_barrier ());
   2390  1.1  mrg 	  /* FALLTHRU */
   2391  1.1  mrg 	case MEMMODEL_RELAXED:
   2392  1.1  mrg 	case MEMMODEL_ACQUIRE:
   2393  1.1  mrg 	case MEMMODEL_SYNC_ACQUIRE:
   2394  1.1  mrg 	case MEMMODEL_CONSUME:
   2395  1.1  mrg 	  if (mode == SImode)
   2396  1.1  mrg 	    icode = CODE_FOR_fetchadd_acq_si;
   2397  1.1  mrg 	  else
   2398  1.1  mrg 	    icode = CODE_FOR_fetchadd_acq_di;
   2399  1.1  mrg 	  break;
   2400  1.1  mrg 	case MEMMODEL_RELEASE:
   2401  1.1  mrg 	case MEMMODEL_SYNC_RELEASE:
   2402  1.1  mrg 	  if (mode == SImode)
   2403  1.1  mrg 	    icode = CODE_FOR_fetchadd_rel_si;
   2404  1.1  mrg 	  else
   2405  1.1  mrg 	    icode = CODE_FOR_fetchadd_rel_di;
   2406  1.1  mrg 	  break;
   2407  1.1  mrg 
   2408  1.1  mrg 	default:
   2409  1.1  mrg 	  gcc_unreachable ();
   2410  1.1  mrg 	}
   2411  1.1  mrg 
   2412  1.1  mrg       emit_insn (GEN_FCN (icode) (old_dst, mem, val));
   2413  1.1  mrg 
   2414  1.1  mrg       if (new_dst)
   2415  1.1  mrg 	{
   2416  1.1  mrg 	  new_reg = expand_simple_binop (mode, PLUS, old_dst, val, new_dst,
   2417  1.1  mrg 					 true, OPTAB_WIDEN);
   2418  1.1  mrg 	  if (new_reg != new_dst)
   2419  1.1  mrg 	    emit_move_insn (new_dst, new_reg);
   2420  1.1  mrg 	}
   2421  1.1  mrg       return;
   2422  1.1  mrg     }
   2423  1.1  mrg 
   2424  1.1  mrg   /* Because of the volatile mem read, we get an ld.acq, which is the
   2425  1.1  mrg      front half of the full barrier.  The end half is the cmpxchg.rel.
   2426  1.1  mrg      For relaxed and release memory models, we don't need this.  But we
   2427  1.1  mrg      also don't bother trying to prevent it either.  */
   2428  1.1  mrg   gcc_assert (is_mm_relaxed (model) || is_mm_release (model)
   2429  1.1  mrg 	      || MEM_VOLATILE_P (mem));
   2430  1.1  mrg 
   2431  1.1  mrg   old_reg = gen_reg_rtx (DImode);
   2432  1.1  mrg   cmp_reg = gen_reg_rtx (DImode);
   2433  1.1  mrg   label = gen_label_rtx ();
   2434  1.1  mrg 
   2435  1.1  mrg   if (mode != DImode)
   2436  1.1  mrg     {
   2437  1.1  mrg       val = simplify_gen_subreg (DImode, val, mode, 0);
   2438  1.1  mrg       emit_insn (gen_extend_insn (cmp_reg, mem, DImode, mode, 1));
   2439  1.1  mrg     }
   2440  1.1  mrg   else
   2441  1.1  mrg     emit_move_insn (cmp_reg, mem);
   2442  1.1  mrg 
   2443  1.1  mrg   emit_label (label);
   2444  1.1  mrg 
   2445  1.1  mrg   ar_ccv = gen_rtx_REG (DImode, AR_CCV_REGNUM);
   2446  1.1  mrg   emit_move_insn (old_reg, cmp_reg);
   2447  1.1  mrg   emit_move_insn (ar_ccv, cmp_reg);
   2448  1.1  mrg 
   2449  1.1  mrg   if (old_dst)
   2450  1.1  mrg     emit_move_insn (old_dst, gen_lowpart (mode, cmp_reg));
   2451  1.1  mrg 
   2452  1.1  mrg   new_reg = cmp_reg;
   2453  1.1  mrg   if (code == NOT)
   2454  1.1  mrg     {
   2455  1.1  mrg       new_reg = expand_simple_binop (DImode, AND, new_reg, val, NULL_RTX,
   2456  1.1  mrg 				     true, OPTAB_DIRECT);
   2457  1.1  mrg       new_reg = expand_simple_unop (DImode, code, new_reg, NULL_RTX, true);
   2458  1.1  mrg     }
   2459  1.1  mrg   else
   2460  1.1  mrg     new_reg = expand_simple_binop (DImode, code, new_reg, val, NULL_RTX,
   2461  1.1  mrg 				   true, OPTAB_DIRECT);
   2462  1.1  mrg 
   2463  1.1  mrg   if (mode != DImode)
   2464  1.1  mrg     new_reg = gen_lowpart (mode, new_reg);
   2465  1.1  mrg   if (new_dst)
   2466  1.1  mrg     emit_move_insn (new_dst, new_reg);
   2467  1.1  mrg 
   2468  1.1  mrg   switch (model)
   2469  1.1  mrg     {
   2470  1.1  mrg     case MEMMODEL_RELAXED:
   2471  1.1  mrg     case MEMMODEL_ACQUIRE:
   2472  1.1  mrg     case MEMMODEL_SYNC_ACQUIRE:
   2473  1.1  mrg     case MEMMODEL_CONSUME:
   2474  1.1  mrg       switch (mode)
   2475  1.1  mrg 	{
   2476  1.1  mrg 	case E_QImode: icode = CODE_FOR_cmpxchg_acq_qi;  break;
   2477  1.1  mrg 	case E_HImode: icode = CODE_FOR_cmpxchg_acq_hi;  break;
   2478  1.1  mrg 	case E_SImode: icode = CODE_FOR_cmpxchg_acq_si;  break;
   2479  1.1  mrg 	case E_DImode: icode = CODE_FOR_cmpxchg_acq_di;  break;
   2480  1.1  mrg 	default:
   2481  1.1  mrg 	  gcc_unreachable ();
   2482  1.1  mrg 	}
   2483  1.1  mrg       break;
   2484  1.1  mrg 
   2485  1.1  mrg     case MEMMODEL_RELEASE:
   2486  1.1  mrg     case MEMMODEL_SYNC_RELEASE:
   2487  1.1  mrg     case MEMMODEL_ACQ_REL:
   2488  1.1  mrg     case MEMMODEL_SEQ_CST:
   2489  1.1  mrg     case MEMMODEL_SYNC_SEQ_CST:
   2490  1.1  mrg       switch (mode)
   2491  1.1  mrg 	{
   2492  1.1  mrg 	case E_QImode: icode = CODE_FOR_cmpxchg_rel_qi;  break;
   2493  1.1  mrg 	case E_HImode: icode = CODE_FOR_cmpxchg_rel_hi;  break;
   2494  1.1  mrg 	case E_SImode: icode = CODE_FOR_cmpxchg_rel_si;  break;
   2495  1.1  mrg 	case E_DImode: icode = CODE_FOR_cmpxchg_rel_di;  break;
   2496  1.1  mrg 	default:
   2497  1.1  mrg 	  gcc_unreachable ();
   2498  1.1  mrg 	}
   2499  1.1  mrg       break;
   2500  1.1  mrg 
   2501  1.1  mrg     default:
   2502  1.1  mrg       gcc_unreachable ();
   2503  1.1  mrg     }
   2504  1.1  mrg 
   2505  1.1  mrg   emit_insn (GEN_FCN (icode) (cmp_reg, mem, ar_ccv, new_reg));
   2506  1.1  mrg 
   2507  1.1  mrg   emit_cmp_and_jump_insns (cmp_reg, old_reg, NE, NULL, DImode, true, label);
   2508  1.1  mrg }
   2509  1.1  mrg 
   2510  1.1  mrg /* Begin the assembly file.  */
   2512  1.1  mrg 
   2513  1.1  mrg static void
   2514  1.1  mrg ia64_file_start (void)
   2515  1.1  mrg {
   2516  1.1  mrg   default_file_start ();
   2517  1.1  mrg   emit_safe_across_calls ();
   2518  1.1  mrg }
   2519  1.1  mrg 
   2520  1.1  mrg void
   2521  1.1  mrg emit_safe_across_calls (void)
   2522  1.1  mrg {
   2523  1.1  mrg   unsigned int rs, re;
   2524  1.1  mrg   int out_state;
   2525  1.1  mrg 
   2526  1.1  mrg   rs = 1;
   2527  1.1  mrg   out_state = 0;
   2528  1.1  mrg   while (1)
   2529  1.1  mrg     {
   2530  1.1  mrg       while (rs < 64 && call_used_or_fixed_reg_p (PR_REG (rs)))
   2531  1.1  mrg 	rs++;
   2532  1.1  mrg       if (rs >= 64)
   2533  1.1  mrg 	break;
   2534  1.1  mrg       for (re = rs + 1;
   2535  1.1  mrg 	   re < 64 && ! call_used_or_fixed_reg_p (PR_REG (re)); re++)
   2536  1.1  mrg 	continue;
   2537  1.1  mrg       if (out_state == 0)
   2538  1.1  mrg 	{
   2539  1.1  mrg 	  fputs ("\t.pred.safe_across_calls ", asm_out_file);
   2540  1.1  mrg 	  out_state = 1;
   2541  1.1  mrg 	}
   2542  1.1  mrg       else
   2543  1.1  mrg 	fputc (',', asm_out_file);
   2544  1.1  mrg       if (re == rs + 1)
   2545  1.1  mrg 	fprintf (asm_out_file, "p%u", rs);
   2546  1.1  mrg       else
   2547  1.1  mrg 	fprintf (asm_out_file, "p%u-p%u", rs, re - 1);
   2548  1.1  mrg       rs = re + 1;
   2549  1.1  mrg     }
   2550  1.1  mrg   if (out_state)
   2551  1.1  mrg     fputc ('\n', asm_out_file);
   2552  1.1  mrg }
   2553  1.1  mrg 
   2554  1.1  mrg /* Globalize a declaration.  */
   2555  1.1  mrg 
   2556  1.1  mrg static void
   2557  1.1  mrg ia64_globalize_decl_name (FILE * stream, tree decl)
   2558  1.1  mrg {
   2559  1.1  mrg   const char *name = XSTR (XEXP (DECL_RTL (decl), 0), 0);
   2560  1.1  mrg   tree version_attr = lookup_attribute ("version_id", DECL_ATTRIBUTES (decl));
   2561  1.1  mrg   if (version_attr)
   2562  1.1  mrg     {
   2563  1.1  mrg       tree v = TREE_VALUE (TREE_VALUE (version_attr));
   2564  1.1  mrg       const char *p = TREE_STRING_POINTER (v);
   2565  1.1  mrg       fprintf (stream, "\t.alias %s#, \"%s{%s}\"\n", name, name, p);
   2566  1.1  mrg     }
   2567  1.1  mrg   targetm.asm_out.globalize_label (stream, name);
   2568  1.1  mrg   if (TREE_CODE (decl) == FUNCTION_DECL)
   2569  1.1  mrg     ASM_OUTPUT_TYPE_DIRECTIVE (stream, name, "function");
   2570  1.1  mrg }
   2571  1.1  mrg 
   2572  1.1  mrg /* Helper function for ia64_compute_frame_size: find an appropriate general
   2573  1.1  mrg    register to spill some special register to.  SPECIAL_SPILL_MASK contains
   2574  1.1  mrg    bits in GR0 to GR31 that have already been allocated by this routine.
   2575  1.1  mrg    TRY_LOCALS is true if we should attempt to locate a local regnum.  */
   2576  1.1  mrg 
   2577  1.1  mrg static int
   2578  1.1  mrg find_gr_spill (enum ia64_frame_regs r, int try_locals)
   2579  1.1  mrg {
   2580  1.1  mrg   int regno;
   2581  1.1  mrg 
   2582  1.1  mrg   if (emitted_frame_related_regs[r] != 0)
   2583  1.1  mrg     {
   2584  1.1  mrg       regno = emitted_frame_related_regs[r];
   2585  1.1  mrg       if (regno >= LOC_REG (0) && regno < LOC_REG (80 - frame_pointer_needed)
   2586  1.1  mrg 	  && current_frame_info.n_local_regs < regno - LOC_REG (0) + 1)
   2587  1.1  mrg         current_frame_info.n_local_regs = regno - LOC_REG (0) + 1;
   2588  1.1  mrg       else if (crtl->is_leaf
   2589  1.1  mrg                && regno >= GR_REG (1) && regno <= GR_REG (31))
   2590  1.1  mrg         current_frame_info.gr_used_mask |= 1 << regno;
   2591  1.1  mrg 
   2592  1.1  mrg       return regno;
   2593  1.1  mrg     }
   2594  1.1  mrg 
   2595  1.1  mrg   /* If this is a leaf function, first try an otherwise unused
   2596  1.1  mrg      call-clobbered register.  */
   2597  1.1  mrg   if (crtl->is_leaf)
   2598  1.1  mrg     {
   2599  1.1  mrg       for (regno = GR_REG (1); regno <= GR_REG (31); regno++)
   2600  1.1  mrg 	if (! df_regs_ever_live_p (regno)
   2601  1.1  mrg 	    && call_used_or_fixed_reg_p (regno)
   2602  1.1  mrg 	    && ! fixed_regs[regno]
   2603  1.1  mrg 	    && ! global_regs[regno]
   2604  1.1  mrg 	    && ((current_frame_info.gr_used_mask >> regno) & 1) == 0
   2605  1.1  mrg             && ! is_emitted (regno))
   2606  1.1  mrg 	  {
   2607  1.1  mrg 	    current_frame_info.gr_used_mask |= 1 << regno;
   2608  1.1  mrg 	    return regno;
   2609  1.1  mrg 	  }
   2610  1.1  mrg     }
   2611  1.1  mrg 
   2612  1.1  mrg   if (try_locals)
   2613  1.1  mrg     {
   2614  1.1  mrg       regno = current_frame_info.n_local_regs;
   2615  1.1  mrg       /* If there is a frame pointer, then we can't use loc79, because
   2616  1.1  mrg 	 that is HARD_FRAME_POINTER_REGNUM.  In particular, see the
   2617  1.1  mrg 	 reg_name switching code in ia64_expand_prologue.  */
   2618  1.1  mrg       while (regno < (80 - frame_pointer_needed))
   2619  1.1  mrg 	if (! is_emitted (LOC_REG (regno++)))
   2620  1.1  mrg 	  {
   2621  1.1  mrg 	    current_frame_info.n_local_regs = regno;
   2622  1.1  mrg 	    return LOC_REG (regno - 1);
   2623  1.1  mrg 	  }
   2624  1.1  mrg     }
   2625  1.1  mrg 
   2626  1.1  mrg   /* Failed to find a general register to spill to.  Must use stack.  */
   2627  1.1  mrg   return 0;
   2628  1.1  mrg }
   2629  1.1  mrg 
   2630  1.1  mrg /* In order to make for nice schedules, we try to allocate every temporary
   2631  1.1  mrg    to a different register.  We must of course stay away from call-saved,
   2632  1.1  mrg    fixed, and global registers.  We must also stay away from registers
   2633  1.1  mrg    allocated in current_frame_info.gr_used_mask, since those include regs
   2634  1.1  mrg    used all through the prologue.
   2635  1.1  mrg 
   2636  1.1  mrg    Any register allocated here must be used immediately.  The idea is to
   2637  1.1  mrg    aid scheduling, not to solve data flow problems.  */
   2638  1.1  mrg 
   2639  1.1  mrg static int last_scratch_gr_reg;
   2640  1.1  mrg 
   2641  1.1  mrg static int
   2642  1.1  mrg next_scratch_gr_reg (void)
   2643  1.1  mrg {
   2644  1.1  mrg   int i, regno;
   2645  1.1  mrg 
   2646  1.1  mrg   for (i = 0; i < 32; ++i)
   2647  1.1  mrg     {
   2648  1.1  mrg       regno = (last_scratch_gr_reg + i + 1) & 31;
   2649  1.1  mrg       if (call_used_or_fixed_reg_p (regno)
   2650  1.1  mrg 	  && ! fixed_regs[regno]
   2651  1.1  mrg 	  && ! global_regs[regno]
   2652  1.1  mrg 	  && ((current_frame_info.gr_used_mask >> regno) & 1) == 0)
   2653  1.1  mrg 	{
   2654  1.1  mrg 	  last_scratch_gr_reg = regno;
   2655  1.1  mrg 	  return regno;
   2656  1.1  mrg 	}
   2657  1.1  mrg     }
   2658  1.1  mrg 
   2659  1.1  mrg   /* There must be _something_ available.  */
   2660  1.1  mrg   gcc_unreachable ();
   2661  1.1  mrg }
   2662  1.1  mrg 
   2663  1.1  mrg /* Helper function for ia64_compute_frame_size, called through
   2664  1.1  mrg    diddle_return_value.  Mark REG in current_frame_info.gr_used_mask.  */
   2665  1.1  mrg 
   2666  1.1  mrg static void
   2667  1.1  mrg mark_reg_gr_used_mask (rtx reg, void *data ATTRIBUTE_UNUSED)
   2668  1.1  mrg {
   2669  1.1  mrg   unsigned int regno = REGNO (reg);
   2670  1.1  mrg   if (regno < 32)
   2671  1.1  mrg     {
   2672  1.1  mrg       unsigned int i, n = REG_NREGS (reg);
   2673  1.1  mrg       for (i = 0; i < n; ++i)
   2674  1.1  mrg 	current_frame_info.gr_used_mask |= 1 << (regno + i);
   2675  1.1  mrg     }
   2676  1.1  mrg }
   2677  1.1  mrg 
   2678  1.1  mrg 
   2679  1.1  mrg /* Returns the number of bytes offset between the frame pointer and the stack
   2680  1.1  mrg    pointer for the current function.  SIZE is the number of bytes of space
   2681  1.1  mrg    needed for local variables.  */
   2682  1.1  mrg 
   2683  1.1  mrg static void
   2684  1.1  mrg ia64_compute_frame_size (HOST_WIDE_INT size)
   2685  1.1  mrg {
   2686  1.1  mrg   HOST_WIDE_INT total_size;
   2687  1.1  mrg   HOST_WIDE_INT spill_size = 0;
   2688  1.1  mrg   HOST_WIDE_INT extra_spill_size = 0;
   2689  1.1  mrg   HOST_WIDE_INT pretend_args_size;
   2690  1.1  mrg   HARD_REG_SET mask;
   2691  1.1  mrg   int n_spilled = 0;
   2692  1.1  mrg   int spilled_gr_p = 0;
   2693  1.1  mrg   int spilled_fr_p = 0;
   2694  1.1  mrg   unsigned int regno;
   2695  1.1  mrg   int min_regno;
   2696  1.1  mrg   int max_regno;
   2697  1.1  mrg   int i;
   2698  1.1  mrg 
   2699  1.1  mrg   if (current_frame_info.initialized)
   2700  1.1  mrg     return;
   2701  1.1  mrg 
   2702  1.1  mrg   memset (&current_frame_info, 0, sizeof current_frame_info);
   2703  1.1  mrg   CLEAR_HARD_REG_SET (mask);
   2704  1.1  mrg 
   2705  1.1  mrg   /* Don't allocate scratches to the return register.  */
   2706  1.1  mrg   diddle_return_value (mark_reg_gr_used_mask, NULL);
   2707  1.1  mrg 
   2708  1.1  mrg   /* Don't allocate scratches to the EH scratch registers.  */
   2709  1.1  mrg   if (cfun->machine->ia64_eh_epilogue_sp)
   2710  1.1  mrg     mark_reg_gr_used_mask (cfun->machine->ia64_eh_epilogue_sp, NULL);
   2711  1.1  mrg   if (cfun->machine->ia64_eh_epilogue_bsp)
   2712  1.1  mrg     mark_reg_gr_used_mask (cfun->machine->ia64_eh_epilogue_bsp, NULL);
   2713  1.1  mrg 
   2714  1.1  mrg   /* Static stack checking uses r2 and r3.  */
   2715  1.1  mrg   if (flag_stack_check == STATIC_BUILTIN_STACK_CHECK
   2716  1.1  mrg       || flag_stack_clash_protection)
   2717  1.1  mrg     current_frame_info.gr_used_mask |= 0xc;
   2718  1.1  mrg 
   2719  1.1  mrg   /* Find the size of the register stack frame.  We have only 80 local
   2720  1.1  mrg      registers, because we reserve 8 for the inputs and 8 for the
   2721  1.1  mrg      outputs.  */
   2722  1.1  mrg 
   2723  1.1  mrg   /* Skip HARD_FRAME_POINTER_REGNUM (loc79) when frame_pointer_needed,
   2724  1.1  mrg      since we'll be adjusting that down later.  */
   2725  1.1  mrg   regno = LOC_REG (78) + ! frame_pointer_needed;
   2726  1.1  mrg   for (; regno >= LOC_REG (0); regno--)
   2727  1.1  mrg     if (df_regs_ever_live_p (regno) && !is_emitted (regno))
   2728  1.1  mrg       break;
   2729  1.1  mrg   current_frame_info.n_local_regs = regno - LOC_REG (0) + 1;
   2730  1.1  mrg 
   2731  1.1  mrg   /* For functions marked with the syscall_linkage attribute, we must mark
   2732  1.1  mrg      all eight input registers as in use, so that locals aren't visible to
   2733  1.1  mrg      the caller.  */
   2734  1.1  mrg 
   2735  1.1  mrg   if (cfun->machine->n_varargs > 0
   2736  1.1  mrg       || lookup_attribute ("syscall_linkage",
   2737  1.1  mrg 			   TYPE_ATTRIBUTES (TREE_TYPE (current_function_decl))))
   2738  1.1  mrg     current_frame_info.n_input_regs = 8;
   2739  1.1  mrg   else
   2740  1.1  mrg     {
   2741  1.1  mrg       for (regno = IN_REG (7); regno >= IN_REG (0); regno--)
   2742  1.1  mrg 	if (df_regs_ever_live_p (regno))
   2743  1.1  mrg 	  break;
   2744  1.1  mrg       current_frame_info.n_input_regs = regno - IN_REG (0) + 1;
   2745  1.1  mrg     }
   2746  1.1  mrg 
   2747  1.1  mrg   for (regno = OUT_REG (7); regno >= OUT_REG (0); regno--)
   2748  1.1  mrg     if (df_regs_ever_live_p (regno))
   2749  1.1  mrg       break;
   2750  1.1  mrg   i = regno - OUT_REG (0) + 1;
   2751  1.1  mrg 
   2752  1.1  mrg #ifndef PROFILE_HOOK
   2753  1.1  mrg   /* When -p profiling, we need one output register for the mcount argument.
   2754  1.1  mrg      Likewise for -a profiling for the bb_init_func argument.  For -ax
   2755  1.1  mrg      profiling, we need two output registers for the two bb_init_trace_func
   2756  1.1  mrg      arguments.  */
   2757  1.1  mrg   if (crtl->profile)
   2758  1.1  mrg     i = MAX (i, 1);
   2759  1.1  mrg #endif
   2760  1.1  mrg   current_frame_info.n_output_regs = i;
   2761  1.1  mrg 
   2762  1.1  mrg   /* ??? No rotating register support yet.  */
   2763  1.1  mrg   current_frame_info.n_rotate_regs = 0;
   2764  1.1  mrg 
   2765  1.1  mrg   /* Discover which registers need spilling, and how much room that
   2766  1.1  mrg      will take.  Begin with floating point and general registers,
   2767  1.1  mrg      which will always wind up on the stack.  */
   2768  1.1  mrg 
   2769  1.1  mrg   for (regno = FR_REG (2); regno <= FR_REG (127); regno++)
   2770  1.1  mrg     if (df_regs_ever_live_p (regno) && ! call_used_or_fixed_reg_p (regno))
   2771  1.1  mrg       {
   2772  1.1  mrg 	SET_HARD_REG_BIT (mask, regno);
   2773  1.1  mrg 	spill_size += 16;
   2774  1.1  mrg 	n_spilled += 1;
   2775  1.1  mrg 	spilled_fr_p = 1;
   2776  1.1  mrg       }
   2777  1.1  mrg 
   2778  1.1  mrg   for (regno = GR_REG (1); regno <= GR_REG (31); regno++)
   2779  1.1  mrg     if (df_regs_ever_live_p (regno) && ! call_used_or_fixed_reg_p (regno))
   2780  1.1  mrg       {
   2781  1.1  mrg 	SET_HARD_REG_BIT (mask, regno);
   2782  1.1  mrg 	spill_size += 8;
   2783  1.1  mrg 	n_spilled += 1;
   2784  1.1  mrg 	spilled_gr_p = 1;
   2785  1.1  mrg       }
   2786  1.1  mrg 
   2787  1.1  mrg   for (regno = BR_REG (1); regno <= BR_REG (7); regno++)
   2788  1.1  mrg     if (df_regs_ever_live_p (regno) && ! call_used_or_fixed_reg_p (regno))
   2789  1.1  mrg       {
   2790  1.1  mrg 	SET_HARD_REG_BIT (mask, regno);
   2791  1.1  mrg 	spill_size += 8;
   2792  1.1  mrg 	n_spilled += 1;
   2793  1.1  mrg       }
   2794  1.1  mrg 
   2795  1.1  mrg   /* Now come all special registers that might get saved in other
   2796  1.1  mrg      general registers.  */
   2797  1.1  mrg 
   2798  1.1  mrg   if (frame_pointer_needed)
   2799  1.1  mrg     {
   2800  1.1  mrg       current_frame_info.r[reg_fp] = find_gr_spill (reg_fp, 1);
   2801  1.1  mrg       /* If we did not get a register, then we take LOC79.  This is guaranteed
   2802  1.1  mrg 	 to be free, even if regs_ever_live is already set, because this is
   2803  1.1  mrg 	 HARD_FRAME_POINTER_REGNUM.  This requires incrementing n_local_regs,
   2804  1.1  mrg 	 as we don't count loc79 above.  */
   2805  1.1  mrg       if (current_frame_info.r[reg_fp] == 0)
   2806  1.1  mrg 	{
   2807  1.1  mrg 	  current_frame_info.r[reg_fp] = LOC_REG (79);
   2808  1.1  mrg 	  current_frame_info.n_local_regs = LOC_REG (79) - LOC_REG (0) + 1;
   2809  1.1  mrg 	}
   2810  1.1  mrg     }
   2811  1.1  mrg 
   2812  1.1  mrg   if (! crtl->is_leaf)
   2813  1.1  mrg     {
   2814  1.1  mrg       /* Emit a save of BR0 if we call other functions.  Do this even
   2815  1.1  mrg 	 if this function doesn't return, as EH depends on this to be
   2816  1.1  mrg 	 able to unwind the stack.  */
   2817  1.1  mrg       SET_HARD_REG_BIT (mask, BR_REG (0));
   2818  1.1  mrg 
   2819  1.1  mrg       current_frame_info.r[reg_save_b0] = find_gr_spill (reg_save_b0, 1);
   2820  1.1  mrg       if (current_frame_info.r[reg_save_b0] == 0)
   2821  1.1  mrg 	{
   2822  1.1  mrg 	  extra_spill_size += 8;
   2823  1.1  mrg 	  n_spilled += 1;
   2824  1.1  mrg 	}
   2825  1.1  mrg 
   2826  1.1  mrg       /* Similarly for ar.pfs.  */
   2827  1.1  mrg       SET_HARD_REG_BIT (mask, AR_PFS_REGNUM);
   2828  1.1  mrg       current_frame_info.r[reg_save_ar_pfs] = find_gr_spill (reg_save_ar_pfs, 1);
   2829  1.1  mrg       if (current_frame_info.r[reg_save_ar_pfs] == 0)
   2830  1.1  mrg 	{
   2831  1.1  mrg 	  extra_spill_size += 8;
   2832  1.1  mrg 	  n_spilled += 1;
   2833  1.1  mrg 	}
   2834  1.1  mrg 
   2835  1.1  mrg       /* Similarly for gp.  Note that if we're calling setjmp, the stacked
   2836  1.1  mrg 	 registers are clobbered, so we fall back to the stack.  */
   2837  1.1  mrg       current_frame_info.r[reg_save_gp]
   2838  1.1  mrg 	= (cfun->calls_setjmp ? 0 : find_gr_spill (reg_save_gp, 1));
   2839  1.1  mrg       if (current_frame_info.r[reg_save_gp] == 0)
   2840  1.1  mrg 	{
   2841  1.1  mrg 	  SET_HARD_REG_BIT (mask, GR_REG (1));
   2842  1.1  mrg 	  spill_size += 8;
   2843  1.1  mrg 	  n_spilled += 1;
   2844  1.1  mrg 	}
   2845  1.1  mrg     }
   2846  1.1  mrg   else
   2847  1.1  mrg     {
   2848  1.1  mrg       if (df_regs_ever_live_p (BR_REG (0))
   2849  1.1  mrg 	  && ! call_used_or_fixed_reg_p (BR_REG (0)))
   2850  1.1  mrg 	{
   2851  1.1  mrg 	  SET_HARD_REG_BIT (mask, BR_REG (0));
   2852  1.1  mrg 	  extra_spill_size += 8;
   2853  1.1  mrg 	  n_spilled += 1;
   2854  1.1  mrg 	}
   2855  1.1  mrg 
   2856  1.1  mrg       if (df_regs_ever_live_p (AR_PFS_REGNUM))
   2857  1.1  mrg 	{
   2858  1.1  mrg 	  SET_HARD_REG_BIT (mask, AR_PFS_REGNUM);
   2859  1.1  mrg  	  current_frame_info.r[reg_save_ar_pfs]
   2860  1.1  mrg             = find_gr_spill (reg_save_ar_pfs, 1);
   2861  1.1  mrg 	  if (current_frame_info.r[reg_save_ar_pfs] == 0)
   2862  1.1  mrg 	    {
   2863  1.1  mrg 	      extra_spill_size += 8;
   2864  1.1  mrg 	      n_spilled += 1;
   2865  1.1  mrg 	    }
   2866  1.1  mrg 	}
   2867  1.1  mrg     }
   2868  1.1  mrg 
   2869  1.1  mrg   /* Unwind descriptor hackery: things are most efficient if we allocate
   2870  1.1  mrg      consecutive GR save registers for RP, PFS, FP in that order. However,
   2871  1.1  mrg      it is absolutely critical that FP get the only hard register that's
   2872  1.1  mrg      guaranteed to be free, so we allocated it first.  If all three did
   2873  1.1  mrg      happen to be allocated hard regs, and are consecutive, rearrange them
   2874  1.1  mrg      into the preferred order now.
   2875  1.1  mrg 
   2876  1.1  mrg      If we have already emitted code for any of those registers,
   2877  1.1  mrg      then it's already too late to change.  */
   2878  1.1  mrg   min_regno = MIN (current_frame_info.r[reg_fp],
   2879  1.1  mrg 		   MIN (current_frame_info.r[reg_save_b0],
   2880  1.1  mrg 			current_frame_info.r[reg_save_ar_pfs]));
   2881  1.1  mrg   max_regno = MAX (current_frame_info.r[reg_fp],
   2882  1.1  mrg 		   MAX (current_frame_info.r[reg_save_b0],
   2883  1.1  mrg 			current_frame_info.r[reg_save_ar_pfs]));
   2884  1.1  mrg   if (min_regno > 0
   2885  1.1  mrg       && min_regno + 2 == max_regno
   2886  1.1  mrg       && (current_frame_info.r[reg_fp] == min_regno + 1
   2887  1.1  mrg 	  || current_frame_info.r[reg_save_b0] == min_regno + 1
   2888  1.1  mrg 	  || current_frame_info.r[reg_save_ar_pfs] == min_regno + 1)
   2889  1.1  mrg       && (emitted_frame_related_regs[reg_save_b0] == 0
   2890  1.1  mrg 	  || emitted_frame_related_regs[reg_save_b0] == min_regno)
   2891  1.1  mrg       && (emitted_frame_related_regs[reg_save_ar_pfs] == 0
   2892  1.1  mrg 	  || emitted_frame_related_regs[reg_save_ar_pfs] == min_regno + 1)
   2893  1.1  mrg       && (emitted_frame_related_regs[reg_fp] == 0
   2894  1.1  mrg 	  || emitted_frame_related_regs[reg_fp] == min_regno + 2))
   2895  1.1  mrg     {
   2896  1.1  mrg       current_frame_info.r[reg_save_b0] = min_regno;
   2897  1.1  mrg       current_frame_info.r[reg_save_ar_pfs] = min_regno + 1;
   2898  1.1  mrg       current_frame_info.r[reg_fp] = min_regno + 2;
   2899  1.1  mrg     }
   2900  1.1  mrg 
   2901  1.1  mrg   /* See if we need to store the predicate register block.  */
   2902  1.1  mrg   for (regno = PR_REG (0); regno <= PR_REG (63); regno++)
   2903  1.1  mrg     if (df_regs_ever_live_p (regno) && ! call_used_or_fixed_reg_p (regno))
   2904  1.1  mrg       break;
   2905  1.1  mrg   if (regno <= PR_REG (63))
   2906  1.1  mrg     {
   2907  1.1  mrg       SET_HARD_REG_BIT (mask, PR_REG (0));
   2908  1.1  mrg       current_frame_info.r[reg_save_pr] = find_gr_spill (reg_save_pr, 1);
   2909  1.1  mrg       if (current_frame_info.r[reg_save_pr] == 0)
   2910  1.1  mrg 	{
   2911  1.1  mrg 	  extra_spill_size += 8;
   2912  1.1  mrg 	  n_spilled += 1;
   2913  1.1  mrg 	}
   2914  1.1  mrg 
   2915  1.1  mrg       /* ??? Mark them all as used so that register renaming and such
   2916  1.1  mrg 	 are free to use them.  */
   2917  1.1  mrg       for (regno = PR_REG (0); regno <= PR_REG (63); regno++)
   2918  1.1  mrg 	df_set_regs_ever_live (regno, true);
   2919  1.1  mrg     }
   2920  1.1  mrg 
   2921  1.1  mrg   /* If we're forced to use st8.spill, we're forced to save and restore
   2922  1.1  mrg      ar.unat as well.  The check for existing liveness allows inline asm
   2923  1.1  mrg      to touch ar.unat.  */
   2924  1.1  mrg   if (spilled_gr_p || cfun->machine->n_varargs
   2925  1.1  mrg       || df_regs_ever_live_p (AR_UNAT_REGNUM))
   2926  1.1  mrg     {
   2927  1.1  mrg       df_set_regs_ever_live (AR_UNAT_REGNUM, true);
   2928  1.1  mrg       SET_HARD_REG_BIT (mask, AR_UNAT_REGNUM);
   2929  1.1  mrg       current_frame_info.r[reg_save_ar_unat]
   2930  1.1  mrg         = find_gr_spill (reg_save_ar_unat, spill_size == 0);
   2931  1.1  mrg       if (current_frame_info.r[reg_save_ar_unat] == 0)
   2932  1.1  mrg 	{
   2933  1.1  mrg 	  extra_spill_size += 8;
   2934  1.1  mrg 	  n_spilled += 1;
   2935  1.1  mrg 	}
   2936  1.1  mrg     }
   2937  1.1  mrg 
   2938  1.1  mrg   if (df_regs_ever_live_p (AR_LC_REGNUM))
   2939  1.1  mrg     {
   2940  1.1  mrg       SET_HARD_REG_BIT (mask, AR_LC_REGNUM);
   2941  1.1  mrg       current_frame_info.r[reg_save_ar_lc]
   2942  1.1  mrg         = find_gr_spill (reg_save_ar_lc, spill_size == 0);
   2943  1.1  mrg       if (current_frame_info.r[reg_save_ar_lc] == 0)
   2944  1.1  mrg 	{
   2945  1.1  mrg 	  extra_spill_size += 8;
   2946  1.1  mrg 	  n_spilled += 1;
   2947  1.1  mrg 	}
   2948  1.1  mrg     }
   2949  1.1  mrg 
   2950  1.1  mrg   /* If we have an odd number of words of pretend arguments written to
   2951  1.1  mrg      the stack, then the FR save area will be unaligned.  We round the
   2952  1.1  mrg      size of this area up to keep things 16 byte aligned.  */
   2953  1.1  mrg   if (spilled_fr_p)
   2954  1.1  mrg     pretend_args_size = IA64_STACK_ALIGN (crtl->args.pretend_args_size);
   2955  1.1  mrg   else
   2956  1.1  mrg     pretend_args_size = crtl->args.pretend_args_size;
   2957  1.1  mrg 
   2958  1.1  mrg   total_size = (spill_size + extra_spill_size + size + pretend_args_size
   2959  1.1  mrg 		+ crtl->outgoing_args_size);
   2960  1.1  mrg   total_size = IA64_STACK_ALIGN (total_size);
   2961  1.1  mrg 
   2962  1.1  mrg   /* We always use the 16-byte scratch area provided by the caller, but
   2963  1.1  mrg      if we are a leaf function, there's no one to which we need to provide
   2964  1.1  mrg      a scratch area.  However, if the function allocates dynamic stack space,
   2965  1.1  mrg      the dynamic offset is computed early and contains STACK_POINTER_OFFSET,
   2966  1.1  mrg      so we need to cope.  */
   2967  1.1  mrg   if (crtl->is_leaf && !cfun->calls_alloca)
   2968  1.1  mrg     total_size = MAX (0, total_size - 16);
   2969  1.1  mrg 
   2970  1.1  mrg   current_frame_info.total_size = total_size;
   2971  1.1  mrg   current_frame_info.spill_cfa_off = pretend_args_size - 16;
   2972  1.1  mrg   current_frame_info.spill_size = spill_size;
   2973  1.1  mrg   current_frame_info.extra_spill_size = extra_spill_size;
   2974  1.1  mrg   current_frame_info.mask = mask;
   2975  1.1  mrg   current_frame_info.n_spilled = n_spilled;
   2976  1.1  mrg   current_frame_info.initialized = reload_completed;
   2977  1.1  mrg }
   2978  1.1  mrg 
   2979  1.1  mrg /* Worker function for TARGET_CAN_ELIMINATE.  */
   2980  1.1  mrg 
   2981  1.1  mrg bool
   2982  1.1  mrg ia64_can_eliminate (const int from ATTRIBUTE_UNUSED, const int to)
   2983  1.1  mrg {
   2984  1.1  mrg   return (to == BR_REG (0) ? crtl->is_leaf : true);
   2985  1.1  mrg }
   2986  1.1  mrg 
   2987  1.1  mrg /* Compute the initial difference between the specified pair of registers.  */
   2988  1.1  mrg 
   2989  1.1  mrg HOST_WIDE_INT
   2990  1.1  mrg ia64_initial_elimination_offset (int from, int to)
   2991  1.1  mrg {
   2992  1.1  mrg   HOST_WIDE_INT offset;
   2993  1.1  mrg 
   2994  1.1  mrg   ia64_compute_frame_size (get_frame_size ());
   2995  1.1  mrg   switch (from)
   2996  1.1  mrg     {
   2997  1.1  mrg     case FRAME_POINTER_REGNUM:
   2998  1.1  mrg       switch (to)
   2999  1.1  mrg 	{
   3000  1.1  mrg 	case HARD_FRAME_POINTER_REGNUM:
   3001  1.1  mrg 	  offset = -current_frame_info.total_size;
   3002  1.1  mrg 	  if (!crtl->is_leaf || cfun->calls_alloca)
   3003  1.1  mrg 	    offset += 16 + crtl->outgoing_args_size;
   3004  1.1  mrg 	  break;
   3005  1.1  mrg 
   3006  1.1  mrg 	case STACK_POINTER_REGNUM:
   3007  1.1  mrg 	  offset = 0;
   3008  1.1  mrg 	  if (!crtl->is_leaf || cfun->calls_alloca)
   3009  1.1  mrg 	    offset += 16 + crtl->outgoing_args_size;
   3010  1.1  mrg 	  break;
   3011  1.1  mrg 
   3012  1.1  mrg 	default:
   3013  1.1  mrg 	  gcc_unreachable ();
   3014  1.1  mrg 	}
   3015  1.1  mrg       break;
   3016  1.1  mrg 
   3017  1.1  mrg     case ARG_POINTER_REGNUM:
   3018  1.1  mrg       /* Arguments start above the 16 byte save area, unless stdarg
   3019  1.1  mrg 	 in which case we store through the 16 byte save area.  */
   3020  1.1  mrg       switch (to)
   3021  1.1  mrg 	{
   3022  1.1  mrg 	case HARD_FRAME_POINTER_REGNUM:
   3023  1.1  mrg 	  offset = 16 - crtl->args.pretend_args_size;
   3024  1.1  mrg 	  break;
   3025  1.1  mrg 
   3026  1.1  mrg 	case STACK_POINTER_REGNUM:
   3027  1.1  mrg 	  offset = (current_frame_info.total_size
   3028  1.1  mrg 		    + 16 - crtl->args.pretend_args_size);
   3029  1.1  mrg 	  break;
   3030  1.1  mrg 
   3031  1.1  mrg 	default:
   3032  1.1  mrg 	  gcc_unreachable ();
   3033  1.1  mrg 	}
   3034  1.1  mrg       break;
   3035  1.1  mrg 
   3036  1.1  mrg     default:
   3037  1.1  mrg       gcc_unreachable ();
   3038  1.1  mrg     }
   3039  1.1  mrg 
   3040  1.1  mrg   return offset;
   3041  1.1  mrg }
   3042  1.1  mrg 
   3043  1.1  mrg /* If there are more than a trivial number of register spills, we use
   3044  1.1  mrg    two interleaved iterators so that we can get two memory references
   3045  1.1  mrg    per insn group.
   3046  1.1  mrg 
   3047  1.1  mrg    In order to simplify things in the prologue and epilogue expanders,
   3048  1.1  mrg    we use helper functions to fix up the memory references after the
   3049  1.1  mrg    fact with the appropriate offsets to a POST_MODIFY memory mode.
   3050  1.1  mrg    The following data structure tracks the state of the two iterators
   3051  1.1  mrg    while insns are being emitted.  */
   3052  1.1  mrg 
   3053  1.1  mrg struct spill_fill_data
   3054  1.1  mrg {
   3055  1.1  mrg   rtx_insn *init_after;		/* point at which to emit initializations */
   3056  1.1  mrg   rtx init_reg[2];		/* initial base register */
   3057  1.1  mrg   rtx iter_reg[2];		/* the iterator registers */
   3058  1.1  mrg   rtx *prev_addr[2];		/* address of last memory use */
   3059  1.1  mrg   rtx_insn *prev_insn[2];	/* the insn corresponding to prev_addr */
   3060  1.1  mrg   HOST_WIDE_INT prev_off[2];	/* last offset */
   3061  1.1  mrg   int n_iter;			/* number of iterators in use */
   3062  1.1  mrg   int next_iter;		/* next iterator to use */
   3063  1.1  mrg   unsigned int save_gr_used_mask;
   3064  1.1  mrg };
   3065  1.1  mrg 
   3066  1.1  mrg static struct spill_fill_data spill_fill_data;
   3067  1.1  mrg 
   3068  1.1  mrg static void
   3069  1.1  mrg setup_spill_pointers (int n_spills, rtx init_reg, HOST_WIDE_INT cfa_off)
   3070  1.1  mrg {
   3071  1.1  mrg   int i;
   3072  1.1  mrg 
   3073  1.1  mrg   spill_fill_data.init_after = get_last_insn ();
   3074  1.1  mrg   spill_fill_data.init_reg[0] = init_reg;
   3075  1.1  mrg   spill_fill_data.init_reg[1] = init_reg;
   3076  1.1  mrg   spill_fill_data.prev_addr[0] = NULL;
   3077  1.1  mrg   spill_fill_data.prev_addr[1] = NULL;
   3078  1.1  mrg   spill_fill_data.prev_insn[0] = NULL;
   3079  1.1  mrg   spill_fill_data.prev_insn[1] = NULL;
   3080  1.1  mrg   spill_fill_data.prev_off[0] = cfa_off;
   3081  1.1  mrg   spill_fill_data.prev_off[1] = cfa_off;
   3082  1.1  mrg   spill_fill_data.next_iter = 0;
   3083  1.1  mrg   spill_fill_data.save_gr_used_mask = current_frame_info.gr_used_mask;
   3084  1.1  mrg 
   3085  1.1  mrg   spill_fill_data.n_iter = 1 + (n_spills > 2);
   3086  1.1  mrg   for (i = 0; i < spill_fill_data.n_iter; ++i)
   3087  1.1  mrg     {
   3088  1.1  mrg       int regno = next_scratch_gr_reg ();
   3089  1.1  mrg       spill_fill_data.iter_reg[i] = gen_rtx_REG (DImode, regno);
   3090  1.1  mrg       current_frame_info.gr_used_mask |= 1 << regno;
   3091  1.1  mrg     }
   3092  1.1  mrg }
   3093  1.1  mrg 
   3094  1.1  mrg static void
   3095  1.1  mrg finish_spill_pointers (void)
   3096  1.1  mrg {
   3097  1.1  mrg   current_frame_info.gr_used_mask = spill_fill_data.save_gr_used_mask;
   3098  1.1  mrg }
   3099  1.1  mrg 
   3100  1.1  mrg static rtx
   3101  1.1  mrg spill_restore_mem (rtx reg, HOST_WIDE_INT cfa_off)
   3102  1.1  mrg {
   3103  1.1  mrg   int iter = spill_fill_data.next_iter;
   3104  1.1  mrg   HOST_WIDE_INT disp = spill_fill_data.prev_off[iter] - cfa_off;
   3105  1.1  mrg   rtx disp_rtx = GEN_INT (disp);
   3106  1.1  mrg   rtx mem;
   3107  1.1  mrg 
   3108  1.1  mrg   if (spill_fill_data.prev_addr[iter])
   3109  1.1  mrg     {
   3110  1.1  mrg       if (satisfies_constraint_N (disp_rtx))
   3111  1.1  mrg 	{
   3112  1.1  mrg 	  *spill_fill_data.prev_addr[iter]
   3113  1.1  mrg 	    = gen_rtx_POST_MODIFY (DImode, spill_fill_data.iter_reg[iter],
   3114  1.1  mrg 				   gen_rtx_PLUS (DImode,
   3115  1.1  mrg 						 spill_fill_data.iter_reg[iter],
   3116  1.1  mrg 						 disp_rtx));
   3117  1.1  mrg 	  add_reg_note (spill_fill_data.prev_insn[iter],
   3118  1.1  mrg 			REG_INC, spill_fill_data.iter_reg[iter]);
   3119  1.1  mrg 	}
   3120  1.1  mrg       else
   3121  1.1  mrg 	{
   3122  1.1  mrg 	  /* ??? Could use register post_modify for loads.  */
   3123  1.1  mrg 	  if (!satisfies_constraint_I (disp_rtx))
   3124  1.1  mrg 	    {
   3125  1.1  mrg 	      rtx tmp = gen_rtx_REG (DImode, next_scratch_gr_reg ());
   3126  1.1  mrg 	      emit_move_insn (tmp, disp_rtx);
   3127  1.1  mrg 	      disp_rtx = tmp;
   3128  1.1  mrg 	    }
   3129  1.1  mrg 	  emit_insn (gen_adddi3 (spill_fill_data.iter_reg[iter],
   3130  1.1  mrg 				 spill_fill_data.iter_reg[iter], disp_rtx));
   3131  1.1  mrg 	}
   3132  1.1  mrg     }
   3133  1.1  mrg   /* Micro-optimization: if we've created a frame pointer, it's at
   3134  1.1  mrg      CFA 0, which may allow the real iterator to be initialized lower,
   3135  1.1  mrg      slightly increasing parallelism.  Also, if there are few saves
   3136  1.1  mrg      it may eliminate the iterator entirely.  */
   3137  1.1  mrg   else if (disp == 0
   3138  1.1  mrg 	   && spill_fill_data.init_reg[iter] == stack_pointer_rtx
   3139  1.1  mrg 	   && frame_pointer_needed)
   3140  1.1  mrg     {
   3141  1.1  mrg       mem = gen_rtx_MEM (GET_MODE (reg), hard_frame_pointer_rtx);
   3142  1.1  mrg       set_mem_alias_set (mem, get_varargs_alias_set ());
   3143  1.1  mrg       return mem;
   3144  1.1  mrg     }
   3145  1.1  mrg   else
   3146  1.1  mrg     {
   3147  1.1  mrg       rtx seq;
   3148  1.1  mrg       rtx_insn *insn;
   3149  1.1  mrg 
   3150  1.1  mrg       if (disp == 0)
   3151  1.1  mrg 	seq = gen_movdi (spill_fill_data.iter_reg[iter],
   3152  1.1  mrg 			 spill_fill_data.init_reg[iter]);
   3153  1.1  mrg       else
   3154  1.1  mrg 	{
   3155  1.1  mrg 	  start_sequence ();
   3156  1.1  mrg 
   3157  1.1  mrg 	  if (!satisfies_constraint_I (disp_rtx))
   3158  1.1  mrg 	    {
   3159  1.1  mrg 	      rtx tmp = gen_rtx_REG (DImode, next_scratch_gr_reg ());
   3160  1.1  mrg 	      emit_move_insn (tmp, disp_rtx);
   3161  1.1  mrg 	      disp_rtx = tmp;
   3162  1.1  mrg 	    }
   3163  1.1  mrg 
   3164  1.1  mrg 	  emit_insn (gen_adddi3 (spill_fill_data.iter_reg[iter],
   3165  1.1  mrg 				 spill_fill_data.init_reg[iter],
   3166  1.1  mrg 				 disp_rtx));
   3167  1.1  mrg 
   3168  1.1  mrg 	  seq = get_insns ();
   3169  1.1  mrg 	  end_sequence ();
   3170  1.1  mrg 	}
   3171  1.1  mrg 
   3172  1.1  mrg       /* Careful for being the first insn in a sequence.  */
   3173  1.1  mrg       if (spill_fill_data.init_after)
   3174  1.1  mrg 	insn = emit_insn_after (seq, spill_fill_data.init_after);
   3175  1.1  mrg       else
   3176  1.1  mrg 	{
   3177  1.1  mrg 	  rtx_insn *first = get_insns ();
   3178  1.1  mrg 	  if (first)
   3179  1.1  mrg 	    insn = emit_insn_before (seq, first);
   3180  1.1  mrg 	  else
   3181  1.1  mrg 	    insn = emit_insn (seq);
   3182  1.1  mrg 	}
   3183  1.1  mrg       spill_fill_data.init_after = insn;
   3184  1.1  mrg     }
   3185  1.1  mrg 
   3186  1.1  mrg   mem = gen_rtx_MEM (GET_MODE (reg), spill_fill_data.iter_reg[iter]);
   3187  1.1  mrg 
   3188  1.1  mrg   /* ??? Not all of the spills are for varargs, but some of them are.
   3189  1.1  mrg      The rest of the spills belong in an alias set of their own.  But
   3190  1.1  mrg      it doesn't actually hurt to include them here.  */
   3191  1.1  mrg   set_mem_alias_set (mem, get_varargs_alias_set ());
   3192  1.1  mrg 
   3193  1.1  mrg   spill_fill_data.prev_addr[iter] = &XEXP (mem, 0);
   3194  1.1  mrg   spill_fill_data.prev_off[iter] = cfa_off;
   3195  1.1  mrg 
   3196  1.1  mrg   if (++iter >= spill_fill_data.n_iter)
   3197  1.1  mrg     iter = 0;
   3198  1.1  mrg   spill_fill_data.next_iter = iter;
   3199  1.1  mrg 
   3200  1.1  mrg   return mem;
   3201  1.1  mrg }
   3202  1.1  mrg 
   3203  1.1  mrg static void
   3204  1.1  mrg do_spill (rtx (*move_fn) (rtx, rtx, rtx), rtx reg, HOST_WIDE_INT cfa_off,
   3205  1.1  mrg 	  rtx frame_reg)
   3206  1.1  mrg {
   3207  1.1  mrg   int iter = spill_fill_data.next_iter;
   3208  1.1  mrg   rtx mem;
   3209  1.1  mrg   rtx_insn *insn;
   3210  1.1  mrg 
   3211  1.1  mrg   mem = spill_restore_mem (reg, cfa_off);
   3212  1.1  mrg   insn = emit_insn ((*move_fn) (mem, reg, GEN_INT (cfa_off)));
   3213  1.1  mrg   spill_fill_data.prev_insn[iter] = insn;
   3214  1.1  mrg 
   3215  1.1  mrg   if (frame_reg)
   3216  1.1  mrg     {
   3217  1.1  mrg       rtx base;
   3218  1.1  mrg       HOST_WIDE_INT off;
   3219  1.1  mrg 
   3220  1.1  mrg       RTX_FRAME_RELATED_P (insn) = 1;
   3221  1.1  mrg 
   3222  1.1  mrg       /* Don't even pretend that the unwind code can intuit its way
   3223  1.1  mrg 	 through a pair of interleaved post_modify iterators.  Just
   3224  1.1  mrg 	 provide the correct answer.  */
   3225  1.1  mrg 
   3226  1.1  mrg       if (frame_pointer_needed)
   3227  1.1  mrg 	{
   3228  1.1  mrg 	  base = hard_frame_pointer_rtx;
   3229  1.1  mrg 	  off = - cfa_off;
   3230  1.1  mrg 	}
   3231  1.1  mrg       else
   3232  1.1  mrg 	{
   3233  1.1  mrg 	  base = stack_pointer_rtx;
   3234  1.1  mrg 	  off = current_frame_info.total_size - cfa_off;
   3235  1.1  mrg 	}
   3236  1.1  mrg 
   3237  1.1  mrg       add_reg_note (insn, REG_CFA_OFFSET,
   3238  1.1  mrg 		    gen_rtx_SET (gen_rtx_MEM (GET_MODE (reg),
   3239  1.1  mrg 					      plus_constant (Pmode,
   3240  1.1  mrg 							     base, off)),
   3241  1.1  mrg 				 frame_reg));
   3242  1.1  mrg     }
   3243  1.1  mrg }
   3244  1.1  mrg 
   3245  1.1  mrg static void
   3246  1.1  mrg do_restore (rtx (*move_fn) (rtx, rtx, rtx), rtx reg, HOST_WIDE_INT cfa_off)
   3247  1.1  mrg {
   3248  1.1  mrg   int iter = spill_fill_data.next_iter;
   3249  1.1  mrg   rtx_insn *insn;
   3250  1.1  mrg 
   3251  1.1  mrg   insn = emit_insn ((*move_fn) (reg, spill_restore_mem (reg, cfa_off),
   3252  1.1  mrg 				GEN_INT (cfa_off)));
   3253  1.1  mrg   spill_fill_data.prev_insn[iter] = insn;
   3254  1.1  mrg }
   3255  1.1  mrg 
   3256  1.1  mrg /* Wrapper functions that discards the CONST_INT spill offset.  These
   3257  1.1  mrg    exist so that we can give gr_spill/gr_fill the offset they need and
   3258  1.1  mrg    use a consistent function interface.  */
   3259  1.1  mrg 
   3260  1.1  mrg static rtx
   3261  1.1  mrg gen_movdi_x (rtx dest, rtx src, rtx offset ATTRIBUTE_UNUSED)
   3262  1.1  mrg {
   3263  1.1  mrg   return gen_movdi (dest, src);
   3264  1.1  mrg }
   3265  1.1  mrg 
   3266  1.1  mrg static rtx
   3267  1.1  mrg gen_fr_spill_x (rtx dest, rtx src, rtx offset ATTRIBUTE_UNUSED)
   3268  1.1  mrg {
   3269  1.1  mrg   return gen_fr_spill (dest, src);
   3270  1.1  mrg }
   3271  1.1  mrg 
   3272  1.1  mrg static rtx
   3273  1.1  mrg gen_fr_restore_x (rtx dest, rtx src, rtx offset ATTRIBUTE_UNUSED)
   3274  1.1  mrg {
   3275  1.1  mrg   return gen_fr_restore (dest, src);
   3276  1.1  mrg }
   3277  1.1  mrg 
   3278  1.1  mrg #define PROBE_INTERVAL (1 << STACK_CHECK_PROBE_INTERVAL_EXP)
   3279  1.1  mrg 
   3280  1.1  mrg /* See Table 6.2 of the IA-64 Software Developer Manual, Volume 2.  */
   3281  1.1  mrg #define BACKING_STORE_SIZE(N) ((N) > 0 ? ((N) + (N)/63 + 1) * 8 : 0)
   3282  1.1  mrg 
   3283  1.1  mrg /* Emit code to probe a range of stack addresses from FIRST to FIRST+SIZE,
   3284  1.1  mrg    inclusive.  These are offsets from the current stack pointer.  BS_SIZE
   3285  1.1  mrg    is the size of the backing store.  ??? This clobbers r2 and r3.  */
   3286  1.1  mrg 
   3287  1.1  mrg static void
   3288  1.1  mrg ia64_emit_probe_stack_range (HOST_WIDE_INT first, HOST_WIDE_INT size,
   3289  1.1  mrg 			     int bs_size)
   3290  1.1  mrg {
   3291  1.1  mrg   rtx r2 = gen_rtx_REG (Pmode, GR_REG (2));
   3292  1.1  mrg   rtx r3 = gen_rtx_REG (Pmode, GR_REG (3));
   3293  1.1  mrg   rtx p6 = gen_rtx_REG (BImode, PR_REG (6));
   3294  1.1  mrg 
   3295  1.1  mrg   /* On the IA-64 there is a second stack in memory, namely the Backing Store
   3296  1.1  mrg      of the Register Stack Engine.  We also need to probe it after checking
   3297  1.1  mrg      that the 2 stacks don't overlap.  */
   3298  1.1  mrg   emit_insn (gen_bsp_value (r3));
   3299  1.1  mrg   emit_move_insn (r2, GEN_INT (-(first + size)));
   3300  1.1  mrg 
   3301  1.1  mrg   /* Compare current value of BSP and SP registers.  */
   3302  1.1  mrg   emit_insn (gen_rtx_SET (p6, gen_rtx_fmt_ee (LTU, BImode,
   3303  1.1  mrg 					      r3, stack_pointer_rtx)));
   3304  1.1  mrg 
   3305  1.1  mrg   /* Compute the address of the probe for the Backing Store (which grows
   3306  1.1  mrg      towards higher addresses).  We probe only at the first offset of
   3307  1.1  mrg      the next page because some OS (eg Linux/ia64) only extend the
   3308  1.1  mrg      backing store when this specific address is hit (but generate a SEGV
   3309  1.1  mrg      on other address).  Page size is the worst case (4KB).  The reserve
   3310  1.1  mrg      size is at least 4096 - (96 + 2) * 8 = 3312 bytes, which is enough.
   3311  1.1  mrg      Also compute the address of the last probe for the memory stack
   3312  1.1  mrg      (which grows towards lower addresses).  */
   3313  1.1  mrg   emit_insn (gen_rtx_SET (r3, plus_constant (Pmode, r3, 4095)));
   3314  1.1  mrg   emit_insn (gen_rtx_SET (r2, gen_rtx_PLUS (Pmode, stack_pointer_rtx, r2)));
   3315  1.1  mrg 
   3316  1.1  mrg   /* Compare them and raise SEGV if the former has topped the latter.  */
   3317  1.1  mrg   emit_insn (gen_rtx_COND_EXEC (VOIDmode,
   3318  1.1  mrg 				gen_rtx_fmt_ee (NE, VOIDmode, p6, const0_rtx),
   3319  1.1  mrg 				gen_rtx_SET (p6, gen_rtx_fmt_ee (GEU, BImode,
   3320  1.1  mrg 								 r3, r2))));
   3321  1.1  mrg   emit_insn (gen_rtx_SET (gen_rtx_ZERO_EXTRACT (DImode, r3, GEN_INT (12),
   3322  1.1  mrg 						const0_rtx),
   3323  1.1  mrg 			  const0_rtx));
   3324  1.1  mrg   emit_insn (gen_rtx_COND_EXEC (VOIDmode,
   3325  1.1  mrg 				gen_rtx_fmt_ee (NE, VOIDmode, p6, const0_rtx),
   3326  1.1  mrg 				gen_rtx_TRAP_IF (VOIDmode, const1_rtx,
   3327  1.1  mrg 						 GEN_INT (11))));
   3328  1.1  mrg 
   3329  1.1  mrg   /* Probe the Backing Store if necessary.  */
   3330  1.1  mrg   if (bs_size > 0)
   3331  1.1  mrg     emit_stack_probe (r3);
   3332  1.1  mrg 
   3333  1.1  mrg   /* Probe the memory stack if necessary.  */
   3334  1.1  mrg   if (size == 0)
   3335  1.1  mrg     ;
   3336  1.1  mrg 
   3337  1.1  mrg   /* See if we have a constant small number of probes to generate.  If so,
   3338  1.1  mrg      that's the easy case.  */
   3339  1.1  mrg   else if (size <= PROBE_INTERVAL)
   3340  1.1  mrg     emit_stack_probe (r2);
   3341  1.1  mrg 
   3342  1.1  mrg   /* The run-time loop is made up of 9 insns in the generic case while this
   3343  1.1  mrg      compile-time loop is made up of 5+2*(n-2) insns for n # of intervals.  */
   3344  1.1  mrg   else if (size <= 4 * PROBE_INTERVAL)
   3345  1.1  mrg     {
   3346  1.1  mrg       HOST_WIDE_INT i;
   3347  1.1  mrg 
   3348  1.1  mrg       emit_move_insn (r2, GEN_INT (-(first + PROBE_INTERVAL)));
   3349  1.1  mrg       emit_insn (gen_rtx_SET (r2,
   3350  1.1  mrg 			      gen_rtx_PLUS (Pmode, stack_pointer_rtx, r2)));
   3351  1.1  mrg       emit_stack_probe (r2);
   3352  1.1  mrg 
   3353  1.1  mrg       /* Probe at FIRST + N * PROBE_INTERVAL for values of N from 2 until
   3354  1.1  mrg 	 it exceeds SIZE.  If only two probes are needed, this will not
   3355  1.1  mrg 	 generate any code.  Then probe at FIRST + SIZE.  */
   3356  1.1  mrg       for (i = 2 * PROBE_INTERVAL; i < size; i += PROBE_INTERVAL)
   3357  1.1  mrg 	{
   3358  1.1  mrg 	  emit_insn (gen_rtx_SET (r2,
   3359  1.1  mrg 				  plus_constant (Pmode, r2, -PROBE_INTERVAL)));
   3360  1.1  mrg 	  emit_stack_probe (r2);
   3361  1.1  mrg 	}
   3362  1.1  mrg 
   3363  1.1  mrg       emit_insn (gen_rtx_SET (r2,
   3364  1.1  mrg 			      plus_constant (Pmode, r2,
   3365  1.1  mrg 					     (i - PROBE_INTERVAL) - size)));
   3366  1.1  mrg       emit_stack_probe (r2);
   3367  1.1  mrg     }
   3368  1.1  mrg 
   3369  1.1  mrg   /* Otherwise, do the same as above, but in a loop.  Note that we must be
   3370  1.1  mrg      extra careful with variables wrapping around because we might be at
   3371  1.1  mrg      the very top (or the very bottom) of the address space and we have
   3372  1.1  mrg      to be able to handle this case properly; in particular, we use an
   3373  1.1  mrg      equality test for the loop condition.  */
   3374  1.1  mrg   else
   3375  1.1  mrg     {
   3376  1.1  mrg       HOST_WIDE_INT rounded_size;
   3377  1.1  mrg 
   3378  1.1  mrg       emit_move_insn (r2, GEN_INT (-first));
   3379  1.1  mrg 
   3380  1.1  mrg 
   3381  1.1  mrg       /* Step 1: round SIZE to the previous multiple of the interval.  */
   3382  1.1  mrg 
   3383  1.1  mrg       rounded_size = size & -PROBE_INTERVAL;
   3384  1.1  mrg 
   3385  1.1  mrg 
   3386  1.1  mrg       /* Step 2: compute initial and final value of the loop counter.  */
   3387  1.1  mrg 
   3388  1.1  mrg       /* TEST_ADDR = SP + FIRST.  */
   3389  1.1  mrg       emit_insn (gen_rtx_SET (r2,
   3390  1.1  mrg 			      gen_rtx_PLUS (Pmode, stack_pointer_rtx, r2)));
   3391  1.1  mrg 
   3392  1.1  mrg       /* LAST_ADDR = SP + FIRST + ROUNDED_SIZE.  */
   3393  1.1  mrg       if (rounded_size > (1 << 21))
   3394  1.1  mrg 	{
   3395  1.1  mrg 	  emit_move_insn (r3, GEN_INT (-rounded_size));
   3396  1.1  mrg 	  emit_insn (gen_rtx_SET (r3, gen_rtx_PLUS (Pmode, r2, r3)));
   3397  1.1  mrg 	}
   3398  1.1  mrg       else
   3399  1.1  mrg         emit_insn (gen_rtx_SET (r3, gen_rtx_PLUS (Pmode, r2,
   3400  1.1  mrg 						  GEN_INT (-rounded_size))));
   3401  1.1  mrg 
   3402  1.1  mrg 
   3403  1.1  mrg       /* Step 3: the loop
   3404  1.1  mrg 
   3405  1.1  mrg 	 do
   3406  1.1  mrg 	   {
   3407  1.1  mrg 	     TEST_ADDR = TEST_ADDR + PROBE_INTERVAL
   3408  1.1  mrg 	     probe at TEST_ADDR
   3409  1.1  mrg 	   }
   3410  1.1  mrg 	 while (TEST_ADDR != LAST_ADDR)
   3411  1.1  mrg 
   3412  1.1  mrg 	 probes at FIRST + N * PROBE_INTERVAL for values of N from 1
   3413  1.1  mrg 	 until it is equal to ROUNDED_SIZE.  */
   3414  1.1  mrg 
   3415  1.1  mrg       emit_insn (gen_probe_stack_range (r2, r2, r3));
   3416  1.1  mrg 
   3417  1.1  mrg 
   3418  1.1  mrg       /* Step 4: probe at FIRST + SIZE if we cannot assert at compile-time
   3419  1.1  mrg 	 that SIZE is equal to ROUNDED_SIZE.  */
   3420  1.1  mrg 
   3421  1.1  mrg       /* TEMP = SIZE - ROUNDED_SIZE.  */
   3422  1.1  mrg       if (size != rounded_size)
   3423  1.1  mrg 	{
   3424  1.1  mrg 	  emit_insn (gen_rtx_SET (r2, plus_constant (Pmode, r2,
   3425  1.1  mrg 						     rounded_size - size)));
   3426  1.1  mrg 	  emit_stack_probe (r2);
   3427  1.1  mrg 	}
   3428  1.1  mrg     }
   3429  1.1  mrg 
   3430  1.1  mrg   /* Make sure nothing is scheduled before we are done.  */
   3431  1.1  mrg   emit_insn (gen_blockage ());
   3432  1.1  mrg }
   3433  1.1  mrg 
   3434  1.1  mrg /* Probe a range of stack addresses from REG1 to REG2 inclusive.  These are
   3435  1.1  mrg    absolute addresses.  */
   3436  1.1  mrg 
   3437  1.1  mrg const char *
   3438  1.1  mrg output_probe_stack_range (rtx reg1, rtx reg2)
   3439  1.1  mrg {
   3440  1.1  mrg   static int labelno = 0;
   3441  1.1  mrg   char loop_lab[32];
   3442  1.1  mrg   rtx xops[3];
   3443  1.1  mrg 
   3444  1.1  mrg   ASM_GENERATE_INTERNAL_LABEL (loop_lab, "LPSRL", labelno++);
   3445  1.1  mrg 
   3446  1.1  mrg   /* Loop.  */
   3447  1.1  mrg   ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, loop_lab);
   3448  1.1  mrg 
   3449  1.1  mrg   /* TEST_ADDR = TEST_ADDR + PROBE_INTERVAL.  */
   3450  1.1  mrg   xops[0] = reg1;
   3451  1.1  mrg   xops[1] = GEN_INT (-PROBE_INTERVAL);
   3452  1.1  mrg   output_asm_insn ("addl %0 = %1, %0", xops);
   3453  1.1  mrg   fputs ("\t;;\n", asm_out_file);
   3454  1.1  mrg 
   3455  1.1  mrg   /* Probe at TEST_ADDR.  */
   3456  1.1  mrg   output_asm_insn ("probe.w.fault %0, 0", xops);
   3457  1.1  mrg 
   3458  1.1  mrg   /* Test if TEST_ADDR == LAST_ADDR.  */
   3459  1.1  mrg   xops[1] = reg2;
   3460  1.1  mrg   xops[2] = gen_rtx_REG (BImode, PR_REG (6));
   3461  1.1  mrg   output_asm_insn ("cmp.eq %2, %I2 = %0, %1", xops);
   3462  1.1  mrg 
   3463  1.1  mrg   /* Branch.  */
   3464  1.1  mrg   fprintf (asm_out_file, "\t(%s) br.cond.dpnt ", reg_names [PR_REG (7)]);
   3465  1.1  mrg   assemble_name_raw (asm_out_file, loop_lab);
   3466  1.1  mrg   fputc ('\n', asm_out_file);
   3467  1.1  mrg 
   3468  1.1  mrg   return "";
   3469  1.1  mrg }
   3470  1.1  mrg 
   3471  1.1  mrg /* Called after register allocation to add any instructions needed for the
   3472  1.1  mrg    prologue.  Using a prologue insn is favored compared to putting all of the
   3473  1.1  mrg    instructions in output_function_prologue(), since it allows the scheduler
   3474  1.1  mrg    to intermix instructions with the saves of the caller saved registers.  In
   3475  1.1  mrg    some cases, it might be necessary to emit a barrier instruction as the last
   3476  1.1  mrg    insn to prevent such scheduling.
   3477  1.1  mrg 
   3478  1.1  mrg    Also any insns generated here should have RTX_FRAME_RELATED_P(insn) = 1
   3479  1.1  mrg    so that the debug info generation code can handle them properly.
   3480  1.1  mrg 
   3481  1.1  mrg    The register save area is laid out like so:
   3482  1.1  mrg    cfa+16
   3483  1.1  mrg 	[ varargs spill area ]
   3484  1.1  mrg 	[ fr register spill area ]
   3485  1.1  mrg 	[ br register spill area ]
   3486  1.1  mrg 	[ ar register spill area ]
   3487  1.1  mrg 	[ pr register spill area ]
   3488  1.1  mrg 	[ gr register spill area ] */
   3489  1.1  mrg 
   3490  1.1  mrg /* ??? Get inefficient code when the frame size is larger than can fit in an
   3491  1.1  mrg    adds instruction.  */
   3492  1.1  mrg 
   3493  1.1  mrg void
   3494  1.1  mrg ia64_expand_prologue (void)
   3495  1.1  mrg {
   3496  1.1  mrg   rtx_insn *insn;
   3497  1.1  mrg   rtx ar_pfs_save_reg, ar_unat_save_reg;
   3498  1.1  mrg   int i, epilogue_p, regno, alt_regno, cfa_off, n_varargs;
   3499  1.1  mrg   rtx reg, alt_reg;
   3500  1.1  mrg 
   3501  1.1  mrg   ia64_compute_frame_size (get_frame_size ());
   3502  1.1  mrg   last_scratch_gr_reg = 15;
   3503  1.1  mrg 
   3504  1.1  mrg   if (flag_stack_usage_info)
   3505  1.1  mrg     current_function_static_stack_size = current_frame_info.total_size;
   3506  1.1  mrg 
   3507  1.1  mrg   if (flag_stack_check == STATIC_BUILTIN_STACK_CHECK
   3508  1.1  mrg       || flag_stack_clash_protection)
   3509  1.1  mrg     {
   3510  1.1  mrg       HOST_WIDE_INT size = current_frame_info.total_size;
   3511  1.1  mrg       int bs_size = BACKING_STORE_SIZE (current_frame_info.n_input_regs
   3512  1.1  mrg 					  + current_frame_info.n_local_regs);
   3513  1.1  mrg 
   3514  1.1  mrg       if (crtl->is_leaf && !cfun->calls_alloca)
   3515  1.1  mrg 	{
   3516  1.1  mrg 	  if (size > PROBE_INTERVAL && size > get_stack_check_protect ())
   3517  1.1  mrg 	    ia64_emit_probe_stack_range (get_stack_check_protect (),
   3518  1.1  mrg 					 size - get_stack_check_protect (),
   3519  1.1  mrg 					 bs_size);
   3520  1.1  mrg 	  else if (size + bs_size > get_stack_check_protect ())
   3521  1.1  mrg 	    ia64_emit_probe_stack_range (get_stack_check_protect (),
   3522  1.1  mrg 					 0, bs_size);
   3523  1.1  mrg 	}
   3524  1.1  mrg       else if (size + bs_size > 0)
   3525  1.1  mrg 	ia64_emit_probe_stack_range (get_stack_check_protect (), size, bs_size);
   3526  1.1  mrg     }
   3527  1.1  mrg 
   3528  1.1  mrg   if (dump_file)
   3529  1.1  mrg     {
   3530  1.1  mrg       fprintf (dump_file, "ia64 frame related registers "
   3531  1.1  mrg                "recorded in current_frame_info.r[]:\n");
   3532  1.1  mrg #define PRINTREG(a) if (current_frame_info.r[a]) \
   3533  1.1  mrg         fprintf(dump_file, "%s = %d\n", #a, current_frame_info.r[a])
   3534  1.1  mrg       PRINTREG(reg_fp);
   3535  1.1  mrg       PRINTREG(reg_save_b0);
   3536  1.1  mrg       PRINTREG(reg_save_pr);
   3537  1.1  mrg       PRINTREG(reg_save_ar_pfs);
   3538  1.1  mrg       PRINTREG(reg_save_ar_unat);
   3539  1.1  mrg       PRINTREG(reg_save_ar_lc);
   3540  1.1  mrg       PRINTREG(reg_save_gp);
   3541  1.1  mrg #undef PRINTREG
   3542  1.1  mrg     }
   3543  1.1  mrg 
   3544  1.1  mrg   /* If there is no epilogue, then we don't need some prologue insns.
   3545  1.1  mrg      We need to avoid emitting the dead prologue insns, because flow
   3546  1.1  mrg      will complain about them.  */
   3547  1.1  mrg   if (optimize)
   3548  1.1  mrg     {
   3549  1.1  mrg       edge e;
   3550  1.1  mrg       edge_iterator ei;
   3551  1.1  mrg 
   3552  1.1  mrg       FOR_EACH_EDGE (e, ei, EXIT_BLOCK_PTR_FOR_FN (cfun)->preds)
   3553  1.1  mrg 	if ((e->flags & EDGE_FAKE) == 0
   3554  1.1  mrg 	    && (e->flags & EDGE_FALLTHRU) != 0)
   3555  1.1  mrg 	  break;
   3556  1.1  mrg       epilogue_p = (e != NULL);
   3557  1.1  mrg     }
   3558  1.1  mrg   else
   3559  1.1  mrg     epilogue_p = 1;
   3560  1.1  mrg 
   3561  1.1  mrg   /* Set the local, input, and output register names.  We need to do this
   3562  1.1  mrg      for GNU libc, which creates crti.S/crtn.S by splitting initfini.c in
   3563  1.1  mrg      half.  If we use in/loc/out register names, then we get assembler errors
   3564  1.1  mrg      in crtn.S because there is no alloc insn or regstk directive in there.  */
   3565  1.1  mrg   if (! TARGET_REG_NAMES)
   3566  1.1  mrg     {
   3567  1.1  mrg       int inputs = current_frame_info.n_input_regs;
   3568  1.1  mrg       int locals = current_frame_info.n_local_regs;
   3569  1.1  mrg       int outputs = current_frame_info.n_output_regs;
   3570  1.1  mrg 
   3571  1.1  mrg       for (i = 0; i < inputs; i++)
   3572  1.1  mrg 	reg_names[IN_REG (i)] = ia64_reg_numbers[i];
   3573  1.1  mrg       for (i = 0; i < locals; i++)
   3574  1.1  mrg 	reg_names[LOC_REG (i)] = ia64_reg_numbers[inputs + i];
   3575  1.1  mrg       for (i = 0; i < outputs; i++)
   3576  1.1  mrg 	reg_names[OUT_REG (i)] = ia64_reg_numbers[inputs + locals + i];
   3577  1.1  mrg     }
   3578  1.1  mrg 
   3579  1.1  mrg   /* Set the frame pointer register name.  The regnum is logically loc79,
   3580  1.1  mrg      but of course we'll not have allocated that many locals.  Rather than
   3581  1.1  mrg      worrying about renumbering the existing rtxs, we adjust the name.  */
   3582  1.1  mrg   /* ??? This code means that we can never use one local register when
   3583  1.1  mrg      there is a frame pointer.  loc79 gets wasted in this case, as it is
   3584  1.1  mrg      renamed to a register that will never be used.  See also the try_locals
   3585  1.1  mrg      code in find_gr_spill.  */
   3586  1.1  mrg   if (current_frame_info.r[reg_fp])
   3587  1.1  mrg     {
   3588  1.1  mrg       const char *tmp = reg_names[HARD_FRAME_POINTER_REGNUM];
   3589  1.1  mrg       reg_names[HARD_FRAME_POINTER_REGNUM]
   3590  1.1  mrg 	= reg_names[current_frame_info.r[reg_fp]];
   3591  1.1  mrg       reg_names[current_frame_info.r[reg_fp]] = tmp;
   3592  1.1  mrg     }
   3593  1.1  mrg 
   3594  1.1  mrg   /* We don't need an alloc instruction if we've used no outputs or locals.  */
   3595  1.1  mrg   if (current_frame_info.n_local_regs == 0
   3596  1.1  mrg       && current_frame_info.n_output_regs == 0
   3597  1.1  mrg       && current_frame_info.n_input_regs <= crtl->args.info.int_regs
   3598  1.1  mrg       && !TEST_HARD_REG_BIT (current_frame_info.mask, AR_PFS_REGNUM))
   3599  1.1  mrg     {
   3600  1.1  mrg       /* If there is no alloc, but there are input registers used, then we
   3601  1.1  mrg 	 need a .regstk directive.  */
   3602  1.1  mrg       current_frame_info.need_regstk = (TARGET_REG_NAMES != 0);
   3603  1.1  mrg       ar_pfs_save_reg = NULL_RTX;
   3604  1.1  mrg     }
   3605  1.1  mrg   else
   3606  1.1  mrg     {
   3607  1.1  mrg       current_frame_info.need_regstk = 0;
   3608  1.1  mrg 
   3609  1.1  mrg       if (current_frame_info.r[reg_save_ar_pfs])
   3610  1.1  mrg         {
   3611  1.1  mrg 	  regno = current_frame_info.r[reg_save_ar_pfs];
   3612  1.1  mrg 	  reg_emitted (reg_save_ar_pfs);
   3613  1.1  mrg 	}
   3614  1.1  mrg       else
   3615  1.1  mrg 	regno = next_scratch_gr_reg ();
   3616  1.1  mrg       ar_pfs_save_reg = gen_rtx_REG (DImode, regno);
   3617  1.1  mrg 
   3618  1.1  mrg       insn = emit_insn (gen_alloc (ar_pfs_save_reg,
   3619  1.1  mrg 				   GEN_INT (current_frame_info.n_input_regs),
   3620  1.1  mrg 				   GEN_INT (current_frame_info.n_local_regs),
   3621  1.1  mrg 				   GEN_INT (current_frame_info.n_output_regs),
   3622  1.1  mrg 				   GEN_INT (current_frame_info.n_rotate_regs)));
   3623  1.1  mrg       if (current_frame_info.r[reg_save_ar_pfs])
   3624  1.1  mrg 	{
   3625  1.1  mrg 	  RTX_FRAME_RELATED_P (insn) = 1;
   3626  1.1  mrg 	  add_reg_note (insn, REG_CFA_REGISTER,
   3627  1.1  mrg 			gen_rtx_SET (ar_pfs_save_reg,
   3628  1.1  mrg 				     gen_rtx_REG (DImode, AR_PFS_REGNUM)));
   3629  1.1  mrg 	}
   3630  1.1  mrg     }
   3631  1.1  mrg 
   3632  1.1  mrg   /* Set up frame pointer, stack pointer, and spill iterators.  */
   3633  1.1  mrg 
   3634  1.1  mrg   n_varargs = cfun->machine->n_varargs;
   3635  1.1  mrg   setup_spill_pointers (current_frame_info.n_spilled + n_varargs,
   3636  1.1  mrg 			stack_pointer_rtx, 0);
   3637  1.1  mrg 
   3638  1.1  mrg   if (frame_pointer_needed)
   3639  1.1  mrg     {
   3640  1.1  mrg       insn = emit_move_insn (hard_frame_pointer_rtx, stack_pointer_rtx);
   3641  1.1  mrg       RTX_FRAME_RELATED_P (insn) = 1;
   3642  1.1  mrg 
   3643  1.1  mrg       /* Force the unwind info to recognize this as defining a new CFA,
   3644  1.1  mrg 	 rather than some temp register setup.  */
   3645  1.1  mrg       add_reg_note (insn, REG_CFA_ADJUST_CFA, NULL_RTX);
   3646  1.1  mrg     }
   3647  1.1  mrg 
   3648  1.1  mrg   if (current_frame_info.total_size != 0)
   3649  1.1  mrg     {
   3650  1.1  mrg       rtx frame_size_rtx = GEN_INT (- current_frame_info.total_size);
   3651  1.1  mrg       rtx offset;
   3652  1.1  mrg 
   3653  1.1  mrg       if (satisfies_constraint_I (frame_size_rtx))
   3654  1.1  mrg 	offset = frame_size_rtx;
   3655  1.1  mrg       else
   3656  1.1  mrg 	{
   3657  1.1  mrg 	  regno = next_scratch_gr_reg ();
   3658  1.1  mrg 	  offset = gen_rtx_REG (DImode, regno);
   3659  1.1  mrg 	  emit_move_insn (offset, frame_size_rtx);
   3660  1.1  mrg 	}
   3661  1.1  mrg 
   3662  1.1  mrg       insn = emit_insn (gen_adddi3 (stack_pointer_rtx,
   3663  1.1  mrg 				    stack_pointer_rtx, offset));
   3664  1.1  mrg 
   3665  1.1  mrg       if (! frame_pointer_needed)
   3666  1.1  mrg 	{
   3667  1.1  mrg 	  RTX_FRAME_RELATED_P (insn) = 1;
   3668  1.1  mrg 	  add_reg_note (insn, REG_CFA_ADJUST_CFA,
   3669  1.1  mrg 			gen_rtx_SET (stack_pointer_rtx,
   3670  1.1  mrg 				     gen_rtx_PLUS (DImode,
   3671  1.1  mrg 						   stack_pointer_rtx,
   3672  1.1  mrg 						   frame_size_rtx)));
   3673  1.1  mrg 	}
   3674  1.1  mrg 
   3675  1.1  mrg       /* ??? At this point we must generate a magic insn that appears to
   3676  1.1  mrg 	 modify the stack pointer, the frame pointer, and all spill
   3677  1.1  mrg 	 iterators.  This would allow the most scheduling freedom.  For
   3678  1.1  mrg 	 now, just hard stop.  */
   3679  1.1  mrg       emit_insn (gen_blockage ());
   3680  1.1  mrg     }
   3681  1.1  mrg 
   3682  1.1  mrg   /* Must copy out ar.unat before doing any integer spills.  */
   3683  1.1  mrg   if (TEST_HARD_REG_BIT (current_frame_info.mask, AR_UNAT_REGNUM))
   3684  1.1  mrg     {
   3685  1.1  mrg       if (current_frame_info.r[reg_save_ar_unat])
   3686  1.1  mrg         {
   3687  1.1  mrg 	  ar_unat_save_reg
   3688  1.1  mrg 	    = gen_rtx_REG (DImode, current_frame_info.r[reg_save_ar_unat]);
   3689  1.1  mrg 	  reg_emitted (reg_save_ar_unat);
   3690  1.1  mrg 	}
   3691  1.1  mrg       else
   3692  1.1  mrg 	{
   3693  1.1  mrg 	  alt_regno = next_scratch_gr_reg ();
   3694  1.1  mrg 	  ar_unat_save_reg = gen_rtx_REG (DImode, alt_regno);
   3695  1.1  mrg 	  current_frame_info.gr_used_mask |= 1 << alt_regno;
   3696  1.1  mrg 	}
   3697  1.1  mrg 
   3698  1.1  mrg       reg = gen_rtx_REG (DImode, AR_UNAT_REGNUM);
   3699  1.1  mrg       insn = emit_move_insn (ar_unat_save_reg, reg);
   3700  1.1  mrg       if (current_frame_info.r[reg_save_ar_unat])
   3701  1.1  mrg 	{
   3702  1.1  mrg 	  RTX_FRAME_RELATED_P (insn) = 1;
   3703  1.1  mrg 	  add_reg_note (insn, REG_CFA_REGISTER, NULL_RTX);
   3704  1.1  mrg 	}
   3705  1.1  mrg 
   3706  1.1  mrg       /* Even if we're not going to generate an epilogue, we still
   3707  1.1  mrg 	 need to save the register so that EH works.  */
   3708  1.1  mrg       if (! epilogue_p && current_frame_info.r[reg_save_ar_unat])
   3709  1.1  mrg 	emit_insn (gen_prologue_use (ar_unat_save_reg));
   3710  1.1  mrg     }
   3711  1.1  mrg   else
   3712  1.1  mrg     ar_unat_save_reg = NULL_RTX;
   3713  1.1  mrg 
   3714  1.1  mrg   /* Spill all varargs registers.  Do this before spilling any GR registers,
   3715  1.1  mrg      since we want the UNAT bits for the GR registers to override the UNAT
   3716  1.1  mrg      bits from varargs, which we don't care about.  */
   3717  1.1  mrg 
   3718  1.1  mrg   cfa_off = -16;
   3719  1.1  mrg   for (regno = GR_ARG_FIRST + 7; n_varargs > 0; --n_varargs, --regno)
   3720  1.1  mrg     {
   3721  1.1  mrg       reg = gen_rtx_REG (DImode, regno);
   3722  1.1  mrg       do_spill (gen_gr_spill, reg, cfa_off += 8, NULL_RTX);
   3723  1.1  mrg     }
   3724  1.1  mrg 
   3725  1.1  mrg   /* Locate the bottom of the register save area.  */
   3726  1.1  mrg   cfa_off = (current_frame_info.spill_cfa_off
   3727  1.1  mrg 	     + current_frame_info.spill_size
   3728  1.1  mrg 	     + current_frame_info.extra_spill_size);
   3729  1.1  mrg 
   3730  1.1  mrg   /* Save the predicate register block either in a register or in memory.  */
   3731  1.1  mrg   if (TEST_HARD_REG_BIT (current_frame_info.mask, PR_REG (0)))
   3732  1.1  mrg     {
   3733  1.1  mrg       reg = gen_rtx_REG (DImode, PR_REG (0));
   3734  1.1  mrg       if (current_frame_info.r[reg_save_pr] != 0)
   3735  1.1  mrg 	{
   3736  1.1  mrg 	  alt_reg = gen_rtx_REG (DImode, current_frame_info.r[reg_save_pr]);
   3737  1.1  mrg 	  reg_emitted (reg_save_pr);
   3738  1.1  mrg 	  insn = emit_move_insn (alt_reg, reg);
   3739  1.1  mrg 
   3740  1.1  mrg 	  /* ??? Denote pr spill/fill by a DImode move that modifies all
   3741  1.1  mrg 	     64 hard registers.  */
   3742  1.1  mrg 	  RTX_FRAME_RELATED_P (insn) = 1;
   3743  1.1  mrg 	  add_reg_note (insn, REG_CFA_REGISTER, NULL_RTX);
   3744  1.1  mrg 
   3745  1.1  mrg 	  /* Even if we're not going to generate an epilogue, we still
   3746  1.1  mrg 	     need to save the register so that EH works.  */
   3747  1.1  mrg 	  if (! epilogue_p)
   3748  1.1  mrg 	    emit_insn (gen_prologue_use (alt_reg));
   3749  1.1  mrg 	}
   3750  1.1  mrg       else
   3751  1.1  mrg 	{
   3752  1.1  mrg 	  alt_regno = next_scratch_gr_reg ();
   3753  1.1  mrg 	  alt_reg = gen_rtx_REG (DImode, alt_regno);
   3754  1.1  mrg 	  insn = emit_move_insn (alt_reg, reg);
   3755  1.1  mrg 	  do_spill (gen_movdi_x, alt_reg, cfa_off, reg);
   3756  1.1  mrg 	  cfa_off -= 8;
   3757  1.1  mrg 	}
   3758  1.1  mrg     }
   3759  1.1  mrg 
   3760  1.1  mrg   /* Handle AR regs in numerical order.  All of them get special handling.  */
   3761  1.1  mrg   if (TEST_HARD_REG_BIT (current_frame_info.mask, AR_UNAT_REGNUM)
   3762  1.1  mrg       && current_frame_info.r[reg_save_ar_unat] == 0)
   3763  1.1  mrg     {
   3764  1.1  mrg       reg = gen_rtx_REG (DImode, AR_UNAT_REGNUM);
   3765  1.1  mrg       do_spill (gen_movdi_x, ar_unat_save_reg, cfa_off, reg);
   3766  1.1  mrg       cfa_off -= 8;
   3767  1.1  mrg     }
   3768  1.1  mrg 
   3769  1.1  mrg   /* The alloc insn already copied ar.pfs into a general register.  The
   3770  1.1  mrg      only thing we have to do now is copy that register to a stack slot
   3771  1.1  mrg      if we'd not allocated a local register for the job.  */
   3772  1.1  mrg   if (TEST_HARD_REG_BIT (current_frame_info.mask, AR_PFS_REGNUM)
   3773  1.1  mrg       && current_frame_info.r[reg_save_ar_pfs] == 0)
   3774  1.1  mrg     {
   3775  1.1  mrg       reg = gen_rtx_REG (DImode, AR_PFS_REGNUM);
   3776  1.1  mrg       do_spill (gen_movdi_x, ar_pfs_save_reg, cfa_off, reg);
   3777  1.1  mrg       cfa_off -= 8;
   3778  1.1  mrg     }
   3779  1.1  mrg 
   3780  1.1  mrg   if (TEST_HARD_REG_BIT (current_frame_info.mask, AR_LC_REGNUM))
   3781  1.1  mrg     {
   3782  1.1  mrg       reg = gen_rtx_REG (DImode, AR_LC_REGNUM);
   3783  1.1  mrg       if (current_frame_info.r[reg_save_ar_lc] != 0)
   3784  1.1  mrg 	{
   3785  1.1  mrg 	  alt_reg = gen_rtx_REG (DImode, current_frame_info.r[reg_save_ar_lc]);
   3786  1.1  mrg 	  reg_emitted (reg_save_ar_lc);
   3787  1.1  mrg 	  insn = emit_move_insn (alt_reg, reg);
   3788  1.1  mrg 	  RTX_FRAME_RELATED_P (insn) = 1;
   3789  1.1  mrg 	  add_reg_note (insn, REG_CFA_REGISTER, NULL_RTX);
   3790  1.1  mrg 
   3791  1.1  mrg 	  /* Even if we're not going to generate an epilogue, we still
   3792  1.1  mrg 	     need to save the register so that EH works.  */
   3793  1.1  mrg 	  if (! epilogue_p)
   3794  1.1  mrg 	    emit_insn (gen_prologue_use (alt_reg));
   3795  1.1  mrg 	}
   3796  1.1  mrg       else
   3797  1.1  mrg 	{
   3798  1.1  mrg 	  alt_regno = next_scratch_gr_reg ();
   3799  1.1  mrg 	  alt_reg = gen_rtx_REG (DImode, alt_regno);
   3800  1.1  mrg 	  emit_move_insn (alt_reg, reg);
   3801  1.1  mrg 	  do_spill (gen_movdi_x, alt_reg, cfa_off, reg);
   3802  1.1  mrg 	  cfa_off -= 8;
   3803  1.1  mrg 	}
   3804  1.1  mrg     }
   3805  1.1  mrg 
   3806  1.1  mrg   /* Save the return pointer.  */
   3807  1.1  mrg   if (TEST_HARD_REG_BIT (current_frame_info.mask, BR_REG (0)))
   3808  1.1  mrg     {
   3809  1.1  mrg       reg = gen_rtx_REG (DImode, BR_REG (0));
   3810  1.1  mrg       if (current_frame_info.r[reg_save_b0] != 0)
   3811  1.1  mrg 	{
   3812  1.1  mrg           alt_reg = gen_rtx_REG (DImode, current_frame_info.r[reg_save_b0]);
   3813  1.1  mrg           reg_emitted (reg_save_b0);
   3814  1.1  mrg 	  insn = emit_move_insn (alt_reg, reg);
   3815  1.1  mrg 	  RTX_FRAME_RELATED_P (insn) = 1;
   3816  1.1  mrg 	  add_reg_note (insn, REG_CFA_REGISTER, gen_rtx_SET (alt_reg, pc_rtx));
   3817  1.1  mrg 
   3818  1.1  mrg 	  /* Even if we're not going to generate an epilogue, we still
   3819  1.1  mrg 	     need to save the register so that EH works.  */
   3820  1.1  mrg 	  if (! epilogue_p)
   3821  1.1  mrg 	    emit_insn (gen_prologue_use (alt_reg));
   3822  1.1  mrg 	}
   3823  1.1  mrg       else
   3824  1.1  mrg 	{
   3825  1.1  mrg 	  alt_regno = next_scratch_gr_reg ();
   3826  1.1  mrg 	  alt_reg = gen_rtx_REG (DImode, alt_regno);
   3827  1.1  mrg 	  emit_move_insn (alt_reg, reg);
   3828  1.1  mrg 	  do_spill (gen_movdi_x, alt_reg, cfa_off, reg);
   3829  1.1  mrg 	  cfa_off -= 8;
   3830  1.1  mrg 	}
   3831  1.1  mrg     }
   3832  1.1  mrg 
   3833  1.1  mrg   if (current_frame_info.r[reg_save_gp])
   3834  1.1  mrg     {
   3835  1.1  mrg       reg_emitted (reg_save_gp);
   3836  1.1  mrg       insn = emit_move_insn (gen_rtx_REG (DImode,
   3837  1.1  mrg 					  current_frame_info.r[reg_save_gp]),
   3838  1.1  mrg 			     pic_offset_table_rtx);
   3839  1.1  mrg     }
   3840  1.1  mrg 
   3841  1.1  mrg   /* We should now be at the base of the gr/br/fr spill area.  */
   3842  1.1  mrg   gcc_assert (cfa_off == (current_frame_info.spill_cfa_off
   3843  1.1  mrg 			  + current_frame_info.spill_size));
   3844  1.1  mrg 
   3845  1.1  mrg   /* Spill all general registers.  */
   3846  1.1  mrg   for (regno = GR_REG (1); regno <= GR_REG (31); ++regno)
   3847  1.1  mrg     if (TEST_HARD_REG_BIT (current_frame_info.mask, regno))
   3848  1.1  mrg       {
   3849  1.1  mrg 	reg = gen_rtx_REG (DImode, regno);
   3850  1.1  mrg 	do_spill (gen_gr_spill, reg, cfa_off, reg);
   3851  1.1  mrg 	cfa_off -= 8;
   3852  1.1  mrg       }
   3853  1.1  mrg 
   3854  1.1  mrg   /* Spill the rest of the BR registers.  */
   3855  1.1  mrg   for (regno = BR_REG (1); regno <= BR_REG (7); ++regno)
   3856  1.1  mrg     if (TEST_HARD_REG_BIT (current_frame_info.mask, regno))
   3857  1.1  mrg       {
   3858  1.1  mrg 	alt_regno = next_scratch_gr_reg ();
   3859  1.1  mrg 	alt_reg = gen_rtx_REG (DImode, alt_regno);
   3860  1.1  mrg 	reg = gen_rtx_REG (DImode, regno);
   3861  1.1  mrg 	emit_move_insn (alt_reg, reg);
   3862  1.1  mrg 	do_spill (gen_movdi_x, alt_reg, cfa_off, reg);
   3863  1.1  mrg 	cfa_off -= 8;
   3864  1.1  mrg       }
   3865  1.1  mrg 
   3866  1.1  mrg   /* Align the frame and spill all FR registers.  */
   3867  1.1  mrg   for (regno = FR_REG (2); regno <= FR_REG (127); ++regno)
   3868  1.1  mrg     if (TEST_HARD_REG_BIT (current_frame_info.mask, regno))
   3869  1.1  mrg       {
   3870  1.1  mrg         gcc_assert (!(cfa_off & 15));
   3871  1.1  mrg 	reg = gen_rtx_REG (XFmode, regno);
   3872  1.1  mrg 	do_spill (gen_fr_spill_x, reg, cfa_off, reg);
   3873  1.1  mrg 	cfa_off -= 16;
   3874  1.1  mrg       }
   3875  1.1  mrg 
   3876  1.1  mrg   gcc_assert (cfa_off == current_frame_info.spill_cfa_off);
   3877  1.1  mrg 
   3878  1.1  mrg   finish_spill_pointers ();
   3879  1.1  mrg }
   3880  1.1  mrg 
   3881  1.1  mrg /* Output the textual info surrounding the prologue.  */
   3882  1.1  mrg 
   3883  1.1  mrg void
   3884  1.1  mrg ia64_start_function (FILE *file, const char *fnname,
   3885  1.1  mrg 		     tree decl ATTRIBUTE_UNUSED)
   3886  1.1  mrg {
   3887  1.1  mrg #if TARGET_ABI_OPEN_VMS
   3888  1.1  mrg   vms_start_function (fnname);
   3889  1.1  mrg #endif
   3890  1.1  mrg 
   3891  1.1  mrg   fputs ("\t.proc ", file);
   3892  1.1  mrg   assemble_name (file, fnname);
   3893  1.1  mrg   fputc ('\n', file);
   3894  1.1  mrg   ASM_OUTPUT_LABEL (file, fnname);
   3895  1.1  mrg }
   3896  1.1  mrg 
   3897  1.1  mrg /* Called after register allocation to add any instructions needed for the
   3898  1.1  mrg    epilogue.  Using an epilogue insn is favored compared to putting all of the
   3899  1.1  mrg    instructions in output_function_prologue(), since it allows the scheduler
   3900  1.1  mrg    to intermix instructions with the saves of the caller saved registers.  In
   3901  1.1  mrg    some cases, it might be necessary to emit a barrier instruction as the last
   3902  1.1  mrg    insn to prevent such scheduling.  */
   3903  1.1  mrg 
   3904  1.1  mrg void
   3905  1.1  mrg ia64_expand_epilogue (int sibcall_p)
   3906  1.1  mrg {
   3907  1.1  mrg   rtx_insn *insn;
   3908  1.1  mrg   rtx reg, alt_reg, ar_unat_save_reg;
   3909  1.1  mrg   int regno, alt_regno, cfa_off;
   3910  1.1  mrg 
   3911  1.1  mrg   ia64_compute_frame_size (get_frame_size ());
   3912  1.1  mrg 
   3913  1.1  mrg   /* If there is a frame pointer, then we use it instead of the stack
   3914  1.1  mrg      pointer, so that the stack pointer does not need to be valid when
   3915  1.1  mrg      the epilogue starts.  See EXIT_IGNORE_STACK.  */
   3916  1.1  mrg   if (frame_pointer_needed)
   3917  1.1  mrg     setup_spill_pointers (current_frame_info.n_spilled,
   3918  1.1  mrg 			  hard_frame_pointer_rtx, 0);
   3919  1.1  mrg   else
   3920  1.1  mrg     setup_spill_pointers (current_frame_info.n_spilled, stack_pointer_rtx,
   3921  1.1  mrg 			  current_frame_info.total_size);
   3922  1.1  mrg 
   3923  1.1  mrg   if (current_frame_info.total_size != 0)
   3924  1.1  mrg     {
   3925  1.1  mrg       /* ??? At this point we must generate a magic insn that appears to
   3926  1.1  mrg          modify the spill iterators and the frame pointer.  This would
   3927  1.1  mrg 	 allow the most scheduling freedom.  For now, just hard stop.  */
   3928  1.1  mrg       emit_insn (gen_blockage ());
   3929  1.1  mrg     }
   3930  1.1  mrg 
   3931  1.1  mrg   /* Locate the bottom of the register save area.  */
   3932  1.1  mrg   cfa_off = (current_frame_info.spill_cfa_off
   3933  1.1  mrg 	     + current_frame_info.spill_size
   3934  1.1  mrg 	     + current_frame_info.extra_spill_size);
   3935  1.1  mrg 
   3936  1.1  mrg   /* Restore the predicate registers.  */
   3937  1.1  mrg   if (TEST_HARD_REG_BIT (current_frame_info.mask, PR_REG (0)))
   3938  1.1  mrg     {
   3939  1.1  mrg       if (current_frame_info.r[reg_save_pr] != 0)
   3940  1.1  mrg         {
   3941  1.1  mrg 	  alt_reg = gen_rtx_REG (DImode, current_frame_info.r[reg_save_pr]);
   3942  1.1  mrg 	  reg_emitted (reg_save_pr);
   3943  1.1  mrg 	}
   3944  1.1  mrg       else
   3945  1.1  mrg 	{
   3946  1.1  mrg 	  alt_regno = next_scratch_gr_reg ();
   3947  1.1  mrg 	  alt_reg = gen_rtx_REG (DImode, alt_regno);
   3948  1.1  mrg 	  do_restore (gen_movdi_x, alt_reg, cfa_off);
   3949  1.1  mrg 	  cfa_off -= 8;
   3950  1.1  mrg 	}
   3951  1.1  mrg       reg = gen_rtx_REG (DImode, PR_REG (0));
   3952  1.1  mrg       emit_move_insn (reg, alt_reg);
   3953  1.1  mrg     }
   3954  1.1  mrg 
   3955  1.1  mrg   /* Restore the application registers.  */
   3956  1.1  mrg 
   3957  1.1  mrg   /* Load the saved unat from the stack, but do not restore it until
   3958  1.1  mrg      after the GRs have been restored.  */
   3959  1.1  mrg   if (TEST_HARD_REG_BIT (current_frame_info.mask, AR_UNAT_REGNUM))
   3960  1.1  mrg     {
   3961  1.1  mrg       if (current_frame_info.r[reg_save_ar_unat] != 0)
   3962  1.1  mrg         {
   3963  1.1  mrg           ar_unat_save_reg
   3964  1.1  mrg 	    = gen_rtx_REG (DImode, current_frame_info.r[reg_save_ar_unat]);
   3965  1.1  mrg 	  reg_emitted (reg_save_ar_unat);
   3966  1.1  mrg 	}
   3967  1.1  mrg       else
   3968  1.1  mrg 	{
   3969  1.1  mrg 	  alt_regno = next_scratch_gr_reg ();
   3970  1.1  mrg 	  ar_unat_save_reg = gen_rtx_REG (DImode, alt_regno);
   3971  1.1  mrg 	  current_frame_info.gr_used_mask |= 1 << alt_regno;
   3972  1.1  mrg 	  do_restore (gen_movdi_x, ar_unat_save_reg, cfa_off);
   3973  1.1  mrg 	  cfa_off -= 8;
   3974  1.1  mrg 	}
   3975  1.1  mrg     }
   3976  1.1  mrg   else
   3977  1.1  mrg     ar_unat_save_reg = NULL_RTX;
   3978  1.1  mrg 
   3979  1.1  mrg   if (current_frame_info.r[reg_save_ar_pfs] != 0)
   3980  1.1  mrg     {
   3981  1.1  mrg       reg_emitted (reg_save_ar_pfs);
   3982  1.1  mrg       alt_reg = gen_rtx_REG (DImode, current_frame_info.r[reg_save_ar_pfs]);
   3983  1.1  mrg       reg = gen_rtx_REG (DImode, AR_PFS_REGNUM);
   3984  1.1  mrg       emit_move_insn (reg, alt_reg);
   3985  1.1  mrg     }
   3986  1.1  mrg   else if (TEST_HARD_REG_BIT (current_frame_info.mask, AR_PFS_REGNUM))
   3987  1.1  mrg     {
   3988  1.1  mrg       alt_regno = next_scratch_gr_reg ();
   3989  1.1  mrg       alt_reg = gen_rtx_REG (DImode, alt_regno);
   3990  1.1  mrg       do_restore (gen_movdi_x, alt_reg, cfa_off);
   3991  1.1  mrg       cfa_off -= 8;
   3992  1.1  mrg       reg = gen_rtx_REG (DImode, AR_PFS_REGNUM);
   3993  1.1  mrg       emit_move_insn (reg, alt_reg);
   3994  1.1  mrg     }
   3995  1.1  mrg 
   3996  1.1  mrg   if (TEST_HARD_REG_BIT (current_frame_info.mask, AR_LC_REGNUM))
   3997  1.1  mrg     {
   3998  1.1  mrg       if (current_frame_info.r[reg_save_ar_lc] != 0)
   3999  1.1  mrg         {
   4000  1.1  mrg 	  alt_reg = gen_rtx_REG (DImode, current_frame_info.r[reg_save_ar_lc]);
   4001  1.1  mrg           reg_emitted (reg_save_ar_lc);
   4002  1.1  mrg 	}
   4003  1.1  mrg       else
   4004  1.1  mrg 	{
   4005  1.1  mrg 	  alt_regno = next_scratch_gr_reg ();
   4006  1.1  mrg 	  alt_reg = gen_rtx_REG (DImode, alt_regno);
   4007  1.1  mrg 	  do_restore (gen_movdi_x, alt_reg, cfa_off);
   4008  1.1  mrg 	  cfa_off -= 8;
   4009  1.1  mrg 	}
   4010  1.1  mrg       reg = gen_rtx_REG (DImode, AR_LC_REGNUM);
   4011  1.1  mrg       emit_move_insn (reg, alt_reg);
   4012  1.1  mrg     }
   4013  1.1  mrg 
   4014  1.1  mrg   /* Restore the return pointer.  */
   4015  1.1  mrg   if (TEST_HARD_REG_BIT (current_frame_info.mask, BR_REG (0)))
   4016  1.1  mrg     {
   4017  1.1  mrg       if (current_frame_info.r[reg_save_b0] != 0)
   4018  1.1  mrg         {
   4019  1.1  mrg          alt_reg = gen_rtx_REG (DImode, current_frame_info.r[reg_save_b0]);
   4020  1.1  mrg          reg_emitted (reg_save_b0);
   4021  1.1  mrg         }
   4022  1.1  mrg       else
   4023  1.1  mrg 	{
   4024  1.1  mrg 	  alt_regno = next_scratch_gr_reg ();
   4025  1.1  mrg 	  alt_reg = gen_rtx_REG (DImode, alt_regno);
   4026  1.1  mrg 	  do_restore (gen_movdi_x, alt_reg, cfa_off);
   4027  1.1  mrg 	  cfa_off -= 8;
   4028  1.1  mrg 	}
   4029  1.1  mrg       reg = gen_rtx_REG (DImode, BR_REG (0));
   4030  1.1  mrg       emit_move_insn (reg, alt_reg);
   4031  1.1  mrg     }
   4032  1.1  mrg 
   4033  1.1  mrg   /* We should now be at the base of the gr/br/fr spill area.  */
   4034  1.1  mrg   gcc_assert (cfa_off == (current_frame_info.spill_cfa_off
   4035  1.1  mrg 			  + current_frame_info.spill_size));
   4036  1.1  mrg 
   4037  1.1  mrg   /* The GP may be stored on the stack in the prologue, but it's
   4038  1.1  mrg      never restored in the epilogue.  Skip the stack slot.  */
   4039  1.1  mrg   if (TEST_HARD_REG_BIT (current_frame_info.mask, GR_REG (1)))
   4040  1.1  mrg     cfa_off -= 8;
   4041  1.1  mrg 
   4042  1.1  mrg   /* Restore all general registers.  */
   4043  1.1  mrg   for (regno = GR_REG (2); regno <= GR_REG (31); ++regno)
   4044  1.1  mrg     if (TEST_HARD_REG_BIT (current_frame_info.mask, regno))
   4045  1.1  mrg       {
   4046  1.1  mrg 	reg = gen_rtx_REG (DImode, regno);
   4047  1.1  mrg 	do_restore (gen_gr_restore, reg, cfa_off);
   4048  1.1  mrg 	cfa_off -= 8;
   4049  1.1  mrg       }
   4050  1.1  mrg 
   4051  1.1  mrg   /* Restore the branch registers.  */
   4052  1.1  mrg   for (regno = BR_REG (1); regno <= BR_REG (7); ++regno)
   4053  1.1  mrg     if (TEST_HARD_REG_BIT (current_frame_info.mask, regno))
   4054  1.1  mrg       {
   4055  1.1  mrg 	alt_regno = next_scratch_gr_reg ();
   4056  1.1  mrg 	alt_reg = gen_rtx_REG (DImode, alt_regno);
   4057  1.1  mrg 	do_restore (gen_movdi_x, alt_reg, cfa_off);
   4058  1.1  mrg 	cfa_off -= 8;
   4059  1.1  mrg 	reg = gen_rtx_REG (DImode, regno);
   4060  1.1  mrg 	emit_move_insn (reg, alt_reg);
   4061  1.1  mrg       }
   4062  1.1  mrg 
   4063  1.1  mrg   /* Restore floating point registers.  */
   4064  1.1  mrg   for (regno = FR_REG (2); regno <= FR_REG (127); ++regno)
   4065  1.1  mrg     if (TEST_HARD_REG_BIT (current_frame_info.mask, regno))
   4066  1.1  mrg       {
   4067  1.1  mrg         gcc_assert (!(cfa_off & 15));
   4068  1.1  mrg 	reg = gen_rtx_REG (XFmode, regno);
   4069  1.1  mrg 	do_restore (gen_fr_restore_x, reg, cfa_off);
   4070  1.1  mrg 	cfa_off -= 16;
   4071  1.1  mrg       }
   4072  1.1  mrg 
   4073  1.1  mrg   /* Restore ar.unat for real.  */
   4074  1.1  mrg   if (TEST_HARD_REG_BIT (current_frame_info.mask, AR_UNAT_REGNUM))
   4075  1.1  mrg     {
   4076  1.1  mrg       reg = gen_rtx_REG (DImode, AR_UNAT_REGNUM);
   4077  1.1  mrg       emit_move_insn (reg, ar_unat_save_reg);
   4078  1.1  mrg     }
   4079  1.1  mrg 
   4080  1.1  mrg   gcc_assert (cfa_off == current_frame_info.spill_cfa_off);
   4081  1.1  mrg 
   4082  1.1  mrg   finish_spill_pointers ();
   4083  1.1  mrg 
   4084  1.1  mrg   if (current_frame_info.total_size
   4085  1.1  mrg       || cfun->machine->ia64_eh_epilogue_sp
   4086  1.1  mrg       || frame_pointer_needed)
   4087  1.1  mrg     {
   4088  1.1  mrg       /* ??? At this point we must generate a magic insn that appears to
   4089  1.1  mrg          modify the spill iterators, the stack pointer, and the frame
   4090  1.1  mrg 	 pointer.  This would allow the most scheduling freedom.  For now,
   4091  1.1  mrg 	 just hard stop.  */
   4092  1.1  mrg       emit_insn (gen_blockage ());
   4093  1.1  mrg     }
   4094  1.1  mrg 
   4095  1.1  mrg   if (cfun->machine->ia64_eh_epilogue_sp)
   4096  1.1  mrg     emit_move_insn (stack_pointer_rtx, cfun->machine->ia64_eh_epilogue_sp);
   4097  1.1  mrg   else if (frame_pointer_needed)
   4098  1.1  mrg     {
   4099  1.1  mrg       insn = emit_move_insn (stack_pointer_rtx, hard_frame_pointer_rtx);
   4100  1.1  mrg       RTX_FRAME_RELATED_P (insn) = 1;
   4101  1.1  mrg       add_reg_note (insn, REG_CFA_ADJUST_CFA, NULL);
   4102  1.1  mrg     }
   4103  1.1  mrg   else if (current_frame_info.total_size)
   4104  1.1  mrg     {
   4105  1.1  mrg       rtx offset, frame_size_rtx;
   4106  1.1  mrg 
   4107  1.1  mrg       frame_size_rtx = GEN_INT (current_frame_info.total_size);
   4108  1.1  mrg       if (satisfies_constraint_I (frame_size_rtx))
   4109  1.1  mrg 	offset = frame_size_rtx;
   4110  1.1  mrg       else
   4111  1.1  mrg 	{
   4112  1.1  mrg 	  regno = next_scratch_gr_reg ();
   4113  1.1  mrg 	  offset = gen_rtx_REG (DImode, regno);
   4114  1.1  mrg 	  emit_move_insn (offset, frame_size_rtx);
   4115  1.1  mrg 	}
   4116  1.1  mrg 
   4117  1.1  mrg       insn = emit_insn (gen_adddi3 (stack_pointer_rtx, stack_pointer_rtx,
   4118  1.1  mrg 				    offset));
   4119  1.1  mrg 
   4120  1.1  mrg       RTX_FRAME_RELATED_P (insn) = 1;
   4121  1.1  mrg       add_reg_note (insn, REG_CFA_ADJUST_CFA,
   4122  1.1  mrg 		    gen_rtx_SET (stack_pointer_rtx,
   4123  1.1  mrg 				 gen_rtx_PLUS (DImode,
   4124  1.1  mrg 					       stack_pointer_rtx,
   4125  1.1  mrg 					       frame_size_rtx)));
   4126  1.1  mrg     }
   4127  1.1  mrg 
   4128  1.1  mrg   if (cfun->machine->ia64_eh_epilogue_bsp)
   4129  1.1  mrg     emit_insn (gen_set_bsp (cfun->machine->ia64_eh_epilogue_bsp));
   4130  1.1  mrg 
   4131  1.1  mrg   if (! sibcall_p)
   4132  1.1  mrg     emit_jump_insn (gen_return_internal (gen_rtx_REG (DImode, BR_REG (0))));
   4133  1.1  mrg   else
   4134  1.1  mrg     {
   4135  1.1  mrg       int fp = GR_REG (2);
   4136  1.1  mrg       /* We need a throw away register here, r0 and r1 are reserved,
   4137  1.1  mrg 	 so r2 is the first available call clobbered register.  If
   4138  1.1  mrg 	 there was a frame_pointer register, we may have swapped the
   4139  1.1  mrg 	 names of r2 and HARD_FRAME_POINTER_REGNUM, so we have to make
   4140  1.1  mrg 	 sure we're using the string "r2" when emitting the register
   4141  1.1  mrg 	 name for the assembler.  */
   4142  1.1  mrg       if (current_frame_info.r[reg_fp]
   4143  1.1  mrg           && current_frame_info.r[reg_fp] == GR_REG (2))
   4144  1.1  mrg 	fp = HARD_FRAME_POINTER_REGNUM;
   4145  1.1  mrg 
   4146  1.1  mrg       /* We must emit an alloc to force the input registers to become output
   4147  1.1  mrg 	 registers.  Otherwise, if the callee tries to pass its parameters
   4148  1.1  mrg 	 through to another call without an intervening alloc, then these
   4149  1.1  mrg 	 values get lost.  */
   4150  1.1  mrg       /* ??? We don't need to preserve all input registers.  We only need to
   4151  1.1  mrg 	 preserve those input registers used as arguments to the sibling call.
   4152  1.1  mrg 	 It is unclear how to compute that number here.  */
   4153  1.1  mrg       if (current_frame_info.n_input_regs != 0)
   4154  1.1  mrg 	{
   4155  1.1  mrg 	  rtx n_inputs = GEN_INT (current_frame_info.n_input_regs);
   4156  1.1  mrg 
   4157  1.1  mrg 	  insn = emit_insn (gen_alloc (gen_rtx_REG (DImode, fp),
   4158  1.1  mrg 				const0_rtx, const0_rtx,
   4159  1.1  mrg 				n_inputs, const0_rtx));
   4160  1.1  mrg 	  RTX_FRAME_RELATED_P (insn) = 1;
   4161  1.1  mrg 
   4162  1.1  mrg 	  /* ??? We need to mark the alloc as frame-related so that it gets
   4163  1.1  mrg 	     passed into ia64_asm_unwind_emit for ia64-specific unwinding.
   4164  1.1  mrg 	     But there's nothing dwarf2 related to be done wrt the register
   4165  1.1  mrg 	     windows.  If we do nothing, dwarf2out will abort on the UNSPEC;
   4166  1.1  mrg 	     the empty parallel means dwarf2out will not see anything.  */
   4167  1.1  mrg 	  add_reg_note (insn, REG_FRAME_RELATED_EXPR,
   4168  1.1  mrg 			gen_rtx_PARALLEL (VOIDmode, rtvec_alloc (0)));
   4169  1.1  mrg 	}
   4170  1.1  mrg     }
   4171  1.1  mrg }
   4172  1.1  mrg 
   4173  1.1  mrg /* Return 1 if br.ret can do all the work required to return from a
   4174  1.1  mrg    function.  */
   4175  1.1  mrg 
   4176  1.1  mrg int
   4177  1.1  mrg ia64_direct_return (void)
   4178  1.1  mrg {
   4179  1.1  mrg   if (reload_completed && ! frame_pointer_needed)
   4180  1.1  mrg     {
   4181  1.1  mrg       ia64_compute_frame_size (get_frame_size ());
   4182  1.1  mrg 
   4183  1.1  mrg       return (current_frame_info.total_size == 0
   4184  1.1  mrg 	      && current_frame_info.n_spilled == 0
   4185  1.1  mrg 	      && current_frame_info.r[reg_save_b0] == 0
   4186  1.1  mrg 	      && current_frame_info.r[reg_save_pr] == 0
   4187  1.1  mrg 	      && current_frame_info.r[reg_save_ar_pfs] == 0
   4188  1.1  mrg 	      && current_frame_info.r[reg_save_ar_unat] == 0
   4189  1.1  mrg 	      && current_frame_info.r[reg_save_ar_lc] == 0);
   4190  1.1  mrg     }
   4191  1.1  mrg   return 0;
   4192  1.1  mrg }
   4193  1.1  mrg 
   4194  1.1  mrg /* Return the magic cookie that we use to hold the return address
   4195  1.1  mrg    during early compilation.  */
   4196  1.1  mrg 
   4197  1.1  mrg rtx
   4198  1.1  mrg ia64_return_addr_rtx (HOST_WIDE_INT count, rtx frame ATTRIBUTE_UNUSED)
   4199  1.1  mrg {
   4200  1.1  mrg   if (count != 0)
   4201  1.1  mrg     return NULL;
   4202  1.1  mrg   return gen_rtx_UNSPEC (Pmode, gen_rtvec (1, const0_rtx), UNSPEC_RET_ADDR);
   4203  1.1  mrg }
   4204  1.1  mrg 
   4205  1.1  mrg /* Split this value after reload, now that we know where the return
   4206  1.1  mrg    address is saved.  */
   4207  1.1  mrg 
   4208  1.1  mrg void
   4209  1.1  mrg ia64_split_return_addr_rtx (rtx dest)
   4210  1.1  mrg {
   4211  1.1  mrg   rtx src;
   4212  1.1  mrg 
   4213  1.1  mrg   if (TEST_HARD_REG_BIT (current_frame_info.mask, BR_REG (0)))
   4214  1.1  mrg     {
   4215  1.1  mrg       if (current_frame_info.r[reg_save_b0] != 0)
   4216  1.1  mrg         {
   4217  1.1  mrg 	  src = gen_rtx_REG (DImode, current_frame_info.r[reg_save_b0]);
   4218  1.1  mrg 	  reg_emitted (reg_save_b0);
   4219  1.1  mrg 	}
   4220  1.1  mrg       else
   4221  1.1  mrg 	{
   4222  1.1  mrg 	  HOST_WIDE_INT off;
   4223  1.1  mrg 	  unsigned int regno;
   4224  1.1  mrg 	  rtx off_r;
   4225  1.1  mrg 
   4226  1.1  mrg 	  /* Compute offset from CFA for BR0.  */
   4227  1.1  mrg 	  /* ??? Must be kept in sync with ia64_expand_prologue.  */
   4228  1.1  mrg 	  off = (current_frame_info.spill_cfa_off
   4229  1.1  mrg 		 + current_frame_info.spill_size);
   4230  1.1  mrg 	  for (regno = GR_REG (1); regno <= GR_REG (31); ++regno)
   4231  1.1  mrg 	    if (TEST_HARD_REG_BIT (current_frame_info.mask, regno))
   4232  1.1  mrg 	      off -= 8;
   4233  1.1  mrg 
   4234  1.1  mrg 	  /* Convert CFA offset to a register based offset.  */
   4235  1.1  mrg 	  if (frame_pointer_needed)
   4236  1.1  mrg 	    src = hard_frame_pointer_rtx;
   4237  1.1  mrg 	  else
   4238  1.1  mrg 	    {
   4239  1.1  mrg 	      src = stack_pointer_rtx;
   4240  1.1  mrg 	      off += current_frame_info.total_size;
   4241  1.1  mrg 	    }
   4242  1.1  mrg 
   4243  1.1  mrg 	  /* Load address into scratch register.  */
   4244  1.1  mrg 	  off_r = GEN_INT (off);
   4245  1.1  mrg 	  if (satisfies_constraint_I (off_r))
   4246  1.1  mrg 	    emit_insn (gen_adddi3 (dest, src, off_r));
   4247  1.1  mrg 	  else
   4248  1.1  mrg 	    {
   4249  1.1  mrg 	      emit_move_insn (dest, off_r);
   4250  1.1  mrg 	      emit_insn (gen_adddi3 (dest, src, dest));
   4251  1.1  mrg 	    }
   4252  1.1  mrg 
   4253  1.1  mrg 	  src = gen_rtx_MEM (Pmode, dest);
   4254  1.1  mrg 	}
   4255  1.1  mrg     }
   4256  1.1  mrg   else
   4257  1.1  mrg     src = gen_rtx_REG (DImode, BR_REG (0));
   4258  1.1  mrg 
   4259  1.1  mrg   emit_move_insn (dest, src);
   4260  1.1  mrg }
   4261  1.1  mrg 
   4262  1.1  mrg int
   4263  1.1  mrg ia64_hard_regno_rename_ok (int from, int to)
   4264  1.1  mrg {
   4265  1.1  mrg   /* Don't clobber any of the registers we reserved for the prologue.  */
   4266  1.1  mrg   unsigned int r;
   4267  1.1  mrg 
   4268  1.1  mrg   for (r = reg_fp; r <= reg_save_ar_lc; r++)
   4269  1.1  mrg     if (to == current_frame_info.r[r]
   4270  1.1  mrg         || from == current_frame_info.r[r]
   4271  1.1  mrg         || to == emitted_frame_related_regs[r]
   4272  1.1  mrg         || from == emitted_frame_related_regs[r])
   4273  1.1  mrg       return 0;
   4274  1.1  mrg 
   4275  1.1  mrg   /* Don't use output registers outside the register frame.  */
   4276  1.1  mrg   if (OUT_REGNO_P (to) && to >= OUT_REG (current_frame_info.n_output_regs))
   4277  1.1  mrg     return 0;
   4278  1.1  mrg 
   4279  1.1  mrg   /* Retain even/oddness on predicate register pairs.  */
   4280  1.1  mrg   if (PR_REGNO_P (from) && PR_REGNO_P (to))
   4281  1.1  mrg     return (from & 1) == (to & 1);
   4282  1.1  mrg 
   4283  1.1  mrg   return 1;
   4284  1.1  mrg }
   4285  1.1  mrg 
   4286  1.1  mrg /* Implement TARGET_HARD_REGNO_NREGS.
   4287  1.1  mrg 
   4288  1.1  mrg    ??? We say that BImode PR values require two registers.  This allows us to
   4289  1.1  mrg    easily store the normal and inverted values.  We use CCImode to indicate
   4290  1.1  mrg    a single predicate register.  */
   4291  1.1  mrg 
   4292  1.1  mrg static unsigned int
   4293  1.1  mrg ia64_hard_regno_nregs (unsigned int regno, machine_mode mode)
   4294  1.1  mrg {
   4295  1.1  mrg   if (regno == PR_REG (0) && mode == DImode)
   4296  1.1  mrg     return 64;
   4297  1.1  mrg   if (PR_REGNO_P (regno) && (mode) == BImode)
   4298  1.1  mrg     return 2;
   4299  1.1  mrg   if ((PR_REGNO_P (regno) || GR_REGNO_P (regno)) && mode == CCImode)
   4300  1.1  mrg     return 1;
   4301  1.1  mrg   if (FR_REGNO_P (regno) && mode == XFmode)
   4302  1.1  mrg     return 1;
   4303  1.1  mrg   if (FR_REGNO_P (regno) && mode == RFmode)
   4304  1.1  mrg     return 1;
   4305  1.1  mrg   if (FR_REGNO_P (regno) && mode == XCmode)
   4306  1.1  mrg     return 2;
   4307  1.1  mrg   return CEIL (GET_MODE_SIZE (mode), UNITS_PER_WORD);
   4308  1.1  mrg }
   4309  1.1  mrg 
   4310  1.1  mrg /* Implement TARGET_HARD_REGNO_MODE_OK.  */
   4311  1.1  mrg 
   4312  1.1  mrg static bool
   4313  1.1  mrg ia64_hard_regno_mode_ok (unsigned int regno, machine_mode mode)
   4314  1.1  mrg {
   4315  1.1  mrg   if (FR_REGNO_P (regno))
   4316  1.1  mrg     return (GET_MODE_CLASS (mode) != MODE_CC
   4317  1.1  mrg 	    && mode != BImode
   4318  1.1  mrg 	    && mode != TFmode);
   4319  1.1  mrg 
   4320  1.1  mrg   if (PR_REGNO_P (regno))
   4321  1.1  mrg     return mode == BImode || GET_MODE_CLASS (mode) == MODE_CC;
   4322  1.1  mrg 
   4323  1.1  mrg   if (GR_REGNO_P (regno))
   4324  1.1  mrg     return mode != XFmode && mode != XCmode && mode != RFmode;
   4325  1.1  mrg 
   4326  1.1  mrg   if (AR_REGNO_P (regno))
   4327  1.1  mrg     return mode == DImode;
   4328  1.1  mrg 
   4329  1.1  mrg   if (BR_REGNO_P (regno))
   4330  1.1  mrg     return mode == DImode;
   4331  1.1  mrg 
   4332  1.1  mrg   return false;
   4333  1.1  mrg }
   4334  1.1  mrg 
   4335  1.1  mrg /* Implement TARGET_MODES_TIEABLE_P.
   4336  1.1  mrg 
   4337  1.1  mrg    Don't tie integer and FP modes, as that causes us to get integer registers
   4338  1.1  mrg    allocated for FP instructions.  XFmode only supported in FP registers so
   4339  1.1  mrg    we can't tie it with any other modes.  */
   4340  1.1  mrg 
   4341  1.1  mrg static bool
   4342  1.1  mrg ia64_modes_tieable_p (machine_mode mode1, machine_mode mode2)
   4343  1.1  mrg {
   4344  1.1  mrg   return (GET_MODE_CLASS (mode1) == GET_MODE_CLASS (mode2)
   4345  1.1  mrg 	  && ((mode1 == XFmode || mode1 == XCmode || mode1 == RFmode)
   4346  1.1  mrg 	      == (mode2 == XFmode || mode2 == XCmode || mode2 == RFmode))
   4347  1.1  mrg 	  && (mode1 == BImode) == (mode2 == BImode));
   4348  1.1  mrg }
   4349  1.1  mrg 
   4350  1.1  mrg /* Target hook for assembling integer objects.  Handle word-sized
   4351  1.1  mrg    aligned objects and detect the cases when @fptr is needed.  */
   4352  1.1  mrg 
   4353  1.1  mrg static bool
   4354  1.1  mrg ia64_assemble_integer (rtx x, unsigned int size, int aligned_p)
   4355  1.1  mrg {
   4356  1.1  mrg   if (size == POINTER_SIZE / BITS_PER_UNIT
   4357  1.1  mrg       && !(TARGET_NO_PIC || TARGET_AUTO_PIC)
   4358  1.1  mrg       && GET_CODE (x) == SYMBOL_REF
   4359  1.1  mrg       && SYMBOL_REF_FUNCTION_P (x))
   4360  1.1  mrg     {
   4361  1.1  mrg       static const char * const directive[2][2] = {
   4362  1.1  mrg 	  /* 64-bit pointer */  /* 32-bit pointer */
   4363  1.1  mrg 	{ "\tdata8.ua\t@fptr(", "\tdata4.ua\t@fptr("},	/* unaligned */
   4364  1.1  mrg 	{ "\tdata8\t@fptr(",    "\tdata4\t@fptr("}	/* aligned */
   4365  1.1  mrg       };
   4366  1.1  mrg       fputs (directive[(aligned_p != 0)][POINTER_SIZE == 32], asm_out_file);
   4367  1.1  mrg       output_addr_const (asm_out_file, x);
   4368  1.1  mrg       fputs (")\n", asm_out_file);
   4369  1.1  mrg       return true;
   4370  1.1  mrg     }
   4371  1.1  mrg   return default_assemble_integer (x, size, aligned_p);
   4372  1.1  mrg }
   4373  1.1  mrg 
   4374  1.1  mrg /* Emit the function prologue.  */
   4375  1.1  mrg 
   4376  1.1  mrg static void
   4377  1.1  mrg ia64_output_function_prologue (FILE *file)
   4378  1.1  mrg {
   4379  1.1  mrg   int mask, grsave, grsave_prev;
   4380  1.1  mrg 
   4381  1.1  mrg   if (current_frame_info.need_regstk)
   4382  1.1  mrg     fprintf (file, "\t.regstk %d, %d, %d, %d\n",
   4383  1.1  mrg 	     current_frame_info.n_input_regs,
   4384  1.1  mrg 	     current_frame_info.n_local_regs,
   4385  1.1  mrg 	     current_frame_info.n_output_regs,
   4386  1.1  mrg 	     current_frame_info.n_rotate_regs);
   4387  1.1  mrg 
   4388  1.1  mrg   if (ia64_except_unwind_info (&global_options) != UI_TARGET)
   4389  1.1  mrg     return;
   4390  1.1  mrg 
   4391  1.1  mrg   /* Emit the .prologue directive.  */
   4392  1.1  mrg 
   4393  1.1  mrg   mask = 0;
   4394  1.1  mrg   grsave = grsave_prev = 0;
   4395  1.1  mrg   if (current_frame_info.r[reg_save_b0] != 0)
   4396  1.1  mrg     {
   4397  1.1  mrg       mask |= 8;
   4398  1.1  mrg       grsave = grsave_prev = current_frame_info.r[reg_save_b0];
   4399  1.1  mrg     }
   4400  1.1  mrg   if (current_frame_info.r[reg_save_ar_pfs] != 0
   4401  1.1  mrg       && (grsave_prev == 0
   4402  1.1  mrg 	  || current_frame_info.r[reg_save_ar_pfs] == grsave_prev + 1))
   4403  1.1  mrg     {
   4404  1.1  mrg       mask |= 4;
   4405  1.1  mrg       if (grsave_prev == 0)
   4406  1.1  mrg 	grsave = current_frame_info.r[reg_save_ar_pfs];
   4407  1.1  mrg       grsave_prev = current_frame_info.r[reg_save_ar_pfs];
   4408  1.1  mrg     }
   4409  1.1  mrg   if (current_frame_info.r[reg_fp] != 0
   4410  1.1  mrg       && (grsave_prev == 0
   4411  1.1  mrg 	  || current_frame_info.r[reg_fp] == grsave_prev + 1))
   4412  1.1  mrg     {
   4413  1.1  mrg       mask |= 2;
   4414  1.1  mrg       if (grsave_prev == 0)
   4415  1.1  mrg 	grsave = HARD_FRAME_POINTER_REGNUM;
   4416  1.1  mrg       grsave_prev = current_frame_info.r[reg_fp];
   4417  1.1  mrg     }
   4418  1.1  mrg   if (current_frame_info.r[reg_save_pr] != 0
   4419  1.1  mrg       && (grsave_prev == 0
   4420  1.1  mrg 	  || current_frame_info.r[reg_save_pr] == grsave_prev + 1))
   4421  1.1  mrg     {
   4422  1.1  mrg       mask |= 1;
   4423  1.1  mrg       if (grsave_prev == 0)
   4424  1.1  mrg 	grsave = current_frame_info.r[reg_save_pr];
   4425  1.1  mrg     }
   4426  1.1  mrg 
   4427  1.1  mrg   if (mask && TARGET_GNU_AS)
   4428  1.1  mrg     fprintf (file, "\t.prologue %d, %d\n", mask,
   4429  1.1  mrg 	     ia64_dbx_register_number (grsave));
   4430  1.1  mrg   else
   4431  1.1  mrg     fputs ("\t.prologue\n", file);
   4432  1.1  mrg 
   4433  1.1  mrg   /* Emit a .spill directive, if necessary, to relocate the base of
   4434  1.1  mrg      the register spill area.  */
   4435  1.1  mrg   if (current_frame_info.spill_cfa_off != -16)
   4436  1.1  mrg     fprintf (file, "\t.spill %ld\n",
   4437  1.1  mrg 	     (long) (current_frame_info.spill_cfa_off
   4438  1.1  mrg 		     + current_frame_info.spill_size));
   4439  1.1  mrg }
   4440  1.1  mrg 
   4441  1.1  mrg /* Emit the .body directive at the scheduled end of the prologue.  */
   4442  1.1  mrg 
   4443  1.1  mrg static void
   4444  1.1  mrg ia64_output_function_end_prologue (FILE *file)
   4445  1.1  mrg {
   4446  1.1  mrg   if (ia64_except_unwind_info (&global_options) != UI_TARGET)
   4447  1.1  mrg     return;
   4448  1.1  mrg 
   4449  1.1  mrg   fputs ("\t.body\n", file);
   4450  1.1  mrg }
   4451  1.1  mrg 
   4452  1.1  mrg /* Emit the function epilogue.  */
   4453  1.1  mrg 
   4454  1.1  mrg static void
   4455  1.1  mrg ia64_output_function_epilogue (FILE *)
   4456  1.1  mrg {
   4457  1.1  mrg   int i;
   4458  1.1  mrg 
   4459  1.1  mrg   if (current_frame_info.r[reg_fp])
   4460  1.1  mrg     {
   4461  1.1  mrg       const char *tmp = reg_names[HARD_FRAME_POINTER_REGNUM];
   4462  1.1  mrg       reg_names[HARD_FRAME_POINTER_REGNUM]
   4463  1.1  mrg 	= reg_names[current_frame_info.r[reg_fp]];
   4464  1.1  mrg       reg_names[current_frame_info.r[reg_fp]] = tmp;
   4465  1.1  mrg       reg_emitted (reg_fp);
   4466  1.1  mrg     }
   4467  1.1  mrg   if (! TARGET_REG_NAMES)
   4468  1.1  mrg     {
   4469  1.1  mrg       for (i = 0; i < current_frame_info.n_input_regs; i++)
   4470  1.1  mrg 	reg_names[IN_REG (i)] = ia64_input_reg_names[i];
   4471  1.1  mrg       for (i = 0; i < current_frame_info.n_local_regs; i++)
   4472  1.1  mrg 	reg_names[LOC_REG (i)] = ia64_local_reg_names[i];
   4473  1.1  mrg       for (i = 0; i < current_frame_info.n_output_regs; i++)
   4474  1.1  mrg 	reg_names[OUT_REG (i)] = ia64_output_reg_names[i];
   4475  1.1  mrg     }
   4476  1.1  mrg 
   4477  1.1  mrg   current_frame_info.initialized = 0;
   4478  1.1  mrg }
   4479  1.1  mrg 
   4480  1.1  mrg int
   4481  1.1  mrg ia64_dbx_register_number (int regno)
   4482  1.1  mrg {
   4483  1.1  mrg   /* In ia64_expand_prologue we quite literally renamed the frame pointer
   4484  1.1  mrg      from its home at loc79 to something inside the register frame.  We
   4485  1.1  mrg      must perform the same renumbering here for the debug info.  */
   4486  1.1  mrg   if (current_frame_info.r[reg_fp])
   4487  1.1  mrg     {
   4488  1.1  mrg       if (regno == HARD_FRAME_POINTER_REGNUM)
   4489  1.1  mrg 	regno = current_frame_info.r[reg_fp];
   4490  1.1  mrg       else if (regno == current_frame_info.r[reg_fp])
   4491  1.1  mrg 	regno = HARD_FRAME_POINTER_REGNUM;
   4492  1.1  mrg     }
   4493  1.1  mrg 
   4494  1.1  mrg   if (IN_REGNO_P (regno))
   4495  1.1  mrg     return 32 + regno - IN_REG (0);
   4496  1.1  mrg   else if (LOC_REGNO_P (regno))
   4497  1.1  mrg     return 32 + current_frame_info.n_input_regs + regno - LOC_REG (0);
   4498  1.1  mrg   else if (OUT_REGNO_P (regno))
   4499  1.1  mrg     return (32 + current_frame_info.n_input_regs
   4500  1.1  mrg 	    + current_frame_info.n_local_regs + regno - OUT_REG (0));
   4501  1.1  mrg   else
   4502  1.1  mrg     return regno;
   4503  1.1  mrg }
   4504  1.1  mrg 
   4505  1.1  mrg /* Implement TARGET_TRAMPOLINE_INIT.
   4506  1.1  mrg 
   4507  1.1  mrg    The trampoline should set the static chain pointer to value placed
   4508  1.1  mrg    into the trampoline and should branch to the specified routine.
   4509  1.1  mrg    To make the normal indirect-subroutine calling convention work,
   4510  1.1  mrg    the trampoline must look like a function descriptor; the first
   4511  1.1  mrg    word being the target address and the second being the target's
   4512  1.1  mrg    global pointer.
   4513  1.1  mrg 
   4514  1.1  mrg    We abuse the concept of a global pointer by arranging for it
   4515  1.1  mrg    to point to the data we need to load.  The complete trampoline
   4516  1.1  mrg    has the following form:
   4517  1.1  mrg 
   4518  1.1  mrg 		+-------------------+ \
   4519  1.1  mrg 	TRAMP:	| __ia64_trampoline | |
   4520  1.1  mrg 		+-------------------+  > fake function descriptor
   4521  1.1  mrg 		| TRAMP+16          | |
   4522  1.1  mrg 		+-------------------+ /
   4523  1.1  mrg 		| target descriptor |
   4524  1.1  mrg 		+-------------------+
   4525  1.1  mrg 		| static link	    |
   4526  1.1  mrg 		+-------------------+
   4527  1.1  mrg */
   4528  1.1  mrg 
   4529  1.1  mrg static void
   4530  1.1  mrg ia64_trampoline_init (rtx m_tramp, tree fndecl, rtx static_chain)
   4531  1.1  mrg {
   4532  1.1  mrg   rtx fnaddr = XEXP (DECL_RTL (fndecl), 0);
   4533  1.1  mrg   rtx addr, addr_reg, tramp, eight = GEN_INT (8);
   4534  1.1  mrg 
   4535  1.1  mrg   /* The Intel assembler requires that the global __ia64_trampoline symbol
   4536  1.1  mrg      be declared explicitly */
   4537  1.1  mrg   if (!TARGET_GNU_AS)
   4538  1.1  mrg     {
   4539  1.1  mrg       static bool declared_ia64_trampoline = false;
   4540  1.1  mrg 
   4541  1.1  mrg       if (!declared_ia64_trampoline)
   4542  1.1  mrg 	{
   4543  1.1  mrg 	  declared_ia64_trampoline = true;
   4544  1.1  mrg 	  (*targetm.asm_out.globalize_label) (asm_out_file,
   4545  1.1  mrg 					      "__ia64_trampoline");
   4546  1.1  mrg 	}
   4547  1.1  mrg     }
   4548  1.1  mrg 
   4549  1.1  mrg   /* Make sure addresses are Pmode even if we are in ILP32 mode. */
   4550  1.1  mrg   addr = convert_memory_address (Pmode, XEXP (m_tramp, 0));
   4551  1.1  mrg   fnaddr = convert_memory_address (Pmode, fnaddr);
   4552  1.1  mrg   static_chain = convert_memory_address (Pmode, static_chain);
   4553  1.1  mrg 
   4554  1.1  mrg   /* Load up our iterator.  */
   4555  1.1  mrg   addr_reg = copy_to_reg (addr);
   4556  1.1  mrg   m_tramp = adjust_automodify_address (m_tramp, Pmode, addr_reg, 0);
   4557  1.1  mrg 
   4558  1.1  mrg   /* The first two words are the fake descriptor:
   4559  1.1  mrg      __ia64_trampoline, ADDR+16.  */
   4560  1.1  mrg   tramp = gen_rtx_SYMBOL_REF (Pmode, "__ia64_trampoline");
   4561  1.1  mrg   if (TARGET_ABI_OPEN_VMS)
   4562  1.1  mrg     {
   4563  1.1  mrg       /* HP decided to break the ELF ABI on VMS (to deal with an ambiguity
   4564  1.1  mrg 	 in the Macro-32 compiler) and changed the semantics of the LTOFF22
   4565  1.1  mrg 	 relocation against function symbols to make it identical to the
   4566  1.1  mrg 	 LTOFF_FPTR22 relocation.  Emit the latter directly to stay within
   4567  1.1  mrg 	 strict ELF and dereference to get the bare code address.  */
   4568  1.1  mrg       rtx reg = gen_reg_rtx (Pmode);
   4569  1.1  mrg       SYMBOL_REF_FLAGS (tramp) |= SYMBOL_FLAG_FUNCTION;
   4570  1.1  mrg       emit_move_insn (reg, tramp);
   4571  1.1  mrg       emit_move_insn (reg, gen_rtx_MEM (Pmode, reg));
   4572  1.1  mrg       tramp = reg;
   4573  1.1  mrg    }
   4574  1.1  mrg   emit_move_insn (m_tramp, tramp);
   4575  1.1  mrg   emit_insn (gen_adddi3 (addr_reg, addr_reg, eight));
   4576  1.1  mrg   m_tramp = adjust_automodify_address (m_tramp, VOIDmode, NULL, 8);
   4577  1.1  mrg 
   4578  1.1  mrg   emit_move_insn (m_tramp, force_reg (Pmode, plus_constant (Pmode, addr, 16)));
   4579  1.1  mrg   emit_insn (gen_adddi3 (addr_reg, addr_reg, eight));
   4580  1.1  mrg   m_tramp = adjust_automodify_address (m_tramp, VOIDmode, NULL, 8);
   4581  1.1  mrg 
   4582  1.1  mrg   /* The third word is the target descriptor.  */
   4583  1.1  mrg   emit_move_insn (m_tramp, force_reg (Pmode, fnaddr));
   4584  1.1  mrg   emit_insn (gen_adddi3 (addr_reg, addr_reg, eight));
   4585  1.1  mrg   m_tramp = adjust_automodify_address (m_tramp, VOIDmode, NULL, 8);
   4586  1.1  mrg 
   4587  1.1  mrg   /* The fourth word is the static chain.  */
   4588  1.1  mrg   emit_move_insn (m_tramp, static_chain);
   4589  1.1  mrg }
   4590  1.1  mrg 
   4591  1.1  mrg /* Do any needed setup for a variadic function.  CUM has not been updated
   4593  1.1  mrg    for the last named argument, which is given by ARG.
   4594  1.1  mrg 
   4595  1.1  mrg    We generate the actual spill instructions during prologue generation.  */
   4596  1.1  mrg 
   4597  1.1  mrg static void
   4598  1.1  mrg ia64_setup_incoming_varargs (cumulative_args_t cum,
   4599  1.1  mrg 			     const function_arg_info &arg,
   4600  1.1  mrg 			     int *pretend_size,
   4601  1.1  mrg 			     int second_time ATTRIBUTE_UNUSED)
   4602  1.1  mrg {
   4603  1.1  mrg   CUMULATIVE_ARGS next_cum = *get_cumulative_args (cum);
   4604  1.1  mrg 
   4605  1.1  mrg   /* Skip the current argument.  */
   4606  1.1  mrg   ia64_function_arg_advance (pack_cumulative_args (&next_cum), arg);
   4607  1.1  mrg 
   4608  1.1  mrg   if (next_cum.words < MAX_ARGUMENT_SLOTS)
   4609  1.1  mrg     {
   4610  1.1  mrg       int n = MAX_ARGUMENT_SLOTS - next_cum.words;
   4611  1.1  mrg       *pretend_size = n * UNITS_PER_WORD;
   4612  1.1  mrg       cfun->machine->n_varargs = n;
   4613  1.1  mrg     }
   4614  1.1  mrg }
   4615  1.1  mrg 
   4616  1.1  mrg /* Check whether TYPE is a homogeneous floating point aggregate.  If
   4617  1.1  mrg    it is, return the mode of the floating point type that appears
   4618  1.1  mrg    in all leafs.  If it is not, return VOIDmode.
   4619  1.1  mrg 
   4620  1.1  mrg    An aggregate is a homogeneous floating point aggregate is if all
   4621  1.1  mrg    fields/elements in it have the same floating point type (e.g,
   4622  1.1  mrg    SFmode).  128-bit quad-precision floats are excluded.
   4623  1.1  mrg 
   4624  1.1  mrg    Variable sized aggregates should never arrive here, since we should
   4625  1.1  mrg    have already decided to pass them by reference.  Top-level zero-sized
   4626  1.1  mrg    aggregates are excluded because our parallels crash the middle-end.  */
   4627  1.1  mrg 
   4628  1.1  mrg static machine_mode
   4629  1.1  mrg hfa_element_mode (const_tree type, bool nested)
   4630  1.1  mrg {
   4631  1.1  mrg   machine_mode element_mode = VOIDmode;
   4632  1.1  mrg   machine_mode mode;
   4633  1.1  mrg   enum tree_code code = TREE_CODE (type);
   4634  1.1  mrg   int know_element_mode = 0;
   4635  1.1  mrg   tree t;
   4636  1.1  mrg 
   4637  1.1  mrg   if (!nested && (!TYPE_SIZE (type) || integer_zerop (TYPE_SIZE (type))))
   4638  1.1  mrg     return VOIDmode;
   4639  1.1  mrg 
   4640  1.1  mrg   switch (code)
   4641  1.1  mrg     {
   4642  1.1  mrg     case VOID_TYPE:	case INTEGER_TYPE:	case ENUMERAL_TYPE:
   4643  1.1  mrg     case BOOLEAN_TYPE:	case POINTER_TYPE:
   4644  1.1  mrg     case OFFSET_TYPE:	case REFERENCE_TYPE:	case METHOD_TYPE:
   4645  1.1  mrg     case LANG_TYPE:		case FUNCTION_TYPE:
   4646  1.1  mrg       return VOIDmode;
   4647  1.1  mrg 
   4648  1.1  mrg       /* Fortran complex types are supposed to be HFAs, so we need to handle
   4649  1.1  mrg 	 gcc's COMPLEX_TYPEs as HFAs.  We need to exclude the integral complex
   4650  1.1  mrg 	 types though.  */
   4651  1.1  mrg     case COMPLEX_TYPE:
   4652  1.1  mrg       if (GET_MODE_CLASS (TYPE_MODE (type)) == MODE_COMPLEX_FLOAT
   4653  1.1  mrg 	  && TYPE_MODE (type) != TCmode)
   4654  1.1  mrg 	return GET_MODE_INNER (TYPE_MODE (type));
   4655  1.1  mrg       else
   4656  1.1  mrg 	return VOIDmode;
   4657  1.1  mrg 
   4658  1.1  mrg     case REAL_TYPE:
   4659  1.1  mrg       /* We want to return VOIDmode for raw REAL_TYPEs, but the actual
   4660  1.1  mrg 	 mode if this is contained within an aggregate.  */
   4661  1.1  mrg       if (nested && TYPE_MODE (type) != TFmode)
   4662  1.1  mrg 	return TYPE_MODE (type);
   4663  1.1  mrg       else
   4664  1.1  mrg 	return VOIDmode;
   4665  1.1  mrg 
   4666  1.1  mrg     case ARRAY_TYPE:
   4667  1.1  mrg       return hfa_element_mode (TREE_TYPE (type), 1);
   4668  1.1  mrg 
   4669  1.1  mrg     case RECORD_TYPE:
   4670  1.1  mrg     case UNION_TYPE:
   4671  1.1  mrg     case QUAL_UNION_TYPE:
   4672  1.1  mrg       for (t = TYPE_FIELDS (type); t; t = DECL_CHAIN (t))
   4673  1.1  mrg 	{
   4674  1.1  mrg 	  if (TREE_CODE (t) != FIELD_DECL || DECL_FIELD_ABI_IGNORED (t))
   4675  1.1  mrg 	    continue;
   4676  1.1  mrg 
   4677  1.1  mrg 	  mode = hfa_element_mode (TREE_TYPE (t), 1);
   4678  1.1  mrg 	  if (know_element_mode)
   4679  1.1  mrg 	    {
   4680  1.1  mrg 	      if (mode != element_mode)
   4681  1.1  mrg 		return VOIDmode;
   4682  1.1  mrg 	    }
   4683  1.1  mrg 	  else if (GET_MODE_CLASS (mode) != MODE_FLOAT)
   4684  1.1  mrg 	    return VOIDmode;
   4685  1.1  mrg 	  else
   4686  1.1  mrg 	    {
   4687  1.1  mrg 	      know_element_mode = 1;
   4688  1.1  mrg 	      element_mode = mode;
   4689  1.1  mrg 	    }
   4690  1.1  mrg 	}
   4691  1.1  mrg       return element_mode;
   4692  1.1  mrg 
   4693  1.1  mrg     default:
   4694  1.1  mrg       /* If we reach here, we probably have some front-end specific type
   4695  1.1  mrg 	 that the backend doesn't know about.  This can happen via the
   4696  1.1  mrg 	 aggregate_value_p call in init_function_start.  All we can do is
   4697  1.1  mrg 	 ignore unknown tree types.  */
   4698  1.1  mrg       return VOIDmode;
   4699  1.1  mrg     }
   4700  1.1  mrg 
   4701  1.1  mrg   return VOIDmode;
   4702  1.1  mrg }
   4703  1.1  mrg 
   4704  1.1  mrg /* Return the number of words required to hold a quantity of TYPE and MODE
   4705  1.1  mrg    when passed as an argument.  */
   4706  1.1  mrg static int
   4707  1.1  mrg ia64_function_arg_words (const_tree type, machine_mode mode)
   4708  1.1  mrg {
   4709  1.1  mrg   int words;
   4710  1.1  mrg 
   4711  1.1  mrg   if (mode == BLKmode)
   4712  1.1  mrg     words = int_size_in_bytes (type);
   4713  1.1  mrg   else
   4714  1.1  mrg     words = GET_MODE_SIZE (mode);
   4715  1.1  mrg 
   4716  1.1  mrg   return (words + UNITS_PER_WORD - 1) / UNITS_PER_WORD;  /* round up */
   4717  1.1  mrg }
   4718  1.1  mrg 
   4719  1.1  mrg /* Return the number of registers that should be skipped so the current
   4720  1.1  mrg    argument (described by TYPE and WORDS) will be properly aligned.
   4721  1.1  mrg 
   4722  1.1  mrg    Integer and float arguments larger than 8 bytes start at the next
   4723  1.1  mrg    even boundary.  Aggregates larger than 8 bytes start at the next
   4724  1.1  mrg    even boundary if the aggregate has 16 byte alignment.  Note that
   4725  1.1  mrg    in the 32-bit ABI, TImode and TFmode have only 8-byte alignment
   4726  1.1  mrg    but are still to be aligned in registers.
   4727  1.1  mrg 
   4728  1.1  mrg    ??? The ABI does not specify how to handle aggregates with
   4729  1.1  mrg    alignment from 9 to 15 bytes, or greater than 16.  We handle them
   4730  1.1  mrg    all as if they had 16 byte alignment.  Such aggregates can occur
   4731  1.1  mrg    only if gcc extensions are used.  */
   4732  1.1  mrg static int
   4733  1.1  mrg ia64_function_arg_offset (const CUMULATIVE_ARGS *cum,
   4734  1.1  mrg 			  const_tree type, int words)
   4735  1.1  mrg {
   4736  1.1  mrg   /* No registers are skipped on VMS.  */
   4737  1.1  mrg   if (TARGET_ABI_OPEN_VMS || (cum->words & 1) == 0)
   4738  1.1  mrg     return 0;
   4739  1.1  mrg 
   4740  1.1  mrg   if (type
   4741  1.1  mrg       && TREE_CODE (type) != INTEGER_TYPE
   4742  1.1  mrg       && TREE_CODE (type) != REAL_TYPE)
   4743  1.1  mrg     return TYPE_ALIGN (type) > 8 * BITS_PER_UNIT;
   4744  1.1  mrg   else
   4745  1.1  mrg     return words > 1;
   4746  1.1  mrg }
   4747  1.1  mrg 
   4748  1.1  mrg /* Return rtx for register where argument is passed, or zero if it is passed
   4749  1.1  mrg    on the stack.  */
   4750  1.1  mrg /* ??? 128-bit quad-precision floats are always passed in general
   4751  1.1  mrg    registers.  */
   4752  1.1  mrg 
   4753  1.1  mrg static rtx
   4754  1.1  mrg ia64_function_arg_1 (cumulative_args_t cum_v, const function_arg_info &arg,
   4755  1.1  mrg 		     bool incoming)
   4756  1.1  mrg {
   4757  1.1  mrg   const CUMULATIVE_ARGS *cum = get_cumulative_args (cum_v);
   4758  1.1  mrg 
   4759  1.1  mrg   int basereg = (incoming ? GR_ARG_FIRST : AR_ARG_FIRST);
   4760  1.1  mrg   int words = ia64_function_arg_words (arg.type, arg.mode);
   4761  1.1  mrg   int offset = ia64_function_arg_offset (cum, arg.type, words);
   4762  1.1  mrg   machine_mode hfa_mode = VOIDmode;
   4763  1.1  mrg 
   4764  1.1  mrg   /* For OPEN VMS, emit the instruction setting up the argument register here,
   4765  1.1  mrg      when we know this will be together with the other arguments setup related
   4766  1.1  mrg      insns.  This is not the conceptually best place to do this, but this is
   4767  1.1  mrg      the easiest as we have convenient access to cumulative args info.  */
   4768  1.1  mrg 
   4769  1.1  mrg   if (TARGET_ABI_OPEN_VMS && arg.end_marker_p ())
   4770  1.1  mrg     {
   4771  1.1  mrg       unsigned HOST_WIDE_INT regval = cum->words;
   4772  1.1  mrg       int i;
   4773  1.1  mrg 
   4774  1.1  mrg       for (i = 0; i < 8; i++)
   4775  1.1  mrg 	regval |= ((int) cum->atypes[i]) << (i * 3 + 8);
   4776  1.1  mrg 
   4777  1.1  mrg       emit_move_insn (gen_rtx_REG (DImode, GR_REG (25)),
   4778  1.1  mrg 		      GEN_INT (regval));
   4779  1.1  mrg     }
   4780  1.1  mrg 
   4781  1.1  mrg   /* If all argument slots are used, then it must go on the stack.  */
   4782  1.1  mrg   if (cum->words + offset >= MAX_ARGUMENT_SLOTS)
   4783  1.1  mrg     return 0;
   4784  1.1  mrg 
   4785  1.1  mrg   /* On OpenVMS argument is either in Rn or Fn.  */
   4786  1.1  mrg   if (TARGET_ABI_OPEN_VMS)
   4787  1.1  mrg     {
   4788  1.1  mrg       if (FLOAT_MODE_P (arg.mode))
   4789  1.1  mrg 	return gen_rtx_REG (arg.mode, FR_ARG_FIRST + cum->words);
   4790  1.1  mrg       else
   4791  1.1  mrg 	return gen_rtx_REG (arg.mode, basereg + cum->words);
   4792  1.1  mrg     }
   4793  1.1  mrg 
   4794  1.1  mrg   /* Check for and handle homogeneous FP aggregates.  */
   4795  1.1  mrg   if (arg.type)
   4796  1.1  mrg     hfa_mode = hfa_element_mode (arg.type, 0);
   4797  1.1  mrg 
   4798  1.1  mrg   /* Unnamed prototyped hfas are passed as usual.  Named prototyped hfas
   4799  1.1  mrg      and unprototyped hfas are passed specially.  */
   4800  1.1  mrg   if (hfa_mode != VOIDmode && (! cum->prototype || arg.named))
   4801  1.1  mrg     {
   4802  1.1  mrg       rtx loc[16];
   4803  1.1  mrg       int i = 0;
   4804  1.1  mrg       int fp_regs = cum->fp_regs;
   4805  1.1  mrg       int int_regs = cum->words + offset;
   4806  1.1  mrg       int hfa_size = GET_MODE_SIZE (hfa_mode);
   4807  1.1  mrg       int byte_size;
   4808  1.1  mrg       int args_byte_size;
   4809  1.1  mrg 
   4810  1.1  mrg       /* If prototyped, pass it in FR regs then GR regs.
   4811  1.1  mrg 	 If not prototyped, pass it in both FR and GR regs.
   4812  1.1  mrg 
   4813  1.1  mrg 	 If this is an SFmode aggregate, then it is possible to run out of
   4814  1.1  mrg 	 FR regs while GR regs are still left.  In that case, we pass the
   4815  1.1  mrg 	 remaining part in the GR regs.  */
   4816  1.1  mrg 
   4817  1.1  mrg       /* Fill the FP regs.  We do this always.  We stop if we reach the end
   4818  1.1  mrg 	 of the argument, the last FP register, or the last argument slot.  */
   4819  1.1  mrg 
   4820  1.1  mrg       byte_size = arg.promoted_size_in_bytes ();
   4821  1.1  mrg       args_byte_size = int_regs * UNITS_PER_WORD;
   4822  1.1  mrg       offset = 0;
   4823  1.1  mrg       for (; (offset < byte_size && fp_regs < MAX_ARGUMENT_SLOTS
   4824  1.1  mrg 	      && args_byte_size < (MAX_ARGUMENT_SLOTS * UNITS_PER_WORD)); i++)
   4825  1.1  mrg 	{
   4826  1.1  mrg 	  loc[i] = gen_rtx_EXPR_LIST (VOIDmode,
   4827  1.1  mrg 				      gen_rtx_REG (hfa_mode, (FR_ARG_FIRST
   4828  1.1  mrg 							      + fp_regs)),
   4829  1.1  mrg 				      GEN_INT (offset));
   4830  1.1  mrg 	  offset += hfa_size;
   4831  1.1  mrg 	  args_byte_size += hfa_size;
   4832  1.1  mrg 	  fp_regs++;
   4833  1.1  mrg 	}
   4834  1.1  mrg 
   4835  1.1  mrg       /* If no prototype, then the whole thing must go in GR regs.  */
   4836  1.1  mrg       if (! cum->prototype)
   4837  1.1  mrg 	offset = 0;
   4838  1.1  mrg       /* If this is an SFmode aggregate, then we might have some left over
   4839  1.1  mrg 	 that needs to go in GR regs.  */
   4840  1.1  mrg       else if (byte_size != offset)
   4841  1.1  mrg 	int_regs += offset / UNITS_PER_WORD;
   4842  1.1  mrg 
   4843  1.1  mrg       /* Fill in the GR regs.  We must use DImode here, not the hfa mode.  */
   4844  1.1  mrg 
   4845  1.1  mrg       for (; offset < byte_size && int_regs < MAX_ARGUMENT_SLOTS; i++)
   4846  1.1  mrg 	{
   4847  1.1  mrg 	  machine_mode gr_mode = DImode;
   4848  1.1  mrg 	  unsigned int gr_size;
   4849  1.1  mrg 
   4850  1.1  mrg 	  /* If we have an odd 4 byte hunk because we ran out of FR regs,
   4851  1.1  mrg 	     then this goes in a GR reg left adjusted/little endian, right
   4852  1.1  mrg 	     adjusted/big endian.  */
   4853  1.1  mrg 	  /* ??? Currently this is handled wrong, because 4-byte hunks are
   4854  1.1  mrg 	     always right adjusted/little endian.  */
   4855  1.1  mrg 	  if (offset & 0x4)
   4856  1.1  mrg 	    gr_mode = SImode;
   4857  1.1  mrg 	  /* If we have an even 4 byte hunk because the aggregate is a
   4858  1.1  mrg 	     multiple of 4 bytes in size, then this goes in a GR reg right
   4859  1.1  mrg 	     adjusted/little endian.  */
   4860  1.1  mrg 	  else if (byte_size - offset == 4)
   4861  1.1  mrg 	    gr_mode = SImode;
   4862  1.1  mrg 
   4863  1.1  mrg 	  loc[i] = gen_rtx_EXPR_LIST (VOIDmode,
   4864  1.1  mrg 				      gen_rtx_REG (gr_mode, (basereg
   4865  1.1  mrg 							     + int_regs)),
   4866  1.1  mrg 				      GEN_INT (offset));
   4867  1.1  mrg 
   4868  1.1  mrg 	  gr_size = GET_MODE_SIZE (gr_mode);
   4869  1.1  mrg 	  offset += gr_size;
   4870  1.1  mrg 	  if (gr_size == UNITS_PER_WORD
   4871  1.1  mrg 	      || (gr_size < UNITS_PER_WORD && offset % UNITS_PER_WORD == 0))
   4872  1.1  mrg 	    int_regs++;
   4873  1.1  mrg 	  else if (gr_size > UNITS_PER_WORD)
   4874  1.1  mrg 	    int_regs += gr_size / UNITS_PER_WORD;
   4875  1.1  mrg 	}
   4876  1.1  mrg       return gen_rtx_PARALLEL (arg.mode, gen_rtvec_v (i, loc));
   4877  1.1  mrg     }
   4878  1.1  mrg 
   4879  1.1  mrg   /* Integral and aggregates go in general registers.  If we have run out of
   4880  1.1  mrg      FR registers, then FP values must also go in general registers.  This can
   4881  1.1  mrg      happen when we have a SFmode HFA.  */
   4882  1.1  mrg   else if (arg.mode == TFmode || arg.mode == TCmode
   4883  1.1  mrg 	   || !FLOAT_MODE_P (arg.mode)
   4884  1.1  mrg 	   || cum->fp_regs == MAX_ARGUMENT_SLOTS)
   4885  1.1  mrg     {
   4886  1.1  mrg       int byte_size = arg.promoted_size_in_bytes ();
   4887  1.1  mrg       if (BYTES_BIG_ENDIAN
   4888  1.1  mrg 	  && (arg.mode == BLKmode || arg.aggregate_type_p ())
   4889  1.1  mrg 	  && byte_size < UNITS_PER_WORD
   4890  1.1  mrg 	  && byte_size > 0)
   4891  1.1  mrg 	{
   4892  1.1  mrg 	  rtx gr_reg = gen_rtx_EXPR_LIST (VOIDmode,
   4893  1.1  mrg 					  gen_rtx_REG (DImode,
   4894  1.1  mrg 						       (basereg + cum->words
   4895  1.1  mrg 							+ offset)),
   4896  1.1  mrg 					  const0_rtx);
   4897  1.1  mrg 	  return gen_rtx_PARALLEL (arg.mode, gen_rtvec (1, gr_reg));
   4898  1.1  mrg 	}
   4899  1.1  mrg       else
   4900  1.1  mrg 	return gen_rtx_REG (arg.mode, basereg + cum->words + offset);
   4901  1.1  mrg 
   4902  1.1  mrg     }
   4903  1.1  mrg 
   4904  1.1  mrg   /* If there is a prototype, then FP values go in a FR register when
   4905  1.1  mrg      named, and in a GR register when unnamed.  */
   4906  1.1  mrg   else if (cum->prototype)
   4907  1.1  mrg     {
   4908  1.1  mrg       if (arg.named)
   4909  1.1  mrg 	return gen_rtx_REG (arg.mode, FR_ARG_FIRST + cum->fp_regs);
   4910  1.1  mrg       /* In big-endian mode, an anonymous SFmode value must be represented
   4911  1.1  mrg          as (parallel:SF [(expr_list (reg:DI n) (const_int 0))]) to force
   4912  1.1  mrg 	 the value into the high half of the general register.  */
   4913  1.1  mrg       else if (BYTES_BIG_ENDIAN && arg.mode == SFmode)
   4914  1.1  mrg 	return gen_rtx_PARALLEL (arg.mode,
   4915  1.1  mrg 		 gen_rtvec (1,
   4916  1.1  mrg                    gen_rtx_EXPR_LIST (VOIDmode,
   4917  1.1  mrg 		     gen_rtx_REG (DImode, basereg + cum->words + offset),
   4918  1.1  mrg 				      const0_rtx)));
   4919  1.1  mrg       else
   4920  1.1  mrg 	return gen_rtx_REG (arg.mode, basereg + cum->words + offset);
   4921  1.1  mrg     }
   4922  1.1  mrg   /* If there is no prototype, then FP values go in both FR and GR
   4923  1.1  mrg      registers.  */
   4924  1.1  mrg   else
   4925  1.1  mrg     {
   4926  1.1  mrg       /* See comment above.  */
   4927  1.1  mrg       machine_mode inner_mode =
   4928  1.1  mrg 	(BYTES_BIG_ENDIAN && arg.mode == SFmode) ? DImode : arg.mode;
   4929  1.1  mrg 
   4930  1.1  mrg       rtx fp_reg = gen_rtx_EXPR_LIST (VOIDmode,
   4931  1.1  mrg 				      gen_rtx_REG (arg.mode, (FR_ARG_FIRST
   4932  1.1  mrg 							  + cum->fp_regs)),
   4933  1.1  mrg 				      const0_rtx);
   4934  1.1  mrg       rtx gr_reg = gen_rtx_EXPR_LIST (VOIDmode,
   4935  1.1  mrg 				      gen_rtx_REG (inner_mode,
   4936  1.1  mrg 						   (basereg + cum->words
   4937  1.1  mrg 						    + offset)),
   4938  1.1  mrg 				      const0_rtx);
   4939  1.1  mrg 
   4940  1.1  mrg       return gen_rtx_PARALLEL (arg.mode, gen_rtvec (2, fp_reg, gr_reg));
   4941  1.1  mrg     }
   4942  1.1  mrg }
   4943  1.1  mrg 
   4944  1.1  mrg /* Implement TARGET_FUNCION_ARG target hook.  */
   4945  1.1  mrg 
   4946  1.1  mrg static rtx
   4947  1.1  mrg ia64_function_arg (cumulative_args_t cum, const function_arg_info &arg)
   4948  1.1  mrg {
   4949  1.1  mrg   return ia64_function_arg_1 (cum, arg, false);
   4950  1.1  mrg }
   4951  1.1  mrg 
   4952  1.1  mrg /* Implement TARGET_FUNCION_INCOMING_ARG target hook.  */
   4953  1.1  mrg 
   4954  1.1  mrg static rtx
   4955  1.1  mrg ia64_function_incoming_arg (cumulative_args_t cum,
   4956  1.1  mrg 			    const function_arg_info &arg)
   4957  1.1  mrg {
   4958  1.1  mrg   return ia64_function_arg_1 (cum, arg, true);
   4959  1.1  mrg }
   4960  1.1  mrg 
   4961  1.1  mrg /* Return number of bytes, at the beginning of the argument, that must be
   4962  1.1  mrg    put in registers.  0 is the argument is entirely in registers or entirely
   4963  1.1  mrg    in memory.  */
   4964  1.1  mrg 
   4965  1.1  mrg static int
   4966  1.1  mrg ia64_arg_partial_bytes (cumulative_args_t cum_v, const function_arg_info &arg)
   4967  1.1  mrg {
   4968  1.1  mrg   CUMULATIVE_ARGS *cum = get_cumulative_args (cum_v);
   4969  1.1  mrg 
   4970  1.1  mrg   int words = ia64_function_arg_words (arg.type, arg.mode);
   4971  1.1  mrg   int offset = ia64_function_arg_offset (cum, arg.type, words);
   4972  1.1  mrg 
   4973  1.1  mrg   /* If all argument slots are used, then it must go on the stack.  */
   4974  1.1  mrg   if (cum->words + offset >= MAX_ARGUMENT_SLOTS)
   4975  1.1  mrg     return 0;
   4976  1.1  mrg 
   4977  1.1  mrg   /* It doesn't matter whether the argument goes in FR or GR regs.  If
   4978  1.1  mrg      it fits within the 8 argument slots, then it goes entirely in
   4979  1.1  mrg      registers.  If it extends past the last argument slot, then the rest
   4980  1.1  mrg      goes on the stack.  */
   4981  1.1  mrg 
   4982  1.1  mrg   if (words + cum->words + offset <= MAX_ARGUMENT_SLOTS)
   4983  1.1  mrg     return 0;
   4984  1.1  mrg 
   4985  1.1  mrg   return (MAX_ARGUMENT_SLOTS - cum->words - offset) * UNITS_PER_WORD;
   4986  1.1  mrg }
   4987  1.1  mrg 
   4988  1.1  mrg /* Return ivms_arg_type based on machine_mode.  */
   4989  1.1  mrg 
   4990  1.1  mrg static enum ivms_arg_type
   4991  1.1  mrg ia64_arg_type (machine_mode mode)
   4992  1.1  mrg {
   4993  1.1  mrg   switch (mode)
   4994  1.1  mrg     {
   4995  1.1  mrg     case E_SFmode:
   4996  1.1  mrg       return FS;
   4997  1.1  mrg     case E_DFmode:
   4998  1.1  mrg       return FT;
   4999  1.1  mrg     default:
   5000  1.1  mrg       return I64;
   5001  1.1  mrg     }
   5002  1.1  mrg }
   5003  1.1  mrg 
   5004  1.1  mrg /* Update CUM to point after this argument.  This is patterned after
   5005  1.1  mrg    ia64_function_arg.  */
   5006  1.1  mrg 
   5007  1.1  mrg static void
   5008  1.1  mrg ia64_function_arg_advance (cumulative_args_t cum_v,
   5009  1.1  mrg 			   const function_arg_info &arg)
   5010  1.1  mrg {
   5011  1.1  mrg   CUMULATIVE_ARGS *cum = get_cumulative_args (cum_v);
   5012  1.1  mrg   int words = ia64_function_arg_words (arg.type, arg.mode);
   5013  1.1  mrg   int offset = ia64_function_arg_offset (cum, arg.type, words);
   5014  1.1  mrg   machine_mode hfa_mode = VOIDmode;
   5015  1.1  mrg 
   5016  1.1  mrg   /* If all arg slots are already full, then there is nothing to do.  */
   5017  1.1  mrg   if (cum->words >= MAX_ARGUMENT_SLOTS)
   5018  1.1  mrg     {
   5019  1.1  mrg       cum->words += words + offset;
   5020  1.1  mrg       return;
   5021  1.1  mrg     }
   5022  1.1  mrg 
   5023  1.1  mrg   cum->atypes[cum->words] = ia64_arg_type (arg.mode);
   5024  1.1  mrg   cum->words += words + offset;
   5025  1.1  mrg 
   5026  1.1  mrg   /* On OpenVMS argument is either in Rn or Fn.  */
   5027  1.1  mrg   if (TARGET_ABI_OPEN_VMS)
   5028  1.1  mrg     {
   5029  1.1  mrg       cum->int_regs = cum->words;
   5030  1.1  mrg       cum->fp_regs = cum->words;
   5031  1.1  mrg       return;
   5032  1.1  mrg     }
   5033  1.1  mrg 
   5034  1.1  mrg   /* Check for and handle homogeneous FP aggregates.  */
   5035  1.1  mrg   if (arg.type)
   5036  1.1  mrg     hfa_mode = hfa_element_mode (arg.type, 0);
   5037  1.1  mrg 
   5038  1.1  mrg   /* Unnamed prototyped hfas are passed as usual.  Named prototyped hfas
   5039  1.1  mrg      and unprototyped hfas are passed specially.  */
   5040  1.1  mrg   if (hfa_mode != VOIDmode && (! cum->prototype || arg.named))
   5041  1.1  mrg     {
   5042  1.1  mrg       int fp_regs = cum->fp_regs;
   5043  1.1  mrg       /* This is the original value of cum->words + offset.  */
   5044  1.1  mrg       int int_regs = cum->words - words;
   5045  1.1  mrg       int hfa_size = GET_MODE_SIZE (hfa_mode);
   5046  1.1  mrg       int byte_size;
   5047  1.1  mrg       int args_byte_size;
   5048  1.1  mrg 
   5049  1.1  mrg       /* If prototyped, pass it in FR regs then GR regs.
   5050  1.1  mrg 	 If not prototyped, pass it in both FR and GR regs.
   5051  1.1  mrg 
   5052  1.1  mrg 	 If this is an SFmode aggregate, then it is possible to run out of
   5053  1.1  mrg 	 FR regs while GR regs are still left.  In that case, we pass the
   5054  1.1  mrg 	 remaining part in the GR regs.  */
   5055  1.1  mrg 
   5056  1.1  mrg       /* Fill the FP regs.  We do this always.  We stop if we reach the end
   5057  1.1  mrg 	 of the argument, the last FP register, or the last argument slot.  */
   5058  1.1  mrg 
   5059  1.1  mrg       byte_size = arg.promoted_size_in_bytes ();
   5060  1.1  mrg       args_byte_size = int_regs * UNITS_PER_WORD;
   5061  1.1  mrg       offset = 0;
   5062  1.1  mrg       for (; (offset < byte_size && fp_regs < MAX_ARGUMENT_SLOTS
   5063  1.1  mrg 	      && args_byte_size < (MAX_ARGUMENT_SLOTS * UNITS_PER_WORD));)
   5064  1.1  mrg 	{
   5065  1.1  mrg 	  offset += hfa_size;
   5066  1.1  mrg 	  args_byte_size += hfa_size;
   5067  1.1  mrg 	  fp_regs++;
   5068  1.1  mrg 	}
   5069  1.1  mrg 
   5070  1.1  mrg       cum->fp_regs = fp_regs;
   5071  1.1  mrg     }
   5072  1.1  mrg 
   5073  1.1  mrg   /* Integral and aggregates go in general registers.  So do TFmode FP values.
   5074  1.1  mrg      If we have run out of FR registers, then other FP values must also go in
   5075  1.1  mrg      general registers.  This can happen when we have a SFmode HFA.  */
   5076  1.1  mrg   else if (arg.mode == TFmode || arg.mode == TCmode
   5077  1.1  mrg            || !FLOAT_MODE_P (arg.mode)
   5078  1.1  mrg 	   || cum->fp_regs == MAX_ARGUMENT_SLOTS)
   5079  1.1  mrg     cum->int_regs = cum->words;
   5080  1.1  mrg 
   5081  1.1  mrg   /* If there is a prototype, then FP values go in a FR register when
   5082  1.1  mrg      named, and in a GR register when unnamed.  */
   5083  1.1  mrg   else if (cum->prototype)
   5084  1.1  mrg     {
   5085  1.1  mrg       if (! arg.named)
   5086  1.1  mrg 	cum->int_regs = cum->words;
   5087  1.1  mrg       else
   5088  1.1  mrg 	/* ??? Complex types should not reach here.  */
   5089  1.1  mrg 	cum->fp_regs
   5090  1.1  mrg 	  += (GET_MODE_CLASS (arg.mode) == MODE_COMPLEX_FLOAT ? 2 : 1);
   5091  1.1  mrg     }
   5092  1.1  mrg   /* If there is no prototype, then FP values go in both FR and GR
   5093  1.1  mrg      registers.  */
   5094  1.1  mrg   else
   5095  1.1  mrg     {
   5096  1.1  mrg       /* ??? Complex types should not reach here.  */
   5097  1.1  mrg       cum->fp_regs
   5098  1.1  mrg 	+= (GET_MODE_CLASS (arg.mode) == MODE_COMPLEX_FLOAT ? 2 : 1);
   5099  1.1  mrg       cum->int_regs = cum->words;
   5100  1.1  mrg     }
   5101  1.1  mrg }
   5102  1.1  mrg 
   5103  1.1  mrg /* Arguments with alignment larger than 8 bytes start at the next even
   5104  1.1  mrg    boundary.  On ILP32 HPUX, TFmode arguments start on next even boundary
   5105  1.1  mrg    even though their normal alignment is 8 bytes.  See ia64_function_arg.  */
   5106  1.1  mrg 
   5107  1.1  mrg static unsigned int
   5108  1.1  mrg ia64_function_arg_boundary (machine_mode mode, const_tree type)
   5109  1.1  mrg {
   5110  1.1  mrg   if (mode == TFmode && TARGET_HPUX && TARGET_ILP32)
   5111  1.1  mrg     return PARM_BOUNDARY * 2;
   5112  1.1  mrg 
   5113  1.1  mrg   if (type)
   5114  1.1  mrg     {
   5115  1.1  mrg       if (TYPE_ALIGN (type) > PARM_BOUNDARY)
   5116  1.1  mrg         return PARM_BOUNDARY * 2;
   5117  1.1  mrg       else
   5118  1.1  mrg         return PARM_BOUNDARY;
   5119  1.1  mrg     }
   5120  1.1  mrg 
   5121  1.1  mrg   if (GET_MODE_BITSIZE (mode) > PARM_BOUNDARY)
   5122  1.1  mrg     return PARM_BOUNDARY * 2;
   5123  1.1  mrg   else
   5124  1.1  mrg     return PARM_BOUNDARY;
   5125  1.1  mrg }
   5126  1.1  mrg 
   5127  1.1  mrg /* True if it is OK to do sibling call optimization for the specified
   5128  1.1  mrg    call expression EXP.  DECL will be the called function, or NULL if
   5129  1.1  mrg    this is an indirect call.  */
   5130  1.1  mrg static bool
   5131  1.1  mrg ia64_function_ok_for_sibcall (tree decl, tree exp ATTRIBUTE_UNUSED)
   5132  1.1  mrg {
   5133  1.1  mrg   /* We can't perform a sibcall if the current function has the syscall_linkage
   5134  1.1  mrg      attribute.  */
   5135  1.1  mrg   if (lookup_attribute ("syscall_linkage",
   5136  1.1  mrg 			TYPE_ATTRIBUTES (TREE_TYPE (current_function_decl))))
   5137  1.1  mrg     return false;
   5138  1.1  mrg 
   5139  1.1  mrg   /* We must always return with our current GP.  This means we can
   5140  1.1  mrg      only sibcall to functions defined in the current module unless
   5141  1.1  mrg      TARGET_CONST_GP is set to true.  */
   5142  1.1  mrg   return (decl && (*targetm.binds_local_p) (decl)) || TARGET_CONST_GP;
   5143  1.1  mrg }
   5144  1.1  mrg 
   5145  1.1  mrg 
   5147  1.1  mrg /* Implement va_arg.  */
   5148  1.1  mrg 
   5149  1.1  mrg static tree
   5150  1.1  mrg ia64_gimplify_va_arg (tree valist, tree type, gimple_seq *pre_p,
   5151  1.1  mrg 		      gimple_seq *post_p)
   5152  1.1  mrg {
   5153  1.1  mrg   /* Variable sized types are passed by reference.  */
   5154  1.1  mrg   if (pass_va_arg_by_reference (type))
   5155  1.1  mrg     {
   5156  1.1  mrg       tree ptrtype = build_pointer_type (type);
   5157  1.1  mrg       tree addr = std_gimplify_va_arg_expr (valist, ptrtype, pre_p, post_p);
   5158  1.1  mrg       return build_va_arg_indirect_ref (addr);
   5159  1.1  mrg     }
   5160  1.1  mrg 
   5161  1.1  mrg   /* Aggregate arguments with alignment larger than 8 bytes start at
   5162  1.1  mrg      the next even boundary.  Integer and floating point arguments
   5163  1.1  mrg      do so if they are larger than 8 bytes, whether or not they are
   5164  1.1  mrg      also aligned larger than 8 bytes.  */
   5165  1.1  mrg   if ((TREE_CODE (type) == REAL_TYPE || TREE_CODE (type) == INTEGER_TYPE)
   5166  1.1  mrg       ? int_size_in_bytes (type) > 8 : TYPE_ALIGN (type) > 8 * BITS_PER_UNIT)
   5167  1.1  mrg     {
   5168  1.1  mrg       tree t = fold_build_pointer_plus_hwi (valist, 2 * UNITS_PER_WORD - 1);
   5169  1.1  mrg       t = build2 (BIT_AND_EXPR, TREE_TYPE (t), t,
   5170  1.1  mrg 		  build_int_cst (TREE_TYPE (t), -2 * UNITS_PER_WORD));
   5171  1.1  mrg       gimplify_assign (unshare_expr (valist), t, pre_p);
   5172  1.1  mrg     }
   5173  1.1  mrg 
   5174  1.1  mrg   return std_gimplify_va_arg_expr (valist, type, pre_p, post_p);
   5175  1.1  mrg }
   5176  1.1  mrg 
   5177  1.1  mrg /* Return 1 if function return value returned in memory.  Return 0 if it is
   5179  1.1  mrg    in a register.  */
   5180  1.1  mrg 
   5181  1.1  mrg static bool
   5182  1.1  mrg ia64_return_in_memory (const_tree valtype, const_tree fntype ATTRIBUTE_UNUSED)
   5183  1.1  mrg {
   5184  1.1  mrg   machine_mode mode;
   5185  1.1  mrg   machine_mode hfa_mode;
   5186  1.1  mrg   HOST_WIDE_INT byte_size;
   5187  1.1  mrg 
   5188  1.1  mrg   mode = TYPE_MODE (valtype);
   5189  1.1  mrg   byte_size = GET_MODE_SIZE (mode);
   5190  1.1  mrg   if (mode == BLKmode)
   5191  1.1  mrg     {
   5192  1.1  mrg       byte_size = int_size_in_bytes (valtype);
   5193  1.1  mrg       if (byte_size < 0)
   5194  1.1  mrg 	return true;
   5195  1.1  mrg     }
   5196  1.1  mrg 
   5197  1.1  mrg   /* Hfa's with up to 8 elements are returned in the FP argument registers.  */
   5198  1.1  mrg 
   5199  1.1  mrg   hfa_mode = hfa_element_mode (valtype, 0);
   5200  1.1  mrg   if (hfa_mode != VOIDmode)
   5201  1.1  mrg     {
   5202  1.1  mrg       int hfa_size = GET_MODE_SIZE (hfa_mode);
   5203  1.1  mrg 
   5204  1.1  mrg       if (byte_size / hfa_size > MAX_ARGUMENT_SLOTS)
   5205  1.1  mrg 	return true;
   5206  1.1  mrg       else
   5207  1.1  mrg 	return false;
   5208  1.1  mrg     }
   5209  1.1  mrg   else if (byte_size > UNITS_PER_WORD * MAX_INT_RETURN_SLOTS)
   5210  1.1  mrg     return true;
   5211  1.1  mrg   else
   5212  1.1  mrg     return false;
   5213  1.1  mrg }
   5214  1.1  mrg 
   5215  1.1  mrg /* Return rtx for register that holds the function return value.  */
   5216  1.1  mrg 
   5217  1.1  mrg static rtx
   5218  1.1  mrg ia64_function_value (const_tree valtype,
   5219  1.1  mrg 		     const_tree fn_decl_or_type,
   5220  1.1  mrg 		     bool outgoing ATTRIBUTE_UNUSED)
   5221  1.1  mrg {
   5222  1.1  mrg   machine_mode mode;
   5223  1.1  mrg   machine_mode hfa_mode;
   5224  1.1  mrg   int unsignedp;
   5225  1.1  mrg   const_tree func = fn_decl_or_type;
   5226  1.1  mrg 
   5227  1.1  mrg   if (fn_decl_or_type
   5228  1.1  mrg       && !DECL_P (fn_decl_or_type))
   5229  1.1  mrg     func = NULL;
   5230  1.1  mrg 
   5231  1.1  mrg   mode = TYPE_MODE (valtype);
   5232  1.1  mrg   hfa_mode = hfa_element_mode (valtype, 0);
   5233  1.1  mrg 
   5234  1.1  mrg   if (hfa_mode != VOIDmode)
   5235  1.1  mrg     {
   5236  1.1  mrg       rtx loc[8];
   5237  1.1  mrg       int i;
   5238  1.1  mrg       int hfa_size;
   5239  1.1  mrg       int byte_size;
   5240  1.1  mrg       int offset;
   5241  1.1  mrg 
   5242  1.1  mrg       hfa_size = GET_MODE_SIZE (hfa_mode);
   5243  1.1  mrg       byte_size = ((mode == BLKmode)
   5244  1.1  mrg 		   ? int_size_in_bytes (valtype) : GET_MODE_SIZE (mode));
   5245  1.1  mrg       offset = 0;
   5246  1.1  mrg       for (i = 0; offset < byte_size; i++)
   5247  1.1  mrg 	{
   5248  1.1  mrg 	  loc[i] = gen_rtx_EXPR_LIST (VOIDmode,
   5249  1.1  mrg 				      gen_rtx_REG (hfa_mode, FR_ARG_FIRST + i),
   5250  1.1  mrg 				      GEN_INT (offset));
   5251  1.1  mrg 	  offset += hfa_size;
   5252  1.1  mrg 	}
   5253  1.1  mrg       return gen_rtx_PARALLEL (mode, gen_rtvec_v (i, loc));
   5254  1.1  mrg     }
   5255  1.1  mrg   else if (FLOAT_TYPE_P (valtype) && mode != TFmode && mode != TCmode)
   5256  1.1  mrg     return gen_rtx_REG (mode, FR_ARG_FIRST);
   5257  1.1  mrg   else
   5258  1.1  mrg     {
   5259  1.1  mrg       bool need_parallel = false;
   5260  1.1  mrg 
   5261  1.1  mrg       /* In big-endian mode, we need to manage the layout of aggregates
   5262  1.1  mrg 	 in the registers so that we get the bits properly aligned in
   5263  1.1  mrg 	 the highpart of the registers.  */
   5264  1.1  mrg       if (BYTES_BIG_ENDIAN
   5265  1.1  mrg 	  && (mode == BLKmode || (valtype && AGGREGATE_TYPE_P (valtype))))
   5266  1.1  mrg 	need_parallel = true;
   5267  1.1  mrg 
   5268  1.1  mrg       /* Something like struct S { long double x; char a[0] } is not an
   5269  1.1  mrg 	 HFA structure, and therefore doesn't go in fp registers.  But
   5270  1.1  mrg 	 the middle-end will give it XFmode anyway, and XFmode values
   5271  1.1  mrg 	 don't normally fit in integer registers.  So we need to smuggle
   5272  1.1  mrg 	 the value inside a parallel.  */
   5273  1.1  mrg       else if (mode == XFmode || mode == XCmode || mode == RFmode)
   5274  1.1  mrg 	need_parallel = true;
   5275  1.1  mrg 
   5276  1.1  mrg       if (need_parallel)
   5277  1.1  mrg 	{
   5278  1.1  mrg 	  rtx loc[8];
   5279  1.1  mrg 	  int offset;
   5280  1.1  mrg 	  int bytesize;
   5281  1.1  mrg 	  int i;
   5282  1.1  mrg 
   5283  1.1  mrg 	  offset = 0;
   5284  1.1  mrg 	  bytesize = int_size_in_bytes (valtype);
   5285  1.1  mrg 	  /* An empty PARALLEL is invalid here, but the return value
   5286  1.1  mrg 	     doesn't matter for empty structs.  */
   5287  1.1  mrg 	  if (bytesize == 0)
   5288  1.1  mrg 	    return gen_rtx_REG (mode, GR_RET_FIRST);
   5289  1.1  mrg 	  for (i = 0; offset < bytesize; i++)
   5290  1.1  mrg 	    {
   5291  1.1  mrg 	      loc[i] = gen_rtx_EXPR_LIST (VOIDmode,
   5292  1.1  mrg 					  gen_rtx_REG (DImode,
   5293  1.1  mrg 						       GR_RET_FIRST + i),
   5294  1.1  mrg 					  GEN_INT (offset));
   5295  1.1  mrg 	      offset += UNITS_PER_WORD;
   5296  1.1  mrg 	    }
   5297  1.1  mrg 	  return gen_rtx_PARALLEL (mode, gen_rtvec_v (i, loc));
   5298  1.1  mrg 	}
   5299  1.1  mrg 
   5300  1.1  mrg       mode = promote_function_mode (valtype, mode, &unsignedp,
   5301  1.1  mrg                                     func ? TREE_TYPE (func) : NULL_TREE,
   5302  1.1  mrg                                     true);
   5303  1.1  mrg 
   5304  1.1  mrg       return gen_rtx_REG (mode, GR_RET_FIRST);
   5305  1.1  mrg     }
   5306  1.1  mrg }
   5307  1.1  mrg 
   5308  1.1  mrg /* Worker function for TARGET_LIBCALL_VALUE.  */
   5309  1.1  mrg 
   5310  1.1  mrg static rtx
   5311  1.1  mrg ia64_libcall_value (machine_mode mode,
   5312  1.1  mrg 		    const_rtx fun ATTRIBUTE_UNUSED)
   5313  1.1  mrg {
   5314  1.1  mrg   return gen_rtx_REG (mode,
   5315  1.1  mrg 		      (((GET_MODE_CLASS (mode) == MODE_FLOAT
   5316  1.1  mrg 			 || GET_MODE_CLASS (mode) == MODE_COMPLEX_FLOAT)
   5317  1.1  mrg 			&& (mode) != TFmode)
   5318  1.1  mrg 		       ? FR_RET_FIRST : GR_RET_FIRST));
   5319  1.1  mrg }
   5320  1.1  mrg 
   5321  1.1  mrg /* Worker function for FUNCTION_VALUE_REGNO_P.  */
   5322  1.1  mrg 
   5323  1.1  mrg static bool
   5324  1.1  mrg ia64_function_value_regno_p (const unsigned int regno)
   5325  1.1  mrg {
   5326  1.1  mrg   return ((regno >= GR_RET_FIRST && regno <= GR_RET_LAST)
   5327  1.1  mrg           || (regno >= FR_RET_FIRST && regno <= FR_RET_LAST));
   5328  1.1  mrg }
   5329  1.1  mrg 
   5330  1.1  mrg /* This is called from dwarf2out.cc via TARGET_ASM_OUTPUT_DWARF_DTPREL.
   5331  1.1  mrg    We need to emit DTP-relative relocations.  */
   5332  1.1  mrg 
   5333  1.1  mrg static void
   5334  1.1  mrg ia64_output_dwarf_dtprel (FILE *file, int size, rtx x)
   5335  1.1  mrg {
   5336  1.1  mrg   gcc_assert (size == 4 || size == 8);
   5337  1.1  mrg   if (size == 4)
   5338  1.1  mrg     fputs ("\tdata4.ua\t@dtprel(", file);
   5339  1.1  mrg   else
   5340  1.1  mrg     fputs ("\tdata8.ua\t@dtprel(", file);
   5341  1.1  mrg   output_addr_const (file, x);
   5342  1.1  mrg   fputs (")", file);
   5343  1.1  mrg }
   5344  1.1  mrg 
   5345  1.1  mrg /* Print a memory address as an operand to reference that memory location.  */
   5346  1.1  mrg 
   5347  1.1  mrg /* ??? Do we need this?  It gets used only for 'a' operands.  We could perhaps
   5348  1.1  mrg    also call this from ia64_print_operand for memory addresses.  */
   5349  1.1  mrg 
   5350  1.1  mrg static void
   5351  1.1  mrg ia64_print_operand_address (FILE * stream ATTRIBUTE_UNUSED,
   5352  1.1  mrg 			    machine_mode /*mode*/,
   5353  1.1  mrg 			    rtx address ATTRIBUTE_UNUSED)
   5354  1.1  mrg {
   5355  1.1  mrg }
   5356  1.1  mrg 
   5357  1.1  mrg /* Print an operand to an assembler instruction.
   5358  1.1  mrg    C	Swap and print a comparison operator.
   5359  1.1  mrg    D	Print an FP comparison operator.
   5360  1.1  mrg    E    Print 32 - constant, for SImode shifts as extract.
   5361  1.1  mrg    e    Print 64 - constant, for DImode rotates.
   5362  1.1  mrg    F	A floating point constant 0.0 emitted as f0, or 1.0 emitted as f1, or
   5363  1.1  mrg         a floating point register emitted normally.
   5364  1.1  mrg    G	A floating point constant.
   5365  1.1  mrg    I	Invert a predicate register by adding 1.
   5366  1.1  mrg    J    Select the proper predicate register for a condition.
   5367  1.1  mrg    j    Select the inverse predicate register for a condition.
   5368  1.1  mrg    O	Append .acq for volatile load.
   5369  1.1  mrg    P	Postincrement of a MEM.
   5370  1.1  mrg    Q	Append .rel for volatile store.
   5371  1.1  mrg    R	Print .s .d or nothing for a single, double or no truncation.
   5372  1.1  mrg    S	Shift amount for shladd instruction.
   5373  1.1  mrg    T	Print an 8-bit sign extended number (K) as a 32-bit unsigned number
   5374  1.1  mrg 	for Intel assembler.
   5375  1.1  mrg    U	Print an 8-bit sign extended number (K) as a 64-bit unsigned number
   5376  1.1  mrg 	for Intel assembler.
   5377  1.1  mrg    X	A pair of floating point registers.
   5378  1.1  mrg    r	Print register name, or constant 0 as r0.  HP compatibility for
   5379  1.1  mrg 	Linux kernel.
   5380  1.1  mrg    v    Print vector constant value as an 8-byte integer value.  */
   5381  1.1  mrg 
   5382  1.1  mrg static void
   5383  1.1  mrg ia64_print_operand (FILE * file, rtx x, int code)
   5384  1.1  mrg {
   5385  1.1  mrg   const char *str;
   5386  1.1  mrg 
   5387  1.1  mrg   switch (code)
   5388  1.1  mrg     {
   5389  1.1  mrg     case 0:
   5390  1.1  mrg       /* Handled below.  */
   5391  1.1  mrg       break;
   5392  1.1  mrg 
   5393  1.1  mrg     case 'C':
   5394  1.1  mrg       {
   5395  1.1  mrg 	enum rtx_code c = swap_condition (GET_CODE (x));
   5396  1.1  mrg 	fputs (GET_RTX_NAME (c), file);
   5397  1.1  mrg 	return;
   5398  1.1  mrg       }
   5399  1.1  mrg 
   5400  1.1  mrg     case 'D':
   5401  1.1  mrg       switch (GET_CODE (x))
   5402  1.1  mrg 	{
   5403  1.1  mrg 	case NE:
   5404  1.1  mrg 	  str = "neq";
   5405  1.1  mrg 	  break;
   5406  1.1  mrg 	case UNORDERED:
   5407  1.1  mrg 	  str = "unord";
   5408  1.1  mrg 	  break;
   5409  1.1  mrg 	case ORDERED:
   5410  1.1  mrg 	  str = "ord";
   5411  1.1  mrg 	  break;
   5412  1.1  mrg 	case UNLT:
   5413  1.1  mrg 	  str = "nge";
   5414  1.1  mrg 	  break;
   5415  1.1  mrg 	case UNLE:
   5416  1.1  mrg 	  str = "ngt";
   5417  1.1  mrg 	  break;
   5418  1.1  mrg 	case UNGT:
   5419  1.1  mrg 	  str = "nle";
   5420  1.1  mrg 	  break;
   5421  1.1  mrg 	case UNGE:
   5422  1.1  mrg 	  str = "nlt";
   5423  1.1  mrg 	  break;
   5424  1.1  mrg 	case UNEQ:
   5425  1.1  mrg 	case LTGT:
   5426  1.1  mrg 	  gcc_unreachable ();
   5427  1.1  mrg 	default:
   5428  1.1  mrg 	  str = GET_RTX_NAME (GET_CODE (x));
   5429  1.1  mrg 	  break;
   5430  1.1  mrg 	}
   5431  1.1  mrg       fputs (str, file);
   5432  1.1  mrg       return;
   5433  1.1  mrg 
   5434  1.1  mrg     case 'E':
   5435  1.1  mrg       fprintf (file, HOST_WIDE_INT_PRINT_DEC, 32 - INTVAL (x));
   5436  1.1  mrg       return;
   5437  1.1  mrg 
   5438  1.1  mrg     case 'e':
   5439  1.1  mrg       fprintf (file, HOST_WIDE_INT_PRINT_DEC, 64 - INTVAL (x));
   5440  1.1  mrg       return;
   5441  1.1  mrg 
   5442  1.1  mrg     case 'F':
   5443  1.1  mrg       if (x == CONST0_RTX (GET_MODE (x)))
   5444  1.1  mrg 	str = reg_names [FR_REG (0)];
   5445  1.1  mrg       else if (x == CONST1_RTX (GET_MODE (x)))
   5446  1.1  mrg 	str = reg_names [FR_REG (1)];
   5447  1.1  mrg       else
   5448  1.1  mrg 	{
   5449  1.1  mrg 	  gcc_assert (GET_CODE (x) == REG);
   5450  1.1  mrg 	  str = reg_names [REGNO (x)];
   5451  1.1  mrg 	}
   5452  1.1  mrg       fputs (str, file);
   5453  1.1  mrg       return;
   5454  1.1  mrg 
   5455  1.1  mrg     case 'G':
   5456  1.1  mrg       {
   5457  1.1  mrg 	long val[4];
   5458  1.1  mrg 	real_to_target (val, CONST_DOUBLE_REAL_VALUE (x), GET_MODE (x));
   5459  1.1  mrg 	if (GET_MODE (x) == SFmode)
   5460  1.1  mrg 	  fprintf (file, "0x%08lx", val[0] & 0xffffffff);
   5461  1.1  mrg 	else if (GET_MODE (x) == DFmode)
   5462  1.1  mrg 	  fprintf (file, "0x%08lx%08lx", (WORDS_BIG_ENDIAN ? val[0] : val[1])
   5463  1.1  mrg 					  & 0xffffffff,
   5464  1.1  mrg 					 (WORDS_BIG_ENDIAN ? val[1] : val[0])
   5465  1.1  mrg 					  & 0xffffffff);
   5466  1.1  mrg 	else
   5467  1.1  mrg 	  output_operand_lossage ("invalid %%G mode");
   5468  1.1  mrg       }
   5469  1.1  mrg       return;
   5470  1.1  mrg 
   5471  1.1  mrg     case 'I':
   5472  1.1  mrg       fputs (reg_names [REGNO (x) + 1], file);
   5473  1.1  mrg       return;
   5474  1.1  mrg 
   5475  1.1  mrg     case 'J':
   5476  1.1  mrg     case 'j':
   5477  1.1  mrg       {
   5478  1.1  mrg 	unsigned int regno = REGNO (XEXP (x, 0));
   5479  1.1  mrg 	if (GET_CODE (x) == EQ)
   5480  1.1  mrg 	  regno += 1;
   5481  1.1  mrg 	if (code == 'j')
   5482  1.1  mrg 	  regno ^= 1;
   5483  1.1  mrg         fputs (reg_names [regno], file);
   5484  1.1  mrg       }
   5485  1.1  mrg       return;
   5486  1.1  mrg 
   5487  1.1  mrg     case 'O':
   5488  1.1  mrg       if (MEM_VOLATILE_P (x))
   5489  1.1  mrg 	fputs(".acq", file);
   5490  1.1  mrg       return;
   5491  1.1  mrg 
   5492  1.1  mrg     case 'P':
   5493  1.1  mrg       {
   5494  1.1  mrg 	HOST_WIDE_INT value;
   5495  1.1  mrg 
   5496  1.1  mrg 	switch (GET_CODE (XEXP (x, 0)))
   5497  1.1  mrg 	  {
   5498  1.1  mrg 	  default:
   5499  1.1  mrg 	    return;
   5500  1.1  mrg 
   5501  1.1  mrg 	  case POST_MODIFY:
   5502  1.1  mrg 	    x = XEXP (XEXP (XEXP (x, 0), 1), 1);
   5503  1.1  mrg 	    if (GET_CODE (x) == CONST_INT)
   5504  1.1  mrg 	      value = INTVAL (x);
   5505  1.1  mrg 	    else
   5506  1.1  mrg 	      {
   5507  1.1  mrg 		gcc_assert (GET_CODE (x) == REG);
   5508  1.1  mrg 		fprintf (file, ", %s", reg_names[REGNO (x)]);
   5509  1.1  mrg 		return;
   5510  1.1  mrg 	      }
   5511  1.1  mrg 	    break;
   5512  1.1  mrg 
   5513  1.1  mrg 	  case POST_INC:
   5514  1.1  mrg 	    value = GET_MODE_SIZE (GET_MODE (x));
   5515  1.1  mrg 	    break;
   5516  1.1  mrg 
   5517  1.1  mrg 	  case POST_DEC:
   5518  1.1  mrg 	    value = - (HOST_WIDE_INT) GET_MODE_SIZE (GET_MODE (x));
   5519  1.1  mrg 	    break;
   5520  1.1  mrg 	  }
   5521  1.1  mrg 
   5522  1.1  mrg 	fprintf (file, ", " HOST_WIDE_INT_PRINT_DEC, value);
   5523  1.1  mrg 	return;
   5524  1.1  mrg       }
   5525  1.1  mrg 
   5526  1.1  mrg     case 'Q':
   5527  1.1  mrg       if (MEM_VOLATILE_P (x))
   5528  1.1  mrg 	fputs(".rel", file);
   5529  1.1  mrg       return;
   5530  1.1  mrg 
   5531  1.1  mrg     case 'R':
   5532  1.1  mrg       if (x == CONST0_RTX (GET_MODE (x)))
   5533  1.1  mrg 	fputs(".s", file);
   5534  1.1  mrg       else if (x == CONST1_RTX (GET_MODE (x)))
   5535  1.1  mrg 	fputs(".d", file);
   5536  1.1  mrg       else if (x == CONST2_RTX (GET_MODE (x)))
   5537  1.1  mrg 	;
   5538  1.1  mrg       else
   5539  1.1  mrg 	output_operand_lossage ("invalid %%R value");
   5540  1.1  mrg       return;
   5541  1.1  mrg 
   5542  1.1  mrg     case 'S':
   5543  1.1  mrg       fprintf (file, "%d", exact_log2 (INTVAL (x)));
   5544  1.1  mrg       return;
   5545  1.1  mrg 
   5546  1.1  mrg     case 'T':
   5547  1.1  mrg       if (! TARGET_GNU_AS && GET_CODE (x) == CONST_INT)
   5548  1.1  mrg 	{
   5549  1.1  mrg 	  fprintf (file, "0x%x", (int) INTVAL (x) & 0xffffffff);
   5550  1.1  mrg 	  return;
   5551  1.1  mrg 	}
   5552  1.1  mrg       break;
   5553  1.1  mrg 
   5554  1.1  mrg     case 'U':
   5555  1.1  mrg       if (! TARGET_GNU_AS && GET_CODE (x) == CONST_INT)
   5556  1.1  mrg 	{
   5557  1.1  mrg 	  const char *prefix = "0x";
   5558  1.1  mrg 	  if (INTVAL (x) & 0x80000000)
   5559  1.1  mrg 	    {
   5560  1.1  mrg 	      fprintf (file, "0xffffffff");
   5561  1.1  mrg 	      prefix = "";
   5562  1.1  mrg 	    }
   5563  1.1  mrg 	  fprintf (file, "%s%x", prefix, (int) INTVAL (x) & 0xffffffff);
   5564  1.1  mrg 	  return;
   5565  1.1  mrg 	}
   5566  1.1  mrg       break;
   5567  1.1  mrg 
   5568  1.1  mrg     case 'X':
   5569  1.1  mrg       {
   5570  1.1  mrg 	unsigned int regno = REGNO (x);
   5571  1.1  mrg 	fprintf (file, "%s, %s", reg_names [regno], reg_names [regno + 1]);
   5572  1.1  mrg       }
   5573  1.1  mrg       return;
   5574  1.1  mrg 
   5575  1.1  mrg     case 'r':
   5576  1.1  mrg       /* If this operand is the constant zero, write it as register zero.
   5577  1.1  mrg 	 Any register, zero, or CONST_INT value is OK here.  */
   5578  1.1  mrg       if (GET_CODE (x) == REG)
   5579  1.1  mrg 	fputs (reg_names[REGNO (x)], file);
   5580  1.1  mrg       else if (x == CONST0_RTX (GET_MODE (x)))
   5581  1.1  mrg 	fputs ("r0", file);
   5582  1.1  mrg       else if (GET_CODE (x) == CONST_INT)
   5583  1.1  mrg 	output_addr_const (file, x);
   5584  1.1  mrg       else
   5585  1.1  mrg 	output_operand_lossage ("invalid %%r value");
   5586  1.1  mrg       return;
   5587  1.1  mrg 
   5588  1.1  mrg     case 'v':
   5589  1.1  mrg       gcc_assert (GET_CODE (x) == CONST_VECTOR);
   5590  1.1  mrg       x = simplify_subreg (DImode, x, GET_MODE (x), 0);
   5591  1.1  mrg       break;
   5592  1.1  mrg 
   5593  1.1  mrg     case '+':
   5594  1.1  mrg       {
   5595  1.1  mrg 	const char *which;
   5596  1.1  mrg 
   5597  1.1  mrg 	/* For conditional branches, returns or calls, substitute
   5598  1.1  mrg 	   sptk, dptk, dpnt, or spnt for %s.  */
   5599  1.1  mrg 	x = find_reg_note (current_output_insn, REG_BR_PROB, 0);
   5600  1.1  mrg 	if (x)
   5601  1.1  mrg 	  {
   5602  1.1  mrg 	    int pred_val = profile_probability::from_reg_br_prob_note
   5603  1.1  mrg 				 (XINT (x, 0)).to_reg_br_prob_base ();
   5604  1.1  mrg 
   5605  1.1  mrg 	    /* Guess top and bottom 10% statically predicted.  */
   5606  1.1  mrg 	    if (pred_val < REG_BR_PROB_BASE / 50
   5607  1.1  mrg 		&& br_prob_note_reliable_p (x))
   5608  1.1  mrg 	      which = ".spnt";
   5609  1.1  mrg 	    else if (pred_val < REG_BR_PROB_BASE / 2)
   5610  1.1  mrg 	      which = ".dpnt";
   5611  1.1  mrg 	    else if (pred_val < REG_BR_PROB_BASE / 100 * 98
   5612  1.1  mrg 		     || !br_prob_note_reliable_p (x))
   5613  1.1  mrg 	      which = ".dptk";
   5614  1.1  mrg 	    else
   5615  1.1  mrg 	      which = ".sptk";
   5616  1.1  mrg 	  }
   5617  1.1  mrg 	else if (CALL_P (current_output_insn))
   5618  1.1  mrg 	  which = ".sptk";
   5619  1.1  mrg 	else
   5620  1.1  mrg 	  which = ".dptk";
   5621  1.1  mrg 
   5622  1.1  mrg 	fputs (which, file);
   5623  1.1  mrg 	return;
   5624  1.1  mrg       }
   5625  1.1  mrg 
   5626  1.1  mrg     case ',':
   5627  1.1  mrg       x = current_insn_predicate;
   5628  1.1  mrg       if (x)
   5629  1.1  mrg 	{
   5630  1.1  mrg 	  unsigned int regno = REGNO (XEXP (x, 0));
   5631  1.1  mrg 	  if (GET_CODE (x) == EQ)
   5632  1.1  mrg 	    regno += 1;
   5633  1.1  mrg           fprintf (file, "(%s) ", reg_names [regno]);
   5634  1.1  mrg 	}
   5635  1.1  mrg       return;
   5636  1.1  mrg 
   5637  1.1  mrg     default:
   5638  1.1  mrg       output_operand_lossage ("ia64_print_operand: unknown code");
   5639  1.1  mrg       return;
   5640  1.1  mrg     }
   5641  1.1  mrg 
   5642  1.1  mrg   switch (GET_CODE (x))
   5643  1.1  mrg     {
   5644  1.1  mrg       /* This happens for the spill/restore instructions.  */
   5645  1.1  mrg     case POST_INC:
   5646  1.1  mrg     case POST_DEC:
   5647  1.1  mrg     case POST_MODIFY:
   5648  1.1  mrg       x = XEXP (x, 0);
   5649  1.1  mrg       /* fall through */
   5650  1.1  mrg 
   5651  1.1  mrg     case REG:
   5652  1.1  mrg       fputs (reg_names [REGNO (x)], file);
   5653  1.1  mrg       break;
   5654  1.1  mrg 
   5655  1.1  mrg     case MEM:
   5656  1.1  mrg       {
   5657  1.1  mrg 	rtx addr = XEXP (x, 0);
   5658  1.1  mrg 	if (GET_RTX_CLASS (GET_CODE (addr)) == RTX_AUTOINC)
   5659  1.1  mrg 	  addr = XEXP (addr, 0);
   5660  1.1  mrg 	fprintf (file, "[%s]", reg_names [REGNO (addr)]);
   5661  1.1  mrg 	break;
   5662  1.1  mrg       }
   5663  1.1  mrg 
   5664  1.1  mrg     default:
   5665  1.1  mrg       output_addr_const (file, x);
   5666  1.1  mrg       break;
   5667  1.1  mrg     }
   5668  1.1  mrg 
   5669  1.1  mrg   return;
   5670  1.1  mrg }
   5671  1.1  mrg 
   5672  1.1  mrg /* Worker function for TARGET_PRINT_OPERAND_PUNCT_VALID_P.  */
   5673  1.1  mrg 
   5674  1.1  mrg static bool
   5675  1.1  mrg ia64_print_operand_punct_valid_p (unsigned char code)
   5676  1.1  mrg {
   5677  1.1  mrg   return (code == '+' || code == ',');
   5678  1.1  mrg }
   5679  1.1  mrg 
   5680  1.1  mrg /* Compute a (partial) cost for rtx X.  Return true if the complete
   5682  1.1  mrg    cost has been computed, and false if subexpressions should be
   5683  1.1  mrg    scanned.  In either case, *TOTAL contains the cost result.  */
   5684  1.1  mrg /* ??? This is incomplete.  */
   5685  1.1  mrg 
   5686  1.1  mrg static bool
   5687  1.1  mrg ia64_rtx_costs (rtx x, machine_mode mode, int outer_code,
   5688  1.1  mrg 		int opno ATTRIBUTE_UNUSED,
   5689  1.1  mrg 		int *total, bool speed ATTRIBUTE_UNUSED)
   5690  1.1  mrg {
   5691  1.1  mrg   int code = GET_CODE (x);
   5692  1.1  mrg 
   5693  1.1  mrg   switch (code)
   5694  1.1  mrg     {
   5695  1.1  mrg     case CONST_INT:
   5696  1.1  mrg       switch (outer_code)
   5697  1.1  mrg         {
   5698  1.1  mrg         case SET:
   5699  1.1  mrg 	  *total = satisfies_constraint_J (x) ? 0 : COSTS_N_INSNS (1);
   5700  1.1  mrg 	  return true;
   5701  1.1  mrg         case PLUS:
   5702  1.1  mrg 	  if (satisfies_constraint_I (x))
   5703  1.1  mrg 	    *total = 0;
   5704  1.1  mrg 	  else if (satisfies_constraint_J (x))
   5705  1.1  mrg 	    *total = 1;
   5706  1.1  mrg 	  else
   5707  1.1  mrg 	    *total = COSTS_N_INSNS (1);
   5708  1.1  mrg 	  return true;
   5709  1.1  mrg         default:
   5710  1.1  mrg 	  if (satisfies_constraint_K (x) || satisfies_constraint_L (x))
   5711  1.1  mrg 	    *total = 0;
   5712  1.1  mrg 	  else
   5713  1.1  mrg 	    *total = COSTS_N_INSNS (1);
   5714  1.1  mrg 	  return true;
   5715  1.1  mrg 	}
   5716  1.1  mrg 
   5717  1.1  mrg     case CONST_DOUBLE:
   5718  1.1  mrg       *total = COSTS_N_INSNS (1);
   5719  1.1  mrg       return true;
   5720  1.1  mrg 
   5721  1.1  mrg     case CONST:
   5722  1.1  mrg     case SYMBOL_REF:
   5723  1.1  mrg     case LABEL_REF:
   5724  1.1  mrg       *total = COSTS_N_INSNS (3);
   5725  1.1  mrg       return true;
   5726  1.1  mrg 
   5727  1.1  mrg     case FMA:
   5728  1.1  mrg       *total = COSTS_N_INSNS (4);
   5729  1.1  mrg       return true;
   5730  1.1  mrg 
   5731  1.1  mrg     case MULT:
   5732  1.1  mrg       /* For multiplies wider than HImode, we have to go to the FPU,
   5733  1.1  mrg          which normally involves copies.  Plus there's the latency
   5734  1.1  mrg          of the multiply itself, and the latency of the instructions to
   5735  1.1  mrg          transfer integer regs to FP regs.  */
   5736  1.1  mrg       if (FLOAT_MODE_P (mode))
   5737  1.1  mrg 	*total = COSTS_N_INSNS (4);
   5738  1.1  mrg       else if (GET_MODE_SIZE (mode) > 2)
   5739  1.1  mrg         *total = COSTS_N_INSNS (10);
   5740  1.1  mrg       else
   5741  1.1  mrg 	*total = COSTS_N_INSNS (2);
   5742  1.1  mrg       return true;
   5743  1.1  mrg 
   5744  1.1  mrg     case PLUS:
   5745  1.1  mrg     case MINUS:
   5746  1.1  mrg       if (FLOAT_MODE_P (mode))
   5747  1.1  mrg 	{
   5748  1.1  mrg 	  *total = COSTS_N_INSNS (4);
   5749  1.1  mrg 	  return true;
   5750  1.1  mrg 	}
   5751  1.1  mrg       /* FALLTHRU */
   5752  1.1  mrg 
   5753  1.1  mrg     case ASHIFT:
   5754  1.1  mrg     case ASHIFTRT:
   5755  1.1  mrg     case LSHIFTRT:
   5756  1.1  mrg       *total = COSTS_N_INSNS (1);
   5757  1.1  mrg       return true;
   5758  1.1  mrg 
   5759  1.1  mrg     case DIV:
   5760  1.1  mrg     case UDIV:
   5761  1.1  mrg     case MOD:
   5762  1.1  mrg     case UMOD:
   5763  1.1  mrg       /* We make divide expensive, so that divide-by-constant will be
   5764  1.1  mrg          optimized to a multiply.  */
   5765  1.1  mrg       *total = COSTS_N_INSNS (60);
   5766  1.1  mrg       return true;
   5767  1.1  mrg 
   5768  1.1  mrg     default:
   5769  1.1  mrg       return false;
   5770  1.1  mrg     }
   5771  1.1  mrg }
   5772  1.1  mrg 
   5773  1.1  mrg /* Calculate the cost of moving data from a register in class FROM to
   5774  1.1  mrg    one in class TO, using MODE.  */
   5775  1.1  mrg 
   5776  1.1  mrg static int
   5777  1.1  mrg ia64_register_move_cost (machine_mode mode, reg_class_t from,
   5778  1.1  mrg 			 reg_class_t to)
   5779  1.1  mrg {
   5780  1.1  mrg   /* ADDL_REGS is the same as GR_REGS for movement purposes.  */
   5781  1.1  mrg   if (to == ADDL_REGS)
   5782  1.1  mrg     to = GR_REGS;
   5783  1.1  mrg   if (from == ADDL_REGS)
   5784  1.1  mrg     from = GR_REGS;
   5785  1.1  mrg 
   5786  1.1  mrg   /* All costs are symmetric, so reduce cases by putting the
   5787  1.1  mrg      lower number class as the destination.  */
   5788  1.1  mrg   if (from < to)
   5789  1.1  mrg     {
   5790  1.1  mrg       reg_class_t tmp = to;
   5791  1.1  mrg       to = from, from = tmp;
   5792  1.1  mrg     }
   5793  1.1  mrg 
   5794  1.1  mrg   /* Moving from FR<->GR in XFmode must be more expensive than 2,
   5795  1.1  mrg      so that we get secondary memory reloads.  Between FR_REGS,
   5796  1.1  mrg      we have to make this at least as expensive as memory_move_cost
   5797  1.1  mrg      to avoid spectacularly poor register class preferencing.  */
   5798  1.1  mrg   if (mode == XFmode || mode == RFmode)
   5799  1.1  mrg     {
   5800  1.1  mrg       if (to != GR_REGS || from != GR_REGS)
   5801  1.1  mrg         return memory_move_cost (mode, to, false);
   5802  1.1  mrg       else
   5803  1.1  mrg 	return 3;
   5804  1.1  mrg     }
   5805  1.1  mrg 
   5806  1.1  mrg   switch (to)
   5807  1.1  mrg     {
   5808  1.1  mrg     case PR_REGS:
   5809  1.1  mrg       /* Moving between PR registers takes two insns.  */
   5810  1.1  mrg       if (from == PR_REGS)
   5811  1.1  mrg 	return 3;
   5812  1.1  mrg       /* Moving between PR and anything but GR is impossible.  */
   5813  1.1  mrg       if (from != GR_REGS)
   5814  1.1  mrg 	return memory_move_cost (mode, to, false);
   5815  1.1  mrg       break;
   5816  1.1  mrg 
   5817  1.1  mrg     case BR_REGS:
   5818  1.1  mrg       /* Moving between BR and anything but GR is impossible.  */
   5819  1.1  mrg       if (from != GR_REGS && from != GR_AND_BR_REGS)
   5820  1.1  mrg 	return memory_move_cost (mode, to, false);
   5821  1.1  mrg       break;
   5822  1.1  mrg 
   5823  1.1  mrg     case AR_I_REGS:
   5824  1.1  mrg     case AR_M_REGS:
   5825  1.1  mrg       /* Moving between AR and anything but GR is impossible.  */
   5826  1.1  mrg       if (from != GR_REGS)
   5827  1.1  mrg 	return memory_move_cost (mode, to, false);
   5828  1.1  mrg       break;
   5829  1.1  mrg 
   5830  1.1  mrg     case GR_REGS:
   5831  1.1  mrg     case FR_REGS:
   5832  1.1  mrg     case FP_REGS:
   5833  1.1  mrg     case GR_AND_FR_REGS:
   5834  1.1  mrg     case GR_AND_BR_REGS:
   5835  1.1  mrg     case ALL_REGS:
   5836  1.1  mrg       break;
   5837  1.1  mrg 
   5838  1.1  mrg     default:
   5839  1.1  mrg       gcc_unreachable ();
   5840  1.1  mrg     }
   5841  1.1  mrg 
   5842  1.1  mrg   return 2;
   5843  1.1  mrg }
   5844  1.1  mrg 
   5845  1.1  mrg /* Calculate the cost of moving data of MODE from a register to or from
   5846  1.1  mrg    memory.  */
   5847  1.1  mrg 
   5848  1.1  mrg static int
   5849  1.1  mrg ia64_memory_move_cost (machine_mode mode ATTRIBUTE_UNUSED,
   5850  1.1  mrg 		       reg_class_t rclass,
   5851  1.1  mrg 		       bool in ATTRIBUTE_UNUSED)
   5852  1.1  mrg {
   5853  1.1  mrg   if (rclass == GENERAL_REGS
   5854  1.1  mrg       || rclass == FR_REGS
   5855  1.1  mrg       || rclass == FP_REGS
   5856  1.1  mrg       || rclass == GR_AND_FR_REGS)
   5857  1.1  mrg     return 4;
   5858  1.1  mrg   else
   5859  1.1  mrg     return 10;
   5860  1.1  mrg }
   5861  1.1  mrg 
   5862  1.1  mrg /* Implement TARGET_PREFERRED_RELOAD_CLASS.  Place additional restrictions
   5863  1.1  mrg    on RCLASS to use when copying X into that class.  */
   5864  1.1  mrg 
   5865  1.1  mrg static reg_class_t
   5866  1.1  mrg ia64_preferred_reload_class (rtx x, reg_class_t rclass)
   5867  1.1  mrg {
   5868  1.1  mrg   switch (rclass)
   5869  1.1  mrg     {
   5870  1.1  mrg     case FR_REGS:
   5871  1.1  mrg     case FP_REGS:
   5872  1.1  mrg       /* Don't allow volatile mem reloads into floating point registers.
   5873  1.1  mrg 	 This is defined to force reload to choose the r/m case instead
   5874  1.1  mrg 	 of the f/f case when reloading (set (reg fX) (mem/v)).  */
   5875  1.1  mrg       if (MEM_P (x) && MEM_VOLATILE_P (x))
   5876  1.1  mrg 	return NO_REGS;
   5877  1.1  mrg 
   5878  1.1  mrg       /* Force all unrecognized constants into the constant pool.  */
   5879  1.1  mrg       if (CONSTANT_P (x))
   5880  1.1  mrg 	return NO_REGS;
   5881  1.1  mrg       break;
   5882  1.1  mrg 
   5883  1.1  mrg     case AR_M_REGS:
   5884  1.1  mrg     case AR_I_REGS:
   5885  1.1  mrg       if (!OBJECT_P (x))
   5886  1.1  mrg 	return NO_REGS;
   5887  1.1  mrg       break;
   5888  1.1  mrg 
   5889  1.1  mrg     default:
   5890  1.1  mrg       break;
   5891  1.1  mrg     }
   5892  1.1  mrg 
   5893  1.1  mrg   return rclass;
   5894  1.1  mrg }
   5895  1.1  mrg 
   5896  1.1  mrg /* This function returns the register class required for a secondary
   5897  1.1  mrg    register when copying between one of the registers in RCLASS, and X,
   5898  1.1  mrg    using MODE.  A return value of NO_REGS means that no secondary register
   5899  1.1  mrg    is required.  */
   5900  1.1  mrg 
   5901  1.1  mrg enum reg_class
   5902  1.1  mrg ia64_secondary_reload_class (enum reg_class rclass,
   5903  1.1  mrg 			     machine_mode mode ATTRIBUTE_UNUSED, rtx x)
   5904  1.1  mrg {
   5905  1.1  mrg   int regno = -1;
   5906  1.1  mrg 
   5907  1.1  mrg   if (GET_CODE (x) == REG || GET_CODE (x) == SUBREG)
   5908  1.1  mrg     regno = true_regnum (x);
   5909  1.1  mrg 
   5910  1.1  mrg   switch (rclass)
   5911  1.1  mrg     {
   5912  1.1  mrg     case BR_REGS:
   5913  1.1  mrg     case AR_M_REGS:
   5914  1.1  mrg     case AR_I_REGS:
   5915  1.1  mrg       /* ??? BR<->BR register copies can happen due to a bad gcse/cse/global
   5916  1.1  mrg 	 interaction.  We end up with two pseudos with overlapping lifetimes
   5917  1.1  mrg 	 both of which are equiv to the same constant, and both which need
   5918  1.1  mrg 	 to be in BR_REGS.  This seems to be a cse bug.  cse_basic_block_end
   5919  1.1  mrg 	 changes depending on the path length, which means the qty_first_reg
   5920  1.1  mrg 	 check in make_regs_eqv can give different answers at different times.
   5921  1.1  mrg 	 At some point I'll probably need a reload_indi pattern to handle
   5922  1.1  mrg 	 this.
   5923  1.1  mrg 
   5924  1.1  mrg 	 We can also get GR_AND_FR_REGS to BR_REGS/AR_REGS copies, where we
   5925  1.1  mrg 	 wound up with a FP register from GR_AND_FR_REGS.  Extend that to all
   5926  1.1  mrg 	 non-general registers for good measure.  */
   5927  1.1  mrg       if (regno >= 0 && ! GENERAL_REGNO_P (regno))
   5928  1.1  mrg 	return GR_REGS;
   5929  1.1  mrg 
   5930  1.1  mrg       /* This is needed if a pseudo used as a call_operand gets spilled to a
   5931  1.1  mrg 	 stack slot.  */
   5932  1.1  mrg       if (GET_CODE (x) == MEM)
   5933  1.1  mrg 	return GR_REGS;
   5934  1.1  mrg       break;
   5935  1.1  mrg 
   5936  1.1  mrg     case FR_REGS:
   5937  1.1  mrg     case FP_REGS:
   5938  1.1  mrg       /* Need to go through general registers to get to other class regs.  */
   5939  1.1  mrg       if (regno >= 0 && ! (FR_REGNO_P (regno) || GENERAL_REGNO_P (regno)))
   5940  1.1  mrg 	return GR_REGS;
   5941  1.1  mrg 
   5942  1.1  mrg       /* This can happen when a paradoxical subreg is an operand to the
   5943  1.1  mrg 	 muldi3 pattern.  */
   5944  1.1  mrg       /* ??? This shouldn't be necessary after instruction scheduling is
   5945  1.1  mrg 	 enabled, because paradoxical subregs are not accepted by
   5946  1.1  mrg 	 register_operand when INSN_SCHEDULING is defined.  Or alternatively,
   5947  1.1  mrg 	 stop the paradoxical subreg stupidity in the *_operand functions
   5948  1.1  mrg 	 in recog.cc.  */
   5949  1.1  mrg       if (GET_CODE (x) == MEM
   5950  1.1  mrg 	  && (GET_MODE (x) == SImode || GET_MODE (x) == HImode
   5951  1.1  mrg 	      || GET_MODE (x) == QImode))
   5952  1.1  mrg 	return GR_REGS;
   5953  1.1  mrg 
   5954  1.1  mrg       /* This can happen because of the ior/and/etc patterns that accept FP
   5955  1.1  mrg 	 registers as operands.  If the third operand is a constant, then it
   5956  1.1  mrg 	 needs to be reloaded into a FP register.  */
   5957  1.1  mrg       if (GET_CODE (x) == CONST_INT)
   5958  1.1  mrg 	return GR_REGS;
   5959  1.1  mrg 
   5960  1.1  mrg       /* This can happen because of register elimination in a muldi3 insn.
   5961  1.1  mrg 	 E.g. `26107 * (unsigned long)&u'.  */
   5962  1.1  mrg       if (GET_CODE (x) == PLUS)
   5963  1.1  mrg 	return GR_REGS;
   5964  1.1  mrg       break;
   5965  1.1  mrg 
   5966  1.1  mrg     case PR_REGS:
   5967  1.1  mrg       /* ??? This happens if we cse/gcse a BImode value across a call,
   5968  1.1  mrg 	 and the function has a nonlocal goto.  This is because global
   5969  1.1  mrg 	 does not allocate call crossing pseudos to hard registers when
   5970  1.1  mrg 	 crtl->has_nonlocal_goto is true.  This is relatively
   5971  1.1  mrg 	 common for C++ programs that use exceptions.  To reproduce,
   5972  1.1  mrg 	 return NO_REGS and compile libstdc++.  */
   5973  1.1  mrg       if (GET_CODE (x) == MEM)
   5974  1.1  mrg 	return GR_REGS;
   5975  1.1  mrg 
   5976  1.1  mrg       /* This can happen when we take a BImode subreg of a DImode value,
   5977  1.1  mrg 	 and that DImode value winds up in some non-GR register.  */
   5978  1.1  mrg       if (regno >= 0 && ! GENERAL_REGNO_P (regno) && ! PR_REGNO_P (regno))
   5979  1.1  mrg 	return GR_REGS;
   5980  1.1  mrg       break;
   5981  1.1  mrg 
   5982  1.1  mrg     default:
   5983  1.1  mrg       break;
   5984  1.1  mrg     }
   5985  1.1  mrg 
   5986  1.1  mrg   return NO_REGS;
   5987  1.1  mrg }
   5988  1.1  mrg 
   5989  1.1  mrg 
   5990  1.1  mrg /* Implement targetm.unspec_may_trap_p hook.  */
   5992  1.1  mrg static int
   5993  1.1  mrg ia64_unspec_may_trap_p (const_rtx x, unsigned flags)
   5994  1.1  mrg {
   5995  1.1  mrg   switch (XINT (x, 1))
   5996  1.1  mrg     {
   5997  1.1  mrg     case UNSPEC_LDA:
   5998  1.1  mrg     case UNSPEC_LDS:
   5999  1.1  mrg     case UNSPEC_LDSA:
   6000  1.1  mrg     case UNSPEC_LDCCLR:
   6001  1.1  mrg     case UNSPEC_CHKACLR:
   6002  1.1  mrg     case UNSPEC_CHKS:
   6003  1.1  mrg       /* These unspecs are just wrappers.  */
   6004  1.1  mrg       return may_trap_p_1 (XVECEXP (x, 0, 0), flags);
   6005  1.1  mrg     }
   6006  1.1  mrg 
   6007  1.1  mrg   return default_unspec_may_trap_p (x, flags);
   6008  1.1  mrg }
   6009  1.1  mrg 
   6010  1.1  mrg 
   6011  1.1  mrg /* Parse the -mfixed-range= option string.  */
   6013  1.1  mrg 
   6014  1.1  mrg static void
   6015  1.1  mrg fix_range (const char *const_str)
   6016  1.1  mrg {
   6017  1.1  mrg   int i, first, last;
   6018  1.1  mrg   char *str, *dash, *comma;
   6019  1.1  mrg 
   6020  1.1  mrg   /* str must be of the form REG1'-'REG2{,REG1'-'REG} where REG1 and
   6021  1.1  mrg      REG2 are either register names or register numbers.  The effect
   6022  1.1  mrg      of this option is to mark the registers in the range from REG1 to
   6023  1.1  mrg      REG2 as ``fixed'' so they won't be used by the compiler.  This is
   6024  1.1  mrg      used, e.g., to ensure that kernel mode code doesn't use f32-f127.  */
   6025  1.1  mrg 
   6026  1.1  mrg   i = strlen (const_str);
   6027  1.1  mrg   str = (char *) alloca (i + 1);
   6028  1.1  mrg   memcpy (str, const_str, i + 1);
   6029  1.1  mrg 
   6030  1.1  mrg   while (1)
   6031  1.1  mrg     {
   6032  1.1  mrg       dash = strchr (str, '-');
   6033  1.1  mrg       if (!dash)
   6034  1.1  mrg 	{
   6035  1.1  mrg 	  warning (0, "value of %<-mfixed-range%> must have form REG1-REG2");
   6036  1.1  mrg 	  return;
   6037  1.1  mrg 	}
   6038  1.1  mrg       *dash = '\0';
   6039  1.1  mrg 
   6040  1.1  mrg       comma = strchr (dash + 1, ',');
   6041  1.1  mrg       if (comma)
   6042  1.1  mrg 	*comma = '\0';
   6043  1.1  mrg 
   6044  1.1  mrg       first = decode_reg_name (str);
   6045  1.1  mrg       if (first < 0)
   6046  1.1  mrg 	{
   6047  1.1  mrg 	  warning (0, "unknown register name: %s", str);
   6048  1.1  mrg 	  return;
   6049  1.1  mrg 	}
   6050  1.1  mrg 
   6051  1.1  mrg       last = decode_reg_name (dash + 1);
   6052  1.1  mrg       if (last < 0)
   6053  1.1  mrg 	{
   6054  1.1  mrg 	  warning (0, "unknown register name: %s", dash + 1);
   6055  1.1  mrg 	  return;
   6056  1.1  mrg 	}
   6057  1.1  mrg 
   6058  1.1  mrg       *dash = '-';
   6059  1.1  mrg 
   6060  1.1  mrg       if (first > last)
   6061  1.1  mrg 	{
   6062  1.1  mrg 	  warning (0, "%s-%s is an empty range", str, dash + 1);
   6063  1.1  mrg 	  return;
   6064  1.1  mrg 	}
   6065  1.1  mrg 
   6066  1.1  mrg       for (i = first; i <= last; ++i)
   6067  1.1  mrg 	fixed_regs[i] = 1;
   6068  1.1  mrg 
   6069  1.1  mrg       if (!comma)
   6070  1.1  mrg 	break;
   6071  1.1  mrg 
   6072  1.1  mrg       *comma = ',';
   6073  1.1  mrg       str = comma + 1;
   6074  1.1  mrg     }
   6075  1.1  mrg }
   6076  1.1  mrg 
   6077  1.1  mrg /* Implement TARGET_OPTION_OVERRIDE.  */
   6078  1.1  mrg 
   6079  1.1  mrg static void
   6080  1.1  mrg ia64_option_override (void)
   6081  1.1  mrg {
   6082  1.1  mrg   unsigned int i;
   6083  1.1  mrg   cl_deferred_option *opt;
   6084  1.1  mrg   vec<cl_deferred_option> *v
   6085  1.1  mrg     = (vec<cl_deferred_option> *) ia64_deferred_options;
   6086  1.1  mrg 
   6087  1.1  mrg   if (v)
   6088  1.1  mrg     FOR_EACH_VEC_ELT (*v, i, opt)
   6089  1.1  mrg       {
   6090  1.1  mrg 	switch (opt->opt_index)
   6091  1.1  mrg 	  {
   6092  1.1  mrg 	  case OPT_mfixed_range_:
   6093  1.1  mrg 	    fix_range (opt->arg);
   6094  1.1  mrg 	    break;
   6095  1.1  mrg 
   6096  1.1  mrg 	  default:
   6097  1.1  mrg 	    gcc_unreachable ();
   6098  1.1  mrg 	  }
   6099  1.1  mrg       }
   6100  1.1  mrg 
   6101  1.1  mrg   if (TARGET_AUTO_PIC)
   6102  1.1  mrg     target_flags |= MASK_CONST_GP;
   6103  1.1  mrg 
   6104  1.1  mrg   /* Numerous experiment shows that IRA based loop pressure
   6105  1.1  mrg      calculation works better for RTL loop invariant motion on targets
   6106  1.1  mrg      with enough (>= 32) registers.  It is an expensive optimization.
   6107  1.1  mrg      So it is on only for peak performance.  */
   6108  1.1  mrg   if (optimize >= 3)
   6109  1.1  mrg     flag_ira_loop_pressure = 1;
   6110  1.1  mrg 
   6111  1.1  mrg 
   6112  1.1  mrg   ia64_section_threshold = (OPTION_SET_P (g_switch_value)
   6113  1.1  mrg 			    ? g_switch_value
   6114  1.1  mrg 			    : IA64_DEFAULT_GVALUE);
   6115  1.1  mrg 
   6116  1.1  mrg   init_machine_status = ia64_init_machine_status;
   6117  1.1  mrg 
   6118  1.1  mrg   if (flag_align_functions && !str_align_functions)
   6119  1.1  mrg     str_align_functions = "64";
   6120  1.1  mrg   if (flag_align_loops && !str_align_loops)
   6121  1.1  mrg     str_align_loops = "32";
   6122  1.1  mrg   if (TARGET_ABI_OPEN_VMS)
   6123  1.1  mrg     flag_no_common = 1;
   6124  1.1  mrg 
   6125  1.1  mrg   ia64_override_options_after_change();
   6126  1.1  mrg }
   6127  1.1  mrg 
   6128  1.1  mrg /* Implement targetm.override_options_after_change.  */
   6129  1.1  mrg 
   6130  1.1  mrg static void
   6131  1.1  mrg ia64_override_options_after_change (void)
   6132  1.1  mrg {
   6133  1.1  mrg   if (optimize >= 3
   6134  1.1  mrg       && !OPTION_SET_P (flag_selective_scheduling)
   6135  1.1  mrg       && !OPTION_SET_P (flag_selective_scheduling2))
   6136  1.1  mrg     {
   6137  1.1  mrg       flag_selective_scheduling2 = 1;
   6138  1.1  mrg       flag_sel_sched_pipelining = 1;
   6139  1.1  mrg     }
   6140  1.1  mrg   if (mflag_sched_control_spec == 2)
   6141  1.1  mrg     {
   6142  1.1  mrg       /* Control speculation is on by default for the selective scheduler,
   6143  1.1  mrg          but not for the Haifa scheduler.  */
   6144  1.1  mrg       mflag_sched_control_spec = flag_selective_scheduling2 ? 1 : 0;
   6145  1.1  mrg     }
   6146  1.1  mrg   if (flag_sel_sched_pipelining && flag_auto_inc_dec)
   6147  1.1  mrg     {
   6148  1.1  mrg       /* FIXME: remove this when we'd implement breaking autoinsns as
   6149  1.1  mrg          a transformation.  */
   6150  1.1  mrg       flag_auto_inc_dec = 0;
   6151  1.1  mrg     }
   6152  1.1  mrg }
   6153  1.1  mrg 
   6154  1.1  mrg /* Initialize the record of emitted frame related registers.  */
   6155  1.1  mrg 
   6156  1.1  mrg void ia64_init_expanders (void)
   6157  1.1  mrg {
   6158  1.1  mrg   memset (&emitted_frame_related_regs, 0, sizeof (emitted_frame_related_regs));
   6159  1.1  mrg }
   6160  1.1  mrg 
   6161  1.1  mrg static struct machine_function *
   6162  1.1  mrg ia64_init_machine_status (void)
   6163  1.1  mrg {
   6164  1.1  mrg   return ggc_cleared_alloc<machine_function> ();
   6165  1.1  mrg }
   6166  1.1  mrg 
   6167  1.1  mrg static enum attr_itanium_class ia64_safe_itanium_class (rtx_insn *);
   6169  1.1  mrg static enum attr_type ia64_safe_type (rtx_insn *);
   6170  1.1  mrg 
   6171  1.1  mrg static enum attr_itanium_class
   6172  1.1  mrg ia64_safe_itanium_class (rtx_insn *insn)
   6173  1.1  mrg {
   6174  1.1  mrg   if (recog_memoized (insn) >= 0)
   6175  1.1  mrg     return get_attr_itanium_class (insn);
   6176  1.1  mrg   else if (DEBUG_INSN_P (insn))
   6177  1.1  mrg     return ITANIUM_CLASS_IGNORE;
   6178  1.1  mrg   else
   6179  1.1  mrg     return ITANIUM_CLASS_UNKNOWN;
   6180  1.1  mrg }
   6181  1.1  mrg 
   6182  1.1  mrg static enum attr_type
   6183  1.1  mrg ia64_safe_type (rtx_insn *insn)
   6184  1.1  mrg {
   6185  1.1  mrg   if (recog_memoized (insn) >= 0)
   6186  1.1  mrg     return get_attr_type (insn);
   6187  1.1  mrg   else
   6188  1.1  mrg     return TYPE_UNKNOWN;
   6189  1.1  mrg }
   6190  1.1  mrg 
   6191  1.1  mrg /* The following collection of routines emit instruction group stop bits as
   6193  1.1  mrg    necessary to avoid dependencies.  */
   6194  1.1  mrg 
   6195  1.1  mrg /* Need to track some additional registers as far as serialization is
   6196  1.1  mrg    concerned so we can properly handle br.call and br.ret.  We could
   6197  1.1  mrg    make these registers visible to gcc, but since these registers are
   6198  1.1  mrg    never explicitly used in gcc generated code, it seems wasteful to
   6199  1.1  mrg    do so (plus it would make the call and return patterns needlessly
   6200  1.1  mrg    complex).  */
   6201  1.1  mrg #define REG_RP		(BR_REG (0))
   6202  1.1  mrg #define REG_AR_CFM	(FIRST_PSEUDO_REGISTER + 1)
   6203  1.1  mrg /* This is used for volatile asms which may require a stop bit immediately
   6204  1.1  mrg    before and after them.  */
   6205  1.1  mrg #define REG_VOLATILE	(FIRST_PSEUDO_REGISTER + 2)
   6206  1.1  mrg #define AR_UNAT_BIT_0	(FIRST_PSEUDO_REGISTER + 3)
   6207  1.1  mrg #define NUM_REGS	(AR_UNAT_BIT_0 + 64)
   6208  1.1  mrg 
   6209  1.1  mrg /* For each register, we keep track of how it has been written in the
   6210  1.1  mrg    current instruction group.
   6211  1.1  mrg 
   6212  1.1  mrg    If a register is written unconditionally (no qualifying predicate),
   6213  1.1  mrg    WRITE_COUNT is set to 2 and FIRST_PRED is ignored.
   6214  1.1  mrg 
   6215  1.1  mrg    If a register is written if its qualifying predicate P is true, we
   6216  1.1  mrg    set WRITE_COUNT to 1 and FIRST_PRED to P.  Later on, the same register
   6217  1.1  mrg    may be written again by the complement of P (P^1) and when this happens,
   6218  1.1  mrg    WRITE_COUNT gets set to 2.
   6219  1.1  mrg 
   6220  1.1  mrg    The result of this is that whenever an insn attempts to write a register
   6221  1.1  mrg    whose WRITE_COUNT is two, we need to issue an insn group barrier first.
   6222  1.1  mrg 
   6223  1.1  mrg    If a predicate register is written by a floating-point insn, we set
   6224  1.1  mrg    WRITTEN_BY_FP to true.
   6225  1.1  mrg 
   6226  1.1  mrg    If a predicate register is written by an AND.ORCM we set WRITTEN_BY_AND
   6227  1.1  mrg    to true; if it was written by an OR.ANDCM we set WRITTEN_BY_OR to true.  */
   6228  1.1  mrg 
   6229  1.1  mrg #if GCC_VERSION >= 4000
   6230  1.1  mrg #define RWS_FIELD_TYPE __extension__ unsigned short
   6231  1.1  mrg #else
   6232  1.1  mrg #define RWS_FIELD_TYPE unsigned int
   6233  1.1  mrg #endif
   6234  1.1  mrg struct reg_write_state
   6235  1.1  mrg {
   6236  1.1  mrg   RWS_FIELD_TYPE write_count : 2;
   6237  1.1  mrg   RWS_FIELD_TYPE first_pred : 10;
   6238  1.1  mrg   RWS_FIELD_TYPE written_by_fp : 1;
   6239  1.1  mrg   RWS_FIELD_TYPE written_by_and : 1;
   6240  1.1  mrg   RWS_FIELD_TYPE written_by_or : 1;
   6241  1.1  mrg };
   6242  1.1  mrg 
   6243  1.1  mrg /* Cumulative info for the current instruction group.  */
   6244  1.1  mrg struct reg_write_state rws_sum[NUM_REGS];
   6245  1.1  mrg #if CHECKING_P
   6246  1.1  mrg /* Bitmap whether a register has been written in the current insn.  */
   6247  1.1  mrg unsigned HOST_WIDEST_FAST_INT rws_insn
   6248  1.1  mrg   [(NUM_REGS + HOST_BITS_PER_WIDEST_FAST_INT - 1)
   6249  1.1  mrg    / HOST_BITS_PER_WIDEST_FAST_INT];
   6250  1.1  mrg 
   6251  1.1  mrg static inline void
   6252  1.1  mrg rws_insn_set (unsigned int regno)
   6253  1.1  mrg {
   6254  1.1  mrg   unsigned int elt = regno / HOST_BITS_PER_WIDEST_FAST_INT;
   6255  1.1  mrg   unsigned int bit = regno % HOST_BITS_PER_WIDEST_FAST_INT;
   6256  1.1  mrg   gcc_assert (!((rws_insn[elt] >> bit) & 1));
   6257  1.1  mrg   rws_insn[elt] |= (unsigned HOST_WIDEST_FAST_INT) 1 << bit;
   6258  1.1  mrg }
   6259  1.1  mrg 
   6260  1.1  mrg static inline int
   6261  1.1  mrg rws_insn_test (unsigned int regno)
   6262  1.1  mrg {
   6263  1.1  mrg   unsigned int elt = regno / HOST_BITS_PER_WIDEST_FAST_INT;
   6264  1.1  mrg   unsigned int bit = regno % HOST_BITS_PER_WIDEST_FAST_INT;
   6265  1.1  mrg   return (rws_insn[elt] >> bit) & 1;
   6266  1.1  mrg }
   6267  1.1  mrg #else
   6268  1.1  mrg /* When not checking, track just REG_AR_CFM and REG_VOLATILE.  */
   6269  1.1  mrg unsigned char rws_insn[2];
   6270  1.1  mrg 
   6271  1.1  mrg static inline void
   6272  1.1  mrg rws_insn_set (int regno)
   6273  1.1  mrg {
   6274  1.1  mrg   if (regno == REG_AR_CFM)
   6275  1.1  mrg     rws_insn[0] = 1;
   6276  1.1  mrg   else if (regno == REG_VOLATILE)
   6277  1.1  mrg     rws_insn[1] = 1;
   6278  1.1  mrg }
   6279  1.1  mrg 
   6280  1.1  mrg static inline int
   6281  1.1  mrg rws_insn_test (int regno)
   6282  1.1  mrg {
   6283  1.1  mrg   if (regno == REG_AR_CFM)
   6284  1.1  mrg     return rws_insn[0];
   6285  1.1  mrg   if (regno == REG_VOLATILE)
   6286  1.1  mrg     return rws_insn[1];
   6287  1.1  mrg   return 0;
   6288  1.1  mrg }
   6289  1.1  mrg #endif
   6290  1.1  mrg 
   6291  1.1  mrg /* Indicates whether this is the first instruction after a stop bit,
   6292  1.1  mrg    in which case we don't need another stop bit.  Without this,
   6293  1.1  mrg    ia64_variable_issue will die when scheduling an alloc.  */
   6294  1.1  mrg static int first_instruction;
   6295  1.1  mrg 
   6296  1.1  mrg /* Misc flags needed to compute RAW/WAW dependencies while we are traversing
   6297  1.1  mrg    RTL for one instruction.  */
   6298  1.1  mrg struct reg_flags
   6299  1.1  mrg {
   6300  1.1  mrg   unsigned int is_write : 1;	/* Is register being written?  */
   6301  1.1  mrg   unsigned int is_fp : 1;	/* Is register used as part of an fp op?  */
   6302  1.1  mrg   unsigned int is_branch : 1;	/* Is register used as part of a branch?  */
   6303  1.1  mrg   unsigned int is_and : 1;	/* Is register used as part of and.orcm?  */
   6304  1.1  mrg   unsigned int is_or : 1;	/* Is register used as part of or.andcm?  */
   6305  1.1  mrg   unsigned int is_sibcall : 1;	/* Is this a sibling or normal call?  */
   6306  1.1  mrg };
   6307  1.1  mrg 
   6308  1.1  mrg static void rws_update (int, struct reg_flags, int);
   6309  1.1  mrg static int rws_access_regno (int, struct reg_flags, int);
   6310  1.1  mrg static int rws_access_reg (rtx, struct reg_flags, int);
   6311  1.1  mrg static void update_set_flags (rtx, struct reg_flags *);
   6312  1.1  mrg static int set_src_needs_barrier (rtx, struct reg_flags, int);
   6313  1.1  mrg static int rtx_needs_barrier (rtx, struct reg_flags, int);
   6314  1.1  mrg static void init_insn_group_barriers (void);
   6315  1.1  mrg static int group_barrier_needed (rtx_insn *);
   6316  1.1  mrg static int safe_group_barrier_needed (rtx_insn *);
   6317  1.1  mrg static int in_safe_group_barrier;
   6318  1.1  mrg 
   6319  1.1  mrg /* Update *RWS for REGNO, which is being written by the current instruction,
   6320  1.1  mrg    with predicate PRED, and associated register flags in FLAGS.  */
   6321  1.1  mrg 
   6322  1.1  mrg static void
   6323  1.1  mrg rws_update (int regno, struct reg_flags flags, int pred)
   6324  1.1  mrg {
   6325  1.1  mrg   if (pred)
   6326  1.1  mrg     rws_sum[regno].write_count++;
   6327  1.1  mrg   else
   6328  1.1  mrg     rws_sum[regno].write_count = 2;
   6329  1.1  mrg   rws_sum[regno].written_by_fp |= flags.is_fp;
   6330  1.1  mrg   /* ??? Not tracking and/or across differing predicates.  */
   6331  1.1  mrg   rws_sum[regno].written_by_and = flags.is_and;
   6332  1.1  mrg   rws_sum[regno].written_by_or = flags.is_or;
   6333  1.1  mrg   rws_sum[regno].first_pred = pred;
   6334  1.1  mrg }
   6335  1.1  mrg 
   6336  1.1  mrg /* Handle an access to register REGNO of type FLAGS using predicate register
   6337  1.1  mrg    PRED.  Update rws_sum array.  Return 1 if this access creates
   6338  1.1  mrg    a dependency with an earlier instruction in the same group.  */
   6339  1.1  mrg 
   6340  1.1  mrg static int
   6341  1.1  mrg rws_access_regno (int regno, struct reg_flags flags, int pred)
   6342  1.1  mrg {
   6343  1.1  mrg   int need_barrier = 0;
   6344  1.1  mrg 
   6345  1.1  mrg   gcc_assert (regno < NUM_REGS);
   6346  1.1  mrg 
   6347  1.1  mrg   if (! PR_REGNO_P (regno))
   6348  1.1  mrg     flags.is_and = flags.is_or = 0;
   6349  1.1  mrg 
   6350  1.1  mrg   if (flags.is_write)
   6351  1.1  mrg     {
   6352  1.1  mrg       int write_count;
   6353  1.1  mrg 
   6354  1.1  mrg       rws_insn_set (regno);
   6355  1.1  mrg       write_count = rws_sum[regno].write_count;
   6356  1.1  mrg 
   6357  1.1  mrg       switch (write_count)
   6358  1.1  mrg 	{
   6359  1.1  mrg 	case 0:
   6360  1.1  mrg 	  /* The register has not been written yet.  */
   6361  1.1  mrg 	  if (!in_safe_group_barrier)
   6362  1.1  mrg 	    rws_update (regno, flags, pred);
   6363  1.1  mrg 	  break;
   6364  1.1  mrg 
   6365  1.1  mrg 	case 1:
   6366  1.1  mrg 	  /* The register has been written via a predicate.  Treat
   6367  1.1  mrg 	     it like a unconditional write and do not try to check
   6368  1.1  mrg 	     for complementary pred reg in earlier write.  */
   6369  1.1  mrg 	  if (flags.is_and && rws_sum[regno].written_by_and)
   6370  1.1  mrg 	    ;
   6371  1.1  mrg 	  else if (flags.is_or && rws_sum[regno].written_by_or)
   6372  1.1  mrg 	    ;
   6373  1.1  mrg 	  else
   6374  1.1  mrg 	    need_barrier = 1;
   6375  1.1  mrg 	  if (!in_safe_group_barrier)
   6376  1.1  mrg 	    rws_update (regno, flags, pred);
   6377  1.1  mrg 	  break;
   6378  1.1  mrg 
   6379  1.1  mrg 	case 2:
   6380  1.1  mrg 	  /* The register has been unconditionally written already.  We
   6381  1.1  mrg 	     need a barrier.  */
   6382  1.1  mrg 	  if (flags.is_and && rws_sum[regno].written_by_and)
   6383  1.1  mrg 	    ;
   6384  1.1  mrg 	  else if (flags.is_or && rws_sum[regno].written_by_or)
   6385  1.1  mrg 	    ;
   6386  1.1  mrg 	  else
   6387  1.1  mrg 	    need_barrier = 1;
   6388  1.1  mrg 	  if (!in_safe_group_barrier)
   6389  1.1  mrg 	    {
   6390  1.1  mrg 	      rws_sum[regno].written_by_and = flags.is_and;
   6391  1.1  mrg 	      rws_sum[regno].written_by_or = flags.is_or;
   6392  1.1  mrg 	    }
   6393  1.1  mrg 	  break;
   6394  1.1  mrg 
   6395  1.1  mrg 	default:
   6396  1.1  mrg 	  gcc_unreachable ();
   6397  1.1  mrg 	}
   6398  1.1  mrg     }
   6399  1.1  mrg   else
   6400  1.1  mrg     {
   6401  1.1  mrg       if (flags.is_branch)
   6402  1.1  mrg 	{
   6403  1.1  mrg 	  /* Branches have several RAW exceptions that allow to avoid
   6404  1.1  mrg 	     barriers.  */
   6405  1.1  mrg 
   6406  1.1  mrg 	  if (REGNO_REG_CLASS (regno) == BR_REGS || regno == AR_PFS_REGNUM)
   6407  1.1  mrg 	    /* RAW dependencies on branch regs are permissible as long
   6408  1.1  mrg 	       as the writer is a non-branch instruction.  Since we
   6409  1.1  mrg 	       never generate code that uses a branch register written
   6410  1.1  mrg 	       by a branch instruction, handling this case is
   6411  1.1  mrg 	       easy.  */
   6412  1.1  mrg 	    return 0;
   6413  1.1  mrg 
   6414  1.1  mrg 	  if (REGNO_REG_CLASS (regno) == PR_REGS
   6415  1.1  mrg 	      && ! rws_sum[regno].written_by_fp)
   6416  1.1  mrg 	    /* The predicates of a branch are available within the
   6417  1.1  mrg 	       same insn group as long as the predicate was written by
   6418  1.1  mrg 	       something other than a floating-point instruction.  */
   6419  1.1  mrg 	    return 0;
   6420  1.1  mrg 	}
   6421  1.1  mrg 
   6422  1.1  mrg       if (flags.is_and && rws_sum[regno].written_by_and)
   6423  1.1  mrg 	return 0;
   6424  1.1  mrg       if (flags.is_or && rws_sum[regno].written_by_or)
   6425  1.1  mrg 	return 0;
   6426  1.1  mrg 
   6427  1.1  mrg       switch (rws_sum[regno].write_count)
   6428  1.1  mrg 	{
   6429  1.1  mrg 	case 0:
   6430  1.1  mrg 	  /* The register has not been written yet.  */
   6431  1.1  mrg 	  break;
   6432  1.1  mrg 
   6433  1.1  mrg 	case 1:
   6434  1.1  mrg 	  /* The register has been written via a predicate, assume we
   6435  1.1  mrg 	     need a barrier (don't check for complementary regs).  */
   6436  1.1  mrg 	  need_barrier = 1;
   6437  1.1  mrg 	  break;
   6438  1.1  mrg 
   6439  1.1  mrg 	case 2:
   6440  1.1  mrg 	  /* The register has been unconditionally written already.  We
   6441  1.1  mrg 	     need a barrier.  */
   6442  1.1  mrg 	  need_barrier = 1;
   6443  1.1  mrg 	  break;
   6444  1.1  mrg 
   6445  1.1  mrg 	default:
   6446  1.1  mrg 	  gcc_unreachable ();
   6447  1.1  mrg 	}
   6448  1.1  mrg     }
   6449  1.1  mrg 
   6450  1.1  mrg   return need_barrier;
   6451  1.1  mrg }
   6452  1.1  mrg 
   6453  1.1  mrg static int
   6454  1.1  mrg rws_access_reg (rtx reg, struct reg_flags flags, int pred)
   6455  1.1  mrg {
   6456  1.1  mrg   int regno = REGNO (reg);
   6457  1.1  mrg   int n = REG_NREGS (reg);
   6458  1.1  mrg 
   6459  1.1  mrg   if (n == 1)
   6460  1.1  mrg     return rws_access_regno (regno, flags, pred);
   6461  1.1  mrg   else
   6462  1.1  mrg     {
   6463  1.1  mrg       int need_barrier = 0;
   6464  1.1  mrg       while (--n >= 0)
   6465  1.1  mrg 	need_barrier |= rws_access_regno (regno + n, flags, pred);
   6466  1.1  mrg       return need_barrier;
   6467  1.1  mrg     }
   6468  1.1  mrg }
   6469  1.1  mrg 
   6470  1.1  mrg /* Examine X, which is a SET rtx, and update the flags, the predicate, and
   6471  1.1  mrg    the condition, stored in *PFLAGS, *PPRED and *PCOND.  */
   6472  1.1  mrg 
   6473  1.1  mrg static void
   6474  1.1  mrg update_set_flags (rtx x, struct reg_flags *pflags)
   6475  1.1  mrg {
   6476  1.1  mrg   rtx src = SET_SRC (x);
   6477  1.1  mrg 
   6478  1.1  mrg   switch (GET_CODE (src))
   6479  1.1  mrg     {
   6480  1.1  mrg     case CALL:
   6481  1.1  mrg       return;
   6482  1.1  mrg 
   6483  1.1  mrg     case IF_THEN_ELSE:
   6484  1.1  mrg       /* There are four cases here:
   6485  1.1  mrg 	 (1) The destination is (pc), in which case this is a branch,
   6486  1.1  mrg 	 nothing here applies.
   6487  1.1  mrg 	 (2) The destination is ar.lc, in which case this is a
   6488  1.1  mrg 	 doloop_end_internal,
   6489  1.1  mrg 	 (3) The destination is an fp register, in which case this is
   6490  1.1  mrg 	 an fselect instruction.
   6491  1.1  mrg 	 (4) The condition has (unspec [(reg)] UNSPEC_LDC), in which case
   6492  1.1  mrg 	 this is a check load.
   6493  1.1  mrg 	 In all cases, nothing we do in this function applies.  */
   6494  1.1  mrg       return;
   6495  1.1  mrg 
   6496  1.1  mrg     default:
   6497  1.1  mrg       if (COMPARISON_P (src)
   6498  1.1  mrg 	  && SCALAR_FLOAT_MODE_P (GET_MODE (XEXP (src, 0))))
   6499  1.1  mrg 	/* Set pflags->is_fp to 1 so that we know we're dealing
   6500  1.1  mrg 	   with a floating point comparison when processing the
   6501  1.1  mrg 	   destination of the SET.  */
   6502  1.1  mrg 	pflags->is_fp = 1;
   6503  1.1  mrg 
   6504  1.1  mrg       /* Discover if this is a parallel comparison.  We only handle
   6505  1.1  mrg 	 and.orcm and or.andcm at present, since we must retain a
   6506  1.1  mrg 	 strict inverse on the predicate pair.  */
   6507  1.1  mrg       else if (GET_CODE (src) == AND)
   6508  1.1  mrg 	pflags->is_and = 1;
   6509  1.1  mrg       else if (GET_CODE (src) == IOR)
   6510  1.1  mrg 	pflags->is_or = 1;
   6511  1.1  mrg 
   6512  1.1  mrg       break;
   6513  1.1  mrg     }
   6514  1.1  mrg }
   6515  1.1  mrg 
   6516  1.1  mrg /* Subroutine of rtx_needs_barrier; this function determines whether the
   6517  1.1  mrg    source of a given SET rtx found in X needs a barrier.  FLAGS and PRED
   6518  1.1  mrg    are as in rtx_needs_barrier.  COND is an rtx that holds the condition
   6519  1.1  mrg    for this insn.  */
   6520  1.1  mrg 
   6521  1.1  mrg static int
   6522  1.1  mrg set_src_needs_barrier (rtx x, struct reg_flags flags, int pred)
   6523  1.1  mrg {
   6524  1.1  mrg   int need_barrier = 0;
   6525  1.1  mrg   rtx dst;
   6526  1.1  mrg   rtx src = SET_SRC (x);
   6527  1.1  mrg 
   6528  1.1  mrg   if (GET_CODE (src) == CALL)
   6529  1.1  mrg     /* We don't need to worry about the result registers that
   6530  1.1  mrg        get written by subroutine call.  */
   6531  1.1  mrg     return rtx_needs_barrier (src, flags, pred);
   6532  1.1  mrg   else if (SET_DEST (x) == pc_rtx)
   6533  1.1  mrg     {
   6534  1.1  mrg       /* X is a conditional branch.  */
   6535  1.1  mrg       /* ??? This seems redundant, as the caller sets this bit for
   6536  1.1  mrg 	 all JUMP_INSNs.  */
   6537  1.1  mrg       if (!ia64_spec_check_src_p (src))
   6538  1.1  mrg 	flags.is_branch = 1;
   6539  1.1  mrg       return rtx_needs_barrier (src, flags, pred);
   6540  1.1  mrg     }
   6541  1.1  mrg 
   6542  1.1  mrg   if (ia64_spec_check_src_p (src))
   6543  1.1  mrg     /* Avoid checking one register twice (in condition
   6544  1.1  mrg        and in 'then' section) for ldc pattern.  */
   6545  1.1  mrg     {
   6546  1.1  mrg       gcc_assert (REG_P (XEXP (src, 2)));
   6547  1.1  mrg       need_barrier = rtx_needs_barrier (XEXP (src, 2), flags, pred);
   6548  1.1  mrg 
   6549  1.1  mrg       /* We process MEM below.  */
   6550  1.1  mrg       src = XEXP (src, 1);
   6551  1.1  mrg     }
   6552  1.1  mrg 
   6553  1.1  mrg   need_barrier |= rtx_needs_barrier (src, flags, pred);
   6554  1.1  mrg 
   6555  1.1  mrg   dst = SET_DEST (x);
   6556  1.1  mrg   if (GET_CODE (dst) == ZERO_EXTRACT)
   6557  1.1  mrg     {
   6558  1.1  mrg       need_barrier |= rtx_needs_barrier (XEXP (dst, 1), flags, pred);
   6559  1.1  mrg       need_barrier |= rtx_needs_barrier (XEXP (dst, 2), flags, pred);
   6560  1.1  mrg     }
   6561  1.1  mrg   return need_barrier;
   6562  1.1  mrg }
   6563  1.1  mrg 
   6564  1.1  mrg /* Handle an access to rtx X of type FLAGS using predicate register
   6565  1.1  mrg    PRED.  Return 1 if this access creates a dependency with an earlier
   6566  1.1  mrg    instruction in the same group.  */
   6567  1.1  mrg 
   6568  1.1  mrg static int
   6569  1.1  mrg rtx_needs_barrier (rtx x, struct reg_flags flags, int pred)
   6570  1.1  mrg {
   6571  1.1  mrg   int i, j;
   6572  1.1  mrg   int is_complemented = 0;
   6573  1.1  mrg   int need_barrier = 0;
   6574  1.1  mrg   const char *format_ptr;
   6575  1.1  mrg   struct reg_flags new_flags;
   6576  1.1  mrg   rtx cond;
   6577  1.1  mrg 
   6578  1.1  mrg   if (! x)
   6579  1.1  mrg     return 0;
   6580  1.1  mrg 
   6581  1.1  mrg   new_flags = flags;
   6582  1.1  mrg 
   6583  1.1  mrg   switch (GET_CODE (x))
   6584  1.1  mrg     {
   6585  1.1  mrg     case SET:
   6586  1.1  mrg       update_set_flags (x, &new_flags);
   6587  1.1  mrg       need_barrier = set_src_needs_barrier (x, new_flags, pred);
   6588  1.1  mrg       if (GET_CODE (SET_SRC (x)) != CALL)
   6589  1.1  mrg 	{
   6590  1.1  mrg 	  new_flags.is_write = 1;
   6591  1.1  mrg 	  need_barrier |= rtx_needs_barrier (SET_DEST (x), new_flags, pred);
   6592  1.1  mrg 	}
   6593  1.1  mrg       break;
   6594  1.1  mrg 
   6595  1.1  mrg     case CALL:
   6596  1.1  mrg       new_flags.is_write = 0;
   6597  1.1  mrg       need_barrier |= rws_access_regno (AR_EC_REGNUM, new_flags, pred);
   6598  1.1  mrg 
   6599  1.1  mrg       /* Avoid multiple register writes, in case this is a pattern with
   6600  1.1  mrg 	 multiple CALL rtx.  This avoids a failure in rws_access_reg.  */
   6601  1.1  mrg       if (! flags.is_sibcall && ! rws_insn_test (REG_AR_CFM))
   6602  1.1  mrg 	{
   6603  1.1  mrg 	  new_flags.is_write = 1;
   6604  1.1  mrg 	  need_barrier |= rws_access_regno (REG_RP, new_flags, pred);
   6605  1.1  mrg 	  need_barrier |= rws_access_regno (AR_PFS_REGNUM, new_flags, pred);
   6606  1.1  mrg 	  need_barrier |= rws_access_regno (REG_AR_CFM, new_flags, pred);
   6607  1.1  mrg 	}
   6608  1.1  mrg       break;
   6609  1.1  mrg 
   6610  1.1  mrg     case COND_EXEC:
   6611  1.1  mrg       /* X is a predicated instruction.  */
   6612  1.1  mrg 
   6613  1.1  mrg       cond = COND_EXEC_TEST (x);
   6614  1.1  mrg       gcc_assert (!pred);
   6615  1.1  mrg       need_barrier = rtx_needs_barrier (cond, flags, 0);
   6616  1.1  mrg 
   6617  1.1  mrg       if (GET_CODE (cond) == EQ)
   6618  1.1  mrg 	is_complemented = 1;
   6619  1.1  mrg       cond = XEXP (cond, 0);
   6620  1.1  mrg       gcc_assert (GET_CODE (cond) == REG
   6621  1.1  mrg 		  && REGNO_REG_CLASS (REGNO (cond)) == PR_REGS);
   6622  1.1  mrg       pred = REGNO (cond);
   6623  1.1  mrg       if (is_complemented)
   6624  1.1  mrg 	++pred;
   6625  1.1  mrg 
   6626  1.1  mrg       need_barrier |= rtx_needs_barrier (COND_EXEC_CODE (x), flags, pred);
   6627  1.1  mrg       return need_barrier;
   6628  1.1  mrg 
   6629  1.1  mrg     case CLOBBER:
   6630  1.1  mrg     case USE:
   6631  1.1  mrg       /* Clobber & use are for earlier compiler-phases only.  */
   6632  1.1  mrg       break;
   6633  1.1  mrg 
   6634  1.1  mrg     case ASM_OPERANDS:
   6635  1.1  mrg     case ASM_INPUT:
   6636  1.1  mrg       /* We always emit stop bits for traditional asms.  We emit stop bits
   6637  1.1  mrg 	 for volatile extended asms if TARGET_VOL_ASM_STOP is true.  */
   6638  1.1  mrg       if (GET_CODE (x) != ASM_OPERANDS
   6639  1.1  mrg 	  || (MEM_VOLATILE_P (x) && TARGET_VOL_ASM_STOP))
   6640  1.1  mrg 	{
   6641  1.1  mrg 	  /* Avoid writing the register multiple times if we have multiple
   6642  1.1  mrg 	     asm outputs.  This avoids a failure in rws_access_reg.  */
   6643  1.1  mrg 	  if (! rws_insn_test (REG_VOLATILE))
   6644  1.1  mrg 	    {
   6645  1.1  mrg 	      new_flags.is_write = 1;
   6646  1.1  mrg 	      rws_access_regno (REG_VOLATILE, new_flags, pred);
   6647  1.1  mrg 	    }
   6648  1.1  mrg 	  return 1;
   6649  1.1  mrg 	}
   6650  1.1  mrg 
   6651  1.1  mrg       /* For all ASM_OPERANDS, we must traverse the vector of input operands.
   6652  1.1  mrg 	 We cannot just fall through here since then we would be confused
   6653  1.1  mrg 	 by the ASM_INPUT rtx inside ASM_OPERANDS, which do not indicate
   6654  1.1  mrg 	 traditional asms unlike their normal usage.  */
   6655  1.1  mrg 
   6656  1.1  mrg       for (i = ASM_OPERANDS_INPUT_LENGTH (x) - 1; i >= 0; --i)
   6657  1.1  mrg 	if (rtx_needs_barrier (ASM_OPERANDS_INPUT (x, i), flags, pred))
   6658  1.1  mrg 	  need_barrier = 1;
   6659  1.1  mrg       break;
   6660  1.1  mrg 
   6661  1.1  mrg     case PARALLEL:
   6662  1.1  mrg       for (i = XVECLEN (x, 0) - 1; i >= 0; --i)
   6663  1.1  mrg 	{
   6664  1.1  mrg 	  rtx pat = XVECEXP (x, 0, i);
   6665  1.1  mrg 	  switch (GET_CODE (pat))
   6666  1.1  mrg 	    {
   6667  1.1  mrg 	    case SET:
   6668  1.1  mrg 	      update_set_flags (pat, &new_flags);
   6669  1.1  mrg 	      need_barrier |= set_src_needs_barrier (pat, new_flags, pred);
   6670  1.1  mrg 	      break;
   6671  1.1  mrg 
   6672  1.1  mrg 	    case USE:
   6673  1.1  mrg 	    case CALL:
   6674  1.1  mrg 	    case ASM_OPERANDS:
   6675  1.1  mrg 	    case ASM_INPUT:
   6676  1.1  mrg 	      need_barrier |= rtx_needs_barrier (pat, flags, pred);
   6677  1.1  mrg 	      break;
   6678  1.1  mrg 
   6679  1.1  mrg 	    case CLOBBER:
   6680  1.1  mrg 	      if (REG_P (XEXP (pat, 0))
   6681  1.1  mrg 		  && extract_asm_operands (x) != NULL_RTX
   6682  1.1  mrg 		  && REGNO (XEXP (pat, 0)) != AR_UNAT_REGNUM)
   6683  1.1  mrg 		{
   6684  1.1  mrg 		  new_flags.is_write = 1;
   6685  1.1  mrg 		  need_barrier |= rtx_needs_barrier (XEXP (pat, 0),
   6686  1.1  mrg 						     new_flags, pred);
   6687  1.1  mrg 		  new_flags = flags;
   6688  1.1  mrg 		}
   6689  1.1  mrg 	      break;
   6690  1.1  mrg 
   6691  1.1  mrg 	    case RETURN:
   6692  1.1  mrg 	      break;
   6693  1.1  mrg 
   6694  1.1  mrg 	    default:
   6695  1.1  mrg 	      gcc_unreachable ();
   6696  1.1  mrg 	    }
   6697  1.1  mrg 	}
   6698  1.1  mrg       for (i = XVECLEN (x, 0) - 1; i >= 0; --i)
   6699  1.1  mrg 	{
   6700  1.1  mrg 	  rtx pat = XVECEXP (x, 0, i);
   6701  1.1  mrg 	  if (GET_CODE (pat) == SET)
   6702  1.1  mrg 	    {
   6703  1.1  mrg 	      if (GET_CODE (SET_SRC (pat)) != CALL)
   6704  1.1  mrg 		{
   6705  1.1  mrg 		  new_flags.is_write = 1;
   6706  1.1  mrg 		  need_barrier |= rtx_needs_barrier (SET_DEST (pat), new_flags,
   6707  1.1  mrg 						     pred);
   6708  1.1  mrg 		}
   6709  1.1  mrg 	    }
   6710  1.1  mrg 	  else if (GET_CODE (pat) == CLOBBER || GET_CODE (pat) == RETURN)
   6711  1.1  mrg 	    need_barrier |= rtx_needs_barrier (pat, flags, pred);
   6712  1.1  mrg 	}
   6713  1.1  mrg       break;
   6714  1.1  mrg 
   6715  1.1  mrg     case SUBREG:
   6716  1.1  mrg       need_barrier |= rtx_needs_barrier (SUBREG_REG (x), flags, pred);
   6717  1.1  mrg       break;
   6718  1.1  mrg     case REG:
   6719  1.1  mrg       if (REGNO (x) == AR_UNAT_REGNUM)
   6720  1.1  mrg 	{
   6721  1.1  mrg 	  for (i = 0; i < 64; ++i)
   6722  1.1  mrg 	    need_barrier |= rws_access_regno (AR_UNAT_BIT_0 + i, flags, pred);
   6723  1.1  mrg 	}
   6724  1.1  mrg       else
   6725  1.1  mrg 	need_barrier = rws_access_reg (x, flags, pred);
   6726  1.1  mrg       break;
   6727  1.1  mrg 
   6728  1.1  mrg     case MEM:
   6729  1.1  mrg       /* Find the regs used in memory address computation.  */
   6730  1.1  mrg       new_flags.is_write = 0;
   6731  1.1  mrg       need_barrier = rtx_needs_barrier (XEXP (x, 0), new_flags, pred);
   6732  1.1  mrg       break;
   6733  1.1  mrg 
   6734  1.1  mrg     case CONST_INT:   case CONST_DOUBLE:  case CONST_VECTOR:
   6735  1.1  mrg     case SYMBOL_REF:  case LABEL_REF:     case CONST:
   6736  1.1  mrg       break;
   6737  1.1  mrg 
   6738  1.1  mrg       /* Operators with side-effects.  */
   6739  1.1  mrg     case POST_INC:    case POST_DEC:
   6740  1.1  mrg       gcc_assert (GET_CODE (XEXP (x, 0)) == REG);
   6741  1.1  mrg 
   6742  1.1  mrg       new_flags.is_write = 0;
   6743  1.1  mrg       need_barrier  = rws_access_reg (XEXP (x, 0), new_flags, pred);
   6744  1.1  mrg       new_flags.is_write = 1;
   6745  1.1  mrg       need_barrier |= rws_access_reg (XEXP (x, 0), new_flags, pred);
   6746  1.1  mrg       break;
   6747  1.1  mrg 
   6748  1.1  mrg     case POST_MODIFY:
   6749  1.1  mrg       gcc_assert (GET_CODE (XEXP (x, 0)) == REG);
   6750  1.1  mrg 
   6751  1.1  mrg       new_flags.is_write = 0;
   6752  1.1  mrg       need_barrier  = rws_access_reg (XEXP (x, 0), new_flags, pred);
   6753  1.1  mrg       need_barrier |= rtx_needs_barrier (XEXP (x, 1), new_flags, pred);
   6754  1.1  mrg       new_flags.is_write = 1;
   6755  1.1  mrg       need_barrier |= rws_access_reg (XEXP (x, 0), new_flags, pred);
   6756  1.1  mrg       break;
   6757  1.1  mrg 
   6758  1.1  mrg       /* Handle common unary and binary ops for efficiency.  */
   6759  1.1  mrg     case COMPARE:  case PLUS:    case MINUS:   case MULT:      case DIV:
   6760  1.1  mrg     case MOD:      case UDIV:    case UMOD:    case AND:       case IOR:
   6761  1.1  mrg     case XOR:      case ASHIFT:  case ROTATE:  case ASHIFTRT:  case LSHIFTRT:
   6762  1.1  mrg     case ROTATERT: case SMIN:    case SMAX:    case UMIN:      case UMAX:
   6763  1.1  mrg     case NE:       case EQ:      case GE:      case GT:        case LE:
   6764  1.1  mrg     case LT:       case GEU:     case GTU:     case LEU:       case LTU:
   6765  1.1  mrg       need_barrier = rtx_needs_barrier (XEXP (x, 0), new_flags, pred);
   6766  1.1  mrg       need_barrier |= rtx_needs_barrier (XEXP (x, 1), new_flags, pred);
   6767  1.1  mrg       break;
   6768  1.1  mrg 
   6769  1.1  mrg     case NEG:      case NOT:	        case SIGN_EXTEND:     case ZERO_EXTEND:
   6770  1.1  mrg     case TRUNCATE: case FLOAT_EXTEND:   case FLOAT_TRUNCATE:  case FLOAT:
   6771  1.1  mrg     case FIX:      case UNSIGNED_FLOAT: case UNSIGNED_FIX:    case ABS:
   6772  1.1  mrg     case SQRT:     case FFS:		case POPCOUNT:
   6773  1.1  mrg       need_barrier = rtx_needs_barrier (XEXP (x, 0), flags, pred);
   6774  1.1  mrg       break;
   6775  1.1  mrg 
   6776  1.1  mrg     case VEC_SELECT:
   6777  1.1  mrg       /* VEC_SELECT's second argument is a PARALLEL with integers that
   6778  1.1  mrg 	 describe the elements selected.  On ia64, those integers are
   6779  1.1  mrg 	 always constants.  Avoid walking the PARALLEL so that we don't
   6780  1.1  mrg 	 get confused with "normal" parallels and then die.  */
   6781  1.1  mrg       need_barrier = rtx_needs_barrier (XEXP (x, 0), flags, pred);
   6782  1.1  mrg       break;
   6783  1.1  mrg 
   6784  1.1  mrg     case UNSPEC:
   6785  1.1  mrg       switch (XINT (x, 1))
   6786  1.1  mrg 	{
   6787  1.1  mrg 	case UNSPEC_LTOFF_DTPMOD:
   6788  1.1  mrg 	case UNSPEC_LTOFF_DTPREL:
   6789  1.1  mrg 	case UNSPEC_DTPREL:
   6790  1.1  mrg 	case UNSPEC_LTOFF_TPREL:
   6791  1.1  mrg 	case UNSPEC_TPREL:
   6792  1.1  mrg 	case UNSPEC_PRED_REL_MUTEX:
   6793  1.1  mrg 	case UNSPEC_PIC_CALL:
   6794  1.1  mrg         case UNSPEC_MF:
   6795  1.1  mrg         case UNSPEC_FETCHADD_ACQ:
   6796  1.1  mrg         case UNSPEC_FETCHADD_REL:
   6797  1.1  mrg 	case UNSPEC_BSP_VALUE:
   6798  1.1  mrg 	case UNSPEC_FLUSHRS:
   6799  1.1  mrg 	case UNSPEC_BUNDLE_SELECTOR:
   6800  1.1  mrg           break;
   6801  1.1  mrg 
   6802  1.1  mrg 	case UNSPEC_GR_SPILL:
   6803  1.1  mrg 	case UNSPEC_GR_RESTORE:
   6804  1.1  mrg 	  {
   6805  1.1  mrg 	    HOST_WIDE_INT offset = INTVAL (XVECEXP (x, 0, 1));
   6806  1.1  mrg 	    HOST_WIDE_INT bit = (offset >> 3) & 63;
   6807  1.1  mrg 
   6808  1.1  mrg 	    need_barrier = rtx_needs_barrier (XVECEXP (x, 0, 0), flags, pred);
   6809  1.1  mrg 	    new_flags.is_write = (XINT (x, 1) == UNSPEC_GR_SPILL);
   6810  1.1  mrg 	    need_barrier |= rws_access_regno (AR_UNAT_BIT_0 + bit,
   6811  1.1  mrg 					      new_flags, pred);
   6812  1.1  mrg 	    break;
   6813  1.1  mrg 	  }
   6814  1.1  mrg 
   6815  1.1  mrg 	case UNSPEC_FR_SPILL:
   6816  1.1  mrg 	case UNSPEC_FR_RESTORE:
   6817  1.1  mrg 	case UNSPEC_GETF_EXP:
   6818  1.1  mrg 	case UNSPEC_SETF_EXP:
   6819  1.1  mrg         case UNSPEC_ADDP4:
   6820  1.1  mrg 	case UNSPEC_FR_SQRT_RECIP_APPROX:
   6821  1.1  mrg 	case UNSPEC_FR_SQRT_RECIP_APPROX_RES:
   6822  1.1  mrg 	case UNSPEC_LDA:
   6823  1.1  mrg 	case UNSPEC_LDS:
   6824  1.1  mrg 	case UNSPEC_LDS_A:
   6825  1.1  mrg 	case UNSPEC_LDSA:
   6826  1.1  mrg 	case UNSPEC_CHKACLR:
   6827  1.1  mrg         case UNSPEC_CHKS:
   6828  1.1  mrg 	  need_barrier = rtx_needs_barrier (XVECEXP (x, 0, 0), flags, pred);
   6829  1.1  mrg 	  break;
   6830  1.1  mrg 
   6831  1.1  mrg 	case UNSPEC_FR_RECIP_APPROX:
   6832  1.1  mrg 	case UNSPEC_SHRP:
   6833  1.1  mrg 	case UNSPEC_COPYSIGN:
   6834  1.1  mrg 	case UNSPEC_FR_RECIP_APPROX_RES:
   6835  1.1  mrg 	  need_barrier = rtx_needs_barrier (XVECEXP (x, 0, 0), flags, pred);
   6836  1.1  mrg 	  need_barrier |= rtx_needs_barrier (XVECEXP (x, 0, 1), flags, pred);
   6837  1.1  mrg 	  break;
   6838  1.1  mrg 
   6839  1.1  mrg         case UNSPEC_CMPXCHG_ACQ:
   6840  1.1  mrg         case UNSPEC_CMPXCHG_REL:
   6841  1.1  mrg 	  need_barrier = rtx_needs_barrier (XVECEXP (x, 0, 1), flags, pred);
   6842  1.1  mrg 	  need_barrier |= rtx_needs_barrier (XVECEXP (x, 0, 2), flags, pred);
   6843  1.1  mrg 	  break;
   6844  1.1  mrg 
   6845  1.1  mrg 	default:
   6846  1.1  mrg 	  gcc_unreachable ();
   6847  1.1  mrg 	}
   6848  1.1  mrg       break;
   6849  1.1  mrg 
   6850  1.1  mrg     case UNSPEC_VOLATILE:
   6851  1.1  mrg       switch (XINT (x, 1))
   6852  1.1  mrg 	{
   6853  1.1  mrg 	case UNSPECV_ALLOC:
   6854  1.1  mrg 	  /* Alloc must always be the first instruction of a group.
   6855  1.1  mrg 	     We force this by always returning true.  */
   6856  1.1  mrg 	  /* ??? We might get better scheduling if we explicitly check for
   6857  1.1  mrg 	     input/local/output register dependencies, and modify the
   6858  1.1  mrg 	     scheduler so that alloc is always reordered to the start of
   6859  1.1  mrg 	     the current group.  We could then eliminate all of the
   6860  1.1  mrg 	     first_instruction code.  */
   6861  1.1  mrg 	  rws_access_regno (AR_PFS_REGNUM, flags, pred);
   6862  1.1  mrg 
   6863  1.1  mrg 	  new_flags.is_write = 1;
   6864  1.1  mrg 	  rws_access_regno (REG_AR_CFM, new_flags, pred);
   6865  1.1  mrg 	  return 1;
   6866  1.1  mrg 
   6867  1.1  mrg 	case UNSPECV_SET_BSP:
   6868  1.1  mrg 	case UNSPECV_PROBE_STACK_RANGE:
   6869  1.1  mrg 	  need_barrier = 1;
   6870  1.1  mrg           break;
   6871  1.1  mrg 
   6872  1.1  mrg 	case UNSPECV_BLOCKAGE:
   6873  1.1  mrg 	case UNSPECV_INSN_GROUP_BARRIER:
   6874  1.1  mrg 	case UNSPECV_BREAK:
   6875  1.1  mrg 	case UNSPECV_PSAC_ALL:
   6876  1.1  mrg 	case UNSPECV_PSAC_NORMAL:
   6877  1.1  mrg 	  return 0;
   6878  1.1  mrg 
   6879  1.1  mrg 	case UNSPECV_PROBE_STACK_ADDRESS:
   6880  1.1  mrg 	  need_barrier = rtx_needs_barrier (XVECEXP (x, 0, 0), flags, pred);
   6881  1.1  mrg 	  break;
   6882  1.1  mrg 
   6883  1.1  mrg 	default:
   6884  1.1  mrg 	  gcc_unreachable ();
   6885  1.1  mrg 	}
   6886  1.1  mrg       break;
   6887  1.1  mrg 
   6888  1.1  mrg     case RETURN:
   6889  1.1  mrg       new_flags.is_write = 0;
   6890  1.1  mrg       need_barrier  = rws_access_regno (REG_RP, flags, pred);
   6891  1.1  mrg       need_barrier |= rws_access_regno (AR_PFS_REGNUM, flags, pred);
   6892  1.1  mrg 
   6893  1.1  mrg       new_flags.is_write = 1;
   6894  1.1  mrg       need_barrier |= rws_access_regno (AR_EC_REGNUM, new_flags, pred);
   6895  1.1  mrg       need_barrier |= rws_access_regno (REG_AR_CFM, new_flags, pred);
   6896  1.1  mrg       break;
   6897  1.1  mrg 
   6898  1.1  mrg     default:
   6899  1.1  mrg       format_ptr = GET_RTX_FORMAT (GET_CODE (x));
   6900  1.1  mrg       for (i = GET_RTX_LENGTH (GET_CODE (x)) - 1; i >= 0; i--)
   6901  1.1  mrg 	switch (format_ptr[i])
   6902  1.1  mrg 	  {
   6903  1.1  mrg 	  case '0':	/* unused field */
   6904  1.1  mrg 	  case 'i':	/* integer */
   6905  1.1  mrg 	  case 'n':	/* note */
   6906  1.1  mrg 	  case 'w':	/* wide integer */
   6907  1.1  mrg 	  case 's':	/* pointer to string */
   6908  1.1  mrg 	  case 'S':	/* optional pointer to string */
   6909  1.1  mrg 	    break;
   6910  1.1  mrg 
   6911  1.1  mrg 	  case 'e':
   6912  1.1  mrg 	    if (rtx_needs_barrier (XEXP (x, i), flags, pred))
   6913  1.1  mrg 	      need_barrier = 1;
   6914  1.1  mrg 	    break;
   6915  1.1  mrg 
   6916  1.1  mrg 	  case 'E':
   6917  1.1  mrg 	    for (j = XVECLEN (x, i) - 1; j >= 0; --j)
   6918  1.1  mrg 	      if (rtx_needs_barrier (XVECEXP (x, i, j), flags, pred))
   6919  1.1  mrg 		need_barrier = 1;
   6920  1.1  mrg 	    break;
   6921  1.1  mrg 
   6922  1.1  mrg 	  default:
   6923  1.1  mrg 	    gcc_unreachable ();
   6924  1.1  mrg 	  }
   6925  1.1  mrg       break;
   6926  1.1  mrg     }
   6927  1.1  mrg   return need_barrier;
   6928  1.1  mrg }
   6929  1.1  mrg 
   6930  1.1  mrg /* Clear out the state for group_barrier_needed at the start of a
   6931  1.1  mrg    sequence of insns.  */
   6932  1.1  mrg 
   6933  1.1  mrg static void
   6934  1.1  mrg init_insn_group_barriers (void)
   6935  1.1  mrg {
   6936  1.1  mrg   memset (rws_sum, 0, sizeof (rws_sum));
   6937  1.1  mrg   first_instruction = 1;
   6938  1.1  mrg }
   6939  1.1  mrg 
   6940  1.1  mrg /* Given the current state, determine whether a group barrier (a stop bit) is
   6941  1.1  mrg    necessary before INSN.  Return nonzero if so.  This modifies the state to
   6942  1.1  mrg    include the effects of INSN as a side-effect.  */
   6943  1.1  mrg 
   6944  1.1  mrg static int
   6945  1.1  mrg group_barrier_needed (rtx_insn *insn)
   6946  1.1  mrg {
   6947  1.1  mrg   rtx pat;
   6948  1.1  mrg   int need_barrier = 0;
   6949  1.1  mrg   struct reg_flags flags;
   6950  1.1  mrg 
   6951  1.1  mrg   memset (&flags, 0, sizeof (flags));
   6952  1.1  mrg   switch (GET_CODE (insn))
   6953  1.1  mrg     {
   6954  1.1  mrg     case NOTE:
   6955  1.1  mrg     case DEBUG_INSN:
   6956  1.1  mrg       break;
   6957  1.1  mrg 
   6958  1.1  mrg     case BARRIER:
   6959  1.1  mrg       /* A barrier doesn't imply an instruction group boundary.  */
   6960  1.1  mrg       break;
   6961  1.1  mrg 
   6962  1.1  mrg     case CODE_LABEL:
   6963  1.1  mrg       memset (rws_insn, 0, sizeof (rws_insn));
   6964  1.1  mrg       return 1;
   6965  1.1  mrg 
   6966  1.1  mrg     case CALL_INSN:
   6967  1.1  mrg       flags.is_branch = 1;
   6968  1.1  mrg       flags.is_sibcall = SIBLING_CALL_P (insn);
   6969  1.1  mrg       memset (rws_insn, 0, sizeof (rws_insn));
   6970  1.1  mrg 
   6971  1.1  mrg       /* Don't bundle a call following another call.  */
   6972  1.1  mrg       if ((pat = prev_active_insn (insn)) && CALL_P (pat))
   6973  1.1  mrg 	{
   6974  1.1  mrg 	  need_barrier = 1;
   6975  1.1  mrg 	  break;
   6976  1.1  mrg 	}
   6977  1.1  mrg 
   6978  1.1  mrg       need_barrier = rtx_needs_barrier (PATTERN (insn), flags, 0);
   6979  1.1  mrg       break;
   6980  1.1  mrg 
   6981  1.1  mrg     case JUMP_INSN:
   6982  1.1  mrg       if (!ia64_spec_check_p (insn))
   6983  1.1  mrg 	flags.is_branch = 1;
   6984  1.1  mrg 
   6985  1.1  mrg       /* Don't bundle a jump following a call.  */
   6986  1.1  mrg       if ((pat = prev_active_insn (insn)) && CALL_P (pat))
   6987  1.1  mrg 	{
   6988  1.1  mrg 	  need_barrier = 1;
   6989  1.1  mrg 	  break;
   6990  1.1  mrg 	}
   6991  1.1  mrg       /* FALLTHRU */
   6992  1.1  mrg 
   6993  1.1  mrg     case INSN:
   6994  1.1  mrg       if (GET_CODE (PATTERN (insn)) == USE
   6995  1.1  mrg 	  || GET_CODE (PATTERN (insn)) == CLOBBER)
   6996  1.1  mrg 	/* Don't care about USE and CLOBBER "insns"---those are used to
   6997  1.1  mrg 	   indicate to the optimizer that it shouldn't get rid of
   6998  1.1  mrg 	   certain operations.  */
   6999  1.1  mrg 	break;
   7000  1.1  mrg 
   7001  1.1  mrg       pat = PATTERN (insn);
   7002  1.1  mrg 
   7003  1.1  mrg       /* Ug.  Hack hacks hacked elsewhere.  */
   7004  1.1  mrg       switch (recog_memoized (insn))
   7005  1.1  mrg 	{
   7006  1.1  mrg 	  /* We play dependency tricks with the epilogue in order
   7007  1.1  mrg 	     to get proper schedules.  Undo this for dv analysis.  */
   7008  1.1  mrg 	case CODE_FOR_epilogue_deallocate_stack:
   7009  1.1  mrg 	case CODE_FOR_prologue_allocate_stack:
   7010  1.1  mrg 	  pat = XVECEXP (pat, 0, 0);
   7011  1.1  mrg 	  break;
   7012  1.1  mrg 
   7013  1.1  mrg 	  /* The pattern we use for br.cloop confuses the code above.
   7014  1.1  mrg 	     The second element of the vector is representative.  */
   7015  1.1  mrg 	case CODE_FOR_doloop_end_internal:
   7016  1.1  mrg 	  pat = XVECEXP (pat, 0, 1);
   7017  1.1  mrg 	  break;
   7018  1.1  mrg 
   7019  1.1  mrg 	  /* Doesn't generate code.  */
   7020  1.1  mrg 	case CODE_FOR_pred_rel_mutex:
   7021  1.1  mrg 	case CODE_FOR_prologue_use:
   7022  1.1  mrg 	  return 0;
   7023  1.1  mrg 
   7024  1.1  mrg 	default:
   7025  1.1  mrg 	  break;
   7026  1.1  mrg 	}
   7027  1.1  mrg 
   7028  1.1  mrg       memset (rws_insn, 0, sizeof (rws_insn));
   7029  1.1  mrg       need_barrier = rtx_needs_barrier (pat, flags, 0);
   7030  1.1  mrg 
   7031  1.1  mrg       /* Check to see if the previous instruction was a volatile
   7032  1.1  mrg 	 asm.  */
   7033  1.1  mrg       if (! need_barrier)
   7034  1.1  mrg 	need_barrier = rws_access_regno (REG_VOLATILE, flags, 0);
   7035  1.1  mrg 
   7036  1.1  mrg       break;
   7037  1.1  mrg 
   7038  1.1  mrg     default:
   7039  1.1  mrg       gcc_unreachable ();
   7040  1.1  mrg     }
   7041  1.1  mrg 
   7042  1.1  mrg   if (first_instruction && important_for_bundling_p (insn))
   7043  1.1  mrg     {
   7044  1.1  mrg       need_barrier = 0;
   7045  1.1  mrg       first_instruction = 0;
   7046  1.1  mrg     }
   7047  1.1  mrg 
   7048  1.1  mrg   return need_barrier;
   7049  1.1  mrg }
   7050  1.1  mrg 
   7051  1.1  mrg /* Like group_barrier_needed, but do not clobber the current state.  */
   7052  1.1  mrg 
   7053  1.1  mrg static int
   7054  1.1  mrg safe_group_barrier_needed (rtx_insn *insn)
   7055  1.1  mrg {
   7056  1.1  mrg   int saved_first_instruction;
   7057  1.1  mrg   int t;
   7058  1.1  mrg 
   7059  1.1  mrg   saved_first_instruction = first_instruction;
   7060  1.1  mrg   in_safe_group_barrier = 1;
   7061  1.1  mrg 
   7062  1.1  mrg   t = group_barrier_needed (insn);
   7063  1.1  mrg 
   7064  1.1  mrg   first_instruction = saved_first_instruction;
   7065  1.1  mrg   in_safe_group_barrier = 0;
   7066  1.1  mrg 
   7067  1.1  mrg   return t;
   7068  1.1  mrg }
   7069  1.1  mrg 
   7070  1.1  mrg /* Scan the current function and insert stop bits as necessary to
   7071  1.1  mrg    eliminate dependencies.  This function assumes that a final
   7072  1.1  mrg    instruction scheduling pass has been run which has already
   7073  1.1  mrg    inserted most of the necessary stop bits.  This function only
   7074  1.1  mrg    inserts new ones at basic block boundaries, since these are
   7075  1.1  mrg    invisible to the scheduler.  */
   7076  1.1  mrg 
   7077  1.1  mrg static void
   7078  1.1  mrg emit_insn_group_barriers (FILE *dump)
   7079  1.1  mrg {
   7080  1.1  mrg   rtx_insn *insn;
   7081  1.1  mrg   rtx_insn *last_label = 0;
   7082  1.1  mrg   int insns_since_last_label = 0;
   7083  1.1  mrg 
   7084  1.1  mrg   init_insn_group_barriers ();
   7085  1.1  mrg 
   7086  1.1  mrg   for (insn = get_insns (); insn; insn = NEXT_INSN (insn))
   7087  1.1  mrg     {
   7088  1.1  mrg       if (LABEL_P (insn))
   7089  1.1  mrg 	{
   7090  1.1  mrg 	  if (insns_since_last_label)
   7091  1.1  mrg 	    last_label = insn;
   7092  1.1  mrg 	  insns_since_last_label = 0;
   7093  1.1  mrg 	}
   7094  1.1  mrg       else if (NOTE_P (insn)
   7095  1.1  mrg 	       && NOTE_KIND (insn) == NOTE_INSN_BASIC_BLOCK)
   7096  1.1  mrg 	{
   7097  1.1  mrg 	  if (insns_since_last_label)
   7098  1.1  mrg 	    last_label = insn;
   7099  1.1  mrg 	  insns_since_last_label = 0;
   7100  1.1  mrg 	}
   7101  1.1  mrg       else if (NONJUMP_INSN_P (insn)
   7102  1.1  mrg 	       && GET_CODE (PATTERN (insn)) == UNSPEC_VOLATILE
   7103  1.1  mrg 	       && XINT (PATTERN (insn), 1) == UNSPECV_INSN_GROUP_BARRIER)
   7104  1.1  mrg 	{
   7105  1.1  mrg 	  init_insn_group_barriers ();
   7106  1.1  mrg 	  last_label = 0;
   7107  1.1  mrg 	}
   7108  1.1  mrg       else if (NONDEBUG_INSN_P (insn))
   7109  1.1  mrg 	{
   7110  1.1  mrg 	  insns_since_last_label = 1;
   7111  1.1  mrg 
   7112  1.1  mrg 	  if (group_barrier_needed (insn))
   7113  1.1  mrg 	    {
   7114  1.1  mrg 	      if (last_label)
   7115  1.1  mrg 		{
   7116  1.1  mrg 		  if (dump)
   7117  1.1  mrg 		    fprintf (dump, "Emitting stop before label %d\n",
   7118  1.1  mrg 			     INSN_UID (last_label));
   7119  1.1  mrg 		  emit_insn_before (gen_insn_group_barrier (GEN_INT (3)), last_label);
   7120  1.1  mrg 		  insn = last_label;
   7121  1.1  mrg 
   7122  1.1  mrg 		  init_insn_group_barriers ();
   7123  1.1  mrg 		  last_label = 0;
   7124  1.1  mrg 		}
   7125  1.1  mrg 	    }
   7126  1.1  mrg 	}
   7127  1.1  mrg     }
   7128  1.1  mrg }
   7129  1.1  mrg 
   7130  1.1  mrg /* Like emit_insn_group_barriers, but run if no final scheduling pass was run.
   7131  1.1  mrg    This function has to emit all necessary group barriers.  */
   7132  1.1  mrg 
   7133  1.1  mrg static void
   7134  1.1  mrg emit_all_insn_group_barriers (FILE *dump ATTRIBUTE_UNUSED)
   7135  1.1  mrg {
   7136  1.1  mrg   rtx_insn *insn;
   7137  1.1  mrg 
   7138  1.1  mrg   init_insn_group_barriers ();
   7139  1.1  mrg 
   7140  1.1  mrg   for (insn = get_insns (); insn; insn = NEXT_INSN (insn))
   7141  1.1  mrg     {
   7142  1.1  mrg       if (BARRIER_P (insn))
   7143  1.1  mrg 	{
   7144  1.1  mrg 	  rtx_insn *last = prev_active_insn (insn);
   7145  1.1  mrg 
   7146  1.1  mrg 	  if (! last)
   7147  1.1  mrg 	    continue;
   7148  1.1  mrg 	  if (JUMP_TABLE_DATA_P (last))
   7149  1.1  mrg 	    last = prev_active_insn (last);
   7150  1.1  mrg 	  if (recog_memoized (last) != CODE_FOR_insn_group_barrier)
   7151  1.1  mrg 	    emit_insn_after (gen_insn_group_barrier (GEN_INT (3)), last);
   7152  1.1  mrg 
   7153  1.1  mrg 	  init_insn_group_barriers ();
   7154  1.1  mrg 	}
   7155  1.1  mrg       else if (NONDEBUG_INSN_P (insn))
   7156  1.1  mrg 	{
   7157  1.1  mrg 	  if (recog_memoized (insn) == CODE_FOR_insn_group_barrier)
   7158  1.1  mrg 	    init_insn_group_barriers ();
   7159  1.1  mrg 	  else if (group_barrier_needed (insn))
   7160  1.1  mrg 	    {
   7161  1.1  mrg 	      emit_insn_before (gen_insn_group_barrier (GEN_INT (3)), insn);
   7162  1.1  mrg 	      init_insn_group_barriers ();
   7163  1.1  mrg 	      group_barrier_needed (insn);
   7164  1.1  mrg 	    }
   7165  1.1  mrg 	}
   7166  1.1  mrg     }
   7167  1.1  mrg }
   7168  1.1  mrg 
   7169  1.1  mrg 
   7170  1.1  mrg 
   7172  1.1  mrg /* Instruction scheduling support.  */
   7173  1.1  mrg 
   7174  1.1  mrg #define NR_BUNDLES 10
   7175  1.1  mrg 
   7176  1.1  mrg /* A list of names of all available bundles.  */
   7177  1.1  mrg 
   7178  1.1  mrg static const char *bundle_name [NR_BUNDLES] =
   7179  1.1  mrg {
   7180  1.1  mrg   ".mii",
   7181  1.1  mrg   ".mmi",
   7182  1.1  mrg   ".mfi",
   7183  1.1  mrg   ".mmf",
   7184  1.1  mrg #if NR_BUNDLES == 10
   7185  1.1  mrg   ".bbb",
   7186  1.1  mrg   ".mbb",
   7187  1.1  mrg #endif
   7188  1.1  mrg   ".mib",
   7189  1.1  mrg   ".mmb",
   7190  1.1  mrg   ".mfb",
   7191  1.1  mrg   ".mlx"
   7192  1.1  mrg };
   7193  1.1  mrg 
   7194  1.1  mrg /* Nonzero if we should insert stop bits into the schedule.  */
   7195  1.1  mrg 
   7196  1.1  mrg int ia64_final_schedule = 0;
   7197  1.1  mrg 
   7198  1.1  mrg /* Codes of the corresponding queried units: */
   7199  1.1  mrg 
   7200  1.1  mrg static int _0mii_, _0mmi_, _0mfi_, _0mmf_;
   7201  1.1  mrg static int _0bbb_, _0mbb_, _0mib_, _0mmb_, _0mfb_, _0mlx_;
   7202  1.1  mrg 
   7203  1.1  mrg static int _1mii_, _1mmi_, _1mfi_, _1mmf_;
   7204  1.1  mrg static int _1bbb_, _1mbb_, _1mib_, _1mmb_, _1mfb_, _1mlx_;
   7205  1.1  mrg 
   7206  1.1  mrg static int pos_1, pos_2, pos_3, pos_4, pos_5, pos_6;
   7207  1.1  mrg 
   7208  1.1  mrg /* The following variable value is an insn group barrier.  */
   7209  1.1  mrg 
   7210  1.1  mrg static rtx_insn *dfa_stop_insn;
   7211  1.1  mrg 
   7212  1.1  mrg /* The following variable value is the last issued insn.  */
   7213  1.1  mrg 
   7214  1.1  mrg static rtx_insn *last_scheduled_insn;
   7215  1.1  mrg 
   7216  1.1  mrg /* The following variable value is pointer to a DFA state used as
   7217  1.1  mrg    temporary variable.  */
   7218  1.1  mrg 
   7219  1.1  mrg static state_t temp_dfa_state = NULL;
   7220  1.1  mrg 
   7221  1.1  mrg /* The following variable value is DFA state after issuing the last
   7222  1.1  mrg    insn.  */
   7223  1.1  mrg 
   7224  1.1  mrg static state_t prev_cycle_state = NULL;
   7225  1.1  mrg 
   7226  1.1  mrg /* The following array element values are TRUE if the corresponding
   7227  1.1  mrg    insn requires to add stop bits before it.  */
   7228  1.1  mrg 
   7229  1.1  mrg static char *stops_p = NULL;
   7230  1.1  mrg 
   7231  1.1  mrg /* The following variable is used to set up the mentioned above array.  */
   7232  1.1  mrg 
   7233  1.1  mrg static int stop_before_p = 0;
   7234  1.1  mrg 
   7235  1.1  mrg /* The following variable value is length of the arrays `clocks' and
   7236  1.1  mrg    `add_cycles'. */
   7237  1.1  mrg 
   7238  1.1  mrg static int clocks_length;
   7239  1.1  mrg 
   7240  1.1  mrg /* The following variable value is number of data speculations in progress.  */
   7241  1.1  mrg static int pending_data_specs = 0;
   7242  1.1  mrg 
   7243  1.1  mrg /* Number of memory references on current and three future processor cycles.  */
   7244  1.1  mrg static char mem_ops_in_group[4];
   7245  1.1  mrg 
   7246  1.1  mrg /* Number of current processor cycle (from scheduler's point of view).  */
   7247  1.1  mrg static int current_cycle;
   7248  1.1  mrg 
   7249  1.1  mrg static rtx ia64_single_set (rtx_insn *);
   7250  1.1  mrg static void ia64_emit_insn_before (rtx, rtx_insn *);
   7251  1.1  mrg 
   7252  1.1  mrg /* Map a bundle number to its pseudo-op.  */
   7253  1.1  mrg 
   7254  1.1  mrg const char *
   7255  1.1  mrg get_bundle_name (int b)
   7256  1.1  mrg {
   7257  1.1  mrg   return bundle_name[b];
   7258  1.1  mrg }
   7259  1.1  mrg 
   7260  1.1  mrg 
   7261  1.1  mrg /* Return the maximum number of instructions a cpu can issue.  */
   7262  1.1  mrg 
   7263  1.1  mrg static int
   7264  1.1  mrg ia64_issue_rate (void)
   7265  1.1  mrg {
   7266  1.1  mrg   return 6;
   7267  1.1  mrg }
   7268  1.1  mrg 
   7269  1.1  mrg /* Helper function - like single_set, but look inside COND_EXEC.  */
   7270  1.1  mrg 
   7271  1.1  mrg static rtx
   7272  1.1  mrg ia64_single_set (rtx_insn *insn)
   7273  1.1  mrg {
   7274  1.1  mrg   rtx x = PATTERN (insn), ret;
   7275  1.1  mrg   if (GET_CODE (x) == COND_EXEC)
   7276  1.1  mrg     x = COND_EXEC_CODE (x);
   7277  1.1  mrg   if (GET_CODE (x) == SET)
   7278  1.1  mrg     return x;
   7279  1.1  mrg 
   7280  1.1  mrg   /* Special case here prologue_allocate_stack and epilogue_deallocate_stack.
   7281  1.1  mrg      Although they are not classical single set, the second set is there just
   7282  1.1  mrg      to protect it from moving past FP-relative stack accesses.  */
   7283  1.1  mrg   switch (recog_memoized (insn))
   7284  1.1  mrg     {
   7285  1.1  mrg     case CODE_FOR_prologue_allocate_stack:
   7286  1.1  mrg     case CODE_FOR_prologue_allocate_stack_pr:
   7287  1.1  mrg     case CODE_FOR_epilogue_deallocate_stack:
   7288  1.1  mrg     case CODE_FOR_epilogue_deallocate_stack_pr:
   7289  1.1  mrg       ret = XVECEXP (x, 0, 0);
   7290  1.1  mrg       break;
   7291  1.1  mrg 
   7292  1.1  mrg     default:
   7293  1.1  mrg       ret = single_set_2 (insn, x);
   7294  1.1  mrg       break;
   7295  1.1  mrg     }
   7296  1.1  mrg 
   7297  1.1  mrg   return ret;
   7298  1.1  mrg }
   7299  1.1  mrg 
   7300  1.1  mrg /* Adjust the cost of a scheduling dependency.
   7301  1.1  mrg    Return the new cost of a dependency of type DEP_TYPE or INSN on DEP_INSN.
   7302  1.1  mrg    COST is the current cost, DW is dependency weakness.  */
   7303  1.1  mrg static int
   7304  1.1  mrg ia64_adjust_cost (rtx_insn *insn, int dep_type1, rtx_insn *dep_insn,
   7305  1.1  mrg 		  int cost, dw_t dw)
   7306  1.1  mrg {
   7307  1.1  mrg   enum reg_note dep_type = (enum reg_note) dep_type1;
   7308  1.1  mrg   enum attr_itanium_class dep_class;
   7309  1.1  mrg   enum attr_itanium_class insn_class;
   7310  1.1  mrg 
   7311  1.1  mrg   insn_class = ia64_safe_itanium_class (insn);
   7312  1.1  mrg   dep_class = ia64_safe_itanium_class (dep_insn);
   7313  1.1  mrg 
   7314  1.1  mrg   /* Treat true memory dependencies separately.  Ignore apparent true
   7315  1.1  mrg      dependence between store and call (call has a MEM inside a SYMBOL_REF).  */
   7316  1.1  mrg   if (dep_type == REG_DEP_TRUE
   7317  1.1  mrg       && (dep_class == ITANIUM_CLASS_ST || dep_class == ITANIUM_CLASS_STF)
   7318  1.1  mrg       && (insn_class == ITANIUM_CLASS_BR || insn_class == ITANIUM_CLASS_SCALL))
   7319  1.1  mrg     return 0;
   7320  1.1  mrg 
   7321  1.1  mrg   if (dw == MIN_DEP_WEAK)
   7322  1.1  mrg     /* Store and load are likely to alias, use higher cost to avoid stall.  */
   7323  1.1  mrg     return param_sched_mem_true_dep_cost;
   7324  1.1  mrg   else if (dw > MIN_DEP_WEAK)
   7325  1.1  mrg     {
   7326  1.1  mrg       /* Store and load are less likely to alias.  */
   7327  1.1  mrg       if (mflag_sched_fp_mem_deps_zero_cost && dep_class == ITANIUM_CLASS_STF)
   7328  1.1  mrg 	/* Assume there will be no cache conflict for floating-point data.
   7329  1.1  mrg 	   For integer data, L1 conflict penalty is huge (17 cycles), so we
   7330  1.1  mrg 	   never assume it will not cause a conflict.  */
   7331  1.1  mrg 	return 0;
   7332  1.1  mrg       else
   7333  1.1  mrg 	return cost;
   7334  1.1  mrg     }
   7335  1.1  mrg 
   7336  1.1  mrg   if (dep_type != REG_DEP_OUTPUT)
   7337  1.1  mrg     return cost;
   7338  1.1  mrg 
   7339  1.1  mrg   if (dep_class == ITANIUM_CLASS_ST || dep_class == ITANIUM_CLASS_STF
   7340  1.1  mrg       || insn_class == ITANIUM_CLASS_ST || insn_class == ITANIUM_CLASS_STF)
   7341  1.1  mrg     return 0;
   7342  1.1  mrg 
   7343  1.1  mrg   return cost;
   7344  1.1  mrg }
   7345  1.1  mrg 
   7346  1.1  mrg /* Like emit_insn_before, but skip cycle_display notes.
   7347  1.1  mrg    ??? When cycle display notes are implemented, update this.  */
   7348  1.1  mrg 
   7349  1.1  mrg static void
   7350  1.1  mrg ia64_emit_insn_before (rtx insn, rtx_insn *before)
   7351  1.1  mrg {
   7352  1.1  mrg   emit_insn_before (insn, before);
   7353  1.1  mrg }
   7354  1.1  mrg 
   7355  1.1  mrg /* The following function marks insns who produce addresses for load
   7356  1.1  mrg    and store insns.  Such insns will be placed into M slots because it
   7357  1.1  mrg    decrease latency time for Itanium1 (see function
   7358  1.1  mrg    `ia64_produce_address_p' and the DFA descriptions).  */
   7359  1.1  mrg 
   7360  1.1  mrg static void
   7361  1.1  mrg ia64_dependencies_evaluation_hook (rtx_insn *head, rtx_insn *tail)
   7362  1.1  mrg {
   7363  1.1  mrg   rtx_insn *insn, *next, *next_tail;
   7364  1.1  mrg 
   7365  1.1  mrg   /* Before reload, which_alternative is not set, which means that
   7366  1.1  mrg      ia64_safe_itanium_class will produce wrong results for (at least)
   7367  1.1  mrg      move instructions.  */
   7368  1.1  mrg   if (!reload_completed)
   7369  1.1  mrg     return;
   7370  1.1  mrg 
   7371  1.1  mrg   next_tail = NEXT_INSN (tail);
   7372  1.1  mrg   for (insn = head; insn != next_tail; insn = NEXT_INSN (insn))
   7373  1.1  mrg     if (INSN_P (insn))
   7374  1.1  mrg       insn->call = 0;
   7375  1.1  mrg   for (insn = head; insn != next_tail; insn = NEXT_INSN (insn))
   7376  1.1  mrg     if (INSN_P (insn)
   7377  1.1  mrg 	&& ia64_safe_itanium_class (insn) == ITANIUM_CLASS_IALU)
   7378  1.1  mrg       {
   7379  1.1  mrg 	sd_iterator_def sd_it;
   7380  1.1  mrg 	dep_t dep;
   7381  1.1  mrg 	bool has_mem_op_consumer_p = false;
   7382  1.1  mrg 
   7383  1.1  mrg 	FOR_EACH_DEP (insn, SD_LIST_FORW, sd_it, dep)
   7384  1.1  mrg 	  {
   7385  1.1  mrg 	    enum attr_itanium_class c;
   7386  1.1  mrg 
   7387  1.1  mrg 	    if (DEP_TYPE (dep) != REG_DEP_TRUE)
   7388  1.1  mrg 	      continue;
   7389  1.1  mrg 
   7390  1.1  mrg 	    next = DEP_CON (dep);
   7391  1.1  mrg 	    c = ia64_safe_itanium_class (next);
   7392  1.1  mrg 	    if ((c == ITANIUM_CLASS_ST
   7393  1.1  mrg 		 || c == ITANIUM_CLASS_STF)
   7394  1.1  mrg 		&& ia64_st_address_bypass_p (insn, next))
   7395  1.1  mrg 	      {
   7396  1.1  mrg 		has_mem_op_consumer_p = true;
   7397  1.1  mrg 		break;
   7398  1.1  mrg 	      }
   7399  1.1  mrg 	    else if ((c == ITANIUM_CLASS_LD
   7400  1.1  mrg 		      || c == ITANIUM_CLASS_FLD
   7401  1.1  mrg 		      || c == ITANIUM_CLASS_FLDP)
   7402  1.1  mrg 		     && ia64_ld_address_bypass_p (insn, next))
   7403  1.1  mrg 	      {
   7404  1.1  mrg 		has_mem_op_consumer_p = true;
   7405  1.1  mrg 		break;
   7406  1.1  mrg 	      }
   7407  1.1  mrg 	  }
   7408  1.1  mrg 
   7409  1.1  mrg 	insn->call = has_mem_op_consumer_p;
   7410  1.1  mrg       }
   7411  1.1  mrg }
   7412  1.1  mrg 
   7413  1.1  mrg /* We're beginning a new block.  Initialize data structures as necessary.  */
   7414  1.1  mrg 
   7415  1.1  mrg static void
   7416  1.1  mrg ia64_sched_init (FILE *dump ATTRIBUTE_UNUSED,
   7417  1.1  mrg 		 int sched_verbose ATTRIBUTE_UNUSED,
   7418  1.1  mrg 		 int max_ready ATTRIBUTE_UNUSED)
   7419  1.1  mrg {
   7420  1.1  mrg   if (flag_checking && !sel_sched_p () && reload_completed)
   7421  1.1  mrg     {
   7422  1.1  mrg       for (rtx_insn *insn = NEXT_INSN (current_sched_info->prev_head);
   7423  1.1  mrg 	   insn != current_sched_info->next_tail;
   7424  1.1  mrg 	   insn = NEXT_INSN (insn))
   7425  1.1  mrg 	gcc_assert (!SCHED_GROUP_P (insn));
   7426  1.1  mrg     }
   7427  1.1  mrg   last_scheduled_insn = NULL;
   7428  1.1  mrg   init_insn_group_barriers ();
   7429  1.1  mrg 
   7430  1.1  mrg   current_cycle = 0;
   7431  1.1  mrg   memset (mem_ops_in_group, 0, sizeof (mem_ops_in_group));
   7432  1.1  mrg }
   7433  1.1  mrg 
   7434  1.1  mrg /* We're beginning a scheduling pass.  Check assertion.  */
   7435  1.1  mrg 
   7436  1.1  mrg static void
   7437  1.1  mrg ia64_sched_init_global (FILE *dump ATTRIBUTE_UNUSED,
   7438  1.1  mrg                         int sched_verbose ATTRIBUTE_UNUSED,
   7439  1.1  mrg                         int max_ready ATTRIBUTE_UNUSED)
   7440  1.1  mrg {
   7441  1.1  mrg   gcc_assert (pending_data_specs == 0);
   7442  1.1  mrg }
   7443  1.1  mrg 
   7444  1.1  mrg /* Scheduling pass is now finished.  Free/reset static variable.  */
   7445  1.1  mrg static void
   7446  1.1  mrg ia64_sched_finish_global (FILE *dump ATTRIBUTE_UNUSED,
   7447  1.1  mrg 			  int sched_verbose ATTRIBUTE_UNUSED)
   7448  1.1  mrg {
   7449  1.1  mrg   gcc_assert (pending_data_specs == 0);
   7450  1.1  mrg }
   7451  1.1  mrg 
   7452  1.1  mrg /* Return TRUE if INSN is a load (either normal or speculative, but not a
   7453  1.1  mrg    speculation check), FALSE otherwise.  */
   7454  1.1  mrg static bool
   7455  1.1  mrg is_load_p (rtx_insn *insn)
   7456  1.1  mrg {
   7457  1.1  mrg   enum attr_itanium_class insn_class = ia64_safe_itanium_class (insn);
   7458  1.1  mrg 
   7459  1.1  mrg   return
   7460  1.1  mrg    ((insn_class == ITANIUM_CLASS_LD || insn_class == ITANIUM_CLASS_FLD)
   7461  1.1  mrg     && get_attr_check_load (insn) == CHECK_LOAD_NO);
   7462  1.1  mrg }
   7463  1.1  mrg 
   7464  1.1  mrg /* If INSN is a memory reference, memoize it in MEM_OPS_IN_GROUP global array
   7465  1.1  mrg    (taking account for 3-cycle cache reference postponing for stores: Intel
   7466  1.1  mrg    Itanium 2 Reference Manual for Software Development and Optimization,
   7467  1.1  mrg    6.7.3.1).  */
   7468  1.1  mrg static void
   7469  1.1  mrg record_memory_reference (rtx_insn *insn)
   7470  1.1  mrg {
   7471  1.1  mrg   enum attr_itanium_class insn_class = ia64_safe_itanium_class (insn);
   7472  1.1  mrg 
   7473  1.1  mrg   switch (insn_class) {
   7474  1.1  mrg     case ITANIUM_CLASS_FLD:
   7475  1.1  mrg     case ITANIUM_CLASS_LD:
   7476  1.1  mrg       mem_ops_in_group[current_cycle % 4]++;
   7477  1.1  mrg       break;
   7478  1.1  mrg     case ITANIUM_CLASS_STF:
   7479  1.1  mrg     case ITANIUM_CLASS_ST:
   7480  1.1  mrg       mem_ops_in_group[(current_cycle + 3) % 4]++;
   7481  1.1  mrg       break;
   7482  1.1  mrg     default:;
   7483  1.1  mrg   }
   7484  1.1  mrg }
   7485  1.1  mrg 
   7486  1.1  mrg /* We are about to being issuing insns for this clock cycle.
   7487  1.1  mrg    Override the default sort algorithm to better slot instructions.  */
   7488  1.1  mrg 
   7489  1.1  mrg static int
   7490  1.1  mrg ia64_dfa_sched_reorder (FILE *dump, int sched_verbose, rtx_insn **ready,
   7491  1.1  mrg 			int *pn_ready, int clock_var,
   7492  1.1  mrg 			int reorder_type)
   7493  1.1  mrg {
   7494  1.1  mrg   int n_asms;
   7495  1.1  mrg   int n_ready = *pn_ready;
   7496  1.1  mrg   rtx_insn **e_ready = ready + n_ready;
   7497  1.1  mrg   rtx_insn **insnp;
   7498  1.1  mrg 
   7499  1.1  mrg   if (sched_verbose)
   7500  1.1  mrg     fprintf (dump, "// ia64_dfa_sched_reorder (type %d):\n", reorder_type);
   7501  1.1  mrg 
   7502  1.1  mrg   if (reorder_type == 0)
   7503  1.1  mrg     {
   7504  1.1  mrg       /* First, move all USEs, CLOBBERs and other crud out of the way.  */
   7505  1.1  mrg       n_asms = 0;
   7506  1.1  mrg       for (insnp = ready; insnp < e_ready; insnp++)
   7507  1.1  mrg 	if (insnp < e_ready)
   7508  1.1  mrg 	  {
   7509  1.1  mrg 	    rtx_insn *insn = *insnp;
   7510  1.1  mrg 	    enum attr_type t = ia64_safe_type (insn);
   7511  1.1  mrg 	    if (t == TYPE_UNKNOWN)
   7512  1.1  mrg 	      {
   7513  1.1  mrg 		if (GET_CODE (PATTERN (insn)) == ASM_INPUT
   7514  1.1  mrg 		    || asm_noperands (PATTERN (insn)) >= 0)
   7515  1.1  mrg 		  {
   7516  1.1  mrg 		    rtx_insn *lowest = ready[n_asms];
   7517  1.1  mrg 		    ready[n_asms] = insn;
   7518  1.1  mrg 		    *insnp = lowest;
   7519  1.1  mrg 		    n_asms++;
   7520  1.1  mrg 		  }
   7521  1.1  mrg 		else
   7522  1.1  mrg 		  {
   7523  1.1  mrg 		    rtx_insn *highest = ready[n_ready - 1];
   7524  1.1  mrg 		    ready[n_ready - 1] = insn;
   7525  1.1  mrg 		    *insnp = highest;
   7526  1.1  mrg 		    return 1;
   7527  1.1  mrg 		  }
   7528  1.1  mrg 	      }
   7529  1.1  mrg 	  }
   7530  1.1  mrg 
   7531  1.1  mrg       if (n_asms < n_ready)
   7532  1.1  mrg 	{
   7533  1.1  mrg 	  /* Some normal insns to process.  Skip the asms.  */
   7534  1.1  mrg 	  ready += n_asms;
   7535  1.1  mrg 	  n_ready -= n_asms;
   7536  1.1  mrg 	}
   7537  1.1  mrg       else if (n_ready > 0)
   7538  1.1  mrg 	return 1;
   7539  1.1  mrg     }
   7540  1.1  mrg 
   7541  1.1  mrg   if (ia64_final_schedule)
   7542  1.1  mrg     {
   7543  1.1  mrg       int deleted = 0;
   7544  1.1  mrg       int nr_need_stop = 0;
   7545  1.1  mrg 
   7546  1.1  mrg       for (insnp = ready; insnp < e_ready; insnp++)
   7547  1.1  mrg 	if (safe_group_barrier_needed (*insnp))
   7548  1.1  mrg 	  nr_need_stop++;
   7549  1.1  mrg 
   7550  1.1  mrg       if (reorder_type == 1 && n_ready == nr_need_stop)
   7551  1.1  mrg 	return 0;
   7552  1.1  mrg       if (reorder_type == 0)
   7553  1.1  mrg 	return 1;
   7554  1.1  mrg       insnp = e_ready;
   7555  1.1  mrg       /* Move down everything that needs a stop bit, preserving
   7556  1.1  mrg 	 relative order.  */
   7557  1.1  mrg       while (insnp-- > ready + deleted)
   7558  1.1  mrg 	while (insnp >= ready + deleted)
   7559  1.1  mrg 	  {
   7560  1.1  mrg 	    rtx_insn *insn = *insnp;
   7561  1.1  mrg 	    if (! safe_group_barrier_needed (insn))
   7562  1.1  mrg 	      break;
   7563  1.1  mrg 	    memmove (ready + 1, ready, (insnp - ready) * sizeof (rtx));
   7564  1.1  mrg 	    *ready = insn;
   7565  1.1  mrg 	    deleted++;
   7566  1.1  mrg 	  }
   7567  1.1  mrg       n_ready -= deleted;
   7568  1.1  mrg       ready += deleted;
   7569  1.1  mrg     }
   7570  1.1  mrg 
   7571  1.1  mrg   current_cycle = clock_var;
   7572  1.1  mrg   if (reload_completed && mem_ops_in_group[clock_var % 4] >= ia64_max_memory_insns)
   7573  1.1  mrg     {
   7574  1.1  mrg       int moved = 0;
   7575  1.1  mrg 
   7576  1.1  mrg       insnp = e_ready;
   7577  1.1  mrg       /* Move down loads/stores, preserving relative order.  */
   7578  1.1  mrg       while (insnp-- > ready + moved)
   7579  1.1  mrg 	while (insnp >= ready + moved)
   7580  1.1  mrg 	  {
   7581  1.1  mrg 	    rtx_insn *insn = *insnp;
   7582  1.1  mrg 	    if (! is_load_p (insn))
   7583  1.1  mrg 	      break;
   7584  1.1  mrg 	    memmove (ready + 1, ready, (insnp - ready) * sizeof (rtx));
   7585  1.1  mrg 	    *ready = insn;
   7586  1.1  mrg 	    moved++;
   7587  1.1  mrg 	  }
   7588  1.1  mrg       n_ready -= moved;
   7589  1.1  mrg       ready += moved;
   7590  1.1  mrg     }
   7591  1.1  mrg 
   7592  1.1  mrg   return 1;
   7593  1.1  mrg }
   7594  1.1  mrg 
   7595  1.1  mrg /* We are about to being issuing insns for this clock cycle.  Override
   7596  1.1  mrg    the default sort algorithm to better slot instructions.  */
   7597  1.1  mrg 
   7598  1.1  mrg static int
   7599  1.1  mrg ia64_sched_reorder (FILE *dump, int sched_verbose, rtx_insn **ready,
   7600  1.1  mrg 		    int *pn_ready, int clock_var)
   7601  1.1  mrg {
   7602  1.1  mrg   return ia64_dfa_sched_reorder (dump, sched_verbose, ready,
   7603  1.1  mrg 				 pn_ready, clock_var, 0);
   7604  1.1  mrg }
   7605  1.1  mrg 
   7606  1.1  mrg /* Like ia64_sched_reorder, but called after issuing each insn.
   7607  1.1  mrg    Override the default sort algorithm to better slot instructions.  */
   7608  1.1  mrg 
   7609  1.1  mrg static int
   7610  1.1  mrg ia64_sched_reorder2 (FILE *dump ATTRIBUTE_UNUSED,
   7611  1.1  mrg 		     int sched_verbose ATTRIBUTE_UNUSED, rtx_insn **ready,
   7612  1.1  mrg 		     int *pn_ready, int clock_var)
   7613  1.1  mrg {
   7614  1.1  mrg   return ia64_dfa_sched_reorder (dump, sched_verbose, ready, pn_ready,
   7615  1.1  mrg 				 clock_var, 1);
   7616  1.1  mrg }
   7617  1.1  mrg 
   7618  1.1  mrg /* We are about to issue INSN.  Return the number of insns left on the
   7619  1.1  mrg    ready queue that can be issued this cycle.  */
   7620  1.1  mrg 
   7621  1.1  mrg static int
   7622  1.1  mrg ia64_variable_issue (FILE *dump ATTRIBUTE_UNUSED,
   7623  1.1  mrg 		     int sched_verbose ATTRIBUTE_UNUSED,
   7624  1.1  mrg 		     rtx_insn *insn,
   7625  1.1  mrg 		     int can_issue_more ATTRIBUTE_UNUSED)
   7626  1.1  mrg {
   7627  1.1  mrg   if (sched_deps_info->generate_spec_deps && !sel_sched_p ())
   7628  1.1  mrg     /* Modulo scheduling does not extend h_i_d when emitting
   7629  1.1  mrg        new instructions.  Don't use h_i_d, if we don't have to.  */
   7630  1.1  mrg     {
   7631  1.1  mrg       if (DONE_SPEC (insn) & BEGIN_DATA)
   7632  1.1  mrg 	pending_data_specs++;
   7633  1.1  mrg       if (CHECK_SPEC (insn) & BEGIN_DATA)
   7634  1.1  mrg 	pending_data_specs--;
   7635  1.1  mrg     }
   7636  1.1  mrg 
   7637  1.1  mrg   if (DEBUG_INSN_P (insn))
   7638  1.1  mrg     return 1;
   7639  1.1  mrg 
   7640  1.1  mrg   last_scheduled_insn = insn;
   7641  1.1  mrg   memcpy (prev_cycle_state, curr_state, dfa_state_size);
   7642  1.1  mrg   if (reload_completed)
   7643  1.1  mrg     {
   7644  1.1  mrg       int needed = group_barrier_needed (insn);
   7645  1.1  mrg 
   7646  1.1  mrg       gcc_assert (!needed);
   7647  1.1  mrg       if (CALL_P (insn))
   7648  1.1  mrg 	init_insn_group_barriers ();
   7649  1.1  mrg       stops_p [INSN_UID (insn)] = stop_before_p;
   7650  1.1  mrg       stop_before_p = 0;
   7651  1.1  mrg 
   7652  1.1  mrg       record_memory_reference (insn);
   7653  1.1  mrg     }
   7654  1.1  mrg   return 1;
   7655  1.1  mrg }
   7656  1.1  mrg 
   7657  1.1  mrg /* We are choosing insn from the ready queue.  Return zero if INSN
   7658  1.1  mrg    can be chosen.  */
   7659  1.1  mrg 
   7660  1.1  mrg static int
   7661  1.1  mrg ia64_first_cycle_multipass_dfa_lookahead_guard (rtx_insn *insn, int ready_index)
   7662  1.1  mrg {
   7663  1.1  mrg   gcc_assert (insn && INSN_P (insn));
   7664  1.1  mrg 
   7665  1.1  mrg   /* Size of ALAT is 32.  As far as we perform conservative
   7666  1.1  mrg      data speculation, we keep ALAT half-empty.  */
   7667  1.1  mrg   if (pending_data_specs >= 16 && (TODO_SPEC (insn) & BEGIN_DATA))
   7668  1.1  mrg     return ready_index == 0 ? -1 : 1;
   7669  1.1  mrg 
   7670  1.1  mrg   if (ready_index == 0)
   7671  1.1  mrg     return 0;
   7672  1.1  mrg 
   7673  1.1  mrg   if ((!reload_completed
   7674  1.1  mrg        || !safe_group_barrier_needed (insn))
   7675  1.1  mrg       && (!mflag_sched_mem_insns_hard_limit
   7676  1.1  mrg 	  || !is_load_p (insn)
   7677  1.1  mrg 	  || mem_ops_in_group[current_cycle % 4] < ia64_max_memory_insns))
   7678  1.1  mrg     return 0;
   7679  1.1  mrg 
   7680  1.1  mrg   return 1;
   7681  1.1  mrg }
   7682  1.1  mrg 
   7683  1.1  mrg /* The following variable value is pseudo-insn used by the DFA insn
   7684  1.1  mrg    scheduler to change the DFA state when the simulated clock is
   7685  1.1  mrg    increased.  */
   7686  1.1  mrg 
   7687  1.1  mrg static rtx_insn *dfa_pre_cycle_insn;
   7688  1.1  mrg 
   7689  1.1  mrg /* Returns 1 when a meaningful insn was scheduled between the last group
   7690  1.1  mrg    barrier and LAST.  */
   7691  1.1  mrg static int
   7692  1.1  mrg scheduled_good_insn (rtx_insn *last)
   7693  1.1  mrg {
   7694  1.1  mrg   if (last && recog_memoized (last) >= 0)
   7695  1.1  mrg     return 1;
   7696  1.1  mrg 
   7697  1.1  mrg   for ( ;
   7698  1.1  mrg        last != NULL && !NOTE_INSN_BASIC_BLOCK_P (last)
   7699  1.1  mrg        && !stops_p[INSN_UID (last)];
   7700  1.1  mrg        last = PREV_INSN (last))
   7701  1.1  mrg     /* We could hit a NOTE_INSN_DELETED here which is actually outside
   7702  1.1  mrg        the ebb we're scheduling.  */
   7703  1.1  mrg     if (INSN_P (last) && recog_memoized (last) >= 0)
   7704  1.1  mrg       return 1;
   7705  1.1  mrg 
   7706  1.1  mrg   return 0;
   7707  1.1  mrg }
   7708  1.1  mrg 
   7709  1.1  mrg /* We are about to being issuing INSN.  Return nonzero if we cannot
   7710  1.1  mrg    issue it on given cycle CLOCK and return zero if we should not sort
   7711  1.1  mrg    the ready queue on the next clock start.  */
   7712  1.1  mrg 
   7713  1.1  mrg static int
   7714  1.1  mrg ia64_dfa_new_cycle (FILE *dump, int verbose, rtx_insn *insn, int last_clock,
   7715  1.1  mrg 		    int clock, int *sort_p)
   7716  1.1  mrg {
   7717  1.1  mrg   gcc_assert (insn && INSN_P (insn));
   7718  1.1  mrg 
   7719  1.1  mrg   if (DEBUG_INSN_P (insn))
   7720  1.1  mrg     return 0;
   7721  1.1  mrg 
   7722  1.1  mrg   /* When a group barrier is needed for insn, last_scheduled_insn
   7723  1.1  mrg      should be set.  */
   7724  1.1  mrg   gcc_assert (!(reload_completed && safe_group_barrier_needed (insn))
   7725  1.1  mrg               || last_scheduled_insn);
   7726  1.1  mrg 
   7727  1.1  mrg   if ((reload_completed
   7728  1.1  mrg        && (safe_group_barrier_needed (insn)
   7729  1.1  mrg 	   || (mflag_sched_stop_bits_after_every_cycle
   7730  1.1  mrg 	       && last_clock != clock
   7731  1.1  mrg 	       && last_scheduled_insn
   7732  1.1  mrg 	       && scheduled_good_insn (last_scheduled_insn))))
   7733  1.1  mrg       || (last_scheduled_insn
   7734  1.1  mrg 	  && (CALL_P (last_scheduled_insn)
   7735  1.1  mrg 	      || unknown_for_bundling_p (last_scheduled_insn))))
   7736  1.1  mrg     {
   7737  1.1  mrg       init_insn_group_barriers ();
   7738  1.1  mrg 
   7739  1.1  mrg       if (verbose && dump)
   7740  1.1  mrg 	fprintf (dump, "//    Stop should be before %d%s\n", INSN_UID (insn),
   7741  1.1  mrg 		 last_clock == clock ? " + cycle advance" : "");
   7742  1.1  mrg 
   7743  1.1  mrg       stop_before_p = 1;
   7744  1.1  mrg       current_cycle = clock;
   7745  1.1  mrg       mem_ops_in_group[current_cycle % 4] = 0;
   7746  1.1  mrg 
   7747  1.1  mrg       if (last_clock == clock)
   7748  1.1  mrg 	{
   7749  1.1  mrg 	  state_transition (curr_state, dfa_stop_insn);
   7750  1.1  mrg 	  if (TARGET_EARLY_STOP_BITS)
   7751  1.1  mrg 	    *sort_p = (last_scheduled_insn == NULL_RTX
   7752  1.1  mrg 		       || ! CALL_P (last_scheduled_insn));
   7753  1.1  mrg 	  else
   7754  1.1  mrg 	    *sort_p = 0;
   7755  1.1  mrg 	  return 1;
   7756  1.1  mrg 	}
   7757  1.1  mrg 
   7758  1.1  mrg       if (last_scheduled_insn)
   7759  1.1  mrg 	{
   7760  1.1  mrg 	  if (unknown_for_bundling_p (last_scheduled_insn))
   7761  1.1  mrg 	    state_reset (curr_state);
   7762  1.1  mrg 	  else
   7763  1.1  mrg 	    {
   7764  1.1  mrg 	      memcpy (curr_state, prev_cycle_state, dfa_state_size);
   7765  1.1  mrg 	      state_transition (curr_state, dfa_stop_insn);
   7766  1.1  mrg 	      state_transition (curr_state, dfa_pre_cycle_insn);
   7767  1.1  mrg 	      state_transition (curr_state, NULL);
   7768  1.1  mrg 	    }
   7769  1.1  mrg 	}
   7770  1.1  mrg     }
   7771  1.1  mrg   return 0;
   7772  1.1  mrg }
   7773  1.1  mrg 
   7774  1.1  mrg /* Implement targetm.sched.h_i_d_extended hook.
   7775  1.1  mrg    Extend internal data structures.  */
   7776  1.1  mrg static void
   7777  1.1  mrg ia64_h_i_d_extended (void)
   7778  1.1  mrg {
   7779  1.1  mrg   if (stops_p != NULL)
   7780  1.1  mrg     {
   7781  1.1  mrg       int new_clocks_length = get_max_uid () * 3 / 2;
   7782  1.1  mrg       stops_p = (char *) xrecalloc (stops_p, new_clocks_length, clocks_length, 1);
   7783  1.1  mrg       clocks_length = new_clocks_length;
   7784  1.1  mrg     }
   7785  1.1  mrg }
   7786  1.1  mrg 
   7787  1.1  mrg 
   7789  1.1  mrg /* This structure describes the data used by the backend to guide scheduling.
   7790  1.1  mrg    When the current scheduling point is switched, this data should be saved
   7791  1.1  mrg    and restored later, if the scheduler returns to this point.  */
   7792  1.1  mrg struct _ia64_sched_context
   7793  1.1  mrg {
   7794  1.1  mrg   state_t prev_cycle_state;
   7795  1.1  mrg   rtx_insn *last_scheduled_insn;
   7796  1.1  mrg   struct reg_write_state rws_sum[NUM_REGS];
   7797  1.1  mrg   struct reg_write_state rws_insn[NUM_REGS];
   7798  1.1  mrg   int first_instruction;
   7799  1.1  mrg   int pending_data_specs;
   7800  1.1  mrg   int current_cycle;
   7801  1.1  mrg   char mem_ops_in_group[4];
   7802  1.1  mrg };
   7803  1.1  mrg typedef struct _ia64_sched_context *ia64_sched_context_t;
   7804  1.1  mrg 
   7805  1.1  mrg /* Allocates a scheduling context.  */
   7806  1.1  mrg static void *
   7807  1.1  mrg ia64_alloc_sched_context (void)
   7808  1.1  mrg {
   7809  1.1  mrg   return xmalloc (sizeof (struct _ia64_sched_context));
   7810  1.1  mrg }
   7811  1.1  mrg 
   7812  1.1  mrg /* Initializes the _SC context with clean data, if CLEAN_P, and from
   7813  1.1  mrg    the global context otherwise.  */
   7814  1.1  mrg static void
   7815  1.1  mrg ia64_init_sched_context (void *_sc, bool clean_p)
   7816  1.1  mrg {
   7817  1.1  mrg   ia64_sched_context_t sc = (ia64_sched_context_t) _sc;
   7818  1.1  mrg 
   7819  1.1  mrg   sc->prev_cycle_state = xmalloc (dfa_state_size);
   7820  1.1  mrg   if (clean_p)
   7821  1.1  mrg     {
   7822  1.1  mrg       state_reset (sc->prev_cycle_state);
   7823  1.1  mrg       sc->last_scheduled_insn = NULL;
   7824  1.1  mrg       memset (sc->rws_sum, 0, sizeof (rws_sum));
   7825  1.1  mrg       memset (sc->rws_insn, 0, sizeof (rws_insn));
   7826  1.1  mrg       sc->first_instruction = 1;
   7827  1.1  mrg       sc->pending_data_specs = 0;
   7828  1.1  mrg       sc->current_cycle = 0;
   7829  1.1  mrg       memset (sc->mem_ops_in_group, 0, sizeof (mem_ops_in_group));
   7830  1.1  mrg     }
   7831  1.1  mrg   else
   7832  1.1  mrg     {
   7833  1.1  mrg       memcpy (sc->prev_cycle_state, prev_cycle_state, dfa_state_size);
   7834  1.1  mrg       sc->last_scheduled_insn = last_scheduled_insn;
   7835  1.1  mrg       memcpy (sc->rws_sum, rws_sum, sizeof (rws_sum));
   7836  1.1  mrg       memcpy (sc->rws_insn, rws_insn, sizeof (rws_insn));
   7837  1.1  mrg       sc->first_instruction = first_instruction;
   7838  1.1  mrg       sc->pending_data_specs = pending_data_specs;
   7839  1.1  mrg       sc->current_cycle = current_cycle;
   7840  1.1  mrg       memcpy (sc->mem_ops_in_group, mem_ops_in_group, sizeof (mem_ops_in_group));
   7841  1.1  mrg     }
   7842  1.1  mrg }
   7843  1.1  mrg 
   7844  1.1  mrg /* Sets the global scheduling context to the one pointed to by _SC.  */
   7845  1.1  mrg static void
   7846  1.1  mrg ia64_set_sched_context (void *_sc)
   7847  1.1  mrg {
   7848  1.1  mrg   ia64_sched_context_t sc = (ia64_sched_context_t) _sc;
   7849  1.1  mrg 
   7850  1.1  mrg   gcc_assert (sc != NULL);
   7851  1.1  mrg 
   7852  1.1  mrg   memcpy (prev_cycle_state, sc->prev_cycle_state, dfa_state_size);
   7853  1.1  mrg   last_scheduled_insn = sc->last_scheduled_insn;
   7854  1.1  mrg   memcpy (rws_sum, sc->rws_sum, sizeof (rws_sum));
   7855  1.1  mrg   memcpy (rws_insn, sc->rws_insn, sizeof (rws_insn));
   7856  1.1  mrg   first_instruction = sc->first_instruction;
   7857  1.1  mrg   pending_data_specs = sc->pending_data_specs;
   7858  1.1  mrg   current_cycle = sc->current_cycle;
   7859  1.1  mrg   memcpy (mem_ops_in_group, sc->mem_ops_in_group, sizeof (mem_ops_in_group));
   7860  1.1  mrg }
   7861  1.1  mrg 
   7862  1.1  mrg /* Clears the data in the _SC scheduling context.  */
   7863  1.1  mrg static void
   7864  1.1  mrg ia64_clear_sched_context (void *_sc)
   7865  1.1  mrg {
   7866  1.1  mrg   ia64_sched_context_t sc = (ia64_sched_context_t) _sc;
   7867  1.1  mrg 
   7868  1.1  mrg   free (sc->prev_cycle_state);
   7869  1.1  mrg   sc->prev_cycle_state = NULL;
   7870  1.1  mrg }
   7871  1.1  mrg 
   7872  1.1  mrg /* Frees the _SC scheduling context.  */
   7873  1.1  mrg static void
   7874  1.1  mrg ia64_free_sched_context (void *_sc)
   7875  1.1  mrg {
   7876  1.1  mrg   gcc_assert (_sc != NULL);
   7877  1.1  mrg 
   7878  1.1  mrg   free (_sc);
   7879  1.1  mrg }
   7880  1.1  mrg 
   7881  1.1  mrg typedef rtx (* gen_func_t) (rtx, rtx);
   7882  1.1  mrg 
   7883  1.1  mrg /* Return a function that will generate a load of mode MODE_NO
   7884  1.1  mrg    with speculation types TS.  */
   7885  1.1  mrg static gen_func_t
   7886  1.1  mrg get_spec_load_gen_function (ds_t ts, int mode_no)
   7887  1.1  mrg {
   7888  1.1  mrg   static gen_func_t gen_ld_[] = {
   7889  1.1  mrg     gen_movbi,
   7890  1.1  mrg     gen_movqi_internal,
   7891  1.1  mrg     gen_movhi_internal,
   7892  1.1  mrg     gen_movsi_internal,
   7893  1.1  mrg     gen_movdi_internal,
   7894  1.1  mrg     gen_movsf_internal,
   7895  1.1  mrg     gen_movdf_internal,
   7896  1.1  mrg     gen_movxf_internal,
   7897  1.1  mrg     gen_movti_internal,
   7898  1.1  mrg     gen_zero_extendqidi2,
   7899  1.1  mrg     gen_zero_extendhidi2,
   7900  1.1  mrg     gen_zero_extendsidi2,
   7901  1.1  mrg   };
   7902  1.1  mrg 
   7903  1.1  mrg   static gen_func_t gen_ld_a[] = {
   7904  1.1  mrg     gen_movbi_advanced,
   7905  1.1  mrg     gen_movqi_advanced,
   7906  1.1  mrg     gen_movhi_advanced,
   7907  1.1  mrg     gen_movsi_advanced,
   7908  1.1  mrg     gen_movdi_advanced,
   7909  1.1  mrg     gen_movsf_advanced,
   7910  1.1  mrg     gen_movdf_advanced,
   7911  1.1  mrg     gen_movxf_advanced,
   7912  1.1  mrg     gen_movti_advanced,
   7913  1.1  mrg     gen_zero_extendqidi2_advanced,
   7914  1.1  mrg     gen_zero_extendhidi2_advanced,
   7915  1.1  mrg     gen_zero_extendsidi2_advanced,
   7916  1.1  mrg   };
   7917  1.1  mrg   static gen_func_t gen_ld_s[] = {
   7918  1.1  mrg     gen_movbi_speculative,
   7919  1.1  mrg     gen_movqi_speculative,
   7920  1.1  mrg     gen_movhi_speculative,
   7921  1.1  mrg     gen_movsi_speculative,
   7922  1.1  mrg     gen_movdi_speculative,
   7923  1.1  mrg     gen_movsf_speculative,
   7924  1.1  mrg     gen_movdf_speculative,
   7925  1.1  mrg     gen_movxf_speculative,
   7926  1.1  mrg     gen_movti_speculative,
   7927  1.1  mrg     gen_zero_extendqidi2_speculative,
   7928  1.1  mrg     gen_zero_extendhidi2_speculative,
   7929  1.1  mrg     gen_zero_extendsidi2_speculative,
   7930  1.1  mrg   };
   7931  1.1  mrg   static gen_func_t gen_ld_sa[] = {
   7932  1.1  mrg     gen_movbi_speculative_advanced,
   7933  1.1  mrg     gen_movqi_speculative_advanced,
   7934  1.1  mrg     gen_movhi_speculative_advanced,
   7935  1.1  mrg     gen_movsi_speculative_advanced,
   7936  1.1  mrg     gen_movdi_speculative_advanced,
   7937  1.1  mrg     gen_movsf_speculative_advanced,
   7938  1.1  mrg     gen_movdf_speculative_advanced,
   7939  1.1  mrg     gen_movxf_speculative_advanced,
   7940  1.1  mrg     gen_movti_speculative_advanced,
   7941  1.1  mrg     gen_zero_extendqidi2_speculative_advanced,
   7942  1.1  mrg     gen_zero_extendhidi2_speculative_advanced,
   7943  1.1  mrg     gen_zero_extendsidi2_speculative_advanced,
   7944  1.1  mrg   };
   7945  1.1  mrg   static gen_func_t gen_ld_s_a[] = {
   7946  1.1  mrg     gen_movbi_speculative_a,
   7947  1.1  mrg     gen_movqi_speculative_a,
   7948  1.1  mrg     gen_movhi_speculative_a,
   7949  1.1  mrg     gen_movsi_speculative_a,
   7950  1.1  mrg     gen_movdi_speculative_a,
   7951  1.1  mrg     gen_movsf_speculative_a,
   7952  1.1  mrg     gen_movdf_speculative_a,
   7953  1.1  mrg     gen_movxf_speculative_a,
   7954  1.1  mrg     gen_movti_speculative_a,
   7955  1.1  mrg     gen_zero_extendqidi2_speculative_a,
   7956  1.1  mrg     gen_zero_extendhidi2_speculative_a,
   7957  1.1  mrg     gen_zero_extendsidi2_speculative_a,
   7958  1.1  mrg   };
   7959  1.1  mrg 
   7960  1.1  mrg   gen_func_t *gen_ld;
   7961  1.1  mrg 
   7962  1.1  mrg   if (ts & BEGIN_DATA)
   7963  1.1  mrg     {
   7964  1.1  mrg       if (ts & BEGIN_CONTROL)
   7965  1.1  mrg 	gen_ld = gen_ld_sa;
   7966  1.1  mrg       else
   7967  1.1  mrg 	gen_ld = gen_ld_a;
   7968  1.1  mrg     }
   7969  1.1  mrg   else if (ts & BEGIN_CONTROL)
   7970  1.1  mrg     {
   7971  1.1  mrg       if ((spec_info->flags & SEL_SCHED_SPEC_DONT_CHECK_CONTROL)
   7972  1.1  mrg 	  || ia64_needs_block_p (ts))
   7973  1.1  mrg 	gen_ld = gen_ld_s;
   7974  1.1  mrg       else
   7975  1.1  mrg 	gen_ld = gen_ld_s_a;
   7976  1.1  mrg     }
   7977  1.1  mrg   else if (ts == 0)
   7978  1.1  mrg     gen_ld = gen_ld_;
   7979  1.1  mrg   else
   7980  1.1  mrg     gcc_unreachable ();
   7981  1.1  mrg 
   7982  1.1  mrg   return gen_ld[mode_no];
   7983  1.1  mrg }
   7984  1.1  mrg 
   7985  1.1  mrg /* Constants that help mapping 'machine_mode' to int.  */
   7986  1.1  mrg enum SPEC_MODES
   7987  1.1  mrg   {
   7988  1.1  mrg     SPEC_MODE_INVALID = -1,
   7989  1.1  mrg     SPEC_MODE_FIRST = 0,
   7990  1.1  mrg     SPEC_MODE_FOR_EXTEND_FIRST = 1,
   7991  1.1  mrg     SPEC_MODE_FOR_EXTEND_LAST = 3,
   7992  1.1  mrg     SPEC_MODE_LAST = 8
   7993  1.1  mrg   };
   7994  1.1  mrg 
   7995  1.1  mrg enum
   7996  1.1  mrg   {
   7997  1.1  mrg     /* Offset to reach ZERO_EXTEND patterns.  */
   7998  1.1  mrg     SPEC_GEN_EXTEND_OFFSET = SPEC_MODE_LAST - SPEC_MODE_FOR_EXTEND_FIRST + 1
   7999  1.1  mrg   };
   8000  1.1  mrg 
   8001  1.1  mrg /* Return index of the MODE.  */
   8002  1.1  mrg static int
   8003  1.1  mrg ia64_mode_to_int (machine_mode mode)
   8004  1.1  mrg {
   8005  1.1  mrg   switch (mode)
   8006  1.1  mrg     {
   8007  1.1  mrg     case E_BImode: return 0; /* SPEC_MODE_FIRST  */
   8008  1.1  mrg     case E_QImode: return 1; /* SPEC_MODE_FOR_EXTEND_FIRST  */
   8009  1.1  mrg     case E_HImode: return 2;
   8010  1.1  mrg     case E_SImode: return 3; /* SPEC_MODE_FOR_EXTEND_LAST  */
   8011  1.1  mrg     case E_DImode: return 4;
   8012  1.1  mrg     case E_SFmode: return 5;
   8013  1.1  mrg     case E_DFmode: return 6;
   8014  1.1  mrg     case E_XFmode: return 7;
   8015  1.1  mrg     case E_TImode:
   8016  1.1  mrg       /* ??? This mode needs testing.  Bypasses for ldfp8 instruction are not
   8017  1.1  mrg 	 mentioned in itanium[12].md.  Predicate fp_register_operand also
   8018  1.1  mrg 	 needs to be defined.  Bottom line: better disable for now.  */
   8019  1.1  mrg       return SPEC_MODE_INVALID;
   8020  1.1  mrg     default:     return SPEC_MODE_INVALID;
   8021  1.1  mrg     }
   8022  1.1  mrg }
   8023  1.1  mrg 
   8024  1.1  mrg /* Provide information about speculation capabilities.  */
   8025  1.1  mrg static void
   8026  1.1  mrg ia64_set_sched_flags (spec_info_t spec_info)
   8027  1.1  mrg {
   8028  1.1  mrg   unsigned int *flags = &(current_sched_info->flags);
   8029  1.1  mrg 
   8030  1.1  mrg   if (*flags & SCHED_RGN
   8031  1.1  mrg       || *flags & SCHED_EBB
   8032  1.1  mrg       || *flags & SEL_SCHED)
   8033  1.1  mrg     {
   8034  1.1  mrg       int mask = 0;
   8035  1.1  mrg 
   8036  1.1  mrg       if ((mflag_sched_br_data_spec && !reload_completed && optimize > 0)
   8037  1.1  mrg           || (mflag_sched_ar_data_spec && reload_completed))
   8038  1.1  mrg 	{
   8039  1.1  mrg 	  mask |= BEGIN_DATA;
   8040  1.1  mrg 
   8041  1.1  mrg 	  if (!sel_sched_p ()
   8042  1.1  mrg 	      && ((mflag_sched_br_in_data_spec && !reload_completed)
   8043  1.1  mrg 		  || (mflag_sched_ar_in_data_spec && reload_completed)))
   8044  1.1  mrg 	    mask |= BE_IN_DATA;
   8045  1.1  mrg 	}
   8046  1.1  mrg 
   8047  1.1  mrg       if (mflag_sched_control_spec
   8048  1.1  mrg           && (!sel_sched_p ()
   8049  1.1  mrg 	      || reload_completed))
   8050  1.1  mrg 	{
   8051  1.1  mrg 	  mask |= BEGIN_CONTROL;
   8052  1.1  mrg 
   8053  1.1  mrg 	  if (!sel_sched_p () && mflag_sched_in_control_spec)
   8054  1.1  mrg 	    mask |= BE_IN_CONTROL;
   8055  1.1  mrg 	}
   8056  1.1  mrg 
   8057  1.1  mrg       spec_info->mask = mask;
   8058  1.1  mrg 
   8059  1.1  mrg       if (mask)
   8060  1.1  mrg 	{
   8061  1.1  mrg 	  *flags |= USE_DEPS_LIST | DO_SPECULATION;
   8062  1.1  mrg 
   8063  1.1  mrg 	  if (mask & BE_IN_SPEC)
   8064  1.1  mrg 	    *flags |= NEW_BBS;
   8065  1.1  mrg 
   8066  1.1  mrg 	  spec_info->flags = 0;
   8067  1.1  mrg 
   8068  1.1  mrg 	  if ((mask & CONTROL_SPEC)
   8069  1.1  mrg 	      && sel_sched_p () && mflag_sel_sched_dont_check_control_spec)
   8070  1.1  mrg 	    spec_info->flags |= SEL_SCHED_SPEC_DONT_CHECK_CONTROL;
   8071  1.1  mrg 
   8072  1.1  mrg 	  if (sched_verbose >= 1)
   8073  1.1  mrg 	    spec_info->dump = sched_dump;
   8074  1.1  mrg 	  else
   8075  1.1  mrg 	    spec_info->dump = 0;
   8076  1.1  mrg 
   8077  1.1  mrg 	  if (mflag_sched_count_spec_in_critical_path)
   8078  1.1  mrg 	    spec_info->flags |= COUNT_SPEC_IN_CRITICAL_PATH;
   8079  1.1  mrg 	}
   8080  1.1  mrg     }
   8081  1.1  mrg   else
   8082  1.1  mrg     spec_info->mask = 0;
   8083  1.1  mrg }
   8084  1.1  mrg 
   8085  1.1  mrg /* If INSN is an appropriate load return its mode.
   8086  1.1  mrg    Return -1 otherwise.  */
   8087  1.1  mrg static int
   8088  1.1  mrg get_mode_no_for_insn (rtx_insn *insn)
   8089  1.1  mrg {
   8090  1.1  mrg   rtx reg, mem, mode_rtx;
   8091  1.1  mrg   int mode_no;
   8092  1.1  mrg   bool extend_p;
   8093  1.1  mrg 
   8094  1.1  mrg   extract_insn_cached (insn);
   8095  1.1  mrg 
   8096  1.1  mrg   /* We use WHICH_ALTERNATIVE only after reload.  This will
   8097  1.1  mrg      guarantee that reload won't touch a speculative insn.  */
   8098  1.1  mrg 
   8099  1.1  mrg   if (recog_data.n_operands != 2)
   8100  1.1  mrg     return -1;
   8101  1.1  mrg 
   8102  1.1  mrg   reg = recog_data.operand[0];
   8103  1.1  mrg   mem = recog_data.operand[1];
   8104  1.1  mrg 
   8105  1.1  mrg   /* We should use MEM's mode since REG's mode in presence of
   8106  1.1  mrg      ZERO_EXTEND will always be DImode.  */
   8107  1.1  mrg   if (get_attr_speculable1 (insn) == SPECULABLE1_YES)
   8108  1.1  mrg     /* Process non-speculative ld.  */
   8109  1.1  mrg     {
   8110  1.1  mrg       if (!reload_completed)
   8111  1.1  mrg 	{
   8112  1.1  mrg 	  /* Do not speculate into regs like ar.lc.  */
   8113  1.1  mrg 	  if (!REG_P (reg) || AR_REGNO_P (REGNO (reg)))
   8114  1.1  mrg 	    return -1;
   8115  1.1  mrg 
   8116  1.1  mrg 	  if (!MEM_P (mem))
   8117  1.1  mrg 	    return -1;
   8118  1.1  mrg 
   8119  1.1  mrg 	  {
   8120  1.1  mrg 	    rtx mem_reg = XEXP (mem, 0);
   8121  1.1  mrg 
   8122  1.1  mrg 	    if (!REG_P (mem_reg))
   8123  1.1  mrg 	      return -1;
   8124  1.1  mrg 	  }
   8125  1.1  mrg 
   8126  1.1  mrg 	  mode_rtx = mem;
   8127  1.1  mrg 	}
   8128  1.1  mrg       else if (get_attr_speculable2 (insn) == SPECULABLE2_YES)
   8129  1.1  mrg 	{
   8130  1.1  mrg 	  gcc_assert (REG_P (reg) && MEM_P (mem));
   8131  1.1  mrg 	  mode_rtx = mem;
   8132  1.1  mrg 	}
   8133  1.1  mrg       else
   8134  1.1  mrg 	return -1;
   8135  1.1  mrg     }
   8136  1.1  mrg   else if (get_attr_data_speculative (insn) == DATA_SPECULATIVE_YES
   8137  1.1  mrg 	   || get_attr_control_speculative (insn) == CONTROL_SPECULATIVE_YES
   8138  1.1  mrg 	   || get_attr_check_load (insn) == CHECK_LOAD_YES)
   8139  1.1  mrg     /* Process speculative ld or ld.c.  */
   8140  1.1  mrg     {
   8141  1.1  mrg       gcc_assert (REG_P (reg) && MEM_P (mem));
   8142  1.1  mrg       mode_rtx = mem;
   8143  1.1  mrg     }
   8144  1.1  mrg   else
   8145  1.1  mrg     {
   8146  1.1  mrg       enum attr_itanium_class attr_class = get_attr_itanium_class (insn);
   8147  1.1  mrg 
   8148  1.1  mrg       if (attr_class == ITANIUM_CLASS_CHK_A
   8149  1.1  mrg 	  || attr_class == ITANIUM_CLASS_CHK_S_I
   8150  1.1  mrg 	  || attr_class == ITANIUM_CLASS_CHK_S_F)
   8151  1.1  mrg 	/* Process chk.  */
   8152  1.1  mrg 	mode_rtx = reg;
   8153  1.1  mrg       else
   8154  1.1  mrg 	return -1;
   8155  1.1  mrg     }
   8156  1.1  mrg 
   8157  1.1  mrg   mode_no = ia64_mode_to_int (GET_MODE (mode_rtx));
   8158  1.1  mrg 
   8159  1.1  mrg   if (mode_no == SPEC_MODE_INVALID)
   8160  1.1  mrg     return -1;
   8161  1.1  mrg 
   8162  1.1  mrg   extend_p = (GET_MODE (reg) != GET_MODE (mode_rtx));
   8163  1.1  mrg 
   8164  1.1  mrg   if (extend_p)
   8165  1.1  mrg     {
   8166  1.1  mrg       if (!(SPEC_MODE_FOR_EXTEND_FIRST <= mode_no
   8167  1.1  mrg 	    && mode_no <= SPEC_MODE_FOR_EXTEND_LAST))
   8168  1.1  mrg 	return -1;
   8169  1.1  mrg 
   8170  1.1  mrg       mode_no += SPEC_GEN_EXTEND_OFFSET;
   8171  1.1  mrg     }
   8172  1.1  mrg 
   8173  1.1  mrg   return mode_no;
   8174  1.1  mrg }
   8175  1.1  mrg 
   8176  1.1  mrg /* If X is an unspec part of a speculative load, return its code.
   8177  1.1  mrg    Return -1 otherwise.  */
   8178  1.1  mrg static int
   8179  1.1  mrg get_spec_unspec_code (const_rtx x)
   8180  1.1  mrg {
   8181  1.1  mrg   if (GET_CODE (x) != UNSPEC)
   8182  1.1  mrg     return -1;
   8183  1.1  mrg 
   8184  1.1  mrg   {
   8185  1.1  mrg     int code;
   8186  1.1  mrg 
   8187  1.1  mrg     code = XINT (x, 1);
   8188  1.1  mrg 
   8189  1.1  mrg     switch (code)
   8190  1.1  mrg       {
   8191  1.1  mrg       case UNSPEC_LDA:
   8192  1.1  mrg       case UNSPEC_LDS:
   8193  1.1  mrg       case UNSPEC_LDS_A:
   8194  1.1  mrg       case UNSPEC_LDSA:
   8195  1.1  mrg 	return code;
   8196  1.1  mrg 
   8197  1.1  mrg       default:
   8198  1.1  mrg 	return -1;
   8199  1.1  mrg       }
   8200  1.1  mrg   }
   8201  1.1  mrg }
   8202  1.1  mrg 
   8203  1.1  mrg /* Implement skip_rtx_p hook.  */
   8204  1.1  mrg static bool
   8205  1.1  mrg ia64_skip_rtx_p (const_rtx x)
   8206  1.1  mrg {
   8207  1.1  mrg   return get_spec_unspec_code (x) != -1;
   8208  1.1  mrg }
   8209  1.1  mrg 
   8210  1.1  mrg /* If INSN is a speculative load, return its UNSPEC code.
   8211  1.1  mrg    Return -1 otherwise.  */
   8212  1.1  mrg static int
   8213  1.1  mrg get_insn_spec_code (const_rtx insn)
   8214  1.1  mrg {
   8215  1.1  mrg   rtx pat, reg, mem;
   8216  1.1  mrg 
   8217  1.1  mrg   pat = PATTERN (insn);
   8218  1.1  mrg 
   8219  1.1  mrg   if (GET_CODE (pat) == COND_EXEC)
   8220  1.1  mrg     pat = COND_EXEC_CODE (pat);
   8221  1.1  mrg 
   8222  1.1  mrg   if (GET_CODE (pat) != SET)
   8223  1.1  mrg     return -1;
   8224  1.1  mrg 
   8225  1.1  mrg   reg = SET_DEST (pat);
   8226  1.1  mrg   if (!REG_P (reg))
   8227  1.1  mrg     return -1;
   8228  1.1  mrg 
   8229  1.1  mrg   mem = SET_SRC (pat);
   8230  1.1  mrg   if (GET_CODE (mem) == ZERO_EXTEND)
   8231  1.1  mrg     mem = XEXP (mem, 0);
   8232  1.1  mrg 
   8233  1.1  mrg   return get_spec_unspec_code (mem);
   8234  1.1  mrg }
   8235  1.1  mrg 
   8236  1.1  mrg /* If INSN is a speculative load, return a ds with the speculation types.
   8237  1.1  mrg    Otherwise [if INSN is a normal instruction] return 0.  */
   8238  1.1  mrg static ds_t
   8239  1.1  mrg ia64_get_insn_spec_ds (rtx_insn *insn)
   8240  1.1  mrg {
   8241  1.1  mrg   int code = get_insn_spec_code (insn);
   8242  1.1  mrg 
   8243  1.1  mrg   switch (code)
   8244  1.1  mrg     {
   8245  1.1  mrg     case UNSPEC_LDA:
   8246  1.1  mrg       return BEGIN_DATA;
   8247  1.1  mrg 
   8248  1.1  mrg     case UNSPEC_LDS:
   8249  1.1  mrg     case UNSPEC_LDS_A:
   8250  1.1  mrg       return BEGIN_CONTROL;
   8251  1.1  mrg 
   8252  1.1  mrg     case UNSPEC_LDSA:
   8253  1.1  mrg       return BEGIN_DATA | BEGIN_CONTROL;
   8254  1.1  mrg 
   8255  1.1  mrg     default:
   8256  1.1  mrg       return 0;
   8257  1.1  mrg     }
   8258  1.1  mrg }
   8259  1.1  mrg 
   8260  1.1  mrg /* If INSN is a speculative load return a ds with the speculation types that
   8261  1.1  mrg    will be checked.
   8262  1.1  mrg    Otherwise [if INSN is a normal instruction] return 0.  */
   8263  1.1  mrg static ds_t
   8264  1.1  mrg ia64_get_insn_checked_ds (rtx_insn *insn)
   8265  1.1  mrg {
   8266  1.1  mrg   int code = get_insn_spec_code (insn);
   8267  1.1  mrg 
   8268  1.1  mrg   switch (code)
   8269  1.1  mrg     {
   8270  1.1  mrg     case UNSPEC_LDA:
   8271  1.1  mrg       return BEGIN_DATA | BEGIN_CONTROL;
   8272  1.1  mrg 
   8273  1.1  mrg     case UNSPEC_LDS:
   8274  1.1  mrg       return BEGIN_CONTROL;
   8275  1.1  mrg 
   8276  1.1  mrg     case UNSPEC_LDS_A:
   8277  1.1  mrg     case UNSPEC_LDSA:
   8278  1.1  mrg       return BEGIN_DATA | BEGIN_CONTROL;
   8279  1.1  mrg 
   8280  1.1  mrg     default:
   8281  1.1  mrg       return 0;
   8282  1.1  mrg     }
   8283  1.1  mrg }
   8284  1.1  mrg 
   8285  1.1  mrg /* If GEN_P is true, calculate the index of needed speculation check and return
   8286  1.1  mrg    speculative pattern for INSN with speculative mode TS, machine mode
   8287  1.1  mrg    MODE_NO and with ZERO_EXTEND (if EXTEND_P is true).
   8288  1.1  mrg    If GEN_P is false, just calculate the index of needed speculation check.  */
   8289  1.1  mrg static rtx
   8290  1.1  mrg ia64_gen_spec_load (rtx insn, ds_t ts, int mode_no)
   8291  1.1  mrg {
   8292  1.1  mrg   rtx pat, new_pat;
   8293  1.1  mrg   gen_func_t gen_load;
   8294  1.1  mrg 
   8295  1.1  mrg   gen_load = get_spec_load_gen_function (ts, mode_no);
   8296  1.1  mrg 
   8297  1.1  mrg   new_pat = gen_load (copy_rtx (recog_data.operand[0]),
   8298  1.1  mrg 		      copy_rtx (recog_data.operand[1]));
   8299  1.1  mrg 
   8300  1.1  mrg   pat = PATTERN (insn);
   8301  1.1  mrg   if (GET_CODE (pat) == COND_EXEC)
   8302  1.1  mrg     new_pat = gen_rtx_COND_EXEC (VOIDmode, copy_rtx (COND_EXEC_TEST (pat)),
   8303  1.1  mrg 				 new_pat);
   8304  1.1  mrg 
   8305  1.1  mrg   return new_pat;
   8306  1.1  mrg }
   8307  1.1  mrg 
   8308  1.1  mrg static bool
   8309  1.1  mrg insn_can_be_in_speculative_p (rtx insn ATTRIBUTE_UNUSED,
   8310  1.1  mrg 			      ds_t ds ATTRIBUTE_UNUSED)
   8311  1.1  mrg {
   8312  1.1  mrg   return false;
   8313  1.1  mrg }
   8314  1.1  mrg 
   8315  1.1  mrg /* Implement targetm.sched.speculate_insn hook.
   8316  1.1  mrg    Check if the INSN can be TS speculative.
   8317  1.1  mrg    If 'no' - return -1.
   8318  1.1  mrg    If 'yes' - generate speculative pattern in the NEW_PAT and return 1.
   8319  1.1  mrg    If current pattern of the INSN already provides TS speculation,
   8320  1.1  mrg    return 0.  */
   8321  1.1  mrg static int
   8322  1.1  mrg ia64_speculate_insn (rtx_insn *insn, ds_t ts, rtx *new_pat)
   8323  1.1  mrg {
   8324  1.1  mrg   int mode_no;
   8325  1.1  mrg   int res;
   8326  1.1  mrg 
   8327  1.1  mrg   gcc_assert (!(ts & ~SPECULATIVE));
   8328  1.1  mrg 
   8329  1.1  mrg   if (ia64_spec_check_p (insn))
   8330  1.1  mrg     return -1;
   8331  1.1  mrg 
   8332  1.1  mrg   if ((ts & BE_IN_SPEC)
   8333  1.1  mrg       && !insn_can_be_in_speculative_p (insn, ts))
   8334  1.1  mrg     return -1;
   8335  1.1  mrg 
   8336  1.1  mrg   mode_no = get_mode_no_for_insn (insn);
   8337  1.1  mrg 
   8338  1.1  mrg   if (mode_no != SPEC_MODE_INVALID)
   8339  1.1  mrg     {
   8340  1.1  mrg       if (ia64_get_insn_spec_ds (insn) == ds_get_speculation_types (ts))
   8341  1.1  mrg 	res = 0;
   8342  1.1  mrg       else
   8343  1.1  mrg 	{
   8344  1.1  mrg 	  res = 1;
   8345  1.1  mrg 	  *new_pat = ia64_gen_spec_load (insn, ts, mode_no);
   8346  1.1  mrg 	}
   8347  1.1  mrg     }
   8348  1.1  mrg   else
   8349  1.1  mrg     res = -1;
   8350  1.1  mrg 
   8351  1.1  mrg   return res;
   8352  1.1  mrg }
   8353  1.1  mrg 
   8354  1.1  mrg /* Return a function that will generate a check for speculation TS with mode
   8355  1.1  mrg    MODE_NO.
   8356  1.1  mrg    If simple check is needed, pass true for SIMPLE_CHECK_P.
   8357  1.1  mrg    If clearing check is needed, pass true for CLEARING_CHECK_P.  */
   8358  1.1  mrg static gen_func_t
   8359  1.1  mrg get_spec_check_gen_function (ds_t ts, int mode_no,
   8360  1.1  mrg 			     bool simple_check_p, bool clearing_check_p)
   8361  1.1  mrg {
   8362  1.1  mrg   static gen_func_t gen_ld_c_clr[] = {
   8363  1.1  mrg     gen_movbi_clr,
   8364  1.1  mrg     gen_movqi_clr,
   8365  1.1  mrg     gen_movhi_clr,
   8366  1.1  mrg     gen_movsi_clr,
   8367  1.1  mrg     gen_movdi_clr,
   8368  1.1  mrg     gen_movsf_clr,
   8369  1.1  mrg     gen_movdf_clr,
   8370  1.1  mrg     gen_movxf_clr,
   8371  1.1  mrg     gen_movti_clr,
   8372  1.1  mrg     gen_zero_extendqidi2_clr,
   8373  1.1  mrg     gen_zero_extendhidi2_clr,
   8374  1.1  mrg     gen_zero_extendsidi2_clr,
   8375  1.1  mrg   };
   8376  1.1  mrg   static gen_func_t gen_ld_c_nc[] = {
   8377  1.1  mrg     gen_movbi_nc,
   8378  1.1  mrg     gen_movqi_nc,
   8379  1.1  mrg     gen_movhi_nc,
   8380  1.1  mrg     gen_movsi_nc,
   8381  1.1  mrg     gen_movdi_nc,
   8382  1.1  mrg     gen_movsf_nc,
   8383  1.1  mrg     gen_movdf_nc,
   8384  1.1  mrg     gen_movxf_nc,
   8385  1.1  mrg     gen_movti_nc,
   8386  1.1  mrg     gen_zero_extendqidi2_nc,
   8387  1.1  mrg     gen_zero_extendhidi2_nc,
   8388  1.1  mrg     gen_zero_extendsidi2_nc,
   8389  1.1  mrg   };
   8390  1.1  mrg   static gen_func_t gen_chk_a_clr[] = {
   8391  1.1  mrg     gen_advanced_load_check_clr_bi,
   8392  1.1  mrg     gen_advanced_load_check_clr_qi,
   8393  1.1  mrg     gen_advanced_load_check_clr_hi,
   8394  1.1  mrg     gen_advanced_load_check_clr_si,
   8395  1.1  mrg     gen_advanced_load_check_clr_di,
   8396  1.1  mrg     gen_advanced_load_check_clr_sf,
   8397  1.1  mrg     gen_advanced_load_check_clr_df,
   8398  1.1  mrg     gen_advanced_load_check_clr_xf,
   8399  1.1  mrg     gen_advanced_load_check_clr_ti,
   8400  1.1  mrg     gen_advanced_load_check_clr_di,
   8401  1.1  mrg     gen_advanced_load_check_clr_di,
   8402  1.1  mrg     gen_advanced_load_check_clr_di,
   8403  1.1  mrg   };
   8404  1.1  mrg   static gen_func_t gen_chk_a_nc[] = {
   8405  1.1  mrg     gen_advanced_load_check_nc_bi,
   8406  1.1  mrg     gen_advanced_load_check_nc_qi,
   8407  1.1  mrg     gen_advanced_load_check_nc_hi,
   8408  1.1  mrg     gen_advanced_load_check_nc_si,
   8409  1.1  mrg     gen_advanced_load_check_nc_di,
   8410  1.1  mrg     gen_advanced_load_check_nc_sf,
   8411  1.1  mrg     gen_advanced_load_check_nc_df,
   8412  1.1  mrg     gen_advanced_load_check_nc_xf,
   8413  1.1  mrg     gen_advanced_load_check_nc_ti,
   8414  1.1  mrg     gen_advanced_load_check_nc_di,
   8415  1.1  mrg     gen_advanced_load_check_nc_di,
   8416  1.1  mrg     gen_advanced_load_check_nc_di,
   8417  1.1  mrg   };
   8418  1.1  mrg   static gen_func_t gen_chk_s[] = {
   8419  1.1  mrg     gen_speculation_check_bi,
   8420  1.1  mrg     gen_speculation_check_qi,
   8421  1.1  mrg     gen_speculation_check_hi,
   8422  1.1  mrg     gen_speculation_check_si,
   8423  1.1  mrg     gen_speculation_check_di,
   8424  1.1  mrg     gen_speculation_check_sf,
   8425  1.1  mrg     gen_speculation_check_df,
   8426  1.1  mrg     gen_speculation_check_xf,
   8427  1.1  mrg     gen_speculation_check_ti,
   8428  1.1  mrg     gen_speculation_check_di,
   8429  1.1  mrg     gen_speculation_check_di,
   8430  1.1  mrg     gen_speculation_check_di,
   8431  1.1  mrg   };
   8432  1.1  mrg 
   8433  1.1  mrg   gen_func_t *gen_check;
   8434  1.1  mrg 
   8435  1.1  mrg   if (ts & BEGIN_DATA)
   8436  1.1  mrg     {
   8437  1.1  mrg       /* We don't need recovery because even if this is ld.sa
   8438  1.1  mrg 	 ALAT entry will be allocated only if NAT bit is set to zero.
   8439  1.1  mrg 	 So it is enough to use ld.c here.  */
   8440  1.1  mrg 
   8441  1.1  mrg       if (simple_check_p)
   8442  1.1  mrg 	{
   8443  1.1  mrg 	  gcc_assert (mflag_sched_spec_ldc);
   8444  1.1  mrg 
   8445  1.1  mrg 	  if (clearing_check_p)
   8446  1.1  mrg 	    gen_check = gen_ld_c_clr;
   8447  1.1  mrg 	  else
   8448  1.1  mrg 	    gen_check = gen_ld_c_nc;
   8449  1.1  mrg 	}
   8450  1.1  mrg       else
   8451  1.1  mrg 	{
   8452  1.1  mrg 	  if (clearing_check_p)
   8453  1.1  mrg 	    gen_check = gen_chk_a_clr;
   8454  1.1  mrg 	  else
   8455  1.1  mrg 	    gen_check = gen_chk_a_nc;
   8456  1.1  mrg 	}
   8457  1.1  mrg     }
   8458  1.1  mrg   else if (ts & BEGIN_CONTROL)
   8459  1.1  mrg     {
   8460  1.1  mrg       if (simple_check_p)
   8461  1.1  mrg 	/* We might want to use ld.sa -> ld.c instead of
   8462  1.1  mrg 	   ld.s -> chk.s.  */
   8463  1.1  mrg 	{
   8464  1.1  mrg 	  gcc_assert (!ia64_needs_block_p (ts));
   8465  1.1  mrg 
   8466  1.1  mrg 	  if (clearing_check_p)
   8467  1.1  mrg 	    gen_check = gen_ld_c_clr;
   8468  1.1  mrg 	  else
   8469  1.1  mrg 	    gen_check = gen_ld_c_nc;
   8470  1.1  mrg 	}
   8471  1.1  mrg       else
   8472  1.1  mrg 	{
   8473  1.1  mrg 	  gen_check = gen_chk_s;
   8474  1.1  mrg 	}
   8475  1.1  mrg     }
   8476  1.1  mrg   else
   8477  1.1  mrg     gcc_unreachable ();
   8478  1.1  mrg 
   8479  1.1  mrg   gcc_assert (mode_no >= 0);
   8480  1.1  mrg   return gen_check[mode_no];
   8481  1.1  mrg }
   8482  1.1  mrg 
   8483  1.1  mrg /* Return nonzero, if INSN needs branchy recovery check.  */
   8484  1.1  mrg static bool
   8485  1.1  mrg ia64_needs_block_p (ds_t ts)
   8486  1.1  mrg {
   8487  1.1  mrg   if (ts & BEGIN_DATA)
   8488  1.1  mrg     return !mflag_sched_spec_ldc;
   8489  1.1  mrg 
   8490  1.1  mrg   gcc_assert ((ts & BEGIN_CONTROL) != 0);
   8491  1.1  mrg 
   8492  1.1  mrg   return !(mflag_sched_spec_control_ldc && mflag_sched_spec_ldc);
   8493  1.1  mrg }
   8494  1.1  mrg 
   8495  1.1  mrg /* Generate (or regenerate) a recovery check for INSN.  */
   8496  1.1  mrg static rtx
   8497  1.1  mrg ia64_gen_spec_check (rtx_insn *insn, rtx_insn *label, ds_t ds)
   8498  1.1  mrg {
   8499  1.1  mrg   rtx op1, pat, check_pat;
   8500  1.1  mrg   gen_func_t gen_check;
   8501  1.1  mrg   int mode_no;
   8502  1.1  mrg 
   8503  1.1  mrg   mode_no = get_mode_no_for_insn (insn);
   8504  1.1  mrg   gcc_assert (mode_no >= 0);
   8505  1.1  mrg 
   8506  1.1  mrg   if (label)
   8507  1.1  mrg     op1 = label;
   8508  1.1  mrg   else
   8509  1.1  mrg     {
   8510  1.1  mrg       gcc_assert (!ia64_needs_block_p (ds));
   8511  1.1  mrg       op1 = copy_rtx (recog_data.operand[1]);
   8512  1.1  mrg     }
   8513  1.1  mrg 
   8514  1.1  mrg   gen_check = get_spec_check_gen_function (ds, mode_no, label == NULL_RTX,
   8515  1.1  mrg 					   true);
   8516  1.1  mrg 
   8517  1.1  mrg   check_pat = gen_check (copy_rtx (recog_data.operand[0]), op1);
   8518  1.1  mrg 
   8519  1.1  mrg   pat = PATTERN (insn);
   8520  1.1  mrg   if (GET_CODE (pat) == COND_EXEC)
   8521  1.1  mrg     check_pat = gen_rtx_COND_EXEC (VOIDmode, copy_rtx (COND_EXEC_TEST (pat)),
   8522  1.1  mrg 				   check_pat);
   8523  1.1  mrg 
   8524  1.1  mrg   return check_pat;
   8525  1.1  mrg }
   8526  1.1  mrg 
   8527  1.1  mrg /* Return nonzero, if X is branchy recovery check.  */
   8528  1.1  mrg static int
   8529  1.1  mrg ia64_spec_check_p (rtx x)
   8530  1.1  mrg {
   8531  1.1  mrg   x = PATTERN (x);
   8532  1.1  mrg   if (GET_CODE (x) == COND_EXEC)
   8533  1.1  mrg     x = COND_EXEC_CODE (x);
   8534  1.1  mrg   if (GET_CODE (x) == SET)
   8535  1.1  mrg     return ia64_spec_check_src_p (SET_SRC (x));
   8536  1.1  mrg   return 0;
   8537  1.1  mrg }
   8538  1.1  mrg 
   8539  1.1  mrg /* Return nonzero, if SRC belongs to recovery check.  */
   8540  1.1  mrg static int
   8541  1.1  mrg ia64_spec_check_src_p (rtx src)
   8542  1.1  mrg {
   8543  1.1  mrg   if (GET_CODE (src) == IF_THEN_ELSE)
   8544  1.1  mrg     {
   8545  1.1  mrg       rtx t;
   8546  1.1  mrg 
   8547  1.1  mrg       t = XEXP (src, 0);
   8548  1.1  mrg       if (GET_CODE (t) == NE)
   8549  1.1  mrg 	{
   8550  1.1  mrg 	  t = XEXP (t, 0);
   8551  1.1  mrg 
   8552  1.1  mrg 	  if (GET_CODE (t) == UNSPEC)
   8553  1.1  mrg 	    {
   8554  1.1  mrg 	      int code;
   8555  1.1  mrg 
   8556  1.1  mrg 	      code = XINT (t, 1);
   8557  1.1  mrg 
   8558  1.1  mrg 	      if (code == UNSPEC_LDCCLR
   8559  1.1  mrg 		  || code == UNSPEC_LDCNC
   8560  1.1  mrg 		  || code == UNSPEC_CHKACLR
   8561  1.1  mrg 		  || code == UNSPEC_CHKANC
   8562  1.1  mrg 		  || code == UNSPEC_CHKS)
   8563  1.1  mrg 		{
   8564  1.1  mrg 		  gcc_assert (code != 0);
   8565  1.1  mrg 		  return code;
   8566  1.1  mrg 		}
   8567  1.1  mrg 	    }
   8568  1.1  mrg 	}
   8569  1.1  mrg     }
   8570  1.1  mrg   return 0;
   8571  1.1  mrg }
   8572  1.1  mrg 
   8573  1.1  mrg 
   8575  1.1  mrg /* The following page contains abstract data `bundle states' which are
   8576  1.1  mrg    used for bundling insns (inserting nops and template generation).  */
   8577  1.1  mrg 
   8578  1.1  mrg /* The following describes state of insn bundling.  */
   8579  1.1  mrg 
   8580  1.1  mrg struct bundle_state
   8581  1.1  mrg {
   8582  1.1  mrg   /* Unique bundle state number to identify them in the debugging
   8583  1.1  mrg      output  */
   8584  1.1  mrg   int unique_num;
   8585  1.1  mrg   rtx_insn *insn; /* corresponding insn, NULL for the 1st and the last state  */
   8586  1.1  mrg   /* number nops before and after the insn  */
   8587  1.1  mrg   short before_nops_num, after_nops_num;
   8588  1.1  mrg   int insn_num; /* insn number (0 - for initial state, 1 - for the 1st
   8589  1.1  mrg                    insn */
   8590  1.1  mrg   int cost;     /* cost of the state in cycles */
   8591  1.1  mrg   int accumulated_insns_num; /* number of all previous insns including
   8592  1.1  mrg 				nops.  L is considered as 2 insns */
   8593  1.1  mrg   int branch_deviation; /* deviation of previous branches from 3rd slots  */
   8594  1.1  mrg   int middle_bundle_stops; /* number of stop bits in the middle of bundles */
   8595  1.1  mrg   struct bundle_state *next;  /* next state with the same insn_num  */
   8596  1.1  mrg   struct bundle_state *originator; /* originator (previous insn state)  */
   8597  1.1  mrg   /* All bundle states are in the following chain.  */
   8598  1.1  mrg   struct bundle_state *allocated_states_chain;
   8599  1.1  mrg   /* The DFA State after issuing the insn and the nops.  */
   8600  1.1  mrg   state_t dfa_state;
   8601  1.1  mrg };
   8602  1.1  mrg 
   8603  1.1  mrg /* The following is map insn number to the corresponding bundle state.  */
   8604  1.1  mrg 
   8605  1.1  mrg static struct bundle_state **index_to_bundle_states;
   8606  1.1  mrg 
   8607  1.1  mrg /* The unique number of next bundle state.  */
   8608  1.1  mrg 
   8609  1.1  mrg static int bundle_states_num;
   8610  1.1  mrg 
   8611  1.1  mrg /* All allocated bundle states are in the following chain.  */
   8612  1.1  mrg 
   8613  1.1  mrg static struct bundle_state *allocated_bundle_states_chain;
   8614  1.1  mrg 
   8615  1.1  mrg /* All allocated but not used bundle states are in the following
   8616  1.1  mrg    chain.  */
   8617  1.1  mrg 
   8618  1.1  mrg static struct bundle_state *free_bundle_state_chain;
   8619  1.1  mrg 
   8620  1.1  mrg 
   8621  1.1  mrg /* The following function returns a free bundle state.  */
   8622  1.1  mrg 
   8623  1.1  mrg static struct bundle_state *
   8624  1.1  mrg get_free_bundle_state (void)
   8625  1.1  mrg {
   8626  1.1  mrg   struct bundle_state *result;
   8627  1.1  mrg 
   8628  1.1  mrg   if (free_bundle_state_chain != NULL)
   8629  1.1  mrg     {
   8630  1.1  mrg       result = free_bundle_state_chain;
   8631  1.1  mrg       free_bundle_state_chain = result->next;
   8632  1.1  mrg     }
   8633  1.1  mrg   else
   8634  1.1  mrg     {
   8635  1.1  mrg       result = XNEW (struct bundle_state);
   8636  1.1  mrg       result->dfa_state = xmalloc (dfa_state_size);
   8637  1.1  mrg       result->allocated_states_chain = allocated_bundle_states_chain;
   8638  1.1  mrg       allocated_bundle_states_chain = result;
   8639  1.1  mrg     }
   8640  1.1  mrg   result->unique_num = bundle_states_num++;
   8641  1.1  mrg   return result;
   8642  1.1  mrg 
   8643  1.1  mrg }
   8644  1.1  mrg 
   8645  1.1  mrg /* The following function frees given bundle state.  */
   8646  1.1  mrg 
   8647  1.1  mrg static void
   8648  1.1  mrg free_bundle_state (struct bundle_state *state)
   8649  1.1  mrg {
   8650  1.1  mrg   state->next = free_bundle_state_chain;
   8651  1.1  mrg   free_bundle_state_chain = state;
   8652  1.1  mrg }
   8653  1.1  mrg 
   8654  1.1  mrg /* Start work with abstract data `bundle states'.  */
   8655  1.1  mrg 
   8656  1.1  mrg static void
   8657  1.1  mrg initiate_bundle_states (void)
   8658  1.1  mrg {
   8659  1.1  mrg   bundle_states_num = 0;
   8660  1.1  mrg   free_bundle_state_chain = NULL;
   8661  1.1  mrg   allocated_bundle_states_chain = NULL;
   8662  1.1  mrg }
   8663  1.1  mrg 
   8664  1.1  mrg /* Finish work with abstract data `bundle states'.  */
   8665  1.1  mrg 
   8666  1.1  mrg static void
   8667  1.1  mrg finish_bundle_states (void)
   8668  1.1  mrg {
   8669  1.1  mrg   struct bundle_state *curr_state, *next_state;
   8670  1.1  mrg 
   8671  1.1  mrg   for (curr_state = allocated_bundle_states_chain;
   8672  1.1  mrg        curr_state != NULL;
   8673  1.1  mrg        curr_state = next_state)
   8674  1.1  mrg     {
   8675  1.1  mrg       next_state = curr_state->allocated_states_chain;
   8676  1.1  mrg       free (curr_state->dfa_state);
   8677  1.1  mrg       free (curr_state);
   8678  1.1  mrg     }
   8679  1.1  mrg }
   8680  1.1  mrg 
   8681  1.1  mrg /* Hashtable helpers.  */
   8682  1.1  mrg 
   8683  1.1  mrg struct bundle_state_hasher : nofree_ptr_hash <bundle_state>
   8684  1.1  mrg {
   8685  1.1  mrg   static inline hashval_t hash (const bundle_state *);
   8686  1.1  mrg   static inline bool equal (const bundle_state *, const bundle_state *);
   8687  1.1  mrg };
   8688  1.1  mrg 
   8689  1.1  mrg /* The function returns hash of BUNDLE_STATE.  */
   8690  1.1  mrg 
   8691  1.1  mrg inline hashval_t
   8692  1.1  mrg bundle_state_hasher::hash (const bundle_state *state)
   8693  1.1  mrg {
   8694  1.1  mrg   unsigned result, i;
   8695  1.1  mrg 
   8696  1.1  mrg   for (result = i = 0; i < dfa_state_size; i++)
   8697  1.1  mrg     result += (((unsigned char *) state->dfa_state) [i]
   8698  1.1  mrg 	       << ((i % CHAR_BIT) * 3 + CHAR_BIT));
   8699  1.1  mrg   return result + state->insn_num;
   8700  1.1  mrg }
   8701  1.1  mrg 
   8702  1.1  mrg /* The function returns nonzero if the bundle state keys are equal.  */
   8703  1.1  mrg 
   8704  1.1  mrg inline bool
   8705  1.1  mrg bundle_state_hasher::equal (const bundle_state *state1,
   8706  1.1  mrg 			    const bundle_state *state2)
   8707  1.1  mrg {
   8708  1.1  mrg   return (state1->insn_num == state2->insn_num
   8709  1.1  mrg 	  && memcmp (state1->dfa_state, state2->dfa_state,
   8710  1.1  mrg 		     dfa_state_size) == 0);
   8711  1.1  mrg }
   8712  1.1  mrg 
   8713  1.1  mrg /* Hash table of the bundle states.  The key is dfa_state and insn_num
   8714  1.1  mrg    of the bundle states.  */
   8715  1.1  mrg 
   8716  1.1  mrg static hash_table<bundle_state_hasher> *bundle_state_table;
   8717  1.1  mrg 
   8718  1.1  mrg /* The function inserts the BUNDLE_STATE into the hash table.  The
   8719  1.1  mrg    function returns nonzero if the bundle has been inserted into the
   8720  1.1  mrg    table.  The table contains the best bundle state with given key.  */
   8721  1.1  mrg 
   8722  1.1  mrg static int
   8723  1.1  mrg insert_bundle_state (struct bundle_state *bundle_state)
   8724  1.1  mrg {
   8725  1.1  mrg   struct bundle_state **entry_ptr;
   8726  1.1  mrg 
   8727  1.1  mrg   entry_ptr = bundle_state_table->find_slot (bundle_state, INSERT);
   8728  1.1  mrg   if (*entry_ptr == NULL)
   8729  1.1  mrg     {
   8730  1.1  mrg       bundle_state->next = index_to_bundle_states [bundle_state->insn_num];
   8731  1.1  mrg       index_to_bundle_states [bundle_state->insn_num] = bundle_state;
   8732  1.1  mrg       *entry_ptr = bundle_state;
   8733  1.1  mrg       return TRUE;
   8734  1.1  mrg     }
   8735  1.1  mrg   else if (bundle_state->cost < (*entry_ptr)->cost
   8736  1.1  mrg 	   || (bundle_state->cost == (*entry_ptr)->cost
   8737  1.1  mrg 	       && ((*entry_ptr)->accumulated_insns_num
   8738  1.1  mrg 		   > bundle_state->accumulated_insns_num
   8739  1.1  mrg 		   || ((*entry_ptr)->accumulated_insns_num
   8740  1.1  mrg 		       == bundle_state->accumulated_insns_num
   8741  1.1  mrg 		       && ((*entry_ptr)->branch_deviation
   8742  1.1  mrg 			   > bundle_state->branch_deviation
   8743  1.1  mrg 			   || ((*entry_ptr)->branch_deviation
   8744  1.1  mrg 			       == bundle_state->branch_deviation
   8745  1.1  mrg 			       && (*entry_ptr)->middle_bundle_stops
   8746  1.1  mrg 			       > bundle_state->middle_bundle_stops))))))
   8747  1.1  mrg 
   8748  1.1  mrg     {
   8749  1.1  mrg       struct bundle_state temp;
   8750  1.1  mrg 
   8751  1.1  mrg       temp = **entry_ptr;
   8752  1.1  mrg       **entry_ptr = *bundle_state;
   8753  1.1  mrg       (*entry_ptr)->next = temp.next;
   8754  1.1  mrg       *bundle_state = temp;
   8755  1.1  mrg     }
   8756  1.1  mrg   return FALSE;
   8757  1.1  mrg }
   8758  1.1  mrg 
   8759  1.1  mrg /* Start work with the hash table.  */
   8760  1.1  mrg 
   8761  1.1  mrg static void
   8762  1.1  mrg initiate_bundle_state_table (void)
   8763  1.1  mrg {
   8764  1.1  mrg   bundle_state_table = new hash_table<bundle_state_hasher> (50);
   8765  1.1  mrg }
   8766  1.1  mrg 
   8767  1.1  mrg /* Finish work with the hash table.  */
   8768  1.1  mrg 
   8769  1.1  mrg static void
   8770  1.1  mrg finish_bundle_state_table (void)
   8771  1.1  mrg {
   8772  1.1  mrg   delete bundle_state_table;
   8773  1.1  mrg   bundle_state_table = NULL;
   8774  1.1  mrg }
   8775  1.1  mrg 
   8776  1.1  mrg 
   8777  1.1  mrg 
   8779  1.1  mrg /* The following variable is a insn `nop' used to check bundle states
   8780  1.1  mrg    with different number of inserted nops.  */
   8781  1.1  mrg 
   8782  1.1  mrg static rtx_insn *ia64_nop;
   8783  1.1  mrg 
   8784  1.1  mrg /* The following function tries to issue NOPS_NUM nops for the current
   8785  1.1  mrg    state without advancing processor cycle.  If it failed, the
   8786  1.1  mrg    function returns FALSE and frees the current state.  */
   8787  1.1  mrg 
   8788  1.1  mrg static int
   8789  1.1  mrg try_issue_nops (struct bundle_state *curr_state, int nops_num)
   8790  1.1  mrg {
   8791  1.1  mrg   int i;
   8792  1.1  mrg 
   8793  1.1  mrg   for (i = 0; i < nops_num; i++)
   8794  1.1  mrg     if (state_transition (curr_state->dfa_state, ia64_nop) >= 0)
   8795  1.1  mrg       {
   8796  1.1  mrg 	free_bundle_state (curr_state);
   8797  1.1  mrg 	return FALSE;
   8798  1.1  mrg       }
   8799  1.1  mrg   return TRUE;
   8800  1.1  mrg }
   8801  1.1  mrg 
   8802  1.1  mrg /* The following function tries to issue INSN for the current
   8803  1.1  mrg    state without advancing processor cycle.  If it failed, the
   8804  1.1  mrg    function returns FALSE and frees the current state.  */
   8805  1.1  mrg 
   8806  1.1  mrg static int
   8807  1.1  mrg try_issue_insn (struct bundle_state *curr_state, rtx insn)
   8808  1.1  mrg {
   8809  1.1  mrg   if (insn && state_transition (curr_state->dfa_state, insn) >= 0)
   8810  1.1  mrg     {
   8811  1.1  mrg       free_bundle_state (curr_state);
   8812  1.1  mrg       return FALSE;
   8813  1.1  mrg     }
   8814  1.1  mrg   return TRUE;
   8815  1.1  mrg }
   8816  1.1  mrg 
   8817  1.1  mrg /* The following function tries to issue BEFORE_NOPS_NUM nops and INSN
   8818  1.1  mrg    starting with ORIGINATOR without advancing processor cycle.  If
   8819  1.1  mrg    TRY_BUNDLE_END_P is TRUE, the function also/only (if
   8820  1.1  mrg    ONLY_BUNDLE_END_P is TRUE) tries to issue nops to fill all bundle.
   8821  1.1  mrg    If it was successful, the function creates new bundle state and
   8822  1.1  mrg    insert into the hash table and into `index_to_bundle_states'.  */
   8823  1.1  mrg 
   8824  1.1  mrg static void
   8825  1.1  mrg issue_nops_and_insn (struct bundle_state *originator, int before_nops_num,
   8826  1.1  mrg 		     rtx_insn *insn, int try_bundle_end_p,
   8827  1.1  mrg 		     int only_bundle_end_p)
   8828  1.1  mrg {
   8829  1.1  mrg   struct bundle_state *curr_state;
   8830  1.1  mrg 
   8831  1.1  mrg   curr_state = get_free_bundle_state ();
   8832  1.1  mrg   memcpy (curr_state->dfa_state, originator->dfa_state, dfa_state_size);
   8833  1.1  mrg   curr_state->insn = insn;
   8834  1.1  mrg   curr_state->insn_num = originator->insn_num + 1;
   8835  1.1  mrg   curr_state->cost = originator->cost;
   8836  1.1  mrg   curr_state->originator = originator;
   8837  1.1  mrg   curr_state->before_nops_num = before_nops_num;
   8838  1.1  mrg   curr_state->after_nops_num = 0;
   8839  1.1  mrg   curr_state->accumulated_insns_num
   8840  1.1  mrg     = originator->accumulated_insns_num + before_nops_num;
   8841  1.1  mrg   curr_state->branch_deviation = originator->branch_deviation;
   8842  1.1  mrg   curr_state->middle_bundle_stops = originator->middle_bundle_stops;
   8843  1.1  mrg   gcc_assert (insn);
   8844  1.1  mrg   if (INSN_CODE (insn) == CODE_FOR_insn_group_barrier)
   8845  1.1  mrg     {
   8846  1.1  mrg       gcc_assert (GET_MODE (insn) != TImode);
   8847  1.1  mrg       if (!try_issue_nops (curr_state, before_nops_num))
   8848  1.1  mrg 	return;
   8849  1.1  mrg       if (!try_issue_insn (curr_state, insn))
   8850  1.1  mrg 	return;
   8851  1.1  mrg       memcpy (temp_dfa_state, curr_state->dfa_state, dfa_state_size);
   8852  1.1  mrg       if (curr_state->accumulated_insns_num % 3 != 0)
   8853  1.1  mrg 	curr_state->middle_bundle_stops++;
   8854  1.1  mrg       if (state_transition (temp_dfa_state, dfa_pre_cycle_insn) >= 0
   8855  1.1  mrg 	  && curr_state->accumulated_insns_num % 3 != 0)
   8856  1.1  mrg 	{
   8857  1.1  mrg 	  free_bundle_state (curr_state);
   8858  1.1  mrg 	  return;
   8859  1.1  mrg 	}
   8860  1.1  mrg     }
   8861  1.1  mrg   else if (GET_MODE (insn) != TImode)
   8862  1.1  mrg     {
   8863  1.1  mrg       if (!try_issue_nops (curr_state, before_nops_num))
   8864  1.1  mrg 	return;
   8865  1.1  mrg       if (!try_issue_insn (curr_state, insn))
   8866  1.1  mrg 	return;
   8867  1.1  mrg       curr_state->accumulated_insns_num++;
   8868  1.1  mrg       gcc_assert (!unknown_for_bundling_p (insn));
   8869  1.1  mrg 
   8870  1.1  mrg       if (ia64_safe_type (insn) == TYPE_L)
   8871  1.1  mrg 	curr_state->accumulated_insns_num++;
   8872  1.1  mrg     }
   8873  1.1  mrg   else
   8874  1.1  mrg     {
   8875  1.1  mrg       /* If this is an insn that must be first in a group, then don't allow
   8876  1.1  mrg 	 nops to be emitted before it.  Currently, alloc is the only such
   8877  1.1  mrg 	 supported instruction.  */
   8878  1.1  mrg       /* ??? The bundling automatons should handle this for us, but they do
   8879  1.1  mrg 	 not yet have support for the first_insn attribute.  */
   8880  1.1  mrg       if (before_nops_num > 0 && get_attr_first_insn (insn) == FIRST_INSN_YES)
   8881  1.1  mrg 	{
   8882  1.1  mrg 	  free_bundle_state (curr_state);
   8883  1.1  mrg 	  return;
   8884  1.1  mrg 	}
   8885  1.1  mrg 
   8886  1.1  mrg       state_transition (curr_state->dfa_state, dfa_pre_cycle_insn);
   8887  1.1  mrg       state_transition (curr_state->dfa_state, NULL);
   8888  1.1  mrg       curr_state->cost++;
   8889  1.1  mrg       if (!try_issue_nops (curr_state, before_nops_num))
   8890  1.1  mrg 	return;
   8891  1.1  mrg       if (!try_issue_insn (curr_state, insn))
   8892  1.1  mrg 	return;
   8893  1.1  mrg       curr_state->accumulated_insns_num++;
   8894  1.1  mrg       if (unknown_for_bundling_p (insn))
   8895  1.1  mrg 	{
   8896  1.1  mrg 	  /* Finish bundle containing asm insn.  */
   8897  1.1  mrg 	  curr_state->after_nops_num
   8898  1.1  mrg 	    = 3 - curr_state->accumulated_insns_num % 3;
   8899  1.1  mrg 	  curr_state->accumulated_insns_num
   8900  1.1  mrg 	    += 3 - curr_state->accumulated_insns_num % 3;
   8901  1.1  mrg 	}
   8902  1.1  mrg       else if (ia64_safe_type (insn) == TYPE_L)
   8903  1.1  mrg 	curr_state->accumulated_insns_num++;
   8904  1.1  mrg     }
   8905  1.1  mrg   if (ia64_safe_type (insn) == TYPE_B)
   8906  1.1  mrg     curr_state->branch_deviation
   8907  1.1  mrg       += 2 - (curr_state->accumulated_insns_num - 1) % 3;
   8908  1.1  mrg   if (try_bundle_end_p && curr_state->accumulated_insns_num % 3 != 0)
   8909  1.1  mrg     {
   8910  1.1  mrg       if (!only_bundle_end_p && insert_bundle_state (curr_state))
   8911  1.1  mrg 	{
   8912  1.1  mrg 	  state_t dfa_state;
   8913  1.1  mrg 	  struct bundle_state *curr_state1;
   8914  1.1  mrg 	  struct bundle_state *allocated_states_chain;
   8915  1.1  mrg 
   8916  1.1  mrg 	  curr_state1 = get_free_bundle_state ();
   8917  1.1  mrg 	  dfa_state = curr_state1->dfa_state;
   8918  1.1  mrg 	  allocated_states_chain = curr_state1->allocated_states_chain;
   8919  1.1  mrg 	  *curr_state1 = *curr_state;
   8920  1.1  mrg 	  curr_state1->dfa_state = dfa_state;
   8921  1.1  mrg 	  curr_state1->allocated_states_chain = allocated_states_chain;
   8922  1.1  mrg 	  memcpy (curr_state1->dfa_state, curr_state->dfa_state,
   8923  1.1  mrg 		  dfa_state_size);
   8924  1.1  mrg 	  curr_state = curr_state1;
   8925  1.1  mrg 	}
   8926  1.1  mrg       if (!try_issue_nops (curr_state,
   8927  1.1  mrg 			   3 - curr_state->accumulated_insns_num % 3))
   8928  1.1  mrg 	return;
   8929  1.1  mrg       curr_state->after_nops_num
   8930  1.1  mrg 	= 3 - curr_state->accumulated_insns_num % 3;
   8931  1.1  mrg       curr_state->accumulated_insns_num
   8932  1.1  mrg 	+= 3 - curr_state->accumulated_insns_num % 3;
   8933  1.1  mrg     }
   8934  1.1  mrg   if (!insert_bundle_state (curr_state))
   8935  1.1  mrg     free_bundle_state (curr_state);
   8936  1.1  mrg   return;
   8937  1.1  mrg }
   8938  1.1  mrg 
   8939  1.1  mrg /* The following function returns position in the two window bundle
   8940  1.1  mrg    for given STATE.  */
   8941  1.1  mrg 
   8942  1.1  mrg static int
   8943  1.1  mrg get_max_pos (state_t state)
   8944  1.1  mrg {
   8945  1.1  mrg   if (cpu_unit_reservation_p (state, pos_6))
   8946  1.1  mrg     return 6;
   8947  1.1  mrg   else if (cpu_unit_reservation_p (state, pos_5))
   8948  1.1  mrg     return 5;
   8949  1.1  mrg   else if (cpu_unit_reservation_p (state, pos_4))
   8950  1.1  mrg     return 4;
   8951  1.1  mrg   else if (cpu_unit_reservation_p (state, pos_3))
   8952  1.1  mrg     return 3;
   8953  1.1  mrg   else if (cpu_unit_reservation_p (state, pos_2))
   8954  1.1  mrg     return 2;
   8955  1.1  mrg   else if (cpu_unit_reservation_p (state, pos_1))
   8956  1.1  mrg     return 1;
   8957  1.1  mrg   else
   8958  1.1  mrg     return 0;
   8959  1.1  mrg }
   8960  1.1  mrg 
   8961  1.1  mrg /* The function returns code of a possible template for given position
   8962  1.1  mrg    and state.  The function should be called only with 2 values of
   8963  1.1  mrg    position equal to 3 or 6.  We avoid generating F NOPs by putting
   8964  1.1  mrg    templates containing F insns at the end of the template search
   8965  1.1  mrg    because undocumented anomaly in McKinley derived cores which can
   8966  1.1  mrg    cause stalls if an F-unit insn (including a NOP) is issued within a
   8967  1.1  mrg    six-cycle window after reading certain application registers (such
   8968  1.1  mrg    as ar.bsp).  Furthermore, power-considerations also argue against
   8969  1.1  mrg    the use of F-unit instructions unless they're really needed.  */
   8970  1.1  mrg 
   8971  1.1  mrg static int
   8972  1.1  mrg get_template (state_t state, int pos)
   8973  1.1  mrg {
   8974  1.1  mrg   switch (pos)
   8975  1.1  mrg     {
   8976  1.1  mrg     case 3:
   8977  1.1  mrg       if (cpu_unit_reservation_p (state, _0mmi_))
   8978  1.1  mrg 	return 1;
   8979  1.1  mrg       else if (cpu_unit_reservation_p (state, _0mii_))
   8980  1.1  mrg 	return 0;
   8981  1.1  mrg       else if (cpu_unit_reservation_p (state, _0mmb_))
   8982  1.1  mrg 	return 7;
   8983  1.1  mrg       else if (cpu_unit_reservation_p (state, _0mib_))
   8984  1.1  mrg 	return 6;
   8985  1.1  mrg       else if (cpu_unit_reservation_p (state, _0mbb_))
   8986  1.1  mrg 	return 5;
   8987  1.1  mrg       else if (cpu_unit_reservation_p (state, _0bbb_))
   8988  1.1  mrg 	return 4;
   8989  1.1  mrg       else if (cpu_unit_reservation_p (state, _0mmf_))
   8990  1.1  mrg 	return 3;
   8991  1.1  mrg       else if (cpu_unit_reservation_p (state, _0mfi_))
   8992  1.1  mrg 	return 2;
   8993  1.1  mrg       else if (cpu_unit_reservation_p (state, _0mfb_))
   8994  1.1  mrg 	return 8;
   8995  1.1  mrg       else if (cpu_unit_reservation_p (state, _0mlx_))
   8996  1.1  mrg 	return 9;
   8997  1.1  mrg       else
   8998  1.1  mrg 	gcc_unreachable ();
   8999  1.1  mrg     case 6:
   9000  1.1  mrg       if (cpu_unit_reservation_p (state, _1mmi_))
   9001  1.1  mrg 	return 1;
   9002  1.1  mrg       else if (cpu_unit_reservation_p (state, _1mii_))
   9003  1.1  mrg 	return 0;
   9004  1.1  mrg       else if (cpu_unit_reservation_p (state, _1mmb_))
   9005  1.1  mrg 	return 7;
   9006  1.1  mrg       else if (cpu_unit_reservation_p (state, _1mib_))
   9007  1.1  mrg 	return 6;
   9008  1.1  mrg       else if (cpu_unit_reservation_p (state, _1mbb_))
   9009  1.1  mrg 	return 5;
   9010  1.1  mrg       else if (cpu_unit_reservation_p (state, _1bbb_))
   9011  1.1  mrg 	return 4;
   9012  1.1  mrg       else if (_1mmf_ >= 0 && cpu_unit_reservation_p (state, _1mmf_))
   9013  1.1  mrg 	return 3;
   9014  1.1  mrg       else if (cpu_unit_reservation_p (state, _1mfi_))
   9015  1.1  mrg 	return 2;
   9016  1.1  mrg       else if (cpu_unit_reservation_p (state, _1mfb_))
   9017  1.1  mrg 	return 8;
   9018  1.1  mrg       else if (cpu_unit_reservation_p (state, _1mlx_))
   9019  1.1  mrg 	return 9;
   9020  1.1  mrg       else
   9021  1.1  mrg 	gcc_unreachable ();
   9022  1.1  mrg     default:
   9023  1.1  mrg       gcc_unreachable ();
   9024  1.1  mrg     }
   9025  1.1  mrg }
   9026  1.1  mrg 
   9027  1.1  mrg /* True when INSN is important for bundling.  */
   9028  1.1  mrg 
   9029  1.1  mrg static bool
   9030  1.1  mrg important_for_bundling_p (rtx_insn *insn)
   9031  1.1  mrg {
   9032  1.1  mrg   return (INSN_P (insn)
   9033  1.1  mrg 	  && ia64_safe_itanium_class (insn) != ITANIUM_CLASS_IGNORE
   9034  1.1  mrg 	  && GET_CODE (PATTERN (insn)) != USE
   9035  1.1  mrg 	  && GET_CODE (PATTERN (insn)) != CLOBBER);
   9036  1.1  mrg }
   9037  1.1  mrg 
   9038  1.1  mrg /* The following function returns an insn important for insn bundling
   9039  1.1  mrg    followed by INSN and before TAIL.  */
   9040  1.1  mrg 
   9041  1.1  mrg static rtx_insn *
   9042  1.1  mrg get_next_important_insn (rtx_insn *insn, rtx_insn *tail)
   9043  1.1  mrg {
   9044  1.1  mrg   for (; insn && insn != tail; insn = NEXT_INSN (insn))
   9045  1.1  mrg     if (important_for_bundling_p (insn))
   9046  1.1  mrg       return insn;
   9047  1.1  mrg   return NULL;
   9048  1.1  mrg }
   9049  1.1  mrg 
   9050  1.1  mrg /* True when INSN is unknown, but important, for bundling.  */
   9051  1.1  mrg 
   9052  1.1  mrg static bool
   9053  1.1  mrg unknown_for_bundling_p (rtx_insn *insn)
   9054  1.1  mrg {
   9055  1.1  mrg   return (INSN_P (insn)
   9056  1.1  mrg 	  && ia64_safe_itanium_class (insn) == ITANIUM_CLASS_UNKNOWN
   9057  1.1  mrg 	  && GET_CODE (PATTERN (insn)) != USE
   9058  1.1  mrg 	  && GET_CODE (PATTERN (insn)) != CLOBBER);
   9059  1.1  mrg }
   9060  1.1  mrg 
   9061  1.1  mrg /* Add a bundle selector TEMPLATE0 before INSN.  */
   9062  1.1  mrg 
   9063  1.1  mrg static void
   9064  1.1  mrg ia64_add_bundle_selector_before (int template0, rtx_insn *insn)
   9065  1.1  mrg {
   9066  1.1  mrg   rtx b = gen_bundle_selector (GEN_INT (template0));
   9067  1.1  mrg 
   9068  1.1  mrg   ia64_emit_insn_before (b, insn);
   9069  1.1  mrg #if NR_BUNDLES == 10
   9070  1.1  mrg   if ((template0 == 4 || template0 == 5)
   9071  1.1  mrg       && ia64_except_unwind_info (&global_options) == UI_TARGET)
   9072  1.1  mrg     {
   9073  1.1  mrg       int i;
   9074  1.1  mrg       rtx note = NULL_RTX;
   9075  1.1  mrg 
   9076  1.1  mrg       /* In .mbb and .bbb bundles, check if CALL_INSN isn't in the
   9077  1.1  mrg 	 first or second slot.  If it is and has REG_EH_NOTE set, copy it
   9078  1.1  mrg 	 to following nops, as br.call sets rp to the address of following
   9079  1.1  mrg 	 bundle and therefore an EH region end must be on a bundle
   9080  1.1  mrg 	 boundary.  */
   9081  1.1  mrg       insn = PREV_INSN (insn);
   9082  1.1  mrg       for (i = 0; i < 3; i++)
   9083  1.1  mrg 	{
   9084  1.1  mrg 	  do
   9085  1.1  mrg 	    insn = next_active_insn (insn);
   9086  1.1  mrg 	  while (NONJUMP_INSN_P (insn)
   9087  1.1  mrg 		 && get_attr_empty (insn) == EMPTY_YES);
   9088  1.1  mrg 	  if (CALL_P (insn))
   9089  1.1  mrg 	    note = find_reg_note (insn, REG_EH_REGION, NULL_RTX);
   9090  1.1  mrg 	  else if (note)
   9091  1.1  mrg 	    {
   9092  1.1  mrg 	      int code;
   9093  1.1  mrg 
   9094  1.1  mrg 	      gcc_assert ((code = recog_memoized (insn)) == CODE_FOR_nop
   9095  1.1  mrg 			  || code == CODE_FOR_nop_b);
   9096  1.1  mrg 	      if (find_reg_note (insn, REG_EH_REGION, NULL_RTX))
   9097  1.1  mrg 		note = NULL_RTX;
   9098  1.1  mrg 	      else
   9099  1.1  mrg 		add_reg_note (insn, REG_EH_REGION, XEXP (note, 0));
   9100  1.1  mrg 	    }
   9101  1.1  mrg 	}
   9102  1.1  mrg     }
   9103  1.1  mrg #endif
   9104  1.1  mrg }
   9105  1.1  mrg 
   9106  1.1  mrg /* The following function does insn bundling.  Bundling means
   9107  1.1  mrg    inserting templates and nop insns to fit insn groups into permitted
   9108  1.1  mrg    templates.  Instruction scheduling uses NDFA (non-deterministic
   9109  1.1  mrg    finite automata) encoding informations about the templates and the
   9110  1.1  mrg    inserted nops.  Nondeterminism of the automata permits follows
   9111  1.1  mrg    all possible insn sequences very fast.
   9112  1.1  mrg 
   9113  1.1  mrg    Unfortunately it is not possible to get information about inserting
   9114  1.1  mrg    nop insns and used templates from the automata states.  The
   9115  1.1  mrg    automata only says that we can issue an insn possibly inserting
   9116  1.1  mrg    some nops before it and using some template.  Therefore insn
   9117  1.1  mrg    bundling in this function is implemented by using DFA
   9118  1.1  mrg    (deterministic finite automata).  We follow all possible insn
   9119  1.1  mrg    sequences by inserting 0-2 nops (that is what the NDFA describe for
   9120  1.1  mrg    insn scheduling) before/after each insn being bundled.  We know the
   9121  1.1  mrg    start of simulated processor cycle from insn scheduling (insn
   9122  1.1  mrg    starting a new cycle has TImode).
   9123  1.1  mrg 
   9124  1.1  mrg    Simple implementation of insn bundling would create enormous
   9125  1.1  mrg    number of possible insn sequences satisfying information about new
   9126  1.1  mrg    cycle ticks taken from the insn scheduling.  To make the algorithm
   9127  1.1  mrg    practical we use dynamic programming.  Each decision (about
   9128  1.1  mrg    inserting nops and implicitly about previous decisions) is described
   9129  1.1  mrg    by structure bundle_state (see above).  If we generate the same
   9130  1.1  mrg    bundle state (key is automaton state after issuing the insns and
   9131  1.1  mrg    nops for it), we reuse already generated one.  As consequence we
   9132  1.1  mrg    reject some decisions which cannot improve the solution and
   9133  1.1  mrg    reduce memory for the algorithm.
   9134  1.1  mrg 
   9135  1.1  mrg    When we reach the end of EBB (extended basic block), we choose the
   9136  1.1  mrg    best sequence and then, moving back in EBB, insert templates for
   9137  1.1  mrg    the best alternative.  The templates are taken from querying
   9138  1.1  mrg    automaton state for each insn in chosen bundle states.
   9139  1.1  mrg 
   9140  1.1  mrg    So the algorithm makes two (forward and backward) passes through
   9141  1.1  mrg    EBB.  */
   9142  1.1  mrg 
   9143  1.1  mrg static void
   9144  1.1  mrg bundling (FILE *dump, int verbose, rtx_insn *prev_head_insn, rtx_insn *tail)
   9145  1.1  mrg {
   9146  1.1  mrg   struct bundle_state *curr_state, *next_state, *best_state;
   9147  1.1  mrg   rtx_insn *insn, *next_insn;
   9148  1.1  mrg   int insn_num;
   9149  1.1  mrg   int i, bundle_end_p, only_bundle_end_p, asm_p;
   9150  1.1  mrg   int pos = 0, max_pos, template0, template1;
   9151  1.1  mrg   rtx_insn *b;
   9152  1.1  mrg   enum attr_type type;
   9153  1.1  mrg 
   9154  1.1  mrg   insn_num = 0;
   9155  1.1  mrg   /* Count insns in the EBB.  */
   9156  1.1  mrg   for (insn = NEXT_INSN (prev_head_insn);
   9157  1.1  mrg        insn && insn != tail;
   9158  1.1  mrg        insn = NEXT_INSN (insn))
   9159  1.1  mrg     if (INSN_P (insn))
   9160  1.1  mrg       insn_num++;
   9161  1.1  mrg   if (insn_num == 0)
   9162  1.1  mrg     return;
   9163  1.1  mrg   bundling_p = 1;
   9164  1.1  mrg   dfa_clean_insn_cache ();
   9165  1.1  mrg   initiate_bundle_state_table ();
   9166  1.1  mrg   index_to_bundle_states = XNEWVEC (struct bundle_state *, insn_num + 2);
   9167  1.1  mrg   /* First (forward) pass -- generation of bundle states.  */
   9168  1.1  mrg   curr_state = get_free_bundle_state ();
   9169  1.1  mrg   curr_state->insn = NULL;
   9170  1.1  mrg   curr_state->before_nops_num = 0;
   9171  1.1  mrg   curr_state->after_nops_num = 0;
   9172  1.1  mrg   curr_state->insn_num = 0;
   9173  1.1  mrg   curr_state->cost = 0;
   9174  1.1  mrg   curr_state->accumulated_insns_num = 0;
   9175  1.1  mrg   curr_state->branch_deviation = 0;
   9176  1.1  mrg   curr_state->middle_bundle_stops = 0;
   9177  1.1  mrg   curr_state->next = NULL;
   9178  1.1  mrg   curr_state->originator = NULL;
   9179  1.1  mrg   state_reset (curr_state->dfa_state);
   9180  1.1  mrg   index_to_bundle_states [0] = curr_state;
   9181  1.1  mrg   insn_num = 0;
   9182  1.1  mrg   /* Shift cycle mark if it is put on insn which could be ignored.  */
   9183  1.1  mrg   for (insn = NEXT_INSN (prev_head_insn);
   9184  1.1  mrg        insn != tail;
   9185  1.1  mrg        insn = NEXT_INSN (insn))
   9186  1.1  mrg     if (INSN_P (insn)
   9187  1.1  mrg 	&& !important_for_bundling_p (insn)
   9188  1.1  mrg 	&& GET_MODE (insn) == TImode)
   9189  1.1  mrg       {
   9190  1.1  mrg 	PUT_MODE (insn, VOIDmode);
   9191  1.1  mrg 	for (next_insn = NEXT_INSN (insn);
   9192  1.1  mrg 	     next_insn != tail;
   9193  1.1  mrg 	     next_insn = NEXT_INSN (next_insn))
   9194  1.1  mrg 	  if (important_for_bundling_p (next_insn)
   9195  1.1  mrg 	      && INSN_CODE (next_insn) != CODE_FOR_insn_group_barrier)
   9196  1.1  mrg 	    {
   9197  1.1  mrg 	      PUT_MODE (next_insn, TImode);
   9198  1.1  mrg 	      break;
   9199  1.1  mrg 	    }
   9200  1.1  mrg       }
   9201  1.1  mrg   /* Forward pass: generation of bundle states.  */
   9202  1.1  mrg   for (insn = get_next_important_insn (NEXT_INSN (prev_head_insn), tail);
   9203  1.1  mrg        insn != NULL_RTX;
   9204  1.1  mrg        insn = next_insn)
   9205  1.1  mrg     {
   9206  1.1  mrg       gcc_assert (important_for_bundling_p (insn));
   9207  1.1  mrg       type = ia64_safe_type (insn);
   9208  1.1  mrg       next_insn = get_next_important_insn (NEXT_INSN (insn), tail);
   9209  1.1  mrg       insn_num++;
   9210  1.1  mrg       index_to_bundle_states [insn_num] = NULL;
   9211  1.1  mrg       for (curr_state = index_to_bundle_states [insn_num - 1];
   9212  1.1  mrg 	   curr_state != NULL;
   9213  1.1  mrg 	   curr_state = next_state)
   9214  1.1  mrg 	{
   9215  1.1  mrg 	  pos = curr_state->accumulated_insns_num % 3;
   9216  1.1  mrg 	  next_state = curr_state->next;
   9217  1.1  mrg 	  /* We must fill up the current bundle in order to start a
   9218  1.1  mrg 	     subsequent asm insn in a new bundle.  Asm insn is always
   9219  1.1  mrg 	     placed in a separate bundle.  */
   9220  1.1  mrg 	  only_bundle_end_p
   9221  1.1  mrg 	    = (next_insn != NULL_RTX
   9222  1.1  mrg 	       && INSN_CODE (insn) == CODE_FOR_insn_group_barrier
   9223  1.1  mrg 	       && unknown_for_bundling_p (next_insn));
   9224  1.1  mrg 	  /* We may fill up the current bundle if it is the cycle end
   9225  1.1  mrg 	     without a group barrier.  */
   9226  1.1  mrg 	  bundle_end_p
   9227  1.1  mrg 	    = (only_bundle_end_p || next_insn == NULL_RTX
   9228  1.1  mrg 	       || (GET_MODE (next_insn) == TImode
   9229  1.1  mrg 		   && INSN_CODE (insn) != CODE_FOR_insn_group_barrier));
   9230  1.1  mrg 	  if (type == TYPE_F || type == TYPE_B || type == TYPE_L
   9231  1.1  mrg 	      || type == TYPE_S)
   9232  1.1  mrg 	    issue_nops_and_insn (curr_state, 2, insn, bundle_end_p,
   9233  1.1  mrg 				 only_bundle_end_p);
   9234  1.1  mrg 	  issue_nops_and_insn (curr_state, 1, insn, bundle_end_p,
   9235  1.1  mrg 			       only_bundle_end_p);
   9236  1.1  mrg 	  issue_nops_and_insn (curr_state, 0, insn, bundle_end_p,
   9237  1.1  mrg 			       only_bundle_end_p);
   9238  1.1  mrg 	}
   9239  1.1  mrg       gcc_assert (index_to_bundle_states [insn_num]);
   9240  1.1  mrg       for (curr_state = index_to_bundle_states [insn_num];
   9241  1.1  mrg 	   curr_state != NULL;
   9242  1.1  mrg 	   curr_state = curr_state->next)
   9243  1.1  mrg 	if (verbose >= 2 && dump)
   9244  1.1  mrg 	  {
   9245  1.1  mrg 	    /* This structure is taken from generated code of the
   9246  1.1  mrg 	       pipeline hazard recognizer (see file insn-attrtab.cc).
   9247  1.1  mrg 	       Please don't forget to change the structure if a new
   9248  1.1  mrg 	       automaton is added to .md file.  */
   9249  1.1  mrg 	    struct DFA_chip
   9250  1.1  mrg 	    {
   9251  1.1  mrg 	      unsigned short one_automaton_state;
   9252  1.1  mrg 	      unsigned short oneb_automaton_state;
   9253  1.1  mrg 	      unsigned short two_automaton_state;
   9254  1.1  mrg 	      unsigned short twob_automaton_state;
   9255  1.1  mrg 	    };
   9256  1.1  mrg 
   9257  1.1  mrg 	    fprintf
   9258  1.1  mrg 	      (dump,
   9259  1.1  mrg 	       "//    Bundle state %d (orig %d, cost %d, nops %d/%d, insns %d, branch %d, mid.stops %d state %d) for %d\n",
   9260  1.1  mrg 	       curr_state->unique_num,
   9261  1.1  mrg 	       (curr_state->originator == NULL
   9262  1.1  mrg 		? -1 : curr_state->originator->unique_num),
   9263  1.1  mrg 	       curr_state->cost,
   9264  1.1  mrg 	       curr_state->before_nops_num, curr_state->after_nops_num,
   9265  1.1  mrg 	       curr_state->accumulated_insns_num, curr_state->branch_deviation,
   9266  1.1  mrg 	       curr_state->middle_bundle_stops,
   9267  1.1  mrg 	       ((struct DFA_chip *) curr_state->dfa_state)->twob_automaton_state,
   9268  1.1  mrg 	       INSN_UID (insn));
   9269  1.1  mrg 	  }
   9270  1.1  mrg     }
   9271  1.1  mrg 
   9272  1.1  mrg   /* We should find a solution because the 2nd insn scheduling has
   9273  1.1  mrg      found one.  */
   9274  1.1  mrg   gcc_assert (index_to_bundle_states [insn_num]);
   9275  1.1  mrg   /* Find a state corresponding to the best insn sequence.  */
   9276  1.1  mrg   best_state = NULL;
   9277  1.1  mrg   for (curr_state = index_to_bundle_states [insn_num];
   9278  1.1  mrg        curr_state != NULL;
   9279  1.1  mrg        curr_state = curr_state->next)
   9280  1.1  mrg     /* We are just looking at the states with fully filled up last
   9281  1.1  mrg        bundle.  The first we prefer insn sequences with minimal cost
   9282  1.1  mrg        then with minimal inserted nops and finally with branch insns
   9283  1.1  mrg        placed in the 3rd slots.  */
   9284  1.1  mrg     if (curr_state->accumulated_insns_num % 3 == 0
   9285  1.1  mrg 	&& (best_state == NULL || best_state->cost > curr_state->cost
   9286  1.1  mrg 	    || (best_state->cost == curr_state->cost
   9287  1.1  mrg 		&& (curr_state->accumulated_insns_num
   9288  1.1  mrg 		    < best_state->accumulated_insns_num
   9289  1.1  mrg 		    || (curr_state->accumulated_insns_num
   9290  1.1  mrg 			== best_state->accumulated_insns_num
   9291  1.1  mrg 			&& (curr_state->branch_deviation
   9292  1.1  mrg 			    < best_state->branch_deviation
   9293  1.1  mrg 			    || (curr_state->branch_deviation
   9294  1.1  mrg 				== best_state->branch_deviation
   9295  1.1  mrg 				&& curr_state->middle_bundle_stops
   9296  1.1  mrg 				< best_state->middle_bundle_stops)))))))
   9297  1.1  mrg       best_state = curr_state;
   9298  1.1  mrg   /* Second (backward) pass: adding nops and templates.  */
   9299  1.1  mrg   gcc_assert (best_state);
   9300  1.1  mrg   insn_num = best_state->before_nops_num;
   9301  1.1  mrg   template0 = template1 = -1;
   9302  1.1  mrg   for (curr_state = best_state;
   9303  1.1  mrg        curr_state->originator != NULL;
   9304  1.1  mrg        curr_state = curr_state->originator)
   9305  1.1  mrg     {
   9306  1.1  mrg       insn = curr_state->insn;
   9307  1.1  mrg       asm_p = unknown_for_bundling_p (insn);
   9308  1.1  mrg       insn_num++;
   9309  1.1  mrg       if (verbose >= 2 && dump)
   9310  1.1  mrg 	{
   9311  1.1  mrg 	  struct DFA_chip
   9312  1.1  mrg 	  {
   9313  1.1  mrg 	    unsigned short one_automaton_state;
   9314  1.1  mrg 	    unsigned short oneb_automaton_state;
   9315  1.1  mrg 	    unsigned short two_automaton_state;
   9316  1.1  mrg 	    unsigned short twob_automaton_state;
   9317  1.1  mrg 	  };
   9318  1.1  mrg 
   9319  1.1  mrg 	  fprintf
   9320  1.1  mrg 	    (dump,
   9321  1.1  mrg 	     "//    Best %d (orig %d, cost %d, nops %d/%d, insns %d, branch %d, mid.stops %d, state %d) for %d\n",
   9322  1.1  mrg 	     curr_state->unique_num,
   9323  1.1  mrg 	     (curr_state->originator == NULL
   9324  1.1  mrg 	      ? -1 : curr_state->originator->unique_num),
   9325  1.1  mrg 	     curr_state->cost,
   9326  1.1  mrg 	     curr_state->before_nops_num, curr_state->after_nops_num,
   9327  1.1  mrg 	     curr_state->accumulated_insns_num, curr_state->branch_deviation,
   9328  1.1  mrg 	     curr_state->middle_bundle_stops,
   9329  1.1  mrg 	     ((struct DFA_chip *) curr_state->dfa_state)->twob_automaton_state,
   9330  1.1  mrg 	     INSN_UID (insn));
   9331  1.1  mrg 	}
   9332  1.1  mrg       /* Find the position in the current bundle window.  The window can
   9333  1.1  mrg 	 contain at most two bundles.  Two bundle window means that
   9334  1.1  mrg 	 the processor will make two bundle rotation.  */
   9335  1.1  mrg       max_pos = get_max_pos (curr_state->dfa_state);
   9336  1.1  mrg       if (max_pos == 6
   9337  1.1  mrg 	  /* The following (negative template number) means that the
   9338  1.1  mrg 	     processor did one bundle rotation.  */
   9339  1.1  mrg 	  || (max_pos == 3 && template0 < 0))
   9340  1.1  mrg 	{
   9341  1.1  mrg 	  /* We are at the end of the window -- find template(s) for
   9342  1.1  mrg 	     its bundle(s).  */
   9343  1.1  mrg 	  pos = max_pos;
   9344  1.1  mrg 	  if (max_pos == 3)
   9345  1.1  mrg 	    template0 = get_template (curr_state->dfa_state, 3);
   9346  1.1  mrg 	  else
   9347  1.1  mrg 	    {
   9348  1.1  mrg 	      template1 = get_template (curr_state->dfa_state, 3);
   9349  1.1  mrg 	      template0 = get_template (curr_state->dfa_state, 6);
   9350  1.1  mrg 	    }
   9351  1.1  mrg 	}
   9352  1.1  mrg       if (max_pos > 3 && template1 < 0)
   9353  1.1  mrg 	/* It may happen when we have the stop inside a bundle.  */
   9354  1.1  mrg 	{
   9355  1.1  mrg 	  gcc_assert (pos <= 3);
   9356  1.1  mrg 	  template1 = get_template (curr_state->dfa_state, 3);
   9357  1.1  mrg 	  pos += 3;
   9358  1.1  mrg 	}
   9359  1.1  mrg       if (!asm_p)
   9360  1.1  mrg 	/* Emit nops after the current insn.  */
   9361  1.1  mrg 	for (i = 0; i < curr_state->after_nops_num; i++)
   9362  1.1  mrg 	  {
   9363  1.1  mrg 	    rtx nop_pat = gen_nop ();
   9364  1.1  mrg 	    rtx_insn *nop = emit_insn_after (nop_pat, insn);
   9365  1.1  mrg 	    pos--;
   9366  1.1  mrg 	    gcc_assert (pos >= 0);
   9367  1.1  mrg 	    if (pos % 3 == 0)
   9368  1.1  mrg 	      {
   9369  1.1  mrg 		/* We are at the start of a bundle: emit the template
   9370  1.1  mrg 		   (it should be defined).  */
   9371  1.1  mrg 		gcc_assert (template0 >= 0);
   9372  1.1  mrg 		ia64_add_bundle_selector_before (template0, nop);
   9373  1.1  mrg 		/* If we have two bundle window, we make one bundle
   9374  1.1  mrg 		   rotation.  Otherwise template0 will be undefined
   9375  1.1  mrg 		   (negative value).  */
   9376  1.1  mrg 		template0 = template1;
   9377  1.1  mrg 		template1 = -1;
   9378  1.1  mrg 	      }
   9379  1.1  mrg 	  }
   9380  1.1  mrg       /* Move the position backward in the window.  Group barrier has
   9381  1.1  mrg 	 no slot.  Asm insn takes all bundle.  */
   9382  1.1  mrg       if (INSN_CODE (insn) != CODE_FOR_insn_group_barrier
   9383  1.1  mrg 	  && !unknown_for_bundling_p (insn))
   9384  1.1  mrg 	pos--;
   9385  1.1  mrg       /* Long insn takes 2 slots.  */
   9386  1.1  mrg       if (ia64_safe_type (insn) == TYPE_L)
   9387  1.1  mrg 	pos--;
   9388  1.1  mrg       gcc_assert (pos >= 0);
   9389  1.1  mrg       if (pos % 3 == 0
   9390  1.1  mrg 	  && INSN_CODE (insn) != CODE_FOR_insn_group_barrier
   9391  1.1  mrg 	  && !unknown_for_bundling_p (insn))
   9392  1.1  mrg 	{
   9393  1.1  mrg 	  /* The current insn is at the bundle start: emit the
   9394  1.1  mrg 	     template.  */
   9395  1.1  mrg 	  gcc_assert (template0 >= 0);
   9396  1.1  mrg 	  ia64_add_bundle_selector_before (template0, insn);
   9397  1.1  mrg 	  b = PREV_INSN (insn);
   9398  1.1  mrg 	  insn = b;
   9399  1.1  mrg 	  /* See comment above in analogous place for emitting nops
   9400  1.1  mrg 	     after the insn.  */
   9401  1.1  mrg 	  template0 = template1;
   9402  1.1  mrg 	  template1 = -1;
   9403  1.1  mrg 	}
   9404  1.1  mrg       /* Emit nops after the current insn.  */
   9405  1.1  mrg       for (i = 0; i < curr_state->before_nops_num; i++)
   9406  1.1  mrg 	{
   9407  1.1  mrg 	  rtx nop_pat = gen_nop ();
   9408  1.1  mrg 	  ia64_emit_insn_before (nop_pat, insn);
   9409  1.1  mrg 	  rtx_insn *nop = PREV_INSN (insn);
   9410  1.1  mrg 	  insn = nop;
   9411  1.1  mrg 	  pos--;
   9412  1.1  mrg 	  gcc_assert (pos >= 0);
   9413  1.1  mrg 	  if (pos % 3 == 0)
   9414  1.1  mrg 	    {
   9415  1.1  mrg 	      /* See comment above in analogous place for emitting nops
   9416  1.1  mrg 		 after the insn.  */
   9417  1.1  mrg 	      gcc_assert (template0 >= 0);
   9418  1.1  mrg 	      ia64_add_bundle_selector_before (template0, insn);
   9419  1.1  mrg 	      b = PREV_INSN (insn);
   9420  1.1  mrg 	      insn = b;
   9421  1.1  mrg 	      template0 = template1;
   9422  1.1  mrg 	      template1 = -1;
   9423  1.1  mrg 	    }
   9424  1.1  mrg 	}
   9425  1.1  mrg     }
   9426  1.1  mrg 
   9427  1.1  mrg   if (flag_checking)
   9428  1.1  mrg     {
   9429  1.1  mrg       /* Assert right calculation of middle_bundle_stops.  */
   9430  1.1  mrg       int num = best_state->middle_bundle_stops;
   9431  1.1  mrg       bool start_bundle = true, end_bundle = false;
   9432  1.1  mrg 
   9433  1.1  mrg       for (insn = NEXT_INSN (prev_head_insn);
   9434  1.1  mrg 	   insn && insn != tail;
   9435  1.1  mrg 	   insn = NEXT_INSN (insn))
   9436  1.1  mrg 	{
   9437  1.1  mrg 	  if (!INSN_P (insn))
   9438  1.1  mrg 	    continue;
   9439  1.1  mrg 	  if (recog_memoized (insn) == CODE_FOR_bundle_selector)
   9440  1.1  mrg 	    start_bundle = true;
   9441  1.1  mrg 	  else
   9442  1.1  mrg 	    {
   9443  1.1  mrg 	      rtx_insn *next_insn;
   9444  1.1  mrg 
   9445  1.1  mrg 	      for (next_insn = NEXT_INSN (insn);
   9446  1.1  mrg 		   next_insn && next_insn != tail;
   9447  1.1  mrg 		   next_insn = NEXT_INSN (next_insn))
   9448  1.1  mrg 		if (INSN_P (next_insn)
   9449  1.1  mrg 		    && (ia64_safe_itanium_class (next_insn)
   9450  1.1  mrg 			!= ITANIUM_CLASS_IGNORE
   9451  1.1  mrg 			|| recog_memoized (next_insn)
   9452  1.1  mrg 			== CODE_FOR_bundle_selector)
   9453  1.1  mrg 		    && GET_CODE (PATTERN (next_insn)) != USE
   9454  1.1  mrg 		    && GET_CODE (PATTERN (next_insn)) != CLOBBER)
   9455  1.1  mrg 		  break;
   9456  1.1  mrg 
   9457  1.1  mrg 	      end_bundle = next_insn == NULL_RTX
   9458  1.1  mrg 		|| next_insn == tail
   9459  1.1  mrg 		|| (INSN_P (next_insn)
   9460  1.1  mrg 		    && recog_memoized (next_insn) == CODE_FOR_bundle_selector);
   9461  1.1  mrg 	      if (recog_memoized (insn) == CODE_FOR_insn_group_barrier
   9462  1.1  mrg 		  && !start_bundle && !end_bundle
   9463  1.1  mrg 		  && next_insn
   9464  1.1  mrg 		  && !unknown_for_bundling_p (next_insn))
   9465  1.1  mrg 		num--;
   9466  1.1  mrg 
   9467  1.1  mrg 	      start_bundle = false;
   9468  1.1  mrg 	    }
   9469  1.1  mrg 	}
   9470  1.1  mrg 
   9471  1.1  mrg       gcc_assert (num == 0);
   9472  1.1  mrg     }
   9473  1.1  mrg 
   9474  1.1  mrg   free (index_to_bundle_states);
   9475  1.1  mrg   finish_bundle_state_table ();
   9476  1.1  mrg   bundling_p = 0;
   9477  1.1  mrg   dfa_clean_insn_cache ();
   9478  1.1  mrg }
   9479  1.1  mrg 
   9480  1.1  mrg /* The following function is called at the end of scheduling BB or
   9481  1.1  mrg    EBB.  After reload, it inserts stop bits and does insn bundling.  */
   9482  1.1  mrg 
   9483  1.1  mrg static void
   9484  1.1  mrg ia64_sched_finish (FILE *dump, int sched_verbose)
   9485  1.1  mrg {
   9486  1.1  mrg   if (sched_verbose)
   9487  1.1  mrg     fprintf (dump, "// Finishing schedule.\n");
   9488  1.1  mrg   if (!reload_completed)
   9489  1.1  mrg     return;
   9490  1.1  mrg   if (reload_completed)
   9491  1.1  mrg     {
   9492  1.1  mrg       final_emit_insn_group_barriers (dump);
   9493  1.1  mrg       bundling (dump, sched_verbose, current_sched_info->prev_head,
   9494  1.1  mrg 		current_sched_info->next_tail);
   9495  1.1  mrg       if (sched_verbose && dump)
   9496  1.1  mrg 	fprintf (dump, "//    finishing %d-%d\n",
   9497  1.1  mrg 		 INSN_UID (NEXT_INSN (current_sched_info->prev_head)),
   9498  1.1  mrg 		 INSN_UID (PREV_INSN (current_sched_info->next_tail)));
   9499  1.1  mrg 
   9500  1.1  mrg       return;
   9501  1.1  mrg     }
   9502  1.1  mrg }
   9503  1.1  mrg 
   9504  1.1  mrg /* The following function inserts stop bits in scheduled BB or EBB.  */
   9505  1.1  mrg 
   9506  1.1  mrg static void
   9507  1.1  mrg final_emit_insn_group_barriers (FILE *dump ATTRIBUTE_UNUSED)
   9508  1.1  mrg {
   9509  1.1  mrg   rtx_insn *insn;
   9510  1.1  mrg   int need_barrier_p = 0;
   9511  1.1  mrg   int seen_good_insn = 0;
   9512  1.1  mrg 
   9513  1.1  mrg   init_insn_group_barriers ();
   9514  1.1  mrg 
   9515  1.1  mrg   for (insn = NEXT_INSN (current_sched_info->prev_head);
   9516  1.1  mrg        insn != current_sched_info->next_tail;
   9517  1.1  mrg        insn = NEXT_INSN (insn))
   9518  1.1  mrg     {
   9519  1.1  mrg       if (BARRIER_P (insn))
   9520  1.1  mrg 	{
   9521  1.1  mrg 	  rtx_insn *last = prev_active_insn (insn);
   9522  1.1  mrg 
   9523  1.1  mrg 	  if (! last)
   9524  1.1  mrg 	    continue;
   9525  1.1  mrg 	  if (JUMP_TABLE_DATA_P (last))
   9526  1.1  mrg 	    last = prev_active_insn (last);
   9527  1.1  mrg 	  if (recog_memoized (last) != CODE_FOR_insn_group_barrier)
   9528  1.1  mrg 	    emit_insn_after (gen_insn_group_barrier (GEN_INT (3)), last);
   9529  1.1  mrg 
   9530  1.1  mrg 	  init_insn_group_barriers ();
   9531  1.1  mrg 	  seen_good_insn = 0;
   9532  1.1  mrg 	  need_barrier_p = 0;
   9533  1.1  mrg 	}
   9534  1.1  mrg       else if (NONDEBUG_INSN_P (insn))
   9535  1.1  mrg 	{
   9536  1.1  mrg 	  if (recog_memoized (insn) == CODE_FOR_insn_group_barrier)
   9537  1.1  mrg 	    {
   9538  1.1  mrg 	      init_insn_group_barriers ();
   9539  1.1  mrg 	      seen_good_insn = 0;
   9540  1.1  mrg 	      need_barrier_p = 0;
   9541  1.1  mrg 	    }
   9542  1.1  mrg 	  else if (need_barrier_p || group_barrier_needed (insn)
   9543  1.1  mrg 		   || (mflag_sched_stop_bits_after_every_cycle
   9544  1.1  mrg 		       && GET_MODE (insn) == TImode
   9545  1.1  mrg 		       && seen_good_insn))
   9546  1.1  mrg 	    {
   9547  1.1  mrg 	      if (TARGET_EARLY_STOP_BITS)
   9548  1.1  mrg 		{
   9549  1.1  mrg 		  rtx_insn *last;
   9550  1.1  mrg 
   9551  1.1  mrg 		  for (last = insn;
   9552  1.1  mrg 		       last != current_sched_info->prev_head;
   9553  1.1  mrg 		       last = PREV_INSN (last))
   9554  1.1  mrg 		    if (INSN_P (last) && GET_MODE (last) == TImode
   9555  1.1  mrg 			&& stops_p [INSN_UID (last)])
   9556  1.1  mrg 		      break;
   9557  1.1  mrg 		  if (last == current_sched_info->prev_head)
   9558  1.1  mrg 		    last = insn;
   9559  1.1  mrg 		  last = prev_active_insn (last);
   9560  1.1  mrg 		  if (last
   9561  1.1  mrg 		      && recog_memoized (last) != CODE_FOR_insn_group_barrier)
   9562  1.1  mrg 		    emit_insn_after (gen_insn_group_barrier (GEN_INT (3)),
   9563  1.1  mrg 				     last);
   9564  1.1  mrg 		  init_insn_group_barriers ();
   9565  1.1  mrg 		  for (last = NEXT_INSN (last);
   9566  1.1  mrg 		       last != insn;
   9567  1.1  mrg 		       last = NEXT_INSN (last))
   9568  1.1  mrg 		    if (INSN_P (last))
   9569  1.1  mrg 		      {
   9570  1.1  mrg 			group_barrier_needed (last);
   9571  1.1  mrg 			if (recog_memoized (last) >= 0
   9572  1.1  mrg 			    && important_for_bundling_p (last))
   9573  1.1  mrg 			  seen_good_insn = 1;
   9574  1.1  mrg 		      }
   9575  1.1  mrg 		}
   9576  1.1  mrg 	      else
   9577  1.1  mrg 		{
   9578  1.1  mrg 		  emit_insn_before (gen_insn_group_barrier (GEN_INT (3)),
   9579  1.1  mrg 				    insn);
   9580  1.1  mrg 		  init_insn_group_barriers ();
   9581  1.1  mrg 		  seen_good_insn = 0;
   9582  1.1  mrg 		}
   9583  1.1  mrg 	      group_barrier_needed (insn);
   9584  1.1  mrg 	      if (recog_memoized (insn) >= 0
   9585  1.1  mrg 		  && important_for_bundling_p (insn))
   9586  1.1  mrg 		seen_good_insn = 1;
   9587  1.1  mrg 	    }
   9588  1.1  mrg 	  else if (recog_memoized (insn) >= 0
   9589  1.1  mrg 		   && important_for_bundling_p (insn))
   9590  1.1  mrg 	    seen_good_insn = 1;
   9591  1.1  mrg 	  need_barrier_p = (CALL_P (insn) || unknown_for_bundling_p (insn));
   9592  1.1  mrg 	}
   9593  1.1  mrg     }
   9594  1.1  mrg }
   9595  1.1  mrg 
   9596  1.1  mrg 
   9597  1.1  mrg 
   9599  1.1  mrg /* If the following function returns TRUE, we will use the DFA
   9600  1.1  mrg    insn scheduler.  */
   9601  1.1  mrg 
   9602  1.1  mrg static int
   9603  1.1  mrg ia64_first_cycle_multipass_dfa_lookahead (void)
   9604  1.1  mrg {
   9605  1.1  mrg   return (reload_completed ? 6 : 4);
   9606  1.1  mrg }
   9607  1.1  mrg 
   9608  1.1  mrg /* The following function initiates variable `dfa_pre_cycle_insn'.  */
   9609  1.1  mrg 
   9610  1.1  mrg static void
   9611  1.1  mrg ia64_init_dfa_pre_cycle_insn (void)
   9612  1.1  mrg {
   9613  1.1  mrg   if (temp_dfa_state == NULL)
   9614  1.1  mrg     {
   9615  1.1  mrg       dfa_state_size = state_size ();
   9616  1.1  mrg       temp_dfa_state = xmalloc (dfa_state_size);
   9617  1.1  mrg       prev_cycle_state = xmalloc (dfa_state_size);
   9618  1.1  mrg     }
   9619  1.1  mrg   dfa_pre_cycle_insn = make_insn_raw (gen_pre_cycle ());
   9620  1.1  mrg   SET_PREV_INSN (dfa_pre_cycle_insn) = SET_NEXT_INSN (dfa_pre_cycle_insn) = NULL_RTX;
   9621  1.1  mrg   recog_memoized (dfa_pre_cycle_insn);
   9622  1.1  mrg   dfa_stop_insn = make_insn_raw (gen_insn_group_barrier (GEN_INT (3)));
   9623  1.1  mrg   SET_PREV_INSN (dfa_stop_insn) = SET_NEXT_INSN (dfa_stop_insn) = NULL_RTX;
   9624  1.1  mrg   recog_memoized (dfa_stop_insn);
   9625  1.1  mrg }
   9626  1.1  mrg 
   9627  1.1  mrg /* The following function returns the pseudo insn DFA_PRE_CYCLE_INSN
   9628  1.1  mrg    used by the DFA insn scheduler.  */
   9629  1.1  mrg 
   9630  1.1  mrg static rtx
   9631  1.1  mrg ia64_dfa_pre_cycle_insn (void)
   9632  1.1  mrg {
   9633  1.1  mrg   return dfa_pre_cycle_insn;
   9634  1.1  mrg }
   9635  1.1  mrg 
   9636  1.1  mrg /* The following function returns TRUE if PRODUCER (of type ilog or
   9637  1.1  mrg    ld) produces address for CONSUMER (of type st or stf). */
   9638  1.1  mrg 
   9639  1.1  mrg int
   9640  1.1  mrg ia64_st_address_bypass_p (rtx_insn *producer, rtx_insn *consumer)
   9641  1.1  mrg {
   9642  1.1  mrg   rtx dest, reg, mem;
   9643  1.1  mrg 
   9644  1.1  mrg   gcc_assert (producer && consumer);
   9645  1.1  mrg   dest = ia64_single_set (producer);
   9646  1.1  mrg   gcc_assert (dest);
   9647  1.1  mrg   reg = SET_DEST (dest);
   9648  1.1  mrg   gcc_assert (reg);
   9649  1.1  mrg   if (GET_CODE (reg) == SUBREG)
   9650  1.1  mrg     reg = SUBREG_REG (reg);
   9651  1.1  mrg   gcc_assert (GET_CODE (reg) == REG);
   9652  1.1  mrg 
   9653  1.1  mrg   dest = ia64_single_set (consumer);
   9654  1.1  mrg   gcc_assert (dest);
   9655  1.1  mrg   mem = SET_DEST (dest);
   9656  1.1  mrg   gcc_assert (mem && GET_CODE (mem) == MEM);
   9657  1.1  mrg   return reg_mentioned_p (reg, mem);
   9658  1.1  mrg }
   9659  1.1  mrg 
   9660  1.1  mrg /* The following function returns TRUE if PRODUCER (of type ilog or
   9661  1.1  mrg    ld) produces address for CONSUMER (of type ld or fld). */
   9662  1.1  mrg 
   9663  1.1  mrg int
   9664  1.1  mrg ia64_ld_address_bypass_p (rtx_insn *producer, rtx_insn *consumer)
   9665  1.1  mrg {
   9666  1.1  mrg   rtx dest, src, reg, mem;
   9667  1.1  mrg 
   9668  1.1  mrg   gcc_assert (producer && consumer);
   9669  1.1  mrg   dest = ia64_single_set (producer);
   9670  1.1  mrg   gcc_assert (dest);
   9671  1.1  mrg   reg = SET_DEST (dest);
   9672  1.1  mrg   gcc_assert (reg);
   9673  1.1  mrg   if (GET_CODE (reg) == SUBREG)
   9674  1.1  mrg     reg = SUBREG_REG (reg);
   9675  1.1  mrg   gcc_assert (GET_CODE (reg) == REG);
   9676  1.1  mrg 
   9677  1.1  mrg   src = ia64_single_set (consumer);
   9678  1.1  mrg   gcc_assert (src);
   9679  1.1  mrg   mem = SET_SRC (src);
   9680  1.1  mrg   gcc_assert (mem);
   9681  1.1  mrg 
   9682  1.1  mrg   if (GET_CODE (mem) == UNSPEC && XVECLEN (mem, 0) > 0)
   9683  1.1  mrg     mem = XVECEXP (mem, 0, 0);
   9684  1.1  mrg   else if (GET_CODE (mem) == IF_THEN_ELSE)
   9685  1.1  mrg     /* ??? Is this bypass necessary for ld.c?  */
   9686  1.1  mrg     {
   9687  1.1  mrg       gcc_assert (XINT (XEXP (XEXP (mem, 0), 0), 1) == UNSPEC_LDCCLR);
   9688  1.1  mrg       mem = XEXP (mem, 1);
   9689  1.1  mrg     }
   9690  1.1  mrg 
   9691  1.1  mrg   while (GET_CODE (mem) == SUBREG || GET_CODE (mem) == ZERO_EXTEND)
   9692  1.1  mrg     mem = XEXP (mem, 0);
   9693  1.1  mrg 
   9694  1.1  mrg   if (GET_CODE (mem) == UNSPEC)
   9695  1.1  mrg     {
   9696  1.1  mrg       int c = XINT (mem, 1);
   9697  1.1  mrg 
   9698  1.1  mrg       gcc_assert (c == UNSPEC_LDA || c == UNSPEC_LDS || c == UNSPEC_LDS_A
   9699  1.1  mrg 		  || c == UNSPEC_LDSA);
   9700  1.1  mrg       mem = XVECEXP (mem, 0, 0);
   9701  1.1  mrg     }
   9702  1.1  mrg 
   9703  1.1  mrg   /* Note that LO_SUM is used for GOT loads.  */
   9704  1.1  mrg   gcc_assert (GET_CODE (mem) == LO_SUM || GET_CODE (mem) == MEM);
   9705  1.1  mrg 
   9706  1.1  mrg   return reg_mentioned_p (reg, mem);
   9707  1.1  mrg }
   9708  1.1  mrg 
   9709  1.1  mrg /* The following function returns TRUE if INSN produces address for a
   9710  1.1  mrg    load/store insn.  We will place such insns into M slot because it
   9711  1.1  mrg    decreases its latency time.  */
   9712  1.1  mrg 
   9713  1.1  mrg int
   9714  1.1  mrg ia64_produce_address_p (rtx insn)
   9715  1.1  mrg {
   9716  1.1  mrg   return insn->call;
   9717  1.1  mrg }
   9718  1.1  mrg 
   9719  1.1  mrg 
   9720  1.1  mrg /* Emit pseudo-ops for the assembler to describe predicate relations.
   9722  1.1  mrg    At present this assumes that we only consider predicate pairs to
   9723  1.1  mrg    be mutex, and that the assembler can deduce proper values from
   9724  1.1  mrg    straight-line code.  */
   9725  1.1  mrg 
   9726  1.1  mrg static void
   9727  1.1  mrg emit_predicate_relation_info (void)
   9728  1.1  mrg {
   9729  1.1  mrg   basic_block bb;
   9730  1.1  mrg 
   9731  1.1  mrg   FOR_EACH_BB_REVERSE_FN (bb, cfun)
   9732  1.1  mrg     {
   9733  1.1  mrg       int r;
   9734  1.1  mrg       rtx_insn *head = BB_HEAD (bb);
   9735  1.1  mrg 
   9736  1.1  mrg       /* We only need such notes at code labels.  */
   9737  1.1  mrg       if (! LABEL_P (head))
   9738  1.1  mrg 	continue;
   9739  1.1  mrg       if (NOTE_INSN_BASIC_BLOCK_P (NEXT_INSN (head)))
   9740  1.1  mrg 	head = NEXT_INSN (head);
   9741  1.1  mrg 
   9742  1.1  mrg       /* Skip p0, which may be thought to be live due to (reg:DI p0)
   9743  1.1  mrg 	 grabbing the entire block of predicate registers.  */
   9744  1.1  mrg       for (r = PR_REG (2); r < PR_REG (64); r += 2)
   9745  1.1  mrg 	if (REGNO_REG_SET_P (df_get_live_in (bb), r))
   9746  1.1  mrg 	  {
   9747  1.1  mrg 	    rtx p = gen_rtx_REG (BImode, r);
   9748  1.1  mrg 	    rtx_insn *n = emit_insn_after (gen_pred_rel_mutex (p), head);
   9749  1.1  mrg 	    if (head == BB_END (bb))
   9750  1.1  mrg 	      BB_END (bb) = n;
   9751  1.1  mrg 	    head = n;
   9752  1.1  mrg 	  }
   9753  1.1  mrg     }
   9754  1.1  mrg 
   9755  1.1  mrg   /* Look for conditional calls that do not return, and protect predicate
   9756  1.1  mrg      relations around them.  Otherwise the assembler will assume the call
   9757  1.1  mrg      returns, and complain about uses of call-clobbered predicates after
   9758  1.1  mrg      the call.  */
   9759  1.1  mrg   FOR_EACH_BB_REVERSE_FN (bb, cfun)
   9760  1.1  mrg     {
   9761  1.1  mrg       rtx_insn *insn = BB_HEAD (bb);
   9762  1.1  mrg 
   9763  1.1  mrg       while (1)
   9764  1.1  mrg 	{
   9765  1.1  mrg 	  if (CALL_P (insn)
   9766  1.1  mrg 	      && GET_CODE (PATTERN (insn)) == COND_EXEC
   9767  1.1  mrg 	      && find_reg_note (insn, REG_NORETURN, NULL_RTX))
   9768  1.1  mrg 	    {
   9769  1.1  mrg 	      rtx_insn *b =
   9770  1.1  mrg 		emit_insn_before (gen_safe_across_calls_all (), insn);
   9771  1.1  mrg 	      rtx_insn *a = emit_insn_after (gen_safe_across_calls_normal (), insn);
   9772  1.1  mrg 	      if (BB_HEAD (bb) == insn)
   9773  1.1  mrg 		BB_HEAD (bb) = b;
   9774  1.1  mrg 	      if (BB_END (bb) == insn)
   9775  1.1  mrg 		BB_END (bb) = a;
   9776  1.1  mrg 	    }
   9777  1.1  mrg 
   9778  1.1  mrg 	  if (insn == BB_END (bb))
   9779  1.1  mrg 	    break;
   9780  1.1  mrg 	  insn = NEXT_INSN (insn);
   9781  1.1  mrg 	}
   9782  1.1  mrg     }
   9783  1.1  mrg }
   9784  1.1  mrg 
   9785  1.1  mrg /* Perform machine dependent operations on the rtl chain INSNS.  */
   9786  1.1  mrg 
   9787  1.1  mrg static void
   9788  1.1  mrg ia64_reorg (void)
   9789  1.1  mrg {
   9790  1.1  mrg   /* We are freeing block_for_insn in the toplev to keep compatibility
   9791  1.1  mrg      with old MDEP_REORGS that are not CFG based.  Recompute it now.  */
   9792  1.1  mrg   compute_bb_for_insn ();
   9793  1.1  mrg 
   9794  1.1  mrg   /* If optimizing, we'll have split before scheduling.  */
   9795  1.1  mrg   if (optimize == 0)
   9796  1.1  mrg     split_all_insns ();
   9797  1.1  mrg 
   9798  1.1  mrg   if (optimize && flag_schedule_insns_after_reload
   9799  1.1  mrg       && dbg_cnt (ia64_sched2))
   9800  1.1  mrg     {
   9801  1.1  mrg       basic_block bb;
   9802  1.1  mrg       timevar_push (TV_SCHED2);
   9803  1.1  mrg       ia64_final_schedule = 1;
   9804  1.1  mrg 
   9805  1.1  mrg       /* We can't let modulo-sched prevent us from scheduling any bbs,
   9806  1.1  mrg 	 since we need the final schedule to produce bundle information.  */
   9807  1.1  mrg       FOR_EACH_BB_FN (bb, cfun)
   9808  1.1  mrg 	bb->flags &= ~BB_DISABLE_SCHEDULE;
   9809  1.1  mrg 
   9810  1.1  mrg       initiate_bundle_states ();
   9811  1.1  mrg       ia64_nop = make_insn_raw (gen_nop ());
   9812  1.1  mrg       SET_PREV_INSN (ia64_nop) = SET_NEXT_INSN (ia64_nop) = NULL_RTX;
   9813  1.1  mrg       recog_memoized (ia64_nop);
   9814  1.1  mrg       clocks_length = get_max_uid () + 1;
   9815  1.1  mrg       stops_p = XCNEWVEC (char, clocks_length);
   9816  1.1  mrg 
   9817  1.1  mrg       if (ia64_tune == PROCESSOR_ITANIUM2)
   9818  1.1  mrg 	{
   9819  1.1  mrg 	  pos_1 = get_cpu_unit_code ("2_1");
   9820  1.1  mrg 	  pos_2 = get_cpu_unit_code ("2_2");
   9821  1.1  mrg 	  pos_3 = get_cpu_unit_code ("2_3");
   9822  1.1  mrg 	  pos_4 = get_cpu_unit_code ("2_4");
   9823  1.1  mrg 	  pos_5 = get_cpu_unit_code ("2_5");
   9824  1.1  mrg 	  pos_6 = get_cpu_unit_code ("2_6");
   9825  1.1  mrg 	  _0mii_ = get_cpu_unit_code ("2b_0mii.");
   9826  1.1  mrg 	  _0mmi_ = get_cpu_unit_code ("2b_0mmi.");
   9827  1.1  mrg 	  _0mfi_ = get_cpu_unit_code ("2b_0mfi.");
   9828  1.1  mrg 	  _0mmf_ = get_cpu_unit_code ("2b_0mmf.");
   9829  1.1  mrg 	  _0bbb_ = get_cpu_unit_code ("2b_0bbb.");
   9830  1.1  mrg 	  _0mbb_ = get_cpu_unit_code ("2b_0mbb.");
   9831  1.1  mrg 	  _0mib_ = get_cpu_unit_code ("2b_0mib.");
   9832  1.1  mrg 	  _0mmb_ = get_cpu_unit_code ("2b_0mmb.");
   9833  1.1  mrg 	  _0mfb_ = get_cpu_unit_code ("2b_0mfb.");
   9834  1.1  mrg 	  _0mlx_ = get_cpu_unit_code ("2b_0mlx.");
   9835  1.1  mrg 	  _1mii_ = get_cpu_unit_code ("2b_1mii.");
   9836  1.1  mrg 	  _1mmi_ = get_cpu_unit_code ("2b_1mmi.");
   9837  1.1  mrg 	  _1mfi_ = get_cpu_unit_code ("2b_1mfi.");
   9838  1.1  mrg 	  _1mmf_ = get_cpu_unit_code ("2b_1mmf.");
   9839  1.1  mrg 	  _1bbb_ = get_cpu_unit_code ("2b_1bbb.");
   9840  1.1  mrg 	  _1mbb_ = get_cpu_unit_code ("2b_1mbb.");
   9841  1.1  mrg 	  _1mib_ = get_cpu_unit_code ("2b_1mib.");
   9842  1.1  mrg 	  _1mmb_ = get_cpu_unit_code ("2b_1mmb.");
   9843  1.1  mrg 	  _1mfb_ = get_cpu_unit_code ("2b_1mfb.");
   9844  1.1  mrg 	  _1mlx_ = get_cpu_unit_code ("2b_1mlx.");
   9845  1.1  mrg 	}
   9846  1.1  mrg       else
   9847  1.1  mrg 	{
   9848  1.1  mrg 	  pos_1 = get_cpu_unit_code ("1_1");
   9849  1.1  mrg 	  pos_2 = get_cpu_unit_code ("1_2");
   9850  1.1  mrg 	  pos_3 = get_cpu_unit_code ("1_3");
   9851  1.1  mrg 	  pos_4 = get_cpu_unit_code ("1_4");
   9852  1.1  mrg 	  pos_5 = get_cpu_unit_code ("1_5");
   9853  1.1  mrg 	  pos_6 = get_cpu_unit_code ("1_6");
   9854  1.1  mrg 	  _0mii_ = get_cpu_unit_code ("1b_0mii.");
   9855  1.1  mrg 	  _0mmi_ = get_cpu_unit_code ("1b_0mmi.");
   9856  1.1  mrg 	  _0mfi_ = get_cpu_unit_code ("1b_0mfi.");
   9857  1.1  mrg 	  _0mmf_ = get_cpu_unit_code ("1b_0mmf.");
   9858  1.1  mrg 	  _0bbb_ = get_cpu_unit_code ("1b_0bbb.");
   9859  1.1  mrg 	  _0mbb_ = get_cpu_unit_code ("1b_0mbb.");
   9860  1.1  mrg 	  _0mib_ = get_cpu_unit_code ("1b_0mib.");
   9861  1.1  mrg 	  _0mmb_ = get_cpu_unit_code ("1b_0mmb.");
   9862  1.1  mrg 	  _0mfb_ = get_cpu_unit_code ("1b_0mfb.");
   9863  1.1  mrg 	  _0mlx_ = get_cpu_unit_code ("1b_0mlx.");
   9864  1.1  mrg 	  _1mii_ = get_cpu_unit_code ("1b_1mii.");
   9865  1.1  mrg 	  _1mmi_ = get_cpu_unit_code ("1b_1mmi.");
   9866  1.1  mrg 	  _1mfi_ = get_cpu_unit_code ("1b_1mfi.");
   9867  1.1  mrg 	  _1mmf_ = get_cpu_unit_code ("1b_1mmf.");
   9868  1.1  mrg 	  _1bbb_ = get_cpu_unit_code ("1b_1bbb.");
   9869  1.1  mrg 	  _1mbb_ = get_cpu_unit_code ("1b_1mbb.");
   9870  1.1  mrg 	  _1mib_ = get_cpu_unit_code ("1b_1mib.");
   9871  1.1  mrg 	  _1mmb_ = get_cpu_unit_code ("1b_1mmb.");
   9872  1.1  mrg 	  _1mfb_ = get_cpu_unit_code ("1b_1mfb.");
   9873  1.1  mrg 	  _1mlx_ = get_cpu_unit_code ("1b_1mlx.");
   9874  1.1  mrg 	}
   9875  1.1  mrg 
   9876  1.1  mrg       if (flag_selective_scheduling2
   9877  1.1  mrg 	  && !maybe_skip_selective_scheduling ())
   9878  1.1  mrg         run_selective_scheduling ();
   9879  1.1  mrg       else
   9880  1.1  mrg 	schedule_ebbs ();
   9881  1.1  mrg 
   9882  1.1  mrg       /* Redo alignment computation, as it might gone wrong.  */
   9883  1.1  mrg       compute_alignments ();
   9884  1.1  mrg 
   9885  1.1  mrg       /* We cannot reuse this one because it has been corrupted by the
   9886  1.1  mrg 	 evil glat.  */
   9887  1.1  mrg       finish_bundle_states ();
   9888  1.1  mrg       free (stops_p);
   9889  1.1  mrg       stops_p = NULL;
   9890  1.1  mrg       emit_insn_group_barriers (dump_file);
   9891  1.1  mrg 
   9892  1.1  mrg       ia64_final_schedule = 0;
   9893  1.1  mrg       timevar_pop (TV_SCHED2);
   9894  1.1  mrg     }
   9895  1.1  mrg   else
   9896  1.1  mrg     emit_all_insn_group_barriers (dump_file);
   9897  1.1  mrg 
   9898  1.1  mrg   df_analyze ();
   9899  1.1  mrg 
   9900  1.1  mrg   /* A call must not be the last instruction in a function, so that the
   9901  1.1  mrg      return address is still within the function, so that unwinding works
   9902  1.1  mrg      properly.  Note that IA-64 differs from dwarf2 on this point.  */
   9903  1.1  mrg   if (ia64_except_unwind_info (&global_options) == UI_TARGET)
   9904  1.1  mrg     {
   9905  1.1  mrg       rtx_insn *insn;
   9906  1.1  mrg       int saw_stop = 0;
   9907  1.1  mrg 
   9908  1.1  mrg       insn = get_last_insn ();
   9909  1.1  mrg       if (! INSN_P (insn))
   9910  1.1  mrg         insn = prev_active_insn (insn);
   9911  1.1  mrg       if (insn)
   9912  1.1  mrg 	{
   9913  1.1  mrg 	  /* Skip over insns that expand to nothing.  */
   9914  1.1  mrg 	  while (NONJUMP_INSN_P (insn)
   9915  1.1  mrg 		 && get_attr_empty (insn) == EMPTY_YES)
   9916  1.1  mrg 	    {
   9917  1.1  mrg 	      if (GET_CODE (PATTERN (insn)) == UNSPEC_VOLATILE
   9918  1.1  mrg 		  && XINT (PATTERN (insn), 1) == UNSPECV_INSN_GROUP_BARRIER)
   9919  1.1  mrg 		saw_stop = 1;
   9920  1.1  mrg 	      insn = prev_active_insn (insn);
   9921  1.1  mrg 	    }
   9922  1.1  mrg 	  if (CALL_P (insn))
   9923  1.1  mrg 	    {
   9924  1.1  mrg 	      if (! saw_stop)
   9925  1.1  mrg 		emit_insn (gen_insn_group_barrier (GEN_INT (3)));
   9926  1.1  mrg 	      emit_insn (gen_break_f ());
   9927  1.1  mrg 	      emit_insn (gen_insn_group_barrier (GEN_INT (3)));
   9928  1.1  mrg 	    }
   9929  1.1  mrg 	}
   9930  1.1  mrg     }
   9931  1.1  mrg 
   9932  1.1  mrg   emit_predicate_relation_info ();
   9933  1.1  mrg 
   9934  1.1  mrg   if (flag_var_tracking)
   9935  1.1  mrg     {
   9936  1.1  mrg       timevar_push (TV_VAR_TRACKING);
   9937  1.1  mrg       variable_tracking_main ();
   9938  1.1  mrg       timevar_pop (TV_VAR_TRACKING);
   9939  1.1  mrg     }
   9940  1.1  mrg   df_finish_pass (false);
   9941  1.1  mrg }
   9942  1.1  mrg 
   9943  1.1  mrg /* Return true if REGNO is used by the epilogue.  */
   9945  1.1  mrg 
   9946  1.1  mrg int
   9947  1.1  mrg ia64_epilogue_uses (int regno)
   9948  1.1  mrg {
   9949  1.1  mrg   switch (regno)
   9950  1.1  mrg     {
   9951  1.1  mrg     case R_GR (1):
   9952  1.1  mrg       /* With a call to a function in another module, we will write a new
   9953  1.1  mrg 	 value to "gp".  After returning from such a call, we need to make
   9954  1.1  mrg 	 sure the function restores the original gp-value, even if the
   9955  1.1  mrg 	 function itself does not use the gp anymore.  */
   9956  1.1  mrg       return !(TARGET_AUTO_PIC || TARGET_NO_PIC);
   9957  1.1  mrg 
   9958  1.1  mrg     case IN_REG (0): case IN_REG (1): case IN_REG (2): case IN_REG (3):
   9959  1.1  mrg     case IN_REG (4): case IN_REG (5): case IN_REG (6): case IN_REG (7):
   9960  1.1  mrg       /* For functions defined with the syscall_linkage attribute, all
   9961  1.1  mrg 	 input registers are marked as live at all function exits.  This
   9962  1.1  mrg 	 prevents the register allocator from using the input registers,
   9963  1.1  mrg 	 which in turn makes it possible to restart a system call after
   9964  1.1  mrg 	 an interrupt without having to save/restore the input registers.
   9965  1.1  mrg 	 This also prevents kernel data from leaking to application code.  */
   9966  1.1  mrg       return lookup_attribute ("syscall_linkage",
   9967  1.1  mrg 	   TYPE_ATTRIBUTES (TREE_TYPE (current_function_decl))) != NULL;
   9968  1.1  mrg 
   9969  1.1  mrg     case R_BR (0):
   9970  1.1  mrg       /* Conditional return patterns can't represent the use of `b0' as
   9971  1.1  mrg          the return address, so we force the value live this way.  */
   9972  1.1  mrg       return 1;
   9973  1.1  mrg 
   9974  1.1  mrg     case AR_PFS_REGNUM:
   9975  1.1  mrg       /* Likewise for ar.pfs, which is used by br.ret.  */
   9976  1.1  mrg       return 1;
   9977  1.1  mrg 
   9978  1.1  mrg     default:
   9979  1.1  mrg       return 0;
   9980  1.1  mrg     }
   9981  1.1  mrg }
   9982  1.1  mrg 
   9983  1.1  mrg /* Return true if REGNO is used by the frame unwinder.  */
   9984  1.1  mrg 
   9985  1.1  mrg int
   9986  1.1  mrg ia64_eh_uses (int regno)
   9987  1.1  mrg {
   9988  1.1  mrg   unsigned int r;
   9989  1.1  mrg 
   9990  1.1  mrg   if (! reload_completed)
   9991  1.1  mrg     return 0;
   9992  1.1  mrg 
   9993  1.1  mrg   if (regno == 0)
   9994  1.1  mrg     return 0;
   9995  1.1  mrg 
   9996  1.1  mrg   for (r = reg_save_b0; r <= reg_save_ar_lc; r++)
   9997  1.1  mrg     if (regno == current_frame_info.r[r]
   9998  1.1  mrg        || regno == emitted_frame_related_regs[r])
   9999  1.1  mrg       return 1;
   10000  1.1  mrg 
   10001  1.1  mrg   return 0;
   10002  1.1  mrg }
   10003  1.1  mrg 
   10004  1.1  mrg /* Return true if this goes in small data/bss.  */
   10006  1.1  mrg 
   10007  1.1  mrg /* ??? We could also support own long data here.  Generating movl/add/ld8
   10008  1.1  mrg    instead of addl,ld8/ld8.  This makes the code bigger, but should make the
   10009  1.1  mrg    code faster because there is one less load.  This also includes incomplete
   10010  1.1  mrg    types which can't go in sdata/sbss.  */
   10011  1.1  mrg 
   10012  1.1  mrg static bool
   10013  1.1  mrg ia64_in_small_data_p (const_tree exp)
   10014  1.1  mrg {
   10015  1.1  mrg   if (TARGET_NO_SDATA)
   10016  1.1  mrg     return false;
   10017  1.1  mrg 
   10018  1.1  mrg   /* We want to merge strings, so we never consider them small data.  */
   10019  1.1  mrg   if (TREE_CODE (exp) == STRING_CST)
   10020  1.1  mrg     return false;
   10021  1.1  mrg 
   10022  1.1  mrg   /* Functions are never small data.  */
   10023  1.1  mrg   if (TREE_CODE (exp) == FUNCTION_DECL)
   10024  1.1  mrg     return false;
   10025  1.1  mrg 
   10026  1.1  mrg   if (TREE_CODE (exp) == VAR_DECL && DECL_SECTION_NAME (exp))
   10027  1.1  mrg     {
   10028  1.1  mrg       const char *section = DECL_SECTION_NAME (exp);
   10029  1.1  mrg 
   10030  1.1  mrg       if (strcmp (section, ".sdata") == 0
   10031  1.1  mrg 	  || startswith (section, ".sdata.")
   10032  1.1  mrg 	  || startswith (section, ".gnu.linkonce.s.")
   10033  1.1  mrg 	  || strcmp (section, ".sbss") == 0
   10034  1.1  mrg 	  || startswith (section, ".sbss.")
   10035  1.1  mrg 	  || startswith (section, ".gnu.linkonce.sb."))
   10036  1.1  mrg 	return true;
   10037  1.1  mrg     }
   10038  1.1  mrg   else
   10039  1.1  mrg     {
   10040  1.1  mrg       HOST_WIDE_INT size = int_size_in_bytes (TREE_TYPE (exp));
   10041  1.1  mrg 
   10042  1.1  mrg       /* If this is an incomplete type with size 0, then we can't put it
   10043  1.1  mrg 	 in sdata because it might be too big when completed.  */
   10044  1.1  mrg       if (size > 0 && size <= ia64_section_threshold)
   10045  1.1  mrg 	return true;
   10046  1.1  mrg     }
   10047  1.1  mrg 
   10048  1.1  mrg   return false;
   10049  1.1  mrg }
   10050  1.1  mrg 
   10051  1.1  mrg /* Output assembly directives for prologue regions.  */
   10053  1.1  mrg 
   10054  1.1  mrg /* The current basic block number.  */
   10055  1.1  mrg 
   10056  1.1  mrg static bool last_block;
   10057  1.1  mrg 
   10058  1.1  mrg /* True if we need a copy_state command at the start of the next block.  */
   10059  1.1  mrg 
   10060  1.1  mrg static bool need_copy_state;
   10061  1.1  mrg 
   10062  1.1  mrg #ifndef MAX_ARTIFICIAL_LABEL_BYTES
   10063  1.1  mrg # define MAX_ARTIFICIAL_LABEL_BYTES 30
   10064  1.1  mrg #endif
   10065  1.1  mrg 
   10066  1.1  mrg /* The function emits unwind directives for the start of an epilogue.  */
   10067  1.1  mrg 
   10068  1.1  mrg static void
   10069  1.1  mrg process_epilogue (FILE *out_file, rtx insn ATTRIBUTE_UNUSED,
   10070  1.1  mrg 		  bool unwind, bool frame ATTRIBUTE_UNUSED)
   10071  1.1  mrg {
   10072  1.1  mrg   /* If this isn't the last block of the function, then we need to label the
   10073  1.1  mrg      current state, and copy it back in at the start of the next block.  */
   10074  1.1  mrg 
   10075  1.1  mrg   if (!last_block)
   10076  1.1  mrg     {
   10077  1.1  mrg       if (unwind)
   10078  1.1  mrg 	fprintf (out_file, "\t.label_state %d\n",
   10079  1.1  mrg 		 ++cfun->machine->state_num);
   10080  1.1  mrg       need_copy_state = true;
   10081  1.1  mrg     }
   10082  1.1  mrg 
   10083  1.1  mrg   if (unwind)
   10084  1.1  mrg     fprintf (out_file, "\t.restore sp\n");
   10085  1.1  mrg }
   10086  1.1  mrg 
   10087  1.1  mrg /* This function processes a SET pattern for REG_CFA_ADJUST_CFA.  */
   10088  1.1  mrg 
   10089  1.1  mrg static void
   10090  1.1  mrg process_cfa_adjust_cfa (FILE *out_file, rtx pat, rtx insn,
   10091  1.1  mrg 			bool unwind, bool frame)
   10092  1.1  mrg {
   10093  1.1  mrg   rtx dest = SET_DEST (pat);
   10094  1.1  mrg   rtx src = SET_SRC (pat);
   10095  1.1  mrg 
   10096  1.1  mrg   if (dest == stack_pointer_rtx)
   10097  1.1  mrg     {
   10098  1.1  mrg       if (GET_CODE (src) == PLUS)
   10099  1.1  mrg 	{
   10100  1.1  mrg 	  rtx op0 = XEXP (src, 0);
   10101  1.1  mrg 	  rtx op1 = XEXP (src, 1);
   10102  1.1  mrg 
   10103  1.1  mrg 	  gcc_assert (op0 == dest && GET_CODE (op1) == CONST_INT);
   10104  1.1  mrg 
   10105  1.1  mrg 	  if (INTVAL (op1) < 0)
   10106  1.1  mrg 	    {
   10107  1.1  mrg 	      gcc_assert (!frame_pointer_needed);
   10108  1.1  mrg 	      if (unwind)
   10109  1.1  mrg 		fprintf (out_file,
   10110  1.1  mrg 			 "\t.fframe " HOST_WIDE_INT_PRINT_DEC"\n",
   10111  1.1  mrg 			 -INTVAL (op1));
   10112  1.1  mrg 	    }
   10113  1.1  mrg 	  else
   10114  1.1  mrg 	    process_epilogue (out_file, insn, unwind, frame);
   10115  1.1  mrg 	}
   10116  1.1  mrg       else
   10117  1.1  mrg 	{
   10118  1.1  mrg 	  gcc_assert (src == hard_frame_pointer_rtx);
   10119  1.1  mrg 	  process_epilogue (out_file, insn, unwind, frame);
   10120  1.1  mrg 	}
   10121  1.1  mrg     }
   10122  1.1  mrg   else if (dest == hard_frame_pointer_rtx)
   10123  1.1  mrg     {
   10124  1.1  mrg       gcc_assert (src == stack_pointer_rtx);
   10125  1.1  mrg       gcc_assert (frame_pointer_needed);
   10126  1.1  mrg 
   10127  1.1  mrg       if (unwind)
   10128  1.1  mrg 	fprintf (out_file, "\t.vframe r%d\n",
   10129  1.1  mrg 		 ia64_dbx_register_number (REGNO (dest)));
   10130  1.1  mrg     }
   10131  1.1  mrg   else
   10132  1.1  mrg     gcc_unreachable ();
   10133  1.1  mrg }
   10134  1.1  mrg 
   10135  1.1  mrg /* This function processes a SET pattern for REG_CFA_REGISTER.  */
   10136  1.1  mrg 
   10137  1.1  mrg static void
   10138  1.1  mrg process_cfa_register (FILE *out_file, rtx pat, bool unwind)
   10139  1.1  mrg {
   10140  1.1  mrg   rtx dest = SET_DEST (pat);
   10141  1.1  mrg   rtx src = SET_SRC (pat);
   10142  1.1  mrg   int dest_regno = REGNO (dest);
   10143  1.1  mrg   int src_regno;
   10144  1.1  mrg 
   10145  1.1  mrg   if (src == pc_rtx)
   10146  1.1  mrg     {
   10147  1.1  mrg       /* Saving return address pointer.  */
   10148  1.1  mrg       if (unwind)
   10149  1.1  mrg 	fprintf (out_file, "\t.save rp, r%d\n",
   10150  1.1  mrg 		 ia64_dbx_register_number (dest_regno));
   10151  1.1  mrg       return;
   10152  1.1  mrg     }
   10153  1.1  mrg 
   10154  1.1  mrg   src_regno = REGNO (src);
   10155  1.1  mrg 
   10156  1.1  mrg   switch (src_regno)
   10157  1.1  mrg     {
   10158  1.1  mrg     case PR_REG (0):
   10159  1.1  mrg       gcc_assert (dest_regno == current_frame_info.r[reg_save_pr]);
   10160  1.1  mrg       if (unwind)
   10161  1.1  mrg 	fprintf (out_file, "\t.save pr, r%d\n",
   10162  1.1  mrg 		 ia64_dbx_register_number (dest_regno));
   10163  1.1  mrg       break;
   10164  1.1  mrg 
   10165  1.1  mrg     case AR_UNAT_REGNUM:
   10166  1.1  mrg       gcc_assert (dest_regno == current_frame_info.r[reg_save_ar_unat]);
   10167  1.1  mrg       if (unwind)
   10168  1.1  mrg 	fprintf (out_file, "\t.save ar.unat, r%d\n",
   10169  1.1  mrg 		 ia64_dbx_register_number (dest_regno));
   10170  1.1  mrg       break;
   10171  1.1  mrg 
   10172  1.1  mrg     case AR_LC_REGNUM:
   10173  1.1  mrg       gcc_assert (dest_regno == current_frame_info.r[reg_save_ar_lc]);
   10174  1.1  mrg       if (unwind)
   10175  1.1  mrg 	fprintf (out_file, "\t.save ar.lc, r%d\n",
   10176  1.1  mrg 		 ia64_dbx_register_number (dest_regno));
   10177  1.1  mrg       break;
   10178  1.1  mrg 
   10179  1.1  mrg     default:
   10180  1.1  mrg       /* Everything else should indicate being stored to memory.  */
   10181  1.1  mrg       gcc_unreachable ();
   10182  1.1  mrg     }
   10183  1.1  mrg }
   10184  1.1  mrg 
   10185  1.1  mrg /* This function processes a SET pattern for REG_CFA_OFFSET.  */
   10186  1.1  mrg 
   10187  1.1  mrg static void
   10188  1.1  mrg process_cfa_offset (FILE *out_file, rtx pat, bool unwind)
   10189  1.1  mrg {
   10190  1.1  mrg   rtx dest = SET_DEST (pat);
   10191  1.1  mrg   rtx src = SET_SRC (pat);
   10192  1.1  mrg   int src_regno = REGNO (src);
   10193  1.1  mrg   const char *saveop;
   10194  1.1  mrg   HOST_WIDE_INT off;
   10195  1.1  mrg   rtx base;
   10196  1.1  mrg 
   10197  1.1  mrg   gcc_assert (MEM_P (dest));
   10198  1.1  mrg   if (GET_CODE (XEXP (dest, 0)) == REG)
   10199  1.1  mrg     {
   10200  1.1  mrg       base = XEXP (dest, 0);
   10201  1.1  mrg       off = 0;
   10202  1.1  mrg     }
   10203  1.1  mrg   else
   10204  1.1  mrg     {
   10205  1.1  mrg       gcc_assert (GET_CODE (XEXP (dest, 0)) == PLUS
   10206  1.1  mrg 		  && GET_CODE (XEXP (XEXP (dest, 0), 1)) == CONST_INT);
   10207  1.1  mrg       base = XEXP (XEXP (dest, 0), 0);
   10208  1.1  mrg       off = INTVAL (XEXP (XEXP (dest, 0), 1));
   10209  1.1  mrg     }
   10210  1.1  mrg 
   10211  1.1  mrg   if (base == hard_frame_pointer_rtx)
   10212  1.1  mrg     {
   10213  1.1  mrg       saveop = ".savepsp";
   10214  1.1  mrg       off = - off;
   10215  1.1  mrg     }
   10216  1.1  mrg   else
   10217  1.1  mrg     {
   10218  1.1  mrg       gcc_assert (base == stack_pointer_rtx);
   10219  1.1  mrg       saveop = ".savesp";
   10220  1.1  mrg     }
   10221  1.1  mrg 
   10222  1.1  mrg   src_regno = REGNO (src);
   10223  1.1  mrg   switch (src_regno)
   10224  1.1  mrg     {
   10225  1.1  mrg     case BR_REG (0):
   10226  1.1  mrg       gcc_assert (!current_frame_info.r[reg_save_b0]);
   10227  1.1  mrg       if (unwind)
   10228  1.1  mrg 	fprintf (out_file, "\t%s rp, " HOST_WIDE_INT_PRINT_DEC "\n",
   10229  1.1  mrg 		 saveop, off);
   10230  1.1  mrg       break;
   10231  1.1  mrg 
   10232  1.1  mrg     case PR_REG (0):
   10233  1.1  mrg       gcc_assert (!current_frame_info.r[reg_save_pr]);
   10234  1.1  mrg       if (unwind)
   10235  1.1  mrg 	fprintf (out_file, "\t%s pr, " HOST_WIDE_INT_PRINT_DEC "\n",
   10236  1.1  mrg 		 saveop, off);
   10237  1.1  mrg       break;
   10238  1.1  mrg 
   10239  1.1  mrg     case AR_LC_REGNUM:
   10240  1.1  mrg       gcc_assert (!current_frame_info.r[reg_save_ar_lc]);
   10241  1.1  mrg       if (unwind)
   10242  1.1  mrg 	fprintf (out_file, "\t%s ar.lc, " HOST_WIDE_INT_PRINT_DEC "\n",
   10243  1.1  mrg 		 saveop, off);
   10244  1.1  mrg       break;
   10245  1.1  mrg 
   10246  1.1  mrg     case AR_PFS_REGNUM:
   10247  1.1  mrg       gcc_assert (!current_frame_info.r[reg_save_ar_pfs]);
   10248  1.1  mrg       if (unwind)
   10249  1.1  mrg 	fprintf (out_file, "\t%s ar.pfs, " HOST_WIDE_INT_PRINT_DEC "\n",
   10250  1.1  mrg 		 saveop, off);
   10251  1.1  mrg       break;
   10252  1.1  mrg 
   10253  1.1  mrg     case AR_UNAT_REGNUM:
   10254  1.1  mrg       gcc_assert (!current_frame_info.r[reg_save_ar_unat]);
   10255  1.1  mrg       if (unwind)
   10256  1.1  mrg 	fprintf (out_file, "\t%s ar.unat, " HOST_WIDE_INT_PRINT_DEC "\n",
   10257  1.1  mrg 		 saveop, off);
   10258  1.1  mrg       break;
   10259  1.1  mrg 
   10260  1.1  mrg     case GR_REG (4):
   10261  1.1  mrg     case GR_REG (5):
   10262  1.1  mrg     case GR_REG (6):
   10263  1.1  mrg     case GR_REG (7):
   10264  1.1  mrg       if (unwind)
   10265  1.1  mrg 	fprintf (out_file, "\t.save.g 0x%x\n",
   10266  1.1  mrg 		 1 << (src_regno - GR_REG (4)));
   10267  1.1  mrg       break;
   10268  1.1  mrg 
   10269  1.1  mrg     case BR_REG (1):
   10270  1.1  mrg     case BR_REG (2):
   10271  1.1  mrg     case BR_REG (3):
   10272  1.1  mrg     case BR_REG (4):
   10273  1.1  mrg     case BR_REG (5):
   10274  1.1  mrg       if (unwind)
   10275  1.1  mrg 	fprintf (out_file, "\t.save.b 0x%x\n",
   10276  1.1  mrg 		 1 << (src_regno - BR_REG (1)));
   10277  1.1  mrg       break;
   10278  1.1  mrg 
   10279  1.1  mrg     case FR_REG (2):
   10280  1.1  mrg     case FR_REG (3):
   10281  1.1  mrg     case FR_REG (4):
   10282  1.1  mrg     case FR_REG (5):
   10283  1.1  mrg       if (unwind)
   10284  1.1  mrg 	fprintf (out_file, "\t.save.f 0x%x\n",
   10285  1.1  mrg 		 1 << (src_regno - FR_REG (2)));
   10286  1.1  mrg       break;
   10287  1.1  mrg 
   10288  1.1  mrg     case FR_REG (16): case FR_REG (17): case FR_REG (18): case FR_REG (19):
   10289  1.1  mrg     case FR_REG (20): case FR_REG (21): case FR_REG (22): case FR_REG (23):
   10290  1.1  mrg     case FR_REG (24): case FR_REG (25): case FR_REG (26): case FR_REG (27):
   10291  1.1  mrg     case FR_REG (28): case FR_REG (29): case FR_REG (30): case FR_REG (31):
   10292  1.1  mrg       if (unwind)
   10293  1.1  mrg 	fprintf (out_file, "\t.save.gf 0x0, 0x%x\n",
   10294  1.1  mrg 		 1 << (src_regno - FR_REG (12)));
   10295  1.1  mrg       break;
   10296  1.1  mrg 
   10297  1.1  mrg     default:
   10298  1.1  mrg       /* ??? For some reason we mark other general registers, even those
   10299  1.1  mrg 	 we can't represent in the unwind info.  Ignore them.  */
   10300  1.1  mrg       break;
   10301  1.1  mrg     }
   10302  1.1  mrg }
   10303  1.1  mrg 
   10304  1.1  mrg /* This function looks at a single insn and emits any directives
   10305  1.1  mrg    required to unwind this insn.  */
   10306  1.1  mrg 
   10307  1.1  mrg static void
   10308  1.1  mrg ia64_asm_unwind_emit (FILE *out_file, rtx_insn *insn)
   10309  1.1  mrg {
   10310  1.1  mrg   bool unwind = ia64_except_unwind_info (&global_options) == UI_TARGET;
   10311  1.1  mrg   bool frame = dwarf2out_do_frame ();
   10312  1.1  mrg   rtx note, pat;
   10313  1.1  mrg   bool handled_one;
   10314  1.1  mrg 
   10315  1.1  mrg   if (!unwind && !frame)
   10316  1.1  mrg     return;
   10317  1.1  mrg 
   10318  1.1  mrg   if (NOTE_INSN_BASIC_BLOCK_P (insn))
   10319  1.1  mrg     {
   10320  1.1  mrg       last_block = NOTE_BASIC_BLOCK (insn)->next_bb
   10321  1.1  mrg      == EXIT_BLOCK_PTR_FOR_FN (cfun);
   10322  1.1  mrg 
   10323  1.1  mrg       /* Restore unwind state from immediately before the epilogue.  */
   10324  1.1  mrg       if (need_copy_state)
   10325  1.1  mrg 	{
   10326  1.1  mrg 	  if (unwind)
   10327  1.1  mrg 	    {
   10328  1.1  mrg 	      fprintf (out_file, "\t.body\n");
   10329  1.1  mrg 	      fprintf (out_file, "\t.copy_state %d\n",
   10330  1.1  mrg 		       cfun->machine->state_num);
   10331  1.1  mrg 	    }
   10332  1.1  mrg 	  need_copy_state = false;
   10333  1.1  mrg 	}
   10334  1.1  mrg     }
   10335  1.1  mrg 
   10336  1.1  mrg   if (NOTE_P (insn) || ! RTX_FRAME_RELATED_P (insn))
   10337  1.1  mrg     return;
   10338  1.1  mrg 
   10339  1.1  mrg   /* Look for the ALLOC insn.  */
   10340  1.1  mrg   if (INSN_CODE (insn) == CODE_FOR_alloc)
   10341  1.1  mrg     {
   10342  1.1  mrg       rtx dest = SET_DEST (XVECEXP (PATTERN (insn), 0, 0));
   10343  1.1  mrg       int dest_regno = REGNO (dest);
   10344  1.1  mrg 
   10345  1.1  mrg       /* If this is the final destination for ar.pfs, then this must
   10346  1.1  mrg 	 be the alloc in the prologue.  */
   10347  1.1  mrg       if (dest_regno == current_frame_info.r[reg_save_ar_pfs])
   10348  1.1  mrg 	{
   10349  1.1  mrg 	  if (unwind)
   10350  1.1  mrg 	    fprintf (out_file, "\t.save ar.pfs, r%d\n",
   10351  1.1  mrg 		     ia64_dbx_register_number (dest_regno));
   10352  1.1  mrg 	}
   10353  1.1  mrg       else
   10354  1.1  mrg 	{
   10355  1.1  mrg 	  /* This must be an alloc before a sibcall.  We must drop the
   10356  1.1  mrg 	     old frame info.  The easiest way to drop the old frame
   10357  1.1  mrg 	     info is to ensure we had a ".restore sp" directive
   10358  1.1  mrg 	     followed by a new prologue.  If the procedure doesn't
   10359  1.1  mrg 	     have a memory-stack frame, we'll issue a dummy ".restore
   10360  1.1  mrg 	     sp" now.  */
   10361  1.1  mrg 	  if (current_frame_info.total_size == 0 && !frame_pointer_needed)
   10362  1.1  mrg 	    /* if haven't done process_epilogue() yet, do it now */
   10363  1.1  mrg 	    process_epilogue (out_file, insn, unwind, frame);
   10364  1.1  mrg 	  if (unwind)
   10365  1.1  mrg 	    fprintf (out_file, "\t.prologue\n");
   10366  1.1  mrg 	}
   10367  1.1  mrg       return;
   10368  1.1  mrg     }
   10369  1.1  mrg 
   10370  1.1  mrg   handled_one = false;
   10371  1.1  mrg   for (note = REG_NOTES (insn); note; note = XEXP (note, 1))
   10372  1.1  mrg     switch (REG_NOTE_KIND (note))
   10373  1.1  mrg       {
   10374  1.1  mrg       case REG_CFA_ADJUST_CFA:
   10375  1.1  mrg 	pat = XEXP (note, 0);
   10376  1.1  mrg 	if (pat == NULL)
   10377  1.1  mrg 	  pat = PATTERN (insn);
   10378  1.1  mrg 	process_cfa_adjust_cfa (out_file, pat, insn, unwind, frame);
   10379  1.1  mrg 	handled_one = true;
   10380  1.1  mrg 	break;
   10381  1.1  mrg 
   10382  1.1  mrg       case REG_CFA_OFFSET:
   10383  1.1  mrg 	pat = XEXP (note, 0);
   10384  1.1  mrg 	if (pat == NULL)
   10385  1.1  mrg 	  pat = PATTERN (insn);
   10386  1.1  mrg 	process_cfa_offset (out_file, pat, unwind);
   10387  1.1  mrg 	handled_one = true;
   10388  1.1  mrg 	break;
   10389  1.1  mrg 
   10390  1.1  mrg       case REG_CFA_REGISTER:
   10391  1.1  mrg 	pat = XEXP (note, 0);
   10392  1.1  mrg 	if (pat == NULL)
   10393  1.1  mrg 	  pat = PATTERN (insn);
   10394  1.1  mrg 	process_cfa_register (out_file, pat, unwind);
   10395  1.1  mrg 	handled_one = true;
   10396  1.1  mrg 	break;
   10397  1.1  mrg 
   10398  1.1  mrg       case REG_FRAME_RELATED_EXPR:
   10399  1.1  mrg       case REG_CFA_DEF_CFA:
   10400  1.1  mrg       case REG_CFA_EXPRESSION:
   10401  1.1  mrg       case REG_CFA_RESTORE:
   10402  1.1  mrg       case REG_CFA_SET_VDRAP:
   10403  1.1  mrg 	/* Not used in the ia64 port.  */
   10404  1.1  mrg 	gcc_unreachable ();
   10405  1.1  mrg 
   10406  1.1  mrg       default:
   10407  1.1  mrg 	/* Not a frame-related note.  */
   10408  1.1  mrg 	break;
   10409  1.1  mrg       }
   10410  1.1  mrg 
   10411  1.1  mrg   /* All REG_FRAME_RELATED_P insns, besides ALLOC, are marked with the
   10412  1.1  mrg      explicit action to take.  No guessing required.  */
   10413  1.1  mrg   gcc_assert (handled_one);
   10414  1.1  mrg }
   10415  1.1  mrg 
   10416  1.1  mrg /* Implement TARGET_ASM_EMIT_EXCEPT_PERSONALITY.  */
   10417  1.1  mrg 
   10418  1.1  mrg static void
   10419  1.1  mrg ia64_asm_emit_except_personality (rtx personality)
   10420  1.1  mrg {
   10421  1.1  mrg   fputs ("\t.personality\t", asm_out_file);
   10422  1.1  mrg   output_addr_const (asm_out_file, personality);
   10423  1.1  mrg   fputc ('\n', asm_out_file);
   10424  1.1  mrg }
   10425  1.1  mrg 
   10426  1.1  mrg /* Implement TARGET_ASM_INITIALIZE_SECTIONS.  */
   10427  1.1  mrg 
   10428  1.1  mrg static void
   10429  1.1  mrg ia64_asm_init_sections (void)
   10430  1.1  mrg {
   10431  1.1  mrg   exception_section = get_unnamed_section (0, output_section_asm_op,
   10432  1.1  mrg 					   "\t.handlerdata");
   10433  1.1  mrg }
   10434  1.1  mrg 
   10435  1.1  mrg /* Implement TARGET_DEBUG_UNWIND_INFO.  */
   10436  1.1  mrg 
   10437  1.1  mrg static enum unwind_info_type
   10438  1.1  mrg ia64_debug_unwind_info (void)
   10439  1.1  mrg {
   10440  1.1  mrg   return UI_TARGET;
   10441  1.1  mrg }
   10442  1.1  mrg 
   10443  1.1  mrg enum ia64_builtins
   10445  1.1  mrg {
   10446  1.1  mrg   IA64_BUILTIN_BSP,
   10447  1.1  mrg   IA64_BUILTIN_COPYSIGNQ,
   10448  1.1  mrg   IA64_BUILTIN_FABSQ,
   10449  1.1  mrg   IA64_BUILTIN_FLUSHRS,
   10450  1.1  mrg   IA64_BUILTIN_INFQ,
   10451  1.1  mrg   IA64_BUILTIN_HUGE_VALQ,
   10452  1.1  mrg   IA64_BUILTIN_NANQ,
   10453  1.1  mrg   IA64_BUILTIN_NANSQ,
   10454  1.1  mrg   IA64_BUILTIN_max
   10455  1.1  mrg };
   10456  1.1  mrg 
   10457  1.1  mrg static GTY(()) tree ia64_builtins[(int) IA64_BUILTIN_max];
   10458  1.1  mrg 
   10459  1.1  mrg void
   10460  1.1  mrg ia64_init_builtins (void)
   10461  1.1  mrg {
   10462  1.1  mrg   tree fpreg_type;
   10463  1.1  mrg   tree float80_type;
   10464  1.1  mrg   tree decl;
   10465  1.1  mrg 
   10466  1.1  mrg   /* The __fpreg type.  */
   10467  1.1  mrg   fpreg_type = make_node (REAL_TYPE);
   10468  1.1  mrg   TYPE_PRECISION (fpreg_type) = 82;
   10469  1.1  mrg   layout_type (fpreg_type);
   10470  1.1  mrg   (*lang_hooks.types.register_builtin_type) (fpreg_type, "__fpreg");
   10471  1.1  mrg 
   10472  1.1  mrg   /* The __float80 type.  */
   10473  1.1  mrg   if (float64x_type_node != NULL_TREE
   10474  1.1  mrg       && TYPE_MODE (float64x_type_node) == XFmode)
   10475  1.1  mrg     float80_type = float64x_type_node;
   10476  1.1  mrg   else
   10477  1.1  mrg     {
   10478  1.1  mrg       float80_type = make_node (REAL_TYPE);
   10479  1.1  mrg       TYPE_PRECISION (float80_type) = 80;
   10480  1.1  mrg       layout_type (float80_type);
   10481  1.1  mrg     }
   10482  1.1  mrg   (*lang_hooks.types.register_builtin_type) (float80_type, "__float80");
   10483  1.1  mrg 
   10484  1.1  mrg   /* The __float128 type.  */
   10485  1.1  mrg   if (!TARGET_HPUX)
   10486  1.1  mrg     {
   10487  1.1  mrg       tree ftype;
   10488  1.1  mrg       tree const_string_type
   10489  1.1  mrg 	= build_pointer_type (build_qualified_type
   10490  1.1  mrg 			      (char_type_node, TYPE_QUAL_CONST));
   10491  1.1  mrg 
   10492  1.1  mrg       (*lang_hooks.types.register_builtin_type) (float128_type_node,
   10493  1.1  mrg 						 "__float128");
   10494  1.1  mrg 
   10495  1.1  mrg       /* TFmode support builtins.  */
   10496  1.1  mrg       ftype = build_function_type_list (float128_type_node, NULL_TREE);
   10497  1.1  mrg       decl = add_builtin_function ("__builtin_infq", ftype,
   10498  1.1  mrg 				   IA64_BUILTIN_INFQ, BUILT_IN_MD,
   10499  1.1  mrg 				   NULL, NULL_TREE);
   10500  1.1  mrg       ia64_builtins[IA64_BUILTIN_INFQ] = decl;
   10501  1.1  mrg 
   10502  1.1  mrg       decl = add_builtin_function ("__builtin_huge_valq", ftype,
   10503  1.1  mrg 				   IA64_BUILTIN_HUGE_VALQ, BUILT_IN_MD,
   10504  1.1  mrg 				   NULL, NULL_TREE);
   10505  1.1  mrg       ia64_builtins[IA64_BUILTIN_HUGE_VALQ] = decl;
   10506  1.1  mrg 
   10507  1.1  mrg       ftype = build_function_type_list (float128_type_node,
   10508  1.1  mrg 					const_string_type,
   10509  1.1  mrg 					NULL_TREE);
   10510  1.1  mrg       decl = add_builtin_function ("__builtin_nanq", ftype,
   10511  1.1  mrg 				   IA64_BUILTIN_NANQ, BUILT_IN_MD,
   10512  1.1  mrg 				   "nanq", NULL_TREE);
   10513  1.1  mrg       TREE_READONLY (decl) = 1;
   10514  1.1  mrg       ia64_builtins[IA64_BUILTIN_NANQ] = decl;
   10515  1.1  mrg 
   10516  1.1  mrg       decl = add_builtin_function ("__builtin_nansq", ftype,
   10517  1.1  mrg 				   IA64_BUILTIN_NANSQ, BUILT_IN_MD,
   10518  1.1  mrg 				   "nansq", NULL_TREE);
   10519  1.1  mrg       TREE_READONLY (decl) = 1;
   10520  1.1  mrg       ia64_builtins[IA64_BUILTIN_NANSQ] = decl;
   10521  1.1  mrg 
   10522  1.1  mrg       ftype = build_function_type_list (float128_type_node,
   10523  1.1  mrg 					float128_type_node,
   10524  1.1  mrg 					NULL_TREE);
   10525  1.1  mrg       decl = add_builtin_function ("__builtin_fabsq", ftype,
   10526  1.1  mrg 				   IA64_BUILTIN_FABSQ, BUILT_IN_MD,
   10527  1.1  mrg 				   "__fabstf2", NULL_TREE);
   10528  1.1  mrg       TREE_READONLY (decl) = 1;
   10529  1.1  mrg       ia64_builtins[IA64_BUILTIN_FABSQ] = decl;
   10530  1.1  mrg 
   10531  1.1  mrg       ftype = build_function_type_list (float128_type_node,
   10532  1.1  mrg 					float128_type_node,
   10533  1.1  mrg 					float128_type_node,
   10534  1.1  mrg 					NULL_TREE);
   10535  1.1  mrg       decl = add_builtin_function ("__builtin_copysignq", ftype,
   10536  1.1  mrg 				   IA64_BUILTIN_COPYSIGNQ, BUILT_IN_MD,
   10537  1.1  mrg 				   "__copysigntf3", NULL_TREE);
   10538  1.1  mrg       TREE_READONLY (decl) = 1;
   10539  1.1  mrg       ia64_builtins[IA64_BUILTIN_COPYSIGNQ] = decl;
   10540  1.1  mrg     }
   10541  1.1  mrg   else
   10542  1.1  mrg     /* Under HPUX, this is a synonym for "long double".  */
   10543  1.1  mrg     (*lang_hooks.types.register_builtin_type) (long_double_type_node,
   10544  1.1  mrg 					       "__float128");
   10545  1.1  mrg 
   10546  1.1  mrg   /* Fwrite on VMS is non-standard.  */
   10547  1.1  mrg #if TARGET_ABI_OPEN_VMS
   10548  1.1  mrg   vms_patch_builtins ();
   10549  1.1  mrg #endif
   10550  1.1  mrg 
   10551  1.1  mrg #define def_builtin(name, type, code)					\
   10552  1.1  mrg   add_builtin_function ((name), (type), (code), BUILT_IN_MD,	\
   10553  1.1  mrg 		       NULL, NULL_TREE)
   10554  1.1  mrg 
   10555  1.1  mrg   decl = def_builtin ("__builtin_ia64_bsp",
   10556  1.1  mrg 		      build_function_type_list (ptr_type_node, NULL_TREE),
   10557  1.1  mrg 		      IA64_BUILTIN_BSP);
   10558  1.1  mrg   ia64_builtins[IA64_BUILTIN_BSP] = decl;
   10559  1.1  mrg 
   10560  1.1  mrg   decl = def_builtin ("__builtin_ia64_flushrs",
   10561  1.1  mrg 		      build_function_type_list (void_type_node, NULL_TREE),
   10562  1.1  mrg 		      IA64_BUILTIN_FLUSHRS);
   10563  1.1  mrg   ia64_builtins[IA64_BUILTIN_FLUSHRS] = decl;
   10564  1.1  mrg 
   10565  1.1  mrg #undef def_builtin
   10566  1.1  mrg 
   10567  1.1  mrg   if (TARGET_HPUX)
   10568  1.1  mrg     {
   10569  1.1  mrg       if ((decl = builtin_decl_explicit (BUILT_IN_FINITE)) != NULL_TREE)
   10570  1.1  mrg 	set_user_assembler_name (decl, "_Isfinite");
   10571  1.1  mrg       if ((decl = builtin_decl_explicit (BUILT_IN_FINITEF)) != NULL_TREE)
   10572  1.1  mrg 	set_user_assembler_name (decl, "_Isfinitef");
   10573  1.1  mrg       if ((decl = builtin_decl_explicit (BUILT_IN_FINITEL)) != NULL_TREE)
   10574  1.1  mrg 	set_user_assembler_name (decl, "_Isfinitef128");
   10575  1.1  mrg     }
   10576  1.1  mrg }
   10577  1.1  mrg 
   10578  1.1  mrg static tree
   10579  1.1  mrg ia64_fold_builtin (tree fndecl, int n_args ATTRIBUTE_UNUSED,
   10580  1.1  mrg 		   tree *args, bool ignore ATTRIBUTE_UNUSED)
   10581  1.1  mrg {
   10582  1.1  mrg   if (DECL_BUILT_IN_CLASS (fndecl) == BUILT_IN_MD)
   10583  1.1  mrg     {
   10584  1.1  mrg       enum ia64_builtins fn_code
   10585  1.1  mrg 	= (enum ia64_builtins) DECL_MD_FUNCTION_CODE (fndecl);
   10586  1.1  mrg       switch (fn_code)
   10587  1.1  mrg 	{
   10588  1.1  mrg 	case IA64_BUILTIN_NANQ:
   10589  1.1  mrg 	case IA64_BUILTIN_NANSQ:
   10590  1.1  mrg 	  {
   10591  1.1  mrg 	    tree type = TREE_TYPE (TREE_TYPE (fndecl));
   10592  1.1  mrg 	    const char *str = c_getstr (*args);
   10593  1.1  mrg 	    int quiet = fn_code == IA64_BUILTIN_NANQ;
   10594  1.1  mrg 	    REAL_VALUE_TYPE real;
   10595  1.1  mrg 
   10596  1.1  mrg 	    if (str && real_nan (&real, str, quiet, TYPE_MODE (type)))
   10597  1.1  mrg 	      return build_real (type, real);
   10598  1.1  mrg 	    return NULL_TREE;
   10599  1.1  mrg 	  }
   10600  1.1  mrg 
   10601  1.1  mrg 	default:
   10602  1.1  mrg 	  break;
   10603  1.1  mrg 	}
   10604  1.1  mrg     }
   10605  1.1  mrg 
   10606  1.1  mrg #ifdef SUBTARGET_FOLD_BUILTIN
   10607  1.1  mrg   return SUBTARGET_FOLD_BUILTIN (fndecl, n_args, args, ignore);
   10608  1.1  mrg #endif
   10609  1.1  mrg 
   10610  1.1  mrg   return NULL_TREE;
   10611  1.1  mrg }
   10612  1.1  mrg 
   10613  1.1  mrg rtx
   10614  1.1  mrg ia64_expand_builtin (tree exp, rtx target, rtx subtarget ATTRIBUTE_UNUSED,
   10615  1.1  mrg 		     machine_mode mode ATTRIBUTE_UNUSED,
   10616  1.1  mrg 		     int ignore ATTRIBUTE_UNUSED)
   10617  1.1  mrg {
   10618  1.1  mrg   tree fndecl = TREE_OPERAND (CALL_EXPR_FN (exp), 0);
   10619  1.1  mrg   unsigned int fcode = DECL_MD_FUNCTION_CODE (fndecl);
   10620  1.1  mrg 
   10621  1.1  mrg   switch (fcode)
   10622  1.1  mrg     {
   10623  1.1  mrg     case IA64_BUILTIN_BSP:
   10624  1.1  mrg       if (! target || ! register_operand (target, DImode))
   10625  1.1  mrg 	target = gen_reg_rtx (DImode);
   10626  1.1  mrg       emit_insn (gen_bsp_value (target));
   10627  1.1  mrg #ifdef POINTERS_EXTEND_UNSIGNED
   10628  1.1  mrg       target = convert_memory_address (ptr_mode, target);
   10629  1.1  mrg #endif
   10630  1.1  mrg       return target;
   10631  1.1  mrg 
   10632  1.1  mrg     case IA64_BUILTIN_FLUSHRS:
   10633  1.1  mrg       emit_insn (gen_flushrs ());
   10634  1.1  mrg       return const0_rtx;
   10635  1.1  mrg 
   10636  1.1  mrg     case IA64_BUILTIN_INFQ:
   10637  1.1  mrg     case IA64_BUILTIN_HUGE_VALQ:
   10638  1.1  mrg       {
   10639  1.1  mrg         machine_mode target_mode = TYPE_MODE (TREE_TYPE (exp));
   10640  1.1  mrg 	REAL_VALUE_TYPE inf;
   10641  1.1  mrg 	rtx tmp;
   10642  1.1  mrg 
   10643  1.1  mrg 	real_inf (&inf);
   10644  1.1  mrg 	tmp = const_double_from_real_value (inf, target_mode);
   10645  1.1  mrg 
   10646  1.1  mrg 	tmp = validize_mem (force_const_mem (target_mode, tmp));
   10647  1.1  mrg 
   10648  1.1  mrg 	if (target == 0)
   10649  1.1  mrg 	  target = gen_reg_rtx (target_mode);
   10650  1.1  mrg 
   10651  1.1  mrg 	emit_move_insn (target, tmp);
   10652  1.1  mrg 	return target;
   10653  1.1  mrg       }
   10654  1.1  mrg 
   10655  1.1  mrg     case IA64_BUILTIN_NANQ:
   10656  1.1  mrg     case IA64_BUILTIN_NANSQ:
   10657  1.1  mrg     case IA64_BUILTIN_FABSQ:
   10658  1.1  mrg     case IA64_BUILTIN_COPYSIGNQ:
   10659  1.1  mrg       return expand_call (exp, target, ignore);
   10660  1.1  mrg 
   10661  1.1  mrg     default:
   10662  1.1  mrg       gcc_unreachable ();
   10663  1.1  mrg     }
   10664  1.1  mrg 
   10665  1.1  mrg   return NULL_RTX;
   10666  1.1  mrg }
   10667  1.1  mrg 
   10668  1.1  mrg /* Return the ia64 builtin for CODE.  */
   10669  1.1  mrg 
   10670  1.1  mrg static tree
   10671  1.1  mrg ia64_builtin_decl (unsigned code, bool initialize_p ATTRIBUTE_UNUSED)
   10672  1.1  mrg {
   10673  1.1  mrg   if (code >= IA64_BUILTIN_max)
   10674  1.1  mrg     return error_mark_node;
   10675  1.1  mrg 
   10676  1.1  mrg   return ia64_builtins[code];
   10677  1.1  mrg }
   10678  1.1  mrg 
   10679  1.1  mrg /* Implement TARGET_FUNCTION_ARG_PADDING.
   10680  1.1  mrg 
   10681  1.1  mrg    For the HP-UX IA64 aggregate parameters are passed stored in the
   10682  1.1  mrg    most significant bits of the stack slot.  */
   10683  1.1  mrg 
   10684  1.1  mrg static pad_direction
   10685  1.1  mrg ia64_function_arg_padding (machine_mode mode, const_tree type)
   10686  1.1  mrg {
   10687  1.1  mrg   /* Exception to normal case for structures/unions/etc.  */
   10688  1.1  mrg   if (TARGET_HPUX
   10689  1.1  mrg       && type
   10690  1.1  mrg       && AGGREGATE_TYPE_P (type)
   10691  1.1  mrg       && int_size_in_bytes (type) < UNITS_PER_WORD)
   10692  1.1  mrg     return PAD_UPWARD;
   10693  1.1  mrg 
   10694  1.1  mrg   /* Fall back to the default.  */
   10695  1.1  mrg   return default_function_arg_padding (mode, type);
   10696  1.1  mrg }
   10697  1.1  mrg 
   10698  1.1  mrg /* Emit text to declare externally defined variables and functions, because
   10699  1.1  mrg    the Intel assembler does not support undefined externals.  */
   10700  1.1  mrg 
   10701  1.1  mrg void
   10702  1.1  mrg ia64_asm_output_external (FILE *file, tree decl, const char *name)
   10703  1.1  mrg {
   10704  1.1  mrg   /* We output the name if and only if TREE_SYMBOL_REFERENCED is
   10705  1.1  mrg      set in order to avoid putting out names that are never really
   10706  1.1  mrg      used. */
   10707  1.1  mrg   if (TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (decl)))
   10708  1.1  mrg     {
   10709  1.1  mrg       /* maybe_assemble_visibility will return 1 if the assembler
   10710  1.1  mrg 	 visibility directive is output.  */
   10711  1.1  mrg       int need_visibility = ((*targetm.binds_local_p) (decl)
   10712  1.1  mrg 			     && maybe_assemble_visibility (decl));
   10713  1.1  mrg 
   10714  1.1  mrg       /* GNU as does not need anything here, but the HP linker does
   10715  1.1  mrg 	 need something for external functions.  */
   10716  1.1  mrg       if ((TARGET_HPUX_LD || !TARGET_GNU_AS)
   10717  1.1  mrg 	  && TREE_CODE (decl) == FUNCTION_DECL)
   10718  1.1  mrg 	  (*targetm.asm_out.globalize_decl_name) (file, decl);
   10719  1.1  mrg       else if (need_visibility && !TARGET_GNU_AS)
   10720  1.1  mrg 	(*targetm.asm_out.globalize_label) (file, name);
   10721  1.1  mrg     }
   10722  1.1  mrg }
   10723  1.1  mrg 
   10724  1.1  mrg /* Set SImode div/mod functions, init_integral_libfuncs only initializes
   10725  1.1  mrg    modes of word_mode and larger.  Rename the TFmode libfuncs using the
   10726  1.1  mrg    HPUX conventions. __divtf3 is used for XFmode. We need to keep it for
   10727  1.1  mrg    backward compatibility. */
   10728  1.1  mrg 
   10729  1.1  mrg static void
   10730  1.1  mrg ia64_init_libfuncs (void)
   10731  1.1  mrg {
   10732  1.1  mrg   set_optab_libfunc (sdiv_optab, SImode, "__divsi3");
   10733  1.1  mrg   set_optab_libfunc (udiv_optab, SImode, "__udivsi3");
   10734  1.1  mrg   set_optab_libfunc (smod_optab, SImode, "__modsi3");
   10735  1.1  mrg   set_optab_libfunc (umod_optab, SImode, "__umodsi3");
   10736  1.1  mrg 
   10737  1.1  mrg   set_optab_libfunc (add_optab, TFmode, "_U_Qfadd");
   10738  1.1  mrg   set_optab_libfunc (sub_optab, TFmode, "_U_Qfsub");
   10739  1.1  mrg   set_optab_libfunc (smul_optab, TFmode, "_U_Qfmpy");
   10740  1.1  mrg   set_optab_libfunc (sdiv_optab, TFmode, "_U_Qfdiv");
   10741  1.1  mrg   set_optab_libfunc (neg_optab, TFmode, "_U_Qfneg");
   10742  1.1  mrg 
   10743  1.1  mrg   set_conv_libfunc (sext_optab, TFmode, SFmode, "_U_Qfcnvff_sgl_to_quad");
   10744  1.1  mrg   set_conv_libfunc (sext_optab, TFmode, DFmode, "_U_Qfcnvff_dbl_to_quad");
   10745  1.1  mrg   set_conv_libfunc (sext_optab, TFmode, XFmode, "_U_Qfcnvff_f80_to_quad");
   10746  1.1  mrg   set_conv_libfunc (trunc_optab, SFmode, TFmode, "_U_Qfcnvff_quad_to_sgl");
   10747  1.1  mrg   set_conv_libfunc (trunc_optab, DFmode, TFmode, "_U_Qfcnvff_quad_to_dbl");
   10748  1.1  mrg   set_conv_libfunc (trunc_optab, XFmode, TFmode, "_U_Qfcnvff_quad_to_f80");
   10749  1.1  mrg 
   10750  1.1  mrg   set_conv_libfunc (sfix_optab, SImode, TFmode, "_U_Qfcnvfxt_quad_to_sgl");
   10751  1.1  mrg   set_conv_libfunc (sfix_optab, DImode, TFmode, "_U_Qfcnvfxt_quad_to_dbl");
   10752  1.1  mrg   set_conv_libfunc (sfix_optab, TImode, TFmode, "_U_Qfcnvfxt_quad_to_quad");
   10753  1.1  mrg   set_conv_libfunc (ufix_optab, SImode, TFmode, "_U_Qfcnvfxut_quad_to_sgl");
   10754  1.1  mrg   set_conv_libfunc (ufix_optab, DImode, TFmode, "_U_Qfcnvfxut_quad_to_dbl");
   10755  1.1  mrg 
   10756  1.1  mrg   set_conv_libfunc (sfloat_optab, TFmode, SImode, "_U_Qfcnvxf_sgl_to_quad");
   10757  1.1  mrg   set_conv_libfunc (sfloat_optab, TFmode, DImode, "_U_Qfcnvxf_dbl_to_quad");
   10758  1.1  mrg   set_conv_libfunc (sfloat_optab, TFmode, TImode, "_U_Qfcnvxf_quad_to_quad");
   10759  1.1  mrg   /* HP-UX 11.23 libc does not have a function for unsigned
   10760  1.1  mrg      SImode-to-TFmode conversion.  */
   10761  1.1  mrg   set_conv_libfunc (ufloat_optab, TFmode, DImode, "_U_Qfcnvxuf_dbl_to_quad");
   10762  1.1  mrg }
   10763  1.1  mrg 
   10764  1.1  mrg /* Rename all the TFmode libfuncs using the HPUX conventions.  */
   10765  1.1  mrg 
   10766  1.1  mrg static void
   10767  1.1  mrg ia64_hpux_init_libfuncs (void)
   10768  1.1  mrg {
   10769  1.1  mrg   ia64_init_libfuncs ();
   10770  1.1  mrg 
   10771  1.1  mrg   /* The HP SI millicode division and mod functions expect DI arguments.
   10772  1.1  mrg      By turning them off completely we avoid using both libgcc and the
   10773  1.1  mrg      non-standard millicode routines and use the HP DI millicode routines
   10774  1.1  mrg      instead.  */
   10775  1.1  mrg 
   10776  1.1  mrg   set_optab_libfunc (sdiv_optab, SImode, 0);
   10777  1.1  mrg   set_optab_libfunc (udiv_optab, SImode, 0);
   10778  1.1  mrg   set_optab_libfunc (smod_optab, SImode, 0);
   10779  1.1  mrg   set_optab_libfunc (umod_optab, SImode, 0);
   10780  1.1  mrg 
   10781  1.1  mrg   set_optab_libfunc (sdiv_optab, DImode, "__milli_divI");
   10782  1.1  mrg   set_optab_libfunc (udiv_optab, DImode, "__milli_divU");
   10783  1.1  mrg   set_optab_libfunc (smod_optab, DImode, "__milli_remI");
   10784  1.1  mrg   set_optab_libfunc (umod_optab, DImode, "__milli_remU");
   10785  1.1  mrg 
   10786  1.1  mrg   /* HP-UX libc has TF min/max/abs routines in it.  */
   10787  1.1  mrg   set_optab_libfunc (smin_optab, TFmode, "_U_Qfmin");
   10788  1.1  mrg   set_optab_libfunc (smax_optab, TFmode, "_U_Qfmax");
   10789  1.1  mrg   set_optab_libfunc (abs_optab, TFmode, "_U_Qfabs");
   10790  1.1  mrg 
   10791  1.1  mrg   /* ia64_expand_compare uses this.  */
   10792  1.1  mrg   cmptf_libfunc = init_one_libfunc ("_U_Qfcmp");
   10793  1.1  mrg 
   10794  1.1  mrg   /* These should never be used.  */
   10795  1.1  mrg   set_optab_libfunc (eq_optab, TFmode, 0);
   10796  1.1  mrg   set_optab_libfunc (ne_optab, TFmode, 0);
   10797  1.1  mrg   set_optab_libfunc (gt_optab, TFmode, 0);
   10798  1.1  mrg   set_optab_libfunc (ge_optab, TFmode, 0);
   10799  1.1  mrg   set_optab_libfunc (lt_optab, TFmode, 0);
   10800  1.1  mrg   set_optab_libfunc (le_optab, TFmode, 0);
   10801  1.1  mrg }
   10802  1.1  mrg 
   10803  1.1  mrg /* Rename the division and modulus functions in VMS.  */
   10804  1.1  mrg 
   10805  1.1  mrg static void
   10806  1.1  mrg ia64_vms_init_libfuncs (void)
   10807  1.1  mrg {
   10808  1.1  mrg   set_optab_libfunc (sdiv_optab, SImode, "OTS$DIV_I");
   10809  1.1  mrg   set_optab_libfunc (sdiv_optab, DImode, "OTS$DIV_L");
   10810  1.1  mrg   set_optab_libfunc (udiv_optab, SImode, "OTS$DIV_UI");
   10811  1.1  mrg   set_optab_libfunc (udiv_optab, DImode, "OTS$DIV_UL");
   10812  1.1  mrg   set_optab_libfunc (smod_optab, SImode, "OTS$REM_I");
   10813  1.1  mrg   set_optab_libfunc (smod_optab, DImode, "OTS$REM_L");
   10814  1.1  mrg   set_optab_libfunc (umod_optab, SImode, "OTS$REM_UI");
   10815  1.1  mrg   set_optab_libfunc (umod_optab, DImode, "OTS$REM_UL");
   10816  1.1  mrg #ifdef MEM_LIBFUNCS_INIT
   10817  1.1  mrg   MEM_LIBFUNCS_INIT;
   10818  1.1  mrg #endif
   10819  1.1  mrg }
   10820  1.1  mrg 
   10821  1.1  mrg /* Rename the TFmode libfuncs available from soft-fp in glibc using
   10822  1.1  mrg    the HPUX conventions.  */
   10823  1.1  mrg 
   10824  1.1  mrg static void
   10825  1.1  mrg ia64_sysv4_init_libfuncs (void)
   10826  1.1  mrg {
   10827  1.1  mrg   ia64_init_libfuncs ();
   10828  1.1  mrg 
   10829  1.1  mrg   /* These functions are not part of the HPUX TFmode interface.  We
   10830  1.1  mrg      use them instead of _U_Qfcmp, which doesn't work the way we
   10831  1.1  mrg      expect.  */
   10832  1.1  mrg   set_optab_libfunc (eq_optab, TFmode, "_U_Qfeq");
   10833  1.1  mrg   set_optab_libfunc (ne_optab, TFmode, "_U_Qfne");
   10834  1.1  mrg   set_optab_libfunc (gt_optab, TFmode, "_U_Qfgt");
   10835  1.1  mrg   set_optab_libfunc (ge_optab, TFmode, "_U_Qfge");
   10836  1.1  mrg   set_optab_libfunc (lt_optab, TFmode, "_U_Qflt");
   10837  1.1  mrg   set_optab_libfunc (le_optab, TFmode, "_U_Qfle");
   10838  1.1  mrg 
   10839  1.1  mrg   /* We leave out _U_Qfmin, _U_Qfmax and _U_Qfabs since soft-fp in
   10840  1.1  mrg      glibc doesn't have them.  */
   10841  1.1  mrg }
   10842  1.1  mrg 
   10843  1.1  mrg /* Use soft-fp.  */
   10844  1.1  mrg 
   10845  1.1  mrg static void
   10846  1.1  mrg ia64_soft_fp_init_libfuncs (void)
   10847  1.1  mrg {
   10848  1.1  mrg }
   10849  1.1  mrg 
   10850  1.1  mrg static bool
   10851  1.1  mrg ia64_vms_valid_pointer_mode (scalar_int_mode mode)
   10852  1.1  mrg {
   10853  1.1  mrg   return (mode == SImode || mode == DImode);
   10854  1.1  mrg }
   10855  1.1  mrg 
   10856  1.1  mrg /* For HPUX, it is illegal to have relocations in shared segments.  */
   10858  1.1  mrg 
   10859  1.1  mrg static int
   10860  1.1  mrg ia64_hpux_reloc_rw_mask (void)
   10861  1.1  mrg {
   10862  1.1  mrg   return 3;
   10863  1.1  mrg }
   10864  1.1  mrg 
   10865  1.1  mrg /* For others, relax this so that relocations to local data goes in
   10866  1.1  mrg    read-only segments, but we still cannot allow global relocations
   10867  1.1  mrg    in read-only segments.  */
   10868  1.1  mrg 
   10869  1.1  mrg static int
   10870  1.1  mrg ia64_reloc_rw_mask (void)
   10871  1.1  mrg {
   10872  1.1  mrg   return flag_pic ? 3 : 2;
   10873  1.1  mrg }
   10874  1.1  mrg 
   10875  1.1  mrg /* Return the section to use for X.  The only special thing we do here
   10876  1.1  mrg    is to honor small data.  */
   10877  1.1  mrg 
   10878  1.1  mrg static section *
   10879  1.1  mrg ia64_select_rtx_section (machine_mode mode, rtx x,
   10880  1.1  mrg 			 unsigned HOST_WIDE_INT align)
   10881  1.1  mrg {
   10882  1.1  mrg   if (GET_MODE_SIZE (mode) > 0
   10883  1.1  mrg       && GET_MODE_SIZE (mode) <= ia64_section_threshold
   10884  1.1  mrg       && !TARGET_NO_SDATA)
   10885  1.1  mrg     return sdata_section;
   10886  1.1  mrg   else
   10887  1.1  mrg     return default_elf_select_rtx_section (mode, x, align);
   10888  1.1  mrg }
   10889  1.1  mrg 
   10890  1.1  mrg static unsigned int
   10891  1.1  mrg ia64_section_type_flags (tree decl, const char *name, int reloc)
   10892  1.1  mrg {
   10893  1.1  mrg   unsigned int flags = 0;
   10894  1.1  mrg 
   10895  1.1  mrg   if (strcmp (name, ".sdata") == 0
   10896  1.1  mrg       || startswith (name, ".sdata.")
   10897  1.1  mrg       || startswith (name, ".gnu.linkonce.s.")
   10898  1.1  mrg       || startswith (name, ".sdata2.")
   10899  1.1  mrg       || startswith (name, ".gnu.linkonce.s2.")
   10900  1.1  mrg       || strcmp (name, ".sbss") == 0
   10901  1.1  mrg       || startswith (name, ".sbss.")
   10902  1.1  mrg       || startswith (name, ".gnu.linkonce.sb."))
   10903  1.1  mrg     flags = SECTION_SMALL;
   10904  1.1  mrg 
   10905  1.1  mrg   flags |= default_section_type_flags (decl, name, reloc);
   10906  1.1  mrg   return flags;
   10907  1.1  mrg }
   10908  1.1  mrg 
   10909  1.1  mrg /* Returns true if FNTYPE (a FUNCTION_TYPE or a METHOD_TYPE) returns a
   10910  1.1  mrg    structure type and that the address of that type should be passed
   10911  1.1  mrg    in out0, rather than in r8.  */
   10912  1.1  mrg 
   10913  1.1  mrg static bool
   10914  1.1  mrg ia64_struct_retval_addr_is_first_parm_p (tree fntype)
   10915  1.1  mrg {
   10916  1.1  mrg   tree ret_type = TREE_TYPE (fntype);
   10917  1.1  mrg 
   10918  1.1  mrg   /* The Itanium C++ ABI requires that out0, rather than r8, be used
   10919  1.1  mrg      as the structure return address parameter, if the return value
   10920  1.1  mrg      type has a non-trivial copy constructor or destructor.  It is not
   10921  1.1  mrg      clear if this same convention should be used for other
   10922  1.1  mrg      programming languages.  Until G++ 3.4, we incorrectly used r8 for
   10923  1.1  mrg      these return values.  */
   10924  1.1  mrg   return (abi_version_at_least (2)
   10925  1.1  mrg 	  && ret_type
   10926  1.1  mrg 	  && TYPE_MODE (ret_type) == BLKmode
   10927  1.1  mrg 	  && TREE_ADDRESSABLE (ret_type)
   10928  1.1  mrg 	  && lang_GNU_CXX ());
   10929  1.1  mrg }
   10930  1.1  mrg 
   10931  1.1  mrg /* Output the assembler code for a thunk function.  THUNK_DECL is the
   10932  1.1  mrg    declaration for the thunk function itself, FUNCTION is the decl for
   10933  1.1  mrg    the target function.  DELTA is an immediate constant offset to be
   10934  1.1  mrg    added to THIS.  If VCALL_OFFSET is nonzero, the word at
   10935  1.1  mrg    *(*this + vcall_offset) should be added to THIS.  */
   10936  1.1  mrg 
   10937  1.1  mrg static void
   10938  1.1  mrg ia64_output_mi_thunk (FILE *file, tree thunk ATTRIBUTE_UNUSED,
   10939  1.1  mrg 		      HOST_WIDE_INT delta, HOST_WIDE_INT vcall_offset,
   10940  1.1  mrg 		      tree function)
   10941  1.1  mrg {
   10942  1.1  mrg   const char *fnname = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (thunk));
   10943  1.1  mrg   rtx this_rtx, funexp;
   10944  1.1  mrg   rtx_insn *insn;
   10945  1.1  mrg   unsigned int this_parmno;
   10946  1.1  mrg   unsigned int this_regno;
   10947  1.1  mrg   rtx delta_rtx;
   10948  1.1  mrg 
   10949  1.1  mrg   reload_completed = 1;
   10950  1.1  mrg   epilogue_completed = 1;
   10951  1.1  mrg 
   10952  1.1  mrg   /* Set things up as ia64_expand_prologue might.  */
   10953  1.1  mrg   last_scratch_gr_reg = 15;
   10954  1.1  mrg 
   10955  1.1  mrg   memset (&current_frame_info, 0, sizeof (current_frame_info));
   10956  1.1  mrg   current_frame_info.spill_cfa_off = -16;
   10957  1.1  mrg   current_frame_info.n_input_regs = 1;
   10958  1.1  mrg   current_frame_info.need_regstk = (TARGET_REG_NAMES != 0);
   10959  1.1  mrg 
   10960  1.1  mrg   /* Mark the end of the (empty) prologue.  */
   10961  1.1  mrg   emit_note (NOTE_INSN_PROLOGUE_END);
   10962  1.1  mrg 
   10963  1.1  mrg   /* Figure out whether "this" will be the first parameter (the
   10964  1.1  mrg      typical case) or the second parameter (as happens when the
   10965  1.1  mrg      virtual function returns certain class objects).  */
   10966  1.1  mrg   this_parmno
   10967  1.1  mrg     = (ia64_struct_retval_addr_is_first_parm_p (TREE_TYPE (thunk))
   10968  1.1  mrg        ? 1 : 0);
   10969  1.1  mrg   this_regno = IN_REG (this_parmno);
   10970  1.1  mrg   if (!TARGET_REG_NAMES)
   10971  1.1  mrg     reg_names[this_regno] = ia64_reg_numbers[this_parmno];
   10972  1.1  mrg 
   10973  1.1  mrg   this_rtx = gen_rtx_REG (Pmode, this_regno);
   10974  1.1  mrg 
   10975  1.1  mrg   /* Apply the constant offset, if required.  */
   10976  1.1  mrg   delta_rtx = GEN_INT (delta);
   10977  1.1  mrg   if (TARGET_ILP32)
   10978  1.1  mrg     {
   10979  1.1  mrg       rtx tmp = gen_rtx_REG (ptr_mode, this_regno);
   10980  1.1  mrg       REG_POINTER (tmp) = 1;
   10981  1.1  mrg       if (delta && satisfies_constraint_I (delta_rtx))
   10982  1.1  mrg 	{
   10983  1.1  mrg 	  emit_insn (gen_ptr_extend_plus_imm (this_rtx, tmp, delta_rtx));
   10984  1.1  mrg 	  delta = 0;
   10985  1.1  mrg 	}
   10986  1.1  mrg       else
   10987  1.1  mrg 	emit_insn (gen_ptr_extend (this_rtx, tmp));
   10988  1.1  mrg     }
   10989  1.1  mrg   if (delta)
   10990  1.1  mrg     {
   10991  1.1  mrg       if (!satisfies_constraint_I (delta_rtx))
   10992  1.1  mrg 	{
   10993  1.1  mrg 	  rtx tmp = gen_rtx_REG (Pmode, 2);
   10994  1.1  mrg 	  emit_move_insn (tmp, delta_rtx);
   10995  1.1  mrg 	  delta_rtx = tmp;
   10996  1.1  mrg 	}
   10997  1.1  mrg       emit_insn (gen_adddi3 (this_rtx, this_rtx, delta_rtx));
   10998  1.1  mrg     }
   10999  1.1  mrg 
   11000  1.1  mrg   /* Apply the offset from the vtable, if required.  */
   11001  1.1  mrg   if (vcall_offset)
   11002  1.1  mrg     {
   11003  1.1  mrg       rtx vcall_offset_rtx = GEN_INT (vcall_offset);
   11004  1.1  mrg       rtx tmp = gen_rtx_REG (Pmode, 2);
   11005  1.1  mrg 
   11006  1.1  mrg       if (TARGET_ILP32)
   11007  1.1  mrg 	{
   11008  1.1  mrg 	  rtx t = gen_rtx_REG (ptr_mode, 2);
   11009  1.1  mrg 	  REG_POINTER (t) = 1;
   11010  1.1  mrg 	  emit_move_insn (t, gen_rtx_MEM (ptr_mode, this_rtx));
   11011  1.1  mrg 	  if (satisfies_constraint_I (vcall_offset_rtx))
   11012  1.1  mrg 	    {
   11013  1.1  mrg 	      emit_insn (gen_ptr_extend_plus_imm (tmp, t, vcall_offset_rtx));
   11014  1.1  mrg 	      vcall_offset = 0;
   11015  1.1  mrg 	    }
   11016  1.1  mrg 	  else
   11017  1.1  mrg 	    emit_insn (gen_ptr_extend (tmp, t));
   11018  1.1  mrg 	}
   11019  1.1  mrg       else
   11020  1.1  mrg 	emit_move_insn (tmp, gen_rtx_MEM (Pmode, this_rtx));
   11021  1.1  mrg 
   11022  1.1  mrg       if (vcall_offset)
   11023  1.1  mrg 	{
   11024  1.1  mrg 	  if (!satisfies_constraint_J (vcall_offset_rtx))
   11025  1.1  mrg 	    {
   11026  1.1  mrg 	      rtx tmp2 = gen_rtx_REG (Pmode, next_scratch_gr_reg ());
   11027  1.1  mrg 	      emit_move_insn (tmp2, vcall_offset_rtx);
   11028  1.1  mrg 	      vcall_offset_rtx = tmp2;
   11029  1.1  mrg 	    }
   11030  1.1  mrg 	  emit_insn (gen_adddi3 (tmp, tmp, vcall_offset_rtx));
   11031  1.1  mrg 	}
   11032  1.1  mrg 
   11033  1.1  mrg       if (TARGET_ILP32)
   11034  1.1  mrg 	emit_insn (gen_zero_extendsidi2 (tmp, gen_rtx_MEM (ptr_mode, tmp)));
   11035  1.1  mrg       else
   11036  1.1  mrg 	emit_move_insn (tmp, gen_rtx_MEM (Pmode, tmp));
   11037  1.1  mrg 
   11038  1.1  mrg       emit_insn (gen_adddi3 (this_rtx, this_rtx, tmp));
   11039  1.1  mrg     }
   11040  1.1  mrg 
   11041  1.1  mrg   /* Generate a tail call to the target function.  */
   11042  1.1  mrg   if (! TREE_USED (function))
   11043  1.1  mrg     {
   11044  1.1  mrg       assemble_external (function);
   11045  1.1  mrg       TREE_USED (function) = 1;
   11046  1.1  mrg     }
   11047  1.1  mrg   funexp = XEXP (DECL_RTL (function), 0);
   11048  1.1  mrg   funexp = gen_rtx_MEM (FUNCTION_MODE, funexp);
   11049  1.1  mrg   ia64_expand_call (NULL_RTX, funexp, NULL_RTX, 1);
   11050  1.1  mrg   insn = get_last_insn ();
   11051  1.1  mrg   SIBLING_CALL_P (insn) = 1;
   11052  1.1  mrg 
   11053  1.1  mrg   /* Code generation for calls relies on splitting.  */
   11054  1.1  mrg   reload_completed = 1;
   11055  1.1  mrg   epilogue_completed = 1;
   11056  1.1  mrg   try_split (PATTERN (insn), insn, 0);
   11057  1.1  mrg 
   11058  1.1  mrg   emit_barrier ();
   11059  1.1  mrg 
   11060  1.1  mrg   /* Run just enough of rest_of_compilation to get the insns emitted.
   11061  1.1  mrg      There's not really enough bulk here to make other passes such as
   11062  1.1  mrg      instruction scheduling worth while.  */
   11063  1.1  mrg 
   11064  1.1  mrg   emit_all_insn_group_barriers (NULL);
   11065  1.1  mrg   insn = get_insns ();
   11066  1.1  mrg   shorten_branches (insn);
   11067  1.1  mrg   assemble_start_function (thunk, fnname);
   11068  1.1  mrg   final_start_function (insn, file, 1);
   11069  1.1  mrg   final (insn, file, 1);
   11070  1.1  mrg   final_end_function ();
   11071  1.1  mrg   assemble_end_function (thunk, fnname);
   11072  1.1  mrg 
   11073  1.1  mrg   reload_completed = 0;
   11074  1.1  mrg   epilogue_completed = 0;
   11075  1.1  mrg }
   11076  1.1  mrg 
   11077  1.1  mrg /* Worker function for TARGET_STRUCT_VALUE_RTX.  */
   11078  1.1  mrg 
   11079  1.1  mrg static rtx
   11080  1.1  mrg ia64_struct_value_rtx (tree fntype,
   11081  1.1  mrg 		       int incoming ATTRIBUTE_UNUSED)
   11082  1.1  mrg {
   11083  1.1  mrg   if (TARGET_ABI_OPEN_VMS ||
   11084  1.1  mrg       (fntype && ia64_struct_retval_addr_is_first_parm_p (fntype)))
   11085  1.1  mrg     return NULL_RTX;
   11086  1.1  mrg   return gen_rtx_REG (Pmode, GR_REG (8));
   11087  1.1  mrg }
   11088  1.1  mrg 
   11089  1.1  mrg static bool
   11090  1.1  mrg ia64_scalar_mode_supported_p (scalar_mode mode)
   11091  1.1  mrg {
   11092  1.1  mrg   switch (mode)
   11093  1.1  mrg     {
   11094  1.1  mrg     case E_QImode:
   11095  1.1  mrg     case E_HImode:
   11096  1.1  mrg     case E_SImode:
   11097  1.1  mrg     case E_DImode:
   11098  1.1  mrg     case E_TImode:
   11099  1.1  mrg       return true;
   11100  1.1  mrg 
   11101  1.1  mrg     case E_SFmode:
   11102  1.1  mrg     case E_DFmode:
   11103  1.1  mrg     case E_XFmode:
   11104  1.1  mrg     case E_RFmode:
   11105  1.1  mrg       return true;
   11106  1.1  mrg 
   11107  1.1  mrg     case E_TFmode:
   11108  1.1  mrg       return true;
   11109  1.1  mrg 
   11110  1.1  mrg     default:
   11111  1.1  mrg       return false;
   11112  1.1  mrg     }
   11113  1.1  mrg }
   11114  1.1  mrg 
   11115  1.1  mrg static bool
   11116  1.1  mrg ia64_vector_mode_supported_p (machine_mode mode)
   11117  1.1  mrg {
   11118  1.1  mrg   switch (mode)
   11119  1.1  mrg     {
   11120  1.1  mrg     case E_V8QImode:
   11121  1.1  mrg     case E_V4HImode:
   11122  1.1  mrg     case E_V2SImode:
   11123  1.1  mrg       return true;
   11124  1.1  mrg 
   11125  1.1  mrg     case E_V2SFmode:
   11126  1.1  mrg       return true;
   11127  1.1  mrg 
   11128  1.1  mrg     default:
   11129  1.1  mrg       return false;
   11130  1.1  mrg     }
   11131  1.1  mrg }
   11132  1.1  mrg 
   11133  1.1  mrg /* Implement the FUNCTION_PROFILER macro.  */
   11134  1.1  mrg 
   11135  1.1  mrg void
   11136  1.1  mrg ia64_output_function_profiler (FILE *file, int labelno)
   11137  1.1  mrg {
   11138  1.1  mrg   bool indirect_call;
   11139  1.1  mrg 
   11140  1.1  mrg   /* If the function needs a static chain and the static chain
   11141  1.1  mrg      register is r15, we use an indirect call so as to bypass
   11142  1.1  mrg      the PLT stub in case the executable is dynamically linked,
   11143  1.1  mrg      because the stub clobbers r15 as per 5.3.6 of the psABI.
   11144  1.1  mrg      We don't need to do that in non canonical PIC mode.  */
   11145  1.1  mrg 
   11146  1.1  mrg   if (cfun->static_chain_decl && !TARGET_NO_PIC && !TARGET_AUTO_PIC)
   11147  1.1  mrg     {
   11148  1.1  mrg       gcc_assert (STATIC_CHAIN_REGNUM == 15);
   11149  1.1  mrg       indirect_call = true;
   11150  1.1  mrg     }
   11151  1.1  mrg   else
   11152  1.1  mrg     indirect_call = false;
   11153  1.1  mrg 
   11154  1.1  mrg   if (TARGET_GNU_AS)
   11155  1.1  mrg     fputs ("\t.prologue 4, r40\n", file);
   11156  1.1  mrg   else
   11157  1.1  mrg     fputs ("\t.prologue\n\t.save ar.pfs, r40\n", file);
   11158  1.1  mrg   fputs ("\talloc out0 = ar.pfs, 8, 0, 4, 0\n", file);
   11159  1.1  mrg 
   11160  1.1  mrg   if (NO_PROFILE_COUNTERS)
   11161  1.1  mrg     fputs ("\tmov out3 = r0\n", file);
   11162  1.1  mrg   else
   11163  1.1  mrg     {
   11164  1.1  mrg       char buf[20];
   11165  1.1  mrg       ASM_GENERATE_INTERNAL_LABEL (buf, "LP", labelno);
   11166  1.1  mrg 
   11167  1.1  mrg       if (TARGET_AUTO_PIC)
   11168  1.1  mrg 	fputs ("\tmovl out3 = @gprel(", file);
   11169  1.1  mrg       else
   11170  1.1  mrg 	fputs ("\taddl out3 = @ltoff(", file);
   11171  1.1  mrg       assemble_name (file, buf);
   11172  1.1  mrg       if (TARGET_AUTO_PIC)
   11173  1.1  mrg 	fputs (")\n", file);
   11174  1.1  mrg       else
   11175  1.1  mrg 	fputs ("), r1\n", file);
   11176  1.1  mrg     }
   11177  1.1  mrg 
   11178  1.1  mrg   if (indirect_call)
   11179  1.1  mrg     fputs ("\taddl r14 = @ltoff(@fptr(_mcount)), r1\n", file);
   11180  1.1  mrg   fputs ("\t;;\n", file);
   11181  1.1  mrg 
   11182  1.1  mrg   fputs ("\t.save rp, r42\n", file);
   11183  1.1  mrg   fputs ("\tmov out2 = b0\n", file);
   11184  1.1  mrg   if (indirect_call)
   11185  1.1  mrg     fputs ("\tld8 r14 = [r14]\n\t;;\n", file);
   11186  1.1  mrg   fputs ("\t.body\n", file);
   11187  1.1  mrg   fputs ("\tmov out1 = r1\n", file);
   11188  1.1  mrg   if (indirect_call)
   11189  1.1  mrg     {
   11190  1.1  mrg       fputs ("\tld8 r16 = [r14], 8\n\t;;\n", file);
   11191  1.1  mrg       fputs ("\tmov b6 = r16\n", file);
   11192  1.1  mrg       fputs ("\tld8 r1 = [r14]\n", file);
   11193  1.1  mrg       fputs ("\tbr.call.sptk.many b0 = b6\n\t;;\n", file);
   11194  1.1  mrg     }
   11195  1.1  mrg   else
   11196  1.1  mrg     fputs ("\tbr.call.sptk.many b0 = _mcount\n\t;;\n", file);
   11197  1.1  mrg }
   11198  1.1  mrg 
   11199  1.1  mrg static GTY(()) rtx mcount_func_rtx;
   11200  1.1  mrg static rtx
   11201  1.1  mrg gen_mcount_func_rtx (void)
   11202  1.1  mrg {
   11203  1.1  mrg   if (!mcount_func_rtx)
   11204  1.1  mrg     mcount_func_rtx = init_one_libfunc ("_mcount");
   11205  1.1  mrg   return mcount_func_rtx;
   11206  1.1  mrg }
   11207  1.1  mrg 
   11208  1.1  mrg void
   11209  1.1  mrg ia64_profile_hook (int labelno)
   11210  1.1  mrg {
   11211  1.1  mrg   rtx label, ip;
   11212  1.1  mrg 
   11213  1.1  mrg   if (NO_PROFILE_COUNTERS)
   11214  1.1  mrg     label = const0_rtx;
   11215  1.1  mrg   else
   11216  1.1  mrg     {
   11217  1.1  mrg       char buf[30];
   11218  1.1  mrg       const char *label_name;
   11219  1.1  mrg       ASM_GENERATE_INTERNAL_LABEL (buf, "LP", labelno);
   11220  1.1  mrg       label_name = ggc_strdup ((*targetm.strip_name_encoding) (buf));
   11221  1.1  mrg       label = gen_rtx_SYMBOL_REF (Pmode, label_name);
   11222  1.1  mrg       SYMBOL_REF_FLAGS (label) = SYMBOL_FLAG_LOCAL;
   11223  1.1  mrg     }
   11224  1.1  mrg   ip = gen_reg_rtx (Pmode);
   11225  1.1  mrg   emit_insn (gen_ip_value (ip));
   11226  1.1  mrg   emit_library_call (gen_mcount_func_rtx (), LCT_NORMAL,
   11227  1.1  mrg                      VOIDmode,
   11228  1.1  mrg 		     gen_rtx_REG (Pmode, BR_REG (0)), Pmode,
   11229  1.1  mrg 		     ip, Pmode,
   11230  1.1  mrg 		     label, Pmode);
   11231  1.1  mrg }
   11232  1.1  mrg 
   11233  1.1  mrg /* Return the mangling of TYPE if it is an extended fundamental type.  */
   11234  1.1  mrg 
   11235  1.1  mrg static const char *
   11236  1.1  mrg ia64_mangle_type (const_tree type)
   11237  1.1  mrg {
   11238  1.1  mrg   type = TYPE_MAIN_VARIANT (type);
   11239  1.1  mrg 
   11240  1.1  mrg   if (TREE_CODE (type) != VOID_TYPE && TREE_CODE (type) != BOOLEAN_TYPE
   11241  1.1  mrg       && TREE_CODE (type) != INTEGER_TYPE && TREE_CODE (type) != REAL_TYPE)
   11242  1.1  mrg     return NULL;
   11243  1.1  mrg 
   11244  1.1  mrg   /* On HP-UX, "long double" is mangled as "e" so __float128 is
   11245  1.1  mrg      mangled as "e".  */
   11246  1.1  mrg   if (!TARGET_HPUX && TYPE_MODE (type) == TFmode)
   11247  1.1  mrg     return "g";
   11248  1.1  mrg   /* On HP-UX, "e" is not available as a mangling of __float80 so use
   11249  1.1  mrg      an extended mangling.  Elsewhere, "e" is available since long
   11250  1.1  mrg      double is 80 bits.  */
   11251  1.1  mrg   if (TYPE_MODE (type) == XFmode)
   11252  1.1  mrg     return TARGET_HPUX ? "u9__float80" : "e";
   11253  1.1  mrg   if (TYPE_MODE (type) == RFmode)
   11254  1.1  mrg     return "u7__fpreg";
   11255  1.1  mrg   return NULL;
   11256  1.1  mrg }
   11257  1.1  mrg 
   11258  1.1  mrg /* Return the diagnostic message string if conversion from FROMTYPE to
   11259  1.1  mrg    TOTYPE is not allowed, NULL otherwise.  */
   11260  1.1  mrg static const char *
   11261  1.1  mrg ia64_invalid_conversion (const_tree fromtype, const_tree totype)
   11262  1.1  mrg {
   11263  1.1  mrg   /* Reject nontrivial conversion to or from __fpreg.  */
   11264  1.1  mrg   if (TYPE_MODE (fromtype) == RFmode
   11265  1.1  mrg       && TYPE_MODE (totype) != RFmode
   11266  1.1  mrg       && TYPE_MODE (totype) != VOIDmode)
   11267  1.1  mrg     return N_("invalid conversion from %<__fpreg%>");
   11268  1.1  mrg   if (TYPE_MODE (totype) == RFmode
   11269  1.1  mrg       && TYPE_MODE (fromtype) != RFmode)
   11270  1.1  mrg     return N_("invalid conversion to %<__fpreg%>");
   11271  1.1  mrg   return NULL;
   11272  1.1  mrg }
   11273  1.1  mrg 
   11274  1.1  mrg /* Return the diagnostic message string if the unary operation OP is
   11275  1.1  mrg    not permitted on TYPE, NULL otherwise.  */
   11276  1.1  mrg static const char *
   11277  1.1  mrg ia64_invalid_unary_op (int op, const_tree type)
   11278  1.1  mrg {
   11279  1.1  mrg   /* Reject operations on __fpreg other than unary + or &.  */
   11280  1.1  mrg   if (TYPE_MODE (type) == RFmode
   11281  1.1  mrg       && op != CONVERT_EXPR
   11282  1.1  mrg       && op != ADDR_EXPR)
   11283  1.1  mrg     return N_("invalid operation on %<__fpreg%>");
   11284  1.1  mrg   return NULL;
   11285  1.1  mrg }
   11286  1.1  mrg 
   11287  1.1  mrg /* Return the diagnostic message string if the binary operation OP is
   11288  1.1  mrg    not permitted on TYPE1 and TYPE2, NULL otherwise.  */
   11289  1.1  mrg static const char *
   11290  1.1  mrg ia64_invalid_binary_op (int op ATTRIBUTE_UNUSED, const_tree type1, const_tree type2)
   11291  1.1  mrg {
   11292  1.1  mrg   /* Reject operations on __fpreg.  */
   11293  1.1  mrg   if (TYPE_MODE (type1) == RFmode || TYPE_MODE (type2) == RFmode)
   11294  1.1  mrg     return N_("invalid operation on %<__fpreg%>");
   11295  1.1  mrg   return NULL;
   11296  1.1  mrg }
   11297  1.1  mrg 
   11298  1.1  mrg /* HP-UX version_id attribute.
   11299  1.1  mrg    For object foo, if the version_id is set to 1234 put out an alias
   11300  1.1  mrg    of '.alias foo "foo{1234}"  We can't use "foo{1234}" in anything
   11301  1.1  mrg    other than an alias statement because it is an illegal symbol name.  */
   11302  1.1  mrg 
   11303  1.1  mrg static tree
   11304  1.1  mrg ia64_handle_version_id_attribute (tree *node ATTRIBUTE_UNUSED,
   11305  1.1  mrg                                  tree name ATTRIBUTE_UNUSED,
   11306  1.1  mrg                                  tree args,
   11307  1.1  mrg                                  int flags ATTRIBUTE_UNUSED,
   11308  1.1  mrg                                  bool *no_add_attrs)
   11309  1.1  mrg {
   11310  1.1  mrg   tree arg = TREE_VALUE (args);
   11311  1.1  mrg 
   11312  1.1  mrg   if (TREE_CODE (arg) != STRING_CST)
   11313  1.1  mrg     {
   11314  1.1  mrg       error("version attribute is not a string");
   11315  1.1  mrg       *no_add_attrs = true;
   11316  1.1  mrg       return NULL_TREE;
   11317  1.1  mrg     }
   11318  1.1  mrg   return NULL_TREE;
   11319  1.1  mrg }
   11320  1.1  mrg 
   11321  1.1  mrg /* Target hook for c_mode_for_suffix.  */
   11322  1.1  mrg 
   11323  1.1  mrg static machine_mode
   11324  1.1  mrg ia64_c_mode_for_suffix (char suffix)
   11325  1.1  mrg {
   11326  1.1  mrg   if (suffix == 'q')
   11327  1.1  mrg     return TFmode;
   11328  1.1  mrg   if (suffix == 'w')
   11329  1.1  mrg     return XFmode;
   11330  1.1  mrg 
   11331  1.1  mrg   return VOIDmode;
   11332  1.1  mrg }
   11333  1.1  mrg 
   11334  1.1  mrg static GTY(()) rtx ia64_dconst_0_5_rtx;
   11335  1.1  mrg 
   11336  1.1  mrg rtx
   11337  1.1  mrg ia64_dconst_0_5 (void)
   11338  1.1  mrg {
   11339  1.1  mrg   if (! ia64_dconst_0_5_rtx)
   11340  1.1  mrg     {
   11341  1.1  mrg       REAL_VALUE_TYPE rv;
   11342  1.1  mrg       real_from_string (&rv, "0.5");
   11343  1.1  mrg       ia64_dconst_0_5_rtx = const_double_from_real_value (rv, DFmode);
   11344  1.1  mrg     }
   11345  1.1  mrg   return ia64_dconst_0_5_rtx;
   11346  1.1  mrg }
   11347  1.1  mrg 
   11348  1.1  mrg static GTY(()) rtx ia64_dconst_0_375_rtx;
   11349  1.1  mrg 
   11350  1.1  mrg rtx
   11351  1.1  mrg ia64_dconst_0_375 (void)
   11352  1.1  mrg {
   11353  1.1  mrg   if (! ia64_dconst_0_375_rtx)
   11354  1.1  mrg     {
   11355  1.1  mrg       REAL_VALUE_TYPE rv;
   11356  1.1  mrg       real_from_string (&rv, "0.375");
   11357  1.1  mrg       ia64_dconst_0_375_rtx = const_double_from_real_value (rv, DFmode);
   11358  1.1  mrg     }
   11359  1.1  mrg   return ia64_dconst_0_375_rtx;
   11360  1.1  mrg }
   11361  1.1  mrg 
   11362  1.1  mrg static fixed_size_mode
   11363  1.1  mrg ia64_get_reg_raw_mode (int regno)
   11364  1.1  mrg {
   11365  1.1  mrg   if (FR_REGNO_P (regno))
   11366  1.1  mrg     return XFmode;
   11367  1.1  mrg   return default_get_reg_raw_mode(regno);
   11368  1.1  mrg }
   11369  1.1  mrg 
   11370  1.1  mrg /* Implement TARGET_MEMBER_TYPE_FORCES_BLK.  ??? Might not be needed
   11371  1.1  mrg    anymore.  */
   11372  1.1  mrg 
   11373  1.1  mrg bool
   11374  1.1  mrg ia64_member_type_forces_blk (const_tree, machine_mode mode)
   11375  1.1  mrg {
   11376  1.1  mrg   return TARGET_HPUX && mode == TFmode;
   11377  1.1  mrg }
   11378  1.1  mrg 
   11379  1.1  mrg /* Always default to .text section until HP-UX linker is fixed.  */
   11380  1.1  mrg 
   11381  1.1  mrg ATTRIBUTE_UNUSED static section *
   11382  1.1  mrg ia64_hpux_function_section (tree decl ATTRIBUTE_UNUSED,
   11383  1.1  mrg 			    enum node_frequency freq ATTRIBUTE_UNUSED,
   11384  1.1  mrg 			    bool startup ATTRIBUTE_UNUSED,
   11385  1.1  mrg 			    bool exit ATTRIBUTE_UNUSED)
   11386  1.1  mrg {
   11387  1.1  mrg   return NULL;
   11388  1.1  mrg }
   11389  1.1  mrg 
   11390  1.1  mrg /* Construct (set target (vec_select op0 (parallel perm))) and
   11392  1.1  mrg    return true if that's a valid instruction in the active ISA.  */
   11393  1.1  mrg 
   11394  1.1  mrg static bool
   11395  1.1  mrg expand_vselect (rtx target, rtx op0, const unsigned char *perm, unsigned nelt)
   11396  1.1  mrg {
   11397  1.1  mrg   rtx rperm[MAX_VECT_LEN], x;
   11398  1.1  mrg   unsigned i;
   11399  1.1  mrg 
   11400  1.1  mrg   for (i = 0; i < nelt; ++i)
   11401  1.1  mrg     rperm[i] = GEN_INT (perm[i]);
   11402  1.1  mrg 
   11403  1.1  mrg   x = gen_rtx_PARALLEL (VOIDmode, gen_rtvec_v (nelt, rperm));
   11404  1.1  mrg   x = gen_rtx_VEC_SELECT (GET_MODE (target), op0, x);
   11405  1.1  mrg   x = gen_rtx_SET (target, x);
   11406  1.1  mrg 
   11407  1.1  mrg   rtx_insn *insn = emit_insn (x);
   11408  1.1  mrg   if (recog_memoized (insn) < 0)
   11409  1.1  mrg     {
   11410  1.1  mrg       remove_insn (insn);
   11411  1.1  mrg       return false;
   11412  1.1  mrg     }
   11413  1.1  mrg   return true;
   11414  1.1  mrg }
   11415  1.1  mrg 
   11416  1.1  mrg /* Similar, but generate a vec_concat from op0 and op1 as well.  */
   11417  1.1  mrg 
   11418  1.1  mrg static bool
   11419  1.1  mrg expand_vselect_vconcat (rtx target, rtx op0, rtx op1,
   11420  1.1  mrg 			const unsigned char *perm, unsigned nelt)
   11421  1.1  mrg {
   11422  1.1  mrg   machine_mode v2mode;
   11423  1.1  mrg   rtx x;
   11424  1.1  mrg 
   11425  1.1  mrg   if (!GET_MODE_2XWIDER_MODE (GET_MODE (op0)).exists (&v2mode))
   11426  1.1  mrg     return false;
   11427  1.1  mrg   x = gen_rtx_VEC_CONCAT (v2mode, op0, op1);
   11428  1.1  mrg   return expand_vselect (target, x, perm, nelt);
   11429  1.1  mrg }
   11430  1.1  mrg 
   11431  1.1  mrg /* Try to expand a no-op permutation.  */
   11432  1.1  mrg 
   11433  1.1  mrg static bool
   11434  1.1  mrg expand_vec_perm_identity (struct expand_vec_perm_d *d)
   11435  1.1  mrg {
   11436  1.1  mrg   unsigned i, nelt = d->nelt;
   11437  1.1  mrg 
   11438  1.1  mrg   for (i = 0; i < nelt; ++i)
   11439  1.1  mrg     if (d->perm[i] != i)
   11440  1.1  mrg       return false;
   11441  1.1  mrg 
   11442  1.1  mrg   if (!d->testing_p)
   11443  1.1  mrg     emit_move_insn (d->target, d->op0);
   11444  1.1  mrg 
   11445  1.1  mrg   return true;
   11446  1.1  mrg }
   11447  1.1  mrg 
   11448  1.1  mrg /* Try to expand D via a shrp instruction.  */
   11449  1.1  mrg 
   11450  1.1  mrg static bool
   11451  1.1  mrg expand_vec_perm_shrp (struct expand_vec_perm_d *d)
   11452  1.1  mrg {
   11453  1.1  mrg   unsigned i, nelt = d->nelt, shift, mask;
   11454  1.1  mrg   rtx tmp, hi, lo;
   11455  1.1  mrg 
   11456  1.1  mrg   /* ??? Don't force V2SFmode into the integer registers.  */
   11457  1.1  mrg   if (d->vmode == V2SFmode)
   11458  1.1  mrg     return false;
   11459  1.1  mrg 
   11460  1.1  mrg   mask = (d->one_operand_p ? nelt - 1 : 2 * nelt - 1);
   11461  1.1  mrg 
   11462  1.1  mrg   shift = d->perm[0];
   11463  1.1  mrg   if (BYTES_BIG_ENDIAN && shift > nelt)
   11464  1.1  mrg     return false;
   11465  1.1  mrg 
   11466  1.1  mrg   for (i = 1; i < nelt; ++i)
   11467  1.1  mrg     if (d->perm[i] != ((shift + i) & mask))
   11468  1.1  mrg       return false;
   11469  1.1  mrg 
   11470  1.1  mrg   if (d->testing_p)
   11471  1.1  mrg     return true;
   11472  1.1  mrg 
   11473  1.1  mrg   hi = shift < nelt ? d->op1 : d->op0;
   11474  1.1  mrg   lo = shift < nelt ? d->op0 : d->op1;
   11475  1.1  mrg 
   11476  1.1  mrg   shift %= nelt;
   11477  1.1  mrg 
   11478  1.1  mrg   shift *= GET_MODE_UNIT_SIZE (d->vmode) * BITS_PER_UNIT;
   11479  1.1  mrg 
   11480  1.1  mrg   /* We've eliminated the shift 0 case via expand_vec_perm_identity.  */
   11481  1.1  mrg   gcc_assert (IN_RANGE (shift, 1, 63));
   11482  1.1  mrg 
   11483  1.1  mrg   /* Recall that big-endian elements are numbered starting at the top of
   11484  1.1  mrg      the register.  Ideally we'd have a shift-left-pair.  But since we
   11485  1.1  mrg      don't, convert to a shift the other direction.  */
   11486  1.1  mrg   if (BYTES_BIG_ENDIAN)
   11487  1.1  mrg     shift = 64 - shift;
   11488  1.1  mrg 
   11489  1.1  mrg   tmp = gen_reg_rtx (DImode);
   11490  1.1  mrg   hi = gen_lowpart (DImode, hi);
   11491  1.1  mrg   lo = gen_lowpart (DImode, lo);
   11492  1.1  mrg   emit_insn (gen_shrp (tmp, hi, lo, GEN_INT (shift)));
   11493  1.1  mrg 
   11494  1.1  mrg   emit_move_insn (d->target, gen_lowpart (d->vmode, tmp));
   11495  1.1  mrg   return true;
   11496  1.1  mrg }
   11497  1.1  mrg 
   11498  1.1  mrg /* Try to instantiate D in a single instruction.  */
   11499  1.1  mrg 
   11500  1.1  mrg static bool
   11501  1.1  mrg expand_vec_perm_1 (struct expand_vec_perm_d *d)
   11502  1.1  mrg {
   11503  1.1  mrg   unsigned i, nelt = d->nelt;
   11504  1.1  mrg   unsigned char perm2[MAX_VECT_LEN];
   11505  1.1  mrg 
   11506  1.1  mrg   /* Try single-operand selections.  */
   11507  1.1  mrg   if (d->one_operand_p)
   11508  1.1  mrg     {
   11509  1.1  mrg       if (expand_vec_perm_identity (d))
   11510  1.1  mrg 	return true;
   11511  1.1  mrg       if (expand_vselect (d->target, d->op0, d->perm, nelt))
   11512  1.1  mrg 	return true;
   11513  1.1  mrg     }
   11514  1.1  mrg 
   11515  1.1  mrg   /* Try two operand selections.  */
   11516  1.1  mrg   if (expand_vselect_vconcat (d->target, d->op0, d->op1, d->perm, nelt))
   11517  1.1  mrg     return true;
   11518  1.1  mrg 
   11519  1.1  mrg   /* Recognize interleave style patterns with reversed operands.  */
   11520  1.1  mrg   if (!d->one_operand_p)
   11521  1.1  mrg     {
   11522  1.1  mrg       for (i = 0; i < nelt; ++i)
   11523  1.1  mrg 	{
   11524  1.1  mrg 	  unsigned e = d->perm[i];
   11525  1.1  mrg 	  if (e >= nelt)
   11526  1.1  mrg 	    e -= nelt;
   11527  1.1  mrg 	  else
   11528  1.1  mrg 	    e += nelt;
   11529  1.1  mrg 	  perm2[i] = e;
   11530  1.1  mrg 	}
   11531  1.1  mrg 
   11532  1.1  mrg       if (expand_vselect_vconcat (d->target, d->op1, d->op0, perm2, nelt))
   11533  1.1  mrg 	return true;
   11534  1.1  mrg     }
   11535  1.1  mrg 
   11536  1.1  mrg   if (expand_vec_perm_shrp (d))
   11537  1.1  mrg     return true;
   11538  1.1  mrg 
   11539  1.1  mrg   /* ??? Look for deposit-like permutations where most of the result
   11540  1.1  mrg      comes from one vector unchanged and the rest comes from a
   11541  1.1  mrg      sequential hunk of the other vector.  */
   11542  1.1  mrg 
   11543  1.1  mrg   return false;
   11544  1.1  mrg }
   11545  1.1  mrg 
   11546  1.1  mrg /* Pattern match broadcast permutations.  */
   11547  1.1  mrg 
   11548  1.1  mrg static bool
   11549  1.1  mrg expand_vec_perm_broadcast (struct expand_vec_perm_d *d)
   11550  1.1  mrg {
   11551  1.1  mrg   unsigned i, elt, nelt = d->nelt;
   11552  1.1  mrg   unsigned char perm2[2];
   11553  1.1  mrg   rtx temp;
   11554  1.1  mrg   bool ok;
   11555  1.1  mrg 
   11556  1.1  mrg   if (!d->one_operand_p)
   11557  1.1  mrg     return false;
   11558  1.1  mrg 
   11559  1.1  mrg   elt = d->perm[0];
   11560  1.1  mrg   for (i = 1; i < nelt; ++i)
   11561  1.1  mrg     if (d->perm[i] != elt)
   11562  1.1  mrg       return false;
   11563  1.1  mrg 
   11564  1.1  mrg   switch (d->vmode)
   11565  1.1  mrg     {
   11566  1.1  mrg     case E_V2SImode:
   11567  1.1  mrg     case E_V2SFmode:
   11568  1.1  mrg       /* Implementable by interleave.  */
   11569  1.1  mrg       perm2[0] = elt;
   11570  1.1  mrg       perm2[1] = elt + 2;
   11571  1.1  mrg       ok = expand_vselect_vconcat (d->target, d->op0, d->op0, perm2, 2);
   11572  1.1  mrg       gcc_assert (ok);
   11573  1.1  mrg       break;
   11574  1.1  mrg 
   11575  1.1  mrg     case E_V8QImode:
   11576  1.1  mrg       /* Implementable by extract + broadcast.  */
   11577  1.1  mrg       if (BYTES_BIG_ENDIAN)
   11578  1.1  mrg 	elt = 7 - elt;
   11579  1.1  mrg       elt *= BITS_PER_UNIT;
   11580  1.1  mrg       temp = gen_reg_rtx (DImode);
   11581  1.1  mrg       emit_insn (gen_extzv (temp, gen_lowpart (DImode, d->op0),
   11582  1.1  mrg 			    GEN_INT (8), GEN_INT (elt)));
   11583  1.1  mrg       emit_insn (gen_mux1_brcst_qi (d->target, gen_lowpart (QImode, temp)));
   11584  1.1  mrg       break;
   11585  1.1  mrg 
   11586  1.1  mrg     case E_V4HImode:
   11587  1.1  mrg       /* Should have been matched directly by vec_select.  */
   11588  1.1  mrg     default:
   11589  1.1  mrg       gcc_unreachable ();
   11590  1.1  mrg     }
   11591  1.1  mrg 
   11592  1.1  mrg   return true;
   11593  1.1  mrg }
   11594  1.1  mrg 
   11595  1.1  mrg /* A subroutine of ia64_expand_vec_perm_const_1.  Try to simplify a
   11596  1.1  mrg    two vector permutation into a single vector permutation by using
   11597  1.1  mrg    an interleave operation to merge the vectors.  */
   11598  1.1  mrg 
   11599  1.1  mrg static bool
   11600  1.1  mrg expand_vec_perm_interleave_2 (struct expand_vec_perm_d *d)
   11601  1.1  mrg {
   11602  1.1  mrg   struct expand_vec_perm_d dremap, dfinal;
   11603  1.1  mrg   unsigned char remap[2 * MAX_VECT_LEN];
   11604  1.1  mrg   unsigned contents, i, nelt, nelt2;
   11605  1.1  mrg   unsigned h0, h1, h2, h3;
   11606  1.1  mrg   rtx_insn *seq;
   11607  1.1  mrg   bool ok;
   11608  1.1  mrg 
   11609  1.1  mrg   if (d->one_operand_p)
   11610  1.1  mrg     return false;
   11611  1.1  mrg 
   11612  1.1  mrg   nelt = d->nelt;
   11613  1.1  mrg   nelt2 = nelt / 2;
   11614  1.1  mrg 
   11615  1.1  mrg   /* Examine from whence the elements come.  */
   11616  1.1  mrg   contents = 0;
   11617  1.1  mrg   for (i = 0; i < nelt; ++i)
   11618  1.1  mrg     contents |= 1u << d->perm[i];
   11619  1.1  mrg 
   11620  1.1  mrg   memset (remap, 0xff, sizeof (remap));
   11621  1.1  mrg   dremap = *d;
   11622  1.1  mrg 
   11623  1.1  mrg   h0 = (1u << nelt2) - 1;
   11624  1.1  mrg   h1 = h0 << nelt2;
   11625  1.1  mrg   h2 = h0 << nelt;
   11626  1.1  mrg   h3 = h0 << (nelt + nelt2);
   11627  1.1  mrg 
   11628  1.1  mrg   if ((contents & (h0 | h2)) == contents)	/* punpck even halves */
   11629  1.1  mrg     {
   11630  1.1  mrg       for (i = 0; i < nelt; ++i)
   11631  1.1  mrg 	{
   11632  1.1  mrg 	  unsigned which = i / 2 + (i & 1 ? nelt : 0);
   11633  1.1  mrg 	  remap[which] = i;
   11634  1.1  mrg 	  dremap.perm[i] = which;
   11635  1.1  mrg 	}
   11636  1.1  mrg     }
   11637  1.1  mrg   else if ((contents & (h1 | h3)) == contents)	/* punpck odd halves */
   11638  1.1  mrg     {
   11639  1.1  mrg       for (i = 0; i < nelt; ++i)
   11640  1.1  mrg 	{
   11641  1.1  mrg 	  unsigned which = i / 2 + nelt2 + (i & 1 ? nelt : 0);
   11642  1.1  mrg 	  remap[which] = i;
   11643  1.1  mrg 	  dremap.perm[i] = which;
   11644  1.1  mrg 	}
   11645  1.1  mrg     }
   11646  1.1  mrg   else if ((contents & 0x5555) == contents)	/* mix even elements */
   11647  1.1  mrg     {
   11648  1.1  mrg       for (i = 0; i < nelt; ++i)
   11649  1.1  mrg 	{
   11650  1.1  mrg 	  unsigned which = (i & ~1) + (i & 1 ? nelt : 0);
   11651  1.1  mrg 	  remap[which] = i;
   11652  1.1  mrg 	  dremap.perm[i] = which;
   11653  1.1  mrg 	}
   11654  1.1  mrg     }
   11655  1.1  mrg   else if ((contents & 0xaaaa) == contents)	/* mix odd elements */
   11656  1.1  mrg     {
   11657  1.1  mrg       for (i = 0; i < nelt; ++i)
   11658  1.1  mrg 	{
   11659  1.1  mrg 	  unsigned which = (i | 1) + (i & 1 ? nelt : 0);
   11660  1.1  mrg 	  remap[which] = i;
   11661  1.1  mrg 	  dremap.perm[i] = which;
   11662  1.1  mrg 	}
   11663  1.1  mrg     }
   11664  1.1  mrg   else if (floor_log2 (contents) - ctz_hwi (contents) < (int)nelt) /* shrp */
   11665  1.1  mrg     {
   11666  1.1  mrg       unsigned shift = ctz_hwi (contents);
   11667  1.1  mrg       for (i = 0; i < nelt; ++i)
   11668  1.1  mrg 	{
   11669  1.1  mrg 	  unsigned which = (i + shift) & (2 * nelt - 1);
   11670  1.1  mrg 	  remap[which] = i;
   11671  1.1  mrg 	  dremap.perm[i] = which;
   11672  1.1  mrg 	}
   11673  1.1  mrg     }
   11674  1.1  mrg   else
   11675  1.1  mrg     return false;
   11676  1.1  mrg 
   11677  1.1  mrg   /* Use the remapping array set up above to move the elements from their
   11678  1.1  mrg      swizzled locations into their final destinations.  */
   11679  1.1  mrg   dfinal = *d;
   11680  1.1  mrg   for (i = 0; i < nelt; ++i)
   11681  1.1  mrg     {
   11682  1.1  mrg       unsigned e = remap[d->perm[i]];
   11683  1.1  mrg       gcc_assert (e < nelt);
   11684  1.1  mrg       dfinal.perm[i] = e;
   11685  1.1  mrg     }
   11686  1.1  mrg   if (d->testing_p)
   11687  1.1  mrg     dfinal.op0 = gen_raw_REG (dfinal.vmode, LAST_VIRTUAL_REGISTER + 1);
   11688  1.1  mrg   else
   11689  1.1  mrg     dfinal.op0 = gen_reg_rtx (dfinal.vmode);
   11690  1.1  mrg   dfinal.op1 = dfinal.op0;
   11691  1.1  mrg   dfinal.one_operand_p = true;
   11692  1.1  mrg   dremap.target = dfinal.op0;
   11693  1.1  mrg 
   11694  1.1  mrg   /* Test if the final remap can be done with a single insn.  For V4HImode
   11695  1.1  mrg      this *will* succeed.  For V8QImode or V2SImode it may not.  */
   11696  1.1  mrg   start_sequence ();
   11697  1.1  mrg   ok = expand_vec_perm_1 (&dfinal);
   11698  1.1  mrg   seq = get_insns ();
   11699  1.1  mrg   end_sequence ();
   11700  1.1  mrg   if (!ok)
   11701  1.1  mrg     return false;
   11702  1.1  mrg   if (d->testing_p)
   11703  1.1  mrg     return true;
   11704  1.1  mrg 
   11705  1.1  mrg   ok = expand_vec_perm_1 (&dremap);
   11706  1.1  mrg   gcc_assert (ok);
   11707  1.1  mrg 
   11708  1.1  mrg   emit_insn (seq);
   11709  1.1  mrg   return true;
   11710  1.1  mrg }
   11711  1.1  mrg 
   11712  1.1  mrg /* A subroutine of ia64_expand_vec_perm_const_1.  Emit a full V4HImode
   11713  1.1  mrg    constant permutation via two mux2 and a merge.  */
   11714  1.1  mrg 
   11715  1.1  mrg static bool
   11716  1.1  mrg expand_vec_perm_v4hi_5 (struct expand_vec_perm_d *d)
   11717  1.1  mrg {
   11718  1.1  mrg   unsigned char perm2[4];
   11719  1.1  mrg   rtx rmask[4];
   11720  1.1  mrg   unsigned i;
   11721  1.1  mrg   rtx t0, t1, mask, x;
   11722  1.1  mrg   bool ok;
   11723  1.1  mrg 
   11724  1.1  mrg   if (d->vmode != V4HImode || d->one_operand_p)
   11725  1.1  mrg     return false;
   11726  1.1  mrg   if (d->testing_p)
   11727  1.1  mrg     return true;
   11728  1.1  mrg 
   11729  1.1  mrg   for (i = 0; i < 4; ++i)
   11730  1.1  mrg     {
   11731  1.1  mrg       perm2[i] = d->perm[i] & 3;
   11732  1.1  mrg       rmask[i] = (d->perm[i] & 4 ? const0_rtx : constm1_rtx);
   11733  1.1  mrg     }
   11734  1.1  mrg   mask = gen_rtx_CONST_VECTOR (V4HImode, gen_rtvec_v (4, rmask));
   11735  1.1  mrg   mask = force_reg (V4HImode, mask);
   11736  1.1  mrg 
   11737  1.1  mrg   t0 = gen_reg_rtx (V4HImode);
   11738  1.1  mrg   t1 = gen_reg_rtx (V4HImode);
   11739  1.1  mrg 
   11740  1.1  mrg   ok = expand_vselect (t0, d->op0, perm2, 4);
   11741  1.1  mrg   gcc_assert (ok);
   11742  1.1  mrg   ok = expand_vselect (t1, d->op1, perm2, 4);
   11743  1.1  mrg   gcc_assert (ok);
   11744  1.1  mrg 
   11745  1.1  mrg   x = gen_rtx_AND (V4HImode, mask, t0);
   11746  1.1  mrg   emit_insn (gen_rtx_SET (t0, x));
   11747  1.1  mrg 
   11748  1.1  mrg   x = gen_rtx_NOT (V4HImode, mask);
   11749  1.1  mrg   x = gen_rtx_AND (V4HImode, x, t1);
   11750  1.1  mrg   emit_insn (gen_rtx_SET (t1, x));
   11751  1.1  mrg 
   11752  1.1  mrg   x = gen_rtx_IOR (V4HImode, t0, t1);
   11753  1.1  mrg   emit_insn (gen_rtx_SET (d->target, x));
   11754  1.1  mrg 
   11755  1.1  mrg   return true;
   11756  1.1  mrg }
   11757  1.1  mrg 
   11758  1.1  mrg /* The guts of ia64_expand_vec_perm_const, also used by the ok hook.
   11759  1.1  mrg    With all of the interface bits taken care of, perform the expansion
   11760  1.1  mrg    in D and return true on success.  */
   11761  1.1  mrg 
   11762  1.1  mrg static bool
   11763  1.1  mrg ia64_expand_vec_perm_const_1 (struct expand_vec_perm_d *d)
   11764  1.1  mrg {
   11765  1.1  mrg   if (expand_vec_perm_1 (d))
   11766  1.1  mrg     return true;
   11767  1.1  mrg   if (expand_vec_perm_broadcast (d))
   11768  1.1  mrg     return true;
   11769  1.1  mrg   if (expand_vec_perm_interleave_2 (d))
   11770  1.1  mrg     return true;
   11771  1.1  mrg   if (expand_vec_perm_v4hi_5 (d))
   11772  1.1  mrg     return true;
   11773  1.1  mrg   return false;
   11774  1.1  mrg }
   11775  1.1  mrg 
   11776  1.1  mrg /* Implement TARGET_VECTORIZE_VEC_PERM_CONST.  */
   11777  1.1  mrg 
   11778  1.1  mrg static bool
   11779  1.1  mrg ia64_vectorize_vec_perm_const (machine_mode vmode, rtx target, rtx op0,
   11780  1.1  mrg 			       rtx op1, const vec_perm_indices &sel)
   11781  1.1  mrg {
   11782  1.1  mrg   struct expand_vec_perm_d d;
   11783  1.1  mrg   unsigned char perm[MAX_VECT_LEN];
   11784  1.1  mrg   unsigned int i, nelt, which;
   11785  1.1  mrg 
   11786  1.1  mrg   d.target = target;
   11787  1.1  mrg   if (op0)
   11788  1.1  mrg     {
   11789  1.1  mrg       rtx nop0 = force_reg (vmode, op0);
   11790  1.1  mrg       if (op0 == op1)
   11791  1.1  mrg         op1 = nop0;
   11792  1.1  mrg       op0 = nop0;
   11793  1.1  mrg     }
   11794  1.1  mrg   if (op1)
   11795  1.1  mrg     op1 = force_reg (vmode, op1);
   11796  1.1  mrg   d.op0 = op0;
   11797  1.1  mrg   d.op1 = op1;
   11798  1.1  mrg 
   11799  1.1  mrg   d.vmode = vmode;
   11800  1.1  mrg   gcc_assert (VECTOR_MODE_P (d.vmode));
   11801  1.1  mrg   d.nelt = nelt = GET_MODE_NUNITS (d.vmode);
   11802  1.1  mrg   d.testing_p = !target;
   11803  1.1  mrg 
   11804  1.1  mrg   gcc_assert (sel.length () == nelt);
   11805  1.1  mrg   gcc_checking_assert (sizeof (d.perm) == sizeof (perm));
   11806  1.1  mrg 
   11807  1.1  mrg   for (i = which = 0; i < nelt; ++i)
   11808  1.1  mrg     {
   11809  1.1  mrg       unsigned int ei = sel[i] & (2 * nelt - 1);
   11810  1.1  mrg 
   11811  1.1  mrg       which |= (ei < nelt ? 1 : 2);
   11812  1.1  mrg       d.perm[i] = ei;
   11813  1.1  mrg       perm[i] = ei;
   11814  1.1  mrg     }
   11815  1.1  mrg 
   11816  1.1  mrg   switch (which)
   11817  1.1  mrg     {
   11818  1.1  mrg     default:
   11819  1.1  mrg       gcc_unreachable();
   11820  1.1  mrg 
   11821  1.1  mrg     case 3:
   11822  1.1  mrg       if (d.testing_p || !rtx_equal_p (d.op0, d.op1))
   11823  1.1  mrg 	{
   11824  1.1  mrg 	  d.one_operand_p = false;
   11825  1.1  mrg 	  break;
   11826  1.1  mrg 	}
   11827  1.1  mrg 
   11828  1.1  mrg       /* The elements of PERM do not suggest that only the first operand
   11829  1.1  mrg 	 is used, but both operands are identical.  Allow easier matching
   11830  1.1  mrg 	 of the permutation by folding the permutation into the single
   11831  1.1  mrg 	 input vector.  */
   11832  1.1  mrg       for (i = 0; i < nelt; ++i)
   11833  1.1  mrg 	if (d.perm[i] >= nelt)
   11834  1.1  mrg 	  d.perm[i] -= nelt;
   11835  1.1  mrg       /* FALLTHRU */
   11836  1.1  mrg 
   11837  1.1  mrg     case 1:
   11838  1.1  mrg       d.op1 = d.op0;
   11839  1.1  mrg       d.one_operand_p = true;
   11840  1.1  mrg       break;
   11841  1.1  mrg 
   11842  1.1  mrg     case 2:
   11843  1.1  mrg       for (i = 0; i < nelt; ++i)
   11844  1.1  mrg         d.perm[i] -= nelt;
   11845  1.1  mrg       d.op0 = d.op1;
   11846  1.1  mrg       d.one_operand_p = true;
   11847  1.1  mrg       break;
   11848  1.1  mrg     }
   11849  1.1  mrg 
   11850  1.1  mrg   if (d.testing_p)
   11851  1.1  mrg     {
   11852  1.1  mrg       /* We have to go through the motions and see if we can
   11853  1.1  mrg 	 figure out how to generate the requested permutation.  */
   11854  1.1  mrg       d.target = gen_raw_REG (d.vmode, LAST_VIRTUAL_REGISTER + 1);
   11855  1.1  mrg       d.op1 = d.op0 = gen_raw_REG (d.vmode, LAST_VIRTUAL_REGISTER + 2);
   11856  1.1  mrg       if (!d.one_operand_p)
   11857  1.1  mrg 	d.op1 = gen_raw_REG (d.vmode, LAST_VIRTUAL_REGISTER + 3);
   11858  1.1  mrg 
   11859  1.1  mrg       start_sequence ();
   11860  1.1  mrg       bool ret = ia64_expand_vec_perm_const_1 (&d);
   11861  1.1  mrg       end_sequence ();
   11862  1.1  mrg 
   11863  1.1  mrg       return ret;
   11864  1.1  mrg     }
   11865  1.1  mrg 
   11866  1.1  mrg   if (ia64_expand_vec_perm_const_1 (&d))
   11867  1.1  mrg     return true;
   11868  1.1  mrg 
   11869  1.1  mrg   /* If the mask says both arguments are needed, but they are the same,
   11870  1.1  mrg      the above tried to expand with one_operand_p true.  If that didn't
   11871  1.1  mrg      work, retry with one_operand_p false, as that's what we used in _ok.  */
   11872  1.1  mrg   if (which == 3 && d.one_operand_p)
   11873  1.1  mrg     {
   11874  1.1  mrg       memcpy (d.perm, perm, sizeof (perm));
   11875  1.1  mrg       d.one_operand_p = false;
   11876  1.1  mrg       return ia64_expand_vec_perm_const_1 (&d);
   11877  1.1  mrg     }
   11878  1.1  mrg 
   11879  1.1  mrg   return false;
   11880  1.1  mrg }
   11881  1.1  mrg 
   11882  1.1  mrg void
   11883  1.1  mrg ia64_expand_vec_setv2sf (rtx operands[3])
   11884  1.1  mrg {
   11885  1.1  mrg   struct expand_vec_perm_d d;
   11886  1.1  mrg   unsigned int which;
   11887  1.1  mrg   bool ok;
   11888  1.1  mrg 
   11889  1.1  mrg   d.target = operands[0];
   11890  1.1  mrg   d.op0 = operands[0];
   11891  1.1  mrg   d.op1 = gen_reg_rtx (V2SFmode);
   11892  1.1  mrg   d.vmode = V2SFmode;
   11893  1.1  mrg   d.nelt = 2;
   11894  1.1  mrg   d.one_operand_p = false;
   11895  1.1  mrg   d.testing_p = false;
   11896  1.1  mrg 
   11897  1.1  mrg   which = INTVAL (operands[2]);
   11898  1.1  mrg   gcc_assert (which <= 1);
   11899  1.1  mrg   d.perm[0] = 1 - which;
   11900  1.1  mrg   d.perm[1] = which + 2;
   11901  1.1  mrg 
   11902  1.1  mrg   emit_insn (gen_fpack (d.op1, operands[1], CONST0_RTX (SFmode)));
   11903  1.1  mrg 
   11904  1.1  mrg   ok = ia64_expand_vec_perm_const_1 (&d);
   11905  1.1  mrg   gcc_assert (ok);
   11906  1.1  mrg }
   11907  1.1  mrg 
   11908  1.1  mrg void
   11909  1.1  mrg ia64_expand_vec_perm_even_odd (rtx target, rtx op0, rtx op1, int odd)
   11910  1.1  mrg {
   11911  1.1  mrg   struct expand_vec_perm_d d;
   11912  1.1  mrg   machine_mode vmode = GET_MODE (target);
   11913  1.1  mrg   unsigned int i, nelt = GET_MODE_NUNITS (vmode);
   11914  1.1  mrg   bool ok;
   11915  1.1  mrg 
   11916  1.1  mrg   d.target = target;
   11917  1.1  mrg   d.op0 = op0;
   11918  1.1  mrg   d.op1 = op1;
   11919  1.1  mrg   d.vmode = vmode;
   11920  1.1  mrg   d.nelt = nelt;
   11921  1.1  mrg   d.one_operand_p = false;
   11922  1.1  mrg   d.testing_p = false;
   11923  1.1  mrg 
   11924             for (i = 0; i < nelt; ++i)
   11925               d.perm[i] = i * 2 + odd;
   11926           
   11927             ok = ia64_expand_vec_perm_const_1 (&d);
   11928             gcc_assert (ok);
   11929           }
   11930           
   11931           /* Implement TARGET_CAN_CHANGE_MODE_CLASS.
   11932           
   11933              In BR regs, we can't change the DImode at all.
   11934              In FP regs, we can't change FP values to integer values and vice versa,
   11935              but we can change e.g. DImode to SImode, and V2SFmode into DImode.  */
   11936           
   11937           static bool
   11938           ia64_can_change_mode_class (machine_mode from, machine_mode to,
   11939           			    reg_class_t rclass)
   11940           {
   11941             if (reg_classes_intersect_p (rclass, BR_REGS))
   11942               return from == to;
   11943             if (SCALAR_FLOAT_MODE_P (from) != SCALAR_FLOAT_MODE_P (to))
   11944               return !reg_classes_intersect_p (rclass, FR_REGS);
   11945             return true;
   11946           }
   11947           
   11948           #include "gt-ia64.h"
   11949