OSDN Git Service

gcc/
[pf3gnuchains/gcc-fork.git] / gcc / config / pa / pa.c
1 /* Subroutines for insn-output.c for HPPA.
2    Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001,
3    2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011
4    Free Software Foundation, Inc.
5    Contributed by Tim Moore (moore@cs.utah.edu), based on sparc.c
6
7 This file is part of GCC.
8
9 GCC is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation; either version 3, or (at your option)
12 any later version.
13
14 GCC is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17 GNU General Public License for more details.
18
19 You should have received a copy of the GNU General Public License
20 along with GCC; see the file COPYING3.  If not see
21 <http://www.gnu.org/licenses/>.  */
22
23 #include "config.h"
24 #include "system.h"
25 #include "coretypes.h"
26 #include "tm.h"
27 #include "rtl.h"
28 #include "regs.h"
29 #include "hard-reg-set.h"
30 #include "insn-config.h"
31 #include "conditions.h"
32 #include "insn-attr.h"
33 #include "flags.h"
34 #include "tree.h"
35 #include "output.h"
36 #include "except.h"
37 #include "expr.h"
38 #include "optabs.h"
39 #include "reload.h"
40 #include "integrate.h"
41 #include "function.h"
42 #include "diagnostic-core.h"
43 #include "ggc.h"
44 #include "recog.h"
45 #include "predict.h"
46 #include "tm_p.h"
47 #include "target.h"
48 #include "target-def.h"
49 #include "langhooks.h"
50 #include "df.h"
51 #include "opts.h"
52
53 /* Return nonzero if there is a bypass for the output of 
54    OUT_INSN and the fp store IN_INSN.  */
55 int
56 hppa_fpstore_bypass_p (rtx out_insn, rtx in_insn)
57 {
58   enum machine_mode store_mode;
59   enum machine_mode other_mode;
60   rtx set;
61
62   if (recog_memoized (in_insn) < 0
63       || (get_attr_type (in_insn) != TYPE_FPSTORE
64           && get_attr_type (in_insn) != TYPE_FPSTORE_LOAD)
65       || recog_memoized (out_insn) < 0)
66     return 0;
67
68   store_mode = GET_MODE (SET_SRC (PATTERN (in_insn)));
69
70   set = single_set (out_insn);
71   if (!set)
72     return 0;
73
74   other_mode = GET_MODE (SET_SRC (set));
75
76   return (GET_MODE_SIZE (store_mode) == GET_MODE_SIZE (other_mode));
77 }
78   
79
80 #ifndef DO_FRAME_NOTES
81 #ifdef INCOMING_RETURN_ADDR_RTX
82 #define DO_FRAME_NOTES 1
83 #else
84 #define DO_FRAME_NOTES 0
85 #endif
86 #endif
87
88 static void pa_option_override (void);
89 static void copy_reg_pointer (rtx, rtx);
90 static void fix_range (const char *);
91 static bool pa_handle_option (struct gcc_options *, struct gcc_options *,
92                               const struct cl_decoded_option *, location_t);
93 static int hppa_register_move_cost (enum machine_mode mode, reg_class_t,
94                                     reg_class_t);
95 static int hppa_address_cost (rtx, bool);
96 static bool hppa_rtx_costs (rtx, int, int, int *, bool);
97 static inline rtx force_mode (enum machine_mode, rtx);
98 static void pa_reorg (void);
99 static void pa_combine_instructions (void);
100 static int pa_can_combine_p (rtx, rtx, rtx, int, rtx, rtx, rtx);
101 static bool forward_branch_p (rtx);
102 static void compute_zdepwi_operands (unsigned HOST_WIDE_INT, unsigned *);
103 static int compute_movmem_length (rtx);
104 static int compute_clrmem_length (rtx);
105 static bool pa_assemble_integer (rtx, unsigned int, int);
106 static void remove_useless_addtr_insns (int);
107 static void store_reg (int, HOST_WIDE_INT, int);
108 static void store_reg_modify (int, int, HOST_WIDE_INT);
109 static void load_reg (int, HOST_WIDE_INT, int);
110 static void set_reg_plus_d (int, int, HOST_WIDE_INT, int);
111 static rtx pa_function_value (const_tree, const_tree, bool);
112 static rtx pa_libcall_value (enum machine_mode, const_rtx);
113 static bool pa_function_value_regno_p (const unsigned int);
114 static void pa_output_function_prologue (FILE *, HOST_WIDE_INT);
115 static void update_total_code_bytes (unsigned int);
116 static void pa_output_function_epilogue (FILE *, HOST_WIDE_INT);
117 static int pa_adjust_cost (rtx, rtx, rtx, int);
118 static int pa_adjust_priority (rtx, int);
119 static int pa_issue_rate (void);
120 static void pa_som_asm_init_sections (void) ATTRIBUTE_UNUSED;
121 static section *pa_select_section (tree, int, unsigned HOST_WIDE_INT)
122      ATTRIBUTE_UNUSED;
123 static void pa_encode_section_info (tree, rtx, int);
124 static const char *pa_strip_name_encoding (const char *);
125 static bool pa_function_ok_for_sibcall (tree, tree);
126 static void pa_globalize_label (FILE *, const char *)
127      ATTRIBUTE_UNUSED;
128 static void pa_asm_output_mi_thunk (FILE *, tree, HOST_WIDE_INT,
129                                     HOST_WIDE_INT, tree);
130 #if !defined(USE_COLLECT2)
131 static void pa_asm_out_constructor (rtx, int);
132 static void pa_asm_out_destructor (rtx, int);
133 #endif
134 static void pa_init_builtins (void);
135 static rtx pa_expand_builtin (tree, rtx, rtx, enum machine_mode mode, int);
136 static rtx hppa_builtin_saveregs (void);
137 static void hppa_va_start (tree, rtx);
138 static tree hppa_gimplify_va_arg_expr (tree, tree, gimple_seq *, gimple_seq *);
139 static bool pa_scalar_mode_supported_p (enum machine_mode);
140 static bool pa_commutative_p (const_rtx x, int outer_code);
141 static void copy_fp_args (rtx) ATTRIBUTE_UNUSED;
142 static int length_fp_args (rtx) ATTRIBUTE_UNUSED;
143 static rtx hppa_legitimize_address (rtx, rtx, enum machine_mode);
144 static inline void pa_file_start_level (void) ATTRIBUTE_UNUSED;
145 static inline void pa_file_start_space (int) ATTRIBUTE_UNUSED;
146 static inline void pa_file_start_file (int) ATTRIBUTE_UNUSED;
147 static inline void pa_file_start_mcount (const char*) ATTRIBUTE_UNUSED;
148 static void pa_elf_file_start (void) ATTRIBUTE_UNUSED;
149 static void pa_som_file_start (void) ATTRIBUTE_UNUSED;
150 static void pa_linux_file_start (void) ATTRIBUTE_UNUSED;
151 static void pa_hpux64_gas_file_start (void) ATTRIBUTE_UNUSED;
152 static void pa_hpux64_hpas_file_start (void) ATTRIBUTE_UNUSED;
153 static void output_deferred_plabels (void);
154 static void output_deferred_profile_counters (void) ATTRIBUTE_UNUSED;
155 #ifdef ASM_OUTPUT_EXTERNAL_REAL
156 static void pa_hpux_file_end (void);
157 #endif
158 #if HPUX_LONG_DOUBLE_LIBRARY
159 static void pa_hpux_init_libfuncs (void);
160 #endif
161 static rtx pa_struct_value_rtx (tree, int);
162 static bool pa_pass_by_reference (CUMULATIVE_ARGS *, enum machine_mode,
163                                   const_tree, bool);
164 static int pa_arg_partial_bytes (CUMULATIVE_ARGS *, enum machine_mode,
165                                  tree, bool);
166 static void pa_function_arg_advance (CUMULATIVE_ARGS *, enum machine_mode,
167                                      const_tree, bool);
168 static rtx pa_function_arg (CUMULATIVE_ARGS *, enum machine_mode,
169                             const_tree, bool);
170 static unsigned int pa_function_arg_boundary (enum machine_mode, const_tree);
171 static struct machine_function * pa_init_machine_status (void);
172 static reg_class_t pa_secondary_reload (bool, rtx, reg_class_t,
173                                         enum machine_mode,
174                                         secondary_reload_info *);
175 static void pa_extra_live_on_entry (bitmap);
176 static enum machine_mode pa_promote_function_mode (const_tree,
177                                                    enum machine_mode, int *,
178                                                    const_tree, int);
179
180 static void pa_asm_trampoline_template (FILE *);
181 static void pa_trampoline_init (rtx, tree, rtx);
182 static rtx pa_trampoline_adjust_address (rtx);
183 static rtx pa_delegitimize_address (rtx);
184 static bool pa_print_operand_punct_valid_p (unsigned char);
185 static rtx pa_internal_arg_pointer (void);
186 static bool pa_can_eliminate (const int, const int);
187 static void pa_conditional_register_usage (void);
188 static enum machine_mode pa_c_mode_for_suffix (char);
189 static section *pa_function_section (tree, enum node_frequency, bool, bool);
190 static bool pa_cannot_force_const_mem (enum machine_mode, rtx);
191
192 /* The following extra sections are only used for SOM.  */
193 static GTY(()) section *som_readonly_data_section;
194 static GTY(()) section *som_one_only_readonly_data_section;
195 static GTY(()) section *som_one_only_data_section;
196
197 /* Counts for the number of callee-saved general and floating point
198    registers which were saved by the current function's prologue.  */
199 static int gr_saved, fr_saved;
200
201 /* Boolean indicating whether the return pointer was saved by the
202    current function's prologue.  */
203 static bool rp_saved;
204
205 static rtx find_addr_reg (rtx);
206
207 /* Keep track of the number of bytes we have output in the CODE subspace
208    during this compilation so we'll know when to emit inline long-calls.  */
209 unsigned long total_code_bytes;
210
211 /* The last address of the previous function plus the number of bytes in
212    associated thunks that have been output.  This is used to determine if
213    a thunk can use an IA-relative branch to reach its target function.  */
214 static unsigned int last_address;
215
216 /* Variables to handle plabels that we discover are necessary at assembly
217    output time.  They are output after the current function.  */
218 struct GTY(()) deferred_plabel
219 {
220   rtx internal_label;
221   rtx symbol;
222 };
223 static GTY((length ("n_deferred_plabels"))) struct deferred_plabel *
224   deferred_plabels;
225 static size_t n_deferred_plabels = 0;
226
227 /* Implement TARGET_OPTION_OPTIMIZATION_TABLE.  */
228 static const struct default_options pa_option_optimization_table[] =
229   {
230     { OPT_LEVELS_1_PLUS, OPT_fomit_frame_pointer, NULL, 1 },
231     { OPT_LEVELS_NONE, 0, NULL, 0 }
232   };
233
234 \f
235 /* Initialize the GCC target structure.  */
236
237 #undef TARGET_OPTION_OVERRIDE
238 #define TARGET_OPTION_OVERRIDE pa_option_override
239 #undef TARGET_OPTION_OPTIMIZATION_TABLE
240 #define TARGET_OPTION_OPTIMIZATION_TABLE pa_option_optimization_table
241
242 #undef TARGET_ASM_ALIGNED_HI_OP
243 #define TARGET_ASM_ALIGNED_HI_OP "\t.half\t"
244 #undef TARGET_ASM_ALIGNED_SI_OP
245 #define TARGET_ASM_ALIGNED_SI_OP "\t.word\t"
246 #undef TARGET_ASM_ALIGNED_DI_OP
247 #define TARGET_ASM_ALIGNED_DI_OP "\t.dword\t"
248 #undef TARGET_ASM_UNALIGNED_HI_OP
249 #define TARGET_ASM_UNALIGNED_HI_OP TARGET_ASM_ALIGNED_HI_OP
250 #undef TARGET_ASM_UNALIGNED_SI_OP
251 #define TARGET_ASM_UNALIGNED_SI_OP TARGET_ASM_ALIGNED_SI_OP
252 #undef TARGET_ASM_UNALIGNED_DI_OP
253 #define TARGET_ASM_UNALIGNED_DI_OP TARGET_ASM_ALIGNED_DI_OP
254 #undef TARGET_ASM_INTEGER
255 #define TARGET_ASM_INTEGER pa_assemble_integer
256
257 #undef TARGET_ASM_FUNCTION_PROLOGUE
258 #define TARGET_ASM_FUNCTION_PROLOGUE pa_output_function_prologue
259 #undef TARGET_ASM_FUNCTION_EPILOGUE
260 #define TARGET_ASM_FUNCTION_EPILOGUE pa_output_function_epilogue
261
262 #undef TARGET_FUNCTION_VALUE
263 #define TARGET_FUNCTION_VALUE pa_function_value
264 #undef TARGET_LIBCALL_VALUE
265 #define TARGET_LIBCALL_VALUE pa_libcall_value
266 #undef TARGET_FUNCTION_VALUE_REGNO_P
267 #define TARGET_FUNCTION_VALUE_REGNO_P pa_function_value_regno_p
268
269 #undef TARGET_LEGITIMIZE_ADDRESS
270 #define TARGET_LEGITIMIZE_ADDRESS hppa_legitimize_address
271
272 #undef TARGET_SCHED_ADJUST_COST
273 #define TARGET_SCHED_ADJUST_COST pa_adjust_cost
274 #undef TARGET_SCHED_ADJUST_PRIORITY
275 #define TARGET_SCHED_ADJUST_PRIORITY pa_adjust_priority
276 #undef TARGET_SCHED_ISSUE_RATE
277 #define TARGET_SCHED_ISSUE_RATE pa_issue_rate
278
279 #undef TARGET_ENCODE_SECTION_INFO
280 #define TARGET_ENCODE_SECTION_INFO pa_encode_section_info
281 #undef TARGET_STRIP_NAME_ENCODING
282 #define TARGET_STRIP_NAME_ENCODING pa_strip_name_encoding
283
284 #undef TARGET_FUNCTION_OK_FOR_SIBCALL
285 #define TARGET_FUNCTION_OK_FOR_SIBCALL pa_function_ok_for_sibcall
286
287 #undef TARGET_COMMUTATIVE_P
288 #define TARGET_COMMUTATIVE_P pa_commutative_p
289
290 #undef TARGET_ASM_OUTPUT_MI_THUNK
291 #define TARGET_ASM_OUTPUT_MI_THUNK pa_asm_output_mi_thunk
292 #undef TARGET_ASM_CAN_OUTPUT_MI_THUNK
293 #define TARGET_ASM_CAN_OUTPUT_MI_THUNK default_can_output_mi_thunk_no_vcall
294
295 #undef TARGET_ASM_FILE_END
296 #ifdef ASM_OUTPUT_EXTERNAL_REAL
297 #define TARGET_ASM_FILE_END pa_hpux_file_end
298 #else
299 #define TARGET_ASM_FILE_END output_deferred_plabels
300 #endif
301
302 #undef TARGET_PRINT_OPERAND_PUNCT_VALID_P
303 #define TARGET_PRINT_OPERAND_PUNCT_VALID_P pa_print_operand_punct_valid_p
304
305 #if !defined(USE_COLLECT2)
306 #undef TARGET_ASM_CONSTRUCTOR
307 #define TARGET_ASM_CONSTRUCTOR pa_asm_out_constructor
308 #undef TARGET_ASM_DESTRUCTOR
309 #define TARGET_ASM_DESTRUCTOR pa_asm_out_destructor
310 #endif
311
312 #undef TARGET_DEFAULT_TARGET_FLAGS
313 #define TARGET_DEFAULT_TARGET_FLAGS (TARGET_DEFAULT | TARGET_CPU_DEFAULT)
314 #undef TARGET_HANDLE_OPTION
315 #define TARGET_HANDLE_OPTION pa_handle_option
316
317 #undef TARGET_INIT_BUILTINS
318 #define TARGET_INIT_BUILTINS pa_init_builtins
319
320 #undef TARGET_EXPAND_BUILTIN
321 #define TARGET_EXPAND_BUILTIN pa_expand_builtin
322
323 #undef TARGET_REGISTER_MOVE_COST
324 #define TARGET_REGISTER_MOVE_COST hppa_register_move_cost
325 #undef TARGET_RTX_COSTS
326 #define TARGET_RTX_COSTS hppa_rtx_costs
327 #undef TARGET_ADDRESS_COST
328 #define TARGET_ADDRESS_COST hppa_address_cost
329
330 #undef TARGET_MACHINE_DEPENDENT_REORG
331 #define TARGET_MACHINE_DEPENDENT_REORG pa_reorg
332
333 #if HPUX_LONG_DOUBLE_LIBRARY
334 #undef TARGET_INIT_LIBFUNCS
335 #define TARGET_INIT_LIBFUNCS pa_hpux_init_libfuncs
336 #endif
337
338 #undef TARGET_PROMOTE_FUNCTION_MODE
339 #define TARGET_PROMOTE_FUNCTION_MODE pa_promote_function_mode
340 #undef TARGET_PROMOTE_PROTOTYPES
341 #define TARGET_PROMOTE_PROTOTYPES hook_bool_const_tree_true
342
343 #undef TARGET_STRUCT_VALUE_RTX
344 #define TARGET_STRUCT_VALUE_RTX pa_struct_value_rtx
345 #undef TARGET_RETURN_IN_MEMORY
346 #define TARGET_RETURN_IN_MEMORY pa_return_in_memory
347 #undef TARGET_MUST_PASS_IN_STACK
348 #define TARGET_MUST_PASS_IN_STACK must_pass_in_stack_var_size
349 #undef TARGET_PASS_BY_REFERENCE
350 #define TARGET_PASS_BY_REFERENCE pa_pass_by_reference
351 #undef TARGET_CALLEE_COPIES
352 #define TARGET_CALLEE_COPIES hook_bool_CUMULATIVE_ARGS_mode_tree_bool_true
353 #undef TARGET_ARG_PARTIAL_BYTES
354 #define TARGET_ARG_PARTIAL_BYTES pa_arg_partial_bytes
355 #undef TARGET_FUNCTION_ARG
356 #define TARGET_FUNCTION_ARG pa_function_arg
357 #undef TARGET_FUNCTION_ARG_ADVANCE
358 #define TARGET_FUNCTION_ARG_ADVANCE pa_function_arg_advance
359 #undef TARGET_FUNCTION_ARG_BOUNDARY
360 #define TARGET_FUNCTION_ARG_BOUNDARY pa_function_arg_boundary
361
362 #undef TARGET_EXPAND_BUILTIN_SAVEREGS
363 #define TARGET_EXPAND_BUILTIN_SAVEREGS hppa_builtin_saveregs
364 #undef TARGET_EXPAND_BUILTIN_VA_START
365 #define TARGET_EXPAND_BUILTIN_VA_START hppa_va_start
366 #undef TARGET_GIMPLIFY_VA_ARG_EXPR
367 #define TARGET_GIMPLIFY_VA_ARG_EXPR hppa_gimplify_va_arg_expr
368
369 #undef TARGET_SCALAR_MODE_SUPPORTED_P
370 #define TARGET_SCALAR_MODE_SUPPORTED_P pa_scalar_mode_supported_p
371
372 #undef TARGET_CANNOT_FORCE_CONST_MEM
373 #define TARGET_CANNOT_FORCE_CONST_MEM pa_cannot_force_const_mem
374
375 #undef TARGET_SECONDARY_RELOAD
376 #define TARGET_SECONDARY_RELOAD pa_secondary_reload
377
378 #undef TARGET_EXTRA_LIVE_ON_ENTRY
379 #define TARGET_EXTRA_LIVE_ON_ENTRY pa_extra_live_on_entry
380
381 #undef TARGET_ASM_TRAMPOLINE_TEMPLATE
382 #define TARGET_ASM_TRAMPOLINE_TEMPLATE pa_asm_trampoline_template
383 #undef TARGET_TRAMPOLINE_INIT
384 #define TARGET_TRAMPOLINE_INIT pa_trampoline_init
385 #undef TARGET_TRAMPOLINE_ADJUST_ADDRESS
386 #define TARGET_TRAMPOLINE_ADJUST_ADDRESS pa_trampoline_adjust_address
387 #undef TARGET_DELEGITIMIZE_ADDRESS
388 #define TARGET_DELEGITIMIZE_ADDRESS pa_delegitimize_address
389 #undef TARGET_INTERNAL_ARG_POINTER
390 #define TARGET_INTERNAL_ARG_POINTER pa_internal_arg_pointer
391 #undef TARGET_CAN_ELIMINATE
392 #define TARGET_CAN_ELIMINATE pa_can_eliminate
393 #undef TARGET_CONDITIONAL_REGISTER_USAGE
394 #define TARGET_CONDITIONAL_REGISTER_USAGE pa_conditional_register_usage
395 #undef TARGET_C_MODE_FOR_SUFFIX
396 #define TARGET_C_MODE_FOR_SUFFIX pa_c_mode_for_suffix
397 #undef TARGET_ASM_FUNCTION_SECTION
398 #define TARGET_ASM_FUNCTION_SECTION pa_function_section
399
400 struct gcc_target targetm = TARGET_INITIALIZER;
401 \f
402 /* Parse the -mfixed-range= option string.  */
403
404 static void
405 fix_range (const char *const_str)
406 {
407   int i, first, last;
408   char *str, *dash, *comma;
409
410   /* str must be of the form REG1'-'REG2{,REG1'-'REG} where REG1 and
411      REG2 are either register names or register numbers.  The effect
412      of this option is to mark the registers in the range from REG1 to
413      REG2 as ``fixed'' so they won't be used by the compiler.  This is
414      used, e.g., to ensure that kernel mode code doesn't use fr4-fr31.  */
415
416   i = strlen (const_str);
417   str = (char *) alloca (i + 1);
418   memcpy (str, const_str, i + 1);
419
420   while (1)
421     {
422       dash = strchr (str, '-');
423       if (!dash)
424         {
425           warning (0, "value of -mfixed-range must have form REG1-REG2");
426           return;
427         }
428       *dash = '\0';
429
430       comma = strchr (dash + 1, ',');
431       if (comma)
432         *comma = '\0';
433
434       first = decode_reg_name (str);
435       if (first < 0)
436         {
437           warning (0, "unknown register name: %s", str);
438           return;
439         }
440
441       last = decode_reg_name (dash + 1);
442       if (last < 0)
443         {
444           warning (0, "unknown register name: %s", dash + 1);
445           return;
446         }
447
448       *dash = '-';
449
450       if (first > last)
451         {
452           warning (0, "%s-%s is an empty range", str, dash + 1);
453           return;
454         }
455
456       for (i = first; i <= last; ++i)
457         fixed_regs[i] = call_used_regs[i] = 1;
458
459       if (!comma)
460         break;
461
462       *comma = ',';
463       str = comma + 1;
464     }
465
466   /* Check if all floating point registers have been fixed.  */
467   for (i = FP_REG_FIRST; i <= FP_REG_LAST; i++)
468     if (!fixed_regs[i])
469       break;
470
471   if (i > FP_REG_LAST)
472     target_flags |= MASK_DISABLE_FPREGS;
473 }
474
475 /* Implement TARGET_HANDLE_OPTION.  */
476
477 static bool
478 pa_handle_option (struct gcc_options *opts,
479                   struct gcc_options *opts_set ATTRIBUTE_UNUSED,
480                   const struct cl_decoded_option *decoded,
481                   location_t loc ATTRIBUTE_UNUSED)
482 {
483   size_t code = decoded->opt_index;
484
485   switch (code)
486     {
487     case OPT_mnosnake:
488     case OPT_mpa_risc_1_0:
489     case OPT_march_1_0:
490       opts->x_target_flags &= ~(MASK_PA_11 | MASK_PA_20);
491       return true;
492
493     case OPT_msnake:
494     case OPT_mpa_risc_1_1:
495     case OPT_march_1_1:
496       opts->x_target_flags &= ~MASK_PA_20;
497       opts->x_target_flags |= MASK_PA_11;
498       return true;
499
500     case OPT_mpa_risc_2_0:
501     case OPT_march_2_0:
502       opts->x_target_flags |= MASK_PA_11 | MASK_PA_20;
503       return true;
504
505     default:
506       return true;
507     }
508 }
509
510 /* Implement the TARGET_OPTION_OVERRIDE hook.  */
511
512 static void
513 pa_option_override (void)
514 {
515   unsigned int i;
516   cl_deferred_option *opt;
517   VEC(cl_deferred_option,heap) *vec
518     = (VEC(cl_deferred_option,heap) *) pa_deferred_options;
519
520   FOR_EACH_VEC_ELT (cl_deferred_option, vec, i, opt)
521     {
522       switch (opt->opt_index)
523         {
524         case OPT_mfixed_range_:
525           fix_range (opt->arg);
526           break;
527
528         default:
529           gcc_unreachable ();
530         }
531     }
532
533   /* Unconditional branches in the delay slot are not compatible with dwarf2
534      call frame information.  There is no benefit in using this optimization
535      on PA8000 and later processors.  */
536   if (pa_cpu >= PROCESSOR_8000
537       || (targetm.except_unwind_info (&global_options) == UI_DWARF2
538           && flag_exceptions)
539       || flag_unwind_tables)
540     target_flags &= ~MASK_JUMP_IN_DELAY;
541
542   if (flag_pic && TARGET_PORTABLE_RUNTIME)
543     {
544       warning (0, "PIC code generation is not supported in the portable runtime model");
545     }
546
547   if (flag_pic && TARGET_FAST_INDIRECT_CALLS)
548    {
549       warning (0, "PIC code generation is not compatible with fast indirect calls");
550    }
551
552   if (! TARGET_GAS && write_symbols != NO_DEBUG)
553     {
554       warning (0, "-g is only supported when using GAS on this processor,");
555       warning (0, "-g option disabled");
556       write_symbols = NO_DEBUG;
557     }
558
559   /* We only support the "big PIC" model now.  And we always generate PIC
560      code when in 64bit mode.  */
561   if (flag_pic == 1 || TARGET_64BIT)
562     flag_pic = 2;
563
564   /* Disable -freorder-blocks-and-partition as we don't support hot and
565      cold partitioning.  */
566   if (flag_reorder_blocks_and_partition)
567     {
568       inform (input_location,
569               "-freorder-blocks-and-partition does not work "
570               "on this architecture");
571       flag_reorder_blocks_and_partition = 0;
572       flag_reorder_blocks = 1;
573     }
574
575   /* We can't guarantee that .dword is available for 32-bit targets.  */
576   if (UNITS_PER_WORD == 4)
577     targetm.asm_out.aligned_op.di = NULL;
578
579   /* The unaligned ops are only available when using GAS.  */
580   if (!TARGET_GAS)
581     {
582       targetm.asm_out.unaligned_op.hi = NULL;
583       targetm.asm_out.unaligned_op.si = NULL;
584       targetm.asm_out.unaligned_op.di = NULL;
585     }
586
587   init_machine_status = pa_init_machine_status;
588 }
589
590 enum pa_builtins
591 {
592   PA_BUILTIN_COPYSIGNQ,
593   PA_BUILTIN_FABSQ,
594   PA_BUILTIN_INFQ,
595   PA_BUILTIN_HUGE_VALQ,
596   PA_BUILTIN_max
597 };
598
599 static GTY(()) tree pa_builtins[(int) PA_BUILTIN_max];
600
601 static void
602 pa_init_builtins (void)
603 {
604 #ifdef DONT_HAVE_FPUTC_UNLOCKED
605   built_in_decls[(int) BUILT_IN_FPUTC_UNLOCKED] =
606     built_in_decls[(int) BUILT_IN_PUTC_UNLOCKED];
607   implicit_built_in_decls[(int) BUILT_IN_FPUTC_UNLOCKED]
608     = implicit_built_in_decls[(int) BUILT_IN_PUTC_UNLOCKED];
609 #endif
610 #if TARGET_HPUX_11
611   if (built_in_decls [BUILT_IN_FINITE])
612     set_user_assembler_name (built_in_decls [BUILT_IN_FINITE], "_Isfinite");
613   if (built_in_decls [BUILT_IN_FINITEF])
614     set_user_assembler_name (built_in_decls [BUILT_IN_FINITEF], "_Isfinitef");
615 #endif
616
617   if (HPUX_LONG_DOUBLE_LIBRARY)
618     {
619       tree decl, ftype;
620
621       /* Under HPUX, the __float128 type is a synonym for "long double".  */
622       (*lang_hooks.types.register_builtin_type) (long_double_type_node,
623                                                  "__float128");
624
625       /* TFmode support builtins.  */
626       ftype = build_function_type_list (long_double_type_node,
627                                         long_double_type_node,
628                                         NULL_TREE);
629       decl = add_builtin_function ("__builtin_fabsq", ftype,
630                                    PA_BUILTIN_FABSQ, BUILT_IN_MD,
631                                    "_U_Qfabs", NULL_TREE);
632       TREE_READONLY (decl) = 1;
633       pa_builtins[PA_BUILTIN_FABSQ] = decl;
634
635       ftype = build_function_type_list (long_double_type_node,
636                                         long_double_type_node,
637                                         long_double_type_node,
638                                         NULL_TREE);
639       decl = add_builtin_function ("__builtin_copysignq", ftype,
640                                    PA_BUILTIN_COPYSIGNQ, BUILT_IN_MD,
641                                    "_U_Qfcopysign", NULL_TREE);
642       TREE_READONLY (decl) = 1;
643       pa_builtins[PA_BUILTIN_COPYSIGNQ] = decl;
644
645       ftype = build_function_type_list (long_double_type_node, NULL_TREE);
646       decl = add_builtin_function ("__builtin_infq", ftype,
647                                    PA_BUILTIN_INFQ, BUILT_IN_MD,
648                                    NULL, NULL_TREE);
649       pa_builtins[PA_BUILTIN_INFQ] = decl;
650
651       decl = add_builtin_function ("__builtin_huge_valq", ftype,
652                                    PA_BUILTIN_HUGE_VALQ, BUILT_IN_MD,
653                                    NULL, NULL_TREE);
654       pa_builtins[PA_BUILTIN_HUGE_VALQ] = decl;
655     }
656 }
657
658 static rtx
659 pa_expand_builtin (tree exp, rtx target, rtx subtarget ATTRIBUTE_UNUSED,
660                    enum machine_mode mode ATTRIBUTE_UNUSED,
661                    int ignore ATTRIBUTE_UNUSED)
662 {
663   tree fndecl = TREE_OPERAND (CALL_EXPR_FN (exp), 0);
664   unsigned int fcode = DECL_FUNCTION_CODE (fndecl);
665
666   switch (fcode)
667     {
668     case PA_BUILTIN_FABSQ:
669     case PA_BUILTIN_COPYSIGNQ:
670       return expand_call (exp, target, ignore);
671
672     case PA_BUILTIN_INFQ:
673     case PA_BUILTIN_HUGE_VALQ:
674       {
675         enum machine_mode target_mode = TYPE_MODE (TREE_TYPE (exp));
676         REAL_VALUE_TYPE inf;
677         rtx tmp;
678
679         real_inf (&inf);
680         tmp = CONST_DOUBLE_FROM_REAL_VALUE (inf, target_mode);
681
682         tmp = validize_mem (force_const_mem (target_mode, tmp));
683
684         if (target == 0)
685           target = gen_reg_rtx (target_mode);
686
687         emit_move_insn (target, tmp);
688         return target;
689       }
690
691     default:
692       gcc_unreachable ();
693     }
694
695   return NULL_RTX;
696 }
697
698 /* Function to init struct machine_function.
699    This will be called, via a pointer variable,
700    from push_function_context.  */
701
702 static struct machine_function *
703 pa_init_machine_status (void)
704 {
705   return ggc_alloc_cleared_machine_function ();
706 }
707
708 /* If FROM is a probable pointer register, mark TO as a probable
709    pointer register with the same pointer alignment as FROM.  */
710
711 static void
712 copy_reg_pointer (rtx to, rtx from)
713 {
714   if (REG_POINTER (from))
715     mark_reg_pointer (to, REGNO_POINTER_ALIGN (REGNO (from)));
716 }
717
718 /* Return 1 if X contains a symbolic expression.  We know these
719    expressions will have one of a few well defined forms, so
720    we need only check those forms.  */
721 int
722 symbolic_expression_p (rtx x)
723 {
724
725   /* Strip off any HIGH.  */
726   if (GET_CODE (x) == HIGH)
727     x = XEXP (x, 0);
728
729   return (symbolic_operand (x, VOIDmode));
730 }
731
732 /* Accept any constant that can be moved in one instruction into a
733    general register.  */
734 int
735 cint_ok_for_move (HOST_WIDE_INT ival)
736 {
737   /* OK if ldo, ldil, or zdepi, can be used.  */
738   return (VAL_14_BITS_P (ival)
739           || ldil_cint_p (ival)
740           || zdepi_cint_p (ival));
741 }
742 \f
743 /* True iff ldil can be used to load this CONST_INT.  The least
744    significant 11 bits of the value must be zero and the value must
745    not change sign when extended from 32 to 64 bits.  */
746 int
747 ldil_cint_p (HOST_WIDE_INT ival)
748 {
749   HOST_WIDE_INT x = ival & (((HOST_WIDE_INT) -1 << 31) | 0x7ff);
750
751   return x == 0 || x == ((HOST_WIDE_INT) -1 << 31);
752 }
753
754 /* True iff zdepi can be used to generate this CONST_INT.
755    zdepi first sign extends a 5-bit signed number to a given field
756    length, then places this field anywhere in a zero.  */
757 int
758 zdepi_cint_p (unsigned HOST_WIDE_INT x)
759 {
760   unsigned HOST_WIDE_INT lsb_mask, t;
761
762   /* This might not be obvious, but it's at least fast.
763      This function is critical; we don't have the time loops would take.  */
764   lsb_mask = x & -x;
765   t = ((x >> 4) + lsb_mask) & ~(lsb_mask - 1);
766   /* Return true iff t is a power of two.  */
767   return ((t & (t - 1)) == 0);
768 }
769
770 /* True iff depi or extru can be used to compute (reg & mask).
771    Accept bit pattern like these:
772    0....01....1
773    1....10....0
774    1..10..01..1  */
775 int
776 and_mask_p (unsigned HOST_WIDE_INT mask)
777 {
778   mask = ~mask;
779   mask += mask & -mask;
780   return (mask & (mask - 1)) == 0;
781 }
782
783 /* True iff depi can be used to compute (reg | MASK).  */
784 int
785 ior_mask_p (unsigned HOST_WIDE_INT mask)
786 {
787   mask += mask & -mask;
788   return (mask & (mask - 1)) == 0;
789 }
790 \f
791 /* Legitimize PIC addresses.  If the address is already
792    position-independent, we return ORIG.  Newly generated
793    position-independent addresses go to REG.  If we need more
794    than one register, we lose.  */
795
796 rtx
797 legitimize_pic_address (rtx orig, enum machine_mode mode, rtx reg)
798 {
799   rtx pic_ref = orig;
800
801   gcc_assert (!PA_SYMBOL_REF_TLS_P (orig));
802
803   /* Labels need special handling.  */
804   if (pic_label_operand (orig, mode))
805     {
806       rtx insn;
807
808       /* We do not want to go through the movXX expanders here since that
809          would create recursion.
810
811          Nor do we really want to call a generator for a named pattern
812          since that requires multiple patterns if we want to support
813          multiple word sizes.
814
815          So instead we just emit the raw set, which avoids the movXX
816          expanders completely.  */
817       mark_reg_pointer (reg, BITS_PER_UNIT);
818       insn = emit_insn (gen_rtx_SET (VOIDmode, reg, orig));
819
820       /* Put a REG_EQUAL note on this insn, so that it can be optimized.  */
821       add_reg_note (insn, REG_EQUAL, orig);
822
823       /* During and after reload, we need to generate a REG_LABEL_OPERAND note
824          and update LABEL_NUSES because this is not done automatically.  */
825       if (reload_in_progress || reload_completed)
826         {
827           /* Extract LABEL_REF.  */
828           if (GET_CODE (orig) == CONST)
829             orig = XEXP (XEXP (orig, 0), 0);
830           /* Extract CODE_LABEL.  */
831           orig = XEXP (orig, 0);
832           add_reg_note (insn, REG_LABEL_OPERAND, orig);
833           LABEL_NUSES (orig)++;
834         }
835       crtl->uses_pic_offset_table = 1;
836       return reg;
837     }
838   if (GET_CODE (orig) == SYMBOL_REF)
839     {
840       rtx insn, tmp_reg;
841
842       gcc_assert (reg);
843
844       /* Before reload, allocate a temporary register for the intermediate
845          result.  This allows the sequence to be deleted when the final
846          result is unused and the insns are trivially dead.  */
847       tmp_reg = ((reload_in_progress || reload_completed)
848                  ? reg : gen_reg_rtx (Pmode));
849
850       if (function_label_operand (orig, VOIDmode))
851         {
852           /* Force function label into memory in word mode.  */
853           orig = XEXP (force_const_mem (word_mode, orig), 0);
854           /* Load plabel address from DLT.  */
855           emit_move_insn (tmp_reg,
856                           gen_rtx_PLUS (word_mode, pic_offset_table_rtx,
857                                         gen_rtx_HIGH (word_mode, orig)));
858           pic_ref
859             = gen_const_mem (Pmode,
860                              gen_rtx_LO_SUM (Pmode, tmp_reg,
861                                              gen_rtx_UNSPEC (Pmode,
862                                                          gen_rtvec (1, orig),
863                                                          UNSPEC_DLTIND14R)));
864           emit_move_insn (reg, pic_ref);
865           /* Now load address of function descriptor.  */
866           pic_ref = gen_rtx_MEM (Pmode, reg);
867         }
868       else
869         {
870           /* Load symbol reference from DLT.  */
871           emit_move_insn (tmp_reg,
872                           gen_rtx_PLUS (word_mode, pic_offset_table_rtx,
873                                         gen_rtx_HIGH (word_mode, orig)));
874           pic_ref
875             = gen_const_mem (Pmode,
876                              gen_rtx_LO_SUM (Pmode, tmp_reg,
877                                              gen_rtx_UNSPEC (Pmode,
878                                                          gen_rtvec (1, orig),
879                                                          UNSPEC_DLTIND14R)));
880         }
881
882       crtl->uses_pic_offset_table = 1;
883       mark_reg_pointer (reg, BITS_PER_UNIT);
884       insn = emit_move_insn (reg, pic_ref);
885
886       /* Put a REG_EQUAL note on this insn, so that it can be optimized.  */
887       set_unique_reg_note (insn, REG_EQUAL, orig);
888
889       return reg;
890     }
891   else if (GET_CODE (orig) == CONST)
892     {
893       rtx base;
894
895       if (GET_CODE (XEXP (orig, 0)) == PLUS
896           && XEXP (XEXP (orig, 0), 0) == pic_offset_table_rtx)
897         return orig;
898
899       gcc_assert (reg);
900       gcc_assert (GET_CODE (XEXP (orig, 0)) == PLUS);
901       
902       base = legitimize_pic_address (XEXP (XEXP (orig, 0), 0), Pmode, reg);
903       orig = legitimize_pic_address (XEXP (XEXP (orig, 0), 1), Pmode,
904                                      base == reg ? 0 : reg);
905
906       if (GET_CODE (orig) == CONST_INT)
907         {
908           if (INT_14_BITS (orig))
909             return plus_constant (base, INTVAL (orig));
910           orig = force_reg (Pmode, orig);
911         }
912       pic_ref = gen_rtx_PLUS (Pmode, base, orig);
913       /* Likewise, should we set special REG_NOTEs here?  */
914     }
915
916   return pic_ref;
917 }
918
919 static GTY(()) rtx gen_tls_tga;
920
921 static rtx
922 gen_tls_get_addr (void)
923 {
924   if (!gen_tls_tga)
925     gen_tls_tga = init_one_libfunc ("__tls_get_addr");
926   return gen_tls_tga;
927 }
928
929 static rtx
930 hppa_tls_call (rtx arg)
931 {
932   rtx ret;
933
934   ret = gen_reg_rtx (Pmode);
935   emit_library_call_value (gen_tls_get_addr (), ret,
936                            LCT_CONST, Pmode, 1, arg, Pmode);
937
938   return ret;
939 }
940
941 static rtx
942 legitimize_tls_address (rtx addr)
943 {
944   rtx ret, insn, tmp, t1, t2, tp;
945   enum tls_model model = SYMBOL_REF_TLS_MODEL (addr);
946
947   switch (model) 
948     {
949       case TLS_MODEL_GLOBAL_DYNAMIC:
950         tmp = gen_reg_rtx (Pmode);
951         if (flag_pic)
952           emit_insn (gen_tgd_load_pic (tmp, addr));
953         else
954           emit_insn (gen_tgd_load (tmp, addr));
955         ret = hppa_tls_call (tmp);
956         break;
957
958       case TLS_MODEL_LOCAL_DYNAMIC:
959         ret = gen_reg_rtx (Pmode);
960         tmp = gen_reg_rtx (Pmode);
961         start_sequence ();
962         if (flag_pic)
963           emit_insn (gen_tld_load_pic (tmp, addr));
964         else
965           emit_insn (gen_tld_load (tmp, addr));
966         t1 = hppa_tls_call (tmp);
967         insn = get_insns ();
968         end_sequence ();
969         t2 = gen_reg_rtx (Pmode);
970         emit_libcall_block (insn, t2, t1, 
971                             gen_rtx_UNSPEC (Pmode, gen_rtvec (1, const0_rtx),
972                                             UNSPEC_TLSLDBASE));
973         emit_insn (gen_tld_offset_load (ret, addr, t2));
974         break;
975
976       case TLS_MODEL_INITIAL_EXEC:
977         tp = gen_reg_rtx (Pmode);
978         tmp = gen_reg_rtx (Pmode);
979         ret = gen_reg_rtx (Pmode);
980         emit_insn (gen_tp_load (tp));
981         if (flag_pic)
982           emit_insn (gen_tie_load_pic (tmp, addr));
983         else
984           emit_insn (gen_tie_load (tmp, addr));
985         emit_move_insn (ret, gen_rtx_PLUS (Pmode, tp, tmp));
986         break;
987
988       case TLS_MODEL_LOCAL_EXEC:
989         tp = gen_reg_rtx (Pmode);
990         ret = gen_reg_rtx (Pmode);
991         emit_insn (gen_tp_load (tp));
992         emit_insn (gen_tle_load (ret, addr, tp));
993         break;
994
995       default:
996         gcc_unreachable ();
997     }
998
999   return ret;
1000 }
1001
1002 /* Try machine-dependent ways of modifying an illegitimate address
1003    to be legitimate.  If we find one, return the new, valid address.
1004    This macro is used in only one place: `memory_address' in explow.c.
1005
1006    OLDX is the address as it was before break_out_memory_refs was called.
1007    In some cases it is useful to look at this to decide what needs to be done.
1008
1009    It is always safe for this macro to do nothing.  It exists to recognize
1010    opportunities to optimize the output.
1011
1012    For the PA, transform:
1013
1014         memory(X + <large int>)
1015
1016    into:
1017
1018         if (<large int> & mask) >= 16
1019           Y = (<large int> & ~mask) + mask + 1  Round up.
1020         else
1021           Y = (<large int> & ~mask)             Round down.
1022         Z = X + Y
1023         memory (Z + (<large int> - Y));
1024
1025    This is for CSE to find several similar references, and only use one Z.
1026
1027    X can either be a SYMBOL_REF or REG, but because combine cannot
1028    perform a 4->2 combination we do nothing for SYMBOL_REF + D where
1029    D will not fit in 14 bits.
1030
1031    MODE_FLOAT references allow displacements which fit in 5 bits, so use
1032    0x1f as the mask.
1033
1034    MODE_INT references allow displacements which fit in 14 bits, so use
1035    0x3fff as the mask.
1036
1037    This relies on the fact that most mode MODE_FLOAT references will use FP
1038    registers and most mode MODE_INT references will use integer registers.
1039    (In the rare case of an FP register used in an integer MODE, we depend
1040    on secondary reloads to clean things up.)
1041
1042
1043    It is also beneficial to handle (plus (mult (X) (Y)) (Z)) in a special
1044    manner if Y is 2, 4, or 8.  (allows more shadd insns and shifted indexed
1045    addressing modes to be used).
1046
1047    Put X and Z into registers.  Then put the entire expression into
1048    a register.  */
1049
1050 rtx
1051 hppa_legitimize_address (rtx x, rtx oldx ATTRIBUTE_UNUSED,
1052                          enum machine_mode mode)
1053 {
1054   rtx orig = x;
1055
1056   /* We need to canonicalize the order of operands in unscaled indexed
1057      addresses since the code that checks if an address is valid doesn't
1058      always try both orders.  */
1059   if (!TARGET_NO_SPACE_REGS
1060       && GET_CODE (x) == PLUS
1061       && GET_MODE (x) == Pmode
1062       && REG_P (XEXP (x, 0))
1063       && REG_P (XEXP (x, 1))
1064       && REG_POINTER (XEXP (x, 0))
1065       && !REG_POINTER (XEXP (x, 1)))
1066     return gen_rtx_PLUS (Pmode, XEXP (x, 1), XEXP (x, 0));
1067
1068   if (PA_SYMBOL_REF_TLS_P (x))
1069     return legitimize_tls_address (x);
1070   else if (flag_pic)
1071     return legitimize_pic_address (x, mode, gen_reg_rtx (Pmode));
1072
1073   /* Strip off CONST.  */
1074   if (GET_CODE (x) == CONST)
1075     x = XEXP (x, 0);
1076
1077   /* Special case.  Get the SYMBOL_REF into a register and use indexing.
1078      That should always be safe.  */
1079   if (GET_CODE (x) == PLUS
1080       && GET_CODE (XEXP (x, 0)) == REG
1081       && GET_CODE (XEXP (x, 1)) == SYMBOL_REF)
1082     {
1083       rtx reg = force_reg (Pmode, XEXP (x, 1));
1084       return force_reg (Pmode, gen_rtx_PLUS (Pmode, reg, XEXP (x, 0)));
1085     }
1086
1087   /* Note we must reject symbols which represent function addresses
1088      since the assembler/linker can't handle arithmetic on plabels.  */
1089   if (GET_CODE (x) == PLUS
1090       && GET_CODE (XEXP (x, 1)) == CONST_INT
1091       && ((GET_CODE (XEXP (x, 0)) == SYMBOL_REF
1092            && !FUNCTION_NAME_P (XSTR (XEXP (x, 0), 0)))
1093           || GET_CODE (XEXP (x, 0)) == REG))
1094     {
1095       rtx int_part, ptr_reg;
1096       int newoffset;
1097       int offset = INTVAL (XEXP (x, 1));
1098       int mask;
1099
1100       mask = (GET_MODE_CLASS (mode) == MODE_FLOAT
1101               ? (INT14_OK_STRICT ? 0x3fff : 0x1f) : 0x3fff);
1102
1103       /* Choose which way to round the offset.  Round up if we
1104          are >= halfway to the next boundary.  */
1105       if ((offset & mask) >= ((mask + 1) / 2))
1106         newoffset = (offset & ~ mask) + mask + 1;
1107       else
1108         newoffset = (offset & ~ mask);
1109
1110       /* If the newoffset will not fit in 14 bits (ldo), then
1111          handling this would take 4 or 5 instructions (2 to load
1112          the SYMBOL_REF + 1 or 2 to load the newoffset + 1 to
1113          add the new offset and the SYMBOL_REF.)  Combine can
1114          not handle 4->2 or 5->2 combinations, so do not create
1115          them.  */
1116       if (! VAL_14_BITS_P (newoffset)
1117           && GET_CODE (XEXP (x, 0)) == SYMBOL_REF)
1118         {
1119           rtx const_part = plus_constant (XEXP (x, 0), newoffset);
1120           rtx tmp_reg
1121             = force_reg (Pmode,
1122                          gen_rtx_HIGH (Pmode, const_part));
1123           ptr_reg
1124             = force_reg (Pmode,
1125                          gen_rtx_LO_SUM (Pmode,
1126                                          tmp_reg, const_part));
1127         }
1128       else
1129         {
1130           if (! VAL_14_BITS_P (newoffset))
1131             int_part = force_reg (Pmode, GEN_INT (newoffset));
1132           else
1133             int_part = GEN_INT (newoffset);
1134
1135           ptr_reg = force_reg (Pmode,
1136                                gen_rtx_PLUS (Pmode,
1137                                              force_reg (Pmode, XEXP (x, 0)),
1138                                              int_part));
1139         }
1140       return plus_constant (ptr_reg, offset - newoffset);
1141     }
1142
1143   /* Handle (plus (mult (a) (shadd_constant)) (b)).  */
1144
1145   if (GET_CODE (x) == PLUS && GET_CODE (XEXP (x, 0)) == MULT
1146       && GET_CODE (XEXP (XEXP (x, 0), 1)) == CONST_INT
1147       && shadd_constant_p (INTVAL (XEXP (XEXP (x, 0), 1)))
1148       && (OBJECT_P (XEXP (x, 1))
1149           || GET_CODE (XEXP (x, 1)) == SUBREG)
1150       && GET_CODE (XEXP (x, 1)) != CONST)
1151     {
1152       int val = INTVAL (XEXP (XEXP (x, 0), 1));
1153       rtx reg1, reg2;
1154
1155       reg1 = XEXP (x, 1);
1156       if (GET_CODE (reg1) != REG)
1157         reg1 = force_reg (Pmode, force_operand (reg1, 0));
1158
1159       reg2 = XEXP (XEXP (x, 0), 0);
1160       if (GET_CODE (reg2) != REG)
1161         reg2 = force_reg (Pmode, force_operand (reg2, 0));
1162
1163       return force_reg (Pmode, gen_rtx_PLUS (Pmode,
1164                                              gen_rtx_MULT (Pmode,
1165                                                            reg2,
1166                                                            GEN_INT (val)),
1167                                              reg1));
1168     }
1169
1170   /* Similarly for (plus (plus (mult (a) (shadd_constant)) (b)) (c)).
1171
1172      Only do so for floating point modes since this is more speculative
1173      and we lose if it's an integer store.  */
1174   if (GET_CODE (x) == PLUS
1175       && GET_CODE (XEXP (x, 0)) == PLUS
1176       && GET_CODE (XEXP (XEXP (x, 0), 0)) == MULT
1177       && GET_CODE (XEXP (XEXP (XEXP (x, 0), 0), 1)) == CONST_INT
1178       && shadd_constant_p (INTVAL (XEXP (XEXP (XEXP (x, 0), 0), 1)))
1179       && (mode == SFmode || mode == DFmode))
1180     {
1181
1182       /* First, try and figure out what to use as a base register.  */
1183       rtx reg1, reg2, base, idx;
1184
1185       reg1 = XEXP (XEXP (x, 0), 1);
1186       reg2 = XEXP (x, 1);
1187       base = NULL_RTX;
1188       idx = NULL_RTX;
1189
1190       /* Make sure they're both regs.  If one was a SYMBOL_REF [+ const],
1191          then emit_move_sequence will turn on REG_POINTER so we'll know
1192          it's a base register below.  */
1193       if (GET_CODE (reg1) != REG)
1194         reg1 = force_reg (Pmode, force_operand (reg1, 0));
1195
1196       if (GET_CODE (reg2) != REG)
1197         reg2 = force_reg (Pmode, force_operand (reg2, 0));
1198
1199       /* Figure out what the base and index are.  */
1200
1201       if (GET_CODE (reg1) == REG
1202           && REG_POINTER (reg1))
1203         {
1204           base = reg1;
1205           idx = gen_rtx_PLUS (Pmode,
1206                               gen_rtx_MULT (Pmode,
1207                                             XEXP (XEXP (XEXP (x, 0), 0), 0),
1208                                             XEXP (XEXP (XEXP (x, 0), 0), 1)),
1209                               XEXP (x, 1));
1210         }
1211       else if (GET_CODE (reg2) == REG
1212                && REG_POINTER (reg2))
1213         {
1214           base = reg2;
1215           idx = XEXP (x, 0);
1216         }
1217
1218       if (base == 0)
1219         return orig;
1220
1221       /* If the index adds a large constant, try to scale the
1222          constant so that it can be loaded with only one insn.  */
1223       if (GET_CODE (XEXP (idx, 1)) == CONST_INT
1224           && VAL_14_BITS_P (INTVAL (XEXP (idx, 1))
1225                             / INTVAL (XEXP (XEXP (idx, 0), 1)))
1226           && INTVAL (XEXP (idx, 1)) % INTVAL (XEXP (XEXP (idx, 0), 1)) == 0)
1227         {
1228           /* Divide the CONST_INT by the scale factor, then add it to A.  */
1229           int val = INTVAL (XEXP (idx, 1));
1230
1231           val /= INTVAL (XEXP (XEXP (idx, 0), 1));
1232           reg1 = XEXP (XEXP (idx, 0), 0);
1233           if (GET_CODE (reg1) != REG)
1234             reg1 = force_reg (Pmode, force_operand (reg1, 0));
1235
1236           reg1 = force_reg (Pmode, gen_rtx_PLUS (Pmode, reg1, GEN_INT (val)));
1237
1238           /* We can now generate a simple scaled indexed address.  */
1239           return
1240             force_reg
1241               (Pmode, gen_rtx_PLUS (Pmode,
1242                                     gen_rtx_MULT (Pmode, reg1,
1243                                                   XEXP (XEXP (idx, 0), 1)),
1244                                     base));
1245         }
1246
1247       /* If B + C is still a valid base register, then add them.  */
1248       if (GET_CODE (XEXP (idx, 1)) == CONST_INT
1249           && INTVAL (XEXP (idx, 1)) <= 4096
1250           && INTVAL (XEXP (idx, 1)) >= -4096)
1251         {
1252           int val = INTVAL (XEXP (XEXP (idx, 0), 1));
1253           rtx reg1, reg2;
1254
1255           reg1 = force_reg (Pmode, gen_rtx_PLUS (Pmode, base, XEXP (idx, 1)));
1256
1257           reg2 = XEXP (XEXP (idx, 0), 0);
1258           if (GET_CODE (reg2) != CONST_INT)
1259             reg2 = force_reg (Pmode, force_operand (reg2, 0));
1260
1261           return force_reg (Pmode, gen_rtx_PLUS (Pmode,
1262                                                  gen_rtx_MULT (Pmode,
1263                                                                reg2,
1264                                                                GEN_INT (val)),
1265                                                  reg1));
1266         }
1267
1268       /* Get the index into a register, then add the base + index and
1269          return a register holding the result.  */
1270
1271       /* First get A into a register.  */
1272       reg1 = XEXP (XEXP (idx, 0), 0);
1273       if (GET_CODE (reg1) != REG)
1274         reg1 = force_reg (Pmode, force_operand (reg1, 0));
1275
1276       /* And get B into a register.  */
1277       reg2 = XEXP (idx, 1);
1278       if (GET_CODE (reg2) != REG)
1279         reg2 = force_reg (Pmode, force_operand (reg2, 0));
1280
1281       reg1 = force_reg (Pmode,
1282                         gen_rtx_PLUS (Pmode,
1283                                       gen_rtx_MULT (Pmode, reg1,
1284                                                     XEXP (XEXP (idx, 0), 1)),
1285                                       reg2));
1286
1287       /* Add the result to our base register and return.  */
1288       return force_reg (Pmode, gen_rtx_PLUS (Pmode, base, reg1));
1289
1290     }
1291
1292   /* Uh-oh.  We might have an address for x[n-100000].  This needs
1293      special handling to avoid creating an indexed memory address
1294      with x-100000 as the base.
1295
1296      If the constant part is small enough, then it's still safe because
1297      there is a guard page at the beginning and end of the data segment.
1298
1299      Scaled references are common enough that we want to try and rearrange the
1300      terms so that we can use indexing for these addresses too.  Only
1301      do the optimization for floatint point modes.  */
1302
1303   if (GET_CODE (x) == PLUS
1304       && symbolic_expression_p (XEXP (x, 1)))
1305     {
1306       /* Ugly.  We modify things here so that the address offset specified
1307          by the index expression is computed first, then added to x to form
1308          the entire address.  */
1309
1310       rtx regx1, regx2, regy1, regy2, y;
1311
1312       /* Strip off any CONST.  */
1313       y = XEXP (x, 1);
1314       if (GET_CODE (y) == CONST)
1315         y = XEXP (y, 0);
1316
1317       if (GET_CODE (y) == PLUS || GET_CODE (y) == MINUS)
1318         {
1319           /* See if this looks like
1320                 (plus (mult (reg) (shadd_const))
1321                       (const (plus (symbol_ref) (const_int))))
1322
1323              Where const_int is small.  In that case the const
1324              expression is a valid pointer for indexing.
1325
1326              If const_int is big, but can be divided evenly by shadd_const
1327              and added to (reg).  This allows more scaled indexed addresses.  */
1328           if (GET_CODE (XEXP (y, 0)) == SYMBOL_REF
1329               && GET_CODE (XEXP (x, 0)) == MULT
1330               && GET_CODE (XEXP (y, 1)) == CONST_INT
1331               && INTVAL (XEXP (y, 1)) >= -4096
1332               && INTVAL (XEXP (y, 1)) <= 4095
1333               && GET_CODE (XEXP (XEXP (x, 0), 1)) == CONST_INT
1334               && shadd_constant_p (INTVAL (XEXP (XEXP (x, 0), 1))))
1335             {
1336               int val = INTVAL (XEXP (XEXP (x, 0), 1));
1337               rtx reg1, reg2;
1338
1339               reg1 = XEXP (x, 1);
1340               if (GET_CODE (reg1) != REG)
1341                 reg1 = force_reg (Pmode, force_operand (reg1, 0));
1342
1343               reg2 = XEXP (XEXP (x, 0), 0);
1344               if (GET_CODE (reg2) != REG)
1345                 reg2 = force_reg (Pmode, force_operand (reg2, 0));
1346
1347               return force_reg (Pmode,
1348                                 gen_rtx_PLUS (Pmode,
1349                                               gen_rtx_MULT (Pmode,
1350                                                             reg2,
1351                                                             GEN_INT (val)),
1352                                               reg1));
1353             }
1354           else if ((mode == DFmode || mode == SFmode)
1355                    && GET_CODE (XEXP (y, 0)) == SYMBOL_REF
1356                    && GET_CODE (XEXP (x, 0)) == MULT
1357                    && GET_CODE (XEXP (y, 1)) == CONST_INT
1358                    && INTVAL (XEXP (y, 1)) % INTVAL (XEXP (XEXP (x, 0), 1)) == 0
1359                    && GET_CODE (XEXP (XEXP (x, 0), 1)) == CONST_INT
1360                    && shadd_constant_p (INTVAL (XEXP (XEXP (x, 0), 1))))
1361             {
1362               regx1
1363                 = force_reg (Pmode, GEN_INT (INTVAL (XEXP (y, 1))
1364                                              / INTVAL (XEXP (XEXP (x, 0), 1))));
1365               regx2 = XEXP (XEXP (x, 0), 0);
1366               if (GET_CODE (regx2) != REG)
1367                 regx2 = force_reg (Pmode, force_operand (regx2, 0));
1368               regx2 = force_reg (Pmode, gen_rtx_fmt_ee (GET_CODE (y), Pmode,
1369                                                         regx2, regx1));
1370               return
1371                 force_reg (Pmode,
1372                            gen_rtx_PLUS (Pmode,
1373                                          gen_rtx_MULT (Pmode, regx2,
1374                                                        XEXP (XEXP (x, 0), 1)),
1375                                          force_reg (Pmode, XEXP (y, 0))));
1376             }
1377           else if (GET_CODE (XEXP (y, 1)) == CONST_INT
1378                    && INTVAL (XEXP (y, 1)) >= -4096
1379                    && INTVAL (XEXP (y, 1)) <= 4095)
1380             {
1381               /* This is safe because of the guard page at the
1382                  beginning and end of the data space.  Just
1383                  return the original address.  */
1384               return orig;
1385             }
1386           else
1387             {
1388               /* Doesn't look like one we can optimize.  */
1389               regx1 = force_reg (Pmode, force_operand (XEXP (x, 0), 0));
1390               regy1 = force_reg (Pmode, force_operand (XEXP (y, 0), 0));
1391               regy2 = force_reg (Pmode, force_operand (XEXP (y, 1), 0));
1392               regx1 = force_reg (Pmode,
1393                                  gen_rtx_fmt_ee (GET_CODE (y), Pmode,
1394                                                  regx1, regy2));
1395               return force_reg (Pmode, gen_rtx_PLUS (Pmode, regx1, regy1));
1396             }
1397         }
1398     }
1399
1400   return orig;
1401 }
1402
1403 /* Implement the TARGET_REGISTER_MOVE_COST hook.
1404
1405    Compute extra cost of moving data between one register class
1406    and another.
1407
1408    Make moves from SAR so expensive they should never happen.  We used to
1409    have 0xffff here, but that generates overflow in rare cases.
1410
1411    Copies involving a FP register and a non-FP register are relatively
1412    expensive because they must go through memory.
1413
1414    Other copies are reasonably cheap.  */
1415
1416 static int
1417 hppa_register_move_cost (enum machine_mode mode ATTRIBUTE_UNUSED,
1418                          reg_class_t from, reg_class_t to)
1419 {
1420   if (from == SHIFT_REGS)
1421     return 0x100;
1422   else if (to == SHIFT_REGS && FP_REG_CLASS_P (from))
1423     return 18;
1424   else if ((FP_REG_CLASS_P (from) && ! FP_REG_CLASS_P (to))
1425            || (FP_REG_CLASS_P (to) && ! FP_REG_CLASS_P (from)))
1426     return 16;
1427   else
1428     return 2;
1429 }
1430
1431 /* For the HPPA, REG and REG+CONST is cost 0
1432    and addresses involving symbolic constants are cost 2.
1433
1434    PIC addresses are very expensive.
1435
1436    It is no coincidence that this has the same structure
1437    as GO_IF_LEGITIMATE_ADDRESS.  */
1438
1439 static int
1440 hppa_address_cost (rtx X,
1441                    bool speed ATTRIBUTE_UNUSED)
1442 {
1443   switch (GET_CODE (X))
1444     {
1445     case REG:
1446     case PLUS:
1447     case LO_SUM:
1448       return 1;
1449     case HIGH:
1450       return 2;
1451     default:
1452       return 4;
1453     }
1454 }
1455
1456 /* Compute a (partial) cost for rtx X.  Return true if the complete
1457    cost has been computed, and false if subexpressions should be
1458    scanned.  In either case, *TOTAL contains the cost result.  */
1459
1460 static bool
1461 hppa_rtx_costs (rtx x, int code, int outer_code, int *total,
1462                 bool speed ATTRIBUTE_UNUSED)
1463 {
1464   switch (code)
1465     {
1466     case CONST_INT:
1467       if (INTVAL (x) == 0)
1468         *total = 0;
1469       else if (INT_14_BITS (x))
1470         *total = 1;
1471       else
1472         *total = 2;
1473       return true;
1474
1475     case HIGH:
1476       *total = 2;
1477       return true;
1478
1479     case CONST:
1480     case LABEL_REF:
1481     case SYMBOL_REF:
1482       *total = 4;
1483       return true;
1484
1485     case CONST_DOUBLE:
1486       if ((x == CONST0_RTX (DFmode) || x == CONST0_RTX (SFmode))
1487           && outer_code != SET)
1488         *total = 0;
1489       else
1490         *total = 8;
1491       return true;
1492
1493     case MULT:
1494       if (GET_MODE_CLASS (GET_MODE (x)) == MODE_FLOAT)
1495         *total = COSTS_N_INSNS (3);
1496       else if (TARGET_PA_11 && !TARGET_DISABLE_FPREGS && !TARGET_SOFT_FLOAT)
1497         *total = COSTS_N_INSNS (8);
1498       else
1499         *total = COSTS_N_INSNS (20);
1500       return true;
1501
1502     case DIV:
1503       if (GET_MODE_CLASS (GET_MODE (x)) == MODE_FLOAT)
1504         {
1505           *total = COSTS_N_INSNS (14);
1506           return true;
1507         }
1508       /* FALLTHRU */
1509
1510     case UDIV:
1511     case MOD:
1512     case UMOD:
1513       *total = COSTS_N_INSNS (60);
1514       return true;
1515
1516     case PLUS: /* this includes shNadd insns */
1517     case MINUS:
1518       if (GET_MODE_CLASS (GET_MODE (x)) == MODE_FLOAT)
1519         *total = COSTS_N_INSNS (3);
1520       else
1521         *total = COSTS_N_INSNS (1);
1522       return true;
1523
1524     case ASHIFT:
1525     case ASHIFTRT:
1526     case LSHIFTRT:
1527       *total = COSTS_N_INSNS (1);
1528       return true;
1529
1530     default:
1531       return false;
1532     }
1533 }
1534
1535 /* Ensure mode of ORIG, a REG rtx, is MODE.  Returns either ORIG or a
1536    new rtx with the correct mode.  */
1537 static inline rtx
1538 force_mode (enum machine_mode mode, rtx orig)
1539 {
1540   if (mode == GET_MODE (orig))
1541     return orig;
1542
1543   gcc_assert (REGNO (orig) < FIRST_PSEUDO_REGISTER);
1544
1545   return gen_rtx_REG (mode, REGNO (orig));
1546 }
1547
1548 /* Return 1 if *X is a thread-local symbol.  */
1549
1550 static int
1551 pa_tls_symbol_ref_1 (rtx *x, void *data ATTRIBUTE_UNUSED)
1552 {
1553   return PA_SYMBOL_REF_TLS_P (*x);
1554 }
1555
1556 /* Return 1 if X contains a thread-local symbol.  */
1557
1558 bool
1559 pa_tls_referenced_p (rtx x)
1560 {
1561   if (!TARGET_HAVE_TLS)
1562     return false;
1563
1564   return for_each_rtx (&x, &pa_tls_symbol_ref_1, 0);
1565 }
1566
1567 /* Implement TARGET_CANNOT_FORCE_CONST_MEM.  */
1568
1569 static bool
1570 pa_cannot_force_const_mem (enum machine_mode mode ATTRIBUTE_UNUSED, rtx x)
1571 {
1572   return pa_tls_referenced_p (x);
1573 }
1574
1575 /* Emit insns to move operands[1] into operands[0].
1576
1577    Return 1 if we have written out everything that needs to be done to
1578    do the move.  Otherwise, return 0 and the caller will emit the move
1579    normally.
1580
1581    Note SCRATCH_REG may not be in the proper mode depending on how it
1582    will be used.  This routine is responsible for creating a new copy
1583    of SCRATCH_REG in the proper mode.  */
1584
1585 int
1586 emit_move_sequence (rtx *operands, enum machine_mode mode, rtx scratch_reg)
1587 {
1588   register rtx operand0 = operands[0];
1589   register rtx operand1 = operands[1];
1590   register rtx tem;
1591
1592   /* We can only handle indexed addresses in the destination operand
1593      of floating point stores.  Thus, we need to break out indexed
1594      addresses from the destination operand.  */
1595   if (GET_CODE (operand0) == MEM && IS_INDEX_ADDR_P (XEXP (operand0, 0)))
1596     {
1597       gcc_assert (can_create_pseudo_p ());
1598
1599       tem = copy_to_mode_reg (Pmode, XEXP (operand0, 0));
1600       operand0 = replace_equiv_address (operand0, tem);
1601     }
1602
1603   /* On targets with non-equivalent space registers, break out unscaled
1604      indexed addresses from the source operand before the final CSE.
1605      We have to do this because the REG_POINTER flag is not correctly
1606      carried through various optimization passes and CSE may substitute
1607      a pseudo without the pointer set for one with the pointer set.  As
1608      a result, we loose various opportunities to create insns with
1609      unscaled indexed addresses.  */
1610   if (!TARGET_NO_SPACE_REGS
1611       && !cse_not_expected
1612       && GET_CODE (operand1) == MEM
1613       && GET_CODE (XEXP (operand1, 0)) == PLUS
1614       && REG_P (XEXP (XEXP (operand1, 0), 0))
1615       && REG_P (XEXP (XEXP (operand1, 0), 1)))
1616     operand1
1617       = replace_equiv_address (operand1,
1618                                copy_to_mode_reg (Pmode, XEXP (operand1, 0)));
1619
1620   if (scratch_reg
1621       && reload_in_progress && GET_CODE (operand0) == REG
1622       && REGNO (operand0) >= FIRST_PSEUDO_REGISTER)
1623     operand0 = reg_equiv_mem (REGNO (operand0));
1624   else if (scratch_reg
1625            && reload_in_progress && GET_CODE (operand0) == SUBREG
1626            && GET_CODE (SUBREG_REG (operand0)) == REG
1627            && REGNO (SUBREG_REG (operand0)) >= FIRST_PSEUDO_REGISTER)
1628     {
1629      /* We must not alter SUBREG_BYTE (operand0) since that would confuse
1630         the code which tracks sets/uses for delete_output_reload.  */
1631       rtx temp = gen_rtx_SUBREG (GET_MODE (operand0),
1632                                  reg_equiv_mem (REGNO (SUBREG_REG (operand0))),
1633                                  SUBREG_BYTE (operand0));
1634       operand0 = alter_subreg (&temp);
1635     }
1636
1637   if (scratch_reg
1638       && reload_in_progress && GET_CODE (operand1) == REG
1639       && REGNO (operand1) >= FIRST_PSEUDO_REGISTER)
1640     operand1 = reg_equiv_mem (REGNO (operand1));
1641   else if (scratch_reg
1642            && reload_in_progress && GET_CODE (operand1) == SUBREG
1643            && GET_CODE (SUBREG_REG (operand1)) == REG
1644            && REGNO (SUBREG_REG (operand1)) >= FIRST_PSEUDO_REGISTER)
1645     {
1646      /* We must not alter SUBREG_BYTE (operand0) since that would confuse
1647         the code which tracks sets/uses for delete_output_reload.  */
1648       rtx temp = gen_rtx_SUBREG (GET_MODE (operand1),
1649                                  reg_equiv_mem (REGNO (SUBREG_REG (operand1))),
1650                                  SUBREG_BYTE (operand1));
1651       operand1 = alter_subreg (&temp);
1652     }
1653
1654   if (scratch_reg && reload_in_progress && GET_CODE (operand0) == MEM
1655       && ((tem = find_replacement (&XEXP (operand0, 0)))
1656           != XEXP (operand0, 0)))
1657     operand0 = replace_equiv_address (operand0, tem);
1658
1659   if (scratch_reg && reload_in_progress && GET_CODE (operand1) == MEM
1660       && ((tem = find_replacement (&XEXP (operand1, 0)))
1661           != XEXP (operand1, 0)))
1662     operand1 = replace_equiv_address (operand1, tem);
1663
1664   /* Handle secondary reloads for loads/stores of FP registers from
1665      REG+D addresses where D does not fit in 5 or 14 bits, including
1666      (subreg (mem (addr))) cases.  */
1667   if (scratch_reg
1668       && fp_reg_operand (operand0, mode)
1669       && ((GET_CODE (operand1) == MEM
1670            && !memory_address_p ((GET_MODE_SIZE (mode) == 4 ? SFmode : DFmode),
1671                                  XEXP (operand1, 0)))
1672           || ((GET_CODE (operand1) == SUBREG
1673                && GET_CODE (XEXP (operand1, 0)) == MEM
1674                && !memory_address_p ((GET_MODE_SIZE (mode) == 4
1675                                       ? SFmode : DFmode),
1676                                      XEXP (XEXP (operand1, 0), 0))))))
1677     {
1678       if (GET_CODE (operand1) == SUBREG)
1679         operand1 = XEXP (operand1, 0);
1680
1681       /* SCRATCH_REG will hold an address and maybe the actual data.  We want
1682          it in WORD_MODE regardless of what mode it was originally given
1683          to us.  */
1684       scratch_reg = force_mode (word_mode, scratch_reg);
1685
1686       /* D might not fit in 14 bits either; for such cases load D into
1687          scratch reg.  */
1688       if (!memory_address_p (Pmode, XEXP (operand1, 0)))
1689         {
1690           emit_move_insn (scratch_reg, XEXP (XEXP (operand1, 0), 1));
1691           emit_move_insn (scratch_reg,
1692                           gen_rtx_fmt_ee (GET_CODE (XEXP (operand1, 0)),
1693                                           Pmode,
1694                                           XEXP (XEXP (operand1, 0), 0),
1695                                           scratch_reg));
1696         }
1697       else
1698         emit_move_insn (scratch_reg, XEXP (operand1, 0));
1699       emit_insn (gen_rtx_SET (VOIDmode, operand0,
1700                               replace_equiv_address (operand1, scratch_reg)));
1701       return 1;
1702     }
1703   else if (scratch_reg
1704            && fp_reg_operand (operand1, mode)
1705            && ((GET_CODE (operand0) == MEM
1706                 && !memory_address_p ((GET_MODE_SIZE (mode) == 4
1707                                         ? SFmode : DFmode),
1708                                        XEXP (operand0, 0)))
1709                || ((GET_CODE (operand0) == SUBREG)
1710                    && GET_CODE (XEXP (operand0, 0)) == MEM
1711                    && !memory_address_p ((GET_MODE_SIZE (mode) == 4
1712                                           ? SFmode : DFmode),
1713                                          XEXP (XEXP (operand0, 0), 0)))))
1714     {
1715       if (GET_CODE (operand0) == SUBREG)
1716         operand0 = XEXP (operand0, 0);
1717
1718       /* SCRATCH_REG will hold an address and maybe the actual data.  We want
1719          it in WORD_MODE regardless of what mode it was originally given
1720          to us.  */
1721       scratch_reg = force_mode (word_mode, scratch_reg);
1722
1723       /* D might not fit in 14 bits either; for such cases load D into
1724          scratch reg.  */
1725       if (!memory_address_p (Pmode, XEXP (operand0, 0)))
1726         {
1727           emit_move_insn (scratch_reg, XEXP (XEXP (operand0, 0), 1));
1728           emit_move_insn (scratch_reg, gen_rtx_fmt_ee (GET_CODE (XEXP (operand0,
1729                                                                         0)),
1730                                                        Pmode,
1731                                                        XEXP (XEXP (operand0, 0),
1732                                                                    0),
1733                                                        scratch_reg));
1734         }
1735       else
1736         emit_move_insn (scratch_reg, XEXP (operand0, 0));
1737       emit_insn (gen_rtx_SET (VOIDmode,
1738                               replace_equiv_address (operand0, scratch_reg),
1739                               operand1));
1740       return 1;
1741     }
1742   /* Handle secondary reloads for loads of FP registers from constant
1743      expressions by forcing the constant into memory.
1744
1745      Use scratch_reg to hold the address of the memory location.
1746
1747      The proper fix is to change TARGET_PREFERRED_RELOAD_CLASS to return
1748      NO_REGS when presented with a const_int and a register class
1749      containing only FP registers.  Doing so unfortunately creates
1750      more problems than it solves.   Fix this for 2.5.  */
1751   else if (scratch_reg
1752            && CONSTANT_P (operand1)
1753            && fp_reg_operand (operand0, mode))
1754     {
1755       rtx const_mem, xoperands[2];
1756
1757       /* SCRATCH_REG will hold an address and maybe the actual data.  We want
1758          it in WORD_MODE regardless of what mode it was originally given
1759          to us.  */
1760       scratch_reg = force_mode (word_mode, scratch_reg);
1761
1762       /* Force the constant into memory and put the address of the
1763          memory location into scratch_reg.  */
1764       const_mem = force_const_mem (mode, operand1);
1765       xoperands[0] = scratch_reg;
1766       xoperands[1] = XEXP (const_mem, 0);
1767       emit_move_sequence (xoperands, Pmode, 0);
1768
1769       /* Now load the destination register.  */
1770       emit_insn (gen_rtx_SET (mode, operand0,
1771                               replace_equiv_address (const_mem, scratch_reg)));
1772       return 1;
1773     }
1774   /* Handle secondary reloads for SAR.  These occur when trying to load
1775      the SAR from memory or a constant.  */
1776   else if (scratch_reg
1777            && GET_CODE (operand0) == REG
1778            && REGNO (operand0) < FIRST_PSEUDO_REGISTER
1779            && REGNO_REG_CLASS (REGNO (operand0)) == SHIFT_REGS
1780            && (GET_CODE (operand1) == MEM || GET_CODE (operand1) == CONST_INT))
1781     {
1782       /* D might not fit in 14 bits either; for such cases load D into
1783          scratch reg.  */
1784       if (GET_CODE (operand1) == MEM
1785           && !memory_address_p (GET_MODE (operand0), XEXP (operand1, 0)))
1786         {
1787           /* We are reloading the address into the scratch register, so we
1788              want to make sure the scratch register is a full register.  */
1789           scratch_reg = force_mode (word_mode, scratch_reg);
1790
1791           emit_move_insn (scratch_reg, XEXP (XEXP (operand1, 0), 1));
1792           emit_move_insn (scratch_reg, gen_rtx_fmt_ee (GET_CODE (XEXP (operand1,
1793                                                                         0)),
1794                                                        Pmode,
1795                                                        XEXP (XEXP (operand1, 0),
1796                                                        0),
1797                                                        scratch_reg));
1798
1799           /* Now we are going to load the scratch register from memory,
1800              we want to load it in the same width as the original MEM,
1801              which must be the same as the width of the ultimate destination,
1802              OPERAND0.  */
1803           scratch_reg = force_mode (GET_MODE (operand0), scratch_reg);
1804
1805           emit_move_insn (scratch_reg,
1806                           replace_equiv_address (operand1, scratch_reg));
1807         }
1808       else
1809         {
1810           /* We want to load the scratch register using the same mode as
1811              the ultimate destination.  */
1812           scratch_reg = force_mode (GET_MODE (operand0), scratch_reg);
1813
1814           emit_move_insn (scratch_reg, operand1);
1815         }
1816
1817       /* And emit the insn to set the ultimate destination.  We know that
1818          the scratch register has the same mode as the destination at this
1819          point.  */
1820       emit_move_insn (operand0, scratch_reg);
1821       return 1;
1822     }
1823   /* Handle the most common case: storing into a register.  */
1824   else if (register_operand (operand0, mode))
1825     {
1826       if (register_operand (operand1, mode)
1827           || (GET_CODE (operand1) == CONST_INT
1828               && cint_ok_for_move (INTVAL (operand1)))
1829           || (operand1 == CONST0_RTX (mode))
1830           || (GET_CODE (operand1) == HIGH
1831               && !symbolic_operand (XEXP (operand1, 0), VOIDmode))
1832           /* Only `general_operands' can come here, so MEM is ok.  */
1833           || GET_CODE (operand1) == MEM)
1834         {
1835           /* Various sets are created during RTL generation which don't
1836              have the REG_POINTER flag correctly set.  After the CSE pass,
1837              instruction recognition can fail if we don't consistently
1838              set this flag when performing register copies.  This should
1839              also improve the opportunities for creating insns that use
1840              unscaled indexing.  */
1841           if (REG_P (operand0) && REG_P (operand1))
1842             {
1843               if (REG_POINTER (operand1)
1844                   && !REG_POINTER (operand0)
1845                   && !HARD_REGISTER_P (operand0))
1846                 copy_reg_pointer (operand0, operand1);
1847             }
1848           
1849           /* When MEMs are broken out, the REG_POINTER flag doesn't
1850              get set.  In some cases, we can set the REG_POINTER flag
1851              from the declaration for the MEM.  */
1852           if (REG_P (operand0)
1853               && GET_CODE (operand1) == MEM
1854               && !REG_POINTER (operand0))
1855             {
1856               tree decl = MEM_EXPR (operand1);
1857
1858               /* Set the register pointer flag and register alignment
1859                  if the declaration for this memory reference is a
1860                  pointer type.  */
1861               if (decl)
1862                 {
1863                   tree type;
1864
1865                   /* If this is a COMPONENT_REF, use the FIELD_DECL from
1866                      tree operand 1.  */
1867                   if (TREE_CODE (decl) == COMPONENT_REF)
1868                     decl = TREE_OPERAND (decl, 1);
1869
1870                   type = TREE_TYPE (decl);
1871                   type = strip_array_types (type);
1872
1873                   if (POINTER_TYPE_P (type))
1874                     {
1875                       int align;
1876
1877                       type = TREE_TYPE (type);
1878                       /* Using TYPE_ALIGN_OK is rather conservative as
1879                          only the ada frontend actually sets it.  */
1880                       align = (TYPE_ALIGN_OK (type) ? TYPE_ALIGN (type)
1881                                : BITS_PER_UNIT);
1882                       mark_reg_pointer (operand0, align);
1883                     }
1884                 }
1885             }
1886
1887           emit_insn (gen_rtx_SET (VOIDmode, operand0, operand1));
1888           return 1;
1889         }
1890     }
1891   else if (GET_CODE (operand0) == MEM)
1892     {
1893       if (mode == DFmode && operand1 == CONST0_RTX (mode)
1894           && !(reload_in_progress || reload_completed))
1895         {
1896           rtx temp = gen_reg_rtx (DFmode);
1897
1898           emit_insn (gen_rtx_SET (VOIDmode, temp, operand1));
1899           emit_insn (gen_rtx_SET (VOIDmode, operand0, temp));
1900           return 1;
1901         }
1902       if (register_operand (operand1, mode) || operand1 == CONST0_RTX (mode))
1903         {
1904           /* Run this case quickly.  */
1905           emit_insn (gen_rtx_SET (VOIDmode, operand0, operand1));
1906           return 1;
1907         }
1908       if (! (reload_in_progress || reload_completed))
1909         {
1910           operands[0] = validize_mem (operand0);
1911           operands[1] = operand1 = force_reg (mode, operand1);
1912         }
1913     }
1914
1915   /* Simplify the source if we need to.
1916      Note we do have to handle function labels here, even though we do
1917      not consider them legitimate constants.  Loop optimizations can
1918      call the emit_move_xxx with one as a source.  */
1919   if ((GET_CODE (operand1) != HIGH && immediate_operand (operand1, mode))
1920       || function_label_operand (operand1, VOIDmode)
1921       || (GET_CODE (operand1) == HIGH
1922           && symbolic_operand (XEXP (operand1, 0), mode)))
1923     {
1924       int ishighonly = 0;
1925
1926       if (GET_CODE (operand1) == HIGH)
1927         {
1928           ishighonly = 1;
1929           operand1 = XEXP (operand1, 0);
1930         }
1931       if (symbolic_operand (operand1, mode))
1932         {
1933           /* Argh.  The assembler and linker can't handle arithmetic
1934              involving plabels.
1935
1936              So we force the plabel into memory, load operand0 from
1937              the memory location, then add in the constant part.  */
1938           if ((GET_CODE (operand1) == CONST
1939                && GET_CODE (XEXP (operand1, 0)) == PLUS
1940                && function_label_operand (XEXP (XEXP (operand1, 0), 0),
1941                                           VOIDmode))
1942               || function_label_operand (operand1, VOIDmode))
1943             {
1944               rtx temp, const_part;
1945
1946               /* Figure out what (if any) scratch register to use.  */
1947               if (reload_in_progress || reload_completed)
1948                 {
1949                   scratch_reg = scratch_reg ? scratch_reg : operand0;
1950                   /* SCRATCH_REG will hold an address and maybe the actual
1951                      data.  We want it in WORD_MODE regardless of what mode it
1952                      was originally given to us.  */
1953                   scratch_reg = force_mode (word_mode, scratch_reg);
1954                 }
1955               else if (flag_pic)
1956                 scratch_reg = gen_reg_rtx (Pmode);
1957
1958               if (GET_CODE (operand1) == CONST)
1959                 {
1960                   /* Save away the constant part of the expression.  */
1961                   const_part = XEXP (XEXP (operand1, 0), 1);
1962                   gcc_assert (GET_CODE (const_part) == CONST_INT);
1963
1964                   /* Force the function label into memory.  */
1965                   temp = force_const_mem (mode, XEXP (XEXP (operand1, 0), 0));
1966                 }
1967               else
1968                 {
1969                   /* No constant part.  */
1970                   const_part = NULL_RTX;
1971
1972                   /* Force the function label into memory.  */
1973                   temp = force_const_mem (mode, operand1);
1974                 }
1975
1976
1977               /* Get the address of the memory location.  PIC-ify it if
1978                  necessary.  */
1979               temp = XEXP (temp, 0);
1980               if (flag_pic)
1981                 temp = legitimize_pic_address (temp, mode, scratch_reg);
1982
1983               /* Put the address of the memory location into our destination
1984                  register.  */
1985               operands[1] = temp;
1986               emit_move_sequence (operands, mode, scratch_reg);
1987
1988               /* Now load from the memory location into our destination
1989                  register.  */
1990               operands[1] = gen_rtx_MEM (Pmode, operands[0]);
1991               emit_move_sequence (operands, mode, scratch_reg);
1992
1993               /* And add back in the constant part.  */
1994               if (const_part != NULL_RTX)
1995                 expand_inc (operand0, const_part);
1996
1997               return 1;
1998             }
1999
2000           if (flag_pic)
2001             {
2002               rtx temp;
2003
2004               if (reload_in_progress || reload_completed)
2005                 {
2006                   temp = scratch_reg ? scratch_reg : operand0;
2007                   /* TEMP will hold an address and maybe the actual
2008                      data.  We want it in WORD_MODE regardless of what mode it
2009                      was originally given to us.  */
2010                   temp = force_mode (word_mode, temp);
2011                 }
2012               else
2013                 temp = gen_reg_rtx (Pmode);
2014
2015               /* (const (plus (symbol) (const_int))) must be forced to
2016                  memory during/after reload if the const_int will not fit
2017                  in 14 bits.  */
2018               if (GET_CODE (operand1) == CONST
2019                        && GET_CODE (XEXP (operand1, 0)) == PLUS
2020                        && GET_CODE (XEXP (XEXP (operand1, 0), 1)) == CONST_INT
2021                        && !INT_14_BITS (XEXP (XEXP (operand1, 0), 1))
2022                        && (reload_completed || reload_in_progress)
2023                        && flag_pic)
2024                 {
2025                   rtx const_mem = force_const_mem (mode, operand1);
2026                   operands[1] = legitimize_pic_address (XEXP (const_mem, 0),
2027                                                         mode, temp);
2028                   operands[1] = replace_equiv_address (const_mem, operands[1]);
2029                   emit_move_sequence (operands, mode, temp);
2030                 }
2031               else
2032                 {
2033                   operands[1] = legitimize_pic_address (operand1, mode, temp);
2034                   if (REG_P (operand0) && REG_P (operands[1]))
2035                     copy_reg_pointer (operand0, operands[1]);
2036                   emit_insn (gen_rtx_SET (VOIDmode, operand0, operands[1]));
2037                 }
2038             }
2039           /* On the HPPA, references to data space are supposed to use dp,
2040              register 27, but showing it in the RTL inhibits various cse
2041              and loop optimizations.  */
2042           else
2043             {
2044               rtx temp, set;
2045
2046               if (reload_in_progress || reload_completed)
2047                 {
2048                   temp = scratch_reg ? scratch_reg : operand0;
2049                   /* TEMP will hold an address and maybe the actual
2050                      data.  We want it in WORD_MODE regardless of what mode it
2051                      was originally given to us.  */
2052                   temp = force_mode (word_mode, temp);
2053                 }
2054               else
2055                 temp = gen_reg_rtx (mode);
2056
2057               /* Loading a SYMBOL_REF into a register makes that register
2058                  safe to be used as the base in an indexed address.
2059
2060                  Don't mark hard registers though.  That loses.  */
2061               if (GET_CODE (operand0) == REG
2062                   && REGNO (operand0) >= FIRST_PSEUDO_REGISTER)
2063                 mark_reg_pointer (operand0, BITS_PER_UNIT);
2064               if (REGNO (temp) >= FIRST_PSEUDO_REGISTER)
2065                 mark_reg_pointer (temp, BITS_PER_UNIT);
2066
2067               if (ishighonly)
2068                 set = gen_rtx_SET (mode, operand0, temp);
2069               else
2070                 set = gen_rtx_SET (VOIDmode,
2071                                    operand0,
2072                                    gen_rtx_LO_SUM (mode, temp, operand1));
2073
2074               emit_insn (gen_rtx_SET (VOIDmode,
2075                                       temp,
2076                                       gen_rtx_HIGH (mode, operand1)));
2077               emit_insn (set);
2078
2079             }
2080           return 1;
2081         }
2082       else if (pa_tls_referenced_p (operand1))
2083         {
2084           rtx tmp = operand1;
2085           rtx addend = NULL;
2086
2087           if (GET_CODE (tmp) == CONST && GET_CODE (XEXP (tmp, 0)) == PLUS)
2088             {
2089               addend = XEXP (XEXP (tmp, 0), 1);
2090               tmp = XEXP (XEXP (tmp, 0), 0);
2091             }
2092
2093           gcc_assert (GET_CODE (tmp) == SYMBOL_REF);
2094           tmp = legitimize_tls_address (tmp);
2095           if (addend)
2096             {
2097               tmp = gen_rtx_PLUS (mode, tmp, addend);
2098               tmp = force_operand (tmp, operands[0]);
2099             }
2100           operands[1] = tmp;
2101         }
2102       else if (GET_CODE (operand1) != CONST_INT
2103                || !cint_ok_for_move (INTVAL (operand1)))
2104         {
2105           rtx insn, temp;
2106           rtx op1 = operand1;
2107           HOST_WIDE_INT value = 0;
2108           HOST_WIDE_INT insv = 0;
2109           int insert = 0;
2110
2111           if (GET_CODE (operand1) == CONST_INT)
2112             value = INTVAL (operand1);
2113
2114           if (TARGET_64BIT
2115               && GET_CODE (operand1) == CONST_INT
2116               && HOST_BITS_PER_WIDE_INT > 32
2117               && GET_MODE_BITSIZE (GET_MODE (operand0)) > 32)
2118             {
2119               HOST_WIDE_INT nval;
2120
2121               /* Extract the low order 32 bits of the value and sign extend.
2122                  If the new value is the same as the original value, we can
2123                  can use the original value as-is.  If the new value is
2124                  different, we use it and insert the most-significant 32-bits
2125                  of the original value into the final result.  */
2126               nval = ((value & (((HOST_WIDE_INT) 2 << 31) - 1))
2127                       ^ ((HOST_WIDE_INT) 1 << 31)) - ((HOST_WIDE_INT) 1 << 31);
2128               if (value != nval)
2129                 {
2130 #if HOST_BITS_PER_WIDE_INT > 32
2131                   insv = value >= 0 ? value >> 32 : ~(~value >> 32);
2132 #endif
2133                   insert = 1;
2134                   value = nval;
2135                   operand1 = GEN_INT (nval);
2136                 }
2137             }
2138
2139           if (reload_in_progress || reload_completed)
2140             temp = scratch_reg ? scratch_reg : operand0;
2141           else
2142             temp = gen_reg_rtx (mode);
2143
2144           /* We don't directly split DImode constants on 32-bit targets
2145              because PLUS uses an 11-bit immediate and the insn sequence
2146              generated is not as efficient as the one using HIGH/LO_SUM.  */
2147           if (GET_CODE (operand1) == CONST_INT
2148               && GET_MODE_BITSIZE (mode) <= BITS_PER_WORD
2149               && GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT
2150               && !insert)
2151             {
2152               /* Directly break constant into high and low parts.  This
2153                  provides better optimization opportunities because various
2154                  passes recognize constants split with PLUS but not LO_SUM.
2155                  We use a 14-bit signed low part except when the addition
2156                  of 0x4000 to the high part might change the sign of the
2157                  high part.  */
2158               HOST_WIDE_INT low = value & 0x3fff;
2159               HOST_WIDE_INT high = value & ~ 0x3fff;
2160
2161               if (low >= 0x2000)
2162                 {
2163                   if (high == 0x7fffc000 || (mode == HImode && high == 0x4000))
2164                     high += 0x2000;
2165                   else
2166                     high += 0x4000;
2167                 }
2168
2169               low = value - high;
2170
2171               emit_insn (gen_rtx_SET (VOIDmode, temp, GEN_INT (high)));
2172               operands[1] = gen_rtx_PLUS (mode, temp, GEN_INT (low));
2173             }
2174           else
2175             {
2176               emit_insn (gen_rtx_SET (VOIDmode, temp,
2177                                       gen_rtx_HIGH (mode, operand1)));
2178               operands[1] = gen_rtx_LO_SUM (mode, temp, operand1);
2179             }
2180
2181           insn = emit_move_insn (operands[0], operands[1]);
2182
2183           /* Now insert the most significant 32 bits of the value
2184              into the register.  When we don't have a second register
2185              available, it could take up to nine instructions to load
2186              a 64-bit integer constant.  Prior to reload, we force
2187              constants that would take more than three instructions
2188              to load to the constant pool.  During and after reload,
2189              we have to handle all possible values.  */
2190           if (insert)
2191             {
2192               /* Use a HIGH/LO_SUM/INSV sequence if we have a second
2193                  register and the value to be inserted is outside the
2194                  range that can be loaded with three depdi instructions.  */
2195               if (temp != operand0 && (insv >= 16384 || insv < -16384))
2196                 {
2197                   operand1 = GEN_INT (insv);
2198
2199                   emit_insn (gen_rtx_SET (VOIDmode, temp,
2200                                           gen_rtx_HIGH (mode, operand1)));
2201                   emit_move_insn (temp, gen_rtx_LO_SUM (mode, temp, operand1));
2202                   emit_insn (gen_insv (operand0, GEN_INT (32),
2203                                        const0_rtx, temp));
2204                 }
2205               else
2206                 {
2207                   int len = 5, pos = 27;
2208
2209                   /* Insert the bits using the depdi instruction.  */
2210                   while (pos >= 0)
2211                     {
2212                       HOST_WIDE_INT v5 = ((insv & 31) ^ 16) - 16;
2213                       HOST_WIDE_INT sign = v5 < 0;
2214
2215                       /* Left extend the insertion.  */
2216                       insv = (insv >= 0 ? insv >> len : ~(~insv >> len));
2217                       while (pos > 0 && (insv & 1) == sign)
2218                         {
2219                           insv = (insv >= 0 ? insv >> 1 : ~(~insv >> 1));
2220                           len += 1;
2221                           pos -= 1;
2222                         }
2223
2224                       emit_insn (gen_insv (operand0, GEN_INT (len),
2225                                            GEN_INT (pos), GEN_INT (v5)));
2226
2227                       len = pos > 0 && pos < 5 ? pos : 5;
2228                       pos -= len;
2229                     }
2230                 }
2231             }
2232
2233           set_unique_reg_note (insn, REG_EQUAL, op1);
2234
2235           return 1;
2236         }
2237     }
2238   /* Now have insn-emit do whatever it normally does.  */
2239   return 0;
2240 }
2241
2242 /* Examine EXP and return nonzero if it contains an ADDR_EXPR (meaning
2243    it will need a link/runtime reloc).  */
2244
2245 int
2246 reloc_needed (tree exp)
2247 {
2248   int reloc = 0;
2249
2250   switch (TREE_CODE (exp))
2251     {
2252     case ADDR_EXPR:
2253       return 1;
2254
2255     case POINTER_PLUS_EXPR:
2256     case PLUS_EXPR:
2257     case MINUS_EXPR:
2258       reloc = reloc_needed (TREE_OPERAND (exp, 0));
2259       reloc |= reloc_needed (TREE_OPERAND (exp, 1));
2260       break;
2261
2262     CASE_CONVERT:
2263     case NON_LVALUE_EXPR:
2264       reloc = reloc_needed (TREE_OPERAND (exp, 0));
2265       break;
2266
2267     case CONSTRUCTOR:
2268       {
2269         tree value;
2270         unsigned HOST_WIDE_INT ix;
2271
2272         FOR_EACH_CONSTRUCTOR_VALUE (CONSTRUCTOR_ELTS (exp), ix, value)
2273           if (value)
2274             reloc |= reloc_needed (value);
2275       }
2276       break;
2277
2278     case ERROR_MARK:
2279       break;
2280
2281     default:
2282       break;
2283     }
2284   return reloc;
2285 }
2286
2287 \f
2288 /* Return the best assembler insn template
2289    for moving operands[1] into operands[0] as a fullword.  */
2290 const char *
2291 singlemove_string (rtx *operands)
2292 {
2293   HOST_WIDE_INT intval;
2294
2295   if (GET_CODE (operands[0]) == MEM)
2296     return "stw %r1,%0";
2297   if (GET_CODE (operands[1]) == MEM)
2298     return "ldw %1,%0";
2299   if (GET_CODE (operands[1]) == CONST_DOUBLE)
2300     {
2301       long i;
2302       REAL_VALUE_TYPE d;
2303
2304       gcc_assert (GET_MODE (operands[1]) == SFmode);
2305
2306       /* Translate the CONST_DOUBLE to a CONST_INT with the same target
2307          bit pattern.  */
2308       REAL_VALUE_FROM_CONST_DOUBLE (d, operands[1]);
2309       REAL_VALUE_TO_TARGET_SINGLE (d, i);
2310
2311       operands[1] = GEN_INT (i);
2312       /* Fall through to CONST_INT case.  */
2313     }
2314   if (GET_CODE (operands[1]) == CONST_INT)
2315     {
2316       intval = INTVAL (operands[1]);
2317
2318       if (VAL_14_BITS_P (intval))
2319         return "ldi %1,%0";
2320       else if ((intval & 0x7ff) == 0)
2321         return "ldil L'%1,%0";
2322       else if (zdepi_cint_p (intval))
2323         return "{zdepi %Z1,%0|depwi,z %Z1,%0}";
2324       else
2325         return "ldil L'%1,%0\n\tldo R'%1(%0),%0";
2326     }
2327   return "copy %1,%0";
2328 }
2329 \f
2330
2331 /* Compute position (in OP[1]) and width (in OP[2])
2332    useful for copying IMM to a register using the zdepi
2333    instructions.  Store the immediate value to insert in OP[0].  */
2334 static void
2335 compute_zdepwi_operands (unsigned HOST_WIDE_INT imm, unsigned *op)
2336 {
2337   int lsb, len;
2338
2339   /* Find the least significant set bit in IMM.  */
2340   for (lsb = 0; lsb < 32; lsb++)
2341     {
2342       if ((imm & 1) != 0)
2343         break;
2344       imm >>= 1;
2345     }
2346
2347   /* Choose variants based on *sign* of the 5-bit field.  */
2348   if ((imm & 0x10) == 0)
2349     len = (lsb <= 28) ? 4 : 32 - lsb;
2350   else
2351     {
2352       /* Find the width of the bitstring in IMM.  */
2353       for (len = 5; len < 32 - lsb; len++)
2354         {
2355           if ((imm & ((unsigned HOST_WIDE_INT) 1 << len)) == 0)
2356             break;
2357         }
2358
2359       /* Sign extend IMM as a 5-bit value.  */
2360       imm = (imm & 0xf) - 0x10;
2361     }
2362
2363   op[0] = imm;
2364   op[1] = 31 - lsb;
2365   op[2] = len;
2366 }
2367
2368 /* Compute position (in OP[1]) and width (in OP[2])
2369    useful for copying IMM to a register using the depdi,z
2370    instructions.  Store the immediate value to insert in OP[0].  */
2371 void
2372 compute_zdepdi_operands (unsigned HOST_WIDE_INT imm, unsigned *op)
2373 {
2374   int lsb, len, maxlen;
2375
2376   maxlen = MIN (HOST_BITS_PER_WIDE_INT, 64);
2377
2378   /* Find the least significant set bit in IMM.  */
2379   for (lsb = 0; lsb < maxlen; lsb++)
2380     {
2381       if ((imm & 1) != 0)
2382         break;
2383       imm >>= 1;
2384     }
2385
2386   /* Choose variants based on *sign* of the 5-bit field.  */
2387   if ((imm & 0x10) == 0)
2388     len = (lsb <= maxlen - 4) ? 4 : maxlen - lsb;
2389   else
2390     {
2391       /* Find the width of the bitstring in IMM.  */
2392       for (len = 5; len < maxlen - lsb; len++)
2393         {
2394           if ((imm & ((unsigned HOST_WIDE_INT) 1 << len)) == 0)
2395             break;
2396         }
2397
2398       /* Extend length if host is narrow and IMM is negative.  */
2399       if (HOST_BITS_PER_WIDE_INT == 32 && len == maxlen - lsb)
2400         len += 32;
2401
2402       /* Sign extend IMM as a 5-bit value.  */
2403       imm = (imm & 0xf) - 0x10;
2404     }
2405
2406   op[0] = imm;
2407   op[1] = 63 - lsb;
2408   op[2] = len;
2409 }
2410
2411 /* Output assembler code to perform a doubleword move insn
2412    with operands OPERANDS.  */
2413
2414 const char *
2415 output_move_double (rtx *operands)
2416 {
2417   enum { REGOP, OFFSOP, MEMOP, CNSTOP, RNDOP } optype0, optype1;
2418   rtx latehalf[2];
2419   rtx addreg0 = 0, addreg1 = 0;
2420
2421   /* First classify both operands.  */
2422
2423   if (REG_P (operands[0]))
2424     optype0 = REGOP;
2425   else if (offsettable_memref_p (operands[0]))
2426     optype0 = OFFSOP;
2427   else if (GET_CODE (operands[0]) == MEM)
2428     optype0 = MEMOP;
2429   else
2430     optype0 = RNDOP;
2431
2432   if (REG_P (operands[1]))
2433     optype1 = REGOP;
2434   else if (CONSTANT_P (operands[1]))
2435     optype1 = CNSTOP;
2436   else if (offsettable_memref_p (operands[1]))
2437     optype1 = OFFSOP;
2438   else if (GET_CODE (operands[1]) == MEM)
2439     optype1 = MEMOP;
2440   else
2441     optype1 = RNDOP;
2442
2443   /* Check for the cases that the operand constraints are not
2444      supposed to allow to happen.  */
2445   gcc_assert (optype0 == REGOP || optype1 == REGOP);
2446
2447   /* Handle copies between general and floating registers.  */
2448
2449   if (optype0 == REGOP && optype1 == REGOP
2450       && FP_REG_P (operands[0]) ^ FP_REG_P (operands[1]))
2451     {
2452       if (FP_REG_P (operands[0]))
2453         {
2454           output_asm_insn ("{stws|stw} %1,-16(%%sp)", operands);
2455           output_asm_insn ("{stws|stw} %R1,-12(%%sp)", operands);
2456           return "{fldds|fldd} -16(%%sp),%0";
2457         }
2458       else
2459         {
2460           output_asm_insn ("{fstds|fstd} %1,-16(%%sp)", operands);
2461           output_asm_insn ("{ldws|ldw} -16(%%sp),%0", operands);
2462           return "{ldws|ldw} -12(%%sp),%R0";
2463         }
2464     }
2465
2466    /* Handle auto decrementing and incrementing loads and stores
2467      specifically, since the structure of the function doesn't work
2468      for them without major modification.  Do it better when we learn
2469      this port about the general inc/dec addressing of PA.
2470      (This was written by tege.  Chide him if it doesn't work.)  */
2471
2472   if (optype0 == MEMOP)
2473     {
2474       /* We have to output the address syntax ourselves, since print_operand
2475          doesn't deal with the addresses we want to use.  Fix this later.  */
2476
2477       rtx addr = XEXP (operands[0], 0);
2478       if (GET_CODE (addr) == POST_INC || GET_CODE (addr) == POST_DEC)
2479         {
2480           rtx high_reg = gen_rtx_SUBREG (SImode, operands[1], 0);
2481
2482           operands[0] = XEXP (addr, 0);
2483           gcc_assert (GET_CODE (operands[1]) == REG
2484                       && GET_CODE (operands[0]) == REG);
2485
2486           gcc_assert (!reg_overlap_mentioned_p (high_reg, addr));
2487           
2488           /* No overlap between high target register and address
2489              register.  (We do this in a non-obvious way to
2490              save a register file writeback)  */
2491           if (GET_CODE (addr) == POST_INC)
2492             return "{stws|stw},ma %1,8(%0)\n\tstw %R1,-4(%0)";
2493           return "{stws|stw},ma %1,-8(%0)\n\tstw %R1,12(%0)";
2494         }
2495       else if (GET_CODE (addr) == PRE_INC || GET_CODE (addr) == PRE_DEC)
2496         {
2497           rtx high_reg = gen_rtx_SUBREG (SImode, operands[1], 0);
2498
2499           operands[0] = XEXP (addr, 0);
2500           gcc_assert (GET_CODE (operands[1]) == REG
2501                       && GET_CODE (operands[0]) == REG);
2502           
2503           gcc_assert (!reg_overlap_mentioned_p (high_reg, addr));
2504           /* No overlap between high target register and address
2505              register.  (We do this in a non-obvious way to save a
2506              register file writeback)  */
2507           if (GET_CODE (addr) == PRE_INC)
2508             return "{stws|stw},mb %1,8(%0)\n\tstw %R1,4(%0)";
2509           return "{stws|stw},mb %1,-8(%0)\n\tstw %R1,4(%0)";
2510         }
2511     }
2512   if (optype1 == MEMOP)
2513     {
2514       /* We have to output the address syntax ourselves, since print_operand
2515          doesn't deal with the addresses we want to use.  Fix this later.  */
2516
2517       rtx addr = XEXP (operands[1], 0);
2518       if (GET_CODE (addr) == POST_INC || GET_CODE (addr) == POST_DEC)
2519         {
2520           rtx high_reg = gen_rtx_SUBREG (SImode, operands[0], 0);
2521
2522           operands[1] = XEXP (addr, 0);
2523           gcc_assert (GET_CODE (operands[0]) == REG
2524                       && GET_CODE (operands[1]) == REG);
2525
2526           if (!reg_overlap_mentioned_p (high_reg, addr))
2527             {
2528               /* No overlap between high target register and address
2529                  register.  (We do this in a non-obvious way to
2530                  save a register file writeback)  */
2531               if (GET_CODE (addr) == POST_INC)
2532                 return "{ldws|ldw},ma 8(%1),%0\n\tldw -4(%1),%R0";
2533               return "{ldws|ldw},ma -8(%1),%0\n\tldw 12(%1),%R0";
2534             }
2535           else
2536             {
2537               /* This is an undefined situation.  We should load into the
2538                  address register *and* update that register.  Probably
2539                  we don't need to handle this at all.  */
2540               if (GET_CODE (addr) == POST_INC)
2541                 return "ldw 4(%1),%R0\n\t{ldws|ldw},ma 8(%1),%0";
2542               return "ldw 4(%1),%R0\n\t{ldws|ldw},ma -8(%1),%0";
2543             }
2544         }
2545       else if (GET_CODE (addr) == PRE_INC || GET_CODE (addr) == PRE_DEC)
2546         {
2547           rtx high_reg = gen_rtx_SUBREG (SImode, operands[0], 0);
2548
2549           operands[1] = XEXP (addr, 0);
2550           gcc_assert (GET_CODE (operands[0]) == REG
2551                       && GET_CODE (operands[1]) == REG);
2552
2553           if (!reg_overlap_mentioned_p (high_reg, addr))
2554             {
2555               /* No overlap between high target register and address
2556                  register.  (We do this in a non-obvious way to
2557                  save a register file writeback)  */
2558               if (GET_CODE (addr) == PRE_INC)
2559                 return "{ldws|ldw},mb 8(%1),%0\n\tldw 4(%1),%R0";
2560               return "{ldws|ldw},mb -8(%1),%0\n\tldw 4(%1),%R0";
2561             }
2562           else
2563             {
2564               /* This is an undefined situation.  We should load into the
2565                  address register *and* update that register.  Probably
2566                  we don't need to handle this at all.  */
2567               if (GET_CODE (addr) == PRE_INC)
2568                 return "ldw 12(%1),%R0\n\t{ldws|ldw},mb 8(%1),%0";
2569               return "ldw -4(%1),%R0\n\t{ldws|ldw},mb -8(%1),%0";
2570             }
2571         }
2572       else if (GET_CODE (addr) == PLUS
2573                && GET_CODE (XEXP (addr, 0)) == MULT)
2574         {
2575           rtx xoperands[4];
2576           rtx high_reg = gen_rtx_SUBREG (SImode, operands[0], 0);
2577
2578           if (!reg_overlap_mentioned_p (high_reg, addr))
2579             {
2580               xoperands[0] = high_reg;
2581               xoperands[1] = XEXP (addr, 1);
2582               xoperands[2] = XEXP (XEXP (addr, 0), 0);
2583               xoperands[3] = XEXP (XEXP (addr, 0), 1);
2584               output_asm_insn ("{sh%O3addl %2,%1,%0|shladd,l %2,%O3,%1,%0}",
2585                                xoperands);
2586               return "ldw 4(%0),%R0\n\tldw 0(%0),%0";
2587             }
2588           else
2589             {
2590               xoperands[0] = high_reg;
2591               xoperands[1] = XEXP (addr, 1);
2592               xoperands[2] = XEXP (XEXP (addr, 0), 0);
2593               xoperands[3] = XEXP (XEXP (addr, 0), 1);
2594               output_asm_insn ("{sh%O3addl %2,%1,%R0|shladd,l %2,%O3,%1,%R0}",
2595                                xoperands);
2596               return "ldw 0(%R0),%0\n\tldw 4(%R0),%R0";
2597             }
2598         }
2599     }
2600
2601   /* If an operand is an unoffsettable memory ref, find a register
2602      we can increment temporarily to make it refer to the second word.  */
2603
2604   if (optype0 == MEMOP)
2605     addreg0 = find_addr_reg (XEXP (operands[0], 0));
2606
2607   if (optype1 == MEMOP)
2608     addreg1 = find_addr_reg (XEXP (operands[1], 0));
2609
2610   /* Ok, we can do one word at a time.
2611      Normally we do the low-numbered word first.
2612
2613      In either case, set up in LATEHALF the operands to use
2614      for the high-numbered word and in some cases alter the
2615      operands in OPERANDS to be suitable for the low-numbered word.  */
2616
2617   if (optype0 == REGOP)
2618     latehalf[0] = gen_rtx_REG (SImode, REGNO (operands[0]) + 1);
2619   else if (optype0 == OFFSOP)
2620     latehalf[0] = adjust_address (operands[0], SImode, 4);
2621   else
2622     latehalf[0] = operands[0];
2623
2624   if (optype1 == REGOP)
2625     latehalf[1] = gen_rtx_REG (SImode, REGNO (operands[1]) + 1);
2626   else if (optype1 == OFFSOP)
2627     latehalf[1] = adjust_address (operands[1], SImode, 4);
2628   else if (optype1 == CNSTOP)
2629     split_double (operands[1], &operands[1], &latehalf[1]);
2630   else
2631     latehalf[1] = operands[1];
2632
2633   /* If the first move would clobber the source of the second one,
2634      do them in the other order.
2635
2636      This can happen in two cases:
2637
2638         mem -> register where the first half of the destination register
2639         is the same register used in the memory's address.  Reload
2640         can create such insns.
2641
2642         mem in this case will be either register indirect or register
2643         indirect plus a valid offset.
2644
2645         register -> register move where REGNO(dst) == REGNO(src + 1)
2646         someone (Tim/Tege?) claimed this can happen for parameter loads.
2647
2648      Handle mem -> register case first.  */
2649   if (optype0 == REGOP
2650       && (optype1 == MEMOP || optype1 == OFFSOP)
2651       && refers_to_regno_p (REGNO (operands[0]), REGNO (operands[0]) + 1,
2652                             operands[1], 0))
2653     {
2654       /* Do the late half first.  */
2655       if (addreg1)
2656         output_asm_insn ("ldo 4(%0),%0", &addreg1);
2657       output_asm_insn (singlemove_string (latehalf), latehalf);
2658
2659       /* Then clobber.  */
2660       if (addreg1)
2661         output_asm_insn ("ldo -4(%0),%0", &addreg1);
2662       return singlemove_string (operands);
2663     }
2664
2665   /* Now handle register -> register case.  */
2666   if (optype0 == REGOP && optype1 == REGOP
2667       && REGNO (operands[0]) == REGNO (operands[1]) + 1)
2668     {
2669       output_asm_insn (singlemove_string (latehalf), latehalf);
2670       return singlemove_string (operands);
2671     }
2672
2673   /* Normal case: do the two words, low-numbered first.  */
2674
2675   output_asm_insn (singlemove_string (operands), operands);
2676
2677   /* Make any unoffsettable addresses point at high-numbered word.  */
2678   if (addreg0)
2679     output_asm_insn ("ldo 4(%0),%0", &addreg0);
2680   if (addreg1)
2681     output_asm_insn ("ldo 4(%0),%0", &addreg1);
2682
2683   /* Do that word.  */
2684   output_asm_insn (singlemove_string (latehalf), latehalf);
2685
2686   /* Undo the adds we just did.  */
2687   if (addreg0)
2688     output_asm_insn ("ldo -4(%0),%0", &addreg0);
2689   if (addreg1)
2690     output_asm_insn ("ldo -4(%0),%0", &addreg1);
2691
2692   return "";
2693 }
2694 \f
2695 const char *
2696 output_fp_move_double (rtx *operands)
2697 {
2698   if (FP_REG_P (operands[0]))
2699     {
2700       if (FP_REG_P (operands[1])
2701           || operands[1] == CONST0_RTX (GET_MODE (operands[0])))
2702         output_asm_insn ("fcpy,dbl %f1,%0", operands);
2703       else
2704         output_asm_insn ("fldd%F1 %1,%0", operands);
2705     }
2706   else if (FP_REG_P (operands[1]))
2707     {
2708       output_asm_insn ("fstd%F0 %1,%0", operands);
2709     }
2710   else
2711     {
2712       rtx xoperands[2];
2713       
2714       gcc_assert (operands[1] == CONST0_RTX (GET_MODE (operands[0])));
2715       
2716       /* This is a pain.  You have to be prepared to deal with an
2717          arbitrary address here including pre/post increment/decrement.
2718
2719          so avoid this in the MD.  */
2720       gcc_assert (GET_CODE (operands[0]) == REG);
2721       
2722       xoperands[1] = gen_rtx_REG (SImode, REGNO (operands[0]) + 1);
2723       xoperands[0] = operands[0];
2724       output_asm_insn ("copy %%r0,%0\n\tcopy %%r0,%1", xoperands);
2725     }
2726   return "";
2727 }
2728 \f
2729 /* Return a REG that occurs in ADDR with coefficient 1.
2730    ADDR can be effectively incremented by incrementing REG.  */
2731
2732 static rtx
2733 find_addr_reg (rtx addr)
2734 {
2735   while (GET_CODE (addr) == PLUS)
2736     {
2737       if (GET_CODE (XEXP (addr, 0)) == REG)
2738         addr = XEXP (addr, 0);
2739       else if (GET_CODE (XEXP (addr, 1)) == REG)
2740         addr = XEXP (addr, 1);
2741       else if (CONSTANT_P (XEXP (addr, 0)))
2742         addr = XEXP (addr, 1);
2743       else if (CONSTANT_P (XEXP (addr, 1)))
2744         addr = XEXP (addr, 0);
2745       else
2746         gcc_unreachable ();
2747     }
2748   gcc_assert (GET_CODE (addr) == REG);
2749   return addr;
2750 }
2751
2752 /* Emit code to perform a block move.
2753
2754    OPERANDS[0] is the destination pointer as a REG, clobbered.
2755    OPERANDS[1] is the source pointer as a REG, clobbered.
2756    OPERANDS[2] is a register for temporary storage.
2757    OPERANDS[3] is a register for temporary storage.
2758    OPERANDS[4] is the size as a CONST_INT
2759    OPERANDS[5] is the alignment safe to use, as a CONST_INT.
2760    OPERANDS[6] is another temporary register.  */
2761
2762 const char *
2763 output_block_move (rtx *operands, int size_is_constant ATTRIBUTE_UNUSED)
2764 {
2765   int align = INTVAL (operands[5]);
2766   unsigned long n_bytes = INTVAL (operands[4]);
2767
2768   /* We can't move more than a word at a time because the PA
2769      has no longer integer move insns.  (Could use fp mem ops?)  */
2770   if (align > (TARGET_64BIT ? 8 : 4))
2771     align = (TARGET_64BIT ? 8 : 4);
2772
2773   /* Note that we know each loop below will execute at least twice
2774      (else we would have open-coded the copy).  */
2775   switch (align)
2776     {
2777       case 8:
2778         /* Pre-adjust the loop counter.  */
2779         operands[4] = GEN_INT (n_bytes - 16);
2780         output_asm_insn ("ldi %4,%2", operands);
2781
2782         /* Copying loop.  */
2783         output_asm_insn ("ldd,ma 8(%1),%3", operands);
2784         output_asm_insn ("ldd,ma 8(%1),%6", operands);
2785         output_asm_insn ("std,ma %3,8(%0)", operands);
2786         output_asm_insn ("addib,>= -16,%2,.-12", operands);
2787         output_asm_insn ("std,ma %6,8(%0)", operands);
2788
2789         /* Handle the residual.  There could be up to 7 bytes of
2790            residual to copy!  */
2791         if (n_bytes % 16 != 0)
2792           {
2793             operands[4] = GEN_INT (n_bytes % 8);
2794             if (n_bytes % 16 >= 8)
2795               output_asm_insn ("ldd,ma 8(%1),%3", operands);
2796             if (n_bytes % 8 != 0)
2797               output_asm_insn ("ldd 0(%1),%6", operands);
2798             if (n_bytes % 16 >= 8)
2799               output_asm_insn ("std,ma %3,8(%0)", operands);
2800             if (n_bytes % 8 != 0)
2801               output_asm_insn ("stdby,e %6,%4(%0)", operands);
2802           }
2803         return "";
2804
2805       case 4:
2806         /* Pre-adjust the loop counter.  */
2807         operands[4] = GEN_INT (n_bytes - 8);
2808         output_asm_insn ("ldi %4,%2", operands);
2809
2810         /* Copying loop.  */
2811         output_asm_insn ("{ldws|ldw},ma 4(%1),%3", operands);
2812         output_asm_insn ("{ldws|ldw},ma 4(%1),%6", operands);
2813         output_asm_insn ("{stws|stw},ma %3,4(%0)", operands);
2814         output_asm_insn ("addib,>= -8,%2,.-12", operands);
2815         output_asm_insn ("{stws|stw},ma %6,4(%0)", operands);
2816
2817         /* Handle the residual.  There could be up to 7 bytes of
2818            residual to copy!  */
2819         if (n_bytes % 8 != 0)
2820           {
2821             operands[4] = GEN_INT (n_bytes % 4);
2822             if (n_bytes % 8 >= 4)
2823               output_asm_insn ("{ldws|ldw},ma 4(%1),%3", operands);
2824             if (n_bytes % 4 != 0)
2825               output_asm_insn ("ldw 0(%1),%6", operands);
2826             if (n_bytes % 8 >= 4)
2827               output_asm_insn ("{stws|stw},ma %3,4(%0)", operands);
2828             if (n_bytes % 4 != 0)
2829               output_asm_insn ("{stbys|stby},e %6,%4(%0)", operands);
2830           }
2831         return "";
2832
2833       case 2:
2834         /* Pre-adjust the loop counter.  */
2835         operands[4] = GEN_INT (n_bytes - 4);
2836         output_asm_insn ("ldi %4,%2", operands);
2837
2838         /* Copying loop.  */
2839         output_asm_insn ("{ldhs|ldh},ma 2(%1),%3", operands);
2840         output_asm_insn ("{ldhs|ldh},ma 2(%1),%6", operands);
2841         output_asm_insn ("{sths|sth},ma %3,2(%0)", operands);
2842         output_asm_insn ("addib,>= -4,%2,.-12", operands);
2843         output_asm_insn ("{sths|sth},ma %6,2(%0)", operands);
2844
2845         /* Handle the residual.  */
2846         if (n_bytes % 4 != 0)
2847           {
2848             if (n_bytes % 4 >= 2)
2849               output_asm_insn ("{ldhs|ldh},ma 2(%1),%3", operands);
2850             if (n_bytes % 2 != 0)
2851               output_asm_insn ("ldb 0(%1),%6", operands);
2852             if (n_bytes % 4 >= 2)
2853               output_asm_insn ("{sths|sth},ma %3,2(%0)", operands);
2854             if (n_bytes % 2 != 0)
2855               output_asm_insn ("stb %6,0(%0)", operands);
2856           }
2857         return "";
2858
2859       case 1:
2860         /* Pre-adjust the loop counter.  */
2861         operands[4] = GEN_INT (n_bytes - 2);
2862         output_asm_insn ("ldi %4,%2", operands);
2863
2864         /* Copying loop.  */
2865         output_asm_insn ("{ldbs|ldb},ma 1(%1),%3", operands);
2866         output_asm_insn ("{ldbs|ldb},ma 1(%1),%6", operands);
2867         output_asm_insn ("{stbs|stb},ma %3,1(%0)", operands);
2868         output_asm_insn ("addib,>= -2,%2,.-12", operands);
2869         output_asm_insn ("{stbs|stb},ma %6,1(%0)", operands);
2870
2871         /* Handle the residual.  */
2872         if (n_bytes % 2 != 0)
2873           {
2874             output_asm_insn ("ldb 0(%1),%3", operands);
2875             output_asm_insn ("stb %3,0(%0)", operands);
2876           }
2877         return "";
2878
2879       default:
2880         gcc_unreachable ();
2881     }
2882 }
2883
2884 /* Count the number of insns necessary to handle this block move.
2885
2886    Basic structure is the same as emit_block_move, except that we
2887    count insns rather than emit them.  */
2888
2889 static int
2890 compute_movmem_length (rtx insn)
2891 {
2892   rtx pat = PATTERN (insn);
2893   unsigned int align = INTVAL (XEXP (XVECEXP (pat, 0, 7), 0));
2894   unsigned long n_bytes = INTVAL (XEXP (XVECEXP (pat, 0, 6), 0));
2895   unsigned int n_insns = 0;
2896
2897   /* We can't move more than four bytes at a time because the PA
2898      has no longer integer move insns.  (Could use fp mem ops?)  */
2899   if (align > (TARGET_64BIT ? 8 : 4))
2900     align = (TARGET_64BIT ? 8 : 4);
2901
2902   /* The basic copying loop.  */
2903   n_insns = 6;
2904
2905   /* Residuals.  */
2906   if (n_bytes % (2 * align) != 0)
2907     {
2908       if ((n_bytes % (2 * align)) >= align)
2909         n_insns += 2;
2910
2911       if ((n_bytes % align) != 0)
2912         n_insns += 2;
2913     }
2914
2915   /* Lengths are expressed in bytes now; each insn is 4 bytes.  */
2916   return n_insns * 4;
2917 }
2918
2919 /* Emit code to perform a block clear.
2920
2921    OPERANDS[0] is the destination pointer as a REG, clobbered.
2922    OPERANDS[1] is a register for temporary storage.
2923    OPERANDS[2] is the size as a CONST_INT
2924    OPERANDS[3] is the alignment safe to use, as a CONST_INT.  */
2925
2926 const char *
2927 output_block_clear (rtx *operands, int size_is_constant ATTRIBUTE_UNUSED)
2928 {
2929   int align = INTVAL (operands[3]);
2930   unsigned long n_bytes = INTVAL (operands[2]);
2931
2932   /* We can't clear more than a word at a time because the PA
2933      has no longer integer move insns.  */
2934   if (align > (TARGET_64BIT ? 8 : 4))
2935     align = (TARGET_64BIT ? 8 : 4);
2936
2937   /* Note that we know each loop below will execute at least twice
2938      (else we would have open-coded the copy).  */
2939   switch (align)
2940     {
2941       case 8:
2942         /* Pre-adjust the loop counter.  */
2943         operands[2] = GEN_INT (n_bytes - 16);
2944         output_asm_insn ("ldi %2,%1", operands);
2945
2946         /* Loop.  */
2947         output_asm_insn ("std,ma %%r0,8(%0)", operands);
2948         output_asm_insn ("addib,>= -16,%1,.-4", operands);
2949         output_asm_insn ("std,ma %%r0,8(%0)", operands);
2950
2951         /* Handle the residual.  There could be up to 7 bytes of
2952            residual to copy!  */
2953         if (n_bytes % 16 != 0)
2954           {
2955             operands[2] = GEN_INT (n_bytes % 8);
2956             if (n_bytes % 16 >= 8)
2957               output_asm_insn ("std,ma %%r0,8(%0)", operands);
2958             if (n_bytes % 8 != 0)
2959               output_asm_insn ("stdby,e %%r0,%2(%0)", operands);
2960           }
2961         return "";
2962
2963       case 4:
2964         /* Pre-adjust the loop counter.  */
2965         operands[2] = GEN_INT (n_bytes - 8);
2966         output_asm_insn ("ldi %2,%1", operands);
2967
2968         /* Loop.  */
2969         output_asm_insn ("{stws|stw},ma %%r0,4(%0)", operands);
2970         output_asm_insn ("addib,>= -8,%1,.-4", operands);
2971         output_asm_insn ("{stws|stw},ma %%r0,4(%0)", operands);
2972
2973         /* Handle the residual.  There could be up to 7 bytes of
2974            residual to copy!  */
2975         if (n_bytes % 8 != 0)
2976           {
2977             operands[2] = GEN_INT (n_bytes % 4);
2978             if (n_bytes % 8 >= 4)
2979               output_asm_insn ("{stws|stw},ma %%r0,4(%0)", operands);
2980             if (n_bytes % 4 != 0)
2981               output_asm_insn ("{stbys|stby},e %%r0,%2(%0)", operands);
2982           }
2983         return "";
2984
2985       case 2:
2986         /* Pre-adjust the loop counter.  */
2987         operands[2] = GEN_INT (n_bytes - 4);
2988         output_asm_insn ("ldi %2,%1", operands);
2989
2990         /* Loop.  */
2991         output_asm_insn ("{sths|sth},ma %%r0,2(%0)", operands);
2992         output_asm_insn ("addib,>= -4,%1,.-4", operands);
2993         output_asm_insn ("{sths|sth},ma %%r0,2(%0)", operands);
2994
2995         /* Handle the residual.  */
2996         if (n_bytes % 4 != 0)
2997           {
2998             if (n_bytes % 4 >= 2)
2999               output_asm_insn ("{sths|sth},ma %%r0,2(%0)", operands);
3000             if (n_bytes % 2 != 0)
3001               output_asm_insn ("stb %%r0,0(%0)", operands);
3002           }
3003         return "";
3004
3005       case 1:
3006         /* Pre-adjust the loop counter.  */
3007         operands[2] = GEN_INT (n_bytes - 2);
3008         output_asm_insn ("ldi %2,%1", operands);
3009
3010         /* Loop.  */
3011         output_asm_insn ("{stbs|stb},ma %%r0,1(%0)", operands);
3012         output_asm_insn ("addib,>= -2,%1,.-4", operands);
3013         output_asm_insn ("{stbs|stb},ma %%r0,1(%0)", operands);
3014
3015         /* Handle the residual.  */
3016         if (n_bytes % 2 != 0)
3017           output_asm_insn ("stb %%r0,0(%0)", operands);
3018
3019         return "";
3020
3021       default:
3022         gcc_unreachable ();
3023     }
3024 }
3025
3026 /* Count the number of insns necessary to handle this block move.
3027
3028    Basic structure is the same as emit_block_move, except that we
3029    count insns rather than emit them.  */
3030
3031 static int
3032 compute_clrmem_length (rtx insn)
3033 {
3034   rtx pat = PATTERN (insn);
3035   unsigned int align = INTVAL (XEXP (XVECEXP (pat, 0, 4), 0));
3036   unsigned long n_bytes = INTVAL (XEXP (XVECEXP (pat, 0, 3), 0));
3037   unsigned int n_insns = 0;
3038
3039   /* We can't clear more than a word at a time because the PA
3040      has no longer integer move insns.  */
3041   if (align > (TARGET_64BIT ? 8 : 4))
3042     align = (TARGET_64BIT ? 8 : 4);
3043
3044   /* The basic loop.  */
3045   n_insns = 4;
3046
3047   /* Residuals.  */
3048   if (n_bytes % (2 * align) != 0)
3049     {
3050       if ((n_bytes % (2 * align)) >= align)
3051         n_insns++;
3052
3053       if ((n_bytes % align) != 0)
3054         n_insns++;
3055     }
3056
3057   /* Lengths are expressed in bytes now; each insn is 4 bytes.  */
3058   return n_insns * 4;
3059 }
3060 \f
3061
3062 const char *
3063 output_and (rtx *operands)
3064 {
3065   if (GET_CODE (operands[2]) == CONST_INT && INTVAL (operands[2]) != 0)
3066     {
3067       unsigned HOST_WIDE_INT mask = INTVAL (operands[2]);
3068       int ls0, ls1, ms0, p, len;
3069
3070       for (ls0 = 0; ls0 < 32; ls0++)
3071         if ((mask & (1 << ls0)) == 0)
3072           break;
3073
3074       for (ls1 = ls0; ls1 < 32; ls1++)
3075         if ((mask & (1 << ls1)) != 0)
3076           break;
3077
3078       for (ms0 = ls1; ms0 < 32; ms0++)
3079         if ((mask & (1 << ms0)) == 0)
3080           break;
3081
3082       gcc_assert (ms0 == 32);
3083
3084       if (ls1 == 32)
3085         {
3086           len = ls0;
3087
3088           gcc_assert (len);
3089
3090           operands[2] = GEN_INT (len);
3091           return "{extru|extrw,u} %1,31,%2,%0";
3092         }
3093       else
3094         {
3095           /* We could use this `depi' for the case above as well, but `depi'
3096              requires one more register file access than an `extru'.  */
3097
3098           p = 31 - ls0;
3099           len = ls1 - ls0;
3100
3101           operands[2] = GEN_INT (p);
3102           operands[3] = GEN_INT (len);
3103           return "{depi|depwi} 0,%2,%3,%0";
3104         }
3105     }
3106   else
3107     return "and %1,%2,%0";
3108 }
3109
3110 /* Return a string to perform a bitwise-and of operands[1] with operands[2]
3111    storing the result in operands[0].  */
3112 const char *
3113 output_64bit_and (rtx *operands)
3114 {
3115   if (GET_CODE (operands[2]) == CONST_INT && INTVAL (operands[2]) != 0)
3116     {
3117       unsigned HOST_WIDE_INT mask = INTVAL (operands[2]);
3118       int ls0, ls1, ms0, p, len;
3119
3120       for (ls0 = 0; ls0 < HOST_BITS_PER_WIDE_INT; ls0++)
3121         if ((mask & ((unsigned HOST_WIDE_INT) 1 << ls0)) == 0)
3122           break;
3123
3124       for (ls1 = ls0; ls1 < HOST_BITS_PER_WIDE_INT; ls1++)
3125         if ((mask & ((unsigned HOST_WIDE_INT) 1 << ls1)) != 0)
3126           break;
3127
3128       for (ms0 = ls1; ms0 < HOST_BITS_PER_WIDE_INT; ms0++)
3129         if ((mask & ((unsigned HOST_WIDE_INT) 1 << ms0)) == 0)
3130           break;
3131
3132       gcc_assert (ms0 == HOST_BITS_PER_WIDE_INT);
3133
3134       if (ls1 == HOST_BITS_PER_WIDE_INT)
3135         {
3136           len = ls0;
3137
3138           gcc_assert (len);
3139
3140           operands[2] = GEN_INT (len);
3141           return "extrd,u %1,63,%2,%0";
3142         }
3143       else
3144         {
3145           /* We could use this `depi' for the case above as well, but `depi'
3146              requires one more register file access than an `extru'.  */
3147
3148           p = 63 - ls0;
3149           len = ls1 - ls0;
3150
3151           operands[2] = GEN_INT (p);
3152           operands[3] = GEN_INT (len);
3153           return "depdi 0,%2,%3,%0";
3154         }
3155     }
3156   else
3157     return "and %1,%2,%0";
3158 }
3159
3160 const char *
3161 output_ior (rtx *operands)
3162 {
3163   unsigned HOST_WIDE_INT mask = INTVAL (operands[2]);
3164   int bs0, bs1, p, len;
3165
3166   if (INTVAL (operands[2]) == 0)
3167     return "copy %1,%0";
3168
3169   for (bs0 = 0; bs0 < 32; bs0++)
3170     if ((mask & (1 << bs0)) != 0)
3171       break;
3172
3173   for (bs1 = bs0; bs1 < 32; bs1++)
3174     if ((mask & (1 << bs1)) == 0)
3175       break;
3176
3177   gcc_assert (bs1 == 32 || ((unsigned HOST_WIDE_INT) 1 << bs1) > mask);
3178
3179   p = 31 - bs0;
3180   len = bs1 - bs0;
3181
3182   operands[2] = GEN_INT (p);
3183   operands[3] = GEN_INT (len);
3184   return "{depi|depwi} -1,%2,%3,%0";
3185 }
3186
3187 /* Return a string to perform a bitwise-and of operands[1] with operands[2]
3188    storing the result in operands[0].  */
3189 const char *
3190 output_64bit_ior (rtx *operands)
3191 {
3192   unsigned HOST_WIDE_INT mask = INTVAL (operands[2]);
3193   int bs0, bs1, p, len;
3194
3195   if (INTVAL (operands[2]) == 0)
3196     return "copy %1,%0";
3197
3198   for (bs0 = 0; bs0 < HOST_BITS_PER_WIDE_INT; bs0++)
3199     if ((mask & ((unsigned HOST_WIDE_INT) 1 << bs0)) != 0)
3200       break;
3201
3202   for (bs1 = bs0; bs1 < HOST_BITS_PER_WIDE_INT; bs1++)
3203     if ((mask & ((unsigned HOST_WIDE_INT) 1 << bs1)) == 0)
3204       break;
3205
3206   gcc_assert (bs1 == HOST_BITS_PER_WIDE_INT
3207               || ((unsigned HOST_WIDE_INT) 1 << bs1) > mask);
3208
3209   p = 63 - bs0;
3210   len = bs1 - bs0;
3211
3212   operands[2] = GEN_INT (p);
3213   operands[3] = GEN_INT (len);
3214   return "depdi -1,%2,%3,%0";
3215 }
3216 \f
3217 /* Target hook for assembling integer objects.  This code handles
3218    aligned SI and DI integers specially since function references
3219    must be preceded by P%.  */
3220
3221 static bool
3222 pa_assemble_integer (rtx x, unsigned int size, int aligned_p)
3223 {
3224   if (size == UNITS_PER_WORD
3225       && aligned_p
3226       && function_label_operand (x, VOIDmode))
3227     {
3228       fputs (size == 8? "\t.dword\tP%" : "\t.word\tP%", asm_out_file);
3229       output_addr_const (asm_out_file, x);
3230       fputc ('\n', asm_out_file);
3231       return true;
3232     }
3233   return default_assemble_integer (x, size, aligned_p);
3234 }
3235 \f
3236 /* Output an ascii string.  */
3237 void
3238 output_ascii (FILE *file, const char *p, int size)
3239 {
3240   int i;
3241   int chars_output;
3242   unsigned char partial_output[16];     /* Max space 4 chars can occupy.  */
3243
3244   /* The HP assembler can only take strings of 256 characters at one
3245      time.  This is a limitation on input line length, *not* the
3246      length of the string.  Sigh.  Even worse, it seems that the
3247      restriction is in number of input characters (see \xnn &
3248      \whatever).  So we have to do this very carefully.  */
3249
3250   fputs ("\t.STRING \"", file);
3251
3252   chars_output = 0;
3253   for (i = 0; i < size; i += 4)
3254     {
3255       int co = 0;
3256       int io = 0;
3257       for (io = 0, co = 0; io < MIN (4, size - i); io++)
3258         {
3259           register unsigned int c = (unsigned char) p[i + io];
3260
3261           if (c == '\"' || c == '\\')
3262             partial_output[co++] = '\\';
3263           if (c >= ' ' && c < 0177)
3264             partial_output[co++] = c;
3265           else
3266             {
3267               unsigned int hexd;
3268               partial_output[co++] = '\\';
3269               partial_output[co++] = 'x';
3270               hexd =  c  / 16 - 0 + '0';
3271               if (hexd > '9')
3272                 hexd -= '9' - 'a' + 1;
3273               partial_output[co++] = hexd;
3274               hexd =  c % 16 - 0 + '0';
3275               if (hexd > '9')
3276                 hexd -= '9' - 'a' + 1;
3277               partial_output[co++] = hexd;
3278             }
3279         }
3280       if (chars_output + co > 243)
3281         {
3282           fputs ("\"\n\t.STRING \"", file);
3283           chars_output = 0;
3284         }
3285       fwrite (partial_output, 1, (size_t) co, file);
3286       chars_output += co;
3287       co = 0;
3288     }
3289   fputs ("\"\n", file);
3290 }
3291
3292 /* Try to rewrite floating point comparisons & branches to avoid
3293    useless add,tr insns.
3294
3295    CHECK_NOTES is nonzero if we should examine REG_DEAD notes
3296    to see if FPCC is dead.  CHECK_NOTES is nonzero for the
3297    first attempt to remove useless add,tr insns.  It is zero
3298    for the second pass as reorg sometimes leaves bogus REG_DEAD
3299    notes lying around.
3300
3301    When CHECK_NOTES is zero we can only eliminate add,tr insns
3302    when there's a 1:1 correspondence between fcmp and ftest/fbranch
3303    instructions.  */
3304 static void
3305 remove_useless_addtr_insns (int check_notes)
3306 {
3307   rtx insn;
3308   static int pass = 0;
3309
3310   /* This is fairly cheap, so always run it when optimizing.  */
3311   if (optimize > 0)
3312     {
3313       int fcmp_count = 0;
3314       int fbranch_count = 0;
3315
3316       /* Walk all the insns in this function looking for fcmp & fbranch
3317          instructions.  Keep track of how many of each we find.  */
3318       for (insn = get_insns (); insn; insn = next_insn (insn))
3319         {
3320           rtx tmp;
3321
3322           /* Ignore anything that isn't an INSN or a JUMP_INSN.  */
3323           if (GET_CODE (insn) != INSN && GET_CODE (insn) != JUMP_INSN)
3324             continue;
3325
3326           tmp = PATTERN (insn);
3327
3328           /* It must be a set.  */
3329           if (GET_CODE (tmp) != SET)
3330             continue;
3331
3332           /* If the destination is CCFP, then we've found an fcmp insn.  */
3333           tmp = SET_DEST (tmp);
3334           if (GET_CODE (tmp) == REG && REGNO (tmp) == 0)
3335             {
3336               fcmp_count++;
3337               continue;
3338             }
3339
3340           tmp = PATTERN (insn);
3341           /* If this is an fbranch instruction, bump the fbranch counter.  */
3342           if (GET_CODE (tmp) == SET
3343               && SET_DEST (tmp) == pc_rtx
3344               && GET_CODE (SET_SRC (tmp)) == IF_THEN_ELSE
3345               && GET_CODE (XEXP (SET_SRC (tmp), 0)) == NE
3346               && GET_CODE (XEXP (XEXP (SET_SRC (tmp), 0), 0)) == REG
3347               && REGNO (XEXP (XEXP (SET_SRC (tmp), 0), 0)) == 0)
3348             {
3349               fbranch_count++;
3350               continue;
3351             }
3352         }
3353
3354
3355       /* Find all floating point compare + branch insns.  If possible,
3356          reverse the comparison & the branch to avoid add,tr insns.  */
3357       for (insn = get_insns (); insn; insn = next_insn (insn))
3358         {
3359           rtx tmp, next;
3360
3361           /* Ignore anything that isn't an INSN.  */
3362           if (GET_CODE (insn) != INSN)
3363             continue;
3364
3365           tmp = PATTERN (insn);
3366
3367           /* It must be a set.  */
3368           if (GET_CODE (tmp) != SET)
3369             continue;
3370
3371           /* The destination must be CCFP, which is register zero.  */
3372           tmp = SET_DEST (tmp);
3373           if (GET_CODE (tmp) != REG || REGNO (tmp) != 0)
3374             continue;
3375
3376           /* INSN should be a set of CCFP.
3377
3378              See if the result of this insn is used in a reversed FP
3379              conditional branch.  If so, reverse our condition and
3380              the branch.  Doing so avoids useless add,tr insns.  */
3381           next = next_insn (insn);
3382           while (next)
3383             {
3384               /* Jumps, calls and labels stop our search.  */
3385               if (GET_CODE (next) == JUMP_INSN
3386                   || GET_CODE (next) == CALL_INSN
3387                   || GET_CODE (next) == CODE_LABEL)
3388                 break;
3389
3390               /* As does another fcmp insn.  */
3391               if (GET_CODE (next) == INSN
3392                   && GET_CODE (PATTERN (next)) == SET
3393                   && GET_CODE (SET_DEST (PATTERN (next))) == REG
3394                   && REGNO (SET_DEST (PATTERN (next))) == 0)
3395                 break;
3396
3397               next = next_insn (next);
3398             }
3399
3400           /* Is NEXT_INSN a branch?  */
3401           if (next
3402               && GET_CODE (next) == JUMP_INSN)
3403             {
3404               rtx pattern = PATTERN (next);
3405
3406               /* If it a reversed fp conditional branch (e.g. uses add,tr)
3407                  and CCFP dies, then reverse our conditional and the branch
3408                  to avoid the add,tr.  */
3409               if (GET_CODE (pattern) == SET
3410                   && SET_DEST (pattern) == pc_rtx
3411                   && GET_CODE (SET_SRC (pattern)) == IF_THEN_ELSE
3412                   && GET_CODE (XEXP (SET_SRC (pattern), 0)) == NE
3413                   && GET_CODE (XEXP (XEXP (SET_SRC (pattern), 0), 0)) == REG
3414                   && REGNO (XEXP (XEXP (SET_SRC (pattern), 0), 0)) == 0
3415                   && GET_CODE (XEXP (SET_SRC (pattern), 1)) == PC
3416                   && (fcmp_count == fbranch_count
3417                       || (check_notes
3418                           && find_regno_note (next, REG_DEAD, 0))))
3419                 {
3420                   /* Reverse the branch.  */
3421                   tmp = XEXP (SET_SRC (pattern), 1);
3422                   XEXP (SET_SRC (pattern), 1) = XEXP (SET_SRC (pattern), 2);
3423                   XEXP (SET_SRC (pattern), 2) = tmp;
3424                   INSN_CODE (next) = -1;
3425
3426                   /* Reverse our condition.  */
3427                   tmp = PATTERN (insn);
3428                   PUT_CODE (XEXP (tmp, 1),
3429                             (reverse_condition_maybe_unordered
3430                              (GET_CODE (XEXP (tmp, 1)))));
3431                 }
3432             }
3433         }
3434     }
3435
3436   pass = !pass;
3437
3438 }
3439 \f
3440 /* You may have trouble believing this, but this is the 32 bit HP-PA
3441    stack layout.  Wow.
3442
3443    Offset               Contents
3444
3445    Variable arguments   (optional; any number may be allocated)
3446
3447    SP-(4*(N+9))         arg word N
3448         :                   :
3449       SP-56             arg word 5
3450       SP-52             arg word 4
3451
3452    Fixed arguments      (must be allocated; may remain unused)
3453
3454       SP-48             arg word 3
3455       SP-44             arg word 2
3456       SP-40             arg word 1
3457       SP-36             arg word 0
3458
3459    Frame Marker
3460
3461       SP-32             External Data Pointer (DP)
3462       SP-28             External sr4
3463       SP-24             External/stub RP (RP')
3464       SP-20             Current RP
3465       SP-16             Static Link
3466       SP-12             Clean up
3467       SP-8              Calling Stub RP (RP'')
3468       SP-4              Previous SP
3469
3470    Top of Frame
3471
3472       SP-0              Stack Pointer (points to next available address)
3473
3474 */
3475
3476 /* This function saves registers as follows.  Registers marked with ' are
3477    this function's registers (as opposed to the previous function's).
3478    If a frame_pointer isn't needed, r4 is saved as a general register;
3479    the space for the frame pointer is still allocated, though, to keep
3480    things simple.
3481
3482
3483    Top of Frame
3484
3485        SP (FP')         Previous FP
3486        SP + 4           Alignment filler (sigh)
3487        SP + 8           Space for locals reserved here.
3488        .
3489        .
3490        .
3491        SP + n           All call saved register used.
3492        .
3493        .
3494        .
3495        SP + o           All call saved fp registers used.
3496        .
3497        .
3498        .
3499        SP + p (SP')     points to next available address.
3500
3501 */
3502
3503 /* Global variables set by output_function_prologue().  */
3504 /* Size of frame.  Need to know this to emit return insns from
3505    leaf procedures.  */
3506 static HOST_WIDE_INT actual_fsize, local_fsize;
3507 static int save_fregs;
3508
3509 /* Emit RTL to store REG at the memory location specified by BASE+DISP.
3510    Handle case where DISP > 8k by using the add_high_const patterns.
3511
3512    Note in DISP > 8k case, we will leave the high part of the address
3513    in %r1.  There is code in expand_hppa_{prologue,epilogue} that knows this.*/
3514
3515 static void
3516 store_reg (int reg, HOST_WIDE_INT disp, int base)
3517 {
3518   rtx insn, dest, src, basereg;
3519
3520   src = gen_rtx_REG (word_mode, reg);
3521   basereg = gen_rtx_REG (Pmode, base);
3522   if (VAL_14_BITS_P (disp))
3523     {
3524       dest = gen_rtx_MEM (word_mode, plus_constant (basereg, disp));
3525       insn = emit_move_insn (dest, src);
3526     }
3527   else if (TARGET_64BIT && !VAL_32_BITS_P (disp))
3528     {
3529       rtx delta = GEN_INT (disp);
3530       rtx tmpreg = gen_rtx_REG (Pmode, 1);
3531
3532       emit_move_insn (tmpreg, delta);
3533       insn = emit_move_insn (tmpreg, gen_rtx_PLUS (Pmode, tmpreg, basereg));
3534       if (DO_FRAME_NOTES)
3535         {
3536           add_reg_note (insn, REG_FRAME_RELATED_EXPR,
3537                         gen_rtx_SET (VOIDmode, tmpreg,
3538                                      gen_rtx_PLUS (Pmode, basereg, delta)));
3539           RTX_FRAME_RELATED_P (insn) = 1;
3540         }
3541       dest = gen_rtx_MEM (word_mode, tmpreg);
3542       insn = emit_move_insn (dest, src);
3543     }
3544   else
3545     {
3546       rtx delta = GEN_INT (disp);
3547       rtx high = gen_rtx_PLUS (Pmode, basereg, gen_rtx_HIGH (Pmode, delta));
3548       rtx tmpreg = gen_rtx_REG (Pmode, 1);
3549
3550       emit_move_insn (tmpreg, high);
3551       dest = gen_rtx_MEM (word_mode, gen_rtx_LO_SUM (Pmode, tmpreg, delta));
3552       insn = emit_move_insn (dest, src);
3553       if (DO_FRAME_NOTES)
3554         add_reg_note (insn, REG_FRAME_RELATED_EXPR,
3555                       gen_rtx_SET (VOIDmode,
3556                                    gen_rtx_MEM (word_mode,
3557                                                 gen_rtx_PLUS (word_mode,
3558                                                               basereg,
3559                                                               delta)),
3560                                    src));
3561     }
3562
3563   if (DO_FRAME_NOTES)
3564     RTX_FRAME_RELATED_P (insn) = 1;
3565 }
3566
3567 /* Emit RTL to store REG at the memory location specified by BASE and then
3568    add MOD to BASE.  MOD must be <= 8k.  */
3569
3570 static void
3571 store_reg_modify (int base, int reg, HOST_WIDE_INT mod)
3572 {
3573   rtx insn, basereg, srcreg, delta;
3574
3575   gcc_assert (VAL_14_BITS_P (mod));
3576
3577   basereg = gen_rtx_REG (Pmode, base);
3578   srcreg = gen_rtx_REG (word_mode, reg);
3579   delta = GEN_INT (mod);
3580
3581   insn = emit_insn (gen_post_store (basereg, srcreg, delta));
3582   if (DO_FRAME_NOTES)
3583     {
3584       RTX_FRAME_RELATED_P (insn) = 1;
3585
3586       /* RTX_FRAME_RELATED_P must be set on each frame related set
3587          in a parallel with more than one element.  */
3588       RTX_FRAME_RELATED_P (XVECEXP (PATTERN (insn), 0, 0)) = 1;
3589       RTX_FRAME_RELATED_P (XVECEXP (PATTERN (insn), 0, 1)) = 1;
3590     }
3591 }
3592
3593 /* Emit RTL to set REG to the value specified by BASE+DISP.  Handle case
3594    where DISP > 8k by using the add_high_const patterns.  NOTE indicates
3595    whether to add a frame note or not.
3596
3597    In the DISP > 8k case, we leave the high part of the address in %r1.
3598    There is code in expand_hppa_{prologue,epilogue} that knows about this.  */
3599
3600 static void
3601 set_reg_plus_d (int reg, int base, HOST_WIDE_INT disp, int note)
3602 {
3603   rtx insn;
3604
3605   if (VAL_14_BITS_P (disp))
3606     {
3607       insn = emit_move_insn (gen_rtx_REG (Pmode, reg),
3608                              plus_constant (gen_rtx_REG (Pmode, base), disp));
3609     }
3610   else if (TARGET_64BIT && !VAL_32_BITS_P (disp))
3611     {
3612       rtx basereg = gen_rtx_REG (Pmode, base);
3613       rtx delta = GEN_INT (disp);
3614       rtx tmpreg = gen_rtx_REG (Pmode, 1);
3615
3616       emit_move_insn (tmpreg, delta);
3617       insn = emit_move_insn (gen_rtx_REG (Pmode, reg),
3618                              gen_rtx_PLUS (Pmode, tmpreg, basereg));
3619       if (DO_FRAME_NOTES)
3620         add_reg_note (insn, REG_FRAME_RELATED_EXPR,
3621                       gen_rtx_SET (VOIDmode, tmpreg,
3622                                    gen_rtx_PLUS (Pmode, basereg, delta)));
3623     }
3624   else
3625     {
3626       rtx basereg = gen_rtx_REG (Pmode, base);
3627       rtx delta = GEN_INT (disp);
3628       rtx tmpreg = gen_rtx_REG (Pmode, 1);
3629
3630       emit_move_insn (tmpreg,
3631                       gen_rtx_PLUS (Pmode, basereg,
3632                                     gen_rtx_HIGH (Pmode, delta)));
3633       insn = emit_move_insn (gen_rtx_REG (Pmode, reg),
3634                              gen_rtx_LO_SUM (Pmode, tmpreg, delta));
3635     }
3636
3637   if (DO_FRAME_NOTES && note)
3638     RTX_FRAME_RELATED_P (insn) = 1;
3639 }
3640
3641 HOST_WIDE_INT
3642 compute_frame_size (HOST_WIDE_INT size, int *fregs_live)
3643 {
3644   int freg_saved = 0;
3645   int i, j;
3646
3647   /* The code in hppa_expand_prologue and hppa_expand_epilogue must
3648      be consistent with the rounding and size calculation done here.
3649      Change them at the same time.  */
3650
3651   /* We do our own stack alignment.  First, round the size of the
3652      stack locals up to a word boundary.  */
3653   size = (size + UNITS_PER_WORD - 1) & ~(UNITS_PER_WORD - 1);
3654
3655   /* Space for previous frame pointer + filler.  If any frame is
3656      allocated, we need to add in the STARTING_FRAME_OFFSET.  We
3657      waste some space here for the sake of HP compatibility.  The
3658      first slot is only used when the frame pointer is needed.  */
3659   if (size || frame_pointer_needed)
3660     size += STARTING_FRAME_OFFSET;
3661   
3662   /* If the current function calls __builtin_eh_return, then we need
3663      to allocate stack space for registers that will hold data for
3664      the exception handler.  */
3665   if (DO_FRAME_NOTES && crtl->calls_eh_return)
3666     {
3667       unsigned int i;
3668
3669       for (i = 0; EH_RETURN_DATA_REGNO (i) != INVALID_REGNUM; ++i)
3670         continue;
3671       size += i * UNITS_PER_WORD;
3672     }
3673
3674   /* Account for space used by the callee general register saves.  */
3675   for (i = 18, j = frame_pointer_needed ? 4 : 3; i >= j; i--)
3676     if (df_regs_ever_live_p (i))
3677       size += UNITS_PER_WORD;
3678
3679   /* Account for space used by the callee floating point register saves.  */
3680   for (i = FP_SAVED_REG_LAST; i >= FP_SAVED_REG_FIRST; i -= FP_REG_STEP)
3681     if (df_regs_ever_live_p (i)
3682         || (!TARGET_64BIT && df_regs_ever_live_p (i + 1)))
3683       {
3684         freg_saved = 1;
3685
3686         /* We always save both halves of the FP register, so always
3687            increment the frame size by 8 bytes.  */
3688         size += 8;
3689       }
3690
3691   /* If any of the floating registers are saved, account for the
3692      alignment needed for the floating point register save block.  */
3693   if (freg_saved)
3694     {
3695       size = (size + 7) & ~7;
3696       if (fregs_live)
3697         *fregs_live = 1;
3698     }
3699
3700   /* The various ABIs include space for the outgoing parameters in the
3701      size of the current function's stack frame.  We don't need to align
3702      for the outgoing arguments as their alignment is set by the final
3703      rounding for the frame as a whole.  */
3704   size += crtl->outgoing_args_size;
3705
3706   /* Allocate space for the fixed frame marker.  This space must be
3707      allocated for any function that makes calls or allocates
3708      stack space.  */
3709   if (!current_function_is_leaf || size)
3710     size += TARGET_64BIT ? 48 : 32;
3711
3712   /* Finally, round to the preferred stack boundary.  */
3713   return ((size + PREFERRED_STACK_BOUNDARY / BITS_PER_UNIT - 1)
3714           & ~(PREFERRED_STACK_BOUNDARY / BITS_PER_UNIT - 1));
3715 }
3716
3717 /* Generate the assembly code for function entry.  FILE is a stdio
3718    stream to output the code to.  SIZE is an int: how many units of
3719    temporary storage to allocate.
3720
3721    Refer to the array `regs_ever_live' to determine which registers to
3722    save; `regs_ever_live[I]' is nonzero if register number I is ever
3723    used in the function.  This function is responsible for knowing
3724    which registers should not be saved even if used.  */
3725
3726 /* On HP-PA, move-double insns between fpu and cpu need an 8-byte block
3727    of memory.  If any fpu reg is used in the function, we allocate
3728    such a block here, at the bottom of the frame, just in case it's needed.
3729
3730    If this function is a leaf procedure, then we may choose not
3731    to do a "save" insn.  The decision about whether or not
3732    to do this is made in regclass.c.  */
3733
3734 static void
3735 pa_output_function_prologue (FILE *file, HOST_WIDE_INT size ATTRIBUTE_UNUSED)
3736 {
3737   /* The function's label and associated .PROC must never be
3738      separated and must be output *after* any profiling declarations
3739      to avoid changing spaces/subspaces within a procedure.  */
3740   ASM_OUTPUT_LABEL (file, XSTR (XEXP (DECL_RTL (current_function_decl), 0), 0));
3741   fputs ("\t.PROC\n", file);
3742
3743   /* hppa_expand_prologue does the dirty work now.  We just need
3744      to output the assembler directives which denote the start
3745      of a function.  */
3746   fprintf (file, "\t.CALLINFO FRAME=" HOST_WIDE_INT_PRINT_DEC, actual_fsize);
3747   if (current_function_is_leaf)
3748     fputs (",NO_CALLS", file);
3749   else
3750     fputs (",CALLS", file);
3751   if (rp_saved)
3752     fputs (",SAVE_RP", file);
3753
3754   /* The SAVE_SP flag is used to indicate that register %r3 is stored
3755      at the beginning of the frame and that it is used as the frame
3756      pointer for the frame.  We do this because our current frame
3757      layout doesn't conform to that specified in the HP runtime
3758      documentation and we need a way to indicate to programs such as
3759      GDB where %r3 is saved.  The SAVE_SP flag was chosen because it
3760      isn't used by HP compilers but is supported by the assembler.
3761      However, SAVE_SP is supposed to indicate that the previous stack
3762      pointer has been saved in the frame marker.  */
3763   if (frame_pointer_needed)
3764     fputs (",SAVE_SP", file);
3765
3766   /* Pass on information about the number of callee register saves
3767      performed in the prologue.
3768
3769      The compiler is supposed to pass the highest register number
3770      saved, the assembler then has to adjust that number before
3771      entering it into the unwind descriptor (to account for any
3772      caller saved registers with lower register numbers than the
3773      first callee saved register).  */
3774   if (gr_saved)
3775     fprintf (file, ",ENTRY_GR=%d", gr_saved + 2);
3776
3777   if (fr_saved)
3778     fprintf (file, ",ENTRY_FR=%d", fr_saved + 11);
3779
3780   fputs ("\n\t.ENTRY\n", file);
3781
3782   remove_useless_addtr_insns (0);
3783 }
3784
3785 void
3786 hppa_expand_prologue (void)
3787 {
3788   int merge_sp_adjust_with_store = 0;
3789   HOST_WIDE_INT size = get_frame_size ();
3790   HOST_WIDE_INT offset;
3791   int i;
3792   rtx insn, tmpreg;
3793
3794   gr_saved = 0;
3795   fr_saved = 0;
3796   save_fregs = 0;
3797
3798   /* Compute total size for frame pointer, filler, locals and rounding to
3799      the next word boundary.  Similar code appears in compute_frame_size
3800      and must be changed in tandem with this code.  */
3801   local_fsize = (size + UNITS_PER_WORD - 1) & ~(UNITS_PER_WORD - 1);
3802   if (local_fsize || frame_pointer_needed)
3803     local_fsize += STARTING_FRAME_OFFSET;
3804
3805   actual_fsize = compute_frame_size (size, &save_fregs);
3806   if (flag_stack_usage)
3807     current_function_static_stack_size = actual_fsize;
3808
3809   /* Compute a few things we will use often.  */
3810   tmpreg = gen_rtx_REG (word_mode, 1);
3811
3812   /* Save RP first.  The calling conventions manual states RP will
3813      always be stored into the caller's frame at sp - 20 or sp - 16
3814      depending on which ABI is in use.  */
3815   if (df_regs_ever_live_p (2) || crtl->calls_eh_return)
3816     {
3817       store_reg (2, TARGET_64BIT ? -16 : -20, STACK_POINTER_REGNUM);
3818       rp_saved = true;
3819     }
3820   else
3821     rp_saved = false;
3822
3823   /* Allocate the local frame and set up the frame pointer if needed.  */
3824   if (actual_fsize != 0)
3825     {
3826       if (frame_pointer_needed)
3827         {
3828           /* Copy the old frame pointer temporarily into %r1.  Set up the
3829              new stack pointer, then store away the saved old frame pointer
3830              into the stack at sp and at the same time update the stack
3831              pointer by actual_fsize bytes.  Two versions, first
3832              handles small (<8k) frames.  The second handles large (>=8k)
3833              frames.  */
3834           insn = emit_move_insn (tmpreg, hard_frame_pointer_rtx);
3835           if (DO_FRAME_NOTES)
3836             RTX_FRAME_RELATED_P (insn) = 1;
3837
3838           insn = emit_move_insn (hard_frame_pointer_rtx, stack_pointer_rtx);
3839           if (DO_FRAME_NOTES)
3840             RTX_FRAME_RELATED_P (insn) = 1;
3841
3842           if (VAL_14_BITS_P (actual_fsize))
3843             store_reg_modify (STACK_POINTER_REGNUM, 1, actual_fsize);
3844           else
3845             {
3846               /* It is incorrect to store the saved frame pointer at *sp,
3847                  then increment sp (writes beyond the current stack boundary).
3848
3849                  So instead use stwm to store at *sp and post-increment the
3850                  stack pointer as an atomic operation.  Then increment sp to
3851                  finish allocating the new frame.  */
3852               HOST_WIDE_INT adjust1 = 8192 - 64;
3853               HOST_WIDE_INT adjust2 = actual_fsize - adjust1;
3854
3855               store_reg_modify (STACK_POINTER_REGNUM, 1, adjust1);
3856               set_reg_plus_d (STACK_POINTER_REGNUM, STACK_POINTER_REGNUM,
3857                               adjust2, 1);
3858             }
3859
3860           /* We set SAVE_SP in frames that need a frame pointer.  Thus,
3861              we need to store the previous stack pointer (frame pointer)
3862              into the frame marker on targets that use the HP unwind
3863              library.  This allows the HP unwind library to be used to
3864              unwind GCC frames.  However, we are not fully compatible
3865              with the HP library because our frame layout differs from
3866              that specified in the HP runtime specification.
3867
3868              We don't want a frame note on this instruction as the frame
3869              marker moves during dynamic stack allocation.
3870
3871              This instruction also serves as a blockage to prevent
3872              register spills from being scheduled before the stack
3873              pointer is raised.  This is necessary as we store
3874              registers using the frame pointer as a base register,
3875              and the frame pointer is set before sp is raised.  */
3876           if (TARGET_HPUX_UNWIND_LIBRARY)
3877             {
3878               rtx addr = gen_rtx_PLUS (word_mode, stack_pointer_rtx,
3879                                        GEN_INT (TARGET_64BIT ? -8 : -4));
3880
3881               emit_move_insn (gen_rtx_MEM (word_mode, addr),
3882                               hard_frame_pointer_rtx);
3883             }
3884           else
3885             emit_insn (gen_blockage ());
3886         }
3887       /* no frame pointer needed.  */
3888       else
3889         {
3890           /* In some cases we can perform the first callee register save
3891              and allocating the stack frame at the same time.   If so, just
3892              make a note of it and defer allocating the frame until saving
3893              the callee registers.  */
3894           if (VAL_14_BITS_P (actual_fsize) && local_fsize == 0)
3895             merge_sp_adjust_with_store = 1;
3896           /* Can not optimize.  Adjust the stack frame by actual_fsize
3897              bytes.  */
3898           else
3899             set_reg_plus_d (STACK_POINTER_REGNUM, STACK_POINTER_REGNUM,
3900                             actual_fsize, 1);
3901         }
3902     }
3903
3904   /* Normal register save.
3905
3906      Do not save the frame pointer in the frame_pointer_needed case.  It
3907      was done earlier.  */
3908   if (frame_pointer_needed)
3909     {
3910       offset = local_fsize;
3911
3912       /* Saving the EH return data registers in the frame is the simplest
3913          way to get the frame unwind information emitted.  We put them
3914          just before the general registers.  */
3915       if (DO_FRAME_NOTES && crtl->calls_eh_return)
3916         {
3917           unsigned int i, regno;
3918
3919           for (i = 0; ; ++i)
3920             {
3921               regno = EH_RETURN_DATA_REGNO (i);
3922               if (regno == INVALID_REGNUM)
3923                 break;
3924
3925               store_reg (regno, offset, HARD_FRAME_POINTER_REGNUM);
3926               offset += UNITS_PER_WORD;
3927             }
3928         }
3929
3930       for (i = 18; i >= 4; i--)
3931         if (df_regs_ever_live_p (i) && ! call_used_regs[i])
3932           {
3933             store_reg (i, offset, HARD_FRAME_POINTER_REGNUM);
3934             offset += UNITS_PER_WORD;
3935             gr_saved++;
3936           }
3937       /* Account for %r3 which is saved in a special place.  */
3938       gr_saved++;
3939     }
3940   /* No frame pointer needed.  */
3941   else
3942     {
3943       offset = local_fsize - actual_fsize;
3944
3945       /* Saving the EH return data registers in the frame is the simplest
3946          way to get the frame unwind information emitted.  */
3947       if (DO_FRAME_NOTES && crtl->calls_eh_return)
3948         {
3949           unsigned int i, regno;
3950
3951           for (i = 0; ; ++i)
3952             {
3953               regno = EH_RETURN_DATA_REGNO (i);
3954               if (regno == INVALID_REGNUM)
3955                 break;
3956
3957               /* If merge_sp_adjust_with_store is nonzero, then we can
3958                  optimize the first save.  */
3959               if (merge_sp_adjust_with_store)
3960                 {
3961                   store_reg_modify (STACK_POINTER_REGNUM, regno, -offset);
3962                   merge_sp_adjust_with_store = 0;
3963                 }
3964               else
3965                 store_reg (regno, offset, STACK_POINTER_REGNUM);
3966               offset += UNITS_PER_WORD;
3967             }
3968         }
3969
3970       for (i = 18; i >= 3; i--)
3971         if (df_regs_ever_live_p (i) && ! call_used_regs[i])
3972           {
3973             /* If merge_sp_adjust_with_store is nonzero, then we can
3974                optimize the first GR save.  */
3975             if (merge_sp_adjust_with_store)
3976               {
3977                 store_reg_modify (STACK_POINTER_REGNUM, i, -offset);
3978                 merge_sp_adjust_with_store = 0;
3979               }
3980             else
3981               store_reg (i, offset, STACK_POINTER_REGNUM);
3982             offset += UNITS_PER_WORD;
3983             gr_saved++;
3984           }
3985
3986       /* If we wanted to merge the SP adjustment with a GR save, but we never
3987          did any GR saves, then just emit the adjustment here.  */
3988       if (merge_sp_adjust_with_store)
3989         set_reg_plus_d (STACK_POINTER_REGNUM, STACK_POINTER_REGNUM,
3990                         actual_fsize, 1);
3991     }
3992
3993   /* The hppa calling conventions say that %r19, the pic offset
3994      register, is saved at sp - 32 (in this function's frame)
3995      when generating PIC code.  FIXME:  What is the correct thing
3996      to do for functions which make no calls and allocate no
3997      frame?  Do we need to allocate a frame, or can we just omit
3998      the save?   For now we'll just omit the save.
3999      
4000      We don't want a note on this insn as the frame marker can
4001      move if there is a dynamic stack allocation.  */
4002   if (flag_pic && actual_fsize != 0 && !TARGET_64BIT)
4003     {
4004       rtx addr = gen_rtx_PLUS (word_mode, stack_pointer_rtx, GEN_INT (-32));
4005
4006       emit_move_insn (gen_rtx_MEM (word_mode, addr), pic_offset_table_rtx);
4007
4008     }
4009
4010   /* Align pointer properly (doubleword boundary).  */
4011   offset = (offset + 7) & ~7;
4012
4013   /* Floating point register store.  */
4014   if (save_fregs)
4015     {
4016       rtx base;
4017
4018       /* First get the frame or stack pointer to the start of the FP register
4019          save area.  */
4020       if (frame_pointer_needed)
4021         {
4022           set_reg_plus_d (1, HARD_FRAME_POINTER_REGNUM, offset, 0);
4023           base = hard_frame_pointer_rtx;
4024         }
4025       else
4026         {
4027           set_reg_plus_d (1, STACK_POINTER_REGNUM, offset, 0);
4028           base = stack_pointer_rtx;
4029         }
4030
4031       /* Now actually save the FP registers.  */
4032       for (i = FP_SAVED_REG_LAST; i >= FP_SAVED_REG_FIRST; i -= FP_REG_STEP)
4033         {
4034           if (df_regs_ever_live_p (i)
4035               || (! TARGET_64BIT && df_regs_ever_live_p (i + 1)))
4036             {
4037               rtx addr, insn, reg;
4038               addr = gen_rtx_MEM (DFmode, gen_rtx_POST_INC (DFmode, tmpreg));
4039               reg = gen_rtx_REG (DFmode, i);
4040               insn = emit_move_insn (addr, reg);
4041               if (DO_FRAME_NOTES)
4042                 {
4043                   RTX_FRAME_RELATED_P (insn) = 1;
4044                   if (TARGET_64BIT)
4045                     {
4046                       rtx mem = gen_rtx_MEM (DFmode,
4047                                              plus_constant (base, offset));
4048                       add_reg_note (insn, REG_FRAME_RELATED_EXPR,
4049                                     gen_rtx_SET (VOIDmode, mem, reg));
4050                     }
4051                   else
4052                     {
4053                       rtx meml = gen_rtx_MEM (SFmode,
4054                                               plus_constant (base, offset));
4055                       rtx memr = gen_rtx_MEM (SFmode,
4056                                               plus_constant (base, offset + 4));
4057                       rtx regl = gen_rtx_REG (SFmode, i);
4058                       rtx regr = gen_rtx_REG (SFmode, i + 1);
4059                       rtx setl = gen_rtx_SET (VOIDmode, meml, regl);
4060                       rtx setr = gen_rtx_SET (VOIDmode, memr, regr);
4061                       rtvec vec;
4062
4063                       RTX_FRAME_RELATED_P (setl) = 1;
4064                       RTX_FRAME_RELATED_P (setr) = 1;
4065                       vec = gen_rtvec (2, setl, setr);
4066                       add_reg_note (insn, REG_FRAME_RELATED_EXPR,
4067                                     gen_rtx_SEQUENCE (VOIDmode, vec));
4068                     }
4069                 }
4070               offset += GET_MODE_SIZE (DFmode);
4071               fr_saved++;
4072             }
4073         }
4074     }
4075 }
4076
4077 /* Emit RTL to load REG from the memory location specified by BASE+DISP.
4078    Handle case where DISP > 8k by using the add_high_const patterns.  */
4079
4080 static void
4081 load_reg (int reg, HOST_WIDE_INT disp, int base)
4082 {
4083   rtx dest = gen_rtx_REG (word_mode, reg);
4084   rtx basereg = gen_rtx_REG (Pmode, base);
4085   rtx src;
4086
4087   if (VAL_14_BITS_P (disp))
4088     src = gen_rtx_MEM (word_mode, plus_constant (basereg, disp));
4089   else if (TARGET_64BIT && !VAL_32_BITS_P (disp))
4090     {
4091       rtx delta = GEN_INT (disp);
4092       rtx tmpreg = gen_rtx_REG (Pmode, 1);
4093
4094       emit_move_insn (tmpreg, delta);
4095       if (TARGET_DISABLE_INDEXING)
4096         {
4097           emit_move_insn (tmpreg, gen_rtx_PLUS (Pmode, tmpreg, basereg));
4098           src = gen_rtx_MEM (word_mode, tmpreg);
4099         }
4100       else
4101         src = gen_rtx_MEM (word_mode, gen_rtx_PLUS (Pmode, tmpreg, basereg));
4102     }
4103   else
4104     {
4105       rtx delta = GEN_INT (disp);
4106       rtx high = gen_rtx_PLUS (Pmode, basereg, gen_rtx_HIGH (Pmode, delta));
4107       rtx tmpreg = gen_rtx_REG (Pmode, 1);
4108
4109       emit_move_insn (tmpreg, high);
4110       src = gen_rtx_MEM (word_mode, gen_rtx_LO_SUM (Pmode, tmpreg, delta));
4111     }
4112
4113   emit_move_insn (dest, src);
4114 }
4115
4116 /* Update the total code bytes output to the text section.  */
4117
4118 static void
4119 update_total_code_bytes (unsigned int nbytes)
4120 {
4121   if ((TARGET_PORTABLE_RUNTIME || !TARGET_GAS || !TARGET_SOM)
4122       && !IN_NAMED_SECTION_P (cfun->decl))
4123     {
4124       unsigned int old_total = total_code_bytes;
4125
4126       total_code_bytes += nbytes;
4127
4128       /* Be prepared to handle overflows.  */
4129       if (old_total > total_code_bytes)
4130         total_code_bytes = UINT_MAX;
4131     }
4132 }
4133
4134 /* This function generates the assembly code for function exit.
4135    Args are as for output_function_prologue ().
4136
4137    The function epilogue should not depend on the current stack
4138    pointer!  It should use the frame pointer only.  This is mandatory
4139    because of alloca; we also take advantage of it to omit stack
4140    adjustments before returning.  */
4141
4142 static void
4143 pa_output_function_epilogue (FILE *file, HOST_WIDE_INT size ATTRIBUTE_UNUSED)
4144 {
4145   rtx insn = get_last_insn ();
4146
4147   last_address = 0;
4148
4149   /* hppa_expand_epilogue does the dirty work now.  We just need
4150      to output the assembler directives which denote the end
4151      of a function.
4152
4153      To make debuggers happy, emit a nop if the epilogue was completely
4154      eliminated due to a volatile call as the last insn in the
4155      current function.  That way the return address (in %r2) will
4156      always point to a valid instruction in the current function.  */
4157
4158   /* Get the last real insn.  */
4159   if (GET_CODE (insn) == NOTE)
4160     insn = prev_real_insn (insn);
4161
4162   /* If it is a sequence, then look inside.  */
4163   if (insn && GET_CODE (insn) == INSN && GET_CODE (PATTERN (insn)) == SEQUENCE)
4164     insn = XVECEXP (PATTERN (insn), 0, 0);
4165
4166   /* If insn is a CALL_INSN, then it must be a call to a volatile
4167      function (otherwise there would be epilogue insns).  */
4168   if (insn && GET_CODE (insn) == CALL_INSN)
4169     {
4170       fputs ("\tnop\n", file);
4171       last_address += 4;
4172     }
4173
4174   fputs ("\t.EXIT\n\t.PROCEND\n", file);
4175
4176   if (TARGET_SOM && TARGET_GAS)
4177     {
4178       /* We done with this subspace except possibly for some additional
4179          debug information.  Forget that we are in this subspace to ensure
4180          that the next function is output in its own subspace.  */
4181       in_section = NULL;
4182       cfun->machine->in_nsubspa = 2;
4183     }
4184
4185   if (INSN_ADDRESSES_SET_P ())
4186     {
4187       insn = get_last_nonnote_insn ();
4188       last_address += INSN_ADDRESSES (INSN_UID (insn));
4189       if (INSN_P (insn))
4190         last_address += insn_default_length (insn);
4191       last_address = ((last_address + FUNCTION_BOUNDARY / BITS_PER_UNIT - 1)
4192                       & ~(FUNCTION_BOUNDARY / BITS_PER_UNIT - 1));
4193     }
4194   else
4195     last_address = UINT_MAX;
4196
4197   /* Finally, update the total number of code bytes output so far.  */
4198   update_total_code_bytes (last_address);
4199 }
4200
4201 void
4202 hppa_expand_epilogue (void)
4203 {
4204   rtx tmpreg;
4205   HOST_WIDE_INT offset;
4206   HOST_WIDE_INT ret_off = 0;
4207   int i;
4208   int merge_sp_adjust_with_load = 0;
4209
4210   /* We will use this often.  */
4211   tmpreg = gen_rtx_REG (word_mode, 1);
4212
4213   /* Try to restore RP early to avoid load/use interlocks when
4214      RP gets used in the return (bv) instruction.  This appears to still
4215      be necessary even when we schedule the prologue and epilogue.  */
4216   if (rp_saved)
4217     {
4218       ret_off = TARGET_64BIT ? -16 : -20;
4219       if (frame_pointer_needed)
4220         {
4221           load_reg (2, ret_off, HARD_FRAME_POINTER_REGNUM);
4222           ret_off = 0;
4223         }
4224       else
4225         {
4226           /* No frame pointer, and stack is smaller than 8k.  */
4227           if (VAL_14_BITS_P (ret_off - actual_fsize))
4228             {
4229               load_reg (2, ret_off - actual_fsize, STACK_POINTER_REGNUM);
4230               ret_off = 0;
4231             }
4232         }
4233     }
4234
4235   /* General register restores.  */
4236   if (frame_pointer_needed)
4237     {
4238       offset = local_fsize;
4239
4240       /* If the current function calls __builtin_eh_return, then we need
4241          to restore the saved EH data registers.  */
4242       if (DO_FRAME_NOTES && crtl->calls_eh_return)
4243         {
4244           unsigned int i, regno;
4245
4246           for (i = 0; ; ++i)
4247             {
4248               regno = EH_RETURN_DATA_REGNO (i);
4249               if (regno == INVALID_REGNUM)
4250                 break;
4251
4252               load_reg (regno, offset, HARD_FRAME_POINTER_REGNUM);
4253               offset += UNITS_PER_WORD;
4254             }
4255         }
4256
4257       for (i = 18; i >= 4; i--)
4258         if (df_regs_ever_live_p (i) && ! call_used_regs[i])
4259           {
4260             load_reg (i, offset, HARD_FRAME_POINTER_REGNUM);
4261             offset += UNITS_PER_WORD;
4262           }
4263     }
4264   else
4265     {
4266       offset = local_fsize - actual_fsize;
4267
4268       /* If the current function calls __builtin_eh_return, then we need
4269          to restore the saved EH data registers.  */
4270       if (DO_FRAME_NOTES && crtl->calls_eh_return)
4271         {
4272           unsigned int i, regno;
4273
4274           for (i = 0; ; ++i)
4275             {
4276               regno = EH_RETURN_DATA_REGNO (i);
4277               if (regno == INVALID_REGNUM)
4278                 break;
4279
4280               /* Only for the first load.
4281                  merge_sp_adjust_with_load holds the register load
4282                  with which we will merge the sp adjustment.  */
4283               if (merge_sp_adjust_with_load == 0
4284                   && local_fsize == 0
4285                   && VAL_14_BITS_P (-actual_fsize))
4286                 merge_sp_adjust_with_load = regno;
4287               else
4288                 load_reg (regno, offset, STACK_POINTER_REGNUM);
4289               offset += UNITS_PER_WORD;
4290             }
4291         }
4292
4293       for (i = 18; i >= 3; i--)
4294         {
4295           if (df_regs_ever_live_p (i) && ! call_used_regs[i])
4296             {
4297               /* Only for the first load.
4298                  merge_sp_adjust_with_load holds the register load
4299                  with which we will merge the sp adjustment.  */
4300               if (merge_sp_adjust_with_load == 0
4301                   && local_fsize == 0
4302                   && VAL_14_BITS_P (-actual_fsize))
4303                 merge_sp_adjust_with_load = i;
4304               else
4305                 load_reg (i, offset, STACK_POINTER_REGNUM);
4306               offset += UNITS_PER_WORD;
4307             }
4308         }
4309     }
4310
4311   /* Align pointer properly (doubleword boundary).  */
4312   offset = (offset + 7) & ~7;
4313
4314   /* FP register restores.  */
4315   if (save_fregs)
4316     {
4317       /* Adjust the register to index off of.  */
4318       if (frame_pointer_needed)
4319         set_reg_plus_d (1, HARD_FRAME_POINTER_REGNUM, offset, 0);
4320       else
4321         set_reg_plus_d (1, STACK_POINTER_REGNUM, offset, 0);
4322
4323       /* Actually do the restores now.  */
4324       for (i = FP_SAVED_REG_LAST; i >= FP_SAVED_REG_FIRST; i -= FP_REG_STEP)
4325         if (df_regs_ever_live_p (i)
4326             || (! TARGET_64BIT && df_regs_ever_live_p (i + 1)))
4327           {
4328             rtx src = gen_rtx_MEM (DFmode, gen_rtx_POST_INC (DFmode, tmpreg));
4329             rtx dest = gen_rtx_REG (DFmode, i);
4330             emit_move_insn (dest, src);
4331           }
4332     }
4333
4334   /* Emit a blockage insn here to keep these insns from being moved to
4335      an earlier spot in the epilogue, or into the main instruction stream.
4336
4337      This is necessary as we must not cut the stack back before all the
4338      restores are finished.  */
4339   emit_insn (gen_blockage ());
4340
4341   /* Reset stack pointer (and possibly frame pointer).  The stack
4342      pointer is initially set to fp + 64 to avoid a race condition.  */
4343   if (frame_pointer_needed)
4344     {
4345       rtx delta = GEN_INT (-64);
4346
4347       set_reg_plus_d (STACK_POINTER_REGNUM, HARD_FRAME_POINTER_REGNUM, 64, 0);
4348       emit_insn (gen_pre_load (hard_frame_pointer_rtx,
4349                                stack_pointer_rtx, delta));
4350     }
4351   /* If we were deferring a callee register restore, do it now.  */
4352   else if (merge_sp_adjust_with_load)
4353     {
4354       rtx delta = GEN_INT (-actual_fsize);
4355       rtx dest = gen_rtx_REG (word_mode, merge_sp_adjust_with_load);
4356
4357       emit_insn (gen_pre_load (dest, stack_pointer_rtx, delta));
4358     }
4359   else if (actual_fsize != 0)
4360     set_reg_plus_d (STACK_POINTER_REGNUM, STACK_POINTER_REGNUM,
4361                     - actual_fsize, 0);
4362
4363   /* If we haven't restored %r2 yet (no frame pointer, and a stack
4364      frame greater than 8k), do so now.  */
4365   if (ret_off != 0)
4366     load_reg (2, ret_off, STACK_POINTER_REGNUM);
4367
4368   if (DO_FRAME_NOTES && crtl->calls_eh_return)
4369     {
4370       rtx sa = EH_RETURN_STACKADJ_RTX;
4371
4372       emit_insn (gen_blockage ());
4373       emit_insn (TARGET_64BIT
4374                  ? gen_subdi3 (stack_pointer_rtx, stack_pointer_rtx, sa)
4375                  : gen_subsi3 (stack_pointer_rtx, stack_pointer_rtx, sa));
4376     }
4377 }
4378
4379 rtx
4380 hppa_pic_save_rtx (void)
4381 {
4382   return get_hard_reg_initial_val (word_mode, PIC_OFFSET_TABLE_REGNUM);
4383 }
4384
4385 #ifndef NO_DEFERRED_PROFILE_COUNTERS
4386 #define NO_DEFERRED_PROFILE_COUNTERS 0
4387 #endif
4388
4389
4390 /* Vector of funcdef numbers.  */
4391 static VEC(int,heap) *funcdef_nos;
4392
4393 /* Output deferred profile counters.  */
4394 static void
4395 output_deferred_profile_counters (void)
4396 {
4397   unsigned int i;
4398   int align, n;
4399
4400   if (VEC_empty (int, funcdef_nos))
4401    return;
4402
4403   switch_to_section (data_section);
4404   align = MIN (BIGGEST_ALIGNMENT, LONG_TYPE_SIZE);
4405   ASM_OUTPUT_ALIGN (asm_out_file, floor_log2 (align / BITS_PER_UNIT));
4406
4407   for (i = 0; VEC_iterate (int, funcdef_nos, i, n); i++)
4408     {
4409       targetm.asm_out.internal_label (asm_out_file, "LP", n);
4410       assemble_integer (const0_rtx, LONG_TYPE_SIZE / BITS_PER_UNIT, align, 1);
4411     }
4412
4413   VEC_free (int, heap, funcdef_nos);
4414 }
4415
4416 void
4417 hppa_profile_hook (int label_no)
4418 {
4419   /* We use SImode for the address of the function in both 32 and
4420      64-bit code to avoid having to provide DImode versions of the
4421      lcla2 and load_offset_label_address insn patterns.  */
4422   rtx reg = gen_reg_rtx (SImode);
4423   rtx label_rtx = gen_label_rtx ();
4424   rtx begin_label_rtx, call_insn;
4425   char begin_label_name[16];
4426
4427   ASM_GENERATE_INTERNAL_LABEL (begin_label_name, FUNC_BEGIN_PROLOG_LABEL,
4428                                label_no);
4429   begin_label_rtx = gen_rtx_SYMBOL_REF (SImode, ggc_strdup (begin_label_name));
4430
4431   if (TARGET_64BIT)
4432     emit_move_insn (arg_pointer_rtx,
4433                     gen_rtx_PLUS (word_mode, virtual_outgoing_args_rtx,
4434                                   GEN_INT (64)));
4435
4436   emit_move_insn (gen_rtx_REG (word_mode, 26), gen_rtx_REG (word_mode, 2));
4437
4438   /* The address of the function is loaded into %r25 with an instruction-
4439      relative sequence that avoids the use of relocations.  The sequence
4440      is split so that the load_offset_label_address instruction can
4441      occupy the delay slot of the call to _mcount.  */
4442   if (TARGET_PA_20)
4443     emit_insn (gen_lcla2 (reg, label_rtx));
4444   else
4445     emit_insn (gen_lcla1 (reg, label_rtx));
4446
4447   emit_insn (gen_load_offset_label_address (gen_rtx_REG (SImode, 25), 
4448                                             reg, begin_label_rtx, label_rtx));
4449
4450 #if !NO_DEFERRED_PROFILE_COUNTERS
4451   {
4452     rtx count_label_rtx, addr, r24;
4453     char count_label_name[16];
4454
4455     VEC_safe_push (int, heap, funcdef_nos, label_no);
4456     ASM_GENERATE_INTERNAL_LABEL (count_label_name, "LP", label_no);
4457     count_label_rtx = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (count_label_name));
4458
4459     addr = force_reg (Pmode, count_label_rtx);
4460     r24 = gen_rtx_REG (Pmode, 24);
4461     emit_move_insn (r24, addr);
4462
4463     call_insn =
4464       emit_call_insn (gen_call (gen_rtx_MEM (Pmode, 
4465                                              gen_rtx_SYMBOL_REF (Pmode, 
4466                                                                  "_mcount")),
4467                                 GEN_INT (TARGET_64BIT ? 24 : 12)));
4468
4469     use_reg (&CALL_INSN_FUNCTION_USAGE (call_insn), r24);
4470   }
4471 #else
4472
4473   call_insn =
4474     emit_call_insn (gen_call (gen_rtx_MEM (Pmode, 
4475                                            gen_rtx_SYMBOL_REF (Pmode, 
4476                                                                "_mcount")),
4477                               GEN_INT (TARGET_64BIT ? 16 : 8)));
4478
4479 #endif
4480
4481   use_reg (&CALL_INSN_FUNCTION_USAGE (call_insn), gen_rtx_REG (SImode, 25));
4482   use_reg (&CALL_INSN_FUNCTION_USAGE (call_insn), gen_rtx_REG (SImode, 26));
4483
4484   /* Indicate the _mcount call cannot throw, nor will it execute a
4485      non-local goto.  */
4486   make_reg_eh_region_note_nothrow_nononlocal (call_insn);
4487 }
4488
4489 /* Fetch the return address for the frame COUNT steps up from
4490    the current frame, after the prologue.  FRAMEADDR is the
4491    frame pointer of the COUNT frame.
4492
4493    We want to ignore any export stub remnants here.  To handle this,
4494    we examine the code at the return address, and if it is an export
4495    stub, we return a memory rtx for the stub return address stored
4496    at frame-24.
4497
4498    The value returned is used in two different ways:
4499
4500         1. To find a function's caller.
4501
4502         2. To change the return address for a function.
4503
4504    This function handles most instances of case 1; however, it will
4505    fail if there are two levels of stubs to execute on the return
4506    path.  The only way I believe that can happen is if the return value
4507    needs a parameter relocation, which never happens for C code.
4508
4509    This function handles most instances of case 2; however, it will
4510    fail if we did not originally have stub code on the return path
4511    but will need stub code on the new return path.  This can happen if
4512    the caller & callee are both in the main program, but the new
4513    return location is in a shared library.  */
4514
4515 rtx
4516 return_addr_rtx (int count, rtx frameaddr)
4517 {
4518   rtx label;
4519   rtx rp;
4520   rtx saved_rp;
4521   rtx ins;
4522
4523   /* Instruction stream at the normal return address for the export stub:
4524
4525         0x4bc23fd1 | stub+8:   ldw -18(sr0,sp),rp
4526         0x004010a1 | stub+12:  ldsid (sr0,rp),r1
4527         0x00011820 | stub+16:  mtsp r1,sr0
4528         0xe0400002 | stub+20:  be,n 0(sr0,rp)
4529
4530      0xe0400002 must be specified as -532676606 so that it won't be
4531      rejected as an invalid immediate operand on 64-bit hosts.  */
4532
4533   HOST_WIDE_INT insns[4] = {0x4bc23fd1, 0x004010a1, 0x00011820, -532676606};
4534   int i;
4535
4536   if (count != 0)
4537     return NULL_RTX;
4538
4539   rp = get_hard_reg_initial_val (Pmode, 2);
4540
4541   if (TARGET_64BIT || TARGET_NO_SPACE_REGS)
4542     return rp;
4543
4544   /* If there is no export stub then just use the value saved from
4545      the return pointer register.  */
4546
4547   saved_rp = gen_reg_rtx (Pmode);
4548   emit_move_insn (saved_rp, rp);
4549
4550   /* Get pointer to the instruction stream.  We have to mask out the
4551      privilege level from the two low order bits of the return address
4552      pointer here so that ins will point to the start of the first
4553      instruction that would have been executed if we returned.  */
4554   ins = copy_to_reg (gen_rtx_AND (Pmode, rp, MASK_RETURN_ADDR));
4555   label = gen_label_rtx ();
4556
4557   /* Check the instruction stream at the normal return address for the
4558      export stub.  If it is an export stub, than our return address is
4559      really in -24[frameaddr].  */
4560
4561   for (i = 0; i < 3; i++)
4562     {
4563       rtx op0 = gen_rtx_MEM (SImode, plus_constant (ins, i * 4)); 
4564       rtx op1 = GEN_INT (insns[i]);
4565       emit_cmp_and_jump_insns (op0, op1, NE, NULL, SImode, 0, label);
4566     }
4567
4568   /* Here we know that our return address points to an export
4569      stub.  We don't want to return the address of the export stub,
4570      but rather the return address of the export stub.  That return
4571      address is stored at -24[frameaddr].  */
4572
4573   emit_move_insn (saved_rp,
4574                   gen_rtx_MEM (Pmode,
4575                                memory_address (Pmode,
4576                                                plus_constant (frameaddr,
4577                                                               -24))));
4578
4579   emit_label (label);
4580
4581   return saved_rp;
4582 }
4583
4584 void
4585 emit_bcond_fp (rtx operands[])
4586 {
4587   enum rtx_code code = GET_CODE (operands[0]);
4588   rtx operand0 = operands[1];
4589   rtx operand1 = operands[2];
4590   rtx label = operands[3];
4591
4592   emit_insn (gen_rtx_SET (VOIDmode, gen_rtx_REG (CCFPmode, 0),
4593                           gen_rtx_fmt_ee (code, CCFPmode, operand0, operand1)));
4594
4595   emit_jump_insn (gen_rtx_SET (VOIDmode, pc_rtx,
4596                                gen_rtx_IF_THEN_ELSE (VOIDmode,
4597                                                      gen_rtx_fmt_ee (NE,
4598                                                               VOIDmode,
4599                                                               gen_rtx_REG (CCFPmode, 0),
4600                                                               const0_rtx),
4601                                                      gen_rtx_LABEL_REF (VOIDmode, label),
4602                                                      pc_rtx)));
4603
4604 }
4605
4606 /* Adjust the cost of a scheduling dependency.  Return the new cost of
4607    a dependency LINK or INSN on DEP_INSN.  COST is the current cost.  */
4608
4609 static int
4610 pa_adjust_cost (rtx insn, rtx link, rtx dep_insn, int cost)
4611 {
4612   enum attr_type attr_type;
4613
4614   /* Don't adjust costs for a pa8000 chip, also do not adjust any
4615      true dependencies as they are described with bypasses now.  */
4616   if (pa_cpu >= PROCESSOR_8000 || REG_NOTE_KIND (link) == 0)
4617     return cost;
4618
4619   if (! recog_memoized (insn))
4620     return 0;
4621
4622   attr_type = get_attr_type (insn);
4623
4624   switch (REG_NOTE_KIND (link))
4625     {
4626     case REG_DEP_ANTI:
4627       /* Anti dependency; DEP_INSN reads a register that INSN writes some
4628          cycles later.  */
4629
4630       if (attr_type == TYPE_FPLOAD)
4631         {
4632           rtx pat = PATTERN (insn);
4633           rtx dep_pat = PATTERN (dep_insn);
4634           if (GET_CODE (pat) == PARALLEL)
4635             {
4636               /* This happens for the fldXs,mb patterns.  */
4637               pat = XVECEXP (pat, 0, 0);
4638             }
4639           if (GET_CODE (pat) != SET || GET_CODE (dep_pat) != SET)
4640             /* If this happens, we have to extend this to schedule
4641                optimally.  Return 0 for now.  */
4642           return 0;
4643
4644           if (reg_mentioned_p (SET_DEST (pat), SET_SRC (dep_pat)))
4645             {
4646               if (! recog_memoized (dep_insn))
4647                 return 0;
4648               switch (get_attr_type (dep_insn))
4649                 {
4650                 case TYPE_FPALU:
4651                 case TYPE_FPMULSGL:
4652                 case TYPE_FPMULDBL:
4653                 case TYPE_FPDIVSGL:
4654                 case TYPE_FPDIVDBL:
4655                 case TYPE_FPSQRTSGL:
4656                 case TYPE_FPSQRTDBL:
4657                   /* A fpload can't be issued until one cycle before a
4658                      preceding arithmetic operation has finished if
4659                      the target of the fpload is any of the sources
4660                      (or destination) of the arithmetic operation.  */
4661                   return insn_default_latency (dep_insn) - 1;
4662
4663                 default:
4664                   return 0;
4665                 }
4666             }
4667         }
4668       else if (attr_type == TYPE_FPALU)
4669         {
4670           rtx pat = PATTERN (insn);
4671           rtx dep_pat = PATTERN (dep_insn);
4672           if (GET_CODE (pat) == PARALLEL)
4673             {
4674               /* This happens for the fldXs,mb patterns.  */
4675               pat = XVECEXP (pat, 0, 0);
4676             }
4677           if (GET_CODE (pat) != SET || GET_CODE (dep_pat) != SET)
4678             /* If this happens, we have to extend this to schedule
4679                optimally.  Return 0 for now.  */
4680           return 0;
4681
4682           if (reg_mentioned_p (SET_DEST (pat), SET_SRC (dep_pat)))
4683             {
4684               if (! recog_memoized (dep_insn))
4685                 return 0;
4686               switch (get_attr_type (dep_insn))
4687                 {
4688                 case TYPE_FPDIVSGL:
4689                 case TYPE_FPDIVDBL:
4690                 case TYPE_FPSQRTSGL:
4691                 case TYPE_FPSQRTDBL:
4692                   /* An ALU flop can't be issued until two cycles before a
4693                      preceding divide or sqrt operation has finished if
4694                      the target of the ALU flop is any of the sources
4695                      (or destination) of the divide or sqrt operation.  */
4696                   return insn_default_latency (dep_insn) - 2;
4697
4698                 default:
4699                   return 0;
4700                 }
4701             }
4702         }
4703
4704       /* For other anti dependencies, the cost is 0.  */
4705       return 0;
4706
4707     case REG_DEP_OUTPUT:
4708       /* Output dependency; DEP_INSN writes a register that INSN writes some
4709          cycles later.  */
4710       if (attr_type == TYPE_FPLOAD)
4711         {
4712           rtx pat = PATTERN (insn);
4713           rtx dep_pat = PATTERN (dep_insn);
4714           if (GET_CODE (pat) == PARALLEL)
4715             {
4716               /* This happens for the fldXs,mb patterns.  */
4717               pat = XVECEXP (pat, 0, 0);
4718             }
4719           if (GET_CODE (pat) != SET || GET_CODE (dep_pat) != SET)
4720             /* If this happens, we have to extend this to schedule
4721                optimally.  Return 0 for now.  */
4722           return 0;
4723
4724           if (reg_mentioned_p (SET_DEST (pat), SET_DEST (dep_pat)))
4725             {
4726               if (! recog_memoized (dep_insn))
4727                 return 0;
4728               switch (get_attr_type (dep_insn))
4729                 {
4730                 case TYPE_FPALU:
4731                 case TYPE_FPMULSGL:
4732                 case TYPE_FPMULDBL:
4733                 case TYPE_FPDIVSGL:
4734                 case TYPE_FPDIVDBL:
4735                 case TYPE_FPSQRTSGL:
4736                 case TYPE_FPSQRTDBL:
4737                   /* A fpload can't be issued until one cycle before a
4738                      preceding arithmetic operation has finished if
4739                      the target of the fpload is the destination of the
4740                      arithmetic operation. 
4741
4742                      Exception: For PA7100LC, PA7200 and PA7300, the cost
4743                      is 3 cycles, unless they bundle together.   We also
4744                      pay the penalty if the second insn is a fpload.  */
4745                   return insn_default_latency (dep_insn) - 1;
4746
4747                 default:
4748                   return 0;
4749                 }
4750             }
4751         }
4752       else if (attr_type == TYPE_FPALU)
4753         {
4754           rtx pat = PATTERN (insn);
4755           rtx dep_pat = PATTERN (dep_insn);
4756           if (GET_CODE (pat) == PARALLEL)
4757             {
4758               /* This happens for the fldXs,mb patterns.  */
4759               pat = XVECEXP (pat, 0, 0);
4760             }
4761           if (GET_CODE (pat) != SET || GET_CODE (dep_pat) != SET)
4762             /* If this happens, we have to extend this to schedule
4763                optimally.  Return 0 for now.  */
4764           return 0;
4765
4766           if (reg_mentioned_p (SET_DEST (pat), SET_DEST (dep_pat)))
4767             {
4768               if (! recog_memoized (dep_insn))
4769                 return 0;
4770               switch (get_attr_type (dep_insn))
4771                 {
4772                 case TYPE_FPDIVSGL:
4773                 case TYPE_FPDIVDBL:
4774                 case TYPE_FPSQRTSGL:
4775                 case TYPE_FPSQRTDBL:
4776                   /* An ALU flop can't be issued until two cycles before a
4777                      preceding divide or sqrt operation has finished if
4778                      the target of the ALU flop is also the target of
4779                      the divide or sqrt operation.  */
4780                   return insn_default_latency (dep_insn) - 2;
4781
4782                 default:
4783                   return 0;
4784                 }
4785             }
4786         }
4787
4788       /* For other output dependencies, the cost is 0.  */
4789       return 0;
4790
4791     default:
4792       gcc_unreachable ();
4793     }
4794 }
4795
4796 /* Adjust scheduling priorities.  We use this to try and keep addil
4797    and the next use of %r1 close together.  */
4798 static int
4799 pa_adjust_priority (rtx insn, int priority)
4800 {
4801   rtx set = single_set (insn);
4802   rtx src, dest;
4803   if (set)
4804     {
4805       src = SET_SRC (set);
4806       dest = SET_DEST (set);
4807       if (GET_CODE (src) == LO_SUM
4808           && symbolic_operand (XEXP (src, 1), VOIDmode)
4809           && ! read_only_operand (XEXP (src, 1), VOIDmode))
4810         priority >>= 3;
4811
4812       else if (GET_CODE (src) == MEM
4813                && GET_CODE (XEXP (src, 0)) == LO_SUM
4814                && symbolic_operand (XEXP (XEXP (src, 0), 1), VOIDmode)
4815                && ! read_only_operand (XEXP (XEXP (src, 0), 1), VOIDmode))
4816         priority >>= 1;
4817
4818       else if (GET_CODE (dest) == MEM
4819                && GET_CODE (XEXP (dest, 0)) == LO_SUM
4820                && symbolic_operand (XEXP (XEXP (dest, 0), 1), VOIDmode)
4821                && ! read_only_operand (XEXP (XEXP (dest, 0), 1), VOIDmode))
4822         priority >>= 3;
4823     }
4824   return priority;
4825 }
4826
4827 /* The 700 can only issue a single insn at a time.
4828    The 7XXX processors can issue two insns at a time.
4829    The 8000 can issue 4 insns at a time.  */
4830 static int
4831 pa_issue_rate (void)
4832 {
4833   switch (pa_cpu)
4834     {
4835     case PROCESSOR_700:         return 1;
4836     case PROCESSOR_7100:        return 2;
4837     case PROCESSOR_7100LC:      return 2;
4838     case PROCESSOR_7200:        return 2;
4839     case PROCESSOR_7300:        return 2;
4840     case PROCESSOR_8000:        return 4;
4841
4842     default:
4843       gcc_unreachable ();
4844     }
4845 }
4846
4847
4848
4849 /* Return any length adjustment needed by INSN which already has its length
4850    computed as LENGTH.   Return zero if no adjustment is necessary.
4851
4852    For the PA: function calls, millicode calls, and backwards short
4853    conditional branches with unfilled delay slots need an adjustment by +1
4854    (to account for the NOP which will be inserted into the instruction stream).
4855
4856    Also compute the length of an inline block move here as it is too
4857    complicated to express as a length attribute in pa.md.  */
4858 int
4859 pa_adjust_insn_length (rtx insn, int length)
4860 {
4861   rtx pat = PATTERN (insn);
4862
4863   /* Jumps inside switch tables which have unfilled delay slots need
4864      adjustment.  */
4865   if (GET_CODE (insn) == JUMP_INSN
4866       && GET_CODE (pat) == PARALLEL
4867       && get_attr_type (insn) == TYPE_BTABLE_BRANCH)
4868     return 4;
4869   /* Millicode insn with an unfilled delay slot.  */
4870   else if (GET_CODE (insn) == INSN
4871            && GET_CODE (pat) != SEQUENCE
4872            && GET_CODE (pat) != USE
4873            && GET_CODE (pat) != CLOBBER
4874            && get_attr_type (insn) == TYPE_MILLI)
4875     return 4;
4876   /* Block move pattern.  */
4877   else if (GET_CODE (insn) == INSN
4878            && GET_CODE (pat) == PARALLEL
4879            && GET_CODE (XVECEXP (pat, 0, 0)) == SET
4880            && GET_CODE (XEXP (XVECEXP (pat, 0, 0), 0)) == MEM
4881            && GET_CODE (XEXP (XVECEXP (pat, 0, 0), 1)) == MEM
4882            && GET_MODE (XEXP (XVECEXP (pat, 0, 0), 0)) == BLKmode
4883            && GET_MODE (XEXP (XVECEXP (pat, 0, 0), 1)) == BLKmode)
4884     return compute_movmem_length (insn) - 4;
4885   /* Block clear pattern.  */
4886   else if (GET_CODE (insn) == INSN
4887            && GET_CODE (pat) == PARALLEL
4888            && GET_CODE (XVECEXP (pat, 0, 0)) == SET
4889            && GET_CODE (XEXP (XVECEXP (pat, 0, 0), 0)) == MEM
4890            && XEXP (XVECEXP (pat, 0, 0), 1) == const0_rtx
4891            && GET_MODE (XEXP (XVECEXP (pat, 0, 0), 0)) == BLKmode)
4892     return compute_clrmem_length (insn) - 4;
4893   /* Conditional branch with an unfilled delay slot.  */
4894   else if (GET_CODE (insn) == JUMP_INSN && ! simplejump_p (insn))
4895     {
4896       /* Adjust a short backwards conditional with an unfilled delay slot.  */
4897       if (GET_CODE (pat) == SET
4898           && length == 4
4899           && JUMP_LABEL (insn) != NULL_RTX
4900           && ! forward_branch_p (insn))
4901         return 4;
4902       else if (GET_CODE (pat) == PARALLEL
4903                && get_attr_type (insn) == TYPE_PARALLEL_BRANCH
4904                && length == 4)
4905         return 4;
4906       /* Adjust dbra insn with short backwards conditional branch with
4907          unfilled delay slot -- only for case where counter is in a
4908          general register register.  */
4909       else if (GET_CODE (pat) == PARALLEL
4910                && GET_CODE (XVECEXP (pat, 0, 1)) == SET
4911                && GET_CODE (XEXP (XVECEXP (pat, 0, 1), 0)) == REG
4912                && ! FP_REG_P (XEXP (XVECEXP (pat, 0, 1), 0))
4913                && length == 4
4914                && ! forward_branch_p (insn))
4915         return 4;
4916       else
4917         return 0;
4918     }
4919   return 0;
4920 }
4921
4922 /* Implement the TARGET_PRINT_OPERAND_PUNCT_VALID_P hook.  */
4923
4924 static bool
4925 pa_print_operand_punct_valid_p (unsigned char code)
4926 {
4927   if (code == '@'
4928       || code == '#'
4929       || code == '*'
4930       || code == '^')
4931     return true;
4932
4933   return false;
4934 }
4935
4936 /* Print operand X (an rtx) in assembler syntax to file FILE.
4937    CODE is a letter or dot (`z' in `%z0') or 0 if no letter was specified.
4938    For `%' followed by punctuation, CODE is the punctuation and X is null.  */
4939
4940 void
4941 print_operand (FILE *file, rtx x, int code)
4942 {
4943   switch (code)
4944     {
4945     case '#':
4946       /* Output a 'nop' if there's nothing for the delay slot.  */
4947       if (dbr_sequence_length () == 0)
4948         fputs ("\n\tnop", file);
4949       return;
4950     case '*':
4951       /* Output a nullification completer if there's nothing for the */
4952       /* delay slot or nullification is requested.  */
4953       if (dbr_sequence_length () == 0 ||
4954           (final_sequence &&
4955            INSN_ANNULLED_BRANCH_P (XVECEXP (final_sequence, 0, 0))))
4956         fputs (",n", file);
4957       return;
4958     case 'R':
4959       /* Print out the second register name of a register pair.
4960          I.e., R (6) => 7.  */
4961       fputs (reg_names[REGNO (x) + 1], file);
4962       return;
4963     case 'r':
4964       /* A register or zero.  */
4965       if (x == const0_rtx
4966           || (x == CONST0_RTX (DFmode))
4967           || (x == CONST0_RTX (SFmode)))
4968         {
4969           fputs ("%r0", file);
4970           return;
4971         }
4972       else
4973         break;
4974     case 'f':
4975       /* A register or zero (floating point).  */
4976       if (x == const0_rtx
4977           || (x == CONST0_RTX (DFmode))
4978           || (x == CONST0_RTX (SFmode)))
4979         {
4980           fputs ("%fr0", file);
4981           return;
4982         }
4983       else
4984         break;
4985     case 'A':
4986       {
4987         rtx xoperands[2];
4988
4989         xoperands[0] = XEXP (XEXP (x, 0), 0);
4990         xoperands[1] = XVECEXP (XEXP (XEXP (x, 0), 1), 0, 0);
4991         output_global_address (file, xoperands[1], 0);
4992         fprintf (file, "(%s)", reg_names [REGNO (xoperands[0])]);
4993         return;
4994       }
4995
4996     case 'C':                   /* Plain (C)ondition */
4997     case 'X':
4998       switch (GET_CODE (x))
4999         {
5000         case EQ:
5001           fputs ("=", file);  break;
5002         case NE:
5003           fputs ("<>", file);  break;
5004         case GT:
5005           fputs (">", file);  break;
5006         case GE:
5007           fputs (">=", file);  break;
5008         case GEU:
5009           fputs (">>=", file);  break;
5010         case GTU:
5011           fputs (">>", file);  break;
5012         case LT:
5013           fputs ("<", file);  break;
5014         case LE:
5015           fputs ("<=", file);  break;
5016         case LEU:
5017           fputs ("<<=", file);  break;
5018         case LTU:
5019           fputs ("<<", file);  break;
5020         default:
5021           gcc_unreachable ();
5022         }
5023       return;
5024     case 'N':                   /* Condition, (N)egated */
5025       switch (GET_CODE (x))
5026         {
5027         case EQ:
5028           fputs ("<>", file);  break;
5029         case NE:
5030           fputs ("=", file);  break;
5031         case GT:
5032           fputs ("<=", file);  break;
5033         case GE:
5034           fputs ("<", file);  break;
5035         case GEU:
5036           fputs ("<<", file);  break;
5037         case GTU:
5038           fputs ("<<=", file);  break;
5039         case LT:
5040           fputs (">=", file);  break;
5041         case LE:
5042           fputs (">", file);  break;
5043         case LEU:
5044           fputs (">>", file);  break;
5045         case LTU:
5046           fputs (">>=", file);  break;
5047         default:
5048           gcc_unreachable ();
5049         }
5050       return;
5051     /* For floating point comparisons.  Note that the output
5052        predicates are the complement of the desired mode.  The
5053        conditions for GT, GE, LT, LE and LTGT cause an invalid
5054        operation exception if the result is unordered and this
5055        exception is enabled in the floating-point status register.  */
5056     case 'Y':
5057       switch (GET_CODE (x))
5058         {
5059         case EQ:
5060           fputs ("!=", file);  break;
5061         case NE:
5062           fputs ("=", file);  break;
5063         case GT:
5064           fputs ("!>", file);  break;
5065         case GE:
5066           fputs ("!>=", file);  break;
5067         case LT:
5068           fputs ("!<", file);  break;
5069         case LE:
5070           fputs ("!<=", file);  break;
5071         case LTGT:
5072           fputs ("!<>", file);  break;
5073         case UNLE:
5074           fputs ("!?<=", file);  break;
5075         case UNLT:
5076           fputs ("!?<", file);  break;
5077         case UNGE:
5078           fputs ("!?>=", file);  break;
5079         case UNGT:
5080           fputs ("!?>", file);  break;
5081         case UNEQ:
5082           fputs ("!?=", file);  break;
5083         case UNORDERED:
5084           fputs ("!?", file);  break;
5085         case ORDERED:
5086           fputs ("?", file);  break;
5087         default:
5088           gcc_unreachable ();
5089         }
5090       return;
5091     case 'S':                   /* Condition, operands are (S)wapped.  */
5092       switch (GET_CODE (x))
5093         {
5094         case EQ:
5095           fputs ("=", file);  break;
5096         case NE:
5097           fputs ("<>", file);  break;
5098         case GT:
5099           fputs ("<", file);  break;
5100         case GE:
5101           fputs ("<=", file);  break;
5102         case GEU:
5103           fputs ("<<=", file);  break;
5104         case GTU:
5105           fputs ("<<", file);  break;
5106         case LT:
5107           fputs (">", file);  break;
5108         case LE:
5109           fputs (">=", file);  break;
5110         case LEU:
5111           fputs (">>=", file);  break;
5112         case LTU:
5113           fputs (">>", file);  break;
5114         default:
5115           gcc_unreachable ();
5116         }
5117       return;
5118     case 'B':                   /* Condition, (B)oth swapped and negate.  */
5119       switch (GET_CODE (x))
5120         {
5121         case EQ:
5122           fputs ("<>", file);  break;
5123         case NE:
5124           fputs ("=", file);  break;
5125         case GT:
5126           fputs (">=", file);  break;
5127         case GE:
5128           fputs (">", file);  break;
5129         case GEU:
5130           fputs (">>", file);  break;
5131         case GTU:
5132           fputs (">>=", file);  break;
5133         case LT:
5134           fputs ("<=", file);  break;
5135         case LE:
5136           fputs ("<", file);  break;
5137         case LEU:
5138           fputs ("<<", file);  break;
5139         case LTU:
5140           fputs ("<<=", file);  break;
5141         default:
5142           gcc_unreachable ();
5143         }
5144       return;
5145     case 'k':
5146       gcc_assert (GET_CODE (x) == CONST_INT);
5147       fprintf (file, HOST_WIDE_INT_PRINT_DEC, ~INTVAL (x));
5148       return;
5149     case 'Q':
5150       gcc_assert (GET_CODE (x) == CONST_INT);
5151       fprintf (file, HOST_WIDE_INT_PRINT_DEC, 64 - (INTVAL (x) & 63));
5152       return;
5153     case 'L':
5154       gcc_assert (GET_CODE (x) == CONST_INT);
5155       fprintf (file, HOST_WIDE_INT_PRINT_DEC, 32 - (INTVAL (x) & 31));
5156       return;
5157     case 'O':
5158       gcc_assert (GET_CODE (x) == CONST_INT && exact_log2 (INTVAL (x)) >= 0);
5159       fprintf (file, "%d", exact_log2 (INTVAL (x)));
5160       return;
5161     case 'p':
5162       gcc_assert (GET_CODE (x) == CONST_INT);
5163       fprintf (file, HOST_WIDE_INT_PRINT_DEC, 63 - (INTVAL (x) & 63));
5164       return;
5165     case 'P':
5166       gcc_assert (GET_CODE (x) == CONST_INT);
5167       fprintf (file, HOST_WIDE_INT_PRINT_DEC, 31 - (INTVAL (x) & 31));
5168       return;
5169     case 'I':
5170       if (GET_CODE (x) == CONST_INT)
5171         fputs ("i", file);
5172       return;
5173     case 'M':
5174     case 'F':
5175       switch (GET_CODE (XEXP (x, 0)))
5176         {
5177         case PRE_DEC:
5178         case PRE_INC:
5179           if (ASSEMBLER_DIALECT == 0)
5180             fputs ("s,mb", file);
5181           else
5182             fputs (",mb", file);
5183           break;
5184         case POST_DEC:
5185         case POST_INC:
5186           if (ASSEMBLER_DIALECT == 0)
5187             fputs ("s,ma", file);
5188           else
5189             fputs (",ma", file);
5190           break;
5191         case PLUS:
5192           if (GET_CODE (XEXP (XEXP (x, 0), 0)) == REG
5193               && GET_CODE (XEXP (XEXP (x, 0), 1)) == REG)
5194             {
5195               if (ASSEMBLER_DIALECT == 0)
5196                 fputs ("x", file);
5197             }
5198           else if (GET_CODE (XEXP (XEXP (x, 0), 0)) == MULT
5199                    || GET_CODE (XEXP (XEXP (x, 0), 1)) == MULT)
5200             {
5201               if (ASSEMBLER_DIALECT == 0)
5202                 fputs ("x,s", file);
5203               else
5204                 fputs (",s", file);
5205             }
5206           else if (code == 'F' && ASSEMBLER_DIALECT == 0)
5207             fputs ("s", file);
5208           break;
5209         default:
5210           if (code == 'F' && ASSEMBLER_DIALECT == 0)
5211             fputs ("s", file);
5212           break;
5213         }
5214       return;
5215     case 'G':
5216       output_global_address (file, x, 0);
5217       return;
5218     case 'H':
5219       output_global_address (file, x, 1);
5220       return;
5221     case 0:                     /* Don't do anything special */
5222       break;
5223     case 'Z':
5224       {
5225         unsigned op[3];
5226         compute_zdepwi_operands (INTVAL (x), op);
5227         fprintf (file, "%d,%d,%d", op[0], op[1], op[2]);
5228         return;
5229       }
5230     case 'z':
5231       {
5232         unsigned op[3];
5233         compute_zdepdi_operands (INTVAL (x), op);
5234         fprintf (file, "%d,%d,%d", op[0], op[1], op[2]);
5235         return;
5236       }
5237     case 'c':
5238       /* We can get here from a .vtable_inherit due to our
5239          CONSTANT_ADDRESS_P rejecting perfectly good constant
5240          addresses.  */
5241       break;
5242     default:
5243       gcc_unreachable ();
5244     }
5245   if (GET_CODE (x) == REG)
5246     {
5247       fputs (reg_names [REGNO (x)], file);
5248       if (TARGET_64BIT && FP_REG_P (x) && GET_MODE_SIZE (GET_MODE (x)) <= 4)
5249         {
5250           fputs ("R", file);
5251           return;
5252         }
5253       if (FP_REG_P (x)
5254           && GET_MODE_SIZE (GET_MODE (x)) <= 4
5255           && (REGNO (x) & 1) == 0)
5256         fputs ("L", file);
5257     }
5258   else if (GET_CODE (x) == MEM)
5259     {
5260       int size = GET_MODE_SIZE (GET_MODE (x));
5261       rtx base = NULL_RTX;
5262       switch (GET_CODE (XEXP (x, 0)))
5263         {
5264         case PRE_DEC:
5265         case POST_DEC:
5266           base = XEXP (XEXP (x, 0), 0);
5267           fprintf (file, "-%d(%s)", size, reg_names [REGNO (base)]);
5268           break;
5269         case PRE_INC:
5270         case POST_INC:
5271           base = XEXP (XEXP (x, 0), 0);
5272           fprintf (file, "%d(%s)", size, reg_names [REGNO (base)]);
5273           break;
5274         case PLUS:
5275           if (GET_CODE (XEXP (XEXP (x, 0), 0)) == MULT)
5276             fprintf (file, "%s(%s)",
5277                      reg_names [REGNO (XEXP (XEXP (XEXP (x, 0), 0), 0))],
5278                      reg_names [REGNO (XEXP (XEXP (x, 0), 1))]);
5279           else if (GET_CODE (XEXP (XEXP (x, 0), 1)) == MULT)
5280             fprintf (file, "%s(%s)",
5281                      reg_names [REGNO (XEXP (XEXP (XEXP (x, 0), 1), 0))],
5282                      reg_names [REGNO (XEXP (XEXP (x, 0), 0))]);
5283           else if (GET_CODE (XEXP (XEXP (x, 0), 0)) == REG
5284                    && GET_CODE (XEXP (XEXP (x, 0), 1)) == REG)
5285             {
5286               /* Because the REG_POINTER flag can get lost during reload,
5287                  GO_IF_LEGITIMATE_ADDRESS canonicalizes the order of the
5288                  index and base registers in the combined move patterns.  */
5289               rtx base = XEXP (XEXP (x, 0), 1);
5290               rtx index = XEXP (XEXP (x, 0), 0);
5291
5292               fprintf (file, "%s(%s)",
5293                        reg_names [REGNO (index)], reg_names [REGNO (base)]);
5294             }
5295           else
5296             output_address (XEXP (x, 0));
5297           break;
5298         default:
5299           output_address (XEXP (x, 0));
5300           break;
5301         }
5302     }
5303   else
5304     output_addr_const (file, x);
5305 }
5306
5307 /* output a SYMBOL_REF or a CONST expression involving a SYMBOL_REF.  */
5308
5309 void
5310 output_global_address (FILE *file, rtx x, int round_constant)
5311 {
5312
5313   /* Imagine  (high (const (plus ...))).  */
5314   if (GET_CODE (x) == HIGH)
5315     x = XEXP (x, 0);
5316
5317   if (GET_CODE (x) == SYMBOL_REF && read_only_operand (x, VOIDmode))
5318     output_addr_const (file, x);
5319   else if (GET_CODE (x) == SYMBOL_REF && !flag_pic)
5320     {
5321       output_addr_const (file, x);
5322       fputs ("-$global$", file);
5323     }
5324   else if (GET_CODE (x) == CONST)
5325     {
5326       const char *sep = "";
5327       int offset = 0;           /* assembler wants -$global$ at end */
5328       rtx base = NULL_RTX;
5329
5330       switch (GET_CODE (XEXP (XEXP (x, 0), 0)))
5331         {
5332         case SYMBOL_REF:
5333           base = XEXP (XEXP (x, 0), 0);
5334           output_addr_const (file, base);
5335           break;
5336         case CONST_INT:
5337           offset = INTVAL (XEXP (XEXP (x, 0), 0));
5338           break;
5339         default:
5340           gcc_unreachable ();
5341         }
5342
5343       switch (GET_CODE (XEXP (XEXP (x, 0), 1)))
5344         {
5345         case SYMBOL_REF:
5346           base = XEXP (XEXP (x, 0), 1);
5347           output_addr_const (file, base);
5348           break;
5349         case CONST_INT:
5350           offset = INTVAL (XEXP (XEXP (x, 0), 1));
5351           break;
5352         default:
5353           gcc_unreachable ();
5354         }
5355
5356       /* How bogus.  The compiler is apparently responsible for
5357          rounding the constant if it uses an LR field selector.
5358
5359          The linker and/or assembler seem a better place since
5360          they have to do this kind of thing already.
5361
5362          If we fail to do this, HP's optimizing linker may eliminate
5363          an addil, but not update the ldw/stw/ldo instruction that
5364          uses the result of the addil.  */
5365       if (round_constant)
5366         offset = ((offset + 0x1000) & ~0x1fff);
5367
5368       switch (GET_CODE (XEXP (x, 0)))
5369         {
5370         case PLUS:
5371           if (offset < 0)
5372             {
5373               offset = -offset;
5374               sep = "-";
5375             }
5376           else
5377             sep = "+";
5378           break;
5379
5380         case MINUS:
5381           gcc_assert (GET_CODE (XEXP (XEXP (x, 0), 0)) == SYMBOL_REF);
5382           sep = "-";
5383           break;
5384
5385         default:
5386           gcc_unreachable ();
5387         }
5388       
5389       if (!read_only_operand (base, VOIDmode) && !flag_pic)
5390         fputs ("-$global$", file);
5391       if (offset)
5392         fprintf (file, "%s%d", sep, offset);
5393     }
5394   else
5395     output_addr_const (file, x);
5396 }
5397
5398 /* Output boilerplate text to appear at the beginning of the file.
5399    There are several possible versions.  */
5400 #define aputs(x) fputs(x, asm_out_file)
5401 static inline void
5402 pa_file_start_level (void)
5403 {
5404   if (TARGET_64BIT)
5405     aputs ("\t.LEVEL 2.0w\n");
5406   else if (TARGET_PA_20)
5407     aputs ("\t.LEVEL 2.0\n");
5408   else if (TARGET_PA_11)
5409     aputs ("\t.LEVEL 1.1\n");
5410   else
5411     aputs ("\t.LEVEL 1.0\n");
5412 }
5413
5414 static inline void
5415 pa_file_start_space (int sortspace)
5416 {
5417   aputs ("\t.SPACE $PRIVATE$");
5418   if (sortspace)
5419     aputs (",SORT=16");
5420   aputs ("\n\t.SUBSPA $DATA$,QUAD=1,ALIGN=8,ACCESS=31"
5421          "\n\t.SUBSPA $BSS$,QUAD=1,ALIGN=8,ACCESS=31,ZERO,SORT=82"
5422          "\n\t.SPACE $TEXT$");
5423   if (sortspace)
5424     aputs (",SORT=8");
5425   aputs ("\n\t.SUBSPA $LIT$,QUAD=0,ALIGN=8,ACCESS=44"
5426          "\n\t.SUBSPA $CODE$,QUAD=0,ALIGN=8,ACCESS=44,CODE_ONLY\n");
5427 }
5428
5429 static inline void
5430 pa_file_start_file (int want_version)
5431 {
5432   if (write_symbols != NO_DEBUG)
5433     {
5434       output_file_directive (asm_out_file, main_input_filename);
5435       if (want_version)
5436         aputs ("\t.version\t\"01.01\"\n");
5437     }
5438 }
5439
5440 static inline void
5441 pa_file_start_mcount (const char *aswhat)
5442 {
5443   if (profile_flag)
5444     fprintf (asm_out_file, "\t.IMPORT _mcount,%s\n", aswhat);
5445 }
5446   
5447 static void
5448 pa_elf_file_start (void)
5449 {
5450   pa_file_start_level ();
5451   pa_file_start_mcount ("ENTRY");
5452   pa_file_start_file (0);
5453 }
5454
5455 static void
5456 pa_som_file_start (void)
5457 {
5458   pa_file_start_level ();
5459   pa_file_start_space (0);
5460   aputs ("\t.IMPORT $global$,DATA\n"
5461          "\t.IMPORT $$dyncall,MILLICODE\n");
5462   pa_file_start_mcount ("CODE");
5463   pa_file_start_file (0);
5464 }
5465
5466 static void
5467 pa_linux_file_start (void)
5468 {
5469   pa_file_start_file (1);
5470   pa_file_start_level ();
5471   pa_file_start_mcount ("CODE");
5472 }
5473
5474 static void
5475 pa_hpux64_gas_file_start (void)
5476 {
5477   pa_file_start_level ();
5478 #ifdef ASM_OUTPUT_TYPE_DIRECTIVE
5479   if (profile_flag)
5480     ASM_OUTPUT_TYPE_DIRECTIVE (asm_out_file, "_mcount", "function");
5481 #endif
5482   pa_file_start_file (1);
5483 }
5484
5485 static void
5486 pa_hpux64_hpas_file_start (void)
5487 {
5488   pa_file_start_level ();
5489   pa_file_start_space (1);
5490   pa_file_start_mcount ("CODE");
5491   pa_file_start_file (0);
5492 }
5493 #undef aputs
5494
5495 /* Search the deferred plabel list for SYMBOL and return its internal
5496    label.  If an entry for SYMBOL is not found, a new entry is created.  */
5497
5498 rtx
5499 get_deferred_plabel (rtx symbol)
5500 {
5501   const char *fname = XSTR (symbol, 0);
5502   size_t i;
5503
5504   /* See if we have already put this function on the list of deferred
5505      plabels.  This list is generally small, so a liner search is not
5506      too ugly.  If it proves too slow replace it with something faster.  */
5507   for (i = 0; i < n_deferred_plabels; i++)
5508     if (strcmp (fname, XSTR (deferred_plabels[i].symbol, 0)) == 0)
5509       break;
5510
5511   /* If the deferred plabel list is empty, or this entry was not found
5512      on the list, create a new entry on the list.  */
5513   if (deferred_plabels == NULL || i == n_deferred_plabels)
5514     {
5515       tree id;
5516
5517       if (deferred_plabels == 0)
5518         deferred_plabels =  ggc_alloc_deferred_plabel ();
5519       else
5520         deferred_plabels = GGC_RESIZEVEC (struct deferred_plabel,
5521                                           deferred_plabels,
5522                                           n_deferred_plabels + 1);
5523
5524       i = n_deferred_plabels++;
5525       deferred_plabels[i].internal_label = gen_label_rtx ();
5526       deferred_plabels[i].symbol = symbol;
5527
5528       /* Gross.  We have just implicitly taken the address of this
5529          function.  Mark it in the same manner as assemble_name.  */
5530       id = maybe_get_identifier (targetm.strip_name_encoding (fname));
5531       if (id)
5532         mark_referenced (id);
5533     }
5534
5535   return deferred_plabels[i].internal_label;
5536 }
5537
5538 static void
5539 output_deferred_plabels (void)
5540 {
5541   size_t i;
5542
5543   /* If we have some deferred plabels, then we need to switch into the
5544      data or readonly data section, and align it to a 4 byte boundary
5545      before outputting the deferred plabels.  */
5546   if (n_deferred_plabels)
5547     {
5548       switch_to_section (flag_pic ? data_section : readonly_data_section);
5549       ASM_OUTPUT_ALIGN (asm_out_file, TARGET_64BIT ? 3 : 2);
5550     }
5551
5552   /* Now output the deferred plabels.  */
5553   for (i = 0; i < n_deferred_plabels; i++)
5554     {
5555       targetm.asm_out.internal_label (asm_out_file, "L",
5556                  CODE_LABEL_NUMBER (deferred_plabels[i].internal_label));
5557       assemble_integer (deferred_plabels[i].symbol,
5558                         TARGET_64BIT ? 8 : 4, TARGET_64BIT ? 64 : 32, 1);
5559     }
5560 }
5561
5562 #if HPUX_LONG_DOUBLE_LIBRARY
5563 /* Initialize optabs to point to HPUX long double emulation routines.  */
5564 static void
5565 pa_hpux_init_libfuncs (void)
5566 {
5567   set_optab_libfunc (add_optab, TFmode, "_U_Qfadd");
5568   set_optab_libfunc (sub_optab, TFmode, "_U_Qfsub");
5569   set_optab_libfunc (smul_optab, TFmode, "_U_Qfmpy");
5570   set_optab_libfunc (sdiv_optab, TFmode, "_U_Qfdiv");
5571   set_optab_libfunc (smin_optab, TFmode, "_U_Qmin");
5572   set_optab_libfunc (smax_optab, TFmode, "_U_Qfmax");
5573   set_optab_libfunc (sqrt_optab, TFmode, "_U_Qfsqrt");
5574   set_optab_libfunc (abs_optab, TFmode, "_U_Qfabs");
5575   set_optab_libfunc (neg_optab, TFmode, "_U_Qfneg");
5576
5577   set_optab_libfunc (eq_optab, TFmode, "_U_Qfeq");
5578   set_optab_libfunc (ne_optab, TFmode, "_U_Qfne");
5579   set_optab_libfunc (gt_optab, TFmode, "_U_Qfgt");
5580   set_optab_libfunc (ge_optab, TFmode, "_U_Qfge");
5581   set_optab_libfunc (lt_optab, TFmode, "_U_Qflt");
5582   set_optab_libfunc (le_optab, TFmode, "_U_Qfle");
5583   set_optab_libfunc (unord_optab, TFmode, "_U_Qfunord");
5584
5585   set_conv_libfunc (sext_optab,   TFmode, SFmode, "_U_Qfcnvff_sgl_to_quad");
5586   set_conv_libfunc (sext_optab,   TFmode, DFmode, "_U_Qfcnvff_dbl_to_quad");
5587   set_conv_libfunc (trunc_optab,  SFmode, TFmode, "_U_Qfcnvff_quad_to_sgl");
5588   set_conv_libfunc (trunc_optab,  DFmode, TFmode, "_U_Qfcnvff_quad_to_dbl");
5589
5590   set_conv_libfunc (sfix_optab,   SImode, TFmode, TARGET_64BIT
5591                                                   ? "__U_Qfcnvfxt_quad_to_sgl"
5592                                                   : "_U_Qfcnvfxt_quad_to_sgl");
5593   set_conv_libfunc (sfix_optab,   DImode, TFmode, "_U_Qfcnvfxt_quad_to_dbl");
5594   set_conv_libfunc (ufix_optab,   SImode, TFmode, "_U_Qfcnvfxt_quad_to_usgl");
5595   set_conv_libfunc (ufix_optab,   DImode, TFmode, "_U_Qfcnvfxt_quad_to_udbl");
5596
5597   set_conv_libfunc (sfloat_optab, TFmode, SImode, "_U_Qfcnvxf_sgl_to_quad");
5598   set_conv_libfunc (sfloat_optab, TFmode, DImode, "_U_Qfcnvxf_dbl_to_quad");
5599   set_conv_libfunc (ufloat_optab, TFmode, SImode, "_U_Qfcnvxf_usgl_to_quad");
5600   set_conv_libfunc (ufloat_optab, TFmode, DImode, "_U_Qfcnvxf_udbl_to_quad");
5601 }
5602 #endif
5603
5604 /* HP's millicode routines mean something special to the assembler.
5605    Keep track of which ones we have used.  */
5606
5607 enum millicodes { remI, remU, divI, divU, mulI, end1000 };
5608 static void import_milli (enum millicodes);
5609 static char imported[(int) end1000];
5610 static const char * const milli_names[] = {"remI", "remU", "divI", "divU", "mulI"};
5611 static const char import_string[] = ".IMPORT $$....,MILLICODE";
5612 #define MILLI_START 10
5613
5614 static void
5615 import_milli (enum millicodes code)
5616 {
5617   char str[sizeof (import_string)];
5618
5619   if (!imported[(int) code])
5620     {
5621       imported[(int) code] = 1;
5622       strcpy (str, import_string);
5623       strncpy (str + MILLI_START, milli_names[(int) code], 4);
5624       output_asm_insn (str, 0);
5625     }
5626 }
5627
5628 /* The register constraints have put the operands and return value in
5629    the proper registers.  */
5630
5631 const char *
5632 output_mul_insn (int unsignedp ATTRIBUTE_UNUSED, rtx insn)
5633 {
5634   import_milli (mulI);
5635   return output_millicode_call (insn, gen_rtx_SYMBOL_REF (Pmode, "$$mulI"));
5636 }
5637
5638 /* Emit the rtl for doing a division by a constant.  */
5639
5640 /* Do magic division millicodes exist for this value? */
5641 const int magic_milli[]= {0, 0, 0, 1, 0, 1, 1, 1, 0, 1, 1, 0, 1, 0, 1, 1};
5642
5643 /* We'll use an array to keep track of the magic millicodes and
5644    whether or not we've used them already. [n][0] is signed, [n][1] is
5645    unsigned.  */
5646
5647 static int div_milli[16][2];
5648
5649 int
5650 emit_hpdiv_const (rtx *operands, int unsignedp)
5651 {
5652   if (GET_CODE (operands[2]) == CONST_INT
5653       && INTVAL (operands[2]) > 0
5654       && INTVAL (operands[2]) < 16
5655       && magic_milli[INTVAL (operands[2])])
5656     {
5657       rtx ret = gen_rtx_REG (SImode, TARGET_64BIT ? 2 : 31);
5658
5659       emit_move_insn (gen_rtx_REG (SImode, 26), operands[1]);
5660       emit
5661         (gen_rtx_PARALLEL
5662          (VOIDmode,
5663           gen_rtvec (6, gen_rtx_SET (VOIDmode, gen_rtx_REG (SImode, 29),
5664                                      gen_rtx_fmt_ee (unsignedp ? UDIV : DIV,
5665                                                      SImode,
5666                                                      gen_rtx_REG (SImode, 26),
5667                                                      operands[2])),
5668                      gen_rtx_CLOBBER (VOIDmode, operands[4]),
5669                      gen_rtx_CLOBBER (VOIDmode, operands[3]),
5670                      gen_rtx_CLOBBER (VOIDmode, gen_rtx_REG (SImode, 26)),
5671                      gen_rtx_CLOBBER (VOIDmode, gen_rtx_REG (SImode, 25)),
5672                      gen_rtx_CLOBBER (VOIDmode, ret))));
5673       emit_move_insn (operands[0], gen_rtx_REG (SImode, 29));
5674       return 1;
5675     }
5676   return 0;
5677 }
5678
5679 const char *
5680 output_div_insn (rtx *operands, int unsignedp, rtx insn)
5681 {
5682   int divisor;
5683
5684   /* If the divisor is a constant, try to use one of the special
5685      opcodes .*/
5686   if (GET_CODE (operands[0]) == CONST_INT)
5687     {
5688       static char buf[100];
5689       divisor = INTVAL (operands[0]);
5690       if (!div_milli[divisor][unsignedp])
5691         {
5692           div_milli[divisor][unsignedp] = 1;
5693           if (unsignedp)
5694             output_asm_insn (".IMPORT $$divU_%0,MILLICODE", operands);
5695           else
5696             output_asm_insn (".IMPORT $$divI_%0,MILLICODE", operands);
5697         }
5698       if (unsignedp)
5699         {
5700           sprintf (buf, "$$divU_" HOST_WIDE_INT_PRINT_DEC,
5701                    INTVAL (operands[0]));
5702           return output_millicode_call (insn,
5703                                         gen_rtx_SYMBOL_REF (SImode, buf));
5704         }
5705       else
5706         {
5707           sprintf (buf, "$$divI_" HOST_WIDE_INT_PRINT_DEC,
5708                    INTVAL (operands[0]));
5709           return output_millicode_call (insn,
5710                                         gen_rtx_SYMBOL_REF (SImode, buf));
5711         }
5712     }
5713   /* Divisor isn't a special constant.  */
5714   else
5715     {
5716       if (unsignedp)
5717         {
5718           import_milli (divU);
5719           return output_millicode_call (insn,
5720                                         gen_rtx_SYMBOL_REF (SImode, "$$divU"));
5721         }
5722       else
5723         {
5724           import_milli (divI);
5725           return output_millicode_call (insn,
5726                                         gen_rtx_SYMBOL_REF (SImode, "$$divI"));
5727         }
5728     }
5729 }
5730
5731 /* Output a $$rem millicode to do mod.  */
5732
5733 const char *
5734 output_mod_insn (int unsignedp, rtx insn)
5735 {
5736   if (unsignedp)
5737     {
5738       import_milli (remU);
5739       return output_millicode_call (insn,
5740                                     gen_rtx_SYMBOL_REF (SImode, "$$remU"));
5741     }
5742   else
5743     {
5744       import_milli (remI);
5745       return output_millicode_call (insn,
5746                                     gen_rtx_SYMBOL_REF (SImode, "$$remI"));
5747     }
5748 }
5749
5750 void
5751 output_arg_descriptor (rtx call_insn)
5752 {
5753   const char *arg_regs[4];
5754   enum machine_mode arg_mode;
5755   rtx link;
5756   int i, output_flag = 0;
5757   int regno;
5758
5759   /* We neither need nor want argument location descriptors for the
5760      64bit runtime environment or the ELF32 environment.  */
5761   if (TARGET_64BIT || TARGET_ELF32)
5762     return;
5763
5764   for (i = 0; i < 4; i++)
5765     arg_regs[i] = 0;
5766
5767   /* Specify explicitly that no argument relocations should take place
5768      if using the portable runtime calling conventions.  */
5769   if (TARGET_PORTABLE_RUNTIME)
5770     {
5771       fputs ("\t.CALL ARGW0=NO,ARGW1=NO,ARGW2=NO,ARGW3=NO,RETVAL=NO\n",
5772              asm_out_file);
5773       return;
5774     }
5775
5776   gcc_assert (GET_CODE (call_insn) == CALL_INSN);
5777   for (link = CALL_INSN_FUNCTION_USAGE (call_insn);
5778        link; link = XEXP (link, 1))
5779     {
5780       rtx use = XEXP (link, 0);
5781
5782       if (! (GET_CODE (use) == USE
5783              && GET_CODE (XEXP (use, 0)) == REG
5784              && FUNCTION_ARG_REGNO_P (REGNO (XEXP (use, 0)))))
5785         continue;
5786
5787       arg_mode = GET_MODE (XEXP (use, 0));
5788       regno = REGNO (XEXP (use, 0));
5789       if (regno >= 23 && regno <= 26)
5790         {
5791           arg_regs[26 - regno] = "GR";
5792           if (arg_mode == DImode)
5793             arg_regs[25 - regno] = "GR";
5794         }
5795       else if (regno >= 32 && regno <= 39)
5796         {
5797           if (arg_mode == SFmode)
5798             arg_regs[(regno - 32) / 2] = "FR";
5799           else
5800             {
5801 #ifndef HP_FP_ARG_DESCRIPTOR_REVERSED
5802               arg_regs[(regno - 34) / 2] = "FR";
5803               arg_regs[(regno - 34) / 2 + 1] = "FU";
5804 #else
5805               arg_regs[(regno - 34) / 2] = "FU";
5806               arg_regs[(regno - 34) / 2 + 1] = "FR";
5807 #endif
5808             }
5809         }
5810     }
5811   fputs ("\t.CALL ", asm_out_file);
5812   for (i = 0; i < 4; i++)
5813     {
5814       if (arg_regs[i])
5815         {
5816           if (output_flag++)
5817             fputc (',', asm_out_file);
5818           fprintf (asm_out_file, "ARGW%d=%s", i, arg_regs[i]);
5819         }
5820     }
5821   fputc ('\n', asm_out_file);
5822 }
5823 \f
5824 /* Inform reload about cases where moving X with a mode MODE to a register in
5825    RCLASS requires an extra scratch or immediate register.  Return the class
5826    needed for the immediate register.  */
5827
5828 static reg_class_t
5829 pa_secondary_reload (bool in_p, rtx x, reg_class_t rclass_i,
5830                      enum machine_mode mode, secondary_reload_info *sri)
5831 {
5832   int regno;
5833   enum reg_class rclass = (enum reg_class) rclass_i;
5834
5835   /* Handle the easy stuff first.  */
5836   if (rclass == R1_REGS)
5837     return NO_REGS;
5838
5839   if (REG_P (x))
5840     {
5841       regno = REGNO (x);
5842       if (rclass == BASE_REG_CLASS && regno < FIRST_PSEUDO_REGISTER)
5843         return NO_REGS;
5844     }
5845   else
5846     regno = -1;
5847
5848   /* If we have something like (mem (mem (...)), we can safely assume the
5849      inner MEM will end up in a general register after reloading, so there's
5850      no need for a secondary reload.  */
5851   if (GET_CODE (x) == MEM && GET_CODE (XEXP (x, 0)) == MEM)
5852     return NO_REGS;
5853
5854   /* Trying to load a constant into a FP register during PIC code
5855      generation requires %r1 as a scratch register.  */
5856   if (flag_pic
5857       && (mode == SImode || mode == DImode)
5858       && FP_REG_CLASS_P (rclass)
5859       && (GET_CODE (x) == CONST_INT || GET_CODE (x) == CONST_DOUBLE))
5860     {
5861       sri->icode = (mode == SImode ? CODE_FOR_reload_insi_r1
5862                     : CODE_FOR_reload_indi_r1);
5863       return NO_REGS;
5864     }
5865
5866   /* Secondary reloads of symbolic operands require %r1 as a scratch
5867      register when we're generating PIC code and when the operand isn't
5868      readonly.  */
5869   if (symbolic_expression_p (x))
5870     {
5871       if (GET_CODE (x) == HIGH)
5872         x = XEXP (x, 0);
5873
5874       if (flag_pic || !read_only_operand (x, VOIDmode))
5875         {
5876           gcc_assert (mode == SImode || mode == DImode);
5877           sri->icode = (mode == SImode ? CODE_FOR_reload_insi_r1
5878                         : CODE_FOR_reload_indi_r1);
5879           return NO_REGS;
5880         }
5881     }
5882
5883   /* Profiling showed the PA port spends about 1.3% of its compilation
5884      time in true_regnum from calls inside pa_secondary_reload_class.  */
5885   if (regno >= FIRST_PSEUDO_REGISTER || GET_CODE (x) == SUBREG)
5886     regno = true_regnum (x);
5887
5888   /* In order to allow 14-bit displacements in integer loads and stores,
5889      we need to prevent reload from generating out of range integer mode
5890      loads and stores to the floating point registers.  Previously, we
5891      used to call for a secondary reload and have emit_move_sequence()
5892      fix the instruction sequence.  However, reload occasionally wouldn't
5893      generate the reload and we would end up with an invalid REG+D memory
5894      address.  So, now we use an intermediate general register for most
5895      memory loads and stores.  */
5896   if ((regno >= FIRST_PSEUDO_REGISTER || regno == -1)
5897       && GET_MODE_CLASS (mode) == MODE_INT
5898       && FP_REG_CLASS_P (rclass))
5899     {
5900       /* Reload passes (mem:SI (reg/f:DI 30 %r30) when it wants to check
5901          the secondary reload needed for a pseudo.  It never passes a
5902          REG+D address.  */
5903       if (GET_CODE (x) == MEM)
5904         {
5905           x = XEXP (x, 0);
5906
5907           /* We don't need an intermediate for indexed and LO_SUM DLT
5908              memory addresses.  When INT14_OK_STRICT is true, it might
5909              appear that we could directly allow register indirect
5910              memory addresses.  However, this doesn't work because we
5911              don't support SUBREGs in floating-point register copies
5912              and reload doesn't tell us when it's going to use a SUBREG.  */
5913           if (IS_INDEX_ADDR_P (x)
5914               || IS_LO_SUM_DLT_ADDR_P (x))
5915             return NO_REGS;
5916
5917           /* Otherwise, we need an intermediate general register.  */
5918           return GENERAL_REGS;
5919         }
5920
5921       /* Request a secondary reload with a general scratch register
5922          for everthing else.  ??? Could symbolic operands be handled
5923          directly when generating non-pic PA 2.0 code?  */
5924       sri->icode = (in_p
5925                     ? direct_optab_handler (reload_in_optab, mode)
5926                     : direct_optab_handler (reload_out_optab, mode));
5927       return NO_REGS;
5928     }
5929
5930   /* A SAR<->FP register copy requires an intermediate general register
5931      and secondary memory.  We need a secondary reload with a general
5932      scratch register for spills.  */
5933   if (rclass == SHIFT_REGS)
5934     {
5935       /* Handle spill.  */
5936       if (regno >= FIRST_PSEUDO_REGISTER || regno < 0)
5937         {
5938           sri->icode = (in_p
5939                         ? direct_optab_handler (reload_in_optab, mode)
5940                         : direct_optab_handler (reload_out_optab, mode));
5941           return NO_REGS;
5942         }
5943
5944       /* Handle FP copy.  */
5945       if (FP_REG_CLASS_P (REGNO_REG_CLASS (regno)))
5946         return GENERAL_REGS;
5947     }
5948
5949   if (regno >= 0 && regno < FIRST_PSEUDO_REGISTER
5950       && REGNO_REG_CLASS (regno) == SHIFT_REGS
5951       && FP_REG_CLASS_P (rclass))
5952     return GENERAL_REGS;
5953
5954   return NO_REGS;
5955 }
5956
5957 /* Implement TARGET_EXTRA_LIVE_ON_ENTRY.  The argument pointer
5958    is only marked as live on entry by df-scan when it is a fixed
5959    register.  It isn't a fixed register in the 64-bit runtime,
5960    so we need to mark it here.  */
5961
5962 static void
5963 pa_extra_live_on_entry (bitmap regs)
5964 {
5965   if (TARGET_64BIT)
5966     bitmap_set_bit (regs, ARG_POINTER_REGNUM);
5967 }
5968
5969 /* Implement EH_RETURN_HANDLER_RTX.  The MEM needs to be volatile
5970    to prevent it from being deleted.  */
5971
5972 rtx
5973 pa_eh_return_handler_rtx (void)
5974 {
5975   rtx tmp;
5976
5977   tmp = gen_rtx_PLUS (word_mode, hard_frame_pointer_rtx,
5978                       TARGET_64BIT ? GEN_INT (-16) : GEN_INT (-20));
5979   tmp = gen_rtx_MEM (word_mode, tmp);
5980   tmp->volatil = 1;
5981   return tmp;
5982 }
5983
5984 /* In the 32-bit runtime, arguments larger than eight bytes are passed
5985    by invisible reference.  As a GCC extension, we also pass anything
5986    with a zero or variable size by reference.
5987
5988    The 64-bit runtime does not describe passing any types by invisible
5989    reference.  The internals of GCC can't currently handle passing
5990    empty structures, and zero or variable length arrays when they are
5991    not passed entirely on the stack or by reference.  Thus, as a GCC
5992    extension, we pass these types by reference.  The HP compiler doesn't
5993    support these types, so hopefully there shouldn't be any compatibility
5994    issues.  This may have to be revisited when HP releases a C99 compiler
5995    or updates the ABI.  */
5996
5997 static bool
5998 pa_pass_by_reference (CUMULATIVE_ARGS *ca ATTRIBUTE_UNUSED,
5999                       enum machine_mode mode, const_tree type,
6000                       bool named ATTRIBUTE_UNUSED)
6001 {
6002   HOST_WIDE_INT size;
6003
6004   if (type)
6005     size = int_size_in_bytes (type);
6006   else
6007     size = GET_MODE_SIZE (mode);
6008
6009   if (TARGET_64BIT)
6010     return size <= 0;
6011   else
6012     return size <= 0 || size > 8;
6013 }
6014
6015 enum direction
6016 function_arg_padding (enum machine_mode mode, const_tree type)
6017 {
6018   if (mode == BLKmode
6019       || (TARGET_64BIT
6020           && type
6021           && (AGGREGATE_TYPE_P (type)
6022               || TREE_CODE (type) == COMPLEX_TYPE
6023               || TREE_CODE (type) == VECTOR_TYPE)))
6024     {
6025       /* Return none if justification is not required.  */
6026       if (type
6027           && TREE_CODE (TYPE_SIZE (type)) == INTEGER_CST
6028           && (int_size_in_bytes (type) * BITS_PER_UNIT) % PARM_BOUNDARY == 0)
6029         return none;
6030
6031       /* The directions set here are ignored when a BLKmode argument larger
6032          than a word is placed in a register.  Different code is used for
6033          the stack and registers.  This makes it difficult to have a
6034          consistent data representation for both the stack and registers.
6035          For both runtimes, the justification and padding for arguments on
6036          the stack and in registers should be identical.  */
6037       if (TARGET_64BIT)
6038         /* The 64-bit runtime specifies left justification for aggregates.  */
6039         return upward;
6040       else
6041         /* The 32-bit runtime architecture specifies right justification.
6042            When the argument is passed on the stack, the argument is padded
6043            with garbage on the left.  The HP compiler pads with zeros.  */
6044         return downward;
6045     }
6046
6047   if (GET_MODE_BITSIZE (mode) < PARM_BOUNDARY)
6048     return downward;
6049   else
6050     return none;
6051 }
6052
6053 \f
6054 /* Do what is necessary for `va_start'.  We look at the current function
6055    to determine if stdargs or varargs is used and fill in an initial
6056    va_list.  A pointer to this constructor is returned.  */
6057
6058 static rtx
6059 hppa_builtin_saveregs (void)
6060 {
6061   rtx offset, dest;
6062   tree fntype = TREE_TYPE (current_function_decl);
6063   int argadj = ((!stdarg_p (fntype))
6064                 ? UNITS_PER_WORD : 0);
6065
6066   if (argadj)
6067     offset = plus_constant (crtl->args.arg_offset_rtx, argadj);
6068   else
6069     offset = crtl->args.arg_offset_rtx;
6070
6071   if (TARGET_64BIT)
6072     {
6073       int i, off;
6074
6075       /* Adjust for varargs/stdarg differences.  */
6076       if (argadj)
6077         offset = plus_constant (crtl->args.arg_offset_rtx, -argadj);
6078       else
6079         offset = crtl->args.arg_offset_rtx;
6080
6081       /* We need to save %r26 .. %r19 inclusive starting at offset -64
6082          from the incoming arg pointer and growing to larger addresses.  */
6083       for (i = 26, off = -64; i >= 19; i--, off += 8)
6084         emit_move_insn (gen_rtx_MEM (word_mode,
6085                                      plus_constant (arg_pointer_rtx, off)),
6086                         gen_rtx_REG (word_mode, i));
6087
6088       /* The incoming args pointer points just beyond the flushback area;
6089          normally this is not a serious concern.  However, when we are doing
6090          varargs/stdargs we want to make the arg pointer point to the start
6091          of the incoming argument area.  */
6092       emit_move_insn (virtual_incoming_args_rtx,
6093                       plus_constant (arg_pointer_rtx, -64));
6094
6095       /* Now return a pointer to the first anonymous argument.  */
6096       return copy_to_reg (expand_binop (Pmode, add_optab,
6097                                         virtual_incoming_args_rtx,
6098                                         offset, 0, 0, OPTAB_LIB_WIDEN));
6099     }
6100
6101   /* Store general registers on the stack.  */
6102   dest = gen_rtx_MEM (BLKmode,
6103                       plus_constant (crtl->args.internal_arg_pointer,
6104                                      -16));
6105   set_mem_alias_set (dest, get_varargs_alias_set ());
6106   set_mem_align (dest, BITS_PER_WORD);
6107   move_block_from_reg (23, dest, 4);
6108
6109   /* move_block_from_reg will emit code to store the argument registers
6110      individually as scalar stores.
6111
6112      However, other insns may later load from the same addresses for
6113      a structure load (passing a struct to a varargs routine).
6114
6115      The alias code assumes that such aliasing can never happen, so we
6116      have to keep memory referencing insns from moving up beyond the
6117      last argument register store.  So we emit a blockage insn here.  */
6118   emit_insn (gen_blockage ());
6119
6120   return copy_to_reg (expand_binop (Pmode, add_optab,
6121                                     crtl->args.internal_arg_pointer,
6122                                     offset, 0, 0, OPTAB_LIB_WIDEN));
6123 }
6124
6125 static void
6126 hppa_va_start (tree valist, rtx nextarg)
6127 {
6128   nextarg = expand_builtin_saveregs ();
6129   std_expand_builtin_va_start (valist, nextarg);
6130 }
6131
6132 static tree
6133 hppa_gimplify_va_arg_expr (tree valist, tree type, gimple_seq *pre_p,
6134                            gimple_seq *post_p)
6135 {
6136   if (TARGET_64BIT)
6137     {
6138       /* Args grow upward.  We can use the generic routines.  */
6139       return std_gimplify_va_arg_expr (valist, type, pre_p, post_p);
6140     }
6141   else /* !TARGET_64BIT */
6142     {
6143       tree ptr = build_pointer_type (type);
6144       tree valist_type;
6145       tree t, u;
6146       unsigned int size, ofs;
6147       bool indirect;
6148
6149       indirect = pass_by_reference (NULL, TYPE_MODE (type), type, 0);
6150       if (indirect)
6151         {
6152           type = ptr;
6153           ptr = build_pointer_type (type);
6154         }
6155       size = int_size_in_bytes (type);
6156       valist_type = TREE_TYPE (valist);
6157
6158       /* Args grow down.  Not handled by generic routines.  */
6159
6160       u = fold_convert (sizetype, size_in_bytes (type));
6161       u = fold_build1 (NEGATE_EXPR, sizetype, u);
6162       t = build2 (POINTER_PLUS_EXPR, valist_type, valist, u);
6163
6164       /* Align to 4 or 8 byte boundary depending on argument size.  */
6165
6166       u = build_int_cst (TREE_TYPE (t), (HOST_WIDE_INT)(size > 4 ? -8 : -4));
6167       t = build2 (BIT_AND_EXPR, TREE_TYPE (t), t, u);
6168       t = fold_convert (valist_type, t);
6169
6170       t = build2 (MODIFY_EXPR, valist_type, valist, t);
6171
6172       ofs = (8 - size) % 4;
6173       if (ofs != 0)
6174         {
6175           u = size_int (ofs);
6176           t = build2 (POINTER_PLUS_EXPR, valist_type, t, u);
6177         }
6178
6179       t = fold_convert (ptr, t);
6180       t = build_va_arg_indirect_ref (t);
6181
6182       if (indirect)
6183         t = build_va_arg_indirect_ref (t);
6184
6185       return t;
6186     }
6187 }
6188
6189 /* True if MODE is valid for the target.  By "valid", we mean able to
6190    be manipulated in non-trivial ways.  In particular, this means all
6191    the arithmetic is supported.
6192
6193    Currently, TImode is not valid as the HP 64-bit runtime documentation
6194    doesn't document the alignment and calling conventions for this type. 
6195    Thus, we return false when PRECISION is 2 * BITS_PER_WORD and
6196    2 * BITS_PER_WORD isn't equal LONG_LONG_TYPE_SIZE.  */
6197
6198 static bool
6199 pa_scalar_mode_supported_p (enum machine_mode mode)
6200 {
6201   int precision = GET_MODE_PRECISION (mode);
6202
6203   switch (GET_MODE_CLASS (mode))
6204     {
6205     case MODE_PARTIAL_INT:
6206     case MODE_INT:
6207       if (precision == CHAR_TYPE_SIZE)
6208         return true;
6209       if (precision == SHORT_TYPE_SIZE)
6210         return true;
6211       if (precision == INT_TYPE_SIZE)
6212         return true;
6213       if (precision == LONG_TYPE_SIZE)
6214         return true;
6215       if (precision == LONG_LONG_TYPE_SIZE)
6216         return true;
6217       return false;
6218
6219     case MODE_FLOAT:
6220       if (precision == FLOAT_TYPE_SIZE)
6221         return true;
6222       if (precision == DOUBLE_TYPE_SIZE)
6223         return true;
6224       if (precision == LONG_DOUBLE_TYPE_SIZE)
6225         return true;
6226       return false;
6227
6228     case MODE_DECIMAL_FLOAT:
6229       return false;
6230
6231     default:
6232       gcc_unreachable ();
6233     }
6234 }
6235
6236 /* Return TRUE if INSN, a jump insn, has an unfilled delay slot and
6237    it branches into the delay slot.  Otherwise, return FALSE.  */
6238
6239 static bool
6240 branch_to_delay_slot_p (rtx insn)
6241 {
6242   rtx jump_insn;
6243
6244   if (dbr_sequence_length ())
6245     return FALSE;
6246
6247   jump_insn = next_active_insn (JUMP_LABEL (insn));
6248   while (insn)
6249     {
6250       insn = next_active_insn (insn);
6251       if (jump_insn == insn)
6252         return TRUE;
6253
6254       /* We can't rely on the length of asms.  So, we return FALSE when
6255          the branch is followed by an asm.  */
6256       if (!insn
6257           || GET_CODE (PATTERN (insn)) == ASM_INPUT
6258           || extract_asm_operands (PATTERN (insn)) != NULL_RTX
6259           || get_attr_length (insn) > 0)
6260         break;
6261     }
6262
6263   return FALSE;
6264 }
6265
6266 /* Return TRUE if INSN, a forward jump insn, needs a nop in its delay slot.
6267
6268    This occurs when INSN has an unfilled delay slot and is followed
6269    by an asm.  Disaster can occur if the asm is empty and the jump
6270    branches into the delay slot.  So, we add a nop in the delay slot
6271    when this occurs.  */
6272
6273 static bool
6274 branch_needs_nop_p (rtx insn)
6275 {
6276   rtx jump_insn;
6277
6278   if (dbr_sequence_length ())
6279     return FALSE;
6280
6281   jump_insn = next_active_insn (JUMP_LABEL (insn));
6282   while (insn)
6283     {
6284       insn = next_active_insn (insn);
6285       if (!insn || jump_insn == insn)
6286         return TRUE;
6287
6288       if (!(GET_CODE (PATTERN (insn)) == ASM_INPUT
6289            || extract_asm_operands (PATTERN (insn)) != NULL_RTX)
6290           && get_attr_length (insn) > 0)
6291         break;
6292     }
6293
6294   return FALSE;
6295 }
6296
6297 /* Return TRUE if INSN, a forward jump insn, can use nullification
6298    to skip the following instruction.  This avoids an extra cycle due
6299    to a mis-predicted branch when we fall through.  */
6300
6301 static bool
6302 use_skip_p (rtx insn)
6303 {
6304   rtx jump_insn = next_active_insn (JUMP_LABEL (insn));
6305
6306   while (insn)
6307     {
6308       insn = next_active_insn (insn);
6309
6310       /* We can't rely on the length of asms, so we can't skip asms.  */
6311       if (!insn
6312           || GET_CODE (PATTERN (insn)) == ASM_INPUT
6313           || extract_asm_operands (PATTERN (insn)) != NULL_RTX)
6314         break;
6315       if (get_attr_length (insn) == 4
6316           && jump_insn == next_active_insn (insn))
6317         return TRUE;
6318       if (get_attr_length (insn) > 0)
6319         break;
6320     }
6321
6322   return FALSE;
6323 }
6324
6325 /* This routine handles all the normal conditional branch sequences we
6326    might need to generate.  It handles compare immediate vs compare
6327    register, nullification of delay slots, varying length branches,
6328    negated branches, and all combinations of the above.  It returns the
6329    output appropriate to emit the branch corresponding to all given
6330    parameters.  */
6331
6332 const char *
6333 output_cbranch (rtx *operands, int negated, rtx insn)
6334 {
6335   static char buf[100];
6336   bool useskip;
6337   int nullify = INSN_ANNULLED_BRANCH_P (insn);
6338   int length = get_attr_length (insn);
6339   int xdelay;
6340
6341   /* A conditional branch to the following instruction (e.g. the delay slot)
6342      is asking for a disaster.  This can happen when not optimizing and
6343      when jump optimization fails.
6344
6345      While it is usually safe to emit nothing, this can fail if the
6346      preceding instruction is a nullified branch with an empty delay
6347      slot and the same branch target as this branch.  We could check
6348      for this but jump optimization should eliminate nop jumps.  It
6349      is always safe to emit a nop.  */
6350   if (branch_to_delay_slot_p (insn))
6351     return "nop";
6352
6353   /* The doubleword form of the cmpib instruction doesn't have the LEU
6354      and GTU conditions while the cmpb instruction does.  Since we accept
6355      zero for cmpb, we must ensure that we use cmpb for the comparison.  */
6356   if (GET_MODE (operands[1]) == DImode && operands[2] == const0_rtx)
6357     operands[2] = gen_rtx_REG (DImode, 0);
6358   if (GET_MODE (operands[2]) == DImode && operands[1] == const0_rtx)
6359     operands[1] = gen_rtx_REG (DImode, 0);
6360
6361   /* If this is a long branch with its delay slot unfilled, set `nullify'
6362      as it can nullify the delay slot and save a nop.  */
6363   if (length == 8 && dbr_sequence_length () == 0)
6364     nullify = 1;
6365
6366   /* If this is a short forward conditional branch which did not get
6367      its delay slot filled, the delay slot can still be nullified.  */
6368   if (! nullify && length == 4 && dbr_sequence_length () == 0)
6369     nullify = forward_branch_p (insn);
6370
6371   /* A forward branch over a single nullified insn can be done with a
6372      comclr instruction.  This avoids a single cycle penalty due to
6373      mis-predicted branch if we fall through (branch not taken).  */
6374   useskip = (length == 4 && nullify) ? use_skip_p (insn) : FALSE;
6375
6376   switch (length)
6377     {
6378       /* All short conditional branches except backwards with an unfilled
6379          delay slot.  */
6380       case 4:
6381         if (useskip)
6382           strcpy (buf, "{com%I2clr,|cmp%I2clr,}");
6383         else
6384           strcpy (buf, "{com%I2b,|cmp%I2b,}");
6385         if (GET_MODE (operands[1]) == DImode)
6386           strcat (buf, "*");
6387         if (negated)
6388           strcat (buf, "%B3");
6389         else
6390           strcat (buf, "%S3");
6391         if (useskip)
6392           strcat (buf, " %2,%r1,%%r0");
6393         else if (nullify)
6394           {
6395             if (branch_needs_nop_p (insn))
6396               strcat (buf, ",n %2,%r1,%0%#");
6397             else
6398               strcat (buf, ",n %2,%r1,%0");
6399           }
6400         else
6401           strcat (buf, " %2,%r1,%0");
6402         break;
6403
6404      /* All long conditionals.  Note a short backward branch with an
6405         unfilled delay slot is treated just like a long backward branch
6406         with an unfilled delay slot.  */
6407       case 8:
6408         /* Handle weird backwards branch with a filled delay slot
6409            which is nullified.  */
6410         if (dbr_sequence_length () != 0
6411             && ! forward_branch_p (insn)
6412             && nullify)
6413           {
6414             strcpy (buf, "{com%I2b,|cmp%I2b,}");
6415             if (GET_MODE (operands[1]) == DImode)
6416               strcat (buf, "*");
6417             if (negated)
6418               strcat (buf, "%S3");
6419             else
6420               strcat (buf, "%B3");
6421             strcat (buf, ",n %2,%r1,.+12\n\tb %0");
6422           }
6423         /* Handle short backwards branch with an unfilled delay slot.
6424            Using a comb;nop rather than comiclr;bl saves 1 cycle for both
6425            taken and untaken branches.  */
6426         else if (dbr_sequence_length () == 0
6427                  && ! forward_branch_p (insn)
6428                  && INSN_ADDRESSES_SET_P ()
6429                  && VAL_14_BITS_P (INSN_ADDRESSES (INSN_UID (JUMP_LABEL (insn)))
6430                                     - INSN_ADDRESSES (INSN_UID (insn)) - 8))
6431           {
6432             strcpy (buf, "{com%I2b,|cmp%I2b,}");
6433             if (GET_MODE (operands[1]) == DImode)
6434               strcat (buf, "*");
6435             if (negated)
6436               strcat (buf, "%B3 %2,%r1,%0%#");
6437             else
6438               strcat (buf, "%S3 %2,%r1,%0%#");
6439           }
6440         else
6441           {
6442             strcpy (buf, "{com%I2clr,|cmp%I2clr,}");
6443             if (GET_MODE (operands[1]) == DImode)
6444               strcat (buf, "*");
6445             if (negated)
6446               strcat (buf, "%S3");
6447             else
6448               strcat (buf, "%B3");
6449             if (nullify)
6450               strcat (buf, " %2,%r1,%%r0\n\tb,n %0");
6451             else
6452               strcat (buf, " %2,%r1,%%r0\n\tb %0");
6453           }
6454         break;
6455
6456       default:
6457         /* The reversed conditional branch must branch over one additional
6458            instruction if the delay slot is filled and needs to be extracted
6459            by output_lbranch.  If the delay slot is empty or this is a
6460            nullified forward branch, the instruction after the reversed
6461            condition branch must be nullified.  */
6462         if (dbr_sequence_length () == 0
6463             || (nullify && forward_branch_p (insn)))
6464           {
6465             nullify = 1;
6466             xdelay = 0;
6467             operands[4] = GEN_INT (length);
6468           }
6469         else
6470           {
6471             xdelay = 1;
6472             operands[4] = GEN_INT (length + 4);
6473           }
6474
6475         /* Create a reversed conditional branch which branches around
6476            the following insns.  */
6477         if (GET_MODE (operands[1]) != DImode)
6478           {
6479             if (nullify)
6480               {
6481                 if (negated)
6482                   strcpy (buf,
6483                     "{com%I2b,%S3,n %2,%r1,.+%4|cmp%I2b,%S3,n %2,%r1,.+%4}");
6484                 else
6485                   strcpy (buf,
6486                     "{com%I2b,%B3,n %2,%r1,.+%4|cmp%I2b,%B3,n %2,%r1,.+%4}");
6487               }
6488             else
6489               {
6490                 if (negated)
6491                   strcpy (buf,
6492                     "{com%I2b,%S3 %2,%r1,.+%4|cmp%I2b,%S3 %2,%r1,.+%4}");
6493                 else
6494                   strcpy (buf,
6495                     "{com%I2b,%B3 %2,%r1,.+%4|cmp%I2b,%B3 %2,%r1,.+%4}");
6496               }
6497           }
6498         else
6499           {
6500             if (nullify)
6501               {
6502                 if (negated)
6503                   strcpy (buf,
6504                     "{com%I2b,*%S3,n %2,%r1,.+%4|cmp%I2b,*%S3,n %2,%r1,.+%4}");
6505                 else
6506                   strcpy (buf,
6507                     "{com%I2b,*%B3,n %2,%r1,.+%4|cmp%I2b,*%B3,n %2,%r1,.+%4}");
6508               }
6509             else
6510               {
6511                 if (negated)
6512                   strcpy (buf,
6513                     "{com%I2b,*%S3 %2,%r1,.+%4|cmp%I2b,*%S3 %2,%r1,.+%4}");
6514                 else
6515                   strcpy (buf,
6516                     "{com%I2b,*%B3 %2,%r1,.+%4|cmp%I2b,*%B3 %2,%r1,.+%4}");
6517               }
6518           }
6519
6520         output_asm_insn (buf, operands);
6521         return output_lbranch (operands[0], insn, xdelay);
6522     }
6523   return buf;
6524 }
6525
6526 /* This routine handles output of long unconditional branches that
6527    exceed the maximum range of a simple branch instruction.  Since
6528    we don't have a register available for the branch, we save register
6529    %r1 in the frame marker, load the branch destination DEST into %r1,
6530    execute the branch, and restore %r1 in the delay slot of the branch.
6531
6532    Since long branches may have an insn in the delay slot and the
6533    delay slot is used to restore %r1, we in general need to extract
6534    this insn and execute it before the branch.  However, to facilitate
6535    use of this function by conditional branches, we also provide an
6536    option to not extract the delay insn so that it will be emitted
6537    after the long branch.  So, if there is an insn in the delay slot,
6538    it is extracted if XDELAY is nonzero.
6539
6540    The lengths of the various long-branch sequences are 20, 16 and 24
6541    bytes for the portable runtime, non-PIC and PIC cases, respectively.  */
6542
6543 const char *
6544 output_lbranch (rtx dest, rtx insn, int xdelay)
6545 {
6546   rtx xoperands[2];
6547  
6548   xoperands[0] = dest;
6549
6550   /* First, free up the delay slot.  */
6551   if (xdelay && dbr_sequence_length () != 0)
6552     {
6553       /* We can't handle a jump in the delay slot.  */
6554       gcc_assert (GET_CODE (NEXT_INSN (insn)) != JUMP_INSN);
6555
6556       final_scan_insn (NEXT_INSN (insn), asm_out_file,
6557                        optimize, 0, NULL);
6558
6559       /* Now delete the delay insn.  */
6560       SET_INSN_DELETED (NEXT_INSN (insn));
6561     }
6562
6563   /* Output an insn to save %r1.  The runtime documentation doesn't
6564      specify whether the "Clean Up" slot in the callers frame can
6565      be clobbered by the callee.  It isn't copied by HP's builtin
6566      alloca, so this suggests that it can be clobbered if necessary.
6567      The "Static Link" location is copied by HP builtin alloca, so
6568      we avoid using it.  Using the cleanup slot might be a problem
6569      if we have to interoperate with languages that pass cleanup
6570      information.  However, it should be possible to handle these
6571      situations with GCC's asm feature.
6572
6573      The "Current RP" slot is reserved for the called procedure, so
6574      we try to use it when we don't have a frame of our own.  It's
6575      rather unlikely that we won't have a frame when we need to emit
6576      a very long branch.
6577
6578      Really the way to go long term is a register scavenger; goto
6579      the target of the jump and find a register which we can use
6580      as a scratch to hold the value in %r1.  Then, we wouldn't have
6581      to free up the delay slot or clobber a slot that may be needed
6582      for other purposes.  */
6583   if (TARGET_64BIT)
6584     {
6585       if (actual_fsize == 0 && !df_regs_ever_live_p (2))
6586         /* Use the return pointer slot in the frame marker.  */
6587         output_asm_insn ("std %%r1,-16(%%r30)", xoperands);
6588       else
6589         /* Use the slot at -40 in the frame marker since HP builtin
6590            alloca doesn't copy it.  */
6591         output_asm_insn ("std %%r1,-40(%%r30)", xoperands);
6592     }
6593   else
6594     {
6595       if (actual_fsize == 0 && !df_regs_ever_live_p (2))
6596         /* Use the return pointer slot in the frame marker.  */
6597         output_asm_insn ("stw %%r1,-20(%%r30)", xoperands);
6598       else
6599         /* Use the "Clean Up" slot in the frame marker.  In GCC,
6600            the only other use of this location is for copying a
6601            floating point double argument from a floating-point
6602            register to two general registers.  The copy is done
6603            as an "atomic" operation when outputting a call, so it
6604            won't interfere with our using the location here.  */
6605         output_asm_insn ("stw %%r1,-12(%%r30)", xoperands);
6606     }
6607
6608   if (TARGET_PORTABLE_RUNTIME)
6609     {
6610       output_asm_insn ("ldil L'%0,%%r1", xoperands);
6611       output_asm_insn ("ldo R'%0(%%r1),%%r1", xoperands);
6612       output_asm_insn ("bv %%r0(%%r1)", xoperands);
6613     }
6614   else if (flag_pic)
6615     {
6616       output_asm_insn ("{bl|b,l} .+8,%%r1", xoperands);
6617       if (TARGET_SOM || !TARGET_GAS)
6618         {
6619           xoperands[1] = gen_label_rtx ();
6620           output_asm_insn ("addil L'%l0-%l1,%%r1", xoperands);
6621           targetm.asm_out.internal_label (asm_out_file, "L",
6622                                           CODE_LABEL_NUMBER (xoperands[1]));
6623           output_asm_insn ("ldo R'%l0-%l1(%%r1),%%r1", xoperands);
6624         }
6625       else
6626         {
6627           output_asm_insn ("addil L'%l0-$PIC_pcrel$0+4,%%r1", xoperands);
6628           output_asm_insn ("ldo R'%l0-$PIC_pcrel$0+8(%%r1),%%r1", xoperands);
6629         }
6630       output_asm_insn ("bv %%r0(%%r1)", xoperands);
6631     }
6632   else
6633     /* Now output a very long branch to the original target.  */
6634     output_asm_insn ("ldil L'%l0,%%r1\n\tbe R'%l0(%%sr4,%%r1)", xoperands);
6635
6636   /* Now restore the value of %r1 in the delay slot.  */
6637   if (TARGET_64BIT)
6638     {
6639       if (actual_fsize == 0 && !df_regs_ever_live_p (2))
6640         return "ldd -16(%%r30),%%r1";
6641       else
6642         return "ldd -40(%%r30),%%r1";
6643     }
6644   else
6645     {
6646       if (actual_fsize == 0 && !df_regs_ever_live_p (2))
6647         return "ldw -20(%%r30),%%r1";
6648       else
6649         return "ldw -12(%%r30),%%r1";
6650     }
6651 }
6652
6653 /* This routine handles all the branch-on-bit conditional branch sequences we
6654    might need to generate.  It handles nullification of delay slots,
6655    varying length branches, negated branches and all combinations of the
6656    above.  it returns the appropriate output template to emit the branch.  */
6657
6658 const char *
6659 output_bb (rtx *operands ATTRIBUTE_UNUSED, int negated, rtx insn, int which)
6660 {
6661   static char buf[100];
6662   bool useskip;
6663   int nullify = INSN_ANNULLED_BRANCH_P (insn);
6664   int length = get_attr_length (insn);
6665   int xdelay;
6666
6667   /* A conditional branch to the following instruction (e.g. the delay slot) is
6668      asking for a disaster.  I do not think this can happen as this pattern
6669      is only used when optimizing; jump optimization should eliminate the
6670      jump.  But be prepared just in case.  */
6671
6672   if (branch_to_delay_slot_p (insn))
6673     return "nop";
6674
6675   /* If this is a long branch with its delay slot unfilled, set `nullify'
6676      as it can nullify the delay slot and save a nop.  */
6677   if (length == 8 && dbr_sequence_length () == 0)
6678     nullify = 1;
6679
6680   /* If this is a short forward conditional branch which did not get
6681      its delay slot filled, the delay slot can still be nullified.  */
6682   if (! nullify && length == 4 && dbr_sequence_length () == 0)
6683     nullify = forward_branch_p (insn);
6684
6685   /* A forward branch over a single nullified insn can be done with a
6686      extrs instruction.  This avoids a single cycle penalty due to
6687      mis-predicted branch if we fall through (branch not taken).  */
6688   useskip = (length == 4 && nullify) ? use_skip_p (insn) : FALSE;
6689
6690   switch (length)
6691     {
6692
6693       /* All short conditional branches except backwards with an unfilled
6694          delay slot.  */
6695       case 4:
6696         if (useskip)
6697           strcpy (buf, "{extrs,|extrw,s,}");
6698         else
6699           strcpy (buf, "bb,");
6700         if (useskip && GET_MODE (operands[0]) == DImode)
6701           strcpy (buf, "extrd,s,*");
6702         else if (GET_MODE (operands[0]) == DImode)
6703           strcpy (buf, "bb,*");
6704         if ((which == 0 && negated)
6705              || (which == 1 && ! negated))
6706           strcat (buf, ">=");
6707         else
6708           strcat (buf, "<");
6709         if (useskip)
6710           strcat (buf, " %0,%1,1,%%r0");
6711         else if (nullify && negated)
6712           {
6713             if (branch_needs_nop_p (insn))
6714               strcat (buf, ",n %0,%1,%3%#");
6715             else
6716               strcat (buf, ",n %0,%1,%3");
6717           }
6718         else if (nullify && ! negated)
6719           {
6720             if (branch_needs_nop_p (insn))
6721               strcat (buf, ",n %0,%1,%2%#");
6722             else
6723               strcat (buf, ",n %0,%1,%2");
6724           }
6725         else if (! nullify && negated)
6726           strcat (buf, " %0,%1,%3");
6727         else if (! nullify && ! negated)
6728           strcat (buf, " %0,%1,%2");
6729         break;
6730
6731      /* All long conditionals.  Note a short backward branch with an
6732         unfilled delay slot is treated just like a long backward branch
6733         with an unfilled delay slot.  */
6734       case 8:
6735         /* Handle weird backwards branch with a filled delay slot
6736            which is nullified.  */
6737         if (dbr_sequence_length () != 0
6738             && ! forward_branch_p (insn)
6739             && nullify)
6740           {
6741             strcpy (buf, "bb,");
6742             if (GET_MODE (operands[0]) == DImode)
6743               strcat (buf, "*");
6744             if ((which == 0 && negated)
6745                 || (which == 1 && ! negated))
6746               strcat (buf, "<");
6747             else
6748               strcat (buf, ">=");
6749             if (negated)
6750               strcat (buf, ",n %0,%1,.+12\n\tb %3");
6751             else
6752               strcat (buf, ",n %0,%1,.+12\n\tb %2");
6753           }
6754         /* Handle short backwards branch with an unfilled delay slot.
6755            Using a bb;nop rather than extrs;bl saves 1 cycle for both
6756            taken and untaken branches.  */
6757         else if (dbr_sequence_length () == 0
6758                  && ! forward_branch_p (insn)
6759                  && INSN_ADDRESSES_SET_P ()
6760                  && VAL_14_BITS_P (INSN_ADDRESSES (INSN_UID (JUMP_LABEL (insn)))
6761                                     - INSN_ADDRESSES (INSN_UID (insn)) - 8))
6762           {
6763             strcpy (buf, "bb,");
6764             if (GET_MODE (operands[0]) == DImode)
6765               strcat (buf, "*");
6766             if ((which == 0 && negated)
6767                 || (which == 1 && ! negated))
6768               strcat (buf, ">=");
6769             else
6770               strcat (buf, "<");
6771             if (negated)
6772               strcat (buf, " %0,%1,%3%#");
6773             else
6774               strcat (buf, " %0,%1,%2%#");
6775           }
6776         else
6777           {
6778             if (GET_MODE (operands[0]) == DImode)
6779               strcpy (buf, "extrd,s,*");
6780             else
6781               strcpy (buf, "{extrs,|extrw,s,}");
6782             if ((which == 0 && negated)
6783                 || (which == 1 && ! negated))
6784               strcat (buf, "<");
6785             else
6786               strcat (buf, ">=");
6787             if (nullify && negated)
6788               strcat (buf, " %0,%1,1,%%r0\n\tb,n %3");
6789             else if (nullify && ! negated)
6790               strcat (buf, " %0,%1,1,%%r0\n\tb,n %2");
6791             else if (negated)
6792               strcat (buf, " %0,%1,1,%%r0\n\tb %3");
6793             else
6794               strcat (buf, " %0,%1,1,%%r0\n\tb %2");
6795           }
6796         break;
6797
6798       default:
6799         /* The reversed conditional branch must branch over one additional
6800            instruction if the delay slot is filled and needs to be extracted
6801            by output_lbranch.  If the delay slot is empty or this is a
6802            nullified forward branch, the instruction after the reversed
6803            condition branch must be nullified.  */
6804         if (dbr_sequence_length () == 0
6805             || (nullify && forward_branch_p (insn)))
6806           {
6807             nullify = 1;
6808             xdelay = 0;
6809             operands[4] = GEN_INT (length);
6810           }
6811         else
6812           {
6813             xdelay = 1;
6814             operands[4] = GEN_INT (length + 4);
6815           }
6816
6817         if (GET_MODE (operands[0]) == DImode)
6818           strcpy (buf, "bb,*");
6819         else
6820           strcpy (buf, "bb,");
6821         if ((which == 0 && negated)
6822             || (which == 1 && !negated))
6823           strcat (buf, "<");
6824         else
6825           strcat (buf, ">=");
6826         if (nullify)
6827           strcat (buf, ",n %0,%1,.+%4");
6828         else
6829           strcat (buf, " %0,%1,.+%4");
6830         output_asm_insn (buf, operands);
6831         return output_lbranch (negated ? operands[3] : operands[2],
6832                                insn, xdelay);
6833     }
6834   return buf;
6835 }
6836
6837 /* This routine handles all the branch-on-variable-bit conditional branch
6838    sequences we might need to generate.  It handles nullification of delay
6839    slots, varying length branches, negated branches and all combinations
6840    of the above.  it returns the appropriate output template to emit the
6841    branch.  */
6842
6843 const char *
6844 output_bvb (rtx *operands ATTRIBUTE_UNUSED, int negated, rtx insn, int which)
6845 {
6846   static char buf[100];
6847   bool useskip;
6848   int nullify = INSN_ANNULLED_BRANCH_P (insn);
6849   int length = get_attr_length (insn);
6850   int xdelay;
6851
6852   /* A conditional branch to the following instruction (e.g. the delay slot) is
6853      asking for a disaster.  I do not think this can happen as this pattern
6854      is only used when optimizing; jump optimization should eliminate the
6855      jump.  But be prepared just in case.  */
6856
6857   if (branch_to_delay_slot_p (insn))
6858     return "nop";
6859
6860   /* If this is a long branch with its delay slot unfilled, set `nullify'
6861      as it can nullify the delay slot and save a nop.  */
6862   if (length == 8 && dbr_sequence_length () == 0)
6863     nullify = 1;
6864
6865   /* If this is a short forward conditional branch which did not get
6866      its delay slot filled, the delay slot can still be nullified.  */
6867   if (! nullify && length == 4 && dbr_sequence_length () == 0)
6868     nullify = forward_branch_p (insn);
6869
6870   /* A forward branch over a single nullified insn can be done with a
6871      extrs instruction.  This avoids a single cycle penalty due to
6872      mis-predicted branch if we fall through (branch not taken).  */
6873   useskip = (length == 4 && nullify) ? use_skip_p (insn) : FALSE;
6874
6875   switch (length)
6876     {
6877
6878       /* All short conditional branches except backwards with an unfilled
6879          delay slot.  */
6880       case 4:
6881         if (useskip)
6882           strcpy (buf, "{vextrs,|extrw,s,}");
6883         else
6884           strcpy (buf, "{bvb,|bb,}");
6885         if (useskip && GET_MODE (operands[0]) == DImode)
6886           strcpy (buf, "extrd,s,*");
6887         else if (GET_MODE (operands[0]) == DImode)
6888           strcpy (buf, "bb,*");
6889         if ((which == 0 && negated)
6890              || (which == 1 && ! negated))
6891           strcat (buf, ">=");
6892         else
6893           strcat (buf, "<");
6894         if (useskip)
6895           strcat (buf, "{ %0,1,%%r0| %0,%%sar,1,%%r0}");
6896         else if (nullify && negated)
6897           {
6898             if (branch_needs_nop_p (insn))
6899               strcat (buf, "{,n %0,%3%#|,n %0,%%sar,%3%#}");
6900             else
6901               strcat (buf, "{,n %0,%3|,n %0,%%sar,%3}");
6902           }
6903         else if (nullify && ! negated)
6904           {
6905             if (branch_needs_nop_p (insn))
6906               strcat (buf, "{,n %0,%2%#|,n %0,%%sar,%2%#}");
6907             else
6908               strcat (buf, "{,n %0,%2|,n %0,%%sar,%2}");
6909           }
6910         else if (! nullify && negated)
6911           strcat (buf, "{ %0,%3| %0,%%sar,%3}");
6912         else if (! nullify && ! negated)
6913           strcat (buf, "{ %0,%2| %0,%%sar,%2}");
6914         break;
6915
6916      /* All long conditionals.  Note a short backward branch with an
6917         unfilled delay slot is treated just like a long backward branch
6918         with an unfilled delay slot.  */
6919       case 8:
6920         /* Handle weird backwards branch with a filled delay slot
6921            which is nullified.  */
6922         if (dbr_sequence_length () != 0
6923             && ! forward_branch_p (insn)
6924             && nullify)
6925           {
6926             strcpy (buf, "{bvb,|bb,}");
6927             if (GET_MODE (operands[0]) == DImode)
6928               strcat (buf, "*");
6929             if ((which == 0 && negated)
6930                 || (which == 1 && ! negated))
6931               strcat (buf, "<");
6932             else
6933               strcat (buf, ">=");
6934             if (negated)
6935               strcat (buf, "{,n %0,.+12\n\tb %3|,n %0,%%sar,.+12\n\tb %3}");
6936             else
6937               strcat (buf, "{,n %0,.+12\n\tb %2|,n %0,%%sar,.+12\n\tb %2}");
6938           }
6939         /* Handle short backwards branch with an unfilled delay slot.
6940            Using a bb;nop rather than extrs;bl saves 1 cycle for both
6941            taken and untaken branches.  */
6942         else if (dbr_sequence_length () == 0
6943                  && ! forward_branch_p (insn)
6944                  && INSN_ADDRESSES_SET_P ()
6945                  && VAL_14_BITS_P (INSN_ADDRESSES (INSN_UID (JUMP_LABEL (insn)))
6946                                     - INSN_ADDRESSES (INSN_UID (insn)) - 8))
6947           {
6948             strcpy (buf, "{bvb,|bb,}");
6949             if (GET_MODE (operands[0]) == DImode)
6950               strcat (buf, "*");
6951             if ((which == 0 && negated)
6952                 || (which == 1 && ! negated))
6953               strcat (buf, ">=");
6954             else
6955               strcat (buf, "<");
6956             if (negated)
6957               strcat (buf, "{ %0,%3%#| %0,%%sar,%3%#}");
6958             else
6959               strcat (buf, "{ %0,%2%#| %0,%%sar,%2%#}");
6960           }
6961         else
6962           {
6963             strcpy (buf, "{vextrs,|extrw,s,}");
6964             if (GET_MODE (operands[0]) == DImode)
6965               strcpy (buf, "extrd,s,*");
6966             if ((which == 0 && negated)
6967                 || (which == 1 && ! negated))
6968               strcat (buf, "<");
6969             else
6970               strcat (buf, ">=");
6971             if (nullify && negated)
6972               strcat (buf, "{ %0,1,%%r0\n\tb,n %3| %0,%%sar,1,%%r0\n\tb,n %3}");
6973             else if (nullify && ! negated)
6974               strcat (buf, "{ %0,1,%%r0\n\tb,n %2| %0,%%sar,1,%%r0\n\tb,n %2}");
6975             else if (negated)
6976               strcat (buf, "{ %0,1,%%r0\n\tb %3| %0,%%sar,1,%%r0\n\tb %3}");
6977             else
6978               strcat (buf, "{ %0,1,%%r0\n\tb %2| %0,%%sar,1,%%r0\n\tb %2}");
6979           }
6980         break;
6981
6982       default:
6983         /* The reversed conditional branch must branch over one additional
6984            instruction if the delay slot is filled and needs to be extracted
6985            by output_lbranch.  If the delay slot is empty or this is a
6986            nullified forward branch, the instruction after the reversed
6987            condition branch must be nullified.  */
6988         if (dbr_sequence_length () == 0
6989             || (nullify && forward_branch_p (insn)))
6990           {
6991             nullify = 1;
6992             xdelay = 0;
6993             operands[4] = GEN_INT (length);
6994           }
6995         else
6996           {
6997             xdelay = 1;
6998             operands[4] = GEN_INT (length + 4);
6999           }
7000
7001         if (GET_MODE (operands[0]) == DImode)
7002           strcpy (buf, "bb,*");
7003         else
7004           strcpy (buf, "{bvb,|bb,}");
7005         if ((which == 0 && negated)
7006             || (which == 1 && !negated))
7007           strcat (buf, "<");
7008         else
7009           strcat (buf, ">=");
7010         if (nullify)
7011           strcat (buf, ",n {%0,.+%4|%0,%%sar,.+%4}");
7012         else
7013           strcat (buf, " {%0,.+%4|%0,%%sar,.+%4}");
7014         output_asm_insn (buf, operands);
7015         return output_lbranch (negated ? operands[3] : operands[2],
7016                                insn, xdelay);
7017     }
7018   return buf;
7019 }
7020
7021 /* Return the output template for emitting a dbra type insn.
7022
7023    Note it may perform some output operations on its own before
7024    returning the final output string.  */
7025 const char *
7026 output_dbra (rtx *operands, rtx insn, int which_alternative)
7027 {
7028   int length = get_attr_length (insn);
7029
7030   /* A conditional branch to the following instruction (e.g. the delay slot) is
7031      asking for a disaster.  Be prepared!  */
7032
7033   if (branch_to_delay_slot_p (insn))
7034     {
7035       if (which_alternative == 0)
7036         return "ldo %1(%0),%0";
7037       else if (which_alternative == 1)
7038         {
7039           output_asm_insn ("{fstws|fstw} %0,-16(%%r30)", operands);
7040           output_asm_insn ("ldw -16(%%r30),%4", operands);
7041           output_asm_insn ("ldo %1(%4),%4\n\tstw %4,-16(%%r30)", operands);
7042           return "{fldws|fldw} -16(%%r30),%0";
7043         }
7044       else
7045         {
7046           output_asm_insn ("ldw %0,%4", operands);
7047           return "ldo %1(%4),%4\n\tstw %4,%0";
7048         }
7049     }
7050
7051   if (which_alternative == 0)
7052     {
7053       int nullify = INSN_ANNULLED_BRANCH_P (insn);
7054       int xdelay;
7055
7056       /* If this is a long branch with its delay slot unfilled, set `nullify'
7057          as it can nullify the delay slot and save a nop.  */
7058       if (length == 8 && dbr_sequence_length () == 0)
7059         nullify = 1;
7060
7061       /* If this is a short forward conditional branch which did not get
7062          its delay slot filled, the delay slot can still be nullified.  */
7063       if (! nullify && length == 4 && dbr_sequence_length () == 0)
7064         nullify = forward_branch_p (insn);
7065
7066       switch (length)
7067         {
7068         case 4:
7069           if (nullify)
7070             {
7071               if (branch_needs_nop_p (insn))
7072                 return "addib,%C2,n %1,%0,%3%#";
7073               else
7074                 return "addib,%C2,n %1,%0,%3";
7075             }
7076           else
7077             return "addib,%C2 %1,%0,%3";
7078       
7079         case 8:
7080           /* Handle weird backwards branch with a fulled delay slot
7081              which is nullified.  */
7082           if (dbr_sequence_length () != 0
7083               && ! forward_branch_p (insn)
7084               && nullify)
7085             return "addib,%N2,n %1,%0,.+12\n\tb %3";
7086           /* Handle short backwards branch with an unfilled delay slot.
7087              Using a addb;nop rather than addi;bl saves 1 cycle for both
7088              taken and untaken branches.  */
7089           else if (dbr_sequence_length () == 0
7090                    && ! forward_branch_p (insn)
7091                    && INSN_ADDRESSES_SET_P ()
7092                    && VAL_14_BITS_P (INSN_ADDRESSES (INSN_UID (JUMP_LABEL (insn)))
7093                                       - INSN_ADDRESSES (INSN_UID (insn)) - 8))
7094               return "addib,%C2 %1,%0,%3%#";
7095
7096           /* Handle normal cases.  */
7097           if (nullify)
7098             return "addi,%N2 %1,%0,%0\n\tb,n %3";
7099           else
7100             return "addi,%N2 %1,%0,%0\n\tb %3";
7101
7102         default:
7103           /* The reversed conditional branch must branch over one additional
7104              instruction if the delay slot is filled and needs to be extracted
7105              by output_lbranch.  If the delay slot is empty or this is a
7106              nullified forward branch, the instruction after the reversed
7107              condition branch must be nullified.  */
7108           if (dbr_sequence_length () == 0
7109               || (nullify && forward_branch_p (insn)))
7110             {
7111               nullify = 1;
7112               xdelay = 0;
7113               operands[4] = GEN_INT (length);
7114             }
7115           else
7116             {
7117               xdelay = 1;
7118               operands[4] = GEN_INT (length + 4);
7119             }
7120
7121           if (nullify)
7122             output_asm_insn ("addib,%N2,n %1,%0,.+%4", operands);
7123           else
7124             output_asm_insn ("addib,%N2 %1,%0,.+%4", operands);
7125
7126           return output_lbranch (operands[3], insn, xdelay);
7127         }
7128       
7129     }
7130   /* Deal with gross reload from FP register case.  */
7131   else if (which_alternative == 1)
7132     {
7133       /* Move loop counter from FP register to MEM then into a GR,
7134          increment the GR, store the GR into MEM, and finally reload
7135          the FP register from MEM from within the branch's delay slot.  */
7136       output_asm_insn ("{fstws|fstw} %0,-16(%%r30)\n\tldw -16(%%r30),%4",
7137                        operands);
7138       output_asm_insn ("ldo %1(%4),%4\n\tstw %4,-16(%%r30)", operands);
7139       if (length == 24)
7140         return "{comb|cmpb},%S2 %%r0,%4,%3\n\t{fldws|fldw} -16(%%r30),%0";
7141       else if (length == 28)
7142         return "{comclr|cmpclr},%B2 %%r0,%4,%%r0\n\tb %3\n\t{fldws|fldw} -16(%%r30),%0";
7143       else
7144         {
7145           operands[5] = GEN_INT (length - 16);
7146           output_asm_insn ("{comb|cmpb},%B2 %%r0,%4,.+%5", operands);
7147           output_asm_insn ("{fldws|fldw} -16(%%r30),%0", operands);
7148           return output_lbranch (operands[3], insn, 0);
7149         }
7150     }
7151   /* Deal with gross reload from memory case.  */
7152   else
7153     {
7154       /* Reload loop counter from memory, the store back to memory
7155          happens in the branch's delay slot.  */
7156       output_asm_insn ("ldw %0,%4", operands);
7157       if (length == 12)
7158         return "addib,%C2 %1,%4,%3\n\tstw %4,%0";
7159       else if (length == 16)
7160         return "addi,%N2 %1,%4,%4\n\tb %3\n\tstw %4,%0";
7161       else
7162         {
7163           operands[5] = GEN_INT (length - 4);
7164           output_asm_insn ("addib,%N2 %1,%4,.+%5\n\tstw %4,%0", operands);
7165           return output_lbranch (operands[3], insn, 0);
7166         }
7167     }
7168 }
7169
7170 /* Return the output template for emitting a movb type insn.
7171
7172    Note it may perform some output operations on its own before
7173    returning the final output string.  */
7174 const char *
7175 output_movb (rtx *operands, rtx insn, int which_alternative,
7176              int reverse_comparison)
7177 {
7178   int length = get_attr_length (insn);
7179
7180   /* A conditional branch to the following instruction (e.g. the delay slot) is
7181      asking for a disaster.  Be prepared!  */
7182
7183   if (branch_to_delay_slot_p (insn))
7184     {
7185       if (which_alternative == 0)
7186         return "copy %1,%0";
7187       else if (which_alternative == 1)
7188         {
7189           output_asm_insn ("stw %1,-16(%%r30)", operands);
7190           return "{fldws|fldw} -16(%%r30),%0";
7191         }
7192       else if (which_alternative == 2)
7193         return "stw %1,%0";
7194       else
7195         return "mtsar %r1";
7196     }
7197
7198   /* Support the second variant.  */
7199   if (reverse_comparison)
7200     PUT_CODE (operands[2], reverse_condition (GET_CODE (operands[2])));
7201
7202   if (which_alternative == 0)
7203     {
7204       int nullify = INSN_ANNULLED_BRANCH_P (insn);
7205       int xdelay;
7206
7207       /* If this is a long branch with its delay slot unfilled, set `nullify'
7208          as it can nullify the delay slot and save a nop.  */
7209       if (length == 8 && dbr_sequence_length () == 0)
7210         nullify = 1;
7211
7212       /* If this is a short forward conditional branch which did not get
7213          its delay slot filled, the delay slot can still be nullified.  */
7214       if (! nullify && length == 4 && dbr_sequence_length () == 0)
7215         nullify = forward_branch_p (insn);
7216
7217       switch (length)
7218         {
7219         case 4:
7220           if (nullify)
7221             {
7222               if (branch_needs_nop_p (insn))
7223                 return "movb,%C2,n %1,%0,%3%#";
7224               else
7225                 return "movb,%C2,n %1,%0,%3";
7226             }
7227           else
7228             return "movb,%C2 %1,%0,%3";
7229
7230         case 8:
7231           /* Handle weird backwards branch with a filled delay slot
7232              which is nullified.  */
7233           if (dbr_sequence_length () != 0
7234               && ! forward_branch_p (insn)
7235               && nullify)
7236             return "movb,%N2,n %1,%0,.+12\n\tb %3";
7237
7238           /* Handle short backwards branch with an unfilled delay slot.
7239              Using a movb;nop rather than or;bl saves 1 cycle for both
7240              taken and untaken branches.  */
7241           else if (dbr_sequence_length () == 0
7242                    && ! forward_branch_p (insn)
7243                    && INSN_ADDRESSES_SET_P ()
7244                    && VAL_14_BITS_P (INSN_ADDRESSES (INSN_UID (JUMP_LABEL (insn)))
7245                                       - INSN_ADDRESSES (INSN_UID (insn)) - 8))
7246             return "movb,%C2 %1,%0,%3%#";
7247           /* Handle normal cases.  */
7248           if (nullify)
7249             return "or,%N2 %1,%%r0,%0\n\tb,n %3";
7250           else
7251             return "or,%N2 %1,%%r0,%0\n\tb %3";
7252
7253         default:
7254           /* The reversed conditional branch must branch over one additional
7255              instruction if the delay slot is filled and needs to be extracted
7256              by output_lbranch.  If the delay slot is empty or this is a
7257              nullified forward branch, the instruction after the reversed
7258              condition branch must be nullified.  */
7259           if (dbr_sequence_length () == 0
7260               || (nullify && forward_branch_p (insn)))
7261             {
7262               nullify = 1;
7263               xdelay = 0;
7264               operands[4] = GEN_INT (length);
7265             }
7266           else
7267             {
7268               xdelay = 1;
7269               operands[4] = GEN_INT (length + 4);
7270             }
7271
7272           if (nullify)
7273             output_asm_insn ("movb,%N2,n %1,%0,.+%4", operands);
7274           else
7275             output_asm_insn ("movb,%N2 %1,%0,.+%4", operands);
7276
7277           return output_lbranch (operands[3], insn, xdelay);
7278         }
7279     }
7280   /* Deal with gross reload for FP destination register case.  */
7281   else if (which_alternative == 1)
7282     {
7283       /* Move source register to MEM, perform the branch test, then
7284          finally load the FP register from MEM from within the branch's
7285          delay slot.  */
7286       output_asm_insn ("stw %1,-16(%%r30)", operands);
7287       if (length == 12)
7288         return "{comb|cmpb},%S2 %%r0,%1,%3\n\t{fldws|fldw} -16(%%r30),%0";
7289       else if (length == 16)
7290         return "{comclr|cmpclr},%B2 %%r0,%1,%%r0\n\tb %3\n\t{fldws|fldw} -16(%%r30),%0";
7291       else
7292         {
7293           operands[4] = GEN_INT (length - 4);
7294           output_asm_insn ("{comb|cmpb},%B2 %%r0,%1,.+%4", operands);
7295           output_asm_insn ("{fldws|fldw} -16(%%r30),%0", operands);
7296           return output_lbranch (operands[3], insn, 0);
7297         }
7298     }
7299   /* Deal with gross reload from memory case.  */
7300   else if (which_alternative == 2)
7301     {
7302       /* Reload loop counter from memory, the store back to memory
7303          happens in the branch's delay slot.  */
7304       if (length == 8)
7305         return "{comb|cmpb},%S2 %%r0,%1,%3\n\tstw %1,%0";
7306       else if (length == 12)
7307         return "{comclr|cmpclr},%B2 %%r0,%1,%%r0\n\tb %3\n\tstw %1,%0";
7308       else
7309         {
7310           operands[4] = GEN_INT (length);
7311           output_asm_insn ("{comb|cmpb},%B2 %%r0,%1,.+%4\n\tstw %1,%0",
7312                            operands);
7313           return output_lbranch (operands[3], insn, 0);
7314         }
7315     }
7316   /* Handle SAR as a destination.  */
7317   else
7318     {
7319       if (length == 8)
7320         return "{comb|cmpb},%S2 %%r0,%1,%3\n\tmtsar %r1";
7321       else if (length == 12)
7322         return "{comclr|cmpclr},%B2 %%r0,%1,%%r0\n\tb %3\n\tmtsar %r1";
7323       else
7324         {
7325           operands[4] = GEN_INT (length);
7326           output_asm_insn ("{comb|cmpb},%B2 %%r0,%1,.+%4\n\tmtsar %r1",
7327                            operands);
7328           return output_lbranch (operands[3], insn, 0);
7329         }
7330     }
7331 }
7332
7333 /* Copy any FP arguments in INSN into integer registers.  */
7334 static void
7335 copy_fp_args (rtx insn)
7336 {
7337   rtx link;
7338   rtx xoperands[2];
7339
7340   for (link = CALL_INSN_FUNCTION_USAGE (insn); link; link = XEXP (link, 1))
7341     {
7342       int arg_mode, regno;
7343       rtx use = XEXP (link, 0);
7344
7345       if (! (GET_CODE (use) == USE
7346           && GET_CODE (XEXP (use, 0)) == REG
7347           && FUNCTION_ARG_REGNO_P (REGNO (XEXP (use, 0)))))
7348         continue;
7349
7350       arg_mode = GET_MODE (XEXP (use, 0));
7351       regno = REGNO (XEXP (use, 0));
7352
7353       /* Is it a floating point register?  */
7354       if (regno >= 32 && regno <= 39)
7355         {
7356           /* Copy the FP register into an integer register via memory.  */
7357           if (arg_mode == SFmode)
7358             {
7359               xoperands[0] = XEXP (use, 0);
7360               xoperands[1] = gen_rtx_REG (SImode, 26 - (regno - 32) / 2);
7361               output_asm_insn ("{fstws|fstw} %0,-16(%%sr0,%%r30)", xoperands);
7362               output_asm_insn ("ldw -16(%%sr0,%%r30),%1", xoperands);
7363             }
7364           else
7365             {
7366               xoperands[0] = XEXP (use, 0);
7367               xoperands[1] = gen_rtx_REG (DImode, 25 - (regno - 34) / 2);
7368               output_asm_insn ("{fstds|fstd} %0,-16(%%sr0,%%r30)", xoperands);
7369               output_asm_insn ("ldw -12(%%sr0,%%r30),%R1", xoperands);
7370               output_asm_insn ("ldw -16(%%sr0,%%r30),%1", xoperands);
7371             }
7372         }
7373     }
7374 }
7375
7376 /* Compute length of the FP argument copy sequence for INSN.  */
7377 static int
7378 length_fp_args (rtx insn)
7379 {
7380   int length = 0;
7381   rtx link;
7382
7383   for (link = CALL_INSN_FUNCTION_USAGE (insn); link; link = XEXP (link, 1))
7384     {
7385       int arg_mode, regno;
7386       rtx use = XEXP (link, 0);
7387
7388       if (! (GET_CODE (use) == USE
7389           && GET_CODE (XEXP (use, 0)) == REG
7390           && FUNCTION_ARG_REGNO_P (REGNO (XEXP (use, 0)))))
7391         continue;
7392
7393       arg_mode = GET_MODE (XEXP (use, 0));
7394       regno = REGNO (XEXP (use, 0));
7395
7396       /* Is it a floating point register?  */
7397       if (regno >= 32 && regno <= 39)
7398         {
7399           if (arg_mode == SFmode)
7400             length += 8;
7401           else
7402             length += 12;
7403         }
7404     }
7405
7406   return length;
7407 }
7408
7409 /* Return the attribute length for the millicode call instruction INSN.
7410    The length must match the code generated by output_millicode_call.
7411    We include the delay slot in the returned length as it is better to
7412    over estimate the length than to under estimate it.  */
7413
7414 int
7415 attr_length_millicode_call (rtx insn)
7416 {
7417   unsigned long distance = -1;
7418   unsigned long total = IN_NAMED_SECTION_P (cfun->decl) ? 0 : total_code_bytes;
7419
7420   if (INSN_ADDRESSES_SET_P ())
7421     {
7422       distance = (total + insn_current_reference_address (insn));
7423       if (distance < total)
7424         distance = -1;
7425     }
7426
7427   if (TARGET_64BIT)
7428     {
7429       if (!TARGET_LONG_CALLS && distance < 7600000)
7430         return 8;
7431
7432       return 20;
7433     }
7434   else if (TARGET_PORTABLE_RUNTIME)
7435     return 24;
7436   else
7437     {
7438       if (!TARGET_LONG_CALLS && distance < 240000)
7439         return 8;
7440
7441       if (TARGET_LONG_ABS_CALL && !flag_pic)
7442         return 12;
7443
7444       return 24;
7445     }
7446 }
7447
7448 /* INSN is a function call.  It may have an unconditional jump
7449    in its delay slot.
7450
7451    CALL_DEST is the routine we are calling.  */
7452
7453 const char *
7454 output_millicode_call (rtx insn, rtx call_dest)
7455 {
7456   int attr_length = get_attr_length (insn);
7457   int seq_length = dbr_sequence_length ();
7458   int distance;
7459   rtx seq_insn;
7460   rtx xoperands[3];
7461
7462   xoperands[0] = call_dest;
7463   xoperands[2] = gen_rtx_REG (Pmode, TARGET_64BIT ? 2 : 31);
7464
7465   /* Handle the common case where we are sure that the branch will
7466      reach the beginning of the $CODE$ subspace.  The within reach
7467      form of the $$sh_func_adrs call has a length of 28.  Because
7468      it has an attribute type of multi, it never has a nonzero
7469      sequence length.  The length of the $$sh_func_adrs is the same
7470      as certain out of reach PIC calls to other routines.  */
7471   if (!TARGET_LONG_CALLS
7472       && ((seq_length == 0
7473            && (attr_length == 12
7474                || (attr_length == 28 && get_attr_type (insn) == TYPE_MULTI)))
7475           || (seq_length != 0 && attr_length == 8)))
7476     {
7477       output_asm_insn ("{bl|b,l} %0,%2", xoperands);
7478     }
7479   else
7480     {
7481       if (TARGET_64BIT)
7482         {
7483           /* It might seem that one insn could be saved by accessing
7484              the millicode function using the linkage table.  However,
7485              this doesn't work in shared libraries and other dynamically
7486              loaded objects.  Using a pc-relative sequence also avoids
7487              problems related to the implicit use of the gp register.  */
7488           output_asm_insn ("b,l .+8,%%r1", xoperands);
7489
7490           if (TARGET_GAS)
7491             {
7492               output_asm_insn ("addil L'%0-$PIC_pcrel$0+4,%%r1", xoperands);
7493               output_asm_insn ("ldo R'%0-$PIC_pcrel$0+8(%%r1),%%r1", xoperands);
7494             }
7495           else
7496             {
7497               xoperands[1] = gen_label_rtx ();
7498               output_asm_insn ("addil L'%0-%l1,%%r1", xoperands);
7499               targetm.asm_out.internal_label (asm_out_file, "L",
7500                                          CODE_LABEL_NUMBER (xoperands[1]));
7501               output_asm_insn ("ldo R'%0-%l1(%%r1),%%r1", xoperands);
7502             }
7503
7504           output_asm_insn ("bve,l (%%r1),%%r2", xoperands);
7505         }
7506       else if (TARGET_PORTABLE_RUNTIME)
7507         {
7508           /* Pure portable runtime doesn't allow be/ble; we also don't
7509              have PIC support in the assembler/linker, so this sequence
7510              is needed.  */
7511
7512           /* Get the address of our target into %r1.  */
7513           output_asm_insn ("ldil L'%0,%%r1", xoperands);
7514           output_asm_insn ("ldo R'%0(%%r1),%%r1", xoperands);
7515
7516           /* Get our return address into %r31.  */
7517           output_asm_insn ("{bl|b,l} .+8,%%r31", xoperands);
7518           output_asm_insn ("addi 8,%%r31,%%r31", xoperands);
7519
7520           /* Jump to our target address in %r1.  */
7521           output_asm_insn ("bv %%r0(%%r1)", xoperands);
7522         }
7523       else if (!flag_pic)
7524         {
7525           output_asm_insn ("ldil L'%0,%%r1", xoperands);
7526           if (TARGET_PA_20)
7527             output_asm_insn ("be,l R'%0(%%sr4,%%r1),%%sr0,%%r31", xoperands);
7528           else
7529             output_asm_insn ("ble R'%0(%%sr4,%%r1)", xoperands);
7530         }
7531       else
7532         {
7533           output_asm_insn ("{bl|b,l} .+8,%%r1", xoperands);
7534           output_asm_insn ("addi 16,%%r1,%%r31", xoperands);
7535
7536           if (TARGET_SOM || !TARGET_GAS)
7537             {
7538               /* The HP assembler can generate relocations for the
7539                  difference of two symbols.  GAS can do this for a
7540                  millicode symbol but not an arbitrary external
7541                  symbol when generating SOM output.  */
7542               xoperands[1] = gen_label_rtx ();
7543               targetm.asm_out.internal_label (asm_out_file, "L",
7544                                          CODE_LABEL_NUMBER (xoperands[1]));
7545               output_asm_insn ("addil L'%0-%l1,%%r1", xoperands);
7546               output_asm_insn ("ldo R'%0-%l1(%%r1),%%r1", xoperands);
7547             }
7548           else
7549             {
7550               output_asm_insn ("addil L'%0-$PIC_pcrel$0+8,%%r1", xoperands);
7551               output_asm_insn ("ldo R'%0-$PIC_pcrel$0+12(%%r1),%%r1",
7552                                xoperands);
7553             }
7554
7555           /* Jump to our target address in %r1.  */
7556           output_asm_insn ("bv %%r0(%%r1)", xoperands);
7557         }
7558     }
7559
7560   if (seq_length == 0)
7561     output_asm_insn ("nop", xoperands);
7562
7563   /* We are done if there isn't a jump in the delay slot.  */
7564   if (seq_length == 0 || GET_CODE (NEXT_INSN (insn)) != JUMP_INSN)
7565     return "";
7566
7567   /* This call has an unconditional jump in its delay slot.  */
7568   xoperands[0] = XEXP (PATTERN (NEXT_INSN (insn)), 1);
7569
7570   /* See if the return address can be adjusted.  Use the containing
7571      sequence insn's address.  */
7572   if (INSN_ADDRESSES_SET_P ())
7573     {
7574       seq_insn = NEXT_INSN (PREV_INSN (XVECEXP (final_sequence, 0, 0)));
7575       distance = (INSN_ADDRESSES (INSN_UID (JUMP_LABEL (NEXT_INSN (insn))))
7576                   - INSN_ADDRESSES (INSN_UID (seq_insn)) - 8);
7577
7578       if (VAL_14_BITS_P (distance))
7579         {
7580           xoperands[1] = gen_label_rtx ();
7581           output_asm_insn ("ldo %0-%1(%2),%2", xoperands);
7582           targetm.asm_out.internal_label (asm_out_file, "L",
7583                                           CODE_LABEL_NUMBER (xoperands[1]));
7584         }
7585       else
7586         /* ??? This branch may not reach its target.  */
7587         output_asm_insn ("nop\n\tb,n %0", xoperands);
7588     }
7589   else
7590     /* ??? This branch may not reach its target.  */
7591     output_asm_insn ("nop\n\tb,n %0", xoperands);
7592
7593   /* Delete the jump.  */
7594   SET_INSN_DELETED (NEXT_INSN (insn));
7595
7596   return "";
7597 }
7598
7599 /* Return the attribute length of the call instruction INSN.  The SIBCALL
7600    flag indicates whether INSN is a regular call or a sibling call.  The
7601    length returned must be longer than the code actually generated by
7602    output_call.  Since branch shortening is done before delay branch
7603    sequencing, there is no way to determine whether or not the delay
7604    slot will be filled during branch shortening.  Even when the delay
7605    slot is filled, we may have to add a nop if the delay slot contains
7606    a branch that can't reach its target.  Thus, we always have to include
7607    the delay slot in the length estimate.  This used to be done in
7608    pa_adjust_insn_length but we do it here now as some sequences always
7609    fill the delay slot and we can save four bytes in the estimate for
7610    these sequences.  */
7611
7612 int
7613 attr_length_call (rtx insn, int sibcall)
7614 {
7615   int local_call;
7616   rtx call, call_dest;
7617   tree call_decl;
7618   int length = 0;
7619   rtx pat = PATTERN (insn);
7620   unsigned long distance = -1;
7621
7622   gcc_assert (GET_CODE (insn) == CALL_INSN);
7623
7624   if (INSN_ADDRESSES_SET_P ())
7625     {
7626       unsigned long total;
7627
7628       total = IN_NAMED_SECTION_P (cfun->decl) ? 0 : total_code_bytes;
7629       distance = (total + insn_current_reference_address (insn));
7630       if (distance < total)
7631         distance = -1;
7632     }
7633
7634   gcc_assert (GET_CODE (pat) == PARALLEL);
7635
7636   /* Get the call rtx.  */
7637   call = XVECEXP (pat, 0, 0);
7638   if (GET_CODE (call) == SET)
7639     call = SET_SRC (call);
7640
7641   gcc_assert (GET_CODE (call) == CALL);
7642
7643   /* Determine if this is a local call.  */
7644   call_dest = XEXP (XEXP (call, 0), 0);
7645   call_decl = SYMBOL_REF_DECL (call_dest);
7646   local_call = call_decl && targetm.binds_local_p (call_decl);
7647
7648   /* pc-relative branch.  */
7649   if (!TARGET_LONG_CALLS
7650       && ((TARGET_PA_20 && !sibcall && distance < 7600000)
7651           || distance < 240000))
7652     length += 8;
7653
7654   /* 64-bit plabel sequence.  */
7655   else if (TARGET_64BIT && !local_call)
7656     length += sibcall ? 28 : 24;
7657
7658   /* non-pic long absolute branch sequence.  */
7659   else if ((TARGET_LONG_ABS_CALL || local_call) && !flag_pic)
7660     length += 12;
7661
7662   /* long pc-relative branch sequence.  */
7663   else if (TARGET_LONG_PIC_SDIFF_CALL
7664            || (TARGET_GAS && !TARGET_SOM
7665                && (TARGET_LONG_PIC_PCREL_CALL || local_call)))
7666     {
7667       length += 20;
7668
7669       if (!TARGET_PA_20 && !TARGET_NO_SPACE_REGS && (!local_call || flag_pic))
7670         length += 8;
7671     }
7672
7673   /* 32-bit plabel sequence.  */
7674   else
7675     {
7676       length += 32;
7677
7678       if (TARGET_SOM)
7679         length += length_fp_args (insn);
7680
7681       if (flag_pic)
7682         length += 4;
7683
7684       if (!TARGET_PA_20)
7685         {
7686           if (!sibcall)
7687             length += 8;
7688
7689           if (!TARGET_NO_SPACE_REGS && (!local_call || flag_pic))
7690             length += 8;
7691         }
7692     }
7693
7694   return length;
7695 }
7696
7697 /* INSN is a function call.  It may have an unconditional jump
7698    in its delay slot.
7699
7700    CALL_DEST is the routine we are calling.  */
7701
7702 const char *
7703 output_call (rtx insn, rtx call_dest, int sibcall)
7704 {
7705   int delay_insn_deleted = 0;
7706   int delay_slot_filled = 0;
7707   int seq_length = dbr_sequence_length ();
7708   tree call_decl = SYMBOL_REF_DECL (call_dest);
7709   int local_call = call_decl && targetm.binds_local_p (call_decl);
7710   rtx xoperands[2];
7711
7712   xoperands[0] = call_dest;
7713
7714   /* Handle the common case where we're sure that the branch will reach
7715      the beginning of the "$CODE$" subspace.  This is the beginning of
7716      the current function if we are in a named section.  */
7717   if (!TARGET_LONG_CALLS && attr_length_call (insn, sibcall) == 8)
7718     {
7719       xoperands[1] = gen_rtx_REG (word_mode, sibcall ? 0 : 2);
7720       output_asm_insn ("{bl|b,l} %0,%1", xoperands);
7721     }
7722   else
7723     {
7724       if (TARGET_64BIT && !local_call)
7725         {
7726           /* ??? As far as I can tell, the HP linker doesn't support the
7727              long pc-relative sequence described in the 64-bit runtime
7728              architecture.  So, we use a slightly longer indirect call.  */
7729           xoperands[0] = get_deferred_plabel (call_dest);
7730           xoperands[1] = gen_label_rtx ();
7731
7732           /* If this isn't a sibcall, we put the load of %r27 into the
7733              delay slot.  We can't do this in a sibcall as we don't
7734              have a second call-clobbered scratch register available.  */
7735           if (seq_length != 0
7736               && GET_CODE (NEXT_INSN (insn)) != JUMP_INSN
7737               && !sibcall)
7738             {
7739               final_scan_insn (NEXT_INSN (insn), asm_out_file,
7740                                optimize, 0, NULL);
7741
7742               /* Now delete the delay insn.  */
7743               SET_INSN_DELETED (NEXT_INSN (insn));
7744               delay_insn_deleted = 1;
7745             }
7746
7747           output_asm_insn ("addil LT'%0,%%r27", xoperands);
7748           output_asm_insn ("ldd RT'%0(%%r1),%%r1", xoperands);
7749           output_asm_insn ("ldd 0(%%r1),%%r1", xoperands);
7750
7751           if (sibcall)
7752             {
7753               output_asm_insn ("ldd 24(%%r1),%%r27", xoperands);
7754               output_asm_insn ("ldd 16(%%r1),%%r1", xoperands);
7755               output_asm_insn ("bve (%%r1)", xoperands);
7756             }
7757           else
7758             {
7759               output_asm_insn ("ldd 16(%%r1),%%r2", xoperands);
7760               output_asm_insn ("bve,l (%%r2),%%r2", xoperands);
7761               output_asm_insn ("ldd 24(%%r1),%%r27", xoperands);
7762               delay_slot_filled = 1;
7763             }
7764         }
7765       else
7766         {
7767           int indirect_call = 0;
7768
7769           /* Emit a long call.  There are several different sequences
7770              of increasing length and complexity.  In most cases,
7771              they don't allow an instruction in the delay slot.  */
7772           if (!((TARGET_LONG_ABS_CALL || local_call) && !flag_pic)
7773               && !TARGET_LONG_PIC_SDIFF_CALL
7774               && !(TARGET_GAS && !TARGET_SOM
7775                    && (TARGET_LONG_PIC_PCREL_CALL || local_call))
7776               && !TARGET_64BIT)
7777             indirect_call = 1;
7778
7779           if (seq_length != 0
7780               && GET_CODE (NEXT_INSN (insn)) != JUMP_INSN
7781               && !sibcall
7782               && (!TARGET_PA_20
7783                   || indirect_call
7784                   || ((TARGET_LONG_ABS_CALL || local_call) && !flag_pic)))
7785             {
7786               /* A non-jump insn in the delay slot.  By definition we can
7787                  emit this insn before the call (and in fact before argument
7788                  relocating.  */
7789               final_scan_insn (NEXT_INSN (insn), asm_out_file, optimize, 0,
7790                                NULL);
7791
7792               /* Now delete the delay insn.  */
7793               SET_INSN_DELETED (NEXT_INSN (insn));
7794               delay_insn_deleted = 1;
7795             }
7796
7797           if ((TARGET_LONG_ABS_CALL || local_call) && !flag_pic)
7798             {
7799               /* This is the best sequence for making long calls in
7800                  non-pic code.  Unfortunately, GNU ld doesn't provide
7801                  the stub needed for external calls, and GAS's support
7802                  for this with the SOM linker is buggy.  It is safe
7803                  to use this for local calls.  */
7804               output_asm_insn ("ldil L'%0,%%r1", xoperands);
7805               if (sibcall)
7806                 output_asm_insn ("be R'%0(%%sr4,%%r1)", xoperands);
7807               else
7808                 {
7809                   if (TARGET_PA_20)
7810                     output_asm_insn ("be,l R'%0(%%sr4,%%r1),%%sr0,%%r31",
7811                                      xoperands);
7812                   else
7813                     output_asm_insn ("ble R'%0(%%sr4,%%r1)", xoperands);
7814
7815                   output_asm_insn ("copy %%r31,%%r2", xoperands);
7816                   delay_slot_filled = 1;
7817                 }
7818             }
7819           else
7820             {
7821               if (TARGET_LONG_PIC_SDIFF_CALL)
7822                 {
7823                   /* The HP assembler and linker can handle relocations
7824                      for the difference of two symbols.  The HP assembler
7825                      recognizes the sequence as a pc-relative call and
7826                      the linker provides stubs when needed.  */
7827                   xoperands[1] = gen_label_rtx ();
7828                   output_asm_insn ("{bl|b,l} .+8,%%r1", xoperands);
7829                   output_asm_insn ("addil L'%0-%l1,%%r1", xoperands);
7830                   targetm.asm_out.internal_label (asm_out_file, "L",
7831                                              CODE_LABEL_NUMBER (xoperands[1]));
7832                   output_asm_insn ("ldo R'%0-%l1(%%r1),%%r1", xoperands);
7833                 }
7834               else if (TARGET_GAS && !TARGET_SOM
7835                        && (TARGET_LONG_PIC_PCREL_CALL || local_call))
7836                 {
7837                   /*  GAS currently can't generate the relocations that
7838                       are needed for the SOM linker under HP-UX using this
7839                       sequence.  The GNU linker doesn't generate the stubs
7840                       that are needed for external calls on TARGET_ELF32
7841                       with this sequence.  For now, we have to use a
7842                       longer plabel sequence when using GAS.  */
7843                   output_asm_insn ("{bl|b,l} .+8,%%r1", xoperands);
7844                   output_asm_insn ("addil L'%0-$PIC_pcrel$0+4,%%r1",
7845                                    xoperands);
7846                   output_asm_insn ("ldo R'%0-$PIC_pcrel$0+8(%%r1),%%r1",
7847                                    xoperands);
7848                 }
7849               else
7850                 {
7851                   /* Emit a long plabel-based call sequence.  This is
7852                      essentially an inline implementation of $$dyncall.
7853                      We don't actually try to call $$dyncall as this is
7854                      as difficult as calling the function itself.  */
7855                   xoperands[0] = get_deferred_plabel (call_dest);
7856                   xoperands[1] = gen_label_rtx ();
7857
7858                   /* Since the call is indirect, FP arguments in registers
7859                      need to be copied to the general registers.  Then, the
7860                      argument relocation stub will copy them back.  */
7861                   if (TARGET_SOM)
7862                     copy_fp_args (insn);
7863
7864                   if (flag_pic)
7865                     {
7866                       output_asm_insn ("addil LT'%0,%%r19", xoperands);
7867                       output_asm_insn ("ldw RT'%0(%%r1),%%r1", xoperands);
7868                       output_asm_insn ("ldw 0(%%r1),%%r1", xoperands);
7869                     }
7870                   else
7871                     {
7872                       output_asm_insn ("addil LR'%0-$global$,%%r27",
7873                                        xoperands);
7874                       output_asm_insn ("ldw RR'%0-$global$(%%r1),%%r1",
7875                                        xoperands);
7876                     }
7877
7878                   output_asm_insn ("bb,>=,n %%r1,30,.+16", xoperands);
7879                   output_asm_insn ("depi 0,31,2,%%r1", xoperands);
7880                   output_asm_insn ("ldw 4(%%sr0,%%r1),%%r19", xoperands);
7881                   output_asm_insn ("ldw 0(%%sr0,%%r1),%%r1", xoperands);
7882
7883                   if (!sibcall && !TARGET_PA_20)
7884                     {
7885                       output_asm_insn ("{bl|b,l} .+8,%%r2", xoperands);
7886                       if (TARGET_NO_SPACE_REGS || (local_call && !flag_pic))
7887                         output_asm_insn ("addi 8,%%r2,%%r2", xoperands);
7888                       else
7889                         output_asm_insn ("addi 16,%%r2,%%r2", xoperands);
7890                     }
7891                 }
7892
7893               if (TARGET_PA_20)
7894                 {
7895                   if (sibcall)
7896                     output_asm_insn ("bve (%%r1)", xoperands);
7897                   else
7898                     {
7899                       if (indirect_call)
7900                         {
7901                           output_asm_insn ("bve,l (%%r1),%%r2", xoperands);
7902                           output_asm_insn ("stw %%r2,-24(%%sp)", xoperands);
7903                           delay_slot_filled = 1;
7904                         }
7905                       else
7906                         output_asm_insn ("bve,l (%%r1),%%r2", xoperands);
7907                     }
7908                 }
7909               else
7910                 {
7911                   if (!TARGET_NO_SPACE_REGS && (!local_call || flag_pic))
7912                     output_asm_insn ("ldsid (%%r1),%%r31\n\tmtsp %%r31,%%sr0",
7913                                      xoperands);
7914
7915                   if (sibcall)
7916                     {
7917                       if (TARGET_NO_SPACE_REGS || (local_call && !flag_pic))
7918                         output_asm_insn ("be 0(%%sr4,%%r1)", xoperands);
7919                       else
7920                         output_asm_insn ("be 0(%%sr0,%%r1)", xoperands);
7921                     }
7922                   else
7923                     {
7924                       if (TARGET_NO_SPACE_REGS || (local_call && !flag_pic))
7925                         output_asm_insn ("ble 0(%%sr4,%%r1)", xoperands);
7926                       else
7927                         output_asm_insn ("ble 0(%%sr0,%%r1)", xoperands);
7928
7929                       if (indirect_call)
7930                         output_asm_insn ("stw %%r31,-24(%%sp)", xoperands);
7931                       else
7932                         output_asm_insn ("copy %%r31,%%r2", xoperands);
7933                       delay_slot_filled = 1;
7934                     }
7935                 }
7936             }
7937         }
7938     }
7939
7940   if (!delay_slot_filled && (seq_length == 0 || delay_insn_deleted))
7941     output_asm_insn ("nop", xoperands);
7942
7943   /* We are done if there isn't a jump in the delay slot.  */
7944   if (seq_length == 0
7945       || delay_insn_deleted
7946       || GET_CODE (NEXT_INSN (insn)) != JUMP_INSN)
7947     return "";
7948
7949   /* A sibcall should never have a branch in the delay slot.  */
7950   gcc_assert (!sibcall);
7951
7952   /* This call has an unconditional jump in its delay slot.  */
7953   xoperands[0] = XEXP (PATTERN (NEXT_INSN (insn)), 1);
7954
7955   if (!delay_slot_filled && INSN_ADDRESSES_SET_P ())
7956     {
7957       /* See if the return address can be adjusted.  Use the containing
7958          sequence insn's address.  This would break the regular call/return@
7959          relationship assumed by the table based eh unwinder, so only do that
7960          if the call is not possibly throwing.  */
7961       rtx seq_insn = NEXT_INSN (PREV_INSN (XVECEXP (final_sequence, 0, 0)));
7962       int distance = (INSN_ADDRESSES (INSN_UID (JUMP_LABEL (NEXT_INSN (insn))))
7963                       - INSN_ADDRESSES (INSN_UID (seq_insn)) - 8);
7964
7965       if (VAL_14_BITS_P (distance)
7966           && !(can_throw_internal (insn) || can_throw_external (insn)))
7967         {
7968           xoperands[1] = gen_label_rtx ();
7969           output_asm_insn ("ldo %0-%1(%%r2),%%r2", xoperands);
7970           targetm.asm_out.internal_label (asm_out_file, "L",
7971                                           CODE_LABEL_NUMBER (xoperands[1]));
7972         }
7973       else
7974         output_asm_insn ("nop\n\tb,n %0", xoperands);
7975     }
7976   else
7977     output_asm_insn ("b,n %0", xoperands);
7978
7979   /* Delete the jump.  */
7980   SET_INSN_DELETED (NEXT_INSN (insn));
7981
7982   return "";
7983 }
7984
7985 /* Return the attribute length of the indirect call instruction INSN.
7986    The length must match the code generated by output_indirect call.
7987    The returned length includes the delay slot.  Currently, the delay
7988    slot of an indirect call sequence is not exposed and it is used by
7989    the sequence itself.  */
7990
7991 int
7992 attr_length_indirect_call (rtx insn)
7993 {
7994   unsigned long distance = -1;
7995   unsigned long total = IN_NAMED_SECTION_P (cfun->decl) ? 0 : total_code_bytes;
7996
7997   if (INSN_ADDRESSES_SET_P ())
7998     {
7999       distance = (total + insn_current_reference_address (insn));
8000       if (distance < total)
8001         distance = -1;
8002     }
8003
8004   if (TARGET_64BIT)
8005     return 12;
8006
8007   if (TARGET_FAST_INDIRECT_CALLS
8008       || (!TARGET_PORTABLE_RUNTIME
8009           && ((TARGET_PA_20 && !TARGET_SOM && distance < 7600000)
8010               || distance < 240000)))
8011     return 8;
8012
8013   if (flag_pic)
8014     return 24;
8015
8016   if (TARGET_PORTABLE_RUNTIME)
8017     return 20;
8018
8019   /* Out of reach, can use ble.  */
8020   return 12;
8021 }
8022
8023 const char *
8024 output_indirect_call (rtx insn, rtx call_dest)
8025 {
8026   rtx xoperands[1];
8027
8028   if (TARGET_64BIT)
8029     {
8030       xoperands[0] = call_dest;
8031       output_asm_insn ("ldd 16(%0),%%r2", xoperands);
8032       output_asm_insn ("bve,l (%%r2),%%r2\n\tldd 24(%0),%%r27", xoperands);
8033       return "";
8034     }
8035
8036   /* First the special case for kernels, level 0 systems, etc.  */
8037   if (TARGET_FAST_INDIRECT_CALLS)
8038     return "ble 0(%%sr4,%%r22)\n\tcopy %%r31,%%r2"; 
8039
8040   /* Now the normal case -- we can reach $$dyncall directly or
8041      we're sure that we can get there via a long-branch stub. 
8042
8043      No need to check target flags as the length uniquely identifies
8044      the remaining cases.  */
8045   if (attr_length_indirect_call (insn) == 8)
8046     {
8047       /* The HP linker sometimes substitutes a BLE for BL/B,L calls to
8048          $$dyncall.  Since BLE uses %r31 as the link register, the 22-bit
8049          variant of the B,L instruction can't be used on the SOM target.  */
8050       if (TARGET_PA_20 && !TARGET_SOM)
8051         return ".CALL\tARGW0=GR\n\tb,l $$dyncall,%%r2\n\tcopy %%r2,%%r31";
8052       else
8053         return ".CALL\tARGW0=GR\n\tbl $$dyncall,%%r31\n\tcopy %%r31,%%r2";
8054     }
8055
8056   /* Long millicode call, but we are not generating PIC or portable runtime
8057      code.  */
8058   if (attr_length_indirect_call (insn) == 12)
8059     return ".CALL\tARGW0=GR\n\tldil L'$$dyncall,%%r2\n\tble R'$$dyncall(%%sr4,%%r2)\n\tcopy %%r31,%%r2";
8060
8061   /* Long millicode call for portable runtime.  */
8062   if (attr_length_indirect_call (insn) == 20)
8063     return "ldil L'$$dyncall,%%r31\n\tldo R'$$dyncall(%%r31),%%r31\n\tblr %%r0,%%r2\n\tbv,n %%r0(%%r31)\n\tnop";
8064
8065   /* We need a long PIC call to $$dyncall.  */
8066   xoperands[0] = NULL_RTX;
8067   output_asm_insn ("{bl|b,l} .+8,%%r1", xoperands);
8068   if (TARGET_SOM || !TARGET_GAS)
8069     {
8070       xoperands[0] = gen_label_rtx ();
8071       output_asm_insn ("addil L'$$dyncall-%0,%%r1", xoperands);
8072       targetm.asm_out.internal_label (asm_out_file, "L",
8073                                       CODE_LABEL_NUMBER (xoperands[0]));
8074       output_asm_insn ("ldo R'$$dyncall-%0(%%r1),%%r1", xoperands);
8075     }
8076   else
8077     {
8078       output_asm_insn ("addil L'$$dyncall-$PIC_pcrel$0+4,%%r1", xoperands);
8079       output_asm_insn ("ldo R'$$dyncall-$PIC_pcrel$0+8(%%r1),%%r1",
8080                        xoperands);
8081     }
8082   output_asm_insn ("blr %%r0,%%r2", xoperands);
8083   output_asm_insn ("bv,n %%r0(%%r1)\n\tnop", xoperands);
8084   return "";
8085 }
8086
8087 /* Return the total length of the save and restore instructions needed for
8088    the data linkage table pointer (i.e., the PIC register) across the call
8089    instruction INSN.  No-return calls do not require a save and restore.
8090    In addition, we may be able to avoid the save and restore for calls
8091    within the same translation unit.  */
8092
8093 int
8094 attr_length_save_restore_dltp (rtx insn)
8095 {
8096   if (find_reg_note (insn, REG_NORETURN, NULL_RTX))
8097     return 0;
8098
8099   return 8;
8100 }
8101
8102 /* In HPUX 8.0's shared library scheme, special relocations are needed
8103    for function labels if they might be passed to a function
8104    in a shared library (because shared libraries don't live in code
8105    space), and special magic is needed to construct their address.  */
8106
8107 void
8108 hppa_encode_label (rtx sym)
8109 {
8110   const char *str = XSTR (sym, 0);
8111   int len = strlen (str) + 1;
8112   char *newstr, *p;
8113
8114   p = newstr = XALLOCAVEC (char, len + 1);
8115   *p++ = '@';
8116   strcpy (p, str);
8117
8118   XSTR (sym, 0) = ggc_alloc_string (newstr, len);
8119 }
8120
8121 static void
8122 pa_encode_section_info (tree decl, rtx rtl, int first)
8123 {
8124   int old_referenced = 0;
8125
8126   if (!first && MEM_P (rtl) && GET_CODE (XEXP (rtl, 0)) == SYMBOL_REF)
8127     old_referenced
8128       = SYMBOL_REF_FLAGS (XEXP (rtl, 0)) & SYMBOL_FLAG_REFERENCED;
8129
8130   default_encode_section_info (decl, rtl, first);
8131
8132   if (first && TEXT_SPACE_P (decl))
8133     {
8134       SYMBOL_REF_FLAG (XEXP (rtl, 0)) = 1;
8135       if (TREE_CODE (decl) == FUNCTION_DECL)
8136         hppa_encode_label (XEXP (rtl, 0));
8137     }
8138   else if (old_referenced)
8139     SYMBOL_REF_FLAGS (XEXP (rtl, 0)) |= old_referenced;
8140 }
8141
8142 /* This is sort of inverse to pa_encode_section_info.  */
8143
8144 static const char *
8145 pa_strip_name_encoding (const char *str)
8146 {
8147   str += (*str == '@');
8148   str += (*str == '*');
8149   return str;
8150 }
8151
8152 /* Returns 1 if OP is a function label involved in a simple addition
8153    with a constant.  Used to keep certain patterns from matching
8154    during instruction combination.  */
8155 int
8156 is_function_label_plus_const (rtx op)
8157 {
8158   /* Strip off any CONST.  */
8159   if (GET_CODE (op) == CONST)
8160     op = XEXP (op, 0);
8161
8162   return (GET_CODE (op) == PLUS
8163           && function_label_operand (XEXP (op, 0), VOIDmode)
8164           && GET_CODE (XEXP (op, 1)) == CONST_INT);
8165 }
8166
8167 /* Output assembly code for a thunk to FUNCTION.  */
8168
8169 static void
8170 pa_asm_output_mi_thunk (FILE *file, tree thunk_fndecl, HOST_WIDE_INT delta,
8171                         HOST_WIDE_INT vcall_offset ATTRIBUTE_UNUSED,
8172                         tree function)
8173 {
8174   static unsigned int current_thunk_number;
8175   int val_14 = VAL_14_BITS_P (delta);
8176   unsigned int old_last_address = last_address, nbytes = 0;
8177   char label[16];
8178   rtx xoperands[4];
8179
8180   xoperands[0] = XEXP (DECL_RTL (function), 0);
8181   xoperands[1] = XEXP (DECL_RTL (thunk_fndecl), 0);
8182   xoperands[2] = GEN_INT (delta);
8183
8184   ASM_OUTPUT_LABEL (file, XSTR (xoperands[1], 0));
8185   fprintf (file, "\t.PROC\n\t.CALLINFO FRAME=0,NO_CALLS\n\t.ENTRY\n");
8186
8187   /* Output the thunk.  We know that the function is in the same
8188      translation unit (i.e., the same space) as the thunk, and that
8189      thunks are output after their method.  Thus, we don't need an
8190      external branch to reach the function.  With SOM and GAS,
8191      functions and thunks are effectively in different sections.
8192      Thus, we can always use a IA-relative branch and the linker
8193      will add a long branch stub if necessary.
8194
8195      However, we have to be careful when generating PIC code on the
8196      SOM port to ensure that the sequence does not transfer to an
8197      import stub for the target function as this could clobber the
8198      return value saved at SP-24.  This would also apply to the
8199      32-bit linux port if the multi-space model is implemented.  */
8200   if ((!TARGET_LONG_CALLS && TARGET_SOM && !TARGET_PORTABLE_RUNTIME
8201        && !(flag_pic && TREE_PUBLIC (function))
8202        && (TARGET_GAS || last_address < 262132))
8203       || (!TARGET_LONG_CALLS && !TARGET_SOM && !TARGET_PORTABLE_RUNTIME
8204           && ((targetm.have_named_sections
8205                && DECL_SECTION_NAME (thunk_fndecl) != NULL
8206                /* The GNU 64-bit linker has rather poor stub management.
8207                   So, we use a long branch from thunks that aren't in
8208                   the same section as the target function.  */
8209                && ((!TARGET_64BIT
8210                     && (DECL_SECTION_NAME (thunk_fndecl)
8211                         != DECL_SECTION_NAME (function)))
8212                    || ((DECL_SECTION_NAME (thunk_fndecl)
8213                         == DECL_SECTION_NAME (function))
8214                        && last_address < 262132)))
8215               || (targetm.have_named_sections
8216                   && DECL_SECTION_NAME (thunk_fndecl) == NULL
8217                   && DECL_SECTION_NAME (function) == NULL
8218                   && last_address < 262132)
8219               || (!targetm.have_named_sections && last_address < 262132))))
8220     {
8221       if (!val_14)
8222         output_asm_insn ("addil L'%2,%%r26", xoperands);
8223
8224       output_asm_insn ("b %0", xoperands);
8225
8226       if (val_14)
8227         {
8228           output_asm_insn ("ldo %2(%%r26),%%r26", xoperands);
8229           nbytes += 8;
8230         }
8231       else
8232         {
8233           output_asm_insn ("ldo R'%2(%%r1),%%r26", xoperands);
8234           nbytes += 12;
8235         }
8236     }
8237   else if (TARGET_64BIT)
8238     {
8239       /* We only have one call-clobbered scratch register, so we can't
8240          make use of the delay slot if delta doesn't fit in 14 bits.  */
8241       if (!val_14)
8242         {
8243           output_asm_insn ("addil L'%2,%%r26", xoperands);
8244           output_asm_insn ("ldo R'%2(%%r1),%%r26", xoperands);
8245         }
8246
8247       output_asm_insn ("b,l .+8,%%r1", xoperands);
8248
8249       if (TARGET_GAS)
8250         {
8251           output_asm_insn ("addil L'%0-$PIC_pcrel$0+4,%%r1", xoperands);
8252           output_asm_insn ("ldo R'%0-$PIC_pcrel$0+8(%%r1),%%r1", xoperands);
8253         }
8254       else
8255         {
8256           xoperands[3] = GEN_INT (val_14 ? 8 : 16);
8257           output_asm_insn ("addil L'%0-%1-%3,%%r1", xoperands);
8258         }
8259
8260       if (val_14)
8261         {
8262           output_asm_insn ("bv %%r0(%%r1)", xoperands);
8263           output_asm_insn ("ldo %2(%%r26),%%r26", xoperands);
8264           nbytes += 20;
8265         }
8266       else
8267         {
8268           output_asm_insn ("bv,n %%r0(%%r1)", xoperands);
8269           nbytes += 24;
8270         }
8271     }
8272   else if (TARGET_PORTABLE_RUNTIME)
8273     {
8274       output_asm_insn ("ldil L'%0,%%r1", xoperands);
8275       output_asm_insn ("ldo R'%0(%%r1),%%r22", xoperands);
8276
8277       if (!val_14)
8278         output_asm_insn ("addil L'%2,%%r26", xoperands);
8279
8280       output_asm_insn ("bv %%r0(%%r22)", xoperands);
8281
8282       if (val_14)
8283         {
8284           output_asm_insn ("ldo %2(%%r26),%%r26", xoperands);
8285           nbytes += 16;
8286         }
8287       else
8288         {
8289           output_asm_insn ("ldo R'%2(%%r1),%%r26", xoperands);
8290           nbytes += 20;
8291         }
8292     }
8293   else if (TARGET_SOM && flag_pic && TREE_PUBLIC (function))
8294     {
8295       /* The function is accessible from outside this module.  The only
8296          way to avoid an import stub between the thunk and function is to
8297          call the function directly with an indirect sequence similar to
8298          that used by $$dyncall.  This is possible because $$dyncall acts
8299          as the import stub in an indirect call.  */
8300       ASM_GENERATE_INTERNAL_LABEL (label, "LTHN", current_thunk_number);
8301       xoperands[3] = gen_rtx_SYMBOL_REF (Pmode, label);
8302       output_asm_insn ("addil LT'%3,%%r19", xoperands);
8303       output_asm_insn ("ldw RT'%3(%%r1),%%r22", xoperands);
8304       output_asm_insn ("ldw 0(%%sr0,%%r22),%%r22", xoperands);
8305       output_asm_insn ("bb,>=,n %%r22,30,.+16", xoperands);
8306       output_asm_insn ("depi 0,31,2,%%r22", xoperands);
8307       output_asm_insn ("ldw 4(%%sr0,%%r22),%%r19", xoperands);
8308       output_asm_insn ("ldw 0(%%sr0,%%r22),%%r22", xoperands);
8309
8310       if (!val_14)
8311         {
8312           output_asm_insn ("addil L'%2,%%r26", xoperands);
8313           nbytes += 4;
8314         }
8315
8316       if (TARGET_PA_20)
8317         {
8318           output_asm_insn ("bve (%%r22)", xoperands);
8319           nbytes += 36;
8320         }
8321       else if (TARGET_NO_SPACE_REGS)
8322         {
8323           output_asm_insn ("be 0(%%sr4,%%r22)", xoperands);
8324           nbytes += 36;
8325         }
8326       else
8327         {
8328           output_asm_insn ("ldsid (%%sr0,%%r22),%%r21", xoperands);
8329           output_asm_insn ("mtsp %%r21,%%sr0", xoperands);
8330           output_asm_insn ("be 0(%%sr0,%%r22)", xoperands);
8331           nbytes += 44;
8332         }
8333
8334       if (val_14)
8335         output_asm_insn ("ldo %2(%%r26),%%r26", xoperands);
8336       else
8337         output_asm_insn ("ldo R'%2(%%r1),%%r26", xoperands);
8338     }
8339   else if (flag_pic)
8340     {
8341       output_asm_insn ("{bl|b,l} .+8,%%r1", xoperands);
8342
8343       if (TARGET_SOM || !TARGET_GAS)
8344         {
8345           output_asm_insn ("addil L'%0-%1-8,%%r1", xoperands);
8346           output_asm_insn ("ldo R'%0-%1-8(%%r1),%%r22", xoperands);
8347         }
8348       else
8349         {
8350           output_asm_insn ("addil L'%0-$PIC_pcrel$0+4,%%r1", xoperands);
8351           output_asm_insn ("ldo R'%0-$PIC_pcrel$0+8(%%r1),%%r22", xoperands);
8352         }
8353
8354       if (!val_14)
8355         output_asm_insn ("addil L'%2,%%r26", xoperands);
8356
8357       output_asm_insn ("bv %%r0(%%r22)", xoperands);
8358
8359       if (val_14)
8360         {
8361           output_asm_insn ("ldo %2(%%r26),%%r26", xoperands);
8362           nbytes += 20;
8363         }
8364       else
8365         {
8366           output_asm_insn ("ldo R'%2(%%r1),%%r26", xoperands);
8367           nbytes += 24;
8368         }
8369     }
8370   else
8371     {
8372       if (!val_14)
8373         output_asm_insn ("addil L'%2,%%r26", xoperands);
8374
8375       output_asm_insn ("ldil L'%0,%%r22", xoperands);
8376       output_asm_insn ("be R'%0(%%sr4,%%r22)", xoperands);
8377
8378       if (val_14)
8379         {
8380           output_asm_insn ("ldo %2(%%r26),%%r26", xoperands);
8381           nbytes += 12;
8382         }
8383       else
8384         {
8385           output_asm_insn ("ldo R'%2(%%r1),%%r26", xoperands);
8386           nbytes += 16;
8387         }
8388     }
8389
8390   fprintf (file, "\t.EXIT\n\t.PROCEND\n");
8391
8392   if (TARGET_SOM && TARGET_GAS)
8393     {
8394       /* We done with this subspace except possibly for some additional
8395          debug information.  Forget that we are in this subspace to ensure
8396          that the next function is output in its own subspace.  */
8397       in_section = NULL;
8398       cfun->machine->in_nsubspa = 2;
8399     }
8400
8401   if (TARGET_SOM && flag_pic && TREE_PUBLIC (function))
8402     {
8403       switch_to_section (data_section);
8404       output_asm_insn (".align 4", xoperands);
8405       ASM_OUTPUT_LABEL (file, label);
8406       output_asm_insn (".word P'%0", xoperands);
8407     }
8408
8409   current_thunk_number++;
8410   nbytes = ((nbytes + FUNCTION_BOUNDARY / BITS_PER_UNIT - 1)
8411             & ~(FUNCTION_BOUNDARY / BITS_PER_UNIT - 1));
8412   last_address += nbytes;
8413   if (old_last_address > last_address)
8414     last_address = UINT_MAX;
8415   update_total_code_bytes (nbytes);
8416 }
8417
8418 /* Only direct calls to static functions are allowed to be sibling (tail)
8419    call optimized.
8420
8421    This restriction is necessary because some linker generated stubs will
8422    store return pointers into rp' in some cases which might clobber a
8423    live value already in rp'.
8424
8425    In a sibcall the current function and the target function share stack
8426    space.  Thus if the path to the current function and the path to the
8427    target function save a value in rp', they save the value into the
8428    same stack slot, which has undesirable consequences.
8429
8430    Because of the deferred binding nature of shared libraries any function
8431    with external scope could be in a different load module and thus require
8432    rp' to be saved when calling that function.  So sibcall optimizations
8433    can only be safe for static function.
8434
8435    Note that GCC never needs return value relocations, so we don't have to
8436    worry about static calls with return value relocations (which require
8437    saving rp').
8438
8439    It is safe to perform a sibcall optimization when the target function
8440    will never return.  */
8441 static bool
8442 pa_function_ok_for_sibcall (tree decl, tree exp ATTRIBUTE_UNUSED)
8443 {
8444   if (TARGET_PORTABLE_RUNTIME)
8445     return false;
8446
8447   /* Sibcalls are ok for TARGET_ELF32 as along as the linker is used in
8448      single subspace mode and the call is not indirect.  As far as I know,
8449      there is no operating system support for the multiple subspace mode.
8450      It might be possible to support indirect calls if we didn't use
8451      $$dyncall (see the indirect sequence generated in output_call).  */
8452   if (TARGET_ELF32)
8453     return (decl != NULL_TREE);
8454
8455   /* Sibcalls are not ok because the arg pointer register is not a fixed
8456      register.  This prevents the sibcall optimization from occurring.  In
8457      addition, there are problems with stub placement using GNU ld.  This
8458      is because a normal sibcall branch uses a 17-bit relocation while
8459      a regular call branch uses a 22-bit relocation.  As a result, more
8460      care needs to be taken in the placement of long-branch stubs.  */
8461   if (TARGET_64BIT)
8462     return false;
8463
8464   /* Sibcalls are only ok within a translation unit.  */
8465   return (decl && !TREE_PUBLIC (decl));
8466 }
8467
8468 /* ??? Addition is not commutative on the PA due to the weird implicit
8469    space register selection rules for memory addresses.  Therefore, we
8470    don't consider a + b == b + a, as this might be inside a MEM.  */
8471 static bool
8472 pa_commutative_p (const_rtx x, int outer_code)
8473 {
8474   return (COMMUTATIVE_P (x)
8475           && (TARGET_NO_SPACE_REGS
8476               || (outer_code != UNKNOWN && outer_code != MEM)
8477               || GET_CODE (x) != PLUS));
8478 }
8479
8480 /* Returns 1 if the 6 operands specified in OPERANDS are suitable for
8481    use in fmpyadd instructions.  */
8482 int
8483 fmpyaddoperands (rtx *operands)
8484 {
8485   enum machine_mode mode = GET_MODE (operands[0]);
8486
8487   /* Must be a floating point mode.  */
8488   if (mode != SFmode && mode != DFmode)
8489     return 0;
8490
8491   /* All modes must be the same.  */
8492   if (! (mode == GET_MODE (operands[1])
8493          && mode == GET_MODE (operands[2])
8494          && mode == GET_MODE (operands[3])
8495          && mode == GET_MODE (operands[4])
8496          && mode == GET_MODE (operands[5])))
8497     return 0;
8498
8499   /* All operands must be registers.  */
8500   if (! (GET_CODE (operands[1]) == REG
8501          && GET_CODE (operands[2]) == REG
8502          && GET_CODE (operands[3]) == REG
8503          && GET_CODE (operands[4]) == REG
8504          && GET_CODE (operands[5]) == REG))
8505     return 0;
8506
8507   /* Only 2 real operands to the addition.  One of the input operands must
8508      be the same as the output operand.  */
8509   if (! rtx_equal_p (operands[3], operands[4])
8510       && ! rtx_equal_p (operands[3], operands[5]))
8511     return 0;
8512
8513   /* Inout operand of add cannot conflict with any operands from multiply.  */
8514   if (rtx_equal_p (operands[3], operands[0])
8515      || rtx_equal_p (operands[3], operands[1])
8516      || rtx_equal_p (operands[3], operands[2]))
8517     return 0;
8518
8519   /* multiply cannot feed into addition operands.  */
8520   if (rtx_equal_p (operands[4], operands[0])
8521       || rtx_equal_p (operands[5], operands[0]))
8522     return 0;
8523
8524   /* SFmode limits the registers to the upper 32 of the 32bit FP regs.  */
8525   if (mode == SFmode
8526       && (REGNO_REG_CLASS (REGNO (operands[0])) != FPUPPER_REGS
8527           || REGNO_REG_CLASS (REGNO (operands[1])) != FPUPPER_REGS
8528           || REGNO_REG_CLASS (REGNO (operands[2])) != FPUPPER_REGS
8529           || REGNO_REG_CLASS (REGNO (operands[3])) != FPUPPER_REGS
8530           || REGNO_REG_CLASS (REGNO (operands[4])) != FPUPPER_REGS
8531           || REGNO_REG_CLASS (REGNO (operands[5])) != FPUPPER_REGS))
8532     return 0;
8533
8534   /* Passed.  Operands are suitable for fmpyadd.  */
8535   return 1;
8536 }
8537
8538 #if !defined(USE_COLLECT2)
8539 static void
8540 pa_asm_out_constructor (rtx symbol, int priority)
8541 {
8542   if (!function_label_operand (symbol, VOIDmode))
8543     hppa_encode_label (symbol);
8544
8545 #ifdef CTORS_SECTION_ASM_OP
8546   default_ctor_section_asm_out_constructor (symbol, priority);
8547 #else
8548 # ifdef TARGET_ASM_NAMED_SECTION
8549   default_named_section_asm_out_constructor (symbol, priority);
8550 # else
8551   default_stabs_asm_out_constructor (symbol, priority);
8552 # endif
8553 #endif
8554 }
8555
8556 static void
8557 pa_asm_out_destructor (rtx symbol, int priority)
8558 {
8559   if (!function_label_operand (symbol, VOIDmode))
8560     hppa_encode_label (symbol);
8561
8562 #ifdef DTORS_SECTION_ASM_OP
8563   default_dtor_section_asm_out_destructor (symbol, priority);
8564 #else
8565 # ifdef TARGET_ASM_NAMED_SECTION
8566   default_named_section_asm_out_destructor (symbol, priority);
8567 # else
8568   default_stabs_asm_out_destructor (symbol, priority);
8569 # endif
8570 #endif
8571 }
8572 #endif
8573
8574 /* This function places uninitialized global data in the bss section.
8575    The ASM_OUTPUT_ALIGNED_BSS macro needs to be defined to call this
8576    function on the SOM port to prevent uninitialized global data from
8577    being placed in the data section.  */
8578    
8579 void
8580 pa_asm_output_aligned_bss (FILE *stream,
8581                            const char *name,
8582                            unsigned HOST_WIDE_INT size,
8583                            unsigned int align)
8584 {
8585   switch_to_section (bss_section);
8586   fprintf (stream, "\t.align %u\n", align / BITS_PER_UNIT);
8587
8588 #ifdef ASM_OUTPUT_TYPE_DIRECTIVE
8589   ASM_OUTPUT_TYPE_DIRECTIVE (stream, name, "object");
8590 #endif
8591
8592 #ifdef ASM_OUTPUT_SIZE_DIRECTIVE
8593   ASM_OUTPUT_SIZE_DIRECTIVE (stream, name, size);
8594 #endif
8595
8596   fprintf (stream, "\t.align %u\n", align / BITS_PER_UNIT);
8597   ASM_OUTPUT_LABEL (stream, name);
8598   fprintf (stream, "\t.block "HOST_WIDE_INT_PRINT_UNSIGNED"\n", size);
8599 }
8600
8601 /* Both the HP and GNU assemblers under HP-UX provide a .comm directive
8602    that doesn't allow the alignment of global common storage to be directly
8603    specified.  The SOM linker aligns common storage based on the rounded
8604    value of the NUM_BYTES parameter in the .comm directive.  It's not
8605    possible to use the .align directive as it doesn't affect the alignment
8606    of the label associated with a .comm directive.  */
8607
8608 void
8609 pa_asm_output_aligned_common (FILE *stream,
8610                               const char *name,
8611                               unsigned HOST_WIDE_INT size,
8612                               unsigned int align)
8613 {
8614   unsigned int max_common_align;
8615
8616   max_common_align = TARGET_64BIT ? 128 : (size >= 4096 ? 256 : 64);
8617   if (align > max_common_align)
8618     {
8619       warning (0, "alignment (%u) for %s exceeds maximum alignment "
8620                "for global common data.  Using %u",
8621                align / BITS_PER_UNIT, name, max_common_align / BITS_PER_UNIT);
8622       align = max_common_align;
8623     }
8624
8625   switch_to_section (bss_section);
8626
8627   assemble_name (stream, name);
8628   fprintf (stream, "\t.comm "HOST_WIDE_INT_PRINT_UNSIGNED"\n",
8629            MAX (size, align / BITS_PER_UNIT));
8630 }
8631
8632 /* We can't use .comm for local common storage as the SOM linker effectively
8633    treats the symbol as universal and uses the same storage for local symbols
8634    with the same name in different object files.  The .block directive
8635    reserves an uninitialized block of storage.  However, it's not common
8636    storage.  Fortunately, GCC never requests common storage with the same
8637    name in any given translation unit.  */
8638
8639 void
8640 pa_asm_output_aligned_local (FILE *stream,
8641                              const char *name,
8642                              unsigned HOST_WIDE_INT size,
8643                              unsigned int align)
8644 {
8645   switch_to_section (bss_section);
8646   fprintf (stream, "\t.align %u\n", align / BITS_PER_UNIT);
8647
8648 #ifdef LOCAL_ASM_OP
8649   fprintf (stream, "%s", LOCAL_ASM_OP);
8650   assemble_name (stream, name);
8651   fprintf (stream, "\n");
8652 #endif
8653
8654   ASM_OUTPUT_LABEL (stream, name);
8655   fprintf (stream, "\t.block "HOST_WIDE_INT_PRINT_UNSIGNED"\n", size);
8656 }
8657
8658 /* Returns 1 if the 6 operands specified in OPERANDS are suitable for
8659    use in fmpysub instructions.  */
8660 int
8661 fmpysuboperands (rtx *operands)
8662 {
8663   enum machine_mode mode = GET_MODE (operands[0]);
8664
8665   /* Must be a floating point mode.  */
8666   if (mode != SFmode && mode != DFmode)
8667     return 0;
8668
8669   /* All modes must be the same.  */
8670   if (! (mode == GET_MODE (operands[1])
8671          && mode == GET_MODE (operands[2])
8672          && mode == GET_MODE (operands[3])
8673          && mode == GET_MODE (operands[4])
8674          && mode == GET_MODE (operands[5])))
8675     return 0;
8676
8677   /* All operands must be registers.  */
8678   if (! (GET_CODE (operands[1]) == REG
8679          && GET_CODE (operands[2]) == REG
8680          && GET_CODE (operands[3]) == REG
8681          && GET_CODE (operands[4]) == REG
8682          && GET_CODE (operands[5]) == REG))
8683     return 0;
8684
8685   /* Only 2 real operands to the subtraction.  Subtraction is not a commutative
8686      operation, so operands[4] must be the same as operand[3].  */
8687   if (! rtx_equal_p (operands[3], operands[4]))
8688     return 0;
8689
8690   /* multiply cannot feed into subtraction.  */
8691   if (rtx_equal_p (operands[5], operands[0]))
8692     return 0;
8693
8694   /* Inout operand of sub cannot conflict with any operands from multiply.  */
8695   if (rtx_equal_p (operands[3], operands[0])
8696      || rtx_equal_p (operands[3], operands[1])
8697      || rtx_equal_p (operands[3], operands[2]))
8698     return 0;
8699
8700   /* SFmode limits the registers to the upper 32 of the 32bit FP regs.  */
8701   if (mode == SFmode
8702       && (REGNO_REG_CLASS (REGNO (operands[0])) != FPUPPER_REGS
8703           || REGNO_REG_CLASS (REGNO (operands[1])) != FPUPPER_REGS
8704           || REGNO_REG_CLASS (REGNO (operands[2])) != FPUPPER_REGS
8705           || REGNO_REG_CLASS (REGNO (operands[3])) != FPUPPER_REGS
8706           || REGNO_REG_CLASS (REGNO (operands[4])) != FPUPPER_REGS
8707           || REGNO_REG_CLASS (REGNO (operands[5])) != FPUPPER_REGS))
8708     return 0;
8709
8710   /* Passed.  Operands are suitable for fmpysub.  */
8711   return 1;
8712 }
8713
8714 /* Return 1 if the given constant is 2, 4, or 8.  These are the valid
8715    constants for shadd instructions.  */
8716 int
8717 shadd_constant_p (int val)
8718 {
8719   if (val == 2 || val == 4 || val == 8)
8720     return 1;
8721   else
8722     return 0;
8723 }
8724
8725 /* Return TRUE if INSN branches forward.  */
8726
8727 static bool
8728 forward_branch_p (rtx insn)
8729 {
8730   rtx lab = JUMP_LABEL (insn);
8731
8732   /* The INSN must have a jump label.  */
8733   gcc_assert (lab != NULL_RTX);
8734
8735   if (INSN_ADDRESSES_SET_P ())
8736     return INSN_ADDRESSES (INSN_UID (lab)) > INSN_ADDRESSES (INSN_UID (insn));  
8737
8738   while (insn)
8739     {
8740       if (insn == lab)
8741         return true;
8742       else
8743         insn = NEXT_INSN (insn);
8744     }
8745
8746   return false;
8747 }
8748
8749 /* Return 1 if INSN is in the delay slot of a call instruction.  */
8750 int
8751 jump_in_call_delay (rtx insn)
8752 {
8753
8754   if (GET_CODE (insn) != JUMP_INSN)
8755     return 0;
8756
8757   if (PREV_INSN (insn)
8758       && PREV_INSN (PREV_INSN (insn))
8759       && GET_CODE (next_real_insn (PREV_INSN (PREV_INSN (insn)))) == INSN)
8760     {
8761       rtx test_insn = next_real_insn (PREV_INSN (PREV_INSN (insn)));
8762
8763       return (GET_CODE (PATTERN (test_insn)) == SEQUENCE
8764               && XVECEXP (PATTERN (test_insn), 0, 1) == insn);
8765
8766     }
8767   else
8768     return 0;
8769 }
8770
8771 /* Output an unconditional move and branch insn.  */
8772
8773 const char *
8774 output_parallel_movb (rtx *operands, rtx insn)
8775 {
8776   int length = get_attr_length (insn);
8777
8778   /* These are the cases in which we win.  */
8779   if (length == 4)
8780     return "mov%I1b,tr %1,%0,%2";
8781
8782   /* None of the following cases win, but they don't lose either.  */
8783   if (length == 8)
8784     {
8785       if (dbr_sequence_length () == 0)
8786         {
8787           /* Nothing in the delay slot, fake it by putting the combined
8788              insn (the copy or add) in the delay slot of a bl.  */
8789           if (GET_CODE (operands[1]) == CONST_INT)
8790             return "b %2\n\tldi %1,%0";
8791           else
8792             return "b %2\n\tcopy %1,%0";
8793         }
8794       else
8795         {
8796           /* Something in the delay slot, but we've got a long branch.  */
8797           if (GET_CODE (operands[1]) == CONST_INT)
8798             return "ldi %1,%0\n\tb %2";
8799           else
8800             return "copy %1,%0\n\tb %2";
8801         }
8802     }
8803
8804   if (GET_CODE (operands[1]) == CONST_INT)
8805     output_asm_insn ("ldi %1,%0", operands);
8806   else
8807     output_asm_insn ("copy %1,%0", operands);
8808   return output_lbranch (operands[2], insn, 1);
8809 }
8810
8811 /* Output an unconditional add and branch insn.  */
8812
8813 const char *
8814 output_parallel_addb (rtx *operands, rtx insn)
8815 {
8816   int length = get_attr_length (insn);
8817
8818   /* To make life easy we want operand0 to be the shared input/output
8819      operand and operand1 to be the readonly operand.  */
8820   if (operands[0] == operands[1])
8821     operands[1] = operands[2];
8822
8823   /* These are the cases in which we win.  */
8824   if (length == 4)
8825     return "add%I1b,tr %1,%0,%3";
8826
8827   /* None of the following cases win, but they don't lose either.  */
8828   if (length == 8)
8829     {
8830       if (dbr_sequence_length () == 0)
8831         /* Nothing in the delay slot, fake it by putting the combined
8832            insn (the copy or add) in the delay slot of a bl.  */
8833         return "b %3\n\tadd%I1 %1,%0,%0";
8834       else
8835         /* Something in the delay slot, but we've got a long branch.  */
8836         return "add%I1 %1,%0,%0\n\tb %3";
8837     }
8838
8839   output_asm_insn ("add%I1 %1,%0,%0", operands);
8840   return output_lbranch (operands[3], insn, 1);
8841 }
8842
8843 /* Return nonzero if INSN (a jump insn) immediately follows a call
8844    to a named function.  This is used to avoid filling the delay slot
8845    of the jump since it can usually be eliminated by modifying RP in
8846    the delay slot of the call.  */
8847
8848 int
8849 following_call (rtx insn)
8850 {
8851   if (! TARGET_JUMP_IN_DELAY)
8852     return 0;
8853
8854   /* Find the previous real insn, skipping NOTEs.  */
8855   insn = PREV_INSN (insn);
8856   while (insn && GET_CODE (insn) == NOTE)
8857     insn = PREV_INSN (insn);
8858
8859   /* Check for CALL_INSNs and millicode calls.  */
8860   if (insn
8861       && ((GET_CODE (insn) == CALL_INSN
8862            && get_attr_type (insn) != TYPE_DYNCALL)
8863           || (GET_CODE (insn) == INSN
8864               && GET_CODE (PATTERN (insn)) != SEQUENCE
8865               && GET_CODE (PATTERN (insn)) != USE
8866               && GET_CODE (PATTERN (insn)) != CLOBBER
8867               && get_attr_type (insn) == TYPE_MILLI)))
8868     return 1;
8869
8870   return 0;
8871 }
8872
8873 /* We use this hook to perform a PA specific optimization which is difficult
8874    to do in earlier passes.
8875
8876    We want the delay slots of branches within jump tables to be filled.
8877    None of the compiler passes at the moment even has the notion that a
8878    PA jump table doesn't contain addresses, but instead contains actual
8879    instructions!
8880
8881    Because we actually jump into the table, the addresses of each entry
8882    must stay constant in relation to the beginning of the table (which
8883    itself must stay constant relative to the instruction to jump into
8884    it).  I don't believe we can guarantee earlier passes of the compiler
8885    will adhere to those rules.
8886
8887    So, late in the compilation process we find all the jump tables, and
8888    expand them into real code -- e.g. each entry in the jump table vector
8889    will get an appropriate label followed by a jump to the final target.
8890
8891    Reorg and the final jump pass can then optimize these branches and
8892    fill their delay slots.  We end up with smaller, more efficient code.
8893
8894    The jump instructions within the table are special; we must be able
8895    to identify them during assembly output (if the jumps don't get filled
8896    we need to emit a nop rather than nullifying the delay slot)).  We
8897    identify jumps in switch tables by using insns with the attribute
8898    type TYPE_BTABLE_BRANCH.
8899
8900    We also surround the jump table itself with BEGIN_BRTAB and END_BRTAB
8901    insns.  This serves two purposes, first it prevents jump.c from
8902    noticing that the last N entries in the table jump to the instruction
8903    immediately after the table and deleting the jumps.  Second, those
8904    insns mark where we should emit .begin_brtab and .end_brtab directives
8905    when using GAS (allows for better link time optimizations).  */
8906
8907 static void
8908 pa_reorg (void)
8909 {
8910   rtx insn;
8911
8912   remove_useless_addtr_insns (1);
8913
8914   if (pa_cpu < PROCESSOR_8000)
8915     pa_combine_instructions ();
8916
8917
8918   /* This is fairly cheap, so always run it if optimizing.  */
8919   if (optimize > 0 && !TARGET_BIG_SWITCH)
8920     {
8921       /* Find and explode all ADDR_VEC or ADDR_DIFF_VEC insns.  */
8922       for (insn = get_insns (); insn; insn = NEXT_INSN (insn))
8923         {
8924           rtx pattern, tmp, location, label;
8925           unsigned int length, i;
8926
8927           /* Find an ADDR_VEC or ADDR_DIFF_VEC insn to explode.  */
8928           if (GET_CODE (insn) != JUMP_INSN
8929               || (GET_CODE (PATTERN (insn)) != ADDR_VEC
8930                   && GET_CODE (PATTERN (insn)) != ADDR_DIFF_VEC))
8931             continue;
8932
8933           /* Emit marker for the beginning of the branch table.  */
8934           emit_insn_before (gen_begin_brtab (), insn);
8935
8936           pattern = PATTERN (insn);
8937           location = PREV_INSN (insn);
8938           length = XVECLEN (pattern, GET_CODE (pattern) == ADDR_DIFF_VEC);
8939
8940           for (i = 0; i < length; i++)
8941             {
8942               /* Emit a label before each jump to keep jump.c from
8943                  removing this code.  */
8944               tmp = gen_label_rtx ();
8945               LABEL_NUSES (tmp) = 1;
8946               emit_label_after (tmp, location);
8947               location = NEXT_INSN (location);
8948
8949               if (GET_CODE (pattern) == ADDR_VEC)
8950                 label = XEXP (XVECEXP (pattern, 0, i), 0);
8951               else
8952                 label = XEXP (XVECEXP (pattern, 1, i), 0);
8953
8954               tmp = gen_short_jump (label);
8955
8956               /* Emit the jump itself.  */
8957               tmp = emit_jump_insn_after (tmp, location);
8958               JUMP_LABEL (tmp) = label;
8959               LABEL_NUSES (label)++;
8960               location = NEXT_INSN (location);
8961
8962               /* Emit a BARRIER after the jump.  */
8963               emit_barrier_after (location);
8964               location = NEXT_INSN (location);
8965             }
8966
8967           /* Emit marker for the end of the branch table.  */
8968           emit_insn_before (gen_end_brtab (), location);
8969           location = NEXT_INSN (location);
8970           emit_barrier_after (location);
8971
8972           /* Delete the ADDR_VEC or ADDR_DIFF_VEC.  */
8973           delete_insn (insn);
8974         }
8975     }
8976   else
8977     {
8978       /* Still need brtab marker insns.  FIXME: the presence of these
8979          markers disables output of the branch table to readonly memory,
8980          and any alignment directives that might be needed.  Possibly,
8981          the begin_brtab insn should be output before the label for the
8982          table.  This doesn't matter at the moment since the tables are
8983          always output in the text section.  */
8984       for (insn = get_insns (); insn; insn = NEXT_INSN (insn))
8985         {
8986           /* Find an ADDR_VEC insn.  */
8987           if (GET_CODE (insn) != JUMP_INSN
8988               || (GET_CODE (PATTERN (insn)) != ADDR_VEC
8989                   && GET_CODE (PATTERN (insn)) != ADDR_DIFF_VEC))
8990             continue;
8991
8992           /* Now generate markers for the beginning and end of the
8993              branch table.  */
8994           emit_insn_before (gen_begin_brtab (), insn);
8995           emit_insn_after (gen_end_brtab (), insn);
8996         }
8997     }
8998 }
8999
9000 /* The PA has a number of odd instructions which can perform multiple
9001    tasks at once.  On first generation PA machines (PA1.0 and PA1.1)
9002    it may be profitable to combine two instructions into one instruction
9003    with two outputs.  It's not profitable PA2.0 machines because the
9004    two outputs would take two slots in the reorder buffers.
9005
9006    This routine finds instructions which can be combined and combines
9007    them.  We only support some of the potential combinations, and we
9008    only try common ways to find suitable instructions.
9009
9010       * addb can add two registers or a register and a small integer
9011       and jump to a nearby (+-8k) location.  Normally the jump to the
9012       nearby location is conditional on the result of the add, but by
9013       using the "true" condition we can make the jump unconditional.
9014       Thus addb can perform two independent operations in one insn.
9015
9016       * movb is similar to addb in that it can perform a reg->reg
9017       or small immediate->reg copy and jump to a nearby (+-8k location).
9018
9019       * fmpyadd and fmpysub can perform a FP multiply and either an
9020       FP add or FP sub if the operands of the multiply and add/sub are
9021       independent (there are other minor restrictions).  Note both
9022       the fmpy and fadd/fsub can in theory move to better spots according
9023       to data dependencies, but for now we require the fmpy stay at a
9024       fixed location.
9025
9026       * Many of the memory operations can perform pre & post updates
9027       of index registers.  GCC's pre/post increment/decrement addressing
9028       is far too simple to take advantage of all the possibilities.  This
9029       pass may not be suitable since those insns may not be independent.
9030
9031       * comclr can compare two ints or an int and a register, nullify
9032       the following instruction and zero some other register.  This
9033       is more difficult to use as it's harder to find an insn which
9034       will generate a comclr than finding something like an unconditional
9035       branch.  (conditional moves & long branches create comclr insns).
9036
9037       * Most arithmetic operations can conditionally skip the next
9038       instruction.  They can be viewed as "perform this operation
9039       and conditionally jump to this nearby location" (where nearby
9040       is an insns away).  These are difficult to use due to the
9041       branch length restrictions.  */
9042
9043 static void
9044 pa_combine_instructions (void)
9045 {
9046   rtx anchor, new_rtx;
9047
9048   /* This can get expensive since the basic algorithm is on the
9049      order of O(n^2) (or worse).  Only do it for -O2 or higher
9050      levels of optimization.  */
9051   if (optimize < 2)
9052     return;
9053
9054   /* Walk down the list of insns looking for "anchor" insns which
9055      may be combined with "floating" insns.  As the name implies,
9056      "anchor" instructions don't move, while "floating" insns may
9057      move around.  */
9058   new_rtx = gen_rtx_PARALLEL (VOIDmode, gen_rtvec (2, NULL_RTX, NULL_RTX));
9059   new_rtx = make_insn_raw (new_rtx);
9060
9061   for (anchor = get_insns (); anchor; anchor = NEXT_INSN (anchor))
9062     {
9063       enum attr_pa_combine_type anchor_attr;
9064       enum attr_pa_combine_type floater_attr;
9065
9066       /* We only care about INSNs, JUMP_INSNs, and CALL_INSNs.
9067          Also ignore any special USE insns.  */
9068       if ((GET_CODE (anchor) != INSN
9069           && GET_CODE (anchor) != JUMP_INSN
9070           && GET_CODE (anchor) != CALL_INSN)
9071           || GET_CODE (PATTERN (anchor)) == USE
9072           || GET_CODE (PATTERN (anchor)) == CLOBBER
9073           || GET_CODE (PATTERN (anchor)) == ADDR_VEC
9074           || GET_CODE (PATTERN (anchor)) == ADDR_DIFF_VEC)
9075         continue;
9076
9077       anchor_attr = get_attr_pa_combine_type (anchor);
9078       /* See if anchor is an insn suitable for combination.  */
9079       if (anchor_attr == PA_COMBINE_TYPE_FMPY
9080           || anchor_attr == PA_COMBINE_TYPE_FADDSUB
9081           || (anchor_attr == PA_COMBINE_TYPE_UNCOND_BRANCH
9082               && ! forward_branch_p (anchor)))
9083         {
9084           rtx floater;
9085
9086           for (floater = PREV_INSN (anchor);
9087                floater;
9088                floater = PREV_INSN (floater))
9089             {
9090               if (GET_CODE (floater) == NOTE
9091                   || (GET_CODE (floater) == INSN
9092                       && (GET_CODE (PATTERN (floater)) == USE
9093                           || GET_CODE (PATTERN (floater)) == CLOBBER)))
9094                 continue;
9095
9096               /* Anything except a regular INSN will stop our search.  */
9097               if (GET_CODE (floater) != INSN
9098                   || GET_CODE (PATTERN (floater)) == ADDR_VEC
9099                   || GET_CODE (PATTERN (floater)) == ADDR_DIFF_VEC)
9100                 {
9101                   floater = NULL_RTX;
9102                   break;
9103                 }
9104
9105               /* See if FLOATER is suitable for combination with the
9106                  anchor.  */
9107               floater_attr = get_attr_pa_combine_type (floater);
9108               if ((anchor_attr == PA_COMBINE_TYPE_FMPY
9109                    && floater_attr == PA_COMBINE_TYPE_FADDSUB)
9110                   || (anchor_attr == PA_COMBINE_TYPE_FADDSUB
9111                       && floater_attr == PA_COMBINE_TYPE_FMPY))
9112                 {
9113                   /* If ANCHOR and FLOATER can be combined, then we're
9114                      done with this pass.  */
9115                   if (pa_can_combine_p (new_rtx, anchor, floater, 0,
9116                                         SET_DEST (PATTERN (floater)),
9117                                         XEXP (SET_SRC (PATTERN (floater)), 0),
9118                                         XEXP (SET_SRC (PATTERN (floater)), 1)))
9119                     break;
9120                 }
9121
9122               else if (anchor_attr == PA_COMBINE_TYPE_UNCOND_BRANCH
9123                        && floater_attr == PA_COMBINE_TYPE_ADDMOVE)
9124                 {
9125                   if (GET_CODE (SET_SRC (PATTERN (floater))) == PLUS)
9126                     {
9127                       if (pa_can_combine_p (new_rtx, anchor, floater, 0,
9128                                             SET_DEST (PATTERN (floater)),
9129                                         XEXP (SET_SRC (PATTERN (floater)), 0),
9130                                         XEXP (SET_SRC (PATTERN (floater)), 1)))
9131                         break;
9132                     }
9133                   else
9134                     {
9135                       if (pa_can_combine_p (new_rtx, anchor, floater, 0,
9136                                             SET_DEST (PATTERN (floater)),
9137                                             SET_SRC (PATTERN (floater)),
9138                                             SET_SRC (PATTERN (floater))))
9139                         break;
9140                     }
9141                 }
9142             }
9143
9144           /* If we didn't find anything on the backwards scan try forwards.  */
9145           if (!floater
9146               && (anchor_attr == PA_COMBINE_TYPE_FMPY
9147                   || anchor_attr == PA_COMBINE_TYPE_FADDSUB))
9148             {
9149               for (floater = anchor; floater; floater = NEXT_INSN (floater))
9150                 {
9151                   if (GET_CODE (floater) == NOTE
9152                       || (GET_CODE (floater) == INSN
9153                           && (GET_CODE (PATTERN (floater)) == USE
9154                               || GET_CODE (PATTERN (floater)) == CLOBBER)))
9155
9156                     continue;
9157
9158                   /* Anything except a regular INSN will stop our search.  */
9159                   if (GET_CODE (floater) != INSN
9160                       || GET_CODE (PATTERN (floater)) == ADDR_VEC
9161                       || GET_CODE (PATTERN (floater)) == ADDR_DIFF_VEC)
9162                     {
9163                       floater = NULL_RTX;
9164                       break;
9165                     }
9166
9167                   /* See if FLOATER is suitable for combination with the
9168                      anchor.  */
9169                   floater_attr = get_attr_pa_combine_type (floater);
9170                   if ((anchor_attr == PA_COMBINE_TYPE_FMPY
9171                        && floater_attr == PA_COMBINE_TYPE_FADDSUB)
9172                       || (anchor_attr == PA_COMBINE_TYPE_FADDSUB
9173                           && floater_attr == PA_COMBINE_TYPE_FMPY))
9174                     {
9175                       /* If ANCHOR and FLOATER can be combined, then we're
9176                          done with this pass.  */
9177                       if (pa_can_combine_p (new_rtx, anchor, floater, 1,
9178                                             SET_DEST (PATTERN (floater)),
9179                                             XEXP (SET_SRC (PATTERN (floater)),
9180                                                   0),
9181                                             XEXP (SET_SRC (PATTERN (floater)),
9182                                                   1)))
9183                         break;
9184                     }
9185                 }
9186             }
9187
9188           /* FLOATER will be nonzero if we found a suitable floating
9189              insn for combination with ANCHOR.  */
9190           if (floater
9191               && (anchor_attr == PA_COMBINE_TYPE_FADDSUB
9192                   || anchor_attr == PA_COMBINE_TYPE_FMPY))
9193             {
9194               /* Emit the new instruction and delete the old anchor.  */
9195               emit_insn_before (gen_rtx_PARALLEL
9196                                 (VOIDmode,
9197                                  gen_rtvec (2, PATTERN (anchor),
9198                                             PATTERN (floater))),
9199                                 anchor);
9200
9201               SET_INSN_DELETED (anchor);
9202
9203               /* Emit a special USE insn for FLOATER, then delete
9204                  the floating insn.  */
9205               emit_insn_before (gen_rtx_USE (VOIDmode, floater), floater);
9206               delete_insn (floater);
9207
9208               continue;
9209             }
9210           else if (floater
9211                    && anchor_attr == PA_COMBINE_TYPE_UNCOND_BRANCH)
9212             {
9213               rtx temp;
9214               /* Emit the new_jump instruction and delete the old anchor.  */
9215               temp
9216                 = emit_jump_insn_before (gen_rtx_PARALLEL
9217                                          (VOIDmode,
9218                                           gen_rtvec (2, PATTERN (anchor),
9219                                                      PATTERN (floater))),
9220                                          anchor);
9221
9222               JUMP_LABEL (temp) = JUMP_LABEL (anchor);
9223               SET_INSN_DELETED (anchor);
9224
9225               /* Emit a special USE insn for FLOATER, then delete
9226                  the floating insn.  */
9227               emit_insn_before (gen_rtx_USE (VOIDmode, floater), floater);
9228               delete_insn (floater);
9229               continue;
9230             }
9231         }
9232     }
9233 }
9234
9235 static int
9236 pa_can_combine_p (rtx new_rtx, rtx anchor, rtx floater, int reversed, rtx dest,
9237                   rtx src1, rtx src2)
9238 {
9239   int insn_code_number;
9240   rtx start, end;
9241
9242   /* Create a PARALLEL with the patterns of ANCHOR and
9243      FLOATER, try to recognize it, then test constraints
9244      for the resulting pattern.
9245
9246      If the pattern doesn't match or the constraints
9247      aren't met keep searching for a suitable floater
9248      insn.  */
9249   XVECEXP (PATTERN (new_rtx), 0, 0) = PATTERN (anchor);
9250   XVECEXP (PATTERN (new_rtx), 0, 1) = PATTERN (floater);
9251   INSN_CODE (new_rtx) = -1;
9252   insn_code_number = recog_memoized (new_rtx);
9253   if (insn_code_number < 0
9254       || (extract_insn (new_rtx), ! constrain_operands (1)))
9255     return 0;
9256
9257   if (reversed)
9258     {
9259       start = anchor;
9260       end = floater;
9261     }
9262   else
9263     {
9264       start = floater;
9265       end = anchor;
9266     }
9267
9268   /* There's up to three operands to consider.  One
9269      output and two inputs.
9270
9271      The output must not be used between FLOATER & ANCHOR
9272      exclusive.  The inputs must not be set between
9273      FLOATER and ANCHOR exclusive.  */
9274
9275   if (reg_used_between_p (dest, start, end))
9276     return 0;
9277
9278   if (reg_set_between_p (src1, start, end))
9279     return 0;
9280
9281   if (reg_set_between_p (src2, start, end))
9282     return 0;
9283
9284   /* If we get here, then everything is good.  */
9285   return 1;
9286 }
9287
9288 /* Return nonzero if references for INSN are delayed.
9289
9290    Millicode insns are actually function calls with some special
9291    constraints on arguments and register usage.
9292
9293    Millicode calls always expect their arguments in the integer argument
9294    registers, and always return their result in %r29 (ret1).  They
9295    are expected to clobber their arguments, %r1, %r29, and the return
9296    pointer which is %r31 on 32-bit and %r2 on 64-bit, and nothing else.
9297
9298    This function tells reorg that the references to arguments and
9299    millicode calls do not appear to happen until after the millicode call.
9300    This allows reorg to put insns which set the argument registers into the
9301    delay slot of the millicode call -- thus they act more like traditional
9302    CALL_INSNs.
9303
9304    Note we cannot consider side effects of the insn to be delayed because
9305    the branch and link insn will clobber the return pointer.  If we happened
9306    to use the return pointer in the delay slot of the call, then we lose.
9307
9308    get_attr_type will try to recognize the given insn, so make sure to
9309    filter out things it will not accept -- SEQUENCE, USE and CLOBBER insns
9310    in particular.  */
9311 int
9312 insn_refs_are_delayed (rtx insn)
9313 {
9314   return ((GET_CODE (insn) == INSN
9315            && GET_CODE (PATTERN (insn)) != SEQUENCE
9316            && GET_CODE (PATTERN (insn)) != USE
9317            && GET_CODE (PATTERN (insn)) != CLOBBER
9318            && get_attr_type (insn) == TYPE_MILLI));
9319 }
9320
9321 /* Promote the return value, but not the arguments.  */
9322
9323 static enum machine_mode
9324 pa_promote_function_mode (const_tree type ATTRIBUTE_UNUSED,
9325                           enum machine_mode mode,
9326                           int *punsignedp ATTRIBUTE_UNUSED,
9327                           const_tree fntype ATTRIBUTE_UNUSED,
9328                           int for_return)
9329 {
9330   if (for_return == 0)
9331     return mode;
9332   return promote_mode (type, mode, punsignedp);
9333 }
9334
9335 /* On the HP-PA the value is found in register(s) 28(-29), unless
9336    the mode is SF or DF. Then the value is returned in fr4 (32).
9337
9338    This must perform the same promotions as PROMOTE_MODE, else promoting
9339    return values in TARGET_PROMOTE_FUNCTION_MODE will not work correctly.
9340
9341    Small structures must be returned in a PARALLEL on PA64 in order
9342    to match the HP Compiler ABI.  */
9343
9344 static rtx
9345 pa_function_value (const_tree valtype, 
9346                    const_tree func ATTRIBUTE_UNUSED, 
9347                    bool outgoing ATTRIBUTE_UNUSED)
9348 {
9349   enum machine_mode valmode;
9350
9351   if (AGGREGATE_TYPE_P (valtype)
9352       || TREE_CODE (valtype) == COMPLEX_TYPE
9353       || TREE_CODE (valtype) == VECTOR_TYPE)
9354     {
9355       if (TARGET_64BIT)
9356         {
9357           /* Aggregates with a size less than or equal to 128 bits are
9358              returned in GR 28(-29).  They are left justified.  The pad
9359              bits are undefined.  Larger aggregates are returned in
9360              memory.  */
9361           rtx loc[2];
9362           int i, offset = 0;
9363           int ub = int_size_in_bytes (valtype) <= UNITS_PER_WORD ? 1 : 2;
9364
9365           for (i = 0; i < ub; i++)
9366             {
9367               loc[i] = gen_rtx_EXPR_LIST (VOIDmode,
9368                                           gen_rtx_REG (DImode, 28 + i),
9369                                           GEN_INT (offset));
9370               offset += 8;
9371             }
9372
9373           return gen_rtx_PARALLEL (BLKmode, gen_rtvec_v (ub, loc));
9374         }
9375       else if (int_size_in_bytes (valtype) > UNITS_PER_WORD)
9376         {
9377           /* Aggregates 5 to 8 bytes in size are returned in general
9378              registers r28-r29 in the same manner as other non
9379              floating-point objects.  The data is right-justified and
9380              zero-extended to 64 bits.  This is opposite to the normal
9381              justification used on big endian targets and requires
9382              special treatment.  */
9383           rtx loc = gen_rtx_EXPR_LIST (VOIDmode,
9384                                        gen_rtx_REG (DImode, 28), const0_rtx);
9385           return gen_rtx_PARALLEL (BLKmode, gen_rtvec (1, loc));
9386         }
9387     }
9388
9389   if ((INTEGRAL_TYPE_P (valtype)
9390        && GET_MODE_BITSIZE (TYPE_MODE (valtype)) < BITS_PER_WORD)
9391       || POINTER_TYPE_P (valtype))
9392     valmode = word_mode;
9393   else
9394     valmode = TYPE_MODE (valtype);
9395
9396   if (TREE_CODE (valtype) == REAL_TYPE
9397       && !AGGREGATE_TYPE_P (valtype)
9398       && TYPE_MODE (valtype) != TFmode
9399       && !TARGET_SOFT_FLOAT)
9400     return gen_rtx_REG (valmode, 32);
9401
9402   return gen_rtx_REG (valmode, 28);
9403 }
9404
9405 /* Implement the TARGET_LIBCALL_VALUE hook.  */
9406
9407 static rtx
9408 pa_libcall_value (enum machine_mode mode,
9409                   const_rtx fun ATTRIBUTE_UNUSED)
9410 {
9411   if (! TARGET_SOFT_FLOAT
9412       && (mode == SFmode || mode == DFmode))
9413     return  gen_rtx_REG (mode, 32);
9414   else
9415     return  gen_rtx_REG (mode, 28);
9416 }
9417
9418 /* Implement the TARGET_FUNCTION_VALUE_REGNO_P hook.  */
9419
9420 static bool
9421 pa_function_value_regno_p (const unsigned int regno)
9422 {
9423   if (regno == 28
9424       || (! TARGET_SOFT_FLOAT &&  regno == 32))
9425     return true;
9426
9427   return false;
9428 }
9429
9430 /* Update the data in CUM to advance over an argument
9431    of mode MODE and data type TYPE.
9432    (TYPE is null for libcalls where that information may not be available.)  */
9433
9434 static void
9435 pa_function_arg_advance (CUMULATIVE_ARGS *cum, enum machine_mode mode,
9436                          const_tree type, bool named ATTRIBUTE_UNUSED)
9437 {
9438   int arg_size = FUNCTION_ARG_SIZE (mode, type);
9439
9440   cum->nargs_prototype--;
9441   cum->words += (arg_size
9442                  + ((cum->words & 01)
9443                     && type != NULL_TREE
9444                     && arg_size > 1));
9445 }
9446
9447 /* Return the location of a parameter that is passed in a register or NULL
9448    if the parameter has any component that is passed in memory.
9449
9450    This is new code and will be pushed to into the net sources after
9451    further testing.
9452
9453    ??? We might want to restructure this so that it looks more like other
9454    ports.  */
9455 static rtx
9456 pa_function_arg (CUMULATIVE_ARGS *cum, enum machine_mode mode,
9457                  const_tree type, bool named ATTRIBUTE_UNUSED)
9458 {
9459   int max_arg_words = (TARGET_64BIT ? 8 : 4);
9460   int alignment = 0;
9461   int arg_size;
9462   int fpr_reg_base;
9463   int gpr_reg_base;
9464   rtx retval;
9465
9466   if (mode == VOIDmode)
9467     return NULL_RTX;
9468
9469   arg_size = FUNCTION_ARG_SIZE (mode, type);
9470
9471   /* If this arg would be passed partially or totally on the stack, then
9472      this routine should return zero.  pa_arg_partial_bytes will
9473      handle arguments which are split between regs and stack slots if
9474      the ABI mandates split arguments.  */
9475   if (!TARGET_64BIT)
9476     {
9477       /* The 32-bit ABI does not split arguments.  */
9478       if (cum->words + arg_size > max_arg_words)
9479         return NULL_RTX;
9480     }
9481   else
9482     {
9483       if (arg_size > 1)
9484         alignment = cum->words & 1;
9485       if (cum->words + alignment >= max_arg_words)
9486         return NULL_RTX;
9487     }
9488
9489   /* The 32bit ABIs and the 64bit ABIs are rather different,
9490      particularly in their handling of FP registers.  We might
9491      be able to cleverly share code between them, but I'm not
9492      going to bother in the hope that splitting them up results
9493      in code that is more easily understood.  */
9494
9495   if (TARGET_64BIT)
9496     {
9497       /* Advance the base registers to their current locations.
9498
9499          Remember, gprs grow towards smaller register numbers while
9500          fprs grow to higher register numbers.  Also remember that
9501          although FP regs are 32-bit addressable, we pretend that
9502          the registers are 64-bits wide.  */
9503       gpr_reg_base = 26 - cum->words;
9504       fpr_reg_base = 32 + cum->words;
9505
9506       /* Arguments wider than one word and small aggregates need special
9507          treatment.  */
9508       if (arg_size > 1
9509           || mode == BLKmode
9510           || (type && (AGGREGATE_TYPE_P (type)
9511                        || TREE_CODE (type) == COMPLEX_TYPE
9512                        || TREE_CODE (type) == VECTOR_TYPE)))
9513         {
9514           /* Double-extended precision (80-bit), quad-precision (128-bit)
9515              and aggregates including complex numbers are aligned on
9516              128-bit boundaries.  The first eight 64-bit argument slots
9517              are associated one-to-one, with general registers r26
9518              through r19, and also with floating-point registers fr4
9519              through fr11.  Arguments larger than one word are always
9520              passed in general registers.
9521
9522              Using a PARALLEL with a word mode register results in left
9523              justified data on a big-endian target.  */
9524
9525           rtx loc[8];
9526           int i, offset = 0, ub = arg_size;
9527
9528           /* Align the base register.  */
9529           gpr_reg_base -= alignment;
9530
9531           ub = MIN (ub, max_arg_words - cum->words - alignment);
9532           for (i = 0; i < ub; i++)
9533             {
9534               loc[i] = gen_rtx_EXPR_LIST (VOIDmode,
9535                                           gen_rtx_REG (DImode, gpr_reg_base),
9536                                           GEN_INT (offset));
9537               gpr_reg_base -= 1;
9538               offset += 8;
9539             }
9540
9541           return gen_rtx_PARALLEL (mode, gen_rtvec_v (ub, loc));
9542         }
9543      }
9544   else
9545     {
9546       /* If the argument is larger than a word, then we know precisely
9547          which registers we must use.  */
9548       if (arg_size > 1)
9549         {
9550           if (cum->words)
9551             {
9552               gpr_reg_base = 23;
9553               fpr_reg_base = 38;
9554             }
9555           else
9556             {
9557               gpr_reg_base = 25;
9558               fpr_reg_base = 34;
9559             }
9560
9561           /* Structures 5 to 8 bytes in size are passed in the general
9562              registers in the same manner as other non floating-point
9563              objects.  The data is right-justified and zero-extended
9564              to 64 bits.  This is opposite to the normal justification
9565              used on big endian targets and requires special treatment.
9566              We now define BLOCK_REG_PADDING to pad these objects.
9567              Aggregates, complex and vector types are passed in the same
9568              manner as structures.  */
9569           if (mode == BLKmode
9570               || (type && (AGGREGATE_TYPE_P (type)
9571                            || TREE_CODE (type) == COMPLEX_TYPE
9572                            || TREE_CODE (type) == VECTOR_TYPE)))
9573             {
9574               rtx loc = gen_rtx_EXPR_LIST (VOIDmode,
9575                                            gen_rtx_REG (DImode, gpr_reg_base),
9576                                            const0_rtx);
9577               return gen_rtx_PARALLEL (BLKmode, gen_rtvec (1, loc));
9578             }
9579         }
9580       else
9581         {
9582            /* We have a single word (32 bits).  A simple computation
9583               will get us the register #s we need.  */
9584            gpr_reg_base = 26 - cum->words;
9585            fpr_reg_base = 32 + 2 * cum->words;
9586         }
9587     }
9588
9589   /* Determine if the argument needs to be passed in both general and
9590      floating point registers.  */
9591   if (((TARGET_PORTABLE_RUNTIME || TARGET_64BIT || TARGET_ELF32)
9592        /* If we are doing soft-float with portable runtime, then there
9593           is no need to worry about FP regs.  */
9594        && !TARGET_SOFT_FLOAT
9595        /* The parameter must be some kind of scalar float, else we just
9596           pass it in integer registers.  */
9597        && GET_MODE_CLASS (mode) == MODE_FLOAT
9598        /* The target function must not have a prototype.  */
9599        && cum->nargs_prototype <= 0
9600        /* libcalls do not need to pass items in both FP and general
9601           registers.  */
9602        && type != NULL_TREE
9603        /* All this hair applies to "outgoing" args only.  This includes
9604           sibcall arguments setup with FUNCTION_INCOMING_ARG.  */
9605        && !cum->incoming)
9606       /* Also pass outgoing floating arguments in both registers in indirect
9607          calls with the 32 bit ABI and the HP assembler since there is no
9608          way to the specify argument locations in static functions.  */
9609       || (!TARGET_64BIT
9610           && !TARGET_GAS
9611           && !cum->incoming
9612           && cum->indirect
9613           && GET_MODE_CLASS (mode) == MODE_FLOAT))
9614     {
9615       retval
9616         = gen_rtx_PARALLEL
9617             (mode,
9618              gen_rtvec (2,
9619                         gen_rtx_EXPR_LIST (VOIDmode,
9620                                            gen_rtx_REG (mode, fpr_reg_base),
9621                                            const0_rtx),
9622                         gen_rtx_EXPR_LIST (VOIDmode,
9623                                            gen_rtx_REG (mode, gpr_reg_base),
9624                                            const0_rtx)));
9625     }
9626   else
9627     {
9628       /* See if we should pass this parameter in a general register.  */
9629       if (TARGET_SOFT_FLOAT
9630           /* Indirect calls in the normal 32bit ABI require all arguments
9631              to be passed in general registers.  */
9632           || (!TARGET_PORTABLE_RUNTIME
9633               && !TARGET_64BIT
9634               && !TARGET_ELF32
9635               && cum->indirect)
9636           /* If the parameter is not a scalar floating-point parameter,
9637              then it belongs in GPRs.  */
9638           || GET_MODE_CLASS (mode) != MODE_FLOAT
9639           /* Structure with single SFmode field belongs in GPR.  */
9640           || (type && AGGREGATE_TYPE_P (type)))
9641         retval = gen_rtx_REG (mode, gpr_reg_base);
9642       else
9643         retval = gen_rtx_REG (mode, fpr_reg_base);
9644     }
9645   return retval;
9646 }
9647
9648 /* Arguments larger than one word are double word aligned.  */
9649
9650 static unsigned int
9651 pa_function_arg_boundary (enum machine_mode mode, const_tree type)
9652 {
9653   bool singleword = (type
9654                      ? (integer_zerop (TYPE_SIZE (type))
9655                         || !TREE_CONSTANT (TYPE_SIZE (type))
9656                         || int_size_in_bytes (type) <= UNITS_PER_WORD)
9657                      : GET_MODE_SIZE (mode) <= UNITS_PER_WORD);
9658
9659   return singleword ? PARM_BOUNDARY : MAX_PARM_BOUNDARY;
9660 }
9661
9662 /* If this arg would be passed totally in registers or totally on the stack,
9663    then this routine should return zero.  */
9664
9665 static int
9666 pa_arg_partial_bytes (CUMULATIVE_ARGS *cum, enum machine_mode mode,
9667                       tree type, bool named ATTRIBUTE_UNUSED)
9668 {
9669   unsigned int max_arg_words = 8;
9670   unsigned int offset = 0;
9671
9672   if (!TARGET_64BIT)
9673     return 0;
9674
9675   if (FUNCTION_ARG_SIZE (mode, type) > 1 && (cum->words & 1))
9676     offset = 1;
9677
9678   if (cum->words + offset + FUNCTION_ARG_SIZE (mode, type) <= max_arg_words)
9679     /* Arg fits fully into registers.  */
9680     return 0;
9681   else if (cum->words + offset >= max_arg_words)
9682     /* Arg fully on the stack.  */
9683     return 0;
9684   else
9685     /* Arg is split.  */
9686     return (max_arg_words - cum->words - offset) * UNITS_PER_WORD;
9687 }
9688
9689
9690 /* A get_unnamed_section callback for switching to the text section.
9691
9692    This function is only used with SOM.  Because we don't support
9693    named subspaces, we can only create a new subspace or switch back
9694    to the default text subspace.  */
9695
9696 static void
9697 som_output_text_section_asm_op (const void *data ATTRIBUTE_UNUSED)
9698 {
9699   gcc_assert (TARGET_SOM);
9700   if (TARGET_GAS)
9701     {
9702       if (cfun && cfun->machine && !cfun->machine->in_nsubspa)
9703         {
9704           /* We only want to emit a .nsubspa directive once at the
9705              start of the function.  */
9706           cfun->machine->in_nsubspa = 1;
9707
9708           /* Create a new subspace for the text.  This provides
9709              better stub placement and one-only functions.  */
9710           if (cfun->decl
9711               && DECL_ONE_ONLY (cfun->decl)
9712               && !DECL_WEAK (cfun->decl))
9713             {
9714               output_section_asm_op ("\t.SPACE $TEXT$\n"
9715                                      "\t.NSUBSPA $CODE$,QUAD=0,ALIGN=8,"
9716                                      "ACCESS=44,SORT=24,COMDAT");
9717               return;
9718             }
9719         }
9720       else
9721         {
9722           /* There isn't a current function or the body of the current
9723              function has been completed.  So, we are changing to the
9724              text section to output debugging information.  Thus, we
9725              need to forget that we are in the text section so that
9726              varasm.c will call us when text_section is selected again.  */
9727           gcc_assert (!cfun || !cfun->machine
9728                       || cfun->machine->in_nsubspa == 2);
9729           in_section = NULL;
9730         }
9731       output_section_asm_op ("\t.SPACE $TEXT$\n\t.NSUBSPA $CODE$");
9732       return;
9733     }
9734   output_section_asm_op ("\t.SPACE $TEXT$\n\t.SUBSPA $CODE$");
9735 }
9736
9737 /* A get_unnamed_section callback for switching to comdat data
9738    sections.  This function is only used with SOM.  */
9739
9740 static void
9741 som_output_comdat_data_section_asm_op (const void *data)
9742 {
9743   in_section = NULL;
9744   output_section_asm_op (data);
9745 }
9746
9747 /* Implement TARGET_ASM_INITIALIZE_SECTIONS  */
9748
9749 static void
9750 pa_som_asm_init_sections (void)
9751 {
9752   text_section
9753     = get_unnamed_section (0, som_output_text_section_asm_op, NULL);
9754
9755   /* SOM puts readonly data in the default $LIT$ subspace when PIC code
9756      is not being generated.  */
9757   som_readonly_data_section
9758     = get_unnamed_section (0, output_section_asm_op,
9759                            "\t.SPACE $TEXT$\n\t.SUBSPA $LIT$");
9760
9761   /* When secondary definitions are not supported, SOM makes readonly
9762      data one-only by creating a new $LIT$ subspace in $TEXT$ with
9763      the comdat flag.  */
9764   som_one_only_readonly_data_section
9765     = get_unnamed_section (0, som_output_comdat_data_section_asm_op,
9766                            "\t.SPACE $TEXT$\n"
9767                            "\t.NSUBSPA $LIT$,QUAD=0,ALIGN=8,"
9768                            "ACCESS=0x2c,SORT=16,COMDAT");
9769
9770
9771   /* When secondary definitions are not supported, SOM makes data one-only
9772      by creating a new $DATA$ subspace in $PRIVATE$ with the comdat flag.  */
9773   som_one_only_data_section
9774     = get_unnamed_section (SECTION_WRITE,
9775                            som_output_comdat_data_section_asm_op,
9776                            "\t.SPACE $PRIVATE$\n"
9777                            "\t.NSUBSPA $DATA$,QUAD=1,ALIGN=8,"
9778                            "ACCESS=31,SORT=24,COMDAT");
9779
9780   /* FIXME: HPUX ld generates incorrect GOT entries for "T" fixups
9781      which reference data within the $TEXT$ space (for example constant
9782      strings in the $LIT$ subspace).
9783
9784      The assemblers (GAS and HP as) both have problems with handling
9785      the difference of two symbols which is the other correct way to
9786      reference constant data during PIC code generation.
9787
9788      So, there's no way to reference constant data which is in the
9789      $TEXT$ space during PIC generation.  Instead place all constant
9790      data into the $PRIVATE$ subspace (this reduces sharing, but it
9791      works correctly).  */
9792   readonly_data_section = flag_pic ? data_section : som_readonly_data_section;
9793
9794   /* We must not have a reference to an external symbol defined in a
9795      shared library in a readonly section, else the SOM linker will
9796      complain.
9797
9798      So, we force exception information into the data section.  */
9799   exception_section = data_section;
9800 }
9801
9802 /* On hpux10, the linker will give an error if we have a reference
9803    in the read-only data section to a symbol defined in a shared
9804    library.  Therefore, expressions that might require a reloc can
9805    not be placed in the read-only data section.  */
9806
9807 static section *
9808 pa_select_section (tree exp, int reloc,
9809                    unsigned HOST_WIDE_INT align ATTRIBUTE_UNUSED)
9810 {
9811   if (TREE_CODE (exp) == VAR_DECL
9812       && TREE_READONLY (exp)
9813       && !TREE_THIS_VOLATILE (exp)
9814       && DECL_INITIAL (exp)
9815       && (DECL_INITIAL (exp) == error_mark_node
9816           || TREE_CONSTANT (DECL_INITIAL (exp)))
9817       && !reloc)
9818     {
9819       if (TARGET_SOM
9820           && DECL_ONE_ONLY (exp)
9821           && !DECL_WEAK (exp))
9822         return som_one_only_readonly_data_section;
9823       else
9824         return readonly_data_section;
9825     }
9826   else if (CONSTANT_CLASS_P (exp) && !reloc)
9827     return readonly_data_section;
9828   else if (TARGET_SOM
9829            && TREE_CODE (exp) == VAR_DECL
9830            && DECL_ONE_ONLY (exp)
9831            && !DECL_WEAK (exp))
9832     return som_one_only_data_section;
9833   else
9834     return data_section;
9835 }
9836
9837 static void
9838 pa_globalize_label (FILE *stream, const char *name)
9839 {
9840   /* We only handle DATA objects here, functions are globalized in
9841      ASM_DECLARE_FUNCTION_NAME.  */
9842   if (! FUNCTION_NAME_P (name))
9843   {
9844     fputs ("\t.EXPORT ", stream);
9845     assemble_name (stream, name);
9846     fputs (",DATA\n", stream);
9847   }
9848 }
9849
9850 /* Worker function for TARGET_STRUCT_VALUE_RTX.  */
9851
9852 static rtx
9853 pa_struct_value_rtx (tree fntype ATTRIBUTE_UNUSED,
9854                      int incoming ATTRIBUTE_UNUSED)
9855 {
9856   return gen_rtx_REG (Pmode, PA_STRUCT_VALUE_REGNUM);
9857 }
9858
9859 /* Worker function for TARGET_RETURN_IN_MEMORY.  */
9860
9861 bool
9862 pa_return_in_memory (const_tree type, const_tree fntype ATTRIBUTE_UNUSED)
9863 {
9864   /* SOM ABI says that objects larger than 64 bits are returned in memory.
9865      PA64 ABI says that objects larger than 128 bits are returned in memory.
9866      Note, int_size_in_bytes can return -1 if the size of the object is
9867      variable or larger than the maximum value that can be expressed as
9868      a HOST_WIDE_INT.   It can also return zero for an empty type.  The
9869      simplest way to handle variable and empty types is to pass them in
9870      memory.  This avoids problems in defining the boundaries of argument
9871      slots, allocating registers, etc.  */
9872   return (int_size_in_bytes (type) > (TARGET_64BIT ? 16 : 8)
9873           || int_size_in_bytes (type) <= 0);
9874 }
9875
9876 /* Structure to hold declaration and name of external symbols that are
9877    emitted by GCC.  We generate a vector of these symbols and output them
9878    at the end of the file if and only if SYMBOL_REF_REFERENCED_P is true.
9879    This avoids putting out names that are never really used.  */
9880
9881 typedef struct GTY(()) extern_symbol
9882 {
9883   tree decl;
9884   const char *name;
9885 } extern_symbol;
9886
9887 /* Define gc'd vector type for extern_symbol.  */
9888 DEF_VEC_O(extern_symbol);
9889 DEF_VEC_ALLOC_O(extern_symbol,gc);
9890
9891 /* Vector of extern_symbol pointers.  */
9892 static GTY(()) VEC(extern_symbol,gc) *extern_symbols;
9893
9894 #ifdef ASM_OUTPUT_EXTERNAL_REAL
9895 /* Mark DECL (name NAME) as an external reference (assembler output
9896    file FILE).  This saves the names to output at the end of the file
9897    if actually referenced.  */
9898
9899 void
9900 pa_hpux_asm_output_external (FILE *file, tree decl, const char *name)
9901 {
9902   extern_symbol * p = VEC_safe_push (extern_symbol, gc, extern_symbols, NULL);
9903
9904   gcc_assert (file == asm_out_file);
9905   p->decl = decl;
9906   p->name = name;
9907 }
9908
9909 /* Output text required at the end of an assembler file.
9910    This includes deferred plabels and .import directives for
9911    all external symbols that were actually referenced.  */
9912
9913 static void
9914 pa_hpux_file_end (void)
9915 {
9916   unsigned int i;
9917   extern_symbol *p;
9918
9919   if (!NO_DEFERRED_PROFILE_COUNTERS)
9920     output_deferred_profile_counters ();
9921
9922   output_deferred_plabels ();
9923
9924   for (i = 0; VEC_iterate (extern_symbol, extern_symbols, i, p); i++)
9925     {
9926       tree decl = p->decl;
9927
9928       if (!TREE_ASM_WRITTEN (decl)
9929           && SYMBOL_REF_REFERENCED_P (XEXP (DECL_RTL (decl), 0)))
9930         ASM_OUTPUT_EXTERNAL_REAL (asm_out_file, decl, p->name);
9931     }
9932
9933   VEC_free (extern_symbol, gc, extern_symbols);
9934 }
9935 #endif
9936
9937 /* Return true if a change from mode FROM to mode TO for a register
9938    in register class RCLASS is invalid.  */
9939
9940 bool
9941 pa_cannot_change_mode_class (enum machine_mode from, enum machine_mode to,
9942                              enum reg_class rclass)
9943 {
9944   if (from == to)
9945     return false;
9946
9947   /* Reject changes to/from complex and vector modes.  */
9948   if (COMPLEX_MODE_P (from) || VECTOR_MODE_P (from)
9949       || COMPLEX_MODE_P (to) || VECTOR_MODE_P (to))
9950     return true;
9951       
9952   if (GET_MODE_SIZE (from) == GET_MODE_SIZE (to))
9953     return false;
9954
9955   /* There is no way to load QImode or HImode values directly from
9956      memory.  SImode loads to the FP registers are not zero extended.
9957      On the 64-bit target, this conflicts with the definition of
9958      LOAD_EXTEND_OP.  Thus, we can't allow changing between modes
9959      with different sizes in the floating-point registers.  */
9960   if (MAYBE_FP_REG_CLASS_P (rclass))
9961     return true;
9962
9963   /* HARD_REGNO_MODE_OK places modes with sizes larger than a word
9964      in specific sets of registers.  Thus, we cannot allow changing
9965      to a larger mode when it's larger than a word.  */
9966   if (GET_MODE_SIZE (to) > UNITS_PER_WORD
9967       && GET_MODE_SIZE (to) > GET_MODE_SIZE (from))
9968     return true;
9969
9970   return false;
9971 }
9972
9973 /* Returns TRUE if it is a good idea to tie two pseudo registers
9974    when one has mode MODE1 and one has mode MODE2.
9975    If HARD_REGNO_MODE_OK could produce different values for MODE1 and MODE2,
9976    for any hard reg, then this must be FALSE for correct output.
9977    
9978    We should return FALSE for QImode and HImode because these modes
9979    are not ok in the floating-point registers.  However, this prevents
9980    tieing these modes to SImode and DImode in the general registers.
9981    So, this isn't a good idea.  We rely on HARD_REGNO_MODE_OK and
9982    CANNOT_CHANGE_MODE_CLASS to prevent these modes from being used
9983    in the floating-point registers.  */
9984
9985 bool
9986 pa_modes_tieable_p (enum machine_mode mode1, enum machine_mode mode2)
9987 {
9988   /* Don't tie modes in different classes.  */
9989   if (GET_MODE_CLASS (mode1) != GET_MODE_CLASS (mode2))
9990     return false;
9991
9992   return true;
9993 }
9994
9995 \f
9996 /* Length in units of the trampoline instruction code.  */
9997
9998 #define TRAMPOLINE_CODE_SIZE (TARGET_64BIT ? 24 : (TARGET_PA_20 ? 32 : 40))
9999
10000
10001 /* Output assembler code for a block containing the constant parts
10002    of a trampoline, leaving space for the variable parts.\
10003
10004    The trampoline sets the static chain pointer to STATIC_CHAIN_REGNUM
10005    and then branches to the specified routine.
10006
10007    This code template is copied from text segment to stack location
10008    and then patched with pa_trampoline_init to contain valid values,
10009    and then entered as a subroutine.
10010
10011    It is best to keep this as small as possible to avoid having to
10012    flush multiple lines in the cache.  */
10013
10014 static void
10015 pa_asm_trampoline_template (FILE *f)
10016 {
10017   if (!TARGET_64BIT)
10018     {
10019       fputs ("\tldw     36(%r22),%r21\n", f);
10020       fputs ("\tbb,>=,n %r21,30,.+16\n", f);
10021       if (ASSEMBLER_DIALECT == 0)
10022         fputs ("\tdepi  0,31,2,%r21\n", f);
10023       else
10024         fputs ("\tdepwi 0,31,2,%r21\n", f);
10025       fputs ("\tldw     4(%r21),%r19\n", f);
10026       fputs ("\tldw     0(%r21),%r21\n", f);
10027       if (TARGET_PA_20)
10028         {
10029           fputs ("\tbve (%r21)\n", f);
10030           fputs ("\tldw 40(%r22),%r29\n", f);
10031           fputs ("\t.word       0\n", f);
10032           fputs ("\t.word       0\n", f);
10033         }
10034       else
10035         {
10036           fputs ("\tldsid       (%r21),%r1\n", f);
10037           fputs ("\tmtsp        %r1,%sr0\n", f);
10038           fputs ("\tbe  0(%sr0,%r21)\n", f);
10039           fputs ("\tldw 40(%r22),%r29\n", f);
10040         }
10041       fputs ("\t.word   0\n", f);
10042       fputs ("\t.word   0\n", f);
10043       fputs ("\t.word   0\n", f);
10044       fputs ("\t.word   0\n", f);
10045     }
10046   else
10047     {
10048       fputs ("\t.dword 0\n", f);
10049       fputs ("\t.dword 0\n", f);
10050       fputs ("\t.dword 0\n", f);
10051       fputs ("\t.dword 0\n", f);
10052       fputs ("\tmfia    %r31\n", f);
10053       fputs ("\tldd     24(%r31),%r1\n", f);
10054       fputs ("\tldd     24(%r1),%r27\n", f);
10055       fputs ("\tldd     16(%r1),%r1\n", f);
10056       fputs ("\tbve     (%r1)\n", f);
10057       fputs ("\tldd     32(%r31),%r31\n", f);
10058       fputs ("\t.dword 0  ; fptr\n", f);
10059       fputs ("\t.dword 0  ; static link\n", f);
10060     }
10061 }
10062
10063 /* Emit RTL insns to initialize the variable parts of a trampoline.
10064    FNADDR is an RTX for the address of the function's pure code.
10065    CXT is an RTX for the static chain value for the function.
10066
10067    Move the function address to the trampoline template at offset 36.
10068    Move the static chain value to trampoline template at offset 40.
10069    Move the trampoline address to trampoline template at offset 44.
10070    Move r19 to trampoline template at offset 48.  The latter two
10071    words create a plabel for the indirect call to the trampoline.
10072
10073    A similar sequence is used for the 64-bit port but the plabel is
10074    at the beginning of the trampoline.
10075
10076    Finally, the cache entries for the trampoline code are flushed.
10077    This is necessary to ensure that the trampoline instruction sequence
10078    is written to memory prior to any attempts at prefetching the code
10079    sequence.  */
10080
10081 static void
10082 pa_trampoline_init (rtx m_tramp, tree fndecl, rtx chain_value)
10083 {
10084   rtx fnaddr = XEXP (DECL_RTL (fndecl), 0);
10085   rtx start_addr = gen_reg_rtx (Pmode);
10086   rtx end_addr = gen_reg_rtx (Pmode);
10087   rtx line_length = gen_reg_rtx (Pmode);
10088   rtx r_tramp, tmp;
10089
10090   emit_block_move (m_tramp, assemble_trampoline_template (),
10091                    GEN_INT (TRAMPOLINE_SIZE), BLOCK_OP_NORMAL);
10092   r_tramp = force_reg (Pmode, XEXP (m_tramp, 0));
10093
10094   if (!TARGET_64BIT)
10095     {
10096       tmp = adjust_address (m_tramp, Pmode, 36);
10097       emit_move_insn (tmp, fnaddr);
10098       tmp = adjust_address (m_tramp, Pmode, 40);
10099       emit_move_insn (tmp, chain_value);
10100
10101       /* Create a fat pointer for the trampoline.  */
10102       tmp = adjust_address (m_tramp, Pmode, 44);
10103       emit_move_insn (tmp, r_tramp);
10104       tmp = adjust_address (m_tramp, Pmode, 48);
10105       emit_move_insn (tmp, gen_rtx_REG (Pmode, 19));
10106
10107       /* fdc and fic only use registers for the address to flush,
10108          they do not accept integer displacements.  We align the
10109          start and end addresses to the beginning of their respective
10110          cache lines to minimize the number of lines flushed.  */
10111       emit_insn (gen_andsi3 (start_addr, r_tramp,
10112                              GEN_INT (-MIN_CACHELINE_SIZE)));
10113       tmp = force_reg (Pmode, plus_constant (r_tramp, TRAMPOLINE_CODE_SIZE-1));
10114       emit_insn (gen_andsi3 (end_addr, tmp,
10115                              GEN_INT (-MIN_CACHELINE_SIZE)));
10116       emit_move_insn (line_length, GEN_INT (MIN_CACHELINE_SIZE));
10117       emit_insn (gen_dcacheflushsi (start_addr, end_addr, line_length));
10118       emit_insn (gen_icacheflushsi (start_addr, end_addr, line_length,
10119                                     gen_reg_rtx (Pmode),
10120                                     gen_reg_rtx (Pmode)));
10121     }
10122   else
10123     {
10124       tmp = adjust_address (m_tramp, Pmode, 56);
10125       emit_move_insn (tmp, fnaddr);
10126       tmp = adjust_address (m_tramp, Pmode, 64);
10127       emit_move_insn (tmp, chain_value);
10128
10129       /* Create a fat pointer for the trampoline.  */
10130       tmp = adjust_address (m_tramp, Pmode, 16);
10131       emit_move_insn (tmp, force_reg (Pmode, plus_constant (r_tramp, 32)));
10132       tmp = adjust_address (m_tramp, Pmode, 24);
10133       emit_move_insn (tmp, gen_rtx_REG (Pmode, 27));
10134
10135       /* fdc and fic only use registers for the address to flush,
10136          they do not accept integer displacements.  We align the
10137          start and end addresses to the beginning of their respective
10138          cache lines to minimize the number of lines flushed.  */
10139       tmp = force_reg (Pmode, plus_constant (r_tramp, 32));
10140       emit_insn (gen_anddi3 (start_addr, tmp,
10141                              GEN_INT (-MIN_CACHELINE_SIZE)));
10142       tmp = force_reg (Pmode, plus_constant (tmp, TRAMPOLINE_CODE_SIZE - 1));
10143       emit_insn (gen_anddi3 (end_addr, tmp,
10144                              GEN_INT (-MIN_CACHELINE_SIZE)));
10145       emit_move_insn (line_length, GEN_INT (MIN_CACHELINE_SIZE));
10146       emit_insn (gen_dcacheflushdi (start_addr, end_addr, line_length));
10147       emit_insn (gen_icacheflushdi (start_addr, end_addr, line_length,
10148                                     gen_reg_rtx (Pmode),
10149                                     gen_reg_rtx (Pmode)));
10150     }
10151 }
10152
10153 /* Perform any machine-specific adjustment in the address of the trampoline.
10154    ADDR contains the address that was passed to pa_trampoline_init.
10155    Adjust the trampoline address to point to the plabel at offset 44.  */
10156
10157 static rtx
10158 pa_trampoline_adjust_address (rtx addr)
10159 {
10160   if (!TARGET_64BIT)
10161     addr = memory_address (Pmode, plus_constant (addr, 46));
10162   return addr;
10163 }
10164
10165 static rtx
10166 pa_delegitimize_address (rtx orig_x)
10167 {
10168   rtx x = delegitimize_mem_from_attrs (orig_x);
10169
10170   if (GET_CODE (x) == LO_SUM
10171       && GET_CODE (XEXP (x, 1)) == UNSPEC
10172       && XINT (XEXP (x, 1), 1) == UNSPEC_DLTIND14R)
10173     return gen_const_mem (Pmode, XVECEXP (XEXP (x, 1), 0, 0));
10174   return x;
10175 }
10176 \f
10177 static rtx
10178 pa_internal_arg_pointer (void)
10179 {
10180   /* The argument pointer and the hard frame pointer are the same in
10181      the 32-bit runtime, so we don't need a copy.  */
10182   if (TARGET_64BIT)
10183     return copy_to_reg (virtual_incoming_args_rtx);
10184   else
10185     return virtual_incoming_args_rtx;
10186 }
10187
10188 /* Given FROM and TO register numbers, say whether this elimination is allowed.
10189    Frame pointer elimination is automatically handled.  */
10190
10191 static bool
10192 pa_can_eliminate (const int from, const int to)
10193 {
10194   /* The argument cannot be eliminated in the 64-bit runtime.  */
10195   if (TARGET_64BIT && from == ARG_POINTER_REGNUM)
10196     return false;
10197
10198   return (from == HARD_FRAME_POINTER_REGNUM && to == STACK_POINTER_REGNUM
10199           ? ! frame_pointer_needed
10200           : true);
10201 }
10202
10203 /* Define the offset between two registers, FROM to be eliminated and its
10204    replacement TO, at the start of a routine.  */
10205 HOST_WIDE_INT
10206 pa_initial_elimination_offset (int from, int to)
10207 {
10208   HOST_WIDE_INT offset;
10209
10210   if ((from == HARD_FRAME_POINTER_REGNUM || from == FRAME_POINTER_REGNUM)
10211       && to == STACK_POINTER_REGNUM)
10212     offset = -compute_frame_size (get_frame_size (), 0);
10213   else if (from == FRAME_POINTER_REGNUM && to == HARD_FRAME_POINTER_REGNUM)
10214     offset = 0;
10215   else
10216     gcc_unreachable ();
10217
10218   return offset;
10219 }
10220
10221 static void
10222 pa_conditional_register_usage (void)
10223 {
10224   int i;
10225
10226   if (!TARGET_64BIT && !TARGET_PA_11)
10227     {
10228       for (i = 56; i <= FP_REG_LAST; i++)
10229         fixed_regs[i] = call_used_regs[i] = 1;
10230       for (i = 33; i < 56; i += 2)
10231         fixed_regs[i] = call_used_regs[i] = 1;
10232     }
10233   if (TARGET_DISABLE_FPREGS || TARGET_SOFT_FLOAT)
10234     {
10235       for (i = FP_REG_FIRST; i <= FP_REG_LAST; i++)
10236         fixed_regs[i] = call_used_regs[i] = 1;
10237     }
10238   if (flag_pic)
10239     fixed_regs[PIC_OFFSET_TABLE_REGNUM] = 1;
10240 }
10241
10242 /* Target hook for c_mode_for_suffix.  */
10243
10244 static enum machine_mode
10245 pa_c_mode_for_suffix (char suffix)
10246 {
10247   if (HPUX_LONG_DOUBLE_LIBRARY)
10248     {
10249       if (suffix == 'q')
10250         return TFmode;
10251     }
10252
10253   return VOIDmode;
10254 }
10255
10256 /* Target hook for function_section.  */
10257
10258 static section *
10259 pa_function_section (tree decl, enum node_frequency freq,
10260                      bool startup, bool exit)
10261 {
10262   /* Put functions in text section if target doesn't have named sections.  */
10263   if (!targetm.have_named_sections)
10264     return text_section;
10265
10266   /* Force nested functions into the same section as the containing
10267      function.  */
10268   if (decl
10269       && DECL_SECTION_NAME (decl) == NULL_TREE
10270       && DECL_CONTEXT (decl) != NULL_TREE
10271       && TREE_CODE (DECL_CONTEXT (decl)) == FUNCTION_DECL
10272       && DECL_SECTION_NAME (DECL_CONTEXT (decl)) == NULL_TREE)
10273     return function_section (DECL_CONTEXT (decl));
10274
10275   /* Otherwise, use the default function section.  */
10276   return default_function_section (decl, freq, startup, exit);
10277 }
10278
10279 #include "gt-pa.h"