OpenCores
URL https://opencores.org/ocsvn/scarts/scarts/trunk

Subversion Repositories scarts

[/] [scarts/] [trunk/] [toolchain/] [scarts-gcc/] [gcc-4.1.1/] [gcc/] [config/] [sparc/] [sparc.c] - Blame information for rev 12

Details | Compare with Previous | View Log

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

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.