OSDN Git Service

* config/sparc/sparc.c (function_arg_union_value): New 'slotno'
[pf3gnuchains/gcc-fork.git] / gcc / config / sparc / sparc.c
1 /* Subroutines for insn-output.c for SPARC.
2    Copyright (C) 1987, 1988, 1989, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
3    1999, 2000, 2001, 2002, 2003, 2004 Free Software Foundation, Inc.
4    Contributed by Michael Tiemann (tiemann@cygnus.com)
5    64-bit SPARC-V9 support by Michael Tiemann, Jim Wilson, and Doug Evans,
6    at Cygnus Support.
7
8 This file is part of GCC.
9
10 GCC is free software; you can redistribute it and/or modify
11 it under the terms of the GNU General Public License as published by
12 the Free Software Foundation; either version 2, or (at your option)
13 any later version.
14
15 GCC is distributed in the hope that it will be useful,
16 but WITHOUT ANY WARRANTY; without even the implied warranty of
17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18 GNU General Public License for more details.
19
20 You should have received a copy of the GNU General Public License
21 along with GCC; see the file COPYING.  If not, write to
22 the Free Software Foundation, 59 Temple Place - Suite 330,
23 Boston, MA 02111-1307, USA.  */
24
25 #include "config.h"
26 #include "system.h"
27 #include "coretypes.h"
28 #include "tm.h"
29 #include "tree.h"
30 #include "rtl.h"
31 #include "regs.h"
32 #include "hard-reg-set.h"
33 #include "real.h"
34 #include "insn-config.h"
35 #include "conditions.h"
36 #include "output.h"
37 #include "insn-attr.h"
38 #include "flags.h"
39 #include "function.h"
40 #include "expr.h"
41 #include "optabs.h"
42 #include "recog.h"
43 #include "toplev.h"
44 #include "ggc.h"
45 #include "tm_p.h"
46 #include "debug.h"
47 #include "target.h"
48 #include "target-def.h"
49 #include "cfglayout.h"
50 #include "tree-gimple.h"
51
52 /* Processor costs */
53 static const
54 struct processor_costs cypress_costs = {
55   COSTS_N_INSNS (2), /* int load */
56   COSTS_N_INSNS (2), /* int signed load */
57   COSTS_N_INSNS (2), /* int zeroed load */
58   COSTS_N_INSNS (2), /* float load */
59   COSTS_N_INSNS (5), /* fmov, fneg, fabs */
60   COSTS_N_INSNS (5), /* fadd, fsub */
61   COSTS_N_INSNS (1), /* fcmp */
62   COSTS_N_INSNS (1), /* fmov, fmovr */
63   COSTS_N_INSNS (7), /* fmul */
64   COSTS_N_INSNS (37), /* fdivs */
65   COSTS_N_INSNS (37), /* fdivd */
66   COSTS_N_INSNS (63), /* fsqrts */
67   COSTS_N_INSNS (63), /* fsqrtd */
68   COSTS_N_INSNS (1), /* imul */
69   COSTS_N_INSNS (1), /* imulX */
70   0, /* imul bit factor */
71   COSTS_N_INSNS (1), /* idiv */
72   COSTS_N_INSNS (1), /* idivX */
73   COSTS_N_INSNS (1), /* movcc/movr */
74   0, /* shift penalty */
75 };
76
77 static const
78 struct processor_costs supersparc_costs = {
79   COSTS_N_INSNS (1), /* int load */
80   COSTS_N_INSNS (1), /* int signed load */
81   COSTS_N_INSNS (1), /* int zeroed load */
82   COSTS_N_INSNS (0), /* float load */
83   COSTS_N_INSNS (3), /* fmov, fneg, fabs */
84   COSTS_N_INSNS (3), /* fadd, fsub */
85   COSTS_N_INSNS (3), /* fcmp */
86   COSTS_N_INSNS (1), /* fmov, fmovr */
87   COSTS_N_INSNS (3), /* fmul */
88   COSTS_N_INSNS (6), /* fdivs */
89   COSTS_N_INSNS (9), /* fdivd */
90   COSTS_N_INSNS (12), /* fsqrts */
91   COSTS_N_INSNS (12), /* fsqrtd */
92   COSTS_N_INSNS (4), /* imul */
93   COSTS_N_INSNS (4), /* imulX */
94   0, /* imul bit factor */
95   COSTS_N_INSNS (4), /* idiv */
96   COSTS_N_INSNS (4), /* idivX */
97   COSTS_N_INSNS (1), /* movcc/movr */
98   1, /* shift penalty */
99 };
100
101 static const
102 struct processor_costs hypersparc_costs = {
103   COSTS_N_INSNS (1), /* int load */
104   COSTS_N_INSNS (1), /* int signed load */
105   COSTS_N_INSNS (1), /* int zeroed load */
106   COSTS_N_INSNS (1), /* float load */
107   COSTS_N_INSNS (1), /* fmov, fneg, fabs */
108   COSTS_N_INSNS (1), /* fadd, fsub */
109   COSTS_N_INSNS (1), /* fcmp */
110   COSTS_N_INSNS (1), /* fmov, fmovr */
111   COSTS_N_INSNS (1), /* fmul */
112   COSTS_N_INSNS (8), /* fdivs */
113   COSTS_N_INSNS (12), /* fdivd */
114   COSTS_N_INSNS (17), /* fsqrts */
115   COSTS_N_INSNS (17), /* fsqrtd */
116   COSTS_N_INSNS (17), /* imul */
117   COSTS_N_INSNS (17), /* imulX */
118   0, /* imul bit factor */
119   COSTS_N_INSNS (17), /* idiv */
120   COSTS_N_INSNS (17), /* idivX */
121   COSTS_N_INSNS (1), /* movcc/movr */
122   0, /* shift penalty */
123 };
124
125 static const
126 struct processor_costs sparclet_costs = {
127   COSTS_N_INSNS (3), /* int load */
128   COSTS_N_INSNS (3), /* int signed load */
129   COSTS_N_INSNS (1), /* int zeroed load */
130   COSTS_N_INSNS (1), /* float load */
131   COSTS_N_INSNS (1), /* fmov, fneg, fabs */
132   COSTS_N_INSNS (1), /* fadd, fsub */
133   COSTS_N_INSNS (1), /* fcmp */
134   COSTS_N_INSNS (1), /* fmov, fmovr */
135   COSTS_N_INSNS (1), /* fmul */
136   COSTS_N_INSNS (1), /* fdivs */
137   COSTS_N_INSNS (1), /* fdivd */
138   COSTS_N_INSNS (1), /* fsqrts */
139   COSTS_N_INSNS (1), /* fsqrtd */
140   COSTS_N_INSNS (5), /* imul */
141   COSTS_N_INSNS (5), /* imulX */
142   0, /* imul bit factor */
143   COSTS_N_INSNS (5), /* idiv */
144   COSTS_N_INSNS (5), /* idivX */
145   COSTS_N_INSNS (1), /* movcc/movr */
146   0, /* shift penalty */
147 };
148
149 static const
150 struct processor_costs ultrasparc_costs = {
151   COSTS_N_INSNS (2), /* int load */
152   COSTS_N_INSNS (3), /* int signed load */
153   COSTS_N_INSNS (2), /* int zeroed load */
154   COSTS_N_INSNS (2), /* float load */
155   COSTS_N_INSNS (1), /* fmov, fneg, fabs */
156   COSTS_N_INSNS (4), /* fadd, fsub */
157   COSTS_N_INSNS (1), /* fcmp */
158   COSTS_N_INSNS (2), /* fmov, fmovr */
159   COSTS_N_INSNS (4), /* fmul */
160   COSTS_N_INSNS (13), /* fdivs */
161   COSTS_N_INSNS (23), /* fdivd */
162   COSTS_N_INSNS (13), /* fsqrts */
163   COSTS_N_INSNS (23), /* fsqrtd */
164   COSTS_N_INSNS (4), /* imul */
165   COSTS_N_INSNS (4), /* imulX */
166   2, /* imul bit factor */
167   COSTS_N_INSNS (37), /* idiv */
168   COSTS_N_INSNS (68), /* idivX */
169   COSTS_N_INSNS (2), /* movcc/movr */
170   2, /* shift penalty */
171 };
172
173 static const
174 struct processor_costs ultrasparc3_costs = {
175   COSTS_N_INSNS (2), /* int load */
176   COSTS_N_INSNS (3), /* int signed load */
177   COSTS_N_INSNS (3), /* int zeroed load */
178   COSTS_N_INSNS (2), /* float load */
179   COSTS_N_INSNS (3), /* fmov, fneg, fabs */
180   COSTS_N_INSNS (4), /* fadd, fsub */
181   COSTS_N_INSNS (5), /* fcmp */
182   COSTS_N_INSNS (3), /* fmov, fmovr */
183   COSTS_N_INSNS (4), /* fmul */
184   COSTS_N_INSNS (17), /* fdivs */
185   COSTS_N_INSNS (20), /* fdivd */
186   COSTS_N_INSNS (20), /* fsqrts */
187   COSTS_N_INSNS (29), /* fsqrtd */
188   COSTS_N_INSNS (6), /* imul */
189   COSTS_N_INSNS (6), /* imulX */
190   0, /* imul bit factor */
191   COSTS_N_INSNS (40), /* idiv */
192   COSTS_N_INSNS (71), /* idivX */
193   COSTS_N_INSNS (2), /* movcc/movr */
194   0, /* shift penalty */
195 };
196
197 const struct processor_costs *sparc_costs = &cypress_costs;
198
199 #ifdef HAVE_AS_RELAX_OPTION
200 /* If 'as' and 'ld' are relaxing tail call insns into branch always, use
201    "or %o7,%g0,X; call Y; or X,%g0,%o7" always, so that it can be optimized.
202    With sethi/jmp, neither 'as' nor 'ld' has an easy way how to find out if
203    somebody does not branch between the sethi and jmp.  */
204 #define LEAF_SIBCALL_SLOT_RESERVED_P 1
205 #else
206 #define LEAF_SIBCALL_SLOT_RESERVED_P \
207   ((TARGET_ARCH64 && !TARGET_CM_MEDLOW) || flag_pic)
208 #endif
209
210 /* Global variables for machine-dependent things.  */
211
212 /* Size of frame.  Need to know this to emit return insns from leaf procedures.
213    ACTUAL_FSIZE is set by sparc_compute_frame_size() which is called during the
214    reload pass.  This is important as the value is later used for scheduling
215    (to see what can go in a delay slot).
216    APPARENT_FSIZE is the size of the stack less the register save area and less
217    the outgoing argument area.  It is used when saving call preserved regs.  */
218 static HOST_WIDE_INT apparent_fsize;
219 static HOST_WIDE_INT actual_fsize;
220
221 /* Number of live general or floating point registers needed to be
222    saved (as 4-byte quantities).  */
223 static int num_gfregs;
224
225 /* The alias set for prologue/epilogue register save/restore.  */
226 static GTY(()) int sparc_sr_alias_set;
227
228 /* Save the operands last given to a compare for use when we
229    generate a scc or bcc insn.  */
230 rtx sparc_compare_op0, sparc_compare_op1;
231
232 /* Vector to say how input registers are mapped to output registers.
233    HARD_FRAME_POINTER_REGNUM cannot be remapped by this function to
234    eliminate it.  You must use -fomit-frame-pointer to get that.  */
235 char leaf_reg_remap[] =
236 { 0, 1, 2, 3, 4, 5, 6, 7,
237   -1, -1, -1, -1, -1, -1, 14, -1,
238   -1, -1, -1, -1, -1, -1, -1, -1,
239   8, 9, 10, 11, 12, 13, -1, 15,
240
241   32, 33, 34, 35, 36, 37, 38, 39,
242   40, 41, 42, 43, 44, 45, 46, 47,
243   48, 49, 50, 51, 52, 53, 54, 55,
244   56, 57, 58, 59, 60, 61, 62, 63,
245   64, 65, 66, 67, 68, 69, 70, 71,
246   72, 73, 74, 75, 76, 77, 78, 79,
247   80, 81, 82, 83, 84, 85, 86, 87,
248   88, 89, 90, 91, 92, 93, 94, 95,
249   96, 97, 98, 99, 100};
250
251 /* Vector, indexed by hard register number, which contains 1
252    for a register that is allowable in a candidate for leaf
253    function treatment.  */
254 char sparc_leaf_regs[] =
255 { 1, 1, 1, 1, 1, 1, 1, 1,
256   0, 0, 0, 0, 0, 0, 1, 0,
257   0, 0, 0, 0, 0, 0, 0, 0,
258   1, 1, 1, 1, 1, 1, 0, 1,
259   1, 1, 1, 1, 1, 1, 1, 1,
260   1, 1, 1, 1, 1, 1, 1, 1,
261   1, 1, 1, 1, 1, 1, 1, 1,
262   1, 1, 1, 1, 1, 1, 1, 1,
263   1, 1, 1, 1, 1, 1, 1, 1,
264   1, 1, 1, 1, 1, 1, 1, 1,
265   1, 1, 1, 1, 1, 1, 1, 1,
266   1, 1, 1, 1, 1, 1, 1, 1,
267   1, 1, 1, 1, 1};
268
269 struct machine_function GTY(())
270 {
271   /* Some local-dynamic TLS symbol name.  */
272   const char *some_ld_name;
273
274   /* True if the current function is leaf and uses only leaf regs,
275      so that the SPARC leaf function optimization can be applied.
276      Private version of current_function_uses_only_leaf_regs, see
277      sparc_expand_prologue for the rationale.  */
278   int leaf_function_p;
279
280   /* True if the data calculated by sparc_expand_prologue are valid.  */
281   bool prologue_data_valid_p;
282 };
283
284 #define sparc_leaf_function_p  cfun->machine->leaf_function_p
285 #define sparc_prologue_data_valid_p  cfun->machine->prologue_data_valid_p
286
287 /* Register we pretend to think the frame pointer is allocated to.
288    Normally, this is %fp, but if we are in a leaf procedure, this
289    is %sp+"something".  We record "something" separately as it may
290    be too big for reg+constant addressing.  */
291 static rtx frame_base_reg;
292 static HOST_WIDE_INT frame_base_offset;
293
294 /* 1 if the next opcode is to be specially indented.  */
295 int sparc_indent_opcode = 0;
296
297 static void sparc_init_modes (void);
298 static void scan_record_type (tree, int *, int *, int *);
299 static int function_arg_slotno (const CUMULATIVE_ARGS *, enum machine_mode,
300                                 tree, int, int, int *, int *);
301
302 static int supersparc_adjust_cost (rtx, rtx, rtx, int);
303 static int hypersparc_adjust_cost (rtx, rtx, rtx, int);
304
305 static void sparc_output_addr_vec (rtx);
306 static void sparc_output_addr_diff_vec (rtx);
307 static void sparc_output_deferred_case_vectors (void);
308 static rtx sparc_builtin_saveregs (void);
309 static int epilogue_renumber (rtx *, int);
310 static bool sparc_assemble_integer (rtx, unsigned int, int);
311 static int set_extends (rtx);
312 static void load_pic_register (void);
313 static int save_or_restore_regs (int, int, rtx, int, int);
314 static void emit_save_regs (void);
315 static void emit_restore_regs (void);
316 static void sparc_asm_function_prologue (FILE *, HOST_WIDE_INT);
317 static void sparc_asm_function_epilogue (FILE *, HOST_WIDE_INT);
318 #ifdef OBJECT_FORMAT_ELF
319 static void sparc_elf_asm_named_section (const char *, unsigned int, tree);
320 #endif
321
322 static int sparc_adjust_cost (rtx, rtx, rtx, int);
323 static int sparc_issue_rate (void);
324 static void sparc_sched_init (FILE *, int, int);
325 static int sparc_use_sched_lookahead (void);
326
327 static void emit_soft_tfmode_libcall (const char *, int, rtx *);
328 static void emit_soft_tfmode_binop (enum rtx_code, rtx *);
329 static void emit_soft_tfmode_unop (enum rtx_code, rtx *);
330 static void emit_soft_tfmode_cvt (enum rtx_code, rtx *);
331 static void emit_hard_tfmode_operation (enum rtx_code, rtx *);
332
333 static bool sparc_function_ok_for_sibcall (tree, tree);
334 static void sparc_init_libfuncs (void);
335 static void sparc_output_mi_thunk (FILE *, tree, HOST_WIDE_INT,
336                                    HOST_WIDE_INT, tree);
337 static bool sparc_can_output_mi_thunk (tree, HOST_WIDE_INT,
338                                        HOST_WIDE_INT, tree);
339 static struct machine_function * sparc_init_machine_status (void);
340 static bool sparc_cannot_force_const_mem (rtx);
341 static rtx sparc_tls_get_addr (void);
342 static rtx sparc_tls_got (void);
343 static const char *get_some_local_dynamic_name (void);
344 static int get_some_local_dynamic_name_1 (rtx *, void *);
345 static bool sparc_rtx_costs (rtx, int, int, int *);
346 static bool sparc_promote_prototypes (tree);
347 static rtx sparc_struct_value_rtx (tree, int);
348 static bool sparc_return_in_memory (tree, tree);
349 static bool sparc_strict_argument_naming (CUMULATIVE_ARGS *);
350 static tree sparc_gimplify_va_arg (tree, tree, tree *, tree *);
351 static bool sparc_vector_mode_supported_p (enum machine_mode);
352 static bool sparc_pass_by_reference (CUMULATIVE_ARGS *,
353                                      enum machine_mode, tree, bool);
354 #ifdef SUBTARGET_ATTRIBUTE_TABLE
355 const struct attribute_spec sparc_attribute_table[];
356 #endif
357 \f
358 /* Option handling.  */
359
360 /* Code model option as passed by user.  */
361 const char *sparc_cmodel_string;
362 /* Parsed value.  */
363 enum cmodel sparc_cmodel;
364
365 char sparc_hard_reg_printed[8];
366
367 struct sparc_cpu_select sparc_select[] =
368 {
369   /* switch     name,           tune    arch */
370   { (char *)0,  "default",      1,      1 },
371   { (char *)0,  "-mcpu=",       1,      1 },
372   { (char *)0,  "-mtune=",      1,      0 },
373   { 0, 0, 0, 0 }
374 };
375
376 /* CPU type.  This is set from TARGET_CPU_DEFAULT and -m{cpu,tune}=xxx.  */
377 enum processor_type sparc_cpu;
378 \f
379 /* Initialize the GCC target structure.  */
380
381 /* The sparc default is to use .half rather than .short for aligned
382    HI objects.  Use .word instead of .long on non-ELF systems.  */
383 #undef TARGET_ASM_ALIGNED_HI_OP
384 #define TARGET_ASM_ALIGNED_HI_OP "\t.half\t"
385 #ifndef OBJECT_FORMAT_ELF
386 #undef TARGET_ASM_ALIGNED_SI_OP
387 #define TARGET_ASM_ALIGNED_SI_OP "\t.word\t"
388 #endif
389
390 #undef TARGET_ASM_UNALIGNED_HI_OP
391 #define TARGET_ASM_UNALIGNED_HI_OP "\t.uahalf\t"
392 #undef TARGET_ASM_UNALIGNED_SI_OP
393 #define TARGET_ASM_UNALIGNED_SI_OP "\t.uaword\t"
394 #undef TARGET_ASM_UNALIGNED_DI_OP
395 #define TARGET_ASM_UNALIGNED_DI_OP "\t.uaxword\t"
396
397 /* The target hook has to handle DI-mode values.  */
398 #undef TARGET_ASM_INTEGER
399 #define TARGET_ASM_INTEGER sparc_assemble_integer
400
401 #undef TARGET_ASM_FUNCTION_PROLOGUE
402 #define TARGET_ASM_FUNCTION_PROLOGUE sparc_asm_function_prologue
403 #undef TARGET_ASM_FUNCTION_EPILOGUE
404 #define TARGET_ASM_FUNCTION_EPILOGUE sparc_asm_function_epilogue
405
406 #undef TARGET_SCHED_ADJUST_COST
407 #define TARGET_SCHED_ADJUST_COST sparc_adjust_cost
408 #undef TARGET_SCHED_ISSUE_RATE
409 #define TARGET_SCHED_ISSUE_RATE sparc_issue_rate
410 #undef TARGET_SCHED_INIT
411 #define TARGET_SCHED_INIT sparc_sched_init
412 #undef TARGET_SCHED_FIRST_CYCLE_MULTIPASS_DFA_LOOKAHEAD
413 #define TARGET_SCHED_FIRST_CYCLE_MULTIPASS_DFA_LOOKAHEAD sparc_use_sched_lookahead
414
415 #undef TARGET_FUNCTION_OK_FOR_SIBCALL
416 #define TARGET_FUNCTION_OK_FOR_SIBCALL sparc_function_ok_for_sibcall
417
418 #undef TARGET_INIT_LIBFUNCS
419 #define TARGET_INIT_LIBFUNCS sparc_init_libfuncs
420
421 #ifdef HAVE_AS_TLS
422 #undef TARGET_HAVE_TLS
423 #define TARGET_HAVE_TLS true
424 #endif
425 #undef TARGET_CANNOT_FORCE_CONST_MEM
426 #define TARGET_CANNOT_FORCE_CONST_MEM sparc_cannot_force_const_mem
427
428 #undef TARGET_ASM_OUTPUT_MI_THUNK
429 #define TARGET_ASM_OUTPUT_MI_THUNK sparc_output_mi_thunk
430 #undef TARGET_ASM_CAN_OUTPUT_MI_THUNK
431 #define TARGET_ASM_CAN_OUTPUT_MI_THUNK sparc_can_output_mi_thunk
432
433 #undef TARGET_RTX_COSTS
434 #define TARGET_RTX_COSTS sparc_rtx_costs
435 #undef TARGET_ADDRESS_COST
436 #define TARGET_ADDRESS_COST hook_int_rtx_0
437
438 /* This is only needed for TARGET_ARCH64, but since PROMOTE_FUNCTION_MODE is a
439    no-op for TARGET_ARCH32 this is ok.  Otherwise we'd need to add a runtime
440    test for this value.  */
441 #undef TARGET_PROMOTE_FUNCTION_ARGS
442 #define TARGET_PROMOTE_FUNCTION_ARGS hook_bool_tree_true
443
444 /* This is only needed for TARGET_ARCH64, but since PROMOTE_FUNCTION_MODE is a
445    no-op for TARGET_ARCH32 this is ok.  Otherwise we'd need to add a runtime
446    test for this value.  */
447 #undef TARGET_PROMOTE_FUNCTION_RETURN
448 #define TARGET_PROMOTE_FUNCTION_RETURN hook_bool_tree_true
449
450 #undef TARGET_PROMOTE_PROTOTYPES
451 #define TARGET_PROMOTE_PROTOTYPES sparc_promote_prototypes
452
453 #undef TARGET_STRUCT_VALUE_RTX
454 #define TARGET_STRUCT_VALUE_RTX sparc_struct_value_rtx
455 #undef TARGET_RETURN_IN_MEMORY
456 #define TARGET_RETURN_IN_MEMORY sparc_return_in_memory
457 #undef TARGET_MUST_PASS_IN_STACK
458 #define TARGET_MUST_PASS_IN_STACK must_pass_in_stack_var_size
459 #undef TARGET_PASS_BY_REFERENCE
460 #define TARGET_PASS_BY_REFERENCE sparc_pass_by_reference
461
462 #undef TARGET_EXPAND_BUILTIN_SAVEREGS
463 #define TARGET_EXPAND_BUILTIN_SAVEREGS sparc_builtin_saveregs
464 #undef TARGET_STRICT_ARGUMENT_NAMING
465 #define TARGET_STRICT_ARGUMENT_NAMING sparc_strict_argument_naming
466
467 #undef TARGET_GIMPLIFY_VA_ARG_EXPR
468 #define TARGET_GIMPLIFY_VA_ARG_EXPR sparc_gimplify_va_arg
469
470 #undef TARGET_VECTOR_MODE_SUPPORTED_P
471 #define TARGET_VECTOR_MODE_SUPPORTED_P sparc_vector_mode_supported_p
472
473 #ifdef SUBTARGET_INSERT_ATTRIBUTES
474 #undef TARGET_INSERT_ATTRIBUTES
475 #define TARGET_INSERT_ATTRIBUTES SUBTARGET_INSERT_ATTRIBUTES
476 #endif
477
478 #ifdef SUBTARGET_ATTRIBUTE_TABLE
479 #undef TARGET_ATTRIBUTE_TABLE
480 #define TARGET_ATTRIBUTE_TABLE sparc_attribute_table
481 #endif
482
483 struct gcc_target targetm = TARGET_INITIALIZER;
484 \f
485 /* Validate and override various options, and do some machine dependent
486    initialization.  */
487
488 void
489 sparc_override_options (void)
490 {
491   static struct code_model {
492     const char *const name;
493     const int value;
494   } const cmodels[] = {
495     { "32", CM_32 },
496     { "medlow", CM_MEDLOW },
497     { "medmid", CM_MEDMID },
498     { "medany", CM_MEDANY },
499     { "embmedany", CM_EMBMEDANY },
500     { 0, 0 }
501   };
502   const struct code_model *cmodel;
503   /* Map TARGET_CPU_DEFAULT to value for -m{arch,tune}=.  */
504   static struct cpu_default {
505     const int cpu;
506     const char *const name;
507   } const cpu_default[] = {
508     /* There must be one entry here for each TARGET_CPU value.  */
509     { TARGET_CPU_sparc, "cypress" },
510     { TARGET_CPU_sparclet, "tsc701" },
511     { TARGET_CPU_sparclite, "f930" },
512     { TARGET_CPU_v8, "v8" },
513     { TARGET_CPU_hypersparc, "hypersparc" },
514     { TARGET_CPU_sparclite86x, "sparclite86x" },
515     { TARGET_CPU_supersparc, "supersparc" },
516     { TARGET_CPU_v9, "v9" },
517     { TARGET_CPU_ultrasparc, "ultrasparc" },
518     { TARGET_CPU_ultrasparc3, "ultrasparc3" },
519     { 0, 0 }
520   };
521   const struct cpu_default *def;
522   /* Table of values for -m{cpu,tune}=.  */
523   static struct cpu_table {
524     const char *const name;
525     const enum processor_type processor;
526     const int disable;
527     const int enable;
528   } const cpu_table[] = {
529     { "v7",         PROCESSOR_V7, MASK_ISA, 0 },
530     { "cypress",    PROCESSOR_CYPRESS, MASK_ISA, 0 },
531     { "v8",         PROCESSOR_V8, MASK_ISA, MASK_V8 },
532     /* TI TMS390Z55 supersparc */
533     { "supersparc", PROCESSOR_SUPERSPARC, MASK_ISA, MASK_V8 },
534     { "sparclite",  PROCESSOR_SPARCLITE, MASK_ISA, MASK_SPARCLITE },
535     /* The Fujitsu MB86930 is the original sparclite chip, with no fpu.
536        The Fujitsu MB86934 is the recent sparclite chip, with an fpu.  */
537     { "f930",       PROCESSOR_F930, MASK_ISA|MASK_FPU, MASK_SPARCLITE },
538     { "f934",       PROCESSOR_F934, MASK_ISA, MASK_SPARCLITE|MASK_FPU },
539     { "hypersparc", PROCESSOR_HYPERSPARC, MASK_ISA, MASK_V8|MASK_FPU },
540     { "sparclite86x",  PROCESSOR_SPARCLITE86X, MASK_ISA|MASK_FPU,
541       MASK_SPARCLITE },
542     { "sparclet",   PROCESSOR_SPARCLET, MASK_ISA, MASK_SPARCLET },
543     /* TEMIC sparclet */
544     { "tsc701",     PROCESSOR_TSC701, MASK_ISA, MASK_SPARCLET },
545     { "v9",         PROCESSOR_V9, MASK_ISA, MASK_V9 },
546     /* TI ultrasparc I, II, IIi */
547     { "ultrasparc", PROCESSOR_ULTRASPARC, MASK_ISA, MASK_V9
548     /* Although insns using %y are deprecated, it is a clear win on current
549        ultrasparcs.  */
550                                                     |MASK_DEPRECATED_V8_INSNS},
551     /* TI ultrasparc III */
552     /* ??? Check if %y issue still holds true in ultra3.  */
553     { "ultrasparc3", PROCESSOR_ULTRASPARC3, MASK_ISA, MASK_V9|MASK_DEPRECATED_V8_INSNS},
554     { 0, 0, 0, 0 }
555   };
556   const struct cpu_table *cpu;
557   const struct sparc_cpu_select *sel;
558   int fpu;
559   
560 #ifndef SPARC_BI_ARCH
561   /* Check for unsupported architecture size.  */
562   if (! TARGET_64BIT != DEFAULT_ARCH32_P)
563     error ("%s is not supported by this configuration",
564            DEFAULT_ARCH32_P ? "-m64" : "-m32");
565 #endif
566
567   /* We force all 64bit archs to use 128 bit long double */
568   if (TARGET_64BIT && ! TARGET_LONG_DOUBLE_128)
569     {
570       error ("-mlong-double-64 not allowed with -m64");
571       target_flags |= MASK_LONG_DOUBLE_128;
572     }
573
574   /* Code model selection.  */
575   sparc_cmodel = SPARC_DEFAULT_CMODEL;
576   
577 #ifdef SPARC_BI_ARCH
578   if (TARGET_ARCH32)
579     sparc_cmodel = CM_32;
580 #endif
581
582   if (sparc_cmodel_string != NULL)
583     {
584       if (TARGET_ARCH64)
585         {
586           for (cmodel = &cmodels[0]; cmodel->name; cmodel++)
587             if (strcmp (sparc_cmodel_string, cmodel->name) == 0)
588               break;
589           if (cmodel->name == NULL)
590             error ("bad value (%s) for -mcmodel= switch", sparc_cmodel_string);
591           else
592             sparc_cmodel = cmodel->value;
593         }
594       else
595         error ("-mcmodel= is not supported on 32 bit systems");
596     }
597
598   fpu = TARGET_FPU; /* save current -mfpu status */
599
600   /* Set the default CPU.  */
601   for (def = &cpu_default[0]; def->name; ++def)
602     if (def->cpu == TARGET_CPU_DEFAULT)
603       break;
604   if (! def->name)
605     abort ();
606   sparc_select[0].string = def->name;
607
608   for (sel = &sparc_select[0]; sel->name; ++sel)
609     {
610       if (sel->string)
611         {
612           for (cpu = &cpu_table[0]; cpu->name; ++cpu)
613             if (! strcmp (sel->string, cpu->name))
614               {
615                 if (sel->set_tune_p)
616                   sparc_cpu = cpu->processor;
617
618                 if (sel->set_arch_p)
619                   {
620                     target_flags &= ~cpu->disable;
621                     target_flags |= cpu->enable;
622                   }
623                 break;
624               }
625
626           if (! cpu->name)
627             error ("bad value (%s) for %s switch", sel->string, sel->name);
628         }
629     }
630
631   /* If -mfpu or -mno-fpu was explicitly used, don't override with
632      the processor default.  Clear MASK_FPU_SET to avoid confusing
633      the reverse mapping from switch values to names.  */
634   if (TARGET_FPU_SET)
635     {
636       target_flags = (target_flags & ~MASK_FPU) | fpu;
637       target_flags &= ~MASK_FPU_SET;
638     }
639
640   /* Don't allow -mvis if FPU is disabled.  */
641   if (! TARGET_FPU)
642     target_flags &= ~MASK_VIS;
643
644   /* -mvis assumes UltraSPARC+, so we are sure v9 instructions
645      are available.
646      -m64 also implies v9.  */
647   if (TARGET_VIS || TARGET_ARCH64)
648     {
649       target_flags |= MASK_V9;
650       target_flags &= ~(MASK_V8 | MASK_SPARCLET | MASK_SPARCLITE);
651     }
652
653   /* Use the deprecated v8 insns for sparc64 in 32 bit mode.  */
654   if (TARGET_V9 && TARGET_ARCH32)
655     target_flags |= MASK_DEPRECATED_V8_INSNS;
656
657   /* V8PLUS requires V9, makes no sense in 64 bit mode.  */
658   if (! TARGET_V9 || TARGET_ARCH64)
659     target_flags &= ~MASK_V8PLUS;
660
661   /* Don't use stack biasing in 32 bit mode.  */
662   if (TARGET_ARCH32)
663     target_flags &= ~MASK_STACK_BIAS;
664     
665   /* Supply a default value for align_functions.  */
666   if (align_functions == 0
667       && (sparc_cpu == PROCESSOR_ULTRASPARC
668           || sparc_cpu == PROCESSOR_ULTRASPARC3))
669     align_functions = 32;
670
671   /* Validate PCC_STRUCT_RETURN.  */
672   if (flag_pcc_struct_return == DEFAULT_PCC_STRUCT_RETURN)
673     flag_pcc_struct_return = (TARGET_ARCH64 ? 0 : 1);
674
675   /* Only use .uaxword when compiling for a 64-bit target.  */
676   if (!TARGET_ARCH64)
677     targetm.asm_out.unaligned_op.di = NULL;
678
679   /* Do various machine dependent initializations.  */
680   sparc_init_modes ();
681
682   /* Acquire a unique set number for our register saves and restores.  */
683   sparc_sr_alias_set = new_alias_set ();
684
685   /* Set up function hooks.  */
686   init_machine_status = sparc_init_machine_status;
687
688   switch (sparc_cpu)
689     {
690     case PROCESSOR_V7:
691     case PROCESSOR_CYPRESS:
692       sparc_costs = &cypress_costs;
693       break;
694     case PROCESSOR_V8:
695     case PROCESSOR_SPARCLITE:
696     case PROCESSOR_SUPERSPARC:
697       sparc_costs = &supersparc_costs;
698       break;
699     case PROCESSOR_F930:
700     case PROCESSOR_F934:
701     case PROCESSOR_HYPERSPARC:
702     case PROCESSOR_SPARCLITE86X:
703       sparc_costs = &hypersparc_costs;
704       break;
705     case PROCESSOR_SPARCLET:
706     case PROCESSOR_TSC701:
707       sparc_costs = &sparclet_costs;
708       break;
709     case PROCESSOR_V9:
710     case PROCESSOR_ULTRASPARC:
711       sparc_costs = &ultrasparc_costs;
712       break;
713     case PROCESSOR_ULTRASPARC3:
714       sparc_costs = &ultrasparc3_costs;
715       break;
716     };
717 }
718 \f
719 #ifdef SUBTARGET_ATTRIBUTE_TABLE
720 /* Table of valid machine attributes.  */
721 const struct attribute_spec sparc_attribute_table[] =
722 {
723   /* { name, min_len, max_len, decl_req, type_req, fn_type_req, handler } */
724   SUBTARGET_ATTRIBUTE_TABLE,
725   { NULL,        0, 0, false, false, false, NULL }
726 };
727 #endif
728 \f
729 /* Miscellaneous utilities.  */
730
731 /* Nonzero if CODE, a comparison, is suitable for use in v9 conditional move
732    or branch on register contents instructions.  */
733
734 int
735 v9_regcmp_p (enum rtx_code code)
736 {
737   return (code == EQ || code == NE || code == GE || code == LT
738           || code == LE || code == GT);
739 }
740
741 \f
742 /* Operand constraints.  */
743
744 /* Return nonzero only if OP is a register of mode MODE,
745    or const0_rtx.  */
746
747 int
748 reg_or_0_operand (rtx op, enum machine_mode mode)
749 {
750   if (register_operand (op, mode))
751     return 1;
752   if (op == const0_rtx)
753     return 1;
754   if (GET_MODE (op) == VOIDmode && GET_CODE (op) == CONST_DOUBLE
755       && CONST_DOUBLE_HIGH (op) == 0
756       && CONST_DOUBLE_LOW (op) == 0)
757     return 1;
758   if (fp_zero_operand (op, mode))
759     return 1;
760   return 0;
761 }
762
763 /* Return nonzero only if OP is const1_rtx.  */
764
765 int
766 const1_operand (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
767 {
768   return op == const1_rtx;
769 }
770
771 /* Nonzero if OP is a floating point value with value 0.0.  */
772
773 int
774 fp_zero_operand (rtx op, enum machine_mode mode)
775 {
776   enum mode_class mclass = GET_MODE_CLASS (GET_MODE (op));
777   if (mclass != MODE_FLOAT && mclass != MODE_VECTOR_INT)
778     return 0;
779   return op == CONST0_RTX (mode);
780 }
781
782 /* Nonzero if OP is a register operand in floating point register.  */
783
784 int
785 fp_register_operand (rtx op, enum machine_mode mode)
786 {
787   if (! register_operand (op, mode))
788     return 0;
789   if (GET_CODE (op) == SUBREG)
790     op = SUBREG_REG (op);
791   return GET_CODE (op) == REG && SPARC_FP_REG_P (REGNO (op));
792 }
793
794 /* Nonzero if OP is a floating point constant which can
795    be loaded into an integer register using a single
796    sethi instruction.  */
797
798 int
799 fp_sethi_p (rtx op)
800 {
801   if (GET_CODE (op) == CONST_DOUBLE)
802     {
803       REAL_VALUE_TYPE r;
804       long i;
805
806       REAL_VALUE_FROM_CONST_DOUBLE (r, op);
807       if (REAL_VALUES_EQUAL (r, dconst0) &&
808           ! REAL_VALUE_MINUS_ZERO (r))
809         return 0;
810       REAL_VALUE_TO_TARGET_SINGLE (r, i);
811       if (SPARC_SETHI_P (i))
812         return 1;
813     }
814
815   return 0;
816 }
817
818 /* Nonzero if OP is a floating point constant which can
819    be loaded into an integer register using a single
820    mov instruction.  */
821
822 int
823 fp_mov_p (rtx op)
824 {
825   if (GET_CODE (op) == CONST_DOUBLE)
826     {
827       REAL_VALUE_TYPE r;
828       long i;
829
830       REAL_VALUE_FROM_CONST_DOUBLE (r, op);
831       if (REAL_VALUES_EQUAL (r, dconst0) &&
832           ! REAL_VALUE_MINUS_ZERO (r))
833         return 0;
834       REAL_VALUE_TO_TARGET_SINGLE (r, i);
835       if (SPARC_SIMM13_P (i))
836         return 1;
837     }
838
839   return 0;
840 }
841
842 /* Nonzero if OP is a floating point constant which can
843    be loaded into an integer register using a high/losum
844    instruction sequence.  */
845
846 int
847 fp_high_losum_p (rtx op)
848 {
849   /* The constraints calling this should only be in
850      SFmode move insns, so any constant which cannot
851      be moved using a single insn will do.  */
852   if (GET_CODE (op) == CONST_DOUBLE)
853     {
854       REAL_VALUE_TYPE r;
855       long i;
856
857       REAL_VALUE_FROM_CONST_DOUBLE (r, op);
858       if (REAL_VALUES_EQUAL (r, dconst0) &&
859           ! REAL_VALUE_MINUS_ZERO (r))
860         return 0;
861       REAL_VALUE_TO_TARGET_SINGLE (r, i);
862       if (! SPARC_SETHI_P (i)
863           && ! SPARC_SIMM13_P (i))
864         return 1;
865     }
866
867   return 0;
868 }
869
870 /* Nonzero if OP is an integer register.  */
871
872 int
873 intreg_operand (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
874 {
875   return (register_operand (op, SImode)
876           || (TARGET_ARCH64 && register_operand (op, DImode)));
877 }
878
879 /* Nonzero if OP is a floating point condition code register.  */
880
881 int
882 fcc_reg_operand (rtx op, enum machine_mode mode)
883 {
884   /* This can happen when recog is called from combine.  Op may be a MEM.
885      Fail instead of calling abort in this case.  */
886   if (GET_CODE (op) != REG)
887     return 0;
888
889   if (mode != VOIDmode && mode != GET_MODE (op))
890     return 0;
891   if (mode == VOIDmode
892       && (GET_MODE (op) != CCFPmode && GET_MODE (op) != CCFPEmode))
893     return 0;
894
895 #if 0   /* ??? ==> 1 when %fcc0-3 are pseudos first.  See gen_compare_reg().  */
896   if (reg_renumber == 0)
897     return REGNO (op) >= FIRST_PSEUDO_REGISTER;
898   return REGNO_OK_FOR_CCFP_P (REGNO (op));
899 #else
900   return (unsigned) REGNO (op) - SPARC_FIRST_V9_FCC_REG < 4;
901 #endif
902 }
903
904 /* Nonzero if OP is a floating point condition code fcc0 register.  */
905
906 int
907 fcc0_reg_operand (rtx op, enum machine_mode mode)
908 {
909   /* This can happen when recog is called from combine.  Op may be a MEM.
910      Fail instead of calling abort in this case.  */
911   if (GET_CODE (op) != REG)
912     return 0;
913
914   if (mode != VOIDmode && mode != GET_MODE (op))
915     return 0;
916   if (mode == VOIDmode
917       && (GET_MODE (op) != CCFPmode && GET_MODE (op) != CCFPEmode))
918     return 0;
919
920   return REGNO (op) == SPARC_FCC_REG;
921 }
922
923 /* Nonzero if OP is an integer or floating point condition code register.  */
924
925 int
926 icc_or_fcc_reg_operand (rtx op, enum machine_mode mode)
927 {
928   if (GET_CODE (op) == REG && REGNO (op) == SPARC_ICC_REG)
929     {
930       if (mode != VOIDmode && mode != GET_MODE (op))
931         return 0;
932       if (mode == VOIDmode
933           && GET_MODE (op) != CCmode && GET_MODE (op) != CCXmode)
934         return 0;
935       return 1;
936     }
937
938   return fcc_reg_operand (op, mode);
939 }
940
941 /* Call insn on SPARC can take a PC-relative constant address, or any regular
942    memory address.  */
943
944 int
945 call_operand (rtx op, enum machine_mode mode)
946 {
947   if (GET_CODE (op) != MEM)
948     abort ();
949   op = XEXP (op, 0);
950   return (symbolic_operand (op, mode) || memory_address_p (Pmode, op));
951 }
952
953 int
954 call_operand_address (rtx op, enum machine_mode mode)
955 {
956   return (symbolic_operand (op, mode) || memory_address_p (Pmode, op));
957 }
958
959 /* If OP is a SYMBOL_REF of a thread-local symbol, return its TLS mode,
960    otherwise return 0.  */
961
962 int
963 tls_symbolic_operand (rtx op)
964 {
965   if (GET_CODE (op) != SYMBOL_REF)
966     return 0;
967   return SYMBOL_REF_TLS_MODEL (op);
968 }
969
970 int
971 tgd_symbolic_operand (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
972 {
973   return tls_symbolic_operand (op) == TLS_MODEL_GLOBAL_DYNAMIC;
974 }
975
976 int
977 tld_symbolic_operand (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
978 {
979   return tls_symbolic_operand (op) == TLS_MODEL_LOCAL_DYNAMIC;
980 }
981
982 int
983 tie_symbolic_operand (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
984 {
985   return tls_symbolic_operand (op) == TLS_MODEL_INITIAL_EXEC;
986 }
987
988 int
989 tle_symbolic_operand (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
990 {
991   return tls_symbolic_operand (op) == TLS_MODEL_LOCAL_EXEC;
992 }
993
994 /* Returns 1 if OP is either a symbol reference or a sum of a symbol
995    reference and a constant.  */
996
997 int
998 symbolic_operand (register rtx op, enum machine_mode mode)
999 {
1000   enum machine_mode omode = GET_MODE (op);
1001
1002   if (omode != mode && omode != VOIDmode && mode != VOIDmode)
1003     return 0;
1004
1005   switch (GET_CODE (op))
1006     {
1007     case SYMBOL_REF:
1008       return !SYMBOL_REF_TLS_MODEL (op);
1009
1010     case LABEL_REF:
1011       return 1;
1012
1013     case CONST:
1014       op = XEXP (op, 0);
1015       return (((GET_CODE (XEXP (op, 0)) == SYMBOL_REF
1016                 && !SYMBOL_REF_TLS_MODEL (XEXP (op, 0)))
1017                || GET_CODE (XEXP (op, 0)) == LABEL_REF)
1018               && GET_CODE (XEXP (op, 1)) == CONST_INT);
1019
1020     default:
1021       return 0;
1022     }
1023 }
1024
1025 /* Return truth value of statement that OP is a symbolic memory
1026    operand of mode MODE.  */
1027
1028 int
1029 symbolic_memory_operand (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
1030 {
1031   if (GET_CODE (op) == SUBREG)
1032     op = SUBREG_REG (op);
1033   if (GET_CODE (op) != MEM)
1034     return 0;
1035   op = XEXP (op, 0);
1036   return ((GET_CODE (op) == SYMBOL_REF && !SYMBOL_REF_TLS_MODEL (op))
1037           || GET_CODE (op) == CONST || GET_CODE (op) == HIGH
1038           || GET_CODE (op) == LABEL_REF);
1039 }
1040
1041 /* Return truth value of statement that OP is a LABEL_REF of mode MODE.  */
1042
1043 int
1044 label_ref_operand (rtx op, enum machine_mode mode)
1045 {
1046   if (GET_CODE (op) != LABEL_REF)
1047     return 0;
1048   if (GET_MODE (op) != mode)
1049     return 0;
1050   return 1;
1051 }
1052
1053 /* Return 1 if the operand is an argument used in generating pic references
1054    in either the medium/low or medium/anywhere code models of sparc64.  */
1055
1056 int
1057 sp64_medium_pic_operand (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
1058 {
1059   /* Check for (const (minus (symbol_ref:GOT)
1060                              (const (minus (label) (pc))))).  */
1061   if (GET_CODE (op) != CONST)
1062     return 0;
1063   op = XEXP (op, 0);
1064   if (GET_CODE (op) != MINUS)
1065     return 0;
1066   if (GET_CODE (XEXP (op, 0)) != SYMBOL_REF)
1067     return 0;
1068   /* ??? Ensure symbol is GOT.  */
1069   if (GET_CODE (XEXP (op, 1)) != CONST)
1070     return 0;
1071   if (GET_CODE (XEXP (XEXP (op, 1), 0)) != MINUS)
1072     return 0;
1073   return 1;
1074 }
1075
1076 /* Return 1 if the operand is a data segment reference.  This includes
1077    the readonly data segment, or in other words anything but the text segment.
1078    This is needed in the medium/anywhere code model on v9.  These values
1079    are accessed with EMBMEDANY_BASE_REG.  */
1080
1081 int
1082 data_segment_operand (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
1083 {
1084   switch (GET_CODE (op))
1085     {
1086     case SYMBOL_REF :
1087       return ! SYMBOL_REF_FUNCTION_P (op);
1088     case PLUS :
1089       /* Assume canonical format of symbol + constant.
1090          Fall through.  */
1091     case CONST :
1092       return data_segment_operand (XEXP (op, 0), VOIDmode);
1093     default :
1094       return 0;
1095     }
1096 }
1097
1098 /* Return 1 if the operand is a text segment reference.
1099    This is needed in the medium/anywhere code model on v9.  */
1100
1101 int
1102 text_segment_operand (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
1103 {
1104   switch (GET_CODE (op))
1105     {
1106     case LABEL_REF :
1107       return 1;
1108     case SYMBOL_REF :
1109       return SYMBOL_REF_FUNCTION_P (op);
1110     case PLUS :
1111       /* Assume canonical format of symbol + constant.
1112          Fall through.  */
1113     case CONST :
1114       return text_segment_operand (XEXP (op, 0), VOIDmode);
1115     default :
1116       return 0;
1117     }
1118 }
1119
1120 /* Return 1 if the operand is either a register or a memory operand that is
1121    not symbolic.  */
1122
1123 int
1124 reg_or_nonsymb_mem_operand (register rtx op, enum machine_mode mode)
1125 {
1126   if (register_operand (op, mode))
1127     return 1;
1128
1129   if (memory_operand (op, mode) && ! symbolic_memory_operand (op, mode))
1130     return 1;
1131
1132   return 0;
1133 }
1134
1135 int
1136 splittable_symbolic_memory_operand (rtx op,
1137                                     enum machine_mode mode ATTRIBUTE_UNUSED)
1138 {
1139   if (GET_CODE (op) != MEM)
1140     return 0;
1141   if (! symbolic_operand (XEXP (op, 0), Pmode))
1142     return 0;
1143   return 1;
1144 }
1145
1146 int
1147 splittable_immediate_memory_operand (rtx op,
1148                                      enum machine_mode mode ATTRIBUTE_UNUSED)
1149 {
1150   if (GET_CODE (op) != MEM)
1151     return 0;
1152   if (! immediate_operand (XEXP (op, 0), Pmode))
1153     return 0;
1154   return 1;
1155 }
1156
1157 /* Return truth value of whether OP is EQ or NE.  */
1158
1159 int
1160 eq_or_neq (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
1161 {
1162   return (GET_CODE (op) == EQ || GET_CODE (op) == NE);
1163 }
1164
1165 /* Return 1 if this is a comparison operator, but not an EQ, NE, GEU,
1166    or LTU for non-floating-point.  We handle those specially.  */
1167
1168 int
1169 normal_comp_operator (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
1170 {
1171   enum rtx_code code;
1172
1173   if (!COMPARISON_P (op))
1174     return 0;
1175
1176   if (GET_MODE (XEXP (op, 0)) == CCFPmode
1177       || GET_MODE (XEXP (op, 0)) == CCFPEmode)
1178     return 1;
1179
1180   code = GET_CODE (op);
1181   return (code != NE && code != EQ && code != GEU && code != LTU);
1182 }
1183
1184 /* Return 1 if this is a comparison operator.  This allows the use of
1185    MATCH_OPERATOR to recognize all the branch insns.  */
1186
1187 int
1188 noov_compare_op (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
1189 {
1190   enum rtx_code code;
1191
1192   if (!COMPARISON_P (op))
1193     return 0;
1194
1195   code = GET_CODE (op);
1196   if (GET_MODE (XEXP (op, 0)) == CC_NOOVmode
1197       || GET_MODE (XEXP (op, 0)) == CCX_NOOVmode)
1198     /* These are the only branches which work with CC_NOOVmode.  */
1199     return (code == EQ || code == NE || code == GE || code == LT);
1200   return 1;
1201 }
1202
1203 /* Return 1 if this is a 64-bit comparison operator.  This allows the use of
1204    MATCH_OPERATOR to recognize all the branch insns.  */
1205
1206 int
1207 noov_compare64_op (register rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
1208 {
1209   enum rtx_code code;
1210
1211   if (! TARGET_V9)
1212     return 0;
1213
1214   if (!COMPARISON_P (op))
1215     return 0;
1216
1217   code = GET_CODE (op);
1218   if (GET_MODE (XEXP (op, 0)) == CCX_NOOVmode)
1219     /* These are the only branches which work with CCX_NOOVmode.  */
1220     return (code == EQ || code == NE || code == GE || code == LT);
1221   return (GET_MODE (XEXP (op, 0)) == CCXmode);
1222 }
1223
1224 /* Nonzero if OP is a comparison operator suitable for use in v9
1225    conditional move or branch on register contents instructions.  */
1226
1227 int
1228 v9_regcmp_op (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
1229 {
1230   enum rtx_code code;
1231
1232   if (!COMPARISON_P (op))
1233     return 0;
1234
1235   code = GET_CODE (op);
1236   return v9_regcmp_p (code);
1237 }
1238
1239 /* Return 1 if this is a SIGN_EXTEND or ZERO_EXTEND operation.  */
1240
1241 int
1242 extend_op (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
1243 {
1244   return GET_CODE (op) == SIGN_EXTEND || GET_CODE (op) == ZERO_EXTEND;
1245 }
1246
1247 /* Return nonzero if OP is an operator of mode MODE which can set
1248    the condition codes explicitly.  We do not include PLUS and MINUS
1249    because these require CC_NOOVmode, which we handle explicitly.  */
1250
1251 int
1252 cc_arithop (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
1253 {
1254   if (GET_CODE (op) == AND
1255       || GET_CODE (op) == IOR
1256       || GET_CODE (op) == XOR)
1257     return 1;
1258
1259   return 0;
1260 }
1261
1262 /* Return nonzero if OP is an operator of mode MODE which can bitwise
1263    complement its second operand and set the condition codes explicitly.  */
1264
1265 int
1266 cc_arithopn (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
1267 {
1268   /* XOR is not here because combine canonicalizes (xor (not ...) ...)
1269      and (xor ... (not ...)) to (not (xor ...)).  */
1270   return (GET_CODE (op) == AND
1271           || GET_CODE (op) == IOR);
1272 }
1273 \f
1274 /* Return true if OP is a register, or is a CONST_INT that can fit in a
1275    signed 13 bit immediate field.  This is an acceptable SImode operand for
1276    most 3 address instructions.  */
1277
1278 int
1279 arith_operand (rtx op, enum machine_mode mode)
1280 {
1281   if (register_operand (op, mode))
1282     return 1;
1283   if (GET_CODE (op) != CONST_INT)
1284     return 0;
1285   return SMALL_INT32 (op);
1286 }
1287
1288 /* Return true if OP is a constant 4096  */
1289
1290 int
1291 arith_4096_operand (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
1292 {
1293   if (GET_CODE (op) != CONST_INT)
1294     return 0;
1295   else
1296     return INTVAL (op) == 4096;
1297 }
1298
1299 /* Return true if OP is suitable as second operand for add/sub */
1300
1301 int
1302 arith_add_operand (rtx op, enum machine_mode mode)
1303 {
1304   return arith_operand (op, mode) || arith_4096_operand (op, mode);
1305 }
1306
1307 /* Return true if OP is a CONST_INT or a CONST_DOUBLE which can fit in the
1308    immediate field of OR and XOR instructions.  Used for 64-bit
1309    constant formation patterns.  */
1310 int
1311 const64_operand (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
1312 {
1313   return ((GET_CODE (op) == CONST_INT
1314            && SPARC_SIMM13_P (INTVAL (op)))
1315 #if HOST_BITS_PER_WIDE_INT != 64
1316           || (GET_CODE (op) == CONST_DOUBLE
1317               && SPARC_SIMM13_P (CONST_DOUBLE_LOW (op))
1318               && (CONST_DOUBLE_HIGH (op) ==
1319                   ((CONST_DOUBLE_LOW (op) & 0x80000000) != 0 ?
1320                    (HOST_WIDE_INT)-1 : 0)))
1321 #endif
1322           );
1323 }
1324
1325 /* The same, but only for sethi instructions.  */
1326 int
1327 const64_high_operand (rtx op, enum machine_mode mode)
1328 {
1329   return ((GET_CODE (op) == CONST_INT
1330            && (INTVAL (op) & ~(HOST_WIDE_INT)0x3ff) != 0
1331            && SPARC_SETHI_P (INTVAL (op) & GET_MODE_MASK (mode))
1332            )
1333           || (GET_CODE (op) == CONST_DOUBLE
1334               && CONST_DOUBLE_HIGH (op) == 0
1335               && (CONST_DOUBLE_LOW (op) & ~(HOST_WIDE_INT)0x3ff) != 0
1336               && SPARC_SETHI_P (CONST_DOUBLE_LOW (op))));
1337 }
1338
1339 /* Return true if OP is a register, or is a CONST_INT that can fit in a
1340    signed 11 bit immediate field.  This is an acceptable SImode operand for
1341    the movcc instructions.  */
1342
1343 int
1344 arith11_operand (rtx op, enum machine_mode mode)
1345 {
1346   return (register_operand (op, mode)
1347           || (GET_CODE (op) == CONST_INT && SPARC_SIMM11_P (INTVAL (op))));
1348 }
1349
1350 /* Return true if OP is a register, or is a CONST_INT that can fit in a
1351    signed 10 bit immediate field.  This is an acceptable SImode operand for
1352    the movrcc instructions.  */
1353
1354 int
1355 arith10_operand (rtx op, enum machine_mode mode)
1356 {
1357   return (register_operand (op, mode)
1358           || (GET_CODE (op) == CONST_INT && SPARC_SIMM10_P (INTVAL (op))));
1359 }
1360
1361 /* Return true if OP is a register, is a CONST_INT that fits in a 13 bit
1362    immediate field, or is a CONST_DOUBLE whose both parts fit in a 13 bit
1363    immediate field.
1364    ARCH64: Return true if OP is a register, or is a CONST_INT or CONST_DOUBLE that
1365    can fit in a 13 bit immediate field.  This is an acceptable DImode operand
1366    for most 3 address instructions.  */
1367
1368 int
1369 arith_double_operand (rtx op, enum machine_mode mode)
1370 {
1371   return (register_operand (op, mode)
1372           || (GET_CODE (op) == CONST_INT && SMALL_INT (op))
1373           || (! TARGET_ARCH64
1374               && GET_CODE (op) == CONST_DOUBLE
1375               && (unsigned HOST_WIDE_INT) (CONST_DOUBLE_LOW (op) + 0x1000) < 0x2000
1376               && (unsigned HOST_WIDE_INT) (CONST_DOUBLE_HIGH (op) + 0x1000) < 0x2000)
1377           || (TARGET_ARCH64
1378               && GET_CODE (op) == CONST_DOUBLE
1379               && (unsigned HOST_WIDE_INT) (CONST_DOUBLE_LOW (op) + 0x1000) < 0x2000
1380               && ((CONST_DOUBLE_HIGH (op) == -1
1381                    && (CONST_DOUBLE_LOW (op) & 0x1000) == 0x1000)
1382                   || (CONST_DOUBLE_HIGH (op) == 0
1383                       && (CONST_DOUBLE_LOW (op) & 0x1000) == 0))));
1384 }
1385
1386 /* Return true if OP is a constant 4096 for DImode on ARCH64 */
1387
1388 int
1389 arith_double_4096_operand (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
1390 {
1391   return (TARGET_ARCH64 &&
1392           ((GET_CODE (op) == CONST_INT && INTVAL (op) == 4096) ||
1393            (GET_CODE (op) == CONST_DOUBLE &&
1394             CONST_DOUBLE_LOW (op) == 4096 &&
1395             CONST_DOUBLE_HIGH (op) == 0)));
1396 }
1397
1398 /* Return true if OP is suitable as second operand for add/sub in DImode */
1399
1400 int
1401 arith_double_add_operand (rtx op, enum machine_mode mode)
1402 {
1403   return arith_double_operand (op, mode) || arith_double_4096_operand (op, mode);
1404 }
1405
1406 /* Return true if OP is a register, or is a CONST_INT or CONST_DOUBLE that
1407    can fit in an 11 bit immediate field.  This is an acceptable DImode
1408    operand for the movcc instructions.  */
1409 /* ??? Replace with arith11_operand?  */
1410
1411 int
1412 arith11_double_operand (rtx op, enum machine_mode mode)
1413 {
1414   return (register_operand (op, mode)
1415           || (GET_CODE (op) == CONST_DOUBLE
1416               && (GET_MODE (op) == mode || GET_MODE (op) == VOIDmode)
1417               && (unsigned HOST_WIDE_INT) (CONST_DOUBLE_LOW (op) + 0x400) < 0x800
1418               && ((CONST_DOUBLE_HIGH (op) == -1
1419                    && (CONST_DOUBLE_LOW (op) & 0x400) == 0x400)
1420                   || (CONST_DOUBLE_HIGH (op) == 0
1421                       && (CONST_DOUBLE_LOW (op) & 0x400) == 0)))
1422           || (GET_CODE (op) == CONST_INT
1423               && (GET_MODE (op) == mode || GET_MODE (op) == VOIDmode)
1424               && (unsigned HOST_WIDE_INT) (INTVAL (op) + 0x400) < 0x800));
1425 }
1426
1427 /* Return true if OP is a register, or is a CONST_INT or CONST_DOUBLE that
1428    can fit in an 10 bit immediate field.  This is an acceptable DImode
1429    operand for the movrcc instructions.  */
1430 /* ??? Replace with arith10_operand?  */
1431
1432 int
1433 arith10_double_operand (rtx op, enum machine_mode mode)
1434 {
1435   return (register_operand (op, mode)
1436           || (GET_CODE (op) == CONST_DOUBLE
1437               && (GET_MODE (op) == mode || GET_MODE (op) == VOIDmode)
1438               && (unsigned) (CONST_DOUBLE_LOW (op) + 0x200) < 0x400
1439               && ((CONST_DOUBLE_HIGH (op) == -1
1440                    && (CONST_DOUBLE_LOW (op) & 0x200) == 0x200)
1441                   || (CONST_DOUBLE_HIGH (op) == 0
1442                       && (CONST_DOUBLE_LOW (op) & 0x200) == 0)))
1443           || (GET_CODE (op) == CONST_INT
1444               && (GET_MODE (op) == mode || GET_MODE (op) == VOIDmode)
1445               && (unsigned HOST_WIDE_INT) (INTVAL (op) + 0x200) < 0x400));
1446 }
1447
1448 /* Return truth value of whether OP is an integer which fits the
1449    range constraining immediate operands in most three-address insns,
1450    which have a 13 bit immediate field.  */
1451
1452 int
1453 small_int (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
1454 {
1455   return (GET_CODE (op) == CONST_INT && SMALL_INT (op));
1456 }
1457
1458 int
1459 small_int_or_double (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
1460 {
1461   return ((GET_CODE (op) == CONST_INT && SMALL_INT (op))
1462           || (GET_CODE (op) == CONST_DOUBLE
1463               && CONST_DOUBLE_HIGH (op) == 0
1464               && SPARC_SIMM13_P (CONST_DOUBLE_LOW (op))));
1465 }
1466
1467 /* Recognize operand values for the umul instruction.  That instruction sign
1468    extends immediate values just like all other sparc instructions, but
1469    interprets the extended result as an unsigned number.  */
1470
1471 int
1472 uns_small_int (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
1473 {
1474 #if HOST_BITS_PER_WIDE_INT > 32
1475   /* All allowed constants will fit a CONST_INT.  */
1476   return (GET_CODE (op) == CONST_INT
1477           && ((INTVAL (op) >= 0 && INTVAL (op) < 0x1000)
1478               || (INTVAL (op) >= 0xFFFFF000
1479                   && INTVAL (op) <= 0xFFFFFFFF)));
1480 #else
1481   return ((GET_CODE (op) == CONST_INT && (unsigned) INTVAL (op) < 0x1000)
1482           || (GET_CODE (op) == CONST_DOUBLE
1483               && CONST_DOUBLE_HIGH (op) == 0
1484               && (unsigned) CONST_DOUBLE_LOW (op) - 0xFFFFF000 < 0x1000));
1485 #endif
1486 }
1487
1488 int
1489 uns_arith_operand (rtx op, enum machine_mode mode)
1490 {
1491   return register_operand (op, mode) || uns_small_int (op, mode);
1492 }
1493
1494 /* Return truth value of statement that OP is a call-clobbered register.  */
1495 int
1496 clobbered_register (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
1497 {
1498   return (GET_CODE (op) == REG && call_used_regs[REGNO (op)]);
1499 }
1500
1501 /* Return 1 if OP is a valid operand for the source of a move insn.  */
1502
1503 int
1504 input_operand (rtx op, enum machine_mode mode)
1505 {
1506   enum mode_class mclass;
1507
1508   /* If both modes are non-void they must be the same.  */
1509   if (mode != VOIDmode && GET_MODE (op) != VOIDmode && mode != GET_MODE (op))
1510     return 0;
1511
1512   /* Allow any one instruction integer constant, and all CONST_INT
1513      variants when we are working in DImode and !arch64.  */
1514   if (GET_MODE_CLASS (mode) == MODE_INT
1515       && ((GET_CODE (op) == CONST_INT
1516            && (SPARC_SETHI_P (INTVAL (op) & GET_MODE_MASK (mode))
1517                || SPARC_SIMM13_P (INTVAL (op))
1518                || (mode == DImode
1519                    && ! TARGET_ARCH64)))
1520           || (TARGET_ARCH64
1521               && GET_CODE (op) == CONST_DOUBLE
1522               && ((CONST_DOUBLE_HIGH (op) == 0
1523                    && SPARC_SETHI_P (CONST_DOUBLE_LOW (op)))
1524                   ||
1525 #if HOST_BITS_PER_WIDE_INT == 64
1526                   (CONST_DOUBLE_HIGH (op) == 0
1527                    && SPARC_SIMM13_P (CONST_DOUBLE_LOW (op)))
1528 #else
1529                   (SPARC_SIMM13_P (CONST_DOUBLE_LOW (op))
1530                    && (((CONST_DOUBLE_LOW (op) & 0x80000000) == 0
1531                         && CONST_DOUBLE_HIGH (op) == 0)
1532                        || (CONST_DOUBLE_HIGH (op) == -1
1533                            && CONST_DOUBLE_LOW (op) & 0x80000000) != 0))
1534 #endif
1535                   ))))
1536     return 1;
1537
1538   /* If !arch64 and this is a DImode const, allow it so that
1539      the splits can be generated.  */
1540   if (! TARGET_ARCH64
1541       && mode == DImode
1542       && GET_CODE (op) == CONST_DOUBLE)
1543     return 1;
1544
1545   if (register_operand (op, mode))
1546     return 1;
1547
1548   mclass = GET_MODE_CLASS (mode);
1549   if ((mclass == MODE_FLOAT && GET_CODE (op) == CONST_DOUBLE)
1550       || (mclass == MODE_VECTOR_INT && GET_CODE (op) == CONST_VECTOR))
1551     return 1;
1552
1553   /* If this is a SUBREG, look inside so that we handle
1554      paradoxical ones.  */
1555   if (GET_CODE (op) == SUBREG)
1556     op = SUBREG_REG (op);
1557
1558   /* Check for valid MEM forms.  */
1559   if (GET_CODE (op) == MEM)
1560     return memory_address_p (mode, XEXP (op, 0));
1561
1562   return 0;
1563 }
1564
1565 /* Return 1 if OP is valid for the lhs of a compare insn.  */
1566
1567 int
1568 compare_operand (rtx op, enum machine_mode mode)
1569 {
1570   if (GET_CODE (op) == ZERO_EXTRACT)
1571     return (register_operand (XEXP (op, 0), mode)
1572             && small_int_or_double (XEXP (op, 1), mode)
1573             && small_int_or_double (XEXP (op, 2), mode)
1574             /* This matches cmp_zero_extract.  */
1575             && ((mode == SImode
1576                  && ((GET_CODE (XEXP (op, 2)) == CONST_INT
1577                       && INTVAL (XEXP (op, 2)) > 19)
1578                      || (GET_CODE (XEXP (op, 2)) == CONST_DOUBLE
1579                          && CONST_DOUBLE_LOW (XEXP (op, 2)) > 19)))
1580                 /* This matches cmp_zero_extract_sp64.  */
1581                 || (mode == DImode
1582                     && TARGET_ARCH64
1583                     && ((GET_CODE (XEXP (op, 2)) == CONST_INT
1584                          && INTVAL (XEXP (op, 2)) > 51)
1585                         || (GET_CODE (XEXP (op, 2)) == CONST_DOUBLE
1586                             && CONST_DOUBLE_LOW (XEXP (op, 2)) > 51)))));
1587   else
1588     return register_operand (op, mode);
1589 }
1590
1591 \f
1592 /* We know it can't be done in one insn when we get here,
1593    the movsi expander guarantees this.  */
1594 void
1595 sparc_emit_set_const32 (rtx op0, rtx op1)
1596 {
1597   enum machine_mode mode = GET_MODE (op0);
1598   rtx temp;
1599
1600   if (GET_CODE (op1) == CONST_INT)
1601     {
1602       HOST_WIDE_INT value = INTVAL (op1);
1603
1604       if (SPARC_SETHI_P (value & GET_MODE_MASK (mode))
1605           || SPARC_SIMM13_P (value))
1606         abort ();
1607     }
1608
1609   /* Full 2-insn decomposition is needed.  */
1610   if (reload_in_progress || reload_completed)
1611     temp = op0;
1612   else
1613     temp = gen_reg_rtx (mode);
1614
1615   if (GET_CODE (op1) == CONST_INT)
1616     {
1617       /* Emit them as real moves instead of a HIGH/LO_SUM,
1618          this way CSE can see everything and reuse intermediate
1619          values if it wants.  */
1620       if (TARGET_ARCH64
1621           && HOST_BITS_PER_WIDE_INT != 64
1622           && (INTVAL (op1) & 0x80000000) != 0)
1623         emit_insn (gen_rtx_SET
1624                    (VOIDmode, temp,
1625                     immed_double_const (INTVAL (op1) & ~(HOST_WIDE_INT)0x3ff,
1626                                         0, DImode)));
1627       else
1628         emit_insn (gen_rtx_SET (VOIDmode, temp,
1629                                 GEN_INT (INTVAL (op1)
1630                                          & ~(HOST_WIDE_INT)0x3ff)));
1631
1632       emit_insn (gen_rtx_SET (VOIDmode,
1633                               op0,
1634                               gen_rtx_IOR (mode, temp,
1635                                            GEN_INT (INTVAL (op1) & 0x3ff))));
1636     }
1637   else
1638     {
1639       /* A symbol, emit in the traditional way.  */
1640       emit_insn (gen_rtx_SET (VOIDmode, temp,
1641                               gen_rtx_HIGH (mode, op1)));
1642       emit_insn (gen_rtx_SET (VOIDmode,
1643                               op0, gen_rtx_LO_SUM (mode, temp, op1)));
1644
1645     }
1646 }
1647
1648 \f
1649 /* Load OP1, a symbolic 64-bit constant, into OP0, a DImode register.
1650    If TEMP is nonzero, we are forbidden to use any other scratch
1651    registers.  Otherwise, we are allowed to generate them as needed.
1652
1653    Note that TEMP may have TImode if the code model is TARGET_CM_MEDANY
1654    or TARGET_CM_EMBMEDANY (see the reload_indi and reload_outdi patterns).  */
1655 void
1656 sparc_emit_set_symbolic_const64 (rtx op0, rtx op1, rtx temp)
1657 {
1658   rtx temp1, temp2, temp3, temp4, temp5;
1659   rtx ti_temp = 0;
1660
1661   if (temp && GET_MODE (temp) == TImode)
1662     {
1663       ti_temp = temp;
1664       temp = gen_rtx_REG (DImode, REGNO (temp));
1665     }
1666
1667   /* SPARC-V9 code-model support.  */
1668   switch (sparc_cmodel)
1669     {
1670     case CM_MEDLOW:
1671       /* The range spanned by all instructions in the object is less
1672          than 2^31 bytes (2GB) and the distance from any instruction
1673          to the location of the label _GLOBAL_OFFSET_TABLE_ is less
1674          than 2^31 bytes (2GB).
1675
1676          The executable must be in the low 4TB of the virtual address
1677          space.
1678
1679          sethi  %hi(symbol), %temp1
1680          or     %temp1, %lo(symbol), %reg  */
1681       if (temp)
1682         temp1 = temp;  /* op0 is allowed.  */
1683       else
1684         temp1 = gen_reg_rtx (DImode);
1685
1686       emit_insn (gen_rtx_SET (VOIDmode, temp1, gen_rtx_HIGH (DImode, op1)));
1687       emit_insn (gen_rtx_SET (VOIDmode, op0, gen_rtx_LO_SUM (DImode, temp1, op1)));
1688       break;
1689
1690     case CM_MEDMID:
1691       /* The range spanned by all instructions in the object is less
1692          than 2^31 bytes (2GB) and the distance from any instruction
1693          to the location of the label _GLOBAL_OFFSET_TABLE_ is less
1694          than 2^31 bytes (2GB).
1695
1696          The executable must be in the low 16TB of the virtual address
1697          space.
1698
1699          sethi  %h44(symbol), %temp1
1700          or     %temp1, %m44(symbol), %temp2
1701          sllx   %temp2, 12, %temp3
1702          or     %temp3, %l44(symbol), %reg  */
1703       if (temp)
1704         {
1705           temp1 = op0;
1706           temp2 = op0;
1707           temp3 = temp;  /* op0 is allowed.  */
1708         }
1709       else
1710         {
1711           temp1 = gen_reg_rtx (DImode);
1712           temp2 = gen_reg_rtx (DImode);
1713           temp3 = gen_reg_rtx (DImode);
1714         }
1715
1716       emit_insn (gen_seth44 (temp1, op1));
1717       emit_insn (gen_setm44 (temp2, temp1, op1));
1718       emit_insn (gen_rtx_SET (VOIDmode, temp3,
1719                               gen_rtx_ASHIFT (DImode, temp2, GEN_INT (12))));
1720       emit_insn (gen_setl44 (op0, temp3, op1));
1721       break;
1722
1723     case CM_MEDANY:
1724       /* The range spanned by all instructions in the object is less
1725          than 2^31 bytes (2GB) and the distance from any instruction
1726          to the location of the label _GLOBAL_OFFSET_TABLE_ is less
1727          than 2^31 bytes (2GB).
1728
1729          The executable can be placed anywhere in the virtual address
1730          space.
1731
1732          sethi  %hh(symbol), %temp1
1733          sethi  %lm(symbol), %temp2
1734          or     %temp1, %hm(symbol), %temp3
1735          sllx   %temp3, 32, %temp4
1736          or     %temp4, %temp2, %temp5
1737          or     %temp5, %lo(symbol), %reg  */
1738       if (temp)
1739         {
1740           /* It is possible that one of the registers we got for operands[2]
1741              might coincide with that of operands[0] (which is why we made
1742              it TImode).  Pick the other one to use as our scratch.  */
1743           if (rtx_equal_p (temp, op0))
1744             {
1745               if (ti_temp)
1746                 temp = gen_rtx_REG (DImode, REGNO (temp) + 1);
1747               else
1748                 abort();
1749             }
1750           temp1 = op0;
1751           temp2 = temp;  /* op0 is _not_ allowed, see above.  */
1752           temp3 = op0;
1753           temp4 = op0;
1754           temp5 = op0;
1755         }
1756       else
1757         {
1758           temp1 = gen_reg_rtx (DImode);
1759           temp2 = gen_reg_rtx (DImode);
1760           temp3 = gen_reg_rtx (DImode);
1761           temp4 = gen_reg_rtx (DImode);
1762           temp5 = gen_reg_rtx (DImode);
1763         }
1764
1765       emit_insn (gen_sethh (temp1, op1));
1766       emit_insn (gen_setlm (temp2, op1));
1767       emit_insn (gen_sethm (temp3, temp1, op1));
1768       emit_insn (gen_rtx_SET (VOIDmode, temp4,
1769                               gen_rtx_ASHIFT (DImode, temp3, GEN_INT (32))));
1770       emit_insn (gen_rtx_SET (VOIDmode, temp5,
1771                               gen_rtx_PLUS (DImode, temp4, temp2)));
1772       emit_insn (gen_setlo (op0, temp5, op1));
1773       break;
1774
1775     case CM_EMBMEDANY:
1776       /* Old old old backwards compatibility kruft here.
1777          Essentially it is MEDLOW with a fixed 64-bit
1778          virtual base added to all data segment addresses.
1779          Text-segment stuff is computed like MEDANY, we can't
1780          reuse the code above because the relocation knobs
1781          look different.
1782
1783          Data segment:  sethi   %hi(symbol), %temp1
1784                         add     %temp1, EMBMEDANY_BASE_REG, %temp2
1785                         or      %temp2, %lo(symbol), %reg  */
1786       if (data_segment_operand (op1, GET_MODE (op1)))
1787         {
1788           if (temp)
1789             {
1790               temp1 = temp;  /* op0 is allowed.  */
1791               temp2 = op0;
1792             }
1793           else
1794             {
1795               temp1 = gen_reg_rtx (DImode);
1796               temp2 = gen_reg_rtx (DImode);
1797             }
1798
1799           emit_insn (gen_embmedany_sethi (temp1, op1));
1800           emit_insn (gen_embmedany_brsum (temp2, temp1));
1801           emit_insn (gen_embmedany_losum (op0, temp2, op1));
1802         }
1803
1804       /* Text segment:  sethi   %uhi(symbol), %temp1
1805                         sethi   %hi(symbol), %temp2
1806                         or      %temp1, %ulo(symbol), %temp3
1807                         sllx    %temp3, 32, %temp4
1808                         or      %temp4, %temp2, %temp5
1809                         or      %temp5, %lo(symbol), %reg  */
1810       else
1811         {
1812           if (temp)
1813             {
1814               /* It is possible that one of the registers we got for operands[2]
1815                  might coincide with that of operands[0] (which is why we made
1816                  it TImode).  Pick the other one to use as our scratch.  */
1817               if (rtx_equal_p (temp, op0))
1818                 {
1819                   if (ti_temp)
1820                     temp = gen_rtx_REG (DImode, REGNO (temp) + 1);
1821                   else
1822                     abort();
1823                 }
1824               temp1 = op0;
1825               temp2 = temp;  /* op0 is _not_ allowed, see above.  */
1826               temp3 = op0;
1827               temp4 = op0;
1828               temp5 = op0;
1829             }
1830           else
1831             {
1832               temp1 = gen_reg_rtx (DImode);
1833               temp2 = gen_reg_rtx (DImode);
1834               temp3 = gen_reg_rtx (DImode);
1835               temp4 = gen_reg_rtx (DImode);
1836               temp5 = gen_reg_rtx (DImode);
1837             }
1838
1839           emit_insn (gen_embmedany_textuhi (temp1, op1));
1840           emit_insn (gen_embmedany_texthi  (temp2, op1));
1841           emit_insn (gen_embmedany_textulo (temp3, temp1, op1));
1842           emit_insn (gen_rtx_SET (VOIDmode, temp4,
1843                                   gen_rtx_ASHIFT (DImode, temp3, GEN_INT (32))));
1844           emit_insn (gen_rtx_SET (VOIDmode, temp5,
1845                                   gen_rtx_PLUS (DImode, temp4, temp2)));
1846           emit_insn (gen_embmedany_textlo  (op0, temp5, op1));
1847         }
1848       break;
1849
1850     default:
1851       abort();
1852     }
1853 }
1854
1855 /* These avoid problems when cross compiling.  If we do not
1856    go through all this hair then the optimizer will see
1857    invalid REG_EQUAL notes or in some cases none at all.  */
1858 static void sparc_emit_set_safe_HIGH64 (rtx, HOST_WIDE_INT);
1859 static rtx gen_safe_SET64 (rtx, HOST_WIDE_INT);
1860 static rtx gen_safe_OR64 (rtx, HOST_WIDE_INT);
1861 static rtx gen_safe_XOR64 (rtx, HOST_WIDE_INT);
1862
1863 #if HOST_BITS_PER_WIDE_INT == 64
1864 #define GEN_HIGHINT64(__x)              GEN_INT ((__x) & ~(HOST_WIDE_INT)0x3ff)
1865 #define GEN_INT64(__x)                  GEN_INT (__x)
1866 #else
1867 #define GEN_HIGHINT64(__x) \
1868         immed_double_const ((__x) & ~(HOST_WIDE_INT)0x3ff, 0, DImode)
1869 #define GEN_INT64(__x) \
1870         immed_double_const ((__x) & 0xffffffff, \
1871                             ((__x) & 0x80000000 ? -1 : 0), DImode)
1872 #endif
1873
1874 /* The optimizer is not to assume anything about exactly
1875    which bits are set for a HIGH, they are unspecified.
1876    Unfortunately this leads to many missed optimizations
1877    during CSE.  We mask out the non-HIGH bits, and matches
1878    a plain movdi, to alleviate this problem.  */
1879 static void
1880 sparc_emit_set_safe_HIGH64 (rtx dest, HOST_WIDE_INT val)
1881 {
1882   emit_insn (gen_rtx_SET (VOIDmode, dest, GEN_HIGHINT64 (val)));
1883 }
1884
1885 static rtx
1886 gen_safe_SET64 (rtx dest, HOST_WIDE_INT val)
1887 {
1888   return gen_rtx_SET (VOIDmode, dest, GEN_INT64 (val));
1889 }
1890
1891 static rtx
1892 gen_safe_OR64 (rtx src, HOST_WIDE_INT val)
1893 {
1894   return gen_rtx_IOR (DImode, src, GEN_INT64 (val));
1895 }
1896
1897 static rtx
1898 gen_safe_XOR64 (rtx src, HOST_WIDE_INT val)
1899 {
1900   return gen_rtx_XOR (DImode, src, GEN_INT64 (val));
1901 }
1902
1903 /* Worker routines for 64-bit constant formation on arch64.
1904    One of the key things to be doing in these emissions is
1905    to create as many temp REGs as possible.  This makes it
1906    possible for half-built constants to be used later when
1907    such values are similar to something required later on.
1908    Without doing this, the optimizer cannot see such
1909    opportunities.  */
1910
1911 static void sparc_emit_set_const64_quick1 (rtx, rtx,
1912                                            unsigned HOST_WIDE_INT, int);
1913
1914 static void
1915 sparc_emit_set_const64_quick1 (rtx op0, rtx temp,
1916                                unsigned HOST_WIDE_INT low_bits, int is_neg)
1917 {
1918   unsigned HOST_WIDE_INT high_bits;
1919
1920   if (is_neg)
1921     high_bits = (~low_bits) & 0xffffffff;
1922   else
1923     high_bits = low_bits;
1924
1925   sparc_emit_set_safe_HIGH64 (temp, high_bits);
1926   if (!is_neg)
1927     {
1928       emit_insn (gen_rtx_SET (VOIDmode, op0,
1929                               gen_safe_OR64 (temp, (high_bits & 0x3ff))));
1930     }
1931   else
1932     {
1933       /* If we are XOR'ing with -1, then we should emit a one's complement
1934          instead.  This way the combiner will notice logical operations
1935          such as ANDN later on and substitute.  */
1936       if ((low_bits & 0x3ff) == 0x3ff)
1937         {
1938           emit_insn (gen_rtx_SET (VOIDmode, op0,
1939                                   gen_rtx_NOT (DImode, temp)));
1940         }
1941       else
1942         {
1943           emit_insn (gen_rtx_SET (VOIDmode, op0,
1944                                   gen_safe_XOR64 (temp,
1945                                                   (-(HOST_WIDE_INT)0x400
1946                                                    | (low_bits & 0x3ff)))));
1947         }
1948     }
1949 }
1950
1951 static void sparc_emit_set_const64_quick2 (rtx, rtx, unsigned HOST_WIDE_INT,
1952                                            unsigned HOST_WIDE_INT, int);
1953
1954 static void
1955 sparc_emit_set_const64_quick2 (rtx op0, rtx temp,
1956                                unsigned HOST_WIDE_INT high_bits,
1957                                unsigned HOST_WIDE_INT low_immediate,
1958                                int shift_count)
1959 {
1960   rtx temp2 = op0;
1961
1962   if ((high_bits & 0xfffffc00) != 0)
1963     {
1964       sparc_emit_set_safe_HIGH64 (temp, high_bits);
1965       if ((high_bits & ~0xfffffc00) != 0)
1966         emit_insn (gen_rtx_SET (VOIDmode, op0,
1967                                 gen_safe_OR64 (temp, (high_bits & 0x3ff))));
1968       else
1969         temp2 = temp;
1970     }
1971   else
1972     {
1973       emit_insn (gen_safe_SET64 (temp, high_bits));
1974       temp2 = temp;
1975     }
1976
1977   /* Now shift it up into place.  */
1978   emit_insn (gen_rtx_SET (VOIDmode, op0,
1979                           gen_rtx_ASHIFT (DImode, temp2,
1980                                           GEN_INT (shift_count))));
1981
1982   /* If there is a low immediate part piece, finish up by
1983      putting that in as well.  */
1984   if (low_immediate != 0)
1985     emit_insn (gen_rtx_SET (VOIDmode, op0,
1986                             gen_safe_OR64 (op0, low_immediate)));
1987 }
1988
1989 static void sparc_emit_set_const64_longway (rtx, rtx, unsigned HOST_WIDE_INT,
1990                                             unsigned HOST_WIDE_INT);
1991
1992 /* Full 64-bit constant decomposition.  Even though this is the
1993    'worst' case, we still optimize a few things away.  */
1994 static void
1995 sparc_emit_set_const64_longway (rtx op0, rtx temp,
1996                                 unsigned HOST_WIDE_INT high_bits,
1997                                 unsigned HOST_WIDE_INT low_bits)
1998 {
1999   rtx sub_temp;
2000
2001   if (reload_in_progress || reload_completed)
2002     sub_temp = op0;
2003   else
2004     sub_temp = gen_reg_rtx (DImode);
2005
2006   if ((high_bits & 0xfffffc00) != 0)
2007     {
2008       sparc_emit_set_safe_HIGH64 (temp, high_bits);
2009       if ((high_bits & ~0xfffffc00) != 0)
2010         emit_insn (gen_rtx_SET (VOIDmode,
2011                                 sub_temp,
2012                                 gen_safe_OR64 (temp, (high_bits & 0x3ff))));
2013       else
2014         sub_temp = temp;
2015     }
2016   else
2017     {
2018       emit_insn (gen_safe_SET64 (temp, high_bits));
2019       sub_temp = temp;
2020     }
2021
2022   if (!reload_in_progress && !reload_completed)
2023     {
2024       rtx temp2 = gen_reg_rtx (DImode);
2025       rtx temp3 = gen_reg_rtx (DImode);
2026       rtx temp4 = gen_reg_rtx (DImode);
2027
2028       emit_insn (gen_rtx_SET (VOIDmode, temp4,
2029                               gen_rtx_ASHIFT (DImode, sub_temp,
2030                                               GEN_INT (32))));
2031
2032       sparc_emit_set_safe_HIGH64 (temp2, low_bits);
2033       if ((low_bits & ~0xfffffc00) != 0)
2034         {
2035           emit_insn (gen_rtx_SET (VOIDmode, temp3,
2036                                   gen_safe_OR64 (temp2, (low_bits & 0x3ff))));
2037           emit_insn (gen_rtx_SET (VOIDmode, op0,
2038                                   gen_rtx_PLUS (DImode, temp4, temp3)));
2039         }
2040       else
2041         {
2042           emit_insn (gen_rtx_SET (VOIDmode, op0,
2043                                   gen_rtx_PLUS (DImode, temp4, temp2)));
2044         }
2045     }
2046   else
2047     {
2048       rtx low1 = GEN_INT ((low_bits >> (32 - 12))          & 0xfff);
2049       rtx low2 = GEN_INT ((low_bits >> (32 - 12 - 12))     & 0xfff);
2050       rtx low3 = GEN_INT ((low_bits >> (32 - 12 - 12 - 8)) & 0x0ff);
2051       int to_shift = 12;
2052
2053       /* We are in the middle of reload, so this is really
2054          painful.  However we do still make an attempt to
2055          avoid emitting truly stupid code.  */
2056       if (low1 != const0_rtx)
2057         {
2058           emit_insn (gen_rtx_SET (VOIDmode, op0,
2059                                   gen_rtx_ASHIFT (DImode, sub_temp,
2060                                                   GEN_INT (to_shift))));
2061           emit_insn (gen_rtx_SET (VOIDmode, op0,
2062                                   gen_rtx_IOR (DImode, op0, low1)));
2063           sub_temp = op0;
2064           to_shift = 12;
2065         }
2066       else
2067         {
2068           to_shift += 12;
2069         }
2070       if (low2 != const0_rtx)
2071         {
2072           emit_insn (gen_rtx_SET (VOIDmode, op0,
2073                                   gen_rtx_ASHIFT (DImode, sub_temp,
2074                                                   GEN_INT (to_shift))));
2075           emit_insn (gen_rtx_SET (VOIDmode, op0,
2076                                   gen_rtx_IOR (DImode, op0, low2)));
2077           sub_temp = op0;
2078           to_shift = 8;
2079         }
2080       else
2081         {
2082           to_shift += 8;
2083         }
2084       emit_insn (gen_rtx_SET (VOIDmode, op0,
2085                               gen_rtx_ASHIFT (DImode, sub_temp,
2086                                               GEN_INT (to_shift))));
2087       if (low3 != const0_rtx)
2088         emit_insn (gen_rtx_SET (VOIDmode, op0,
2089                                 gen_rtx_IOR (DImode, op0, low3)));
2090       /* phew...  */
2091     }
2092 }
2093
2094 /* Analyze a 64-bit constant for certain properties.  */
2095 static void analyze_64bit_constant (unsigned HOST_WIDE_INT,
2096                                     unsigned HOST_WIDE_INT,
2097                                     int *, int *, int *);
2098
2099 static void
2100 analyze_64bit_constant (unsigned HOST_WIDE_INT high_bits,
2101                         unsigned HOST_WIDE_INT low_bits,
2102                         int *hbsp, int *lbsp, int *abbasp)
2103 {
2104   int lowest_bit_set, highest_bit_set, all_bits_between_are_set;
2105   int i;
2106
2107   lowest_bit_set = highest_bit_set = -1;
2108   i = 0;
2109   do
2110     {
2111       if ((lowest_bit_set == -1)
2112           && ((low_bits >> i) & 1))
2113         lowest_bit_set = i;
2114       if ((highest_bit_set == -1)
2115           && ((high_bits >> (32 - i - 1)) & 1))
2116         highest_bit_set = (64 - i - 1);
2117     }
2118   while (++i < 32
2119          && ((highest_bit_set == -1)
2120              || (lowest_bit_set == -1)));
2121   if (i == 32)
2122     {
2123       i = 0;
2124       do
2125         {
2126           if ((lowest_bit_set == -1)
2127               && ((high_bits >> i) & 1))
2128             lowest_bit_set = i + 32;
2129           if ((highest_bit_set == -1)
2130               && ((low_bits >> (32 - i - 1)) & 1))
2131             highest_bit_set = 32 - i - 1;
2132         }
2133       while (++i < 32
2134              && ((highest_bit_set == -1)
2135                  || (lowest_bit_set == -1)));
2136     }
2137   /* If there are no bits set this should have gone out
2138      as one instruction!  */
2139   if (lowest_bit_set == -1
2140       || highest_bit_set == -1)
2141     abort ();
2142   all_bits_between_are_set = 1;
2143   for (i = lowest_bit_set; i <= highest_bit_set; i++)
2144     {
2145       if (i < 32)
2146         {
2147           if ((low_bits & (1 << i)) != 0)
2148             continue;
2149         }
2150       else
2151         {
2152           if ((high_bits & (1 << (i - 32))) != 0)
2153             continue;
2154         }
2155       all_bits_between_are_set = 0;
2156       break;
2157     }
2158   *hbsp = highest_bit_set;
2159   *lbsp = lowest_bit_set;
2160   *abbasp = all_bits_between_are_set;
2161 }
2162
2163 static int const64_is_2insns (unsigned HOST_WIDE_INT, unsigned HOST_WIDE_INT);
2164
2165 static int
2166 const64_is_2insns (unsigned HOST_WIDE_INT high_bits,
2167                    unsigned HOST_WIDE_INT low_bits)
2168 {
2169   int highest_bit_set, lowest_bit_set, all_bits_between_are_set;
2170
2171   if (high_bits == 0
2172       || high_bits == 0xffffffff)
2173     return 1;
2174
2175   analyze_64bit_constant (high_bits, low_bits,
2176                           &highest_bit_set, &lowest_bit_set,
2177                           &all_bits_between_are_set);
2178
2179   if ((highest_bit_set == 63
2180        || lowest_bit_set == 0)
2181       && all_bits_between_are_set != 0)
2182     return 1;
2183
2184   if ((highest_bit_set - lowest_bit_set) < 21)
2185     return 1;
2186
2187   return 0;
2188 }
2189
2190 static unsigned HOST_WIDE_INT create_simple_focus_bits (unsigned HOST_WIDE_INT,
2191                                                         unsigned HOST_WIDE_INT,
2192                                                         int, int);
2193
2194 static unsigned HOST_WIDE_INT
2195 create_simple_focus_bits (unsigned HOST_WIDE_INT high_bits,
2196                           unsigned HOST_WIDE_INT low_bits,
2197                           int lowest_bit_set, int shift)
2198 {
2199   HOST_WIDE_INT hi, lo;
2200
2201   if (lowest_bit_set < 32)
2202     {
2203       lo = (low_bits >> lowest_bit_set) << shift;
2204       hi = ((high_bits << (32 - lowest_bit_set)) << shift);
2205     }
2206   else
2207     {
2208       lo = 0;
2209       hi = ((high_bits >> (lowest_bit_set - 32)) << shift);
2210     }
2211   if (hi & lo)
2212     abort ();
2213   return (hi | lo);
2214 }
2215
2216 /* Here we are sure to be arch64 and this is an integer constant
2217    being loaded into a register.  Emit the most efficient
2218    insn sequence possible.  Detection of all the 1-insn cases
2219    has been done already.  */
2220 void
2221 sparc_emit_set_const64 (rtx op0, rtx op1)
2222 {
2223   unsigned HOST_WIDE_INT high_bits, low_bits;
2224   int lowest_bit_set, highest_bit_set;
2225   int all_bits_between_are_set;
2226   rtx temp = 0;
2227
2228   /* Sanity check that we know what we are working with.  */
2229   if (! TARGET_ARCH64)
2230     abort ();
2231
2232   if (GET_CODE (op0) != SUBREG)
2233     {
2234       if (GET_CODE (op0) != REG
2235           || (REGNO (op0) >= SPARC_FIRST_FP_REG
2236               && REGNO (op0) <= SPARC_LAST_V9_FP_REG))
2237         abort ();
2238     }
2239
2240   if (reload_in_progress || reload_completed)
2241     temp = op0;
2242
2243   if (GET_CODE (op1) != CONST_DOUBLE
2244       && GET_CODE (op1) != CONST_INT)
2245     {
2246       sparc_emit_set_symbolic_const64 (op0, op1, temp);
2247       return;
2248     }
2249
2250   if (! temp)
2251     temp = gen_reg_rtx (DImode);
2252
2253   if (GET_CODE (op1) == CONST_DOUBLE)
2254     {
2255 #if HOST_BITS_PER_WIDE_INT == 64
2256       high_bits = (CONST_DOUBLE_LOW (op1) >> 32) & 0xffffffff;
2257       low_bits  = CONST_DOUBLE_LOW (op1) & 0xffffffff;
2258 #else
2259       high_bits = CONST_DOUBLE_HIGH (op1);
2260       low_bits = CONST_DOUBLE_LOW (op1);
2261 #endif
2262     }
2263   else
2264     {
2265 #if HOST_BITS_PER_WIDE_INT == 64
2266       high_bits = ((INTVAL (op1) >> 32) & 0xffffffff);
2267       low_bits = (INTVAL (op1) & 0xffffffff);
2268 #else
2269       high_bits = ((INTVAL (op1) < 0) ?
2270                    0xffffffff :
2271                    0x00000000);
2272       low_bits = INTVAL (op1);
2273 #endif
2274     }
2275
2276   /* low_bits   bits 0  --> 31
2277      high_bits  bits 32 --> 63  */
2278
2279   analyze_64bit_constant (high_bits, low_bits,
2280                           &highest_bit_set, &lowest_bit_set,
2281                           &all_bits_between_are_set);
2282
2283   /* First try for a 2-insn sequence.  */
2284
2285   /* These situations are preferred because the optimizer can
2286    * do more things with them:
2287    * 1) mov     -1, %reg
2288    *    sllx    %reg, shift, %reg
2289    * 2) mov     -1, %reg
2290    *    srlx    %reg, shift, %reg
2291    * 3) mov     some_small_const, %reg
2292    *    sllx    %reg, shift, %reg
2293    */
2294   if (((highest_bit_set == 63
2295         || lowest_bit_set == 0)
2296        && all_bits_between_are_set != 0)
2297       || ((highest_bit_set - lowest_bit_set) < 12))
2298     {
2299       HOST_WIDE_INT the_const = -1;
2300       int shift = lowest_bit_set;
2301
2302       if ((highest_bit_set != 63
2303            && lowest_bit_set != 0)
2304           || all_bits_between_are_set == 0)
2305         {
2306           the_const =
2307             create_simple_focus_bits (high_bits, low_bits,
2308                                       lowest_bit_set, 0);
2309         }
2310       else if (lowest_bit_set == 0)
2311         shift = -(63 - highest_bit_set);
2312
2313       if (! SPARC_SIMM13_P (the_const))
2314         abort ();
2315
2316       emit_insn (gen_safe_SET64 (temp, the_const));
2317       if (shift > 0)
2318         emit_insn (gen_rtx_SET (VOIDmode,
2319                                 op0,
2320                                 gen_rtx_ASHIFT (DImode,
2321                                                 temp,
2322                                                 GEN_INT (shift))));
2323       else if (shift < 0)
2324         emit_insn (gen_rtx_SET (VOIDmode,
2325                                 op0,
2326                                 gen_rtx_LSHIFTRT (DImode,
2327                                                   temp,
2328                                                   GEN_INT (-shift))));
2329       else
2330         abort ();
2331       return;
2332     }
2333
2334   /* Now a range of 22 or less bits set somewhere.
2335    * 1) sethi   %hi(focus_bits), %reg
2336    *    sllx    %reg, shift, %reg
2337    * 2) sethi   %hi(focus_bits), %reg
2338    *    srlx    %reg, shift, %reg
2339    */
2340   if ((highest_bit_set - lowest_bit_set) < 21)
2341     {
2342       unsigned HOST_WIDE_INT focus_bits =
2343         create_simple_focus_bits (high_bits, low_bits,
2344                                   lowest_bit_set, 10);
2345
2346       if (! SPARC_SETHI_P (focus_bits))
2347          abort ();
2348
2349       sparc_emit_set_safe_HIGH64 (temp, focus_bits);
2350
2351       /* If lowest_bit_set == 10 then a sethi alone could have done it.  */
2352       if (lowest_bit_set < 10)
2353         emit_insn (gen_rtx_SET (VOIDmode,
2354                                 op0,
2355                                 gen_rtx_LSHIFTRT (DImode, temp,
2356                                                   GEN_INT (10 - lowest_bit_set))));
2357       else if (lowest_bit_set > 10)
2358         emit_insn (gen_rtx_SET (VOIDmode,
2359                                 op0,
2360                                 gen_rtx_ASHIFT (DImode, temp,
2361                                                 GEN_INT (lowest_bit_set - 10))));
2362       else
2363         abort ();
2364       return;
2365     }
2366
2367   /* 1) sethi   %hi(low_bits), %reg
2368    *    or      %reg, %lo(low_bits), %reg
2369    * 2) sethi   %hi(~low_bits), %reg
2370    *    xor     %reg, %lo(-0x400 | (low_bits & 0x3ff)), %reg
2371    */
2372   if (high_bits == 0
2373       || high_bits == 0xffffffff)
2374     {
2375       sparc_emit_set_const64_quick1 (op0, temp, low_bits,
2376                                      (high_bits == 0xffffffff));
2377       return;
2378     }
2379
2380   /* Now, try 3-insn sequences.  */
2381
2382   /* 1) sethi   %hi(high_bits), %reg
2383    *    or      %reg, %lo(high_bits), %reg
2384    *    sllx    %reg, 32, %reg
2385    */
2386   if (low_bits == 0)
2387     {
2388       sparc_emit_set_const64_quick2 (op0, temp, high_bits, 0, 32);
2389       return;
2390     }
2391
2392   /* We may be able to do something quick
2393      when the constant is negated, so try that.  */
2394   if (const64_is_2insns ((~high_bits) & 0xffffffff,
2395                          (~low_bits) & 0xfffffc00))
2396     {
2397       /* NOTE: The trailing bits get XOR'd so we need the
2398          non-negated bits, not the negated ones.  */
2399       unsigned HOST_WIDE_INT trailing_bits = low_bits & 0x3ff;
2400
2401       if ((((~high_bits) & 0xffffffff) == 0
2402            && ((~low_bits) & 0x80000000) == 0)
2403           || (((~high_bits) & 0xffffffff) == 0xffffffff
2404               && ((~low_bits) & 0x80000000) != 0))
2405         {
2406           int fast_int = (~low_bits & 0xffffffff);
2407
2408           if ((SPARC_SETHI_P (fast_int)
2409                && (~high_bits & 0xffffffff) == 0)
2410               || SPARC_SIMM13_P (fast_int))
2411             emit_insn (gen_safe_SET64 (temp, fast_int));
2412           else
2413             sparc_emit_set_const64 (temp, GEN_INT64 (fast_int));
2414         }
2415       else
2416         {
2417           rtx negated_const;
2418 #if HOST_BITS_PER_WIDE_INT == 64
2419           negated_const = GEN_INT (((~low_bits) & 0xfffffc00) |
2420                                    (((HOST_WIDE_INT)((~high_bits) & 0xffffffff))<<32));
2421 #else
2422           negated_const = immed_double_const ((~low_bits) & 0xfffffc00,
2423                                               (~high_bits) & 0xffffffff,
2424                                               DImode);
2425 #endif
2426           sparc_emit_set_const64 (temp, negated_const);
2427         }
2428
2429       /* If we are XOR'ing with -1, then we should emit a one's complement
2430          instead.  This way the combiner will notice logical operations
2431          such as ANDN later on and substitute.  */
2432       if (trailing_bits == 0x3ff)
2433         {
2434           emit_insn (gen_rtx_SET (VOIDmode, op0,
2435                                   gen_rtx_NOT (DImode, temp)));
2436         }
2437       else
2438         {
2439           emit_insn (gen_rtx_SET (VOIDmode,
2440                                   op0,
2441                                   gen_safe_XOR64 (temp,
2442                                                   (-0x400 | trailing_bits))));
2443         }
2444       return;
2445     }
2446
2447   /* 1) sethi   %hi(xxx), %reg
2448    *    or      %reg, %lo(xxx), %reg
2449    *    sllx    %reg, yyy, %reg
2450    *
2451    * ??? This is just a generalized version of the low_bits==0
2452    * thing above, FIXME...
2453    */
2454   if ((highest_bit_set - lowest_bit_set) < 32)
2455     {
2456       unsigned HOST_WIDE_INT focus_bits =
2457         create_simple_focus_bits (high_bits, low_bits,
2458                                   lowest_bit_set, 0);
2459
2460       /* We can't get here in this state.  */
2461       if (highest_bit_set < 32
2462           || lowest_bit_set >= 32)
2463         abort ();
2464
2465       /* So what we know is that the set bits straddle the
2466          middle of the 64-bit word.  */
2467       sparc_emit_set_const64_quick2 (op0, temp,
2468                                      focus_bits, 0,
2469                                      lowest_bit_set);
2470       return;
2471     }
2472
2473   /* 1) sethi   %hi(high_bits), %reg
2474    *    or      %reg, %lo(high_bits), %reg
2475    *    sllx    %reg, 32, %reg
2476    *    or      %reg, low_bits, %reg
2477    */
2478   if (SPARC_SIMM13_P(low_bits)
2479       && ((int)low_bits > 0))
2480     {
2481       sparc_emit_set_const64_quick2 (op0, temp, high_bits, low_bits, 32);
2482       return;
2483     }
2484
2485   /* The easiest way when all else fails, is full decomposition.  */
2486 #if 0
2487   printf ("sparc_emit_set_const64: Hard constant [%08lx%08lx] neg[%08lx%08lx]\n",
2488           high_bits, low_bits, ~high_bits, ~low_bits);
2489 #endif
2490   sparc_emit_set_const64_longway (op0, temp, high_bits, low_bits);
2491 }
2492
2493 /* Given a comparison code (EQ, NE, etc.) and the first operand of a COMPARE,
2494    return the mode to be used for the comparison.  For floating-point,
2495    CCFP[E]mode is used.  CC_NOOVmode should be used when the first operand
2496    is a PLUS, MINUS, NEG, or ASHIFT.  CCmode should be used when no special
2497    processing is needed.  */
2498
2499 enum machine_mode
2500 select_cc_mode (enum rtx_code op, rtx x, rtx y ATTRIBUTE_UNUSED)
2501 {
2502   if (GET_MODE_CLASS (GET_MODE (x)) == MODE_FLOAT)
2503     {
2504       switch (op)
2505         {
2506         case EQ:
2507         case NE:
2508         case UNORDERED:
2509         case ORDERED:
2510         case UNLT:
2511         case UNLE:
2512         case UNGT:
2513         case UNGE:
2514         case UNEQ:
2515         case LTGT:
2516           return CCFPmode;
2517
2518         case LT:
2519         case LE:
2520         case GT:
2521         case GE:
2522           return CCFPEmode;
2523
2524         default:
2525           abort ();
2526         }
2527     }
2528   else if (GET_CODE (x) == PLUS || GET_CODE (x) == MINUS
2529            || GET_CODE (x) == NEG || GET_CODE (x) == ASHIFT)
2530     {
2531       if (TARGET_ARCH64 && GET_MODE (x) == DImode)
2532         return CCX_NOOVmode;
2533       else
2534         return CC_NOOVmode;
2535     }
2536   else
2537     {
2538       if (TARGET_ARCH64 && GET_MODE (x) == DImode)
2539         return CCXmode;
2540       else
2541         return CCmode;
2542     }
2543 }
2544
2545 /* X and Y are two things to compare using CODE.  Emit the compare insn and
2546    return the rtx for the cc reg in the proper mode.  */
2547
2548 rtx
2549 gen_compare_reg (enum rtx_code code, rtx x, rtx y)
2550 {
2551   enum machine_mode mode = SELECT_CC_MODE (code, x, y);
2552   rtx cc_reg;
2553
2554   /* ??? We don't have movcc patterns so we cannot generate pseudo regs for the
2555      fcc regs (cse can't tell they're really call clobbered regs and will
2556      remove a duplicate comparison even if there is an intervening function
2557      call - it will then try to reload the cc reg via an int reg which is why
2558      we need the movcc patterns).  It is possible to provide the movcc
2559      patterns by using the ldxfsr/stxfsr v9 insns.  I tried it: you need two
2560      registers (say %g1,%g5) and it takes about 6 insns.  A better fix would be
2561      to tell cse that CCFPE mode registers (even pseudos) are call
2562      clobbered.  */
2563
2564   /* ??? This is an experiment.  Rather than making changes to cse which may
2565      or may not be easy/clean, we do our own cse.  This is possible because
2566      we will generate hard registers.  Cse knows they're call clobbered (it
2567      doesn't know the same thing about pseudos). If we guess wrong, no big
2568      deal, but if we win, great!  */
2569
2570   if (TARGET_V9 && GET_MODE_CLASS (GET_MODE (x)) == MODE_FLOAT)
2571 #if 1 /* experiment */
2572     {
2573       int reg;
2574       /* We cycle through the registers to ensure they're all exercised.  */
2575       static int next_fcc_reg = 0;
2576       /* Previous x,y for each fcc reg.  */
2577       static rtx prev_args[4][2];
2578
2579       /* Scan prev_args for x,y.  */
2580       for (reg = 0; reg < 4; reg++)
2581         if (prev_args[reg][0] == x && prev_args[reg][1] == y)
2582           break;
2583       if (reg == 4)
2584         {
2585           reg = next_fcc_reg;
2586           prev_args[reg][0] = x;
2587           prev_args[reg][1] = y;
2588           next_fcc_reg = (next_fcc_reg + 1) & 3;
2589         }
2590       cc_reg = gen_rtx_REG (mode, reg + SPARC_FIRST_V9_FCC_REG);
2591     }
2592 #else
2593     cc_reg = gen_reg_rtx (mode);
2594 #endif /* ! experiment */
2595   else if (GET_MODE_CLASS (GET_MODE (x)) == MODE_FLOAT)
2596     cc_reg = gen_rtx_REG (mode, SPARC_FCC_REG);
2597   else
2598     cc_reg = gen_rtx_REG (mode, SPARC_ICC_REG);
2599
2600   emit_insn (gen_rtx_SET (VOIDmode, cc_reg,
2601                           gen_rtx_COMPARE (mode, x, y)));
2602
2603   return cc_reg;
2604 }
2605
2606 /* This function is used for v9 only.
2607    CODE is the code for an Scc's comparison.
2608    OPERANDS[0] is the target of the Scc insn.
2609    OPERANDS[1] is the value we compare against const0_rtx (which hasn't
2610    been generated yet).
2611
2612    This function is needed to turn
2613
2614            (set (reg:SI 110)
2615                (gt (reg:CCX 100 %icc)
2616                    (const_int 0)))
2617    into
2618            (set (reg:SI 110)
2619                (gt:DI (reg:CCX 100 %icc)
2620                    (const_int 0)))
2621
2622    IE: The instruction recognizer needs to see the mode of the comparison to
2623    find the right instruction. We could use "gt:DI" right in the
2624    define_expand, but leaving it out allows us to handle DI, SI, etc.
2625
2626    We refer to the global sparc compare operands sparc_compare_op0 and
2627    sparc_compare_op1.  */
2628
2629 int
2630 gen_v9_scc (enum rtx_code compare_code, register rtx *operands)
2631 {
2632   rtx temp, op0, op1;
2633
2634   if (! TARGET_ARCH64
2635       && (GET_MODE (sparc_compare_op0) == DImode
2636           || GET_MODE (operands[0]) == DImode))
2637     return 0;
2638
2639   op0 = sparc_compare_op0;
2640   op1 = sparc_compare_op1;
2641
2642   /* Try to use the movrCC insns.  */
2643   if (TARGET_ARCH64
2644       && GET_MODE_CLASS (GET_MODE (op0)) == MODE_INT
2645       && op1 == const0_rtx
2646       && v9_regcmp_p (compare_code))
2647     {
2648       /* Special case for op0 != 0.  This can be done with one instruction if
2649          operands[0] == sparc_compare_op0.  */
2650
2651       if (compare_code == NE
2652           && GET_MODE (operands[0]) == DImode
2653           && rtx_equal_p (op0, operands[0]))
2654         {
2655           emit_insn (gen_rtx_SET (VOIDmode, operands[0],
2656                               gen_rtx_IF_THEN_ELSE (DImode,
2657                                        gen_rtx_fmt_ee (compare_code, DImode,
2658                                                        op0, const0_rtx),
2659                                        const1_rtx,
2660                                        operands[0])));
2661           return 1;
2662         }
2663
2664       if (reg_overlap_mentioned_p (operands[0], op0))
2665         {
2666           /* Handle the case where operands[0] == sparc_compare_op0.
2667              We "early clobber" the result.  */
2668           op0 = gen_reg_rtx (GET_MODE (sparc_compare_op0));
2669           emit_move_insn (op0, sparc_compare_op0);
2670         }
2671
2672       emit_insn (gen_rtx_SET (VOIDmode, operands[0], const0_rtx));
2673       if (GET_MODE (op0) != DImode)
2674         {
2675           temp = gen_reg_rtx (DImode);
2676           convert_move (temp, op0, 0);
2677         }
2678       else
2679         temp = op0;
2680       emit_insn (gen_rtx_SET (VOIDmode, operands[0],
2681                           gen_rtx_IF_THEN_ELSE (GET_MODE (operands[0]),
2682                                    gen_rtx_fmt_ee (compare_code, DImode,
2683                                                    temp, const0_rtx),
2684                                    const1_rtx,
2685                                    operands[0])));
2686       return 1;
2687     }
2688   else
2689     {
2690       operands[1] = gen_compare_reg (compare_code, op0, op1);
2691
2692       switch (GET_MODE (operands[1]))
2693         {
2694           case CCmode :
2695           case CCXmode :
2696           case CCFPEmode :
2697           case CCFPmode :
2698             break;
2699           default :
2700             abort ();
2701         }
2702       emit_insn (gen_rtx_SET (VOIDmode, operands[0], const0_rtx));
2703       emit_insn (gen_rtx_SET (VOIDmode, operands[0],
2704                           gen_rtx_IF_THEN_ELSE (GET_MODE (operands[0]),
2705                                    gen_rtx_fmt_ee (compare_code,
2706                                                    GET_MODE (operands[1]),
2707                                                    operands[1], const0_rtx),
2708                                     const1_rtx, operands[0])));
2709       return 1;
2710     }
2711 }
2712
2713 /* Emit a conditional jump insn for the v9 architecture using comparison code
2714    CODE and jump target LABEL.
2715    This function exists to take advantage of the v9 brxx insns.  */
2716
2717 void
2718 emit_v9_brxx_insn (enum rtx_code code, rtx op0, rtx label)
2719 {
2720   emit_jump_insn (gen_rtx_SET (VOIDmode,
2721                            pc_rtx,
2722                            gen_rtx_IF_THEN_ELSE (VOIDmode,
2723                                     gen_rtx_fmt_ee (code, GET_MODE (op0),
2724                                                     op0, const0_rtx),
2725                                     gen_rtx_LABEL_REF (VOIDmode, label),
2726                                     pc_rtx)));
2727 }
2728
2729 /* Generate a DFmode part of a hard TFmode register.
2730    REG is the TFmode hard register, LOW is 1 for the
2731    low 64bit of the register and 0 otherwise.
2732  */
2733 rtx
2734 gen_df_reg (rtx reg, int low)
2735 {
2736   int regno = REGNO (reg);
2737
2738   if ((WORDS_BIG_ENDIAN == 0) ^ (low != 0))
2739     regno += (TARGET_ARCH64 && regno < 32) ? 1 : 2;
2740   return gen_rtx_REG (DFmode, regno);
2741 }
2742 \f
2743 /* Generate a call to FUNC with OPERANDS.  Operand 0 is the return value.
2744    Unlike normal calls, TFmode operands are passed by reference.  It is
2745    assumed that no more than 3 operands are required.  */
2746
2747 static void
2748 emit_soft_tfmode_libcall (const char *func_name, int nargs, rtx *operands)
2749 {
2750   rtx ret_slot = NULL, arg[3], func_sym;
2751   int i;
2752
2753   /* We only expect to be called for conversions, unary, and binary ops.  */
2754   if (nargs < 2 || nargs > 3)
2755     abort ();
2756
2757   for (i = 0; i < nargs; ++i)
2758     {
2759       rtx this_arg = operands[i];
2760       rtx this_slot;
2761
2762       /* TFmode arguments and return values are passed by reference.  */
2763       if (GET_MODE (this_arg) == TFmode)
2764         {
2765           int force_stack_temp;
2766
2767           force_stack_temp = 0;
2768           if (TARGET_BUGGY_QP_LIB && i == 0)
2769             force_stack_temp = 1;
2770
2771           if (GET_CODE (this_arg) == MEM
2772               && ! force_stack_temp)
2773             this_arg = XEXP (this_arg, 0);
2774           else if (CONSTANT_P (this_arg)
2775                    && ! force_stack_temp)
2776             {
2777               this_slot = force_const_mem (TFmode, this_arg);
2778               this_arg = XEXP (this_slot, 0);
2779             }
2780           else
2781             {
2782               this_slot = assign_stack_temp (TFmode, GET_MODE_SIZE (TFmode), 0);
2783
2784               /* Operand 0 is the return value.  We'll copy it out later.  */
2785               if (i > 0)
2786                 emit_move_insn (this_slot, this_arg);
2787               else
2788                 ret_slot = this_slot;
2789
2790               this_arg = XEXP (this_slot, 0);
2791             }
2792         }
2793
2794       arg[i] = this_arg;
2795     }
2796
2797   func_sym = gen_rtx_SYMBOL_REF (Pmode, func_name);
2798
2799   if (GET_MODE (operands[0]) == TFmode)
2800     {
2801       if (nargs == 2)
2802         emit_library_call (func_sym, LCT_NORMAL, VOIDmode, 2,
2803                            arg[0], GET_MODE (arg[0]),
2804                            arg[1], GET_MODE (arg[1]));
2805       else
2806         emit_library_call (func_sym, LCT_NORMAL, VOIDmode, 3,
2807                            arg[0], GET_MODE (arg[0]),
2808                            arg[1], GET_MODE (arg[1]),
2809                            arg[2], GET_MODE (arg[2]));
2810
2811       if (ret_slot)
2812         emit_move_insn (operands[0], ret_slot);
2813     }
2814   else
2815     {
2816       rtx ret;
2817
2818       if (nargs != 2)
2819         abort ();
2820
2821       ret = emit_library_call_value (func_sym, operands[0], LCT_NORMAL,
2822                                      GET_MODE (operands[0]), 1,
2823                                      arg[1], GET_MODE (arg[1]));
2824
2825       if (ret != operands[0])
2826         emit_move_insn (operands[0], ret);
2827     }
2828 }
2829
2830 /* Expand soft-float TFmode calls to sparc abi routines.  */
2831
2832 static void
2833 emit_soft_tfmode_binop (enum rtx_code code, rtx *operands)
2834 {
2835   const char *func;
2836
2837   switch (code)
2838     {
2839     case PLUS:
2840       func = "_Qp_add";
2841       break;
2842     case MINUS:
2843       func = "_Qp_sub";
2844       break;
2845     case MULT:
2846       func = "_Qp_mul";
2847       break;
2848     case DIV:
2849       func = "_Qp_div";
2850       break;
2851     default:
2852       abort ();
2853     }
2854
2855   emit_soft_tfmode_libcall (func, 3, operands);
2856 }
2857
2858 static void
2859 emit_soft_tfmode_unop (enum rtx_code code, rtx *operands)
2860 {
2861   const char *func;
2862
2863   switch (code)
2864     {
2865     case SQRT:
2866       func = "_Qp_sqrt";
2867       break;
2868     default:
2869       abort ();
2870     }
2871
2872   emit_soft_tfmode_libcall (func, 2, operands);
2873 }
2874
2875 static void
2876 emit_soft_tfmode_cvt (enum rtx_code code, rtx *operands)
2877 {
2878   const char *func;
2879
2880   switch (code)
2881     {
2882     case FLOAT_EXTEND:
2883       switch (GET_MODE (operands[1]))
2884         {
2885         case SFmode:
2886           func = "_Qp_stoq";
2887           break;
2888         case DFmode:
2889           func = "_Qp_dtoq";
2890           break;
2891         default:
2892           abort ();
2893         }
2894       break;
2895
2896     case FLOAT_TRUNCATE:
2897       switch (GET_MODE (operands[0]))
2898         {
2899         case SFmode:
2900           func = "_Qp_qtos";
2901           break;
2902         case DFmode:
2903           func = "_Qp_qtod";
2904           break;
2905         default:
2906           abort ();
2907         }
2908       break;
2909
2910     case FLOAT:
2911       switch (GET_MODE (operands[1]))
2912         {
2913         case SImode:
2914           func = "_Qp_itoq";
2915           break;
2916         case DImode:
2917           func = "_Qp_xtoq";
2918           break;
2919         default:
2920           abort ();
2921         }
2922       break;
2923
2924     case UNSIGNED_FLOAT:
2925       switch (GET_MODE (operands[1]))
2926         {
2927         case SImode:
2928           func = "_Qp_uitoq";
2929           break;
2930         case DImode:
2931           func = "_Qp_uxtoq";
2932           break;
2933         default:
2934           abort ();
2935         }
2936       break;
2937
2938     case FIX:
2939       switch (GET_MODE (operands[0]))
2940         {
2941         case SImode:
2942           func = "_Qp_qtoi";
2943           break;
2944         case DImode:
2945           func = "_Qp_qtox";
2946           break;
2947         default:
2948           abort ();
2949         }
2950       break;
2951
2952     case UNSIGNED_FIX:
2953       switch (GET_MODE (operands[0]))
2954         {
2955         case SImode:
2956           func = "_Qp_qtoui";
2957           break;
2958         case DImode:
2959           func = "_Qp_qtoux";
2960           break;
2961         default:
2962           abort ();
2963         }
2964       break;
2965
2966     default:
2967       abort ();
2968     }
2969
2970   emit_soft_tfmode_libcall (func, 2, operands);
2971 }
2972
2973 /* Expand a hard-float tfmode operation.  All arguments must be in
2974    registers.  */
2975
2976 static void
2977 emit_hard_tfmode_operation (enum rtx_code code, rtx *operands)
2978 {
2979   rtx op, dest;
2980
2981   if (GET_RTX_CLASS (code) == RTX_UNARY)
2982     {
2983       operands[1] = force_reg (GET_MODE (operands[1]), operands[1]);
2984       op = gen_rtx_fmt_e (code, GET_MODE (operands[0]), operands[1]);
2985     }
2986   else
2987     {
2988       operands[1] = force_reg (GET_MODE (operands[1]), operands[1]);
2989       operands[2] = force_reg (GET_MODE (operands[2]), operands[2]);
2990       op = gen_rtx_fmt_ee (code, GET_MODE (operands[0]),
2991                            operands[1], operands[2]);
2992     }
2993
2994   if (register_operand (operands[0], VOIDmode))
2995     dest = operands[0];
2996   else
2997     dest = gen_reg_rtx (GET_MODE (operands[0]));
2998
2999   emit_insn (gen_rtx_SET (VOIDmode, dest, op));
3000
3001   if (dest != operands[0])
3002     emit_move_insn (operands[0], dest);
3003 }
3004
3005 void
3006 emit_tfmode_binop (enum rtx_code code, rtx *operands)
3007 {
3008   if (TARGET_HARD_QUAD)
3009     emit_hard_tfmode_operation (code, operands);
3010   else
3011     emit_soft_tfmode_binop (code, operands);
3012 }
3013
3014 void
3015 emit_tfmode_unop (enum rtx_code code, rtx *operands)
3016 {
3017   if (TARGET_HARD_QUAD)
3018     emit_hard_tfmode_operation (code, operands);
3019   else
3020     emit_soft_tfmode_unop (code, operands);
3021 }
3022
3023 void
3024 emit_tfmode_cvt (enum rtx_code code, rtx *operands)
3025 {
3026   if (TARGET_HARD_QUAD)
3027     emit_hard_tfmode_operation (code, operands);
3028   else
3029     emit_soft_tfmode_cvt (code, operands);
3030 }
3031 \f
3032 /* Return nonzero if a branch/jump/call instruction will be emitting
3033    nop into its delay slot.  */
3034
3035 int
3036 empty_delay_slot (rtx insn)
3037 {
3038   rtx seq;
3039
3040   /* If no previous instruction (should not happen), return true.  */
3041   if (PREV_INSN (insn) == NULL)
3042     return 1;
3043
3044   seq = NEXT_INSN (PREV_INSN (insn));
3045   if (GET_CODE (PATTERN (seq)) == SEQUENCE)
3046     return 0;
3047
3048   return 1;
3049 }
3050
3051 /* Return nonzero if TRIAL can go into the call delay slot.  */
3052
3053 int
3054 tls_call_delay (rtx trial)
3055 {
3056   rtx pat, unspec;
3057
3058   /* Binutils allows
3059      call __tls_get_addr, %tgd_call (foo)
3060       add %l7, %o0, %o0, %tgd_add (foo)
3061      while Sun as/ld does not.  */
3062   if (TARGET_GNU_TLS || !TARGET_TLS)
3063     return 1;
3064
3065   pat = PATTERN (trial);
3066   if (GET_CODE (pat) != SET || GET_CODE (SET_DEST (pat)) != PLUS)
3067     return 1;
3068
3069   unspec = XEXP (SET_DEST (pat), 1);
3070   if (GET_CODE (unspec) != UNSPEC
3071       || (XINT (unspec, 1) != UNSPEC_TLSGD
3072           && XINT (unspec, 1) != UNSPEC_TLSLDM))
3073     return 1;
3074
3075   return 0;
3076 }
3077
3078 /* Return nonzero if TRIAL, an insn, can be combined with a 'restore'
3079    instruction.  RETURN_P is true if the v9 variant 'return' is to be
3080    considered in the test too.
3081
3082    TRIAL must be a SET whose destination is a REG appropriate for the
3083    'restore' instruction or, if RETURN_P is true, for the 'return'
3084    instruction.  */
3085
3086 static int
3087 eligible_for_restore_insn (rtx trial, bool return_p)
3088 {
3089   rtx pat = PATTERN (trial);
3090   rtx src = SET_SRC (pat);
3091
3092   /* The 'restore src,%g0,dest' pattern for word mode and below.  */
3093   if (GET_MODE_CLASS (GET_MODE (src)) != MODE_FLOAT
3094       && arith_operand (src, GET_MODE (src)))
3095     {
3096       if (TARGET_ARCH64)
3097         return GET_MODE_SIZE (GET_MODE (src)) <= GET_MODE_SIZE (DImode);
3098       else
3099         return GET_MODE_SIZE (GET_MODE (src)) <= GET_MODE_SIZE (SImode);
3100     }
3101
3102   /* The 'restore src,%g0,dest' pattern for double-word mode.  */
3103   else if (GET_MODE_CLASS (GET_MODE (src)) != MODE_FLOAT
3104            && arith_double_operand (src, GET_MODE (src)))
3105     return GET_MODE_SIZE (GET_MODE (src)) <= GET_MODE_SIZE (DImode);
3106
3107   /* The 'restore src,%g0,dest' pattern for float if no FPU.  */
3108   else if (! TARGET_FPU && register_operand (src, SFmode))
3109     return 1;
3110
3111   /* The 'restore src,%g0,dest' pattern for double if no FPU.  */
3112   else if (! TARGET_FPU && TARGET_ARCH64 && register_operand (src, DFmode))
3113     return 1;
3114
3115   /* If we have the 'return' instruction, anything that does not use
3116      local or output registers and can go into a delay slot wins.  */
3117   else if (return_p && TARGET_V9 && ! epilogue_renumber (&pat, 1)
3118            && (get_attr_in_uncond_branch_delay (trial)
3119                == IN_UNCOND_BRANCH_DELAY_TRUE))
3120     return 1;
3121
3122   /* The 'restore src1,src2,dest' pattern for SImode.  */
3123   else if (GET_CODE (src) == PLUS
3124            && register_operand (XEXP (src, 0), SImode)
3125            && arith_operand (XEXP (src, 1), SImode))
3126     return 1;
3127
3128   /* The 'restore src1,src2,dest' pattern for DImode.  */
3129   else if (GET_CODE (src) == PLUS
3130            && register_operand (XEXP (src, 0), DImode)
3131            && arith_double_operand (XEXP (src, 1), DImode))
3132     return 1;
3133
3134   /* The 'restore src1,%lo(src2),dest' pattern.  */
3135   else if (GET_CODE (src) == LO_SUM
3136            && ! TARGET_CM_MEDMID
3137            && ((register_operand (XEXP (src, 0), SImode)
3138                 && immediate_operand (XEXP (src, 1), SImode))
3139                || (TARGET_ARCH64
3140                    && register_operand (XEXP (src, 0), DImode)
3141                    && immediate_operand (XEXP (src, 1), DImode))))
3142     return 1;
3143
3144   /* The 'restore src,src,dest' pattern.  */
3145   else if (GET_CODE (src) == ASHIFT
3146            && (register_operand (XEXP (src, 0), SImode)
3147                || register_operand (XEXP (src, 0), DImode))
3148            && XEXP (src, 1) == const1_rtx)
3149     return 1;
3150
3151   return 0;
3152 }
3153
3154 /* Return nonzero if TRIAL can go into the function return's
3155    delay slot.  */
3156
3157 int
3158 eligible_for_return_delay (rtx trial)
3159 {
3160   rtx pat;
3161
3162   if (GET_CODE (trial) != INSN || GET_CODE (PATTERN (trial)) != SET)
3163     return 0;
3164
3165   if (get_attr_length (trial) != 1)
3166     return 0;
3167
3168   /* If there are any call-saved registers, we should scan TRIAL if it
3169      does not reference them.  For now just make it easy.  */
3170   if (num_gfregs)
3171     return 0;
3172
3173   /* If the function uses __builtin_eh_return, the eh_return machinery
3174      occupies the delay slot.  */
3175   if (current_function_calls_eh_return)
3176     return 0;
3177
3178   /* In the case of a true leaf function, anything can go into the slot.  */
3179   if (sparc_leaf_function_p)
3180     return get_attr_in_uncond_branch_delay (trial)
3181            == IN_UNCOND_BRANCH_DELAY_TRUE;
3182
3183   pat = PATTERN (trial);
3184
3185   /* Otherwise, only operations which can be done in tandem with
3186      a `restore' or `return' insn can go into the delay slot.  */
3187   if (GET_CODE (SET_DEST (pat)) != REG
3188       || (REGNO (SET_DEST (pat)) >= 8 && REGNO (SET_DEST (pat)) < 24))
3189     return 0;
3190
3191   /* If this instruction sets up floating point register and we have a return
3192      instruction, it can probably go in.  But restore will not work
3193      with FP_REGS.  */
3194   if (REGNO (SET_DEST (pat)) >= 32)
3195     return (TARGET_V9
3196             && ! epilogue_renumber (&pat, 1)
3197             && (get_attr_in_uncond_branch_delay (trial)
3198                 == IN_UNCOND_BRANCH_DELAY_TRUE));
3199
3200   return eligible_for_restore_insn (trial, true);
3201 }
3202
3203 /* Return nonzero if TRIAL can go into the sibling call's
3204    delay slot.  */
3205
3206 int
3207 eligible_for_sibcall_delay (rtx trial)
3208 {
3209   rtx pat;
3210
3211   if (GET_CODE (trial) != INSN || GET_CODE (PATTERN (trial)) != SET)
3212     return 0;
3213
3214   if (get_attr_length (trial) != 1)
3215     return 0;
3216
3217   pat = PATTERN (trial);
3218
3219   if (sparc_leaf_function_p)
3220     {
3221       /* If the tail call is done using the call instruction,
3222          we have to restore %o7 in the delay slot.  */
3223       if (LEAF_SIBCALL_SLOT_RESERVED_P)
3224         return 0;
3225
3226       /* %g1 is used to build the function address */
3227       if (reg_mentioned_p (gen_rtx_REG (Pmode, 1), pat))
3228         return 0;
3229
3230       return 1;
3231     }
3232
3233   /* Otherwise, only operations which can be done in tandem with
3234      a `restore' insn can go into the delay slot.  */
3235   if (GET_CODE (SET_DEST (pat)) != REG
3236       || (REGNO (SET_DEST (pat)) >= 8 && REGNO (SET_DEST (pat)) < 24)
3237       || REGNO (SET_DEST (pat)) >= 32)
3238     return 0;
3239
3240   /* If it mentions %o7, it can't go in, because sibcall will clobber it
3241      in most cases.  */
3242   if (reg_mentioned_p (gen_rtx_REG (Pmode, 15), pat))
3243     return 0;
3244
3245   return eligible_for_restore_insn (trial, false);
3246 }
3247
3248 int
3249 short_branch (int uid1, int uid2)
3250 {
3251   int delta = INSN_ADDRESSES (uid1) - INSN_ADDRESSES (uid2);
3252
3253   /* Leave a few words of "slop".  */
3254   if (delta >= -1023 && delta <= 1022)
3255     return 1;
3256
3257   return 0;
3258 }
3259
3260 /* Return nonzero if REG is not used after INSN.
3261    We assume REG is a reload reg, and therefore does
3262    not live past labels or calls or jumps.  */
3263 int
3264 reg_unused_after (rtx reg, rtx insn)
3265 {
3266   enum rtx_code code, prev_code = UNKNOWN;
3267
3268   while ((insn = NEXT_INSN (insn)))
3269     {
3270       if (prev_code == CALL_INSN && call_used_regs[REGNO (reg)])
3271         return 1;
3272
3273       code = GET_CODE (insn);
3274       if (GET_CODE (insn) == CODE_LABEL)
3275         return 1;
3276
3277       if (INSN_P (insn))
3278         {
3279           rtx set = single_set (insn);
3280           int in_src = set && reg_overlap_mentioned_p (reg, SET_SRC (set));
3281           if (set && in_src)
3282             return 0;
3283           if (set && reg_overlap_mentioned_p (reg, SET_DEST (set)))
3284             return 1;
3285           if (set == 0 && reg_overlap_mentioned_p (reg, PATTERN (insn)))
3286             return 0;
3287         }
3288       prev_code = code;
3289     }
3290   return 1;
3291 }
3292 \f
3293 /* Determine if it's legal to put X into the constant pool.  This
3294    is not possible if X contains the address of a symbol that is
3295    not constant (TLS) or not known at final link time (PIC).  */
3296
3297 static bool
3298 sparc_cannot_force_const_mem (rtx x)
3299 {
3300   switch (GET_CODE (x))
3301     {
3302     case CONST_INT:
3303     case CONST_DOUBLE:
3304     case CONST_VECTOR:
3305       /* Accept all non-symbolic constants.  */
3306       return false;
3307
3308     case LABEL_REF:
3309       /* Labels are OK iff we are non-PIC.  */
3310       return flag_pic != 0;
3311
3312     case SYMBOL_REF:
3313       /* 'Naked' TLS symbol references are never OK,
3314          non-TLS symbols are OK iff we are non-PIC.  */
3315       if (SYMBOL_REF_TLS_MODEL (x))
3316         return true;
3317       else
3318         return flag_pic != 0;
3319
3320     case CONST:
3321       return sparc_cannot_force_const_mem (XEXP (x, 0));
3322     case PLUS:
3323     case MINUS:
3324       return sparc_cannot_force_const_mem (XEXP (x, 0))
3325          || sparc_cannot_force_const_mem (XEXP (x, 1));
3326     case UNSPEC:
3327       return true;
3328     default:
3329       abort ();
3330     }
3331 }
3332 \f
3333 /* The table we use to reference PIC data.  */
3334 static GTY(()) rtx global_offset_table;
3335
3336 /* The function we use to get at it.  */
3337 static GTY(()) rtx add_pc_to_pic_symbol;
3338 static GTY(()) char add_pc_to_pic_symbol_name[256];
3339
3340 /* Ensure that we are not using patterns that are not OK with PIC.  */
3341
3342 int
3343 check_pic (int i)
3344 {
3345   switch (flag_pic)
3346     {
3347     case 1:
3348       if (GET_CODE (recog_data.operand[i]) == SYMBOL_REF
3349           || (GET_CODE (recog_data.operand[i]) == CONST
3350               && ! (GET_CODE (XEXP (recog_data.operand[i], 0)) == MINUS
3351                     && (XEXP (XEXP (recog_data.operand[i], 0), 0)
3352                         == global_offset_table)
3353                     && (GET_CODE (XEXP (XEXP (recog_data.operand[i], 0), 1))
3354                         == CONST))))
3355         abort ();
3356     case 2:
3357     default:
3358       return 1;
3359     }
3360 }
3361
3362 /* Return true if X is an address which needs a temporary register when 
3363    reloaded while generating PIC code.  */
3364
3365 int
3366 pic_address_needs_scratch (rtx x)
3367 {
3368   /* An address which is a symbolic plus a non SMALL_INT needs a temp reg.  */
3369   if (GET_CODE (x) == CONST && GET_CODE (XEXP (x, 0)) == PLUS
3370       && GET_CODE (XEXP (XEXP (x, 0), 0)) == SYMBOL_REF
3371       && GET_CODE (XEXP (XEXP (x, 0), 1)) == CONST_INT
3372       && ! SMALL_INT (XEXP (XEXP (x, 0), 1)))
3373     return 1;
3374
3375   return 0;
3376 }
3377
3378 /* Determine if a given RTX is a valid constant.  We already know this
3379    satisfies CONSTANT_P.  */
3380
3381 bool
3382 legitimate_constant_p (rtx x)
3383 {
3384   rtx inner;
3385
3386   switch (GET_CODE (x))
3387     {
3388     case SYMBOL_REF:
3389       /* TLS symbols are not constant.  */
3390       if (SYMBOL_REF_TLS_MODEL (x))
3391         return false;
3392       break;
3393
3394     case CONST:
3395       inner = XEXP (x, 0);
3396
3397       /* Offsets of TLS symbols are never valid.
3398          Discourage CSE from creating them.  */
3399       if (GET_CODE (inner) == PLUS
3400           && tls_symbolic_operand (XEXP (inner, 0)))
3401         return false;
3402       break;
3403
3404     case CONST_DOUBLE:
3405       if (GET_MODE (x) == VOIDmode)
3406         return true;
3407
3408       /* Floating point constants are generally not ok.
3409          The only exception is 0.0 in VIS.  */
3410       if (TARGET_VIS
3411           && (GET_MODE (x) == SFmode
3412               || GET_MODE (x) == DFmode
3413               || GET_MODE (x) == TFmode)
3414           && fp_zero_operand (x, GET_MODE (x)))
3415         return true;
3416
3417       return false;
3418
3419     default:
3420       break;
3421     }
3422
3423   return true;
3424 }
3425
3426 /* Determine if a given RTX is a valid constant address.  */
3427
3428 bool
3429 constant_address_p (rtx x)
3430 {
3431   switch (GET_CODE (x))
3432     {
3433     case LABEL_REF:
3434     case CONST_INT:
3435     case HIGH:
3436       return true;
3437
3438     case CONST:
3439       if (flag_pic && pic_address_needs_scratch (x))
3440         return false;
3441       return legitimate_constant_p (x);
3442
3443     case SYMBOL_REF:
3444       return !flag_pic && legitimate_constant_p (x);
3445
3446     default:
3447       return false;
3448     }
3449 }
3450
3451 /* Nonzero if the constant value X is a legitimate general operand
3452    when generating PIC code.  It is given that flag_pic is on and
3453    that X satisfies CONSTANT_P or is a CONST_DOUBLE.  */
3454
3455 bool
3456 legitimate_pic_operand_p (rtx x)
3457 {
3458   if (pic_address_needs_scratch (x))
3459     return false;
3460   if (tls_symbolic_operand (x)
3461       || (GET_CODE (x) == CONST
3462           && GET_CODE (XEXP (x, 0)) == PLUS
3463           && tls_symbolic_operand (XEXP (XEXP (x, 0), 0))))
3464     return false;
3465   return true;
3466 }
3467
3468 /* Return nonzero if ADDR is a valid memory address.
3469    STRICT specifies whether strict register checking applies.  */
3470    
3471 int
3472 legitimate_address_p (enum machine_mode mode, rtx addr, int strict)
3473 {
3474   rtx rs1 = NULL, rs2 = NULL, imm1 = NULL, imm2;
3475
3476   if (REG_P (addr) || GET_CODE (addr) == SUBREG)
3477     rs1 = addr;
3478   else if (GET_CODE (addr) == PLUS)
3479     {
3480       rs1 = XEXP (addr, 0);
3481       rs2 = XEXP (addr, 1);
3482
3483       /* Canonicalize.  REG comes first, if there are no regs,
3484          LO_SUM comes first.  */
3485       if (!REG_P (rs1)
3486           && GET_CODE (rs1) != SUBREG
3487           && (REG_P (rs2)
3488               || GET_CODE (rs2) == SUBREG
3489               || (GET_CODE (rs2) == LO_SUM && GET_CODE (rs1) != LO_SUM)))
3490         {
3491           rs1 = XEXP (addr, 1);
3492           rs2 = XEXP (addr, 0);
3493         }
3494
3495       if ((flag_pic == 1
3496            && rs1 == pic_offset_table_rtx
3497            && !REG_P (rs2)
3498            && GET_CODE (rs2) != SUBREG
3499            && GET_CODE (rs2) != LO_SUM
3500            && GET_CODE (rs2) != MEM
3501            && !tls_symbolic_operand (rs2)
3502            && (! symbolic_operand (rs2, VOIDmode) || mode == Pmode)
3503            && (GET_CODE (rs2) != CONST_INT || SMALL_INT (rs2)))
3504           || ((REG_P (rs1)
3505                || GET_CODE (rs1) == SUBREG)
3506               && RTX_OK_FOR_OFFSET_P (rs2)))
3507         {
3508           imm1 = rs2;
3509           rs2 = NULL;
3510         }
3511       else if ((REG_P (rs1) || GET_CODE (rs1) == SUBREG)
3512                && (REG_P (rs2) || GET_CODE (rs2) == SUBREG))
3513         {
3514           /* We prohibit REG + REG for TFmode when there are no quad move insns
3515              and we consequently need to split.  We do this because REG+REG
3516              is not an offsettable address.  If we get the situation in reload
3517              where source and destination of a movtf pattern are both MEMs with
3518              REG+REG address, then only one of them gets converted to an
3519              offsettable address.  */
3520           if (mode == TFmode
3521               && ! (TARGET_FPU && TARGET_ARCH64 && TARGET_HARD_QUAD))
3522             return 0;
3523
3524           /* We prohibit REG + REG on ARCH32 if not optimizing for
3525              DFmode/DImode because then mem_min_alignment is likely to be zero
3526              after reload and the  forced split would lack a matching splitter
3527              pattern.  */
3528           if (TARGET_ARCH32 && !optimize
3529               && (mode == DFmode || mode == DImode))
3530             return 0;
3531         }
3532       else if (USE_AS_OFFSETABLE_LO10
3533                && GET_CODE (rs1) == LO_SUM
3534                && TARGET_ARCH64
3535                && ! TARGET_CM_MEDMID
3536                && RTX_OK_FOR_OLO10_P (rs2))
3537         {
3538           imm2 = rs2;
3539           rs2 = NULL;
3540           imm1 = XEXP (rs1, 1);
3541           rs1 = XEXP (rs1, 0);
3542           if (! CONSTANT_P (imm1) || tls_symbolic_operand (rs1))
3543             return 0;
3544         }
3545     }
3546   else if (GET_CODE (addr) == LO_SUM)
3547     {
3548       rs1 = XEXP (addr, 0);
3549       imm1 = XEXP (addr, 1);
3550
3551       if (! CONSTANT_P (imm1) || tls_symbolic_operand (rs1))
3552         return 0;
3553
3554       if (USE_AS_OFFSETABLE_LO10)
3555         {
3556           /* We can't allow TFmode, because an offset greater than or equal to
3557              the alignment (8) may cause the LO_SUM to overflow if !v9.  */
3558           if (mode == TFmode && ! TARGET_V9)
3559             return 0;
3560         }
3561       else
3562         {
3563           /* We prohibit LO_SUM for TFmode when there are no quad move insns
3564              and we consequently need to split.  We do this because LO_SUM
3565              is not an offsettable address.  If we get the situation in reload
3566              where source and destination of a movtf pattern are both MEMs with
3567              LO_SUM address, then only one of them gets converted to an
3568              offsettable address.  */
3569           if (mode == TFmode
3570               && ! (TARGET_FPU && TARGET_ARCH64 && TARGET_HARD_QUAD))
3571             return 0;
3572         }
3573     }
3574   else if (GET_CODE (addr) == CONST_INT && SMALL_INT (addr))
3575     return 1;
3576   else
3577     return 0;
3578
3579   if (GET_CODE (rs1) == SUBREG)
3580     rs1 = SUBREG_REG (rs1);
3581   if (!REG_P (rs1))
3582     return 0;
3583
3584   if (rs2)
3585     {
3586       if (GET_CODE (rs2) == SUBREG)
3587         rs2 = SUBREG_REG (rs2);
3588       if (!REG_P (rs2))
3589         return 0;
3590     }
3591
3592   if (strict)
3593     {
3594       if (!REGNO_OK_FOR_BASE_P (REGNO (rs1))
3595           || (rs2 && !REGNO_OK_FOR_BASE_P (REGNO (rs2))))
3596         return 0;
3597     }
3598   else
3599     {
3600       if ((REGNO (rs1) >= 32
3601            && REGNO (rs1) != FRAME_POINTER_REGNUM
3602            && REGNO (rs1) < FIRST_PSEUDO_REGISTER)
3603           || (rs2
3604               && (REGNO (rs2) >= 32
3605                   && REGNO (rs2) != FRAME_POINTER_REGNUM
3606                   && REGNO (rs2) < FIRST_PSEUDO_REGISTER)))
3607         return 0;
3608     }
3609   return 1;
3610 }
3611
3612 /* Construct the SYMBOL_REF for the tls_get_offset function.  */
3613
3614 static GTY(()) rtx sparc_tls_symbol;
3615 static rtx
3616 sparc_tls_get_addr (void)
3617 {
3618   if (!sparc_tls_symbol)
3619     sparc_tls_symbol = gen_rtx_SYMBOL_REF (Pmode, "__tls_get_addr");
3620
3621   return sparc_tls_symbol;
3622 }
3623
3624 static rtx
3625 sparc_tls_got (void)
3626 {
3627   rtx temp;
3628   if (flag_pic)
3629     {
3630       current_function_uses_pic_offset_table = 1;
3631       return pic_offset_table_rtx;
3632     }
3633
3634   if (!global_offset_table)
3635     global_offset_table = gen_rtx_SYMBOL_REF (Pmode, "_GLOBAL_OFFSET_TABLE_");
3636   temp = gen_reg_rtx (Pmode);
3637   emit_move_insn (temp, global_offset_table);
3638   return temp;
3639 }
3640
3641
3642 /* ADDR contains a thread-local SYMBOL_REF.  Generate code to compute
3643    this (thread-local) address.  */
3644
3645 rtx
3646 legitimize_tls_address (rtx addr)
3647 {
3648   rtx temp1, temp2, temp3, ret, o0, got, insn;
3649
3650   if (no_new_pseudos)
3651     abort ();
3652
3653   if (GET_CODE (addr) == SYMBOL_REF)
3654     switch (SYMBOL_REF_TLS_MODEL (addr))
3655       {
3656       case TLS_MODEL_GLOBAL_DYNAMIC:
3657         start_sequence ();
3658         temp1 = gen_reg_rtx (SImode);
3659         temp2 = gen_reg_rtx (SImode);
3660         ret = gen_reg_rtx (Pmode);
3661         o0 = gen_rtx_REG (Pmode, 8);
3662         got = sparc_tls_got ();
3663         emit_insn (gen_tgd_hi22 (temp1, addr));
3664         emit_insn (gen_tgd_lo10 (temp2, temp1, addr));
3665         if (TARGET_ARCH32)
3666           {
3667             emit_insn (gen_tgd_add32 (o0, got, temp2, addr));
3668             insn = emit_call_insn (gen_tgd_call32 (o0, sparc_tls_get_addr (),
3669                                                    addr, const1_rtx));
3670           }
3671         else
3672           {
3673             emit_insn (gen_tgd_add64 (o0, got, temp2, addr));
3674             insn = emit_call_insn (gen_tgd_call64 (o0, sparc_tls_get_addr (),
3675                                                    addr, const1_rtx));
3676           }
3677         CALL_INSN_FUNCTION_USAGE (insn)
3678           = gen_rtx_EXPR_LIST (VOIDmode, gen_rtx_USE (VOIDmode, o0),
3679                                CALL_INSN_FUNCTION_USAGE (insn));
3680         insn = get_insns ();
3681         end_sequence ();
3682         emit_libcall_block (insn, ret, o0, addr);
3683         break;
3684
3685       case TLS_MODEL_LOCAL_DYNAMIC:
3686         start_sequence ();
3687         temp1 = gen_reg_rtx (SImode);
3688         temp2 = gen_reg_rtx (SImode);
3689         temp3 = gen_reg_rtx (Pmode);
3690         ret = gen_reg_rtx (Pmode);
3691         o0 = gen_rtx_REG (Pmode, 8);
3692         got = sparc_tls_got ();
3693         emit_insn (gen_tldm_hi22 (temp1));
3694         emit_insn (gen_tldm_lo10 (temp2, temp1));
3695         if (TARGET_ARCH32)
3696           {
3697             emit_insn (gen_tldm_add32 (o0, got, temp2));
3698             insn = emit_call_insn (gen_tldm_call32 (o0, sparc_tls_get_addr (),
3699                                                     const1_rtx));
3700           }
3701         else
3702           {
3703             emit_insn (gen_tldm_add64 (o0, got, temp2));
3704             insn = emit_call_insn (gen_tldm_call64 (o0, sparc_tls_get_addr (),
3705                                                     const1_rtx));
3706           }
3707         CALL_INSN_FUNCTION_USAGE (insn)
3708           = gen_rtx_EXPR_LIST (VOIDmode, gen_rtx_USE (VOIDmode, o0),
3709                                CALL_INSN_FUNCTION_USAGE (insn));
3710         insn = get_insns ();
3711         end_sequence ();
3712         emit_libcall_block (insn, temp3, o0,
3713                             gen_rtx_UNSPEC (Pmode, gen_rtvec (1, const0_rtx),
3714                                             UNSPEC_TLSLD_BASE));
3715         temp1 = gen_reg_rtx (SImode);
3716         temp2 = gen_reg_rtx (SImode);
3717         emit_insn (gen_tldo_hix22 (temp1, addr));
3718         emit_insn (gen_tldo_lox10 (temp2, temp1, addr));
3719         if (TARGET_ARCH32)
3720           emit_insn (gen_tldo_add32 (ret, temp3, temp2, addr));
3721         else
3722           emit_insn (gen_tldo_add64 (ret, temp3, temp2, addr));
3723         break;
3724
3725       case TLS_MODEL_INITIAL_EXEC:
3726         temp1 = gen_reg_rtx (SImode);
3727         temp2 = gen_reg_rtx (SImode);
3728         temp3 = gen_reg_rtx (Pmode);
3729         got = sparc_tls_got ();
3730         emit_insn (gen_tie_hi22 (temp1, addr));
3731         emit_insn (gen_tie_lo10 (temp2, temp1, addr));
3732         if (TARGET_ARCH32)
3733           emit_insn (gen_tie_ld32 (temp3, got, temp2, addr));
3734         else
3735           emit_insn (gen_tie_ld64 (temp3, got, temp2, addr));
3736         if (TARGET_SUN_TLS)
3737           {
3738             ret = gen_reg_rtx (Pmode);
3739             if (TARGET_ARCH32)
3740               emit_insn (gen_tie_add32 (ret, gen_rtx_REG (Pmode, 7),
3741                                         temp3, addr));
3742             else
3743               emit_insn (gen_tie_add64 (ret, gen_rtx_REG (Pmode, 7),
3744                                         temp3, addr));
3745           }
3746         else
3747           ret = gen_rtx_PLUS (Pmode, gen_rtx_REG (Pmode, 7), temp3);
3748         break;
3749
3750       case TLS_MODEL_LOCAL_EXEC:
3751         temp1 = gen_reg_rtx (Pmode);
3752         temp2 = gen_reg_rtx (Pmode);
3753         if (TARGET_ARCH32)
3754           {
3755             emit_insn (gen_tle_hix22_sp32 (temp1, addr));
3756             emit_insn (gen_tle_lox10_sp32 (temp2, temp1, addr));
3757           }
3758         else
3759           {
3760             emit_insn (gen_tle_hix22_sp64 (temp1, addr));
3761             emit_insn (gen_tle_lox10_sp64 (temp2, temp1, addr));
3762           }
3763         ret = gen_rtx_PLUS (Pmode, gen_rtx_REG (Pmode, 7), temp2);
3764         break;
3765
3766       default:
3767         abort ();
3768       }
3769
3770   else
3771     abort ();  /* for now ... */
3772
3773   return ret;
3774 }
3775
3776
3777 /* Legitimize PIC addresses.  If the address is already position-independent,
3778    we return ORIG.  Newly generated position-independent addresses go into a
3779    reg.  This is REG if nonzero, otherwise we allocate register(s) as
3780    necessary.  */
3781
3782 rtx
3783 legitimize_pic_address (rtx orig, enum machine_mode mode ATTRIBUTE_UNUSED,
3784                         rtx reg)
3785 {
3786   if (GET_CODE (orig) == SYMBOL_REF)
3787     {
3788       rtx pic_ref, address;
3789       rtx insn;
3790
3791       if (reg == 0)
3792         {
3793           if (reload_in_progress || reload_completed)
3794             abort ();
3795           else
3796             reg = gen_reg_rtx (Pmode);
3797         }
3798
3799       if (flag_pic == 2)
3800         {
3801           /* If not during reload, allocate another temp reg here for loading
3802              in the address, so that these instructions can be optimized
3803              properly.  */
3804           rtx temp_reg = ((reload_in_progress || reload_completed)
3805                           ? reg : gen_reg_rtx (Pmode));
3806
3807           /* Must put the SYMBOL_REF inside an UNSPEC here so that cse
3808              won't get confused into thinking that these two instructions
3809              are loading in the true address of the symbol.  If in the
3810              future a PIC rtx exists, that should be used instead.  */
3811           if (Pmode == SImode)
3812             {
3813               emit_insn (gen_movsi_high_pic (temp_reg, orig));
3814               emit_insn (gen_movsi_lo_sum_pic (temp_reg, temp_reg, orig));
3815             }
3816           else
3817             {
3818               emit_insn (gen_movdi_high_pic (temp_reg, orig));
3819               emit_insn (gen_movdi_lo_sum_pic (temp_reg, temp_reg, orig));
3820             }
3821           address = temp_reg;
3822         }
3823       else
3824         address = orig;
3825
3826       pic_ref = gen_const_mem (Pmode,
3827                                gen_rtx_PLUS (Pmode,
3828                                              pic_offset_table_rtx, address));
3829       current_function_uses_pic_offset_table = 1;
3830       insn = emit_move_insn (reg, pic_ref);
3831       /* Put a REG_EQUAL note on this insn, so that it can be optimized
3832          by loop.  */
3833       REG_NOTES (insn) = gen_rtx_EXPR_LIST (REG_EQUAL, orig,
3834                                   REG_NOTES (insn));
3835       return reg;
3836     }
3837   else if (GET_CODE (orig) == CONST)
3838     {
3839       rtx base, offset;
3840
3841       if (GET_CODE (XEXP (orig, 0)) == PLUS
3842           && XEXP (XEXP (orig, 0), 0) == pic_offset_table_rtx)
3843         return orig;
3844
3845       if (reg == 0)
3846         {
3847           if (reload_in_progress || reload_completed)
3848             abort ();
3849           else
3850             reg = gen_reg_rtx (Pmode);
3851         }
3852
3853       if (GET_CODE (XEXP (orig, 0)) == PLUS)
3854         {
3855           base = legitimize_pic_address (XEXP (XEXP (orig, 0), 0), Pmode, reg);
3856           offset = legitimize_pic_address (XEXP (XEXP (orig, 0), 1), Pmode,
3857                                          base == reg ? 0 : reg);
3858         }
3859       else
3860         abort ();
3861
3862       if (GET_CODE (offset) == CONST_INT)
3863         {
3864           if (SMALL_INT (offset))
3865             return plus_constant (base, INTVAL (offset));
3866           else if (! reload_in_progress && ! reload_completed)
3867             offset = force_reg (Pmode, offset);
3868           else
3869             /* If we reach here, then something is seriously wrong.  */
3870             abort ();
3871         }
3872       return gen_rtx_PLUS (Pmode, base, offset);
3873     }
3874   else if (GET_CODE (orig) == LABEL_REF)
3875     /* ??? Why do we do this?  */
3876     /* Now movsi_pic_label_ref uses it, but we ought to be checking that
3877        the register is live instead, in case it is eliminated.  */
3878     current_function_uses_pic_offset_table = 1;
3879
3880   return orig;
3881 }
3882
3883 /* Try machine-dependent ways of modifying an illegitimate address X
3884    to be legitimate.  If we find one, return the new, valid address.
3885
3886    OLDX is the address as it was before break_out_memory_refs was called.
3887    In some cases it is useful to look at this to decide what needs to be done.
3888
3889    MODE is the mode of the operand pointed to by X.  */
3890
3891 rtx
3892 legitimize_address (rtx x, rtx oldx ATTRIBUTE_UNUSED, enum machine_mode mode)
3893 {
3894   rtx orig_x = x;
3895
3896   if (GET_CODE (x) == PLUS && GET_CODE (XEXP (x, 0)) == MULT)
3897     x = gen_rtx_PLUS (Pmode, XEXP (x, 1),
3898                       force_operand (XEXP (x, 0), NULL_RTX));
3899   if (GET_CODE (x) == PLUS && GET_CODE (XEXP (x, 1)) == MULT)
3900     x = gen_rtx_PLUS (Pmode, XEXP (x, 0),
3901                       force_operand (XEXP (x, 1), NULL_RTX));
3902   if (GET_CODE (x) == PLUS && GET_CODE (XEXP (x, 0)) == PLUS)
3903     x = gen_rtx_PLUS (Pmode, force_operand (XEXP (x, 0), NULL_RTX),
3904                       XEXP (x, 1));
3905   if (GET_CODE (x) == PLUS && GET_CODE (XEXP (x, 1)) == PLUS)
3906     x = gen_rtx_PLUS (Pmode, XEXP (x, 0),
3907                       force_operand (XEXP (x, 1), NULL_RTX));
3908
3909   if (x != orig_x && legitimate_address_p (mode, x, FALSE))
3910     return x;
3911
3912   if (tls_symbolic_operand (x))
3913     x = legitimize_tls_address (x);
3914   else if (flag_pic)
3915     x = legitimize_pic_address (x, mode, 0);
3916   else if (GET_CODE (x) == PLUS && CONSTANT_ADDRESS_P (XEXP (x, 1)))
3917     x = gen_rtx_PLUS (Pmode, XEXP (x, 0),
3918                       copy_to_mode_reg (Pmode, XEXP (x, 1)));
3919   else if (GET_CODE (x) == PLUS && CONSTANT_ADDRESS_P (XEXP (x, 0)))
3920     x = gen_rtx_PLUS (Pmode, XEXP (x, 1),
3921                       copy_to_mode_reg (Pmode, XEXP (x, 0)));
3922   else if (GET_CODE (x) == SYMBOL_REF
3923            || GET_CODE (x) == CONST
3924            || GET_CODE (x) == LABEL_REF)
3925     x = copy_to_suggested_reg (x, NULL_RTX, Pmode);
3926   return x;
3927 }
3928
3929 /* Emit the special PIC prologue.  */
3930
3931 static void
3932 load_pic_register (void)
3933 {
3934   int orig_flag_pic = flag_pic;
3935
3936   /* If we haven't emitted the special helper function, do so now.  */
3937   if (add_pc_to_pic_symbol_name[0] == 0)
3938     {
3939       const char *pic_name = reg_names[REGNO (pic_offset_table_rtx)];
3940       int align;
3941
3942       ASM_GENERATE_INTERNAL_LABEL (add_pc_to_pic_symbol_name, "LADDPC", 0);
3943       text_section ();
3944
3945       align = floor_log2 (FUNCTION_BOUNDARY / BITS_PER_UNIT);
3946       if (align > 0)
3947         ASM_OUTPUT_ALIGN (asm_out_file, align);
3948       ASM_OUTPUT_LABEL (asm_out_file, add_pc_to_pic_symbol_name);
3949       if (flag_delayed_branch)
3950         fprintf (asm_out_file, "\tjmp %%o7+8\n\t add\t%%o7, %s, %s\n",
3951                  pic_name, pic_name);
3952       else
3953         fprintf (asm_out_file, "\tadd\t%%o7, %s, %s\n\tjmp %%o7+8\n\t nop\n",
3954                  pic_name, pic_name);
3955     }
3956
3957   /* Initialize every time through, since we can't easily
3958      know this to be permanent.  */
3959   global_offset_table = gen_rtx_SYMBOL_REF (Pmode, "_GLOBAL_OFFSET_TABLE_");
3960   add_pc_to_pic_symbol = gen_rtx_SYMBOL_REF (Pmode, add_pc_to_pic_symbol_name);
3961
3962   flag_pic = 0;
3963   emit_insn (gen_load_pcrel_sym (pic_offset_table_rtx, global_offset_table,
3964                                  add_pc_to_pic_symbol));
3965   flag_pic = orig_flag_pic;
3966
3967   /* Need to emit this whether or not we obey regdecls,
3968      since setjmp/longjmp can cause life info to screw up.
3969      ??? In the case where we don't obey regdecls, this is not sufficient
3970      since we may not fall out the bottom.  */
3971   emit_insn (gen_rtx_USE (VOIDmode, pic_offset_table_rtx));
3972 }
3973 \f
3974 /* Return 1 if RTX is a MEM which is known to be aligned to at
3975    least a DESIRED byte boundary.  */
3976
3977 int
3978 mem_min_alignment (rtx mem, int desired)
3979 {
3980   rtx addr, base, offset;
3981
3982   /* If it's not a MEM we can't accept it.  */
3983   if (GET_CODE (mem) != MEM)
3984     return 0;
3985
3986   addr = XEXP (mem, 0);
3987   base = offset = NULL_RTX;
3988   if (GET_CODE (addr) == PLUS)
3989     {
3990       if (GET_CODE (XEXP (addr, 0)) == REG)
3991         {
3992           base = XEXP (addr, 0);
3993
3994           /* What we are saying here is that if the base
3995              REG is aligned properly, the compiler will make
3996              sure any REG based index upon it will be so
3997              as well.  */
3998           if (GET_CODE (XEXP (addr, 1)) == CONST_INT)
3999             offset = XEXP (addr, 1);
4000           else
4001             offset = const0_rtx;
4002         }
4003     }
4004   else if (GET_CODE (addr) == REG)
4005     {
4006       base = addr;
4007       offset = const0_rtx;
4008     }
4009
4010   if (base != NULL_RTX)
4011     {
4012       int regno = REGNO (base);
4013
4014       if (regno != HARD_FRAME_POINTER_REGNUM && regno != STACK_POINTER_REGNUM)
4015         {
4016           /* Check if the compiler has recorded some information
4017              about the alignment of the base REG.  If reload has
4018              completed, we already matched with proper alignments.
4019              If not running global_alloc, reload might give us
4020              unaligned pointer to local stack though.  */
4021           if (((cfun != 0
4022                 && REGNO_POINTER_ALIGN (regno) >= desired * BITS_PER_UNIT)
4023                || (optimize && reload_completed))
4024               && (INTVAL (offset) & (desired - 1)) == 0)
4025             return 1;
4026         }
4027       else
4028         {
4029           if (((INTVAL (offset) - SPARC_STACK_BIAS) & (desired - 1)) == 0)
4030             return 1;
4031         }
4032     }
4033   else if (! TARGET_UNALIGNED_DOUBLES
4034            || CONSTANT_P (addr)
4035            || GET_CODE (addr) == LO_SUM)
4036     {
4037       /* Anything else we know is properly aligned unless TARGET_UNALIGNED_DOUBLES
4038          is true, in which case we can only assume that an access is aligned if
4039          it is to a constant address, or the address involves a LO_SUM.  */
4040       return 1;
4041     }
4042   
4043   /* An obviously unaligned address.  */
4044   return 0;
4045 }
4046
4047 \f
4048 /* Vectors to keep interesting information about registers where it can easily
4049    be got.  We used to use the actual mode value as the bit number, but there
4050    are more than 32 modes now.  Instead we use two tables: one indexed by
4051    hard register number, and one indexed by mode.  */
4052
4053 /* The purpose of sparc_mode_class is to shrink the range of modes so that
4054    they all fit (as bit numbers) in a 32 bit word (again).  Each real mode is
4055    mapped into one sparc_mode_class mode.  */
4056
4057 enum sparc_mode_class {
4058   S_MODE, D_MODE, T_MODE, O_MODE,
4059   SF_MODE, DF_MODE, TF_MODE, OF_MODE,
4060   CC_MODE, CCFP_MODE
4061 };
4062
4063 /* Modes for single-word and smaller quantities.  */
4064 #define S_MODES ((1 << (int) S_MODE) | (1 << (int) SF_MODE))
4065
4066 /* Modes for double-word and smaller quantities.  */
4067 #define D_MODES (S_MODES | (1 << (int) D_MODE) | (1 << DF_MODE))
4068
4069 /* Modes for quad-word and smaller quantities.  */
4070 #define T_MODES (D_MODES | (1 << (int) T_MODE) | (1 << (int) TF_MODE))
4071
4072 /* Modes for 8-word and smaller quantities.  */
4073 #define O_MODES (T_MODES | (1 << (int) O_MODE) | (1 << (int) OF_MODE))
4074
4075 /* Modes for single-float quantities.  We must allow any single word or
4076    smaller quantity.  This is because the fix/float conversion instructions
4077    take integer inputs/outputs from the float registers.  */
4078 #define SF_MODES (S_MODES)
4079
4080 /* Modes for double-float and smaller quantities.  */
4081 #define DF_MODES (S_MODES | D_MODES)
4082
4083 /* Modes for double-float only quantities.  */
4084 #define DF_MODES_NO_S ((1 << (int) D_MODE) | (1 << (int) DF_MODE))
4085
4086 /* Modes for quad-float only quantities.  */
4087 #define TF_ONLY_MODES (1 << (int) TF_MODE)
4088
4089 /* Modes for quad-float and smaller quantities.  */
4090 #define TF_MODES (DF_MODES | TF_ONLY_MODES)
4091
4092 /* Modes for quad-float and double-float quantities.  */
4093 #define TF_MODES_NO_S (DF_MODES_NO_S | TF_ONLY_MODES)
4094
4095 /* Modes for quad-float pair only quantities.  */
4096 #define OF_ONLY_MODES (1 << (int) OF_MODE)
4097
4098 /* Modes for quad-float pairs and smaller quantities.  */
4099 #define OF_MODES (TF_MODES | OF_ONLY_MODES)
4100
4101 #define OF_MODES_NO_S (TF_MODES_NO_S | OF_ONLY_MODES)
4102
4103 /* Modes for condition codes.  */
4104 #define CC_MODES (1 << (int) CC_MODE)
4105 #define CCFP_MODES (1 << (int) CCFP_MODE)
4106
4107 /* Value is 1 if register/mode pair is acceptable on sparc.
4108    The funny mixture of D and T modes is because integer operations
4109    do not specially operate on tetra quantities, so non-quad-aligned
4110    registers can hold quadword quantities (except %o4 and %i4 because
4111    they cross fixed registers).  */
4112
4113 /* This points to either the 32 bit or the 64 bit version.  */
4114 const int *hard_regno_mode_classes;
4115
4116 static const int hard_32bit_mode_classes[] = {
4117   S_MODES, S_MODES, T_MODES, S_MODES, T_MODES, S_MODES, D_MODES, S_MODES,
4118   T_MODES, S_MODES, T_MODES, S_MODES, D_MODES, S_MODES, D_MODES, S_MODES,
4119   T_MODES, S_MODES, T_MODES, S_MODES, T_MODES, S_MODES, D_MODES, S_MODES,
4120   T_MODES, S_MODES, T_MODES, S_MODES, D_MODES, S_MODES, D_MODES, S_MODES,
4121
4122   OF_MODES, SF_MODES, DF_MODES, SF_MODES, OF_MODES, SF_MODES, DF_MODES, SF_MODES,
4123   OF_MODES, SF_MODES, DF_MODES, SF_MODES, OF_MODES, SF_MODES, DF_MODES, SF_MODES,
4124   OF_MODES, SF_MODES, DF_MODES, SF_MODES, OF_MODES, SF_MODES, DF_MODES, SF_MODES,
4125   OF_MODES, SF_MODES, DF_MODES, SF_MODES, TF_MODES, SF_MODES, DF_MODES, SF_MODES,
4126
4127   /* FP regs f32 to f63.  Only the even numbered registers actually exist,
4128      and none can hold SFmode/SImode values.  */
4129   OF_MODES_NO_S, 0, DF_MODES_NO_S, 0, OF_MODES_NO_S, 0, DF_MODES_NO_S, 0,
4130   OF_MODES_NO_S, 0, DF_MODES_NO_S, 0, OF_MODES_NO_S, 0, DF_MODES_NO_S, 0,
4131   OF_MODES_NO_S, 0, DF_MODES_NO_S, 0, OF_MODES_NO_S, 0, DF_MODES_NO_S, 0,
4132   OF_MODES_NO_S, 0, DF_MODES_NO_S, 0, TF_MODES_NO_S, 0, DF_MODES_NO_S, 0,
4133
4134   /* %fcc[0123] */
4135   CCFP_MODES, CCFP_MODES, CCFP_MODES, CCFP_MODES,
4136
4137   /* %icc */
4138   CC_MODES
4139 };
4140
4141 static const int hard_64bit_mode_classes[] = {
4142   D_MODES, D_MODES, T_MODES, D_MODES, T_MODES, D_MODES, T_MODES, D_MODES,
4143   O_MODES, D_MODES, T_MODES, D_MODES, T_MODES, D_MODES, T_MODES, D_MODES,
4144   T_MODES, D_MODES, T_MODES, D_MODES, T_MODES, D_MODES, T_MODES, D_MODES,
4145   O_MODES, D_MODES, T_MODES, D_MODES, T_MODES, D_MODES, T_MODES, D_MODES,
4146
4147   OF_MODES, SF_MODES, DF_MODES, SF_MODES, OF_MODES, SF_MODES, DF_MODES, SF_MODES,
4148   OF_MODES, SF_MODES, DF_MODES, SF_MODES, OF_MODES, SF_MODES, DF_MODES, SF_MODES,
4149   OF_MODES, SF_MODES, DF_MODES, SF_MODES, OF_MODES, SF_MODES, DF_MODES, SF_MODES,
4150   OF_MODES, SF_MODES, DF_MODES, SF_MODES, TF_MODES, SF_MODES, DF_MODES, SF_MODES,
4151
4152   /* FP regs f32 to f63.  Only the even numbered registers actually exist,
4153      and none can hold SFmode/SImode values.  */
4154   OF_MODES_NO_S, 0, DF_MODES_NO_S, 0, OF_MODES_NO_S, 0, DF_MODES_NO_S, 0,
4155   OF_MODES_NO_S, 0, DF_MODES_NO_S, 0, OF_MODES_NO_S, 0, DF_MODES_NO_S, 0,
4156   OF_MODES_NO_S, 0, DF_MODES_NO_S, 0, OF_MODES_NO_S, 0, DF_MODES_NO_S, 0,
4157   OF_MODES_NO_S, 0, DF_MODES_NO_S, 0, TF_MODES_NO_S, 0, DF_MODES_NO_S, 0,
4158
4159   /* %fcc[0123] */
4160   CCFP_MODES, CCFP_MODES, CCFP_MODES, CCFP_MODES,
4161
4162   /* %icc */
4163   CC_MODES
4164 };
4165
4166 int sparc_mode_class [NUM_MACHINE_MODES];
4167
4168 enum reg_class sparc_regno_reg_class[FIRST_PSEUDO_REGISTER];
4169
4170 static void
4171 sparc_init_modes (void)
4172 {
4173   int i;
4174
4175   for (i = 0; i < NUM_MACHINE_MODES; i++)
4176     {
4177       switch (GET_MODE_CLASS (i))
4178         {
4179         case MODE_INT:
4180         case MODE_PARTIAL_INT:
4181         case MODE_COMPLEX_INT:
4182           if (GET_MODE_SIZE (i) <= 4)
4183             sparc_mode_class[i] = 1 << (int) S_MODE;
4184           else if (GET_MODE_SIZE (i) == 8)
4185             sparc_mode_class[i] = 1 << (int) D_MODE;
4186           else if (GET_MODE_SIZE (i) == 16)
4187             sparc_mode_class[i] = 1 << (int) T_MODE;
4188           else if (GET_MODE_SIZE (i) == 32)
4189             sparc_mode_class[i] = 1 << (int) O_MODE;
4190           else 
4191             sparc_mode_class[i] = 0;
4192           break;
4193         case MODE_VECTOR_INT:
4194           if (GET_MODE_SIZE (i) <= 4)
4195             sparc_mode_class[i] = 1 << (int)SF_MODE;
4196           else if (GET_MODE_SIZE (i) == 8)
4197             sparc_mode_class[i] = 1 << (int)DF_MODE;
4198           break;
4199         case MODE_FLOAT:
4200         case MODE_COMPLEX_FLOAT:
4201           if (GET_MODE_SIZE (i) <= 4)
4202             sparc_mode_class[i] = 1 << (int) SF_MODE;
4203           else if (GET_MODE_SIZE (i) == 8)
4204             sparc_mode_class[i] = 1 << (int) DF_MODE;
4205           else if (GET_MODE_SIZE (i) == 16)
4206             sparc_mode_class[i] = 1 << (int) TF_MODE;
4207           else if (GET_MODE_SIZE (i) == 32)
4208             sparc_mode_class[i] = 1 << (int) OF_MODE;
4209           else 
4210             sparc_mode_class[i] = 0;
4211           break;
4212         case MODE_CC:
4213           if (i == (int) CCFPmode || i == (int) CCFPEmode)
4214             sparc_mode_class[i] = 1 << (int) CCFP_MODE;
4215           else
4216             sparc_mode_class[i] = 1 << (int) CC_MODE;
4217           break;
4218         default:
4219           sparc_mode_class[i] = 0;
4220           break;
4221         }
4222     }
4223
4224   if (TARGET_ARCH64)
4225     hard_regno_mode_classes = hard_64bit_mode_classes;
4226   else
4227     hard_regno_mode_classes = hard_32bit_mode_classes;
4228
4229   /* Initialize the array used by REGNO_REG_CLASS.  */
4230   for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
4231     {
4232       if (i < 16 && TARGET_V8PLUS)
4233         sparc_regno_reg_class[i] = I64_REGS;
4234       else if (i < 32 || i == FRAME_POINTER_REGNUM)
4235         sparc_regno_reg_class[i] = GENERAL_REGS;
4236       else if (i < 64)
4237         sparc_regno_reg_class[i] = FP_REGS;
4238       else if (i < 96)
4239         sparc_regno_reg_class[i] = EXTRA_FP_REGS;
4240       else if (i < 100)
4241         sparc_regno_reg_class[i] = FPCC_REGS;
4242       else
4243         sparc_regno_reg_class[i] = NO_REGS;
4244     }
4245 }
4246 \f
4247 /* Compute the frame size required by the function.  This function is called
4248    during the reload pass and also by sparc_expand_prologue.  */
4249
4250 HOST_WIDE_INT
4251 sparc_compute_frame_size (HOST_WIDE_INT size, int leaf_function_p)
4252 {
4253   int outgoing_args_size = (current_function_outgoing_args_size
4254                             + REG_PARM_STACK_SPACE (current_function_decl));
4255   int n_regs = 0;  /* N_REGS is the number of 4-byte regs saved thus far.  */
4256   int i;
4257
4258   if (TARGET_ARCH64)
4259     {
4260       for (i = 0; i < 8; i++)
4261         if (regs_ever_live[i] && ! call_used_regs[i])
4262           n_regs += 2;
4263     }
4264   else
4265     {
4266       for (i = 0; i < 8; i += 2)
4267         if ((regs_ever_live[i] && ! call_used_regs[i])
4268             || (regs_ever_live[i+1] && ! call_used_regs[i+1]))
4269           n_regs += 2;
4270     }
4271
4272   for (i = 32; i < (TARGET_V9 ? 96 : 64); i += 2)
4273     if ((regs_ever_live[i] && ! call_used_regs[i])
4274         || (regs_ever_live[i+1] && ! call_used_regs[i+1]))
4275       n_regs += 2;
4276
4277   /* Set up values for use in prologue and epilogue.  */
4278   num_gfregs = n_regs;
4279
4280   if (leaf_function_p
4281       && n_regs == 0
4282       && size == 0
4283       && current_function_outgoing_args_size == 0)
4284     actual_fsize = apparent_fsize = 0;
4285   else
4286     {
4287       /* We subtract STARTING_FRAME_OFFSET, remember it's negative.  */
4288       apparent_fsize = (size - STARTING_FRAME_OFFSET + 7) & -8;
4289       apparent_fsize += n_regs * 4;
4290       actual_fsize = apparent_fsize + ((outgoing_args_size + 7) & -8);
4291     }
4292
4293   /* Make sure nothing can clobber our register windows.
4294      If a SAVE must be done, or there is a stack-local variable,
4295      the register window area must be allocated.
4296      ??? For v8 we apparently need an additional 8 bytes of reserved space.  */
4297   if (! leaf_function_p || size > 0)
4298     actual_fsize += (16 * UNITS_PER_WORD) + (TARGET_ARCH64 ? 0 : 8);
4299
4300   return SPARC_STACK_ALIGN (actual_fsize);
4301 }
4302
4303 /* Output any necessary .register pseudo-ops.  */
4304
4305 void
4306 sparc_output_scratch_registers (FILE *file ATTRIBUTE_UNUSED)
4307 {
4308 #ifdef HAVE_AS_REGISTER_PSEUDO_OP
4309   int i;
4310
4311   if (TARGET_ARCH32)
4312     return;
4313
4314   /* Check if %g[2367] were used without
4315      .register being printed for them already.  */
4316   for (i = 2; i < 8; i++)
4317     {
4318       if (regs_ever_live [i]
4319           && ! sparc_hard_reg_printed [i])
4320         {
4321           sparc_hard_reg_printed [i] = 1;
4322           fprintf (file, "\t.register\t%%g%d, #scratch\n", i);
4323         }
4324       if (i == 3) i = 5;
4325     }
4326 #endif
4327 }
4328
4329 /* Save/restore call-saved registers from LOW to HIGH at BASE+OFFSET
4330    as needed.  LOW should be double-word aligned for 32-bit registers.
4331    Return the new OFFSET.  */
4332
4333 #define SORR_SAVE    0
4334 #define SORR_RESTORE 1
4335
4336 static int
4337 save_or_restore_regs (int low, int high, rtx base, int offset, int action)
4338 {
4339   rtx mem, insn;
4340   int i;
4341
4342   if (TARGET_ARCH64 && high <= 32)
4343     {
4344       for (i = low; i < high; i++)
4345         {
4346           if (regs_ever_live[i] && ! call_used_regs[i])
4347             {
4348               mem = gen_rtx_MEM (DImode, plus_constant (base, offset));
4349               set_mem_alias_set (mem, sparc_sr_alias_set);
4350               if (action == SORR_SAVE)
4351                 {
4352                   insn = emit_move_insn (mem, gen_rtx_REG (DImode, i));
4353                   RTX_FRAME_RELATED_P (insn) = 1;
4354                 }
4355               else  /* action == SORR_RESTORE */
4356                 emit_move_insn (gen_rtx_REG (DImode, i), mem);
4357               offset += 8;
4358             }
4359         }
4360     }
4361   else
4362     {
4363       for (i = low; i < high; i += 2)
4364         {
4365           bool reg0 = regs_ever_live[i] && ! call_used_regs[i];
4366           bool reg1 = regs_ever_live[i+1] && ! call_used_regs[i+1];
4367           enum machine_mode mode;
4368           int regno;
4369
4370           if (reg0 && reg1)
4371             {
4372               mode = i < 32 ? DImode : DFmode;
4373               regno = i;
4374             }
4375           else if (reg0)
4376             {
4377               mode = i < 32 ? SImode : SFmode;
4378               regno = i;
4379             }
4380           else if (reg1)
4381             {
4382               mode = i < 32 ? SImode : SFmode;
4383               regno = i + 1;
4384               offset += 4;
4385             }
4386           else
4387             continue;
4388
4389           mem = gen_rtx_MEM (mode, plus_constant (base, offset));
4390           set_mem_alias_set (mem, sparc_sr_alias_set);
4391           if (action == SORR_SAVE)
4392             {
4393               insn = emit_move_insn (mem, gen_rtx_REG (mode, regno));
4394               RTX_FRAME_RELATED_P (insn) = 1;
4395             }
4396           else  /* action == SORR_RESTORE */
4397             emit_move_insn (gen_rtx_REG (mode, regno), mem);
4398
4399           /* Always preserve double-word alignment.  */
4400           offset = (offset + 7) & -8;
4401         }
4402     }
4403
4404   return offset;
4405 }
4406
4407 /* Emit code to save call-saved registers.  */
4408
4409 static void
4410 emit_save_regs (void)
4411 {
4412   HOST_WIDE_INT offset;
4413   rtx base;
4414
4415   offset = frame_base_offset - apparent_fsize;
4416
4417   if (offset < -4096 || offset + num_gfregs * 4 > 4096)
4418     {
4419       /* ??? This might be optimized a little as %g1 might already have a
4420          value close enough that a single add insn will do.  */
4421       /* ??? Although, all of this is probably only a temporary fix
4422          because if %g1 can hold a function result, then
4423          sparc_expand_epilogue will lose (the result will be
4424          clobbered).  */
4425       base = gen_rtx_REG (Pmode, 1);
4426       emit_move_insn (base, GEN_INT (offset));
4427       emit_insn (gen_rtx_SET (VOIDmode,
4428                               base,
4429                               gen_rtx_PLUS (Pmode, frame_base_reg, base)));
4430       offset = 0;
4431     }
4432   else
4433     base = frame_base_reg;
4434
4435   offset = save_or_restore_regs (0, 8, base, offset, SORR_SAVE);
4436   save_or_restore_regs (32, TARGET_V9 ? 96 : 64, base, offset, SORR_SAVE);
4437 }
4438
4439 /* Emit code to restore call-saved registers.  */
4440
4441 static void
4442 emit_restore_regs (void)
4443 {
4444   HOST_WIDE_INT offset;
4445   rtx base;
4446
4447   offset = frame_base_offset - apparent_fsize;
4448
4449   if (offset < -4096 || offset + num_gfregs * 4 > 4096 - 8 /*double*/)
4450     {
4451       base = gen_rtx_REG (Pmode, 1);
4452       emit_move_insn (base, GEN_INT (offset));
4453       emit_insn (gen_rtx_SET (VOIDmode,
4454                               base,
4455                               gen_rtx_PLUS (Pmode, frame_base_reg, base)));
4456       offset = 0;
4457     }
4458   else
4459     base = frame_base_reg;
4460
4461   offset = save_or_restore_regs (0, 8, base, offset, SORR_RESTORE);
4462   save_or_restore_regs (32, TARGET_V9 ? 96 : 64, base, offset, SORR_RESTORE);
4463 }
4464
4465 /* Emit an increment for the stack pointer.  */
4466
4467 static void
4468 emit_stack_pointer_increment (rtx increment)
4469 {
4470   if (TARGET_ARCH64)
4471     emit_insn (gen_adddi3 (stack_pointer_rtx, stack_pointer_rtx, increment));
4472   else
4473     emit_insn (gen_addsi3 (stack_pointer_rtx, stack_pointer_rtx, increment));
4474 }
4475
4476 /* Emit a decrement for the stack pointer.  */
4477
4478 static void
4479 emit_stack_pointer_decrement (rtx decrement)
4480 {
4481   if (TARGET_ARCH64)
4482     emit_insn (gen_subdi3 (stack_pointer_rtx, stack_pointer_rtx, decrement));
4483   else
4484     emit_insn (gen_subsi3 (stack_pointer_rtx, stack_pointer_rtx, decrement));
4485 }
4486
4487 /* Expand the function prologue.  The prologue is responsible for reserving
4488    storage for the frame, saving the call-saved registers and loading the
4489    PIC register if needed.  */
4490
4491 void
4492 sparc_expand_prologue (void)
4493 {
4494   /* Compute a snapshot of current_function_uses_only_leaf_regs.  Relying
4495      on the final value of the flag means deferring the prologue/epilogue
4496      expansion until just before the second scheduling pass, which is too
4497      late to emit multiple epilogues or return insns.
4498
4499      Of course we are making the assumption that the value of the flag
4500      will not change between now and its final value.  Of the three parts
4501      of the formula, only the last one can reasonably vary.  Let's take a
4502      closer look, after assuming that the first two ones are set to true
4503      (otherwise the last value is effectively silenced).
4504
4505      If only_leaf_regs_used returns false, the global predicate will also
4506      be false so the actual frame size calculated below will be positive.
4507      As a consequence, the save_register_window insn will be emitted in
4508      the instruction stream; now this insn explicitly references %fp
4509      which is not a leaf register so only_leaf_regs_used will always
4510      return false subsequently.
4511
4512      If only_leaf_regs_used returns true, we hope that the subsequent
4513      optimization passes won't cause non-leaf registers to pop up.  For
4514      example, the regrename pass has special provisions to not rename to
4515      non-leaf registers in a leaf function.  */
4516   sparc_leaf_function_p
4517     = optimize > 0 && leaf_function_p () && only_leaf_regs_used ();
4518
4519   /* Need to use actual_fsize, since we are also allocating
4520      space for our callee (and our own register save area).  */
4521   actual_fsize
4522     = sparc_compute_frame_size (get_frame_size(), sparc_leaf_function_p);
4523
4524   /* Advertise that the data calculated just above are now valid.  */
4525   sparc_prologue_data_valid_p = true;
4526
4527   if (sparc_leaf_function_p)
4528     {
4529       frame_base_reg = stack_pointer_rtx;
4530       frame_base_offset = actual_fsize + SPARC_STACK_BIAS;
4531     }
4532   else
4533     {
4534       frame_base_reg = hard_frame_pointer_rtx;
4535       frame_base_offset = SPARC_STACK_BIAS;
4536     }
4537
4538   if (actual_fsize == 0)
4539     /* do nothing.  */ ;
4540   else if (sparc_leaf_function_p)
4541     {
4542       if (actual_fsize <= 4096)
4543         emit_stack_pointer_increment (GEN_INT (- actual_fsize));
4544       else if (actual_fsize <= 8192)
4545         {
4546           emit_stack_pointer_increment (GEN_INT (-4096));
4547           emit_stack_pointer_increment (GEN_INT (4096 - actual_fsize));
4548         }
4549       else
4550         {
4551           rtx reg = gen_rtx_REG (Pmode, 1);
4552           emit_move_insn (reg, GEN_INT (-actual_fsize));
4553           emit_stack_pointer_increment (reg);
4554         }
4555     }
4556   else
4557     {
4558       if (actual_fsize <= 4096)
4559         emit_insn (gen_save_register_window (GEN_INT (-actual_fsize)));
4560       else if (actual_fsize <= 8192)
4561         {
4562           emit_insn (gen_save_register_window (GEN_INT (-4096)));
4563           emit_stack_pointer_increment (GEN_INT (4096 - actual_fsize));
4564         }
4565       else
4566         {
4567           rtx reg = gen_rtx_REG (Pmode, 1);
4568           emit_move_insn (reg, GEN_INT (-actual_fsize));
4569           emit_insn (gen_save_register_window (reg));
4570         }
4571     }
4572
4573   /* Call-saved registers are saved just above the outgoing argument area.  */
4574   if (num_gfregs)
4575     emit_save_regs ();
4576
4577   /* Load the PIC register if needed.  */
4578   if (flag_pic && current_function_uses_pic_offset_table)
4579     load_pic_register ();
4580 }
4581  
4582 /* This function generates the assembly code for function entry, which boils
4583    down to emitting the necessary .register directives.  It also informs the
4584    DWARF-2 back-end on the layout of the frame.
4585
4586    ??? Historical cruft: "On SPARC, move-double insns between fpu and cpu need
4587    an 8-byte block of memory.  If any fpu reg is used in the function, we
4588    allocate such a block here, at the bottom of the frame, just in case it's
4589    needed."  Could this explain the -8 in emit_restore_regs?  */
4590
4591 static void
4592 sparc_asm_function_prologue (FILE *file, HOST_WIDE_INT size ATTRIBUTE_UNUSED)
4593 {
4594   /* Check that the assumption we made in sparc_expand_prologue is valid.  */
4595   if (sparc_leaf_function_p != current_function_uses_only_leaf_regs)
4596     abort();
4597
4598   sparc_output_scratch_registers (file);
4599
4600   if (dwarf2out_do_frame () && actual_fsize)
4601     {
4602       char *label = dwarf2out_cfi_label ();
4603
4604       /* The canonical frame address refers to the top of the frame.  */
4605       dwarf2out_def_cfa (label,
4606                          sparc_leaf_function_p
4607                          ? STACK_POINTER_REGNUM
4608                          : HARD_FRAME_POINTER_REGNUM,
4609                          frame_base_offset);
4610
4611       if (! sparc_leaf_function_p)
4612         {
4613           /* Note the register window save.  This tells the unwinder that
4614              it needs to restore the window registers from the previous
4615              frame's window save area at 0(cfa).  */
4616           dwarf2out_window_save (label);
4617
4618           /* The return address (-8) is now in %i7.  */
4619           dwarf2out_return_reg (label, 31);
4620         }
4621     }
4622 }
4623
4624 /* Expand the function epilogue, either normal or part of a sibcall.
4625    We emit all the instructions except the return or the call.  */
4626
4627 void
4628 sparc_expand_epilogue (void)
4629 {
4630   if (num_gfregs)
4631     emit_restore_regs ();
4632
4633   if (actual_fsize == 0)
4634     /* do nothing.  */ ;
4635   else if (sparc_leaf_function_p)
4636     {
4637       if (actual_fsize <= 4096)
4638         emit_stack_pointer_decrement (GEN_INT (- actual_fsize));
4639       else if (actual_fsize <= 8192)
4640         {
4641           emit_stack_pointer_decrement (GEN_INT (-4096));
4642           emit_stack_pointer_decrement (GEN_INT (4096 - actual_fsize));
4643         }
4644       else
4645         {
4646           rtx reg = gen_rtx_REG (Pmode, 1);
4647           emit_move_insn (reg, GEN_INT (-actual_fsize));
4648           emit_stack_pointer_decrement (reg);
4649         }
4650     }
4651 }
4652
4653 /* Return true if it is appropriate to emit `return' instructions in the
4654    body of a function.  */
4655
4656 bool
4657 sparc_can_use_return_insn_p (void)
4658 {
4659   return sparc_prologue_data_valid_p
4660          && (actual_fsize == 0 || !sparc_leaf_function_p);
4661 }
4662   
4663 /* This function generates the assembly code for function exit.  */
4664   
4665 static void
4666 sparc_asm_function_epilogue (FILE *file, HOST_WIDE_INT size ATTRIBUTE_UNUSED)
4667 {
4668   /* If code does not drop into the epilogue, we have to still output
4669      a dummy nop for the sake of sane backtraces.  Otherwise, if the
4670      last two instructions of a function were "call foo; dslot;" this
4671      can make the return PC of foo (i.e. address of call instruction
4672      plus 8) point to the first instruction in the next function.  */
4673
4674   rtx insn, last_real_insn;
4675
4676   insn = get_last_insn ();
4677
4678   last_real_insn = prev_real_insn (insn);
4679   if (last_real_insn
4680       && GET_CODE (last_real_insn) == INSN
4681       && GET_CODE (PATTERN (last_real_insn)) == SEQUENCE)
4682     last_real_insn = XVECEXP (PATTERN (last_real_insn), 0, 0);
4683
4684   if (last_real_insn && GET_CODE (last_real_insn) == CALL_INSN)
4685     fputs("\tnop\n", file);
4686
4687   sparc_output_deferred_case_vectors ();
4688 }
4689   
4690 /* Output a 'restore' instruction.  */
4691  
4692 static void
4693 output_restore (rtx pat)
4694 {
4695   rtx operands[3];
4696
4697   if (! pat)
4698     {
4699       fputs ("\t restore\n", asm_out_file);
4700       return;
4701     }
4702
4703   if (GET_CODE (pat) != SET)
4704     abort ();
4705
4706   operands[0] = SET_DEST (pat);
4707   pat = SET_SRC (pat);
4708
4709   switch (GET_CODE (pat))
4710     {
4711       case PLUS:
4712         operands[1] = XEXP (pat, 0);
4713         operands[2] = XEXP (pat, 1);
4714         output_asm_insn (" restore %r1, %2, %Y0", operands);
4715         break;
4716       case LO_SUM:
4717         operands[1] = XEXP (pat, 0);
4718         operands[2] = XEXP (pat, 1);
4719         output_asm_insn (" restore %r1, %%lo(%a2), %Y0", operands);
4720         break;
4721       case ASHIFT:
4722         operands[1] = XEXP (pat, 0);
4723         if (XEXP (pat, 1) != const1_rtx)
4724           abort();
4725         output_asm_insn (" restore %r1, %r1, %Y0", operands);
4726         break;
4727       default:
4728         operands[1] = pat;
4729         output_asm_insn (" restore %%g0, %1, %Y0", operands);
4730         break;
4731     }
4732 }
4733   
4734 /* Output a return.  */
4735
4736 const char *
4737 output_return (rtx insn)
4738 {
4739   if (sparc_leaf_function_p)
4740     {
4741       /* This is a leaf function so we don't have to bother restoring the
4742          register window, which frees us from dealing with the convoluted
4743          semantics of restore/return.  We simply output the jump to the
4744          return address and the insn in the delay slot (if any).  */
4745
4746       if (current_function_calls_eh_return)
4747         abort ();
4748
4749       return "jmp\t%%o7+%)%#";
4750     }
4751   else
4752     {
4753       /* This is a regular function so we have to restore the register window.
4754          We may have a pending insn for the delay slot, which will be either
4755          combined with the 'restore' instruction or put in the delay slot of
4756          the 'return' instruction.  */
4757
4758       if (current_function_calls_eh_return)
4759         {
4760           /* If the function uses __builtin_eh_return, the eh_return
4761              machinery occupies the delay slot.  */
4762           if (final_sequence)
4763             abort ();
4764
4765           if (! flag_delayed_branch)
4766             fputs ("\tadd\t%fp, %g1, %fp\n", asm_out_file);
4767
4768           if (TARGET_V9)
4769             fputs ("\treturn\t%i7+8\n", asm_out_file);
4770           else
4771             fputs ("\trestore\n\tjmp\t%o7+8\n", asm_out_file);
4772
4773           if (flag_delayed_branch)
4774             fputs ("\t add\t%sp, %g1, %sp\n", asm_out_file);
4775           else
4776             fputs ("\t nop\n", asm_out_file);
4777         }
4778       else if (final_sequence)
4779         {
4780           rtx delay, pat;
4781
4782           delay = NEXT_INSN (insn);
4783           if (! delay)
4784             abort ();
4785
4786           pat = PATTERN (delay);
4787
4788           if (TARGET_V9 && ! epilogue_renumber (&pat, 1))
4789             {
4790               epilogue_renumber (&pat, 0);
4791               return "return\t%%i7+%)%#";
4792             }
4793           else
4794             {
4795               output_asm_insn ("jmp\t%%i7+%)", NULL);
4796               output_restore (pat);
4797               PATTERN (delay) = gen_blockage ();
4798               INSN_CODE (delay) = -1;
4799             }
4800         }
4801       else
4802         {
4803           /* The delay slot is empty.  */
4804           if (TARGET_V9)
4805             return "return\t%%i7+%)\n\t nop";
4806           else if (flag_delayed_branch)
4807             return "jmp\t%%i7+%)\n\t restore";
4808           else
4809             return "restore\n\tjmp\t%%o7+%)\n\t nop";
4810         }
4811     }
4812
4813   return "";
4814 }
4815
4816 /* Output a sibling call.  */
4817
4818 const char *
4819 output_sibcall (rtx insn, rtx call_operand)
4820 {
4821   rtx operands[1];
4822
4823   if (! flag_delayed_branch)
4824     abort();
4825
4826   operands[0] = call_operand;
4827
4828   if (sparc_leaf_function_p)
4829     {
4830       /* This is a leaf function so we don't have to bother restoring the
4831          register window.  We simply output the jump to the function and
4832          the insn in the delay slot (if any).  */
4833
4834       if (LEAF_SIBCALL_SLOT_RESERVED_P && final_sequence)
4835         abort();
4836
4837       if (final_sequence)
4838         output_asm_insn ("sethi\t%%hi(%a0), %%g1\n\tjmp\t%%g1 + %%lo(%a0)%#",
4839                          operands);
4840       else
4841         /* Use or with rs2 %%g0 instead of mov, so that as/ld can optimize
4842            it into branch if possible.  */
4843         output_asm_insn ("or\t%%o7, %%g0, %%g1\n\tcall\t%a0, 0\n\t or\t%%g1, %%g0, %%o7",
4844                          operands);
4845     }
4846   else
4847     {
4848       /* This is a regular function so we have to restore the register window.
4849          We may have a pending insn for the delay slot, which will be combined
4850          with the 'restore' instruction.  */
4851
4852       output_asm_insn ("call\t%a0, 0", operands);
4853
4854       if (final_sequence)
4855         {
4856           rtx delay = NEXT_INSN (insn);
4857           if (! delay)
4858             abort ();
4859
4860           output_restore (PATTERN (delay));
4861
4862           PATTERN (delay) = gen_blockage ();
4863           INSN_CODE (delay) = -1;
4864         }
4865       else
4866         output_restore (NULL_RTX);
4867     }
4868
4869   return "";
4870 }
4871 \f
4872 /* Functions for handling argument passing.
4873
4874    For 32-bit, the first 6 args are normally in registers and the rest are
4875    pushed.  Any arg that starts within the first 6 words is at least
4876    partially passed in a register unless its data type forbids.
4877
4878    For 64-bit, the argument registers are laid out as an array of 16 elements
4879    and arguments are added sequentially.  The first 6 int args and up to the
4880    first 16 fp args (depending on size) are passed in regs.
4881
4882    Slot    Stack   Integral   Float   Float in structure   Double   Long Double
4883    ----    -----   --------   -----   ------------------   ------   -----------
4884     15   [SP+248]              %f31       %f30,%f31         %d30
4885     14   [SP+240]              %f29       %f28,%f29         %d28       %q28
4886     13   [SP+232]              %f27       %f26,%f27         %d26
4887     12   [SP+224]              %f25       %f24,%f25         %d24       %q24
4888     11   [SP+216]              %f23       %f22,%f23         %d22
4889     10   [SP+208]              %f21       %f20,%f21         %d20       %q20
4890      9   [SP+200]              %f19       %f18,%f19         %d18
4891      8   [SP+192]              %f17       %f16,%f17         %d16       %q16
4892      7   [SP+184]              %f15       %f14,%f15         %d14
4893      6   [SP+176]              %f13       %f12,%f13         %d12       %q12
4894      5   [SP+168]     %o5      %f11       %f10,%f11         %d10
4895      4   [SP+160]     %o4       %f9        %f8,%f9           %d8        %q8
4896      3   [SP+152]     %o3       %f7        %f6,%f7           %d6
4897      2   [SP+144]     %o2       %f5        %f4,%f5           %d4        %q4
4898      1   [SP+136]     %o1       %f3        %f2,%f3           %d2
4899      0   [SP+128]     %o0       %f1        %f0,%f1           %d0        %q0
4900
4901    Here SP = %sp if -mno-stack-bias or %sp+stack_bias otherwise.
4902
4903    Integral arguments are always passed as 64-bit quantities appropriately
4904    extended.
4905
4906    Passing of floating point values is handled as follows.
4907    If a prototype is in scope:
4908      If the value is in a named argument (i.e. not a stdarg function or a
4909      value not part of the `...') then the value is passed in the appropriate
4910      fp reg.
4911      If the value is part of the `...' and is passed in one of the first 6
4912      slots then the value is passed in the appropriate int reg.
4913      If the value is part of the `...' and is not passed in one of the first 6
4914      slots then the value is passed in memory.
4915    If a prototype is not in scope:
4916      If the value is one of the first 6 arguments the value is passed in the
4917      appropriate integer reg and the appropriate fp reg.
4918      If the value is not one of the first 6 arguments the value is passed in
4919      the appropriate fp reg and in memory.
4920
4921
4922    Summary of the calling conventions implemented by GCC on SPARC:
4923
4924    32-bit ABI:
4925                                 size      argument     return value
4926
4927       small integer              <4       int. reg.      int. reg.
4928       word                        4       int. reg.      int. reg.
4929       double word                 8       int. reg.      int. reg.
4930
4931       _Complex small integer     <8       int. reg.      int. reg.
4932       _Complex word               8       int. reg.      int. reg.
4933       _Complex double word       16        memory        int. reg.
4934
4935       vector integer            <=8       int. reg.       FP reg.
4936       vector integer             >8        memory         memory
4937
4938       float                       4       int. reg.       FP reg.
4939       double                      8       int. reg.       FP reg.
4940       long double                16        memory         memory
4941
4942       _Complex float              8        memory         FP reg.
4943       _Complex double            16        memory         FP reg.
4944       _Complex long double       32        memory         FP reg.
4945
4946       vector float              any        memory         memory
4947
4948       aggregate                 any        memory         memory
4949
4950
4951
4952     64-bit ABI:
4953                                 size      argument     return value
4954
4955       small integer              <8       int. reg.      int. reg.
4956       word                        8       int. reg.      int. reg.
4957       double word                16       int. reg.      int. reg.
4958
4959       _Complex small integer    <16       int. reg.      int. reg.
4960       _Complex word              16       int. reg.      int. reg.
4961       _Complex double word       32        memory        int. reg.
4962
4963       vector integer           <=16        FP reg.        FP reg.
4964       vector integer       16<s<=32        memory         FP reg.
4965       vector integer            >32        memory         memory
4966
4967       float                       4        FP reg.        FP reg.
4968       double                      8        FP reg.        FP reg.
4969       long double                16        FP reg.        FP reg.
4970
4971       _Complex float              8        FP reg.        FP reg.
4972       _Complex double            16        FP reg.        FP reg.
4973       _Complex long double       32        memory         FP reg.
4974
4975       vector float             <=16        FP reg.        FP reg.
4976       vector float         16<s<=32        memory         FP reg.
4977       vector float              >32        memory         memory
4978
4979       aggregate                <=16         reg.           reg.
4980       aggregate            16<s<=32        memory          reg.
4981       aggregate                 >32        memory         memory
4982
4983
4984
4985 Note #1: complex floating-point types follow the extended SPARC ABIs as
4986 implemented by the Sun compiler.
4987
4988 Note #2: integral vector types follow the scalar floating-point types
4989 conventions to match what is implemented by the Sun VIS SDK.
4990
4991 Note #3: floating-point vector types follow the aggregate types 
4992 conventions.  */
4993
4994
4995 /* Maximum number of int regs for args.  */
4996 #define SPARC_INT_ARG_MAX 6
4997 /* Maximum number of fp regs for args.  */
4998 #define SPARC_FP_ARG_MAX 16
4999
5000 #define ROUND_ADVANCE(SIZE) (((SIZE) + UNITS_PER_WORD - 1) / UNITS_PER_WORD)
5001
5002 /* Handle the INIT_CUMULATIVE_ARGS macro.
5003    Initialize a variable CUM of type CUMULATIVE_ARGS
5004    for a call to a function whose data type is FNTYPE.
5005    For a library call, FNTYPE is 0.  */
5006
5007 void
5008 init_cumulative_args (struct sparc_args *cum, tree fntype,
5009                       rtx libname ATTRIBUTE_UNUSED,
5010                       tree fndecl ATTRIBUTE_UNUSED)
5011 {
5012   cum->words = 0;
5013   cum->prototype_p = fntype && TYPE_ARG_TYPES (fntype);
5014   cum->libcall_p = fntype == 0;
5015 }
5016
5017 /* Handle the TARGET_PROMOTE_PROTOTYPES target hook.
5018    When a prototype says `char' or `short', really pass an `int'.  */
5019
5020 static bool
5021 sparc_promote_prototypes (tree fntype ATTRIBUTE_UNUSED)
5022 {
5023   return TARGET_ARCH32 ? true : false;
5024 }
5025
5026 /* Handle the TARGET_STRICT_ARGUMENT_NAMING target hook.  */
5027
5028 static bool
5029 sparc_strict_argument_naming (CUMULATIVE_ARGS *ca ATTRIBUTE_UNUSED)
5030 {
5031   return TARGET_ARCH64 ? true : false;
5032 }
5033
5034 /* Scan the record type TYPE and return the following predicates:
5035     - INTREGS_P: the record contains at least one field or sub-field
5036       that is eligible for promotion in integer registers.
5037     - FP_REGS_P: the record contains at least one field or sub-field
5038       that is eligible for promotion in floating-point registers.
5039     - PACKED_P: the record contains at least one field that is packed.
5040
5041    Sub-fields are not taken into account for the PACKED_P predicate.  */
5042
5043 static void
5044 scan_record_type (tree type, int *intregs_p, int *fpregs_p, int *packed_p)
5045 {
5046   tree field;
5047
5048   for (field = TYPE_FIELDS (type); field; field = TREE_CHAIN (field))
5049     {
5050       if (TREE_CODE (field) == FIELD_DECL)
5051         {
5052           if (TREE_CODE (TREE_TYPE (field)) == RECORD_TYPE)
5053             scan_record_type (TREE_TYPE (field), intregs_p, fpregs_p, 0);
5054           else if ((FLOAT_TYPE_P (TREE_TYPE (field))
5055                    || TREE_CODE (TREE_TYPE (field)) == VECTOR_TYPE)
5056                   && TARGET_FPU)
5057             *fpregs_p = 1;
5058           else
5059             *intregs_p = 1;
5060
5061           if (packed_p && DECL_PACKED (field))
5062             *packed_p = 1;
5063         }
5064     }
5065 }
5066
5067 /* Compute the slot number to pass an argument in.
5068    Return the slot number or -1 if passing on the stack.
5069
5070    CUM is a variable of type CUMULATIVE_ARGS which gives info about
5071     the preceding args and about the function being called.
5072    MODE is the argument's machine mode.
5073    TYPE is the data type of the argument (as a tree).
5074     This is null for libcalls where that information may
5075     not be available.
5076    NAMED is nonzero if this argument is a named parameter
5077     (otherwise it is an extra parameter matching an ellipsis).
5078    INCOMING_P is zero for FUNCTION_ARG, nonzero for FUNCTION_INCOMING_ARG.
5079    *PREGNO records the register number to use if scalar type.
5080    *PPADDING records the amount of padding needed in words.  */
5081
5082 static int
5083 function_arg_slotno (const struct sparc_args *cum, enum machine_mode mode,
5084                      tree type, int named, int incoming_p,
5085                      int *pregno, int *ppadding)
5086 {
5087   int regbase = (incoming_p
5088                  ? SPARC_INCOMING_INT_ARG_FIRST
5089                  : SPARC_OUTGOING_INT_ARG_FIRST);
5090   int slotno = cum->words;
5091   enum mode_class mclass;
5092   int regno;
5093
5094   *ppadding = 0;
5095
5096   if (type && TREE_ADDRESSABLE (type))
5097     return -1;
5098
5099   if (TARGET_ARCH32
5100       && mode == BLKmode
5101       && type
5102       && TYPE_ALIGN (type) % PARM_BOUNDARY != 0)
5103     return -1;
5104
5105   /* For SPARC64, objects requiring 16-byte alignment get it.  */
5106   if (TARGET_ARCH64
5107       && GET_MODE_ALIGNMENT (mode) >= 2 * BITS_PER_WORD
5108       && (slotno & 1) != 0)
5109     slotno++, *ppadding = 1;
5110
5111   mclass = GET_MODE_CLASS (mode);
5112   if (type && TREE_CODE (type) == VECTOR_TYPE)
5113     {
5114       /* Vector types deserve special treatment because they are
5115          polymorphic wrt their mode, depending upon whether VIS
5116          instructions are enabled.  */
5117       if (TREE_CODE (TREE_TYPE (type)) == REAL_TYPE)
5118         {
5119           /* The SPARC port defines no floating-point vector modes.  */
5120           if (mode != BLKmode)
5121             abort ();
5122         }
5123       else
5124         {
5125           /* Integral vector types should either have a vector
5126              mode or an integral mode, because we are guaranteed
5127              by pass_by_reference that their size is not greater
5128              than 16 bytes and TImode is 16-byte wide.  */
5129           if (mode == BLKmode)
5130             abort ();
5131
5132           /* Vector integers are handled like floats according to
5133              the Sun VIS SDK.  */
5134           mclass = MODE_FLOAT;
5135         }
5136     }
5137
5138   switch (mclass)
5139     {
5140     case MODE_FLOAT:
5141     case MODE_COMPLEX_FLOAT:
5142       if (TARGET_ARCH64 && TARGET_FPU && named)
5143         {
5144           if (slotno >= SPARC_FP_ARG_MAX)
5145             return -1;
5146           regno = SPARC_FP_ARG_FIRST + slotno * 2;
5147           /* Arguments filling only one single FP register are
5148              right-justified in the outer double FP register.  */
5149           if (GET_MODE_SIZE (mode) <= 4)
5150             regno++;
5151           break;
5152         }
5153       /* fallthrough */
5154
5155     case MODE_INT:
5156     case MODE_COMPLEX_INT:
5157       if (slotno >= SPARC_INT_ARG_MAX)
5158         return -1;
5159       regno = regbase + slotno;
5160       break;
5161
5162     case MODE_RANDOM:
5163       if (mode == VOIDmode)
5164         /* MODE is VOIDmode when generating the actual call.  */
5165         return -1;
5166
5167       if (mode != BLKmode)
5168         abort ();
5169
5170       /* For SPARC64, objects requiring 16-byte alignment get it.  */
5171       if (TARGET_ARCH64
5172           && type
5173           && TYPE_ALIGN (type) >= 2 * BITS_PER_WORD
5174           && (slotno & 1) != 0)
5175         slotno++, *ppadding = 1;
5176
5177       if (TARGET_ARCH32 || !type || (TREE_CODE (type) == UNION_TYPE))
5178         {
5179           if (slotno >= SPARC_INT_ARG_MAX)
5180             return -1;
5181           regno = regbase + slotno;
5182         }
5183       else  /* TARGET_ARCH64 && type */
5184         {
5185           int intregs_p = 0, fpregs_p = 0, packed_p = 0;
5186
5187           /* First see what kinds of registers we would need.  */
5188           if (TREE_CODE (type) == VECTOR_TYPE)
5189             fpregs_p = 1;
5190           else
5191             scan_record_type (type, &intregs_p, &fpregs_p, &packed_p);
5192
5193           /* The ABI obviously doesn't specify how packed structures
5194              are passed.  These are defined to be passed in int regs
5195              if possible, otherwise memory.  */
5196           if (packed_p || !named)
5197             fpregs_p = 0, intregs_p = 1;
5198
5199           /* If all arg slots are filled, then must pass on stack.  */
5200           if (fpregs_p && slotno >= SPARC_FP_ARG_MAX)
5201             return -1;
5202
5203           /* If there are only int args and all int arg slots are filled,
5204              then must pass on stack.  */
5205           if (!fpregs_p && intregs_p && slotno >= SPARC_INT_ARG_MAX)
5206             return -1;
5207
5208           /* Note that even if all int arg slots are filled, fp members may
5209              still be passed in regs if such regs are available.
5210              *PREGNO isn't set because there may be more than one, it's up
5211              to the caller to compute them.  */
5212           return slotno;
5213         }
5214       break;
5215
5216     default :
5217       abort ();
5218     }
5219
5220   *pregno = regno;
5221   return slotno;
5222 }
5223
5224 /* Handle recursive register counting for structure field layout.  */
5225
5226 struct function_arg_record_value_parms
5227 {
5228   rtx ret;              /* return expression being built.  */
5229   int slotno;           /* slot number of the argument.  */
5230   int named;            /* whether the argument is named.  */
5231   int regbase;          /* regno of the base register.  */
5232   int stack;            /* 1 if part of the argument is on the stack.  */
5233   int intoffset;        /* offset of the first pending integer field.  */
5234   unsigned int nregs;   /* number of words passed in registers.  */
5235 };
5236
5237 static void function_arg_record_value_3
5238  (HOST_WIDE_INT, struct function_arg_record_value_parms *);
5239 static void function_arg_record_value_2
5240  (tree, HOST_WIDE_INT, struct function_arg_record_value_parms *, bool);
5241 static void function_arg_record_value_1
5242  (tree, HOST_WIDE_INT, struct function_arg_record_value_parms *, bool);
5243 static rtx function_arg_record_value (tree, enum machine_mode, int, int, int);
5244 static rtx function_arg_union_value (int, enum machine_mode, int, int);
5245
5246 /* A subroutine of function_arg_record_value.  Traverse the structure
5247    recursively and determine how many registers will be required.  */
5248
5249 static void
5250 function_arg_record_value_1 (tree type, HOST_WIDE_INT startbitpos,
5251                              struct function_arg_record_value_parms *parms,
5252                              bool packed_p)
5253 {
5254   tree field;
5255
5256   /* We need to compute how many registers are needed so we can
5257      allocate the PARALLEL but before we can do that we need to know
5258      whether there are any packed fields.  The ABI obviously doesn't
5259      specify how structures are passed in this case, so they are
5260      defined to be passed in int regs if possible, otherwise memory,
5261      regardless of whether there are fp values present.  */
5262
5263   if (! packed_p)
5264     for (field = TYPE_FIELDS (type); field; field = TREE_CHAIN (field))
5265       {
5266         if (TREE_CODE (field) == FIELD_DECL && DECL_PACKED (field))
5267           {
5268             packed_p = true;
5269             break;
5270           }
5271       }
5272
5273   /* Compute how many registers we need.  */
5274   for (field = TYPE_FIELDS (type); field; field = TREE_CHAIN (field))
5275     {
5276       if (TREE_CODE (field) == FIELD_DECL)
5277         {
5278           HOST_WIDE_INT bitpos = startbitpos;
5279
5280           if (DECL_SIZE (field) != 0)
5281             {
5282               if (integer_zerop (DECL_SIZE (field)))
5283                 continue;
5284
5285               if (host_integerp (bit_position (field), 1))
5286                 bitpos += int_bit_position (field);
5287             }
5288
5289           /* ??? FIXME: else assume zero offset.  */
5290
5291           if (TREE_CODE (TREE_TYPE (field)) == RECORD_TYPE)
5292             function_arg_record_value_1 (TREE_TYPE (field),
5293                                          bitpos,
5294                                          parms,
5295                                          packed_p);
5296           else if ((FLOAT_TYPE_P (TREE_TYPE (field))
5297                     || TREE_CODE (TREE_TYPE (field)) == VECTOR_TYPE)
5298                    && TARGET_FPU
5299                    && parms->named
5300                    && ! packed_p)
5301             {
5302               if (parms->intoffset != -1)
5303                 {
5304                   unsigned int startbit, endbit;
5305                   int intslots, this_slotno;
5306
5307                   startbit = parms->intoffset & -BITS_PER_WORD;
5308                   endbit   = (bitpos + BITS_PER_WORD - 1) & -BITS_PER_WORD;
5309
5310                   intslots = (endbit - startbit) / BITS_PER_WORD;
5311                   this_slotno = parms->slotno + parms->intoffset
5312                     / BITS_PER_WORD;
5313
5314                   if (intslots > 0 && intslots > SPARC_INT_ARG_MAX - this_slotno)
5315                     {
5316                       intslots = MAX (0, SPARC_INT_ARG_MAX - this_slotno);
5317                       /* We need to pass this field on the stack.  */
5318                       parms->stack = 1;
5319                     }
5320
5321                   parms->nregs += intslots;
5322                   parms->intoffset = -1;
5323                 }
5324
5325               /* There's no need to check this_slotno < SPARC_FP_ARG MAX.
5326                  If it wasn't true we wouldn't be here.  */
5327               if (TREE_CODE (TREE_TYPE (field)) == VECTOR_TYPE
5328                   && DECL_MODE (field) == BLKmode)
5329                 parms->nregs += TYPE_VECTOR_SUBPARTS (TREE_TYPE (field));
5330               else if (TREE_CODE (TREE_TYPE (field)) == COMPLEX_TYPE)
5331                 parms->nregs += 2;
5332               else
5333                 parms->nregs += 1;
5334             }
5335           else
5336             {
5337               if (parms->intoffset == -1)
5338                 parms->intoffset = bitpos;
5339             }
5340         }
5341     }
5342 }
5343
5344 /* A subroutine of function_arg_record_value.  Assign the bits of the
5345    structure between parms->intoffset and bitpos to integer registers.  */
5346
5347 static void 
5348 function_arg_record_value_3 (HOST_WIDE_INT bitpos,
5349                              struct function_arg_record_value_parms *parms)
5350 {
5351   enum machine_mode mode;
5352   unsigned int regno;
5353   unsigned int startbit, endbit;
5354   int this_slotno, intslots, intoffset;
5355   rtx reg;
5356
5357   if (parms->intoffset == -1)
5358     return;
5359
5360   intoffset = parms->intoffset;
5361   parms->intoffset = -1;
5362
5363   startbit = intoffset & -BITS_PER_WORD;
5364   endbit = (bitpos + BITS_PER_WORD - 1) & -BITS_PER_WORD;
5365   intslots = (endbit - startbit) / BITS_PER_WORD;
5366   this_slotno = parms->slotno + intoffset / BITS_PER_WORD;
5367
5368   intslots = MIN (intslots, SPARC_INT_ARG_MAX - this_slotno);
5369   if (intslots <= 0)
5370     return;
5371
5372   /* If this is the trailing part of a word, only load that much into
5373      the register.  Otherwise load the whole register.  Note that in
5374      the latter case we may pick up unwanted bits.  It's not a problem
5375      at the moment but may wish to revisit.  */
5376
5377   if (intoffset % BITS_PER_WORD != 0)
5378     mode = smallest_mode_for_size (BITS_PER_WORD - intoffset % BITS_PER_WORD,
5379                                    MODE_INT);
5380   else
5381     mode = word_mode;
5382
5383   intoffset /= BITS_PER_UNIT;
5384   do
5385     {
5386       regno = parms->regbase + this_slotno;
5387       reg = gen_rtx_REG (mode, regno);
5388       XVECEXP (parms->ret, 0, parms->stack + parms->nregs)
5389         = gen_rtx_EXPR_LIST (VOIDmode, reg, GEN_INT (intoffset));
5390
5391       this_slotno += 1;
5392       intoffset = (intoffset | (UNITS_PER_WORD-1)) + 1;
5393       mode = word_mode;
5394       parms->nregs += 1;
5395       intslots -= 1;
5396     }
5397   while (intslots > 0);
5398 }
5399
5400 /* A subroutine of function_arg_record_value.  Traverse the structure
5401    recursively and assign bits to floating point registers.  Track which
5402    bits in between need integer registers; invoke function_arg_record_value_3
5403    to make that happen.  */
5404
5405 static void
5406 function_arg_record_value_2 (tree type, HOST_WIDE_INT startbitpos,
5407                              struct function_arg_record_value_parms *parms,
5408                              bool packed_p)
5409 {
5410   tree field;
5411
5412   if (! packed_p)
5413     for (field = TYPE_FIELDS (type); field; field = TREE_CHAIN (field))
5414       {
5415         if (TREE_CODE (field) == FIELD_DECL && DECL_PACKED (field))
5416           {
5417             packed_p = true;
5418             break;
5419           }
5420       }
5421
5422   for (field = TYPE_FIELDS (type); field; field = TREE_CHAIN (field))
5423     {
5424       if (TREE_CODE (field) == FIELD_DECL)
5425         {
5426           HOST_WIDE_INT bitpos = startbitpos;
5427
5428           if (DECL_SIZE (field) != 0)
5429             {
5430               if (integer_zerop (DECL_SIZE (field)))
5431                 continue;
5432
5433               if (host_integerp (bit_position (field), 1))
5434                 bitpos += int_bit_position (field);
5435             }
5436
5437           /* ??? FIXME: else assume zero offset.  */
5438
5439           if (TREE_CODE (TREE_TYPE (field)) == RECORD_TYPE)
5440             function_arg_record_value_2 (TREE_TYPE (field),
5441                                          bitpos,
5442                                          parms,
5443                                          packed_p);
5444           else if ((FLOAT_TYPE_P (TREE_TYPE (field))
5445                     || TREE_CODE (TREE_TYPE (field)) == VECTOR_TYPE)
5446                    && TARGET_FPU
5447                    && parms->named
5448                    && ! packed_p)
5449             {
5450               int this_slotno = parms->slotno + bitpos / BITS_PER_WORD;
5451               int regno, nregs, pos;
5452               enum machine_mode mode = DECL_MODE (field);
5453               rtx reg;
5454
5455               function_arg_record_value_3 (bitpos, parms);
5456
5457               if (TREE_CODE (TREE_TYPE (field)) == VECTOR_TYPE
5458                   && mode == BLKmode)
5459                 {
5460                   mode = TYPE_MODE (TREE_TYPE (TREE_TYPE (field)));
5461                   nregs = TYPE_VECTOR_SUBPARTS (TREE_TYPE (field));
5462                 }
5463               else if (TREE_CODE (TREE_TYPE (field)) == COMPLEX_TYPE)
5464                 {
5465                   mode = TYPE_MODE (TREE_TYPE (TREE_TYPE (field)));
5466                   nregs = 2;
5467                 }
5468               else
5469                 nregs = 1;
5470
5471               regno = SPARC_FP_ARG_FIRST + this_slotno * 2;
5472               if (GET_MODE_SIZE (mode) <= 4 && (bitpos & 32) != 0)
5473                 regno++;
5474               reg = gen_rtx_REG (mode, regno);
5475               pos = bitpos / BITS_PER_UNIT;
5476               XVECEXP (parms->ret, 0, parms->stack + parms->nregs)
5477                 = gen_rtx_EXPR_LIST (VOIDmode, reg, GEN_INT (pos));
5478               parms->nregs += 1;
5479               while (--nregs > 0)
5480                 {
5481                   regno += GET_MODE_SIZE (mode) / 4;
5482                   reg = gen_rtx_REG (mode, regno);
5483                   pos += GET_MODE_SIZE (mode);
5484                   XVECEXP (parms->ret, 0, parms->stack + parms->nregs)
5485                     = gen_rtx_EXPR_LIST (VOIDmode, reg, GEN_INT (pos));
5486                   parms->nregs += 1;
5487                 }
5488             }
5489           else
5490             {
5491               if (parms->intoffset == -1)
5492                 parms->intoffset = bitpos;
5493             }
5494         }
5495     }
5496 }
5497
5498 /* Used by function_arg and function_value to implement the complex
5499    conventions of the 64-bit ABI for passing and returning structures.
5500    Return an expression valid as a return value for the two macros
5501    FUNCTION_ARG and FUNCTION_VALUE.
5502
5503    TYPE is the data type of the argument (as a tree).
5504     This is null for libcalls where that information may
5505     not be available.
5506    MODE is the argument's machine mode.
5507    SLOTNO is the index number of the argument's slot in the parameter array.
5508    NAMED is nonzero if this argument is a named parameter
5509     (otherwise it is an extra parameter matching an ellipsis).
5510    REGBASE is the regno of the base register for the parameter array.  */
5511    
5512 static rtx
5513 function_arg_record_value (tree type, enum machine_mode mode,
5514                            int slotno, int named, int regbase)
5515 {
5516   HOST_WIDE_INT typesize = int_size_in_bytes (type);
5517   struct function_arg_record_value_parms parms;
5518   unsigned int nregs;
5519
5520   parms.ret = NULL_RTX;
5521   parms.slotno = slotno;
5522   parms.named = named;
5523   parms.regbase = regbase;
5524   parms.stack = 0;
5525
5526   /* Compute how many registers we need.  */
5527   parms.nregs = 0;
5528   parms.intoffset = 0;
5529   function_arg_record_value_1 (type, 0, &parms, false);
5530
5531   /* Take into account pending integer fields.  */
5532   if (parms.intoffset != -1)
5533     {
5534       unsigned int startbit, endbit;
5535       int intslots, this_slotno;
5536
5537       startbit = parms.intoffset & -BITS_PER_WORD;
5538       endbit = (typesize*BITS_PER_UNIT + BITS_PER_WORD - 1) & -BITS_PER_WORD;
5539       intslots = (endbit - startbit) / BITS_PER_WORD;
5540       this_slotno = slotno + parms.intoffset / BITS_PER_WORD;
5541
5542       if (intslots > 0 && intslots > SPARC_INT_ARG_MAX - this_slotno)
5543         {
5544           intslots = MAX (0, SPARC_INT_ARG_MAX - this_slotno);
5545           /* We need to pass this field on the stack.  */
5546           parms.stack = 1;
5547         }
5548
5549       parms.nregs += intslots;
5550     }
5551   nregs = parms.nregs;
5552
5553   /* Allocate the vector and handle some annoying special cases.  */
5554   if (nregs == 0)
5555     {
5556       /* ??? Empty structure has no value?  Duh?  */
5557       if (typesize <= 0)
5558         {
5559           /* Though there's nothing really to store, return a word register
5560              anyway so the rest of gcc doesn't go nuts.  Returning a PARALLEL
5561              leads to breakage due to the fact that there are zero bytes to
5562              load.  */
5563           return gen_rtx_REG (mode, regbase);
5564         }
5565       else
5566         {
5567           /* ??? C++ has structures with no fields, and yet a size.  Give up
5568              for now and pass everything back in integer registers.  */
5569           nregs = (typesize + UNITS_PER_WORD - 1) / UNITS_PER_WORD;
5570         }
5571       if (nregs + slotno > SPARC_INT_ARG_MAX)
5572         nregs = SPARC_INT_ARG_MAX - slotno;
5573     }
5574   if (nregs == 0)
5575     abort ();
5576
5577   parms.ret = gen_rtx_PARALLEL (mode, rtvec_alloc (parms.stack + nregs));
5578
5579   /* If at least one field must be passed on the stack, generate
5580      (parallel [(expr_list (nil) ...) ...]) so that all fields will
5581      also be passed on the stack.  We can't do much better because the
5582      semantics of FUNCTION_ARG_PARTIAL_NREGS doesn't handle the case
5583      of structures for which the fields passed exclusively in registers
5584      are not at the beginning of the structure.  */
5585   if (parms.stack)
5586     XVECEXP (parms.ret, 0, 0)
5587       = gen_rtx_EXPR_LIST (VOIDmode, NULL_RTX, const0_rtx);
5588
5589   /* Fill in the entries.  */
5590   parms.nregs = 0;
5591   parms.intoffset = 0;
5592   function_arg_record_value_2 (type, 0, &parms, false);
5593   function_arg_record_value_3 (typesize * BITS_PER_UNIT, &parms);
5594
5595   if (parms.nregs != nregs)
5596     abort ();
5597
5598   return parms.ret;
5599 }
5600
5601 /* Used by function_arg and function_value to implement the conventions
5602    of the 64-bit ABI for passing and returning unions.
5603    Return an expression valid as a return value for the two macros
5604    FUNCTION_ARG and FUNCTION_VALUE.
5605
5606    SIZE is the size in bytes of the union.
5607    MODE is the argument's machine mode.
5608    REGNO is the hard register the union will be passed in.  */
5609
5610 static rtx
5611 function_arg_union_value (int size, enum machine_mode mode, int slotno,
5612                           int regno)
5613 {
5614   int nwords = ROUND_ADVANCE (size), i;
5615   rtx regs;
5616
5617   /* See comment in previous function for empty structures.  */
5618   if (nwords == 0)
5619     return gen_rtx_REG (mode, regno);
5620
5621   if (slotno == SPARC_INT_ARG_MAX - 1)
5622     nwords = 1;
5623
5624   regs = gen_rtx_PARALLEL (mode, rtvec_alloc (nwords));
5625
5626   for (i = 0; i < nwords; i++)
5627     {
5628       /* Unions are passed left-justified.  */
5629       XVECEXP (regs, 0, i)
5630         = gen_rtx_EXPR_LIST (VOIDmode,
5631                              gen_rtx_REG (word_mode, regno),
5632                              GEN_INT (UNITS_PER_WORD * i));
5633       regno++;
5634     }
5635
5636   return regs;
5637 }
5638
5639 /* Used by function_arg and function_value to implement the conventions
5640    for passing and returning large (BLKmode) vectors.
5641    Return an expression valid as a return value for the two macros
5642    FUNCTION_ARG and FUNCTION_VALUE.
5643
5644    SIZE is the size in bytes of the vector.
5645    BASE_MODE is the argument's base machine mode.
5646    REGNO is the FP hard register the vector will be passed in.  */
5647
5648 static rtx
5649 function_arg_vector_value (int size, enum machine_mode base_mode, int regno)
5650 {
5651   unsigned short base_mode_size = GET_MODE_SIZE (base_mode);
5652   int nregs = size / base_mode_size, i;
5653   rtx regs;
5654
5655   regs = gen_rtx_PARALLEL (BLKmode, rtvec_alloc (nregs));
5656
5657   for (i = 0; i < nregs; i++)
5658     {
5659       XVECEXP (regs, 0, i)
5660         = gen_rtx_EXPR_LIST (VOIDmode,
5661                              gen_rtx_REG (base_mode, regno),
5662                              GEN_INT (base_mode_size * i));
5663       regno += base_mode_size / 4;
5664     }
5665
5666   return regs;
5667 }
5668
5669 /* Handle the FUNCTION_ARG macro.
5670    Determine where to put an argument to a function.
5671    Value is zero to push the argument on the stack,
5672    or a hard register in which to store the argument.
5673
5674    CUM is a variable of type CUMULATIVE_ARGS which gives info about
5675     the preceding args and about the function being called.
5676    MODE is the argument's machine mode.
5677    TYPE is the data type of the argument (as a tree).
5678     This is null for libcalls where that information may
5679     not be available.
5680    NAMED is nonzero if this argument is a named parameter
5681     (otherwise it is an extra parameter matching an ellipsis).
5682    INCOMING_P is zero for FUNCTION_ARG, nonzero for FUNCTION_INCOMING_ARG.  */
5683
5684 rtx
5685 function_arg (const struct sparc_args *cum, enum machine_mode mode,
5686               tree type, int named, int incoming_p)
5687 {
5688   int regbase = (incoming_p
5689                  ? SPARC_INCOMING_INT_ARG_FIRST
5690                  : SPARC_OUTGOING_INT_ARG_FIRST);
5691   int slotno, regno, padding;
5692   enum mode_class mclass = GET_MODE_CLASS (mode);
5693   rtx reg;
5694
5695   slotno = function_arg_slotno (cum, mode, type, named, incoming_p,
5696                                 &regno, &padding);
5697
5698   if (slotno == -1)
5699     return 0;
5700
5701   if (TARGET_ARCH32)
5702     {
5703       reg = gen_rtx_REG (mode, regno);
5704       return reg;
5705     }
5706     
5707   if (type && TREE_CODE (type) == RECORD_TYPE)
5708     {
5709       /* Structures up to 16 bytes in size are passed in arg slots on the
5710          stack and are promoted to registers where possible.  */
5711
5712       if (int_size_in_bytes (type) > 16)
5713         abort (); /* shouldn't get here */
5714
5715       return function_arg_record_value (type, mode, slotno, named, regbase);
5716     }
5717   else if (type && TREE_CODE (type) == UNION_TYPE)
5718     {
5719       HOST_WIDE_INT size = int_size_in_bytes (type);
5720
5721       if (size > 16)
5722         abort (); /* shouldn't get here */
5723
5724       return function_arg_union_value (size, mode, slotno, regno);
5725     }
5726   else if (type && TREE_CODE (type) == VECTOR_TYPE)
5727     {
5728       /* Vector types deserve special treatment because they are
5729          polymorphic wrt their mode, depending upon whether VIS
5730          instructions are enabled.  */
5731       HOST_WIDE_INT size = int_size_in_bytes (type);
5732
5733       if (size > 16)
5734         abort (); /* shouldn't get here */
5735
5736       if (mode == BLKmode)
5737         return function_arg_vector_value (size,
5738                                           TYPE_MODE (TREE_TYPE (type)),
5739                                           SPARC_FP_ARG_FIRST + 2*slotno);
5740       else
5741         mclass = MODE_FLOAT;
5742     }
5743
5744   /* v9 fp args in reg slots beyond the int reg slots get passed in regs
5745      but also have the slot allocated for them.
5746      If no prototype is in scope fp values in register slots get passed
5747      in two places, either fp regs and int regs or fp regs and memory.  */
5748   if ((mclass == MODE_FLOAT || mclass == MODE_COMPLEX_FLOAT)
5749       && SPARC_FP_REG_P (regno))
5750     {
5751       reg = gen_rtx_REG (mode, regno);
5752       if (cum->prototype_p || cum->libcall_p)
5753         {
5754           /* "* 2" because fp reg numbers are recorded in 4 byte
5755              quantities.  */
5756 #if 0
5757           /* ??? This will cause the value to be passed in the fp reg and
5758              in the stack.  When a prototype exists we want to pass the
5759              value in the reg but reserve space on the stack.  That's an
5760              optimization, and is deferred [for a bit].  */
5761           if ((regno - SPARC_FP_ARG_FIRST) >= SPARC_INT_ARG_MAX * 2)
5762             return gen_rtx_PARALLEL (mode,
5763                             gen_rtvec (2,
5764                                        gen_rtx_EXPR_LIST (VOIDmode,
5765                                                 NULL_RTX, const0_rtx),
5766                                        gen_rtx_EXPR_LIST (VOIDmode,
5767                                                 reg, const0_rtx)));
5768           else
5769 #else
5770           /* ??? It seems that passing back a register even when past
5771              the area declared by REG_PARM_STACK_SPACE will allocate
5772              space appropriately, and will not copy the data onto the
5773              stack, exactly as we desire.
5774
5775              This is due to locate_and_pad_parm being called in
5776              expand_call whenever reg_parm_stack_space > 0, which
5777              while beneficial to our example here, would seem to be
5778              in error from what had been intended.  Ho hum...  -- r~ */
5779 #endif
5780             return reg;
5781         }
5782       else
5783         {
5784           rtx v0, v1;
5785
5786           if ((regno - SPARC_FP_ARG_FIRST) < SPARC_INT_ARG_MAX * 2)
5787             {
5788               int intreg;
5789
5790               /* On incoming, we don't need to know that the value
5791                  is passed in %f0 and %i0, and it confuses other parts
5792                  causing needless spillage even on the simplest cases.  */
5793               if (incoming_p)
5794                 return reg;
5795
5796               intreg = (SPARC_OUTGOING_INT_ARG_FIRST
5797                         + (regno - SPARC_FP_ARG_FIRST) / 2);
5798
5799               v0 = gen_rtx_EXPR_LIST (VOIDmode, reg, const0_rtx);
5800               v1 = gen_rtx_EXPR_LIST (VOIDmode, gen_rtx_REG (mode, intreg),
5801                                       const0_rtx);
5802               return gen_rtx_PARALLEL (mode, gen_rtvec (2, v0, v1));
5803             }
5804           else
5805             {
5806               v0 = gen_rtx_EXPR_LIST (VOIDmode, NULL_RTX, const0_rtx);
5807               v1 = gen_rtx_EXPR_LIST (VOIDmode, reg, const0_rtx);
5808               return gen_rtx_PARALLEL (mode, gen_rtvec (2, v0, v1));
5809             }
5810         }
5811     }
5812   else
5813     {
5814       /* Scalar or complex int.  */
5815       reg = gen_rtx_REG (mode, regno);
5816     }
5817
5818   return reg;
5819 }
5820
5821 /* Handle the FUNCTION_ARG_PARTIAL_NREGS macro.
5822    For an arg passed partly in registers and partly in memory,
5823    this is the number of registers used.
5824    For args passed entirely in registers or entirely in memory, zero.
5825
5826    Any arg that starts in the first 6 regs but won't entirely fit in them
5827    needs partial registers on v8.  On v9, structures with integer
5828    values in arg slots 5,6 will be passed in %o5 and SP+176, and complex fp
5829    values that begin in the last fp reg [where "last fp reg" varies with the
5830    mode] will be split between that reg and memory.  */
5831
5832 int
5833 function_arg_partial_nregs (const struct sparc_args *cum,
5834                             enum machine_mode mode, tree type, int named)
5835 {
5836   int slotno, regno, padding;
5837
5838   /* We pass 0 for incoming_p here, it doesn't matter.  */
5839   slotno = function_arg_slotno (cum, mode, type, named, 0, &regno, &padding);
5840
5841   if (slotno == -1)
5842     return 0;
5843
5844   if (TARGET_ARCH32)
5845     {
5846       if ((slotno + (mode == BLKmode
5847                      ? ROUND_ADVANCE (int_size_in_bytes (type))
5848                      : ROUND_ADVANCE (GET_MODE_SIZE (mode))))
5849           > SPARC_INT_ARG_MAX)
5850         return SPARC_INT_ARG_MAX - slotno;
5851     }
5852   else
5853     {
5854       /* We are guaranteed by pass_by_reference that the size of the
5855          argument is not greater than 16 bytes, so we only need to
5856          return 1 if the argument is partially passed in registers.  */
5857
5858       if (type && AGGREGATE_TYPE_P (type))
5859         {
5860           int size = int_size_in_bytes (type);
5861
5862           if (size > UNITS_PER_WORD
5863               && slotno == SPARC_INT_ARG_MAX - 1)
5864             return 1;
5865         }
5866       else if (GET_MODE_CLASS (mode) == MODE_COMPLEX_INT
5867                || (GET_MODE_CLASS (mode) == MODE_COMPLEX_FLOAT
5868                    && ! (TARGET_FPU && named)))
5869         {
5870           /* The complex types are passed as packed types.  */
5871           if (GET_MODE_SIZE (mode) > UNITS_PER_WORD
5872               && slotno == SPARC_INT_ARG_MAX - 1)
5873             return 1;
5874         }
5875       else if (GET_MODE_CLASS (mode) == MODE_COMPLEX_FLOAT)
5876         {
5877           if ((slotno + GET_MODE_SIZE (mode) / UNITS_PER_WORD)
5878               > SPARC_FP_ARG_MAX)
5879             return 1;
5880         }
5881     }
5882
5883   return 0;
5884 }
5885
5886 /* Handle the TARGET_PASS_BY_REFERENCE target hook.
5887    Specify whether to pass the argument by reference.  */
5888
5889 static bool
5890 sparc_pass_by_reference (CUMULATIVE_ARGS *cum ATTRIBUTE_UNUSED,
5891                          enum machine_mode mode, tree type,
5892                          bool named ATTRIBUTE_UNUSED)
5893 {
5894   if (TARGET_ARCH32)
5895     {
5896     /* Original SPARC 32-bit ABI says that structures and unions,
5897        and quad-precision floats are passed by reference.  For Pascal,
5898        also pass arrays by reference.  All other base types are passed
5899        in registers.
5900
5901        Extended ABI (as implemented by the Sun compiler) says that all
5902        complex floats are passed by reference.  Pass complex integers
5903        in registers up to 8 bytes.  More generally, enforce the 2-word
5904        cap for passing arguments in registers.
5905
5906        Vector ABI (as implemented by the Sun VIS SDK) says that vector
5907        integers are passed like floats of the same size, that is in
5908        registers up to 8 bytes.  Pass all vector floats by reference
5909        like structure and unions.  */
5910       return ((type && (AGGREGATE_TYPE_P (type) || VECTOR_FLOAT_TYPE_P (type)))
5911               || mode == SCmode
5912               /* Catch CDImode, TFmode, DCmode and TCmode.  */
5913               || GET_MODE_SIZE (mode) > 8
5914               || (type
5915                   && TREE_CODE (type) == VECTOR_TYPE
5916                   && (unsigned HOST_WIDE_INT) int_size_in_bytes (type) > 8));
5917     }
5918   else
5919     {
5920     /* Original SPARC 64-bit ABI says that structures and unions
5921        smaller than 16 bytes are passed in registers, as well as
5922        all other base types.  For Pascal, pass arrays by reference.
5923        
5924        Extended ABI (as implemented by the Sun compiler) says that
5925        complex floats are passed in registers up to 16 bytes.  Pass
5926        all complex integers in registers up to 16 bytes.  More generally,
5927        enforce the 2-word cap for passing arguments in registers.
5928
5929        Vector ABI (as implemented by the Sun VIS SDK) says that vector
5930        integers are passed like floats of the same size, that is in
5931        registers (up to 16 bytes).  Pass all vector floats like structure
5932        and unions.  */
5933       return ((type && TREE_CODE (type) == ARRAY_TYPE)
5934               || (type
5935                   && (AGGREGATE_TYPE_P (type) || TREE_CODE (type) == VECTOR_TYPE)
5936                   && (unsigned HOST_WIDE_INT) int_size_in_bytes (type) > 16)
5937               /* Catch CTImode and TCmode.  */
5938               || GET_MODE_SIZE (mode) > 16);
5939     }
5940 }
5941
5942 /* Handle the FUNCTION_ARG_ADVANCE macro.
5943    Update the data in CUM to advance over an argument
5944    of mode MODE and data type TYPE.
5945    TYPE is null for libcalls where that information may not be available.  */
5946
5947 void
5948 function_arg_advance (struct sparc_args *cum, enum machine_mode mode,
5949                       tree type, int named)
5950 {
5951   int slotno, regno, padding;
5952
5953   /* We pass 0 for incoming_p here, it doesn't matter.  */
5954   slotno = function_arg_slotno (cum, mode, type, named, 0, &regno, &padding);
5955
5956   /* If register required leading padding, add it.  */
5957   if (slotno != -1)
5958     cum->words += padding;
5959
5960   if (TARGET_ARCH32)
5961     {
5962       cum->words += (mode != BLKmode
5963                      ? ROUND_ADVANCE (GET_MODE_SIZE (mode))
5964                      : ROUND_ADVANCE (int_size_in_bytes (type)));
5965     }
5966   else
5967     {
5968       if (type && AGGREGATE_TYPE_P (type))
5969         {
5970           int size = int_size_in_bytes (type);
5971
5972           if (size <= 8)
5973             ++cum->words;
5974           else if (size <= 16)
5975             cum->words += 2;
5976           else /* passed by reference */
5977             ++cum->words;
5978         }
5979       else
5980         {
5981           cum->words += (mode != BLKmode
5982                          ? ROUND_ADVANCE (GET_MODE_SIZE (mode))
5983                          : ROUND_ADVANCE (int_size_in_bytes (type)));
5984         }
5985     }
5986 }
5987
5988 /* Handle the FUNCTION_ARG_PADDING macro.
5989    For the 64 bit ABI structs are always stored left shifted in their
5990    argument slot.  */
5991
5992 enum direction
5993 function_arg_padding (enum machine_mode mode, tree type)
5994 {
5995   if (TARGET_ARCH64 && type != 0 && AGGREGATE_TYPE_P (type))
5996     return upward;
5997
5998   /* Fall back to the default.  */
5999   return DEFAULT_FUNCTION_ARG_PADDING (mode, type);
6000 }
6001
6002 /* Handle the TARGET_RETURN_IN_MEMORY target hook.
6003    Specify whether to return the return value in memory.  */
6004
6005 static bool
6006 sparc_return_in_memory (tree type, tree fntype ATTRIBUTE_UNUSED)
6007 {
6008   if (TARGET_ARCH32)
6009     /* Original SPARC 32-bit ABI says that structures and unions,
6010        and quad-precision floats are returned in memory.  All other
6011        base types are returned in registers.
6012
6013        Extended ABI (as implemented by the Sun compiler) says that
6014        all complex floats are returned in registers (8 FP registers
6015        at most for '_Complex long double').  Return all complex integers
6016        in registers (4 at most for '_Complex long long').
6017
6018        Vector ABI (as implemented by the Sun VIS SDK) says that vector
6019        integers are returned like floats of the same size, that is in
6020        registers up to 8 bytes and in memory otherwise.  Return all
6021        vector floats in memory like structure and unions; note that
6022        they always have BLKmode like the latter.  */
6023     return (TYPE_MODE (type) == BLKmode
6024             || TYPE_MODE (type) == TFmode
6025             || (TREE_CODE (type) == VECTOR_TYPE
6026                 && (unsigned HOST_WIDE_INT) int_size_in_bytes (type) > 8));
6027   else
6028     /* Original SPARC 64-bit ABI says that structures and unions
6029        smaller than 32 bytes are returned in registers, as well as
6030        all other base types.
6031        
6032        Extended ABI (as implemented by the Sun compiler) says that all
6033        complex floats are returned in registers (8 FP registers at most
6034        for '_Complex long double').  Return all complex integers in
6035        registers (4 at most for '_Complex TItype').
6036
6037        Vector ABI (as implemented by the Sun VIS SDK) says that vector
6038        integers are returned like floats of the same size, that is in
6039        registers.  Return all vector floats like structure and unions;
6040        note that they always have BLKmode like the latter.  */
6041     return ((TYPE_MODE (type) == BLKmode
6042              && (unsigned HOST_WIDE_INT) int_size_in_bytes (type) > 32));
6043 }
6044
6045 /* Handle the TARGET_STRUCT_VALUE target hook.
6046    Return where to find the structure return value address.  */
6047
6048 static rtx
6049 sparc_struct_value_rtx (tree fndecl ATTRIBUTE_UNUSED, int incoming)
6050 {
6051   if (TARGET_ARCH64)
6052     return 0;
6053   else
6054     {
6055       if (incoming)
6056         return gen_rtx_MEM (Pmode, plus_constant (frame_pointer_rtx,
6057                                                   STRUCT_VALUE_OFFSET));
6058       else
6059         return gen_rtx_MEM (Pmode, plus_constant (stack_pointer_rtx,
6060                                                   STRUCT_VALUE_OFFSET));
6061     }
6062 }
6063
6064 /* Handle FUNCTION_VALUE, FUNCTION_OUTGOING_VALUE, and LIBCALL_VALUE macros.
6065    For v9, function return values are subject to the same rules as arguments,
6066    except that up to 32 bytes may be returned in registers.  */
6067
6068 rtx
6069 function_value (tree type, enum machine_mode mode, int incoming_p)
6070 {
6071   /* Beware that the two values are swapped here wrt function_arg.  */
6072   int regbase = (incoming_p
6073                  ? SPARC_OUTGOING_INT_ARG_FIRST
6074                  : SPARC_INCOMING_INT_ARG_FIRST);
6075   enum mode_class mclass = GET_MODE_CLASS (mode);
6076   int regno;
6077
6078   if (type && TREE_CODE (type) == VECTOR_TYPE)
6079     {
6080       /* Vector types deserve special treatment because they are
6081          polymorphic wrt their mode, depending upon whether VIS
6082          instructions are enabled.  */
6083       HOST_WIDE_INT size = int_size_in_bytes (type);
6084
6085       if ((TARGET_ARCH32 && size > 8) || (TARGET_ARCH64 && size > 32))
6086         abort (); /* shouldn't get here */
6087
6088       if (mode == BLKmode)
6089         return function_arg_vector_value (size,
6090                                           TYPE_MODE (TREE_TYPE (type)),
6091                                           SPARC_FP_ARG_FIRST);
6092       else
6093         mclass = MODE_FLOAT;
6094     }
6095   else if (type && TARGET_ARCH64)
6096     {
6097       if (TREE_CODE (type) == RECORD_TYPE)
6098         {
6099           /* Structures up to 32 bytes in size are passed in registers,
6100              promoted to fp registers where possible.  */
6101
6102           if (int_size_in_bytes (type) > 32)
6103             abort (); /* shouldn't get here */
6104
6105           return function_arg_record_value (type, mode, 0, 1, regbase);
6106         }
6107       else if (TREE_CODE (type) == UNION_TYPE)
6108         {
6109           HOST_WIDE_INT size = int_size_in_bytes (type);
6110
6111           if (size > 32)
6112             abort (); /* shouldn't get here */
6113
6114           return function_arg_union_value (size, mode, 0, regbase);
6115         }
6116       else if (AGGREGATE_TYPE_P (type))
6117         {
6118           /* All other aggregate types are passed in an integer register
6119              in a mode corresponding to the size of the type.  */
6120           HOST_WIDE_INT bytes = int_size_in_bytes (type);
6121
6122           if (bytes > 32)
6123             abort (); /* shouldn't get here */
6124
6125           mode = mode_for_size (bytes * BITS_PER_UNIT, MODE_INT, 0);
6126
6127           /* ??? We probably should have made the same ABI change in
6128              3.4.0 as the one we made for unions.   The latter was
6129              required by the SCD though, while the former is not
6130              specified, so we favored compatibility and efficiency.
6131
6132              Now we're stuck for aggregates larger than 16 bytes,
6133              because OImode vanished in the meantime.  Let's not
6134              try to be unduly clever, and simply follow the ABI
6135              for unions in that case.  */
6136           if (mode == BLKmode)
6137             return function_arg_union_value (bytes, mode, 0, regbase);
6138           else
6139             mclass = MODE_INT;
6140         }
6141       else if (mclass == MODE_INT
6142                && GET_MODE_SIZE (mode) < UNITS_PER_WORD)
6143         mode = word_mode;
6144     }
6145
6146   if ((mclass == MODE_FLOAT || mclass == MODE_COMPLEX_FLOAT)
6147       && TARGET_FPU)
6148     regno = SPARC_FP_ARG_FIRST;
6149   else
6150     regno = regbase;
6151
6152   return gen_rtx_REG (mode, regno);
6153 }
6154
6155 /* Do what is necessary for `va_start'.  We look at the current function
6156    to determine if stdarg or varargs is used and return the address of
6157    the first unnamed parameter.  */
6158
6159 static rtx
6160 sparc_builtin_saveregs (void)
6161 {
6162   int first_reg = current_function_args_info.words;
6163   rtx address;
6164   int regno;
6165
6166   for (regno = first_reg; regno < SPARC_INT_ARG_MAX; regno++)
6167     emit_move_insn (gen_rtx_MEM (word_mode,
6168                                  gen_rtx_PLUS (Pmode,
6169                                                frame_pointer_rtx,
6170                                                GEN_INT (FIRST_PARM_OFFSET (0)
6171                                                         + (UNITS_PER_WORD
6172                                                            * regno)))),
6173                     gen_rtx_REG (word_mode,
6174                                  SPARC_INCOMING_INT_ARG_FIRST + regno));
6175
6176   address = gen_rtx_PLUS (Pmode,
6177                           frame_pointer_rtx,
6178                           GEN_INT (FIRST_PARM_OFFSET (0)
6179                                    + UNITS_PER_WORD * first_reg));
6180
6181   return address;
6182 }
6183
6184 /* Implement `va_start' for stdarg.  */
6185
6186 void
6187 sparc_va_start (tree valist, rtx nextarg)
6188 {
6189   nextarg = expand_builtin_saveregs ();
6190   std_expand_builtin_va_start (valist, nextarg);
6191 }
6192
6193 /* Implement `va_arg' for stdarg.  */
6194
6195 static tree
6196 sparc_gimplify_va_arg (tree valist, tree type, tree *pre_p, tree *post_p)
6197 {
6198   HOST_WIDE_INT size, rsize, align;
6199   tree addr, incr;
6200   bool indirect;
6201   tree ptrtype = build_pointer_type (type);
6202
6203   if (pass_by_reference (NULL, TYPE_MODE (type), type, false))
6204     {
6205       indirect = true;
6206       size = rsize = UNITS_PER_WORD;
6207       align = 0;
6208     }
6209   else
6210     {
6211       indirect = false;
6212       size = int_size_in_bytes (type);
6213       rsize = (size + UNITS_PER_WORD - 1) & -UNITS_PER_WORD;
6214       align = 0;
6215     
6216       if (TARGET_ARCH64)
6217         {
6218           /* For SPARC64, objects requiring 16-byte alignment get it.  */
6219           if (TYPE_ALIGN (type) >= 2 * (unsigned) BITS_PER_WORD)
6220             align = 2 * UNITS_PER_WORD;
6221
6222           /* SPARC-V9 ABI states that structures up to 16 bytes in size
6223              are left-justified in their slots.  */
6224           if (AGGREGATE_TYPE_P (type))
6225             {
6226               if (size == 0)
6227                 size = rsize = UNITS_PER_WORD;
6228               else
6229                 size = rsize;
6230             }
6231         }
6232     }
6233
6234   incr = valist;
6235   if (align)
6236     {
6237       incr = fold (build2 (PLUS_EXPR, ptr_type_node, incr,
6238                            ssize_int (align - 1)));
6239       incr = fold (build2 (BIT_AND_EXPR, ptr_type_node, incr,
6240                            ssize_int (-align)));
6241     }
6242
6243   gimplify_expr (&incr, pre_p, post_p, is_gimple_val, fb_rvalue);
6244   addr = incr;
6245
6246   if (BYTES_BIG_ENDIAN && size < rsize)
6247     addr = fold (build2 (PLUS_EXPR, ptr_type_node, incr,
6248                          ssize_int (rsize - size)));
6249
6250   if (indirect)
6251     {
6252       addr = fold_convert (build_pointer_type (ptrtype), addr);
6253       addr = build_va_arg_indirect_ref (addr);
6254     }
6255   /* If the address isn't aligned properly for the type,
6256      we may need to copy to a temporary.  
6257      FIXME: This is inefficient.  Usually we can do this
6258      in registers.  */
6259   else if (align == 0
6260            && TYPE_ALIGN (type) > BITS_PER_WORD)
6261     {
6262       tree tmp = create_tmp_var (type, "va_arg_tmp");
6263       tree dest_addr = build_fold_addr_expr (tmp);
6264
6265       tree copy = build_function_call_expr
6266         (implicit_built_in_decls[BUILT_IN_MEMCPY],
6267          tree_cons (NULL_TREE, dest_addr,
6268                     tree_cons (NULL_TREE, addr,
6269                                tree_cons (NULL_TREE, size_int (rsize),
6270                                           NULL_TREE))));
6271
6272       gimplify_and_add (copy, pre_p);
6273       addr = dest_addr;
6274     }
6275   else
6276     addr = fold_convert (ptrtype, addr);
6277
6278   incr = fold (build2 (PLUS_EXPR, ptr_type_node, incr, ssize_int (rsize)));
6279   incr = build2 (MODIFY_EXPR, ptr_type_node, valist, incr);
6280   gimplify_and_add (incr, post_p);
6281
6282   return build_va_arg_indirect_ref (addr);
6283 }
6284 \f
6285 /* Implement the TARGET_VECTOR_MODE_SUPPORTED_P target hook.
6286    Specify whether the vector mode is supported by the hardware.  */
6287
6288 static bool
6289 sparc_vector_mode_supported_p (enum machine_mode mode)
6290 {
6291   return TARGET_VIS && VECTOR_MODE_P (mode) ? true : false;
6292 }
6293 \f
6294 /* Return the string to output an unconditional branch to LABEL, which is
6295    the operand number of the label.
6296
6297    DEST is the destination insn (i.e. the label), INSN is the source.  */
6298
6299 const char *
6300 output_ubranch (rtx dest, int label, rtx insn)
6301 {
6302   static char string[64];
6303   bool v9_form = false;
6304   char *p;
6305
6306   if (TARGET_V9 && INSN_ADDRESSES_SET_P ())
6307     {
6308       int delta = (INSN_ADDRESSES (INSN_UID (dest))
6309                    - INSN_ADDRESSES (INSN_UID (insn)));
6310       /* Leave some instructions for "slop".  */
6311       if (delta >= -260000 && delta < 260000)
6312         v9_form = true;
6313     }
6314
6315   if (v9_form)
6316     strcpy (string, "ba%*,pt\t%%xcc, ");
6317   else
6318     strcpy (string, "b%*\t");
6319
6320   p = strchr (string, '\0');
6321   *p++ = '%';
6322   *p++ = 'l';
6323   *p++ = '0' + label;
6324   *p++ = '%';
6325   *p++ = '(';
6326   *p = '\0';
6327
6328   return string;
6329 }
6330
6331 /* Return the string to output a conditional branch to LABEL, which is
6332    the operand number of the label.  OP is the conditional expression.
6333    XEXP (OP, 0) is assumed to be a condition code register (integer or
6334    floating point) and its mode specifies what kind of comparison we made.
6335
6336    DEST is the destination insn (i.e. the label), INSN is the source.
6337
6338    REVERSED is nonzero if we should reverse the sense of the comparison.
6339
6340    ANNUL is nonzero if we should generate an annulling branch.  */
6341
6342 const char *
6343 output_cbranch (rtx op, rtx dest, int label, int reversed, int annul,
6344                 rtx insn)
6345 {
6346   static char string[64];
6347   enum rtx_code code = GET_CODE (op);
6348   rtx cc_reg = XEXP (op, 0);
6349   enum machine_mode mode = GET_MODE (cc_reg);
6350   const char *labelno, *branch;
6351   int spaces = 8, far;
6352   char *p;
6353
6354   /* v9 branches are limited to +-1MB.  If it is too far away,
6355      change
6356
6357      bne,pt %xcc, .LC30
6358
6359      to
6360
6361      be,pn %xcc, .+12
6362       nop
6363      ba .LC30
6364
6365      and
6366
6367      fbne,a,pn %fcc2, .LC29
6368
6369      to
6370
6371      fbe,pt %fcc2, .+16
6372       nop
6373      ba .LC29  */
6374
6375   far = TARGET_V9 && (get_attr_length (insn) >= 3);
6376   if (reversed ^ far)
6377     {
6378       /* Reversal of FP compares takes care -- an ordered compare
6379          becomes an unordered compare and vice versa.  */
6380       if (mode == CCFPmode || mode == CCFPEmode)
6381         code = reverse_condition_maybe_unordered (code);
6382       else
6383         code = reverse_condition (code);
6384     }
6385
6386   /* Start by writing the branch condition.  */
6387   if (mode == CCFPmode || mode == CCFPEmode)
6388     {
6389       switch (code)
6390         {
6391         case NE:
6392           branch = "fbne";
6393           break;
6394         case EQ:
6395           branch = "fbe";
6396           break;
6397         case GE:
6398           branch = "fbge";
6399           break;
6400         case GT:
6401           branch = "fbg";
6402           break;
6403         case LE:
6404           branch = "fble";
6405           break;
6406         case LT:
6407           branch = "fbl";
6408           break;
6409         case UNORDERED:
6410           branch = "fbu";
6411           break;
6412         case ORDERED:
6413           branch = "fbo";
6414           break;
6415         case UNGT:
6416           branch = "fbug";
6417           break;
6418         case UNLT:
6419           branch = "fbul";
6420           break;
6421         case UNEQ:
6422           branch = "fbue";
6423           break;
6424         case UNGE:
6425           branch = "fbuge";
6426           break;
6427         case UNLE:
6428           branch = "fbule";
6429           break;
6430         case LTGT:
6431           branch = "fblg";
6432           break;
6433
6434         default:
6435           abort ();
6436         }
6437
6438       /* ??? !v9: FP branches cannot be preceded by another floating point
6439          insn.  Because there is currently no concept of pre-delay slots,
6440          we can fix this only by always emitting a nop before a floating
6441          point branch.  */
6442
6443       string[0] = '\0';
6444       if (! TARGET_V9)
6445         strcpy (string, "nop\n\t");
6446       strcat (string, branch);
6447     }
6448   else
6449     {
6450       switch (code)
6451         {
6452         case NE:
6453           branch = "bne";
6454           break;
6455         case EQ:
6456           branch = "be";
6457           break;
6458         case GE:
6459           if (mode == CC_NOOVmode || mode == CCX_NOOVmode)
6460             branch = "bpos";
6461           else
6462             branch = "bge";
6463           break;
6464         case GT:
6465           branch = "bg";
6466           break;
6467         case LE:
6468           branch = "ble";
6469           break;
6470         case LT:
6471           if (mode == CC_NOOVmode || mode == CCX_NOOVmode)
6472             branch = "bneg";
6473           else
6474             branch = "bl";
6475           break;
6476         case GEU:
6477           branch = "bgeu";
6478           break;
6479         case GTU:
6480           branch = "bgu";
6481           break;
6482         case LEU:
6483           branch = "bleu";
6484           break;
6485         case LTU:
6486           branch = "blu";
6487           break;
6488
6489         default:
6490           abort ();
6491         }
6492       strcpy (string, branch);
6493     }
6494   spaces -= strlen (branch);
6495   p = strchr (string, '\0');
6496
6497   /* Now add the annulling, the label, and a possible noop.  */
6498   if (annul && ! far)
6499     {
6500       strcpy (p, ",a");
6501       p += 2;
6502       spaces -= 2;
6503     }
6504
6505   if (TARGET_V9)
6506     {
6507       rtx note;
6508       int v8 = 0;
6509
6510       if (! far && insn && INSN_ADDRESSES_SET_P ())
6511         {
6512           int delta = (INSN_ADDRESSES (INSN_UID (dest))
6513                        - INSN_ADDRESSES (INSN_UID (insn)));
6514           /* Leave some instructions for "slop".  */
6515           if (delta < -260000 || delta >= 260000)
6516             v8 = 1;
6517         }
6518
6519       if (mode == CCFPmode || mode == CCFPEmode)
6520         {
6521           static char v9_fcc_labelno[] = "%%fccX, ";
6522           /* Set the char indicating the number of the fcc reg to use.  */
6523           v9_fcc_labelno[5] = REGNO (cc_reg) - SPARC_FIRST_V9_FCC_REG + '0';
6524           labelno = v9_fcc_labelno;
6525           if (v8)
6526             {
6527               if (REGNO (cc_reg) == SPARC_FCC_REG)
6528                 labelno = "";
6529               else
6530                 abort ();
6531             }
6532         }
6533       else if (mode == CCXmode || mode == CCX_NOOVmode)
6534         {
6535           labelno = "%%xcc, ";
6536           if (v8)
6537             abort ();
6538         }
6539       else
6540         {
6541           labelno = "%%icc, ";
6542           if (v8)
6543             labelno = "";
6544         }
6545
6546       if (*labelno && insn && (note = find_reg_note (insn, REG_BR_PROB, NULL_RTX)))
6547         {
6548           strcpy (p,
6549                   ((INTVAL (XEXP (note, 0)) >= REG_BR_PROB_BASE / 2) ^ far)
6550                   ? ",pt" : ",pn");
6551           p += 3;
6552           spaces -= 3;
6553         }
6554     }
6555   else
6556     labelno = "";
6557
6558   if (spaces > 0)
6559     *p++ = '\t';
6560   else
6561     *p++ = ' ';
6562   strcpy (p, labelno);
6563   p = strchr (p, '\0');
6564   if (far)
6565     {
6566       strcpy (p, ".+12\n\t nop\n\tb\t");
6567       /* Skip the next insn if requested or
6568          if we know that it will be a nop.  */
6569       if (annul || ! final_sequence)
6570         p[3] = '6';
6571       p += 14;
6572     }
6573   *p++ = '%';
6574   *p++ = 'l';
6575   *p++ = label + '0';
6576   *p++ = '%';
6577   *p++ = '#';
6578   *p = '\0';
6579
6580   return string;
6581 }
6582
6583 /* Emit a library call comparison between floating point X and Y.
6584    COMPARISON is the rtl operator to compare with (EQ, NE, GT, etc.).
6585    TARGET_ARCH64 uses _Qp_* functions, which use pointers to TFmode
6586    values as arguments instead of the TFmode registers themselves,
6587    that's why we cannot call emit_float_lib_cmp.  */
6588 void
6589 sparc_emit_float_lib_cmp (rtx x, rtx y, enum rtx_code comparison)
6590 {
6591   const char *qpfunc;
6592   rtx slot0, slot1, result, tem, tem2;
6593   enum machine_mode mode;
6594
6595   switch (comparison)
6596     {
6597     case EQ:
6598       qpfunc = (TARGET_ARCH64) ? "_Qp_feq" : "_Q_feq";
6599       break;
6600
6601     case NE:
6602       qpfunc = (TARGET_ARCH64) ? "_Qp_fne" : "_Q_fne";
6603       break;
6604
6605     case GT:
6606       qpfunc = (TARGET_ARCH64) ? "_Qp_fgt" : "_Q_fgt";
6607       break;
6608
6609     case GE:
6610       qpfunc = (TARGET_ARCH64) ? "_Qp_fge" : "_Q_fge";
6611       break;
6612
6613     case LT:
6614       qpfunc = (TARGET_ARCH64) ? "_Qp_flt" : "_Q_flt";
6615       break;
6616
6617     case LE:
6618       qpfunc = (TARGET_ARCH64) ? "_Qp_fle" : "_Q_fle";
6619       break;
6620
6621     case ORDERED:
6622     case UNORDERED:
6623     case UNGT:
6624     case UNLT:
6625     case UNEQ:
6626     case UNGE:
6627     case UNLE:
6628     case LTGT:
6629       qpfunc = (TARGET_ARCH64) ? "_Qp_cmp" : "_Q_cmp";
6630       break;
6631
6632     default:
6633       abort();
6634       break;
6635     }
6636
6637   if (TARGET_ARCH64)
6638     {
6639       if (GET_CODE (x) != MEM)
6640         {
6641           slot0 = assign_stack_temp (TFmode, GET_MODE_SIZE(TFmode), 0);
6642           emit_insn (gen_rtx_SET (VOIDmode, slot0, x));
6643         }
6644       else
6645         slot0 = x;
6646
6647       if (GET_CODE (y) != MEM)
6648         {
6649           slot1 = assign_stack_temp (TFmode, GET_MODE_SIZE(TFmode), 0);
6650           emit_insn (gen_rtx_SET (VOIDmode, slot1, y));
6651         }
6652       else
6653         slot1 = y;
6654
6655       emit_library_call (gen_rtx_SYMBOL_REF (Pmode, qpfunc), LCT_NORMAL,
6656                          DImode, 2,
6657                          XEXP (slot0, 0), Pmode,
6658                          XEXP (slot1, 0), Pmode);
6659
6660       mode = DImode;
6661     }
6662   else
6663     {
6664       emit_library_call (gen_rtx_SYMBOL_REF (Pmode, qpfunc), LCT_NORMAL,
6665                          SImode, 2,
6666                          x, TFmode, y, TFmode);
6667
6668       mode = SImode;
6669     }
6670
6671
6672   /* Immediately move the result of the libcall into a pseudo
6673      register so reload doesn't clobber the value if it needs
6674      the return register for a spill reg.  */
6675   result = gen_reg_rtx (mode);
6676   emit_move_insn (result, hard_libcall_value (mode));
6677
6678   switch (comparison)
6679     {
6680     default:
6681       emit_cmp_insn (result, const0_rtx, NE, NULL_RTX, mode, 0);
6682       break;
6683     case ORDERED:
6684     case UNORDERED:
6685       emit_cmp_insn (result, GEN_INT(3), comparison == UNORDERED ? EQ : NE,
6686                      NULL_RTX, mode, 0);
6687       break;
6688     case UNGT:
6689     case UNGE:
6690       emit_cmp_insn (result, const1_rtx,
6691                      comparison == UNGT ? GT : NE, NULL_RTX, mode, 0);
6692       break;
6693     case UNLE:
6694       emit_cmp_insn (result, const2_rtx, NE, NULL_RTX, mode, 0);
6695       break;
6696     case UNLT:
6697       tem = gen_reg_rtx (mode);
6698       if (TARGET_ARCH32)
6699         emit_insn (gen_andsi3 (tem, result, const1_rtx));
6700       else
6701         emit_insn (gen_anddi3 (tem, result, const1_rtx));
6702       emit_cmp_insn (tem, const0_rtx, NE, NULL_RTX, mode, 0);
6703       break;
6704     case UNEQ:
6705     case LTGT:
6706       tem = gen_reg_rtx (mode);
6707       if (TARGET_ARCH32)
6708         emit_insn (gen_addsi3 (tem, result, const1_rtx));
6709       else
6710         emit_insn (gen_adddi3 (tem, result, const1_rtx));
6711       tem2 = gen_reg_rtx (mode);
6712       if (TARGET_ARCH32)
6713         emit_insn (gen_andsi3 (tem2, tem, const2_rtx));
6714       else
6715         emit_insn (gen_anddi3 (tem2, tem, const2_rtx));
6716       emit_cmp_insn (tem2, const0_rtx, comparison == UNEQ ? EQ : NE,
6717                      NULL_RTX, mode, 0);
6718       break;
6719     }
6720 }
6721
6722 /* Generate an unsigned DImode to FP conversion.  This is the same code
6723    optabs would emit if we didn't have TFmode patterns.  */
6724
6725 void
6726 sparc_emit_floatunsdi (rtx *operands, enum machine_mode mode)
6727 {
6728   rtx neglab, donelab, i0, i1, f0, in, out;
6729
6730   out = operands[0];
6731   in = force_reg (DImode, operands[1]);
6732   neglab = gen_label_rtx ();
6733   donelab = gen_label_rtx ();
6734   i0 = gen_reg_rtx (DImode);
6735   i1 = gen_reg_rtx (DImode);
6736   f0 = gen_reg_rtx (mode);
6737
6738   emit_cmp_and_jump_insns (in, const0_rtx, LT, const0_rtx, DImode, 0, neglab);
6739
6740   emit_insn (gen_rtx_SET (VOIDmode, out, gen_rtx_FLOAT (mode, in)));
6741   emit_jump_insn (gen_jump (donelab));
6742   emit_barrier ();
6743
6744   emit_label (neglab);
6745
6746   emit_insn (gen_lshrdi3 (i0, in, const1_rtx));
6747   emit_insn (gen_anddi3 (i1, in, const1_rtx));
6748   emit_insn (gen_iordi3 (i0, i0, i1));
6749   emit_insn (gen_rtx_SET (VOIDmode, f0, gen_rtx_FLOAT (mode, i0)));
6750   emit_insn (gen_rtx_SET (VOIDmode, out, gen_rtx_PLUS (mode, f0, f0)));
6751
6752   emit_label (donelab);
6753 }
6754
6755 /* Generate an FP to unsigned DImode conversion.  This is the same code
6756    optabs would emit if we didn't have TFmode patterns.  */
6757
6758 void
6759 sparc_emit_fixunsdi (rtx *operands, enum machine_mode mode)
6760 {
6761   rtx neglab, donelab, i0, i1, f0, in, out, limit;
6762
6763   out = operands[0];
6764   in = force_reg (mode, operands[1]);
6765   neglab = gen_label_rtx ();
6766   donelab = gen_label_rtx ();
6767   i0 = gen_reg_rtx (DImode);
6768   i1 = gen_reg_rtx (DImode);
6769   limit = gen_reg_rtx (mode);
6770   f0 = gen_reg_rtx (mode);
6771
6772   emit_move_insn (limit,
6773                   CONST_DOUBLE_FROM_REAL_VALUE (
6774                     REAL_VALUE_ATOF ("9223372036854775808.0", mode), mode));
6775   emit_cmp_and_jump_insns (in, limit, GE, NULL_RTX, mode, 0, neglab);
6776
6777   emit_insn (gen_rtx_SET (VOIDmode,
6778                           out,
6779                           gen_rtx_FIX (DImode, gen_rtx_FIX (mode, in))));
6780   emit_jump_insn (gen_jump (donelab));
6781   emit_barrier ();
6782
6783   emit_label (neglab);
6784
6785   emit_insn (gen_rtx_SET (VOIDmode, f0, gen_rtx_MINUS (mode, in, limit)));
6786   emit_insn (gen_rtx_SET (VOIDmode,
6787                           i0,
6788                           gen_rtx_FIX (DImode, gen_rtx_FIX (mode, f0))));
6789   emit_insn (gen_movdi (i1, const1_rtx));
6790   emit_insn (gen_ashldi3 (i1, i1, GEN_INT (63)));
6791   emit_insn (gen_xordi3 (out, i0, i1));
6792
6793   emit_label (donelab);
6794 }
6795
6796 /* Return the string to output a conditional branch to LABEL, testing
6797    register REG.  LABEL is the operand number of the label; REG is the
6798    operand number of the reg.  OP is the conditional expression.  The mode
6799    of REG says what kind of comparison we made.
6800
6801    DEST is the destination insn (i.e. the label), INSN is the source.
6802
6803    REVERSED is nonzero if we should reverse the sense of the comparison.
6804
6805    ANNUL is nonzero if we should generate an annulling branch.  */
6806
6807 const char *
6808 output_v9branch (rtx op, rtx dest, int reg, int label, int reversed,
6809                  int annul, rtx insn)
6810 {
6811   static char string[64];
6812   enum rtx_code code = GET_CODE (op);
6813   enum machine_mode mode = GET_MODE (XEXP (op, 0));
6814   rtx note;
6815   int far;
6816   char *p;
6817
6818   /* branch on register are limited to +-128KB.  If it is too far away,
6819      change
6820      
6821      brnz,pt %g1, .LC30
6822      
6823      to
6824      
6825      brz,pn %g1, .+12
6826       nop
6827      ba,pt %xcc, .LC30
6828      
6829      and
6830      
6831      brgez,a,pn %o1, .LC29
6832      
6833      to
6834      
6835      brlz,pt %o1, .+16
6836       nop
6837      ba,pt %xcc, .LC29  */
6838
6839   far = get_attr_length (insn) >= 3;
6840
6841   /* If not floating-point or if EQ or NE, we can just reverse the code.  */
6842   if (reversed ^ far)
6843     code = reverse_condition (code);
6844
6845   /* Only 64 bit versions of these instructions exist.  */
6846   if (mode != DImode)
6847     abort ();
6848
6849   /* Start by writing the branch condition.  */
6850
6851   switch (code)
6852     {
6853     case NE:
6854       strcpy (string, "brnz");
6855       break;
6856
6857     case EQ:
6858       strcpy (string, "brz");
6859       break;
6860
6861     case GE:
6862       strcpy (string, "brgez");
6863       break;
6864
6865     case LT:
6866       strcpy (string, "brlz");
6867       break;
6868
6869     case LE:
6870       strcpy (string, "brlez");
6871       break;
6872
6873     case GT:
6874       strcpy (string, "brgz");
6875       break;
6876
6877     default:
6878       abort ();
6879     }
6880
6881   p = strchr (string, '\0');
6882
6883   /* Now add the annulling, reg, label, and nop.  */
6884   if (annul && ! far)
6885     {
6886       strcpy (p, ",a");
6887       p += 2;
6888     }
6889
6890   if (insn && (note = find_reg_note (insn, REG_BR_PROB, NULL_RTX)))
6891     {
6892       strcpy (p,
6893               ((INTVAL (XEXP (note, 0)) >= REG_BR_PROB_BASE / 2) ^ far)
6894               ? ",pt" : ",pn");
6895       p += 3;
6896     }
6897
6898   *p = p < string + 8 ? '\t' : ' ';
6899   p++;
6900   *p++ = '%';
6901   *p++ = '0' + reg;
6902   *p++ = ',';
6903   *p++ = ' ';
6904   if (far)
6905     {
6906       int veryfar = 1, delta;
6907
6908       if (INSN_ADDRESSES_SET_P ())
6909         {
6910           delta = (INSN_ADDRESSES (INSN_UID (dest))
6911                    - INSN_ADDRESSES (INSN_UID (insn)));
6912           /* Leave some instructions for "slop".  */
6913           if (delta >= -260000 && delta < 260000)
6914             veryfar = 0;
6915         }
6916
6917       strcpy (p, ".+12\n\t nop\n\t");
6918       /* Skip the next insn if requested or
6919          if we know that it will be a nop.  */
6920       if (annul || ! final_sequence)
6921         p[3] = '6';
6922       p += 12;
6923       if (veryfar)
6924         {
6925           strcpy (p, "b\t");
6926           p += 2;
6927         }
6928       else
6929         {
6930           strcpy (p, "ba,pt\t%%xcc, ");
6931           p += 13;
6932         }
6933     }
6934   *p++ = '%';
6935   *p++ = 'l';
6936   *p++ = '0' + label;
6937   *p++ = '%';
6938   *p++ = '#';
6939   *p = '\0';
6940
6941   return string;
6942 }
6943
6944 /* Return 1, if any of the registers of the instruction are %l[0-7] or %o[0-7].
6945    Such instructions cannot be used in the delay slot of return insn on v9.
6946    If TEST is 0, also rename all %i[0-7] registers to their %o[0-7] counterparts.
6947  */
6948
6949 static int
6950 epilogue_renumber (register rtx *where, int test)
6951 {
6952   register const char *fmt;
6953   register int i;
6954   register enum rtx_code code;
6955
6956   if (*where == 0)
6957     return 0;
6958
6959   code = GET_CODE (*where);
6960
6961   switch (code)
6962     {
6963     case REG:
6964       if (REGNO (*where) >= 8 && REGNO (*where) < 24)      /* oX or lX */
6965         return 1;
6966       if (! test && REGNO (*where) >= 24 && REGNO (*where) < 32)
6967         *where = gen_rtx_REG (GET_MODE (*where), OUTGOING_REGNO (REGNO(*where)));
6968     case SCRATCH:
6969     case CC0:
6970     case PC:
6971     case CONST_INT:
6972     case CONST_DOUBLE:
6973       return 0;
6974
6975       /* Do not replace the frame pointer with the stack pointer because
6976          it can cause the delayed instruction to load below the stack.
6977          This occurs when instructions like:
6978
6979          (set (reg/i:SI 24 %i0)
6980              (mem/f:SI (plus:SI (reg/f:SI 30 %fp)
6981                        (const_int -20 [0xffffffec])) 0))
6982
6983          are in the return delayed slot.  */
6984     case PLUS:
6985       if (GET_CODE (XEXP (*where, 0)) == REG
6986           && REGNO (XEXP (*where, 0)) == HARD_FRAME_POINTER_REGNUM
6987           && (GET_CODE (XEXP (*where, 1)) != CONST_INT
6988               || INTVAL (XEXP (*where, 1)) < SPARC_STACK_BIAS))
6989         return 1;
6990       break;
6991
6992     case MEM:
6993       if (SPARC_STACK_BIAS
6994           && GET_CODE (XEXP (*where, 0)) == REG
6995           && REGNO (XEXP (*where, 0)) == HARD_FRAME_POINTER_REGNUM)
6996         return 1;
6997       break;
6998
6999     default:
7000       break;
7001     }
7002
7003   fmt = GET_RTX_FORMAT (code);
7004
7005   for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
7006     {
7007       if (fmt[i] == 'E')
7008         {
7009           register int j;
7010           for (j = XVECLEN (*where, i) - 1; j >= 0; j--)
7011             if (epilogue_renumber (&(XVECEXP (*where, i, j)), test))
7012               return 1;
7013         }
7014       else if (fmt[i] == 'e'
7015                && epilogue_renumber (&(XEXP (*where, i)), test))
7016         return 1;
7017     }
7018   return 0;
7019 }
7020 \f
7021 /* Leaf functions and non-leaf functions have different needs.  */
7022
7023 static const int
7024 reg_leaf_alloc_order[] = REG_LEAF_ALLOC_ORDER;
7025
7026 static const int
7027 reg_nonleaf_alloc_order[] = REG_ALLOC_ORDER;
7028
7029 static const int *const reg_alloc_orders[] = {
7030   reg_leaf_alloc_order,
7031   reg_nonleaf_alloc_order};
7032
7033 void
7034 order_regs_for_local_alloc (void)
7035 {
7036   static int last_order_nonleaf = 1;
7037
7038   if (regs_ever_live[15] != last_order_nonleaf)
7039     {
7040       last_order_nonleaf = !last_order_nonleaf;
7041       memcpy ((char *) reg_alloc_order,
7042               (const char *) reg_alloc_orders[last_order_nonleaf],
7043               FIRST_PSEUDO_REGISTER * sizeof (int));
7044     }
7045 }
7046 \f
7047 /* Return 1 if REG and MEM are legitimate enough to allow the various
7048    mem<-->reg splits to be run.  */
7049
7050 int
7051 sparc_splitdi_legitimate (rtx reg, rtx mem)
7052 {
7053   /* Punt if we are here by mistake.  */
7054   if (! reload_completed)
7055     abort ();
7056
7057   /* We must have an offsettable memory reference.  */
7058   if (! offsettable_memref_p (mem))
7059     return 0;
7060
7061   /* If we have legitimate args for ldd/std, we do not want
7062      the split to happen.  */
7063   if ((REGNO (reg) % 2) == 0
7064       && mem_min_alignment (mem, 8))
7065     return 0;
7066
7067   /* Success.  */
7068   return 1;
7069 }
7070
7071 /* Return 1 if x and y are some kind of REG and they refer to
7072    different hard registers.  This test is guaranteed to be
7073    run after reload.  */
7074
7075 int
7076 sparc_absnegfloat_split_legitimate (rtx x, rtx y)
7077 {
7078   if (GET_CODE (x) != REG)
7079     return 0;
7080   if (GET_CODE (y) != REG)
7081     return 0;
7082   if (REGNO (x) == REGNO (y))
7083     return 0;
7084   return 1;
7085 }
7086
7087 /* Return 1 if REGNO (reg1) is even and REGNO (reg1) == REGNO (reg2) - 1.
7088    This makes them candidates for using ldd and std insns. 
7089
7090    Note reg1 and reg2 *must* be hard registers.  */
7091
7092 int
7093 registers_ok_for_ldd_peep (rtx reg1, rtx reg2)
7094 {
7095   /* We might have been passed a SUBREG.  */
7096   if (GET_CODE (reg1) != REG || GET_CODE (reg2) != REG) 
7097     return 0;
7098
7099   if (REGNO (reg1) % 2 != 0)
7100     return 0;
7101
7102   /* Integer ldd is deprecated in SPARC V9 */ 
7103   if (TARGET_V9 && REGNO (reg1) < 32)                  
7104     return 0;                             
7105
7106   return (REGNO (reg1) == REGNO (reg2) - 1);
7107 }
7108
7109 /* Return 1 if the addresses in mem1 and mem2 are suitable for use in
7110    an ldd or std insn.
7111    
7112    This can only happen when addr1 and addr2, the addresses in mem1
7113    and mem2, are consecutive memory locations (addr1 + 4 == addr2).
7114    addr1 must also be aligned on a 64-bit boundary.
7115
7116    Also iff dependent_reg_rtx is not null it should not be used to
7117    compute the address for mem1, i.e. we cannot optimize a sequence
7118    like:
7119         ld [%o0], %o0
7120         ld [%o0 + 4], %o1
7121    to
7122         ldd [%o0], %o0
7123    nor:
7124         ld [%g3 + 4], %g3
7125         ld [%g3], %g2
7126    to
7127         ldd [%g3], %g2
7128
7129    But, note that the transformation from:
7130         ld [%g2 + 4], %g3
7131         ld [%g2], %g2
7132    to
7133         ldd [%g2], %g2
7134    is perfectly fine.  Thus, the peephole2 patterns always pass us
7135    the destination register of the first load, never the second one.
7136
7137    For stores we don't have a similar problem, so dependent_reg_rtx is
7138    NULL_RTX.  */
7139
7140 int
7141 mems_ok_for_ldd_peep (rtx mem1, rtx mem2, rtx dependent_reg_rtx)
7142 {
7143   rtx addr1, addr2;
7144   unsigned int reg1;
7145   HOST_WIDE_INT offset1;
7146
7147   /* The mems cannot be volatile.  */
7148   if (MEM_VOLATILE_P (mem1) || MEM_VOLATILE_P (mem2))
7149     return 0;
7150
7151   /* MEM1 should be aligned on a 64-bit boundary.  */
7152   if (MEM_ALIGN (mem1) < 64)
7153     return 0;
7154   
7155   addr1 = XEXP (mem1, 0);
7156   addr2 = XEXP (mem2, 0);
7157   
7158   /* Extract a register number and offset (if used) from the first addr.  */
7159   if (GET_CODE (addr1) == PLUS)
7160     {
7161       /* If not a REG, return zero.  */
7162       if (GET_CODE (XEXP (addr1, 0)) != REG)
7163         return 0;
7164       else
7165         {
7166           reg1 = REGNO (XEXP (addr1, 0));
7167           /* The offset must be constant!  */
7168           if (GET_CODE (XEXP (addr1, 1)) != CONST_INT)
7169             return 0;
7170           offset1 = INTVAL (XEXP (addr1, 1));
7171         }
7172     }
7173   else if (GET_CODE (addr1) != REG)
7174     return 0;
7175   else
7176     {
7177       reg1 = REGNO (addr1);
7178       /* This was a simple (mem (reg)) expression.  Offset is 0.  */
7179       offset1 = 0;
7180     }
7181
7182   /* Make sure the second address is a (mem (plus (reg) (const_int).  */
7183   if (GET_CODE (addr2) != PLUS)
7184     return 0;
7185
7186   if (GET_CODE (XEXP (addr2, 0)) != REG
7187       || GET_CODE (XEXP (addr2, 1)) != CONST_INT)
7188     return 0;
7189
7190   if (reg1 != REGNO (XEXP (addr2, 0)))
7191     return 0;
7192
7193   if (dependent_reg_rtx != NULL_RTX && reg1 == REGNO (dependent_reg_rtx))
7194     return 0;
7195   
7196   /* The first offset must be evenly divisible by 8 to ensure the 
7197      address is 64 bit aligned.  */
7198   if (offset1 % 8 != 0)
7199     return 0;
7200
7201   /* The offset for the second addr must be 4 more than the first addr.  */
7202   if (INTVAL (XEXP (addr2, 1)) != offset1 + 4)
7203     return 0;
7204
7205   /* All the tests passed.  addr1 and addr2 are valid for ldd and std
7206      instructions.  */
7207   return 1;
7208 }
7209
7210 /* Return 1 if reg is a pseudo, or is the first register in 
7211    a hard register pair.  This makes it a candidate for use in
7212    ldd and std insns.  */
7213
7214 int
7215 register_ok_for_ldd (rtx reg)
7216 {
7217   /* We might have been passed a SUBREG.  */
7218   if (GET_CODE (reg) != REG) 
7219     return 0;
7220
7221   if (REGNO (reg) < FIRST_PSEUDO_REGISTER)
7222     return (REGNO (reg) % 2 == 0);
7223   else 
7224     return 1;
7225 }
7226 \f
7227 /* Print operand X (an rtx) in assembler syntax to file FILE.
7228    CODE is a letter or dot (`z' in `%z0') or 0 if no letter was specified.
7229    For `%' followed by punctuation, CODE is the punctuation and X is null.  */
7230
7231 void
7232 print_operand (FILE *file, rtx x, int code)
7233 {
7234   switch (code)
7235     {
7236     case '#':
7237       /* Output an insn in a delay slot.  */
7238       if (final_sequence)
7239         sparc_indent_opcode = 1;
7240       else
7241         fputs ("\n\t nop", file);
7242       return;
7243     case '*':
7244       /* Output an annul flag if there's nothing for the delay slot and we
7245          are optimizing.  This is always used with '(' below.
7246          Sun OS 4.1.1 dbx can't handle an annulled unconditional branch;
7247          this is a dbx bug.  So, we only do this when optimizing.
7248          On UltraSPARC, a branch in a delay slot causes a pipeline flush.
7249          Always emit a nop in case the next instruction is a branch.  */
7250       if (! final_sequence && (optimize && (int)sparc_cpu < PROCESSOR_V9))
7251         fputs (",a", file);
7252       return;
7253     case '(':
7254       /* Output a 'nop' if there's nothing for the delay slot and we are
7255          not optimizing.  This is always used with '*' above.  */
7256       if (! final_sequence && ! (optimize && (int)sparc_cpu < PROCESSOR_V9))
7257         fputs ("\n\t nop", file);
7258       else if (final_sequence)
7259         sparc_indent_opcode = 1;
7260       return;
7261     case ')':
7262       /* Output the right displacement from the saved PC on function return.
7263          The caller may have placed an "unimp" insn immediately after the call
7264          so we have to account for it.  This insn is used in the 32-bit ABI
7265          when calling a function that returns a non zero-sized structure. The
7266          64-bit ABI doesn't have it.  Be careful to have this test be the same
7267          as that used on the call.  */
7268      if (! TARGET_ARCH64
7269          && current_function_returns_struct
7270          && (TREE_CODE (DECL_SIZE (DECL_RESULT (current_function_decl)))
7271              == INTEGER_CST)
7272          && ! integer_zerop (DECL_SIZE (DECL_RESULT (current_function_decl))))
7273         fputs ("12", file);
7274       else
7275         fputc ('8', file);
7276       return;
7277     case '_':
7278       /* Output the Embedded Medium/Anywhere code model base register.  */
7279       fputs (EMBMEDANY_BASE_REG, file);
7280       return;
7281     case '&':
7282       /* Print some local dynamic TLS name.  */
7283       assemble_name (file, get_some_local_dynamic_name ());
7284       return;
7285
7286     case 'Y':
7287       /* Adjust the operand to take into account a RESTORE operation.  */
7288       if (GET_CODE (x) == CONST_INT)
7289         break;
7290       else if (GET_CODE (x) != REG)
7291         output_operand_lossage ("invalid %%Y operand");
7292       else if (REGNO (x) < 8)
7293         fputs (reg_names[REGNO (x)], file);
7294       else if (REGNO (x) >= 24 && REGNO (x) < 32)
7295         fputs (reg_names[REGNO (x)-16], file);
7296       else
7297         output_operand_lossage ("invalid %%Y operand");
7298       return;
7299     case 'L':
7300       /* Print out the low order register name of a register pair.  */
7301       if (WORDS_BIG_ENDIAN)
7302         fputs (reg_names[REGNO (x)+1], file);
7303       else
7304         fputs (reg_names[REGNO (x)], file);
7305       return;
7306     case 'H':
7307       /* Print out the high order register name of a register pair.  */
7308       if (WORDS_BIG_ENDIAN)
7309         fputs (reg_names[REGNO (x)], file);
7310       else
7311         fputs (reg_names[REGNO (x)+1], file);
7312       return;
7313     case 'R':
7314       /* Print out the second register name of a register pair or quad.
7315          I.e., R (%o0) => %o1.  */
7316       fputs (reg_names[REGNO (x)+1], file);
7317       return;
7318     case 'S':
7319       /* Print out the third register name of a register quad.
7320          I.e., S (%o0) => %o2.  */
7321       fputs (reg_names[REGNO (x)+2], file);
7322       return;
7323     case 'T':
7324       /* Print out the fourth register name of a register quad.
7325          I.e., T (%o0) => %o3.  */
7326       fputs (reg_names[REGNO (x)+3], file);
7327       return;
7328     case 'x':
7329       /* Print a condition code register.  */
7330       if (REGNO (x) == SPARC_ICC_REG)
7331         {
7332           /* We don't handle CC[X]_NOOVmode because they're not supposed
7333              to occur here.  */
7334           if (GET_MODE (x) == CCmode)
7335             fputs ("%icc", file);
7336           else if (GET_MODE (x) == CCXmode)
7337             fputs ("%xcc", file);
7338           else
7339             abort ();
7340         }
7341       else
7342         /* %fccN register */
7343         fputs (reg_names[REGNO (x)], file);
7344       return;
7345     case 'm':
7346       /* Print the operand's address only.  */
7347       output_address (XEXP (x, 0));
7348       return;
7349     case 'r':
7350       /* In this case we need a register.  Use %g0 if the
7351          operand is const0_rtx.  */
7352       if (x == const0_rtx
7353           || (GET_MODE (x) != VOIDmode && x == CONST0_RTX (GET_MODE (x))))
7354         {
7355           fputs ("%g0", file);
7356           return;
7357         }
7358       else
7359         break;
7360
7361     case 'A':
7362       switch (GET_CODE (x))
7363         {
7364         case IOR: fputs ("or", file); break;
7365         case AND: fputs ("and", file); break;
7366         case XOR: fputs ("xor", file); break;
7367         default: output_operand_lossage ("invalid %%A operand");
7368         }
7369       return;
7370
7371     case 'B':
7372       switch (GET_CODE (x))
7373         {
7374         case IOR: fputs ("orn", file); break;
7375         case AND: fputs ("andn", file); break;
7376         case XOR: fputs ("xnor", file); break;
7377         default: output_operand_lossage ("invalid %%B operand");
7378         }
7379       return;
7380
7381       /* These are used by the conditional move instructions.  */
7382     case 'c' :
7383     case 'C':
7384       {
7385         enum rtx_code rc = GET_CODE (x);
7386         
7387         if (code == 'c')
7388           {
7389             enum machine_mode mode = GET_MODE (XEXP (x, 0));
7390             if (mode == CCFPmode || mode == CCFPEmode)
7391               rc = reverse_condition_maybe_unordered (GET_CODE (x));
7392             else
7393               rc = reverse_condition (GET_CODE (x));
7394           }
7395         switch (rc)
7396           {
7397           case NE: fputs ("ne", file); break;
7398           case EQ: fputs ("e", file); break;
7399           case GE: fputs ("ge", file); break;
7400           case GT: fputs ("g", file); break;
7401           case LE: fputs ("le", file); break;
7402           case LT: fputs ("l", file); break;
7403           case GEU: fputs ("geu", file); break;
7404           case GTU: fputs ("gu", file); break;
7405           case LEU: fputs ("leu", file); break;
7406           case LTU: fputs ("lu", file); break;
7407           case LTGT: fputs ("lg", file); break;
7408           case UNORDERED: fputs ("u", file); break;
7409           case ORDERED: fputs ("o", file); break;
7410           case UNLT: fputs ("ul", file); break;
7411           case UNLE: fputs ("ule", file); break;
7412           case UNGT: fputs ("ug", file); break;
7413           case UNGE: fputs ("uge", file); break;
7414           case UNEQ: fputs ("ue", file); break;
7415           default: output_operand_lossage (code == 'c'
7416                                            ? "invalid %%c operand"
7417                                            : "invalid %%C operand");
7418           }
7419         return;
7420       }
7421
7422       /* These are used by the movr instruction pattern.  */
7423     case 'd':
7424     case 'D':
7425       {
7426         enum rtx_code rc = (code == 'd'
7427                             ? reverse_condition (GET_CODE (x))
7428                             : GET_CODE (x));
7429         switch (rc)
7430           {
7431           case NE: fputs ("ne", file); break;
7432           case EQ: fputs ("e", file); break;
7433           case GE: fputs ("gez", file); break;
7434           case LT: fputs ("lz", file); break;
7435           case LE: fputs ("lez", file); break;
7436           case GT: fputs ("gz", file); break;
7437           default: output_operand_lossage (code == 'd'
7438                                            ? "invalid %%d operand"
7439                                            : "invalid %%D operand");
7440           }
7441         return;
7442       }
7443
7444     case 'b':
7445       {
7446         /* Print a sign-extended character.  */
7447         int i = trunc_int_for_mode (INTVAL (x), QImode);
7448         fprintf (file, "%d", i);
7449         return;
7450       }
7451
7452     case 'f':
7453       /* Operand must be a MEM; write its address.  */
7454       if (GET_CODE (x) != MEM)
7455         output_operand_lossage ("invalid %%f operand");
7456       output_address (XEXP (x, 0));
7457       return;
7458
7459     case 's':
7460       {
7461         /* Print a sign-extended 32-bit value.  */
7462         HOST_WIDE_INT i;
7463         if (GET_CODE(x) == CONST_INT)
7464           i = INTVAL (x);
7465         else if (GET_CODE(x) == CONST_DOUBLE)
7466           i = CONST_DOUBLE_LOW (x);
7467         else
7468           {
7469             output_operand_lossage ("invalid %%s operand");
7470             return;
7471           }
7472         i = trunc_int_for_mode (i, SImode);
7473         fprintf (file, HOST_WIDE_INT_PRINT_DEC, i);
7474         return;
7475       }
7476
7477     case 0:
7478       /* Do nothing special.  */
7479       break;
7480
7481     default:
7482       /* Undocumented flag.  */
7483       output_operand_lossage ("invalid operand output code");
7484     }
7485
7486   if (GET_CODE (x) == REG)
7487     fputs (reg_names[REGNO (x)], file);
7488   else if (GET_CODE (x) == MEM)
7489     {
7490       fputc ('[', file);
7491         /* Poor Sun assembler doesn't understand absolute addressing.  */
7492       if (CONSTANT_P (XEXP (x, 0)))
7493         fputs ("%g0+", file);
7494       output_address (XEXP (x, 0));
7495       fputc (']', file);
7496     }
7497   else if (GET_CODE (x) == HIGH)
7498     {
7499       fputs ("%hi(", file);
7500       output_addr_const (file, XEXP (x, 0));
7501       fputc (')', file);
7502     }
7503   else if (GET_CODE (x) == LO_SUM)
7504     {
7505       print_operand (file, XEXP (x, 0), 0);
7506       if (TARGET_CM_MEDMID)
7507         fputs ("+%l44(", file);
7508       else
7509         fputs ("+%lo(", file);
7510       output_addr_const (file, XEXP (x, 1));
7511       fputc (')', file);
7512     }
7513   else if (GET_CODE (x) == CONST_DOUBLE
7514            && (GET_MODE (x) == VOIDmode
7515                || GET_MODE_CLASS (GET_MODE (x)) == MODE_INT))
7516     {
7517       if (CONST_DOUBLE_HIGH (x) == 0)
7518         fprintf (file, "%u", (unsigned int) CONST_DOUBLE_LOW (x));
7519       else if (CONST_DOUBLE_HIGH (x) == -1
7520                && CONST_DOUBLE_LOW (x) < 0)
7521         fprintf (file, "%d", (int) CONST_DOUBLE_LOW (x));
7522       else
7523         output_operand_lossage ("long long constant not a valid immediate operand");
7524     }
7525   else if (GET_CODE (x) == CONST_DOUBLE)
7526     output_operand_lossage ("floating point constant not a valid immediate operand");
7527   else { output_addr_const (file, x); }
7528 }
7529 \f
7530 /* Target hook for assembling integer objects.  The sparc version has
7531    special handling for aligned DI-mode objects.  */
7532
7533 static bool
7534 sparc_assemble_integer (rtx x, unsigned int size, int aligned_p)
7535 {
7536   /* ??? We only output .xword's for symbols and only then in environments
7537      where the assembler can handle them.  */
7538   if (aligned_p && size == 8
7539       && (GET_CODE (x) != CONST_INT && GET_CODE (x) != CONST_DOUBLE))
7540     {
7541       if (TARGET_V9)
7542         {
7543           assemble_integer_with_op ("\t.xword\t", x);
7544           return true;
7545         }
7546       else
7547         {
7548           assemble_aligned_integer (4, const0_rtx);
7549           assemble_aligned_integer (4, x);
7550           return true;
7551         }
7552     }
7553   return default_assemble_integer (x, size, aligned_p);
7554 }
7555 \f
7556 /* Return the value of a code used in the .proc pseudo-op that says
7557    what kind of result this function returns.  For non-C types, we pick
7558    the closest C type.  */
7559
7560 #ifndef SHORT_TYPE_SIZE
7561 #define SHORT_TYPE_SIZE (BITS_PER_UNIT * 2)
7562 #endif
7563
7564 #ifndef INT_TYPE_SIZE
7565 #define INT_TYPE_SIZE BITS_PER_WORD
7566 #endif
7567
7568 #ifndef LONG_TYPE_SIZE
7569 #define LONG_TYPE_SIZE BITS_PER_WORD
7570 #endif
7571
7572 #ifndef LONG_LONG_TYPE_SIZE
7573 #define LONG_LONG_TYPE_SIZE (BITS_PER_WORD * 2)
7574 #endif
7575
7576 #ifndef FLOAT_TYPE_SIZE
7577 #define FLOAT_TYPE_SIZE BITS_PER_WORD
7578 #endif
7579
7580 #ifndef DOUBLE_TYPE_SIZE
7581 #define DOUBLE_TYPE_SIZE (BITS_PER_WORD * 2)
7582 #endif
7583
7584 #ifndef LONG_DOUBLE_TYPE_SIZE
7585 #define LONG_DOUBLE_TYPE_SIZE (BITS_PER_WORD * 2)
7586 #endif
7587
7588 unsigned long
7589 sparc_type_code (register tree type)
7590 {
7591   register unsigned long qualifiers = 0;
7592   register unsigned shift;
7593
7594   /* Only the first 30 bits of the qualifier are valid.  We must refrain from
7595      setting more, since some assemblers will give an error for this.  Also,
7596      we must be careful to avoid shifts of 32 bits or more to avoid getting
7597      unpredictable results.  */
7598
7599   for (shift = 6; shift < 30; shift += 2, type = TREE_TYPE (type))
7600     {
7601       switch (TREE_CODE (type))
7602         {
7603         case ERROR_MARK:
7604           return qualifiers;
7605   
7606         case ARRAY_TYPE:
7607           qualifiers |= (3 << shift);
7608           break;
7609
7610         case FUNCTION_TYPE:
7611         case METHOD_TYPE:
7612           qualifiers |= (2 << shift);
7613           break;
7614
7615         case POINTER_TYPE:
7616         case REFERENCE_TYPE:
7617         case OFFSET_TYPE:
7618           qualifiers |= (1 << shift);
7619           break;
7620
7621         case RECORD_TYPE:
7622           return (qualifiers | 8);
7623
7624         case UNION_TYPE:
7625         case QUAL_UNION_TYPE:
7626           return (qualifiers | 9);
7627
7628         case ENUMERAL_TYPE:
7629           return (qualifiers | 10);
7630
7631         case VOID_TYPE:
7632           return (qualifiers | 16);
7633
7634         case INTEGER_TYPE:
7635           /* If this is a range type, consider it to be the underlying
7636              type.  */
7637           if (TREE_TYPE (type) != 0)
7638             break;
7639
7640           /* Carefully distinguish all the standard types of C,
7641              without messing up if the language is not C.  We do this by
7642              testing TYPE_PRECISION and TYPE_UNSIGNED.  The old code used to
7643              look at both the names and the above fields, but that's redundant.
7644              Any type whose size is between two C types will be considered
7645              to be the wider of the two types.  Also, we do not have a
7646              special code to use for "long long", so anything wider than
7647              long is treated the same.  Note that we can't distinguish
7648              between "int" and "long" in this code if they are the same
7649              size, but that's fine, since neither can the assembler.  */
7650
7651           if (TYPE_PRECISION (type) <= CHAR_TYPE_SIZE)
7652             return (qualifiers | (TYPE_UNSIGNED (type) ? 12 : 2));
7653   
7654           else if (TYPE_PRECISION (type) <= SHORT_TYPE_SIZE)
7655             return (qualifiers | (TYPE_UNSIGNED (type) ? 13 : 3));
7656   
7657           else if (TYPE_PRECISION (type) <= INT_TYPE_SIZE)
7658             return (qualifiers | (TYPE_UNSIGNED (type) ? 14 : 4));
7659   
7660           else
7661             return (qualifiers | (TYPE_UNSIGNED (type) ? 15 : 5));
7662   
7663         case REAL_TYPE:
7664           /* If this is a range type, consider it to be the underlying
7665              type.  */
7666           if (TREE_TYPE (type) != 0)
7667             break;
7668
7669           /* Carefully distinguish all the standard types of C,
7670              without messing up if the language is not C.  */
7671
7672           if (TYPE_PRECISION (type) == FLOAT_TYPE_SIZE)
7673             return (qualifiers | 6);
7674
7675           else 
7676             return (qualifiers | 7);
7677   
7678         case COMPLEX_TYPE:      /* GNU Fortran COMPLEX type.  */
7679           /* ??? We need to distinguish between double and float complex types,
7680              but I don't know how yet because I can't reach this code from
7681              existing front-ends.  */
7682           return (qualifiers | 7);      /* Who knows? */
7683
7684         case VECTOR_TYPE:
7685         case CHAR_TYPE:         /* GNU Pascal CHAR type.  Not used in C.  */
7686         case BOOLEAN_TYPE:      /* GNU Fortran BOOLEAN type.  */
7687         case FILE_TYPE:         /* GNU Pascal FILE type.  */
7688         case SET_TYPE:          /* GNU Pascal SET type.  */
7689         case LANG_TYPE:         /* ? */
7690           return qualifiers;
7691   
7692         default:
7693           abort ();             /* Not a type! */
7694         }
7695     }
7696
7697   return qualifiers;
7698 }
7699 \f
7700 /* Nested function support.  */
7701
7702 /* Emit RTL insns to initialize the variable parts of a trampoline.
7703    FNADDR is an RTX for the address of the function's pure code.
7704    CXT is an RTX for the static chain value for the function.
7705
7706    This takes 16 insns: 2 shifts & 2 ands (to split up addresses), 4 sethi
7707    (to load in opcodes), 4 iors (to merge address and opcodes), and 4 writes
7708    (to store insns).  This is a bit excessive.  Perhaps a different
7709    mechanism would be better here.
7710
7711    Emit enough FLUSH insns to synchronize the data and instruction caches.  */
7712
7713 void
7714 sparc_initialize_trampoline (rtx tramp, rtx fnaddr, rtx cxt)
7715 {
7716   /* SPARC 32-bit trampoline:
7717
7718         sethi   %hi(fn), %g1
7719         sethi   %hi(static), %g2
7720         jmp     %g1+%lo(fn)
7721         or      %g2, %lo(static), %g2
7722
7723     SETHI i,r  = 00rr rrr1 00ii iiii iiii iiii iiii iiii
7724     JMPL r+i,d = 10dd ddd1 1100 0rrr rr1i iiii iiii iiii
7725    */
7726
7727   emit_move_insn
7728     (gen_rtx_MEM (SImode, plus_constant (tramp, 0)),
7729      expand_binop (SImode, ior_optab,
7730                    expand_shift (RSHIFT_EXPR, SImode, fnaddr,
7731                                  size_int (10), 0, 1),
7732                    GEN_INT (trunc_int_for_mode (0x03000000, SImode)),
7733                    NULL_RTX, 1, OPTAB_DIRECT));
7734
7735   emit_move_insn
7736     (gen_rtx_MEM (SImode, plus_constant (tramp, 4)),
7737      expand_binop (SImode, ior_optab,
7738                    expand_shift (RSHIFT_EXPR, SImode, cxt,
7739                                  size_int (10), 0, 1),
7740                    GEN_INT (trunc_int_for_mode (0x05000000, SImode)),
7741                    NULL_RTX, 1, OPTAB_DIRECT));
7742
7743   emit_move_insn
7744     (gen_rtx_MEM (SImode, plus_constant (tramp, 8)),
7745      expand_binop (SImode, ior_optab,
7746                    expand_and (SImode, fnaddr, GEN_INT (0x3ff), NULL_RTX),
7747                    GEN_INT (trunc_int_for_mode (0x81c06000, SImode)),
7748                    NULL_RTX, 1, OPTAB_DIRECT));
7749
7750   emit_move_insn
7751     (gen_rtx_MEM (SImode, plus_constant (tramp, 12)),
7752      expand_binop (SImode, ior_optab,
7753                    expand_and (SImode, cxt, GEN_INT (0x3ff), NULL_RTX),
7754                    GEN_INT (trunc_int_for_mode (0x8410a000, SImode)),
7755                    NULL_RTX, 1, OPTAB_DIRECT));
7756
7757   /* On UltraSPARC a flush flushes an entire cache line.  The trampoline is
7758      aligned on a 16 byte boundary so one flush clears it all.  */
7759   emit_insn (gen_flush (validize_mem (gen_rtx_MEM (SImode, tramp))));
7760   if (sparc_cpu != PROCESSOR_ULTRASPARC
7761       && sparc_cpu != PROCESSOR_ULTRASPARC3)
7762     emit_insn (gen_flush (validize_mem (gen_rtx_MEM (SImode,
7763                                                      plus_constant (tramp, 8)))));
7764
7765   /* Call __enable_execute_stack after writing onto the stack to make sure
7766      the stack address is accessible.  */
7767 #ifdef ENABLE_EXECUTE_STACK
7768   emit_library_call (gen_rtx_SYMBOL_REF (Pmode, "__enable_execute_stack"),
7769                      LCT_NORMAL, VOIDmode, 1, tramp, Pmode);
7770 #endif
7771
7772 }
7773
7774 /* The 64-bit version is simpler because it makes more sense to load the
7775    values as "immediate" data out of the trampoline.  It's also easier since
7776    we can read the PC without clobbering a register.  */
7777
7778 void
7779 sparc64_initialize_trampoline (rtx tramp, rtx fnaddr, rtx cxt)
7780 {
7781   /* SPARC 64-bit trampoline:
7782
7783         rd      %pc, %g1
7784         ldx     [%g1+24], %g5
7785         jmp     %g5
7786         ldx     [%g1+16], %g5
7787         +16 bytes data
7788    */
7789
7790   emit_move_insn (gen_rtx_MEM (SImode, tramp),
7791                   GEN_INT (trunc_int_for_mode (0x83414000, SImode)));
7792   emit_move_insn (gen_rtx_MEM (SImode, plus_constant (tramp, 4)),
7793                   GEN_INT (trunc_int_for_mode (0xca586018, SImode)));
7794   emit_move_insn (gen_rtx_MEM (SImode, plus_constant (tramp, 8)),
7795                   GEN_INT (trunc_int_for_mode (0x81c14000, SImode)));
7796   emit_move_insn (gen_rtx_MEM (SImode, plus_constant (tramp, 12)),
7797                   GEN_INT (trunc_int_for_mode (0xca586010, SImode)));
7798   emit_move_insn (gen_rtx_MEM (DImode, plus_constant (tramp, 16)), cxt);
7799   emit_move_insn (gen_rtx_MEM (DImode, plus_constant (tramp, 24)), fnaddr);
7800   emit_insn (gen_flushdi (validize_mem (gen_rtx_MEM (DImode, tramp))));
7801
7802   if (sparc_cpu != PROCESSOR_ULTRASPARC
7803       && sparc_cpu != PROCESSOR_ULTRASPARC3)
7804     emit_insn (gen_flushdi (validize_mem (gen_rtx_MEM (DImode, plus_constant (tramp, 8)))));
7805
7806   /* Call __enable_execute_stack after writing onto the stack to make sure
7807      the stack address is accessible.  */
7808 #ifdef ENABLE_EXECUTE_STACK
7809   emit_library_call (gen_rtx_SYMBOL_REF (Pmode, "__enable_execute_stack"),
7810                      LCT_NORMAL, VOIDmode, 1, tramp, Pmode);
7811 #endif
7812 }
7813 \f
7814 /* Adjust the cost of a scheduling dependency.  Return the new cost of
7815    a dependency LINK or INSN on DEP_INSN.  COST is the current cost.  */
7816
7817 static int
7818 supersparc_adjust_cost (rtx insn, rtx link, rtx dep_insn, int cost)
7819 {
7820   enum attr_type insn_type;
7821
7822   if (! recog_memoized (insn))
7823     return 0;
7824
7825   insn_type = get_attr_type (insn);
7826
7827   if (REG_NOTE_KIND (link) == 0)
7828     {
7829       /* Data dependency; DEP_INSN writes a register that INSN reads some
7830          cycles later.  */
7831
7832       /* if a load, then the dependence must be on the memory address;
7833          add an extra "cycle".  Note that the cost could be two cycles
7834          if the reg was written late in an instruction group; we ca not tell
7835          here.  */
7836       if (insn_type == TYPE_LOAD || insn_type == TYPE_FPLOAD)
7837         return cost + 3;
7838
7839       /* Get the delay only if the address of the store is the dependence.  */
7840       if (insn_type == TYPE_STORE || insn_type == TYPE_FPSTORE)
7841         {
7842           rtx pat = PATTERN(insn);
7843           rtx dep_pat = PATTERN (dep_insn);
7844
7845           if (GET_CODE (pat) != SET || GET_CODE (dep_pat) != SET)
7846             return cost;  /* This should not happen!  */
7847
7848           /* The dependency between the two instructions was on the data that
7849              is being stored.  Assume that this implies that the address of the
7850              store is not dependent.  */
7851           if (rtx_equal_p (SET_DEST (dep_pat), SET_SRC (pat)))
7852             return cost;
7853
7854           return cost + 3;  /* An approximation.  */
7855         }
7856
7857       /* A shift instruction cannot receive its data from an instruction
7858          in the same cycle; add a one cycle penalty.  */
7859       if (insn_type == TYPE_SHIFT)
7860         return cost + 3;   /* Split before cascade into shift.  */
7861     }
7862   else
7863     {
7864       /* Anti- or output- dependency; DEP_INSN reads/writes a register that
7865          INSN writes some cycles later.  */
7866
7867       /* These are only significant for the fpu unit; writing a fp reg before
7868          the fpu has finished with it stalls the processor.  */
7869
7870       /* Reusing an integer register causes no problems.  */
7871       if (insn_type == TYPE_IALU || insn_type == TYPE_SHIFT)
7872         return 0;
7873     }
7874         
7875   return cost;
7876 }
7877
7878 static int
7879 hypersparc_adjust_cost (rtx insn, rtx link, rtx dep_insn, int cost)
7880 {
7881   enum attr_type insn_type, dep_type;
7882   rtx pat = PATTERN(insn);
7883   rtx dep_pat = PATTERN (dep_insn);
7884
7885   if (recog_memoized (insn) < 0 || recog_memoized (dep_insn) < 0)
7886     return cost;
7887
7888   insn_type = get_attr_type (insn);
7889   dep_type = get_attr_type (dep_insn);
7890
7891   switch (REG_NOTE_KIND (link))
7892     {
7893     case 0:
7894       /* Data dependency; DEP_INSN writes a register that INSN reads some
7895          cycles later.  */
7896
7897       switch (insn_type)
7898         {
7899         case TYPE_STORE:
7900         case TYPE_FPSTORE:
7901           /* Get the delay iff the address of the store is the dependence.  */
7902           if (GET_CODE (pat) != SET || GET_CODE (dep_pat) != SET)
7903             return cost;
7904
7905           if (rtx_equal_p (SET_DEST (dep_pat), SET_SRC (pat)))
7906             return cost;
7907           return cost + 3;
7908
7909         case TYPE_LOAD:
7910         case TYPE_SLOAD:
7911         case TYPE_FPLOAD:
7912           /* If a load, then the dependence must be on the memory address.  If
7913              the addresses aren't equal, then it might be a false dependency */
7914           if (dep_type == TYPE_STORE || dep_type == TYPE_FPSTORE)
7915             {
7916               if (GET_CODE (pat) != SET || GET_CODE (dep_pat) != SET
7917                   || GET_CODE (SET_DEST (dep_pat)) != MEM        
7918                   || GET_CODE (SET_SRC (pat)) != MEM
7919                   || ! rtx_equal_p (XEXP (SET_DEST (dep_pat), 0),
7920                                     XEXP (SET_SRC (pat), 0)))
7921                 return cost + 2;
7922
7923               return cost + 8;        
7924             }
7925           break;
7926
7927         case TYPE_BRANCH:
7928           /* Compare to branch latency is 0.  There is no benefit from
7929              separating compare and branch.  */
7930           if (dep_type == TYPE_COMPARE)
7931             return 0;
7932           /* Floating point compare to branch latency is less than
7933              compare to conditional move.  */
7934           if (dep_type == TYPE_FPCMP)
7935             return cost - 1;
7936           break;
7937         default:
7938           break;
7939         }
7940         break;
7941
7942     case REG_DEP_ANTI:
7943       /* Anti-dependencies only penalize the fpu unit.  */
7944       if (insn_type == TYPE_IALU || insn_type == TYPE_SHIFT)
7945         return 0;
7946       break;
7947
7948     default:
7949       break;
7950     }    
7951
7952   return cost;
7953 }
7954
7955 static int
7956 sparc_adjust_cost(rtx insn, rtx link, rtx dep, int cost)
7957 {
7958   switch (sparc_cpu)
7959     {
7960     case PROCESSOR_SUPERSPARC:
7961       cost = supersparc_adjust_cost (insn, link, dep, cost);
7962       break;
7963     case PROCESSOR_HYPERSPARC:
7964     case PROCESSOR_SPARCLITE86X:
7965       cost = hypersparc_adjust_cost (insn, link, dep, cost);
7966       break;
7967     default:
7968       break;
7969     }
7970   return cost;
7971 }
7972
7973 static void
7974 sparc_sched_init (FILE *dump ATTRIBUTE_UNUSED,
7975                   int sched_verbose ATTRIBUTE_UNUSED,
7976                   int max_ready ATTRIBUTE_UNUSED)
7977 {
7978 }
7979   
7980 static int
7981 sparc_use_sched_lookahead (void)
7982 {
7983   if (sparc_cpu == PROCESSOR_ULTRASPARC
7984       || sparc_cpu == PROCESSOR_ULTRASPARC3)
7985     return 4;
7986   if ((1 << sparc_cpu) &
7987       ((1 << PROCESSOR_SUPERSPARC) | (1 << PROCESSOR_HYPERSPARC) |
7988        (1 << PROCESSOR_SPARCLITE86X)))
7989     return 3;
7990   return 0;
7991 }
7992
7993 static int
7994 sparc_issue_rate (void)
7995 {
7996   switch (sparc_cpu)
7997     {
7998     default:
7999       return 1;
8000     case PROCESSOR_V9:
8001       /* Assume V9 processors are capable of at least dual-issue.  */
8002       return 2;
8003     case PROCESSOR_SUPERSPARC:
8004       return 3;
8005     case PROCESSOR_HYPERSPARC:
8006     case PROCESSOR_SPARCLITE86X:
8007       return 2;
8008     case PROCESSOR_ULTRASPARC:
8009     case PROCESSOR_ULTRASPARC3:
8010       return 4;
8011     }
8012 }
8013
8014 static int
8015 set_extends (rtx insn)
8016 {
8017   register rtx pat = PATTERN (insn);
8018
8019   switch (GET_CODE (SET_SRC (pat)))
8020     {
8021       /* Load and some shift instructions zero extend.  */
8022     case MEM:
8023     case ZERO_EXTEND:
8024       /* sethi clears the high bits */
8025     case HIGH:
8026       /* LO_SUM is used with sethi.  sethi cleared the high
8027          bits and the values used with lo_sum are positive */
8028     case LO_SUM:
8029       /* Store flag stores 0 or 1 */
8030     case LT: case LTU:
8031     case GT: case GTU:
8032     case LE: case LEU:
8033     case GE: case GEU:
8034     case EQ:
8035     case NE:
8036       return 1;
8037     case AND:
8038       {
8039         rtx op0 = XEXP (SET_SRC (pat), 0);
8040         rtx op1 = XEXP (SET_SRC (pat), 1);
8041         if (GET_CODE (op1) == CONST_INT)
8042           return INTVAL (op1) >= 0;
8043         if (GET_CODE (op0) != REG)
8044           return 0;
8045         if (sparc_check_64 (op0, insn) == 1)
8046           return 1;
8047         return (GET_CODE (op1) == REG && sparc_check_64 (op1, insn) == 1);
8048       }
8049     case IOR:
8050     case XOR:
8051       {
8052         rtx op0 = XEXP (SET_SRC (pat), 0);
8053         rtx op1 = XEXP (SET_SRC (pat), 1);
8054         if (GET_CODE (op0) != REG || sparc_check_64 (op0, insn) <= 0)
8055           return 0;
8056         if (GET_CODE (op1) == CONST_INT)
8057           return INTVAL (op1) >= 0;
8058         return (GET_CODE (op1) == REG && sparc_check_64 (op1, insn) == 1);
8059       }
8060     case LSHIFTRT:
8061       return GET_MODE (SET_SRC (pat)) == SImode;
8062       /* Positive integers leave the high bits zero.  */
8063     case CONST_DOUBLE:
8064       return ! (CONST_DOUBLE_LOW (SET_SRC (pat)) & 0x80000000);
8065     case CONST_INT:
8066       return ! (INTVAL (SET_SRC (pat)) & 0x80000000);
8067     case ASHIFTRT:
8068     case SIGN_EXTEND:
8069       return - (GET_MODE (SET_SRC (pat)) == SImode);
8070     case REG:
8071       return sparc_check_64 (SET_SRC (pat), insn);
8072     default:
8073       return 0;
8074     }
8075 }
8076
8077 /* We _ought_ to have only one kind per function, but...  */
8078 static GTY(()) rtx sparc_addr_diff_list;
8079 static GTY(()) rtx sparc_addr_list;
8080
8081 void
8082 sparc_defer_case_vector (rtx lab, rtx vec, int diff)
8083 {
8084   vec = gen_rtx_EXPR_LIST (VOIDmode, lab, vec);
8085   if (diff)
8086     sparc_addr_diff_list
8087       = gen_rtx_EXPR_LIST (VOIDmode, vec, sparc_addr_diff_list);
8088   else
8089     sparc_addr_list = gen_rtx_EXPR_LIST (VOIDmode, vec, sparc_addr_list);
8090 }
8091
8092 static void 
8093 sparc_output_addr_vec (rtx vec)
8094 {
8095   rtx lab = XEXP (vec, 0), body = XEXP (vec, 1);
8096   int idx, vlen = XVECLEN (body, 0);
8097
8098 #ifdef ASM_OUTPUT_ADDR_VEC_START  
8099   ASM_OUTPUT_ADDR_VEC_START (asm_out_file);
8100 #endif
8101
8102 #ifdef ASM_OUTPUT_CASE_LABEL
8103   ASM_OUTPUT_CASE_LABEL (asm_out_file, "L", CODE_LABEL_NUMBER (lab),
8104                          NEXT_INSN (lab));
8105 #else
8106   (*targetm.asm_out.internal_label) (asm_out_file, "L", CODE_LABEL_NUMBER (lab));
8107 #endif
8108
8109   for (idx = 0; idx < vlen; idx++)
8110     {
8111       ASM_OUTPUT_ADDR_VEC_ELT
8112         (asm_out_file, CODE_LABEL_NUMBER (XEXP (XVECEXP (body, 0, idx), 0)));
8113     }
8114     
8115 #ifdef ASM_OUTPUT_ADDR_VEC_END
8116   ASM_OUTPUT_ADDR_VEC_END (asm_out_file);
8117 #endif
8118 }
8119
8120 static void 
8121 sparc_output_addr_diff_vec (rtx vec)
8122 {
8123   rtx lab = XEXP (vec, 0), body = XEXP (vec, 1);
8124   rtx base = XEXP (XEXP (body, 0), 0);
8125   int idx, vlen = XVECLEN (body, 1);
8126
8127 #ifdef ASM_OUTPUT_ADDR_VEC_START  
8128   ASM_OUTPUT_ADDR_VEC_START (asm_out_file);
8129 #endif
8130
8131 #ifdef ASM_OUTPUT_CASE_LABEL
8132   ASM_OUTPUT_CASE_LABEL (asm_out_file, "L", CODE_LABEL_NUMBER (lab),
8133                          NEXT_INSN (lab));
8134 #else
8135   (*targetm.asm_out.internal_label) (asm_out_file, "L", CODE_LABEL_NUMBER (lab));
8136 #endif
8137
8138   for (idx = 0; idx < vlen; idx++)
8139     {
8140       ASM_OUTPUT_ADDR_DIFF_ELT
8141         (asm_out_file,
8142          body,
8143          CODE_LABEL_NUMBER (XEXP (XVECEXP (body, 1, idx), 0)),
8144          CODE_LABEL_NUMBER (base));
8145     }
8146     
8147 #ifdef ASM_OUTPUT_ADDR_VEC_END
8148   ASM_OUTPUT_ADDR_VEC_END (asm_out_file);
8149 #endif
8150 }
8151
8152 static void
8153 sparc_output_deferred_case_vectors (void)
8154 {
8155   rtx t;
8156   int align;
8157
8158   if (sparc_addr_list == NULL_RTX
8159       && sparc_addr_diff_list == NULL_RTX)
8160     return;
8161
8162   /* Align to cache line in the function's code section.  */
8163   function_section (current_function_decl);
8164
8165   align = floor_log2 (FUNCTION_BOUNDARY / BITS_PER_UNIT);
8166   if (align > 0)
8167     ASM_OUTPUT_ALIGN (asm_out_file, align);
8168   
8169   for (t = sparc_addr_list; t ; t = XEXP (t, 1))
8170     sparc_output_addr_vec (XEXP (t, 0));
8171   for (t = sparc_addr_diff_list; t ; t = XEXP (t, 1))
8172     sparc_output_addr_diff_vec (XEXP (t, 0));
8173
8174   sparc_addr_list = sparc_addr_diff_list = NULL_RTX;
8175 }
8176
8177 /* Return 0 if the high 32 bits of X (the low word of X, if DImode) are
8178    unknown.  Return 1 if the high bits are zero, -1 if the register is
8179    sign extended.  */
8180 int
8181 sparc_check_64 (rtx x, rtx insn)
8182 {
8183   /* If a register is set only once it is safe to ignore insns this
8184      code does not know how to handle.  The loop will either recognize
8185      the single set and return the correct value or fail to recognize
8186      it and return 0.  */
8187   int set_once = 0;
8188   rtx y = x;
8189
8190   if (GET_CODE (x) != REG)
8191     abort ();
8192
8193   if (GET_MODE (x) == DImode)
8194     y = gen_rtx_REG (SImode, REGNO (x) + WORDS_BIG_ENDIAN);
8195
8196   if (flag_expensive_optimizations
8197       && REG_N_SETS (REGNO (y)) == 1)
8198     set_once = 1;
8199
8200   if (insn == 0)
8201     {
8202       if (set_once)
8203         insn = get_last_insn_anywhere ();
8204       else
8205         return 0;
8206     }
8207
8208   while ((insn = PREV_INSN (insn)))
8209     {
8210       switch (GET_CODE (insn))
8211         {
8212         case JUMP_INSN:
8213         case NOTE:
8214           break;
8215         case CODE_LABEL:
8216         case CALL_INSN:
8217         default:
8218           if (! set_once)
8219             return 0;
8220           break;
8221         case INSN:
8222           {
8223             rtx pat = PATTERN (insn);
8224             if (GET_CODE (pat) != SET)
8225               return 0;
8226             if (rtx_equal_p (x, SET_DEST (pat)))
8227               return set_extends (insn);
8228             if (y && rtx_equal_p (y, SET_DEST (pat)))
8229               return set_extends (insn);
8230             if (reg_overlap_mentioned_p (SET_DEST (pat), y))
8231               return 0;
8232           }
8233         }
8234     }
8235   return 0;
8236 }
8237
8238 /* Returns assembly code to perform a DImode shift using
8239    a 64-bit global or out register on SPARC-V8+.  */
8240 const char *
8241 output_v8plus_shift (rtx *operands, rtx insn, const char *opcode)
8242 {
8243   static char asm_code[60];
8244
8245   /* The scratch register is only required when the destination
8246      register is not a 64-bit global or out register.  */
8247   if (which_alternative != 2)
8248     operands[3] = operands[0];
8249
8250   /* We can only shift by constants <= 63. */
8251   if (GET_CODE (operands[2]) == CONST_INT)
8252     operands[2] = GEN_INT (INTVAL (operands[2]) & 0x3f);
8253
8254   if (GET_CODE (operands[1]) == CONST_INT)
8255     {
8256       output_asm_insn ("mov\t%1, %3", operands);
8257     }
8258   else
8259     {
8260       output_asm_insn ("sllx\t%H1, 32, %3", operands);
8261       if (sparc_check_64 (operands[1], insn) <= 0)
8262         output_asm_insn ("srl\t%L1, 0, %L1", operands);
8263       output_asm_insn ("or\t%L1, %3, %3", operands);
8264     }
8265
8266   strcpy(asm_code, opcode);
8267
8268   if (which_alternative != 2)
8269     return strcat (asm_code, "\t%0, %2, %L0\n\tsrlx\t%L0, 32, %H0");
8270   else
8271     return strcat (asm_code, "\t%3, %2, %3\n\tsrlx\t%3, 32, %H0\n\tmov\t%3, %L0");
8272 }
8273 \f
8274 /* Output rtl to increment the profiler label LABELNO
8275    for profiling a function entry.  */
8276
8277 void
8278 sparc_profile_hook (int labelno)
8279 {
8280   char buf[32];
8281   rtx lab, fun;
8282
8283   ASM_GENERATE_INTERNAL_LABEL (buf, "LP", labelno);
8284   lab = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (buf));
8285   fun = gen_rtx_SYMBOL_REF (Pmode, MCOUNT_FUNCTION);
8286
8287   emit_library_call (fun, LCT_NORMAL, VOIDmode, 1, lab, Pmode);
8288 }
8289 \f
8290 #ifdef OBJECT_FORMAT_ELF
8291 static void
8292 sparc_elf_asm_named_section (const char *name, unsigned int flags,
8293                              tree decl)
8294 {
8295   if (flags & SECTION_MERGE)
8296     {
8297       /* entsize cannot be expressed in this section attributes
8298          encoding style.  */
8299       default_elf_asm_named_section (name, flags, decl);
8300       return;
8301     }
8302
8303   fprintf (asm_out_file, "\t.section\t\"%s\"", name);
8304
8305   if (!(flags & SECTION_DEBUG))
8306     fputs (",#alloc", asm_out_file);
8307   if (flags & SECTION_WRITE)
8308     fputs (",#write", asm_out_file);
8309   if (flags & SECTION_TLS)
8310     fputs (",#tls", asm_out_file);
8311   if (flags & SECTION_CODE)
8312     fputs (",#execinstr", asm_out_file);
8313
8314   /* ??? Handle SECTION_BSS.  */
8315
8316   fputc ('\n', asm_out_file);
8317 }
8318 #endif /* OBJECT_FORMAT_ELF */
8319
8320 /* We do not allow indirect calls to be optimized into sibling calls.
8321
8322    We cannot use sibling calls when delayed branches are disabled
8323    because they will likely require the call delay slot to be filled.
8324
8325    Also, on SPARC 32-bit we cannot emit a sibling call when the
8326    current function returns a structure.  This is because the "unimp
8327    after call" convention would cause the callee to return to the
8328    wrong place.  The generic code already disallows cases where the
8329    function being called returns a structure.
8330
8331    It may seem strange how this last case could occur.  Usually there
8332    is code after the call which jumps to epilogue code which dumps the
8333    return value into the struct return area.  That ought to invalidate
8334    the sibling call right?  Well, in the C++ case we can end up passing
8335    the pointer to the struct return area to a constructor (which returns
8336    void) and then nothing else happens.  Such a sibling call would look
8337    valid without the added check here.  */
8338 static bool
8339 sparc_function_ok_for_sibcall (tree decl, tree exp ATTRIBUTE_UNUSED)
8340 {
8341   return (decl
8342           && flag_delayed_branch
8343           && (TARGET_ARCH64 || ! current_function_returns_struct));
8344 }
8345 \f
8346 /* libfunc renaming.  */
8347 #include "config/gofast.h"
8348
8349 static void
8350 sparc_init_libfuncs (void)
8351 {
8352   if (TARGET_ARCH32)
8353     {
8354       /* Use the subroutines that Sun's library provides for integer
8355          multiply and divide.  The `*' prevents an underscore from
8356          being prepended by the compiler. .umul is a little faster
8357          than .mul.  */
8358       set_optab_libfunc (smul_optab, SImode, "*.umul");
8359       set_optab_libfunc (sdiv_optab, SImode, "*.div");
8360       set_optab_libfunc (udiv_optab, SImode, "*.udiv");
8361       set_optab_libfunc (smod_optab, SImode, "*.rem");
8362       set_optab_libfunc (umod_optab, SImode, "*.urem");
8363
8364       /* TFmode arithmetic.  These names are part of the SPARC 32bit ABI.  */
8365       set_optab_libfunc (add_optab, TFmode, "_Q_add");
8366       set_optab_libfunc (sub_optab, TFmode, "_Q_sub");
8367       set_optab_libfunc (neg_optab, TFmode, "_Q_neg");
8368       set_optab_libfunc (smul_optab, TFmode, "_Q_mul");
8369       set_optab_libfunc (sdiv_optab, TFmode, "_Q_div");
8370
8371       /* We can define the TFmode sqrt optab only if TARGET_FPU.  This
8372          is because with soft-float, the SFmode and DFmode sqrt
8373          instructions will be absent, and the compiler will notice and
8374          try to use the TFmode sqrt instruction for calls to the
8375          builtin function sqrt, but this fails.  */
8376       if (TARGET_FPU)
8377         set_optab_libfunc (sqrt_optab, TFmode, "_Q_sqrt");
8378
8379       set_optab_libfunc (eq_optab, TFmode, "_Q_feq");
8380       set_optab_libfunc (ne_optab, TFmode, "_Q_fne");
8381       set_optab_libfunc (gt_optab, TFmode, "_Q_fgt");
8382       set_optab_libfunc (ge_optab, TFmode, "_Q_fge");
8383       set_optab_libfunc (lt_optab, TFmode, "_Q_flt");
8384       set_optab_libfunc (le_optab, TFmode, "_Q_fle");
8385
8386       set_conv_libfunc (sext_optab,   TFmode, SFmode, "_Q_stoq");
8387       set_conv_libfunc (sext_optab,   TFmode, DFmode, "_Q_dtoq");
8388       set_conv_libfunc (trunc_optab,  SFmode, TFmode, "_Q_qtos");
8389       set_conv_libfunc (trunc_optab,  DFmode, TFmode, "_Q_qtod");
8390
8391       set_conv_libfunc (sfix_optab,   SImode, TFmode, "_Q_qtoi");
8392       set_conv_libfunc (ufix_optab,   SImode, TFmode, "_Q_qtou");
8393       set_conv_libfunc (sfloat_optab, TFmode, SImode, "_Q_itoq");
8394
8395       if (DITF_CONVERSION_LIBFUNCS)
8396         {
8397           set_conv_libfunc (sfix_optab,   DImode, TFmode, "_Q_qtoll");
8398           set_conv_libfunc (ufix_optab,   DImode, TFmode, "_Q_qtoull");
8399           set_conv_libfunc (sfloat_optab, TFmode, DImode, "_Q_lltoq");
8400         }
8401
8402       if (SUN_CONVERSION_LIBFUNCS)
8403         {
8404           set_conv_libfunc (sfix_optab, DImode, SFmode, "__ftoll");
8405           set_conv_libfunc (ufix_optab, DImode, SFmode, "__ftoull");
8406           set_conv_libfunc (sfix_optab, DImode, DFmode, "__dtoll");
8407           set_conv_libfunc (ufix_optab, DImode, DFmode, "__dtoull");
8408         }
8409     }
8410   if (TARGET_ARCH64)
8411     {
8412       /* In the SPARC 64bit ABI, SImode multiply and divide functions
8413          do not exist in the library.  Make sure the compiler does not
8414          emit calls to them by accident.  (It should always use the
8415          hardware instructions.)  */
8416       set_optab_libfunc (smul_optab, SImode, 0);
8417       set_optab_libfunc (sdiv_optab, SImode, 0);
8418       set_optab_libfunc (udiv_optab, SImode, 0);
8419       set_optab_libfunc (smod_optab, SImode, 0);
8420       set_optab_libfunc (umod_optab, SImode, 0);
8421
8422       if (SUN_INTEGER_MULTIPLY_64)
8423         {
8424           set_optab_libfunc (smul_optab, DImode, "__mul64");
8425           set_optab_libfunc (sdiv_optab, DImode, "__div64");
8426           set_optab_libfunc (udiv_optab, DImode, "__udiv64");
8427           set_optab_libfunc (smod_optab, DImode, "__rem64");
8428           set_optab_libfunc (umod_optab, DImode, "__urem64");
8429         }
8430
8431       if (SUN_CONVERSION_LIBFUNCS)
8432         {
8433           set_conv_libfunc (sfix_optab, DImode, SFmode, "__ftol");
8434           set_conv_libfunc (ufix_optab, DImode, SFmode, "__ftoul");
8435           set_conv_libfunc (sfix_optab, DImode, DFmode, "__dtol");
8436           set_conv_libfunc (ufix_optab, DImode, DFmode, "__dtoul");
8437         }
8438     }
8439
8440   gofast_maybe_init_libfuncs ();
8441 }
8442 \f
8443 int
8444 sparc_extra_constraint_check (rtx op, int c, int strict)
8445 {
8446   int reload_ok_mem;
8447
8448   if (TARGET_ARCH64
8449       && (c == 'T' || c == 'U'))
8450     return 0;
8451
8452   switch (c)
8453     {
8454     case 'Q':
8455       return fp_sethi_p (op);
8456
8457     case 'R':
8458       return fp_mov_p (op);
8459
8460     case 'S':
8461       return fp_high_losum_p (op);
8462
8463     case 'U':
8464       if (! strict
8465           || (GET_CODE (op) == REG
8466               && (REGNO (op) < FIRST_PSEUDO_REGISTER
8467                   || reg_renumber[REGNO (op)] >= 0)))
8468         return register_ok_for_ldd (op);
8469
8470       return 0;
8471
8472     case 'W':
8473     case 'T':
8474       break;
8475
8476     case 'Y':
8477       return fp_zero_operand (op, GET_MODE (op));
8478
8479     default:
8480       return 0;
8481     }
8482
8483   /* Our memory extra constraints have to emulate the
8484      behavior of 'm' and 'o' in order for reload to work
8485      correctly.  */
8486   if (GET_CODE (op) == MEM)
8487     {
8488       reload_ok_mem = 0;
8489       if ((TARGET_ARCH64 || mem_min_alignment (op, 8))
8490           && (! strict
8491               || strict_memory_address_p (Pmode, XEXP (op, 0))))
8492         reload_ok_mem = 1;
8493     }
8494   else
8495     {
8496       reload_ok_mem = (reload_in_progress
8497                        && GET_CODE (op) == REG
8498                        && REGNO (op) >= FIRST_PSEUDO_REGISTER
8499                        && reg_renumber [REGNO (op)] < 0);
8500     }
8501
8502   return reload_ok_mem;
8503 }
8504
8505 /* ??? This duplicates information provided to the compiler by the
8506    ??? scheduler description.  Some day, teach genautomata to output
8507    ??? the latencies and then CSE will just use that.  */
8508
8509 static bool
8510 sparc_rtx_costs (rtx x, int code, int outer_code, int *total)
8511 {
8512   enum machine_mode mode = GET_MODE (x);
8513   bool float_mode_p = FLOAT_MODE_P (mode);
8514
8515   switch (code)
8516     {
8517     case CONST_INT:
8518       if (INTVAL (x) < 0x1000 && INTVAL (x) >= -0x1000)
8519         {
8520           *total = 0;
8521           return true;
8522         }
8523       /* FALLTHRU */
8524
8525     case HIGH:
8526       *total = 2;
8527       return true;
8528
8529     case CONST:
8530     case LABEL_REF:
8531     case SYMBOL_REF:
8532       *total = 4;
8533       return true;
8534
8535     case CONST_DOUBLE:
8536       if (GET_MODE (x) == DImode
8537           && ((XINT (x, 3) == 0
8538                && (unsigned HOST_WIDE_INT) XINT (x, 2) < 0x1000)
8539               || (XINT (x, 3) == -1
8540                   && XINT (x, 2) < 0
8541                   && XINT (x, 2) >= -0x1000)))
8542         *total = 0;
8543       else
8544         *total = 8;
8545       return true;
8546
8547     case MEM:
8548       /* If outer-code was a sign or zero extension, a cost
8549          of COSTS_N_INSNS (1) was already added in.  This is
8550          why we are subtracting it back out.  */
8551       if (outer_code == ZERO_EXTEND)
8552         {
8553           *total = sparc_costs->int_zload - COSTS_N_INSNS (1);
8554         }
8555       else if (outer_code == SIGN_EXTEND)
8556         {
8557           *total = sparc_costs->int_sload - COSTS_N_INSNS (1);
8558         }
8559       else if (float_mode_p)
8560         {
8561           *total = sparc_costs->float_load;
8562         }
8563       else
8564         {
8565           *total = sparc_costs->int_load;
8566         }
8567
8568       return true;
8569
8570     case PLUS:
8571     case MINUS:
8572       if (float_mode_p)
8573         *total = sparc_costs->float_plusminus;
8574       else
8575         *total = COSTS_N_INSNS (1);
8576       return false;
8577
8578     case MULT:
8579       if (float_mode_p)
8580         *total = sparc_costs->float_mul;
8581       else if (! TARGET_HARD_MUL)
8582         *total = COSTS_N_INSNS (25);
8583       else
8584         {
8585           int bit_cost;
8586
8587           bit_cost = 0;
8588           if (sparc_costs->int_mul_bit_factor)
8589             {
8590               int nbits;
8591
8592               if (GET_CODE (XEXP (x, 1)) == CONST_INT)
8593                 {
8594                   unsigned HOST_WIDE_INT value = INTVAL (XEXP (x, 1));
8595                   for (nbits = 0; value != 0; value &= value - 1)
8596                     nbits++;
8597                 }
8598               else if (GET_CODE (XEXP (x, 1)) == CONST_DOUBLE
8599                        && GET_MODE (XEXP (x, 1)) == DImode)
8600                 {
8601                   rtx x1 = XEXP (x, 1);
8602                   unsigned HOST_WIDE_INT value1 = XINT (x1, 2);
8603                   unsigned HOST_WIDE_INT value2 = XINT (x1, 3);
8604
8605                   for (nbits = 0; value1 != 0; value1 &= value1 - 1)
8606                     nbits++;
8607                   for (; value2 != 0; value2 &= value2 - 1)
8608                     nbits++;
8609                 }
8610               else
8611                 nbits = 7;
8612
8613               if (nbits < 3)
8614                 nbits = 3;
8615               bit_cost = (nbits - 3) / sparc_costs->int_mul_bit_factor;
8616               bit_cost = COSTS_N_INSNS (bit_cost);
8617             }
8618
8619           if (mode == DImode)
8620             *total = sparc_costs->int_mulX + bit_cost;
8621           else
8622             *total = sparc_costs->int_mul + bit_cost;
8623         }
8624       return false;
8625
8626     case ASHIFT:
8627     case ASHIFTRT:
8628     case LSHIFTRT:
8629       *total = COSTS_N_INSNS (1) + sparc_costs->shift_penalty;
8630       return false;
8631
8632     case DIV:
8633     case UDIV:
8634     case MOD:
8635     case UMOD:
8636       if (float_mode_p)
8637         {
8638           if (mode == DFmode)
8639             *total = sparc_costs->float_div_df;
8640           else
8641             *total = sparc_costs->float_div_sf;
8642         }
8643       else
8644         {
8645           if (mode == DImode)
8646             *total = sparc_costs->int_divX;
8647           else
8648             *total = sparc_costs->int_div;
8649         }
8650       return false;
8651
8652     case NEG:
8653       if (! float_mode_p)
8654         {
8655           *total = COSTS_N_INSNS (1);
8656           return false;
8657         }
8658       /* FALLTHRU */
8659
8660     case ABS:
8661     case FLOAT:
8662     case UNSIGNED_FLOAT:
8663     case FIX:
8664     case UNSIGNED_FIX:
8665     case FLOAT_EXTEND:
8666     case FLOAT_TRUNCATE:
8667       *total = sparc_costs->float_move;
8668       return false;
8669
8670     case SQRT:
8671       if (mode == DFmode)
8672         *total = sparc_costs->float_sqrt_df;
8673       else
8674         *total = sparc_costs->float_sqrt_sf;
8675       return false;
8676
8677     case COMPARE:
8678       if (float_mode_p)
8679         *total = sparc_costs->float_cmp;
8680       else
8681         *total = COSTS_N_INSNS (1);
8682       return false;
8683
8684     case IF_THEN_ELSE:
8685       if (float_mode_p)
8686         *total = sparc_costs->float_cmove;
8687       else
8688         *total = sparc_costs->int_cmove;
8689       return false;
8690
8691     default:
8692       return false;
8693     }
8694 }
8695
8696 /* Emit the sequence of insns SEQ while preserving the register REG.  */
8697
8698 static void
8699 emit_and_preserve (rtx seq, rtx reg)
8700 {
8701   rtx slot = gen_rtx_MEM (word_mode,
8702                           plus_constant (stack_pointer_rtx, SPARC_STACK_BIAS));
8703
8704   emit_stack_pointer_decrement (GEN_INT (STACK_BOUNDARY/BITS_PER_UNIT));
8705   emit_insn (gen_rtx_SET (VOIDmode, slot, reg));
8706   emit_insn (seq);
8707   emit_insn (gen_rtx_SET (VOIDmode, reg, slot));
8708   emit_stack_pointer_increment (GEN_INT (STACK_BOUNDARY/BITS_PER_UNIT));
8709 }
8710
8711 /* Output the assembler code for a thunk function.  THUNK_DECL is the
8712    declaration for the thunk function itself, FUNCTION is the decl for
8713    the target function.  DELTA is an immediate constant offset to be
8714    added to THIS.  If VCALL_OFFSET is nonzero, the word at address
8715    (*THIS + VCALL_OFFSET) should be additionally added to THIS.  */
8716
8717 static void
8718 sparc_output_mi_thunk (FILE *file, tree thunk_fndecl ATTRIBUTE_UNUSED,
8719                        HOST_WIDE_INT delta, HOST_WIDE_INT vcall_offset,
8720                        tree function)
8721 {
8722   rtx this, insn, funexp;
8723   unsigned int int_arg_first;
8724
8725   reload_completed = 1;
8726   epilogue_completed = 1;
8727   no_new_pseudos = 1;
8728   reset_block_changes ();
8729
8730   emit_note (NOTE_INSN_PROLOGUE_END);
8731
8732   if (flag_delayed_branch)
8733     {
8734       /* We will emit a regular sibcall below, so we need to instruct
8735          output_sibcall that we are in a leaf function.  */
8736       sparc_leaf_function_p = current_function_uses_only_leaf_regs = 1;
8737
8738       /* This will cause final.c to invoke leaf_renumber_regs so we
8739          must behave as if we were in a not-yet-leafified function.  */
8740       int_arg_first = SPARC_INCOMING_INT_ARG_FIRST;
8741     }
8742   else
8743     {
8744       /* We will emit the sibcall manually below, so we will need to
8745          manually spill non-leaf registers.  */
8746       sparc_leaf_function_p = current_function_uses_only_leaf_regs = 0;
8747
8748       /* We really are in a leaf function.  */
8749       int_arg_first = SPARC_OUTGOING_INT_ARG_FIRST;
8750     }
8751
8752   /* Find the "this" pointer.  Normally in %o0, but in ARCH64 if the function
8753      returns a structure, the structure return pointer is there instead.  */
8754   if (TARGET_ARCH64 && aggregate_value_p (TREE_TYPE (TREE_TYPE (function)), function))
8755     this = gen_rtx_REG (Pmode, int_arg_first + 1);
8756   else
8757     this = gen_rtx_REG (Pmode, int_arg_first);
8758
8759   /* Add DELTA.  When possible use a plain add, otherwise load it into
8760      a register first.  */
8761   if (delta)
8762     {
8763       rtx delta_rtx = GEN_INT (delta);
8764
8765       if (! SPARC_SIMM13_P (delta))
8766         {
8767           rtx scratch = gen_rtx_REG (Pmode, 1);
8768           emit_move_insn (scratch, delta_rtx);
8769           delta_rtx = scratch;
8770         }
8771
8772       /* THIS += DELTA.  */
8773       emit_insn (gen_add2_insn (this, delta_rtx));
8774     }
8775
8776   /* Add the word at address (*THIS + VCALL_OFFSET).  */
8777   if (vcall_offset)
8778     {
8779       rtx vcall_offset_rtx = GEN_INT (vcall_offset);
8780       rtx scratch = gen_rtx_REG (Pmode, 1);
8781
8782       if (vcall_offset >= 0)
8783         abort ();
8784
8785       /* SCRATCH = *THIS.  */
8786       emit_move_insn (scratch, gen_rtx_MEM (Pmode, this));
8787
8788       /* Prepare for adding VCALL_OFFSET.  The difficulty is that we
8789          may not have any available scratch register at this point.  */
8790       if (SPARC_SIMM13_P (vcall_offset))
8791         ;
8792       /* This is the case if ARCH64 (unless -ffixed-g5 is passed).  */
8793       else if (! fixed_regs[5]
8794                /* The below sequence is made up of at least 2 insns,
8795                   while the default method may need only one.  */
8796                && vcall_offset < -8192)
8797         {
8798           rtx scratch2 = gen_rtx_REG (Pmode, 5);
8799           emit_move_insn (scratch2, vcall_offset_rtx);
8800           vcall_offset_rtx = scratch2;
8801         }
8802       else
8803         {
8804           rtx increment = GEN_INT (-4096);
8805
8806           /* VCALL_OFFSET is a negative number whose typical range can be
8807              estimated as -32768..0 in 32-bit mode.  In almost all cases
8808              it is therefore cheaper to emit multiple add insns than
8809              spilling and loading the constant into a register (at least
8810              6 insns).  */
8811           while (! SPARC_SIMM13_P (vcall_offset))
8812             {
8813               emit_insn (gen_add2_insn (scratch, increment));
8814               vcall_offset += 4096;
8815             }
8816           vcall_offset_rtx = GEN_INT (vcall_offset); /* cannot be 0 */
8817         }
8818
8819       /* SCRATCH = *(*THIS + VCALL_OFFSET).  */
8820       emit_move_insn (scratch, gen_rtx_MEM (Pmode,
8821                                             gen_rtx_PLUS (Pmode,
8822                                                           scratch,
8823                                                           vcall_offset_rtx)));
8824
8825       /* THIS += *(*THIS + VCALL_OFFSET).  */
8826       emit_insn (gen_add2_insn (this, scratch));
8827     }
8828
8829   /* Generate a tail call to the target function.  */
8830   if (! TREE_USED (function))
8831     {
8832       assemble_external (function);
8833       TREE_USED (function) = 1;
8834     }
8835   funexp = XEXP (DECL_RTL (function), 0);
8836
8837   if (flag_delayed_branch)
8838     {
8839       funexp = gen_rtx_MEM (FUNCTION_MODE, funexp);
8840       insn = emit_call_insn (gen_sibcall (funexp));
8841       SIBLING_CALL_P (insn) = 1;
8842     }
8843   else
8844     {
8845       /* The hoops we have to jump through in order to generate a sibcall
8846          without using delay slots...  */
8847       rtx spill_reg, seq, scratch = gen_rtx_REG (Pmode, 1);
8848
8849       if (flag_pic)
8850         {
8851           spill_reg = gen_rtx_REG (word_mode, 15);  /* %o7 */
8852           start_sequence ();
8853           load_pic_register ();  /* clobbers %o7 */
8854           scratch = legitimize_pic_address (funexp, Pmode, scratch);
8855           seq = get_insns ();
8856           end_sequence ();
8857           emit_and_preserve (seq, spill_reg);
8858         }
8859       else if (TARGET_ARCH32)
8860         {
8861           emit_insn (gen_rtx_SET (VOIDmode,
8862                                   scratch,
8863                                   gen_rtx_HIGH (SImode, funexp)));
8864           emit_insn (gen_rtx_SET (VOIDmode,
8865                                   scratch,
8866                                   gen_rtx_LO_SUM (SImode, scratch, funexp)));
8867         }
8868       else  /* TARGET_ARCH64 */
8869         {
8870           switch (sparc_cmodel)
8871             {
8872             case CM_MEDLOW:
8873             case CM_MEDMID:
8874               /* The destination can serve as a temporary.  */
8875               sparc_emit_set_symbolic_const64 (scratch, funexp, scratch);
8876               break;
8877
8878             case CM_MEDANY:
8879             case CM_EMBMEDANY:
8880               /* The destination cannot serve as a temporary.  */
8881               spill_reg = gen_rtx_REG (DImode, 15);  /* %o7 */
8882               start_sequence ();
8883               sparc_emit_set_symbolic_const64 (scratch, funexp, spill_reg);
8884               seq = get_insns ();
8885               end_sequence ();
8886               emit_and_preserve (seq, spill_reg);
8887               break;
8888
8889             default:
8890               abort();
8891             }
8892         }
8893
8894       emit_jump_insn (gen_indirect_jump (scratch));
8895     }
8896
8897   emit_barrier ();
8898
8899   /* Run just enough of rest_of_compilation to get the insns emitted.
8900      There's not really enough bulk here to make other passes such as
8901      instruction scheduling worth while.  Note that use_thunk calls
8902      assemble_start_function and assemble_end_function.  */
8903   insn = get_insns ();
8904   insn_locators_initialize ();
8905   shorten_branches (insn);
8906   final_start_function (insn, file, 1);
8907   final (insn, file, 1, 0);
8908   final_end_function ();
8909
8910   reload_completed = 0;
8911   epilogue_completed = 0;
8912   no_new_pseudos = 0;
8913 }
8914
8915 /* Return true if sparc_output_mi_thunk would be able to output the
8916    assembler code for the thunk function specified by the arguments
8917    it is passed, and false otherwise.  */
8918 static bool
8919 sparc_can_output_mi_thunk (tree thunk_fndecl ATTRIBUTE_UNUSED,
8920                            HOST_WIDE_INT delta ATTRIBUTE_UNUSED,
8921                            HOST_WIDE_INT vcall_offset,
8922                            tree function ATTRIBUTE_UNUSED)
8923 {
8924   /* Bound the loop used in the default method above.  */
8925   return (vcall_offset >= -32768 || ! fixed_regs[5]);
8926 }
8927
8928 /* How to allocate a 'struct machine_function'.  */
8929
8930 static struct machine_function *
8931 sparc_init_machine_status (void)
8932 {
8933   return ggc_alloc_cleared (sizeof (struct machine_function));
8934 }
8935
8936 /* Locate some local-dynamic symbol still in use by this function
8937    so that we can print its name in local-dynamic base patterns.  */
8938
8939 static const char *
8940 get_some_local_dynamic_name (void)
8941 {
8942   rtx insn;
8943
8944   if (cfun->machine->some_ld_name)
8945     return cfun->machine->some_ld_name;
8946
8947   for (insn = get_insns (); insn ; insn = NEXT_INSN (insn))
8948     if (INSN_P (insn)
8949         && for_each_rtx (&PATTERN (insn), get_some_local_dynamic_name_1, 0))
8950       return cfun->machine->some_ld_name;
8951
8952   abort ();
8953 }
8954
8955 static int
8956 get_some_local_dynamic_name_1 (rtx *px, void *data ATTRIBUTE_UNUSED)
8957 {
8958   rtx x = *px;
8959
8960   if (x
8961       && GET_CODE (x) == SYMBOL_REF
8962       && SYMBOL_REF_TLS_MODEL (x) == TLS_MODEL_LOCAL_DYNAMIC)
8963     {
8964       cfun->machine->some_ld_name = XSTR (x, 0);
8965       return 1;
8966     }
8967
8968   return 0;
8969 }
8970
8971 /* This is called from dwarf2out.c via ASM_OUTPUT_DWARF_DTPREL.
8972    We need to emit DTP-relative relocations.  */
8973
8974 void
8975 sparc_output_dwarf_dtprel (FILE *file, int size, rtx x)
8976 {
8977   switch (size)
8978     {
8979     case 4:
8980       fputs ("\t.word\t%r_tls_dtpoff32(", file);
8981       break;
8982     case 8:
8983       fputs ("\t.xword\t%r_tls_dtpoff64(", file);
8984       break;
8985     default:
8986       abort ();
8987     }
8988   output_addr_const (file, x);
8989   fputs (")", file);
8990 }
8991
8992 #include "gt-sparc.h"