OSDN Git Service

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