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