082af3cc9b1783d647d4c2c9d31e437a9fdd82d7
[platform/upstream/gcc.git] / gcc / config / sparc / sparc.c
1 /* Subroutines for insn-output.c for SPARC.
2    Copyright (C) 1987-2016 Free Software Foundation, Inc.
3    Contributed by Michael Tiemann (tiemann@cygnus.com)
4    64-bit SPARC-V9 support by Michael Tiemann, Jim Wilson, and Doug Evans,
5    at Cygnus Support.
6
7 This file is part of GCC.
8
9 GCC is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation; either version 3, or (at your option)
12 any later version.
13
14 GCC is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17 GNU General Public License for more details.
18
19 You should have received a copy of the GNU General Public License
20 along with GCC; see the file COPYING3.  If not see
21 <http://www.gnu.org/licenses/>.  */
22
23 #include "config.h"
24 #include "system.h"
25 #include "coretypes.h"
26 #include "backend.h"
27 #include "target.h"
28 #include "rtl.h"
29 #include "tree.h"
30 #include "gimple.h"
31 #include "df.h"
32 #include "tm_p.h"
33 #include "stringpool.h"
34 #include "expmed.h"
35 #include "optabs.h"
36 #include "regs.h"
37 #include "emit-rtl.h"
38 #include "recog.h"
39 #include "diagnostic-core.h"
40 #include "alias.h"
41 #include "fold-const.h"
42 #include "stor-layout.h"
43 #include "calls.h"
44 #include "varasm.h"
45 #include "output.h"
46 #include "insn-attr.h"
47 #include "explow.h"
48 #include "expr.h"
49 #include "debug.h"
50 #include "common/common-target.h"
51 #include "gimplify.h"
52 #include "langhooks.h"
53 #include "reload.h"
54 #include "params.h"
55 #include "tree-pass.h"
56 #include "context.h"
57 #include "builtins.h"
58
59 /* This file should be included last.  */
60 #include "target-def.h"
61
62 /* Processor costs */
63
64 struct processor_costs {
65   /* Integer load */
66   const int int_load;
67
68   /* Integer signed load */
69   const int int_sload;
70
71   /* Integer zeroed load */
72   const int int_zload;
73
74   /* Float load */
75   const int float_load;
76
77   /* fmov, fneg, fabs */
78   const int float_move;
79
80   /* fadd, fsub */
81   const int float_plusminus;
82
83   /* fcmp */
84   const int float_cmp;
85
86   /* fmov, fmovr */
87   const int float_cmove;
88
89   /* fmul */
90   const int float_mul;
91
92   /* fdivs */
93   const int float_div_sf;
94
95   /* fdivd */
96   const int float_div_df;
97
98   /* fsqrts */
99   const int float_sqrt_sf;
100
101   /* fsqrtd */
102   const int float_sqrt_df;
103
104   /* umul/smul */
105   const int int_mul;
106
107   /* mulX */
108   const int int_mulX;
109
110   /* integer multiply cost for each bit set past the most
111      significant 3, so the formula for multiply cost becomes:
112
113         if (rs1 < 0)
114           highest_bit = highest_clear_bit(rs1);
115         else
116           highest_bit = highest_set_bit(rs1);
117         if (highest_bit < 3)
118           highest_bit = 3;
119         cost = int_mul{,X} + ((highest_bit - 3) / int_mul_bit_factor);
120
121      A value of zero indicates that the multiply costs is fixed,
122      and not variable.  */
123   const int int_mul_bit_factor;
124
125   /* udiv/sdiv */
126   const int int_div;
127
128   /* divX */
129   const int int_divX;
130
131   /* movcc, movr */
132   const int int_cmove;
133
134   /* penalty for shifts, due to scheduling rules etc. */
135   const int shift_penalty;
136 };
137
138 static const
139 struct processor_costs cypress_costs = {
140   COSTS_N_INSNS (2), /* int load */
141   COSTS_N_INSNS (2), /* int signed load */
142   COSTS_N_INSNS (2), /* int zeroed load */
143   COSTS_N_INSNS (2), /* float load */
144   COSTS_N_INSNS (5), /* fmov, fneg, fabs */
145   COSTS_N_INSNS (5), /* fadd, fsub */
146   COSTS_N_INSNS (1), /* fcmp */
147   COSTS_N_INSNS (1), /* fmov, fmovr */
148   COSTS_N_INSNS (7), /* fmul */
149   COSTS_N_INSNS (37), /* fdivs */
150   COSTS_N_INSNS (37), /* fdivd */
151   COSTS_N_INSNS (63), /* fsqrts */
152   COSTS_N_INSNS (63), /* fsqrtd */
153   COSTS_N_INSNS (1), /* imul */
154   COSTS_N_INSNS (1), /* imulX */
155   0, /* imul bit factor */
156   COSTS_N_INSNS (1), /* idiv */
157   COSTS_N_INSNS (1), /* idivX */
158   COSTS_N_INSNS (1), /* movcc/movr */
159   0, /* shift penalty */
160 };
161
162 static const
163 struct processor_costs supersparc_costs = {
164   COSTS_N_INSNS (1), /* int load */
165   COSTS_N_INSNS (1), /* int signed load */
166   COSTS_N_INSNS (1), /* int zeroed load */
167   COSTS_N_INSNS (0), /* float load */
168   COSTS_N_INSNS (3), /* fmov, fneg, fabs */
169   COSTS_N_INSNS (3), /* fadd, fsub */
170   COSTS_N_INSNS (3), /* fcmp */
171   COSTS_N_INSNS (1), /* fmov, fmovr */
172   COSTS_N_INSNS (3), /* fmul */
173   COSTS_N_INSNS (6), /* fdivs */
174   COSTS_N_INSNS (9), /* fdivd */
175   COSTS_N_INSNS (12), /* fsqrts */
176   COSTS_N_INSNS (12), /* fsqrtd */
177   COSTS_N_INSNS (4), /* imul */
178   COSTS_N_INSNS (4), /* imulX */
179   0, /* imul bit factor */
180   COSTS_N_INSNS (4), /* idiv */
181   COSTS_N_INSNS (4), /* idivX */
182   COSTS_N_INSNS (1), /* movcc/movr */
183   1, /* shift penalty */
184 };
185
186 static const
187 struct processor_costs hypersparc_costs = {
188   COSTS_N_INSNS (1), /* int load */
189   COSTS_N_INSNS (1), /* int signed load */
190   COSTS_N_INSNS (1), /* int zeroed load */
191   COSTS_N_INSNS (1), /* float load */
192   COSTS_N_INSNS (1), /* fmov, fneg, fabs */
193   COSTS_N_INSNS (1), /* fadd, fsub */
194   COSTS_N_INSNS (1), /* fcmp */
195   COSTS_N_INSNS (1), /* fmov, fmovr */
196   COSTS_N_INSNS (1), /* fmul */
197   COSTS_N_INSNS (8), /* fdivs */
198   COSTS_N_INSNS (12), /* fdivd */
199   COSTS_N_INSNS (17), /* fsqrts */
200   COSTS_N_INSNS (17), /* fsqrtd */
201   COSTS_N_INSNS (17), /* imul */
202   COSTS_N_INSNS (17), /* imulX */
203   0, /* imul bit factor */
204   COSTS_N_INSNS (17), /* idiv */
205   COSTS_N_INSNS (17), /* idivX */
206   COSTS_N_INSNS (1), /* movcc/movr */
207   0, /* shift penalty */
208 };
209
210 static const
211 struct processor_costs leon_costs = {
212   COSTS_N_INSNS (1), /* int load */
213   COSTS_N_INSNS (1), /* int signed load */
214   COSTS_N_INSNS (1), /* int zeroed load */
215   COSTS_N_INSNS (1), /* float load */
216   COSTS_N_INSNS (1), /* fmov, fneg, fabs */
217   COSTS_N_INSNS (1), /* fadd, fsub */
218   COSTS_N_INSNS (1), /* fcmp */
219   COSTS_N_INSNS (1), /* fmov, fmovr */
220   COSTS_N_INSNS (1), /* fmul */
221   COSTS_N_INSNS (15), /* fdivs */
222   COSTS_N_INSNS (15), /* fdivd */
223   COSTS_N_INSNS (23), /* fsqrts */
224   COSTS_N_INSNS (23), /* fsqrtd */
225   COSTS_N_INSNS (5), /* imul */
226   COSTS_N_INSNS (5), /* imulX */
227   0, /* imul bit factor */
228   COSTS_N_INSNS (5), /* idiv */
229   COSTS_N_INSNS (5), /* idivX */
230   COSTS_N_INSNS (1), /* movcc/movr */
231   0, /* shift penalty */
232 };
233
234 static const
235 struct processor_costs leon3_costs = {
236   COSTS_N_INSNS (1), /* int load */
237   COSTS_N_INSNS (1), /* int signed load */
238   COSTS_N_INSNS (1), /* int zeroed load */
239   COSTS_N_INSNS (1), /* float load */
240   COSTS_N_INSNS (1), /* fmov, fneg, fabs */
241   COSTS_N_INSNS (1), /* fadd, fsub */
242   COSTS_N_INSNS (1), /* fcmp */
243   COSTS_N_INSNS (1), /* fmov, fmovr */
244   COSTS_N_INSNS (1), /* fmul */
245   COSTS_N_INSNS (14), /* fdivs */
246   COSTS_N_INSNS (15), /* fdivd */
247   COSTS_N_INSNS (22), /* fsqrts */
248   COSTS_N_INSNS (23), /* fsqrtd */
249   COSTS_N_INSNS (5), /* imul */
250   COSTS_N_INSNS (5), /* imulX */
251   0, /* imul bit factor */
252   COSTS_N_INSNS (35), /* idiv */
253   COSTS_N_INSNS (35), /* idivX */
254   COSTS_N_INSNS (1), /* movcc/movr */
255   0, /* shift penalty */
256 };
257
258 static const
259 struct processor_costs sparclet_costs = {
260   COSTS_N_INSNS (3), /* int load */
261   COSTS_N_INSNS (3), /* int signed load */
262   COSTS_N_INSNS (1), /* int zeroed load */
263   COSTS_N_INSNS (1), /* float load */
264   COSTS_N_INSNS (1), /* fmov, fneg, fabs */
265   COSTS_N_INSNS (1), /* fadd, fsub */
266   COSTS_N_INSNS (1), /* fcmp */
267   COSTS_N_INSNS (1), /* fmov, fmovr */
268   COSTS_N_INSNS (1), /* fmul */
269   COSTS_N_INSNS (1), /* fdivs */
270   COSTS_N_INSNS (1), /* fdivd */
271   COSTS_N_INSNS (1), /* fsqrts */
272   COSTS_N_INSNS (1), /* fsqrtd */
273   COSTS_N_INSNS (5), /* imul */
274   COSTS_N_INSNS (5), /* imulX */
275   0, /* imul bit factor */
276   COSTS_N_INSNS (5), /* idiv */
277   COSTS_N_INSNS (5), /* idivX */
278   COSTS_N_INSNS (1), /* movcc/movr */
279   0, /* shift penalty */
280 };
281
282 static const
283 struct processor_costs ultrasparc_costs = {
284   COSTS_N_INSNS (2), /* int load */
285   COSTS_N_INSNS (3), /* int signed load */
286   COSTS_N_INSNS (2), /* int zeroed load */
287   COSTS_N_INSNS (2), /* float load */
288   COSTS_N_INSNS (1), /* fmov, fneg, fabs */
289   COSTS_N_INSNS (4), /* fadd, fsub */
290   COSTS_N_INSNS (1), /* fcmp */
291   COSTS_N_INSNS (2), /* fmov, fmovr */
292   COSTS_N_INSNS (4), /* fmul */
293   COSTS_N_INSNS (13), /* fdivs */
294   COSTS_N_INSNS (23), /* fdivd */
295   COSTS_N_INSNS (13), /* fsqrts */
296   COSTS_N_INSNS (23), /* fsqrtd */
297   COSTS_N_INSNS (4), /* imul */
298   COSTS_N_INSNS (4), /* imulX */
299   2, /* imul bit factor */
300   COSTS_N_INSNS (37), /* idiv */
301   COSTS_N_INSNS (68), /* idivX */
302   COSTS_N_INSNS (2), /* movcc/movr */
303   2, /* shift penalty */
304 };
305
306 static const
307 struct processor_costs ultrasparc3_costs = {
308   COSTS_N_INSNS (2), /* int load */
309   COSTS_N_INSNS (3), /* int signed load */
310   COSTS_N_INSNS (3), /* int zeroed load */
311   COSTS_N_INSNS (2), /* float load */
312   COSTS_N_INSNS (3), /* fmov, fneg, fabs */
313   COSTS_N_INSNS (4), /* fadd, fsub */
314   COSTS_N_INSNS (5), /* fcmp */
315   COSTS_N_INSNS (3), /* fmov, fmovr */
316   COSTS_N_INSNS (4), /* fmul */
317   COSTS_N_INSNS (17), /* fdivs */
318   COSTS_N_INSNS (20), /* fdivd */
319   COSTS_N_INSNS (20), /* fsqrts */
320   COSTS_N_INSNS (29), /* fsqrtd */
321   COSTS_N_INSNS (6), /* imul */
322   COSTS_N_INSNS (6), /* imulX */
323   0, /* imul bit factor */
324   COSTS_N_INSNS (40), /* idiv */
325   COSTS_N_INSNS (71), /* idivX */
326   COSTS_N_INSNS (2), /* movcc/movr */
327   0, /* shift penalty */
328 };
329
330 static const
331 struct processor_costs niagara_costs = {
332   COSTS_N_INSNS (3), /* int load */
333   COSTS_N_INSNS (3), /* int signed load */
334   COSTS_N_INSNS (3), /* int zeroed load */
335   COSTS_N_INSNS (9), /* float load */
336   COSTS_N_INSNS (8), /* fmov, fneg, fabs */
337   COSTS_N_INSNS (8), /* fadd, fsub */
338   COSTS_N_INSNS (26), /* fcmp */
339   COSTS_N_INSNS (8), /* fmov, fmovr */
340   COSTS_N_INSNS (29), /* fmul */
341   COSTS_N_INSNS (54), /* fdivs */
342   COSTS_N_INSNS (83), /* fdivd */
343   COSTS_N_INSNS (100), /* fsqrts - not implemented in hardware */
344   COSTS_N_INSNS (100), /* fsqrtd - not implemented in hardware */
345   COSTS_N_INSNS (11), /* imul */
346   COSTS_N_INSNS (11), /* imulX */
347   0, /* imul bit factor */
348   COSTS_N_INSNS (72), /* idiv */
349   COSTS_N_INSNS (72), /* idivX */
350   COSTS_N_INSNS (1), /* movcc/movr */
351   0, /* shift penalty */
352 };
353
354 static const
355 struct processor_costs niagara2_costs = {
356   COSTS_N_INSNS (3), /* int load */
357   COSTS_N_INSNS (3), /* int signed load */
358   COSTS_N_INSNS (3), /* int zeroed load */
359   COSTS_N_INSNS (3), /* float load */
360   COSTS_N_INSNS (6), /* fmov, fneg, fabs */
361   COSTS_N_INSNS (6), /* fadd, fsub */
362   COSTS_N_INSNS (6), /* fcmp */
363   COSTS_N_INSNS (6), /* fmov, fmovr */
364   COSTS_N_INSNS (6), /* fmul */
365   COSTS_N_INSNS (19), /* fdivs */
366   COSTS_N_INSNS (33), /* fdivd */
367   COSTS_N_INSNS (19), /* fsqrts */
368   COSTS_N_INSNS (33), /* fsqrtd */
369   COSTS_N_INSNS (5), /* imul */
370   COSTS_N_INSNS (5), /* imulX */
371   0, /* imul bit factor */
372   COSTS_N_INSNS (26), /* idiv, average of 12 - 41 cycle range */
373   COSTS_N_INSNS (26), /* idivX, average of 12 - 41 cycle range */
374   COSTS_N_INSNS (1), /* movcc/movr */
375   0, /* shift penalty */
376 };
377
378 static const
379 struct processor_costs niagara3_costs = {
380   COSTS_N_INSNS (3), /* int load */
381   COSTS_N_INSNS (3), /* int signed load */
382   COSTS_N_INSNS (3), /* int zeroed load */
383   COSTS_N_INSNS (3), /* float load */
384   COSTS_N_INSNS (9), /* fmov, fneg, fabs */
385   COSTS_N_INSNS (9), /* fadd, fsub */
386   COSTS_N_INSNS (9), /* fcmp */
387   COSTS_N_INSNS (9), /* fmov, fmovr */
388   COSTS_N_INSNS (9), /* fmul */
389   COSTS_N_INSNS (23), /* fdivs */
390   COSTS_N_INSNS (37), /* fdivd */
391   COSTS_N_INSNS (23), /* fsqrts */
392   COSTS_N_INSNS (37), /* fsqrtd */
393   COSTS_N_INSNS (9), /* imul */
394   COSTS_N_INSNS (9), /* imulX */
395   0, /* imul bit factor */
396   COSTS_N_INSNS (31), /* idiv, average of 17 - 45 cycle range */
397   COSTS_N_INSNS (30), /* idivX, average of 16 - 44 cycle range */
398   COSTS_N_INSNS (1), /* movcc/movr */
399   0, /* shift penalty */
400 };
401
402 static const
403 struct processor_costs niagara4_costs = {
404   COSTS_N_INSNS (5), /* int load */
405   COSTS_N_INSNS (5), /* int signed load */
406   COSTS_N_INSNS (5), /* int zeroed load */
407   COSTS_N_INSNS (5), /* float load */
408   COSTS_N_INSNS (11), /* fmov, fneg, fabs */
409   COSTS_N_INSNS (11), /* fadd, fsub */
410   COSTS_N_INSNS (11), /* fcmp */
411   COSTS_N_INSNS (11), /* fmov, fmovr */
412   COSTS_N_INSNS (11), /* fmul */
413   COSTS_N_INSNS (24), /* fdivs */
414   COSTS_N_INSNS (37), /* fdivd */
415   COSTS_N_INSNS (24), /* fsqrts */
416   COSTS_N_INSNS (37), /* fsqrtd */
417   COSTS_N_INSNS (12), /* imul */
418   COSTS_N_INSNS (12), /* imulX */
419   0, /* imul bit factor */
420   COSTS_N_INSNS (50), /* idiv, average of 41 - 60 cycle range */
421   COSTS_N_INSNS (35), /* idivX, average of 26 - 44 cycle range */
422   COSTS_N_INSNS (1), /* movcc/movr */
423   0, /* shift penalty */
424 };
425
426 static const struct processor_costs *sparc_costs = &cypress_costs;
427
428 #ifdef HAVE_AS_RELAX_OPTION
429 /* If 'as' and 'ld' are relaxing tail call insns into branch always, use
430    "or %o7,%g0,X; call Y; or X,%g0,%o7" always, so that it can be optimized.
431    With sethi/jmp, neither 'as' nor 'ld' has an easy way how to find out if
432    somebody does not branch between the sethi and jmp.  */
433 #define LEAF_SIBCALL_SLOT_RESERVED_P 1
434 #else
435 #define LEAF_SIBCALL_SLOT_RESERVED_P \
436   ((TARGET_ARCH64 && !TARGET_CM_MEDLOW) || flag_pic)
437 #endif
438
439 /* Vector to say how input registers are mapped to output registers.
440    HARD_FRAME_POINTER_REGNUM cannot be remapped by this function to
441    eliminate it.  You must use -fomit-frame-pointer to get that.  */
442 char leaf_reg_remap[] =
443 { 0, 1, 2, 3, 4, 5, 6, 7,
444   -1, -1, -1, -1, -1, -1, 14, -1,
445   -1, -1, -1, -1, -1, -1, -1, -1,
446   8, 9, 10, 11, 12, 13, -1, 15,
447
448   32, 33, 34, 35, 36, 37, 38, 39,
449   40, 41, 42, 43, 44, 45, 46, 47,
450   48, 49, 50, 51, 52, 53, 54, 55,
451   56, 57, 58, 59, 60, 61, 62, 63,
452   64, 65, 66, 67, 68, 69, 70, 71,
453   72, 73, 74, 75, 76, 77, 78, 79,
454   80, 81, 82, 83, 84, 85, 86, 87,
455   88, 89, 90, 91, 92, 93, 94, 95,
456   96, 97, 98, 99, 100, 101, 102};
457
458 /* Vector, indexed by hard register number, which contains 1
459    for a register that is allowable in a candidate for leaf
460    function treatment.  */
461 char sparc_leaf_regs[] =
462 { 1, 1, 1, 1, 1, 1, 1, 1,
463   0, 0, 0, 0, 0, 0, 1, 0,
464   0, 0, 0, 0, 0, 0, 0, 0,
465   1, 1, 1, 1, 1, 1, 0, 1,
466   1, 1, 1, 1, 1, 1, 1, 1,
467   1, 1, 1, 1, 1, 1, 1, 1,
468   1, 1, 1, 1, 1, 1, 1, 1,
469   1, 1, 1, 1, 1, 1, 1, 1,
470   1, 1, 1, 1, 1, 1, 1, 1,
471   1, 1, 1, 1, 1, 1, 1, 1,
472   1, 1, 1, 1, 1, 1, 1, 1,
473   1, 1, 1, 1, 1, 1, 1, 1,
474   1, 1, 1, 1, 1, 1, 1};
475
476 struct GTY(()) machine_function
477 {
478   /* Size of the frame of the function.  */
479   HOST_WIDE_INT frame_size;
480
481   /* Size of the frame of the function minus the register window save area
482      and the outgoing argument area.  */
483   HOST_WIDE_INT apparent_frame_size;
484
485   /* Register we pretend the frame pointer is allocated to.  Normally, this
486      is %fp, but if we are in a leaf procedure, this is (%sp + offset).  We
487      record "offset" separately as it may be too big for (reg + disp).  */
488   rtx frame_base_reg;
489   HOST_WIDE_INT frame_base_offset;
490
491   /* Number of global or FP registers to be saved (as 4-byte quantities).  */
492   int n_global_fp_regs;
493
494   /* True if the current function is leaf and uses only leaf regs,
495      so that the SPARC leaf function optimization can be applied.
496      Private version of crtl->uses_only_leaf_regs, see
497      sparc_expand_prologue for the rationale.  */
498   int leaf_function_p;
499
500   /* True if the prologue saves local or in registers.  */
501   bool save_local_in_regs_p;
502
503   /* True if the data calculated by sparc_expand_prologue are valid.  */
504   bool prologue_data_valid_p;
505 };
506
507 #define sparc_frame_size                cfun->machine->frame_size
508 #define sparc_apparent_frame_size       cfun->machine->apparent_frame_size
509 #define sparc_frame_base_reg            cfun->machine->frame_base_reg
510 #define sparc_frame_base_offset         cfun->machine->frame_base_offset
511 #define sparc_n_global_fp_regs          cfun->machine->n_global_fp_regs
512 #define sparc_leaf_function_p           cfun->machine->leaf_function_p
513 #define sparc_save_local_in_regs_p      cfun->machine->save_local_in_regs_p
514 #define sparc_prologue_data_valid_p     cfun->machine->prologue_data_valid_p
515
516 /* 1 if the next opcode is to be specially indented.  */
517 int sparc_indent_opcode = 0;
518
519 static void sparc_option_override (void);
520 static void sparc_init_modes (void);
521 static int function_arg_slotno (const CUMULATIVE_ARGS *, machine_mode,
522                                 const_tree, bool, bool, int *, int *);
523
524 static int supersparc_adjust_cost (rtx_insn *, rtx, rtx_insn *, int);
525 static int hypersparc_adjust_cost (rtx_insn *, rtx, rtx_insn *, int);
526
527 static void sparc_emit_set_const32 (rtx, rtx);
528 static void sparc_emit_set_const64 (rtx, rtx);
529 static void sparc_output_addr_vec (rtx);
530 static void sparc_output_addr_diff_vec (rtx);
531 static void sparc_output_deferred_case_vectors (void);
532 static bool sparc_legitimate_address_p (machine_mode, rtx, bool);
533 static bool sparc_legitimate_constant_p (machine_mode, rtx);
534 static rtx sparc_builtin_saveregs (void);
535 static int epilogue_renumber (rtx *, int);
536 static bool sparc_assemble_integer (rtx, unsigned int, int);
537 static int set_extends (rtx_insn *);
538 static void sparc_asm_function_prologue (FILE *, HOST_WIDE_INT);
539 static void sparc_asm_function_epilogue (FILE *, HOST_WIDE_INT);
540 #ifdef TARGET_SOLARIS
541 static void sparc_solaris_elf_asm_named_section (const char *, unsigned int,
542                                                  tree) ATTRIBUTE_UNUSED;
543 #endif
544 static int sparc_adjust_cost (rtx_insn *, rtx, rtx_insn *, int);
545 static int sparc_issue_rate (void);
546 static void sparc_sched_init (FILE *, int, int);
547 static int sparc_use_sched_lookahead (void);
548
549 static void emit_soft_tfmode_libcall (const char *, int, rtx *);
550 static void emit_soft_tfmode_binop (enum rtx_code, rtx *);
551 static void emit_soft_tfmode_unop (enum rtx_code, rtx *);
552 static void emit_soft_tfmode_cvt (enum rtx_code, rtx *);
553 static void emit_hard_tfmode_operation (enum rtx_code, rtx *);
554
555 static bool sparc_function_ok_for_sibcall (tree, tree);
556 static void sparc_init_libfuncs (void);
557 static void sparc_init_builtins (void);
558 static void sparc_fpu_init_builtins (void);
559 static void sparc_vis_init_builtins (void);
560 static tree sparc_builtin_decl (unsigned, bool);
561 static rtx sparc_expand_builtin (tree, rtx, rtx, machine_mode, int);
562 static tree sparc_fold_builtin (tree, int, tree *, bool);
563 static void sparc_output_mi_thunk (FILE *, tree, HOST_WIDE_INT,
564                                    HOST_WIDE_INT, tree);
565 static bool sparc_can_output_mi_thunk (const_tree, HOST_WIDE_INT,
566                                        HOST_WIDE_INT, const_tree);
567 static struct machine_function * sparc_init_machine_status (void);
568 static bool sparc_cannot_force_const_mem (machine_mode, rtx);
569 static rtx sparc_tls_get_addr (void);
570 static rtx sparc_tls_got (void);
571 static int sparc_register_move_cost (machine_mode,
572                                      reg_class_t, reg_class_t);
573 static bool sparc_rtx_costs (rtx, machine_mode, int, int, int *, bool);
574 static rtx sparc_function_value (const_tree, const_tree, bool);
575 static rtx sparc_libcall_value (machine_mode, const_rtx);
576 static bool sparc_function_value_regno_p (const unsigned int);
577 static rtx sparc_struct_value_rtx (tree, int);
578 static machine_mode sparc_promote_function_mode (const_tree, machine_mode,
579                                                       int *, const_tree, int);
580 static bool sparc_return_in_memory (const_tree, const_tree);
581 static bool sparc_strict_argument_naming (cumulative_args_t);
582 static void sparc_va_start (tree, rtx);
583 static tree sparc_gimplify_va_arg (tree, tree, gimple_seq *, gimple_seq *);
584 static bool sparc_vector_mode_supported_p (machine_mode);
585 static bool sparc_tls_referenced_p (rtx);
586 static rtx sparc_legitimize_tls_address (rtx);
587 static rtx sparc_legitimize_pic_address (rtx, rtx);
588 static rtx sparc_legitimize_address (rtx, rtx, machine_mode);
589 static rtx sparc_delegitimize_address (rtx);
590 static bool sparc_mode_dependent_address_p (const_rtx, addr_space_t);
591 static bool sparc_pass_by_reference (cumulative_args_t,
592                                      machine_mode, const_tree, bool);
593 static void sparc_function_arg_advance (cumulative_args_t,
594                                         machine_mode, const_tree, bool);
595 static rtx sparc_function_arg_1 (cumulative_args_t,
596                                  machine_mode, const_tree, bool, bool);
597 static rtx sparc_function_arg (cumulative_args_t,
598                                machine_mode, const_tree, bool);
599 static rtx sparc_function_incoming_arg (cumulative_args_t,
600                                         machine_mode, const_tree, bool);
601 static unsigned int sparc_function_arg_boundary (machine_mode,
602                                                  const_tree);
603 static int sparc_arg_partial_bytes (cumulative_args_t,
604                                     machine_mode, tree, bool);
605 static void sparc_output_dwarf_dtprel (FILE *, int, rtx) ATTRIBUTE_UNUSED;
606 static void sparc_file_end (void);
607 static bool sparc_frame_pointer_required (void);
608 static bool sparc_can_eliminate (const int, const int);
609 static rtx sparc_builtin_setjmp_frame_value (void);
610 static void sparc_conditional_register_usage (void);
611 #ifdef TARGET_ALTERNATE_LONG_DOUBLE_MANGLING
612 static const char *sparc_mangle_type (const_tree);
613 #endif
614 static void sparc_trampoline_init (rtx, tree, rtx);
615 static machine_mode sparc_preferred_simd_mode (machine_mode);
616 static reg_class_t sparc_preferred_reload_class (rtx x, reg_class_t rclass);
617 static bool sparc_print_operand_punct_valid_p (unsigned char);
618 static void sparc_print_operand (FILE *, rtx, int);
619 static void sparc_print_operand_address (FILE *, machine_mode, rtx);
620 static reg_class_t sparc_secondary_reload (bool, rtx, reg_class_t,
621                                            machine_mode,
622                                            secondary_reload_info *);
623 static machine_mode sparc_cstore_mode (enum insn_code icode);
624 static void sparc_atomic_assign_expand_fenv (tree *, tree *, tree *);
625 \f
626 #ifdef SUBTARGET_ATTRIBUTE_TABLE
627 /* Table of valid machine attributes.  */
628 static const struct attribute_spec sparc_attribute_table[] =
629 {
630   /* { name, min_len, max_len, decl_req, type_req, fn_type_req, handler,
631        do_diagnostic } */
632   SUBTARGET_ATTRIBUTE_TABLE,
633   { NULL,        0, 0, false, false, false, NULL, false }
634 };
635 #endif
636 \f
637 /* Option handling.  */
638
639 /* Parsed value.  */
640 enum cmodel sparc_cmodel;
641
642 char sparc_hard_reg_printed[8];
643
644 /* Initialize the GCC target structure.  */
645
646 /* The default is to use .half rather than .short for aligned HI objects.  */
647 #undef TARGET_ASM_ALIGNED_HI_OP
648 #define TARGET_ASM_ALIGNED_HI_OP "\t.half\t"
649
650 #undef TARGET_ASM_UNALIGNED_HI_OP
651 #define TARGET_ASM_UNALIGNED_HI_OP "\t.uahalf\t"
652 #undef TARGET_ASM_UNALIGNED_SI_OP
653 #define TARGET_ASM_UNALIGNED_SI_OP "\t.uaword\t"
654 #undef TARGET_ASM_UNALIGNED_DI_OP
655 #define TARGET_ASM_UNALIGNED_DI_OP "\t.uaxword\t"
656
657 /* The target hook has to handle DI-mode values.  */
658 #undef TARGET_ASM_INTEGER
659 #define TARGET_ASM_INTEGER sparc_assemble_integer
660
661 #undef TARGET_ASM_FUNCTION_PROLOGUE
662 #define TARGET_ASM_FUNCTION_PROLOGUE sparc_asm_function_prologue
663 #undef TARGET_ASM_FUNCTION_EPILOGUE
664 #define TARGET_ASM_FUNCTION_EPILOGUE sparc_asm_function_epilogue
665
666 #undef TARGET_SCHED_ADJUST_COST
667 #define TARGET_SCHED_ADJUST_COST sparc_adjust_cost
668 #undef TARGET_SCHED_ISSUE_RATE
669 #define TARGET_SCHED_ISSUE_RATE sparc_issue_rate
670 #undef TARGET_SCHED_INIT
671 #define TARGET_SCHED_INIT sparc_sched_init
672 #undef TARGET_SCHED_FIRST_CYCLE_MULTIPASS_DFA_LOOKAHEAD
673 #define TARGET_SCHED_FIRST_CYCLE_MULTIPASS_DFA_LOOKAHEAD sparc_use_sched_lookahead
674
675 #undef TARGET_FUNCTION_OK_FOR_SIBCALL
676 #define TARGET_FUNCTION_OK_FOR_SIBCALL sparc_function_ok_for_sibcall
677
678 #undef TARGET_INIT_LIBFUNCS
679 #define TARGET_INIT_LIBFUNCS sparc_init_libfuncs
680
681 #undef TARGET_LEGITIMIZE_ADDRESS
682 #define TARGET_LEGITIMIZE_ADDRESS sparc_legitimize_address
683 #undef TARGET_DELEGITIMIZE_ADDRESS
684 #define TARGET_DELEGITIMIZE_ADDRESS sparc_delegitimize_address
685 #undef TARGET_MODE_DEPENDENT_ADDRESS_P
686 #define TARGET_MODE_DEPENDENT_ADDRESS_P sparc_mode_dependent_address_p
687
688 #undef TARGET_INIT_BUILTINS
689 #define TARGET_INIT_BUILTINS sparc_init_builtins
690 #undef TARGET_BUILTIN_DECL
691 #define TARGET_BUILTIN_DECL sparc_builtin_decl
692 #undef TARGET_EXPAND_BUILTIN
693 #define TARGET_EXPAND_BUILTIN sparc_expand_builtin
694 #undef TARGET_FOLD_BUILTIN
695 #define TARGET_FOLD_BUILTIN sparc_fold_builtin
696
697 #if TARGET_TLS
698 #undef TARGET_HAVE_TLS
699 #define TARGET_HAVE_TLS true
700 #endif
701
702 #undef TARGET_CANNOT_FORCE_CONST_MEM
703 #define TARGET_CANNOT_FORCE_CONST_MEM sparc_cannot_force_const_mem
704
705 #undef TARGET_ASM_OUTPUT_MI_THUNK
706 #define TARGET_ASM_OUTPUT_MI_THUNK sparc_output_mi_thunk
707 #undef TARGET_ASM_CAN_OUTPUT_MI_THUNK
708 #define TARGET_ASM_CAN_OUTPUT_MI_THUNK sparc_can_output_mi_thunk
709
710 #undef TARGET_RTX_COSTS
711 #define TARGET_RTX_COSTS sparc_rtx_costs
712 #undef TARGET_ADDRESS_COST
713 #define TARGET_ADDRESS_COST hook_int_rtx_mode_as_bool_0
714 #undef TARGET_REGISTER_MOVE_COST
715 #define TARGET_REGISTER_MOVE_COST sparc_register_move_cost
716
717 #undef TARGET_PROMOTE_FUNCTION_MODE
718 #define TARGET_PROMOTE_FUNCTION_MODE sparc_promote_function_mode
719
720 #undef TARGET_FUNCTION_VALUE
721 #define TARGET_FUNCTION_VALUE sparc_function_value
722 #undef TARGET_LIBCALL_VALUE
723 #define TARGET_LIBCALL_VALUE sparc_libcall_value
724 #undef TARGET_FUNCTION_VALUE_REGNO_P
725 #define TARGET_FUNCTION_VALUE_REGNO_P sparc_function_value_regno_p
726
727 #undef TARGET_STRUCT_VALUE_RTX
728 #define TARGET_STRUCT_VALUE_RTX sparc_struct_value_rtx
729 #undef TARGET_RETURN_IN_MEMORY
730 #define TARGET_RETURN_IN_MEMORY sparc_return_in_memory
731 #undef TARGET_MUST_PASS_IN_STACK
732 #define TARGET_MUST_PASS_IN_STACK must_pass_in_stack_var_size
733 #undef TARGET_PASS_BY_REFERENCE
734 #define TARGET_PASS_BY_REFERENCE sparc_pass_by_reference
735 #undef TARGET_ARG_PARTIAL_BYTES
736 #define TARGET_ARG_PARTIAL_BYTES sparc_arg_partial_bytes
737 #undef TARGET_FUNCTION_ARG_ADVANCE
738 #define TARGET_FUNCTION_ARG_ADVANCE sparc_function_arg_advance
739 #undef TARGET_FUNCTION_ARG
740 #define TARGET_FUNCTION_ARG sparc_function_arg
741 #undef TARGET_FUNCTION_INCOMING_ARG
742 #define TARGET_FUNCTION_INCOMING_ARG sparc_function_incoming_arg
743 #undef TARGET_FUNCTION_ARG_BOUNDARY
744 #define TARGET_FUNCTION_ARG_BOUNDARY sparc_function_arg_boundary
745
746 #undef TARGET_EXPAND_BUILTIN_SAVEREGS
747 #define TARGET_EXPAND_BUILTIN_SAVEREGS sparc_builtin_saveregs
748 #undef TARGET_STRICT_ARGUMENT_NAMING
749 #define TARGET_STRICT_ARGUMENT_NAMING sparc_strict_argument_naming
750
751 #undef TARGET_EXPAND_BUILTIN_VA_START
752 #define TARGET_EXPAND_BUILTIN_VA_START sparc_va_start
753 #undef TARGET_GIMPLIFY_VA_ARG_EXPR
754 #define TARGET_GIMPLIFY_VA_ARG_EXPR sparc_gimplify_va_arg
755
756 #undef TARGET_VECTOR_MODE_SUPPORTED_P
757 #define TARGET_VECTOR_MODE_SUPPORTED_P sparc_vector_mode_supported_p
758
759 #undef TARGET_VECTORIZE_PREFERRED_SIMD_MODE
760 #define TARGET_VECTORIZE_PREFERRED_SIMD_MODE sparc_preferred_simd_mode
761
762 #ifdef SUBTARGET_INSERT_ATTRIBUTES
763 #undef TARGET_INSERT_ATTRIBUTES
764 #define TARGET_INSERT_ATTRIBUTES SUBTARGET_INSERT_ATTRIBUTES
765 #endif
766
767 #ifdef SUBTARGET_ATTRIBUTE_TABLE
768 #undef TARGET_ATTRIBUTE_TABLE
769 #define TARGET_ATTRIBUTE_TABLE sparc_attribute_table
770 #endif
771
772 #undef TARGET_OPTION_OVERRIDE
773 #define TARGET_OPTION_OVERRIDE sparc_option_override
774
775 #if TARGET_GNU_TLS && defined(HAVE_AS_SPARC_UA_PCREL)
776 #undef TARGET_ASM_OUTPUT_DWARF_DTPREL
777 #define TARGET_ASM_OUTPUT_DWARF_DTPREL sparc_output_dwarf_dtprel
778 #endif
779
780 #undef TARGET_ASM_FILE_END
781 #define TARGET_ASM_FILE_END sparc_file_end
782
783 #undef TARGET_FRAME_POINTER_REQUIRED
784 #define TARGET_FRAME_POINTER_REQUIRED sparc_frame_pointer_required
785
786 #undef TARGET_BUILTIN_SETJMP_FRAME_VALUE
787 #define TARGET_BUILTIN_SETJMP_FRAME_VALUE sparc_builtin_setjmp_frame_value
788
789 #undef TARGET_CAN_ELIMINATE
790 #define TARGET_CAN_ELIMINATE sparc_can_eliminate
791
792 #undef  TARGET_PREFERRED_RELOAD_CLASS
793 #define TARGET_PREFERRED_RELOAD_CLASS sparc_preferred_reload_class
794
795 #undef TARGET_SECONDARY_RELOAD
796 #define TARGET_SECONDARY_RELOAD sparc_secondary_reload
797
798 #undef TARGET_CONDITIONAL_REGISTER_USAGE
799 #define TARGET_CONDITIONAL_REGISTER_USAGE sparc_conditional_register_usage
800
801 #ifdef TARGET_ALTERNATE_LONG_DOUBLE_MANGLING
802 #undef TARGET_MANGLE_TYPE
803 #define TARGET_MANGLE_TYPE sparc_mangle_type
804 #endif
805
806 #undef TARGET_LEGITIMATE_ADDRESS_P
807 #define TARGET_LEGITIMATE_ADDRESS_P sparc_legitimate_address_p
808
809 #undef TARGET_LEGITIMATE_CONSTANT_P
810 #define TARGET_LEGITIMATE_CONSTANT_P sparc_legitimate_constant_p
811
812 #undef TARGET_TRAMPOLINE_INIT
813 #define TARGET_TRAMPOLINE_INIT sparc_trampoline_init
814
815 #undef TARGET_PRINT_OPERAND_PUNCT_VALID_P
816 #define TARGET_PRINT_OPERAND_PUNCT_VALID_P sparc_print_operand_punct_valid_p
817 #undef TARGET_PRINT_OPERAND
818 #define TARGET_PRINT_OPERAND sparc_print_operand
819 #undef TARGET_PRINT_OPERAND_ADDRESS
820 #define TARGET_PRINT_OPERAND_ADDRESS sparc_print_operand_address
821
822 /* The value stored by LDSTUB.  */
823 #undef TARGET_ATOMIC_TEST_AND_SET_TRUEVAL
824 #define TARGET_ATOMIC_TEST_AND_SET_TRUEVAL 0xff
825
826 #undef TARGET_CSTORE_MODE
827 #define TARGET_CSTORE_MODE sparc_cstore_mode
828
829 #undef TARGET_ATOMIC_ASSIGN_EXPAND_FENV
830 #define TARGET_ATOMIC_ASSIGN_EXPAND_FENV sparc_atomic_assign_expand_fenv
831
832 struct gcc_target targetm = TARGET_INITIALIZER;
833
834 /* Return the memory reference contained in X if any, zero otherwise.  */
835
836 static rtx
837 mem_ref (rtx x)
838 {
839   if (GET_CODE (x) == SIGN_EXTEND || GET_CODE (x) == ZERO_EXTEND)
840     x = XEXP (x, 0);
841
842   if (MEM_P (x))
843     return x;
844
845   return NULL_RTX;
846 }
847
848 /* We use a machine specific pass to enable workarounds for errata.
849    We need to have the (essentially) final form of the insn stream in order
850    to properly detect the various hazards.  Therefore, this machine specific
851    pass runs as late as possible.  The pass is inserted in the pass pipeline
852    at the end of sparc_option_override.  */
853
854 static unsigned int
855 sparc_do_work_around_errata (void)
856 {
857   rtx_insn *insn, *next;
858
859   /* Force all instructions to be split into their final form.  */
860   split_all_insns_noflow ();
861
862   /* Now look for specific patterns in the insn stream.  */
863   for (insn = get_insns (); insn; insn = next)
864     {
865       bool insert_nop = false;
866       rtx set;
867
868       /* Look into the instruction in a delay slot.  */
869       if (NONJUMP_INSN_P (insn))
870         if (rtx_sequence *seq = dyn_cast <rtx_sequence *> (PATTERN (insn)))
871           insn = seq->insn (1);
872
873       /* Look for a single-word load into an odd-numbered FP register.  */
874       if (sparc_fix_at697f
875           && NONJUMP_INSN_P (insn)
876           && (set = single_set (insn)) != NULL_RTX
877           && GET_MODE_SIZE (GET_MODE (SET_SRC (set))) == 4
878           && MEM_P (SET_SRC (set))
879           && REG_P (SET_DEST (set))
880           && REGNO (SET_DEST (set)) > 31
881           && REGNO (SET_DEST (set)) % 2 != 0)
882         {
883           /* The wrong dependency is on the enclosing double register.  */
884           const unsigned int x = REGNO (SET_DEST (set)) - 1;
885           unsigned int src1, src2, dest;
886           int code;
887
888           next = next_active_insn (insn);
889           if (!next)
890             break;
891           /* If the insn is a branch, then it cannot be problematic.  */
892           if (!NONJUMP_INSN_P (next) || GET_CODE (PATTERN (next)) == SEQUENCE)
893             continue;
894
895           extract_insn (next);
896           code = INSN_CODE (next);
897
898           switch (code)
899             {
900             case CODE_FOR_adddf3:
901             case CODE_FOR_subdf3:
902             case CODE_FOR_muldf3:
903             case CODE_FOR_divdf3:
904               dest = REGNO (recog_data.operand[0]);
905               src1 = REGNO (recog_data.operand[1]);
906               src2 = REGNO (recog_data.operand[2]);
907               if (src1 != src2)
908                 {
909                   /* Case [1-4]:
910                                  ld [address], %fx+1
911                                  FPOPd %f{x,y}, %f{y,x}, %f{x,y}  */
912                   if ((src1 == x || src2 == x)
913                       && (dest == src1 || dest == src2))
914                     insert_nop = true;
915                 }
916               else
917                 {
918                   /* Case 5:
919                              ld [address], %fx+1
920                              FPOPd %fx, %fx, %fx  */
921                   if (src1 == x
922                       && dest == src1
923                       && (code == CODE_FOR_adddf3 || code == CODE_FOR_muldf3))
924                     insert_nop = true;
925                 }
926               break;
927
928             case CODE_FOR_sqrtdf2:
929               dest = REGNO (recog_data.operand[0]);
930               src1 = REGNO (recog_data.operand[1]);
931               /* Case 6:
932                          ld [address], %fx+1
933                          fsqrtd %fx, %fx  */
934               if (src1 == x && dest == src1)
935                 insert_nop = true;
936               break;
937
938             default:
939               break;
940             }
941         }
942
943       /* Look for a single-word load into an integer register.  */
944       else if (sparc_fix_ut699
945                && NONJUMP_INSN_P (insn)
946                && (set = single_set (insn)) != NULL_RTX
947                && GET_MODE_SIZE (GET_MODE (SET_SRC (set))) <= 4
948                && mem_ref (SET_SRC (set)) != NULL_RTX
949                && REG_P (SET_DEST (set))
950                && REGNO (SET_DEST (set)) < 32)
951         {
952           /* There is no problem if the second memory access has a data
953              dependency on the first single-cycle load.  */
954           rtx x = SET_DEST (set);
955
956           next = next_active_insn (insn);
957           if (!next)
958             break;
959           /* If the insn is a branch, then it cannot be problematic.  */
960           if (!NONJUMP_INSN_P (next) || GET_CODE (PATTERN (next)) == SEQUENCE)
961             continue;
962
963           /* Look for a second memory access to/from an integer register.  */
964           if ((set = single_set (next)) != NULL_RTX)
965             {
966               rtx src = SET_SRC (set);
967               rtx dest = SET_DEST (set);
968               rtx mem;
969
970               /* LDD is affected.  */
971               if ((mem = mem_ref (src)) != NULL_RTX
972                   && REG_P (dest)
973                   && REGNO (dest) < 32
974                   && !reg_mentioned_p (x, XEXP (mem, 0)))
975                 insert_nop = true;
976
977               /* STD is *not* affected.  */
978               else if (MEM_P (dest)
979                        && GET_MODE_SIZE (GET_MODE (dest)) <= 4
980                        && (src == CONST0_RTX (GET_MODE (dest))
981                            || (REG_P (src)
982                                && REGNO (src) < 32
983                                && REGNO (src) != REGNO (x)))
984                        && !reg_mentioned_p (x, XEXP (dest, 0)))
985                 insert_nop = true;
986             }
987         }
988
989       /* Look for a single-word load/operation into an FP register.  */
990       else if (sparc_fix_ut699
991                && NONJUMP_INSN_P (insn)
992                && (set = single_set (insn)) != NULL_RTX
993                && GET_MODE_SIZE (GET_MODE (SET_SRC (set))) == 4
994                && REG_P (SET_DEST (set))
995                && REGNO (SET_DEST (set)) > 31)
996         {
997           /* Number of instructions in the problematic window.  */
998           const int n_insns = 4;
999           /* The problematic combination is with the sibling FP register.  */
1000           const unsigned int x = REGNO (SET_DEST (set));
1001           const unsigned int y = x ^ 1;
1002           rtx_insn *after;
1003           int i;
1004
1005           next = next_active_insn (insn);
1006           if (!next)
1007             break;
1008           /* If the insn is a branch, then it cannot be problematic.  */
1009           if (!NONJUMP_INSN_P (next) || GET_CODE (PATTERN (next)) == SEQUENCE)
1010             continue;
1011
1012           /* Look for a second load/operation into the sibling FP register.  */
1013           if (!((set = single_set (next)) != NULL_RTX
1014                 && GET_MODE_SIZE (GET_MODE (SET_SRC (set))) == 4
1015                 && REG_P (SET_DEST (set))
1016                 && REGNO (SET_DEST (set)) == y))
1017             continue;
1018
1019           /* Look for a (possible) store from the FP register in the next N
1020              instructions, but bail out if it is again modified or if there
1021              is a store from the sibling FP register before this store.  */
1022           for (after = next, i = 0; i < n_insns; i++)
1023             {
1024               bool branch_p;
1025
1026               after = next_active_insn (after);
1027               if (!after)
1028                 break;
1029
1030               /* This is a branch with an empty delay slot.  */
1031               if (!NONJUMP_INSN_P (after))
1032                 {
1033                   if (++i == n_insns)
1034                     break;
1035                   branch_p = true;
1036                   after = NULL;
1037                 }
1038               /* This is a branch with a filled delay slot.  */
1039               else if (rtx_sequence *seq =
1040                          dyn_cast <rtx_sequence *> (PATTERN (after)))
1041                 {
1042                   if (++i == n_insns)
1043                     break;
1044                   branch_p = true;
1045                   after = seq->insn (1);
1046                 }
1047               /* This is a regular instruction.  */
1048               else
1049                 branch_p = false;
1050
1051               if (after && (set = single_set (after)) != NULL_RTX)
1052                 {
1053                   const rtx src = SET_SRC (set);
1054                   const rtx dest = SET_DEST (set);
1055                   const unsigned int size = GET_MODE_SIZE (GET_MODE (dest));
1056
1057                   /* If the FP register is again modified before the store,
1058                      then the store isn't affected.  */
1059                   if (REG_P (dest)
1060                       && (REGNO (dest) == x
1061                           || (REGNO (dest) == y && size == 8)))
1062                     break;
1063
1064                   if (MEM_P (dest) && REG_P (src))
1065                     {
1066                       /* If there is a store from the sibling FP register
1067                          before the store, then the store is not affected.  */
1068                       if (REGNO (src) == y || (REGNO (src) == x && size == 8))
1069                         break;
1070
1071                       /* Otherwise, the store is affected.  */
1072                       if (REGNO (src) == x && size == 4)
1073                         {
1074                           insert_nop = true;
1075                           break;
1076                         }
1077                     }
1078                 }
1079
1080               /* If we have a branch in the first M instructions, then we
1081                  cannot see the (M+2)th instruction so we play safe.  */
1082               if (branch_p && i <= (n_insns - 2))
1083                 {
1084                   insert_nop = true;
1085                   break;
1086                 }
1087             }
1088         }
1089
1090       else
1091         next = NEXT_INSN (insn);
1092
1093       if (insert_nop)
1094         emit_insn_before (gen_nop (), next);
1095     }
1096
1097   return 0;
1098 }
1099
1100 namespace {
1101
1102 const pass_data pass_data_work_around_errata =
1103 {
1104   RTL_PASS, /* type */
1105   "errata", /* name */
1106   OPTGROUP_NONE, /* optinfo_flags */
1107   TV_MACH_DEP, /* tv_id */
1108   0, /* properties_required */
1109   0, /* properties_provided */
1110   0, /* properties_destroyed */
1111   0, /* todo_flags_start */
1112   0, /* todo_flags_finish */
1113 };
1114
1115 class pass_work_around_errata : public rtl_opt_pass
1116 {
1117 public:
1118   pass_work_around_errata(gcc::context *ctxt)
1119     : rtl_opt_pass(pass_data_work_around_errata, ctxt)
1120   {}
1121
1122   /* opt_pass methods: */
1123   virtual bool gate (function *)
1124     {
1125       /* The only errata we handle are those of the AT697F and UT699.  */
1126       return sparc_fix_at697f != 0 || sparc_fix_ut699 != 0;
1127     }
1128
1129   virtual unsigned int execute (function *)
1130     {
1131       return sparc_do_work_around_errata ();
1132     }
1133
1134 }; // class pass_work_around_errata
1135
1136 } // anon namespace
1137
1138 rtl_opt_pass *
1139 make_pass_work_around_errata (gcc::context *ctxt)
1140 {
1141   return new pass_work_around_errata (ctxt);
1142 }
1143
1144 /* Helpers for TARGET_DEBUG_OPTIONS.  */
1145 static void
1146 dump_target_flag_bits (const int flags)
1147 {
1148   if (flags & MASK_64BIT)
1149     fprintf (stderr, "64BIT ");
1150   if (flags & MASK_APP_REGS)
1151     fprintf (stderr, "APP_REGS ");
1152   if (flags & MASK_FASTER_STRUCTS)
1153     fprintf (stderr, "FASTER_STRUCTS ");
1154   if (flags & MASK_FLAT)
1155     fprintf (stderr, "FLAT ");
1156   if (flags & MASK_FMAF)
1157     fprintf (stderr, "FMAF ");
1158   if (flags & MASK_FPU)
1159     fprintf (stderr, "FPU ");
1160   if (flags & MASK_HARD_QUAD)
1161     fprintf (stderr, "HARD_QUAD ");
1162   if (flags & MASK_POPC)
1163     fprintf (stderr, "POPC ");
1164   if (flags & MASK_PTR64)
1165     fprintf (stderr, "PTR64 ");
1166   if (flags & MASK_STACK_BIAS)
1167     fprintf (stderr, "STACK_BIAS ");
1168   if (flags & MASK_UNALIGNED_DOUBLES)
1169     fprintf (stderr, "UNALIGNED_DOUBLES ");
1170   if (flags & MASK_V8PLUS)
1171     fprintf (stderr, "V8PLUS ");
1172   if (flags & MASK_VIS)
1173     fprintf (stderr, "VIS ");
1174   if (flags & MASK_VIS2)
1175     fprintf (stderr, "VIS2 ");
1176   if (flags & MASK_VIS3)
1177     fprintf (stderr, "VIS3 ");
1178   if (flags & MASK_CBCOND)
1179     fprintf (stderr, "CBCOND ");
1180   if (flags & MASK_DEPRECATED_V8_INSNS)
1181     fprintf (stderr, "DEPRECATED_V8_INSNS ");
1182   if (flags & MASK_SPARCLET)
1183     fprintf (stderr, "SPARCLET ");
1184   if (flags & MASK_SPARCLITE)
1185     fprintf (stderr, "SPARCLITE ");
1186   if (flags & MASK_V8)
1187     fprintf (stderr, "V8 ");
1188   if (flags & MASK_V9)
1189     fprintf (stderr, "V9 ");
1190 }
1191
1192 static void
1193 dump_target_flags (const char *prefix, const int flags)
1194 {
1195   fprintf (stderr, "%s: (%08x) [ ", prefix, flags);
1196   dump_target_flag_bits (flags);
1197   fprintf(stderr, "]\n");
1198 }
1199
1200 /* Validate and override various options, and do some machine dependent
1201    initialization.  */
1202
1203 static void
1204 sparc_option_override (void)
1205 {
1206   static struct code_model {
1207     const char *const name;
1208     const enum cmodel value;
1209   } const cmodels[] = {
1210     { "32", CM_32 },
1211     { "medlow", CM_MEDLOW },
1212     { "medmid", CM_MEDMID },
1213     { "medany", CM_MEDANY },
1214     { "embmedany", CM_EMBMEDANY },
1215     { NULL, (enum cmodel) 0 }
1216   };
1217   const struct code_model *cmodel;
1218   /* Map TARGET_CPU_DEFAULT to value for -m{cpu,tune}=.  */
1219   static struct cpu_default {
1220     const int cpu;
1221     const enum processor_type processor;
1222   } const cpu_default[] = {
1223     /* There must be one entry here for each TARGET_CPU value.  */
1224     { TARGET_CPU_sparc, PROCESSOR_CYPRESS },
1225     { TARGET_CPU_v8, PROCESSOR_V8 },
1226     { TARGET_CPU_supersparc, PROCESSOR_SUPERSPARC },
1227     { TARGET_CPU_hypersparc, PROCESSOR_HYPERSPARC },
1228     { TARGET_CPU_leon, PROCESSOR_LEON },
1229     { TARGET_CPU_leon3, PROCESSOR_LEON3 },
1230     { TARGET_CPU_leon3v7, PROCESSOR_LEON3V7 },
1231     { TARGET_CPU_sparclite, PROCESSOR_F930 },
1232     { TARGET_CPU_sparclite86x, PROCESSOR_SPARCLITE86X },
1233     { TARGET_CPU_sparclet, PROCESSOR_TSC701 },
1234     { TARGET_CPU_v9, PROCESSOR_V9 },
1235     { TARGET_CPU_ultrasparc, PROCESSOR_ULTRASPARC },
1236     { TARGET_CPU_ultrasparc3, PROCESSOR_ULTRASPARC3 },
1237     { TARGET_CPU_niagara, PROCESSOR_NIAGARA },
1238     { TARGET_CPU_niagara2, PROCESSOR_NIAGARA2 },
1239     { TARGET_CPU_niagara3, PROCESSOR_NIAGARA3 },
1240     { TARGET_CPU_niagara4, PROCESSOR_NIAGARA4 },
1241     { -1, PROCESSOR_V7 }
1242   };
1243   const struct cpu_default *def;
1244   /* Table of values for -m{cpu,tune}=.  This must match the order of
1245      the enum processor_type in sparc-opts.h.  */
1246   static struct cpu_table {
1247     const char *const name;
1248     const int disable;
1249     const int enable;
1250   } const cpu_table[] = {
1251     { "v7",             MASK_ISA, 0 },
1252     { "cypress",        MASK_ISA, 0 },
1253     { "v8",             MASK_ISA, MASK_V8 },
1254     /* TI TMS390Z55 supersparc */
1255     { "supersparc",     MASK_ISA, MASK_V8 },
1256     { "hypersparc",     MASK_ISA, MASK_V8|MASK_FPU },
1257     { "leon",           MASK_ISA, MASK_V8|MASK_LEON|MASK_FPU },
1258     { "leon3",          MASK_ISA, MASK_V8|MASK_LEON3|MASK_FPU },
1259     { "leon3v7",        MASK_ISA, MASK_LEON3|MASK_FPU },
1260     { "sparclite",      MASK_ISA, MASK_SPARCLITE },
1261     /* The Fujitsu MB86930 is the original sparclite chip, with no FPU.  */
1262     { "f930",           MASK_ISA|MASK_FPU, MASK_SPARCLITE },
1263     /* The Fujitsu MB86934 is the recent sparclite chip, with an FPU.  */
1264     { "f934",           MASK_ISA, MASK_SPARCLITE|MASK_FPU },
1265     { "sparclite86x",   MASK_ISA|MASK_FPU, MASK_SPARCLITE },
1266     { "sparclet",       MASK_ISA, MASK_SPARCLET },
1267     /* TEMIC sparclet */
1268     { "tsc701",         MASK_ISA, MASK_SPARCLET },
1269     { "v9",             MASK_ISA, MASK_V9 },
1270     /* UltraSPARC I, II, IIi */
1271     { "ultrasparc",     MASK_ISA,
1272     /* Although insns using %y are deprecated, it is a clear win.  */
1273       MASK_V9|MASK_DEPRECATED_V8_INSNS },
1274     /* UltraSPARC III */
1275     /* ??? Check if %y issue still holds true.  */
1276     { "ultrasparc3",    MASK_ISA,
1277       MASK_V9|MASK_DEPRECATED_V8_INSNS|MASK_VIS2 },
1278     /* UltraSPARC T1 */
1279     { "niagara",        MASK_ISA,
1280       MASK_V9|MASK_DEPRECATED_V8_INSNS },
1281     /* UltraSPARC T2 */
1282     { "niagara2",       MASK_ISA,
1283       MASK_V9|MASK_POPC|MASK_VIS2 },
1284     /* UltraSPARC T3 */
1285     { "niagara3",       MASK_ISA,
1286       MASK_V9|MASK_POPC|MASK_VIS2|MASK_VIS3|MASK_FMAF },
1287     /* UltraSPARC T4 */
1288     { "niagara4",       MASK_ISA,
1289       MASK_V9|MASK_POPC|MASK_VIS2|MASK_VIS3|MASK_FMAF|MASK_CBCOND },
1290   };
1291   const struct cpu_table *cpu;
1292   unsigned int i;
1293   int fpu;
1294
1295   if (sparc_debug_string != NULL)
1296     {
1297       const char *q;
1298       char *p;
1299
1300       p = ASTRDUP (sparc_debug_string);
1301       while ((q = strtok (p, ",")) != NULL)
1302         {
1303           bool invert;
1304           int mask;
1305
1306           p = NULL;
1307           if (*q == '!')
1308             {
1309               invert = true;
1310               q++;
1311             }
1312           else
1313             invert = false;
1314
1315           if (! strcmp (q, "all"))
1316             mask = MASK_DEBUG_ALL;
1317           else if (! strcmp (q, "options"))
1318             mask = MASK_DEBUG_OPTIONS;
1319           else
1320             error ("unknown -mdebug-%s switch", q);
1321
1322           if (invert)
1323             sparc_debug &= ~mask;
1324           else
1325             sparc_debug |= mask;
1326         }
1327     }
1328
1329   if (TARGET_DEBUG_OPTIONS)
1330     {
1331       dump_target_flags("Initial target_flags", target_flags);
1332       dump_target_flags("target_flags_explicit", target_flags_explicit);
1333     }
1334
1335 #ifdef SUBTARGET_OVERRIDE_OPTIONS
1336   SUBTARGET_OVERRIDE_OPTIONS;
1337 #endif
1338
1339 #ifndef SPARC_BI_ARCH
1340   /* Check for unsupported architecture size.  */
1341   if (! TARGET_64BIT != DEFAULT_ARCH32_P)
1342     error ("%s is not supported by this configuration",
1343            DEFAULT_ARCH32_P ? "-m64" : "-m32");
1344 #endif
1345
1346   /* We force all 64bit archs to use 128 bit long double */
1347   if (TARGET_64BIT && ! TARGET_LONG_DOUBLE_128)
1348     {
1349       error ("-mlong-double-64 not allowed with -m64");
1350       target_flags |= MASK_LONG_DOUBLE_128;
1351     }
1352
1353   /* Code model selection.  */
1354   sparc_cmodel = SPARC_DEFAULT_CMODEL;
1355
1356 #ifdef SPARC_BI_ARCH
1357   if (TARGET_ARCH32)
1358     sparc_cmodel = CM_32;
1359 #endif
1360
1361   if (sparc_cmodel_string != NULL)
1362     {
1363       if (TARGET_ARCH64)
1364         {
1365           for (cmodel = &cmodels[0]; cmodel->name; cmodel++)
1366             if (strcmp (sparc_cmodel_string, cmodel->name) == 0)
1367               break;
1368           if (cmodel->name == NULL)
1369             error ("bad value (%s) for -mcmodel= switch", sparc_cmodel_string);
1370           else
1371             sparc_cmodel = cmodel->value;
1372         }
1373       else
1374         error ("-mcmodel= is not supported on 32 bit systems");
1375     }
1376
1377   /* Check that -fcall-saved-REG wasn't specified for out registers.  */
1378   for (i = 8; i < 16; i++)
1379     if (!call_used_regs [i])
1380       {
1381         error ("-fcall-saved-REG is not supported for out registers");
1382         call_used_regs [i] = 1;
1383       }
1384
1385   fpu = target_flags & MASK_FPU; /* save current -mfpu status */
1386
1387   /* Set the default CPU.  */
1388   if (!global_options_set.x_sparc_cpu_and_features)
1389     {
1390       for (def = &cpu_default[0]; def->cpu != -1; ++def)
1391         if (def->cpu == TARGET_CPU_DEFAULT)
1392           break;
1393       gcc_assert (def->cpu != -1);
1394       sparc_cpu_and_features = def->processor;
1395     }
1396
1397   if (!global_options_set.x_sparc_cpu)
1398     sparc_cpu = sparc_cpu_and_features;
1399
1400   cpu = &cpu_table[(int) sparc_cpu_and_features];
1401
1402   if (TARGET_DEBUG_OPTIONS)
1403     {
1404       fprintf (stderr, "sparc_cpu_and_features: %s\n", cpu->name);
1405       fprintf (stderr, "sparc_cpu: %s\n",
1406                cpu_table[(int) sparc_cpu].name);
1407       dump_target_flags ("cpu->disable", cpu->disable);
1408       dump_target_flags ("cpu->enable", cpu->enable);
1409     }
1410
1411   target_flags &= ~cpu->disable;
1412   target_flags |= (cpu->enable
1413 #ifndef HAVE_AS_FMAF_HPC_VIS3
1414                    & ~(MASK_FMAF | MASK_VIS3)
1415 #endif
1416 #ifndef HAVE_AS_SPARC4
1417                    & ~MASK_CBCOND
1418 #endif
1419 #ifndef HAVE_AS_LEON
1420                    & ~(MASK_LEON | MASK_LEON3)
1421 #endif
1422                    );
1423
1424   /* If -mfpu or -mno-fpu was explicitly used, don't override with
1425      the processor default.  */
1426   if (target_flags_explicit & MASK_FPU)
1427     target_flags = (target_flags & ~MASK_FPU) | fpu;
1428
1429   /* -mvis2 implies -mvis */
1430   if (TARGET_VIS2)
1431     target_flags |= MASK_VIS;
1432
1433   /* -mvis3 implies -mvis2 and -mvis */
1434   if (TARGET_VIS3)
1435     target_flags |= MASK_VIS2 | MASK_VIS;
1436
1437   /* Don't allow -mvis, -mvis2, -mvis3, or -mfmaf if FPU is
1438      disabled.  */
1439   if (! TARGET_FPU)
1440     target_flags &= ~(MASK_VIS | MASK_VIS2 | MASK_VIS3 | MASK_FMAF);
1441
1442   /* -mvis assumes UltraSPARC+, so we are sure v9 instructions
1443      are available.
1444      -m64 also implies v9.  */
1445   if (TARGET_VIS || TARGET_ARCH64)
1446     {
1447       target_flags |= MASK_V9;
1448       target_flags &= ~(MASK_V8 | MASK_SPARCLET | MASK_SPARCLITE);
1449     }
1450
1451   /* -mvis also implies -mv8plus on 32-bit */
1452   if (TARGET_VIS && ! TARGET_ARCH64)
1453     target_flags |= MASK_V8PLUS;
1454
1455   /* Use the deprecated v8 insns for sparc64 in 32 bit mode.  */
1456   if (TARGET_V9 && TARGET_ARCH32)
1457     target_flags |= MASK_DEPRECATED_V8_INSNS;
1458
1459   /* V8PLUS requires V9, makes no sense in 64 bit mode.  */
1460   if (! TARGET_V9 || TARGET_ARCH64)
1461     target_flags &= ~MASK_V8PLUS;
1462
1463   /* Don't use stack biasing in 32 bit mode.  */
1464   if (TARGET_ARCH32)
1465     target_flags &= ~MASK_STACK_BIAS;
1466
1467   /* Supply a default value for align_functions.  */
1468   if (align_functions == 0
1469       && (sparc_cpu == PROCESSOR_ULTRASPARC
1470           || sparc_cpu == PROCESSOR_ULTRASPARC3
1471           || sparc_cpu == PROCESSOR_NIAGARA
1472           || sparc_cpu == PROCESSOR_NIAGARA2
1473           || sparc_cpu == PROCESSOR_NIAGARA3
1474           || sparc_cpu == PROCESSOR_NIAGARA4))
1475     align_functions = 32;
1476
1477   /* Validate PCC_STRUCT_RETURN.  */
1478   if (flag_pcc_struct_return == DEFAULT_PCC_STRUCT_RETURN)
1479     flag_pcc_struct_return = (TARGET_ARCH64 ? 0 : 1);
1480
1481   /* Only use .uaxword when compiling for a 64-bit target.  */
1482   if (!TARGET_ARCH64)
1483     targetm.asm_out.unaligned_op.di = NULL;
1484
1485   /* Do various machine dependent initializations.  */
1486   sparc_init_modes ();
1487
1488   /* Set up function hooks.  */
1489   init_machine_status = sparc_init_machine_status;
1490
1491   switch (sparc_cpu)
1492     {
1493     case PROCESSOR_V7:
1494     case PROCESSOR_CYPRESS:
1495       sparc_costs = &cypress_costs;
1496       break;
1497     case PROCESSOR_V8:
1498     case PROCESSOR_SPARCLITE:
1499     case PROCESSOR_SUPERSPARC:
1500       sparc_costs = &supersparc_costs;
1501       break;
1502     case PROCESSOR_F930:
1503     case PROCESSOR_F934:
1504     case PROCESSOR_HYPERSPARC:
1505     case PROCESSOR_SPARCLITE86X:
1506       sparc_costs = &hypersparc_costs;
1507       break;
1508     case PROCESSOR_LEON:
1509       sparc_costs = &leon_costs;
1510       break;
1511     case PROCESSOR_LEON3:
1512     case PROCESSOR_LEON3V7:
1513       sparc_costs = &leon3_costs;
1514       break;
1515     case PROCESSOR_SPARCLET:
1516     case PROCESSOR_TSC701:
1517       sparc_costs = &sparclet_costs;
1518       break;
1519     case PROCESSOR_V9:
1520     case PROCESSOR_ULTRASPARC:
1521       sparc_costs = &ultrasparc_costs;
1522       break;
1523     case PROCESSOR_ULTRASPARC3:
1524       sparc_costs = &ultrasparc3_costs;
1525       break;
1526     case PROCESSOR_NIAGARA:
1527       sparc_costs = &niagara_costs;
1528       break;
1529     case PROCESSOR_NIAGARA2:
1530       sparc_costs = &niagara2_costs;
1531       break;
1532     case PROCESSOR_NIAGARA3:
1533       sparc_costs = &niagara3_costs;
1534       break;
1535     case PROCESSOR_NIAGARA4:
1536       sparc_costs = &niagara4_costs;
1537       break;
1538     case PROCESSOR_NATIVE:
1539       gcc_unreachable ();
1540     };
1541
1542   if (sparc_memory_model == SMM_DEFAULT)
1543     {
1544       /* Choose the memory model for the operating system.  */
1545       enum sparc_memory_model_type os_default = SUBTARGET_DEFAULT_MEMORY_MODEL;
1546       if (os_default != SMM_DEFAULT)
1547         sparc_memory_model = os_default;
1548       /* Choose the most relaxed model for the processor.  */
1549       else if (TARGET_V9)
1550         sparc_memory_model = SMM_RMO;
1551       else if (TARGET_LEON3)
1552         sparc_memory_model = SMM_TSO;
1553       else if (TARGET_LEON)
1554         sparc_memory_model = SMM_SC;
1555       else if (TARGET_V8)
1556         sparc_memory_model = SMM_PSO;
1557       else
1558         sparc_memory_model = SMM_SC;
1559     }
1560
1561 #ifdef TARGET_DEFAULT_LONG_DOUBLE_128
1562   if (!(target_flags_explicit & MASK_LONG_DOUBLE_128))
1563     target_flags |= MASK_LONG_DOUBLE_128;
1564 #endif
1565
1566   if (TARGET_DEBUG_OPTIONS)
1567     dump_target_flags ("Final target_flags", target_flags);
1568
1569   maybe_set_param_value (PARAM_SIMULTANEOUS_PREFETCHES,
1570                          ((sparc_cpu == PROCESSOR_ULTRASPARC
1571                            || sparc_cpu == PROCESSOR_NIAGARA
1572                            || sparc_cpu == PROCESSOR_NIAGARA2
1573                            || sparc_cpu == PROCESSOR_NIAGARA3
1574                            || sparc_cpu == PROCESSOR_NIAGARA4)
1575                           ? 2
1576                           : (sparc_cpu == PROCESSOR_ULTRASPARC3
1577                              ? 8 : 3)),
1578                          global_options.x_param_values,
1579                          global_options_set.x_param_values);
1580   maybe_set_param_value (PARAM_L1_CACHE_LINE_SIZE,
1581                          ((sparc_cpu == PROCESSOR_ULTRASPARC
1582                            || sparc_cpu == PROCESSOR_ULTRASPARC3
1583                            || sparc_cpu == PROCESSOR_NIAGARA
1584                            || sparc_cpu == PROCESSOR_NIAGARA2
1585                            || sparc_cpu == PROCESSOR_NIAGARA3
1586                            || sparc_cpu == PROCESSOR_NIAGARA4)
1587                           ? 64 : 32),
1588                          global_options.x_param_values,
1589                          global_options_set.x_param_values);
1590
1591   /* Disable save slot sharing for call-clobbered registers by default.
1592      The IRA sharing algorithm works on single registers only and this
1593      pessimizes for double floating-point registers.  */
1594   if (!global_options_set.x_flag_ira_share_save_slots)
1595     flag_ira_share_save_slots = 0;
1596
1597   /* We register a machine specific pass to work around errata, if any.
1598      The pass mut be scheduled as late as possible so that we have the
1599      (essentially) final form of the insn stream to work on.
1600      Registering the pass must be done at start up.  It's convenient to
1601      do it here.  */
1602   opt_pass *errata_pass = make_pass_work_around_errata (g);
1603   struct register_pass_info insert_pass_work_around_errata =
1604     {
1605       errata_pass,              /* pass */
1606       "dbr",                    /* reference_pass_name */
1607       1,                        /* ref_pass_instance_number */
1608       PASS_POS_INSERT_AFTER     /* po_op */
1609     };
1610   register_pass (&insert_pass_work_around_errata);
1611 }
1612 \f
1613 /* Miscellaneous utilities.  */
1614
1615 /* Nonzero if CODE, a comparison, is suitable for use in v9 conditional move
1616    or branch on register contents instructions.  */
1617
1618 int
1619 v9_regcmp_p (enum rtx_code code)
1620 {
1621   return (code == EQ || code == NE || code == GE || code == LT
1622           || code == LE || code == GT);
1623 }
1624
1625 /* Nonzero if OP is a floating point constant which can
1626    be loaded into an integer register using a single
1627    sethi instruction.  */
1628
1629 int
1630 fp_sethi_p (rtx op)
1631 {
1632   if (GET_CODE (op) == CONST_DOUBLE)
1633     {
1634       long i;
1635
1636       REAL_VALUE_TO_TARGET_SINGLE (*CONST_DOUBLE_REAL_VALUE (op), i);
1637       return !SPARC_SIMM13_P (i) && SPARC_SETHI_P (i);
1638     }
1639
1640   return 0;
1641 }
1642
1643 /* Nonzero if OP is a floating point constant which can
1644    be loaded into an integer register using a single
1645    mov instruction.  */
1646
1647 int
1648 fp_mov_p (rtx op)
1649 {
1650   if (GET_CODE (op) == CONST_DOUBLE)
1651     {
1652       long i;
1653
1654       REAL_VALUE_TO_TARGET_SINGLE (*CONST_DOUBLE_REAL_VALUE (op), i);
1655       return SPARC_SIMM13_P (i);
1656     }
1657
1658   return 0;
1659 }
1660
1661 /* Nonzero if OP is a floating point constant which can
1662    be loaded into an integer register using a high/losum
1663    instruction sequence.  */
1664
1665 int
1666 fp_high_losum_p (rtx op)
1667 {
1668   /* The constraints calling this should only be in
1669      SFmode move insns, so any constant which cannot
1670      be moved using a single insn will do.  */
1671   if (GET_CODE (op) == CONST_DOUBLE)
1672     {
1673       long i;
1674
1675       REAL_VALUE_TO_TARGET_SINGLE (*CONST_DOUBLE_REAL_VALUE (op), i);
1676       return !SPARC_SIMM13_P (i) && !SPARC_SETHI_P (i);
1677     }
1678
1679   return 0;
1680 }
1681
1682 /* Return true if the address of LABEL can be loaded by means of the
1683    mov{si,di}_pic_label_ref patterns in PIC mode.  */
1684
1685 static bool
1686 can_use_mov_pic_label_ref (rtx label)
1687 {
1688   /* VxWorks does not impose a fixed gap between segments; the run-time
1689      gap can be different from the object-file gap.  We therefore can't
1690      assume X - _GLOBAL_OFFSET_TABLE_ is a link-time constant unless we
1691      are absolutely sure that X is in the same segment as the GOT.
1692      Unfortunately, the flexibility of linker scripts means that we
1693      can't be sure of that in general, so assume that GOT-relative
1694      accesses are never valid on VxWorks.  */
1695   if (TARGET_VXWORKS_RTP)
1696     return false;
1697
1698   /* Similarly, if the label is non-local, it might end up being placed
1699      in a different section than the current one; now mov_pic_label_ref
1700      requires the label and the code to be in the same section.  */
1701   if (LABEL_REF_NONLOCAL_P (label))
1702     return false;
1703
1704   /* Finally, if we are reordering basic blocks and partition into hot
1705      and cold sections, this might happen for any label.  */
1706   if (flag_reorder_blocks_and_partition)
1707     return false;
1708
1709   return true;
1710 }
1711
1712 /* Expand a move instruction.  Return true if all work is done.  */
1713
1714 bool
1715 sparc_expand_move (machine_mode mode, rtx *operands)
1716 {
1717   /* Handle sets of MEM first.  */
1718   if (GET_CODE (operands[0]) == MEM)
1719     {
1720       /* 0 is a register (or a pair of registers) on SPARC.  */
1721       if (register_or_zero_operand (operands[1], mode))
1722         return false;
1723
1724       if (!reload_in_progress)
1725         {
1726           operands[0] = validize_mem (operands[0]);
1727           operands[1] = force_reg (mode, operands[1]);
1728         }
1729     }
1730
1731   /* Fixup TLS cases.  */
1732   if (TARGET_HAVE_TLS
1733       && CONSTANT_P (operands[1])
1734       && sparc_tls_referenced_p (operands [1]))
1735     {
1736       operands[1] = sparc_legitimize_tls_address (operands[1]);
1737       return false;
1738     }
1739
1740   /* Fixup PIC cases.  */
1741   if (flag_pic && CONSTANT_P (operands[1]))
1742     {
1743       if (pic_address_needs_scratch (operands[1]))
1744         operands[1] = sparc_legitimize_pic_address (operands[1], NULL_RTX);
1745
1746       /* We cannot use the mov{si,di}_pic_label_ref patterns in all cases.  */
1747       if (GET_CODE (operands[1]) == LABEL_REF
1748           && can_use_mov_pic_label_ref (operands[1]))
1749         {
1750           if (mode == SImode)
1751             {
1752               emit_insn (gen_movsi_pic_label_ref (operands[0], operands[1]));
1753               return true;
1754             }
1755
1756           if (mode == DImode)
1757             {
1758               gcc_assert (TARGET_ARCH64);
1759               emit_insn (gen_movdi_pic_label_ref (operands[0], operands[1]));
1760               return true;
1761             }
1762         }
1763
1764       if (symbolic_operand (operands[1], mode))
1765         {
1766           operands[1]
1767             = sparc_legitimize_pic_address (operands[1],
1768                                             reload_in_progress
1769                                             ? operands[0] : NULL_RTX);
1770           return false;
1771         }
1772     }
1773
1774   /* If we are trying to toss an integer constant into FP registers,
1775      or loading a FP or vector constant, force it into memory.  */
1776   if (CONSTANT_P (operands[1])
1777       && REG_P (operands[0])
1778       && (SPARC_FP_REG_P (REGNO (operands[0]))
1779           || SCALAR_FLOAT_MODE_P (mode)
1780           || VECTOR_MODE_P (mode)))
1781     {
1782       /* emit_group_store will send such bogosity to us when it is
1783          not storing directly into memory.  So fix this up to avoid
1784          crashes in output_constant_pool.  */
1785       if (operands [1] == const0_rtx)
1786         operands[1] = CONST0_RTX (mode);
1787
1788       /* We can clear or set to all-ones FP registers if TARGET_VIS, and
1789          always other regs.  */
1790       if ((TARGET_VIS || REGNO (operands[0]) < SPARC_FIRST_FP_REG)
1791           && (const_zero_operand (operands[1], mode)
1792               || const_all_ones_operand (operands[1], mode)))
1793         return false;
1794
1795       if (REGNO (operands[0]) < SPARC_FIRST_FP_REG
1796           /* We are able to build any SF constant in integer registers
1797              with at most 2 instructions.  */
1798           && (mode == SFmode
1799               /* And any DF constant in integer registers.  */
1800               || (mode == DFmode
1801                   && ! can_create_pseudo_p ())))
1802         return false;
1803
1804       operands[1] = force_const_mem (mode, operands[1]);
1805       if (!reload_in_progress)
1806         operands[1] = validize_mem (operands[1]);
1807       return false;
1808     }
1809
1810   /* Accept non-constants and valid constants unmodified.  */
1811   if (!CONSTANT_P (operands[1])
1812       || GET_CODE (operands[1]) == HIGH
1813       || input_operand (operands[1], mode))
1814     return false;
1815
1816   switch (mode)
1817     {
1818     case QImode:
1819       /* All QImode constants require only one insn, so proceed.  */
1820       break;
1821
1822     case HImode:
1823     case SImode:
1824       sparc_emit_set_const32 (operands[0], operands[1]);
1825       return true;
1826
1827     case DImode:
1828       /* input_operand should have filtered out 32-bit mode.  */
1829       sparc_emit_set_const64 (operands[0], operands[1]);
1830       return true;
1831
1832     case TImode:
1833       {
1834         rtx high, low;
1835         /* TImode isn't available in 32-bit mode.  */
1836         split_double (operands[1], &high, &low);
1837         emit_insn (gen_movdi (operand_subword (operands[0], 0, 0, TImode),
1838                               high));
1839         emit_insn (gen_movdi (operand_subword (operands[0], 1, 0, TImode),
1840                               low));
1841       }
1842       return true;
1843
1844     default:
1845       gcc_unreachable ();
1846     }
1847
1848   return false;
1849 }
1850
1851 /* Load OP1, a 32-bit constant, into OP0, a register.
1852    We know it can't be done in one insn when we get
1853    here, the move expander guarantees this.  */
1854
1855 static void
1856 sparc_emit_set_const32 (rtx op0, rtx op1)
1857 {
1858   machine_mode mode = GET_MODE (op0);
1859   rtx temp = op0;
1860
1861   if (can_create_pseudo_p ())
1862     temp = gen_reg_rtx (mode);
1863
1864   if (GET_CODE (op1) == CONST_INT)
1865     {
1866       gcc_assert (!small_int_operand (op1, mode)
1867                   && !const_high_operand (op1, mode));
1868
1869       /* Emit them as real moves instead of a HIGH/LO_SUM,
1870          this way CSE can see everything and reuse intermediate
1871          values if it wants.  */
1872       emit_insn (gen_rtx_SET (temp, GEN_INT (INTVAL (op1)
1873                                              & ~(HOST_WIDE_INT) 0x3ff)));
1874
1875       emit_insn (gen_rtx_SET (op0,
1876                               gen_rtx_IOR (mode, temp,
1877                                            GEN_INT (INTVAL (op1) & 0x3ff))));
1878     }
1879   else
1880     {
1881       /* A symbol, emit in the traditional way.  */
1882       emit_insn (gen_rtx_SET (temp, gen_rtx_HIGH (mode, op1)));
1883       emit_insn (gen_rtx_SET (op0, gen_rtx_LO_SUM (mode, temp, op1)));
1884     }
1885 }
1886
1887 /* Load OP1, a symbolic 64-bit constant, into OP0, a DImode register.
1888    If TEMP is nonzero, we are forbidden to use any other scratch
1889    registers.  Otherwise, we are allowed to generate them as needed.
1890
1891    Note that TEMP may have TImode if the code model is TARGET_CM_MEDANY
1892    or TARGET_CM_EMBMEDANY (see the reload_indi and reload_outdi patterns).  */
1893
1894 void
1895 sparc_emit_set_symbolic_const64 (rtx op0, rtx op1, rtx temp)
1896 {
1897   rtx temp1, temp2, temp3, temp4, temp5;
1898   rtx ti_temp = 0;
1899
1900   if (temp && GET_MODE (temp) == TImode)
1901     {
1902       ti_temp = temp;
1903       temp = gen_rtx_REG (DImode, REGNO (temp));
1904     }
1905
1906   /* SPARC-V9 code-model support.  */
1907   switch (sparc_cmodel)
1908     {
1909     case CM_MEDLOW:
1910       /* The range spanned by all instructions in the object is less
1911          than 2^31 bytes (2GB) and the distance from any instruction
1912          to the location of the label _GLOBAL_OFFSET_TABLE_ is less
1913          than 2^31 bytes (2GB).
1914
1915          The executable must be in the low 4TB of the virtual address
1916          space.
1917
1918          sethi  %hi(symbol), %temp1
1919          or     %temp1, %lo(symbol), %reg  */
1920       if (temp)
1921         temp1 = temp;  /* op0 is allowed.  */
1922       else
1923         temp1 = gen_reg_rtx (DImode);
1924
1925       emit_insn (gen_rtx_SET (temp1, gen_rtx_HIGH (DImode, op1)));
1926       emit_insn (gen_rtx_SET (op0, gen_rtx_LO_SUM (DImode, temp1, op1)));
1927       break;
1928
1929     case CM_MEDMID:
1930       /* The range spanned by all instructions in the object is less
1931          than 2^31 bytes (2GB) and the distance from any instruction
1932          to the location of the label _GLOBAL_OFFSET_TABLE_ is less
1933          than 2^31 bytes (2GB).
1934
1935          The executable must be in the low 16TB of the virtual address
1936          space.
1937
1938          sethi  %h44(symbol), %temp1
1939          or     %temp1, %m44(symbol), %temp2
1940          sllx   %temp2, 12, %temp3
1941          or     %temp3, %l44(symbol), %reg  */
1942       if (temp)
1943         {
1944           temp1 = op0;
1945           temp2 = op0;
1946           temp3 = temp;  /* op0 is allowed.  */
1947         }
1948       else
1949         {
1950           temp1 = gen_reg_rtx (DImode);
1951           temp2 = gen_reg_rtx (DImode);
1952           temp3 = gen_reg_rtx (DImode);
1953         }
1954
1955       emit_insn (gen_seth44 (temp1, op1));
1956       emit_insn (gen_setm44 (temp2, temp1, op1));
1957       emit_insn (gen_rtx_SET (temp3,
1958                               gen_rtx_ASHIFT (DImode, temp2, GEN_INT (12))));
1959       emit_insn (gen_setl44 (op0, temp3, op1));
1960       break;
1961
1962     case CM_MEDANY:
1963       /* The range spanned by all instructions in the object is less
1964          than 2^31 bytes (2GB) and the distance from any instruction
1965          to the location of the label _GLOBAL_OFFSET_TABLE_ is less
1966          than 2^31 bytes (2GB).
1967
1968          The executable can be placed anywhere in the virtual address
1969          space.
1970
1971          sethi  %hh(symbol), %temp1
1972          sethi  %lm(symbol), %temp2
1973          or     %temp1, %hm(symbol), %temp3
1974          sllx   %temp3, 32, %temp4
1975          or     %temp4, %temp2, %temp5
1976          or     %temp5, %lo(symbol), %reg  */
1977       if (temp)
1978         {
1979           /* It is possible that one of the registers we got for operands[2]
1980              might coincide with that of operands[0] (which is why we made
1981              it TImode).  Pick the other one to use as our scratch.  */
1982           if (rtx_equal_p (temp, op0))
1983             {
1984               gcc_assert (ti_temp);
1985               temp = gen_rtx_REG (DImode, REGNO (temp) + 1);
1986             }
1987           temp1 = op0;
1988           temp2 = temp;  /* op0 is _not_ allowed, see above.  */
1989           temp3 = op0;
1990           temp4 = op0;
1991           temp5 = op0;
1992         }
1993       else
1994         {
1995           temp1 = gen_reg_rtx (DImode);
1996           temp2 = gen_reg_rtx (DImode);
1997           temp3 = gen_reg_rtx (DImode);
1998           temp4 = gen_reg_rtx (DImode);
1999           temp5 = gen_reg_rtx (DImode);
2000         }
2001
2002       emit_insn (gen_sethh (temp1, op1));
2003       emit_insn (gen_setlm (temp2, op1));
2004       emit_insn (gen_sethm (temp3, temp1, op1));
2005       emit_insn (gen_rtx_SET (temp4,
2006                               gen_rtx_ASHIFT (DImode, temp3, GEN_INT (32))));
2007       emit_insn (gen_rtx_SET (temp5, gen_rtx_PLUS (DImode, temp4, temp2)));
2008       emit_insn (gen_setlo (op0, temp5, op1));
2009       break;
2010
2011     case CM_EMBMEDANY:
2012       /* Old old old backwards compatibility kruft here.
2013          Essentially it is MEDLOW with a fixed 64-bit
2014          virtual base added to all data segment addresses.
2015          Text-segment stuff is computed like MEDANY, we can't
2016          reuse the code above because the relocation knobs
2017          look different.
2018
2019          Data segment:  sethi   %hi(symbol), %temp1
2020                         add     %temp1, EMBMEDANY_BASE_REG, %temp2
2021                         or      %temp2, %lo(symbol), %reg  */
2022       if (data_segment_operand (op1, GET_MODE (op1)))
2023         {
2024           if (temp)
2025             {
2026               temp1 = temp;  /* op0 is allowed.  */
2027               temp2 = op0;
2028             }
2029           else
2030             {
2031               temp1 = gen_reg_rtx (DImode);
2032               temp2 = gen_reg_rtx (DImode);
2033             }
2034
2035           emit_insn (gen_embmedany_sethi (temp1, op1));
2036           emit_insn (gen_embmedany_brsum (temp2, temp1));
2037           emit_insn (gen_embmedany_losum (op0, temp2, op1));
2038         }
2039
2040       /* Text segment:  sethi   %uhi(symbol), %temp1
2041                         sethi   %hi(symbol), %temp2
2042                         or      %temp1, %ulo(symbol), %temp3
2043                         sllx    %temp3, 32, %temp4
2044                         or      %temp4, %temp2, %temp5
2045                         or      %temp5, %lo(symbol), %reg  */
2046       else
2047         {
2048           if (temp)
2049             {
2050               /* It is possible that one of the registers we got for operands[2]
2051                  might coincide with that of operands[0] (which is why we made
2052                  it TImode).  Pick the other one to use as our scratch.  */
2053               if (rtx_equal_p (temp, op0))
2054                 {
2055                   gcc_assert (ti_temp);
2056                   temp = gen_rtx_REG (DImode, REGNO (temp) + 1);
2057                 }
2058               temp1 = op0;
2059               temp2 = temp;  /* op0 is _not_ allowed, see above.  */
2060               temp3 = op0;
2061               temp4 = op0;
2062               temp5 = op0;
2063             }
2064           else
2065             {
2066               temp1 = gen_reg_rtx (DImode);
2067               temp2 = gen_reg_rtx (DImode);
2068               temp3 = gen_reg_rtx (DImode);
2069               temp4 = gen_reg_rtx (DImode);
2070               temp5 = gen_reg_rtx (DImode);
2071             }
2072
2073           emit_insn (gen_embmedany_textuhi (temp1, op1));
2074           emit_insn (gen_embmedany_texthi  (temp2, op1));
2075           emit_insn (gen_embmedany_textulo (temp3, temp1, op1));
2076           emit_insn (gen_rtx_SET (temp4,
2077                                   gen_rtx_ASHIFT (DImode, temp3, GEN_INT (32))));
2078           emit_insn (gen_rtx_SET (temp5, gen_rtx_PLUS (DImode, temp4, temp2)));
2079           emit_insn (gen_embmedany_textlo  (op0, temp5, op1));
2080         }
2081       break;
2082
2083     default:
2084       gcc_unreachable ();
2085     }
2086 }
2087
2088 /* These avoid problems when cross compiling.  If we do not
2089    go through all this hair then the optimizer will see
2090    invalid REG_EQUAL notes or in some cases none at all.  */
2091 static rtx gen_safe_HIGH64 (rtx, HOST_WIDE_INT);
2092 static rtx gen_safe_SET64 (rtx, HOST_WIDE_INT);
2093 static rtx gen_safe_OR64 (rtx, HOST_WIDE_INT);
2094 static rtx gen_safe_XOR64 (rtx, HOST_WIDE_INT);
2095
2096 /* The optimizer is not to assume anything about exactly
2097    which bits are set for a HIGH, they are unspecified.
2098    Unfortunately this leads to many missed optimizations
2099    during CSE.  We mask out the non-HIGH bits, and matches
2100    a plain movdi, to alleviate this problem.  */
2101 static rtx
2102 gen_safe_HIGH64 (rtx dest, HOST_WIDE_INT val)
2103 {
2104   return gen_rtx_SET (dest, GEN_INT (val & ~(HOST_WIDE_INT)0x3ff));
2105 }
2106
2107 static rtx
2108 gen_safe_SET64 (rtx dest, HOST_WIDE_INT val)
2109 {
2110   return gen_rtx_SET (dest, GEN_INT (val));
2111 }
2112
2113 static rtx
2114 gen_safe_OR64 (rtx src, HOST_WIDE_INT val)
2115 {
2116   return gen_rtx_IOR (DImode, src, GEN_INT (val));
2117 }
2118
2119 static rtx
2120 gen_safe_XOR64 (rtx src, HOST_WIDE_INT val)
2121 {
2122   return gen_rtx_XOR (DImode, src, GEN_INT (val));
2123 }
2124
2125 /* Worker routines for 64-bit constant formation on arch64.
2126    One of the key things to be doing in these emissions is
2127    to create as many temp REGs as possible.  This makes it
2128    possible for half-built constants to be used later when
2129    such values are similar to something required later on.
2130    Without doing this, the optimizer cannot see such
2131    opportunities.  */
2132
2133 static void sparc_emit_set_const64_quick1 (rtx, rtx,
2134                                            unsigned HOST_WIDE_INT, int);
2135
2136 static void
2137 sparc_emit_set_const64_quick1 (rtx op0, rtx temp,
2138                                unsigned HOST_WIDE_INT low_bits, int is_neg)
2139 {
2140   unsigned HOST_WIDE_INT high_bits;
2141
2142   if (is_neg)
2143     high_bits = (~low_bits) & 0xffffffff;
2144   else
2145     high_bits = low_bits;
2146
2147   emit_insn (gen_safe_HIGH64 (temp, high_bits));
2148   if (!is_neg)
2149     {
2150       emit_insn (gen_rtx_SET (op0, gen_safe_OR64 (temp, (high_bits & 0x3ff))));
2151     }
2152   else
2153     {
2154       /* If we are XOR'ing with -1, then we should emit a one's complement
2155          instead.  This way the combiner will notice logical operations
2156          such as ANDN later on and substitute.  */
2157       if ((low_bits & 0x3ff) == 0x3ff)
2158         {
2159           emit_insn (gen_rtx_SET (op0, gen_rtx_NOT (DImode, temp)));
2160         }
2161       else
2162         {
2163           emit_insn (gen_rtx_SET (op0,
2164                                   gen_safe_XOR64 (temp,
2165                                                   (-(HOST_WIDE_INT)0x400
2166                                                    | (low_bits & 0x3ff)))));
2167         }
2168     }
2169 }
2170
2171 static void sparc_emit_set_const64_quick2 (rtx, rtx, unsigned HOST_WIDE_INT,
2172                                            unsigned HOST_WIDE_INT, int);
2173
2174 static void
2175 sparc_emit_set_const64_quick2 (rtx op0, rtx temp,
2176                                unsigned HOST_WIDE_INT high_bits,
2177                                unsigned HOST_WIDE_INT low_immediate,
2178                                int shift_count)
2179 {
2180   rtx temp2 = op0;
2181
2182   if ((high_bits & 0xfffffc00) != 0)
2183     {
2184       emit_insn (gen_safe_HIGH64 (temp, high_bits));
2185       if ((high_bits & ~0xfffffc00) != 0)
2186         emit_insn (gen_rtx_SET (op0,
2187                                 gen_safe_OR64 (temp, (high_bits & 0x3ff))));
2188       else
2189         temp2 = temp;
2190     }
2191   else
2192     {
2193       emit_insn (gen_safe_SET64 (temp, high_bits));
2194       temp2 = temp;
2195     }
2196
2197   /* Now shift it up into place.  */
2198   emit_insn (gen_rtx_SET (op0, gen_rtx_ASHIFT (DImode, temp2,
2199                                                GEN_INT (shift_count))));
2200
2201   /* If there is a low immediate part piece, finish up by
2202      putting that in as well.  */
2203   if (low_immediate != 0)
2204     emit_insn (gen_rtx_SET (op0, gen_safe_OR64 (op0, low_immediate)));
2205 }
2206
2207 static void sparc_emit_set_const64_longway (rtx, rtx, unsigned HOST_WIDE_INT,
2208                                             unsigned HOST_WIDE_INT);
2209
2210 /* Full 64-bit constant decomposition.  Even though this is the
2211    'worst' case, we still optimize a few things away.  */
2212 static void
2213 sparc_emit_set_const64_longway (rtx op0, rtx temp,
2214                                 unsigned HOST_WIDE_INT high_bits,
2215                                 unsigned HOST_WIDE_INT low_bits)
2216 {
2217   rtx sub_temp = op0;
2218
2219   if (can_create_pseudo_p ())
2220     sub_temp = gen_reg_rtx (DImode);
2221
2222   if ((high_bits & 0xfffffc00) != 0)
2223     {
2224       emit_insn (gen_safe_HIGH64 (temp, high_bits));
2225       if ((high_bits & ~0xfffffc00) != 0)
2226         emit_insn (gen_rtx_SET (sub_temp,
2227                                 gen_safe_OR64 (temp, (high_bits & 0x3ff))));
2228       else
2229         sub_temp = temp;
2230     }
2231   else
2232     {
2233       emit_insn (gen_safe_SET64 (temp, high_bits));
2234       sub_temp = temp;
2235     }
2236
2237   if (can_create_pseudo_p ())
2238     {
2239       rtx temp2 = gen_reg_rtx (DImode);
2240       rtx temp3 = gen_reg_rtx (DImode);
2241       rtx temp4 = gen_reg_rtx (DImode);
2242
2243       emit_insn (gen_rtx_SET (temp4, gen_rtx_ASHIFT (DImode, sub_temp,
2244                                                      GEN_INT (32))));
2245
2246       emit_insn (gen_safe_HIGH64 (temp2, low_bits));
2247       if ((low_bits & ~0xfffffc00) != 0)
2248         {
2249           emit_insn (gen_rtx_SET (temp3,
2250                                   gen_safe_OR64 (temp2, (low_bits & 0x3ff))));
2251           emit_insn (gen_rtx_SET (op0, gen_rtx_PLUS (DImode, temp4, temp3)));
2252         }
2253       else
2254         {
2255           emit_insn (gen_rtx_SET (op0, gen_rtx_PLUS (DImode, temp4, temp2)));
2256         }
2257     }
2258   else
2259     {
2260       rtx low1 = GEN_INT ((low_bits >> (32 - 12))          & 0xfff);
2261       rtx low2 = GEN_INT ((low_bits >> (32 - 12 - 12))     & 0xfff);
2262       rtx low3 = GEN_INT ((low_bits >> (32 - 12 - 12 - 8)) & 0x0ff);
2263       int to_shift = 12;
2264
2265       /* We are in the middle of reload, so this is really
2266          painful.  However we do still make an attempt to
2267          avoid emitting truly stupid code.  */
2268       if (low1 != const0_rtx)
2269         {
2270           emit_insn (gen_rtx_SET (op0, gen_rtx_ASHIFT (DImode, sub_temp,
2271                                                        GEN_INT (to_shift))));
2272           emit_insn (gen_rtx_SET (op0, gen_rtx_IOR (DImode, op0, low1)));
2273           sub_temp = op0;
2274           to_shift = 12;
2275         }
2276       else
2277         {
2278           to_shift += 12;
2279         }
2280       if (low2 != const0_rtx)
2281         {
2282           emit_insn (gen_rtx_SET (op0, gen_rtx_ASHIFT (DImode, sub_temp,
2283                                                        GEN_INT (to_shift))));
2284           emit_insn (gen_rtx_SET (op0, gen_rtx_IOR (DImode, op0, low2)));
2285           sub_temp = op0;
2286           to_shift = 8;
2287         }
2288       else
2289         {
2290           to_shift += 8;
2291         }
2292       emit_insn (gen_rtx_SET (op0, gen_rtx_ASHIFT (DImode, sub_temp,
2293                                                    GEN_INT (to_shift))));
2294       if (low3 != const0_rtx)
2295         emit_insn (gen_rtx_SET (op0, gen_rtx_IOR (DImode, op0, low3)));
2296       /* phew...  */
2297     }
2298 }
2299
2300 /* Analyze a 64-bit constant for certain properties.  */
2301 static void analyze_64bit_constant (unsigned HOST_WIDE_INT,
2302                                     unsigned HOST_WIDE_INT,
2303                                     int *, int *, int *);
2304
2305 static void
2306 analyze_64bit_constant (unsigned HOST_WIDE_INT high_bits,
2307                         unsigned HOST_WIDE_INT low_bits,
2308                         int *hbsp, int *lbsp, int *abbasp)
2309 {
2310   int lowest_bit_set, highest_bit_set, all_bits_between_are_set;
2311   int i;
2312
2313   lowest_bit_set = highest_bit_set = -1;
2314   i = 0;
2315   do
2316     {
2317       if ((lowest_bit_set == -1)
2318           && ((low_bits >> i) & 1))
2319         lowest_bit_set = i;
2320       if ((highest_bit_set == -1)
2321           && ((high_bits >> (32 - i - 1)) & 1))
2322         highest_bit_set = (64 - i - 1);
2323     }
2324   while (++i < 32
2325          && ((highest_bit_set == -1)
2326              || (lowest_bit_set == -1)));
2327   if (i == 32)
2328     {
2329       i = 0;
2330       do
2331         {
2332           if ((lowest_bit_set == -1)
2333               && ((high_bits >> i) & 1))
2334             lowest_bit_set = i + 32;
2335           if ((highest_bit_set == -1)
2336               && ((low_bits >> (32 - i - 1)) & 1))
2337             highest_bit_set = 32 - i - 1;
2338         }
2339       while (++i < 32
2340              && ((highest_bit_set == -1)
2341                  || (lowest_bit_set == -1)));
2342     }
2343   /* If there are no bits set this should have gone out
2344      as one instruction!  */
2345   gcc_assert (lowest_bit_set != -1 && highest_bit_set != -1);
2346   all_bits_between_are_set = 1;
2347   for (i = lowest_bit_set; i <= highest_bit_set; i++)
2348     {
2349       if (i < 32)
2350         {
2351           if ((low_bits & (1 << i)) != 0)
2352             continue;
2353         }
2354       else
2355         {
2356           if ((high_bits & (1 << (i - 32))) != 0)
2357             continue;
2358         }
2359       all_bits_between_are_set = 0;
2360       break;
2361     }
2362   *hbsp = highest_bit_set;
2363   *lbsp = lowest_bit_set;
2364   *abbasp = all_bits_between_are_set;
2365 }
2366
2367 static int const64_is_2insns (unsigned HOST_WIDE_INT, unsigned HOST_WIDE_INT);
2368
2369 static int
2370 const64_is_2insns (unsigned HOST_WIDE_INT high_bits,
2371                    unsigned HOST_WIDE_INT low_bits)
2372 {
2373   int highest_bit_set, lowest_bit_set, all_bits_between_are_set;
2374
2375   if (high_bits == 0
2376       || high_bits == 0xffffffff)
2377     return 1;
2378
2379   analyze_64bit_constant (high_bits, low_bits,
2380                           &highest_bit_set, &lowest_bit_set,
2381                           &all_bits_between_are_set);
2382
2383   if ((highest_bit_set == 63
2384        || lowest_bit_set == 0)
2385       && all_bits_between_are_set != 0)
2386     return 1;
2387
2388   if ((highest_bit_set - lowest_bit_set) < 21)
2389     return 1;
2390
2391   return 0;
2392 }
2393
2394 static unsigned HOST_WIDE_INT create_simple_focus_bits (unsigned HOST_WIDE_INT,
2395                                                         unsigned HOST_WIDE_INT,
2396                                                         int, int);
2397
2398 static unsigned HOST_WIDE_INT
2399 create_simple_focus_bits (unsigned HOST_WIDE_INT high_bits,
2400                           unsigned HOST_WIDE_INT low_bits,
2401                           int lowest_bit_set, int shift)
2402 {
2403   HOST_WIDE_INT hi, lo;
2404
2405   if (lowest_bit_set < 32)
2406     {
2407       lo = (low_bits >> lowest_bit_set) << shift;
2408       hi = ((high_bits << (32 - lowest_bit_set)) << shift);
2409     }
2410   else
2411     {
2412       lo = 0;
2413       hi = ((high_bits >> (lowest_bit_set - 32)) << shift);
2414     }
2415   gcc_assert (! (hi & lo));
2416   return (hi | lo);
2417 }
2418
2419 /* Here we are sure to be arch64 and this is an integer constant
2420    being loaded into a register.  Emit the most efficient
2421    insn sequence possible.  Detection of all the 1-insn cases
2422    has been done already.  */
2423 static void
2424 sparc_emit_set_const64 (rtx op0, rtx op1)
2425 {
2426   unsigned HOST_WIDE_INT high_bits, low_bits;
2427   int lowest_bit_set, highest_bit_set;
2428   int all_bits_between_are_set;
2429   rtx temp = 0;
2430
2431   /* Sanity check that we know what we are working with.  */
2432   gcc_assert (TARGET_ARCH64
2433               && (GET_CODE (op0) == SUBREG
2434                   || (REG_P (op0) && ! SPARC_FP_REG_P (REGNO (op0)))));
2435
2436   if (! can_create_pseudo_p ())
2437     temp = op0;
2438
2439   if (GET_CODE (op1) != CONST_INT)
2440     {
2441       sparc_emit_set_symbolic_const64 (op0, op1, temp);
2442       return;
2443     }
2444
2445   if (! temp)
2446     temp = gen_reg_rtx (DImode);
2447
2448   high_bits = ((INTVAL (op1) >> 32) & 0xffffffff);
2449   low_bits = (INTVAL (op1) & 0xffffffff);
2450
2451   /* low_bits   bits 0  --> 31
2452      high_bits  bits 32 --> 63  */
2453
2454   analyze_64bit_constant (high_bits, low_bits,
2455                           &highest_bit_set, &lowest_bit_set,
2456                           &all_bits_between_are_set);
2457
2458   /* First try for a 2-insn sequence.  */
2459
2460   /* These situations are preferred because the optimizer can
2461    * do more things with them:
2462    * 1) mov     -1, %reg
2463    *    sllx    %reg, shift, %reg
2464    * 2) mov     -1, %reg
2465    *    srlx    %reg, shift, %reg
2466    * 3) mov     some_small_const, %reg
2467    *    sllx    %reg, shift, %reg
2468    */
2469   if (((highest_bit_set == 63
2470         || lowest_bit_set == 0)
2471        && all_bits_between_are_set != 0)
2472       || ((highest_bit_set - lowest_bit_set) < 12))
2473     {
2474       HOST_WIDE_INT the_const = -1;
2475       int shift = lowest_bit_set;
2476
2477       if ((highest_bit_set != 63
2478            && lowest_bit_set != 0)
2479           || all_bits_between_are_set == 0)
2480         {
2481           the_const =
2482             create_simple_focus_bits (high_bits, low_bits,
2483                                       lowest_bit_set, 0);
2484         }
2485       else if (lowest_bit_set == 0)
2486         shift = -(63 - highest_bit_set);
2487
2488       gcc_assert (SPARC_SIMM13_P (the_const));
2489       gcc_assert (shift != 0);
2490
2491       emit_insn (gen_safe_SET64 (temp, the_const));
2492       if (shift > 0)
2493         emit_insn (gen_rtx_SET (op0, gen_rtx_ASHIFT (DImode, temp,
2494                                                      GEN_INT (shift))));
2495       else if (shift < 0)
2496         emit_insn (gen_rtx_SET (op0, gen_rtx_LSHIFTRT (DImode, temp,
2497                                                        GEN_INT (-shift))));
2498       return;
2499     }
2500
2501   /* Now a range of 22 or less bits set somewhere.
2502    * 1) sethi   %hi(focus_bits), %reg
2503    *    sllx    %reg, shift, %reg
2504    * 2) sethi   %hi(focus_bits), %reg
2505    *    srlx    %reg, shift, %reg
2506    */
2507   if ((highest_bit_set - lowest_bit_set) < 21)
2508     {
2509       unsigned HOST_WIDE_INT focus_bits =
2510         create_simple_focus_bits (high_bits, low_bits,
2511                                   lowest_bit_set, 10);
2512
2513       gcc_assert (SPARC_SETHI_P (focus_bits));
2514       gcc_assert (lowest_bit_set != 10);
2515
2516       emit_insn (gen_safe_HIGH64 (temp, focus_bits));
2517
2518       /* If lowest_bit_set == 10 then a sethi alone could have done it.  */
2519       if (lowest_bit_set < 10)
2520         emit_insn (gen_rtx_SET (op0,
2521                                 gen_rtx_LSHIFTRT (DImode, temp,
2522                                                   GEN_INT (10 - lowest_bit_set))));
2523       else if (lowest_bit_set > 10)
2524         emit_insn (gen_rtx_SET (op0,
2525                                 gen_rtx_ASHIFT (DImode, temp,
2526                                                 GEN_INT (lowest_bit_set - 10))));
2527       return;
2528     }
2529
2530   /* 1) sethi   %hi(low_bits), %reg
2531    *    or      %reg, %lo(low_bits), %reg
2532    * 2) sethi   %hi(~low_bits), %reg
2533    *    xor     %reg, %lo(-0x400 | (low_bits & 0x3ff)), %reg
2534    */
2535   if (high_bits == 0
2536       || high_bits == 0xffffffff)
2537     {
2538       sparc_emit_set_const64_quick1 (op0, temp, low_bits,
2539                                      (high_bits == 0xffffffff));
2540       return;
2541     }
2542
2543   /* Now, try 3-insn sequences.  */
2544
2545   /* 1) sethi   %hi(high_bits), %reg
2546    *    or      %reg, %lo(high_bits), %reg
2547    *    sllx    %reg, 32, %reg
2548    */
2549   if (low_bits == 0)
2550     {
2551       sparc_emit_set_const64_quick2 (op0, temp, high_bits, 0, 32);
2552       return;
2553     }
2554
2555   /* We may be able to do something quick
2556      when the constant is negated, so try that.  */
2557   if (const64_is_2insns ((~high_bits) & 0xffffffff,
2558                          (~low_bits) & 0xfffffc00))
2559     {
2560       /* NOTE: The trailing bits get XOR'd so we need the
2561          non-negated bits, not the negated ones.  */
2562       unsigned HOST_WIDE_INT trailing_bits = low_bits & 0x3ff;
2563
2564       if ((((~high_bits) & 0xffffffff) == 0
2565            && ((~low_bits) & 0x80000000) == 0)
2566           || (((~high_bits) & 0xffffffff) == 0xffffffff
2567               && ((~low_bits) & 0x80000000) != 0))
2568         {
2569           unsigned HOST_WIDE_INT fast_int = (~low_bits & 0xffffffff);
2570
2571           if ((SPARC_SETHI_P (fast_int)
2572                && (~high_bits & 0xffffffff) == 0)
2573               || SPARC_SIMM13_P (fast_int))
2574             emit_insn (gen_safe_SET64 (temp, fast_int));
2575           else
2576             sparc_emit_set_const64 (temp, GEN_INT (fast_int));
2577         }
2578       else
2579         {
2580           rtx negated_const;
2581           negated_const = GEN_INT (((~low_bits) & 0xfffffc00) |
2582                                    (((HOST_WIDE_INT)((~high_bits) & 0xffffffff))<<32));
2583           sparc_emit_set_const64 (temp, negated_const);
2584         }
2585
2586       /* If we are XOR'ing with -1, then we should emit a one's complement
2587          instead.  This way the combiner will notice logical operations
2588          such as ANDN later on and substitute.  */
2589       if (trailing_bits == 0x3ff)
2590         {
2591           emit_insn (gen_rtx_SET (op0, gen_rtx_NOT (DImode, temp)));
2592         }
2593       else
2594         {
2595           emit_insn (gen_rtx_SET (op0,
2596                                   gen_safe_XOR64 (temp,
2597                                                   (-0x400 | trailing_bits))));
2598         }
2599       return;
2600     }
2601
2602   /* 1) sethi   %hi(xxx), %reg
2603    *    or      %reg, %lo(xxx), %reg
2604    *    sllx    %reg, yyy, %reg
2605    *
2606    * ??? This is just a generalized version of the low_bits==0
2607    * thing above, FIXME...
2608    */
2609   if ((highest_bit_set - lowest_bit_set) < 32)
2610     {
2611       unsigned HOST_WIDE_INT focus_bits =
2612         create_simple_focus_bits (high_bits, low_bits,
2613                                   lowest_bit_set, 0);
2614
2615       /* We can't get here in this state.  */
2616       gcc_assert (highest_bit_set >= 32 && lowest_bit_set < 32);
2617
2618       /* So what we know is that the set bits straddle the
2619          middle of the 64-bit word.  */
2620       sparc_emit_set_const64_quick2 (op0, temp,
2621                                      focus_bits, 0,
2622                                      lowest_bit_set);
2623       return;
2624     }
2625
2626   /* 1) sethi   %hi(high_bits), %reg
2627    *    or      %reg, %lo(high_bits), %reg
2628    *    sllx    %reg, 32, %reg
2629    *    or      %reg, low_bits, %reg
2630    */
2631   if (SPARC_SIMM13_P (low_bits) && ((int)low_bits > 0))
2632     {
2633       sparc_emit_set_const64_quick2 (op0, temp, high_bits, low_bits, 32);
2634       return;
2635     }
2636
2637   /* The easiest way when all else fails, is full decomposition.  */
2638   sparc_emit_set_const64_longway (op0, temp, high_bits, low_bits);
2639 }
2640
2641 /* Given a comparison code (EQ, NE, etc.) and the first operand of a COMPARE,
2642    return the mode to be used for the comparison.  For floating-point,
2643    CCFP[E]mode is used.  CC_NOOVmode should be used when the first operand
2644    is a PLUS, MINUS, NEG, or ASHIFT.  CCmode should be used when no special
2645    processing is needed.  */
2646
2647 machine_mode
2648 select_cc_mode (enum rtx_code op, rtx x, rtx y ATTRIBUTE_UNUSED)
2649 {
2650   if (GET_MODE_CLASS (GET_MODE (x)) == MODE_FLOAT)
2651     {
2652       switch (op)
2653         {
2654         case EQ:
2655         case NE:
2656         case UNORDERED:
2657         case ORDERED:
2658         case UNLT:
2659         case UNLE:
2660         case UNGT:
2661         case UNGE:
2662         case UNEQ:
2663         case LTGT:
2664           return CCFPmode;
2665
2666         case LT:
2667         case LE:
2668         case GT:
2669         case GE:
2670           return CCFPEmode;
2671
2672         default:
2673           gcc_unreachable ();
2674         }
2675     }
2676   else if (GET_CODE (x) == PLUS || GET_CODE (x) == MINUS
2677            || GET_CODE (x) == NEG || GET_CODE (x) == ASHIFT)
2678     {
2679       if (TARGET_ARCH64 && GET_MODE (x) == DImode)
2680         return CCX_NOOVmode;
2681       else
2682         return CC_NOOVmode;
2683     }
2684   else
2685     {
2686       if (TARGET_ARCH64 && GET_MODE (x) == DImode)
2687         return CCXmode;
2688       else
2689         return CCmode;
2690     }
2691 }
2692
2693 /* Emit the compare insn and return the CC reg for a CODE comparison
2694    with operands X and Y.  */
2695
2696 static rtx
2697 gen_compare_reg_1 (enum rtx_code code, rtx x, rtx y)
2698 {
2699   machine_mode mode;
2700   rtx cc_reg;
2701
2702   if (GET_MODE_CLASS (GET_MODE (x)) == MODE_CC)
2703     return x;
2704
2705   mode = SELECT_CC_MODE (code, x, y);
2706
2707   /* ??? We don't have movcc patterns so we cannot generate pseudo regs for the
2708      fcc regs (cse can't tell they're really call clobbered regs and will
2709      remove a duplicate comparison even if there is an intervening function
2710      call - it will then try to reload the cc reg via an int reg which is why
2711      we need the movcc patterns).  It is possible to provide the movcc
2712      patterns by using the ldxfsr/stxfsr v9 insns.  I tried it: you need two
2713      registers (say %g1,%g5) and it takes about 6 insns.  A better fix would be
2714      to tell cse that CCFPE mode registers (even pseudos) are call
2715      clobbered.  */
2716
2717   /* ??? This is an experiment.  Rather than making changes to cse which may
2718      or may not be easy/clean, we do our own cse.  This is possible because
2719      we will generate hard registers.  Cse knows they're call clobbered (it
2720      doesn't know the same thing about pseudos). If we guess wrong, no big
2721      deal, but if we win, great!  */
2722
2723   if (TARGET_V9 && GET_MODE_CLASS (GET_MODE (x)) == MODE_FLOAT)
2724 #if 1 /* experiment */
2725     {
2726       int reg;
2727       /* We cycle through the registers to ensure they're all exercised.  */
2728       static int next_fcc_reg = 0;
2729       /* Previous x,y for each fcc reg.  */
2730       static rtx prev_args[4][2];
2731
2732       /* Scan prev_args for x,y.  */
2733       for (reg = 0; reg < 4; reg++)
2734         if (prev_args[reg][0] == x && prev_args[reg][1] == y)
2735           break;
2736       if (reg == 4)
2737         {
2738           reg = next_fcc_reg;
2739           prev_args[reg][0] = x;
2740           prev_args[reg][1] = y;
2741           next_fcc_reg = (next_fcc_reg + 1) & 3;
2742         }
2743       cc_reg = gen_rtx_REG (mode, reg + SPARC_FIRST_V9_FCC_REG);
2744     }
2745 #else
2746     cc_reg = gen_reg_rtx (mode);
2747 #endif /* ! experiment */
2748   else if (GET_MODE_CLASS (GET_MODE (x)) == MODE_FLOAT)
2749     cc_reg = gen_rtx_REG (mode, SPARC_FCC_REG);
2750   else
2751     cc_reg = gen_rtx_REG (mode, SPARC_ICC_REG);
2752
2753   /* We shouldn't get there for TFmode if !TARGET_HARD_QUAD.  If we do, this
2754      will only result in an unrecognizable insn so no point in asserting.  */
2755   emit_insn (gen_rtx_SET (cc_reg, gen_rtx_COMPARE (mode, x, y)));
2756
2757   return cc_reg;
2758 }
2759
2760
2761 /* Emit the compare insn and return the CC reg for the comparison in CMP.  */
2762
2763 rtx
2764 gen_compare_reg (rtx cmp)
2765 {
2766   return gen_compare_reg_1 (GET_CODE (cmp), XEXP (cmp, 0), XEXP (cmp, 1));
2767 }
2768
2769 /* This function is used for v9 only.
2770    DEST is the target of the Scc insn.
2771    CODE is the code for an Scc's comparison.
2772    X and Y are the values we compare.
2773
2774    This function is needed to turn
2775
2776            (set (reg:SI 110)
2777                (gt (reg:CCX 100 %icc)
2778                    (const_int 0)))
2779    into
2780            (set (reg:SI 110)
2781                (gt:DI (reg:CCX 100 %icc)
2782                    (const_int 0)))
2783
2784    IE: The instruction recognizer needs to see the mode of the comparison to
2785    find the right instruction. We could use "gt:DI" right in the
2786    define_expand, but leaving it out allows us to handle DI, SI, etc.  */
2787
2788 static int
2789 gen_v9_scc (rtx dest, enum rtx_code compare_code, rtx x, rtx y)
2790 {
2791   if (! TARGET_ARCH64
2792       && (GET_MODE (x) == DImode
2793           || GET_MODE (dest) == DImode))
2794     return 0;
2795
2796   /* Try to use the movrCC insns.  */
2797   if (TARGET_ARCH64
2798       && GET_MODE_CLASS (GET_MODE (x)) == MODE_INT
2799       && y == const0_rtx
2800       && v9_regcmp_p (compare_code))
2801     {
2802       rtx op0 = x;
2803       rtx temp;
2804
2805       /* Special case for op0 != 0.  This can be done with one instruction if
2806          dest == x.  */
2807
2808       if (compare_code == NE
2809           && GET_MODE (dest) == DImode
2810           && rtx_equal_p (op0, dest))
2811         {
2812           emit_insn (gen_rtx_SET (dest,
2813                               gen_rtx_IF_THEN_ELSE (DImode,
2814                                        gen_rtx_fmt_ee (compare_code, DImode,
2815                                                        op0, const0_rtx),
2816                                        const1_rtx,
2817                                        dest)));
2818           return 1;
2819         }
2820
2821       if (reg_overlap_mentioned_p (dest, op0))
2822         {
2823           /* Handle the case where dest == x.
2824              We "early clobber" the result.  */
2825           op0 = gen_reg_rtx (GET_MODE (x));
2826           emit_move_insn (op0, x);
2827         }
2828
2829       emit_insn (gen_rtx_SET (dest, const0_rtx));
2830       if (GET_MODE (op0) != DImode)
2831         {
2832           temp = gen_reg_rtx (DImode);
2833           convert_move (temp, op0, 0);
2834         }
2835       else
2836         temp = op0;
2837       emit_insn (gen_rtx_SET (dest,
2838                           gen_rtx_IF_THEN_ELSE (GET_MODE (dest),
2839                                    gen_rtx_fmt_ee (compare_code, DImode,
2840                                                    temp, const0_rtx),
2841                                    const1_rtx,
2842                                    dest)));
2843       return 1;
2844     }
2845   else
2846     {
2847       x = gen_compare_reg_1 (compare_code, x, y);
2848       y = const0_rtx;
2849
2850       gcc_assert (GET_MODE (x) != CC_NOOVmode
2851                   && GET_MODE (x) != CCX_NOOVmode);
2852
2853       emit_insn (gen_rtx_SET (dest, const0_rtx));
2854       emit_insn (gen_rtx_SET (dest,
2855                           gen_rtx_IF_THEN_ELSE (GET_MODE (dest),
2856                                    gen_rtx_fmt_ee (compare_code,
2857                                                    GET_MODE (x), x, y),
2858                                     const1_rtx, dest)));
2859       return 1;
2860     }
2861 }
2862
2863
2864 /* Emit an scc insn.  For seq, sne, sgeu, and sltu, we can do this
2865    without jumps using the addx/subx instructions.  */
2866
2867 bool
2868 emit_scc_insn (rtx operands[])
2869 {
2870   rtx tem;
2871   rtx x;
2872   rtx y;
2873   enum rtx_code code;
2874
2875   /* The quad-word fp compare library routines all return nonzero to indicate
2876      true, which is different from the equivalent libgcc routines, so we must
2877      handle them specially here.  */
2878   if (GET_MODE (operands[2]) == TFmode && ! TARGET_HARD_QUAD)
2879     {
2880       operands[1] = sparc_emit_float_lib_cmp (operands[2], operands[3],
2881                                               GET_CODE (operands[1]));
2882       operands[2] = XEXP (operands[1], 0);
2883       operands[3] = XEXP (operands[1], 1);
2884     }
2885
2886   code = GET_CODE (operands[1]);
2887   x = operands[2];
2888   y = operands[3];
2889
2890   /* For seq/sne on v9 we use the same code as v8 (the addx/subx method has
2891      more applications).  The exception to this is "reg != 0" which can
2892      be done in one instruction on v9 (so we do it).  */
2893   if (code == EQ)
2894     {
2895       if (GET_MODE (x) == SImode)
2896         {
2897           rtx pat;
2898           if (TARGET_ARCH64)
2899             pat = gen_seqsidi_special (operands[0], x, y);
2900           else
2901             pat = gen_seqsisi_special (operands[0], x, y);
2902           emit_insn (pat);
2903           return true;
2904         }
2905       else if (GET_MODE (x) == DImode)
2906         {
2907           rtx pat = gen_seqdi_special (operands[0], x, y);
2908           emit_insn (pat);
2909           return true;
2910         }
2911     }
2912
2913   if (code == NE)
2914     {
2915       if (GET_MODE (x) == SImode)
2916         {
2917           rtx pat;
2918           if (TARGET_ARCH64)
2919             pat = gen_snesidi_special (operands[0], x, y);
2920           else
2921             pat = gen_snesisi_special (operands[0], x, y);
2922           emit_insn (pat);
2923           return true;
2924         }
2925       else if (GET_MODE (x) == DImode)
2926         {
2927           rtx pat;
2928           if (TARGET_VIS3)
2929             pat = gen_snedi_special_vis3 (operands[0], x, y);
2930           else
2931             pat = gen_snedi_special (operands[0], x, y);
2932           emit_insn (pat);
2933           return true;
2934         }
2935     }
2936
2937   if (TARGET_V9
2938       && TARGET_ARCH64
2939       && GET_MODE (x) == DImode
2940       && !(TARGET_VIS3
2941            && (code == GTU || code == LTU))
2942       && gen_v9_scc (operands[0], code, x, y))
2943     return true;
2944
2945   /* We can do LTU and GEU using the addx/subx instructions too.  And
2946      for GTU/LEU, if both operands are registers swap them and fall
2947      back to the easy case.  */
2948   if (code == GTU || code == LEU)
2949     {
2950       if ((GET_CODE (x) == REG || GET_CODE (x) == SUBREG)
2951           && (GET_CODE (y) == REG || GET_CODE (y) == SUBREG))
2952         {
2953           tem = x;
2954           x = y;
2955           y = tem;
2956           code = swap_condition (code);
2957         }
2958     }
2959
2960   if (code == LTU
2961       || (!TARGET_VIS3 && code == GEU))
2962     {
2963       emit_insn (gen_rtx_SET (operands[0],
2964                               gen_rtx_fmt_ee (code, GET_MODE (operands[0]),
2965                                               gen_compare_reg_1 (code, x, y),
2966                                               const0_rtx)));
2967       return true;
2968     }
2969
2970   /* All the posibilities to use addx/subx based sequences has been
2971      exhausted, try for a 3 instruction sequence using v9 conditional
2972      moves.  */
2973   if (TARGET_V9 && gen_v9_scc (operands[0], code, x, y))
2974     return true;
2975
2976   /* Nope, do branches.  */
2977   return false;
2978 }
2979
2980 /* Emit a conditional jump insn for the v9 architecture using comparison code
2981    CODE and jump target LABEL.
2982    This function exists to take advantage of the v9 brxx insns.  */
2983
2984 static void
2985 emit_v9_brxx_insn (enum rtx_code code, rtx op0, rtx label)
2986 {
2987   emit_jump_insn (gen_rtx_SET (pc_rtx,
2988                            gen_rtx_IF_THEN_ELSE (VOIDmode,
2989                                     gen_rtx_fmt_ee (code, GET_MODE (op0),
2990                                                     op0, const0_rtx),
2991                                     gen_rtx_LABEL_REF (VOIDmode, label),
2992                                     pc_rtx)));
2993 }
2994
2995 /* Emit a conditional jump insn for the UA2011 architecture using
2996    comparison code CODE and jump target LABEL.  This function exists
2997    to take advantage of the UA2011 Compare and Branch insns.  */
2998
2999 static void
3000 emit_cbcond_insn (enum rtx_code code, rtx op0, rtx op1, rtx label)
3001 {
3002   rtx if_then_else;
3003
3004   if_then_else = gen_rtx_IF_THEN_ELSE (VOIDmode,
3005                                        gen_rtx_fmt_ee(code, GET_MODE(op0),
3006                                                       op0, op1),
3007                                        gen_rtx_LABEL_REF (VOIDmode, label),
3008                                        pc_rtx);
3009
3010   emit_jump_insn (gen_rtx_SET (pc_rtx, if_then_else));
3011 }
3012
3013 void
3014 emit_conditional_branch_insn (rtx operands[])
3015 {
3016   /* The quad-word fp compare library routines all return nonzero to indicate
3017      true, which is different from the equivalent libgcc routines, so we must
3018      handle them specially here.  */
3019   if (GET_MODE (operands[1]) == TFmode && ! TARGET_HARD_QUAD)
3020     {
3021       operands[0] = sparc_emit_float_lib_cmp (operands[1], operands[2],
3022                                               GET_CODE (operands[0]));
3023       operands[1] = XEXP (operands[0], 0);
3024       operands[2] = XEXP (operands[0], 1);
3025     }
3026
3027   /* If we can tell early on that the comparison is against a constant
3028      that won't fit in the 5-bit signed immediate field of a cbcond,
3029      use one of the other v9 conditional branch sequences.  */
3030   if (TARGET_CBCOND
3031       && GET_CODE (operands[1]) == REG
3032       && (GET_MODE (operands[1]) == SImode
3033           || (TARGET_ARCH64 && GET_MODE (operands[1]) == DImode))
3034       && (GET_CODE (operands[2]) != CONST_INT
3035           || SPARC_SIMM5_P (INTVAL (operands[2]))))
3036     {
3037       emit_cbcond_insn (GET_CODE (operands[0]), operands[1], operands[2], operands[3]);
3038       return;
3039     }
3040
3041   if (TARGET_ARCH64 && operands[2] == const0_rtx
3042       && GET_CODE (operands[1]) == REG
3043       && GET_MODE (operands[1]) == DImode)
3044     {
3045       emit_v9_brxx_insn (GET_CODE (operands[0]), operands[1], operands[3]);
3046       return;
3047     }
3048
3049   operands[1] = gen_compare_reg (operands[0]);
3050   operands[2] = const0_rtx;
3051   operands[0] = gen_rtx_fmt_ee (GET_CODE (operands[0]), VOIDmode,
3052                                 operands[1], operands[2]);
3053   emit_jump_insn (gen_cbranchcc4 (operands[0], operands[1], operands[2],
3054                                   operands[3]));
3055 }
3056
3057
3058 /* Generate a DFmode part of a hard TFmode register.
3059    REG is the TFmode hard register, LOW is 1 for the
3060    low 64bit of the register and 0 otherwise.
3061  */
3062 rtx
3063 gen_df_reg (rtx reg, int low)
3064 {
3065   int regno = REGNO (reg);
3066
3067   if ((WORDS_BIG_ENDIAN == 0) ^ (low != 0))
3068     regno += (TARGET_ARCH64 && SPARC_INT_REG_P (regno)) ? 1 : 2;
3069   return gen_rtx_REG (DFmode, regno);
3070 }
3071 \f
3072 /* Generate a call to FUNC with OPERANDS.  Operand 0 is the return value.
3073    Unlike normal calls, TFmode operands are passed by reference.  It is
3074    assumed that no more than 3 operands are required.  */
3075
3076 static void
3077 emit_soft_tfmode_libcall (const char *func_name, int nargs, rtx *operands)
3078 {
3079   rtx ret_slot = NULL, arg[3], func_sym;
3080   int i;
3081
3082   /* We only expect to be called for conversions, unary, and binary ops.  */
3083   gcc_assert (nargs == 2 || nargs == 3);
3084
3085   for (i = 0; i < nargs; ++i)
3086     {
3087       rtx this_arg = operands[i];
3088       rtx this_slot;
3089
3090       /* TFmode arguments and return values are passed by reference.  */
3091       if (GET_MODE (this_arg) == TFmode)
3092         {
3093           int force_stack_temp;
3094
3095           force_stack_temp = 0;
3096           if (TARGET_BUGGY_QP_LIB && i == 0)
3097             force_stack_temp = 1;
3098
3099           if (GET_CODE (this_arg) == MEM
3100               && ! force_stack_temp)
3101             {
3102               tree expr = MEM_EXPR (this_arg);
3103               if (expr)
3104                 mark_addressable (expr);
3105               this_arg = XEXP (this_arg, 0);
3106             }
3107           else if (CONSTANT_P (this_arg)
3108                    && ! force_stack_temp)
3109             {
3110               this_slot = force_const_mem (TFmode, this_arg);
3111               this_arg = XEXP (this_slot, 0);
3112             }
3113           else
3114             {
3115               this_slot = assign_stack_temp (TFmode, GET_MODE_SIZE (TFmode));
3116
3117               /* Operand 0 is the return value.  We'll copy it out later.  */
3118               if (i > 0)
3119                 emit_move_insn (this_slot, this_arg);
3120               else
3121                 ret_slot = this_slot;
3122
3123               this_arg = XEXP (this_slot, 0);
3124             }
3125         }
3126
3127       arg[i] = this_arg;
3128     }
3129
3130   func_sym = gen_rtx_SYMBOL_REF (Pmode, func_name);
3131
3132   if (GET_MODE (operands[0]) == TFmode)
3133     {
3134       if (nargs == 2)
3135         emit_library_call (func_sym, LCT_NORMAL, VOIDmode, 2,
3136                            arg[0], GET_MODE (arg[0]),
3137                            arg[1], GET_MODE (arg[1]));
3138       else
3139         emit_library_call (func_sym, LCT_NORMAL, VOIDmode, 3,
3140                            arg[0], GET_MODE (arg[0]),
3141                            arg[1], GET_MODE (arg[1]),
3142                            arg[2], GET_MODE (arg[2]));
3143
3144       if (ret_slot)
3145         emit_move_insn (operands[0], ret_slot);
3146     }
3147   else
3148     {
3149       rtx ret;
3150
3151       gcc_assert (nargs == 2);
3152
3153       ret = emit_library_call_value (func_sym, operands[0], LCT_NORMAL,
3154                                      GET_MODE (operands[0]), 1,
3155                                      arg[1], GET_MODE (arg[1]));
3156
3157       if (ret != operands[0])
3158         emit_move_insn (operands[0], ret);
3159     }
3160 }
3161
3162 /* Expand soft-float TFmode calls to sparc abi routines.  */
3163
3164 static void
3165 emit_soft_tfmode_binop (enum rtx_code code, rtx *operands)
3166 {
3167   const char *func;
3168
3169   switch (code)
3170     {
3171     case PLUS:
3172       func = "_Qp_add";
3173       break;
3174     case MINUS:
3175       func = "_Qp_sub";
3176       break;
3177     case MULT:
3178       func = "_Qp_mul";
3179       break;
3180     case DIV:
3181       func = "_Qp_div";
3182       break;
3183     default:
3184       gcc_unreachable ();
3185     }
3186
3187   emit_soft_tfmode_libcall (func, 3, operands);
3188 }
3189
3190 static void
3191 emit_soft_tfmode_unop (enum rtx_code code, rtx *operands)
3192 {
3193   const char *func;
3194
3195   gcc_assert (code == SQRT);
3196   func = "_Qp_sqrt";
3197
3198   emit_soft_tfmode_libcall (func, 2, operands);
3199 }
3200
3201 static void
3202 emit_soft_tfmode_cvt (enum rtx_code code, rtx *operands)
3203 {
3204   const char *func;
3205
3206   switch (code)
3207     {
3208     case FLOAT_EXTEND:
3209       switch (GET_MODE (operands[1]))
3210         {
3211         case SFmode:
3212           func = "_Qp_stoq";
3213           break;
3214         case DFmode:
3215           func = "_Qp_dtoq";
3216           break;
3217         default:
3218           gcc_unreachable ();
3219         }
3220       break;
3221
3222     case FLOAT_TRUNCATE:
3223       switch (GET_MODE (operands[0]))
3224         {
3225         case SFmode:
3226           func = "_Qp_qtos";
3227           break;
3228         case DFmode:
3229           func = "_Qp_qtod";
3230           break;
3231         default:
3232           gcc_unreachable ();
3233         }
3234       break;
3235
3236     case FLOAT:
3237       switch (GET_MODE (operands[1]))
3238         {
3239         case SImode:
3240           func = "_Qp_itoq";
3241           if (TARGET_ARCH64)
3242             operands[1] = gen_rtx_SIGN_EXTEND (DImode, operands[1]);
3243           break;
3244         case DImode:
3245           func = "_Qp_xtoq";
3246           break;
3247         default:
3248           gcc_unreachable ();
3249         }
3250       break;
3251
3252     case UNSIGNED_FLOAT:
3253       switch (GET_MODE (operands[1]))
3254         {
3255         case SImode:
3256           func = "_Qp_uitoq";
3257           if (TARGET_ARCH64)
3258             operands[1] = gen_rtx_ZERO_EXTEND (DImode, operands[1]);
3259           break;
3260         case DImode:
3261           func = "_Qp_uxtoq";
3262           break;
3263         default:
3264           gcc_unreachable ();
3265         }
3266       break;
3267
3268     case FIX:
3269       switch (GET_MODE (operands[0]))
3270         {
3271         case SImode:
3272           func = "_Qp_qtoi";
3273           break;
3274         case DImode:
3275           func = "_Qp_qtox";
3276           break;
3277         default:
3278           gcc_unreachable ();
3279         }
3280       break;
3281
3282     case UNSIGNED_FIX:
3283       switch (GET_MODE (operands[0]))
3284         {
3285         case SImode:
3286           func = "_Qp_qtoui";
3287           break;
3288         case DImode:
3289           func = "_Qp_qtoux";
3290           break;
3291         default:
3292           gcc_unreachable ();
3293         }
3294       break;
3295
3296     default:
3297       gcc_unreachable ();
3298     }
3299
3300   emit_soft_tfmode_libcall (func, 2, operands);
3301 }
3302
3303 /* Expand a hard-float tfmode operation.  All arguments must be in
3304    registers.  */
3305
3306 static void
3307 emit_hard_tfmode_operation (enum rtx_code code, rtx *operands)
3308 {
3309   rtx op, dest;
3310
3311   if (GET_RTX_CLASS (code) == RTX_UNARY)
3312     {
3313       operands[1] = force_reg (GET_MODE (operands[1]), operands[1]);
3314       op = gen_rtx_fmt_e (code, GET_MODE (operands[0]), operands[1]);
3315     }
3316   else
3317     {
3318       operands[1] = force_reg (GET_MODE (operands[1]), operands[1]);
3319       operands[2] = force_reg (GET_MODE (operands[2]), operands[2]);
3320       op = gen_rtx_fmt_ee (code, GET_MODE (operands[0]),
3321                            operands[1], operands[2]);
3322     }
3323
3324   if (register_operand (operands[0], VOIDmode))
3325     dest = operands[0];
3326   else
3327     dest = gen_reg_rtx (GET_MODE (operands[0]));
3328
3329   emit_insn (gen_rtx_SET (dest, op));
3330
3331   if (dest != operands[0])
3332     emit_move_insn (operands[0], dest);
3333 }
3334
3335 void
3336 emit_tfmode_binop (enum rtx_code code, rtx *operands)
3337 {
3338   if (TARGET_HARD_QUAD)
3339     emit_hard_tfmode_operation (code, operands);
3340   else
3341     emit_soft_tfmode_binop (code, operands);
3342 }
3343
3344 void
3345 emit_tfmode_unop (enum rtx_code code, rtx *operands)
3346 {
3347   if (TARGET_HARD_QUAD)
3348     emit_hard_tfmode_operation (code, operands);
3349   else
3350     emit_soft_tfmode_unop (code, operands);
3351 }
3352
3353 void
3354 emit_tfmode_cvt (enum rtx_code code, rtx *operands)
3355 {
3356   if (TARGET_HARD_QUAD)
3357     emit_hard_tfmode_operation (code, operands);
3358   else
3359     emit_soft_tfmode_cvt (code, operands);
3360 }
3361 \f
3362 /* Return nonzero if a branch/jump/call instruction will be emitting
3363    nop into its delay slot.  */
3364
3365 int
3366 empty_delay_slot (rtx_insn *insn)
3367 {
3368   rtx seq;
3369
3370   /* If no previous instruction (should not happen), return true.  */
3371   if (PREV_INSN (insn) == NULL)
3372     return 1;
3373
3374   seq = NEXT_INSN (PREV_INSN (insn));
3375   if (GET_CODE (PATTERN (seq)) == SEQUENCE)
3376     return 0;
3377
3378   return 1;
3379 }
3380
3381 /* Return nonzero if we should emit a nop after a cbcond instruction.
3382    The cbcond instruction does not have a delay slot, however there is
3383    a severe performance penalty if a control transfer appears right
3384    after a cbcond.  Therefore we emit a nop when we detect this
3385    situation.  */
3386
3387 int
3388 emit_cbcond_nop (rtx insn)
3389 {
3390   rtx next = next_active_insn (insn);
3391
3392   if (!next)
3393     return 1;
3394
3395   if (NONJUMP_INSN_P (next)
3396       && GET_CODE (PATTERN (next)) == SEQUENCE)
3397     next = XVECEXP (PATTERN (next), 0, 0);
3398   else if (CALL_P (next)
3399            && GET_CODE (PATTERN (next)) == PARALLEL)
3400     {
3401       rtx delay = XVECEXP (PATTERN (next), 0, 1);
3402
3403       if (GET_CODE (delay) == RETURN)
3404         {
3405           /* It's a sibling call.  Do not emit the nop if we're going
3406              to emit something other than the jump itself as the first
3407              instruction of the sibcall sequence.  */
3408           if (sparc_leaf_function_p || TARGET_FLAT)
3409             return 0;
3410         }
3411     }
3412
3413   if (NONJUMP_INSN_P (next))
3414     return 0;
3415
3416   return 1;
3417 }
3418
3419 /* Return nonzero if TRIAL can go into the call delay slot.  */
3420
3421 int
3422 eligible_for_call_delay (rtx_insn *trial)
3423 {
3424   rtx pat;
3425
3426   if (get_attr_in_branch_delay (trial) == IN_BRANCH_DELAY_FALSE)
3427     return 0;
3428
3429   /* Binutils allows
3430        call __tls_get_addr, %tgd_call (foo)
3431         add %l7, %o0, %o0, %tgd_add (foo)
3432      while Sun as/ld does not.  */
3433   if (TARGET_GNU_TLS || !TARGET_TLS)
3434     return 1;
3435
3436   pat = PATTERN (trial);
3437
3438   /* We must reject tgd_add{32|64}, i.e.
3439        (set (reg) (plus (reg) (unspec [(reg) (symbol_ref)] UNSPEC_TLSGD)))
3440      and tldm_add{32|64}, i.e.
3441        (set (reg) (plus (reg) (unspec [(reg) (symbol_ref)] UNSPEC_TLSLDM)))
3442      for Sun as/ld.  */
3443   if (GET_CODE (pat) == SET
3444       && GET_CODE (SET_SRC (pat)) == PLUS)
3445     {
3446       rtx unspec = XEXP (SET_SRC (pat), 1);
3447
3448       if (GET_CODE (unspec) == UNSPEC
3449           && (XINT (unspec, 1) == UNSPEC_TLSGD
3450               || XINT (unspec, 1) == UNSPEC_TLSLDM))
3451         return 0;
3452     }
3453
3454   return 1;
3455 }
3456
3457 /* Return nonzero if TRIAL, an insn, can be combined with a 'restore'
3458    instruction.  RETURN_P is true if the v9 variant 'return' is to be
3459    considered in the test too.
3460
3461    TRIAL must be a SET whose destination is a REG appropriate for the
3462    'restore' instruction or, if RETURN_P is true, for the 'return'
3463    instruction.  */
3464
3465 static int
3466 eligible_for_restore_insn (rtx trial, bool return_p)
3467 {
3468   rtx pat = PATTERN (trial);
3469   rtx src = SET_SRC (pat);
3470   bool src_is_freg = false;
3471   rtx src_reg;
3472
3473   /* Since we now can do moves between float and integer registers when
3474      VIS3 is enabled, we have to catch this case.  We can allow such
3475      moves when doing a 'return' however.  */
3476   src_reg = src;
3477   if (GET_CODE (src_reg) == SUBREG)
3478     src_reg = SUBREG_REG (src_reg);
3479   if (GET_CODE (src_reg) == REG
3480       && SPARC_FP_REG_P (REGNO (src_reg)))
3481     src_is_freg = true;
3482
3483   /* The 'restore src,%g0,dest' pattern for word mode and below.  */
3484   if (GET_MODE_CLASS (GET_MODE (src)) != MODE_FLOAT
3485       && arith_operand (src, GET_MODE (src))
3486       && ! src_is_freg)
3487     {
3488       if (TARGET_ARCH64)
3489         return GET_MODE_SIZE (GET_MODE (src)) <= GET_MODE_SIZE (DImode);
3490       else
3491         return GET_MODE_SIZE (GET_MODE (src)) <= GET_MODE_SIZE (SImode);
3492     }
3493
3494   /* The 'restore src,%g0,dest' pattern for double-word mode.  */
3495   else if (GET_MODE_CLASS (GET_MODE (src)) != MODE_FLOAT
3496            && arith_double_operand (src, GET_MODE (src))
3497            && ! src_is_freg)
3498     return GET_MODE_SIZE (GET_MODE (src)) <= GET_MODE_SIZE (DImode);
3499
3500   /* The 'restore src,%g0,dest' pattern for float if no FPU.  */
3501   else if (! TARGET_FPU && register_operand (src, SFmode))
3502     return 1;
3503
3504   /* The 'restore src,%g0,dest' pattern for double if no FPU.  */
3505   else if (! TARGET_FPU && TARGET_ARCH64 && register_operand (src, DFmode))
3506     return 1;
3507
3508   /* If we have the 'return' instruction, anything that does not use
3509      local or output registers and can go into a delay slot wins.  */
3510   else if (return_p && TARGET_V9 && !epilogue_renumber (&pat, 1))
3511     return 1;
3512
3513   /* The 'restore src1,src2,dest' pattern for SImode.  */
3514   else if (GET_CODE (src) == PLUS
3515            && register_operand (XEXP (src, 0), SImode)
3516            && arith_operand (XEXP (src, 1), SImode))
3517     return 1;
3518
3519   /* The 'restore src1,src2,dest' pattern for DImode.  */
3520   else if (GET_CODE (src) == PLUS
3521            && register_operand (XEXP (src, 0), DImode)
3522            && arith_double_operand (XEXP (src, 1), DImode))
3523     return 1;
3524
3525   /* The 'restore src1,%lo(src2),dest' pattern.  */
3526   else if (GET_CODE (src) == LO_SUM
3527            && ! TARGET_CM_MEDMID
3528            && ((register_operand (XEXP (src, 0), SImode)
3529                 && immediate_operand (XEXP (src, 1), SImode))
3530                || (TARGET_ARCH64
3531                    && register_operand (XEXP (src, 0), DImode)
3532                    && immediate_operand (XEXP (src, 1), DImode))))
3533     return 1;
3534
3535   /* The 'restore src,src,dest' pattern.  */
3536   else if (GET_CODE (src) == ASHIFT
3537            && (register_operand (XEXP (src, 0), SImode)
3538                || register_operand (XEXP (src, 0), DImode))
3539            && XEXP (src, 1) == const1_rtx)
3540     return 1;
3541
3542   return 0;
3543 }
3544
3545 /* Return nonzero if TRIAL can go into the function return's delay slot.  */
3546
3547 int
3548 eligible_for_return_delay (rtx_insn *trial)
3549 {
3550   int regno;
3551   rtx pat;
3552
3553   /* If the function uses __builtin_eh_return, the eh_return machinery
3554      occupies the delay slot.  */
3555   if (crtl->calls_eh_return)
3556     return 0;
3557
3558   if (get_attr_in_branch_delay (trial) == IN_BRANCH_DELAY_FALSE)
3559     return 0;
3560
3561   /* In the case of a leaf or flat function, anything can go into the slot.  */
3562   if (sparc_leaf_function_p || TARGET_FLAT)
3563     return 1;
3564
3565   if (!NONJUMP_INSN_P (trial))
3566     return 0;
3567
3568   pat = PATTERN (trial);
3569   if (GET_CODE (pat) == PARALLEL)
3570     {
3571       int i;
3572
3573       if (! TARGET_V9)
3574         return 0;
3575       for (i = XVECLEN (pat, 0) - 1; i >= 0; i--)
3576         {
3577           rtx expr = XVECEXP (pat, 0, i);
3578           if (GET_CODE (expr) != SET)
3579             return 0;
3580           if (GET_CODE (SET_DEST (expr)) != REG)
3581             return 0;
3582           regno = REGNO (SET_DEST (expr));
3583           if (regno >= 8 && regno < 24)
3584             return 0;
3585         }
3586       return !epilogue_renumber (&pat, 1);
3587     }
3588
3589   if (GET_CODE (pat) != SET)
3590     return 0;
3591
3592   if (GET_CODE (SET_DEST (pat)) != REG)
3593     return 0;
3594
3595   regno = REGNO (SET_DEST (pat));
3596
3597   /* Otherwise, only operations which can be done in tandem with
3598      a `restore' or `return' insn can go into the delay slot.  */
3599   if (regno >= 8 && regno < 24)
3600     return 0;
3601
3602   /* If this instruction sets up floating point register and we have a return
3603      instruction, it can probably go in.  But restore will not work
3604      with FP_REGS.  */
3605   if (! SPARC_INT_REG_P (regno))
3606     return TARGET_V9 && !epilogue_renumber (&pat, 1);
3607
3608   return eligible_for_restore_insn (trial, true);
3609 }
3610
3611 /* Return nonzero if TRIAL can go into the sibling call's delay slot.  */
3612
3613 int
3614 eligible_for_sibcall_delay (rtx_insn *trial)
3615 {
3616   rtx pat;
3617
3618   if (get_attr_in_branch_delay (trial) == IN_BRANCH_DELAY_FALSE)
3619     return 0;
3620
3621   if (!NONJUMP_INSN_P (trial))
3622     return 0;
3623
3624   pat = PATTERN (trial);
3625
3626   if (sparc_leaf_function_p || TARGET_FLAT)
3627     {
3628       /* If the tail call is done using the call instruction,
3629          we have to restore %o7 in the delay slot.  */
3630       if (LEAF_SIBCALL_SLOT_RESERVED_P)
3631         return 0;
3632
3633       /* %g1 is used to build the function address */
3634       if (reg_mentioned_p (gen_rtx_REG (Pmode, 1), pat))
3635         return 0;
3636
3637       return 1;
3638     }
3639
3640   if (GET_CODE (pat) != SET)
3641     return 0;
3642
3643   /* Otherwise, only operations which can be done in tandem with
3644      a `restore' insn can go into the delay slot.  */
3645   if (GET_CODE (SET_DEST (pat)) != REG
3646       || (REGNO (SET_DEST (pat)) >= 8 && REGNO (SET_DEST (pat)) < 24)
3647       || ! SPARC_INT_REG_P (REGNO (SET_DEST (pat))))
3648     return 0;
3649
3650   /* If it mentions %o7, it can't go in, because sibcall will clobber it
3651      in most cases.  */
3652   if (reg_mentioned_p (gen_rtx_REG (Pmode, 15), pat))
3653     return 0;
3654
3655   return eligible_for_restore_insn (trial, false);
3656 }
3657 \f
3658 /* Determine if it's legal to put X into the constant pool.  This
3659    is not possible if X contains the address of a symbol that is
3660    not constant (TLS) or not known at final link time (PIC).  */
3661
3662 static bool
3663 sparc_cannot_force_const_mem (machine_mode mode, rtx x)
3664 {
3665   switch (GET_CODE (x))
3666     {
3667     case CONST_INT:
3668     case CONST_WIDE_INT:
3669     case CONST_DOUBLE:
3670     case CONST_VECTOR:
3671       /* Accept all non-symbolic constants.  */
3672       return false;
3673
3674     case LABEL_REF:
3675       /* Labels are OK iff we are non-PIC.  */
3676       return flag_pic != 0;
3677
3678     case SYMBOL_REF:
3679       /* 'Naked' TLS symbol references are never OK,
3680          non-TLS symbols are OK iff we are non-PIC.  */
3681       if (SYMBOL_REF_TLS_MODEL (x))
3682         return true;
3683       else
3684         return flag_pic != 0;
3685
3686     case CONST:
3687       return sparc_cannot_force_const_mem (mode, XEXP (x, 0));
3688     case PLUS:
3689     case MINUS:
3690       return sparc_cannot_force_const_mem (mode, XEXP (x, 0))
3691          || sparc_cannot_force_const_mem (mode, XEXP (x, 1));
3692     case UNSPEC:
3693       return true;
3694     default:
3695       gcc_unreachable ();
3696     }
3697 }
3698 \f
3699 /* Global Offset Table support.  */
3700 static GTY(()) rtx got_helper_rtx = NULL_RTX;
3701 static GTY(()) rtx global_offset_table_rtx = NULL_RTX;
3702
3703 /* Return the SYMBOL_REF for the Global Offset Table.  */
3704
3705 static GTY(()) rtx sparc_got_symbol = NULL_RTX;
3706
3707 static rtx
3708 sparc_got (void)
3709 {
3710   if (!sparc_got_symbol)
3711     sparc_got_symbol = gen_rtx_SYMBOL_REF (Pmode, "_GLOBAL_OFFSET_TABLE_");
3712
3713   return sparc_got_symbol;
3714 }
3715
3716 /* Ensure that we are not using patterns that are not OK with PIC.  */
3717
3718 int
3719 check_pic (int i)
3720 {
3721   rtx op;
3722
3723   switch (flag_pic)
3724     {
3725     case 1:
3726       op = recog_data.operand[i];
3727       gcc_assert (GET_CODE (op) != SYMBOL_REF
3728                   && (GET_CODE (op) != CONST
3729                       || (GET_CODE (XEXP (op, 0)) == MINUS
3730                           && XEXP (XEXP (op, 0), 0) == sparc_got ()
3731                           && GET_CODE (XEXP (XEXP (op, 0), 1)) == CONST)));
3732     case 2:
3733     default:
3734       return 1;
3735     }
3736 }
3737
3738 /* Return true if X is an address which needs a temporary register when
3739    reloaded while generating PIC code.  */
3740
3741 int
3742 pic_address_needs_scratch (rtx x)
3743 {
3744   /* An address which is a symbolic plus a non SMALL_INT needs a temp reg.  */
3745   if (GET_CODE (x) == CONST && GET_CODE (XEXP (x, 0)) == PLUS
3746       && GET_CODE (XEXP (XEXP (x, 0), 0)) == SYMBOL_REF
3747       && GET_CODE (XEXP (XEXP (x, 0), 1)) == CONST_INT
3748       && ! SMALL_INT (XEXP (XEXP (x, 0), 1)))
3749     return 1;
3750
3751   return 0;
3752 }
3753
3754 /* Determine if a given RTX is a valid constant.  We already know this
3755    satisfies CONSTANT_P.  */
3756
3757 static bool
3758 sparc_legitimate_constant_p (machine_mode mode, rtx x)
3759 {
3760   switch (GET_CODE (x))
3761     {
3762     case CONST:
3763     case SYMBOL_REF:
3764       if (sparc_tls_referenced_p (x))
3765         return false;
3766       break;
3767
3768     case CONST_DOUBLE:
3769       /* Floating point constants are generally not ok.
3770          The only exception is 0.0 and all-ones in VIS.  */
3771       if (TARGET_VIS
3772           && SCALAR_FLOAT_MODE_P (mode)
3773           && (const_zero_operand (x, mode)
3774               || const_all_ones_operand (x, mode)))
3775         return true;
3776
3777       return false;
3778
3779     case CONST_VECTOR:
3780       /* Vector constants are generally not ok.
3781          The only exception is 0 or -1 in VIS.  */
3782       if (TARGET_VIS
3783           && (const_zero_operand (x, mode)
3784               || const_all_ones_operand (x, mode)))
3785         return true;
3786
3787       return false;
3788
3789     default:
3790       break;
3791     }
3792
3793   return true;
3794 }
3795
3796 /* Determine if a given RTX is a valid constant address.  */
3797
3798 bool
3799 constant_address_p (rtx x)
3800 {
3801   switch (GET_CODE (x))
3802     {
3803     case LABEL_REF:
3804     case CONST_INT:
3805     case HIGH:
3806       return true;
3807
3808     case CONST:
3809       if (flag_pic && pic_address_needs_scratch (x))
3810         return false;
3811       return sparc_legitimate_constant_p (Pmode, x);
3812
3813     case SYMBOL_REF:
3814       return !flag_pic && sparc_legitimate_constant_p (Pmode, x);
3815
3816     default:
3817       return false;
3818     }
3819 }
3820
3821 /* Nonzero if the constant value X is a legitimate general operand
3822    when generating PIC code.  It is given that flag_pic is on and
3823    that X satisfies CONSTANT_P.  */
3824
3825 bool
3826 legitimate_pic_operand_p (rtx x)
3827 {
3828   if (pic_address_needs_scratch (x))
3829     return false;
3830   if (sparc_tls_referenced_p (x))
3831     return false;
3832   return true;
3833 }
3834
3835 #define RTX_OK_FOR_OFFSET_P(X, MODE)                    \
3836   (CONST_INT_P (X)                                      \
3837    && INTVAL (X) >= -0x1000                             \
3838    && INTVAL (X) <= (0x1000 - GET_MODE_SIZE (MODE)))
3839
3840 #define RTX_OK_FOR_OLO10_P(X, MODE)                     \
3841   (CONST_INT_P (X)                                      \
3842    && INTVAL (X) >= -0x1000                             \
3843    && INTVAL (X) <= (0xc00 - GET_MODE_SIZE (MODE)))
3844
3845 /* Handle the TARGET_LEGITIMATE_ADDRESS_P target hook.
3846
3847    On SPARC, the actual legitimate addresses must be REG+REG or REG+SMALLINT
3848    ordinarily.  This changes a bit when generating PIC.  */
3849
3850 static bool
3851 sparc_legitimate_address_p (machine_mode mode, rtx addr, bool strict)
3852 {
3853   rtx rs1 = NULL, rs2 = NULL, imm1 = NULL;
3854
3855   if (REG_P (addr) || GET_CODE (addr) == SUBREG)
3856     rs1 = addr;
3857   else if (GET_CODE (addr) == PLUS)
3858     {
3859       rs1 = XEXP (addr, 0);
3860       rs2 = XEXP (addr, 1);
3861
3862       /* Canonicalize.  REG comes first, if there are no regs,
3863          LO_SUM comes first.  */
3864       if (!REG_P (rs1)
3865           && GET_CODE (rs1) != SUBREG
3866           && (REG_P (rs2)
3867               || GET_CODE (rs2) == SUBREG
3868               || (GET_CODE (rs2) == LO_SUM && GET_CODE (rs1) != LO_SUM)))
3869         {
3870           rs1 = XEXP (addr, 1);
3871           rs2 = XEXP (addr, 0);
3872         }
3873
3874       if ((flag_pic == 1
3875            && rs1 == pic_offset_table_rtx
3876            && !REG_P (rs2)
3877            && GET_CODE (rs2) != SUBREG
3878            && GET_CODE (rs2) != LO_SUM
3879            && GET_CODE (rs2) != MEM
3880            && !(GET_CODE (rs2) == SYMBOL_REF && SYMBOL_REF_TLS_MODEL (rs2))
3881            && (! symbolic_operand (rs2, VOIDmode) || mode == Pmode)
3882            && (GET_CODE (rs2) != CONST_INT || SMALL_INT (rs2)))
3883           || ((REG_P (rs1)
3884                || GET_CODE (rs1) == SUBREG)
3885               && RTX_OK_FOR_OFFSET_P (rs2, mode)))
3886         {
3887           imm1 = rs2;
3888           rs2 = NULL;
3889         }
3890       else if ((REG_P (rs1) || GET_CODE (rs1) == SUBREG)
3891                && (REG_P (rs2) || GET_CODE (rs2) == SUBREG))
3892         {
3893           /* We prohibit REG + REG for TFmode when there are no quad move insns
3894              and we consequently need to split.  We do this because REG+REG
3895              is not an offsettable address.  If we get the situation in reload
3896              where source and destination of a movtf pattern are both MEMs with
3897              REG+REG address, then only one of them gets converted to an
3898              offsettable address.  */
3899           if (mode == TFmode
3900               && ! (TARGET_ARCH64 && TARGET_HARD_QUAD))
3901             return 0;
3902
3903           /* Likewise for TImode, but in all cases.  */
3904           if (mode == TImode)
3905             return 0;
3906
3907           /* We prohibit REG + REG on ARCH32 if not optimizing for
3908              DFmode/DImode because then mem_min_alignment is likely to be zero
3909              after reload and the  forced split would lack a matching splitter
3910              pattern.  */
3911           if (TARGET_ARCH32 && !optimize
3912               && (mode == DFmode || mode == DImode))
3913             return 0;
3914         }
3915       else if (USE_AS_OFFSETABLE_LO10
3916                && GET_CODE (rs1) == LO_SUM
3917                && TARGET_ARCH64
3918                && ! TARGET_CM_MEDMID
3919                && RTX_OK_FOR_OLO10_P (rs2, mode))
3920         {
3921           rs2 = NULL;
3922           imm1 = XEXP (rs1, 1);
3923           rs1 = XEXP (rs1, 0);
3924           if (!CONSTANT_P (imm1)
3925               || (GET_CODE (rs1) == SYMBOL_REF && SYMBOL_REF_TLS_MODEL (rs1)))
3926             return 0;
3927         }
3928     }
3929   else if (GET_CODE (addr) == LO_SUM)
3930     {
3931       rs1 = XEXP (addr, 0);
3932       imm1 = XEXP (addr, 1);
3933
3934       if (!CONSTANT_P (imm1)
3935           || (GET_CODE (rs1) == SYMBOL_REF && SYMBOL_REF_TLS_MODEL (rs1)))
3936         return 0;
3937
3938       /* We can't allow TFmode in 32-bit mode, because an offset greater
3939          than the alignment (8) may cause the LO_SUM to overflow.  */
3940       if (mode == TFmode && TARGET_ARCH32)
3941         return 0;
3942     }
3943   else if (GET_CODE (addr) == CONST_INT && SMALL_INT (addr))
3944     return 1;
3945   else
3946     return 0;
3947
3948   if (GET_CODE (rs1) == SUBREG)
3949     rs1 = SUBREG_REG (rs1);
3950   if (!REG_P (rs1))
3951     return 0;
3952
3953   if (rs2)
3954     {
3955       if (GET_CODE (rs2) == SUBREG)
3956         rs2 = SUBREG_REG (rs2);
3957       if (!REG_P (rs2))
3958         return 0;
3959     }
3960
3961   if (strict)
3962     {
3963       if (!REGNO_OK_FOR_BASE_P (REGNO (rs1))
3964           || (rs2 && !REGNO_OK_FOR_BASE_P (REGNO (rs2))))
3965         return 0;
3966     }
3967   else
3968     {
3969       if ((! SPARC_INT_REG_P (REGNO (rs1))
3970            && REGNO (rs1) != FRAME_POINTER_REGNUM
3971            && REGNO (rs1) < FIRST_PSEUDO_REGISTER)
3972           || (rs2
3973               && (! SPARC_INT_REG_P (REGNO (rs2))
3974                   && REGNO (rs2) != FRAME_POINTER_REGNUM
3975                   && REGNO (rs2) < FIRST_PSEUDO_REGISTER)))
3976         return 0;
3977     }
3978   return 1;
3979 }
3980
3981 /* Return the SYMBOL_REF for the tls_get_addr function.  */
3982
3983 static GTY(()) rtx sparc_tls_symbol = NULL_RTX;
3984
3985 static rtx
3986 sparc_tls_get_addr (void)
3987 {
3988   if (!sparc_tls_symbol)
3989     sparc_tls_symbol = gen_rtx_SYMBOL_REF (Pmode, "__tls_get_addr");
3990
3991   return sparc_tls_symbol;
3992 }
3993
3994 /* Return the Global Offset Table to be used in TLS mode.  */
3995
3996 static rtx
3997 sparc_tls_got (void)
3998 {
3999   /* In PIC mode, this is just the PIC offset table.  */
4000   if (flag_pic)
4001     {
4002       crtl->uses_pic_offset_table = 1;
4003       return pic_offset_table_rtx;
4004     }
4005
4006   /* In non-PIC mode, Sun as (unlike GNU as) emits PC-relative relocations for
4007      the GOT symbol with the 32-bit ABI, so we reload the GOT register.  */
4008   if (TARGET_SUN_TLS && TARGET_ARCH32)
4009     {
4010       load_got_register ();
4011       return global_offset_table_rtx;
4012     }
4013
4014   /* In all other cases, we load a new pseudo with the GOT symbol.  */
4015   return copy_to_reg (sparc_got ());
4016 }
4017
4018 /* Return true if X contains a thread-local symbol.  */
4019
4020 static bool
4021 sparc_tls_referenced_p (rtx x)
4022 {
4023   if (!TARGET_HAVE_TLS)
4024     return false;
4025
4026   if (GET_CODE (x) == CONST && GET_CODE (XEXP (x, 0)) == PLUS)
4027     x = XEXP (XEXP (x, 0), 0);
4028
4029   if (GET_CODE (x) == SYMBOL_REF && SYMBOL_REF_TLS_MODEL (x))
4030     return true;
4031
4032   /* That's all we handle in sparc_legitimize_tls_address for now.  */
4033   return false;
4034 }
4035
4036 /* ADDR contains a thread-local SYMBOL_REF.  Generate code to compute
4037    this (thread-local) address.  */
4038
4039 static rtx
4040 sparc_legitimize_tls_address (rtx addr)
4041 {
4042   rtx temp1, temp2, temp3, ret, o0, got;
4043   rtx_insn *insn;
4044
4045   gcc_assert (can_create_pseudo_p ());
4046
4047   if (GET_CODE (addr) == SYMBOL_REF)
4048     switch (SYMBOL_REF_TLS_MODEL (addr))
4049       {
4050       case TLS_MODEL_GLOBAL_DYNAMIC:
4051         start_sequence ();
4052         temp1 = gen_reg_rtx (SImode);
4053         temp2 = gen_reg_rtx (SImode);
4054         ret = gen_reg_rtx (Pmode);
4055         o0 = gen_rtx_REG (Pmode, 8);
4056         got = sparc_tls_got ();
4057         emit_insn (gen_tgd_hi22 (temp1, addr));
4058         emit_insn (gen_tgd_lo10 (temp2, temp1, addr));
4059         if (TARGET_ARCH32)
4060           {
4061             emit_insn (gen_tgd_add32 (o0, got, temp2, addr));
4062             insn = emit_call_insn (gen_tgd_call32 (o0, sparc_tls_get_addr (),
4063                                                    addr, const1_rtx));
4064           }
4065         else
4066           {
4067             emit_insn (gen_tgd_add64 (o0, got, temp2, addr));
4068             insn = emit_call_insn (gen_tgd_call64 (o0, sparc_tls_get_addr (),
4069                                                    addr, const1_rtx));
4070           }
4071         use_reg (&CALL_INSN_FUNCTION_USAGE (insn), o0);
4072         insn = get_insns ();
4073         end_sequence ();
4074         emit_libcall_block (insn, ret, o0, addr);
4075         break;
4076
4077       case TLS_MODEL_LOCAL_DYNAMIC:
4078         start_sequence ();
4079         temp1 = gen_reg_rtx (SImode);
4080         temp2 = gen_reg_rtx (SImode);
4081         temp3 = gen_reg_rtx (Pmode);
4082         ret = gen_reg_rtx (Pmode);
4083         o0 = gen_rtx_REG (Pmode, 8);
4084         got = sparc_tls_got ();
4085         emit_insn (gen_tldm_hi22 (temp1));
4086         emit_insn (gen_tldm_lo10 (temp2, temp1));
4087         if (TARGET_ARCH32)
4088           {
4089             emit_insn (gen_tldm_add32 (o0, got, temp2));
4090             insn = emit_call_insn (gen_tldm_call32 (o0, sparc_tls_get_addr (),
4091                                                     const1_rtx));
4092           }
4093         else
4094           {
4095             emit_insn (gen_tldm_add64 (o0, got, temp2));
4096             insn = emit_call_insn (gen_tldm_call64 (o0, sparc_tls_get_addr (),
4097                                                     const1_rtx));
4098           }
4099         use_reg (&CALL_INSN_FUNCTION_USAGE (insn), o0);
4100         insn = get_insns ();
4101         end_sequence ();
4102         emit_libcall_block (insn, temp3, o0,
4103                             gen_rtx_UNSPEC (Pmode, gen_rtvec (1, const0_rtx),
4104                                             UNSPEC_TLSLD_BASE));
4105         temp1 = gen_reg_rtx (SImode);
4106         temp2 = gen_reg_rtx (SImode);
4107         emit_insn (gen_tldo_hix22 (temp1, addr));
4108         emit_insn (gen_tldo_lox10 (temp2, temp1, addr));
4109         if (TARGET_ARCH32)
4110           emit_insn (gen_tldo_add32 (ret, temp3, temp2, addr));
4111         else
4112           emit_insn (gen_tldo_add64 (ret, temp3, temp2, addr));
4113         break;
4114
4115       case TLS_MODEL_INITIAL_EXEC:
4116         temp1 = gen_reg_rtx (SImode);
4117         temp2 = gen_reg_rtx (SImode);
4118         temp3 = gen_reg_rtx (Pmode);
4119         got = sparc_tls_got ();
4120         emit_insn (gen_tie_hi22 (temp1, addr));
4121         emit_insn (gen_tie_lo10 (temp2, temp1, addr));
4122         if (TARGET_ARCH32)
4123           emit_insn (gen_tie_ld32 (temp3, got, temp2, addr));
4124         else
4125           emit_insn (gen_tie_ld64 (temp3, got, temp2, addr));
4126         if (TARGET_SUN_TLS)
4127           {
4128             ret = gen_reg_rtx (Pmode);
4129             if (TARGET_ARCH32)
4130               emit_insn (gen_tie_add32 (ret, gen_rtx_REG (Pmode, 7),
4131                                         temp3, addr));
4132             else
4133               emit_insn (gen_tie_add64 (ret, gen_rtx_REG (Pmode, 7),
4134                                         temp3, addr));
4135           }
4136         else
4137           ret = gen_rtx_PLUS (Pmode, gen_rtx_REG (Pmode, 7), temp3);
4138         break;
4139
4140       case TLS_MODEL_LOCAL_EXEC:
4141         temp1 = gen_reg_rtx (Pmode);
4142         temp2 = gen_reg_rtx (Pmode);
4143         if (TARGET_ARCH32)
4144           {
4145             emit_insn (gen_tle_hix22_sp32 (temp1, addr));
4146             emit_insn (gen_tle_lox10_sp32 (temp2, temp1, addr));
4147           }
4148         else
4149           {
4150             emit_insn (gen_tle_hix22_sp64 (temp1, addr));
4151             emit_insn (gen_tle_lox10_sp64 (temp2, temp1, addr));
4152           }
4153         ret = gen_rtx_PLUS (Pmode, gen_rtx_REG (Pmode, 7), temp2);
4154         break;
4155
4156       default:
4157         gcc_unreachable ();
4158       }
4159
4160   else if (GET_CODE (addr) == CONST)
4161     {
4162       rtx base, offset;
4163
4164       gcc_assert (GET_CODE (XEXP (addr, 0)) == PLUS);
4165
4166       base = sparc_legitimize_tls_address (XEXP (XEXP (addr, 0), 0));
4167       offset = XEXP (XEXP (addr, 0), 1);
4168
4169       base = force_operand (base, NULL_RTX);
4170       if (!(GET_CODE (offset) == CONST_INT && SMALL_INT (offset)))
4171         offset = force_reg (Pmode, offset);
4172       ret = gen_rtx_PLUS (Pmode, base, offset);
4173     }
4174
4175   else
4176     gcc_unreachable ();  /* for now ... */
4177
4178   return ret;
4179 }
4180
4181 /* Legitimize PIC addresses.  If the address is already position-independent,
4182    we return ORIG.  Newly generated position-independent addresses go into a
4183    reg.  This is REG if nonzero, otherwise we allocate register(s) as
4184    necessary.  */
4185
4186 static rtx
4187 sparc_legitimize_pic_address (rtx orig, rtx reg)
4188 {
4189   bool gotdata_op = false;
4190
4191   if (GET_CODE (orig) == SYMBOL_REF
4192       /* See the comment in sparc_expand_move.  */
4193       || (GET_CODE (orig) == LABEL_REF && !can_use_mov_pic_label_ref (orig)))
4194     {
4195       rtx pic_ref, address;
4196       rtx_insn *insn;
4197
4198       if (reg == 0)
4199         {
4200           gcc_assert (can_create_pseudo_p ());
4201           reg = gen_reg_rtx (Pmode);
4202         }
4203
4204       if (flag_pic == 2)
4205         {
4206           /* If not during reload, allocate another temp reg here for loading
4207              in the address, so that these instructions can be optimized
4208              properly.  */
4209           rtx temp_reg = (! can_create_pseudo_p ()
4210                           ? reg : gen_reg_rtx (Pmode));
4211
4212           /* Must put the SYMBOL_REF inside an UNSPEC here so that cse
4213              won't get confused into thinking that these two instructions
4214              are loading in the true address of the symbol.  If in the
4215              future a PIC rtx exists, that should be used instead.  */
4216           if (TARGET_ARCH64)
4217             {
4218               emit_insn (gen_movdi_high_pic (temp_reg, orig));
4219               emit_insn (gen_movdi_lo_sum_pic (temp_reg, temp_reg, orig));
4220             }
4221           else
4222             {
4223               emit_insn (gen_movsi_high_pic (temp_reg, orig));
4224               emit_insn (gen_movsi_lo_sum_pic (temp_reg, temp_reg, orig));
4225             }
4226           address = temp_reg;
4227           gotdata_op = true;
4228         }
4229       else
4230         address = orig;
4231
4232       crtl->uses_pic_offset_table = 1;
4233       if (gotdata_op)
4234         {
4235           if (TARGET_ARCH64)
4236             insn = emit_insn (gen_movdi_pic_gotdata_op (reg,
4237                                                         pic_offset_table_rtx,
4238                                                         address, orig));
4239           else
4240             insn = emit_insn (gen_movsi_pic_gotdata_op (reg,
4241                                                         pic_offset_table_rtx,
4242                                                         address, orig));
4243         }
4244       else
4245         {
4246           pic_ref
4247             = gen_const_mem (Pmode,
4248                              gen_rtx_PLUS (Pmode,
4249                                            pic_offset_table_rtx, address));
4250           insn = emit_move_insn (reg, pic_ref);
4251         }
4252
4253       /* Put a REG_EQUAL note on this insn, so that it can be optimized
4254          by loop.  */
4255       set_unique_reg_note (insn, REG_EQUAL, orig);
4256       return reg;
4257     }
4258   else if (GET_CODE (orig) == CONST)
4259     {
4260       rtx base, offset;
4261
4262       if (GET_CODE (XEXP (orig, 0)) == PLUS
4263           && XEXP (XEXP (orig, 0), 0) == pic_offset_table_rtx)
4264         return orig;
4265
4266       if (reg == 0)
4267         {
4268           gcc_assert (can_create_pseudo_p ());
4269           reg = gen_reg_rtx (Pmode);
4270         }
4271
4272       gcc_assert (GET_CODE (XEXP (orig, 0)) == PLUS);
4273       base = sparc_legitimize_pic_address (XEXP (XEXP (orig, 0), 0), reg);
4274       offset = sparc_legitimize_pic_address (XEXP (XEXP (orig, 0), 1),
4275                                              base == reg ? NULL_RTX : reg);
4276
4277       if (GET_CODE (offset) == CONST_INT)
4278         {
4279           if (SMALL_INT (offset))
4280             return plus_constant (Pmode, base, INTVAL (offset));
4281           else if (can_create_pseudo_p ())
4282             offset = force_reg (Pmode, offset);
4283           else
4284             /* If we reach here, then something is seriously wrong.  */
4285             gcc_unreachable ();
4286         }
4287       return gen_rtx_PLUS (Pmode, base, offset);
4288     }
4289   else if (GET_CODE (orig) == LABEL_REF)
4290     /* ??? We ought to be checking that the register is live instead, in case
4291        it is eliminated.  */
4292     crtl->uses_pic_offset_table = 1;
4293
4294   return orig;
4295 }
4296
4297 /* Try machine-dependent ways of modifying an illegitimate address X
4298    to be legitimate.  If we find one, return the new, valid address.
4299
4300    OLDX is the address as it was before break_out_memory_refs was called.
4301    In some cases it is useful to look at this to decide what needs to be done.
4302
4303    MODE is the mode of the operand pointed to by X.
4304
4305    On SPARC, change REG+N into REG+REG, and REG+(X*Y) into REG+REG.  */
4306
4307 static rtx
4308 sparc_legitimize_address (rtx x, rtx oldx ATTRIBUTE_UNUSED,
4309                           machine_mode mode)
4310 {
4311   rtx orig_x = x;
4312
4313   if (GET_CODE (x) == PLUS && GET_CODE (XEXP (x, 0)) == MULT)
4314     x = gen_rtx_PLUS (Pmode, XEXP (x, 1),
4315                       force_operand (XEXP (x, 0), NULL_RTX));
4316   if (GET_CODE (x) == PLUS && GET_CODE (XEXP (x, 1)) == MULT)
4317     x = gen_rtx_PLUS (Pmode, XEXP (x, 0),
4318                       force_operand (XEXP (x, 1), NULL_RTX));
4319   if (GET_CODE (x) == PLUS && GET_CODE (XEXP (x, 0)) == PLUS)
4320     x = gen_rtx_PLUS (Pmode, force_operand (XEXP (x, 0), NULL_RTX),
4321                       XEXP (x, 1));
4322   if (GET_CODE (x) == PLUS && GET_CODE (XEXP (x, 1)) == PLUS)
4323     x = gen_rtx_PLUS (Pmode, XEXP (x, 0),
4324                       force_operand (XEXP (x, 1), NULL_RTX));
4325
4326   if (x != orig_x && sparc_legitimate_address_p (mode, x, FALSE))
4327     return x;
4328
4329   if (sparc_tls_referenced_p (x))
4330     x = sparc_legitimize_tls_address (x);
4331   else if (flag_pic)
4332     x = sparc_legitimize_pic_address (x, NULL_RTX);
4333   else if (GET_CODE (x) == PLUS && CONSTANT_ADDRESS_P (XEXP (x, 1)))
4334     x = gen_rtx_PLUS (Pmode, XEXP (x, 0),
4335                       copy_to_mode_reg (Pmode, XEXP (x, 1)));
4336   else if (GET_CODE (x) == PLUS && CONSTANT_ADDRESS_P (XEXP (x, 0)))
4337     x = gen_rtx_PLUS (Pmode, XEXP (x, 1),
4338                       copy_to_mode_reg (Pmode, XEXP (x, 0)));
4339   else if (GET_CODE (x) == SYMBOL_REF
4340            || GET_CODE (x) == CONST
4341            || GET_CODE (x) == LABEL_REF)
4342     x = copy_to_suggested_reg (x, NULL_RTX, Pmode);
4343
4344   return x;
4345 }
4346
4347 /* Delegitimize an address that was legitimized by the above function.  */
4348
4349 static rtx
4350 sparc_delegitimize_address (rtx x)
4351 {
4352   x = delegitimize_mem_from_attrs (x);
4353
4354   if (GET_CODE (x) == LO_SUM && GET_CODE (XEXP (x, 1)) == UNSPEC)
4355     switch (XINT (XEXP (x, 1), 1))
4356       {
4357       case UNSPEC_MOVE_PIC:
4358       case UNSPEC_TLSLE:
4359         x = XVECEXP (XEXP (x, 1), 0, 0);
4360         gcc_assert (GET_CODE (x) == SYMBOL_REF);
4361         break;
4362       default:
4363         break;
4364       }
4365
4366   /* This is generated by mov{si,di}_pic_label_ref in PIC mode.  */
4367   if (GET_CODE (x) == MINUS
4368       && REG_P (XEXP (x, 0))
4369       && REGNO (XEXP (x, 0)) == PIC_OFFSET_TABLE_REGNUM
4370       && GET_CODE (XEXP (x, 1)) == LO_SUM
4371       && GET_CODE (XEXP (XEXP (x, 1), 1)) == UNSPEC
4372       && XINT (XEXP (XEXP (x, 1), 1), 1) == UNSPEC_MOVE_PIC_LABEL)
4373     {
4374       x = XVECEXP (XEXP (XEXP (x, 1), 1), 0, 0);
4375       gcc_assert (GET_CODE (x) == LABEL_REF);
4376     }
4377
4378   return x;
4379 }
4380
4381 /* SPARC implementation of LEGITIMIZE_RELOAD_ADDRESS.  Returns a value to
4382    replace the input X, or the original X if no replacement is called for.
4383    The output parameter *WIN is 1 if the calling macro should goto WIN,
4384    0 if it should not.
4385
4386    For SPARC, we wish to handle addresses by splitting them into
4387    HIGH+LO_SUM pairs, retaining the LO_SUM in the memory reference.
4388    This cuts the number of extra insns by one.
4389
4390    Do nothing when generating PIC code and the address is a symbolic
4391    operand or requires a scratch register.  */
4392
4393 rtx
4394 sparc_legitimize_reload_address (rtx x, machine_mode mode,
4395                                  int opnum, int type,
4396                                  int ind_levels ATTRIBUTE_UNUSED, int *win)
4397 {
4398   /* Decompose SImode constants into HIGH+LO_SUM.  */
4399   if (CONSTANT_P (x)
4400       && (mode != TFmode || TARGET_ARCH64)
4401       && GET_MODE (x) == SImode
4402       && GET_CODE (x) != LO_SUM
4403       && GET_CODE (x) != HIGH
4404       && sparc_cmodel <= CM_MEDLOW
4405       && !(flag_pic
4406            && (symbolic_operand (x, Pmode) || pic_address_needs_scratch (x))))
4407     {
4408       x = gen_rtx_LO_SUM (GET_MODE (x), gen_rtx_HIGH (GET_MODE (x), x), x);
4409       push_reload (XEXP (x, 0), NULL_RTX, &XEXP (x, 0), NULL,
4410                    BASE_REG_CLASS, GET_MODE (x), VOIDmode, 0, 0,
4411                    opnum, (enum reload_type)type);
4412       *win = 1;
4413       return x;
4414     }
4415
4416   /* We have to recognize what we have already generated above.  */
4417   if (GET_CODE (x) == LO_SUM && GET_CODE (XEXP (x, 0)) == HIGH)
4418     {
4419       push_reload (XEXP (x, 0), NULL_RTX, &XEXP (x, 0), NULL,
4420                    BASE_REG_CLASS, GET_MODE (x), VOIDmode, 0, 0,
4421                    opnum, (enum reload_type)type);
4422       *win = 1;
4423       return x;
4424     }
4425
4426   *win = 0;
4427   return x;
4428 }
4429
4430 /* Return true if ADDR (a legitimate address expression)
4431    has an effect that depends on the machine mode it is used for.
4432
4433    In PIC mode,
4434
4435       (mem:HI [%l7+a])
4436
4437    is not equivalent to
4438
4439       (mem:QI [%l7+a]) (mem:QI [%l7+a+1])
4440
4441    because [%l7+a+1] is interpreted as the address of (a+1).  */
4442
4443
4444 static bool
4445 sparc_mode_dependent_address_p (const_rtx addr,
4446                                 addr_space_t as ATTRIBUTE_UNUSED)
4447 {
4448   if (flag_pic && GET_CODE (addr) == PLUS)
4449     {
4450       rtx op0 = XEXP (addr, 0);
4451       rtx op1 = XEXP (addr, 1);
4452       if (op0 == pic_offset_table_rtx
4453           && symbolic_operand (op1, VOIDmode))
4454         return true;
4455     }
4456
4457   return false;
4458 }
4459
4460 #ifdef HAVE_GAS_HIDDEN
4461 # define USE_HIDDEN_LINKONCE 1
4462 #else
4463 # define USE_HIDDEN_LINKONCE 0
4464 #endif
4465
4466 static void
4467 get_pc_thunk_name (char name[32], unsigned int regno)
4468 {
4469   const char *reg_name = reg_names[regno];
4470
4471   /* Skip the leading '%' as that cannot be used in a
4472      symbol name.  */
4473   reg_name += 1;
4474
4475   if (USE_HIDDEN_LINKONCE)
4476     sprintf (name, "__sparc_get_pc_thunk.%s", reg_name);
4477   else
4478     ASM_GENERATE_INTERNAL_LABEL (name, "LADDPC", regno);
4479 }
4480
4481 /* Wrapper around the load_pcrel_sym{si,di} patterns.  */
4482
4483 static rtx
4484 gen_load_pcrel_sym (rtx op0, rtx op1, rtx op2, rtx op3)
4485 {
4486   int orig_flag_pic = flag_pic;
4487   rtx insn;
4488
4489   /* The load_pcrel_sym{si,di} patterns require absolute addressing.  */
4490   flag_pic = 0;
4491   if (TARGET_ARCH64)
4492     insn = gen_load_pcrel_symdi (op0, op1, op2, op3);
4493   else
4494     insn = gen_load_pcrel_symsi (op0, op1, op2, op3);
4495   flag_pic = orig_flag_pic;
4496
4497   return insn;
4498 }
4499
4500 /* Emit code to load the GOT register.  */
4501
4502 void
4503 load_got_register (void)
4504 {
4505   /* In PIC mode, this will retrieve pic_offset_table_rtx.  */
4506   if (!global_offset_table_rtx)
4507     global_offset_table_rtx = gen_rtx_REG (Pmode, GLOBAL_OFFSET_TABLE_REGNUM);
4508
4509   if (TARGET_VXWORKS_RTP)
4510     emit_insn (gen_vxworks_load_got ());
4511   else
4512     {
4513       /* The GOT symbol is subject to a PC-relative relocation so we need a
4514          helper function to add the PC value and thus get the final value.  */
4515       if (!got_helper_rtx)
4516         {
4517           char name[32];
4518           get_pc_thunk_name (name, GLOBAL_OFFSET_TABLE_REGNUM);
4519           got_helper_rtx = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (name));
4520         }
4521
4522       emit_insn (gen_load_pcrel_sym (global_offset_table_rtx, sparc_got (),
4523                                      got_helper_rtx,
4524                                      GEN_INT (GLOBAL_OFFSET_TABLE_REGNUM)));
4525     }
4526
4527   /* Need to emit this whether or not we obey regdecls,
4528      since setjmp/longjmp can cause life info to screw up.
4529      ??? In the case where we don't obey regdecls, this is not sufficient
4530      since we may not fall out the bottom.  */
4531   emit_use (global_offset_table_rtx);
4532 }
4533
4534 /* Emit a call instruction with the pattern given by PAT.  ADDR is the
4535    address of the call target.  */
4536
4537 void
4538 sparc_emit_call_insn (rtx pat, rtx addr)
4539 {
4540   rtx_insn *insn;
4541
4542   insn = emit_call_insn (pat);
4543
4544   /* The PIC register is live on entry to VxWorks PIC PLT entries.  */
4545   if (TARGET_VXWORKS_RTP
4546       && flag_pic
4547       && GET_CODE (addr) == SYMBOL_REF
4548       && (SYMBOL_REF_DECL (addr)
4549           ? !targetm.binds_local_p (SYMBOL_REF_DECL (addr))
4550           : !SYMBOL_REF_LOCAL_P (addr)))
4551     {
4552       use_reg (&CALL_INSN_FUNCTION_USAGE (insn), pic_offset_table_rtx);
4553       crtl->uses_pic_offset_table = 1;
4554     }
4555 }
4556 \f
4557 /* Return 1 if RTX is a MEM which is known to be aligned to at
4558    least a DESIRED byte boundary.  */
4559
4560 int
4561 mem_min_alignment (rtx mem, int desired)
4562 {
4563   rtx addr, base, offset;
4564
4565   /* If it's not a MEM we can't accept it.  */
4566   if (GET_CODE (mem) != MEM)
4567     return 0;
4568
4569   /* Obviously...  */
4570   if (!TARGET_UNALIGNED_DOUBLES
4571       && MEM_ALIGN (mem) / BITS_PER_UNIT >= (unsigned)desired)
4572     return 1;
4573
4574   /* ??? The rest of the function predates MEM_ALIGN so
4575      there is probably a bit of redundancy.  */
4576   addr = XEXP (mem, 0);
4577   base = offset = NULL_RTX;
4578   if (GET_CODE (addr) == PLUS)
4579     {
4580       if (GET_CODE (XEXP (addr, 0)) == REG)
4581         {
4582           base = XEXP (addr, 0);
4583
4584           /* What we are saying here is that if the base
4585              REG is aligned properly, the compiler will make
4586              sure any REG based index upon it will be so
4587              as well.  */
4588           if (GET_CODE (XEXP (addr, 1)) == CONST_INT)
4589             offset = XEXP (addr, 1);
4590           else
4591             offset = const0_rtx;
4592         }
4593     }
4594   else if (GET_CODE (addr) == REG)
4595     {
4596       base = addr;
4597       offset = const0_rtx;
4598     }
4599
4600   if (base != NULL_RTX)
4601     {
4602       int regno = REGNO (base);
4603
4604       if (regno != HARD_FRAME_POINTER_REGNUM && regno != STACK_POINTER_REGNUM)
4605         {
4606           /* Check if the compiler has recorded some information
4607              about the alignment of the base REG.  If reload has
4608              completed, we already matched with proper alignments.
4609              If not running global_alloc, reload might give us
4610              unaligned pointer to local stack though.  */
4611           if (((cfun != 0
4612                 && REGNO_POINTER_ALIGN (regno) >= desired * BITS_PER_UNIT)
4613                || (optimize && reload_completed))
4614               && (INTVAL (offset) & (desired - 1)) == 0)
4615             return 1;
4616         }
4617       else
4618         {
4619           if (((INTVAL (offset) - SPARC_STACK_BIAS) & (desired - 1)) == 0)
4620             return 1;
4621         }
4622     }
4623   else if (! TARGET_UNALIGNED_DOUBLES
4624            || CONSTANT_P (addr)
4625            || GET_CODE (addr) == LO_SUM)
4626     {
4627       /* Anything else we know is properly aligned unless TARGET_UNALIGNED_DOUBLES
4628          is true, in which case we can only assume that an access is aligned if
4629          it is to a constant address, or the address involves a LO_SUM.  */
4630       return 1;
4631     }
4632
4633   /* An obviously unaligned address.  */
4634   return 0;
4635 }
4636
4637 \f
4638 /* Vectors to keep interesting information about registers where it can easily
4639    be got.  We used to use the actual mode value as the bit number, but there
4640    are more than 32 modes now.  Instead we use two tables: one indexed by
4641    hard register number, and one indexed by mode.  */
4642
4643 /* The purpose of sparc_mode_class is to shrink the range of modes so that
4644    they all fit (as bit numbers) in a 32-bit word (again).  Each real mode is
4645    mapped into one sparc_mode_class mode.  */
4646
4647 enum sparc_mode_class {
4648   H_MODE, S_MODE, D_MODE, T_MODE, O_MODE,
4649   SF_MODE, DF_MODE, TF_MODE, OF_MODE,
4650   CC_MODE, CCFP_MODE
4651 };
4652
4653 /* Modes for single-word and smaller quantities.  */
4654 #define S_MODES \
4655   ((1 << (int) H_MODE) | (1 << (int) S_MODE) | (1 << (int) SF_MODE))
4656
4657 /* Modes for double-word and smaller quantities.  */
4658 #define D_MODES (S_MODES | (1 << (int) D_MODE) | (1 << DF_MODE))
4659
4660 /* Modes for quad-word and smaller quantities.  */
4661 #define T_MODES (D_MODES | (1 << (int) T_MODE) | (1 << (int) TF_MODE))
4662
4663 /* Modes for 8-word and smaller quantities.  */
4664 #define O_MODES (T_MODES | (1 << (int) O_MODE) | (1 << (int) OF_MODE))
4665
4666 /* Modes for single-float quantities.  */
4667 #define SF_MODES ((1 << (int) S_MODE) | (1 << (int) SF_MODE))
4668
4669 /* Modes for double-float and smaller quantities.  */
4670 #define DF_MODES (SF_MODES | (1 << (int) D_MODE) | (1 << DF_MODE))
4671
4672 /* Modes for quad-float and smaller quantities.  */
4673 #define TF_MODES (DF_MODES | (1 << (int) TF_MODE))
4674
4675 /* Modes for quad-float pairs and smaller quantities.  */
4676 #define OF_MODES (TF_MODES | (1 << (int) OF_MODE))
4677
4678 /* Modes for double-float only quantities.  */
4679 #define DF_MODES_NO_S ((1 << (int) D_MODE) | (1 << (int) DF_MODE))
4680
4681 /* Modes for quad-float and double-float only quantities.  */
4682 #define TF_MODES_NO_S (DF_MODES_NO_S | (1 << (int) TF_MODE))
4683
4684 /* Modes for quad-float pairs and double-float only quantities.  */
4685 #define OF_MODES_NO_S (TF_MODES_NO_S | (1 << (int) OF_MODE))
4686
4687 /* Modes for condition codes.  */
4688 #define CC_MODES (1 << (int) CC_MODE)
4689 #define CCFP_MODES (1 << (int) CCFP_MODE)
4690
4691 /* Value is 1 if register/mode pair is acceptable on sparc.
4692
4693    The funny mixture of D and T modes is because integer operations
4694    do not specially operate on tetra quantities, so non-quad-aligned
4695    registers can hold quadword quantities (except %o4 and %i4 because
4696    they cross fixed registers).
4697
4698    ??? Note that, despite the settings, non-double-aligned parameter
4699    registers can hold double-word quantities in 32-bit mode.  */
4700
4701 /* This points to either the 32 bit or the 64 bit version.  */
4702 const int *hard_regno_mode_classes;
4703
4704 static const int hard_32bit_mode_classes[] = {
4705   S_MODES, S_MODES, T_MODES, S_MODES, T_MODES, S_MODES, D_MODES, S_MODES,
4706   T_MODES, S_MODES, T_MODES, S_MODES, D_MODES, S_MODES, D_MODES, S_MODES,
4707   T_MODES, S_MODES, T_MODES, S_MODES, T_MODES, S_MODES, D_MODES, S_MODES,
4708   T_MODES, S_MODES, T_MODES, S_MODES, D_MODES, S_MODES, D_MODES, S_MODES,
4709
4710   OF_MODES, SF_MODES, DF_MODES, SF_MODES, OF_MODES, SF_MODES, DF_MODES, SF_MODES,
4711   OF_MODES, SF_MODES, DF_MODES, SF_MODES, OF_MODES, SF_MODES, DF_MODES, SF_MODES,
4712   OF_MODES, SF_MODES, DF_MODES, SF_MODES, OF_MODES, SF_MODES, DF_MODES, SF_MODES,
4713   OF_MODES, SF_MODES, DF_MODES, SF_MODES, TF_MODES, SF_MODES, DF_MODES, SF_MODES,
4714
4715   /* FP regs f32 to f63.  Only the even numbered registers actually exist,
4716      and none can hold SFmode/SImode values.  */
4717   OF_MODES_NO_S, 0, DF_MODES_NO_S, 0, OF_MODES_NO_S, 0, DF_MODES_NO_S, 0,
4718   OF_MODES_NO_S, 0, DF_MODES_NO_S, 0, OF_MODES_NO_S, 0, DF_MODES_NO_S, 0,
4719   OF_MODES_NO_S, 0, DF_MODES_NO_S, 0, OF_MODES_NO_S, 0, DF_MODES_NO_S, 0,
4720   OF_MODES_NO_S, 0, DF_MODES_NO_S, 0, TF_MODES_NO_S, 0, DF_MODES_NO_S, 0,
4721
4722   /* %fcc[0123] */
4723   CCFP_MODES, CCFP_MODES, CCFP_MODES, CCFP_MODES,
4724
4725   /* %icc, %sfp, %gsr */
4726   CC_MODES, 0, D_MODES
4727 };
4728
4729 static const int hard_64bit_mode_classes[] = {
4730   D_MODES, D_MODES, T_MODES, D_MODES, T_MODES, D_MODES, T_MODES, D_MODES,
4731   O_MODES, D_MODES, T_MODES, D_MODES, T_MODES, D_MODES, T_MODES, D_MODES,
4732   T_MODES, D_MODES, T_MODES, D_MODES, T_MODES, D_MODES, T_MODES, D_MODES,
4733   O_MODES, D_MODES, T_MODES, D_MODES, T_MODES, D_MODES, T_MODES, D_MODES,
4734
4735   OF_MODES, SF_MODES, DF_MODES, SF_MODES, OF_MODES, SF_MODES, DF_MODES, SF_MODES,
4736   OF_MODES, SF_MODES, DF_MODES, SF_MODES, OF_MODES, SF_MODES, DF_MODES, SF_MODES,
4737   OF_MODES, SF_MODES, DF_MODES, SF_MODES, OF_MODES, SF_MODES, DF_MODES, SF_MODES,
4738   OF_MODES, SF_MODES, DF_MODES, SF_MODES, TF_MODES, SF_MODES, DF_MODES, SF_MODES,
4739
4740   /* FP regs f32 to f63.  Only the even numbered registers actually exist,
4741      and none can hold SFmode/SImode values.  */
4742   OF_MODES_NO_S, 0, DF_MODES_NO_S, 0, OF_MODES_NO_S, 0, DF_MODES_NO_S, 0,
4743   OF_MODES_NO_S, 0, DF_MODES_NO_S, 0, OF_MODES_NO_S, 0, DF_MODES_NO_S, 0,
4744   OF_MODES_NO_S, 0, DF_MODES_NO_S, 0, OF_MODES_NO_S, 0, DF_MODES_NO_S, 0,
4745   OF_MODES_NO_S, 0, DF_MODES_NO_S, 0, TF_MODES_NO_S, 0, DF_MODES_NO_S, 0,
4746
4747   /* %fcc[0123] */
4748   CCFP_MODES, CCFP_MODES, CCFP_MODES, CCFP_MODES,
4749
4750   /* %icc, %sfp, %gsr */
4751   CC_MODES, 0, D_MODES
4752 };
4753
4754 int sparc_mode_class [NUM_MACHINE_MODES];
4755
4756 enum reg_class sparc_regno_reg_class[FIRST_PSEUDO_REGISTER];
4757
4758 static void
4759 sparc_init_modes (void)
4760 {
4761   int i;
4762
4763   for (i = 0; i < NUM_MACHINE_MODES; i++)
4764     {
4765       machine_mode m = (machine_mode) i;
4766       unsigned int size = GET_MODE_SIZE (m);
4767
4768       switch (GET_MODE_CLASS (m))
4769         {
4770         case MODE_INT:
4771         case MODE_PARTIAL_INT:
4772         case MODE_COMPLEX_INT:
4773           if (size < 4)
4774             sparc_mode_class[i] = 1 << (int) H_MODE;
4775           else if (size == 4)
4776             sparc_mode_class[i] = 1 << (int) S_MODE;
4777           else if (size == 8)
4778             sparc_mode_class[i] = 1 << (int) D_MODE;
4779           else if (size == 16)
4780             sparc_mode_class[i] = 1 << (int) T_MODE;
4781           else if (size == 32)
4782             sparc_mode_class[i] = 1 << (int) O_MODE;
4783           else
4784             sparc_mode_class[i] = 0;
4785           break;
4786         case MODE_VECTOR_INT:
4787           if (size == 4)
4788             sparc_mode_class[i] = 1 << (int) SF_MODE;
4789           else if (size == 8)
4790             sparc_mode_class[i] = 1 << (int) DF_MODE;
4791           else
4792             sparc_mode_class[i] = 0;
4793           break;
4794         case MODE_FLOAT:
4795         case MODE_COMPLEX_FLOAT:
4796           if (size == 4)
4797             sparc_mode_class[i] = 1 << (int) SF_MODE;
4798           else if (size == 8)
4799             sparc_mode_class[i] = 1 << (int) DF_MODE;
4800           else if (size == 16)
4801             sparc_mode_class[i] = 1 << (int) TF_MODE;
4802           else if (size == 32)
4803             sparc_mode_class[i] = 1 << (int) OF_MODE;
4804           else
4805             sparc_mode_class[i] = 0;
4806           break;
4807         case MODE_CC:
4808           if (m == CCFPmode || m == CCFPEmode)
4809             sparc_mode_class[i] = 1 << (int) CCFP_MODE;
4810           else
4811             sparc_mode_class[i] = 1 << (int) CC_MODE;
4812           break;
4813         default:
4814           sparc_mode_class[i] = 0;
4815           break;
4816         }
4817     }
4818
4819   if (TARGET_ARCH64)
4820     hard_regno_mode_classes = hard_64bit_mode_classes;
4821   else
4822     hard_regno_mode_classes = hard_32bit_mode_classes;
4823
4824   /* Initialize the array used by REGNO_REG_CLASS.  */
4825   for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
4826     {
4827       if (i < 16 && TARGET_V8PLUS)
4828         sparc_regno_reg_class[i] = I64_REGS;
4829       else if (i < 32 || i == FRAME_POINTER_REGNUM)
4830         sparc_regno_reg_class[i] = GENERAL_REGS;
4831       else if (i < 64)
4832         sparc_regno_reg_class[i] = FP_REGS;
4833       else if (i < 96)
4834         sparc_regno_reg_class[i] = EXTRA_FP_REGS;
4835       else if (i < 100)
4836         sparc_regno_reg_class[i] = FPCC_REGS;
4837       else
4838         sparc_regno_reg_class[i] = NO_REGS;
4839     }
4840 }
4841 \f
4842 /* Return whether REGNO, a global or FP register, must be saved/restored.  */
4843
4844 static inline bool
4845 save_global_or_fp_reg_p (unsigned int regno,
4846                          int leaf_function ATTRIBUTE_UNUSED)
4847 {
4848   return !call_used_regs[regno] && df_regs_ever_live_p (regno);
4849 }
4850
4851 /* Return whether the return address register (%i7) is needed.  */
4852
4853 static inline bool
4854 return_addr_reg_needed_p (int leaf_function)
4855 {
4856   /* If it is live, for example because of __builtin_return_address (0).  */
4857   if (df_regs_ever_live_p (RETURN_ADDR_REGNUM))
4858     return true;
4859
4860   /* Otherwise, it is needed as save register if %o7 is clobbered.  */
4861   if (!leaf_function
4862       /* Loading the GOT register clobbers %o7.  */
4863       || crtl->uses_pic_offset_table
4864       || df_regs_ever_live_p (INCOMING_RETURN_ADDR_REGNUM))
4865     return true;
4866
4867   return false;
4868 }
4869
4870 /* Return whether REGNO, a local or in register, must be saved/restored.  */
4871
4872 static bool
4873 save_local_or_in_reg_p (unsigned int regno, int leaf_function)
4874 {
4875   /* General case: call-saved registers live at some point.  */
4876   if (!call_used_regs[regno] && df_regs_ever_live_p (regno))
4877     return true;
4878
4879   /* Frame pointer register (%fp) if needed.  */
4880   if (regno == HARD_FRAME_POINTER_REGNUM && frame_pointer_needed)
4881     return true;
4882
4883   /* Return address register (%i7) if needed.  */
4884   if (regno == RETURN_ADDR_REGNUM && return_addr_reg_needed_p (leaf_function))
4885     return true;
4886
4887   /* GOT register (%l7) if needed.  */
4888   if (regno == PIC_OFFSET_TABLE_REGNUM && crtl->uses_pic_offset_table)
4889     return true;
4890
4891   /* If the function accesses prior frames, the frame pointer and the return
4892      address of the previous frame must be saved on the stack.  */
4893   if (crtl->accesses_prior_frames
4894       && (regno == HARD_FRAME_POINTER_REGNUM || regno == RETURN_ADDR_REGNUM))
4895     return true;
4896
4897   return false;
4898 }
4899
4900 /* Compute the frame size required by the function.  This function is called
4901    during the reload pass and also by sparc_expand_prologue.  */
4902
4903 HOST_WIDE_INT
4904 sparc_compute_frame_size (HOST_WIDE_INT size, int leaf_function)
4905 {
4906   HOST_WIDE_INT frame_size, apparent_frame_size;
4907   int args_size, n_global_fp_regs = 0;
4908   bool save_local_in_regs_p = false;
4909   unsigned int i;
4910
4911   /* If the function allocates dynamic stack space, the dynamic offset is
4912      computed early and contains REG_PARM_STACK_SPACE, so we need to cope.  */
4913   if (leaf_function && !cfun->calls_alloca)
4914     args_size = 0;
4915   else
4916     args_size = crtl->outgoing_args_size + REG_PARM_STACK_SPACE (cfun->decl);
4917
4918   /* Calculate space needed for global registers.  */
4919   if (TARGET_ARCH64)
4920     {
4921       for (i = 0; i < 8; i++)
4922         if (save_global_or_fp_reg_p (i, 0))
4923           n_global_fp_regs += 2;
4924     }
4925   else
4926     {
4927       for (i = 0; i < 8; i += 2)
4928         if (save_global_or_fp_reg_p (i, 0)
4929             || save_global_or_fp_reg_p (i + 1, 0))
4930           n_global_fp_regs += 2;
4931     }
4932
4933   /* In the flat window model, find out which local and in registers need to
4934      be saved.  We don't reserve space in the current frame for them as they
4935      will be spilled into the register window save area of the caller's frame.
4936      However, as soon as we use this register window save area, we must create
4937      that of the current frame to make it the live one.  */
4938   if (TARGET_FLAT)
4939     for (i = 16; i < 32; i++)
4940       if (save_local_or_in_reg_p (i, leaf_function))
4941         {
4942          save_local_in_regs_p = true;
4943          break;
4944         }
4945
4946   /* Calculate space needed for FP registers.  */
4947   for (i = 32; i < (TARGET_V9 ? 96 : 64); i += 2)
4948     if (save_global_or_fp_reg_p (i, 0) || save_global_or_fp_reg_p (i + 1, 0))
4949       n_global_fp_regs += 2;
4950
4951   if (size == 0
4952       && n_global_fp_regs == 0
4953       && args_size == 0
4954       && !save_local_in_regs_p)
4955     frame_size = apparent_frame_size = 0;
4956   else
4957     {
4958       /* We subtract STARTING_FRAME_OFFSET, remember it's negative.  */
4959       apparent_frame_size = ROUND_UP (size - STARTING_FRAME_OFFSET, 8);
4960       apparent_frame_size += n_global_fp_regs * 4;
4961
4962       /* We need to add the size of the outgoing argument area.  */
4963       frame_size = apparent_frame_size + ROUND_UP (args_size, 8);
4964
4965       /* And that of the register window save area.  */
4966       frame_size += FIRST_PARM_OFFSET (cfun->decl);
4967
4968       /* Finally, bump to the appropriate alignment.  */
4969       frame_size = SPARC_STACK_ALIGN (frame_size);
4970     }
4971
4972   /* Set up values for use in prologue and epilogue.  */
4973   sparc_frame_size = frame_size;
4974   sparc_apparent_frame_size = apparent_frame_size;
4975   sparc_n_global_fp_regs = n_global_fp_regs;
4976   sparc_save_local_in_regs_p = save_local_in_regs_p;
4977
4978   return frame_size;
4979 }
4980
4981 /* Implement the macro INITIAL_ELIMINATION_OFFSET, return the OFFSET.  */
4982
4983 int
4984 sparc_initial_elimination_offset (int to)
4985 {
4986   int offset;
4987
4988   if (to == STACK_POINTER_REGNUM)
4989     offset = sparc_compute_frame_size (get_frame_size (), crtl->is_leaf);
4990   else
4991     offset = 0;
4992
4993   offset += SPARC_STACK_BIAS;
4994   return offset;
4995 }
4996
4997 /* Output any necessary .register pseudo-ops.  */
4998
4999 void
5000 sparc_output_scratch_registers (FILE *file ATTRIBUTE_UNUSED)
5001 {
5002 #ifdef HAVE_AS_REGISTER_PSEUDO_OP
5003   int i;
5004
5005   if (TARGET_ARCH32)
5006     return;
5007
5008   /* Check if %g[2367] were used without
5009      .register being printed for them already.  */
5010   for (i = 2; i < 8; i++)
5011     {
5012       if (df_regs_ever_live_p (i)
5013           && ! sparc_hard_reg_printed [i])
5014         {
5015           sparc_hard_reg_printed [i] = 1;
5016           /* %g7 is used as TLS base register, use #ignore
5017              for it instead of #scratch.  */
5018           fprintf (file, "\t.register\t%%g%d, #%s\n", i,
5019                    i == 7 ? "ignore" : "scratch");
5020         }
5021       if (i == 3) i = 5;
5022     }
5023 #endif
5024 }
5025
5026 #define PROBE_INTERVAL (1 << STACK_CHECK_PROBE_INTERVAL_EXP)
5027
5028 #if PROBE_INTERVAL > 4096
5029 #error Cannot use indexed addressing mode for stack probing
5030 #endif
5031
5032 /* Emit code to probe a range of stack addresses from FIRST to FIRST+SIZE,
5033    inclusive.  These are offsets from the current stack pointer.
5034
5035    Note that we don't use the REG+REG addressing mode for the probes because
5036    of the stack bias in 64-bit mode.  And it doesn't really buy us anything
5037    so the advantages of having a single code win here.  */
5038
5039 static void
5040 sparc_emit_probe_stack_range (HOST_WIDE_INT first, HOST_WIDE_INT size)
5041 {
5042   rtx g1 = gen_rtx_REG (Pmode, 1);
5043
5044   /* See if we have a constant small number of probes to generate.  If so,
5045      that's the easy case.  */
5046   if (size <= PROBE_INTERVAL)
5047     {
5048       emit_move_insn (g1, GEN_INT (first));
5049       emit_insn (gen_rtx_SET (g1,
5050                               gen_rtx_MINUS (Pmode, stack_pointer_rtx, g1)));
5051       emit_stack_probe (plus_constant (Pmode, g1, -size));
5052     }
5053
5054   /* The run-time loop is made up of 9 insns in the generic case while the
5055      compile-time loop is made up of 4+2*(n-2) insns for n # of intervals.  */
5056   else if (size <= 4 * PROBE_INTERVAL)
5057     {
5058       HOST_WIDE_INT i;
5059
5060       emit_move_insn (g1, GEN_INT (first + PROBE_INTERVAL));
5061       emit_insn (gen_rtx_SET (g1,
5062                               gen_rtx_MINUS (Pmode, stack_pointer_rtx, g1)));
5063       emit_stack_probe (g1);
5064
5065       /* Probe at FIRST + N * PROBE_INTERVAL for values of N from 2 until
5066          it exceeds SIZE.  If only two probes are needed, this will not
5067          generate any code.  Then probe at FIRST + SIZE.  */
5068       for (i = 2 * PROBE_INTERVAL; i < size; i += PROBE_INTERVAL)
5069         {
5070           emit_insn (gen_rtx_SET (g1,
5071                                   plus_constant (Pmode, g1, -PROBE_INTERVAL)));
5072           emit_stack_probe (g1);
5073         }
5074
5075       emit_stack_probe (plus_constant (Pmode, g1,
5076                                        (i - PROBE_INTERVAL) - size));
5077     }
5078
5079   /* Otherwise, do the same as above, but in a loop.  Note that we must be
5080      extra careful with variables wrapping around because we might be at
5081      the very top (or the very bottom) of the address space and we have
5082      to be able to handle this case properly; in particular, we use an
5083      equality test for the loop condition.  */
5084   else
5085     {
5086       HOST_WIDE_INT rounded_size;
5087       rtx g4 = gen_rtx_REG (Pmode, 4);
5088
5089       emit_move_insn (g1, GEN_INT (first));
5090
5091
5092       /* Step 1: round SIZE to the previous multiple of the interval.  */
5093
5094       rounded_size = ROUND_DOWN (size, PROBE_INTERVAL);
5095       emit_move_insn (g4, GEN_INT (rounded_size));
5096
5097
5098       /* Step 2: compute initial and final value of the loop counter.  */
5099
5100       /* TEST_ADDR = SP + FIRST.  */
5101       emit_insn (gen_rtx_SET (g1,
5102                               gen_rtx_MINUS (Pmode, stack_pointer_rtx, g1)));
5103
5104       /* LAST_ADDR = SP + FIRST + ROUNDED_SIZE.  */
5105       emit_insn (gen_rtx_SET (g4, gen_rtx_MINUS (Pmode, g1, g4)));
5106
5107
5108       /* Step 3: the loop
5109
5110          while (TEST_ADDR != LAST_ADDR)
5111            {
5112              TEST_ADDR = TEST_ADDR + PROBE_INTERVAL
5113              probe at TEST_ADDR
5114            }
5115
5116          probes at FIRST + N * PROBE_INTERVAL for values of N from 1
5117          until it is equal to ROUNDED_SIZE.  */
5118
5119       if (TARGET_ARCH64)
5120         emit_insn (gen_probe_stack_rangedi (g1, g1, g4));
5121       else
5122         emit_insn (gen_probe_stack_rangesi (g1, g1, g4));
5123
5124
5125       /* Step 4: probe at FIRST + SIZE if we cannot assert at compile-time
5126          that SIZE is equal to ROUNDED_SIZE.  */
5127
5128       if (size != rounded_size)
5129         emit_stack_probe (plus_constant (Pmode, g4, rounded_size - size));
5130     }
5131
5132   /* Make sure nothing is scheduled before we are done.  */
5133   emit_insn (gen_blockage ());
5134 }
5135
5136 /* Probe a range of stack addresses from REG1 to REG2 inclusive.  These are
5137    absolute addresses.  */
5138
5139 const char *
5140 output_probe_stack_range (rtx reg1, rtx reg2)
5141 {
5142   static int labelno = 0;
5143   char loop_lab[32];
5144   rtx xops[2];
5145
5146   ASM_GENERATE_INTERNAL_LABEL (loop_lab, "LPSRL", labelno++);
5147
5148   /* Loop.  */
5149   ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, loop_lab);
5150
5151   /* TEST_ADDR = TEST_ADDR + PROBE_INTERVAL.  */
5152   xops[0] = reg1;
5153   xops[1] = GEN_INT (-PROBE_INTERVAL);
5154   output_asm_insn ("add\t%0, %1, %0", xops);
5155
5156   /* Test if TEST_ADDR == LAST_ADDR.  */
5157   xops[1] = reg2;
5158   output_asm_insn ("cmp\t%0, %1", xops);
5159
5160   /* Probe at TEST_ADDR and branch.  */
5161   if (TARGET_ARCH64)
5162     fputs ("\tbne,pt\t%xcc,", asm_out_file);
5163   else
5164     fputs ("\tbne\t", asm_out_file);
5165   assemble_name_raw (asm_out_file, loop_lab);
5166   fputc ('\n', asm_out_file);
5167   xops[1] = GEN_INT (SPARC_STACK_BIAS);
5168   output_asm_insn (" st\t%%g0, [%0+%1]", xops);
5169
5170   return "";
5171 }
5172
5173 /* Emit code to save/restore registers from LOW to HIGH at BASE+OFFSET as
5174    needed.  LOW is supposed to be double-word aligned for 32-bit registers.
5175    SAVE_P decides whether a register must be saved/restored.  ACTION_TRUE
5176    is the action to be performed if SAVE_P returns true and ACTION_FALSE
5177    the action to be performed if it returns false.  Return the new offset.  */
5178
5179 typedef bool (*sorr_pred_t) (unsigned int, int);
5180 typedef enum { SORR_NONE, SORR_ADVANCE, SORR_SAVE, SORR_RESTORE } sorr_act_t;
5181
5182 static int
5183 emit_save_or_restore_regs (unsigned int low, unsigned int high, rtx base,
5184                            int offset, int leaf_function, sorr_pred_t save_p,
5185                            sorr_act_t action_true, sorr_act_t action_false)
5186 {
5187   unsigned int i;
5188   rtx mem;
5189   rtx_insn *insn;
5190
5191   if (TARGET_ARCH64 && high <= 32)
5192     {
5193       int fp_offset = -1;
5194
5195       for (i = low; i < high; i++)
5196         {
5197           if (save_p (i, leaf_function))
5198             {
5199               mem = gen_frame_mem (DImode, plus_constant (Pmode,
5200                                                           base, offset));
5201               if (action_true == SORR_SAVE)
5202                 {
5203                   insn = emit_move_insn (mem, gen_rtx_REG (DImode, i));
5204                   RTX_FRAME_RELATED_P (insn) = 1;
5205                 }
5206               else  /* action_true == SORR_RESTORE */
5207                 {
5208                   /* The frame pointer must be restored last since its old
5209                      value may be used as base address for the frame.  This
5210                      is problematic in 64-bit mode only because of the lack
5211                      of double-word load instruction.  */
5212                   if (i == HARD_FRAME_POINTER_REGNUM)
5213                     fp_offset = offset;
5214                   else
5215                     emit_move_insn (gen_rtx_REG (DImode, i), mem);
5216                 }
5217               offset += 8;
5218             }
5219           else if (action_false == SORR_ADVANCE)
5220             offset += 8;
5221         }
5222
5223       if (fp_offset >= 0)
5224         {
5225           mem = gen_frame_mem (DImode, plus_constant (Pmode, base, fp_offset));
5226           emit_move_insn (hard_frame_pointer_rtx, mem);
5227         }
5228     }
5229   else
5230     {
5231       for (i = low; i < high; i += 2)
5232         {
5233           bool reg0 = save_p (i, leaf_function);
5234           bool reg1 = save_p (i + 1, leaf_function);
5235           machine_mode mode;
5236           int regno;
5237
5238           if (reg0 && reg1)
5239             {
5240               mode = SPARC_INT_REG_P (i) ? DImode : DFmode;
5241               regno = i;
5242             }
5243           else if (reg0)
5244             {
5245               mode = SPARC_INT_REG_P (i) ? SImode : SFmode;
5246               regno = i;
5247             }
5248           else if (reg1)
5249             {
5250               mode = SPARC_INT_REG_P (i) ? SImode : SFmode;
5251               regno = i + 1;
5252               offset += 4;
5253             }
5254           else
5255             {
5256               if (action_false == SORR_ADVANCE)
5257                 offset += 8;
5258               continue;
5259             }
5260
5261           mem = gen_frame_mem (mode, plus_constant (Pmode, base, offset));
5262           if (action_true == SORR_SAVE)
5263             {
5264               insn = emit_move_insn (mem, gen_rtx_REG (mode, regno));
5265               RTX_FRAME_RELATED_P (insn) = 1;
5266               if (mode == DImode)
5267                 {
5268                   rtx set1, set2;
5269                   mem = gen_frame_mem (SImode, plus_constant (Pmode, base,
5270                                                               offset));
5271                   set1 = gen_rtx_SET (mem, gen_rtx_REG (SImode, regno));
5272                   RTX_FRAME_RELATED_P (set1) = 1;
5273                   mem
5274                     = gen_frame_mem (SImode, plus_constant (Pmode, base,
5275                                                             offset + 4));
5276                   set2 = gen_rtx_SET (mem, gen_rtx_REG (SImode, regno + 1));
5277                   RTX_FRAME_RELATED_P (set2) = 1;
5278                   add_reg_note (insn, REG_FRAME_RELATED_EXPR,
5279                                 gen_rtx_PARALLEL (VOIDmode,
5280                                                   gen_rtvec (2, set1, set2)));
5281                 }
5282             }
5283           else  /* action_true == SORR_RESTORE */
5284             emit_move_insn (gen_rtx_REG (mode, regno), mem);
5285
5286           /* Bump and round down to double word
5287              in case we already bumped by 4.  */
5288           offset = ROUND_DOWN (offset + 8, 8);
5289         }
5290     }
5291
5292   return offset;
5293 }
5294
5295 /* Emit code to adjust BASE to OFFSET.  Return the new base.  */
5296
5297 static rtx
5298 emit_adjust_base_to_offset (rtx base, int offset)
5299 {
5300   /* ??? This might be optimized a little as %g1 might already have a
5301      value close enough that a single add insn will do.  */
5302   /* ??? Although, all of this is probably only a temporary fix because
5303      if %g1 can hold a function result, then sparc_expand_epilogue will
5304      lose (the result will be clobbered).  */
5305   rtx new_base = gen_rtx_REG (Pmode, 1);
5306   emit_move_insn (new_base, GEN_INT (offset));
5307   emit_insn (gen_rtx_SET (new_base, gen_rtx_PLUS (Pmode, base, new_base)));
5308   return new_base;
5309 }
5310
5311 /* Emit code to save/restore call-saved global and FP registers.  */
5312
5313 static void
5314 emit_save_or_restore_global_fp_regs (rtx base, int offset, sorr_act_t action)
5315 {
5316   if (offset < -4096 || offset + sparc_n_global_fp_regs * 4 > 4095)
5317     {
5318       base = emit_adjust_base_to_offset  (base, offset);
5319       offset = 0;
5320     }
5321
5322   offset
5323     = emit_save_or_restore_regs (0, 8, base, offset, 0,
5324                                  save_global_or_fp_reg_p, action, SORR_NONE);
5325   emit_save_or_restore_regs (32, TARGET_V9 ? 96 : 64, base, offset, 0,
5326                              save_global_or_fp_reg_p, action, SORR_NONE);
5327 }
5328
5329 /* Emit code to save/restore call-saved local and in registers.  */
5330
5331 static void
5332 emit_save_or_restore_local_in_regs (rtx base, int offset, sorr_act_t action)
5333 {
5334   if (offset < -4096 || offset + 16 * UNITS_PER_WORD > 4095)
5335     {
5336       base = emit_adjust_base_to_offset  (base, offset);
5337       offset = 0;
5338     }
5339
5340   emit_save_or_restore_regs (16, 32, base, offset, sparc_leaf_function_p,
5341                              save_local_or_in_reg_p, action, SORR_ADVANCE);
5342 }
5343
5344 /* Emit a window_save insn.  */
5345
5346 static rtx_insn *
5347 emit_window_save (rtx increment)
5348 {
5349   rtx_insn *insn = emit_insn (gen_window_save (increment));
5350   RTX_FRAME_RELATED_P (insn) = 1;
5351
5352   /* The incoming return address (%o7) is saved in %i7.  */
5353   add_reg_note (insn, REG_CFA_REGISTER,
5354                 gen_rtx_SET (gen_rtx_REG (Pmode, RETURN_ADDR_REGNUM),
5355                              gen_rtx_REG (Pmode,
5356                                           INCOMING_RETURN_ADDR_REGNUM)));
5357
5358   /* The window save event.  */
5359   add_reg_note (insn, REG_CFA_WINDOW_SAVE, const0_rtx);
5360
5361   /* The CFA is %fp, the hard frame pointer.  */
5362   add_reg_note (insn, REG_CFA_DEF_CFA,
5363                 plus_constant (Pmode, hard_frame_pointer_rtx,
5364                                INCOMING_FRAME_SP_OFFSET));
5365
5366   return insn;
5367 }
5368
5369 /* Generate an increment for the stack pointer.  */
5370
5371 static rtx
5372 gen_stack_pointer_inc (rtx increment)
5373 {
5374   return gen_rtx_SET (stack_pointer_rtx,
5375                       gen_rtx_PLUS (Pmode,
5376                                     stack_pointer_rtx,
5377                                     increment));
5378 }
5379
5380 /* Expand the function prologue.  The prologue is responsible for reserving
5381    storage for the frame, saving the call-saved registers and loading the
5382    GOT register if needed.  */
5383
5384 void
5385 sparc_expand_prologue (void)
5386 {
5387   HOST_WIDE_INT size;
5388   rtx_insn *insn;
5389
5390   /* Compute a snapshot of crtl->uses_only_leaf_regs.  Relying
5391      on the final value of the flag means deferring the prologue/epilogue
5392      expansion until just before the second scheduling pass, which is too
5393      late to emit multiple epilogues or return insns.
5394
5395      Of course we are making the assumption that the value of the flag
5396      will not change between now and its final value.  Of the three parts
5397      of the formula, only the last one can reasonably vary.  Let's take a
5398      closer look, after assuming that the first two ones are set to true
5399      (otherwise the last value is effectively silenced).
5400
5401      If only_leaf_regs_used returns false, the global predicate will also
5402      be false so the actual frame size calculated below will be positive.
5403      As a consequence, the save_register_window insn will be emitted in
5404      the instruction stream; now this insn explicitly references %fp
5405      which is not a leaf register so only_leaf_regs_used will always
5406      return false subsequently.
5407
5408      If only_leaf_regs_used returns true, we hope that the subsequent
5409      optimization passes won't cause non-leaf registers to pop up.  For
5410      example, the regrename pass has special provisions to not rename to
5411      non-leaf registers in a leaf function.  */
5412   sparc_leaf_function_p
5413     = optimize > 0 && crtl->is_leaf && only_leaf_regs_used ();
5414
5415   size = sparc_compute_frame_size (get_frame_size(), sparc_leaf_function_p);
5416
5417   if (flag_stack_usage_info)
5418     current_function_static_stack_size = size;
5419
5420   if (flag_stack_check == STATIC_BUILTIN_STACK_CHECK)
5421     {
5422       if (crtl->is_leaf && !cfun->calls_alloca)
5423         {
5424           if (size > PROBE_INTERVAL && size > STACK_CHECK_PROTECT)
5425             sparc_emit_probe_stack_range (STACK_CHECK_PROTECT,
5426                                           size - STACK_CHECK_PROTECT);
5427         }
5428       else if (size > 0)
5429         sparc_emit_probe_stack_range (STACK_CHECK_PROTECT, size);
5430     }
5431
5432   if (size == 0)
5433     ; /* do nothing.  */
5434   else if (sparc_leaf_function_p)
5435     {
5436       rtx size_int_rtx = GEN_INT (-size);
5437
5438       if (size <= 4096)
5439         insn = emit_insn (gen_stack_pointer_inc (size_int_rtx));
5440       else if (size <= 8192)
5441         {
5442           insn = emit_insn (gen_stack_pointer_inc (GEN_INT (-4096)));
5443           RTX_FRAME_RELATED_P (insn) = 1;
5444
5445           /* %sp is still the CFA register.  */
5446           insn = emit_insn (gen_stack_pointer_inc (GEN_INT (4096 - size)));
5447         }
5448       else
5449         {
5450           rtx size_rtx = gen_rtx_REG (Pmode, 1);
5451           emit_move_insn (size_rtx, size_int_rtx);
5452           insn = emit_insn (gen_stack_pointer_inc (size_rtx));
5453           add_reg_note (insn, REG_FRAME_RELATED_EXPR,
5454                         gen_stack_pointer_inc (size_int_rtx));
5455         }
5456
5457       RTX_FRAME_RELATED_P (insn) = 1;
5458     }
5459   else
5460     {
5461       rtx size_int_rtx = GEN_INT (-size);
5462
5463       if (size <= 4096)
5464         emit_window_save (size_int_rtx);
5465       else if (size <= 8192)
5466         {
5467           emit_window_save (GEN_INT (-4096));
5468
5469           /* %sp is not the CFA register anymore.  */
5470           emit_insn (gen_stack_pointer_inc (GEN_INT (4096 - size)));
5471
5472           /* Make sure no %fp-based store is issued until after the frame is
5473              established.  The offset between the frame pointer and the stack
5474              pointer is calculated relative to the value of the stack pointer
5475              at the end of the function prologue, and moving instructions that
5476              access the stack via the frame pointer between the instructions
5477              that decrement the stack pointer could result in accessing the
5478              register window save area, which is volatile.  */
5479           emit_insn (gen_frame_blockage ());
5480         }
5481       else
5482         {
5483           rtx size_rtx = gen_rtx_REG (Pmode, 1);
5484           emit_move_insn (size_rtx, size_int_rtx);
5485           emit_window_save (size_rtx);
5486         }
5487     }
5488
5489   if (sparc_leaf_function_p)
5490     {
5491       sparc_frame_base_reg = stack_pointer_rtx;
5492       sparc_frame_base_offset = size + SPARC_STACK_BIAS;
5493     }
5494   else
5495     {
5496       sparc_frame_base_reg = hard_frame_pointer_rtx;
5497       sparc_frame_base_offset = SPARC_STACK_BIAS;
5498     }
5499
5500   if (sparc_n_global_fp_regs > 0)
5501     emit_save_or_restore_global_fp_regs (sparc_frame_base_reg,
5502                                          sparc_frame_base_offset
5503                                            - sparc_apparent_frame_size,
5504                                          SORR_SAVE);
5505
5506   /* Load the GOT register if needed.  */
5507   if (crtl->uses_pic_offset_table)
5508     load_got_register ();
5509
5510   /* Advertise that the data calculated just above are now valid.  */
5511   sparc_prologue_data_valid_p = true;
5512 }
5513
5514 /* Expand the function prologue.  The prologue is responsible for reserving
5515    storage for the frame, saving the call-saved registers and loading the
5516    GOT register if needed.  */
5517
5518 void
5519 sparc_flat_expand_prologue (void)
5520 {
5521   HOST_WIDE_INT size;
5522   rtx_insn *insn;
5523
5524   sparc_leaf_function_p = optimize > 0 && crtl->is_leaf;
5525
5526   size = sparc_compute_frame_size (get_frame_size(), sparc_leaf_function_p);
5527
5528   if (flag_stack_usage_info)
5529     current_function_static_stack_size = size;
5530
5531   if (flag_stack_check == STATIC_BUILTIN_STACK_CHECK)
5532     {
5533       if (crtl->is_leaf && !cfun->calls_alloca)
5534         {
5535           if (size > PROBE_INTERVAL && size > STACK_CHECK_PROTECT)
5536             sparc_emit_probe_stack_range (STACK_CHECK_PROTECT,
5537                                           size - STACK_CHECK_PROTECT);
5538         }
5539       else if (size > 0)
5540         sparc_emit_probe_stack_range (STACK_CHECK_PROTECT, size);
5541     }
5542
5543   if (sparc_save_local_in_regs_p)
5544     emit_save_or_restore_local_in_regs (stack_pointer_rtx, SPARC_STACK_BIAS,
5545                                         SORR_SAVE);
5546
5547   if (size == 0)
5548     ; /* do nothing.  */
5549   else
5550     {
5551       rtx size_int_rtx, size_rtx;
5552
5553       size_rtx = size_int_rtx = GEN_INT (-size);
5554
5555       /* We establish the frame (i.e. decrement the stack pointer) first, even
5556          if we use a frame pointer, because we cannot clobber any call-saved
5557          registers, including the frame pointer, if we haven't created a new
5558          register save area, for the sake of compatibility with the ABI.  */
5559       if (size <= 4096)
5560         insn = emit_insn (gen_stack_pointer_inc (size_int_rtx));
5561       else if (size <= 8192 && !frame_pointer_needed)
5562         {
5563           insn = emit_insn (gen_stack_pointer_inc (GEN_INT (-4096)));
5564           RTX_FRAME_RELATED_P (insn) = 1;
5565           insn = emit_insn (gen_stack_pointer_inc (GEN_INT (4096 - size)));
5566         }
5567       else
5568         {
5569           size_rtx = gen_rtx_REG (Pmode, 1);
5570           emit_move_insn (size_rtx, size_int_rtx);
5571           insn = emit_insn (gen_stack_pointer_inc (size_rtx));
5572           add_reg_note (insn, REG_CFA_ADJUST_CFA,
5573                         gen_stack_pointer_inc (size_int_rtx));
5574         }
5575       RTX_FRAME_RELATED_P (insn) = 1;
5576
5577       /* Ensure nothing is scheduled until after the frame is established.  */
5578       emit_insn (gen_blockage ());
5579
5580       if (frame_pointer_needed)
5581         {
5582           insn = emit_insn (gen_rtx_SET (hard_frame_pointer_rtx,
5583                                          gen_rtx_MINUS (Pmode,
5584                                                         stack_pointer_rtx,
5585                                                         size_rtx)));
5586           RTX_FRAME_RELATED_P (insn) = 1;
5587
5588           add_reg_note (insn, REG_CFA_ADJUST_CFA,
5589                         gen_rtx_SET (hard_frame_pointer_rtx,
5590                                      plus_constant (Pmode, stack_pointer_rtx,
5591                                                     size)));
5592         }
5593
5594       if (return_addr_reg_needed_p (sparc_leaf_function_p))
5595         {
5596           rtx o7 = gen_rtx_REG (Pmode, INCOMING_RETURN_ADDR_REGNUM);
5597           rtx i7 = gen_rtx_REG (Pmode, RETURN_ADDR_REGNUM);
5598
5599           insn = emit_move_insn (i7, o7);
5600           RTX_FRAME_RELATED_P (insn) = 1;
5601
5602           add_reg_note (insn, REG_CFA_REGISTER, gen_rtx_SET (i7, o7));
5603
5604           /* Prevent this instruction from ever being considered dead,
5605              even if this function has no epilogue.  */
5606           emit_use (i7);
5607         }
5608     }
5609
5610   if (frame_pointer_needed)
5611     {
5612       sparc_frame_base_reg = hard_frame_pointer_rtx;
5613       sparc_frame_base_offset = SPARC_STACK_BIAS;
5614     }
5615   else
5616     {
5617       sparc_frame_base_reg = stack_pointer_rtx;
5618       sparc_frame_base_offset = size + SPARC_STACK_BIAS;
5619     }
5620
5621   if (sparc_n_global_fp_regs > 0)
5622     emit_save_or_restore_global_fp_regs (sparc_frame_base_reg,
5623                                          sparc_frame_base_offset
5624                                            - sparc_apparent_frame_size,
5625                                          SORR_SAVE);
5626
5627   /* Load the GOT register if needed.  */
5628   if (crtl->uses_pic_offset_table)
5629     load_got_register ();
5630
5631   /* Advertise that the data calculated just above are now valid.  */
5632   sparc_prologue_data_valid_p = true;
5633 }
5634
5635 /* This function generates the assembly code for function entry, which boils
5636    down to emitting the necessary .register directives.  */
5637
5638 static void
5639 sparc_asm_function_prologue (FILE *file, HOST_WIDE_INT size ATTRIBUTE_UNUSED)
5640 {
5641   /* Check that the assumption we made in sparc_expand_prologue is valid.  */
5642   if (!TARGET_FLAT)
5643     gcc_assert (sparc_leaf_function_p == crtl->uses_only_leaf_regs);
5644
5645   sparc_output_scratch_registers (file);
5646 }
5647
5648 /* Expand the function epilogue, either normal or part of a sibcall.
5649    We emit all the instructions except the return or the call.  */
5650
5651 void
5652 sparc_expand_epilogue (bool for_eh)
5653 {
5654   HOST_WIDE_INT size = sparc_frame_size;
5655
5656   if (sparc_n_global_fp_regs > 0)
5657     emit_save_or_restore_global_fp_regs (sparc_frame_base_reg,
5658                                          sparc_frame_base_offset
5659                                            - sparc_apparent_frame_size,
5660                                          SORR_RESTORE);
5661
5662   if (size == 0 || for_eh)
5663     ; /* do nothing.  */
5664   else if (sparc_leaf_function_p)
5665     {
5666       if (size <= 4096)
5667         emit_insn (gen_stack_pointer_inc (GEN_INT (size)));
5668       else if (size <= 8192)
5669         {
5670           emit_insn (gen_stack_pointer_inc (GEN_INT (4096)));
5671           emit_insn (gen_stack_pointer_inc (GEN_INT (size - 4096)));
5672         }
5673       else
5674         {
5675           rtx reg = gen_rtx_REG (Pmode, 1);
5676           emit_move_insn (reg, GEN_INT (size));
5677           emit_insn (gen_stack_pointer_inc (reg));
5678         }
5679     }
5680 }
5681
5682 /* Expand the function epilogue, either normal or part of a sibcall.
5683    We emit all the instructions except the return or the call.  */
5684
5685 void
5686 sparc_flat_expand_epilogue (bool for_eh)
5687 {
5688   HOST_WIDE_INT size = sparc_frame_size;
5689
5690   if (sparc_n_global_fp_regs > 0)
5691     emit_save_or_restore_global_fp_regs (sparc_frame_base_reg,
5692                                          sparc_frame_base_offset
5693                                            - sparc_apparent_frame_size,
5694                                          SORR_RESTORE);
5695
5696   /* If we have a frame pointer, we'll need both to restore it before the
5697      frame is destroyed and use its current value in destroying the frame.
5698      Since we don't have an atomic way to do that in the flat window model,
5699      we save the current value into a temporary register (%g1).  */
5700   if (frame_pointer_needed && !for_eh)
5701     emit_move_insn (gen_rtx_REG (Pmode, 1), hard_frame_pointer_rtx);
5702
5703   if (return_addr_reg_needed_p (sparc_leaf_function_p))
5704     emit_move_insn (gen_rtx_REG (Pmode, INCOMING_RETURN_ADDR_REGNUM),
5705                     gen_rtx_REG (Pmode, RETURN_ADDR_REGNUM));
5706
5707   if (sparc_save_local_in_regs_p)
5708     emit_save_or_restore_local_in_regs (sparc_frame_base_reg,
5709                                         sparc_frame_base_offset,
5710                                         SORR_RESTORE);
5711
5712   if (size == 0 || for_eh)
5713     ; /* do nothing.  */
5714   else if (frame_pointer_needed)
5715     {
5716       /* Make sure the frame is destroyed after everything else is done.  */
5717       emit_insn (gen_blockage ());
5718
5719       emit_move_insn (stack_pointer_rtx, gen_rtx_REG (Pmode, 1));
5720     }
5721   else
5722     {
5723       /* Likewise.  */
5724       emit_insn (gen_blockage ());
5725
5726       if (size <= 4096)
5727         emit_insn (gen_stack_pointer_inc (GEN_INT (size)));
5728       else if (size <= 8192)
5729         {
5730           emit_insn (gen_stack_pointer_inc (GEN_INT (4096)));
5731           emit_insn (gen_stack_pointer_inc (GEN_INT (size - 4096)));
5732         }
5733       else
5734         {
5735           rtx reg = gen_rtx_REG (Pmode, 1);
5736           emit_move_insn (reg, GEN_INT (size));
5737           emit_insn (gen_stack_pointer_inc (reg));
5738         }
5739     }
5740 }
5741
5742 /* Return true if it is appropriate to emit `return' instructions in the
5743    body of a function.  */
5744
5745 bool
5746 sparc_can_use_return_insn_p (void)
5747 {
5748   return sparc_prologue_data_valid_p
5749          && sparc_n_global_fp_regs == 0
5750          && TARGET_FLAT
5751             ? (sparc_frame_size == 0 && !sparc_save_local_in_regs_p)
5752             : (sparc_frame_size == 0 || !sparc_leaf_function_p);
5753 }
5754
5755 /* This function generates the assembly code for function exit.  */
5756
5757 static void
5758 sparc_asm_function_epilogue (FILE *file, HOST_WIDE_INT size ATTRIBUTE_UNUSED)
5759 {
5760   /* If the last two instructions of a function are "call foo; dslot;"
5761      the return address might point to the first instruction in the next
5762      function and we have to output a dummy nop for the sake of sane
5763      backtraces in such cases.  This is pointless for sibling calls since
5764      the return address is explicitly adjusted.  */
5765
5766   rtx insn, last_real_insn;
5767
5768   insn = get_last_insn ();
5769
5770   last_real_insn = prev_real_insn (insn);
5771   if (last_real_insn
5772       && NONJUMP_INSN_P (last_real_insn)
5773       && GET_CODE (PATTERN (last_real_insn)) == SEQUENCE)
5774     last_real_insn = XVECEXP (PATTERN (last_real_insn), 0, 0);
5775
5776   if (last_real_insn
5777       && CALL_P (last_real_insn)
5778       && !SIBLING_CALL_P (last_real_insn))
5779     fputs("\tnop\n", file);
5780
5781   sparc_output_deferred_case_vectors ();
5782 }
5783
5784 /* Output a 'restore' instruction.  */
5785
5786 static void
5787 output_restore (rtx pat)
5788 {
5789   rtx operands[3];
5790
5791   if (! pat)
5792     {
5793       fputs ("\t restore\n", asm_out_file);
5794       return;
5795     }
5796
5797   gcc_assert (GET_CODE (pat) == SET);
5798
5799   operands[0] = SET_DEST (pat);
5800   pat = SET_SRC (pat);
5801
5802   switch (GET_CODE (pat))
5803     {
5804       case PLUS:
5805         operands[1] = XEXP (pat, 0);
5806         operands[2] = XEXP (pat, 1);
5807         output_asm_insn (" restore %r1, %2, %Y0", operands);
5808         break;
5809       case LO_SUM:
5810         operands[1] = XEXP (pat, 0);
5811         operands[2] = XEXP (pat, 1);
5812         output_asm_insn (" restore %r1, %%lo(%a2), %Y0", operands);
5813         break;
5814       case ASHIFT:
5815         operands[1] = XEXP (pat, 0);
5816         gcc_assert (XEXP (pat, 1) == const1_rtx);
5817         output_asm_insn (" restore %r1, %r1, %Y0", operands);
5818         break;
5819       default:
5820         operands[1] = pat;
5821         output_asm_insn (" restore %%g0, %1, %Y0", operands);
5822         break;
5823     }
5824 }
5825
5826 /* Output a return.  */
5827
5828 const char *
5829 output_return (rtx_insn *insn)
5830 {
5831   if (crtl->calls_eh_return)
5832     {
5833       /* If the function uses __builtin_eh_return, the eh_return
5834          machinery occupies the delay slot.  */
5835       gcc_assert (!final_sequence);
5836
5837       if (flag_delayed_branch)
5838         {
5839           if (!TARGET_FLAT && TARGET_V9)
5840             fputs ("\treturn\t%i7+8\n", asm_out_file);
5841           else
5842             {
5843               if (!TARGET_FLAT)
5844                 fputs ("\trestore\n", asm_out_file);
5845
5846               fputs ("\tjmp\t%o7+8\n", asm_out_file);
5847             }
5848
5849           fputs ("\t add\t%sp, %g1, %sp\n", asm_out_file);
5850         }
5851       else
5852         {
5853           if (!TARGET_FLAT)
5854             fputs ("\trestore\n", asm_out_file);
5855
5856           fputs ("\tadd\t%sp, %g1, %sp\n", asm_out_file);
5857           fputs ("\tjmp\t%o7+8\n\t nop\n", asm_out_file);
5858         }
5859     }
5860   else if (sparc_leaf_function_p || TARGET_FLAT)
5861     {
5862       /* This is a leaf or flat function so we don't have to bother restoring
5863          the register window, which frees us from dealing with the convoluted
5864          semantics of restore/return.  We simply output the jump to the
5865          return address and the insn in the delay slot (if any).  */
5866
5867       return "jmp\t%%o7+%)%#";
5868     }
5869   else
5870     {
5871       /* This is a regular function so we have to restore the register window.
5872          We may have a pending insn for the delay slot, which will be either
5873          combined with the 'restore' instruction or put in the delay slot of
5874          the 'return' instruction.  */
5875
5876       if (final_sequence)
5877         {
5878           rtx delay, pat;
5879
5880           delay = NEXT_INSN (insn);
5881           gcc_assert (delay);
5882
5883           pat = PATTERN (delay);
5884
5885           if (TARGET_V9 && ! epilogue_renumber (&pat, 1))
5886             {
5887               epilogue_renumber (&pat, 0);
5888               return "return\t%%i7+%)%#";
5889             }
5890           else
5891             {
5892               output_asm_insn ("jmp\t%%i7+%)", NULL);
5893               output_restore (pat);
5894               PATTERN (delay) = gen_blockage ();
5895               INSN_CODE (delay) = -1;
5896             }
5897         }
5898       else
5899         {
5900           /* The delay slot is empty.  */
5901           if (TARGET_V9)
5902             return "return\t%%i7+%)\n\t nop";
5903           else if (flag_delayed_branch)
5904             return "jmp\t%%i7+%)\n\t restore";
5905           else
5906             return "restore\n\tjmp\t%%o7+%)\n\t nop";
5907         }
5908     }
5909
5910   return "";
5911 }
5912
5913 /* Output a sibling call.  */
5914
5915 const char *
5916 output_sibcall (rtx_insn *insn, rtx call_operand)
5917 {
5918   rtx operands[1];
5919
5920   gcc_assert (flag_delayed_branch);
5921
5922   operands[0] = call_operand;
5923
5924   if (sparc_leaf_function_p || TARGET_FLAT)
5925     {
5926       /* This is a leaf or flat function so we don't have to bother restoring
5927          the register window.  We simply output the jump to the function and
5928          the insn in the delay slot (if any).  */
5929
5930       gcc_assert (!(LEAF_SIBCALL_SLOT_RESERVED_P && final_sequence));
5931
5932       if (final_sequence)
5933         output_asm_insn ("sethi\t%%hi(%a0), %%g1\n\tjmp\t%%g1 + %%lo(%a0)%#",
5934                          operands);
5935       else
5936         /* Use or with rs2 %%g0 instead of mov, so that as/ld can optimize
5937            it into branch if possible.  */
5938         output_asm_insn ("or\t%%o7, %%g0, %%g1\n\tcall\t%a0, 0\n\t or\t%%g1, %%g0, %%o7",
5939                          operands);
5940     }
5941   else
5942     {
5943       /* This is a regular function so we have to restore the register window.
5944          We may have a pending insn for the delay slot, which will be combined
5945          with the 'restore' instruction.  */
5946
5947       output_asm_insn ("call\t%a0, 0", operands);
5948
5949       if (final_sequence)
5950         {
5951           rtx_insn *delay = NEXT_INSN (insn);
5952           gcc_assert (delay);
5953
5954           output_restore (PATTERN (delay));
5955
5956           PATTERN (delay) = gen_blockage ();
5957           INSN_CODE (delay) = -1;
5958         }
5959       else
5960         output_restore (NULL_RTX);
5961     }
5962
5963   return "";
5964 }
5965 \f
5966 /* Functions for handling argument passing.
5967
5968    For 32-bit, the first 6 args are normally in registers and the rest are
5969    pushed.  Any arg that starts within the first 6 words is at least
5970    partially passed in a register unless its data type forbids.
5971
5972    For 64-bit, the argument registers are laid out as an array of 16 elements
5973    and arguments are added sequentially.  The first 6 int args and up to the
5974    first 16 fp args (depending on size) are passed in regs.
5975
5976    Slot    Stack   Integral   Float   Float in structure   Double   Long Double
5977    ----    -----   --------   -----   ------------------   ------   -----------
5978     15   [SP+248]              %f31       %f30,%f31         %d30
5979     14   [SP+240]              %f29       %f28,%f29         %d28       %q28
5980     13   [SP+232]              %f27       %f26,%f27         %d26
5981     12   [SP+224]              %f25       %f24,%f25         %d24       %q24
5982     11   [SP+216]              %f23       %f22,%f23         %d22
5983     10   [SP+208]              %f21       %f20,%f21         %d20       %q20
5984      9   [SP+200]              %f19       %f18,%f19         %d18
5985      8   [SP+192]              %f17       %f16,%f17         %d16       %q16
5986      7   [SP+184]              %f15       %f14,%f15         %d14
5987      6   [SP+176]              %f13       %f12,%f13         %d12       %q12
5988      5   [SP+168]     %o5      %f11       %f10,%f11         %d10
5989      4   [SP+160]     %o4       %f9        %f8,%f9           %d8        %q8
5990      3   [SP+152]     %o3       %f7        %f6,%f7           %d6
5991      2   [SP+144]     %o2       %f5        %f4,%f5           %d4        %q4
5992      1   [SP+136]     %o1       %f3        %f2,%f3           %d2
5993      0   [SP+128]     %o0       %f1        %f0,%f1           %d0        %q0
5994
5995    Here SP = %sp if -mno-stack-bias or %sp+stack_bias otherwise.
5996
5997    Integral arguments are always passed as 64-bit quantities appropriately
5998    extended.
5999
6000    Passing of floating point values is handled as follows.
6001    If a prototype is in scope:
6002      If the value is in a named argument (i.e. not a stdarg function or a
6003      value not part of the `...') then the value is passed in the appropriate
6004      fp reg.
6005      If the value is part of the `...' and is passed in one of the first 6
6006      slots then the value is passed in the appropriate int reg.
6007      If the value is part of the `...' and is not passed in one of the first 6
6008      slots then the value is passed in memory.
6009    If a prototype is not in scope:
6010      If the value is one of the first 6 arguments the value is passed in the
6011      appropriate integer reg and the appropriate fp reg.
6012      If the value is not one of the first 6 arguments the value is passed in
6013      the appropriate fp reg and in memory.
6014
6015
6016    Summary of the calling conventions implemented by GCC on the SPARC:
6017
6018    32-bit ABI:
6019                                 size      argument     return value
6020
6021       small integer              <4       int. reg.      int. reg.
6022       word                        4       int. reg.      int. reg.
6023       double word                 8       int. reg.      int. reg.
6024
6025       _Complex small integer     <8       int. reg.      int. reg.
6026       _Complex word               8       int. reg.      int. reg.
6027       _Complex double word       16        memory        int. reg.
6028
6029       vector integer            <=8       int. reg.       FP reg.
6030       vector integer             >8        memory         memory
6031
6032       float                       4       int. reg.       FP reg.
6033       double                      8       int. reg.       FP reg.
6034       long double                16        memory         memory
6035
6036       _Complex float              8        memory         FP reg.
6037       _Complex double            16        memory         FP reg.
6038       _Complex long double       32        memory         FP reg.
6039
6040       vector float              any        memory         memory
6041
6042       aggregate                 any        memory         memory
6043
6044
6045
6046     64-bit ABI:
6047                                 size      argument     return value
6048
6049       small integer              <8       int. reg.      int. reg.
6050       word                        8       int. reg.      int. reg.
6051       double word                16       int. reg.      int. reg.
6052
6053       _Complex small integer    <16       int. reg.      int. reg.
6054       _Complex word              16       int. reg.      int. reg.
6055       _Complex double word       32        memory        int. reg.
6056
6057       vector integer           <=16        FP reg.        FP reg.
6058       vector integer       16<s<=32        memory         FP reg.
6059       vector integer            >32        memory         memory
6060
6061       float                       4        FP reg.        FP reg.
6062       double                      8        FP reg.        FP reg.
6063       long double                16        FP reg.        FP reg.
6064
6065       _Complex float              8        FP reg.        FP reg.
6066       _Complex double            16        FP reg.        FP reg.
6067       _Complex long double       32        memory         FP reg.
6068
6069       vector float             <=16        FP reg.        FP reg.
6070       vector float         16<s<=32        memory         FP reg.
6071       vector float              >32        memory         memory
6072
6073       aggregate                <=16         reg.           reg.
6074       aggregate            16<s<=32        memory          reg.
6075       aggregate                 >32        memory         memory
6076
6077
6078
6079 Note #1: complex floating-point types follow the extended SPARC ABIs as
6080 implemented by the Sun compiler.
6081
6082 Note #2: integral vector types follow the scalar floating-point types
6083 conventions to match what is implemented by the Sun VIS SDK.
6084
6085 Note #3: floating-point vector types follow the aggregate types
6086 conventions.  */
6087
6088
6089 /* Maximum number of int regs for args.  */
6090 #define SPARC_INT_ARG_MAX 6
6091 /* Maximum number of fp regs for args.  */
6092 #define SPARC_FP_ARG_MAX 16
6093 /* Number of words (partially) occupied for a given size in units.  */
6094 #define CEIL_NWORDS(SIZE) CEIL((SIZE), UNITS_PER_WORD)
6095
6096 /* Handle the INIT_CUMULATIVE_ARGS macro.
6097    Initialize a variable CUM of type CUMULATIVE_ARGS
6098    for a call to a function whose data type is FNTYPE.
6099    For a library call, FNTYPE is 0.  */
6100
6101 void
6102 init_cumulative_args (struct sparc_args *cum, tree fntype, rtx, tree)
6103 {
6104   cum->words = 0;
6105   cum->prototype_p = fntype && prototype_p (fntype);
6106   cum->libcall_p = !fntype;
6107 }
6108
6109 /* Handle promotion of pointer and integer arguments.  */
6110
6111 static machine_mode
6112 sparc_promote_function_mode (const_tree type, machine_mode mode,
6113                              int *punsignedp, const_tree, int)
6114 {
6115   if (type && POINTER_TYPE_P (type))
6116     {
6117       *punsignedp = POINTERS_EXTEND_UNSIGNED;
6118       return Pmode;
6119     }
6120
6121   /* Integral arguments are passed as full words, as per the ABI.  */
6122   if (GET_MODE_CLASS (mode) == MODE_INT
6123       && GET_MODE_SIZE (mode) < UNITS_PER_WORD)
6124     return word_mode;
6125
6126   return mode;
6127 }
6128
6129 /* Handle the TARGET_STRICT_ARGUMENT_NAMING target hook.  */
6130
6131 static bool
6132 sparc_strict_argument_naming (cumulative_args_t ca ATTRIBUTE_UNUSED)
6133 {
6134   return TARGET_ARCH64 ? true : false;
6135 }
6136
6137 /* Traverse the record TYPE recursively and call FUNC on its fields.
6138    NAMED is true if this is for a named parameter.  DATA is passed
6139    to FUNC for each field.  OFFSET is the starting position and
6140    PACKED is true if we are inside a packed record.  */
6141
6142 template <typename T, void Func (const_tree, HOST_WIDE_INT, bool, T*)>
6143 static void
6144 traverse_record_type (const_tree type, bool named, T *data,
6145                       HOST_WIDE_INT offset = 0, bool packed = false)
6146 {
6147   /* The ABI obviously doesn't specify how packed structures are passed.
6148      These are passed in integer regs if possible, otherwise memory.  */
6149   if (!packed)
6150     for (tree field = TYPE_FIELDS (type); field; field = DECL_CHAIN (field))
6151       if (TREE_CODE (field) == FIELD_DECL && DECL_PACKED (field))
6152         {
6153           packed = true;
6154           break;
6155         }
6156
6157   /* Walk the real fields, but skip those with no size or a zero size.
6158      ??? Fields with variable offset are handled as having zero offset.  */
6159   for (tree field = TYPE_FIELDS (type); field; field = DECL_CHAIN (field))
6160     if (TREE_CODE (field) == FIELD_DECL)
6161       {
6162         if (!DECL_SIZE (field) || integer_zerop (DECL_SIZE (field)))
6163           continue;
6164
6165         HOST_WIDE_INT bitpos = offset;
6166         if (TREE_CODE (DECL_FIELD_OFFSET (field)) == INTEGER_CST)
6167           bitpos += int_bit_position (field);
6168
6169         tree field_type = TREE_TYPE (field);
6170         if (TREE_CODE (field_type) == RECORD_TYPE)
6171           traverse_record_type<T, Func> (field_type, named, data, bitpos,
6172                                          packed);
6173         else
6174           {
6175             const bool fp_type
6176               = FLOAT_TYPE_P (field_type) || VECTOR_TYPE_P (field_type);
6177             Func (field, bitpos, fp_type && named && !packed && TARGET_FPU,
6178                   data);
6179           }
6180       }
6181 }
6182
6183 /* Handle recursive register classifying for structure layout.  */
6184
6185 typedef struct
6186 {
6187   bool int_regs;        /* true if field eligible to int registers.  */
6188   bool fp_regs;         /* true if field eligible to FP registers.  */
6189   bool fp_regs_in_first_word;   /* true if such field in first word.  */
6190 } classify_data_t;
6191
6192 /* A subroutine of function_arg_slotno.  Classify the field.  */
6193
6194 inline void
6195 classify_registers (const_tree, HOST_WIDE_INT bitpos, bool fp,
6196                     classify_data_t *data)
6197 {
6198   if (fp)
6199     {
6200       data->fp_regs = true;
6201       if (bitpos < BITS_PER_WORD)
6202         data->fp_regs_in_first_word = true;
6203     }
6204   else
6205     data->int_regs = true;
6206 }
6207
6208 /* Compute the slot number to pass an argument in.
6209    Return the slot number or -1 if passing on the stack.
6210
6211    CUM is a variable of type CUMULATIVE_ARGS which gives info about
6212     the preceding args and about the function being called.
6213    MODE is the argument's machine mode.
6214    TYPE is the data type of the argument (as a tree).
6215     This is null for libcalls where that information may
6216     not be available.
6217    NAMED is nonzero if this argument is a named parameter
6218     (otherwise it is an extra parameter matching an ellipsis).
6219    INCOMING is zero for FUNCTION_ARG, nonzero for FUNCTION_INCOMING_ARG.
6220    *PREGNO records the register number to use if scalar type.
6221    *PPADDING records the amount of padding needed in words.  */
6222
6223 static int
6224 function_arg_slotno (const struct sparc_args *cum, machine_mode mode,
6225                      const_tree type, bool named, bool incoming,
6226                      int *pregno, int *ppadding)
6227 {
6228   int regbase = (incoming
6229                  ? SPARC_INCOMING_INT_ARG_FIRST
6230                  : SPARC_OUTGOING_INT_ARG_FIRST);
6231   int slotno = cum->words;
6232   enum mode_class mclass;
6233   int regno;
6234
6235   *ppadding = 0;
6236
6237   if (type && TREE_ADDRESSABLE (type))
6238     return -1;
6239
6240   if (TARGET_ARCH32
6241       && mode == BLKmode
6242       && type
6243       && TYPE_ALIGN (type) % PARM_BOUNDARY != 0)
6244     return -1;
6245
6246   /* For SPARC64, objects requiring 16-byte alignment get it.  */
6247   if (TARGET_ARCH64
6248       && (type ? TYPE_ALIGN (type) : GET_MODE_ALIGNMENT (mode)) >= 128
6249       && (slotno & 1) != 0)
6250     slotno++, *ppadding = 1;
6251
6252   mclass = GET_MODE_CLASS (mode);
6253   if (type && TREE_CODE (type) == VECTOR_TYPE)
6254     {
6255       /* Vector types deserve special treatment because they are
6256          polymorphic wrt their mode, depending upon whether VIS
6257          instructions are enabled.  */
6258       if (TREE_CODE (TREE_TYPE (type)) == REAL_TYPE)
6259         {
6260           /* The SPARC port defines no floating-point vector modes.  */
6261           gcc_assert (mode == BLKmode);
6262         }
6263       else
6264         {
6265           /* Integral vector types should either have a vector
6266              mode or an integral mode, because we are guaranteed
6267              by pass_by_reference that their size is not greater
6268              than 16 bytes and TImode is 16-byte wide.  */
6269           gcc_assert (mode != BLKmode);
6270
6271           /* Vector integers are handled like floats according to
6272              the Sun VIS SDK.  */
6273           mclass = MODE_FLOAT;
6274         }
6275     }
6276
6277   switch (mclass)
6278     {
6279     case MODE_FLOAT:
6280     case MODE_COMPLEX_FLOAT:
6281     case MODE_VECTOR_INT:
6282       if (TARGET_ARCH64 && TARGET_FPU && named)
6283         {
6284           /* If all arg slots are filled, then must pass on stack.  */
6285           if (slotno >= SPARC_FP_ARG_MAX)
6286             return -1;
6287
6288           regno = SPARC_FP_ARG_FIRST + slotno * 2;
6289           /* Arguments filling only one single FP register are
6290              right-justified in the outer double FP register.  */
6291           if (GET_MODE_SIZE (mode) <= 4)
6292             regno++;
6293           break;
6294         }
6295       /* fallthrough */
6296
6297     case MODE_INT:
6298     case MODE_COMPLEX_INT:
6299       /* If all arg slots are filled, then must pass on stack.  */
6300       if (slotno >= SPARC_INT_ARG_MAX)
6301         return -1;
6302
6303       regno = regbase + slotno;
6304       break;
6305
6306     case MODE_RANDOM:
6307       if (mode == VOIDmode)
6308         /* MODE is VOIDmode when generating the actual call.  */
6309         return -1;
6310
6311       gcc_assert (mode == BLKmode);
6312
6313       if (TARGET_ARCH32
6314           || !type
6315           || (TREE_CODE (type) != RECORD_TYPE
6316               && TREE_CODE (type) != VECTOR_TYPE))
6317         {
6318           /* If all arg slots are filled, then must pass on stack.  */
6319           if (slotno >= SPARC_INT_ARG_MAX)
6320             return -1;
6321
6322           regno = regbase + slotno;
6323         }
6324       else  /* TARGET_ARCH64 && type */
6325         {
6326           /* If all arg slots are filled, then must pass on stack.  */
6327           if (slotno >= SPARC_FP_ARG_MAX)
6328             return -1;
6329
6330           if (TREE_CODE (type) == RECORD_TYPE)
6331             {
6332               classify_data_t data = { false, false, false };
6333               traverse_record_type<classify_data_t, classify_registers>
6334                 (type, named, &data);
6335
6336               /* If all slots are filled except for the last one, but there
6337                  is no FP field in the first word, then must pass on stack.  */
6338               if (data.fp_regs
6339                   && !data.fp_regs_in_first_word
6340                   && slotno >= SPARC_FP_ARG_MAX - 1)
6341                 return -1;
6342
6343               /* If there are only int args and all int slots are filled,
6344                  then must pass on stack.  */
6345               if (!data.fp_regs
6346                   && data.int_regs
6347                   && slotno >= SPARC_INT_ARG_MAX)
6348                 return -1;
6349             }
6350
6351           /* PREGNO isn't set since both int and FP regs can be used.  */
6352           return slotno;
6353         }
6354       break;
6355
6356     default :
6357       gcc_unreachable ();
6358     }
6359
6360   *pregno = regno;
6361   return slotno;
6362 }
6363
6364 /* Handle recursive register counting/assigning for structure layout.  */
6365
6366 typedef struct
6367 {
6368   int slotno;           /* slot number of the argument.  */
6369   int regbase;          /* regno of the base register.  */
6370   int intoffset;        /* offset of the first pending integer field.  */
6371   int nregs;            /* number of words passed in registers.  */
6372   bool stack;           /* true if part of the argument is on the stack.  */
6373   rtx ret;              /* return expression being built.  */
6374 } assign_data_t;
6375
6376 /* A subroutine of function_arg_record_value.  Compute the number of integer
6377    registers to be assigned between PARMS->intoffset and BITPOS.  Return
6378    true if at least one integer register is assigned or false otherwise.  */
6379
6380 static bool
6381 compute_int_layout (HOST_WIDE_INT bitpos, assign_data_t *data, int *pnregs)
6382 {
6383   if (data->intoffset < 0)
6384     return false;
6385
6386   const int intoffset = data->intoffset;
6387   data->intoffset = -1;
6388
6389   const int this_slotno = data->slotno + intoffset / BITS_PER_WORD;
6390   const unsigned int startbit = ROUND_DOWN (intoffset, BITS_PER_WORD);
6391   const unsigned int endbit = ROUND_UP (bitpos, BITS_PER_WORD);
6392   int nregs = (endbit - startbit) / BITS_PER_WORD;
6393
6394   if (nregs > 0 && nregs > SPARC_INT_ARG_MAX - this_slotno)
6395     {
6396       nregs = SPARC_INT_ARG_MAX - this_slotno;
6397
6398       /* We need to pass this field (partly) on the stack.  */
6399       data->stack = 1;
6400     }
6401
6402   if (nregs <= 0)
6403     return false;
6404
6405   *pnregs = nregs;
6406   return true;
6407 }
6408
6409 /* A subroutine of function_arg_record_value.  Compute the number and the mode
6410    of the FP registers to be assigned for FIELD.  Return true if at least one
6411    FP register is assigned or false otherwise.  */
6412
6413 static bool
6414 compute_fp_layout (const_tree field, HOST_WIDE_INT bitpos,
6415                    assign_data_t *data,
6416                    int *pnregs, machine_mode *pmode)
6417 {
6418   const int this_slotno = data->slotno + bitpos / BITS_PER_WORD;
6419   machine_mode mode = DECL_MODE (field);
6420   int nregs, nslots;
6421
6422   /* Slots are counted as words while regs are counted as having the size of
6423      the (inner) mode.  */
6424   if (TREE_CODE (TREE_TYPE (field)) == VECTOR_TYPE && mode == BLKmode)
6425     {
6426       mode = TYPE_MODE (TREE_TYPE (TREE_TYPE (field)));
6427       nregs = TYPE_VECTOR_SUBPARTS (TREE_TYPE (field));
6428     }
6429   else if (TREE_CODE (TREE_TYPE (field)) == COMPLEX_TYPE)
6430     {
6431       mode = TYPE_MODE (TREE_TYPE (TREE_TYPE (field)));
6432       nregs = 2;
6433     }
6434   else
6435     nregs = 1;
6436
6437   nslots = CEIL_NWORDS (nregs * GET_MODE_SIZE (mode));
6438
6439   if (nslots > SPARC_FP_ARG_MAX - this_slotno)
6440     {
6441       nslots = SPARC_FP_ARG_MAX - this_slotno;
6442       nregs = (nslots * UNITS_PER_WORD) / GET_MODE_SIZE (mode);
6443
6444       /* We need to pass this field (partly) on the stack.  */
6445       data->stack = 1;
6446
6447       if (nregs <= 0)
6448         return false;
6449     }
6450
6451   *pnregs = nregs;
6452   *pmode = mode;
6453   return true;
6454 }
6455
6456 /* A subroutine of function_arg_record_value.  Count the number of registers
6457    to be assigned for FIELD and between PARMS->intoffset and BITPOS.  */
6458
6459 inline void
6460 count_registers (const_tree field, HOST_WIDE_INT bitpos, bool fp,
6461                  assign_data_t *data)
6462 {
6463   if (fp)
6464     {
6465       int nregs;
6466       machine_mode mode;
6467
6468       if (compute_int_layout (bitpos, data, &nregs))
6469         data->nregs += nregs;
6470
6471       if (compute_fp_layout (field, bitpos, data, &nregs, &mode))
6472         data->nregs += nregs;
6473     }
6474   else
6475     {
6476       if (data->intoffset < 0)
6477         data->intoffset = bitpos;
6478     }
6479 }
6480
6481 /* A subroutine of function_arg_record_value.  Assign the bits of the
6482    structure between PARMS->intoffset and BITPOS to integer registers.  */
6483
6484 static void
6485 assign_int_registers (HOST_WIDE_INT bitpos, assign_data_t *data)
6486 {
6487   int intoffset = data->intoffset;
6488   machine_mode mode;
6489   int nregs;
6490
6491   if (!compute_int_layout (bitpos, data, &nregs))
6492     return;
6493
6494   /* If this is the trailing part of a word, only load that much into
6495      the register.  Otherwise load the whole register.  Note that in
6496      the latter case we may pick up unwanted bits.  It's not a problem
6497      at the moment but may wish to revisit.  */
6498   if (intoffset % BITS_PER_WORD != 0)
6499     mode = smallest_mode_for_size (BITS_PER_WORD - intoffset % BITS_PER_WORD,
6500                                    MODE_INT);
6501   else
6502     mode = word_mode;
6503
6504   const int this_slotno = data->slotno + intoffset / BITS_PER_WORD;
6505   unsigned int regno = data->regbase + this_slotno;
6506   intoffset /= BITS_PER_UNIT;
6507
6508   do
6509     {
6510       rtx reg = gen_rtx_REG (mode, regno);
6511       XVECEXP (data->ret, 0, data->stack + data->nregs)
6512         = gen_rtx_EXPR_LIST (VOIDmode, reg, GEN_INT (intoffset));
6513       data->nregs += 1;
6514       mode = word_mode;
6515       regno += 1;
6516       intoffset = (intoffset | (UNITS_PER_WORD - 1)) + 1;
6517     }
6518   while (--nregs > 0);
6519 }
6520
6521 /* A subroutine of function_arg_record_value.  Assign FIELD at position
6522    BITPOS to FP registers.  */
6523
6524 static void
6525 assign_fp_registers (const_tree field, HOST_WIDE_INT bitpos,
6526                              assign_data_t *data)
6527 {
6528   int nregs;
6529   machine_mode mode;
6530
6531   if (!compute_fp_layout (field, bitpos, data, &nregs, &mode))
6532     return;
6533
6534   const int this_slotno = data->slotno + bitpos / BITS_PER_WORD;
6535   int regno = SPARC_FP_ARG_FIRST + this_slotno * 2;
6536   if (GET_MODE_SIZE (mode) <= 4 && (bitpos & 32) != 0)
6537     regno++;
6538   int pos = bitpos / BITS_PER_UNIT;
6539
6540   do
6541     {
6542       rtx reg = gen_rtx_REG (mode, regno);
6543       XVECEXP (data->ret, 0, data->stack + data->nregs)
6544         = gen_rtx_EXPR_LIST (VOIDmode, reg, GEN_INT (pos));
6545       data->nregs += 1;
6546       regno += GET_MODE_SIZE (mode) / 4;
6547       pos += GET_MODE_SIZE (mode);
6548     }
6549   while (--nregs > 0);
6550 }
6551
6552 /* A subroutine of function_arg_record_value.  Assign FIELD and the bits of
6553    the structure between PARMS->intoffset and BITPOS to registers.  */
6554
6555 inline void
6556 assign_registers (const_tree field, HOST_WIDE_INT bitpos, bool fp,
6557                   assign_data_t *data)
6558 {
6559   if (fp)
6560     {
6561       assign_int_registers (bitpos, data);
6562
6563       assign_fp_registers (field, bitpos, data);
6564     }
6565   else
6566     {
6567       if (data->intoffset < 0)
6568         data->intoffset = bitpos;
6569     }
6570 }
6571
6572 /* Used by function_arg and sparc_function_value_1 to implement the complex
6573    conventions of the 64-bit ABI for passing and returning structures.
6574    Return an expression valid as a return value for the FUNCTION_ARG
6575    and TARGET_FUNCTION_VALUE.
6576
6577    TYPE is the data type of the argument (as a tree).
6578     This is null for libcalls where that information may
6579     not be available.
6580    MODE is the argument's machine mode.
6581    SLOTNO is the index number of the argument's slot in the parameter array.
6582    NAMED is true if this argument is a named parameter
6583     (otherwise it is an extra parameter matching an ellipsis).
6584    REGBASE is the regno of the base register for the parameter array.  */
6585
6586 static rtx
6587 function_arg_record_value (const_tree type, machine_mode mode,
6588                            int slotno, bool named, int regbase)
6589 {
6590   HOST_WIDE_INT typesize = int_size_in_bytes (type);
6591   assign_data_t data;
6592   int nregs;
6593
6594   data.slotno = slotno;
6595   data.regbase = regbase;
6596
6597   /* Count how many registers we need.  */
6598   data.nregs = 0;
6599   data.intoffset = 0;
6600   data.stack = false;
6601   traverse_record_type<assign_data_t, count_registers> (type, named, &data);
6602
6603   /* Take into account pending integer fields.  */
6604   if (compute_int_layout (typesize * BITS_PER_UNIT, &data, &nregs))
6605     data.nregs += nregs;
6606
6607   /* Allocate the vector and handle some annoying special cases.  */
6608   nregs = data.nregs;
6609
6610   if (nregs == 0)
6611     {
6612       /* ??? Empty structure has no value?  Duh?  */
6613       if (typesize <= 0)
6614         {
6615           /* Though there's nothing really to store, return a word register
6616              anyway so the rest of gcc doesn't go nuts.  Returning a PARALLEL
6617              leads to breakage due to the fact that there are zero bytes to
6618              load.  */
6619           return gen_rtx_REG (mode, regbase);
6620         }
6621
6622       /* ??? C++ has structures with no fields, and yet a size.  Give up
6623          for now and pass everything back in integer registers.  */
6624       nregs = (typesize + UNITS_PER_WORD - 1) / UNITS_PER_WORD;
6625       if (nregs + slotno > SPARC_INT_ARG_MAX)
6626         nregs = SPARC_INT_ARG_MAX - slotno;
6627     }
6628
6629   gcc_assert (nregs > 0);
6630
6631   data.ret = gen_rtx_PARALLEL (mode, rtvec_alloc (data.stack + nregs));
6632
6633   /* If at least one field must be passed on the stack, generate
6634      (parallel [(expr_list (nil) ...) ...]) so that all fields will
6635      also be passed on the stack.  We can't do much better because the
6636      semantics of TARGET_ARG_PARTIAL_BYTES doesn't handle the case
6637      of structures for which the fields passed exclusively in registers
6638      are not at the beginning of the structure.  */
6639   if (data.stack)
6640     XVECEXP (data.ret, 0, 0)
6641       = gen_rtx_EXPR_LIST (VOIDmode, NULL_RTX, const0_rtx);
6642
6643   /* Assign the registers.  */
6644   data.nregs = 0;
6645   data.intoffset = 0;
6646   traverse_record_type<assign_data_t, assign_registers> (type, named, &data);
6647
6648   /* Assign pending integer fields.  */
6649   assign_int_registers (typesize * BITS_PER_UNIT, &data);
6650
6651   gcc_assert (data.nregs == nregs);
6652
6653   return data.ret;
6654 }
6655
6656 /* Used by function_arg and sparc_function_value_1 to implement the conventions
6657    of the 64-bit ABI for passing and returning unions.
6658    Return an expression valid as a return value for the FUNCTION_ARG
6659    and TARGET_FUNCTION_VALUE.
6660
6661    SIZE is the size in bytes of the union.
6662    MODE is the argument's machine mode.
6663    REGNO is the hard register the union will be passed in.  */
6664
6665 static rtx
6666 function_arg_union_value (int size, machine_mode mode, int slotno,
6667                           int regno)
6668 {
6669   int nwords = CEIL_NWORDS (size), i;
6670   rtx regs;
6671
6672   /* See comment in previous function for empty structures.  */
6673   if (nwords == 0)
6674     return gen_rtx_REG (mode, regno);
6675
6676   if (slotno == SPARC_INT_ARG_MAX - 1)
6677     nwords = 1;
6678
6679   regs = gen_rtx_PARALLEL (mode, rtvec_alloc (nwords));
6680
6681   for (i = 0; i < nwords; i++)
6682     {
6683       /* Unions are passed left-justified.  */
6684       XVECEXP (regs, 0, i)
6685         = gen_rtx_EXPR_LIST (VOIDmode,
6686                              gen_rtx_REG (word_mode, regno),
6687                              GEN_INT (UNITS_PER_WORD * i));
6688       regno++;
6689     }
6690
6691   return regs;
6692 }
6693
6694 /* Used by function_arg and sparc_function_value_1 to implement the conventions
6695    for passing and returning BLKmode vectors.
6696    Return an expression valid as a return value for the FUNCTION_ARG
6697    and TARGET_FUNCTION_VALUE.
6698
6699    SIZE is the size in bytes of the vector.
6700    REGNO is the FP hard register the vector will be passed in.  */
6701
6702 static rtx
6703 function_arg_vector_value (int size, int regno)
6704 {
6705   const int nregs = MAX (1, size / 8);
6706   rtx regs = gen_rtx_PARALLEL (BLKmode, rtvec_alloc (nregs));
6707
6708   if (size < 8)
6709     XVECEXP (regs, 0, 0)
6710       = gen_rtx_EXPR_LIST (VOIDmode,
6711                            gen_rtx_REG (SImode, regno),
6712                            const0_rtx);
6713   else
6714     for (int i = 0; i < nregs; i++)
6715       XVECEXP (regs, 0, i)
6716         = gen_rtx_EXPR_LIST (VOIDmode,
6717                              gen_rtx_REG (DImode, regno + 2*i),
6718                              GEN_INT (i*8));
6719
6720   return regs;
6721 }
6722
6723 /* Determine where to put an argument to a function.
6724    Value is zero to push the argument on the stack,
6725    or a hard register in which to store the argument.
6726
6727    CUM is a variable of type CUMULATIVE_ARGS which gives info about
6728     the preceding args and about the function being called.
6729    MODE is the argument's machine mode.
6730    TYPE is the data type of the argument (as a tree).
6731     This is null for libcalls where that information may
6732     not be available.
6733    NAMED is true if this argument is a named parameter
6734     (otherwise it is an extra parameter matching an ellipsis).
6735    INCOMING_P is false for TARGET_FUNCTION_ARG, true for
6736     TARGET_FUNCTION_INCOMING_ARG.  */
6737
6738 static rtx
6739 sparc_function_arg_1 (cumulative_args_t cum_v, machine_mode mode,
6740                       const_tree type, bool named, bool incoming)
6741 {
6742   const CUMULATIVE_ARGS *cum = get_cumulative_args (cum_v);
6743
6744   int regbase = (incoming
6745                  ? SPARC_INCOMING_INT_ARG_FIRST
6746                  : SPARC_OUTGOING_INT_ARG_FIRST);
6747   int slotno, regno, padding;
6748   enum mode_class mclass = GET_MODE_CLASS (mode);
6749
6750   slotno = function_arg_slotno (cum, mode, type, named, incoming,
6751                                 &regno, &padding);
6752   if (slotno == -1)
6753     return 0;
6754
6755   /* Vector types deserve special treatment because they are polymorphic wrt
6756      their mode, depending upon whether VIS instructions are enabled.  */
6757   if (type && TREE_CODE (type) == VECTOR_TYPE)
6758     {
6759       HOST_WIDE_INT size = int_size_in_bytes (type);
6760       gcc_assert ((TARGET_ARCH32 && size <= 8)
6761                   || (TARGET_ARCH64 && size <= 16));
6762
6763       if (mode == BLKmode)
6764         return function_arg_vector_value (size, SPARC_FP_ARG_FIRST + 2*slotno);
6765
6766       mclass = MODE_FLOAT;
6767     }
6768
6769   if (TARGET_ARCH32)
6770     return gen_rtx_REG (mode, regno);
6771
6772   /* Structures up to 16 bytes in size are passed in arg slots on the stack
6773      and are promoted to registers if possible.  */
6774   if (type && TREE_CODE (type) == RECORD_TYPE)
6775     {
6776       HOST_WIDE_INT size = int_size_in_bytes (type);
6777       gcc_assert (size <= 16);
6778
6779       return function_arg_record_value (type, mode, slotno, named, regbase);
6780     }
6781
6782   /* Unions up to 16 bytes in size are passed in integer registers.  */
6783   else if (type && TREE_CODE (type) == UNION_TYPE)
6784     {
6785       HOST_WIDE_INT size = int_size_in_bytes (type);
6786       gcc_assert (size <= 16);
6787
6788       return function_arg_union_value (size, mode, slotno, regno);
6789     }
6790
6791   /* v9 fp args in reg slots beyond the int reg slots get passed in regs
6792      but also have the slot allocated for them.
6793      If no prototype is in scope fp values in register slots get passed
6794      in two places, either fp regs and int regs or fp regs and memory.  */
6795   else if ((mclass == MODE_FLOAT || mclass == MODE_COMPLEX_FLOAT)
6796            && SPARC_FP_REG_P (regno))
6797     {
6798       rtx reg = gen_rtx_REG (mode, regno);
6799       if (cum->prototype_p || cum->libcall_p)
6800         return reg;
6801       else
6802         {
6803           rtx v0, v1;
6804
6805           if ((regno - SPARC_FP_ARG_FIRST) < SPARC_INT_ARG_MAX * 2)
6806             {
6807               int intreg;
6808
6809               /* On incoming, we don't need to know that the value
6810                  is passed in %f0 and %i0, and it confuses other parts
6811                  causing needless spillage even on the simplest cases.  */
6812               if (incoming)
6813                 return reg;
6814
6815               intreg = (SPARC_OUTGOING_INT_ARG_FIRST
6816                         + (regno - SPARC_FP_ARG_FIRST) / 2);
6817
6818               v0 = gen_rtx_EXPR_LIST (VOIDmode, reg, const0_rtx);
6819               v1 = gen_rtx_EXPR_LIST (VOIDmode, gen_rtx_REG (mode, intreg),
6820                                       const0_rtx);
6821               return gen_rtx_PARALLEL (mode, gen_rtvec (2, v0, v1));
6822             }
6823           else
6824             {
6825               v0 = gen_rtx_EXPR_LIST (VOIDmode, NULL_RTX, const0_rtx);
6826               v1 = gen_rtx_EXPR_LIST (VOIDmode, reg, const0_rtx);
6827               return gen_rtx_PARALLEL (mode, gen_rtvec (2, v0, v1));
6828             }
6829         }
6830     }
6831
6832   /* All other aggregate types are passed in an integer register in a mode
6833      corresponding to the size of the type.  */
6834   else if (type && AGGREGATE_TYPE_P (type))
6835     {
6836       HOST_WIDE_INT size = int_size_in_bytes (type);
6837       gcc_assert (size <= 16);
6838
6839       mode = mode_for_size (size * BITS_PER_UNIT, MODE_INT, 0);
6840     }
6841
6842   return gen_rtx_REG (mode, regno);
6843 }
6844
6845 /* Handle the TARGET_FUNCTION_ARG target hook.  */
6846
6847 static rtx
6848 sparc_function_arg (cumulative_args_t cum, machine_mode mode,
6849                     const_tree type, bool named)
6850 {
6851   return sparc_function_arg_1 (cum, mode, type, named, false);
6852 }
6853
6854 /* Handle the TARGET_FUNCTION_INCOMING_ARG target hook.  */
6855
6856 static rtx
6857 sparc_function_incoming_arg (cumulative_args_t cum, machine_mode mode,
6858                              const_tree type, bool named)
6859 {
6860   return sparc_function_arg_1 (cum, mode, type, named, true);
6861 }
6862
6863 /* For sparc64, objects requiring 16 byte alignment are passed that way.  */
6864
6865 static unsigned int
6866 sparc_function_arg_boundary (machine_mode mode, const_tree type)
6867 {
6868   return ((TARGET_ARCH64
6869            && (GET_MODE_ALIGNMENT (mode) == 128
6870                || (type && TYPE_ALIGN (type) == 128)))
6871           ? 128
6872           : PARM_BOUNDARY);
6873 }
6874
6875 /* For an arg passed partly in registers and partly in memory,
6876    this is the number of bytes of registers used.
6877    For args passed entirely in registers or entirely in memory, zero.
6878
6879    Any arg that starts in the first 6 regs but won't entirely fit in them
6880    needs partial registers on v8.  On v9, structures with integer
6881    values in arg slots 5,6 will be passed in %o5 and SP+176, and complex fp
6882    values that begin in the last fp reg [where "last fp reg" varies with the
6883    mode] will be split between that reg and memory.  */
6884
6885 static int
6886 sparc_arg_partial_bytes (cumulative_args_t cum, machine_mode mode,
6887                          tree type, bool named)
6888 {
6889   int slotno, regno, padding;
6890
6891   /* We pass false for incoming here, it doesn't matter.  */
6892   slotno = function_arg_slotno (get_cumulative_args (cum), mode, type, named,
6893                                 false, &regno, &padding);
6894
6895   if (slotno == -1)
6896     return 0;
6897
6898   if (TARGET_ARCH32)
6899     {
6900       if ((slotno + (mode == BLKmode
6901                      ? CEIL_NWORDS (int_size_in_bytes (type))
6902                      : CEIL_NWORDS (GET_MODE_SIZE (mode))))
6903           > SPARC_INT_ARG_MAX)
6904         return (SPARC_INT_ARG_MAX - slotno) * UNITS_PER_WORD;
6905     }
6906   else
6907     {
6908       /* We are guaranteed by pass_by_reference that the size of the
6909          argument is not greater than 16 bytes, so we only need to return
6910          one word if the argument is partially passed in registers.  */
6911
6912       if (type && AGGREGATE_TYPE_P (type))
6913         {
6914           int size = int_size_in_bytes (type);
6915
6916           if (size > UNITS_PER_WORD
6917               && (slotno == SPARC_INT_ARG_MAX - 1
6918                   || slotno == SPARC_FP_ARG_MAX - 1))
6919             return UNITS_PER_WORD;
6920         }
6921       else if (GET_MODE_CLASS (mode) == MODE_COMPLEX_INT
6922                || (GET_MODE_CLASS (mode) == MODE_COMPLEX_FLOAT
6923                    && ! (TARGET_FPU && named)))
6924         {
6925           /* The complex types are passed as packed types.  */
6926           if (GET_MODE_SIZE (mode) > UNITS_PER_WORD
6927               && slotno == SPARC_INT_ARG_MAX - 1)
6928             return UNITS_PER_WORD;
6929         }
6930       else if (GET_MODE_CLASS (mode) == MODE_COMPLEX_FLOAT)
6931         {
6932           if ((slotno + GET_MODE_SIZE (mode) / UNITS_PER_WORD)
6933               > SPARC_FP_ARG_MAX)
6934             return UNITS_PER_WORD;
6935         }
6936     }
6937
6938   return 0;
6939 }
6940
6941 /* Handle the TARGET_PASS_BY_REFERENCE target hook.
6942    Specify whether to pass the argument by reference.  */
6943
6944 static bool
6945 sparc_pass_by_reference (cumulative_args_t cum ATTRIBUTE_UNUSED,
6946                          machine_mode mode, const_tree type,
6947                          bool named ATTRIBUTE_UNUSED)
6948 {
6949   if (TARGET_ARCH32)
6950     /* Original SPARC 32-bit ABI says that structures and unions,
6951        and quad-precision floats are passed by reference.  For Pascal,
6952        also pass arrays by reference.  All other base types are passed
6953        in registers.
6954
6955        Extended ABI (as implemented by the Sun compiler) says that all
6956        complex floats are passed by reference.  Pass complex integers
6957        in registers up to 8 bytes.  More generally, enforce the 2-word
6958        cap for passing arguments in registers.
6959
6960        Vector ABI (as implemented by the Sun VIS SDK) says that vector
6961        integers are passed like floats of the same size, that is in
6962        registers up to 8 bytes.  Pass all vector floats by reference
6963        like structure and unions.  */
6964     return ((type && (AGGREGATE_TYPE_P (type) || VECTOR_FLOAT_TYPE_P (type)))
6965             || mode == SCmode
6966             /* Catch CDImode, TFmode, DCmode and TCmode.  */
6967             || GET_MODE_SIZE (mode) > 8
6968             || (type
6969                 && TREE_CODE (type) == VECTOR_TYPE
6970                 && (unsigned HOST_WIDE_INT) int_size_in_bytes (type) > 8));
6971   else
6972     /* Original SPARC 64-bit ABI says that structures and unions
6973        smaller than 16 bytes are passed in registers, as well as
6974        all other base types.
6975
6976        Extended ABI (as implemented by the Sun compiler) says that
6977        complex floats are passed in registers up to 16 bytes.  Pass
6978        all complex integers in registers up to 16 bytes.  More generally,
6979        enforce the 2-word cap for passing arguments in registers.
6980
6981        Vector ABI (as implemented by the Sun VIS SDK) says that vector
6982        integers are passed like floats of the same size, that is in
6983        registers (up to 16 bytes).  Pass all vector floats like structure
6984        and unions.  */
6985     return ((type
6986              && (AGGREGATE_TYPE_P (type) || TREE_CODE (type) == VECTOR_TYPE)
6987              && (unsigned HOST_WIDE_INT) int_size_in_bytes (type) > 16)
6988             /* Catch CTImode and TCmode.  */
6989             || GET_MODE_SIZE (mode) > 16);
6990 }
6991
6992 /* Handle the TARGET_FUNCTION_ARG_ADVANCE hook.
6993    Update the data in CUM to advance over an argument
6994    of mode MODE and data type TYPE.
6995    TYPE is null for libcalls where that information may not be available.  */
6996
6997 static void
6998 sparc_function_arg_advance (cumulative_args_t cum_v, machine_mode mode,
6999                             const_tree type, bool named)
7000 {
7001   CUMULATIVE_ARGS *cum = get_cumulative_args (cum_v);
7002   int regno, padding;
7003
7004   /* We pass false for incoming here, it doesn't matter.  */
7005   function_arg_slotno (cum, mode, type, named, false, &regno, &padding);
7006
7007   /* If argument requires leading padding, add it.  */
7008   cum->words += padding;
7009
7010   if (TARGET_ARCH32)
7011     cum->words += (mode == BLKmode
7012                    ? CEIL_NWORDS (int_size_in_bytes (type))
7013                    : CEIL_NWORDS (GET_MODE_SIZE (mode)));
7014   else
7015     {
7016       if (type && AGGREGATE_TYPE_P (type))
7017         {
7018           int size = int_size_in_bytes (type);
7019
7020           if (size <= 8)
7021             ++cum->words;
7022           else if (size <= 16)
7023             cum->words += 2;
7024           else /* passed by reference */
7025             ++cum->words;
7026         }
7027       else
7028         cum->words += (mode == BLKmode
7029                        ? CEIL_NWORDS (int_size_in_bytes (type))
7030                        : CEIL_NWORDS (GET_MODE_SIZE (mode)));
7031     }
7032 }
7033
7034 /* Handle the FUNCTION_ARG_PADDING macro.
7035    For the 64 bit ABI structs are always stored left shifted in their
7036    argument slot.  */
7037
7038 enum direction
7039 function_arg_padding (machine_mode mode, const_tree type)
7040 {
7041   if (TARGET_ARCH64 && type && AGGREGATE_TYPE_P (type))
7042     return upward;
7043
7044   /* Fall back to the default.  */
7045   return DEFAULT_FUNCTION_ARG_PADDING (mode, type);
7046 }
7047
7048 /* Handle the TARGET_RETURN_IN_MEMORY target hook.
7049    Specify whether to return the return value in memory.  */
7050
7051 static bool
7052 sparc_return_in_memory (const_tree type, const_tree fntype ATTRIBUTE_UNUSED)
7053 {
7054   if (TARGET_ARCH32)
7055     /* Original SPARC 32-bit ABI says that structures and unions,
7056        and quad-precision floats are returned in memory.  All other
7057        base types are returned in registers.
7058
7059        Extended ABI (as implemented by the Sun compiler) says that
7060        all complex floats are returned in registers (8 FP registers
7061        at most for '_Complex long double').  Return all complex integers
7062        in registers (4 at most for '_Complex long long').
7063
7064        Vector ABI (as implemented by the Sun VIS SDK) says that vector
7065        integers are returned like floats of the same size, that is in
7066        registers up to 8 bytes and in memory otherwise.  Return all
7067        vector floats in memory like structure and unions; note that
7068        they always have BLKmode like the latter.  */
7069     return (TYPE_MODE (type) == BLKmode
7070             || TYPE_MODE (type) == TFmode
7071             || (TREE_CODE (type) == VECTOR_TYPE
7072                 && (unsigned HOST_WIDE_INT) int_size_in_bytes (type) > 8));
7073   else
7074     /* Original SPARC 64-bit ABI says that structures and unions
7075        smaller than 32 bytes are returned in registers, as well as
7076        all other base types.
7077
7078        Extended ABI (as implemented by the Sun compiler) says that all
7079        complex floats are returned in registers (8 FP registers at most
7080        for '_Complex long double').  Return all complex integers in
7081        registers (4 at most for '_Complex TItype').
7082
7083        Vector ABI (as implemented by the Sun VIS SDK) says that vector
7084        integers are returned like floats of the same size, that is in
7085        registers.  Return all vector floats like structure and unions;
7086        note that they always have BLKmode like the latter.  */
7087     return (TYPE_MODE (type) == BLKmode
7088             && (unsigned HOST_WIDE_INT) int_size_in_bytes (type) > 32);
7089 }
7090
7091 /* Handle the TARGET_STRUCT_VALUE target hook.
7092    Return where to find the structure return value address.  */
7093
7094 static rtx
7095 sparc_struct_value_rtx (tree fndecl, int incoming)
7096 {
7097   if (TARGET_ARCH64)
7098     return 0;
7099   else
7100     {
7101       rtx mem;
7102
7103       if (incoming)
7104         mem = gen_frame_mem (Pmode, plus_constant (Pmode, frame_pointer_rtx,
7105                                                    STRUCT_VALUE_OFFSET));
7106       else
7107         mem = gen_frame_mem (Pmode, plus_constant (Pmode, stack_pointer_rtx,
7108                                                    STRUCT_VALUE_OFFSET));
7109
7110       /* Only follow the SPARC ABI for fixed-size structure returns.
7111          Variable size structure returns are handled per the normal
7112          procedures in GCC. This is enabled by -mstd-struct-return */
7113       if (incoming == 2
7114           && sparc_std_struct_return
7115           && TYPE_SIZE_UNIT (TREE_TYPE (fndecl))
7116           && TREE_CODE (TYPE_SIZE_UNIT (TREE_TYPE (fndecl))) == INTEGER_CST)
7117         {
7118           /* We must check and adjust the return address, as it is optional
7119              as to whether the return object is really provided.  */
7120           rtx ret_reg = gen_rtx_REG (Pmode, RETURN_ADDR_REGNUM);
7121           rtx scratch = gen_reg_rtx (SImode);
7122           rtx_code_label *endlab = gen_label_rtx ();
7123
7124           /* Calculate the return object size.  */
7125           tree size = TYPE_SIZE_UNIT (TREE_TYPE (fndecl));
7126           rtx size_rtx = GEN_INT (TREE_INT_CST_LOW (size) & 0xfff);
7127           /* Construct a temporary return value.  */
7128           rtx temp_val
7129             = assign_stack_local (Pmode, TREE_INT_CST_LOW (size), 0);
7130
7131           /* Implement SPARC 32-bit psABI callee return struct checking:
7132
7133              Fetch the instruction where we will return to and see if
7134              it's an unimp instruction (the most significant 10 bits
7135              will be zero).  */
7136           emit_move_insn (scratch, gen_rtx_MEM (SImode,
7137                                                 plus_constant (Pmode,
7138                                                                ret_reg, 8)));
7139           /* Assume the size is valid and pre-adjust.  */
7140           emit_insn (gen_add3_insn (ret_reg, ret_reg, GEN_INT (4)));
7141           emit_cmp_and_jump_insns (scratch, size_rtx, EQ, const0_rtx, SImode,
7142                                    0, endlab);
7143           emit_insn (gen_sub3_insn (ret_reg, ret_reg, GEN_INT (4)));
7144           /* Write the address of the memory pointed to by temp_val into
7145              the memory pointed to by mem.  */
7146           emit_move_insn (mem, XEXP (temp_val, 0));
7147           emit_label (endlab);
7148         }
7149
7150       return mem;
7151     }
7152 }
7153
7154 /* Handle TARGET_FUNCTION_VALUE, and TARGET_LIBCALL_VALUE target hook.
7155    For v9, function return values are subject to the same rules as arguments,
7156    except that up to 32 bytes may be returned in registers.  */
7157
7158 static rtx
7159 sparc_function_value_1 (const_tree type, machine_mode mode,
7160                         bool outgoing)
7161 {
7162   /* Beware that the two values are swapped here wrt function_arg.  */
7163   int regbase = (outgoing
7164                  ? SPARC_INCOMING_INT_ARG_FIRST
7165                  : SPARC_OUTGOING_INT_ARG_FIRST);
7166   enum mode_class mclass = GET_MODE_CLASS (mode);
7167   int regno;
7168
7169   /* Vector types deserve special treatment because they are polymorphic wrt
7170      their mode, depending upon whether VIS instructions are enabled.  */
7171   if (type && TREE_CODE (type) == VECTOR_TYPE)
7172     {
7173       HOST_WIDE_INT size = int_size_in_bytes (type);
7174       gcc_assert ((TARGET_ARCH32 && size <= 8)
7175                   || (TARGET_ARCH64 && size <= 32));
7176
7177       if (mode == BLKmode)
7178         return function_arg_vector_value (size, SPARC_FP_ARG_FIRST);
7179
7180       mclass = MODE_FLOAT;
7181     }
7182
7183   if (TARGET_ARCH64 && type)
7184     {
7185       /* Structures up to 32 bytes in size are returned in registers.  */
7186       if (TREE_CODE (type) == RECORD_TYPE)
7187         {
7188           HOST_WIDE_INT size = int_size_in_bytes (type);
7189           gcc_assert (size <= 32);
7190
7191           return function_arg_record_value (type, mode, 0, 1, regbase);
7192         }
7193
7194       /* Unions up to 32 bytes in size are returned in integer registers.  */
7195       else if (TREE_CODE (type) == UNION_TYPE)
7196         {
7197           HOST_WIDE_INT size = int_size_in_bytes (type);
7198           gcc_assert (size <= 32);
7199
7200           return function_arg_union_value (size, mode, 0, regbase);
7201         }
7202
7203       /* Objects that require it are returned in FP registers.  */
7204       else if (mclass == MODE_FLOAT || mclass == MODE_COMPLEX_FLOAT)
7205         ;
7206
7207       /* All other aggregate types are returned in an integer register in a
7208          mode corresponding to the size of the type.  */
7209       else if (AGGREGATE_TYPE_P (type))
7210         {
7211           /* All other aggregate types are passed in an integer register
7212              in a mode corresponding to the size of the type.  */
7213           HOST_WIDE_INT size = int_size_in_bytes (type);
7214           gcc_assert (size <= 32);
7215
7216           mode = mode_for_size (size * BITS_PER_UNIT, MODE_INT, 0);
7217
7218           /* ??? We probably should have made the same ABI change in
7219              3.4.0 as the one we made for unions.   The latter was
7220              required by the SCD though, while the former is not
7221              specified, so we favored compatibility and efficiency.
7222
7223              Now we're stuck for aggregates larger than 16 bytes,
7224              because OImode vanished in the meantime.  Let's not
7225              try to be unduly clever, and simply follow the ABI
7226              for unions in that case.  */
7227           if (mode == BLKmode)
7228             return function_arg_union_value (size, mode, 0, regbase);
7229           else
7230             mclass = MODE_INT;
7231         }
7232
7233       /* We should only have pointer and integer types at this point.  This
7234          must match sparc_promote_function_mode.  */
7235       else if (mclass == MODE_INT && GET_MODE_SIZE (mode) < UNITS_PER_WORD)
7236         mode = word_mode;
7237     }
7238
7239   /* We should only have pointer and integer types at this point, except with
7240      -freg-struct-return.  This must match sparc_promote_function_mode.  */
7241   else if (TARGET_ARCH32
7242            && !(type && AGGREGATE_TYPE_P (type))
7243            && mclass == MODE_INT
7244            && GET_MODE_SIZE (mode) < UNITS_PER_WORD)
7245     mode = word_mode;
7246
7247   if ((mclass == MODE_FLOAT || mclass == MODE_COMPLEX_FLOAT) && TARGET_FPU)
7248     regno = SPARC_FP_ARG_FIRST;
7249   else
7250     regno = regbase;
7251
7252   return gen_rtx_REG (mode, regno);
7253 }
7254
7255 /* Handle TARGET_FUNCTION_VALUE.
7256    On the SPARC, the value is found in the first "output" register, but the
7257    called function leaves it in the first "input" register.  */
7258
7259 static rtx
7260 sparc_function_value (const_tree valtype,
7261                       const_tree fn_decl_or_type ATTRIBUTE_UNUSED,
7262                       bool outgoing)
7263 {
7264   return sparc_function_value_1 (valtype, TYPE_MODE (valtype), outgoing);
7265 }
7266
7267 /* Handle TARGET_LIBCALL_VALUE.  */
7268
7269 static rtx
7270 sparc_libcall_value (machine_mode mode,
7271                      const_rtx fun ATTRIBUTE_UNUSED)
7272 {
7273   return sparc_function_value_1 (NULL_TREE, mode, false);
7274 }
7275
7276 /* Handle FUNCTION_VALUE_REGNO_P.
7277    On the SPARC, the first "output" reg is used for integer values, and the
7278    first floating point register is used for floating point values.  */
7279
7280 static bool
7281 sparc_function_value_regno_p (const unsigned int regno)
7282 {
7283   return (regno == 8 || (TARGET_FPU && regno == 32));
7284 }
7285
7286 /* Do what is necessary for `va_start'.  We look at the current function
7287    to determine if stdarg or varargs is used and return the address of
7288    the first unnamed parameter.  */
7289
7290 static rtx
7291 sparc_builtin_saveregs (void)
7292 {
7293   int first_reg = crtl->args.info.words;
7294   rtx address;
7295   int regno;
7296
7297   for (regno = first_reg; regno < SPARC_INT_ARG_MAX; regno++)
7298     emit_move_insn (gen_rtx_MEM (word_mode,
7299                                  gen_rtx_PLUS (Pmode,
7300                                                frame_pointer_rtx,
7301                                                GEN_INT (FIRST_PARM_OFFSET (0)
7302                                                         + (UNITS_PER_WORD
7303                                                            * regno)))),
7304                     gen_rtx_REG (word_mode,
7305                                  SPARC_INCOMING_INT_ARG_FIRST + regno));
7306
7307   address = gen_rtx_PLUS (Pmode,
7308                           frame_pointer_rtx,
7309                           GEN_INT (FIRST_PARM_OFFSET (0)
7310                                    + UNITS_PER_WORD * first_reg));
7311
7312   return address;
7313 }
7314
7315 /* Implement `va_start' for stdarg.  */
7316
7317 static void
7318 sparc_va_start (tree valist, rtx nextarg)
7319 {
7320   nextarg = expand_builtin_saveregs ();
7321   std_expand_builtin_va_start (valist, nextarg);
7322 }
7323
7324 /* Implement `va_arg' for stdarg.  */
7325
7326 static tree
7327 sparc_gimplify_va_arg (tree valist, tree type, gimple_seq *pre_p,
7328                        gimple_seq *post_p)
7329 {
7330   HOST_WIDE_INT size, rsize, align;
7331   tree addr, incr;
7332   bool indirect;
7333   tree ptrtype = build_pointer_type (type);
7334
7335   if (pass_by_reference (NULL, TYPE_MODE (type), type, false))
7336     {
7337       indirect = true;
7338       size = rsize = UNITS_PER_WORD;
7339       align = 0;
7340     }
7341   else
7342     {
7343       indirect = false;
7344       size = int_size_in_bytes (type);
7345       rsize = ROUND_UP (size, UNITS_PER_WORD);
7346       align = 0;
7347
7348       if (TARGET_ARCH64)
7349         {
7350           /* For SPARC64, objects requiring 16-byte alignment get it.  */
7351           if (TYPE_ALIGN (type) >= 2 * (unsigned) BITS_PER_WORD)
7352             align = 2 * UNITS_PER_WORD;
7353
7354           /* SPARC-V9 ABI states that structures up to 16 bytes in size
7355              are left-justified in their slots.  */
7356           if (AGGREGATE_TYPE_P (type))
7357             {
7358               if (size == 0)
7359                 size = rsize = UNITS_PER_WORD;
7360               else
7361                 size = rsize;
7362             }
7363         }
7364     }
7365
7366   incr = valist;
7367   if (align)
7368     {
7369       incr = fold_build_pointer_plus_hwi (incr, align - 1);
7370       incr = fold_convert (sizetype, incr);
7371       incr = fold_build2 (BIT_AND_EXPR, sizetype, incr,
7372                           size_int (-align));
7373       incr = fold_convert (ptr_type_node, incr);
7374     }
7375
7376   gimplify_expr (&incr, pre_p, post_p, is_gimple_val, fb_rvalue);
7377   addr = incr;
7378
7379   if (BYTES_BIG_ENDIAN && size < rsize)
7380     addr = fold_build_pointer_plus_hwi (incr, rsize - size);
7381
7382   if (indirect)
7383     {
7384       addr = fold_convert (build_pointer_type (ptrtype), addr);
7385       addr = build_va_arg_indirect_ref (addr);
7386     }
7387
7388   /* If the address isn't aligned properly for the type, we need a temporary.
7389      FIXME: This is inefficient, usually we can do this in registers.  */
7390   else if (align == 0 && TYPE_ALIGN (type) > BITS_PER_WORD)
7391     {
7392       tree tmp = create_tmp_var (type, "va_arg_tmp");
7393       tree dest_addr = build_fold_addr_expr (tmp);
7394       tree copy = build_call_expr (builtin_decl_implicit (BUILT_IN_MEMCPY),
7395                                    3, dest_addr, addr, size_int (rsize));
7396       TREE_ADDRESSABLE (tmp) = 1;
7397       gimplify_and_add (copy, pre_p);
7398       addr = dest_addr;
7399     }
7400
7401   else
7402     addr = fold_convert (ptrtype, addr);
7403
7404   incr = fold_build_pointer_plus_hwi (incr, rsize);
7405   gimplify_assign (valist, incr, post_p);
7406
7407   return build_va_arg_indirect_ref (addr);
7408 }
7409 \f
7410 /* Implement the TARGET_VECTOR_MODE_SUPPORTED_P target hook.
7411    Specify whether the vector mode is supported by the hardware.  */
7412
7413 static bool
7414 sparc_vector_mode_supported_p (machine_mode mode)
7415 {
7416   return TARGET_VIS && VECTOR_MODE_P (mode) ? true : false;
7417 }
7418 \f
7419 /* Implement the TARGET_VECTORIZE_PREFERRED_SIMD_MODE target hook.  */
7420
7421 static machine_mode
7422 sparc_preferred_simd_mode (machine_mode mode)
7423 {
7424   if (TARGET_VIS)
7425     switch (mode)
7426       {
7427       case SImode:
7428         return V2SImode;
7429       case HImode:
7430         return V4HImode;
7431       case QImode:
7432         return V8QImode;
7433
7434       default:;
7435       }
7436
7437   return word_mode;
7438 }
7439 \f
7440 /* Return the string to output an unconditional branch to LABEL, which is
7441    the operand number of the label.
7442
7443    DEST is the destination insn (i.e. the label), INSN is the source.  */
7444
7445 const char *
7446 output_ubranch (rtx dest, rtx_insn *insn)
7447 {
7448   static char string[64];
7449   bool v9_form = false;
7450   int delta;
7451   char *p;
7452
7453   /* Even if we are trying to use cbcond for this, evaluate
7454      whether we can use V9 branches as our backup plan.  */
7455
7456   delta = 5000000;
7457   if (INSN_ADDRESSES_SET_P ())
7458     delta = (INSN_ADDRESSES (INSN_UID (dest))
7459              - INSN_ADDRESSES (INSN_UID (insn)));
7460
7461   /* Leave some instructions for "slop".  */
7462   if (TARGET_V9 && delta >= -260000 && delta < 260000)
7463     v9_form = true;
7464
7465   if (TARGET_CBCOND)
7466     {
7467       bool emit_nop = emit_cbcond_nop (insn);
7468       bool far = false;
7469       const char *rval;
7470
7471       if (delta < -500 || delta > 500)
7472         far = true;
7473
7474       if (far)
7475         {
7476           if (v9_form)
7477             rval = "ba,a,pt\t%%xcc, %l0";
7478           else
7479             rval = "b,a\t%l0";
7480         }
7481       else
7482         {
7483           if (emit_nop)
7484             rval = "cwbe\t%%g0, %%g0, %l0\n\tnop";
7485           else
7486             rval = "cwbe\t%%g0, %%g0, %l0";
7487         }
7488       return rval;
7489     }
7490
7491   if (v9_form)
7492     strcpy (string, "ba%*,pt\t%%xcc, ");
7493   else
7494     strcpy (string, "b%*\t");
7495
7496   p = strchr (string, '\0');
7497   *p++ = '%';
7498   *p++ = 'l';
7499   *p++ = '0';
7500   *p++ = '%';
7501   *p++ = '(';
7502   *p = '\0';
7503
7504   return string;
7505 }
7506
7507 /* Return the string to output a conditional branch to LABEL, which is
7508    the operand number of the label.  OP is the conditional expression.
7509    XEXP (OP, 0) is assumed to be a condition code register (integer or
7510    floating point) and its mode specifies what kind of comparison we made.
7511
7512    DEST is the destination insn (i.e. the label), INSN is the source.
7513
7514    REVERSED is nonzero if we should reverse the sense of the comparison.
7515
7516    ANNUL is nonzero if we should generate an annulling branch.  */
7517
7518 const char *
7519 output_cbranch (rtx op, rtx dest, int label, int reversed, int annul,
7520                 rtx_insn *insn)
7521 {
7522   static char string[64];
7523   enum rtx_code code = GET_CODE (op);
7524   rtx cc_reg = XEXP (op, 0);
7525   machine_mode mode = GET_MODE (cc_reg);
7526   const char *labelno, *branch;
7527   int spaces = 8, far;
7528   char *p;
7529
7530   /* v9 branches are limited to +-1MB.  If it is too far away,
7531      change
7532
7533      bne,pt %xcc, .LC30
7534
7535      to
7536
7537      be,pn %xcc, .+12
7538       nop
7539      ba .LC30
7540
7541      and
7542
7543      fbne,a,pn %fcc2, .LC29
7544
7545      to
7546
7547      fbe,pt %fcc2, .+16
7548       nop
7549      ba .LC29  */
7550
7551   far = TARGET_V9 && (get_attr_length (insn) >= 3);
7552   if (reversed ^ far)
7553     {
7554       /* Reversal of FP compares takes care -- an ordered compare
7555          becomes an unordered compare and vice versa.  */
7556       if (mode == CCFPmode || mode == CCFPEmode)
7557         code = reverse_condition_maybe_unordered (code);
7558       else
7559         code = reverse_condition (code);
7560     }
7561
7562   /* Start by writing the branch condition.  */
7563   if (mode == CCFPmode || mode == CCFPEmode)
7564     {
7565       switch (code)
7566         {
7567         case NE:
7568           branch = "fbne";
7569           break;
7570         case EQ:
7571           branch = "fbe";
7572           break;
7573         case GE:
7574           branch = "fbge";
7575           break;
7576         case GT:
7577           branch = "fbg";
7578           break;
7579         case LE:
7580           branch = "fble";
7581           break;
7582         case LT:
7583           branch = "fbl";
7584           break;
7585         case UNORDERED:
7586           branch = "fbu";
7587           break;
7588         case ORDERED:
7589           branch = "fbo";
7590           break;
7591         case UNGT:
7592           branch = "fbug";
7593           break;
7594         case UNLT:
7595           branch = "fbul";
7596           break;
7597         case UNEQ:
7598           branch = "fbue";
7599           break;
7600         case UNGE:
7601           branch = "fbuge";
7602           break;
7603         case UNLE:
7604           branch = "fbule";
7605           break;
7606         case LTGT:
7607           branch = "fblg";
7608           break;
7609
7610         default:
7611           gcc_unreachable ();
7612         }
7613
7614       /* ??? !v9: FP branches cannot be preceded by another floating point
7615          insn.  Because there is currently no concept of pre-delay slots,
7616          we can fix this only by always emitting a nop before a floating
7617          point branch.  */
7618
7619       string[0] = '\0';
7620       if (! TARGET_V9)
7621         strcpy (string, "nop\n\t");
7622       strcat (string, branch);
7623     }
7624   else
7625     {
7626       switch (code)
7627         {
7628         case NE:
7629           branch = "bne";
7630           break;
7631         case EQ:
7632           branch = "be";
7633           break;
7634         case GE:
7635           if (mode == CC_NOOVmode || mode == CCX_NOOVmode)
7636             branch = "bpos";
7637           else
7638             branch = "bge";
7639           break;
7640         case GT:
7641           branch = "bg";
7642           break;
7643         case LE:
7644           branch = "ble";
7645           break;
7646         case LT:
7647           if (mode == CC_NOOVmode || mode == CCX_NOOVmode)
7648             branch = "bneg";
7649           else
7650             branch = "bl";
7651           break;
7652         case GEU:
7653           branch = "bgeu";
7654           break;
7655         case GTU:
7656           branch = "bgu";
7657           break;
7658         case LEU:
7659           branch = "bleu";
7660           break;
7661         case LTU:
7662           branch = "blu";
7663           break;
7664
7665         default:
7666           gcc_unreachable ();
7667         }
7668       strcpy (string, branch);
7669     }
7670   spaces -= strlen (branch);
7671   p = strchr (string, '\0');
7672
7673   /* Now add the annulling, the label, and a possible noop.  */
7674   if (annul && ! far)
7675     {
7676       strcpy (p, ",a");
7677       p += 2;
7678       spaces -= 2;
7679     }
7680
7681   if (TARGET_V9)
7682     {
7683       rtx note;
7684       int v8 = 0;
7685
7686       if (! far && insn && INSN_ADDRESSES_SET_P ())
7687         {
7688           int delta = (INSN_ADDRESSES (INSN_UID (dest))
7689                        - INSN_ADDRESSES (INSN_UID (insn)));
7690           /* Leave some instructions for "slop".  */
7691           if (delta < -260000 || delta >= 260000)
7692             v8 = 1;
7693         }
7694
7695       if (mode == CCFPmode || mode == CCFPEmode)
7696         {
7697           static char v9_fcc_labelno[] = "%%fccX, ";
7698           /* Set the char indicating the number of the fcc reg to use.  */
7699           v9_fcc_labelno[5] = REGNO (cc_reg) - SPARC_FIRST_V9_FCC_REG + '0';
7700           labelno = v9_fcc_labelno;
7701           if (v8)
7702             {
7703               gcc_assert (REGNO (cc_reg) == SPARC_FCC_REG);
7704               labelno = "";
7705             }
7706         }
7707       else if (mode == CCXmode || mode == CCX_NOOVmode)
7708         {
7709           labelno = "%%xcc, ";
7710           gcc_assert (! v8);
7711         }
7712       else
7713         {
7714           labelno = "%%icc, ";
7715           if (v8)
7716             labelno = "";
7717         }
7718
7719       if (*labelno && insn && (note = find_reg_note (insn, REG_BR_PROB, NULL_RTX)))
7720         {
7721           strcpy (p,
7722                   ((XINT (note, 0) >= REG_BR_PROB_BASE / 2) ^ far)
7723                   ? ",pt" : ",pn");
7724           p += 3;
7725           spaces -= 3;
7726         }
7727     }
7728   else
7729     labelno = "";
7730
7731   if (spaces > 0)
7732     *p++ = '\t';
7733   else
7734     *p++ = ' ';
7735   strcpy (p, labelno);
7736   p = strchr (p, '\0');
7737   if (far)
7738     {
7739       strcpy (p, ".+12\n\t nop\n\tb\t");
7740       /* Skip the next insn if requested or
7741          if we know that it will be a nop.  */
7742       if (annul || ! final_sequence)
7743         p[3] = '6';
7744       p += 14;
7745     }
7746   *p++ = '%';
7747   *p++ = 'l';
7748   *p++ = label + '0';
7749   *p++ = '%';
7750   *p++ = '#';
7751   *p = '\0';
7752
7753   return string;
7754 }
7755
7756 /* Emit a library call comparison between floating point X and Y.
7757    COMPARISON is the operator to compare with (EQ, NE, GT, etc).
7758    Return the new operator to be used in the comparison sequence.
7759
7760    TARGET_ARCH64 uses _Qp_* functions, which use pointers to TFmode
7761    values as arguments instead of the TFmode registers themselves,
7762    that's why we cannot call emit_float_lib_cmp.  */
7763
7764 rtx
7765 sparc_emit_float_lib_cmp (rtx x, rtx y, enum rtx_code comparison)
7766 {
7767   const char *qpfunc;
7768   rtx slot0, slot1, result, tem, tem2, libfunc;
7769   machine_mode mode;
7770   enum rtx_code new_comparison;
7771
7772   switch (comparison)
7773     {
7774     case EQ:
7775       qpfunc = (TARGET_ARCH64 ? "_Qp_feq" : "_Q_feq");
7776       break;
7777
7778     case NE:
7779       qpfunc = (TARGET_ARCH64 ? "_Qp_fne" : "_Q_fne");
7780       break;
7781
7782     case GT:
7783       qpfunc = (TARGET_ARCH64 ? "_Qp_fgt" : "_Q_fgt");
7784       break;
7785
7786     case GE:
7787       qpfunc = (TARGET_ARCH64 ? "_Qp_fge" : "_Q_fge");
7788       break;
7789
7790     case LT:
7791       qpfunc = (TARGET_ARCH64 ? "_Qp_flt" : "_Q_flt");
7792       break;
7793
7794     case LE:
7795       qpfunc = (TARGET_ARCH64 ? "_Qp_fle" : "_Q_fle");
7796       break;
7797
7798     case ORDERED:
7799     case UNORDERED:
7800     case UNGT:
7801     case UNLT:
7802     case UNEQ:
7803     case UNGE:
7804     case UNLE:
7805     case LTGT:
7806       qpfunc = (TARGET_ARCH64 ? "_Qp_cmp" : "_Q_cmp");
7807       break;
7808
7809     default:
7810       gcc_unreachable ();
7811     }
7812
7813   if (TARGET_ARCH64)
7814     {
7815       if (MEM_P (x))
7816         {
7817           tree expr = MEM_EXPR (x);
7818           if (expr)
7819             mark_addressable (expr);
7820           slot0 = x;
7821         }
7822       else
7823         {
7824           slot0 = assign_stack_temp (TFmode, GET_MODE_SIZE(TFmode));
7825           emit_move_insn (slot0, x);
7826         }
7827
7828       if (MEM_P (y))
7829         {
7830           tree expr = MEM_EXPR (y);
7831           if (expr)
7832             mark_addressable (expr);
7833           slot1 = y;
7834         }
7835       else
7836         {
7837           slot1 = assign_stack_temp (TFmode, GET_MODE_SIZE(TFmode));
7838           emit_move_insn (slot1, y);
7839         }
7840
7841       libfunc = gen_rtx_SYMBOL_REF (Pmode, qpfunc);
7842       emit_library_call (libfunc, LCT_NORMAL,
7843                          DImode, 2,
7844                          XEXP (slot0, 0), Pmode,
7845                          XEXP (slot1, 0), Pmode);
7846       mode = DImode;
7847     }
7848   else
7849     {
7850       libfunc = gen_rtx_SYMBOL_REF (Pmode, qpfunc);
7851       emit_library_call (libfunc, LCT_NORMAL,
7852                          SImode, 2,
7853                          x, TFmode, y, TFmode);
7854       mode = SImode;
7855     }
7856
7857
7858   /* Immediately move the result of the libcall into a pseudo
7859      register so reload doesn't clobber the value if it needs
7860      the return register for a spill reg.  */
7861   result = gen_reg_rtx (mode);
7862   emit_move_insn (result, hard_libcall_value (mode, libfunc));
7863
7864   switch (comparison)
7865     {
7866     default:
7867       return gen_rtx_NE (VOIDmode, result, const0_rtx);
7868     case ORDERED:
7869     case UNORDERED:
7870       new_comparison = (comparison == UNORDERED ? EQ : NE);
7871       return gen_rtx_fmt_ee (new_comparison, VOIDmode, result, GEN_INT(3));
7872     case UNGT:
7873     case UNGE:
7874       new_comparison = (comparison == UNGT ? GT : NE);
7875       return gen_rtx_fmt_ee (new_comparison, VOIDmode, result, const1_rtx);
7876     case UNLE:
7877       return gen_rtx_NE (VOIDmode, result, const2_rtx);
7878     case UNLT:
7879       tem = gen_reg_rtx (mode);
7880       if (TARGET_ARCH32)
7881         emit_insn (gen_andsi3 (tem, result, const1_rtx));
7882       else
7883         emit_insn (gen_anddi3 (tem, result, const1_rtx));
7884       return gen_rtx_NE (VOIDmode, tem, const0_rtx);
7885     case UNEQ:
7886     case LTGT:
7887       tem = gen_reg_rtx (mode);
7888       if (TARGET_ARCH32)
7889         emit_insn (gen_addsi3 (tem, result, const1_rtx));
7890       else
7891         emit_insn (gen_adddi3 (tem, result, const1_rtx));
7892       tem2 = gen_reg_rtx (mode);
7893       if (TARGET_ARCH32)
7894         emit_insn (gen_andsi3 (tem2, tem, const2_rtx));
7895       else
7896         emit_insn (gen_anddi3 (tem2, tem, const2_rtx));
7897       new_comparison = (comparison == UNEQ ? EQ : NE);
7898       return gen_rtx_fmt_ee (new_comparison, VOIDmode, tem2, const0_rtx);
7899     }
7900
7901   gcc_unreachable ();
7902 }
7903
7904 /* Generate an unsigned DImode to FP conversion.  This is the same code
7905    optabs would emit if we didn't have TFmode patterns.  */
7906
7907 void
7908 sparc_emit_floatunsdi (rtx *operands, machine_mode mode)
7909 {
7910   rtx i0, i1, f0, in, out;
7911
7912   out = operands[0];
7913   in = force_reg (DImode, operands[1]);
7914   rtx_code_label *neglab = gen_label_rtx ();
7915   rtx_code_label *donelab = gen_label_rtx ();
7916   i0 = gen_reg_rtx (DImode);
7917   i1 = gen_reg_rtx (DImode);
7918   f0 = gen_reg_rtx (mode);
7919
7920   emit_cmp_and_jump_insns (in, const0_rtx, LT, const0_rtx, DImode, 0, neglab);
7921
7922   emit_insn (gen_rtx_SET (out, gen_rtx_FLOAT (mode, in)));
7923   emit_jump_insn (gen_jump (donelab));
7924   emit_barrier ();
7925
7926   emit_label (neglab);
7927
7928   emit_insn (gen_lshrdi3 (i0, in, const1_rtx));
7929   emit_insn (gen_anddi3 (i1, in, const1_rtx));
7930   emit_insn (gen_iordi3 (i0, i0, i1));
7931   emit_insn (gen_rtx_SET (f0, gen_rtx_FLOAT (mode, i0)));
7932   emit_insn (gen_rtx_SET (out, gen_rtx_PLUS (mode, f0, f0)));
7933
7934   emit_label (donelab);
7935 }
7936
7937 /* Generate an FP to unsigned DImode conversion.  This is the same code
7938    optabs would emit if we didn't have TFmode patterns.  */
7939
7940 void
7941 sparc_emit_fixunsdi (rtx *operands, machine_mode mode)
7942 {
7943   rtx i0, i1, f0, in, out, limit;
7944
7945   out = operands[0];
7946   in = force_reg (mode, operands[1]);
7947   rtx_code_label *neglab = gen_label_rtx ();
7948   rtx_code_label *donelab = gen_label_rtx ();
7949   i0 = gen_reg_rtx (DImode);
7950   i1 = gen_reg_rtx (DImode);
7951   limit = gen_reg_rtx (mode);
7952   f0 = gen_reg_rtx (mode);
7953
7954   emit_move_insn (limit,
7955                   const_double_from_real_value (
7956                     REAL_VALUE_ATOF ("9223372036854775808.0", mode), mode));
7957   emit_cmp_and_jump_insns (in, limit, GE, NULL_RTX, mode, 0, neglab);
7958
7959   emit_insn (gen_rtx_SET (out,
7960                           gen_rtx_FIX (DImode, gen_rtx_FIX (mode, in))));
7961   emit_jump_insn (gen_jump (donelab));
7962   emit_barrier ();
7963
7964   emit_label (neglab);
7965
7966   emit_insn (gen_rtx_SET (f0, gen_rtx_MINUS (mode, in, limit)));
7967   emit_insn (gen_rtx_SET (i0,
7968                           gen_rtx_FIX (DImode, gen_rtx_FIX (mode, f0))));
7969   emit_insn (gen_movdi (i1, const1_rtx));
7970   emit_insn (gen_ashldi3 (i1, i1, GEN_INT (63)));
7971   emit_insn (gen_xordi3 (out, i0, i1));
7972
7973   emit_label (donelab);
7974 }
7975
7976 /* Return the string to output a compare and branch instruction to DEST.
7977    DEST is the destination insn (i.e. the label), INSN is the source,
7978    and OP is the conditional expression.  */
7979
7980 const char *
7981 output_cbcond (rtx op, rtx dest, rtx_insn *insn)
7982 {
7983   machine_mode mode = GET_MODE (XEXP (op, 0));
7984   enum rtx_code code = GET_CODE (op);
7985   const char *cond_str, *tmpl;
7986   int far, emit_nop, len;
7987   static char string[64];
7988   char size_char;
7989
7990   /* Compare and Branch is limited to +-2KB.  If it is too far away,
7991      change
7992
7993      cxbne X, Y, .LC30
7994
7995      to
7996
7997      cxbe X, Y, .+16
7998      nop
7999      ba,pt xcc, .LC30
8000       nop  */
8001
8002   len = get_attr_length (insn);
8003
8004   far = len == 4;
8005   emit_nop = len == 2;
8006
8007   if (far)
8008     code = reverse_condition (code);
8009
8010   size_char = ((mode == SImode) ? 'w' : 'x');
8011
8012   switch (code)
8013     {
8014     case NE:
8015       cond_str = "ne";
8016       break;
8017
8018     case EQ:
8019       cond_str = "e";
8020       break;
8021
8022     case GE:
8023       if (mode == CC_NOOVmode || mode == CCX_NOOVmode)
8024         cond_str = "pos";
8025       else
8026         cond_str = "ge";
8027       break;
8028
8029     case GT:
8030       cond_str = "g";
8031       break;
8032
8033     case LE:
8034       cond_str = "le";
8035       break;
8036
8037     case LT:
8038       if (mode == CC_NOOVmode || mode == CCX_NOOVmode)
8039         cond_str = "neg";
8040       else
8041         cond_str = "l";
8042       break;
8043
8044     case GEU:
8045       cond_str = "cc";
8046       break;
8047
8048     case GTU:
8049       cond_str = "gu";
8050       break;
8051
8052     case LEU:
8053       cond_str = "leu";
8054       break;
8055
8056     case LTU:
8057       cond_str = "cs";
8058       break;
8059
8060     default:
8061       gcc_unreachable ();
8062     }
8063
8064   if (far)
8065     {
8066       int veryfar = 1, delta;
8067
8068       if (INSN_ADDRESSES_SET_P ())
8069         {
8070           delta = (INSN_ADDRESSES (INSN_UID (dest))
8071                    - INSN_ADDRESSES (INSN_UID (insn)));
8072           /* Leave some instructions for "slop".  */
8073           if (delta >= -260000 && delta < 260000)
8074             veryfar = 0;
8075         }
8076
8077       if (veryfar)
8078         tmpl = "c%cb%s\t%%1, %%2, .+16\n\tnop\n\tb\t%%3\n\tnop";
8079       else
8080         tmpl = "c%cb%s\t%%1, %%2, .+16\n\tnop\n\tba,pt\t%%%%xcc, %%3\n\tnop";
8081     }
8082   else
8083     {
8084       if (emit_nop)
8085         tmpl = "c%cb%s\t%%1, %%2, %%3\n\tnop";
8086       else
8087         tmpl = "c%cb%s\t%%1, %%2, %%3";
8088     }
8089
8090   snprintf (string, sizeof(string), tmpl, size_char, cond_str);
8091
8092   return string;
8093 }
8094
8095 /* Return the string to output a conditional branch to LABEL, testing
8096    register REG.  LABEL is the operand number of the label; REG is the
8097    operand number of the reg.  OP is the conditional expression.  The mode
8098    of REG says what kind of comparison we made.
8099
8100    DEST is the destination insn (i.e. the label), INSN is the source.
8101
8102    REVERSED is nonzero if we should reverse the sense of the comparison.
8103
8104    ANNUL is nonzero if we should generate an annulling branch.  */
8105
8106 const char *
8107 output_v9branch (rtx op, rtx dest, int reg, int label, int reversed,
8108                  int annul, rtx_insn *insn)
8109 {
8110   static char string[64];
8111   enum rtx_code code = GET_CODE (op);
8112   machine_mode mode = GET_MODE (XEXP (op, 0));
8113   rtx note;
8114   int far;
8115   char *p;
8116
8117   /* branch on register are limited to +-128KB.  If it is too far away,
8118      change
8119
8120      brnz,pt %g1, .LC30
8121
8122      to
8123
8124      brz,pn %g1, .+12
8125       nop
8126      ba,pt %xcc, .LC30
8127
8128      and
8129
8130      brgez,a,pn %o1, .LC29
8131
8132      to
8133
8134      brlz,pt %o1, .+16
8135       nop
8136      ba,pt %xcc, .LC29  */
8137
8138   far = get_attr_length (insn) >= 3;
8139
8140   /* If not floating-point or if EQ or NE, we can just reverse the code.  */
8141   if (reversed ^ far)
8142     code = reverse_condition (code);
8143
8144   /* Only 64 bit versions of these instructions exist.  */
8145   gcc_assert (mode == DImode);
8146
8147   /* Start by writing the branch condition.  */
8148
8149   switch (code)
8150     {
8151     case NE:
8152       strcpy (string, "brnz");
8153       break;
8154
8155     case EQ:
8156       strcpy (string, "brz");
8157       break;
8158
8159     case GE:
8160       strcpy (string, "brgez");
8161       break;
8162
8163     case LT:
8164       strcpy (string, "brlz");
8165       break;
8166
8167     case LE:
8168       strcpy (string, "brlez");
8169       break;
8170
8171     case GT:
8172       strcpy (string, "brgz");
8173       break;
8174
8175     default:
8176       gcc_unreachable ();
8177     }
8178
8179   p = strchr (string, '\0');
8180
8181   /* Now add the annulling, reg, label, and nop.  */
8182   if (annul && ! far)
8183     {
8184       strcpy (p, ",a");
8185       p += 2;
8186     }
8187
8188   if (insn && (note = find_reg_note (insn, REG_BR_PROB, NULL_RTX)))
8189     {
8190       strcpy (p,
8191               ((XINT (note, 0) >= REG_BR_PROB_BASE / 2) ^ far)
8192               ? ",pt" : ",pn");
8193       p += 3;
8194     }
8195
8196   *p = p < string + 8 ? '\t' : ' ';
8197   p++;
8198   *p++ = '%';
8199   *p++ = '0' + reg;
8200   *p++ = ',';
8201   *p++ = ' ';
8202   if (far)
8203     {
8204       int veryfar = 1, delta;
8205
8206       if (INSN_ADDRESSES_SET_P ())
8207         {
8208           delta = (INSN_ADDRESSES (INSN_UID (dest))
8209                    - INSN_ADDRESSES (INSN_UID (insn)));
8210           /* Leave some instructions for "slop".  */
8211           if (delta >= -260000 && delta < 260000)
8212             veryfar = 0;
8213         }
8214
8215       strcpy (p, ".+12\n\t nop\n\t");
8216       /* Skip the next insn if requested or
8217          if we know that it will be a nop.  */
8218       if (annul || ! final_sequence)
8219         p[3] = '6';
8220       p += 12;
8221       if (veryfar)
8222         {
8223           strcpy (p, "b\t");
8224           p += 2;
8225         }
8226       else
8227         {
8228           strcpy (p, "ba,pt\t%%xcc, ");
8229           p += 13;
8230         }
8231     }
8232   *p++ = '%';
8233   *p++ = 'l';
8234   *p++ = '0' + label;
8235   *p++ = '%';
8236   *p++ = '#';
8237   *p = '\0';
8238
8239   return string;
8240 }
8241
8242 /* Return 1, if any of the registers of the instruction are %l[0-7] or %o[0-7].
8243    Such instructions cannot be used in the delay slot of return insn on v9.
8244    If TEST is 0, also rename all %i[0-7] registers to their %o[0-7] counterparts.
8245  */
8246
8247 static int
8248 epilogue_renumber (register rtx *where, int test)
8249 {
8250   register const char *fmt;
8251   register int i;
8252   register enum rtx_code code;
8253
8254   if (*where == 0)
8255     return 0;
8256
8257   code = GET_CODE (*where);
8258
8259   switch (code)
8260     {
8261     case REG:
8262       if (REGNO (*where) >= 8 && REGNO (*where) < 24)      /* oX or lX */
8263         return 1;
8264       if (! test && REGNO (*where) >= 24 && REGNO (*where) < 32)
8265         *where = gen_rtx_REG (GET_MODE (*where), OUTGOING_REGNO (REGNO(*where)));
8266     case SCRATCH:
8267     case CC0:
8268     case PC:
8269     case CONST_INT:
8270     case CONST_WIDE_INT:
8271     case CONST_DOUBLE:
8272       return 0;
8273
8274       /* Do not replace the frame pointer with the stack pointer because
8275          it can cause the delayed instruction to load below the stack.
8276          This occurs when instructions like:
8277
8278          (set (reg/i:SI 24 %i0)
8279              (mem/f:SI (plus:SI (reg/f:SI 30 %fp)
8280                        (const_int -20 [0xffffffec])) 0))
8281
8282          are in the return delayed slot.  */
8283     case PLUS:
8284       if (GET_CODE (XEXP (*where, 0)) == REG
8285           && REGNO (XEXP (*where, 0)) == HARD_FRAME_POINTER_REGNUM
8286           && (GET_CODE (XEXP (*where, 1)) != CONST_INT
8287               || INTVAL (XEXP (*where, 1)) < SPARC_STACK_BIAS))
8288         return 1;
8289       break;
8290
8291     case MEM:
8292       if (SPARC_STACK_BIAS
8293           && GET_CODE (XEXP (*where, 0)) == REG
8294           && REGNO (XEXP (*where, 0)) == HARD_FRAME_POINTER_REGNUM)
8295         return 1;
8296       break;
8297
8298     default:
8299       break;
8300     }
8301
8302   fmt = GET_RTX_FORMAT (code);
8303
8304   for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
8305     {
8306       if (fmt[i] == 'E')
8307         {
8308           register int j;
8309           for (j = XVECLEN (*where, i) - 1; j >= 0; j--)
8310             if (epilogue_renumber (&(XVECEXP (*where, i, j)), test))
8311               return 1;
8312         }
8313       else if (fmt[i] == 'e'
8314                && epilogue_renumber (&(XEXP (*where, i)), test))
8315         return 1;
8316     }
8317   return 0;
8318 }
8319 \f
8320 /* Leaf functions and non-leaf functions have different needs.  */
8321
8322 static const int
8323 reg_leaf_alloc_order[] = REG_LEAF_ALLOC_ORDER;
8324
8325 static const int
8326 reg_nonleaf_alloc_order[] = REG_ALLOC_ORDER;
8327
8328 static const int *const reg_alloc_orders[] = {
8329   reg_leaf_alloc_order,
8330   reg_nonleaf_alloc_order};
8331
8332 void
8333 order_regs_for_local_alloc (void)
8334 {
8335   static int last_order_nonleaf = 1;
8336
8337   if (df_regs_ever_live_p (15) != last_order_nonleaf)
8338     {
8339       last_order_nonleaf = !last_order_nonleaf;
8340       memcpy ((char *) reg_alloc_order,
8341               (const char *) reg_alloc_orders[last_order_nonleaf],
8342               FIRST_PSEUDO_REGISTER * sizeof (int));
8343     }
8344 }
8345 \f
8346 /* Return 1 if REG and MEM are legitimate enough to allow the various
8347    mem<-->reg splits to be run.  */
8348
8349 int
8350 sparc_splitdi_legitimate (rtx reg, rtx mem)
8351 {
8352   /* Punt if we are here by mistake.  */
8353   gcc_assert (reload_completed);
8354
8355   /* We must have an offsettable memory reference.  */
8356   if (! offsettable_memref_p (mem))
8357     return 0;
8358
8359   /* If we have legitimate args for ldd/std, we do not want
8360      the split to happen.  */
8361   if ((REGNO (reg) % 2) == 0
8362       && mem_min_alignment (mem, 8))
8363     return 0;
8364
8365   /* Success.  */
8366   return 1;
8367 }
8368
8369 /* Like sparc_splitdi_legitimate but for REG <--> REG moves.  */
8370
8371 int
8372 sparc_split_regreg_legitimate (rtx reg1, rtx reg2)
8373 {
8374   int regno1, regno2;
8375
8376   if (GET_CODE (reg1) == SUBREG)
8377     reg1 = SUBREG_REG (reg1);
8378   if (GET_CODE (reg1) != REG)
8379     return 0;
8380   regno1 = REGNO (reg1);
8381
8382   if (GET_CODE (reg2) == SUBREG)
8383     reg2 = SUBREG_REG (reg2);
8384   if (GET_CODE (reg2) != REG)
8385     return 0;
8386   regno2 = REGNO (reg2);
8387
8388   if (SPARC_INT_REG_P (regno1) && SPARC_INT_REG_P (regno2))
8389     return 1;
8390
8391   if (TARGET_VIS3)
8392     {
8393       if ((SPARC_INT_REG_P (regno1) && SPARC_FP_REG_P (regno2))
8394           || (SPARC_FP_REG_P (regno1) && SPARC_INT_REG_P (regno2)))
8395         return 1;
8396     }
8397
8398   return 0;
8399 }
8400
8401 /* Return 1 if REGNO (reg1) is even and REGNO (reg1) == REGNO (reg2) - 1.
8402    This makes them candidates for using ldd and std insns.
8403
8404    Note reg1 and reg2 *must* be hard registers.  */
8405
8406 int
8407 registers_ok_for_ldd_peep (rtx reg1, rtx reg2)
8408 {
8409   /* We might have been passed a SUBREG.  */
8410   if (GET_CODE (reg1) != REG || GET_CODE (reg2) != REG)
8411     return 0;
8412
8413   if (REGNO (reg1) % 2 != 0)
8414     return 0;
8415
8416   /* Integer ldd is deprecated in SPARC V9 */
8417   if (TARGET_V9 && SPARC_INT_REG_P (REGNO (reg1)))
8418     return 0;
8419
8420   return (REGNO (reg1) == REGNO (reg2) - 1);
8421 }
8422
8423 /* Return 1 if the addresses in mem1 and mem2 are suitable for use in
8424    an ldd or std insn.
8425
8426    This can only happen when addr1 and addr2, the addresses in mem1
8427    and mem2, are consecutive memory locations (addr1 + 4 == addr2).
8428    addr1 must also be aligned on a 64-bit boundary.
8429
8430    Also iff dependent_reg_rtx is not null it should not be used to
8431    compute the address for mem1, i.e. we cannot optimize a sequence
8432    like:
8433         ld [%o0], %o0
8434         ld [%o0 + 4], %o1
8435    to
8436         ldd [%o0], %o0
8437    nor:
8438         ld [%g3 + 4], %g3
8439         ld [%g3], %g2
8440    to
8441         ldd [%g3], %g2
8442
8443    But, note that the transformation from:
8444         ld [%g2 + 4], %g3
8445         ld [%g2], %g2
8446    to
8447         ldd [%g2], %g2
8448    is perfectly fine.  Thus, the peephole2 patterns always pass us
8449    the destination register of the first load, never the second one.
8450
8451    For stores we don't have a similar problem, so dependent_reg_rtx is
8452    NULL_RTX.  */
8453
8454 int
8455 mems_ok_for_ldd_peep (rtx mem1, rtx mem2, rtx dependent_reg_rtx)
8456 {
8457   rtx addr1, addr2;
8458   unsigned int reg1;
8459   HOST_WIDE_INT offset1;
8460
8461   /* The mems cannot be volatile.  */
8462   if (MEM_VOLATILE_P (mem1) || MEM_VOLATILE_P (mem2))
8463     return 0;
8464
8465   /* MEM1 should be aligned on a 64-bit boundary.  */
8466   if (MEM_ALIGN (mem1) < 64)
8467     return 0;
8468
8469   addr1 = XEXP (mem1, 0);
8470   addr2 = XEXP (mem2, 0);
8471
8472   /* Extract a register number and offset (if used) from the first addr.  */
8473   if (GET_CODE (addr1) == PLUS)
8474     {
8475       /* If not a REG, return zero.  */
8476       if (GET_CODE (XEXP (addr1, 0)) != REG)
8477         return 0;
8478       else
8479         {
8480           reg1 = REGNO (XEXP (addr1, 0));
8481           /* The offset must be constant!  */
8482           if (GET_CODE (XEXP (addr1, 1)) != CONST_INT)
8483             return 0;
8484           offset1 = INTVAL (XEXP (addr1, 1));
8485         }
8486     }
8487   else if (GET_CODE (addr1) != REG)
8488     return 0;
8489   else
8490     {
8491       reg1 = REGNO (addr1);
8492       /* This was a simple (mem (reg)) expression.  Offset is 0.  */
8493       offset1 = 0;
8494     }
8495
8496   /* Make sure the second address is a (mem (plus (reg) (const_int).  */
8497   if (GET_CODE (addr2) != PLUS)
8498     return 0;
8499
8500   if (GET_CODE (XEXP (addr2, 0)) != REG
8501       || GET_CODE (XEXP (addr2, 1)) != CONST_INT)
8502     return 0;
8503
8504   if (reg1 != REGNO (XEXP (addr2, 0)))
8505     return 0;
8506
8507   if (dependent_reg_rtx != NULL_RTX && reg1 == REGNO (dependent_reg_rtx))
8508     return 0;
8509
8510   /* The first offset must be evenly divisible by 8 to ensure the
8511      address is 64 bit aligned.  */
8512   if (offset1 % 8 != 0)
8513     return 0;
8514
8515   /* The offset for the second addr must be 4 more than the first addr.  */
8516   if (INTVAL (XEXP (addr2, 1)) != offset1 + 4)
8517     return 0;
8518
8519   /* All the tests passed.  addr1 and addr2 are valid for ldd and std
8520      instructions.  */
8521   return 1;
8522 }
8523
8524 /* Return the widened memory access made of MEM1 and MEM2 in MODE.  */
8525
8526 rtx
8527 widen_mem_for_ldd_peep (rtx mem1, rtx mem2, machine_mode mode)
8528 {
8529   rtx x = widen_memory_access (mem1, mode, 0);
8530   MEM_NOTRAP_P (x) = MEM_NOTRAP_P (mem1) && MEM_NOTRAP_P (mem2);
8531   return x;
8532 }
8533
8534 /* Return 1 if reg is a pseudo, or is the first register in
8535    a hard register pair.  This makes it suitable for use in
8536    ldd and std insns.  */
8537
8538 int
8539 register_ok_for_ldd (rtx reg)
8540 {
8541   /* We might have been passed a SUBREG.  */
8542   if (!REG_P (reg))
8543     return 0;
8544
8545   if (REGNO (reg) < FIRST_PSEUDO_REGISTER)
8546     return (REGNO (reg) % 2 == 0);
8547
8548   return 1;
8549 }
8550
8551 /* Return 1 if OP, a MEM, has an address which is known to be
8552    aligned to an 8-byte boundary.  */
8553
8554 int
8555 memory_ok_for_ldd (rtx op)
8556 {
8557   /* In 64-bit mode, we assume that the address is word-aligned.  */
8558   if (TARGET_ARCH32 && !mem_min_alignment (op, 8))
8559     return 0;
8560
8561   if (! can_create_pseudo_p ()
8562       && !strict_memory_address_p (Pmode, XEXP (op, 0)))
8563     return 0;
8564
8565   return 1;
8566 }
8567 \f
8568 /* Implement TARGET_PRINT_OPERAND_PUNCT_VALID_P.  */
8569
8570 static bool
8571 sparc_print_operand_punct_valid_p (unsigned char code)
8572 {
8573   if (code == '#'
8574       || code == '*'
8575       || code == '('
8576       || code == ')'
8577       || code == '_'
8578       || code == '&')
8579     return true;
8580
8581   return false;
8582 }
8583
8584 /* Implement TARGET_PRINT_OPERAND.
8585    Print operand X (an rtx) in assembler syntax to file FILE.
8586    CODE is a letter or dot (`z' in `%z0') or 0 if no letter was specified.
8587    For `%' followed by punctuation, CODE is the punctuation and X is null.  */
8588
8589 static void
8590 sparc_print_operand (FILE *file, rtx x, int code)
8591 {
8592   switch (code)
8593     {
8594     case '#':
8595       /* Output an insn in a delay slot.  */
8596       if (final_sequence)
8597         sparc_indent_opcode = 1;
8598       else
8599         fputs ("\n\t nop", file);
8600       return;
8601     case '*':
8602       /* Output an annul flag if there's nothing for the delay slot and we
8603          are optimizing.  This is always used with '(' below.
8604          Sun OS 4.1.1 dbx can't handle an annulled unconditional branch;
8605          this is a dbx bug.  So, we only do this when optimizing.
8606          On UltraSPARC, a branch in a delay slot causes a pipeline flush.
8607          Always emit a nop in case the next instruction is a branch.  */
8608       if (! final_sequence && (optimize && (int)sparc_cpu < PROCESSOR_V9))
8609         fputs (",a", file);
8610       return;
8611     case '(':
8612       /* Output a 'nop' if there's nothing for the delay slot and we are
8613          not optimizing.  This is always used with '*' above.  */
8614       if (! final_sequence && ! (optimize && (int)sparc_cpu < PROCESSOR_V9))
8615         fputs ("\n\t nop", file);
8616       else if (final_sequence)
8617         sparc_indent_opcode = 1;
8618       return;
8619     case ')':
8620       /* Output the right displacement from the saved PC on function return.
8621          The caller may have placed an "unimp" insn immediately after the call
8622          so we have to account for it.  This insn is used in the 32-bit ABI
8623          when calling a function that returns a non zero-sized structure.  The
8624          64-bit ABI doesn't have it.  Be careful to have this test be the same
8625          as that for the call.  The exception is when sparc_std_struct_return
8626          is enabled, the psABI is followed exactly and the adjustment is made
8627          by the code in sparc_struct_value_rtx.  The call emitted is the same
8628          when sparc_std_struct_return is enabled. */
8629      if (!TARGET_ARCH64
8630          && cfun->returns_struct
8631          && !sparc_std_struct_return
8632          && DECL_SIZE (DECL_RESULT (current_function_decl))
8633          && TREE_CODE (DECL_SIZE (DECL_RESULT (current_function_decl)))
8634              == INTEGER_CST
8635          && !integer_zerop (DECL_SIZE (DECL_RESULT (current_function_decl))))
8636         fputs ("12", file);
8637       else
8638         fputc ('8', file);
8639       return;
8640     case '_':
8641       /* Output the Embedded Medium/Anywhere code model base register.  */
8642       fputs (EMBMEDANY_BASE_REG, file);
8643       return;
8644     case '&':
8645       /* Print some local dynamic TLS name.  */
8646       if (const char *name = get_some_local_dynamic_name ())
8647         assemble_name (file, name);
8648       else
8649         output_operand_lossage ("'%%&' used without any "
8650                                 "local dynamic TLS references");
8651       return;
8652
8653     case 'Y':
8654       /* Adjust the operand to take into account a RESTORE operation.  */
8655       if (GET_CODE (x) == CONST_INT)
8656         break;
8657       else if (GET_CODE (x) != REG)
8658         output_operand_lossage ("invalid %%Y operand");
8659       else if (REGNO (x) < 8)
8660         fputs (reg_names[REGNO (x)], file);
8661       else if (REGNO (x) >= 24 && REGNO (x) < 32)
8662         fputs (reg_names[REGNO (x)-16], file);
8663       else
8664         output_operand_lossage ("invalid %%Y operand");
8665       return;
8666     case 'L':
8667       /* Print out the low order register name of a register pair.  */
8668       if (WORDS_BIG_ENDIAN)
8669         fputs (reg_names[REGNO (x)+1], file);
8670       else
8671         fputs (reg_names[REGNO (x)], file);
8672       return;
8673     case 'H':
8674       /* Print out the high order register name of a register pair.  */
8675       if (WORDS_BIG_ENDIAN)
8676         fputs (reg_names[REGNO (x)], file);
8677       else
8678         fputs (reg_names[REGNO (x)+1], file);
8679       return;
8680     case 'R':
8681       /* Print out the second register name of a register pair or quad.
8682          I.e., R (%o0) => %o1.  */
8683       fputs (reg_names[REGNO (x)+1], file);
8684       return;
8685     case 'S':
8686       /* Print out the third register name of a register quad.
8687          I.e., S (%o0) => %o2.  */
8688       fputs (reg_names[REGNO (x)+2], file);
8689       return;
8690     case 'T':
8691       /* Print out the fourth register name of a register quad.
8692          I.e., T (%o0) => %o3.  */
8693       fputs (reg_names[REGNO (x)+3], file);
8694       return;
8695     case 'x':
8696       /* Print a condition code register.  */
8697       if (REGNO (x) == SPARC_ICC_REG)
8698         {
8699           /* We don't handle CC[X]_NOOVmode because they're not supposed
8700              to occur here.  */
8701           if (GET_MODE (x) == CCmode)
8702             fputs ("%icc", file);
8703           else if (GET_MODE (x) == CCXmode)
8704             fputs ("%xcc", file);
8705           else
8706             gcc_unreachable ();
8707         }
8708       else
8709         /* %fccN register */
8710         fputs (reg_names[REGNO (x)], file);
8711       return;
8712     case 'm':
8713       /* Print the operand's address only.  */
8714       output_address (GET_MODE (x), XEXP (x, 0));
8715       return;
8716     case 'r':
8717       /* In this case we need a register.  Use %g0 if the
8718          operand is const0_rtx.  */
8719       if (x == const0_rtx
8720           || (GET_MODE (x) != VOIDmode && x == CONST0_RTX (GET_MODE (x))))
8721         {
8722           fputs ("%g0", file);
8723           return;
8724         }
8725       else
8726         break;
8727
8728     case 'A':
8729       switch (GET_CODE (x))
8730         {
8731         case IOR: fputs ("or", file); break;
8732         case AND: fputs ("and", file); break;
8733         case XOR: fputs ("xor", file); break;
8734         default: output_operand_lossage ("invalid %%A operand");
8735         }
8736       return;
8737
8738     case 'B':
8739       switch (GET_CODE (x))
8740         {
8741         case IOR: fputs ("orn", file); break;
8742         case AND: fputs ("andn", file); break;
8743         case XOR: fputs ("xnor", file); break;
8744         default: output_operand_lossage ("invalid %%B operand");
8745         }
8746       return;
8747
8748       /* This is used by the conditional move instructions.  */
8749     case 'C':
8750       {
8751         enum rtx_code rc = GET_CODE (x);
8752         
8753         switch (rc)
8754           {
8755           case NE: fputs ("ne", file); break;
8756           case EQ: fputs ("e", file); break;
8757           case GE: fputs ("ge", file); break;
8758           case GT: fputs ("g", file); break;
8759           case LE: fputs ("le", file); break;
8760           case LT: fputs ("l", file); break;
8761           case GEU: fputs ("geu", file); break;
8762           case GTU: fputs ("gu", file); break;
8763           case LEU: fputs ("leu", file); break;
8764           case LTU: fputs ("lu", file); break;
8765           case LTGT: fputs ("lg", file); break;
8766           case UNORDERED: fputs ("u", file); break;
8767           case ORDERED: fputs ("o", file); break;
8768           case UNLT: fputs ("ul", file); break;
8769           case UNLE: fputs ("ule", file); break;
8770           case UNGT: fputs ("ug", file); break;
8771           case UNGE: fputs ("uge", file); break;
8772           case UNEQ: fputs ("ue", file); break;
8773           default: output_operand_lossage ("invalid %%C operand");
8774           }
8775         return;
8776       }
8777
8778       /* This are used by the movr instruction pattern.  */
8779     case 'D':
8780       {
8781         enum rtx_code rc = GET_CODE (x);
8782         switch (rc)
8783           {
8784           case NE: fputs ("ne", file); break;
8785           case EQ: fputs ("e", file); break;
8786           case GE: fputs ("gez", file); break;
8787           case LT: fputs ("lz", file); break;
8788           case LE: fputs ("lez", file); break;
8789           case GT: fputs ("gz", file); break;
8790           default: output_operand_lossage ("invalid %%D operand");
8791           }
8792         return;
8793       }
8794
8795     case 'b':
8796       {
8797         /* Print a sign-extended character.  */
8798         int i = trunc_int_for_mode (INTVAL (x), QImode);
8799         fprintf (file, "%d", i);
8800         return;
8801       }
8802
8803     case 'f':
8804       /* Operand must be a MEM; write its address.  */
8805       if (GET_CODE (x) != MEM)
8806         output_operand_lossage ("invalid %%f operand");
8807       output_address (GET_MODE (x), XEXP (x, 0));
8808       return;
8809
8810     case 's':
8811       {
8812         /* Print a sign-extended 32-bit value.  */
8813         HOST_WIDE_INT i;
8814         if (GET_CODE(x) == CONST_INT)
8815           i = INTVAL (x);
8816         else
8817           {
8818             output_operand_lossage ("invalid %%s operand");
8819             return;
8820           }
8821         i = trunc_int_for_mode (i, SImode);
8822         fprintf (file, HOST_WIDE_INT_PRINT_DEC, i);
8823         return;
8824       }
8825
8826     case 0:
8827       /* Do nothing special.  */
8828       break;
8829
8830     default:
8831       /* Undocumented flag.  */
8832       output_operand_lossage ("invalid operand output code");
8833     }
8834
8835   if (GET_CODE (x) == REG)
8836     fputs (reg_names[REGNO (x)], file);
8837   else if (GET_CODE (x) == MEM)
8838     {
8839       fputc ('[', file);
8840         /* Poor Sun assembler doesn't understand absolute addressing.  */
8841       if (CONSTANT_P (XEXP (x, 0)))
8842         fputs ("%g0+", file);
8843       output_address (GET_MODE (x), XEXP (x, 0));
8844       fputc (']', file);
8845     }
8846   else if (GET_CODE (x) == HIGH)
8847     {
8848       fputs ("%hi(", file);
8849       output_addr_const (file, XEXP (x, 0));
8850       fputc (')', file);
8851     }
8852   else if (GET_CODE (x) == LO_SUM)
8853     {
8854       sparc_print_operand (file, XEXP (x, 0), 0);
8855       if (TARGET_CM_MEDMID)
8856         fputs ("+%l44(", file);
8857       else
8858         fputs ("+%lo(", file);
8859       output_addr_const (file, XEXP (x, 1));
8860       fputc (')', file);
8861     }
8862   else if (GET_CODE (x) == CONST_DOUBLE)
8863     output_operand_lossage ("floating-point constant not a valid immediate operand");
8864   else
8865     output_addr_const (file, x);
8866 }
8867
8868 /* Implement TARGET_PRINT_OPERAND_ADDRESS.  */
8869
8870 static void
8871 sparc_print_operand_address (FILE *file, machine_mode /*mode*/, rtx x)
8872 {
8873   register rtx base, index = 0;
8874   int offset = 0;
8875   register rtx addr = x;
8876
8877   if (REG_P (addr))
8878     fputs (reg_names[REGNO (addr)], file);
8879   else if (GET_CODE (addr) == PLUS)
8880     {
8881       if (CONST_INT_P (XEXP (addr, 0)))
8882         offset = INTVAL (XEXP (addr, 0)), base = XEXP (addr, 1);
8883       else if (CONST_INT_P (XEXP (addr, 1)))
8884         offset = INTVAL (XEXP (addr, 1)), base = XEXP (addr, 0);
8885       else
8886         base = XEXP (addr, 0), index = XEXP (addr, 1);
8887       if (GET_CODE (base) == LO_SUM)
8888         {
8889           gcc_assert (USE_AS_OFFSETABLE_LO10
8890                       && TARGET_ARCH64
8891                       && ! TARGET_CM_MEDMID);
8892           output_operand (XEXP (base, 0), 0);
8893           fputs ("+%lo(", file);
8894           output_address (VOIDmode, XEXP (base, 1));
8895           fprintf (file, ")+%d", offset);
8896         }
8897       else
8898         {
8899           fputs (reg_names[REGNO (base)], file);
8900           if (index == 0)
8901             fprintf (file, "%+d", offset);
8902           else if (REG_P (index))
8903             fprintf (file, "+%s", reg_names[REGNO (index)]);
8904           else if (GET_CODE (index) == SYMBOL_REF
8905                    || GET_CODE (index) == LABEL_REF
8906                    || GET_CODE (index) == CONST)
8907             fputc ('+', file), output_addr_const (file, index);
8908           else gcc_unreachable ();
8909         }
8910     }
8911   else if (GET_CODE (addr) == MINUS
8912            && GET_CODE (XEXP (addr, 1)) == LABEL_REF)
8913     {
8914       output_addr_const (file, XEXP (addr, 0));
8915       fputs ("-(", file);
8916       output_addr_const (file, XEXP (addr, 1));
8917       fputs ("-.)", file);
8918     }
8919   else if (GET_CODE (addr) == LO_SUM)
8920     {
8921       output_operand (XEXP (addr, 0), 0);
8922       if (TARGET_CM_MEDMID)
8923         fputs ("+%l44(", file);
8924       else
8925         fputs ("+%lo(", file);
8926       output_address (VOIDmode, XEXP (addr, 1));
8927       fputc (')', file);
8928     }
8929   else if (flag_pic
8930            && GET_CODE (addr) == CONST
8931            && GET_CODE (XEXP (addr, 0)) == MINUS
8932            && GET_CODE (XEXP (XEXP (addr, 0), 1)) == CONST
8933            && GET_CODE (XEXP (XEXP (XEXP (addr, 0), 1), 0)) == MINUS
8934            && XEXP (XEXP (XEXP (XEXP (addr, 0), 1), 0), 1) == pc_rtx)
8935     {
8936       addr = XEXP (addr, 0);
8937       output_addr_const (file, XEXP (addr, 0));
8938       /* Group the args of the second CONST in parenthesis.  */
8939       fputs ("-(", file);
8940       /* Skip past the second CONST--it does nothing for us.  */
8941       output_addr_const (file, XEXP (XEXP (addr, 1), 0));
8942       /* Close the parenthesis.  */
8943       fputc (')', file);
8944     }
8945   else
8946     {
8947       output_addr_const (file, addr);
8948     }
8949 }
8950 \f
8951 /* Target hook for assembling integer objects.  The sparc version has
8952    special handling for aligned DI-mode objects.  */
8953
8954 static bool
8955 sparc_assemble_integer (rtx x, unsigned int size, int aligned_p)
8956 {
8957   /* ??? We only output .xword's for symbols and only then in environments
8958      where the assembler can handle them.  */
8959   if (aligned_p && size == 8 && GET_CODE (x) != CONST_INT)
8960     {
8961       if (TARGET_V9)
8962         {
8963           assemble_integer_with_op ("\t.xword\t", x);
8964           return true;
8965         }
8966       else
8967         {
8968           assemble_aligned_integer (4, const0_rtx);
8969           assemble_aligned_integer (4, x);
8970           return true;
8971         }
8972     }
8973   return default_assemble_integer (x, size, aligned_p);
8974 }
8975 \f
8976 /* Return the value of a code used in the .proc pseudo-op that says
8977    what kind of result this function returns.  For non-C types, we pick
8978    the closest C type.  */
8979
8980 #ifndef SHORT_TYPE_SIZE
8981 #define SHORT_TYPE_SIZE (BITS_PER_UNIT * 2)
8982 #endif
8983
8984 #ifndef INT_TYPE_SIZE
8985 #define INT_TYPE_SIZE BITS_PER_WORD
8986 #endif
8987
8988 #ifndef LONG_TYPE_SIZE
8989 #define LONG_TYPE_SIZE BITS_PER_WORD
8990 #endif
8991
8992 #ifndef LONG_LONG_TYPE_SIZE
8993 #define LONG_LONG_TYPE_SIZE (BITS_PER_WORD * 2)
8994 #endif
8995
8996 #ifndef FLOAT_TYPE_SIZE
8997 #define FLOAT_TYPE_SIZE BITS_PER_WORD
8998 #endif
8999
9000 #ifndef DOUBLE_TYPE_SIZE
9001 #define DOUBLE_TYPE_SIZE (BITS_PER_WORD * 2)
9002 #endif
9003
9004 #ifndef LONG_DOUBLE_TYPE_SIZE
9005 #define LONG_DOUBLE_TYPE_SIZE (BITS_PER_WORD * 2)
9006 #endif
9007
9008 unsigned long
9009 sparc_type_code (register tree type)
9010 {
9011   register unsigned long qualifiers = 0;
9012   register unsigned shift;
9013
9014   /* Only the first 30 bits of the qualifier are valid.  We must refrain from
9015      setting more, since some assemblers will give an error for this.  Also,
9016      we must be careful to avoid shifts of 32 bits or more to avoid getting
9017      unpredictable results.  */
9018
9019   for (shift = 6; shift < 30; shift += 2, type = TREE_TYPE (type))
9020     {
9021       switch (TREE_CODE (type))
9022         {
9023         case ERROR_MARK:
9024           return qualifiers;
9025
9026         case ARRAY_TYPE:
9027           qualifiers |= (3 << shift);
9028           break;
9029
9030         case FUNCTION_TYPE:
9031         case METHOD_TYPE:
9032           qualifiers |= (2 << shift);
9033           break;
9034
9035         case POINTER_TYPE:
9036         case REFERENCE_TYPE:
9037         case OFFSET_TYPE:
9038           qualifiers |= (1 << shift);
9039           break;
9040
9041         case RECORD_TYPE:
9042           return (qualifiers | 8);
9043
9044         case UNION_TYPE:
9045         case QUAL_UNION_TYPE:
9046           return (qualifiers | 9);
9047
9048         case ENUMERAL_TYPE:
9049           return (qualifiers | 10);
9050
9051         case VOID_TYPE:
9052           return (qualifiers | 16);
9053
9054         case INTEGER_TYPE:
9055           /* If this is a range type, consider it to be the underlying
9056              type.  */
9057           if (TREE_TYPE (type) != 0)
9058             break;
9059
9060           /* Carefully distinguish all the standard types of C,
9061              without messing up if the language is not C.  We do this by
9062              testing TYPE_PRECISION and TYPE_UNSIGNED.  The old code used to
9063              look at both the names and the above fields, but that's redundant.
9064              Any type whose size is between two C types will be considered
9065              to be the wider of the two types.  Also, we do not have a
9066              special code to use for "long long", so anything wider than
9067              long is treated the same.  Note that we can't distinguish
9068              between "int" and "long" in this code if they are the same
9069              size, but that's fine, since neither can the assembler.  */
9070
9071           if (TYPE_PRECISION (type) <= CHAR_TYPE_SIZE)
9072             return (qualifiers | (TYPE_UNSIGNED (type) ? 12 : 2));
9073
9074           else if (TYPE_PRECISION (type) <= SHORT_TYPE_SIZE)
9075             return (qualifiers | (TYPE_UNSIGNED (type) ? 13 : 3));
9076
9077           else if (TYPE_PRECISION (type) <= INT_TYPE_SIZE)
9078             return (qualifiers | (TYPE_UNSIGNED (type) ? 14 : 4));
9079
9080           else
9081             return (qualifiers | (TYPE_UNSIGNED (type) ? 15 : 5));
9082
9083         case REAL_TYPE:
9084           /* If this is a range type, consider it to be the underlying
9085              type.  */
9086           if (TREE_TYPE (type) != 0)
9087             break;
9088
9089           /* Carefully distinguish all the standard types of C,
9090              without messing up if the language is not C.  */
9091
9092           if (TYPE_PRECISION (type) == FLOAT_TYPE_SIZE)
9093             return (qualifiers | 6);
9094
9095           else
9096             return (qualifiers | 7);
9097
9098         case COMPLEX_TYPE:      /* GNU Fortran COMPLEX type.  */
9099           /* ??? We need to distinguish between double and float complex types,
9100              but I don't know how yet because I can't reach this code from
9101              existing front-ends.  */
9102           return (qualifiers | 7);      /* Who knows? */
9103
9104         case VECTOR_TYPE:
9105         case BOOLEAN_TYPE:      /* Boolean truth value type.  */
9106         case LANG_TYPE:
9107         case NULLPTR_TYPE:
9108           return qualifiers;
9109
9110         default:
9111           gcc_unreachable ();           /* Not a type! */
9112         }
9113     }
9114
9115   return qualifiers;
9116 }
9117 \f
9118 /* Nested function support.  */
9119
9120 /* Emit RTL insns to initialize the variable parts of a trampoline.
9121    FNADDR is an RTX for the address of the function's pure code.
9122    CXT is an RTX for the static chain value for the function.
9123
9124    This takes 16 insns: 2 shifts & 2 ands (to split up addresses), 4 sethi
9125    (to load in opcodes), 4 iors (to merge address and opcodes), and 4 writes
9126    (to store insns).  This is a bit excessive.  Perhaps a different
9127    mechanism would be better here.
9128
9129    Emit enough FLUSH insns to synchronize the data and instruction caches.  */
9130
9131 static void
9132 sparc32_initialize_trampoline (rtx m_tramp, rtx fnaddr, rtx cxt)
9133 {
9134   /* SPARC 32-bit trampoline:
9135
9136         sethi   %hi(fn), %g1
9137         sethi   %hi(static), %g2
9138         jmp     %g1+%lo(fn)
9139         or      %g2, %lo(static), %g2
9140
9141     SETHI i,r  = 00rr rrr1 00ii iiii iiii iiii iiii iiii
9142     JMPL r+i,d = 10dd ddd1 1100 0rrr rr1i iiii iiii iiii
9143    */
9144
9145   emit_move_insn
9146     (adjust_address (m_tramp, SImode, 0),
9147      expand_binop (SImode, ior_optab,
9148                    expand_shift (RSHIFT_EXPR, SImode, fnaddr, 10, 0, 1),
9149                    GEN_INT (trunc_int_for_mode (0x03000000, SImode)),
9150                    NULL_RTX, 1, OPTAB_DIRECT));
9151
9152   emit_move_insn
9153     (adjust_address (m_tramp, SImode, 4),
9154      expand_binop (SImode, ior_optab,
9155                    expand_shift (RSHIFT_EXPR, SImode, cxt, 10, 0, 1),
9156                    GEN_INT (trunc_int_for_mode (0x05000000, SImode)),
9157                    NULL_RTX, 1, OPTAB_DIRECT));
9158
9159   emit_move_insn
9160     (adjust_address (m_tramp, SImode, 8),
9161      expand_binop (SImode, ior_optab,
9162                    expand_and (SImode, fnaddr, GEN_INT (0x3ff), NULL_RTX),
9163                    GEN_INT (trunc_int_for_mode (0x81c06000, SImode)),
9164                    NULL_RTX, 1, OPTAB_DIRECT));
9165
9166   emit_move_insn
9167     (adjust_address (m_tramp, SImode, 12),
9168      expand_binop (SImode, ior_optab,
9169                    expand_and (SImode, cxt, GEN_INT (0x3ff), NULL_RTX),
9170                    GEN_INT (trunc_int_for_mode (0x8410a000, SImode)),
9171                    NULL_RTX, 1, OPTAB_DIRECT));
9172
9173   /* On UltraSPARC a flush flushes an entire cache line.  The trampoline is
9174      aligned on a 16 byte boundary so one flush clears it all.  */
9175   emit_insn (gen_flushsi (validize_mem (adjust_address (m_tramp, SImode, 0))));
9176   if (sparc_cpu != PROCESSOR_ULTRASPARC
9177       && sparc_cpu != PROCESSOR_ULTRASPARC3
9178       && sparc_cpu != PROCESSOR_NIAGARA
9179       && sparc_cpu != PROCESSOR_NIAGARA2
9180       && sparc_cpu != PROCESSOR_NIAGARA3
9181       && sparc_cpu != PROCESSOR_NIAGARA4)
9182     emit_insn (gen_flushsi (validize_mem (adjust_address (m_tramp, SImode, 8))));
9183
9184   /* Call __enable_execute_stack after writing onto the stack to make sure
9185      the stack address is accessible.  */
9186 #ifdef HAVE_ENABLE_EXECUTE_STACK
9187   emit_library_call (gen_rtx_SYMBOL_REF (Pmode, "__enable_execute_stack"),
9188                      LCT_NORMAL, VOIDmode, 1, XEXP (m_tramp, 0), Pmode);
9189 #endif
9190
9191 }
9192
9193 /* The 64-bit version is simpler because it makes more sense to load the
9194    values as "immediate" data out of the trampoline.  It's also easier since
9195    we can read the PC without clobbering a register.  */
9196
9197 static void
9198 sparc64_initialize_trampoline (rtx m_tramp, rtx fnaddr, rtx cxt)
9199 {
9200   /* SPARC 64-bit trampoline:
9201
9202         rd      %pc, %g1
9203         ldx     [%g1+24], %g5
9204         jmp     %g5
9205         ldx     [%g1+16], %g5
9206         +16 bytes data
9207    */
9208
9209   emit_move_insn (adjust_address (m_tramp, SImode, 0),
9210                   GEN_INT (trunc_int_for_mode (0x83414000, SImode)));
9211   emit_move_insn (adjust_address (m_tramp, SImode, 4),
9212                   GEN_INT (trunc_int_for_mode (0xca586018, SImode)));
9213   emit_move_insn (adjust_address (m_tramp, SImode, 8),
9214                   GEN_INT (trunc_int_for_mode (0x81c14000, SImode)));
9215   emit_move_insn (adjust_address (m_tramp, SImode, 12),
9216                   GEN_INT (trunc_int_for_mode (0xca586010, SImode)));
9217   emit_move_insn (adjust_address (m_tramp, DImode, 16), cxt);
9218   emit_move_insn (adjust_address (m_tramp, DImode, 24), fnaddr);
9219   emit_insn (gen_flushdi (validize_mem (adjust_address (m_tramp, DImode, 0))));
9220
9221   if (sparc_cpu != PROCESSOR_ULTRASPARC
9222       && sparc_cpu != PROCESSOR_ULTRASPARC3
9223       && sparc_cpu != PROCESSOR_NIAGARA
9224       && sparc_cpu != PROCESSOR_NIAGARA2
9225       && sparc_cpu != PROCESSOR_NIAGARA3
9226       && sparc_cpu != PROCESSOR_NIAGARA4)
9227     emit_insn (gen_flushdi (validize_mem (adjust_address (m_tramp, DImode, 8))));
9228
9229   /* Call __enable_execute_stack after writing onto the stack to make sure
9230      the stack address is accessible.  */
9231 #ifdef HAVE_ENABLE_EXECUTE_STACK
9232   emit_library_call (gen_rtx_SYMBOL_REF (Pmode, "__enable_execute_stack"),
9233                      LCT_NORMAL, VOIDmode, 1, XEXP (m_tramp, 0), Pmode);
9234 #endif
9235 }
9236
9237 /* Worker for TARGET_TRAMPOLINE_INIT.  */
9238
9239 static void
9240 sparc_trampoline_init (rtx m_tramp, tree fndecl, rtx cxt)
9241 {
9242   rtx fnaddr = force_reg (Pmode, XEXP (DECL_RTL (fndecl), 0));
9243   cxt = force_reg (Pmode, cxt);
9244   if (TARGET_ARCH64)
9245     sparc64_initialize_trampoline (m_tramp, fnaddr, cxt);
9246   else
9247     sparc32_initialize_trampoline (m_tramp, fnaddr, cxt);
9248 }
9249 \f
9250 /* Adjust the cost of a scheduling dependency.  Return the new cost of
9251    a dependency LINK or INSN on DEP_INSN.  COST is the current cost.  */
9252
9253 static int
9254 supersparc_adjust_cost (rtx_insn *insn, rtx link, rtx_insn *dep_insn, int cost)
9255 {
9256   enum attr_type insn_type;
9257
9258   if (recog_memoized (insn) < 0)
9259     return cost;
9260
9261   insn_type = get_attr_type (insn);
9262
9263   if (REG_NOTE_KIND (link) == 0)
9264     {
9265       /* Data dependency; DEP_INSN writes a register that INSN reads some
9266          cycles later.  */
9267
9268       /* if a load, then the dependence must be on the memory address;
9269          add an extra "cycle".  Note that the cost could be two cycles
9270          if the reg was written late in an instruction group; we ca not tell
9271          here.  */
9272       if (insn_type == TYPE_LOAD || insn_type == TYPE_FPLOAD)
9273         return cost + 3;
9274
9275       /* Get the delay only if the address of the store is the dependence.  */
9276       if (insn_type == TYPE_STORE || insn_type == TYPE_FPSTORE)
9277         {
9278           rtx pat = PATTERN(insn);
9279           rtx dep_pat = PATTERN (dep_insn);
9280
9281           if (GET_CODE (pat) != SET || GET_CODE (dep_pat) != SET)
9282             return cost;  /* This should not happen!  */
9283
9284           /* The dependency between the two instructions was on the data that
9285              is being stored.  Assume that this implies that the address of the
9286              store is not dependent.  */
9287           if (rtx_equal_p (SET_DEST (dep_pat), SET_SRC (pat)))
9288             return cost;
9289
9290           return cost + 3;  /* An approximation.  */
9291         }
9292
9293       /* A shift instruction cannot receive its data from an instruction
9294          in the same cycle; add a one cycle penalty.  */
9295       if (insn_type == TYPE_SHIFT)
9296         return cost + 3;   /* Split before cascade into shift.  */
9297     }
9298   else
9299     {
9300       /* Anti- or output- dependency; DEP_INSN reads/writes a register that
9301          INSN writes some cycles later.  */
9302
9303       /* These are only significant for the fpu unit; writing a fp reg before
9304          the fpu has finished with it stalls the processor.  */
9305
9306       /* Reusing an integer register causes no problems.  */
9307       if (insn_type == TYPE_IALU || insn_type == TYPE_SHIFT)
9308         return 0;
9309     }
9310         
9311   return cost;
9312 }
9313
9314 static int
9315 hypersparc_adjust_cost (rtx_insn *insn, rtx link, rtx_insn *dep_insn, int cost)
9316 {
9317   enum attr_type insn_type, dep_type;
9318   rtx pat = PATTERN(insn);
9319   rtx dep_pat = PATTERN (dep_insn);
9320
9321   if (recog_memoized (insn) < 0 || recog_memoized (dep_insn) < 0)
9322     return cost;
9323
9324   insn_type = get_attr_type (insn);
9325   dep_type = get_attr_type (dep_insn);
9326
9327   switch (REG_NOTE_KIND (link))
9328     {
9329     case 0:
9330       /* Data dependency; DEP_INSN writes a register that INSN reads some
9331          cycles later.  */
9332
9333       switch (insn_type)
9334         {
9335         case TYPE_STORE:
9336         case TYPE_FPSTORE:
9337           /* Get the delay iff the address of the store is the dependence.  */
9338           if (GET_CODE (pat) != SET || GET_CODE (dep_pat) != SET)
9339             return cost;
9340
9341           if (rtx_equal_p (SET_DEST (dep_pat), SET_SRC (pat)))
9342             return cost;
9343           return cost + 3;
9344
9345         case TYPE_LOAD:
9346         case TYPE_SLOAD:
9347         case TYPE_FPLOAD:
9348           /* If a load, then the dependence must be on the memory address.  If
9349              the addresses aren't equal, then it might be a false dependency */
9350           if (dep_type == TYPE_STORE || dep_type == TYPE_FPSTORE)
9351             {
9352               if (GET_CODE (pat) != SET || GET_CODE (dep_pat) != SET
9353                   || GET_CODE (SET_DEST (dep_pat)) != MEM
9354                   || GET_CODE (SET_SRC (pat)) != MEM
9355                   || ! rtx_equal_p (XEXP (SET_DEST (dep_pat), 0),
9356                                     XEXP (SET_SRC (pat), 0)))
9357                 return cost + 2;
9358
9359               return cost + 8;
9360             }
9361           break;
9362
9363         case TYPE_BRANCH:
9364           /* Compare to branch latency is 0.  There is no benefit from
9365              separating compare and branch.  */
9366           if (dep_type == TYPE_COMPARE)
9367             return 0;
9368           /* Floating point compare to branch latency is less than
9369              compare to conditional move.  */
9370           if (dep_type == TYPE_FPCMP)
9371             return cost - 1;
9372           break;
9373         default:
9374           break;
9375         }
9376         break;
9377
9378     case REG_DEP_ANTI:
9379       /* Anti-dependencies only penalize the fpu unit.  */
9380       if (insn_type == TYPE_IALU || insn_type == TYPE_SHIFT)
9381         return 0;
9382       break;
9383
9384     default:
9385       break;
9386     }
9387
9388   return cost;
9389 }
9390
9391 static int
9392 sparc_adjust_cost (rtx_insn *insn, rtx link, rtx_insn *dep, int cost)
9393 {
9394   switch (sparc_cpu)
9395     {
9396     case PROCESSOR_SUPERSPARC:
9397       cost = supersparc_adjust_cost (insn, link, dep, cost);
9398       break;
9399     case PROCESSOR_HYPERSPARC:
9400     case PROCESSOR_SPARCLITE86X:
9401       cost = hypersparc_adjust_cost (insn, link, dep, cost);
9402       break;
9403     default:
9404       break;
9405     }
9406   return cost;
9407 }
9408
9409 static void
9410 sparc_sched_init (FILE *dump ATTRIBUTE_UNUSED,
9411                   int sched_verbose ATTRIBUTE_UNUSED,
9412                   int max_ready ATTRIBUTE_UNUSED)
9413 {}
9414
9415 static int
9416 sparc_use_sched_lookahead (void)
9417 {
9418   if (sparc_cpu == PROCESSOR_NIAGARA
9419       || sparc_cpu == PROCESSOR_NIAGARA2
9420       || sparc_cpu == PROCESSOR_NIAGARA3)
9421     return 0;
9422   if (sparc_cpu == PROCESSOR_NIAGARA4)
9423     return 2;
9424   if (sparc_cpu == PROCESSOR_ULTRASPARC
9425       || sparc_cpu == PROCESSOR_ULTRASPARC3)
9426     return 4;
9427   if ((1 << sparc_cpu) &
9428       ((1 << PROCESSOR_SUPERSPARC) | (1 << PROCESSOR_HYPERSPARC) |
9429        (1 << PROCESSOR_SPARCLITE86X)))
9430     return 3;
9431   return 0;
9432 }
9433
9434 static int
9435 sparc_issue_rate (void)
9436 {
9437   switch (sparc_cpu)
9438     {
9439     case PROCESSOR_NIAGARA:
9440     case PROCESSOR_NIAGARA2:
9441     case PROCESSOR_NIAGARA3:
9442     default:
9443       return 1;
9444     case PROCESSOR_NIAGARA4:
9445     case PROCESSOR_V9:
9446       /* Assume V9 processors are capable of at least dual-issue.  */
9447       return 2;
9448     case PROCESSOR_SUPERSPARC:
9449       return 3;
9450     case PROCESSOR_HYPERSPARC:
9451     case PROCESSOR_SPARCLITE86X:
9452       return 2;
9453     case PROCESSOR_ULTRASPARC:
9454     case PROCESSOR_ULTRASPARC3:
9455       return 4;
9456     }
9457 }
9458
9459 static int
9460 set_extends (rtx_insn *insn)
9461 {
9462   register rtx pat = PATTERN (insn);
9463
9464   switch (GET_CODE (SET_SRC (pat)))
9465     {
9466       /* Load and some shift instructions zero extend.  */
9467     case MEM:
9468     case ZERO_EXTEND:
9469       /* sethi clears the high bits */
9470     case HIGH:
9471       /* LO_SUM is used with sethi.  sethi cleared the high
9472          bits and the values used with lo_sum are positive */
9473     case LO_SUM:
9474       /* Store flag stores 0 or 1 */
9475     case LT: case LTU:
9476     case GT: case GTU:
9477     case LE: case LEU:
9478     case GE: case GEU:
9479     case EQ:
9480     case NE:
9481       return 1;
9482     case AND:
9483       {
9484         rtx op0 = XEXP (SET_SRC (pat), 0);
9485         rtx op1 = XEXP (SET_SRC (pat), 1);
9486         if (GET_CODE (op1) == CONST_INT)
9487           return INTVAL (op1) >= 0;
9488         if (GET_CODE (op0) != REG)
9489           return 0;
9490         if (sparc_check_64 (op0, insn) == 1)
9491           return 1;
9492         return (GET_CODE (op1) == REG && sparc_check_64 (op1, insn) == 1);
9493       }
9494     case IOR:
9495     case XOR:
9496       {
9497         rtx op0 = XEXP (SET_SRC (pat), 0);
9498         rtx op1 = XEXP (SET_SRC (pat), 1);
9499         if (GET_CODE (op0) != REG || sparc_check_64 (op0, insn) <= 0)
9500           return 0;
9501         if (GET_CODE (op1) == CONST_INT)
9502           return INTVAL (op1) >= 0;
9503         return (GET_CODE (op1) == REG && sparc_check_64 (op1, insn) == 1);
9504       }
9505     case LSHIFTRT:
9506       return GET_MODE (SET_SRC (pat)) == SImode;
9507       /* Positive integers leave the high bits zero.  */
9508     case CONST_INT:
9509       return !(INTVAL (SET_SRC (pat)) & 0x80000000);
9510     case ASHIFTRT:
9511     case SIGN_EXTEND:
9512       return - (GET_MODE (SET_SRC (pat)) == SImode);
9513     case REG:
9514       return sparc_check_64 (SET_SRC (pat), insn);
9515     default:
9516       return 0;
9517     }
9518 }
9519
9520 /* We _ought_ to have only one kind per function, but...  */
9521 static GTY(()) rtx sparc_addr_diff_list;
9522 static GTY(()) rtx sparc_addr_list;
9523
9524 void
9525 sparc_defer_case_vector (rtx lab, rtx vec, int diff)
9526 {
9527   vec = gen_rtx_EXPR_LIST (VOIDmode, lab, vec);
9528   if (diff)
9529     sparc_addr_diff_list
9530       = gen_rtx_EXPR_LIST (VOIDmode, vec, sparc_addr_diff_list);
9531   else
9532     sparc_addr_list = gen_rtx_EXPR_LIST (VOIDmode, vec, sparc_addr_list);
9533 }
9534
9535 static void
9536 sparc_output_addr_vec (rtx vec)
9537 {
9538   rtx lab = XEXP (vec, 0), body = XEXP (vec, 1);
9539   int idx, vlen = XVECLEN (body, 0);
9540
9541 #ifdef ASM_OUTPUT_ADDR_VEC_START
9542   ASM_OUTPUT_ADDR_VEC_START (asm_out_file);
9543 #endif
9544
9545 #ifdef ASM_OUTPUT_CASE_LABEL
9546   ASM_OUTPUT_CASE_LABEL (asm_out_file, "L", CODE_LABEL_NUMBER (lab),
9547                          NEXT_INSN (lab));
9548 #else
9549   (*targetm.asm_out.internal_label) (asm_out_file, "L", CODE_LABEL_NUMBER (lab));
9550 #endif
9551
9552   for (idx = 0; idx < vlen; idx++)
9553     {
9554       ASM_OUTPUT_ADDR_VEC_ELT
9555         (asm_out_file, CODE_LABEL_NUMBER (XEXP (XVECEXP (body, 0, idx), 0)));
9556     }
9557
9558 #ifdef ASM_OUTPUT_ADDR_VEC_END
9559   ASM_OUTPUT_ADDR_VEC_END (asm_out_file);
9560 #endif
9561 }
9562
9563 static void
9564 sparc_output_addr_diff_vec (rtx vec)
9565 {
9566   rtx lab = XEXP (vec, 0), body = XEXP (vec, 1);
9567   rtx base = XEXP (XEXP (body, 0), 0);
9568   int idx, vlen = XVECLEN (body, 1);
9569
9570 #ifdef ASM_OUTPUT_ADDR_VEC_START
9571   ASM_OUTPUT_ADDR_VEC_START (asm_out_file);
9572 #endif
9573
9574 #ifdef ASM_OUTPUT_CASE_LABEL
9575   ASM_OUTPUT_CASE_LABEL (asm_out_file, "L", CODE_LABEL_NUMBER (lab),
9576                          NEXT_INSN (lab));
9577 #else
9578   (*targetm.asm_out.internal_label) (asm_out_file, "L", CODE_LABEL_NUMBER (lab));
9579 #endif
9580
9581   for (idx = 0; idx < vlen; idx++)
9582     {
9583       ASM_OUTPUT_ADDR_DIFF_ELT
9584         (asm_out_file,
9585          body,
9586          CODE_LABEL_NUMBER (XEXP (XVECEXP (body, 1, idx), 0)),
9587          CODE_LABEL_NUMBER (base));
9588     }
9589
9590 #ifdef ASM_OUTPUT_ADDR_VEC_END
9591   ASM_OUTPUT_ADDR_VEC_END (asm_out_file);
9592 #endif
9593 }
9594
9595 static void
9596 sparc_output_deferred_case_vectors (void)
9597 {
9598   rtx t;
9599   int align;
9600
9601   if (sparc_addr_list == NULL_RTX
9602       && sparc_addr_diff_list == NULL_RTX)
9603     return;
9604
9605   /* Align to cache line in the function's code section.  */
9606   switch_to_section (current_function_section ());
9607
9608   align = floor_log2 (FUNCTION_BOUNDARY / BITS_PER_UNIT);
9609   if (align > 0)
9610     ASM_OUTPUT_ALIGN (asm_out_file, align);
9611
9612   for (t = sparc_addr_list; t ; t = XEXP (t, 1))
9613     sparc_output_addr_vec (XEXP (t, 0));
9614   for (t = sparc_addr_diff_list; t ; t = XEXP (t, 1))
9615     sparc_output_addr_diff_vec (XEXP (t, 0));
9616
9617   sparc_addr_list = sparc_addr_diff_list = NULL_RTX;
9618 }
9619
9620 /* Return 0 if the high 32 bits of X (the low word of X, if DImode) are
9621    unknown.  Return 1 if the high bits are zero, -1 if the register is
9622    sign extended.  */
9623 int
9624 sparc_check_64 (rtx x, rtx_insn *insn)
9625 {
9626   /* If a register is set only once it is safe to ignore insns this
9627      code does not know how to handle.  The loop will either recognize
9628      the single set and return the correct value or fail to recognize
9629      it and return 0.  */
9630   int set_once = 0;
9631   rtx y = x;
9632
9633   gcc_assert (GET_CODE (x) == REG);
9634
9635   if (GET_MODE (x) == DImode)
9636     y = gen_rtx_REG (SImode, REGNO (x) + WORDS_BIG_ENDIAN);
9637
9638   if (flag_expensive_optimizations
9639       && df && DF_REG_DEF_COUNT (REGNO (y)) == 1)
9640     set_once = 1;
9641
9642   if (insn == 0)
9643     {
9644       if (set_once)
9645         insn = get_last_insn_anywhere ();
9646       else
9647         return 0;
9648     }
9649
9650   while ((insn = PREV_INSN (insn)))
9651     {
9652       switch (GET_CODE (insn))
9653         {
9654         case JUMP_INSN:
9655         case NOTE:
9656           break;
9657         case CODE_LABEL:
9658         case CALL_INSN:
9659         default:
9660           if (! set_once)
9661             return 0;
9662           break;
9663         case INSN:
9664           {
9665             rtx pat = PATTERN (insn);
9666             if (GET_CODE (pat) != SET)
9667               return 0;
9668             if (rtx_equal_p (x, SET_DEST (pat)))
9669               return set_extends (insn);
9670             if (y && rtx_equal_p (y, SET_DEST (pat)))
9671               return set_extends (insn);
9672             if (reg_overlap_mentioned_p (SET_DEST (pat), y))
9673               return 0;
9674           }
9675         }
9676     }
9677   return 0;
9678 }
9679
9680 /* Output a wide shift instruction in V8+ mode.  INSN is the instruction,
9681    OPERANDS are its operands and OPCODE is the mnemonic to be used.  */
9682
9683 const char *
9684 output_v8plus_shift (rtx_insn *insn, rtx *operands, const char *opcode)
9685 {
9686   static char asm_code[60];
9687
9688   /* The scratch register is only required when the destination
9689      register is not a 64-bit global or out register.  */
9690   if (which_alternative != 2)
9691     operands[3] = operands[0];
9692
9693   /* We can only shift by constants <= 63. */
9694   if (GET_CODE (operands[2]) == CONST_INT)
9695     operands[2] = GEN_INT (INTVAL (operands[2]) & 0x3f);
9696
9697   if (GET_CODE (operands[1]) == CONST_INT)
9698     {
9699       output_asm_insn ("mov\t%1, %3", operands);
9700     }
9701   else
9702     {
9703       output_asm_insn ("sllx\t%H1, 32, %3", operands);
9704       if (sparc_check_64 (operands[1], insn) <= 0)
9705         output_asm_insn ("srl\t%L1, 0, %L1", operands);
9706       output_asm_insn ("or\t%L1, %3, %3", operands);
9707     }
9708
9709   strcpy (asm_code, opcode);
9710
9711   if (which_alternative != 2)
9712     return strcat (asm_code, "\t%0, %2, %L0\n\tsrlx\t%L0, 32, %H0");
9713   else
9714     return
9715       strcat (asm_code, "\t%3, %2, %3\n\tsrlx\t%3, 32, %H0\n\tmov\t%3, %L0");
9716 }
9717 \f
9718 /* Output rtl to increment the profiler label LABELNO
9719    for profiling a function entry.  */
9720
9721 void
9722 sparc_profile_hook (int labelno)
9723 {
9724   char buf[32];
9725   rtx lab, fun;
9726
9727   fun = gen_rtx_SYMBOL_REF (Pmode, MCOUNT_FUNCTION);
9728   if (NO_PROFILE_COUNTERS)
9729     {
9730       emit_library_call (fun, LCT_NORMAL, VOIDmode, 0);
9731     }
9732   else
9733     {
9734       ASM_GENERATE_INTERNAL_LABEL (buf, "LP", labelno);
9735       lab = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (buf));
9736       emit_library_call (fun, LCT_NORMAL, VOIDmode, 1, lab, Pmode);
9737     }
9738 }
9739 \f
9740 #ifdef TARGET_SOLARIS
9741 /* Solaris implementation of TARGET_ASM_NAMED_SECTION.  */
9742
9743 static void
9744 sparc_solaris_elf_asm_named_section (const char *name, unsigned int flags,
9745                                      tree decl ATTRIBUTE_UNUSED)
9746 {
9747   if (HAVE_COMDAT_GROUP && flags & SECTION_LINKONCE)
9748     {
9749       solaris_elf_asm_comdat_section (name, flags, decl);
9750       return;
9751     }
9752
9753   fprintf (asm_out_file, "\t.section\t\"%s\"", name);
9754
9755   if (!(flags & SECTION_DEBUG))
9756     fputs (",#alloc", asm_out_file);
9757   if (flags & SECTION_WRITE)
9758     fputs (",#write", asm_out_file);
9759   if (flags & SECTION_TLS)
9760     fputs (",#tls", asm_out_file);
9761   if (flags & SECTION_CODE)
9762     fputs (",#execinstr", asm_out_file);
9763
9764   if (flags & SECTION_NOTYPE)
9765     ;
9766   else if (flags & SECTION_BSS)
9767     fputs (",#nobits", asm_out_file);
9768   else
9769     fputs (",#progbits", asm_out_file);
9770
9771   fputc ('\n', asm_out_file);
9772 }
9773 #endif /* TARGET_SOLARIS */
9774
9775 /* We do not allow indirect calls to be optimized into sibling calls.
9776
9777    We cannot use sibling calls when delayed branches are disabled
9778    because they will likely require the call delay slot to be filled.
9779
9780    Also, on SPARC 32-bit we cannot emit a sibling call when the
9781    current function returns a structure.  This is because the "unimp
9782    after call" convention would cause the callee to return to the
9783    wrong place.  The generic code already disallows cases where the
9784    function being called returns a structure.
9785
9786    It may seem strange how this last case could occur.  Usually there
9787    is code after the call which jumps to epilogue code which dumps the
9788    return value into the struct return area.  That ought to invalidate
9789    the sibling call right?  Well, in the C++ case we can end up passing
9790    the pointer to the struct return area to a constructor (which returns
9791    void) and then nothing else happens.  Such a sibling call would look
9792    valid without the added check here.
9793
9794    VxWorks PIC PLT entries require the global pointer to be initialized
9795    on entry.  We therefore can't emit sibling calls to them.  */
9796 static bool
9797 sparc_function_ok_for_sibcall (tree decl, tree exp ATTRIBUTE_UNUSED)
9798 {
9799   return (decl
9800           && flag_delayed_branch
9801           && (TARGET_ARCH64 || ! cfun->returns_struct)
9802           && !(TARGET_VXWORKS_RTP
9803                && flag_pic
9804                && !targetm.binds_local_p (decl)));
9805 }
9806 \f
9807 /* libfunc renaming.  */
9808
9809 static void
9810 sparc_init_libfuncs (void)
9811 {
9812   if (TARGET_ARCH32)
9813     {
9814       /* Use the subroutines that Sun's library provides for integer
9815          multiply and divide.  The `*' prevents an underscore from
9816          being prepended by the compiler. .umul is a little faster
9817          than .mul.  */
9818       set_optab_libfunc (smul_optab, SImode, "*.umul");
9819       set_optab_libfunc (sdiv_optab, SImode, "*.div");
9820       set_optab_libfunc (udiv_optab, SImode, "*.udiv");
9821       set_optab_libfunc (smod_optab, SImode, "*.rem");
9822       set_optab_libfunc (umod_optab, SImode, "*.urem");
9823
9824       /* TFmode arithmetic.  These names are part of the SPARC 32bit ABI.  */
9825       set_optab_libfunc (add_optab, TFmode, "_Q_add");
9826       set_optab_libfunc (sub_optab, TFmode, "_Q_sub");
9827       set_optab_libfunc (neg_optab, TFmode, "_Q_neg");
9828       set_optab_libfunc (smul_optab, TFmode, "_Q_mul");
9829       set_optab_libfunc (sdiv_optab, TFmode, "_Q_div");
9830
9831       /* We can define the TFmode sqrt optab only if TARGET_FPU.  This
9832          is because with soft-float, the SFmode and DFmode sqrt
9833          instructions will be absent, and the compiler will notice and
9834          try to use the TFmode sqrt instruction for calls to the
9835          builtin function sqrt, but this fails.  */
9836       if (TARGET_FPU)
9837         set_optab_libfunc (sqrt_optab, TFmode, "_Q_sqrt");
9838
9839       set_optab_libfunc (eq_optab, TFmode, "_Q_feq");
9840       set_optab_libfunc (ne_optab, TFmode, "_Q_fne");
9841       set_optab_libfunc (gt_optab, TFmode, "_Q_fgt");
9842       set_optab_libfunc (ge_optab, TFmode, "_Q_fge");
9843       set_optab_libfunc (lt_optab, TFmode, "_Q_flt");
9844       set_optab_libfunc (le_optab, TFmode, "_Q_fle");
9845
9846       set_conv_libfunc (sext_optab,   TFmode, SFmode, "_Q_stoq");
9847       set_conv_libfunc (sext_optab,   TFmode, DFmode, "_Q_dtoq");
9848       set_conv_libfunc (trunc_optab,  SFmode, TFmode, "_Q_qtos");
9849       set_conv_libfunc (trunc_optab,  DFmode, TFmode, "_Q_qtod");
9850
9851       set_conv_libfunc (sfix_optab,   SImode, TFmode, "_Q_qtoi");
9852       set_conv_libfunc (ufix_optab,   SImode, TFmode, "_Q_qtou");
9853       set_conv_libfunc (sfloat_optab, TFmode, SImode, "_Q_itoq");
9854       set_conv_libfunc (ufloat_optab, TFmode, SImode, "_Q_utoq");
9855
9856       if (DITF_CONVERSION_LIBFUNCS)
9857         {
9858           set_conv_libfunc (sfix_optab,   DImode, TFmode, "_Q_qtoll");
9859           set_conv_libfunc (ufix_optab,   DImode, TFmode, "_Q_qtoull");
9860           set_conv_libfunc (sfloat_optab, TFmode, DImode, "_Q_lltoq");
9861           set_conv_libfunc (ufloat_optab, TFmode, DImode, "_Q_ulltoq");
9862         }
9863
9864       if (SUN_CONVERSION_LIBFUNCS)
9865         {
9866           set_conv_libfunc (sfix_optab, DImode, SFmode, "__ftoll");
9867           set_conv_libfunc (ufix_optab, DImode, SFmode, "__ftoull");
9868           set_conv_libfunc (sfix_optab, DImode, DFmode, "__dtoll");
9869           set_conv_libfunc (ufix_optab, DImode, DFmode, "__dtoull");
9870         }
9871     }
9872   if (TARGET_ARCH64)
9873     {
9874       /* In the SPARC 64bit ABI, SImode multiply and divide functions
9875          do not exist in the library.  Make sure the compiler does not
9876          emit calls to them by accident.  (It should always use the
9877          hardware instructions.)  */
9878       set_optab_libfunc (smul_optab, SImode, 0);
9879       set_optab_libfunc (sdiv_optab, SImode, 0);
9880       set_optab_libfunc (udiv_optab, SImode, 0);
9881       set_optab_libfunc (smod_optab, SImode, 0);
9882       set_optab_libfunc (umod_optab, SImode, 0);
9883
9884       if (SUN_INTEGER_MULTIPLY_64)
9885         {
9886           set_optab_libfunc (smul_optab, DImode, "__mul64");
9887           set_optab_libfunc (sdiv_optab, DImode, "__div64");
9888           set_optab_libfunc (udiv_optab, DImode, "__udiv64");
9889           set_optab_libfunc (smod_optab, DImode, "__rem64");
9890           set_optab_libfunc (umod_optab, DImode, "__urem64");
9891         }
9892
9893       if (SUN_CONVERSION_LIBFUNCS)
9894         {
9895           set_conv_libfunc (sfix_optab, DImode, SFmode, "__ftol");
9896           set_conv_libfunc (ufix_optab, DImode, SFmode, "__ftoul");
9897           set_conv_libfunc (sfix_optab, DImode, DFmode, "__dtol");
9898           set_conv_libfunc (ufix_optab, DImode, DFmode, "__dtoul");
9899         }
9900     }
9901 }
9902 \f
9903 /* SPARC builtins.  */
9904 enum sparc_builtins
9905 {
9906   /* FPU builtins.  */
9907   SPARC_BUILTIN_LDFSR,
9908   SPARC_BUILTIN_STFSR,
9909
9910   /* VIS 1.0 builtins.  */
9911   SPARC_BUILTIN_FPACK16,
9912   SPARC_BUILTIN_FPACK32,
9913   SPARC_BUILTIN_FPACKFIX,
9914   SPARC_BUILTIN_FEXPAND,
9915   SPARC_BUILTIN_FPMERGE,
9916   SPARC_BUILTIN_FMUL8X16,
9917   SPARC_BUILTIN_FMUL8X16AU,
9918   SPARC_BUILTIN_FMUL8X16AL,
9919   SPARC_BUILTIN_FMUL8SUX16,
9920   SPARC_BUILTIN_FMUL8ULX16,
9921   SPARC_BUILTIN_FMULD8SUX16,
9922   SPARC_BUILTIN_FMULD8ULX16,
9923   SPARC_BUILTIN_FALIGNDATAV4HI,
9924   SPARC_BUILTIN_FALIGNDATAV8QI,
9925   SPARC_BUILTIN_FALIGNDATAV2SI,
9926   SPARC_BUILTIN_FALIGNDATADI,
9927   SPARC_BUILTIN_WRGSR,
9928   SPARC_BUILTIN_RDGSR,
9929   SPARC_BUILTIN_ALIGNADDR,
9930   SPARC_BUILTIN_ALIGNADDRL,
9931   SPARC_BUILTIN_PDIST,
9932   SPARC_BUILTIN_EDGE8,
9933   SPARC_BUILTIN_EDGE8L,
9934   SPARC_BUILTIN_EDGE16,
9935   SPARC_BUILTIN_EDGE16L,
9936   SPARC_BUILTIN_EDGE32,
9937   SPARC_BUILTIN_EDGE32L,
9938   SPARC_BUILTIN_FCMPLE16,
9939   SPARC_BUILTIN_FCMPLE32,
9940   SPARC_BUILTIN_FCMPNE16,
9941   SPARC_BUILTIN_FCMPNE32,
9942   SPARC_BUILTIN_FCMPGT16,
9943   SPARC_BUILTIN_FCMPGT32,
9944   SPARC_BUILTIN_FCMPEQ16,
9945   SPARC_BUILTIN_FCMPEQ32,
9946   SPARC_BUILTIN_FPADD16,
9947   SPARC_BUILTIN_FPADD16S,
9948   SPARC_BUILTIN_FPADD32,
9949   SPARC_BUILTIN_FPADD32S,
9950   SPARC_BUILTIN_FPSUB16,
9951   SPARC_BUILTIN_FPSUB16S,
9952   SPARC_BUILTIN_FPSUB32,
9953   SPARC_BUILTIN_FPSUB32S,
9954   SPARC_BUILTIN_ARRAY8,
9955   SPARC_BUILTIN_ARRAY16,
9956   SPARC_BUILTIN_ARRAY32,
9957
9958   /* VIS 2.0 builtins.  */
9959   SPARC_BUILTIN_EDGE8N,
9960   SPARC_BUILTIN_EDGE8LN,
9961   SPARC_BUILTIN_EDGE16N,
9962   SPARC_BUILTIN_EDGE16LN,
9963   SPARC_BUILTIN_EDGE32N,
9964   SPARC_BUILTIN_EDGE32LN,
9965   SPARC_BUILTIN_BMASK,
9966   SPARC_BUILTIN_BSHUFFLEV4HI,
9967   SPARC_BUILTIN_BSHUFFLEV8QI,
9968   SPARC_BUILTIN_BSHUFFLEV2SI,
9969   SPARC_BUILTIN_BSHUFFLEDI,
9970
9971   /* VIS 3.0 builtins.  */
9972   SPARC_BUILTIN_CMASK8,
9973   SPARC_BUILTIN_CMASK16,
9974   SPARC_BUILTIN_CMASK32,
9975   SPARC_BUILTIN_FCHKSM16,
9976   SPARC_BUILTIN_FSLL16,
9977   SPARC_BUILTIN_FSLAS16,
9978   SPARC_BUILTIN_FSRL16,
9979   SPARC_BUILTIN_FSRA16,
9980   SPARC_BUILTIN_FSLL32,
9981   SPARC_BUILTIN_FSLAS32,
9982   SPARC_BUILTIN_FSRL32,
9983   SPARC_BUILTIN_FSRA32,
9984   SPARC_BUILTIN_PDISTN,
9985   SPARC_BUILTIN_FMEAN16,
9986   SPARC_BUILTIN_FPADD64,
9987   SPARC_BUILTIN_FPSUB64,
9988   SPARC_BUILTIN_FPADDS16,
9989   SPARC_BUILTIN_FPADDS16S,
9990   SPARC_BUILTIN_FPSUBS16,
9991   SPARC_BUILTIN_FPSUBS16S,
9992   SPARC_BUILTIN_FPADDS32,
9993   SPARC_BUILTIN_FPADDS32S,
9994   SPARC_BUILTIN_FPSUBS32,
9995   SPARC_BUILTIN_FPSUBS32S,
9996   SPARC_BUILTIN_FUCMPLE8,
9997   SPARC_BUILTIN_FUCMPNE8,
9998   SPARC_BUILTIN_FUCMPGT8,
9999   SPARC_BUILTIN_FUCMPEQ8,
10000   SPARC_BUILTIN_FHADDS,
10001   SPARC_BUILTIN_FHADDD,
10002   SPARC_BUILTIN_FHSUBS,
10003   SPARC_BUILTIN_FHSUBD,
10004   SPARC_BUILTIN_FNHADDS,
10005   SPARC_BUILTIN_FNHADDD,
10006   SPARC_BUILTIN_UMULXHI,
10007   SPARC_BUILTIN_XMULX,
10008   SPARC_BUILTIN_XMULXHI,
10009
10010   SPARC_BUILTIN_MAX
10011 };
10012
10013 static GTY (()) tree sparc_builtins[(int) SPARC_BUILTIN_MAX];
10014 static enum insn_code sparc_builtins_icode[(int) SPARC_BUILTIN_MAX];
10015
10016 /* Add a SPARC builtin function with NAME, ICODE, CODE and TYPE.  Return the
10017    function decl or NULL_TREE if the builtin was not added.  */
10018
10019 static tree
10020 def_builtin (const char *name, enum insn_code icode, enum sparc_builtins code,
10021              tree type)
10022 {
10023   tree t
10024     = add_builtin_function (name, type, code, BUILT_IN_MD, NULL, NULL_TREE);
10025
10026   if (t)
10027     {
10028       sparc_builtins[code] = t;
10029       sparc_builtins_icode[code] = icode;
10030     }
10031
10032   return t;
10033 }
10034
10035 /* Likewise, but also marks the function as "const".  */
10036
10037 static tree
10038 def_builtin_const (const char *name, enum insn_code icode,
10039                    enum sparc_builtins code, tree type)
10040 {
10041   tree t = def_builtin (name, icode, code, type);
10042
10043   if (t)
10044     TREE_READONLY (t) = 1;
10045
10046   return t;
10047 }
10048
10049 /* Implement the TARGET_INIT_BUILTINS target hook.
10050    Create builtin functions for special SPARC instructions.  */
10051
10052 static void
10053 sparc_init_builtins (void)
10054 {
10055   if (TARGET_FPU)
10056     sparc_fpu_init_builtins ();
10057
10058   if (TARGET_VIS)
10059     sparc_vis_init_builtins ();
10060 }
10061
10062 /* Create builtin functions for FPU instructions.  */
10063
10064 static void
10065 sparc_fpu_init_builtins (void)
10066 {
10067   tree ftype
10068     = build_function_type_list (void_type_node,
10069                                 build_pointer_type (unsigned_type_node), 0);
10070   def_builtin ("__builtin_load_fsr", CODE_FOR_ldfsr,
10071                SPARC_BUILTIN_LDFSR, ftype);
10072   def_builtin ("__builtin_store_fsr", CODE_FOR_stfsr,
10073                SPARC_BUILTIN_STFSR, ftype);
10074 }
10075
10076 /* Create builtin functions for VIS instructions.  */
10077
10078 static void
10079 sparc_vis_init_builtins (void)
10080 {
10081   tree v4qi = build_vector_type (unsigned_intQI_type_node, 4);
10082   tree v8qi = build_vector_type (unsigned_intQI_type_node, 8);
10083   tree v4hi = build_vector_type (intHI_type_node, 4);
10084   tree v2hi = build_vector_type (intHI_type_node, 2);
10085   tree v2si = build_vector_type (intSI_type_node, 2);
10086   tree v1si = build_vector_type (intSI_type_node, 1);
10087
10088   tree v4qi_ftype_v4hi = build_function_type_list (v4qi, v4hi, 0);
10089   tree v8qi_ftype_v2si_v8qi = build_function_type_list (v8qi, v2si, v8qi, 0);
10090   tree v2hi_ftype_v2si = build_function_type_list (v2hi, v2si, 0);
10091   tree v4hi_ftype_v4qi = build_function_type_list (v4hi, v4qi, 0);
10092   tree v8qi_ftype_v4qi_v4qi = build_function_type_list (v8qi, v4qi, v4qi, 0);
10093   tree v4hi_ftype_v4qi_v4hi = build_function_type_list (v4hi, v4qi, v4hi, 0);
10094   tree v4hi_ftype_v4qi_v2hi = build_function_type_list (v4hi, v4qi, v2hi, 0);
10095   tree v2si_ftype_v4qi_v2hi = build_function_type_list (v2si, v4qi, v2hi, 0);
10096   tree v4hi_ftype_v8qi_v4hi = build_function_type_list (v4hi, v8qi, v4hi, 0);
10097   tree v4hi_ftype_v4hi_v4hi = build_function_type_list (v4hi, v4hi, v4hi, 0);
10098   tree v2si_ftype_v2si_v2si = build_function_type_list (v2si, v2si, v2si, 0);
10099   tree v8qi_ftype_v8qi_v8qi = build_function_type_list (v8qi, v8qi, v8qi, 0);
10100   tree v2hi_ftype_v2hi_v2hi = build_function_type_list (v2hi, v2hi, v2hi, 0);
10101   tree v1si_ftype_v1si_v1si = build_function_type_list (v1si, v1si, v1si, 0);
10102   tree di_ftype_v8qi_v8qi_di = build_function_type_list (intDI_type_node,
10103                                                          v8qi, v8qi,
10104                                                          intDI_type_node, 0);
10105   tree di_ftype_v8qi_v8qi = build_function_type_list (intDI_type_node,
10106                                                       v8qi, v8qi, 0);
10107   tree si_ftype_v8qi_v8qi = build_function_type_list (intSI_type_node,
10108                                                       v8qi, v8qi, 0);
10109   tree di_ftype_di_di = build_function_type_list (intDI_type_node,
10110                                                   intDI_type_node,
10111                                                   intDI_type_node, 0);
10112   tree si_ftype_si_si = build_function_type_list (intSI_type_node,
10113                                                   intSI_type_node,
10114                                                   intSI_type_node, 0);
10115   tree ptr_ftype_ptr_si = build_function_type_list (ptr_type_node,
10116                                                     ptr_type_node,
10117                                                     intSI_type_node, 0);
10118   tree ptr_ftype_ptr_di = build_function_type_list (ptr_type_node,
10119                                                     ptr_type_node,
10120                                                     intDI_type_node, 0);
10121   tree si_ftype_ptr_ptr = build_function_type_list (intSI_type_node,
10122                                                     ptr_type_node,
10123                                                     ptr_type_node, 0);
10124   tree di_ftype_ptr_ptr = build_function_type_list (intDI_type_node,
10125                                                     ptr_type_node,
10126                                                     ptr_type_node, 0);
10127   tree si_ftype_v4hi_v4hi = build_function_type_list (intSI_type_node,
10128                                                       v4hi, v4hi, 0);
10129   tree si_ftype_v2si_v2si = build_function_type_list (intSI_type_node,
10130                                                       v2si, v2si, 0);
10131   tree di_ftype_v4hi_v4hi = build_function_type_list (intDI_type_node,
10132                                                       v4hi, v4hi, 0);
10133   tree di_ftype_v2si_v2si = build_function_type_list (intDI_type_node,
10134                                                       v2si, v2si, 0);
10135   tree void_ftype_di = build_function_type_list (void_type_node,
10136                                                  intDI_type_node, 0);
10137   tree di_ftype_void = build_function_type_list (intDI_type_node,
10138                                                  void_type_node, 0);
10139   tree void_ftype_si = build_function_type_list (void_type_node,
10140                                                  intSI_type_node, 0);
10141   tree sf_ftype_sf_sf = build_function_type_list (float_type_node,
10142                                                   float_type_node,
10143                                                   float_type_node, 0);
10144   tree df_ftype_df_df = build_function_type_list (double_type_node,
10145                                                   double_type_node,
10146                                                   double_type_node, 0);
10147
10148   /* Packing and expanding vectors.  */
10149   def_builtin ("__builtin_vis_fpack16", CODE_FOR_fpack16_vis,
10150                SPARC_BUILTIN_FPACK16, v4qi_ftype_v4hi);
10151   def_builtin ("__builtin_vis_fpack32", CODE_FOR_fpack32_vis,
10152                SPARC_BUILTIN_FPACK32, v8qi_ftype_v2si_v8qi);
10153   def_builtin ("__builtin_vis_fpackfix", CODE_FOR_fpackfix_vis,
10154                SPARC_BUILTIN_FPACKFIX, v2hi_ftype_v2si);
10155   def_builtin_const ("__builtin_vis_fexpand", CODE_FOR_fexpand_vis,
10156                      SPARC_BUILTIN_FEXPAND, v4hi_ftype_v4qi);
10157   def_builtin_const ("__builtin_vis_fpmerge", CODE_FOR_fpmerge_vis,
10158                      SPARC_BUILTIN_FPMERGE, v8qi_ftype_v4qi_v4qi);
10159
10160   /* Multiplications.  */
10161   def_builtin_const ("__builtin_vis_fmul8x16", CODE_FOR_fmul8x16_vis,
10162                      SPARC_BUILTIN_FMUL8X16, v4hi_ftype_v4qi_v4hi);
10163   def_builtin_const ("__builtin_vis_fmul8x16au", CODE_FOR_fmul8x16au_vis,
10164                      SPARC_BUILTIN_FMUL8X16AU, v4hi_ftype_v4qi_v2hi);
10165   def_builtin_const ("__builtin_vis_fmul8x16al", CODE_FOR_fmul8x16al_vis,
10166                      SPARC_BUILTIN_FMUL8X16AL, v4hi_ftype_v4qi_v2hi);
10167   def_builtin_const ("__builtin_vis_fmul8sux16", CODE_FOR_fmul8sux16_vis,
10168                      SPARC_BUILTIN_FMUL8SUX16, v4hi_ftype_v8qi_v4hi);
10169   def_builtin_const ("__builtin_vis_fmul8ulx16", CODE_FOR_fmul8ulx16_vis,
10170                      SPARC_BUILTIN_FMUL8ULX16, v4hi_ftype_v8qi_v4hi);
10171   def_builtin_const ("__builtin_vis_fmuld8sux16", CODE_FOR_fmuld8sux16_vis,
10172                      SPARC_BUILTIN_FMULD8SUX16, v2si_ftype_v4qi_v2hi);
10173   def_builtin_const ("__builtin_vis_fmuld8ulx16", CODE_FOR_fmuld8ulx16_vis,
10174                      SPARC_BUILTIN_FMULD8ULX16, v2si_ftype_v4qi_v2hi);
10175
10176   /* Data aligning.  */
10177   def_builtin ("__builtin_vis_faligndatav4hi", CODE_FOR_faligndatav4hi_vis,
10178                SPARC_BUILTIN_FALIGNDATAV4HI, v4hi_ftype_v4hi_v4hi);
10179   def_builtin ("__builtin_vis_faligndatav8qi", CODE_FOR_faligndatav8qi_vis,
10180                SPARC_BUILTIN_FALIGNDATAV8QI, v8qi_ftype_v8qi_v8qi);
10181   def_builtin ("__builtin_vis_faligndatav2si", CODE_FOR_faligndatav2si_vis,
10182                SPARC_BUILTIN_FALIGNDATAV2SI, v2si_ftype_v2si_v2si);
10183   def_builtin ("__builtin_vis_faligndatadi", CODE_FOR_faligndatav1di_vis,
10184                SPARC_BUILTIN_FALIGNDATADI, di_ftype_di_di);
10185
10186   def_builtin ("__builtin_vis_write_gsr", CODE_FOR_wrgsr_vis,
10187                SPARC_BUILTIN_WRGSR, void_ftype_di);
10188   def_builtin ("__builtin_vis_read_gsr", CODE_FOR_rdgsr_vis,
10189                SPARC_BUILTIN_RDGSR, di_ftype_void);
10190
10191   if (TARGET_ARCH64)
10192     {
10193       def_builtin ("__builtin_vis_alignaddr", CODE_FOR_alignaddrdi_vis,
10194                    SPARC_BUILTIN_ALIGNADDR, ptr_ftype_ptr_di);
10195       def_builtin ("__builtin_vis_alignaddrl", CODE_FOR_alignaddrldi_vis,
10196                    SPARC_BUILTIN_ALIGNADDRL, ptr_ftype_ptr_di);
10197     }
10198   else
10199     {
10200       def_builtin ("__builtin_vis_alignaddr", CODE_FOR_alignaddrsi_vis,
10201                    SPARC_BUILTIN_ALIGNADDR, ptr_ftype_ptr_si);
10202       def_builtin ("__builtin_vis_alignaddrl", CODE_FOR_alignaddrlsi_vis,
10203                    SPARC_BUILTIN_ALIGNADDRL, ptr_ftype_ptr_si);
10204     }
10205
10206   /* Pixel distance.  */
10207   def_builtin_const ("__builtin_vis_pdist", CODE_FOR_pdist_vis,
10208                      SPARC_BUILTIN_PDIST, di_ftype_v8qi_v8qi_di);
10209
10210   /* Edge handling.  */
10211   if (TARGET_ARCH64)
10212     {
10213       def_builtin_const ("__builtin_vis_edge8", CODE_FOR_edge8di_vis,
10214                          SPARC_BUILTIN_EDGE8, di_ftype_ptr_ptr);
10215       def_builtin_const ("__builtin_vis_edge8l", CODE_FOR_edge8ldi_vis,
10216                          SPARC_BUILTIN_EDGE8L, di_ftype_ptr_ptr);
10217       def_builtin_const ("__builtin_vis_edge16", CODE_FOR_edge16di_vis,
10218                          SPARC_BUILTIN_EDGE16, di_ftype_ptr_ptr);
10219       def_builtin_const ("__builtin_vis_edge16l", CODE_FOR_edge16ldi_vis,
10220                          SPARC_BUILTIN_EDGE16L, di_ftype_ptr_ptr);
10221       def_builtin_const ("__builtin_vis_edge32", CODE_FOR_edge32di_vis,
10222                          SPARC_BUILTIN_EDGE32, di_ftype_ptr_ptr);
10223       def_builtin_const ("__builtin_vis_edge32l", CODE_FOR_edge32ldi_vis,
10224                          SPARC_BUILTIN_EDGE32L, di_ftype_ptr_ptr);
10225     }
10226   else
10227     {
10228       def_builtin_const ("__builtin_vis_edge8", CODE_FOR_edge8si_vis,
10229                          SPARC_BUILTIN_EDGE8, si_ftype_ptr_ptr);
10230       def_builtin_const ("__builtin_vis_edge8l", CODE_FOR_edge8lsi_vis,
10231                          SPARC_BUILTIN_EDGE8L, si_ftype_ptr_ptr);
10232       def_builtin_const ("__builtin_vis_edge16", CODE_FOR_edge16si_vis,
10233                          SPARC_BUILTIN_EDGE16, si_ftype_ptr_ptr);
10234       def_builtin_const ("__builtin_vis_edge16l", CODE_FOR_edge16lsi_vis,
10235                          SPARC_BUILTIN_EDGE16L, si_ftype_ptr_ptr);
10236       def_builtin_const ("__builtin_vis_edge32", CODE_FOR_edge32si_vis,
10237                          SPARC_BUILTIN_EDGE32, si_ftype_ptr_ptr);
10238       def_builtin_const ("__builtin_vis_edge32l", CODE_FOR_edge32lsi_vis,
10239                          SPARC_BUILTIN_EDGE32L, si_ftype_ptr_ptr);
10240     }
10241
10242   /* Pixel compare.  */
10243   if (TARGET_ARCH64)
10244     {
10245       def_builtin_const ("__builtin_vis_fcmple16", CODE_FOR_fcmple16di_vis,
10246                          SPARC_BUILTIN_FCMPLE16, di_ftype_v4hi_v4hi);
10247       def_builtin_const ("__builtin_vis_fcmple32", CODE_FOR_fcmple32di_vis,
10248                          SPARC_BUILTIN_FCMPLE32, di_ftype_v2si_v2si);
10249       def_builtin_const ("__builtin_vis_fcmpne16", CODE_FOR_fcmpne16di_vis,
10250                          SPARC_BUILTIN_FCMPNE16, di_ftype_v4hi_v4hi);
10251       def_builtin_const ("__builtin_vis_fcmpne32", CODE_FOR_fcmpne32di_vis,
10252                          SPARC_BUILTIN_FCMPNE32, di_ftype_v2si_v2si);
10253       def_builtin_const ("__builtin_vis_fcmpgt16", CODE_FOR_fcmpgt16di_vis,
10254                          SPARC_BUILTIN_FCMPGT16, di_ftype_v4hi_v4hi);
10255       def_builtin_const ("__builtin_vis_fcmpgt32", CODE_FOR_fcmpgt32di_vis,
10256                          SPARC_BUILTIN_FCMPGT32, di_ftype_v2si_v2si);
10257       def_builtin_const ("__builtin_vis_fcmpeq16", CODE_FOR_fcmpeq16di_vis,
10258                          SPARC_BUILTIN_FCMPEQ16, di_ftype_v4hi_v4hi);
10259       def_builtin_const ("__builtin_vis_fcmpeq32", CODE_FOR_fcmpeq32di_vis,
10260                          SPARC_BUILTIN_FCMPEQ32, di_ftype_v2si_v2si);
10261     }
10262   else
10263     {
10264       def_builtin_const ("__builtin_vis_fcmple16", CODE_FOR_fcmple16si_vis,
10265                          SPARC_BUILTIN_FCMPLE16, si_ftype_v4hi_v4hi);
10266       def_builtin_const ("__builtin_vis_fcmple32", CODE_FOR_fcmple32si_vis,
10267                          SPARC_BUILTIN_FCMPLE32, si_ftype_v2si_v2si);
10268       def_builtin_const ("__builtin_vis_fcmpne16", CODE_FOR_fcmpne16si_vis,
10269                          SPARC_BUILTIN_FCMPNE16, si_ftype_v4hi_v4hi);
10270       def_builtin_const ("__builtin_vis_fcmpne32", CODE_FOR_fcmpne32si_vis,
10271                          SPARC_BUILTIN_FCMPNE32, si_ftype_v2si_v2si);
10272       def_builtin_const ("__builtin_vis_fcmpgt16", CODE_FOR_fcmpgt16si_vis,
10273                          SPARC_BUILTIN_FCMPGT16, si_ftype_v4hi_v4hi);
10274       def_builtin_const ("__builtin_vis_fcmpgt32", CODE_FOR_fcmpgt32si_vis,
10275                          SPARC_BUILTIN_FCMPGT32, si_ftype_v2si_v2si);
10276       def_builtin_const ("__builtin_vis_fcmpeq16", CODE_FOR_fcmpeq16si_vis,
10277                          SPARC_BUILTIN_FCMPEQ16, si_ftype_v4hi_v4hi);
10278       def_builtin_const ("__builtin_vis_fcmpeq32", CODE_FOR_fcmpeq32si_vis,
10279                          SPARC_BUILTIN_FCMPEQ32, si_ftype_v2si_v2si);
10280     }
10281
10282   /* Addition and subtraction.  */
10283   def_builtin_const ("__builtin_vis_fpadd16", CODE_FOR_addv4hi3,
10284                      SPARC_BUILTIN_FPADD16, v4hi_ftype_v4hi_v4hi);
10285   def_builtin_const ("__builtin_vis_fpadd16s", CODE_FOR_addv2hi3,
10286                      SPARC_BUILTIN_FPADD16S, v2hi_ftype_v2hi_v2hi);
10287   def_builtin_const ("__builtin_vis_fpadd32", CODE_FOR_addv2si3,
10288                      SPARC_BUILTIN_FPADD32, v2si_ftype_v2si_v2si);
10289   def_builtin_const ("__builtin_vis_fpadd32s", CODE_FOR_addv1si3,
10290                      SPARC_BUILTIN_FPADD32S, v1si_ftype_v1si_v1si);
10291   def_builtin_const ("__builtin_vis_fpsub16", CODE_FOR_subv4hi3,
10292                      SPARC_BUILTIN_FPSUB16, v4hi_ftype_v4hi_v4hi);
10293   def_builtin_const ("__builtin_vis_fpsub16s", CODE_FOR_subv2hi3,
10294                      SPARC_BUILTIN_FPSUB16S, v2hi_ftype_v2hi_v2hi);
10295   def_builtin_const ("__builtin_vis_fpsub32", CODE_FOR_subv2si3,
10296                      SPARC_BUILTIN_FPSUB32, v2si_ftype_v2si_v2si);
10297   def_builtin_const ("__builtin_vis_fpsub32s", CODE_FOR_subv1si3,
10298                      SPARC_BUILTIN_FPSUB32S, v1si_ftype_v1si_v1si);
10299
10300   /* Three-dimensional array addressing.  */
10301   if (TARGET_ARCH64)
10302     {
10303       def_builtin_const ("__builtin_vis_array8", CODE_FOR_array8di_vis,
10304                          SPARC_BUILTIN_ARRAY8, di_ftype_di_di);
10305       def_builtin_const ("__builtin_vis_array16", CODE_FOR_array16di_vis,
10306                          SPARC_BUILTIN_ARRAY16, di_ftype_di_di);
10307       def_builtin_const ("__builtin_vis_array32", CODE_FOR_array32di_vis,
10308                          SPARC_BUILTIN_ARRAY32, di_ftype_di_di);
10309     }
10310   else
10311     {
10312       def_builtin_const ("__builtin_vis_array8", CODE_FOR_array8si_vis,
10313                          SPARC_BUILTIN_ARRAY8, si_ftype_si_si);
10314       def_builtin_const ("__builtin_vis_array16", CODE_FOR_array16si_vis,
10315                          SPARC_BUILTIN_ARRAY16, si_ftype_si_si);
10316       def_builtin_const ("__builtin_vis_array32", CODE_FOR_array32si_vis,
10317                          SPARC_BUILTIN_ARRAY32, si_ftype_si_si);
10318     }
10319
10320   if (TARGET_VIS2)
10321     {
10322       /* Edge handling.  */
10323       if (TARGET_ARCH64)
10324         {
10325           def_builtin_const ("__builtin_vis_edge8n", CODE_FOR_edge8ndi_vis,
10326                              SPARC_BUILTIN_EDGE8N, di_ftype_ptr_ptr);
10327           def_builtin_const ("__builtin_vis_edge8ln", CODE_FOR_edge8lndi_vis,
10328                              SPARC_BUILTIN_EDGE8LN, di_ftype_ptr_ptr);
10329           def_builtin_const ("__builtin_vis_edge16n", CODE_FOR_edge16ndi_vis,
10330                              SPARC_BUILTIN_EDGE16N, di_ftype_ptr_ptr);
10331           def_builtin_const ("__builtin_vis_edge16ln", CODE_FOR_edge16lndi_vis,
10332                              SPARC_BUILTIN_EDGE16LN, di_ftype_ptr_ptr);
10333           def_builtin_const ("__builtin_vis_edge32n", CODE_FOR_edge32ndi_vis,
10334                              SPARC_BUILTIN_EDGE32N, di_ftype_ptr_ptr);
10335           def_builtin_const ("__builtin_vis_edge32ln", CODE_FOR_edge32lndi_vis,
10336                              SPARC_BUILTIN_EDGE32LN, di_ftype_ptr_ptr);
10337         }
10338       else
10339         {
10340           def_builtin_const ("__builtin_vis_edge8n", CODE_FOR_edge8nsi_vis,
10341                              SPARC_BUILTIN_EDGE8N, si_ftype_ptr_ptr);
10342           def_builtin_const ("__builtin_vis_edge8ln", CODE_FOR_edge8lnsi_vis,
10343                              SPARC_BUILTIN_EDGE8LN, si_ftype_ptr_ptr);
10344           def_builtin_const ("__builtin_vis_edge16n", CODE_FOR_edge16nsi_vis,
10345                              SPARC_BUILTIN_EDGE16N, si_ftype_ptr_ptr);
10346           def_builtin_const ("__builtin_vis_edge16ln", CODE_FOR_edge16lnsi_vis,
10347                              SPARC_BUILTIN_EDGE16LN, si_ftype_ptr_ptr);
10348           def_builtin_const ("__builtin_vis_edge32n", CODE_FOR_edge32nsi_vis,
10349                              SPARC_BUILTIN_EDGE32N, si_ftype_ptr_ptr);
10350           def_builtin_const ("__builtin_vis_edge32ln", CODE_FOR_edge32lnsi_vis,
10351                              SPARC_BUILTIN_EDGE32LN, si_ftype_ptr_ptr);
10352         }
10353
10354       /* Byte mask and shuffle.  */
10355       if (TARGET_ARCH64)
10356         def_builtin ("__builtin_vis_bmask", CODE_FOR_bmaskdi_vis,
10357                      SPARC_BUILTIN_BMASK, di_ftype_di_di);
10358       else
10359         def_builtin ("__builtin_vis_bmask", CODE_FOR_bmasksi_vis,
10360                      SPARC_BUILTIN_BMASK, si_ftype_si_si);
10361       def_builtin ("__builtin_vis_bshufflev4hi", CODE_FOR_bshufflev4hi_vis,
10362                    SPARC_BUILTIN_BSHUFFLEV4HI, v4hi_ftype_v4hi_v4hi);
10363       def_builtin ("__builtin_vis_bshufflev8qi", CODE_FOR_bshufflev8qi_vis,
10364                    SPARC_BUILTIN_BSHUFFLEV8QI, v8qi_ftype_v8qi_v8qi);
10365       def_builtin ("__builtin_vis_bshufflev2si", CODE_FOR_bshufflev2si_vis,
10366                    SPARC_BUILTIN_BSHUFFLEV2SI, v2si_ftype_v2si_v2si);
10367       def_builtin ("__builtin_vis_bshuffledi", CODE_FOR_bshufflev1di_vis,
10368                    SPARC_BUILTIN_BSHUFFLEDI, di_ftype_di_di);
10369     }
10370
10371   if (TARGET_VIS3)
10372     {
10373       if (TARGET_ARCH64)
10374         {
10375           def_builtin ("__builtin_vis_cmask8", CODE_FOR_cmask8di_vis,
10376                        SPARC_BUILTIN_CMASK8, void_ftype_di);
10377           def_builtin ("__builtin_vis_cmask16", CODE_FOR_cmask16di_vis,
10378                        SPARC_BUILTIN_CMASK16, void_ftype_di);
10379           def_builtin ("__builtin_vis_cmask32", CODE_FOR_cmask32di_vis,
10380                        SPARC_BUILTIN_CMASK32, void_ftype_di);
10381         }
10382       else
10383         {
10384           def_builtin ("__builtin_vis_cmask8", CODE_FOR_cmask8si_vis,
10385                        SPARC_BUILTIN_CMASK8, void_ftype_si);
10386           def_builtin ("__builtin_vis_cmask16", CODE_FOR_cmask16si_vis,
10387                        SPARC_BUILTIN_CMASK16, void_ftype_si);
10388           def_builtin ("__builtin_vis_cmask32", CODE_FOR_cmask32si_vis,
10389                        SPARC_BUILTIN_CMASK32, void_ftype_si);
10390         }
10391
10392       def_builtin_const ("__builtin_vis_fchksm16", CODE_FOR_fchksm16_vis,
10393                          SPARC_BUILTIN_FCHKSM16, v4hi_ftype_v4hi_v4hi);
10394
10395       def_builtin_const ("__builtin_vis_fsll16", CODE_FOR_vashlv4hi3,
10396                          SPARC_BUILTIN_FSLL16, v4hi_ftype_v4hi_v4hi);
10397       def_builtin_const ("__builtin_vis_fslas16", CODE_FOR_vssashlv4hi3,
10398                          SPARC_BUILTIN_FSLAS16, v4hi_ftype_v4hi_v4hi);
10399       def_builtin_const ("__builtin_vis_fsrl16", CODE_FOR_vlshrv4hi3,
10400                          SPARC_BUILTIN_FSRL16, v4hi_ftype_v4hi_v4hi);
10401       def_builtin_const ("__builtin_vis_fsra16", CODE_FOR_vashrv4hi3,
10402                          SPARC_BUILTIN_FSRA16, v4hi_ftype_v4hi_v4hi);
10403       def_builtin_const ("__builtin_vis_fsll32", CODE_FOR_vashlv2si3,
10404                          SPARC_BUILTIN_FSLL32, v2si_ftype_v2si_v2si);
10405       def_builtin_const ("__builtin_vis_fslas32", CODE_FOR_vssashlv2si3,
10406                          SPARC_BUILTIN_FSLAS32, v2si_ftype_v2si_v2si);
10407       def_builtin_const ("__builtin_vis_fsrl32", CODE_FOR_vlshrv2si3,
10408                          SPARC_BUILTIN_FSRL32, v2si_ftype_v2si_v2si);
10409       def_builtin_const ("__builtin_vis_fsra32", CODE_FOR_vashrv2si3,
10410                          SPARC_BUILTIN_FSRA32, v2si_ftype_v2si_v2si);
10411
10412       if (TARGET_ARCH64)
10413         def_builtin_const ("__builtin_vis_pdistn", CODE_FOR_pdistndi_vis,
10414                            SPARC_BUILTIN_PDISTN, di_ftype_v8qi_v8qi);
10415       else
10416         def_builtin_const ("__builtin_vis_pdistn", CODE_FOR_pdistnsi_vis,
10417                            SPARC_BUILTIN_PDISTN, si_ftype_v8qi_v8qi);
10418
10419       def_builtin_const ("__builtin_vis_fmean16", CODE_FOR_fmean16_vis,
10420                          SPARC_BUILTIN_FMEAN16, v4hi_ftype_v4hi_v4hi);
10421       def_builtin_const ("__builtin_vis_fpadd64", CODE_FOR_fpadd64_vis,
10422                          SPARC_BUILTIN_FPADD64, di_ftype_di_di);
10423       def_builtin_const ("__builtin_vis_fpsub64", CODE_FOR_fpsub64_vis,
10424                          SPARC_BUILTIN_FPSUB64, di_ftype_di_di);
10425
10426       def_builtin_const ("__builtin_vis_fpadds16", CODE_FOR_ssaddv4hi3,
10427                          SPARC_BUILTIN_FPADDS16, v4hi_ftype_v4hi_v4hi);
10428       def_builtin_const ("__builtin_vis_fpadds16s", CODE_FOR_ssaddv2hi3,
10429                          SPARC_BUILTIN_FPADDS16S, v2hi_ftype_v2hi_v2hi);
10430       def_builtin_const ("__builtin_vis_fpsubs16", CODE_FOR_sssubv4hi3,
10431                          SPARC_BUILTIN_FPSUBS16, v4hi_ftype_v4hi_v4hi);
10432       def_builtin_const ("__builtin_vis_fpsubs16s", CODE_FOR_sssubv2hi3,
10433                          SPARC_BUILTIN_FPSUBS16S, v2hi_ftype_v2hi_v2hi);
10434       def_builtin_const ("__builtin_vis_fpadds32", CODE_FOR_ssaddv2si3,
10435                          SPARC_BUILTIN_FPADDS32, v2si_ftype_v2si_v2si);
10436       def_builtin_const ("__builtin_vis_fpadds32s", CODE_FOR_ssaddv1si3,
10437                          SPARC_BUILTIN_FPADDS32S, v1si_ftype_v1si_v1si);
10438       def_builtin_const ("__builtin_vis_fpsubs32", CODE_FOR_sssubv2si3,
10439                          SPARC_BUILTIN_FPSUBS32, v2si_ftype_v2si_v2si);
10440       def_builtin_const ("__builtin_vis_fpsubs32s", CODE_FOR_sssubv1si3,
10441                          SPARC_BUILTIN_FPSUBS32S, v1si_ftype_v1si_v1si);
10442
10443       if (TARGET_ARCH64)
10444         {
10445           def_builtin_const ("__builtin_vis_fucmple8", CODE_FOR_fucmple8di_vis,
10446                              SPARC_BUILTIN_FUCMPLE8, di_ftype_v8qi_v8qi);
10447           def_builtin_const ("__builtin_vis_fucmpne8", CODE_FOR_fucmpne8di_vis,
10448                              SPARC_BUILTIN_FUCMPNE8, di_ftype_v8qi_v8qi);
10449           def_builtin_const ("__builtin_vis_fucmpgt8", CODE_FOR_fucmpgt8di_vis,
10450                              SPARC_BUILTIN_FUCMPGT8, di_ftype_v8qi_v8qi);
10451           def_builtin_const ("__builtin_vis_fucmpeq8", CODE_FOR_fucmpeq8di_vis,
10452                              SPARC_BUILTIN_FUCMPEQ8, di_ftype_v8qi_v8qi);
10453         }
10454       else
10455         {
10456           def_builtin_const ("__builtin_vis_fucmple8", CODE_FOR_fucmple8si_vis,
10457                              SPARC_BUILTIN_FUCMPLE8, si_ftype_v8qi_v8qi);
10458           def_builtin_const ("__builtin_vis_fucmpne8", CODE_FOR_fucmpne8si_vis,
10459                              SPARC_BUILTIN_FUCMPNE8, si_ftype_v8qi_v8qi);
10460           def_builtin_const ("__builtin_vis_fucmpgt8", CODE_FOR_fucmpgt8si_vis,
10461                              SPARC_BUILTIN_FUCMPGT8, si_ftype_v8qi_v8qi);
10462           def_builtin_const ("__builtin_vis_fucmpeq8", CODE_FOR_fucmpeq8si_vis,
10463                              SPARC_BUILTIN_FUCMPEQ8, si_ftype_v8qi_v8qi);
10464         }
10465
10466       def_builtin_const ("__builtin_vis_fhadds", CODE_FOR_fhaddsf_vis,
10467                          SPARC_BUILTIN_FHADDS, sf_ftype_sf_sf);
10468       def_builtin_const ("__builtin_vis_fhaddd", CODE_FOR_fhadddf_vis,
10469                          SPARC_BUILTIN_FHADDD, df_ftype_df_df);
10470       def_builtin_const ("__builtin_vis_fhsubs", CODE_FOR_fhsubsf_vis,
10471                          SPARC_BUILTIN_FHSUBS, sf_ftype_sf_sf);
10472       def_builtin_const ("__builtin_vis_fhsubd", CODE_FOR_fhsubdf_vis,
10473                          SPARC_BUILTIN_FHSUBD, df_ftype_df_df);
10474       def_builtin_const ("__builtin_vis_fnhadds", CODE_FOR_fnhaddsf_vis,
10475                          SPARC_BUILTIN_FNHADDS, sf_ftype_sf_sf);
10476       def_builtin_const ("__builtin_vis_fnhaddd", CODE_FOR_fnhadddf_vis,
10477                          SPARC_BUILTIN_FNHADDD, df_ftype_df_df);
10478
10479       def_builtin_const ("__builtin_vis_umulxhi", CODE_FOR_umulxhi_vis,
10480                          SPARC_BUILTIN_UMULXHI, di_ftype_di_di);
10481       def_builtin_const ("__builtin_vis_xmulx", CODE_FOR_xmulx_vis,
10482                          SPARC_BUILTIN_XMULX, di_ftype_di_di);
10483       def_builtin_const ("__builtin_vis_xmulxhi", CODE_FOR_xmulxhi_vis,
10484                          SPARC_BUILTIN_XMULXHI, di_ftype_di_di);
10485     }
10486 }
10487
10488 /* Implement TARGET_BUILTIN_DECL hook.  */
10489
10490 static tree
10491 sparc_builtin_decl (unsigned code, bool initialize_p ATTRIBUTE_UNUSED)
10492 {
10493   if (code >= SPARC_BUILTIN_MAX)
10494     return error_mark_node;
10495
10496   return sparc_builtins[code];
10497 }
10498
10499 /* Implemented TARGET_EXPAND_BUILTIN hook.  */
10500
10501 static rtx
10502 sparc_expand_builtin (tree exp, rtx target,
10503                       rtx subtarget ATTRIBUTE_UNUSED,
10504                       machine_mode tmode ATTRIBUTE_UNUSED,
10505                       int ignore ATTRIBUTE_UNUSED)
10506 {
10507   tree fndecl = TREE_OPERAND (CALL_EXPR_FN (exp), 0);
10508   enum sparc_builtins code = (enum sparc_builtins) DECL_FUNCTION_CODE (fndecl);
10509   enum insn_code icode = sparc_builtins_icode[code];
10510   bool nonvoid = TREE_TYPE (TREE_TYPE (fndecl)) != void_type_node;
10511   call_expr_arg_iterator iter;
10512   int arg_count = 0;
10513   rtx pat, op[4];
10514   tree arg;
10515
10516   if (nonvoid)
10517     {
10518       machine_mode tmode = insn_data[icode].operand[0].mode;
10519       if (!target
10520           || GET_MODE (target) != tmode
10521           || ! (*insn_data[icode].operand[0].predicate) (target, tmode))
10522         op[0] = gen_reg_rtx (tmode);
10523       else
10524         op[0] = target;
10525     }
10526
10527   FOR_EACH_CALL_EXPR_ARG (arg, iter, exp)
10528     {
10529       const struct insn_operand_data *insn_op;
10530       int idx;
10531
10532       if (arg == error_mark_node)
10533         return NULL_RTX;
10534
10535       arg_count++;
10536       idx = arg_count - !nonvoid;
10537       insn_op = &insn_data[icode].operand[idx];
10538       op[arg_count] = expand_normal (arg);
10539
10540       if (code == SPARC_BUILTIN_LDFSR || code == SPARC_BUILTIN_STFSR)
10541         {
10542           if (!address_operand (op[arg_count], SImode))
10543             {
10544               op[arg_count] = convert_memory_address (Pmode, op[arg_count]);
10545               op[arg_count] = copy_addr_to_reg (op[arg_count]);
10546             }
10547           op[arg_count] = gen_rtx_MEM (SImode, op[arg_count]);
10548         }
10549
10550       else if (insn_op->mode == V1DImode
10551                && GET_MODE (op[arg_count]) == DImode)
10552         op[arg_count] = gen_lowpart (V1DImode, op[arg_count]);
10553
10554       else if (insn_op->mode == V1SImode
10555                && GET_MODE (op[arg_count]) == SImode)
10556         op[arg_count] = gen_lowpart (V1SImode, op[arg_count]);
10557
10558       if (! (*insn_data[icode].operand[idx].predicate) (op[arg_count],
10559                                                         insn_op->mode))
10560         op[arg_count] = copy_to_mode_reg (insn_op->mode, op[arg_count]);
10561     }
10562
10563   switch (arg_count)
10564     {
10565     case 0:
10566       pat = GEN_FCN (icode) (op[0]);
10567       break;
10568     case 1:
10569       if (nonvoid)
10570         pat = GEN_FCN (icode) (op[0], op[1]);
10571       else
10572         pat = GEN_FCN (icode) (op[1]);
10573       break;
10574     case 2:
10575       pat = GEN_FCN (icode) (op[0], op[1], op[2]);
10576       break;
10577     case 3:
10578       pat = GEN_FCN (icode) (op[0], op[1], op[2], op[3]);
10579       break;
10580     default:
10581       gcc_unreachable ();
10582     }
10583
10584   if (!pat)
10585     return NULL_RTX;
10586
10587   emit_insn (pat);
10588
10589   return (nonvoid ? op[0] : const0_rtx);
10590 }
10591
10592 /* Return the upper 16 bits of the 8x16 multiplication.  */
10593
10594 static int
10595 sparc_vis_mul8x16 (int e8, int e16)
10596 {
10597   return (e8 * e16 + 128) / 256;
10598 }
10599
10600 /* Multiply the VECTOR_CSTs CST0 and CST1 as specified by FNCODE and put
10601    the result into the array N_ELTS, whose elements are of INNER_TYPE.  */
10602
10603 static void
10604 sparc_handle_vis_mul8x16 (tree *n_elts, enum sparc_builtins fncode,
10605                           tree inner_type, tree cst0, tree cst1)
10606 {
10607   unsigned i, num = VECTOR_CST_NELTS (cst0);
10608   int scale;
10609
10610   switch (fncode)
10611     {
10612     case SPARC_BUILTIN_FMUL8X16:
10613       for (i = 0; i < num; ++i)
10614         {
10615           int val
10616             = sparc_vis_mul8x16 (TREE_INT_CST_LOW (VECTOR_CST_ELT (cst0, i)),
10617                                  TREE_INT_CST_LOW (VECTOR_CST_ELT (cst1, i)));
10618           n_elts[i] = build_int_cst (inner_type, val);
10619         }
10620       break;
10621
10622     case SPARC_BUILTIN_FMUL8X16AU:
10623       scale = TREE_INT_CST_LOW (VECTOR_CST_ELT (cst1, 0));
10624
10625       for (i = 0; i < num; ++i)
10626         {
10627           int val
10628             = sparc_vis_mul8x16 (TREE_INT_CST_LOW (VECTOR_CST_ELT (cst0, i)),
10629                                  scale);
10630           n_elts[i] = build_int_cst (inner_type, val);
10631         }
10632       break;
10633
10634     case SPARC_BUILTIN_FMUL8X16AL:
10635       scale = TREE_INT_CST_LOW (VECTOR_CST_ELT (cst1, 1));
10636
10637       for (i = 0; i < num; ++i)
10638         {
10639           int val
10640             = sparc_vis_mul8x16 (TREE_INT_CST_LOW (VECTOR_CST_ELT (cst0, i)),
10641                                  scale);
10642           n_elts[i] = build_int_cst (inner_type, val);
10643         }
10644       break;
10645
10646     default:
10647       gcc_unreachable ();
10648     }
10649 }
10650
10651 /* Implement TARGET_FOLD_BUILTIN hook.
10652
10653    Fold builtin functions for SPARC intrinsics.  If IGNORE is true the
10654    result of the function call is ignored.  NULL_TREE is returned if the
10655    function could not be folded.  */
10656
10657 static tree
10658 sparc_fold_builtin (tree fndecl, int n_args ATTRIBUTE_UNUSED,
10659                     tree *args, bool ignore)
10660 {
10661   enum sparc_builtins code = (enum sparc_builtins) DECL_FUNCTION_CODE (fndecl);
10662   tree rtype = TREE_TYPE (TREE_TYPE (fndecl));
10663   tree arg0, arg1, arg2;
10664
10665   if (ignore)
10666     switch (code)
10667       {
10668       case SPARC_BUILTIN_LDFSR:
10669       case SPARC_BUILTIN_STFSR:
10670       case SPARC_BUILTIN_ALIGNADDR:
10671       case SPARC_BUILTIN_WRGSR:
10672       case SPARC_BUILTIN_BMASK:
10673       case SPARC_BUILTIN_CMASK8:
10674       case SPARC_BUILTIN_CMASK16:
10675       case SPARC_BUILTIN_CMASK32:
10676         break;
10677
10678       default:
10679         return build_zero_cst (rtype);
10680       }
10681
10682   switch (code)
10683     {
10684     case SPARC_BUILTIN_FEXPAND:
10685       arg0 = args[0];
10686       STRIP_NOPS (arg0);
10687
10688       if (TREE_CODE (arg0) == VECTOR_CST)
10689         {
10690           tree inner_type = TREE_TYPE (rtype);
10691           tree *n_elts;
10692           unsigned i;
10693
10694           n_elts = XALLOCAVEC (tree, VECTOR_CST_NELTS (arg0));
10695           for (i = 0; i < VECTOR_CST_NELTS (arg0); ++i)
10696             n_elts[i] = build_int_cst (inner_type,
10697                                        TREE_INT_CST_LOW
10698                                          (VECTOR_CST_ELT (arg0, i)) << 4);
10699           return build_vector (rtype, n_elts);
10700         }
10701       break;
10702
10703     case SPARC_BUILTIN_FMUL8X16:
10704     case SPARC_BUILTIN_FMUL8X16AU:
10705     case SPARC_BUILTIN_FMUL8X16AL:
10706       arg0 = args[0];
10707       arg1 = args[1];
10708       STRIP_NOPS (arg0);
10709       STRIP_NOPS (arg1);
10710
10711       if (TREE_CODE (arg0) == VECTOR_CST && TREE_CODE (arg1) == VECTOR_CST)
10712         {
10713           tree inner_type = TREE_TYPE (rtype);
10714           tree *n_elts = XALLOCAVEC (tree, VECTOR_CST_NELTS (arg0));
10715           sparc_handle_vis_mul8x16 (n_elts, code, inner_type, arg0, arg1);
10716           return build_vector (rtype, n_elts);
10717         }
10718       break;
10719
10720     case SPARC_BUILTIN_FPMERGE:
10721       arg0 = args[0];
10722       arg1 = args[1];
10723       STRIP_NOPS (arg0);
10724       STRIP_NOPS (arg1);
10725
10726       if (TREE_CODE (arg0) == VECTOR_CST && TREE_CODE (arg1) == VECTOR_CST)
10727         {
10728           tree *n_elts = XALLOCAVEC (tree, 2 * VECTOR_CST_NELTS (arg0));
10729           unsigned i;
10730           for (i = 0; i < VECTOR_CST_NELTS (arg0); ++i)
10731             {
10732               n_elts[2*i] = VECTOR_CST_ELT (arg0, i);
10733               n_elts[2*i+1] = VECTOR_CST_ELT (arg1, i);
10734             }
10735
10736           return build_vector (rtype, n_elts);
10737         }
10738       break;
10739
10740     case SPARC_BUILTIN_PDIST:
10741     case SPARC_BUILTIN_PDISTN:
10742       arg0 = args[0];
10743       arg1 = args[1];
10744       STRIP_NOPS (arg0);
10745       STRIP_NOPS (arg1);
10746       if (code == SPARC_BUILTIN_PDIST)
10747         {
10748           arg2 = args[2];
10749           STRIP_NOPS (arg2);
10750         }
10751       else
10752         arg2 = integer_zero_node;
10753
10754       if (TREE_CODE (arg0) == VECTOR_CST
10755           && TREE_CODE (arg1) == VECTOR_CST
10756           && TREE_CODE (arg2) == INTEGER_CST)
10757         {
10758           bool overflow = false;
10759           widest_int result = wi::to_widest (arg2);
10760           widest_int tmp;
10761           unsigned i;
10762
10763           for (i = 0; i < VECTOR_CST_NELTS (arg0); ++i)
10764             {
10765               tree e0 = VECTOR_CST_ELT (arg0, i);
10766               tree e1 = VECTOR_CST_ELT (arg1, i);
10767
10768               bool neg1_ovf, neg2_ovf, add1_ovf, add2_ovf;
10769
10770               tmp = wi::neg (wi::to_widest (e1), &neg1_ovf);
10771               tmp = wi::add (wi::to_widest (e0), tmp, SIGNED, &add1_ovf);
10772               if (wi::neg_p (tmp))
10773                 tmp = wi::neg (tmp, &neg2_ovf);
10774               else
10775                 neg2_ovf = false;
10776               result = wi::add (result, tmp, SIGNED, &add2_ovf);
10777               overflow |= neg1_ovf | neg2_ovf | add1_ovf | add2_ovf;
10778             }
10779
10780           gcc_assert (!overflow);
10781
10782           return wide_int_to_tree (rtype, result);
10783         }
10784
10785     default:
10786       break;
10787     }
10788
10789   return NULL_TREE;
10790 }
10791 \f
10792 /* ??? This duplicates information provided to the compiler by the
10793    ??? scheduler description.  Some day, teach genautomata to output
10794    ??? the latencies and then CSE will just use that.  */
10795
10796 static bool
10797 sparc_rtx_costs (rtx x, machine_mode mode, int outer_code,
10798                  int opno ATTRIBUTE_UNUSED,
10799                  int *total, bool speed ATTRIBUTE_UNUSED)
10800 {
10801   int code = GET_CODE (x);
10802   bool float_mode_p = FLOAT_MODE_P (mode);
10803
10804   switch (code)
10805     {
10806     case CONST_INT:
10807       if (SMALL_INT (x))
10808         *total = 0;
10809       else
10810         *total = 2;
10811       return true;
10812
10813     case CONST_WIDE_INT:
10814       *total = 0;
10815       if (!SPARC_SIMM13_P (CONST_WIDE_INT_ELT (x, 0)))
10816         *total += 2;
10817       if (!SPARC_SIMM13_P (CONST_WIDE_INT_ELT (x, 1)))
10818         *total += 2;
10819       return true;
10820
10821     case HIGH:
10822       *total = 2;
10823       return true;
10824
10825     case CONST:
10826     case LABEL_REF:
10827     case SYMBOL_REF:
10828       *total = 4;
10829       return true;
10830
10831     case CONST_DOUBLE:
10832       *total = 8;
10833       return true;
10834
10835     case MEM:
10836       /* If outer-code was a sign or zero extension, a cost
10837          of COSTS_N_INSNS (1) was already added in.  This is
10838          why we are subtracting it back out.  */
10839       if (outer_code == ZERO_EXTEND)
10840         {
10841           *total = sparc_costs->int_zload - COSTS_N_INSNS (1);
10842         }
10843       else if (outer_code == SIGN_EXTEND)
10844         {
10845           *total = sparc_costs->int_sload - COSTS_N_INSNS (1);
10846         }
10847       else if (float_mode_p)
10848         {
10849           *total = sparc_costs->float_load;
10850         }
10851       else
10852         {
10853           *total = sparc_costs->int_load;
10854         }
10855
10856       return true;
10857
10858     case PLUS:
10859     case MINUS:
10860       if (float_mode_p)
10861         *total = sparc_costs->float_plusminus;
10862       else
10863         *total = COSTS_N_INSNS (1);
10864       return false;
10865
10866     case FMA:
10867       {
10868         rtx sub;
10869
10870         gcc_assert (float_mode_p);
10871         *total = sparc_costs->float_mul;
10872
10873         sub = XEXP (x, 0);
10874         if (GET_CODE (sub) == NEG)
10875           sub = XEXP (sub, 0);
10876         *total += rtx_cost (sub, mode, FMA, 0, speed);
10877
10878         sub = XEXP (x, 2);
10879         if (GET_CODE (sub) == NEG)
10880           sub = XEXP (sub, 0);
10881         *total += rtx_cost (sub, mode, FMA, 2, speed);
10882         return true;
10883       }
10884
10885     case MULT:
10886       if (float_mode_p)
10887         *total = sparc_costs->float_mul;
10888       else if (TARGET_ARCH32 && !TARGET_HARD_MUL)
10889         *total = COSTS_N_INSNS (25);
10890       else
10891         {
10892           int bit_cost;
10893
10894           bit_cost = 0;
10895           if (sparc_costs->int_mul_bit_factor)
10896             {
10897               int nbits;
10898
10899               if (GET_CODE (XEXP (x, 1)) == CONST_INT)
10900                 {
10901                   unsigned HOST_WIDE_INT value = INTVAL (XEXP (x, 1));
10902                   for (nbits = 0; value != 0; value &= value - 1)
10903                     nbits++;
10904                 }
10905               else
10906                 nbits = 7;
10907
10908               if (nbits < 3)
10909                 nbits = 3;
10910               bit_cost = (nbits - 3) / sparc_costs->int_mul_bit_factor;
10911               bit_cost = COSTS_N_INSNS (bit_cost);
10912             }
10913
10914           if (mode == DImode || !TARGET_HARD_MUL)
10915             *total = sparc_costs->int_mulX + bit_cost;
10916           else
10917             *total = sparc_costs->int_mul + bit_cost;
10918         }
10919       return false;
10920
10921     case ASHIFT:
10922     case ASHIFTRT:
10923     case LSHIFTRT:
10924       *total = COSTS_N_INSNS (1) + sparc_costs->shift_penalty;
10925       return false;
10926
10927     case DIV:
10928     case UDIV:
10929     case MOD:
10930     case UMOD:
10931       if (float_mode_p)
10932         {
10933           if (mode == DFmode)
10934             *total = sparc_costs->float_div_df;
10935           else
10936             *total = sparc_costs->float_div_sf;
10937         }
10938       else
10939         {
10940           if (mode == DImode)
10941             *total = sparc_costs->int_divX;
10942           else
10943             *total = sparc_costs->int_div;
10944         }
10945       return false;
10946
10947     case NEG:
10948       if (! float_mode_p)
10949         {
10950           *total = COSTS_N_INSNS (1);
10951           return false;
10952         }
10953       /* FALLTHRU */
10954
10955     case ABS:
10956     case FLOAT:
10957     case UNSIGNED_FLOAT:
10958     case FIX:
10959     case UNSIGNED_FIX:
10960     case FLOAT_EXTEND:
10961     case FLOAT_TRUNCATE:
10962       *total = sparc_costs->float_move;
10963       return false;
10964
10965     case SQRT:
10966       if (mode == DFmode)
10967         *total = sparc_costs->float_sqrt_df;
10968       else
10969         *total = sparc_costs->float_sqrt_sf;
10970       return false;
10971
10972     case COMPARE:
10973       if (float_mode_p)
10974         *total = sparc_costs->float_cmp;
10975       else
10976         *total = COSTS_N_INSNS (1);
10977       return false;
10978
10979     case IF_THEN_ELSE:
10980       if (float_mode_p)
10981         *total = sparc_costs->float_cmove;
10982       else
10983         *total = sparc_costs->int_cmove;
10984       return false;
10985
10986     case IOR:
10987       /* Handle the NAND vector patterns.  */
10988       if (sparc_vector_mode_supported_p (mode)
10989           && GET_CODE (XEXP (x, 0)) == NOT
10990           && GET_CODE (XEXP (x, 1)) == NOT)
10991         {
10992           *total = COSTS_N_INSNS (1);
10993           return true;
10994         }
10995       else
10996         return false;
10997
10998     default:
10999       return false;
11000     }
11001 }
11002
11003 /* Return true if CLASS is either GENERAL_REGS or I64_REGS.  */
11004
11005 static inline bool
11006 general_or_i64_p (reg_class_t rclass)
11007 {
11008   return (rclass == GENERAL_REGS || rclass == I64_REGS);
11009 }
11010
11011 /* Implement TARGET_REGISTER_MOVE_COST.  */
11012
11013 static int
11014 sparc_register_move_cost (machine_mode mode ATTRIBUTE_UNUSED,
11015                           reg_class_t from, reg_class_t to)
11016 {
11017   bool need_memory = false;
11018
11019   if (from == FPCC_REGS || to == FPCC_REGS)
11020     need_memory = true;
11021   else if ((FP_REG_CLASS_P (from) && general_or_i64_p (to))
11022            || (general_or_i64_p (from) && FP_REG_CLASS_P (to)))
11023     {
11024       if (TARGET_VIS3)
11025         {
11026           int size = GET_MODE_SIZE (mode);
11027           if (size == 8 || size == 4)
11028             {
11029               if (! TARGET_ARCH32 || size == 4)
11030                 return 4;
11031               else
11032                 return 6;
11033             }
11034         }
11035       need_memory = true;
11036     }
11037
11038   if (need_memory)
11039     {
11040       if (sparc_cpu == PROCESSOR_ULTRASPARC
11041           || sparc_cpu == PROCESSOR_ULTRASPARC3
11042           || sparc_cpu == PROCESSOR_NIAGARA
11043           || sparc_cpu == PROCESSOR_NIAGARA2
11044           || sparc_cpu == PROCESSOR_NIAGARA3
11045           || sparc_cpu == PROCESSOR_NIAGARA4)
11046         return 12;
11047
11048       return 6;
11049     }
11050
11051   return 2;
11052 }
11053
11054 /* Emit the sequence of insns SEQ while preserving the registers REG and REG2.
11055    This is achieved by means of a manual dynamic stack space allocation in
11056    the current frame.  We make the assumption that SEQ doesn't contain any
11057    function calls, with the possible exception of calls to the GOT helper.  */
11058
11059 static void
11060 emit_and_preserve (rtx seq, rtx reg, rtx reg2)
11061 {
11062   /* We must preserve the lowest 16 words for the register save area.  */
11063   HOST_WIDE_INT offset = 16*UNITS_PER_WORD;
11064   /* We really need only 2 words of fresh stack space.  */
11065   HOST_WIDE_INT size = SPARC_STACK_ALIGN (offset + 2*UNITS_PER_WORD);
11066
11067   rtx slot
11068     = gen_rtx_MEM (word_mode, plus_constant (Pmode, stack_pointer_rtx,
11069                                              SPARC_STACK_BIAS + offset));
11070
11071   emit_insn (gen_stack_pointer_inc (GEN_INT (-size)));
11072   emit_insn (gen_rtx_SET (slot, reg));
11073   if (reg2)
11074     emit_insn (gen_rtx_SET (adjust_address (slot, word_mode, UNITS_PER_WORD),
11075                             reg2));
11076   emit_insn (seq);
11077   if (reg2)
11078     emit_insn (gen_rtx_SET (reg2,
11079                             adjust_address (slot, word_mode, UNITS_PER_WORD)));
11080   emit_insn (gen_rtx_SET (reg, slot));
11081   emit_insn (gen_stack_pointer_inc (GEN_INT (size)));
11082 }
11083
11084 /* Output the assembler code for a thunk function.  THUNK_DECL is the
11085    declaration for the thunk function itself, FUNCTION is the decl for
11086    the target function.  DELTA is an immediate constant offset to be
11087    added to THIS.  If VCALL_OFFSET is nonzero, the word at address
11088    (*THIS + VCALL_OFFSET) should be additionally added to THIS.  */
11089
11090 static void
11091 sparc_output_mi_thunk (FILE *file, tree thunk_fndecl ATTRIBUTE_UNUSED,
11092                        HOST_WIDE_INT delta, HOST_WIDE_INT vcall_offset,
11093                        tree function)
11094 {
11095   rtx this_rtx, funexp;
11096   rtx_insn *insn;
11097   unsigned int int_arg_first;
11098
11099   reload_completed = 1;
11100   epilogue_completed = 1;
11101
11102   emit_note (NOTE_INSN_PROLOGUE_END);
11103
11104   if (TARGET_FLAT)
11105     {
11106       sparc_leaf_function_p = 1;
11107
11108       int_arg_first = SPARC_OUTGOING_INT_ARG_FIRST;
11109     }
11110   else if (flag_delayed_branch)
11111     {
11112       /* We will emit a regular sibcall below, so we need to instruct
11113          output_sibcall that we are in a leaf function.  */
11114       sparc_leaf_function_p = crtl->uses_only_leaf_regs = 1;
11115
11116       /* This will cause final.c to invoke leaf_renumber_regs so we
11117          must behave as if we were in a not-yet-leafified function.  */
11118       int_arg_first = SPARC_INCOMING_INT_ARG_FIRST;
11119     }
11120   else
11121     {
11122       /* We will emit the sibcall manually below, so we will need to
11123          manually spill non-leaf registers.  */
11124       sparc_leaf_function_p = crtl->uses_only_leaf_regs = 0;
11125
11126       /* We really are in a leaf function.  */
11127       int_arg_first = SPARC_OUTGOING_INT_ARG_FIRST;
11128     }
11129
11130   /* Find the "this" pointer.  Normally in %o0, but in ARCH64 if the function
11131      returns a structure, the structure return pointer is there instead.  */
11132   if (TARGET_ARCH64
11133       && aggregate_value_p (TREE_TYPE (TREE_TYPE (function)), function))
11134     this_rtx = gen_rtx_REG (Pmode, int_arg_first + 1);
11135   else
11136     this_rtx = gen_rtx_REG (Pmode, int_arg_first);
11137
11138   /* Add DELTA.  When possible use a plain add, otherwise load it into
11139      a register first.  */
11140   if (delta)
11141     {
11142       rtx delta_rtx = GEN_INT (delta);
11143
11144       if (! SPARC_SIMM13_P (delta))
11145         {
11146           rtx scratch = gen_rtx_REG (Pmode, 1);
11147           emit_move_insn (scratch, delta_rtx);
11148           delta_rtx = scratch;
11149         }
11150
11151       /* THIS_RTX += DELTA.  */
11152       emit_insn (gen_add2_insn (this_rtx, delta_rtx));
11153     }
11154
11155   /* Add the word at address (*THIS_RTX + VCALL_OFFSET).  */
11156   if (vcall_offset)
11157     {
11158       rtx vcall_offset_rtx = GEN_INT (vcall_offset);
11159       rtx scratch = gen_rtx_REG (Pmode, 1);
11160
11161       gcc_assert (vcall_offset < 0);
11162
11163       /* SCRATCH = *THIS_RTX.  */
11164       emit_move_insn (scratch, gen_rtx_MEM (Pmode, this_rtx));
11165
11166       /* Prepare for adding VCALL_OFFSET.  The difficulty is that we
11167          may not have any available scratch register at this point.  */
11168       if (SPARC_SIMM13_P (vcall_offset))
11169         ;
11170       /* This is the case if ARCH64 (unless -ffixed-g5 is passed).  */
11171       else if (! fixed_regs[5]
11172                /* The below sequence is made up of at least 2 insns,
11173                   while the default method may need only one.  */
11174                && vcall_offset < -8192)
11175         {
11176           rtx scratch2 = gen_rtx_REG (Pmode, 5);
11177           emit_move_insn (scratch2, vcall_offset_rtx);
11178           vcall_offset_rtx = scratch2;
11179         }
11180       else
11181         {
11182           rtx increment = GEN_INT (-4096);
11183
11184           /* VCALL_OFFSET is a negative number whose typical range can be
11185              estimated as -32768..0 in 32-bit mode.  In almost all cases
11186              it is therefore cheaper to emit multiple add insns than
11187              spilling and loading the constant into a register (at least
11188              6 insns).  */
11189           while (! SPARC_SIMM13_P (vcall_offset))
11190             {
11191               emit_insn (gen_add2_insn (scratch, increment));
11192               vcall_offset += 4096;
11193             }
11194           vcall_offset_rtx = GEN_INT (vcall_offset); /* cannot be 0 */
11195         }
11196
11197       /* SCRATCH = *(*THIS_RTX + VCALL_OFFSET).  */
11198       emit_move_insn (scratch, gen_rtx_MEM (Pmode,
11199                                             gen_rtx_PLUS (Pmode,
11200                                                           scratch,
11201                                                           vcall_offset_rtx)));
11202
11203       /* THIS_RTX += *(*THIS_RTX + VCALL_OFFSET).  */
11204       emit_insn (gen_add2_insn (this_rtx, scratch));
11205     }
11206
11207   /* Generate a tail call to the target function.  */
11208   if (! TREE_USED (function))
11209     {
11210       assemble_external (function);
11211       TREE_USED (function) = 1;
11212     }
11213   funexp = XEXP (DECL_RTL (function), 0);
11214
11215   if (flag_delayed_branch)
11216     {
11217       funexp = gen_rtx_MEM (FUNCTION_MODE, funexp);
11218       insn = emit_call_insn (gen_sibcall (funexp));
11219       SIBLING_CALL_P (insn) = 1;
11220     }
11221   else
11222     {
11223       /* The hoops we have to jump through in order to generate a sibcall
11224          without using delay slots...  */
11225       rtx spill_reg, seq, scratch = gen_rtx_REG (Pmode, 1);
11226
11227       if (flag_pic)
11228         {
11229           spill_reg = gen_rtx_REG (word_mode, 15);  /* %o7 */
11230           start_sequence ();
11231           load_got_register ();  /* clobbers %o7 */
11232           scratch = sparc_legitimize_pic_address (funexp, scratch);
11233           seq = get_insns ();
11234           end_sequence ();
11235           emit_and_preserve (seq, spill_reg, pic_offset_table_rtx);
11236         }
11237       else if (TARGET_ARCH32)
11238         {
11239           emit_insn (gen_rtx_SET (scratch,
11240                                   gen_rtx_HIGH (SImode, funexp)));
11241           emit_insn (gen_rtx_SET (scratch,
11242                                   gen_rtx_LO_SUM (SImode, scratch, funexp)));
11243         }
11244       else  /* TARGET_ARCH64 */
11245         {
11246           switch (sparc_cmodel)
11247             {
11248             case CM_MEDLOW:
11249             case CM_MEDMID:
11250               /* The destination can serve as a temporary.  */
11251               sparc_emit_set_symbolic_const64 (scratch, funexp, scratch);
11252               break;
11253
11254             case CM_MEDANY:
11255             case CM_EMBMEDANY:
11256               /* The destination cannot serve as a temporary.  */
11257               spill_reg = gen_rtx_REG (DImode, 15);  /* %o7 */
11258               start_sequence ();
11259               sparc_emit_set_symbolic_const64 (scratch, funexp, spill_reg);
11260               seq = get_insns ();
11261               end_sequence ();
11262               emit_and_preserve (seq, spill_reg, 0);
11263               break;
11264
11265             default:
11266               gcc_unreachable ();
11267             }
11268         }
11269
11270       emit_jump_insn (gen_indirect_jump (scratch));
11271     }
11272
11273   emit_barrier ();
11274
11275   /* Run just enough of rest_of_compilation to get the insns emitted.
11276      There's not really enough bulk here to make other passes such as
11277      instruction scheduling worth while.  Note that use_thunk calls
11278      assemble_start_function and assemble_end_function.  */
11279   insn = get_insns ();
11280   shorten_branches (insn);
11281   final_start_function (insn, file, 1);
11282   final (insn, file, 1);
11283   final_end_function ();
11284
11285   reload_completed = 0;
11286   epilogue_completed = 0;
11287 }
11288
11289 /* Return true if sparc_output_mi_thunk would be able to output the
11290    assembler code for the thunk function specified by the arguments
11291    it is passed, and false otherwise.  */
11292 static bool
11293 sparc_can_output_mi_thunk (const_tree thunk_fndecl ATTRIBUTE_UNUSED,
11294                            HOST_WIDE_INT delta ATTRIBUTE_UNUSED,
11295                            HOST_WIDE_INT vcall_offset,
11296                            const_tree function ATTRIBUTE_UNUSED)
11297 {
11298   /* Bound the loop used in the default method above.  */
11299   return (vcall_offset >= -32768 || ! fixed_regs[5]);
11300 }
11301
11302 /* How to allocate a 'struct machine_function'.  */
11303
11304 static struct machine_function *
11305 sparc_init_machine_status (void)
11306 {
11307   return ggc_cleared_alloc<machine_function> ();
11308 }
11309
11310 /* This is called from dwarf2out.c via TARGET_ASM_OUTPUT_DWARF_DTPREL.
11311    We need to emit DTP-relative relocations.  */
11312
11313 static void
11314 sparc_output_dwarf_dtprel (FILE *file, int size, rtx x)
11315 {
11316   switch (size)
11317     {
11318     case 4:
11319       fputs ("\t.word\t%r_tls_dtpoff32(", file);
11320       break;
11321     case 8:
11322       fputs ("\t.xword\t%r_tls_dtpoff64(", file);
11323       break;
11324     default:
11325       gcc_unreachable ();
11326     }
11327   output_addr_const (file, x);
11328   fputs (")", file);
11329 }
11330
11331 /* Do whatever processing is required at the end of a file.  */
11332
11333 static void
11334 sparc_file_end (void)
11335 {
11336   /* If we need to emit the special GOT helper function, do so now.  */
11337   if (got_helper_rtx)
11338     {
11339       const char *name = XSTR (got_helper_rtx, 0);
11340       const char *reg_name = reg_names[GLOBAL_OFFSET_TABLE_REGNUM];
11341 #ifdef DWARF2_UNWIND_INFO
11342       bool do_cfi;
11343 #endif
11344
11345       if (USE_HIDDEN_LINKONCE)
11346         {
11347           tree decl = build_decl (BUILTINS_LOCATION, FUNCTION_DECL,
11348                                   get_identifier (name),
11349                                   build_function_type_list (void_type_node,
11350                                                             NULL_TREE));
11351           DECL_RESULT (decl) = build_decl (BUILTINS_LOCATION, RESULT_DECL,
11352                                            NULL_TREE, void_type_node);
11353           TREE_PUBLIC (decl) = 1;
11354           TREE_STATIC (decl) = 1;
11355           make_decl_one_only (decl, DECL_ASSEMBLER_NAME (decl));
11356           DECL_VISIBILITY (decl) = VISIBILITY_HIDDEN;
11357           DECL_VISIBILITY_SPECIFIED (decl) = 1;
11358           resolve_unique_section (decl, 0, flag_function_sections);
11359           allocate_struct_function (decl, true);
11360           cfun->is_thunk = 1;
11361           current_function_decl = decl;
11362           init_varasm_status ();
11363           assemble_start_function (decl, name);
11364         }
11365       else
11366         {
11367           const int align = floor_log2 (FUNCTION_BOUNDARY / BITS_PER_UNIT);
11368           switch_to_section (text_section);
11369           if (align > 0)
11370             ASM_OUTPUT_ALIGN (asm_out_file, align);
11371           ASM_OUTPUT_LABEL (asm_out_file, name);
11372         }
11373
11374 #ifdef DWARF2_UNWIND_INFO
11375       do_cfi = dwarf2out_do_cfi_asm ();
11376       if (do_cfi)
11377         fprintf (asm_out_file, "\t.cfi_startproc\n");
11378 #endif
11379       if (flag_delayed_branch)
11380         fprintf (asm_out_file, "\tjmp\t%%o7+8\n\t add\t%%o7, %s, %s\n",
11381                  reg_name, reg_name);
11382       else
11383         fprintf (asm_out_file, "\tadd\t%%o7, %s, %s\n\tjmp\t%%o7+8\n\t nop\n",
11384                  reg_name, reg_name);
11385 #ifdef DWARF2_UNWIND_INFO
11386       if (do_cfi)
11387         fprintf (asm_out_file, "\t.cfi_endproc\n");
11388 #endif
11389     }
11390
11391   if (NEED_INDICATE_EXEC_STACK)
11392     file_end_indicate_exec_stack ();
11393
11394 #ifdef TARGET_SOLARIS
11395   solaris_file_end ();
11396 #endif
11397 }
11398
11399 #ifdef TARGET_ALTERNATE_LONG_DOUBLE_MANGLING
11400 /* Implement TARGET_MANGLE_TYPE.  */
11401
11402 static const char *
11403 sparc_mangle_type (const_tree type)
11404 {
11405   if (!TARGET_64BIT
11406       && TYPE_MAIN_VARIANT (type) == long_double_type_node
11407       && TARGET_LONG_DOUBLE_128)
11408     return "g";
11409
11410   /* For all other types, use normal C++ mangling.  */
11411   return NULL;
11412 }
11413 #endif
11414
11415 /* Expand a membar instruction for various use cases.  Both the LOAD_STORE
11416    and BEFORE_AFTER arguments of the form X_Y.  They are two-bit masks where
11417    bit 0 indicates that X is true, and bit 1 indicates Y is true.  */
11418
11419 void
11420 sparc_emit_membar_for_model (enum memmodel model,
11421                              int load_store, int before_after)
11422 {
11423   /* Bits for the MEMBAR mmask field.  */
11424   const int LoadLoad = 1;
11425   const int StoreLoad = 2;
11426   const int LoadStore = 4;
11427   const int StoreStore = 8;
11428
11429   int mm = 0, implied = 0;
11430
11431   switch (sparc_memory_model)
11432     {
11433     case SMM_SC:
11434       /* Sequential Consistency.  All memory transactions are immediately
11435          visible in sequential execution order.  No barriers needed.  */
11436       implied = LoadLoad | StoreLoad | LoadStore | StoreStore;
11437       break;
11438
11439     case SMM_TSO:
11440       /* Total Store Ordering: all memory transactions with store semantics
11441          are followed by an implied StoreStore.  */
11442       implied |= StoreStore;
11443
11444       /* If we're not looking for a raw barrer (before+after), then atomic
11445          operations get the benefit of being both load and store.  */
11446       if (load_store == 3 && before_after == 1)
11447         implied |= StoreLoad;
11448       /* FALLTHRU */
11449
11450     case SMM_PSO:
11451       /* Partial Store Ordering: all memory transactions with load semantics
11452          are followed by an implied LoadLoad | LoadStore.  */
11453       implied |= LoadLoad | LoadStore;
11454
11455       /* If we're not looking for a raw barrer (before+after), then atomic
11456          operations get the benefit of being both load and store.  */
11457       if (load_store == 3 && before_after == 2)
11458         implied |= StoreLoad | StoreStore;
11459       /* FALLTHRU */
11460
11461     case SMM_RMO:
11462       /* Relaxed Memory Ordering: no implicit bits.  */
11463       break;
11464
11465     default:
11466       gcc_unreachable ();
11467     }
11468
11469   if (before_after & 1)
11470     {
11471       if (is_mm_release (model) || is_mm_acq_rel (model)
11472           || is_mm_seq_cst (model))
11473         {
11474           if (load_store & 1)
11475             mm |= LoadLoad | StoreLoad;
11476           if (load_store & 2)
11477             mm |= LoadStore | StoreStore;
11478         }
11479     }
11480   if (before_after & 2)
11481     {
11482       if (is_mm_acquire (model) || is_mm_acq_rel (model)
11483           || is_mm_seq_cst (model))
11484         {
11485           if (load_store & 1)
11486             mm |= LoadLoad | LoadStore;
11487           if (load_store & 2)
11488             mm |= StoreLoad | StoreStore;
11489         }
11490     }
11491
11492   /* Remove the bits implied by the system memory model.  */
11493   mm &= ~implied;
11494
11495   /* For raw barriers (before+after), always emit a barrier.
11496      This will become a compile-time barrier if needed.  */
11497   if (mm || before_after == 3)
11498     emit_insn (gen_membar (GEN_INT (mm)));
11499 }
11500
11501 /* Expand code to perform a 8 or 16-bit compare and swap by doing 32-bit
11502    compare and swap on the word containing the byte or half-word.  */
11503
11504 static void
11505 sparc_expand_compare_and_swap_12 (rtx bool_result, rtx result, rtx mem,
11506                                   rtx oldval, rtx newval)
11507 {
11508   rtx addr1 = force_reg (Pmode, XEXP (mem, 0));
11509   rtx addr = gen_reg_rtx (Pmode);
11510   rtx off = gen_reg_rtx (SImode);
11511   rtx oldv = gen_reg_rtx (SImode);
11512   rtx newv = gen_reg_rtx (SImode);
11513   rtx oldvalue = gen_reg_rtx (SImode);
11514   rtx newvalue = gen_reg_rtx (SImode);
11515   rtx res = gen_reg_rtx (SImode);
11516   rtx resv = gen_reg_rtx (SImode);
11517   rtx memsi, val, mask, cc;
11518
11519   emit_insn (gen_rtx_SET (addr, gen_rtx_AND (Pmode, addr1, GEN_INT (-4))));
11520
11521   if (Pmode != SImode)
11522     addr1 = gen_lowpart (SImode, addr1);
11523   emit_insn (gen_rtx_SET (off, gen_rtx_AND (SImode, addr1, GEN_INT (3))));
11524
11525   memsi = gen_rtx_MEM (SImode, addr);
11526   set_mem_alias_set (memsi, ALIAS_SET_MEMORY_BARRIER);
11527   MEM_VOLATILE_P (memsi) = MEM_VOLATILE_P (mem);
11528
11529   val = copy_to_reg (memsi);
11530
11531   emit_insn (gen_rtx_SET (off,
11532                           gen_rtx_XOR (SImode, off,
11533                                        GEN_INT (GET_MODE (mem) == QImode
11534                                                 ? 3 : 2))));
11535
11536   emit_insn (gen_rtx_SET (off, gen_rtx_ASHIFT (SImode, off, GEN_INT (3))));
11537
11538   if (GET_MODE (mem) == QImode)
11539     mask = force_reg (SImode, GEN_INT (0xff));
11540   else
11541     mask = force_reg (SImode, GEN_INT (0xffff));
11542
11543   emit_insn (gen_rtx_SET (mask, gen_rtx_ASHIFT (SImode, mask, off)));
11544
11545   emit_insn (gen_rtx_SET (val,
11546                           gen_rtx_AND (SImode, gen_rtx_NOT (SImode, mask),
11547                                        val)));
11548
11549   oldval = gen_lowpart (SImode, oldval);
11550   emit_insn (gen_rtx_SET (oldv, gen_rtx_ASHIFT (SImode, oldval, off)));
11551
11552   newval = gen_lowpart_common (SImode, newval);
11553   emit_insn (gen_rtx_SET (newv, gen_rtx_ASHIFT (SImode, newval, off)));
11554
11555   emit_insn (gen_rtx_SET (oldv, gen_rtx_AND (SImode, oldv, mask)));
11556
11557   emit_insn (gen_rtx_SET (newv, gen_rtx_AND (SImode, newv, mask)));
11558
11559   rtx_code_label *end_label = gen_label_rtx ();
11560   rtx_code_label *loop_label = gen_label_rtx ();
11561   emit_label (loop_label);
11562
11563   emit_insn (gen_rtx_SET (oldvalue, gen_rtx_IOR (SImode, oldv, val)));
11564
11565   emit_insn (gen_rtx_SET (newvalue, gen_rtx_IOR (SImode, newv, val)));
11566
11567   emit_move_insn (bool_result, const1_rtx);
11568
11569   emit_insn (gen_atomic_compare_and_swapsi_1 (res, memsi, oldvalue, newvalue));
11570
11571   emit_cmp_and_jump_insns (res, oldvalue, EQ, NULL, SImode, 0, end_label);
11572
11573   emit_insn (gen_rtx_SET (resv,
11574                           gen_rtx_AND (SImode, gen_rtx_NOT (SImode, mask),
11575                                        res)));
11576
11577   emit_move_insn (bool_result, const0_rtx);
11578
11579   cc = gen_compare_reg_1 (NE, resv, val);
11580   emit_insn (gen_rtx_SET (val, resv));
11581
11582   /* Use cbranchcc4 to separate the compare and branch!  */
11583   emit_jump_insn (gen_cbranchcc4 (gen_rtx_NE (VOIDmode, cc, const0_rtx),
11584                                   cc, const0_rtx, loop_label));
11585
11586   emit_label (end_label);
11587
11588   emit_insn (gen_rtx_SET (res, gen_rtx_AND (SImode, res, mask)));
11589
11590   emit_insn (gen_rtx_SET (res, gen_rtx_LSHIFTRT (SImode, res, off)));
11591
11592   emit_move_insn (result, gen_lowpart (GET_MODE (result), res));
11593 }
11594
11595 /* Expand code to perform a compare-and-swap.  */
11596
11597 void
11598 sparc_expand_compare_and_swap (rtx operands[])
11599 {
11600   rtx bval, retval, mem, oldval, newval;
11601   machine_mode mode;
11602   enum memmodel model;
11603
11604   bval = operands[0];
11605   retval = operands[1];
11606   mem = operands[2];
11607   oldval = operands[3];
11608   newval = operands[4];
11609   model = (enum memmodel) INTVAL (operands[6]);
11610   mode = GET_MODE (mem);
11611
11612   sparc_emit_membar_for_model (model, 3, 1);
11613
11614   if (reg_overlap_mentioned_p (retval, oldval))
11615     oldval = copy_to_reg (oldval);
11616
11617   if (mode == QImode || mode == HImode)
11618     sparc_expand_compare_and_swap_12 (bval, retval, mem, oldval, newval);
11619   else
11620     {
11621       rtx (*gen) (rtx, rtx, rtx, rtx);
11622       rtx x;
11623
11624       if (mode == SImode)
11625         gen = gen_atomic_compare_and_swapsi_1;
11626       else
11627         gen = gen_atomic_compare_and_swapdi_1;
11628       emit_insn (gen (retval, mem, oldval, newval));
11629
11630       x = emit_store_flag (bval, EQ, retval, oldval, mode, 1, 1);
11631       if (x != bval)
11632         convert_move (bval, x, 1);
11633     }
11634
11635   sparc_emit_membar_for_model (model, 3, 2);
11636 }
11637
11638 void
11639 sparc_expand_vec_perm_bmask (machine_mode vmode, rtx sel)
11640 {
11641   rtx t_1, t_2, t_3;
11642
11643   sel = gen_lowpart (DImode, sel);
11644   switch (vmode)
11645     {
11646     case V2SImode:
11647       /* inp = xxxxxxxAxxxxxxxB */
11648       t_1 = expand_simple_binop (DImode, LSHIFTRT, sel, GEN_INT (16),
11649                                  NULL_RTX, 1, OPTAB_DIRECT);
11650       /* t_1 = ....xxxxxxxAxxx. */
11651       sel = expand_simple_binop (SImode, AND, gen_lowpart (SImode, sel),
11652                                  GEN_INT (3), NULL_RTX, 1, OPTAB_DIRECT);
11653       t_1 = expand_simple_binop (SImode, AND, gen_lowpart (SImode, t_1),
11654                                  GEN_INT (0x30000), NULL_RTX, 1, OPTAB_DIRECT);
11655       /* sel = .......B */
11656       /* t_1 = ...A.... */
11657       sel = expand_simple_binop (SImode, IOR, sel, t_1, sel, 1, OPTAB_DIRECT);
11658       /* sel = ...A...B */
11659       sel = expand_mult (SImode, sel, GEN_INT (0x4444), sel, 1);
11660       /* sel = AAAABBBB * 4 */
11661       t_1 = force_reg (SImode, GEN_INT (0x01230123));
11662       /* sel = { A*4, A*4+1, A*4+2, ... } */
11663       break;
11664
11665     case V4HImode:
11666       /* inp = xxxAxxxBxxxCxxxD */
11667       t_1 = expand_simple_binop (DImode, LSHIFTRT, sel, GEN_INT (8),
11668                                  NULL_RTX, 1, OPTAB_DIRECT);
11669       t_2 = expand_simple_binop (DImode, LSHIFTRT, sel, GEN_INT (16),
11670                                  NULL_RTX, 1, OPTAB_DIRECT);
11671       t_3 = expand_simple_binop (DImode, LSHIFTRT, sel, GEN_INT (24),
11672                                  NULL_RTX, 1, OPTAB_DIRECT);
11673       /* t_1 = ..xxxAxxxBxxxCxx */
11674       /* t_2 = ....xxxAxxxBxxxC */
11675       /* t_3 = ......xxxAxxxBxx */
11676       sel = expand_simple_binop (SImode, AND, gen_lowpart (SImode, sel),
11677                                  GEN_INT (0x07),
11678                                  NULL_RTX, 1, OPTAB_DIRECT);
11679       t_1 = expand_simple_binop (SImode, AND, gen_lowpart (SImode, t_1),
11680                                  GEN_INT (0x0700),
11681                                  NULL_RTX, 1, OPTAB_DIRECT);
11682       t_2 = expand_simple_binop (SImode, AND, gen_lowpart (SImode, t_2),
11683                                  GEN_INT (0x070000),
11684                                  NULL_RTX, 1, OPTAB_DIRECT);
11685       t_3 = expand_simple_binop (SImode, AND, gen_lowpart (SImode, t_3),
11686                                  GEN_INT (0x07000000),
11687                                  NULL_RTX, 1, OPTAB_DIRECT);
11688       /* sel = .......D */
11689       /* t_1 = .....C.. */
11690       /* t_2 = ...B.... */
11691       /* t_3 = .A...... */
11692       sel = expand_simple_binop (SImode, IOR, sel, t_1, sel, 1, OPTAB_DIRECT);
11693       t_2 = expand_simple_binop (SImode, IOR, t_2, t_3, t_2, 1, OPTAB_DIRECT);
11694       sel = expand_simple_binop (SImode, IOR, sel, t_2, sel, 1, OPTAB_DIRECT);
11695       /* sel = .A.B.C.D */
11696       sel = expand_mult (SImode, sel, GEN_INT (0x22), sel, 1);
11697       /* sel = AABBCCDD * 2 */
11698       t_1 = force_reg (SImode, GEN_INT (0x01010101));
11699       /* sel = { A*2, A*2+1, B*2, B*2+1, ... } */
11700       break;
11701   
11702     case V8QImode:
11703       /* input = xAxBxCxDxExFxGxH */
11704       sel = expand_simple_binop (DImode, AND, sel,
11705                                  GEN_INT ((HOST_WIDE_INT)0x0f0f0f0f << 32
11706                                           | 0x0f0f0f0f),
11707                                  NULL_RTX, 1, OPTAB_DIRECT);
11708       /* sel = .A.B.C.D.E.F.G.H */
11709       t_1 = expand_simple_binop (DImode, LSHIFTRT, sel, GEN_INT (4),
11710                                  NULL_RTX, 1, OPTAB_DIRECT);
11711       /* t_1 = ..A.B.C.D.E.F.G. */
11712       sel = expand_simple_binop (DImode, IOR, sel, t_1,
11713                                  NULL_RTX, 1, OPTAB_DIRECT);
11714       /* sel = .AABBCCDDEEFFGGH */
11715       sel = expand_simple_binop (DImode, AND, sel,
11716                                  GEN_INT ((HOST_WIDE_INT)0xff00ff << 32
11717                                           | 0xff00ff),
11718                                  NULL_RTX, 1, OPTAB_DIRECT);
11719       /* sel = ..AB..CD..EF..GH */
11720       t_1 = expand_simple_binop (DImode, LSHIFTRT, sel, GEN_INT (8),
11721                                  NULL_RTX, 1, OPTAB_DIRECT);
11722       /* t_1 = ....AB..CD..EF.. */
11723       sel = expand_simple_binop (DImode, IOR, sel, t_1,
11724                                  NULL_RTX, 1, OPTAB_DIRECT);
11725       /* sel = ..ABABCDCDEFEFGH */
11726       sel = expand_simple_binop (DImode, AND, sel,
11727                                  GEN_INT ((HOST_WIDE_INT)0xffff << 32 | 0xffff),
11728                                  NULL_RTX, 1, OPTAB_DIRECT);
11729       /* sel = ....ABCD....EFGH */
11730       t_1 = expand_simple_binop (DImode, LSHIFTRT, sel, GEN_INT (16),
11731                                  NULL_RTX, 1, OPTAB_DIRECT);
11732       /* t_1 = ........ABCD.... */
11733       sel = gen_lowpart (SImode, sel);
11734       t_1 = gen_lowpart (SImode, t_1);
11735       break;
11736
11737     default:
11738       gcc_unreachable ();
11739     }
11740
11741   /* Always perform the final addition/merge within the bmask insn.  */
11742   emit_insn (gen_bmasksi_vis (gen_rtx_REG (SImode, 0), sel, t_1));
11743 }
11744
11745 /* Implement TARGET_FRAME_POINTER_REQUIRED.  */
11746
11747 static bool
11748 sparc_frame_pointer_required (void)
11749 {
11750   /* If the stack pointer is dynamically modified in the function, it cannot
11751      serve as the frame pointer.  */
11752   if (cfun->calls_alloca)
11753     return true;
11754
11755   /* If the function receives nonlocal gotos, it needs to save the frame
11756      pointer in the nonlocal_goto_save_area object.  */
11757   if (cfun->has_nonlocal_label)
11758     return true;
11759
11760   /* In flat mode, that's it.  */
11761   if (TARGET_FLAT)
11762     return false;
11763
11764   /* Otherwise, the frame pointer is required if the function isn't leaf.  */
11765   return !(crtl->is_leaf && only_leaf_regs_used ());
11766 }
11767
11768 /* The way this is structured, we can't eliminate SFP in favor of SP
11769    if the frame pointer is required: we want to use the SFP->HFP elimination
11770    in that case.  But the test in update_eliminables doesn't know we are
11771    assuming below that we only do the former elimination.  */
11772
11773 static bool
11774 sparc_can_eliminate (const int from ATTRIBUTE_UNUSED, const int to)
11775 {
11776   return to == HARD_FRAME_POINTER_REGNUM || !sparc_frame_pointer_required ();
11777 }
11778
11779 /* Return the hard frame pointer directly to bypass the stack bias.  */
11780
11781 static rtx
11782 sparc_builtin_setjmp_frame_value (void)
11783 {
11784   return hard_frame_pointer_rtx;
11785 }
11786
11787 /* If !TARGET_FPU, then make the fp registers and fp cc regs fixed so that
11788    they won't be allocated.  */
11789
11790 static void
11791 sparc_conditional_register_usage (void)
11792 {
11793   if (PIC_OFFSET_TABLE_REGNUM != INVALID_REGNUM)
11794     {
11795       fixed_regs[PIC_OFFSET_TABLE_REGNUM] = 1;
11796       call_used_regs[PIC_OFFSET_TABLE_REGNUM] = 1;
11797     }
11798   /* If the user has passed -f{fixed,call-{used,saved}}-g5 */
11799   /* then honor it.  */
11800   if (TARGET_ARCH32 && fixed_regs[5])
11801     fixed_regs[5] = 1;
11802   else if (TARGET_ARCH64 && fixed_regs[5] == 2)
11803     fixed_regs[5] = 0;
11804   if (! TARGET_V9)
11805     {
11806       int regno;
11807       for (regno = SPARC_FIRST_V9_FP_REG;
11808            regno <= SPARC_LAST_V9_FP_REG;
11809            regno++)
11810         fixed_regs[regno] = 1;
11811       /* %fcc0 is used by v8 and v9.  */
11812       for (regno = SPARC_FIRST_V9_FCC_REG + 1;
11813            regno <= SPARC_LAST_V9_FCC_REG;
11814            regno++)
11815         fixed_regs[regno] = 1;
11816     }
11817   if (! TARGET_FPU)
11818     {
11819       int regno;
11820       for (regno = 32; regno < SPARC_LAST_V9_FCC_REG; regno++)
11821         fixed_regs[regno] = 1;
11822     }
11823   /* If the user has passed -f{fixed,call-{used,saved}}-g2 */
11824   /* then honor it.  Likewise with g3 and g4.  */
11825   if (fixed_regs[2] == 2)
11826     fixed_regs[2] = ! TARGET_APP_REGS;
11827   if (fixed_regs[3] == 2)
11828     fixed_regs[3] = ! TARGET_APP_REGS;
11829   if (TARGET_ARCH32 && fixed_regs[4] == 2)
11830     fixed_regs[4] = ! TARGET_APP_REGS;
11831   else if (TARGET_CM_EMBMEDANY)
11832     fixed_regs[4] = 1;
11833   else if (fixed_regs[4] == 2)
11834     fixed_regs[4] = 0;
11835   if (TARGET_FLAT)
11836     {
11837       int regno;
11838       /* Disable leaf functions.  */
11839       memset (sparc_leaf_regs, 0, FIRST_PSEUDO_REGISTER);
11840       for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++)
11841         leaf_reg_remap [regno] = regno;
11842     }
11843   if (TARGET_VIS)
11844     global_regs[SPARC_GSR_REG] = 1;
11845 }
11846
11847 /* Implement TARGET_PREFERRED_RELOAD_CLASS:
11848
11849    - We can't load constants into FP registers.
11850    - We can't load FP constants into integer registers when soft-float,
11851      because there is no soft-float pattern with a r/F constraint.
11852    - We can't load FP constants into integer registers for TFmode unless
11853      it is 0.0L, because there is no movtf pattern with a r/F constraint.
11854    - Try and reload integer constants (symbolic or otherwise) back into
11855      registers directly, rather than having them dumped to memory.  */
11856
11857 static reg_class_t
11858 sparc_preferred_reload_class (rtx x, reg_class_t rclass)
11859 {
11860   machine_mode mode = GET_MODE (x);
11861   if (CONSTANT_P (x))
11862     {
11863       if (FP_REG_CLASS_P (rclass)
11864           || rclass == GENERAL_OR_FP_REGS
11865           || rclass == GENERAL_OR_EXTRA_FP_REGS
11866           || (GET_MODE_CLASS (mode) == MODE_FLOAT && ! TARGET_FPU)
11867           || (mode == TFmode && ! const_zero_operand (x, mode)))
11868         return NO_REGS;
11869
11870       if (GET_MODE_CLASS (mode) == MODE_INT)
11871         return GENERAL_REGS;
11872
11873       if (GET_MODE_CLASS (mode) == MODE_VECTOR_INT)
11874         {
11875           if (! FP_REG_CLASS_P (rclass)
11876               || !(const_zero_operand (x, mode)
11877                    || const_all_ones_operand (x, mode)))
11878             return NO_REGS;
11879         }
11880     }
11881
11882   if (TARGET_VIS3
11883       && ! TARGET_ARCH64
11884       && (rclass == EXTRA_FP_REGS
11885           || rclass == GENERAL_OR_EXTRA_FP_REGS))
11886     {
11887       int regno = true_regnum (x);
11888
11889       if (SPARC_INT_REG_P (regno))
11890         return (rclass == EXTRA_FP_REGS
11891                 ? FP_REGS : GENERAL_OR_FP_REGS);
11892     }
11893
11894   return rclass;
11895 }
11896
11897 /* Output a wide multiply instruction in V8+ mode.  INSN is the instruction,
11898    OPERANDS are its operands and OPCODE is the mnemonic to be used.  */
11899
11900 const char *
11901 output_v8plus_mult (rtx_insn *insn, rtx *operands, const char *opcode)
11902 {
11903   char mulstr[32];
11904
11905   gcc_assert (! TARGET_ARCH64);
11906
11907   if (sparc_check_64 (operands[1], insn) <= 0)
11908     output_asm_insn ("srl\t%L1, 0, %L1", operands);
11909   if (which_alternative == 1)
11910     output_asm_insn ("sllx\t%H1, 32, %H1", operands);
11911   if (GET_CODE (operands[2]) == CONST_INT)
11912     {
11913       if (which_alternative == 1)
11914         {
11915           output_asm_insn ("or\t%L1, %H1, %H1", operands);
11916           sprintf (mulstr, "%s\t%%H1, %%2, %%L0", opcode);
11917           output_asm_insn (mulstr, operands);
11918           return "srlx\t%L0, 32, %H0";
11919         }
11920       else
11921         {
11922           output_asm_insn ("sllx\t%H1, 32, %3", operands);
11923           output_asm_insn ("or\t%L1, %3, %3", operands);
11924           sprintf (mulstr, "%s\t%%3, %%2, %%3", opcode);
11925           output_asm_insn (mulstr, operands);
11926           output_asm_insn ("srlx\t%3, 32, %H0", operands);
11927           return "mov\t%3, %L0";
11928         }
11929     }
11930   else if (rtx_equal_p (operands[1], operands[2]))
11931     {
11932       if (which_alternative == 1)
11933         {
11934           output_asm_insn ("or\t%L1, %H1, %H1", operands);
11935           sprintf (mulstr, "%s\t%%H1, %%H1, %%L0", opcode);
11936           output_asm_insn (mulstr, operands);
11937           return "srlx\t%L0, 32, %H0";
11938         }
11939       else
11940         {
11941           output_asm_insn ("sllx\t%H1, 32, %3", operands);
11942           output_asm_insn ("or\t%L1, %3, %3", operands);
11943           sprintf (mulstr, "%s\t%%3, %%3, %%3", opcode);
11944           output_asm_insn (mulstr, operands);
11945           output_asm_insn ("srlx\t%3, 32, %H0", operands);
11946           return "mov\t%3, %L0";
11947         }
11948     }
11949   if (sparc_check_64 (operands[2], insn) <= 0)
11950     output_asm_insn ("srl\t%L2, 0, %L2", operands);
11951   if (which_alternative == 1)
11952     {
11953       output_asm_insn ("or\t%L1, %H1, %H1", operands);
11954       output_asm_insn ("sllx\t%H2, 32, %L1", operands);
11955       output_asm_insn ("or\t%L2, %L1, %L1", operands);
11956       sprintf (mulstr, "%s\t%%H1, %%L1, %%L0", opcode);
11957       output_asm_insn (mulstr, operands);
11958       return "srlx\t%L0, 32, %H0";
11959     }
11960   else
11961     {
11962       output_asm_insn ("sllx\t%H1, 32, %3", operands);
11963       output_asm_insn ("sllx\t%H2, 32, %4", operands);
11964       output_asm_insn ("or\t%L1, %3, %3", operands);
11965       output_asm_insn ("or\t%L2, %4, %4", operands);
11966       sprintf (mulstr, "%s\t%%3, %%4, %%3", opcode);
11967       output_asm_insn (mulstr, operands);
11968       output_asm_insn ("srlx\t%3, 32, %H0", operands);
11969       return "mov\t%3, %L0";
11970     }
11971 }
11972
11973 /* Subroutine of sparc_expand_vector_init.  Emit code to initialize
11974    all fields of TARGET to ELT by means of VIS2 BSHUFFLE insn.  MODE
11975    and INNER_MODE are the modes describing TARGET.  */
11976
11977 static void
11978 vector_init_bshuffle (rtx target, rtx elt, machine_mode mode,
11979                       machine_mode inner_mode)
11980 {
11981   rtx t1, final_insn, sel;
11982   int bmask;
11983
11984   t1 = gen_reg_rtx (mode);
11985
11986   elt = convert_modes (SImode, inner_mode, elt, true);
11987   emit_move_insn (gen_lowpart(SImode, t1), elt);
11988
11989   switch (mode)
11990     {
11991     case V2SImode:
11992       final_insn = gen_bshufflev2si_vis (target, t1, t1);
11993       bmask = 0x45674567;
11994       break;
11995     case V4HImode:
11996       final_insn = gen_bshufflev4hi_vis (target, t1, t1);
11997       bmask = 0x67676767;
11998       break;
11999     case V8QImode:
12000       final_insn = gen_bshufflev8qi_vis (target, t1, t1);
12001       bmask = 0x77777777;
12002       break;
12003     default:
12004       gcc_unreachable ();
12005     }
12006
12007   sel = force_reg (SImode, GEN_INT (bmask));
12008   emit_insn (gen_bmasksi_vis (gen_rtx_REG (SImode, 0), sel, const0_rtx));
12009   emit_insn (final_insn);
12010 }
12011
12012 /* Subroutine of sparc_expand_vector_init.  Emit code to initialize
12013    all fields of TARGET to ELT in V8QI by means of VIS FPMERGE insn.  */
12014
12015 static void
12016 vector_init_fpmerge (rtx target, rtx elt)
12017 {
12018   rtx t1, t2, t2_low, t3, t3_low;
12019
12020   t1 = gen_reg_rtx (V4QImode);
12021   elt = convert_modes (SImode, QImode, elt, true);
12022   emit_move_insn (gen_lowpart (SImode, t1), elt);
12023
12024   t2 = gen_reg_rtx (V8QImode);
12025   t2_low = gen_lowpart (V4QImode, t2);
12026   emit_insn (gen_fpmerge_vis (t2, t1, t1));
12027
12028   t3 = gen_reg_rtx (V8QImode);
12029   t3_low = gen_lowpart (V4QImode, t3);
12030   emit_insn (gen_fpmerge_vis (t3, t2_low, t2_low));
12031
12032   emit_insn (gen_fpmerge_vis (target, t3_low, t3_low));
12033 }
12034
12035 /* Subroutine of sparc_expand_vector_init.  Emit code to initialize
12036    all fields of TARGET to ELT in V4HI by means of VIS FALIGNDATA insn.  */
12037
12038 static void
12039 vector_init_faligndata (rtx target, rtx elt)
12040 {
12041   rtx t1 = gen_reg_rtx (V4HImode);
12042   int i;
12043
12044   elt = convert_modes (SImode, HImode, elt, true);
12045   emit_move_insn (gen_lowpart (SImode, t1), elt);
12046
12047   emit_insn (gen_alignaddrsi_vis (gen_reg_rtx (SImode),
12048                                   force_reg (SImode, GEN_INT (6)),
12049                                   const0_rtx));
12050
12051   for (i = 0; i < 4; i++)
12052     emit_insn (gen_faligndatav4hi_vis (target, t1, target));
12053 }
12054
12055 /* Emit code to initialize TARGET to values for individual fields VALS.  */
12056
12057 void
12058 sparc_expand_vector_init (rtx target, rtx vals)
12059 {
12060   const machine_mode mode = GET_MODE (target);
12061   const machine_mode inner_mode = GET_MODE_INNER (mode);
12062   const int n_elts = GET_MODE_NUNITS (mode);
12063   int i, n_var = 0;
12064   bool all_same;
12065   rtx mem;
12066
12067   all_same = true;
12068   for (i = 0; i < n_elts; i++)
12069     {
12070       rtx x = XVECEXP (vals, 0, i);
12071       if (!CONSTANT_P (x))
12072         n_var++;
12073
12074       if (i > 0 && !rtx_equal_p (x, XVECEXP (vals, 0, 0)))
12075         all_same = false;
12076     }
12077
12078   if (n_var == 0)
12079     {
12080       emit_move_insn (target, gen_rtx_CONST_VECTOR (mode, XVEC (vals, 0)));
12081       return;
12082     }
12083
12084   if (GET_MODE_SIZE (inner_mode) == GET_MODE_SIZE (mode))
12085     {
12086       if (GET_MODE_SIZE (inner_mode) == 4)
12087         {
12088           emit_move_insn (gen_lowpart (SImode, target),
12089                           gen_lowpart (SImode, XVECEXP (vals, 0, 0)));
12090           return;
12091         }
12092       else if (GET_MODE_SIZE (inner_mode) == 8)
12093         {
12094           emit_move_insn (gen_lowpart (DImode, target),
12095                           gen_lowpart (DImode, XVECEXP (vals, 0, 0)));
12096           return;
12097         }
12098     }
12099   else if (GET_MODE_SIZE (inner_mode) == GET_MODE_SIZE (word_mode)
12100            && GET_MODE_SIZE (mode) == 2 * GET_MODE_SIZE (word_mode))
12101     {
12102       emit_move_insn (gen_highpart (word_mode, target),
12103                       gen_lowpart (word_mode, XVECEXP (vals, 0, 0)));
12104       emit_move_insn (gen_lowpart (word_mode, target),
12105                       gen_lowpart (word_mode, XVECEXP (vals, 0, 1)));
12106       return;
12107     }
12108
12109   if (all_same && GET_MODE_SIZE (mode) == 8)
12110     {
12111       if (TARGET_VIS2)
12112         {
12113           vector_init_bshuffle (target, XVECEXP (vals, 0, 0), mode, inner_mode);
12114           return;
12115         }
12116       if (mode == V8QImode)
12117         {
12118           vector_init_fpmerge (target, XVECEXP (vals, 0, 0));
12119           return;
12120         }
12121       if (mode == V4HImode)
12122         {
12123           vector_init_faligndata (target, XVECEXP (vals, 0, 0));
12124           return;
12125         }
12126     }
12127
12128   mem = assign_stack_temp (mode, GET_MODE_SIZE (mode));
12129   for (i = 0; i < n_elts; i++)
12130     emit_move_insn (adjust_address_nv (mem, inner_mode,
12131                                        i * GET_MODE_SIZE (inner_mode)),
12132                     XVECEXP (vals, 0, i));
12133   emit_move_insn (target, mem);
12134 }
12135
12136 /* Implement TARGET_SECONDARY_RELOAD.  */
12137
12138 static reg_class_t
12139 sparc_secondary_reload (bool in_p, rtx x, reg_class_t rclass_i,
12140                         machine_mode mode, secondary_reload_info *sri)
12141 {
12142   enum reg_class rclass = (enum reg_class) rclass_i;
12143
12144   sri->icode = CODE_FOR_nothing;
12145   sri->extra_cost = 0;
12146
12147   /* We need a temporary when loading/storing a HImode/QImode value
12148      between memory and the FPU registers.  This can happen when combine puts
12149      a paradoxical subreg in a float/fix conversion insn.  */
12150   if (FP_REG_CLASS_P (rclass)
12151       && (mode == HImode || mode == QImode)
12152       && (GET_CODE (x) == MEM
12153           || ((GET_CODE (x) == REG || GET_CODE (x) == SUBREG)
12154               && true_regnum (x) == -1)))
12155     return GENERAL_REGS;
12156
12157   /* On 32-bit we need a temporary when loading/storing a DFmode value
12158      between unaligned memory and the upper FPU registers.  */
12159   if (TARGET_ARCH32
12160       && rclass == EXTRA_FP_REGS
12161       && mode == DFmode
12162       && GET_CODE (x) == MEM
12163       && ! mem_min_alignment (x, 8))
12164     return FP_REGS;
12165
12166   if (((TARGET_CM_MEDANY
12167         && symbolic_operand (x, mode))
12168        || (TARGET_CM_EMBMEDANY
12169            && text_segment_operand (x, mode)))
12170       && ! flag_pic)
12171     {
12172       if (in_p)
12173         sri->icode = direct_optab_handler (reload_in_optab, mode);
12174       else
12175         sri->icode = direct_optab_handler (reload_out_optab, mode);
12176       return NO_REGS;
12177     }
12178
12179   if (TARGET_VIS3 && TARGET_ARCH32)
12180     {
12181       int regno = true_regnum (x);
12182
12183       /* When using VIS3 fp<-->int register moves, on 32-bit we have
12184          to move 8-byte values in 4-byte pieces.  This only works via
12185          FP_REGS, and not via EXTRA_FP_REGS.  Therefore if we try to
12186          move between EXTRA_FP_REGS and GENERAL_REGS, we will need
12187          an FP_REGS intermediate move.  */
12188       if ((rclass == EXTRA_FP_REGS && SPARC_INT_REG_P (regno))
12189           || ((general_or_i64_p (rclass)
12190                || rclass == GENERAL_OR_FP_REGS)
12191               && SPARC_FP_REG_P (regno)))
12192         {
12193           sri->extra_cost = 2;
12194           return FP_REGS;
12195         }
12196     }
12197
12198   return NO_REGS;
12199 }
12200
12201 /* Emit code to conditionally move either OPERANDS[2] or OPERANDS[3] into
12202    OPERANDS[0] in MODE.  OPERANDS[1] is the operator of the condition.  */
12203
12204 bool
12205 sparc_expand_conditional_move (machine_mode mode, rtx *operands)
12206 {
12207   enum rtx_code rc = GET_CODE (operands[1]);
12208   machine_mode cmp_mode;
12209   rtx cc_reg, dst, cmp;
12210
12211   cmp = operands[1];
12212   if (GET_MODE (XEXP (cmp, 0)) == DImode && !TARGET_ARCH64)
12213     return false;
12214
12215   if (GET_MODE (XEXP (cmp, 0)) == TFmode && !TARGET_HARD_QUAD)
12216     cmp = sparc_emit_float_lib_cmp (XEXP (cmp, 0), XEXP (cmp, 1), rc);
12217
12218   cmp_mode = GET_MODE (XEXP (cmp, 0));
12219   rc = GET_CODE (cmp);
12220
12221   dst = operands[0];
12222   if (! rtx_equal_p (operands[2], dst)
12223       && ! rtx_equal_p (operands[3], dst))
12224     {
12225       if (reg_overlap_mentioned_p (dst, cmp))
12226         dst = gen_reg_rtx (mode);
12227
12228       emit_move_insn (dst, operands[3]);
12229     }
12230   else if (operands[2] == dst)
12231     {
12232       operands[2] = operands[3];
12233
12234       if (GET_MODE_CLASS (cmp_mode) == MODE_FLOAT)
12235         rc = reverse_condition_maybe_unordered (rc);
12236       else
12237         rc = reverse_condition (rc);
12238     }
12239
12240   if (XEXP (cmp, 1) == const0_rtx
12241       && GET_CODE (XEXP (cmp, 0)) == REG
12242       && cmp_mode == DImode
12243       && v9_regcmp_p (rc))
12244     cc_reg = XEXP (cmp, 0);
12245   else
12246     cc_reg = gen_compare_reg_1 (rc, XEXP (cmp, 0), XEXP (cmp, 1));
12247
12248   cmp = gen_rtx_fmt_ee (rc, GET_MODE (cc_reg), cc_reg, const0_rtx);
12249
12250   emit_insn (gen_rtx_SET (dst,
12251                           gen_rtx_IF_THEN_ELSE (mode, cmp, operands[2], dst)));
12252
12253   if (dst != operands[0])
12254     emit_move_insn (operands[0], dst);
12255
12256   return true;
12257 }
12258
12259 /* Emit code to conditionally move a combination of OPERANDS[1] and OPERANDS[2]
12260    into OPERANDS[0] in MODE, depending on the outcome of the comparison of
12261    OPERANDS[4] and OPERANDS[5].  OPERANDS[3] is the operator of the condition.
12262    FCODE is the machine code to be used for OPERANDS[3] and CCODE the machine
12263    code to be used for the condition mask.  */
12264
12265 void
12266 sparc_expand_vcond (machine_mode mode, rtx *operands, int ccode, int fcode)
12267 {
12268   rtx mask, cop0, cop1, fcmp, cmask, bshuf, gsr;
12269   enum rtx_code code = GET_CODE (operands[3]);
12270
12271   mask = gen_reg_rtx (Pmode);
12272   cop0 = operands[4];
12273   cop1 = operands[5];
12274   if (code == LT || code == GE)
12275     {
12276       rtx t;
12277
12278       code = swap_condition (code);
12279       t = cop0; cop0 = cop1; cop1 = t;
12280     }
12281
12282   gsr = gen_rtx_REG (DImode, SPARC_GSR_REG);
12283
12284   fcmp = gen_rtx_UNSPEC (Pmode,
12285                          gen_rtvec (1, gen_rtx_fmt_ee (code, mode, cop0, cop1)),
12286                          fcode);
12287
12288   cmask = gen_rtx_UNSPEC (DImode,
12289                           gen_rtvec (2, mask, gsr),
12290                           ccode);
12291
12292   bshuf = gen_rtx_UNSPEC (mode,
12293                           gen_rtvec (3, operands[1], operands[2], gsr),
12294                           UNSPEC_BSHUFFLE);
12295
12296   emit_insn (gen_rtx_SET (mask, fcmp));
12297   emit_insn (gen_rtx_SET (gsr, cmask));
12298
12299   emit_insn (gen_rtx_SET (operands[0], bshuf));
12300 }
12301
12302 /* On sparc, any mode which naturally allocates into the float
12303    registers should return 4 here.  */
12304
12305 unsigned int
12306 sparc_regmode_natural_size (machine_mode mode)
12307 {
12308   int size = UNITS_PER_WORD;
12309
12310   if (TARGET_ARCH64)
12311     {
12312       enum mode_class mclass = GET_MODE_CLASS (mode);
12313
12314       if (mclass == MODE_FLOAT || mclass == MODE_VECTOR_INT)
12315         size = 4;
12316     }
12317
12318   return size;
12319 }
12320
12321 /* Return TRUE if it is a good idea to tie two pseudo registers
12322    when one has mode MODE1 and one has mode MODE2.
12323    If HARD_REGNO_MODE_OK could produce different values for MODE1 and MODE2,
12324    for any hard reg, then this must be FALSE for correct output.
12325
12326    For V9 we have to deal with the fact that only the lower 32 floating
12327    point registers are 32-bit addressable.  */
12328
12329 bool
12330 sparc_modes_tieable_p (machine_mode mode1, machine_mode mode2)
12331 {
12332   enum mode_class mclass1, mclass2;
12333   unsigned short size1, size2;
12334
12335   if (mode1 == mode2)
12336     return true;
12337
12338   mclass1 = GET_MODE_CLASS (mode1);
12339   mclass2 = GET_MODE_CLASS (mode2);
12340   if (mclass1 != mclass2)
12341     return false;
12342
12343   if (! TARGET_V9)
12344     return true;
12345
12346   /* Classes are the same and we are V9 so we have to deal with upper
12347      vs. lower floating point registers.  If one of the modes is a
12348      4-byte mode, and the other is not, we have to mark them as not
12349      tieable because only the lower 32 floating point register are
12350      addressable 32-bits at a time.
12351
12352      We can't just test explicitly for SFmode, otherwise we won't
12353      cover the vector mode cases properly.  */
12354
12355   if (mclass1 != MODE_FLOAT && mclass1 != MODE_VECTOR_INT)
12356     return true;
12357
12358   size1 = GET_MODE_SIZE (mode1);
12359   size2 = GET_MODE_SIZE (mode2);
12360   if ((size1 > 4 && size2 == 4)
12361       || (size2 > 4 && size1 == 4))
12362     return false;
12363
12364   return true;
12365 }
12366
12367 /* Implement TARGET_CSTORE_MODE.  */
12368
12369 static machine_mode
12370 sparc_cstore_mode (enum insn_code icode ATTRIBUTE_UNUSED)
12371 {
12372   return (TARGET_ARCH64 ? DImode : SImode);
12373 }
12374
12375 /* Return the compound expression made of T1 and T2.  */
12376
12377 static inline tree
12378 compound_expr (tree t1, tree t2)
12379 {
12380   return build2 (COMPOUND_EXPR, void_type_node, t1, t2);
12381 }
12382
12383 /* Implement TARGET_ATOMIC_ASSIGN_EXPAND_FENV hook.  */
12384
12385 static void
12386 sparc_atomic_assign_expand_fenv (tree *hold, tree *clear, tree *update)
12387 {
12388   if (!TARGET_FPU)
12389     return;
12390
12391   const unsigned HOST_WIDE_INT accrued_exception_mask = 0x1f << 5;
12392   const unsigned HOST_WIDE_INT trap_enable_mask = 0x1f << 23;
12393
12394   /* We generate the equivalent of feholdexcept (&fenv_var):
12395
12396        unsigned int fenv_var;
12397        __builtin_store_fsr (&fenv_var);
12398
12399        unsigned int tmp1_var;
12400        tmp1_var = fenv_var & ~(accrued_exception_mask | trap_enable_mask);
12401
12402        __builtin_load_fsr (&tmp1_var);  */
12403
12404   tree fenv_var = create_tmp_var_raw (unsigned_type_node);
12405   TREE_ADDRESSABLE (fenv_var) = 1;
12406   tree fenv_addr = build_fold_addr_expr (fenv_var);
12407   tree stfsr = sparc_builtins[SPARC_BUILTIN_STFSR];
12408   tree hold_stfsr
12409     = build4 (TARGET_EXPR, unsigned_type_node, fenv_var,
12410               build_call_expr (stfsr, 1, fenv_addr), NULL_TREE, NULL_TREE);
12411
12412   tree tmp1_var = create_tmp_var_raw (unsigned_type_node);
12413   TREE_ADDRESSABLE (tmp1_var) = 1;
12414   tree masked_fenv_var
12415     = build2 (BIT_AND_EXPR, unsigned_type_node, fenv_var,
12416               build_int_cst (unsigned_type_node,
12417                              ~(accrued_exception_mask | trap_enable_mask)));
12418   tree hold_mask
12419     = build4 (TARGET_EXPR, unsigned_type_node, tmp1_var, masked_fenv_var,
12420               NULL_TREE, NULL_TREE);
12421
12422   tree tmp1_addr = build_fold_addr_expr (tmp1_var);
12423   tree ldfsr = sparc_builtins[SPARC_BUILTIN_LDFSR];
12424   tree hold_ldfsr = build_call_expr (ldfsr, 1, tmp1_addr);
12425
12426   *hold = compound_expr (compound_expr (hold_stfsr, hold_mask), hold_ldfsr);
12427
12428   /* We reload the value of tmp1_var to clear the exceptions:
12429
12430        __builtin_load_fsr (&tmp1_var);  */
12431
12432   *clear = build_call_expr (ldfsr, 1, tmp1_addr);
12433
12434   /* We generate the equivalent of feupdateenv (&fenv_var):
12435
12436        unsigned int tmp2_var;
12437        __builtin_store_fsr (&tmp2_var);
12438
12439        __builtin_load_fsr (&fenv_var);
12440
12441        if (SPARC_LOW_FE_EXCEPT_VALUES)
12442          tmp2_var >>= 5;
12443        __atomic_feraiseexcept ((int) tmp2_var);  */
12444
12445   tree tmp2_var = create_tmp_var_raw (unsigned_type_node);
12446   TREE_ADDRESSABLE (tmp2_var) = 1;
12447   tree tmp2_addr = build_fold_addr_expr (tmp2_var);
12448   tree update_stfsr
12449     = build4 (TARGET_EXPR, unsigned_type_node, tmp2_var,
12450               build_call_expr (stfsr, 1, tmp2_addr), NULL_TREE, NULL_TREE);
12451
12452   tree update_ldfsr = build_call_expr (ldfsr, 1, fenv_addr);
12453
12454   tree atomic_feraiseexcept
12455     = builtin_decl_implicit (BUILT_IN_ATOMIC_FERAISEEXCEPT);
12456   tree update_call
12457     = build_call_expr (atomic_feraiseexcept, 1,
12458                        fold_convert (integer_type_node, tmp2_var));
12459
12460   if (SPARC_LOW_FE_EXCEPT_VALUES)
12461     {
12462       tree shifted_tmp2_var
12463         = build2 (RSHIFT_EXPR, unsigned_type_node, tmp2_var,
12464                   build_int_cst (unsigned_type_node, 5));
12465       tree update_shift
12466         = build2 (MODIFY_EXPR, void_type_node, tmp2_var, shifted_tmp2_var);
12467       update_call = compound_expr (update_shift, update_call);
12468     }
12469
12470   *update
12471     = compound_expr (compound_expr (update_stfsr, update_ldfsr), update_call);
12472 }
12473
12474 #include "gt-sparc.h"