OSDN Git Service

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