OSDN Git Service

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