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

Subversion Repositories scarts

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

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 12 jlechner
/* Subroutines used for MIPS code generation.
2
   Copyright (C) 1989, 1990, 1991, 1993, 1994, 1995, 1996, 1997, 1998,
3
   1999, 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
4
   Contributed by A. Lichnewsky, lich@inria.inria.fr.
5
   Changes by Michael Meissner, meissner@osf.org.
6
   64 bit r4000 support by Ian Lance Taylor, ian@cygnus.com, and
7
   Brendan Eich, brendan@microunity.com.
8
 
9
This file is part of GCC.
10
 
11
GCC is free software; you can redistribute it and/or modify
12
it under the terms of the GNU General Public License as published by
13
the Free Software Foundation; either version 2, or (at your option)
14
any later version.
15
 
16
GCC is distributed in the hope that it will be useful,
17
but WITHOUT ANY WARRANTY; without even the implied warranty of
18
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
19
GNU General Public License for more details.
20
 
21
You should have received a copy of the GNU General Public License
22
along with GCC; see the file COPYING.  If not, write to
23
the Free Software Foundation, 51 Franklin Street, Fifth Floor,
24
Boston, MA 02110-1301, USA.  */
25
 
26
#include "config.h"
27
#include "system.h"
28
#include "coretypes.h"
29
#include "tm.h"
30
#include <signal.h>
31
#include "rtl.h"
32
#include "regs.h"
33
#include "hard-reg-set.h"
34
#include "real.h"
35
#include "insn-config.h"
36
#include "conditions.h"
37
#include "insn-attr.h"
38
#include "recog.h"
39
#include "toplev.h"
40
#include "output.h"
41
#include "tree.h"
42
#include "function.h"
43
#include "expr.h"
44
#include "optabs.h"
45
#include "flags.h"
46
#include "reload.h"
47
#include "tm_p.h"
48
#include "ggc.h"
49
#include "gstab.h"
50
#include "hashtab.h"
51
#include "debug.h"
52
#include "target.h"
53
#include "target-def.h"
54
#include "integrate.h"
55
#include "langhooks.h"
56
#include "cfglayout.h"
57
#include "sched-int.h"
58
#include "tree-gimple.h"
59
 
60
/* True if X is an unspec wrapper around a SYMBOL_REF or LABEL_REF.  */
61
#define UNSPEC_ADDRESS_P(X)                                     \
62
  (GET_CODE (X) == UNSPEC                                       \
63
   && XINT (X, 1) >= UNSPEC_ADDRESS_FIRST                       \
64
   && XINT (X, 1) < UNSPEC_ADDRESS_FIRST + NUM_SYMBOL_TYPES)
65
 
66
/* Extract the symbol or label from UNSPEC wrapper X.  */
67
#define UNSPEC_ADDRESS(X) \
68
  XVECEXP (X, 0, 0)
69
 
70
/* Extract the symbol type from UNSPEC wrapper X.  */
71
#define UNSPEC_ADDRESS_TYPE(X) \
72
  ((enum mips_symbol_type) (XINT (X, 1) - UNSPEC_ADDRESS_FIRST))
73
 
74
/* The maximum distance between the top of the stack frame and the
75
   value $sp has when we save & restore registers.
76
 
77
   Use a maximum gap of 0x100 in the mips16 case.  We can then use
78
   unextended instructions to save and restore registers, and to
79
   allocate and deallocate the top part of the frame.
80
 
81
   The value in the !mips16 case must be a SMALL_OPERAND and must
82
   preserve the maximum stack alignment.  */
83
#define MIPS_MAX_FIRST_STACK_STEP (TARGET_MIPS16 ? 0x100 : 0x7ff0)
84
 
85
/* True if INSN is a mips.md pattern or asm statement.  */
86
#define USEFUL_INSN_P(INSN)                                             \
87
  (INSN_P (INSN)                                                        \
88
   && GET_CODE (PATTERN (INSN)) != USE                                  \
89
   && GET_CODE (PATTERN (INSN)) != CLOBBER                              \
90
   && GET_CODE (PATTERN (INSN)) != ADDR_VEC                             \
91
   && GET_CODE (PATTERN (INSN)) != ADDR_DIFF_VEC)
92
 
93
/* If INSN is a delayed branch sequence, return the first instruction
94
   in the sequence, otherwise return INSN itself.  */
95
#define SEQ_BEGIN(INSN)                                                 \
96
  (INSN_P (INSN) && GET_CODE (PATTERN (INSN)) == SEQUENCE               \
97
   ? XVECEXP (PATTERN (INSN), 0, 0)                                       \
98
   : (INSN))
99
 
100
/* Likewise for the last instruction in a delayed branch sequence.  */
101
#define SEQ_END(INSN)                                                   \
102
  (INSN_P (INSN) && GET_CODE (PATTERN (INSN)) == SEQUENCE               \
103
   ? XVECEXP (PATTERN (INSN), 0, XVECLEN (PATTERN (INSN), 0) - 1) \
104
   : (INSN))
105
 
106
/* Execute the following loop body with SUBINSN set to each instruction
107
   between SEQ_BEGIN (INSN) and SEQ_END (INSN) inclusive.  */
108
#define FOR_EACH_SUBINSN(SUBINSN, INSN)                                 \
109
  for ((SUBINSN) = SEQ_BEGIN (INSN);                                    \
110
       (SUBINSN) != NEXT_INSN (SEQ_END (INSN));                         \
111
       (SUBINSN) = NEXT_INSN (SUBINSN))
112
 
113
/* Classifies an address.
114
 
115
   ADDRESS_REG
116
       A natural register + offset address.  The register satisfies
117
       mips_valid_base_register_p and the offset is a const_arith_operand.
118
 
119
   ADDRESS_LO_SUM
120
       A LO_SUM rtx.  The first operand is a valid base register and
121
       the second operand is a symbolic address.
122
 
123
   ADDRESS_CONST_INT
124
       A signed 16-bit constant address.
125
 
126
   ADDRESS_SYMBOLIC:
127
       A constant symbolic address (equivalent to CONSTANT_SYMBOLIC).  */
128
enum mips_address_type {
129
  ADDRESS_REG,
130
  ADDRESS_LO_SUM,
131
  ADDRESS_CONST_INT,
132
  ADDRESS_SYMBOLIC
133
};
134
 
135
/* Classifies the prototype of a builtin function.  */
136
enum mips_function_type
137
{
138
  MIPS_V2SF_FTYPE_V2SF,
139
  MIPS_V2SF_FTYPE_V2SF_V2SF,
140
  MIPS_V2SF_FTYPE_V2SF_V2SF_INT,
141
  MIPS_V2SF_FTYPE_V2SF_V2SF_V2SF_V2SF,
142
  MIPS_V2SF_FTYPE_SF_SF,
143
  MIPS_INT_FTYPE_V2SF_V2SF,
144
  MIPS_INT_FTYPE_V2SF_V2SF_V2SF_V2SF,
145
  MIPS_INT_FTYPE_SF_SF,
146
  MIPS_INT_FTYPE_DF_DF,
147
  MIPS_SF_FTYPE_V2SF,
148
  MIPS_SF_FTYPE_SF,
149
  MIPS_SF_FTYPE_SF_SF,
150
  MIPS_DF_FTYPE_DF,
151
  MIPS_DF_FTYPE_DF_DF,
152
 
153
  /* For MIPS DSP ASE  */
154
  MIPS_DI_FTYPE_DI_SI,
155
  MIPS_DI_FTYPE_DI_SI_SI,
156
  MIPS_DI_FTYPE_DI_V2HI_V2HI,
157
  MIPS_DI_FTYPE_DI_V4QI_V4QI,
158
  MIPS_SI_FTYPE_DI_SI,
159
  MIPS_SI_FTYPE_PTR_SI,
160
  MIPS_SI_FTYPE_SI,
161
  MIPS_SI_FTYPE_SI_SI,
162
  MIPS_SI_FTYPE_V2HI,
163
  MIPS_SI_FTYPE_V2HI_V2HI,
164
  MIPS_SI_FTYPE_V4QI,
165
  MIPS_SI_FTYPE_V4QI_V4QI,
166
  MIPS_SI_FTYPE_VOID,
167
  MIPS_V2HI_FTYPE_SI,
168
  MIPS_V2HI_FTYPE_SI_SI,
169
  MIPS_V2HI_FTYPE_V2HI,
170
  MIPS_V2HI_FTYPE_V2HI_SI,
171
  MIPS_V2HI_FTYPE_V2HI_V2HI,
172
  MIPS_V2HI_FTYPE_V4QI,
173
  MIPS_V2HI_FTYPE_V4QI_V2HI,
174
  MIPS_V4QI_FTYPE_SI,
175
  MIPS_V4QI_FTYPE_V2HI_V2HI,
176
  MIPS_V4QI_FTYPE_V4QI_SI,
177
  MIPS_V4QI_FTYPE_V4QI_V4QI,
178
  MIPS_VOID_FTYPE_SI_SI,
179
  MIPS_VOID_FTYPE_V2HI_V2HI,
180
  MIPS_VOID_FTYPE_V4QI_V4QI,
181
 
182
  /* The last type.  */
183
  MIPS_MAX_FTYPE_MAX
184
};
185
 
186
/* Specifies how a builtin function should be converted into rtl.  */
187
enum mips_builtin_type
188
{
189
  /* The builtin corresponds directly to an .md pattern.  The return
190
     value is mapped to operand 0 and the arguments are mapped to
191
     operands 1 and above.  */
192
  MIPS_BUILTIN_DIRECT,
193
 
194
  /* The builtin corresponds directly to an .md pattern.  There is no return
195
     value and the arguments are mapped to operands 0 and above.  */
196
  MIPS_BUILTIN_DIRECT_NO_TARGET,
197
 
198
  /* The builtin corresponds to a comparison instruction followed by
199
     a mips_cond_move_tf_ps pattern.  The first two arguments are the
200
     values to compare and the second two arguments are the vector
201
     operands for the movt.ps or movf.ps instruction (in assembly order).  */
202
  MIPS_BUILTIN_MOVF,
203
  MIPS_BUILTIN_MOVT,
204
 
205
  /* The builtin corresponds to a V2SF comparison instruction.  Operand 0
206
     of this instruction is the result of the comparison, which has mode
207
     CCV2 or CCV4.  The function arguments are mapped to operands 1 and
208
     above.  The function's return value is an SImode boolean that is
209
     true under the following conditions:
210
 
211
     MIPS_BUILTIN_CMP_ANY: one of the registers is true
212
     MIPS_BUILTIN_CMP_ALL: all of the registers are true
213
     MIPS_BUILTIN_CMP_LOWER: the first register is true
214
     MIPS_BUILTIN_CMP_UPPER: the second register is true.  */
215
  MIPS_BUILTIN_CMP_ANY,
216
  MIPS_BUILTIN_CMP_ALL,
217
  MIPS_BUILTIN_CMP_UPPER,
218
  MIPS_BUILTIN_CMP_LOWER,
219
 
220
  /* As above, but the instruction only sets a single $fcc register.  */
221
  MIPS_BUILTIN_CMP_SINGLE,
222
 
223
  /* For generating bposge32 branch instructions in MIPS32 DSP ASE.  */
224
  MIPS_BUILTIN_BPOSGE32
225
};
226
 
227
/* Invokes MACRO (COND) for each c.cond.fmt condition.  */
228
#define MIPS_FP_CONDITIONS(MACRO) \
229
  MACRO (f),    \
230
  MACRO (un),   \
231
  MACRO (eq),   \
232
  MACRO (ueq),  \
233
  MACRO (olt),  \
234
  MACRO (ult),  \
235
  MACRO (ole),  \
236
  MACRO (ule),  \
237
  MACRO (sf),   \
238
  MACRO (ngle), \
239
  MACRO (seq),  \
240
  MACRO (ngl),  \
241
  MACRO (lt),   \
242
  MACRO (nge),  \
243
  MACRO (le),   \
244
  MACRO (ngt)
245
 
246
/* Enumerates the codes above as MIPS_FP_COND_<X>.  */
247
#define DECLARE_MIPS_COND(X) MIPS_FP_COND_ ## X
248
enum mips_fp_condition {
249
  MIPS_FP_CONDITIONS (DECLARE_MIPS_COND)
250
};
251
 
252
/* Index X provides the string representation of MIPS_FP_COND_<X>.  */
253
#define STRINGIFY(X) #X
254
static const char *const mips_fp_conditions[] = {
255
  MIPS_FP_CONDITIONS (STRINGIFY)
256
};
257
 
258
/* A function to save or store a register.  The first argument is the
259
   register and the second is the stack slot.  */
260
typedef void (*mips_save_restore_fn) (rtx, rtx);
261
 
262
struct mips16_constant;
263
struct mips_arg_info;
264
struct mips_address_info;
265
struct mips_integer_op;
266
struct mips_sim;
267
 
268
static enum mips_symbol_type mips_classify_symbol (rtx);
269
static void mips_split_const (rtx, rtx *, HOST_WIDE_INT *);
270
static bool mips_offset_within_object_p (rtx, HOST_WIDE_INT);
271
static bool mips_valid_base_register_p (rtx, enum machine_mode, int);
272
static bool mips_symbolic_address_p (enum mips_symbol_type, enum machine_mode);
273
static bool mips_classify_address (struct mips_address_info *, rtx,
274
                                   enum machine_mode, int);
275
static bool mips_cannot_force_const_mem (rtx);
276
static int mips_symbol_insns (enum mips_symbol_type);
277
static bool mips16_unextended_reference_p (enum machine_mode mode, rtx, rtx);
278
static rtx mips_force_temporary (rtx, rtx);
279
static rtx mips_split_symbol (rtx, rtx);
280
static rtx mips_unspec_offset_high (rtx, rtx, rtx, enum mips_symbol_type);
281
static rtx mips_add_offset (rtx, rtx, HOST_WIDE_INT);
282
static unsigned int mips_build_shift (struct mips_integer_op *, HOST_WIDE_INT);
283
static unsigned int mips_build_lower (struct mips_integer_op *,
284
                                      unsigned HOST_WIDE_INT);
285
static unsigned int mips_build_integer (struct mips_integer_op *,
286
                                        unsigned HOST_WIDE_INT);
287
static void mips_move_integer (rtx, unsigned HOST_WIDE_INT);
288
static void mips_legitimize_const_move (enum machine_mode, rtx, rtx);
289
static int m16_check_op (rtx, int, int, int);
290
static bool mips_rtx_costs (rtx, int, int, int *);
291
static int mips_address_cost (rtx);
292
static void mips_emit_compare (enum rtx_code *, rtx *, rtx *, bool);
293
static void mips_load_call_address (rtx, rtx, int);
294
static bool mips_function_ok_for_sibcall (tree, tree);
295
static void mips_block_move_straight (rtx, rtx, HOST_WIDE_INT);
296
static void mips_adjust_block_mem (rtx, HOST_WIDE_INT, rtx *, rtx *);
297
static void mips_block_move_loop (rtx, rtx, HOST_WIDE_INT);
298
static void mips_arg_info (const CUMULATIVE_ARGS *, enum machine_mode,
299
                           tree, int, struct mips_arg_info *);
300
static bool mips_get_unaligned_mem (rtx *, unsigned int, int, rtx *, rtx *);
301
static void mips_set_architecture (const struct mips_cpu_info *);
302
static void mips_set_tune (const struct mips_cpu_info *);
303
static bool mips_handle_option (size_t, const char *, int);
304
static struct machine_function *mips_init_machine_status (void);
305
static void print_operand_reloc (FILE *, rtx, const char **);
306
#if TARGET_IRIX
307
static void irix_output_external_libcall (rtx);
308
#endif
309
static void mips_file_start (void);
310
static void mips_file_end (void);
311
static bool mips_rewrite_small_data_p (rtx);
312
static int mips_small_data_pattern_1 (rtx *, void *);
313
static int mips_rewrite_small_data_1 (rtx *, void *);
314
static bool mips_function_has_gp_insn (void);
315
static unsigned int mips_global_pointer (void);
316
static bool mips_save_reg_p (unsigned int);
317
static void mips_save_restore_reg (enum machine_mode, int, HOST_WIDE_INT,
318
                                   mips_save_restore_fn);
319
static void mips_for_each_saved_reg (HOST_WIDE_INT, mips_save_restore_fn);
320
static void mips_output_cplocal (void);
321
static void mips_emit_loadgp (void);
322
static void mips_output_function_prologue (FILE *, HOST_WIDE_INT);
323
static void mips_set_frame_expr (rtx);
324
static rtx mips_frame_set (rtx, rtx);
325
static void mips_save_reg (rtx, rtx);
326
static void mips_output_function_epilogue (FILE *, HOST_WIDE_INT);
327
static void mips_restore_reg (rtx, rtx);
328
static void mips_output_mi_thunk (FILE *, tree, HOST_WIDE_INT,
329
                                  HOST_WIDE_INT, tree);
330
static int symbolic_expression_p (rtx);
331
static void mips_select_rtx_section (enum machine_mode, rtx,
332
                                     unsigned HOST_WIDE_INT);
333
static void mips_function_rodata_section (tree);
334
static bool mips_in_small_data_p (tree);
335
static int mips_fpr_return_fields (tree, tree *);
336
static bool mips_return_in_msb (tree);
337
static rtx mips_return_fpr_pair (enum machine_mode mode,
338
                                 enum machine_mode mode1, HOST_WIDE_INT,
339
                                 enum machine_mode mode2, HOST_WIDE_INT);
340
static rtx mips16_gp_pseudo_reg (void);
341
static void mips16_fp_args (FILE *, int, int);
342
static void build_mips16_function_stub (FILE *);
343
static rtx dump_constants_1 (enum machine_mode, rtx, rtx);
344
static void dump_constants (struct mips16_constant *, rtx);
345
static int mips16_insn_length (rtx);
346
static int mips16_rewrite_pool_refs (rtx *, void *);
347
static void mips16_lay_out_constants (void);
348
static void mips_sim_reset (struct mips_sim *);
349
static void mips_sim_init (struct mips_sim *, state_t);
350
static void mips_sim_next_cycle (struct mips_sim *);
351
static void mips_sim_wait_reg (struct mips_sim *, rtx, rtx);
352
static int mips_sim_wait_regs_2 (rtx *, void *);
353
static void mips_sim_wait_regs_1 (rtx *, void *);
354
static void mips_sim_wait_regs (struct mips_sim *, rtx);
355
static void mips_sim_wait_units (struct mips_sim *, rtx);
356
static void mips_sim_wait_insn (struct mips_sim *, rtx);
357
static void mips_sim_record_set (rtx, rtx, void *);
358
static void mips_sim_issue_insn (struct mips_sim *, rtx);
359
static void mips_sim_issue_nop (struct mips_sim *);
360
static void mips_sim_finish_insn (struct mips_sim *, rtx);
361
static void vr4130_avoid_branch_rt_conflict (rtx);
362
static void vr4130_align_insns (void);
363
static void mips_avoid_hazard (rtx, rtx, int *, rtx *, rtx);
364
static void mips_avoid_hazards (void);
365
static void mips_reorg (void);
366
static bool mips_strict_matching_cpu_name_p (const char *, const char *);
367
static bool mips_matching_cpu_name_p (const char *, const char *);
368
static const struct mips_cpu_info *mips_parse_cpu (const char *);
369
static const struct mips_cpu_info *mips_cpu_info_from_isa (int);
370
static bool mips_return_in_memory (tree, tree);
371
static bool mips_strict_argument_naming (CUMULATIVE_ARGS *);
372
static void mips_macc_chains_record (rtx);
373
static void mips_macc_chains_reorder (rtx *, int);
374
static void vr4130_true_reg_dependence_p_1 (rtx, rtx, void *);
375
static bool vr4130_true_reg_dependence_p (rtx);
376
static bool vr4130_swap_insns_p (rtx, rtx);
377
static void vr4130_reorder (rtx *, int);
378
static void mips_promote_ready (rtx *, int, int);
379
static int mips_sched_reorder (FILE *, int, rtx *, int *, int);
380
static int mips_variable_issue (FILE *, int, rtx, int);
381
static int mips_adjust_cost (rtx, rtx, rtx, int);
382
static int mips_issue_rate (void);
383
static int mips_multipass_dfa_lookahead (void);
384
static void mips_init_libfuncs (void);
385
static void mips_setup_incoming_varargs (CUMULATIVE_ARGS *, enum machine_mode,
386
                                         tree, int *, int);
387
static tree mips_build_builtin_va_list (void);
388
static tree mips_gimplify_va_arg_expr (tree, tree, tree *, tree *);
389
static bool mips_pass_by_reference (CUMULATIVE_ARGS *, enum machine_mode mode,
390
                                    tree, bool);
391
static bool mips_callee_copies (CUMULATIVE_ARGS *, enum machine_mode mode,
392
                                tree, bool);
393
static int mips_arg_partial_bytes (CUMULATIVE_ARGS *, enum machine_mode mode,
394
                                   tree, bool);
395
static bool mips_valid_pointer_mode (enum machine_mode);
396
static bool mips_vector_mode_supported_p (enum machine_mode);
397
static rtx mips_prepare_builtin_arg (enum insn_code, unsigned int, tree *);
398
static rtx mips_prepare_builtin_target (enum insn_code, unsigned int, rtx);
399
static rtx mips_expand_builtin (tree, rtx, rtx, enum machine_mode, int);
400
static void mips_init_builtins (void);
401
static rtx mips_expand_builtin_direct (enum insn_code, rtx, tree, bool);
402
static rtx mips_expand_builtin_movtf (enum mips_builtin_type,
403
                                      enum insn_code, enum mips_fp_condition,
404
                                      rtx, tree);
405
static rtx mips_expand_builtin_compare (enum mips_builtin_type,
406
                                        enum insn_code, enum mips_fp_condition,
407
                                        rtx, tree);
408
static rtx mips_expand_builtin_bposge (enum mips_builtin_type, rtx);
409
static void mips_encode_section_info (tree, rtx, int);
410
 
411
/* Structure to be filled in by compute_frame_size with register
412
   save masks, and offsets for the current function.  */
413
 
414
struct mips_frame_info GTY(())
415
{
416
  HOST_WIDE_INT total_size;     /* # bytes that the entire frame takes up */
417
  HOST_WIDE_INT var_size;       /* # bytes that variables take up */
418
  HOST_WIDE_INT args_size;      /* # bytes that outgoing arguments take up */
419
  HOST_WIDE_INT cprestore_size; /* # bytes that the .cprestore slot takes up */
420
  HOST_WIDE_INT gp_reg_size;    /* # bytes needed to store gp regs */
421
  HOST_WIDE_INT fp_reg_size;    /* # bytes needed to store fp regs */
422
  unsigned int mask;            /* mask of saved gp registers */
423
  unsigned int fmask;           /* mask of saved fp registers */
424
  HOST_WIDE_INT gp_save_offset; /* offset from vfp to store gp registers */
425
  HOST_WIDE_INT fp_save_offset; /* offset from vfp to store fp registers */
426
  HOST_WIDE_INT gp_sp_offset;   /* offset from new sp to store gp registers */
427
  HOST_WIDE_INT fp_sp_offset;   /* offset from new sp to store fp registers */
428
  bool initialized;             /* true if frame size already calculated */
429
  int num_gp;                   /* number of gp registers saved */
430
  int num_fp;                   /* number of fp registers saved */
431
};
432
 
433
struct machine_function GTY(()) {
434
  /* Pseudo-reg holding the value of $28 in a mips16 function which
435
     refers to GP relative global variables.  */
436
  rtx mips16_gp_pseudo_rtx;
437
 
438
  /* The number of extra stack bytes taken up by register varargs.
439
     This area is allocated by the callee at the very top of the frame.  */
440
  int varargs_size;
441
 
442
  /* Current frame information, calculated by compute_frame_size.  */
443
  struct mips_frame_info frame;
444
 
445
  /* The register to use as the global pointer within this function.  */
446
  unsigned int global_pointer;
447
 
448
  /* True if mips_adjust_insn_length should ignore an instruction's
449
     hazard attribute.  */
450
  bool ignore_hazard_length_p;
451
 
452
  /* True if the whole function is suitable for .set noreorder and
453
     .set nomacro.  */
454
  bool all_noreorder_p;
455
 
456
  /* True if the function is known to have an instruction that needs $gp.  */
457
  bool has_gp_insn_p;
458
};
459
 
460
/* Information about a single argument.  */
461
struct mips_arg_info
462
{
463
  /* True if the argument is passed in a floating-point register, or
464
     would have been if we hadn't run out of registers.  */
465
  bool fpr_p;
466
 
467
  /* The number of words passed in registers, rounded up.  */
468
  unsigned int reg_words;
469
 
470
  /* For EABI, the offset of the first register from GP_ARG_FIRST or
471
     FP_ARG_FIRST.  For other ABIs, the offset of the first register from
472
     the start of the ABI's argument structure (see the CUMULATIVE_ARGS
473
     comment for details).
474
 
475
     The value is MAX_ARGS_IN_REGISTERS if the argument is passed entirely
476
     on the stack.  */
477
  unsigned int reg_offset;
478
 
479
  /* The number of words that must be passed on the stack, rounded up.  */
480
  unsigned int stack_words;
481
 
482
  /* The offset from the start of the stack overflow area of the argument's
483
     first stack word.  Only meaningful when STACK_WORDS is nonzero.  */
484
  unsigned int stack_offset;
485
};
486
 
487
 
488
/* Information about an address described by mips_address_type.
489
 
490
   ADDRESS_CONST_INT
491
       No fields are used.
492
 
493
   ADDRESS_REG
494
       REG is the base register and OFFSET is the constant offset.
495
 
496
   ADDRESS_LO_SUM
497
       REG is the register that contains the high part of the address,
498
       OFFSET is the symbolic address being referenced and SYMBOL_TYPE
499
       is the type of OFFSET's symbol.
500
 
501
   ADDRESS_SYMBOLIC
502
       SYMBOL_TYPE is the type of symbol being referenced.  */
503
 
504
struct mips_address_info
505
{
506
  enum mips_address_type type;
507
  rtx reg;
508
  rtx offset;
509
  enum mips_symbol_type symbol_type;
510
};
511
 
512
 
513
/* One stage in a constant building sequence.  These sequences have
514
   the form:
515
 
516
        A = VALUE[0]
517
        A = A CODE[1] VALUE[1]
518
        A = A CODE[2] VALUE[2]
519
        ...
520
 
521
   where A is an accumulator, each CODE[i] is a binary rtl operation
522
   and each VALUE[i] is a constant integer.  */
523
struct mips_integer_op {
524
  enum rtx_code code;
525
  unsigned HOST_WIDE_INT value;
526
};
527
 
528
 
529
/* The largest number of operations needed to load an integer constant.
530
   The worst accepted case for 64-bit constants is LUI,ORI,SLL,ORI,SLL,ORI.
531
   When the lowest bit is clear, we can try, but reject a sequence with
532
   an extra SLL at the end.  */
533
#define MIPS_MAX_INTEGER_OPS 7
534
 
535
 
536
/* Global variables for machine-dependent things.  */
537
 
538
/* Threshold for data being put into the small data/bss area, instead
539
   of the normal data area.  */
540
int mips_section_threshold = -1;
541
 
542
/* Count the number of .file directives, so that .loc is up to date.  */
543
int num_source_filenames = 0;
544
 
545
/* Count the number of sdb related labels are generated (to find block
546
   start and end boundaries).  */
547
int sdb_label_count = 0;
548
 
549
/* Next label # for each statement for Silicon Graphics IRIS systems.  */
550
int sym_lineno = 0;
551
 
552
/* Linked list of all externals that are to be emitted when optimizing
553
   for the global pointer if they haven't been declared by the end of
554
   the program with an appropriate .comm or initialization.  */
555
 
556
struct extern_list GTY (())
557
{
558
  struct extern_list *next;     /* next external */
559
  const char *name;             /* name of the external */
560
  int size;                     /* size in bytes */
561
};
562
 
563
static GTY (()) struct extern_list *extern_head = 0;
564
 
565
/* Name of the file containing the current function.  */
566
const char *current_function_file = "";
567
 
568
/* Number of nested .set noreorder, noat, nomacro, and volatile requests.  */
569
int set_noreorder;
570
int set_noat;
571
int set_nomacro;
572
int set_volatile;
573
 
574
/* The next branch instruction is a branch likely, not branch normal.  */
575
int mips_branch_likely;
576
 
577
/* The operands passed to the last cmpMM expander.  */
578
rtx cmp_operands[2];
579
 
580
/* The target cpu for code generation.  */
581
enum processor_type mips_arch;
582
const struct mips_cpu_info *mips_arch_info;
583
 
584
/* The target cpu for optimization and scheduling.  */
585
enum processor_type mips_tune;
586
const struct mips_cpu_info *mips_tune_info;
587
 
588
/* Which instruction set architecture to use.  */
589
int mips_isa;
590
 
591
/* Which ABI to use.  */
592
int mips_abi = MIPS_ABI_DEFAULT;
593
 
594
/* Cost information to use.  */
595
const struct mips_rtx_cost_data *mips_cost;
596
 
597
/* Whether we are generating mips16 hard float code.  In mips16 mode
598
   we always set TARGET_SOFT_FLOAT; this variable is nonzero if
599
   -msoft-float was not specified by the user, which means that we
600
   should arrange to call mips32 hard floating point code.  */
601
int mips16_hard_float;
602
 
603
/* The architecture selected by -mipsN.  */
604
static const struct mips_cpu_info *mips_isa_info;
605
 
606
/* If TRUE, we split addresses into their high and low parts in the RTL.  */
607
int mips_split_addresses;
608
 
609
/* Mode used for saving/restoring general purpose registers.  */
610
static enum machine_mode gpr_mode;
611
 
612
/* Array giving truth value on whether or not a given hard register
613
   can support a given mode.  */
614
char mips_hard_regno_mode_ok[(int)MAX_MACHINE_MODE][FIRST_PSEUDO_REGISTER];
615
 
616
/* List of all MIPS punctuation characters used by print_operand.  */
617
char mips_print_operand_punct[256];
618
 
619
/* Map GCC register number to debugger register number.  */
620
int mips_dbx_regno[FIRST_PSEUDO_REGISTER];
621
 
622
/* A copy of the original flag_delayed_branch: see override_options.  */
623
static int mips_flag_delayed_branch;
624
 
625
static GTY (()) int mips_output_filename_first_time = 1;
626
 
627
/* mips_split_p[X] is true if symbols of type X can be split by
628
   mips_split_symbol().  */
629
static bool mips_split_p[NUM_SYMBOL_TYPES];
630
 
631
/* mips_lo_relocs[X] is the relocation to use when a symbol of type X
632
   appears in a LO_SUM.  It can be null if such LO_SUMs aren't valid or
633
   if they are matched by a special .md file pattern.  */
634
static const char *mips_lo_relocs[NUM_SYMBOL_TYPES];
635
 
636
/* Likewise for HIGHs.  */
637
static const char *mips_hi_relocs[NUM_SYMBOL_TYPES];
638
 
639
/* Map hard register number to register class */
640
const enum reg_class mips_regno_to_class[] =
641
{
642
  LEA_REGS,     LEA_REGS,       M16_NA_REGS,    V1_REG,
643
  M16_REGS,     M16_REGS,       M16_REGS,       M16_REGS,
644
  LEA_REGS,     LEA_REGS,       LEA_REGS,       LEA_REGS,
645
  LEA_REGS,     LEA_REGS,       LEA_REGS,       LEA_REGS,
646
  M16_NA_REGS,  M16_NA_REGS,    LEA_REGS,       LEA_REGS,
647
  LEA_REGS,     LEA_REGS,       LEA_REGS,       LEA_REGS,
648
  T_REG,        PIC_FN_ADDR_REG, LEA_REGS,      LEA_REGS,
649
  LEA_REGS,     LEA_REGS,       LEA_REGS,       LEA_REGS,
650
  FP_REGS,      FP_REGS,        FP_REGS,        FP_REGS,
651
  FP_REGS,      FP_REGS,        FP_REGS,        FP_REGS,
652
  FP_REGS,      FP_REGS,        FP_REGS,        FP_REGS,
653
  FP_REGS,      FP_REGS,        FP_REGS,        FP_REGS,
654
  FP_REGS,      FP_REGS,        FP_REGS,        FP_REGS,
655
  FP_REGS,      FP_REGS,        FP_REGS,        FP_REGS,
656
  FP_REGS,      FP_REGS,        FP_REGS,        FP_REGS,
657
  FP_REGS,      FP_REGS,        FP_REGS,        FP_REGS,
658
  HI_REG,       LO_REG,         NO_REGS,        ST_REGS,
659
  ST_REGS,      ST_REGS,        ST_REGS,        ST_REGS,
660
  ST_REGS,      ST_REGS,        ST_REGS,        NO_REGS,
661
  NO_REGS,      ALL_REGS,       ALL_REGS,       NO_REGS,
662
  COP0_REGS,    COP0_REGS,      COP0_REGS,      COP0_REGS,
663
  COP0_REGS,    COP0_REGS,      COP0_REGS,      COP0_REGS,
664
  COP0_REGS,    COP0_REGS,      COP0_REGS,      COP0_REGS,
665
  COP0_REGS,    COP0_REGS,      COP0_REGS,      COP0_REGS,
666
  COP0_REGS,    COP0_REGS,      COP0_REGS,      COP0_REGS,
667
  COP0_REGS,    COP0_REGS,      COP0_REGS,      COP0_REGS,
668
  COP0_REGS,    COP0_REGS,      COP0_REGS,      COP0_REGS,
669
  COP0_REGS,    COP0_REGS,      COP0_REGS,      COP0_REGS,
670
  COP2_REGS,    COP2_REGS,      COP2_REGS,      COP2_REGS,
671
  COP2_REGS,    COP2_REGS,      COP2_REGS,      COP2_REGS,
672
  COP2_REGS,    COP2_REGS,      COP2_REGS,      COP2_REGS,
673
  COP2_REGS,    COP2_REGS,      COP2_REGS,      COP2_REGS,
674
  COP2_REGS,    COP2_REGS,      COP2_REGS,      COP2_REGS,
675
  COP2_REGS,    COP2_REGS,      COP2_REGS,      COP2_REGS,
676
  COP2_REGS,    COP2_REGS,      COP2_REGS,      COP2_REGS,
677
  COP2_REGS,    COP2_REGS,      COP2_REGS,      COP2_REGS,
678
  COP3_REGS,    COP3_REGS,      COP3_REGS,      COP3_REGS,
679
  COP3_REGS,    COP3_REGS,      COP3_REGS,      COP3_REGS,
680
  COP3_REGS,    COP3_REGS,      COP3_REGS,      COP3_REGS,
681
  COP3_REGS,    COP3_REGS,      COP3_REGS,      COP3_REGS,
682
  COP3_REGS,    COP3_REGS,      COP3_REGS,      COP3_REGS,
683
  COP3_REGS,    COP3_REGS,      COP3_REGS,      COP3_REGS,
684
  COP3_REGS,    COP3_REGS,      COP3_REGS,      COP3_REGS,
685
  COP3_REGS,    COP3_REGS,      COP3_REGS,      COP3_REGS,
686
  DSP_ACC_REGS, DSP_ACC_REGS,   DSP_ACC_REGS,   DSP_ACC_REGS,
687
  DSP_ACC_REGS, DSP_ACC_REGS,   ALL_REGS,       ALL_REGS,
688
  ALL_REGS,     ALL_REGS,       ALL_REGS,       ALL_REGS
689
};
690
 
691
/* Map register constraint character to register class.  */
692
enum reg_class mips_char_to_class[256];
693
 
694
/* Table of machine dependent attributes.  */
695
const struct attribute_spec mips_attribute_table[] =
696
{
697
  { "long_call",   0, 0, false, true,  true,  NULL },
698
  { NULL,          0, 0, false, false, false, NULL }
699
};
700
 
701
/* A table describing all the processors gcc knows about.  Names are
702
   matched in the order listed.  The first mention of an ISA level is
703
   taken as the canonical name for that ISA.
704
 
705
   To ease comparison, please keep this table in the same order as
706
   gas's mips_cpu_info_table[].  */
707
const struct mips_cpu_info mips_cpu_info_table[] = {
708
  /* Entries for generic ISAs */
709
  { "mips1", PROCESSOR_R3000, 1 },
710
  { "mips2", PROCESSOR_R6000, 2 },
711
  { "mips3", PROCESSOR_R4000, 3 },
712
  { "mips4", PROCESSOR_R8000, 4 },
713
  { "mips32", PROCESSOR_4KC, 32 },
714
  { "mips32r2", PROCESSOR_M4K, 33 },
715
  { "mips64", PROCESSOR_5KC, 64 },
716
 
717
  /* MIPS I */
718
  { "r3000", PROCESSOR_R3000, 1 },
719
  { "r2000", PROCESSOR_R3000, 1 }, /* = r3000 */
720
  { "r3900", PROCESSOR_R3900, 1 },
721
 
722
  /* MIPS II */
723
  { "r6000", PROCESSOR_R6000, 2 },
724
 
725
  /* MIPS III */
726
  { "r4000", PROCESSOR_R4000, 3 },
727
  { "vr4100", PROCESSOR_R4100, 3 },
728
  { "vr4111", PROCESSOR_R4111, 3 },
729
  { "vr4120", PROCESSOR_R4120, 3 },
730
  { "vr4130", PROCESSOR_R4130, 3 },
731
  { "vr4300", PROCESSOR_R4300, 3 },
732
  { "r4400", PROCESSOR_R4000, 3 }, /* = r4000 */
733
  { "r4600", PROCESSOR_R4600, 3 },
734
  { "orion", PROCESSOR_R4600, 3 }, /* = r4600 */
735
  { "r4650", PROCESSOR_R4650, 3 },
736
 
737
  /* MIPS IV */
738
  { "r8000", PROCESSOR_R8000, 4 },
739
  { "vr5000", PROCESSOR_R5000, 4 },
740
  { "vr5400", PROCESSOR_R5400, 4 },
741
  { "vr5500", PROCESSOR_R5500, 4 },
742
  { "rm7000", PROCESSOR_R7000, 4 },
743
  { "rm9000", PROCESSOR_R9000, 4 },
744
 
745
  /* MIPS32 */
746
  { "4kc", PROCESSOR_4KC, 32 },
747
  { "4km", PROCESSOR_4KC, 32 }, /* = 4kc */
748
  { "4kp", PROCESSOR_4KP, 32 },
749
 
750
  /* MIPS32 Release 2 */
751
  { "m4k", PROCESSOR_M4K, 33 },
752
  { "24k", PROCESSOR_24K, 33 },
753
  { "24kc", PROCESSOR_24K, 33 },  /* 24K  no FPU */
754
  { "24kf", PROCESSOR_24K, 33 },  /* 24K 1:2 FPU */
755
  { "24kx", PROCESSOR_24KX, 33 }, /* 24K 1:1 FPU */
756
 
757
  /* MIPS64 */
758
  { "5kc", PROCESSOR_5KC, 64 },
759
  { "5kf", PROCESSOR_5KF, 64 },
760
  { "20kc", PROCESSOR_20KC, 64 },
761
  { "sb1", PROCESSOR_SB1, 64 },
762
  { "sr71000", PROCESSOR_SR71000, 64 },
763
 
764
  /* End marker */
765
  { 0, 0, 0 }
766
};
767
 
768
/* Default costs. If these are used for a processor we should look
769
   up the actual costs.  */
770
#define DEFAULT_COSTS COSTS_N_INSNS (6),  /* fp_add */       \
771
                      COSTS_N_INSNS (7),  /* fp_mult_sf */   \
772
                      COSTS_N_INSNS (8),  /* fp_mult_df */   \
773
                      COSTS_N_INSNS (23), /* fp_div_sf */    \
774
                      COSTS_N_INSNS (36), /* fp_div_df */    \
775
                      COSTS_N_INSNS (10), /* int_mult_si */  \
776
                      COSTS_N_INSNS (10), /* int_mult_di */  \
777
                      COSTS_N_INSNS (69), /* int_div_si */   \
778
                      COSTS_N_INSNS (69), /* int_div_di */   \
779
                                       2, /* branch_cost */  \
780
                                       4  /* memory_latency */
781
 
782
/* Need to replace these with the costs of calling the appropriate
783
   libgcc routine.  */
784
#define SOFT_FP_COSTS COSTS_N_INSNS (256), /* fp_add */       \
785
                      COSTS_N_INSNS (256), /* fp_mult_sf */   \
786
                      COSTS_N_INSNS (256), /* fp_mult_df */   \
787
                      COSTS_N_INSNS (256), /* fp_div_sf */    \
788
                      COSTS_N_INSNS (256)  /* fp_div_df */
789
 
790
static struct mips_rtx_cost_data const mips_rtx_cost_data[PROCESSOR_MAX] =
791
  {
792
    { /* R3000 */
793
      COSTS_N_INSNS (2),            /* fp_add */
794
      COSTS_N_INSNS (4),            /* fp_mult_sf */
795
      COSTS_N_INSNS (5),            /* fp_mult_df */
796
      COSTS_N_INSNS (12),           /* fp_div_sf */
797
      COSTS_N_INSNS (19),           /* fp_div_df */
798
      COSTS_N_INSNS (12),           /* int_mult_si */
799
      COSTS_N_INSNS (12),           /* int_mult_di */
800
      COSTS_N_INSNS (35),           /* int_div_si */
801
      COSTS_N_INSNS (35),           /* int_div_di */
802
                       1,           /* branch_cost */
803
                       4            /* memory_latency */
804
 
805
    },
806
    { /* 4KC */
807
      SOFT_FP_COSTS,
808
      COSTS_N_INSNS (6),            /* int_mult_si */
809
      COSTS_N_INSNS (6),            /* int_mult_di */
810
      COSTS_N_INSNS (36),           /* int_div_si */
811
      COSTS_N_INSNS (36),           /* int_div_di */
812
                       1,           /* branch_cost */
813
                       4            /* memory_latency */
814
    },
815
    { /* 4KP */
816
      SOFT_FP_COSTS,
817
      COSTS_N_INSNS (36),           /* int_mult_si */
818
      COSTS_N_INSNS (36),           /* int_mult_di */
819
      COSTS_N_INSNS (37),           /* int_div_si */
820
      COSTS_N_INSNS (37),           /* int_div_di */
821
                       1,           /* branch_cost */
822
                       4            /* memory_latency */
823
    },
824
    { /* 5KC */
825
      SOFT_FP_COSTS,
826
      COSTS_N_INSNS (4),            /* int_mult_si */
827
      COSTS_N_INSNS (11),           /* int_mult_di */
828
      COSTS_N_INSNS (36),           /* int_div_si */
829
      COSTS_N_INSNS (68),           /* int_div_di */
830
                       1,           /* branch_cost */
831
                       4            /* memory_latency */
832
    },
833
    { /* 5KF */
834
      COSTS_N_INSNS (4),            /* fp_add */
835
      COSTS_N_INSNS (4),            /* fp_mult_sf */
836
      COSTS_N_INSNS (5),            /* fp_mult_df */
837
      COSTS_N_INSNS (17),           /* fp_div_sf */
838
      COSTS_N_INSNS (32),           /* fp_div_df */
839
      COSTS_N_INSNS (4),            /* int_mult_si */
840
      COSTS_N_INSNS (11),           /* int_mult_di */
841
      COSTS_N_INSNS (36),           /* int_div_si */
842
      COSTS_N_INSNS (68),           /* int_div_di */
843
                       1,           /* branch_cost */
844
                       4            /* memory_latency */
845
    },
846
    { /* 20KC */
847
      DEFAULT_COSTS
848
    },
849
    { /* 24k */
850
      COSTS_N_INSNS (8),            /* fp_add */
851
      COSTS_N_INSNS (8),            /* fp_mult_sf */
852
      COSTS_N_INSNS (10),           /* fp_mult_df */
853
      COSTS_N_INSNS (34),           /* fp_div_sf */
854
      COSTS_N_INSNS (64),           /* fp_div_df */
855
      COSTS_N_INSNS (5),            /* int_mult_si */
856
      COSTS_N_INSNS (5),            /* int_mult_di */
857
      COSTS_N_INSNS (41),           /* int_div_si */
858
      COSTS_N_INSNS (41),           /* int_div_di */
859
                       1,           /* branch_cost */
860
                       4            /* memory_latency */
861
    },
862
    { /* 24kx */
863
      COSTS_N_INSNS (4),            /* fp_add */
864
      COSTS_N_INSNS (4),            /* fp_mult_sf */
865
      COSTS_N_INSNS (5),            /* fp_mult_df */
866
      COSTS_N_INSNS (17),           /* fp_div_sf */
867
      COSTS_N_INSNS (32),           /* fp_div_df */
868
      COSTS_N_INSNS (5),            /* int_mult_si */
869
      COSTS_N_INSNS (5),            /* int_mult_di */
870
      COSTS_N_INSNS (41),           /* int_div_si */
871
      COSTS_N_INSNS (41),           /* int_div_di */
872
                       1,           /* branch_cost */
873
                       4            /* memory_latency */
874
    },
875
    { /* M4k */
876
      DEFAULT_COSTS
877
    },
878
    { /* R3900 */
879
      COSTS_N_INSNS (2),            /* fp_add */
880
      COSTS_N_INSNS (4),            /* fp_mult_sf */
881
      COSTS_N_INSNS (5),            /* fp_mult_df */
882
      COSTS_N_INSNS (12),           /* fp_div_sf */
883
      COSTS_N_INSNS (19),           /* fp_div_df */
884
      COSTS_N_INSNS (2),            /* int_mult_si */
885
      COSTS_N_INSNS (2),            /* int_mult_di */
886
      COSTS_N_INSNS (35),           /* int_div_si */
887
      COSTS_N_INSNS (35),           /* int_div_di */
888
                       1,           /* branch_cost */
889
                       4            /* memory_latency */
890
    },
891
    { /* R6000 */
892
      COSTS_N_INSNS (3),            /* fp_add */
893
      COSTS_N_INSNS (5),            /* fp_mult_sf */
894
      COSTS_N_INSNS (6),            /* fp_mult_df */
895
      COSTS_N_INSNS (15),           /* fp_div_sf */
896
      COSTS_N_INSNS (16),           /* fp_div_df */
897
      COSTS_N_INSNS (17),           /* int_mult_si */
898
      COSTS_N_INSNS (17),           /* int_mult_di */
899
      COSTS_N_INSNS (38),           /* int_div_si */
900
      COSTS_N_INSNS (38),           /* int_div_di */
901
                       2,           /* branch_cost */
902
                       6            /* memory_latency */
903
    },
904
    { /* R4000 */
905
       COSTS_N_INSNS (6),           /* fp_add */
906
       COSTS_N_INSNS (7),           /* fp_mult_sf */
907
       COSTS_N_INSNS (8),           /* fp_mult_df */
908
       COSTS_N_INSNS (23),          /* fp_div_sf */
909
       COSTS_N_INSNS (36),          /* fp_div_df */
910
       COSTS_N_INSNS (10),          /* int_mult_si */
911
       COSTS_N_INSNS (10),          /* int_mult_di */
912
       COSTS_N_INSNS (69),          /* int_div_si */
913
       COSTS_N_INSNS (69),          /* int_div_di */
914
                        2,          /* branch_cost */
915
                        6           /* memory_latency */
916
    },
917
    { /* R4100 */
918
      DEFAULT_COSTS
919
    },
920
    { /* R4111 */
921
      DEFAULT_COSTS
922
    },
923
    { /* R4120 */
924
      DEFAULT_COSTS
925
    },
926
    { /* R4130 */
927
      /* The only costs that appear to be updated here are
928
         integer multiplication.  */
929
      SOFT_FP_COSTS,
930
      COSTS_N_INSNS (4),            /* int_mult_si */
931
      COSTS_N_INSNS (6),            /* int_mult_di */
932
      COSTS_N_INSNS (69),           /* int_div_si */
933
      COSTS_N_INSNS (69),           /* int_div_di */
934
                       1,           /* branch_cost */
935
                       4            /* memory_latency */
936
    },
937
    { /* R4300 */
938
      DEFAULT_COSTS
939
    },
940
    { /* R4600 */
941
      DEFAULT_COSTS
942
    },
943
    { /* R4650 */
944
      DEFAULT_COSTS
945
    },
946
    { /* R5000 */
947
      COSTS_N_INSNS (6),            /* fp_add */
948
      COSTS_N_INSNS (4),            /* fp_mult_sf */
949
      COSTS_N_INSNS (5),            /* fp_mult_df */
950
      COSTS_N_INSNS (23),           /* fp_div_sf */
951
      COSTS_N_INSNS (36),           /* fp_div_df */
952
      COSTS_N_INSNS (5),            /* int_mult_si */
953
      COSTS_N_INSNS (5),            /* int_mult_di */
954
      COSTS_N_INSNS (36),           /* int_div_si */
955
      COSTS_N_INSNS (36),           /* int_div_di */
956
                       1,           /* branch_cost */
957
                       4            /* memory_latency */
958
    },
959
    { /* R5400 */
960
      COSTS_N_INSNS (6),            /* fp_add */
961
      COSTS_N_INSNS (5),            /* fp_mult_sf */
962
      COSTS_N_INSNS (6),            /* fp_mult_df */
963
      COSTS_N_INSNS (30),           /* fp_div_sf */
964
      COSTS_N_INSNS (59),           /* fp_div_df */
965
      COSTS_N_INSNS (3),            /* int_mult_si */
966
      COSTS_N_INSNS (4),            /* int_mult_di */
967
      COSTS_N_INSNS (42),           /* int_div_si */
968
      COSTS_N_INSNS (74),           /* int_div_di */
969
                       1,           /* branch_cost */
970
                       4            /* memory_latency */
971
    },
972
    { /* R5500 */
973
      COSTS_N_INSNS (6),            /* fp_add */
974
      COSTS_N_INSNS (5),            /* fp_mult_sf */
975
      COSTS_N_INSNS (6),            /* fp_mult_df */
976
      COSTS_N_INSNS (30),           /* fp_div_sf */
977
      COSTS_N_INSNS (59),           /* fp_div_df */
978
      COSTS_N_INSNS (5),            /* int_mult_si */
979
      COSTS_N_INSNS (9),            /* int_mult_di */
980
      COSTS_N_INSNS (42),           /* int_div_si */
981
      COSTS_N_INSNS (74),           /* int_div_di */
982
                       1,           /* branch_cost */
983
                       4            /* memory_latency */
984
    },
985
    { /* R7000 */
986
      /* The only costs that are changed here are
987
         integer multiplication.  */
988
      COSTS_N_INSNS (6),            /* fp_add */
989
      COSTS_N_INSNS (7),            /* fp_mult_sf */
990
      COSTS_N_INSNS (8),            /* fp_mult_df */
991
      COSTS_N_INSNS (23),           /* fp_div_sf */
992
      COSTS_N_INSNS (36),           /* fp_div_df */
993
      COSTS_N_INSNS (5),            /* int_mult_si */
994
      COSTS_N_INSNS (9),            /* int_mult_di */
995
      COSTS_N_INSNS (69),           /* int_div_si */
996
      COSTS_N_INSNS (69),           /* int_div_di */
997
                       1,           /* branch_cost */
998
                       4            /* memory_latency */
999
    },
1000
    { /* R8000 */
1001
      DEFAULT_COSTS
1002
    },
1003
    { /* R9000 */
1004
      /* The only costs that are changed here are
1005
         integer multiplication.  */
1006
      COSTS_N_INSNS (6),            /* fp_add */
1007
      COSTS_N_INSNS (7),            /* fp_mult_sf */
1008
      COSTS_N_INSNS (8),            /* fp_mult_df */
1009
      COSTS_N_INSNS (23),           /* fp_div_sf */
1010
      COSTS_N_INSNS (36),           /* fp_div_df */
1011
      COSTS_N_INSNS (3),            /* int_mult_si */
1012
      COSTS_N_INSNS (8),            /* int_mult_di */
1013
      COSTS_N_INSNS (69),           /* int_div_si */
1014
      COSTS_N_INSNS (69),           /* int_div_di */
1015
                       1,           /* branch_cost */
1016
                       4            /* memory_latency */
1017
    },
1018
    { /* SB1 */
1019
      COSTS_N_INSNS (4),            /* fp_add */
1020
      COSTS_N_INSNS (4),            /* fp_mult_sf */
1021
      COSTS_N_INSNS (4),            /* fp_mult_df */
1022
      COSTS_N_INSNS (24),           /* fp_div_sf */
1023
      COSTS_N_INSNS (32),           /* fp_div_df */
1024
      COSTS_N_INSNS (3),            /* int_mult_si */
1025
      COSTS_N_INSNS (4),            /* int_mult_di */
1026
      COSTS_N_INSNS (36),           /* int_div_si */
1027
      COSTS_N_INSNS (68),           /* int_div_di */
1028
                       1,           /* branch_cost */
1029
                       4            /* memory_latency */
1030
    },
1031
    { /* SR71000 */
1032
      DEFAULT_COSTS
1033
    },
1034
  };
1035
 
1036
 
1037
/* Nonzero if -march should decide the default value of MASK_SOFT_FLOAT.  */
1038
#ifndef MIPS_MARCH_CONTROLS_SOFT_FLOAT
1039
#define MIPS_MARCH_CONTROLS_SOFT_FLOAT 0
1040
#endif
1041
 
1042
/* Initialize the GCC target structure.  */
1043
#undef TARGET_ASM_ALIGNED_HI_OP
1044
#define TARGET_ASM_ALIGNED_HI_OP "\t.half\t"
1045
#undef TARGET_ASM_ALIGNED_SI_OP
1046
#define TARGET_ASM_ALIGNED_SI_OP "\t.word\t"
1047
#undef TARGET_ASM_ALIGNED_DI_OP
1048
#define TARGET_ASM_ALIGNED_DI_OP "\t.dword\t"
1049
 
1050
#undef TARGET_ASM_FUNCTION_PROLOGUE
1051
#define TARGET_ASM_FUNCTION_PROLOGUE mips_output_function_prologue
1052
#undef TARGET_ASM_FUNCTION_EPILOGUE
1053
#define TARGET_ASM_FUNCTION_EPILOGUE mips_output_function_epilogue
1054
#undef TARGET_ASM_SELECT_RTX_SECTION
1055
#define TARGET_ASM_SELECT_RTX_SECTION mips_select_rtx_section
1056
#undef TARGET_ASM_FUNCTION_RODATA_SECTION
1057
#define TARGET_ASM_FUNCTION_RODATA_SECTION mips_function_rodata_section
1058
 
1059
#undef TARGET_SCHED_REORDER
1060
#define TARGET_SCHED_REORDER mips_sched_reorder
1061
#undef TARGET_SCHED_VARIABLE_ISSUE
1062
#define TARGET_SCHED_VARIABLE_ISSUE mips_variable_issue
1063
#undef TARGET_SCHED_ADJUST_COST
1064
#define TARGET_SCHED_ADJUST_COST mips_adjust_cost
1065
#undef TARGET_SCHED_ISSUE_RATE
1066
#define TARGET_SCHED_ISSUE_RATE mips_issue_rate
1067
#undef TARGET_SCHED_FIRST_CYCLE_MULTIPASS_DFA_LOOKAHEAD
1068
#define TARGET_SCHED_FIRST_CYCLE_MULTIPASS_DFA_LOOKAHEAD \
1069
  mips_multipass_dfa_lookahead
1070
 
1071
#undef TARGET_DEFAULT_TARGET_FLAGS
1072
#define TARGET_DEFAULT_TARGET_FLAGS             \
1073
  (TARGET_DEFAULT                               \
1074
   | TARGET_CPU_DEFAULT                         \
1075
   | TARGET_ENDIAN_DEFAULT                      \
1076
   | TARGET_FP_EXCEPTIONS_DEFAULT               \
1077
   | MASK_CHECK_ZERO_DIV                        \
1078
   | MASK_FUSED_MADD)
1079
#undef TARGET_HANDLE_OPTION
1080
#define TARGET_HANDLE_OPTION mips_handle_option
1081
 
1082
#undef TARGET_FUNCTION_OK_FOR_SIBCALL
1083
#define TARGET_FUNCTION_OK_FOR_SIBCALL mips_function_ok_for_sibcall
1084
 
1085
#undef TARGET_VALID_POINTER_MODE
1086
#define TARGET_VALID_POINTER_MODE mips_valid_pointer_mode
1087
#undef TARGET_RTX_COSTS
1088
#define TARGET_RTX_COSTS mips_rtx_costs
1089
#undef TARGET_ADDRESS_COST
1090
#define TARGET_ADDRESS_COST mips_address_cost
1091
 
1092
#undef TARGET_IN_SMALL_DATA_P
1093
#define TARGET_IN_SMALL_DATA_P mips_in_small_data_p
1094
 
1095
#undef TARGET_MACHINE_DEPENDENT_REORG
1096
#define TARGET_MACHINE_DEPENDENT_REORG mips_reorg
1097
 
1098
#undef TARGET_ASM_FILE_START
1099
#undef TARGET_ASM_FILE_END
1100
#define TARGET_ASM_FILE_START mips_file_start
1101
#define TARGET_ASM_FILE_END mips_file_end
1102
#undef TARGET_ASM_FILE_START_FILE_DIRECTIVE
1103
#define TARGET_ASM_FILE_START_FILE_DIRECTIVE true
1104
 
1105
#undef TARGET_INIT_LIBFUNCS
1106
#define TARGET_INIT_LIBFUNCS mips_init_libfuncs
1107
 
1108
#undef TARGET_BUILD_BUILTIN_VA_LIST
1109
#define TARGET_BUILD_BUILTIN_VA_LIST mips_build_builtin_va_list
1110
#undef TARGET_GIMPLIFY_VA_ARG_EXPR
1111
#define TARGET_GIMPLIFY_VA_ARG_EXPR mips_gimplify_va_arg_expr
1112
 
1113
#undef TARGET_PROMOTE_FUNCTION_ARGS
1114
#define TARGET_PROMOTE_FUNCTION_ARGS hook_bool_tree_true
1115
#undef TARGET_PROMOTE_FUNCTION_RETURN
1116
#define TARGET_PROMOTE_FUNCTION_RETURN hook_bool_tree_true
1117
#undef TARGET_PROMOTE_PROTOTYPES
1118
#define TARGET_PROMOTE_PROTOTYPES hook_bool_tree_true
1119
 
1120
#undef TARGET_RETURN_IN_MEMORY
1121
#define TARGET_RETURN_IN_MEMORY mips_return_in_memory
1122
#undef TARGET_RETURN_IN_MSB
1123
#define TARGET_RETURN_IN_MSB mips_return_in_msb
1124
 
1125
#undef TARGET_ASM_OUTPUT_MI_THUNK
1126
#define TARGET_ASM_OUTPUT_MI_THUNK mips_output_mi_thunk
1127
#undef TARGET_ASM_CAN_OUTPUT_MI_THUNK
1128
#define TARGET_ASM_CAN_OUTPUT_MI_THUNK hook_bool_tree_hwi_hwi_tree_true
1129
 
1130
#undef TARGET_SETUP_INCOMING_VARARGS
1131
#define TARGET_SETUP_INCOMING_VARARGS mips_setup_incoming_varargs
1132
#undef TARGET_STRICT_ARGUMENT_NAMING
1133
#define TARGET_STRICT_ARGUMENT_NAMING mips_strict_argument_naming
1134
#undef TARGET_MUST_PASS_IN_STACK
1135
#define TARGET_MUST_PASS_IN_STACK must_pass_in_stack_var_size
1136
#undef TARGET_PASS_BY_REFERENCE
1137
#define TARGET_PASS_BY_REFERENCE mips_pass_by_reference
1138
#undef TARGET_CALLEE_COPIES
1139
#define TARGET_CALLEE_COPIES mips_callee_copies
1140
#undef TARGET_ARG_PARTIAL_BYTES
1141
#define TARGET_ARG_PARTIAL_BYTES mips_arg_partial_bytes
1142
 
1143
#undef TARGET_VECTOR_MODE_SUPPORTED_P
1144
#define TARGET_VECTOR_MODE_SUPPORTED_P mips_vector_mode_supported_p
1145
 
1146
#undef TARGET_INIT_BUILTINS
1147
#define TARGET_INIT_BUILTINS mips_init_builtins
1148
#undef TARGET_EXPAND_BUILTIN
1149
#define TARGET_EXPAND_BUILTIN mips_expand_builtin
1150
 
1151
#undef TARGET_HAVE_TLS
1152
#define TARGET_HAVE_TLS HAVE_AS_TLS
1153
 
1154
#undef TARGET_CANNOT_FORCE_CONST_MEM
1155
#define TARGET_CANNOT_FORCE_CONST_MEM mips_cannot_force_const_mem
1156
 
1157
#undef TARGET_ENCODE_SECTION_INFO
1158
#define TARGET_ENCODE_SECTION_INFO mips_encode_section_info
1159
 
1160
#undef TARGET_ATTRIBUTE_TABLE
1161
#define TARGET_ATTRIBUTE_TABLE mips_attribute_table
1162
 
1163
struct gcc_target targetm = TARGET_INITIALIZER;
1164
 
1165
/* Classify symbol X, which must be a SYMBOL_REF or a LABEL_REF.  */
1166
 
1167
static enum mips_symbol_type
1168
mips_classify_symbol (rtx x)
1169
{
1170
  if (GET_CODE (x) == LABEL_REF)
1171
    {
1172
      if (TARGET_MIPS16)
1173
        return SYMBOL_CONSTANT_POOL;
1174
      if (TARGET_ABICALLS)
1175
        return SYMBOL_GOT_LOCAL;
1176
      return SYMBOL_GENERAL;
1177
    }
1178
 
1179
  gcc_assert (GET_CODE (x) == SYMBOL_REF);
1180
 
1181
  if (SYMBOL_REF_TLS_MODEL (x))
1182
    return SYMBOL_TLS;
1183
 
1184
  if (CONSTANT_POOL_ADDRESS_P (x))
1185
    {
1186
      if (TARGET_MIPS16)
1187
        return SYMBOL_CONSTANT_POOL;
1188
 
1189
      if (TARGET_ABICALLS)
1190
        return SYMBOL_GOT_LOCAL;
1191
 
1192
      if (GET_MODE_SIZE (get_pool_mode (x)) <= mips_section_threshold)
1193
        return SYMBOL_SMALL_DATA;
1194
 
1195
      return SYMBOL_GENERAL;
1196
    }
1197
 
1198
  if (SYMBOL_REF_SMALL_P (x))
1199
    return SYMBOL_SMALL_DATA;
1200
 
1201
  if (TARGET_ABICALLS)
1202
    {
1203
      if (SYMBOL_REF_DECL (x) == 0)
1204
        return SYMBOL_REF_LOCAL_P (x) ? SYMBOL_GOT_LOCAL : SYMBOL_GOT_GLOBAL;
1205
 
1206
      /* There are three cases to consider:
1207
 
1208
            - o32 PIC (either with or without explicit relocs)
1209
            - n32/n64 PIC without explicit relocs
1210
            - n32/n64 PIC with explicit relocs
1211
 
1212
         In the first case, both local and global accesses will use an
1213
         R_MIPS_GOT16 relocation.  We must correctly predict which of
1214
         the two semantics (local or global) the assembler and linker
1215
         will apply.  The choice doesn't depend on the symbol's
1216
         visibility, so we deliberately ignore decl_visibility and
1217
         binds_local_p here.
1218
 
1219
         In the second case, the assembler will not use R_MIPS_GOT16
1220
         relocations, but it chooses between local and global accesses
1221
         in the same way as for o32 PIC.
1222
 
1223
         In the third case we have more freedom since both forms of
1224
         access will work for any kind of symbol.  However, there seems
1225
         little point in doing things differently.  */
1226
      if (DECL_P (SYMBOL_REF_DECL (x)) && TREE_PUBLIC (SYMBOL_REF_DECL (x)))
1227
        return SYMBOL_GOT_GLOBAL;
1228
 
1229
      return SYMBOL_GOT_LOCAL;
1230
    }
1231
 
1232
  return SYMBOL_GENERAL;
1233
}
1234
 
1235
 
1236
/* Split X into a base and a constant offset, storing them in *BASE
1237
   and *OFFSET respectively.  */
1238
 
1239
static void
1240
mips_split_const (rtx x, rtx *base, HOST_WIDE_INT *offset)
1241
{
1242
  *offset = 0;
1243
 
1244
  if (GET_CODE (x) == CONST)
1245
    x = XEXP (x, 0);
1246
 
1247
  if (GET_CODE (x) == PLUS && GET_CODE (XEXP (x, 1)) == CONST_INT)
1248
    {
1249
      *offset += INTVAL (XEXP (x, 1));
1250
      x = XEXP (x, 0);
1251
    }
1252
  *base = x;
1253
}
1254
 
1255
 
1256
/* Return true if SYMBOL is a SYMBOL_REF and OFFSET + SYMBOL points
1257
   to the same object as SYMBOL.  */
1258
 
1259
static bool
1260
mips_offset_within_object_p (rtx symbol, HOST_WIDE_INT offset)
1261
{
1262
  if (GET_CODE (symbol) != SYMBOL_REF)
1263
    return false;
1264
 
1265
  if (CONSTANT_POOL_ADDRESS_P (symbol)
1266
      && offset >= 0
1267
      && offset < (int) GET_MODE_SIZE (get_pool_mode (symbol)))
1268
    return true;
1269
 
1270
  if (SYMBOL_REF_DECL (symbol) != 0
1271
      && offset >= 0
1272
      && offset < int_size_in_bytes (TREE_TYPE (SYMBOL_REF_DECL (symbol))))
1273
    return true;
1274
 
1275
  return false;
1276
}
1277
 
1278
 
1279
/* Return true if X is a symbolic constant that can be calculated in
1280
   the same way as a bare symbol.  If it is, store the type of the
1281
   symbol in *SYMBOL_TYPE.  */
1282
 
1283
bool
1284
mips_symbolic_constant_p (rtx x, enum mips_symbol_type *symbol_type)
1285
{
1286
  HOST_WIDE_INT offset;
1287
 
1288
  mips_split_const (x, &x, &offset);
1289
  if (UNSPEC_ADDRESS_P (x))
1290
    *symbol_type = UNSPEC_ADDRESS_TYPE (x);
1291
  else if (GET_CODE (x) == SYMBOL_REF || GET_CODE (x) == LABEL_REF)
1292
    {
1293
      *symbol_type = mips_classify_symbol (x);
1294
      if (*symbol_type == SYMBOL_TLS)
1295
        return false;
1296
    }
1297
  else
1298
    return false;
1299
 
1300
  if (offset == 0)
1301
    return true;
1302
 
1303
  /* Check whether a nonzero offset is valid for the underlying
1304
     relocations.  */
1305
  switch (*symbol_type)
1306
    {
1307
    case SYMBOL_GENERAL:
1308
    case SYMBOL_64_HIGH:
1309
    case SYMBOL_64_MID:
1310
    case SYMBOL_64_LOW:
1311
      /* If the target has 64-bit pointers and the object file only
1312
         supports 32-bit symbols, the values of those symbols will be
1313
         sign-extended.  In this case we can't allow an arbitrary offset
1314
         in case the 32-bit value X + OFFSET has a different sign from X.  */
1315
      if (Pmode == DImode && !ABI_HAS_64BIT_SYMBOLS)
1316
        return mips_offset_within_object_p (x, offset);
1317
 
1318
      /* In other cases the relocations can handle any offset.  */
1319
      return true;
1320
 
1321
    case SYMBOL_CONSTANT_POOL:
1322
      /* Allow constant pool references to be converted to LABEL+CONSTANT.
1323
         In this case, we no longer have access to the underlying constant,
1324
         but the original symbol-based access was known to be valid.  */
1325
      if (GET_CODE (x) == LABEL_REF)
1326
        return true;
1327
 
1328
      /* Fall through.  */
1329
 
1330
    case SYMBOL_SMALL_DATA:
1331
      /* Make sure that the offset refers to something within the
1332
         underlying object.  This should guarantee that the final
1333
         PC- or GP-relative offset is within the 16-bit limit.  */
1334
      return mips_offset_within_object_p (x, offset);
1335
 
1336
    case SYMBOL_GOT_LOCAL:
1337
    case SYMBOL_GOTOFF_PAGE:
1338
      /* The linker should provide enough local GOT entries for a
1339
         16-bit offset.  Larger offsets may lead to GOT overflow.  */
1340
      return SMALL_OPERAND (offset);
1341
 
1342
    case SYMBOL_GOT_GLOBAL:
1343
    case SYMBOL_GOTOFF_GLOBAL:
1344
    case SYMBOL_GOTOFF_CALL:
1345
    case SYMBOL_GOTOFF_LOADGP:
1346
    case SYMBOL_TLSGD:
1347
    case SYMBOL_TLSLDM:
1348
    case SYMBOL_DTPREL:
1349
    case SYMBOL_TPREL:
1350
    case SYMBOL_GOTTPREL:
1351
    case SYMBOL_TLS:
1352
      return false;
1353
    }
1354
  gcc_unreachable ();
1355
}
1356
 
1357
 
1358
/* Return true if X is a symbolic constant whose value is not split
1359
   into separate relocations.  */
1360
 
1361
bool
1362
mips_atomic_symbolic_constant_p (rtx x)
1363
{
1364
  enum mips_symbol_type type;
1365
  return mips_symbolic_constant_p (x, &type) && !mips_split_p[type];
1366
}
1367
 
1368
 
1369
/* This function is used to implement REG_MODE_OK_FOR_BASE_P.  */
1370
 
1371
int
1372
mips_regno_mode_ok_for_base_p (int regno, enum machine_mode mode, int strict)
1373
{
1374
  if (regno >= FIRST_PSEUDO_REGISTER)
1375
    {
1376
      if (!strict)
1377
        return true;
1378
      regno = reg_renumber[regno];
1379
    }
1380
 
1381
  /* These fake registers will be eliminated to either the stack or
1382
     hard frame pointer, both of which are usually valid base registers.
1383
     Reload deals with the cases where the eliminated form isn't valid.  */
1384
  if (regno == ARG_POINTER_REGNUM || regno == FRAME_POINTER_REGNUM)
1385
    return true;
1386
 
1387
  /* In mips16 mode, the stack pointer can only address word and doubleword
1388
     values, nothing smaller.  There are two problems here:
1389
 
1390
       (a) Instantiating virtual registers can introduce new uses of the
1391
           stack pointer.  If these virtual registers are valid addresses,
1392
           the stack pointer should be too.
1393
 
1394
       (b) Most uses of the stack pointer are not made explicit until
1395
           FRAME_POINTER_REGNUM and ARG_POINTER_REGNUM have been eliminated.
1396
           We don't know until that stage whether we'll be eliminating to the
1397
           stack pointer (which needs the restriction) or the hard frame
1398
           pointer (which doesn't).
1399
 
1400
     All in all, it seems more consistent to only enforce this restriction
1401
     during and after reload.  */
1402
  if (TARGET_MIPS16 && regno == STACK_POINTER_REGNUM)
1403
    return !strict || GET_MODE_SIZE (mode) == 4 || GET_MODE_SIZE (mode) == 8;
1404
 
1405
  return TARGET_MIPS16 ? M16_REG_P (regno) : GP_REG_P (regno);
1406
}
1407
 
1408
 
1409
/* Return true if X is a valid base register for the given mode.
1410
   Allow only hard registers if STRICT.  */
1411
 
1412
static bool
1413
mips_valid_base_register_p (rtx x, enum machine_mode mode, int strict)
1414
{
1415
  if (!strict && GET_CODE (x) == SUBREG)
1416
    x = SUBREG_REG (x);
1417
 
1418
  return (REG_P (x)
1419
          && mips_regno_mode_ok_for_base_p (REGNO (x), mode, strict));
1420
}
1421
 
1422
 
1423
/* Return true if symbols of type SYMBOL_TYPE can directly address a value
1424
   with mode MODE.  This is used for both symbolic and LO_SUM addresses.  */
1425
 
1426
static bool
1427
mips_symbolic_address_p (enum mips_symbol_type symbol_type,
1428
                         enum machine_mode mode)
1429
{
1430
  switch (symbol_type)
1431
    {
1432
    case SYMBOL_GENERAL:
1433
      return !TARGET_MIPS16;
1434
 
1435
    case SYMBOL_SMALL_DATA:
1436
      return true;
1437
 
1438
    case SYMBOL_CONSTANT_POOL:
1439
      /* PC-relative addressing is only available for lw and ld.  */
1440
      return GET_MODE_SIZE (mode) == 4 || GET_MODE_SIZE (mode) == 8;
1441
 
1442
    case SYMBOL_GOT_LOCAL:
1443
      return true;
1444
 
1445
    case SYMBOL_GOT_GLOBAL:
1446
      /* The address will have to be loaded from the GOT first.  */
1447
      return false;
1448
 
1449
    case SYMBOL_GOTOFF_PAGE:
1450
    case SYMBOL_GOTOFF_GLOBAL:
1451
    case SYMBOL_GOTOFF_CALL:
1452
    case SYMBOL_GOTOFF_LOADGP:
1453
    case SYMBOL_TLS:
1454
    case SYMBOL_TLSGD:
1455
    case SYMBOL_TLSLDM:
1456
    case SYMBOL_DTPREL:
1457
    case SYMBOL_GOTTPREL:
1458
    case SYMBOL_TPREL:
1459
    case SYMBOL_64_HIGH:
1460
    case SYMBOL_64_MID:
1461
    case SYMBOL_64_LOW:
1462
      return true;
1463
    }
1464
  gcc_unreachable ();
1465
}
1466
 
1467
 
1468
/* Return true if X is a valid address for machine mode MODE.  If it is,
1469
   fill in INFO appropriately.  STRICT is true if we should only accept
1470
   hard base registers.  */
1471
 
1472
static bool
1473
mips_classify_address (struct mips_address_info *info, rtx x,
1474
                       enum machine_mode mode, int strict)
1475
{
1476
  switch (GET_CODE (x))
1477
    {
1478
    case REG:
1479
    case SUBREG:
1480
      info->type = ADDRESS_REG;
1481
      info->reg = x;
1482
      info->offset = const0_rtx;
1483
      return mips_valid_base_register_p (info->reg, mode, strict);
1484
 
1485
    case PLUS:
1486
      info->type = ADDRESS_REG;
1487
      info->reg = XEXP (x, 0);
1488
      info->offset = XEXP (x, 1);
1489
      return (mips_valid_base_register_p (info->reg, mode, strict)
1490
              && const_arith_operand (info->offset, VOIDmode));
1491
 
1492
    case LO_SUM:
1493
      info->type = ADDRESS_LO_SUM;
1494
      info->reg = XEXP (x, 0);
1495
      info->offset = XEXP (x, 1);
1496
      return (mips_valid_base_register_p (info->reg, mode, strict)
1497
              && mips_symbolic_constant_p (info->offset, &info->symbol_type)
1498
              && mips_symbolic_address_p (info->symbol_type, mode)
1499
              && mips_lo_relocs[info->symbol_type] != 0);
1500
 
1501
    case CONST_INT:
1502
      /* Small-integer addresses don't occur very often, but they
1503
         are legitimate if $0 is a valid base register.  */
1504
      info->type = ADDRESS_CONST_INT;
1505
      return !TARGET_MIPS16 && SMALL_INT (x);
1506
 
1507
    case CONST:
1508
    case LABEL_REF:
1509
    case SYMBOL_REF:
1510
      info->type = ADDRESS_SYMBOLIC;
1511
      return (mips_symbolic_constant_p (x, &info->symbol_type)
1512
              && mips_symbolic_address_p (info->symbol_type, mode)
1513
              && !mips_split_p[info->symbol_type]);
1514
 
1515
    default:
1516
      return false;
1517
    }
1518
}
1519
 
1520
/* Return true if X is a thread-local symbol.  */
1521
 
1522
static bool
1523
mips_tls_operand_p (rtx x)
1524
{
1525
  return GET_CODE (x) == SYMBOL_REF && SYMBOL_REF_TLS_MODEL (x) != 0;
1526
}
1527
 
1528
/* Return true if X can not be forced into a constant pool.  */
1529
 
1530
static int
1531
mips_tls_symbol_ref_1 (rtx *x, void *data ATTRIBUTE_UNUSED)
1532
{
1533
  return mips_tls_operand_p (*x);
1534
}
1535
 
1536
/* Return true if X can not be forced into a constant pool.  */
1537
 
1538
static bool
1539
mips_cannot_force_const_mem (rtx x)
1540
{
1541
  if (! TARGET_HAVE_TLS)
1542
    return false;
1543
 
1544
  return for_each_rtx (&x, &mips_tls_symbol_ref_1, 0);
1545
}
1546
 
1547
/* Return the number of instructions needed to load a symbol of the
1548
   given type into a register.  If valid in an address, the same number
1549
   of instructions are needed for loads and stores.  Treat extended
1550
   mips16 instructions as two instructions.  */
1551
 
1552
static int
1553
mips_symbol_insns (enum mips_symbol_type type)
1554
{
1555
  switch (type)
1556
    {
1557
    case SYMBOL_GENERAL:
1558
      /* In mips16 code, general symbols must be fetched from the
1559
         constant pool.  */
1560
      if (TARGET_MIPS16)
1561
        return 0;
1562
 
1563
      /* When using 64-bit symbols, we need 5 preparatory instructions,
1564
         such as:
1565
 
1566
             lui     $at,%highest(symbol)
1567
             daddiu  $at,$at,%higher(symbol)
1568
             dsll    $at,$at,16
1569
             daddiu  $at,$at,%hi(symbol)
1570
             dsll    $at,$at,16
1571
 
1572
         The final address is then $at + %lo(symbol).  With 32-bit
1573
         symbols we just need a preparatory lui.  */
1574
      return (ABI_HAS_64BIT_SYMBOLS ? 6 : 2);
1575
 
1576
    case SYMBOL_SMALL_DATA:
1577
      return 1;
1578
 
1579
    case SYMBOL_CONSTANT_POOL:
1580
      /* This case is for mips16 only.  Assume we'll need an
1581
         extended instruction.  */
1582
      return 2;
1583
 
1584
    case SYMBOL_GOT_LOCAL:
1585
    case SYMBOL_GOT_GLOBAL:
1586
      /* Unless -funit-at-a-time is in effect, we can't be sure whether
1587
         the local/global classification is accurate.  See override_options
1588
         for details.
1589
 
1590
         The worst cases are:
1591
 
1592
         (1) For local symbols when generating o32 or o64 code.  The assembler
1593
             will use:
1594
 
1595
                 lw           $at,%got(symbol)
1596
                 nop
1597
 
1598
             ...and the final address will be $at + %lo(symbol).
1599
 
1600
         (2) For global symbols when -mxgot.  The assembler will use:
1601
 
1602
                 lui     $at,%got_hi(symbol)
1603
                 (d)addu $at,$at,$gp
1604
 
1605
             ...and the final address will be $at + %got_lo(symbol).  */
1606
      return 3;
1607
 
1608
    case SYMBOL_GOTOFF_PAGE:
1609
    case SYMBOL_GOTOFF_GLOBAL:
1610
    case SYMBOL_GOTOFF_CALL:
1611
    case SYMBOL_GOTOFF_LOADGP:
1612
    case SYMBOL_64_HIGH:
1613
    case SYMBOL_64_MID:
1614
    case SYMBOL_64_LOW:
1615
    case SYMBOL_TLSGD:
1616
    case SYMBOL_TLSLDM:
1617
    case SYMBOL_DTPREL:
1618
    case SYMBOL_GOTTPREL:
1619
    case SYMBOL_TPREL:
1620
      /* Check whether the offset is a 16- or 32-bit value.  */
1621
      return mips_split_p[type] ? 2 : 1;
1622
 
1623
    case SYMBOL_TLS:
1624
      /* We don't treat a bare TLS symbol as a constant.  */
1625
      return 0;
1626
    }
1627
  gcc_unreachable ();
1628
}
1629
 
1630
/* Return true if X is a legitimate $sp-based address for mode MDOE.  */
1631
 
1632
bool
1633
mips_stack_address_p (rtx x, enum machine_mode mode)
1634
{
1635
  struct mips_address_info addr;
1636
 
1637
  return (mips_classify_address (&addr, x, mode, false)
1638
          && addr.type == ADDRESS_REG
1639
          && addr.reg == stack_pointer_rtx);
1640
}
1641
 
1642
/* Return true if a value at OFFSET bytes from BASE can be accessed
1643
   using an unextended mips16 instruction.  MODE is the mode of the
1644
   value.
1645
 
1646
   Usually the offset in an unextended instruction is a 5-bit field.
1647
   The offset is unsigned and shifted left once for HIs, twice
1648
   for SIs, and so on.  An exception is SImode accesses off the
1649
   stack pointer, which have an 8-bit immediate field.  */
1650
 
1651
static bool
1652
mips16_unextended_reference_p (enum machine_mode mode, rtx base, rtx offset)
1653
{
1654
  if (TARGET_MIPS16
1655
      && GET_CODE (offset) == CONST_INT
1656
      && INTVAL (offset) >= 0
1657
      && (INTVAL (offset) & (GET_MODE_SIZE (mode) - 1)) == 0)
1658
    {
1659
      if (GET_MODE_SIZE (mode) == 4 && base == stack_pointer_rtx)
1660
        return INTVAL (offset) < 256 * GET_MODE_SIZE (mode);
1661
      return INTVAL (offset) < 32 * GET_MODE_SIZE (mode);
1662
    }
1663
  return false;
1664
}
1665
 
1666
 
1667
/* Return the number of instructions needed to load or store a value
1668
   of mode MODE at X.  Return 0 if X isn't valid for MODE.
1669
 
1670
   For mips16 code, count extended instructions as two instructions.  */
1671
 
1672
int
1673
mips_address_insns (rtx x, enum machine_mode mode)
1674
{
1675
  struct mips_address_info addr;
1676
  int factor;
1677
 
1678
  if (mode == BLKmode)
1679
    /* BLKmode is used for single unaligned loads and stores.  */
1680
    factor = 1;
1681
  else
1682
    /* Each word of a multi-word value will be accessed individually.  */
1683
    factor = (GET_MODE_SIZE (mode) + UNITS_PER_WORD - 1) / UNITS_PER_WORD;
1684
 
1685
  if (mips_classify_address (&addr, x, mode, false))
1686
    switch (addr.type)
1687
      {
1688
      case ADDRESS_REG:
1689
        if (TARGET_MIPS16
1690
            && !mips16_unextended_reference_p (mode, addr.reg, addr.offset))
1691
          return factor * 2;
1692
        return factor;
1693
 
1694
      case ADDRESS_LO_SUM:
1695
        return (TARGET_MIPS16 ? factor * 2 : factor);
1696
 
1697
      case ADDRESS_CONST_INT:
1698
        return factor;
1699
 
1700
      case ADDRESS_SYMBOLIC:
1701
        return factor * mips_symbol_insns (addr.symbol_type);
1702
      }
1703
  return 0;
1704
}
1705
 
1706
 
1707
/* Likewise for constant X.  */
1708
 
1709
int
1710
mips_const_insns (rtx x)
1711
{
1712
  struct mips_integer_op codes[MIPS_MAX_INTEGER_OPS];
1713
  enum mips_symbol_type symbol_type;
1714
  HOST_WIDE_INT offset;
1715
 
1716
  switch (GET_CODE (x))
1717
    {
1718
    case HIGH:
1719
      if (TARGET_MIPS16
1720
          || !mips_symbolic_constant_p (XEXP (x, 0), &symbol_type)
1721
          || !mips_split_p[symbol_type])
1722
        return 0;
1723
 
1724
      return 1;
1725
 
1726
    case CONST_INT:
1727
      if (TARGET_MIPS16)
1728
        /* Unsigned 8-bit constants can be loaded using an unextended
1729
           LI instruction.  Unsigned 16-bit constants can be loaded
1730
           using an extended LI.  Negative constants must be loaded
1731
           using LI and then negated.  */
1732
        return (INTVAL (x) >= 0 && INTVAL (x) < 256 ? 1
1733
                : SMALL_OPERAND_UNSIGNED (INTVAL (x)) ? 2
1734
                : INTVAL (x) > -256 && INTVAL (x) < 0 ? 2
1735
                : SMALL_OPERAND_UNSIGNED (-INTVAL (x)) ? 3
1736
                : 0);
1737
 
1738
      return mips_build_integer (codes, INTVAL (x));
1739
 
1740
    case CONST_DOUBLE:
1741
    case CONST_VECTOR:
1742
      return (!TARGET_MIPS16 && x == CONST0_RTX (GET_MODE (x)) ? 1 : 0);
1743
 
1744
    case CONST:
1745
      if (CONST_GP_P (x))
1746
        return 1;
1747
 
1748
      /* See if we can refer to X directly.  */
1749
      if (mips_symbolic_constant_p (x, &symbol_type))
1750
        return mips_symbol_insns (symbol_type);
1751
 
1752
      /* Otherwise try splitting the constant into a base and offset.
1753
         16-bit offsets can be added using an extra addiu.  Larger offsets
1754
         must be calculated separately and then added to the base.  */
1755
      mips_split_const (x, &x, &offset);
1756
      if (offset != 0)
1757
        {
1758
          int n = mips_const_insns (x);
1759
          if (n != 0)
1760
            {
1761
              if (SMALL_OPERAND (offset))
1762
                return n + 1;
1763
              else
1764
                return n + 1 + mips_build_integer (codes, offset);
1765
            }
1766
        }
1767
      return 0;
1768
 
1769
    case SYMBOL_REF:
1770
    case LABEL_REF:
1771
      return mips_symbol_insns (mips_classify_symbol (x));
1772
 
1773
    default:
1774
      return 0;
1775
    }
1776
}
1777
 
1778
 
1779
/* Return the number of instructions needed for memory reference X.
1780
   Count extended mips16 instructions as two instructions.  */
1781
 
1782
int
1783
mips_fetch_insns (rtx x)
1784
{
1785
  gcc_assert (MEM_P (x));
1786
  return mips_address_insns (XEXP (x, 0), GET_MODE (x));
1787
}
1788
 
1789
 
1790
/* Return the number of instructions needed for an integer division.  */
1791
 
1792
int
1793
mips_idiv_insns (void)
1794
{
1795
  int count;
1796
 
1797
  count = 1;
1798
  if (TARGET_CHECK_ZERO_DIV)
1799
    {
1800
      if (GENERATE_DIVIDE_TRAPS)
1801
        count++;
1802
      else
1803
        count += 2;
1804
    }
1805
 
1806
  if (TARGET_FIX_R4000 || TARGET_FIX_R4400)
1807
    count++;
1808
  return count;
1809
}
1810
 
1811
/* This function is used to implement GO_IF_LEGITIMATE_ADDRESS.  It
1812
   returns a nonzero value if X is a legitimate address for a memory
1813
   operand of the indicated MODE.  STRICT is nonzero if this function
1814
   is called during reload.  */
1815
 
1816
bool
1817
mips_legitimate_address_p (enum machine_mode mode, rtx x, int strict)
1818
{
1819
  struct mips_address_info addr;
1820
 
1821
  return mips_classify_address (&addr, x, mode, strict);
1822
}
1823
 
1824
 
1825
/* Copy VALUE to a register and return that register.  If new psuedos
1826
   are allowed, copy it into a new register, otherwise use DEST.  */
1827
 
1828
static rtx
1829
mips_force_temporary (rtx dest, rtx value)
1830
{
1831
  if (!no_new_pseudos)
1832
    return force_reg (Pmode, value);
1833
  else
1834
    {
1835
      emit_move_insn (copy_rtx (dest), value);
1836
      return dest;
1837
    }
1838
}
1839
 
1840
 
1841
/* Return a LO_SUM expression for ADDR.  TEMP is as for mips_force_temporary
1842
   and is used to load the high part into a register.  */
1843
 
1844
static rtx
1845
mips_split_symbol (rtx temp, rtx addr)
1846
{
1847
  rtx high;
1848
 
1849
  if (TARGET_MIPS16)
1850
    high = mips16_gp_pseudo_reg ();
1851
  else
1852
    high = mips_force_temporary (temp, gen_rtx_HIGH (Pmode, copy_rtx (addr)));
1853
  return gen_rtx_LO_SUM (Pmode, high, addr);
1854
}
1855
 
1856
 
1857
/* Return an UNSPEC address with underlying address ADDRESS and symbol
1858
   type SYMBOL_TYPE.  */
1859
 
1860
rtx
1861
mips_unspec_address (rtx address, enum mips_symbol_type symbol_type)
1862
{
1863
  rtx base;
1864
  HOST_WIDE_INT offset;
1865
 
1866
  mips_split_const (address, &base, &offset);
1867
  base = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, base),
1868
                         UNSPEC_ADDRESS_FIRST + symbol_type);
1869
  return plus_constant (gen_rtx_CONST (Pmode, base), offset);
1870
}
1871
 
1872
 
1873
/* If mips_unspec_address (ADDR, SYMBOL_TYPE) is a 32-bit value, add the
1874
   high part to BASE and return the result.  Just return BASE otherwise.
1875
   TEMP is available as a temporary register if needed.
1876
 
1877
   The returned expression can be used as the first operand to a LO_SUM.  */
1878
 
1879
static rtx
1880
mips_unspec_offset_high (rtx temp, rtx base, rtx addr,
1881
                         enum mips_symbol_type symbol_type)
1882
{
1883
  if (mips_split_p[symbol_type])
1884
    {
1885
      addr = gen_rtx_HIGH (Pmode, mips_unspec_address (addr, symbol_type));
1886
      addr = mips_force_temporary (temp, addr);
1887
      return mips_force_temporary (temp, gen_rtx_PLUS (Pmode, addr, base));
1888
    }
1889
  return base;
1890
}
1891
 
1892
 
1893
/* Return a legitimate address for REG + OFFSET.  TEMP is as for
1894
   mips_force_temporary; it is only needed when OFFSET is not a
1895
   SMALL_OPERAND.  */
1896
 
1897
static rtx
1898
mips_add_offset (rtx temp, rtx reg, HOST_WIDE_INT offset)
1899
{
1900
  if (!SMALL_OPERAND (offset))
1901
    {
1902
      rtx high;
1903
      if (TARGET_MIPS16)
1904
        {
1905
          /* Load the full offset into a register so that we can use
1906
             an unextended instruction for the address itself.  */
1907
          high = GEN_INT (offset);
1908
          offset = 0;
1909
        }
1910
      else
1911
        {
1912
          /* Leave OFFSET as a 16-bit offset and put the excess in HIGH.  */
1913
          high = GEN_INT (CONST_HIGH_PART (offset));
1914
          offset = CONST_LOW_PART (offset);
1915
        }
1916
      high = mips_force_temporary (temp, high);
1917
      reg = mips_force_temporary (temp, gen_rtx_PLUS (Pmode, high, reg));
1918
    }
1919
  return plus_constant (reg, offset);
1920
}
1921
 
1922
/* Emit a call to __tls_get_addr.  SYM is the TLS symbol we are
1923
   referencing, and TYPE is the symbol type to use (either global
1924
   dynamic or local dynamic).  V0 is an RTX for the return value
1925
   location.  The entire insn sequence is returned.  */
1926
 
1927
static GTY(()) rtx mips_tls_symbol;
1928
 
1929
static rtx
1930
mips_call_tls_get_addr (rtx sym, enum mips_symbol_type type, rtx v0)
1931
{
1932
  rtx insn, loc, tga, a0;
1933
 
1934
  a0 = gen_rtx_REG (Pmode, GP_ARG_FIRST);
1935
 
1936
  if (!mips_tls_symbol)
1937
    mips_tls_symbol = init_one_libfunc ("__tls_get_addr");
1938
 
1939
  loc = mips_unspec_address (sym, type);
1940
 
1941
  start_sequence ();
1942
 
1943
  emit_insn (gen_rtx_SET (Pmode, a0,
1944
                          gen_rtx_LO_SUM (Pmode, pic_offset_table_rtx, loc)));
1945
  tga = gen_rtx_MEM (Pmode, mips_tls_symbol);
1946
  insn = emit_call_insn (gen_call_value (v0, tga, const0_rtx, const0_rtx));
1947
  CONST_OR_PURE_CALL_P (insn) = 1;
1948
  use_reg (&CALL_INSN_FUNCTION_USAGE (insn), v0);
1949
  use_reg (&CALL_INSN_FUNCTION_USAGE (insn), a0);
1950
  insn = get_insns ();
1951
 
1952
  end_sequence ();
1953
 
1954
  return insn;
1955
}
1956
 
1957
/* Generate the code to access LOC, a thread local SYMBOL_REF.  The
1958
   return value will be a valid address and move_operand (either a REG
1959
   or a LO_SUM).  */
1960
 
1961
static rtx
1962
mips_legitimize_tls_address (rtx loc)
1963
{
1964
  rtx dest, insn, v0, v1, tmp1, tmp2, eqv;
1965
  enum tls_model model;
1966
 
1967
  v0 = gen_rtx_REG (Pmode, GP_RETURN);
1968
  v1 = gen_rtx_REG (Pmode, GP_RETURN + 1);
1969
 
1970
  model = SYMBOL_REF_TLS_MODEL (loc);
1971
 
1972
  switch (model)
1973
    {
1974
    case TLS_MODEL_GLOBAL_DYNAMIC:
1975
      insn = mips_call_tls_get_addr (loc, SYMBOL_TLSGD, v0);
1976
      dest = gen_reg_rtx (Pmode);
1977
      emit_libcall_block (insn, dest, v0, loc);
1978
      break;
1979
 
1980
    case TLS_MODEL_LOCAL_DYNAMIC:
1981
      insn = mips_call_tls_get_addr (loc, SYMBOL_TLSLDM, v0);
1982
      tmp1 = gen_reg_rtx (Pmode);
1983
 
1984
      /* Attach a unique REG_EQUIV, to allow the RTL optimizers to
1985
         share the LDM result with other LD model accesses.  */
1986
      eqv = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, const0_rtx),
1987
                            UNSPEC_TLS_LDM);
1988
      emit_libcall_block (insn, tmp1, v0, eqv);
1989
 
1990
      tmp2 = mips_unspec_offset_high (NULL, tmp1, loc, SYMBOL_DTPREL);
1991
      dest = gen_rtx_LO_SUM (Pmode, tmp2,
1992
                             mips_unspec_address (loc, SYMBOL_DTPREL));
1993
      break;
1994
 
1995
    case TLS_MODEL_INITIAL_EXEC:
1996
      tmp1 = gen_reg_rtx (Pmode);
1997
      tmp2 = mips_unspec_address (loc, SYMBOL_GOTTPREL);
1998
      if (Pmode == DImode)
1999
        {
2000
          emit_insn (gen_tls_get_tp_di (v1));
2001
          emit_insn (gen_load_gotdi (tmp1, pic_offset_table_rtx, tmp2));
2002
        }
2003
      else
2004
        {
2005
          emit_insn (gen_tls_get_tp_si (v1));
2006
          emit_insn (gen_load_gotsi (tmp1, pic_offset_table_rtx, tmp2));
2007
        }
2008
      dest = gen_reg_rtx (Pmode);
2009
      emit_insn (gen_add3_insn (dest, tmp1, v1));
2010
      break;
2011
 
2012
    case TLS_MODEL_LOCAL_EXEC:
2013
 
2014
      if (Pmode == DImode)
2015
        emit_insn (gen_tls_get_tp_di (v1));
2016
      else
2017
        emit_insn (gen_tls_get_tp_si (v1));
2018
 
2019
      tmp1 = mips_unspec_offset_high (NULL, v1, loc, SYMBOL_TPREL);
2020
      dest = gen_rtx_LO_SUM (Pmode, tmp1,
2021
                             mips_unspec_address (loc, SYMBOL_TPREL));
2022
      break;
2023
 
2024
    default:
2025
      gcc_unreachable ();
2026
    }
2027
 
2028
  return dest;
2029
}
2030
 
2031
/* This function is used to implement LEGITIMIZE_ADDRESS.  If *XLOC can
2032
   be legitimized in a way that the generic machinery might not expect,
2033
   put the new address in *XLOC and return true.  MODE is the mode of
2034
   the memory being accessed.  */
2035
 
2036
bool
2037
mips_legitimize_address (rtx *xloc, enum machine_mode mode)
2038
{
2039
  enum mips_symbol_type symbol_type;
2040
 
2041
  if (mips_tls_operand_p (*xloc))
2042
    {
2043
      *xloc = mips_legitimize_tls_address (*xloc);
2044
      return true;
2045
    }
2046
 
2047
  /* See if the address can split into a high part and a LO_SUM.  */
2048
  if (mips_symbolic_constant_p (*xloc, &symbol_type)
2049
      && mips_symbolic_address_p (symbol_type, mode)
2050
      && mips_split_p[symbol_type])
2051
    {
2052
      *xloc = mips_split_symbol (0, *xloc);
2053
      return true;
2054
    }
2055
 
2056
  if (GET_CODE (*xloc) == PLUS && GET_CODE (XEXP (*xloc, 1)) == CONST_INT)
2057
    {
2058
      /* Handle REG + CONSTANT using mips_add_offset.  */
2059
      rtx reg;
2060
 
2061
      reg = XEXP (*xloc, 0);
2062
      if (!mips_valid_base_register_p (reg, mode, 0))
2063
        reg = copy_to_mode_reg (Pmode, reg);
2064
      *xloc = mips_add_offset (0, reg, INTVAL (XEXP (*xloc, 1)));
2065
      return true;
2066
    }
2067
 
2068
  return false;
2069
}
2070
 
2071
 
2072
/* Subroutine of mips_build_integer (with the same interface).
2073
   Assume that the final action in the sequence should be a left shift.  */
2074
 
2075
static unsigned int
2076
mips_build_shift (struct mips_integer_op *codes, HOST_WIDE_INT value)
2077
{
2078
  unsigned int i, shift;
2079
 
2080
  /* Shift VALUE right until its lowest bit is set.  Shift arithmetically
2081
     since signed numbers are easier to load than unsigned ones.  */
2082
  shift = 0;
2083
  while ((value & 1) == 0)
2084
    value /= 2, shift++;
2085
 
2086
  i = mips_build_integer (codes, value);
2087
  codes[i].code = ASHIFT;
2088
  codes[i].value = shift;
2089
  return i + 1;
2090
}
2091
 
2092
 
2093
/* As for mips_build_shift, but assume that the final action will be
2094
   an IOR or PLUS operation.  */
2095
 
2096
static unsigned int
2097
mips_build_lower (struct mips_integer_op *codes, unsigned HOST_WIDE_INT value)
2098
{
2099
  unsigned HOST_WIDE_INT high;
2100
  unsigned int i;
2101
 
2102
  high = value & ~(unsigned HOST_WIDE_INT) 0xffff;
2103
  if (!LUI_OPERAND (high) && (value & 0x18000) == 0x18000)
2104
    {
2105
      /* The constant is too complex to load with a simple lui/ori pair
2106
         so our goal is to clear as many trailing zeros as possible.
2107
         In this case, we know bit 16 is set and that the low 16 bits
2108
         form a negative number.  If we subtract that number from VALUE,
2109
         we will clear at least the lowest 17 bits, maybe more.  */
2110
      i = mips_build_integer (codes, CONST_HIGH_PART (value));
2111
      codes[i].code = PLUS;
2112
      codes[i].value = CONST_LOW_PART (value);
2113
    }
2114
  else
2115
    {
2116
      i = mips_build_integer (codes, high);
2117
      codes[i].code = IOR;
2118
      codes[i].value = value & 0xffff;
2119
    }
2120
  return i + 1;
2121
}
2122
 
2123
 
2124
/* Fill CODES with a sequence of rtl operations to load VALUE.
2125
   Return the number of operations needed.  */
2126
 
2127
static unsigned int
2128
mips_build_integer (struct mips_integer_op *codes,
2129
                    unsigned HOST_WIDE_INT value)
2130
{
2131
  if (SMALL_OPERAND (value)
2132
      || SMALL_OPERAND_UNSIGNED (value)
2133
      || LUI_OPERAND (value))
2134
    {
2135
      /* The value can be loaded with a single instruction.  */
2136
      codes[0].code = UNKNOWN;
2137
      codes[0].value = value;
2138
      return 1;
2139
    }
2140
  else if ((value & 1) != 0 || LUI_OPERAND (CONST_HIGH_PART (value)))
2141
    {
2142
      /* Either the constant is a simple LUI/ORI combination or its
2143
         lowest bit is set.  We don't want to shift in this case.  */
2144
      return mips_build_lower (codes, value);
2145
    }
2146
  else if ((value & 0xffff) == 0)
2147
    {
2148
      /* The constant will need at least three actions.  The lowest
2149
         16 bits are clear, so the final action will be a shift.  */
2150
      return mips_build_shift (codes, value);
2151
    }
2152
  else
2153
    {
2154
      /* The final action could be a shift, add or inclusive OR.
2155
         Rather than use a complex condition to select the best
2156
         approach, try both mips_build_shift and mips_build_lower
2157
         and pick the one that gives the shortest sequence.
2158
         Note that this case is only used once per constant.  */
2159
      struct mips_integer_op alt_codes[MIPS_MAX_INTEGER_OPS];
2160
      unsigned int cost, alt_cost;
2161
 
2162
      cost = mips_build_shift (codes, value);
2163
      alt_cost = mips_build_lower (alt_codes, value);
2164
      if (alt_cost < cost)
2165
        {
2166
          memcpy (codes, alt_codes, alt_cost * sizeof (codes[0]));
2167
          cost = alt_cost;
2168
        }
2169
      return cost;
2170
    }
2171
}
2172
 
2173
 
2174
/* Move VALUE into register DEST.  */
2175
 
2176
static void
2177
mips_move_integer (rtx dest, unsigned HOST_WIDE_INT value)
2178
{
2179
  struct mips_integer_op codes[MIPS_MAX_INTEGER_OPS];
2180
  enum machine_mode mode;
2181
  unsigned int i, cost;
2182
  rtx x;
2183
 
2184
  mode = GET_MODE (dest);
2185
  cost = mips_build_integer (codes, value);
2186
 
2187
  /* Apply each binary operation to X.  Invariant: X is a legitimate
2188
     source operand for a SET pattern.  */
2189
  x = GEN_INT (codes[0].value);
2190
  for (i = 1; i < cost; i++)
2191
    {
2192
      if (no_new_pseudos)
2193
        emit_move_insn (dest, x), x = dest;
2194
      else
2195
        x = force_reg (mode, x);
2196
      x = gen_rtx_fmt_ee (codes[i].code, mode, x, GEN_INT (codes[i].value));
2197
    }
2198
 
2199
  emit_insn (gen_rtx_SET (VOIDmode, dest, x));
2200
}
2201
 
2202
 
2203
/* Subroutine of mips_legitimize_move.  Move constant SRC into register
2204
   DEST given that SRC satisfies immediate_operand but doesn't satisfy
2205
   move_operand.  */
2206
 
2207
static void
2208
mips_legitimize_const_move (enum machine_mode mode, rtx dest, rtx src)
2209
{
2210
  rtx base;
2211
  HOST_WIDE_INT offset;
2212
  enum mips_symbol_type symbol_type;
2213
 
2214
  /* Split moves of big integers into smaller pieces.  In mips16 code,
2215
     it's better to force the constant into memory instead.  */
2216
  if (GET_CODE (src) == CONST_INT && !TARGET_MIPS16)
2217
    {
2218
      mips_move_integer (dest, INTVAL (src));
2219
      return;
2220
    }
2221
 
2222
  if (mips_tls_operand_p (src))
2223
    {
2224
      emit_move_insn (dest, mips_legitimize_tls_address (src));
2225
      return;
2226
    }
2227
 
2228
  /* See if the symbol can be split.  For mips16, this is often worse than
2229
     forcing it in the constant pool since it needs the single-register form
2230
     of addiu or daddiu.  */
2231
  if (!TARGET_MIPS16
2232
      && mips_symbolic_constant_p (src, &symbol_type)
2233
      && mips_split_p[symbol_type])
2234
    {
2235
      emit_move_insn (dest, mips_split_symbol (dest, src));
2236
      return;
2237
    }
2238
 
2239
  /* If we have (const (plus symbol offset)), load the symbol first
2240
     and then add in the offset.  This is usually better than forcing
2241
     the constant into memory, at least in non-mips16 code.  */
2242
  mips_split_const (src, &base, &offset);
2243
  if (!TARGET_MIPS16
2244
      && offset != 0
2245
      && (!no_new_pseudos || SMALL_OPERAND (offset)))
2246
    {
2247
      base = mips_force_temporary (dest, base);
2248
      emit_move_insn (dest, mips_add_offset (0, base, offset));
2249
      return;
2250
    }
2251
 
2252
  src = force_const_mem (mode, src);
2253
 
2254
  /* When using explicit relocs, constant pool references are sometimes
2255
     not legitimate addresses.  */
2256
  if (!memory_operand (src, VOIDmode))
2257
    src = replace_equiv_address (src, mips_split_symbol (dest, XEXP (src, 0)));
2258
  emit_move_insn (dest, src);
2259
}
2260
 
2261
 
2262
/* If (set DEST SRC) is not a valid instruction, emit an equivalent
2263
   sequence that is valid.  */
2264
 
2265
bool
2266
mips_legitimize_move (enum machine_mode mode, rtx dest, rtx src)
2267
{
2268
  if (!register_operand (dest, mode) && !reg_or_0_operand (src, mode))
2269
    {
2270
      emit_move_insn (dest, force_reg (mode, src));
2271
      return true;
2272
    }
2273
 
2274
  /* Check for individual, fully-reloaded mflo and mfhi instructions.  */
2275
  if (GET_MODE_SIZE (mode) <= UNITS_PER_WORD
2276
      && REG_P (src) && MD_REG_P (REGNO (src))
2277
      && REG_P (dest) && GP_REG_P (REGNO (dest)))
2278
    {
2279
      int other_regno = REGNO (src) == HI_REGNUM ? LO_REGNUM : HI_REGNUM;
2280
      if (GET_MODE_SIZE (mode) <= 4)
2281
        emit_insn (gen_mfhilo_si (gen_rtx_REG (SImode, REGNO (dest)),
2282
                                  gen_rtx_REG (SImode, REGNO (src)),
2283
                                  gen_rtx_REG (SImode, other_regno)));
2284
      else
2285
        emit_insn (gen_mfhilo_di (gen_rtx_REG (DImode, REGNO (dest)),
2286
                                  gen_rtx_REG (DImode, REGNO (src)),
2287
                                  gen_rtx_REG (DImode, other_regno)));
2288
      return true;
2289
    }
2290
 
2291
  /* We need to deal with constants that would be legitimate
2292
     immediate_operands but not legitimate move_operands.  */
2293
  if (CONSTANT_P (src) && !move_operand (src, mode))
2294
    {
2295
      mips_legitimize_const_move (mode, dest, src);
2296
      set_unique_reg_note (get_last_insn (), REG_EQUAL, copy_rtx (src));
2297
      return true;
2298
    }
2299
  return false;
2300
}
2301
 
2302
/* We need a lot of little routines to check constant values on the
2303
   mips16.  These are used to figure out how long the instruction will
2304
   be.  It would be much better to do this using constraints, but
2305
   there aren't nearly enough letters available.  */
2306
 
2307
static int
2308
m16_check_op (rtx op, int low, int high, int mask)
2309
{
2310
  return (GET_CODE (op) == CONST_INT
2311
          && INTVAL (op) >= low
2312
          && INTVAL (op) <= high
2313
          && (INTVAL (op) & mask) == 0);
2314
}
2315
 
2316
int
2317
m16_uimm3_b (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
2318
{
2319
  return m16_check_op (op, 0x1, 0x8, 0);
2320
}
2321
 
2322
int
2323
m16_simm4_1 (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
2324
{
2325
  return m16_check_op (op, - 0x8, 0x7, 0);
2326
}
2327
 
2328
int
2329
m16_nsimm4_1 (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
2330
{
2331
  return m16_check_op (op, - 0x7, 0x8, 0);
2332
}
2333
 
2334
int
2335
m16_simm5_1 (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
2336
{
2337
  return m16_check_op (op, - 0x10, 0xf, 0);
2338
}
2339
 
2340
int
2341
m16_nsimm5_1 (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
2342
{
2343
  return m16_check_op (op, - 0xf, 0x10, 0);
2344
}
2345
 
2346
int
2347
m16_uimm5_4 (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
2348
{
2349
  return m16_check_op (op, (- 0x10) << 2, 0xf << 2, 3);
2350
}
2351
 
2352
int
2353
m16_nuimm5_4 (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
2354
{
2355
  return m16_check_op (op, (- 0xf) << 2, 0x10 << 2, 3);
2356
}
2357
 
2358
int
2359
m16_simm8_1 (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
2360
{
2361
  return m16_check_op (op, - 0x80, 0x7f, 0);
2362
}
2363
 
2364
int
2365
m16_nsimm8_1 (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
2366
{
2367
  return m16_check_op (op, - 0x7f, 0x80, 0);
2368
}
2369
 
2370
int
2371
m16_uimm8_1 (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
2372
{
2373
  return m16_check_op (op, 0x0, 0xff, 0);
2374
}
2375
 
2376
int
2377
m16_nuimm8_1 (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
2378
{
2379
  return m16_check_op (op, - 0xff, 0x0, 0);
2380
}
2381
 
2382
int
2383
m16_uimm8_m1_1 (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
2384
{
2385
  return m16_check_op (op, - 0x1, 0xfe, 0);
2386
}
2387
 
2388
int
2389
m16_uimm8_4 (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
2390
{
2391
  return m16_check_op (op, 0x0, 0xff << 2, 3);
2392
}
2393
 
2394
int
2395
m16_nuimm8_4 (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
2396
{
2397
  return m16_check_op (op, (- 0xff) << 2, 0x0, 3);
2398
}
2399
 
2400
int
2401
m16_simm8_8 (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
2402
{
2403
  return m16_check_op (op, (- 0x80) << 3, 0x7f << 3, 7);
2404
}
2405
 
2406
int
2407
m16_nsimm8_8 (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
2408
{
2409
  return m16_check_op (op, (- 0x7f) << 3, 0x80 << 3, 7);
2410
}
2411
 
2412
static bool
2413
mips_rtx_costs (rtx x, int code, int outer_code, int *total)
2414
{
2415
  enum machine_mode mode = GET_MODE (x);
2416
  bool float_mode_p = FLOAT_MODE_P (mode);
2417
 
2418
  switch (code)
2419
    {
2420
    case CONST_INT:
2421
      if (TARGET_MIPS16)
2422
        {
2423
          /* A number between 1 and 8 inclusive is efficient for a shift.
2424
             Otherwise, we will need an extended instruction.  */
2425
          if ((outer_code) == ASHIFT || (outer_code) == ASHIFTRT
2426
              || (outer_code) == LSHIFTRT)
2427
            {
2428
              if (INTVAL (x) >= 1 && INTVAL (x) <= 8)
2429
                *total = 0;
2430
              else
2431
                *total = COSTS_N_INSNS (1);
2432
              return true;
2433
            }
2434
 
2435
          /* We can use cmpi for an xor with an unsigned 16 bit value.  */
2436
          if ((outer_code) == XOR
2437
              && INTVAL (x) >= 0 && INTVAL (x) < 0x10000)
2438
            {
2439
              *total = 0;
2440
              return true;
2441
            }
2442
 
2443
          /* We may be able to use slt or sltu for a comparison with a
2444
             signed 16 bit value.  (The boundary conditions aren't quite
2445
             right, but this is just a heuristic anyhow.)  */
2446
          if (((outer_code) == LT || (outer_code) == LE
2447
               || (outer_code) == GE || (outer_code) == GT
2448
               || (outer_code) == LTU || (outer_code) == LEU
2449
               || (outer_code) == GEU || (outer_code) == GTU)
2450
              && INTVAL (x) >= -0x8000 && INTVAL (x) < 0x8000)
2451
            {
2452
              *total = 0;
2453
              return true;
2454
            }
2455
 
2456
          /* Equality comparisons with 0 are cheap.  */
2457
          if (((outer_code) == EQ || (outer_code) == NE)
2458
              && INTVAL (x) == 0)
2459
            {
2460
              *total = 0;
2461
              return true;
2462
            }
2463
 
2464
          /* Constants in the range 0...255 can be loaded with an unextended
2465
             instruction.  They are therefore as cheap as a register move.
2466
 
2467
             Given the choice between "li R1,0...255" and "move R1,R2"
2468
             (where R2 is a known constant), it is usually better to use "li",
2469
             since we do not want to unnecessarily extend the lifetime
2470
             of R2.  */
2471
          if (outer_code == SET
2472
              && INTVAL (x) >= 0
2473
              && INTVAL (x) < 256)
2474
            {
2475
              *total = 0;
2476
              return true;
2477
            }
2478
        }
2479
      else
2480
        {
2481
          /* These can be used anywhere. */
2482
          *total = 0;
2483
          return true;
2484
        }
2485
 
2486
      /* Otherwise fall through to the handling below because
2487
         we'll need to construct the constant.  */
2488
 
2489
    case CONST:
2490
    case SYMBOL_REF:
2491
    case LABEL_REF:
2492
    case CONST_DOUBLE:
2493
      if (LEGITIMATE_CONSTANT_P (x))
2494
        {
2495
          *total = COSTS_N_INSNS (1);
2496
          return true;
2497
        }
2498
      else
2499
        {
2500
          /* The value will need to be fetched from the constant pool.  */
2501
          *total = CONSTANT_POOL_COST;
2502
          return true;
2503
        }
2504
 
2505
    case MEM:
2506
      {
2507
        /* If the address is legitimate, return the number of
2508
           instructions it needs, otherwise use the default handling.  */
2509
        int n = mips_address_insns (XEXP (x, 0), GET_MODE (x));
2510
        if (n > 0)
2511
          {
2512
            *total = COSTS_N_INSNS (n + 1);
2513
            return true;
2514
          }
2515
        return false;
2516
      }
2517
 
2518
    case FFS:
2519
      *total = COSTS_N_INSNS (6);
2520
      return true;
2521
 
2522
    case NOT:
2523
      *total = COSTS_N_INSNS ((mode == DImode && !TARGET_64BIT) ? 2 : 1);
2524
      return true;
2525
 
2526
    case AND:
2527
    case IOR:
2528
    case XOR:
2529
      if (mode == DImode && !TARGET_64BIT)
2530
        {
2531
          *total = COSTS_N_INSNS (2);
2532
          return true;
2533
        }
2534
      return false;
2535
 
2536
    case ASHIFT:
2537
    case ASHIFTRT:
2538
    case LSHIFTRT:
2539
      if (mode == DImode && !TARGET_64BIT)
2540
        {
2541
          *total = COSTS_N_INSNS ((GET_CODE (XEXP (x, 1)) == CONST_INT)
2542
                                  ? 4 : 12);
2543
          return true;
2544
        }
2545
      return false;
2546
 
2547
    case ABS:
2548
      if (float_mode_p)
2549
        *total = COSTS_N_INSNS (1);
2550
      else
2551
        *total = COSTS_N_INSNS (4);
2552
      return true;
2553
 
2554
    case LO_SUM:
2555
      *total = COSTS_N_INSNS (1);
2556
      return true;
2557
 
2558
    case PLUS:
2559
    case MINUS:
2560
      if (float_mode_p)
2561
        {
2562
          *total = mips_cost->fp_add;
2563
          return true;
2564
        }
2565
 
2566
      else if (mode == DImode && !TARGET_64BIT)
2567
        {
2568
          *total = COSTS_N_INSNS (4);
2569
          return true;
2570
        }
2571
      return false;
2572
 
2573
    case NEG:
2574
      if (mode == DImode && !TARGET_64BIT)
2575
        {
2576
          *total = COSTS_N_INSNS (4);
2577
          return true;
2578
        }
2579
      return false;
2580
 
2581
    case MULT:
2582
      if (mode == SFmode)
2583
        *total = mips_cost->fp_mult_sf;
2584
 
2585
      else if (mode == DFmode)
2586
        *total = mips_cost->fp_mult_df;
2587
 
2588
      else if (mode == SImode)
2589
        *total = mips_cost->int_mult_si;
2590
 
2591
      else
2592
        *total = mips_cost->int_mult_di;
2593
 
2594
      return true;
2595
 
2596
    case DIV:
2597
    case MOD:
2598
      if (float_mode_p)
2599
        {
2600
          if (mode == SFmode)
2601
            *total = mips_cost->fp_div_sf;
2602
          else
2603
            *total = mips_cost->fp_div_df;
2604
 
2605
          return true;
2606
        }
2607
      /* Fall through.  */
2608
 
2609
    case UDIV:
2610
    case UMOD:
2611
      if (mode == DImode)
2612
        *total = mips_cost->int_div_di;
2613
      else
2614
        *total = mips_cost->int_div_si;
2615
 
2616
      return true;
2617
 
2618
    case SIGN_EXTEND:
2619
      /* A sign extend from SImode to DImode in 64 bit mode is often
2620
         zero instructions, because the result can often be used
2621
         directly by another instruction; we'll call it one.  */
2622
      if (TARGET_64BIT && mode == DImode
2623
          && GET_MODE (XEXP (x, 0)) == SImode)
2624
        *total = COSTS_N_INSNS (1);
2625
      else
2626
        *total = COSTS_N_INSNS (2);
2627
      return true;
2628
 
2629
    case ZERO_EXTEND:
2630
      if (TARGET_64BIT && mode == DImode
2631
          && GET_MODE (XEXP (x, 0)) == SImode)
2632
        *total = COSTS_N_INSNS (2);
2633
      else
2634
        *total = COSTS_N_INSNS (1);
2635
      return true;
2636
 
2637
    case FLOAT:
2638
    case UNSIGNED_FLOAT:
2639
    case FIX:
2640
    case FLOAT_EXTEND:
2641
    case FLOAT_TRUNCATE:
2642
    case SQRT:
2643
      *total = mips_cost->fp_add;
2644
      return true;
2645
 
2646
    default:
2647
      return false;
2648
    }
2649
}
2650
 
2651
/* Provide the costs of an addressing mode that contains ADDR.
2652
   If ADDR is not a valid address, its cost is irrelevant.  */
2653
 
2654
static int
2655
mips_address_cost (rtx addr)
2656
{
2657
  return mips_address_insns (addr, SImode);
2658
}
2659
 
2660
/* Return one word of double-word value OP, taking into account the fixed
2661
   endianness of certain registers.  HIGH_P is true to select the high part,
2662
   false to select the low part.  */
2663
 
2664
rtx
2665
mips_subword (rtx op, int high_p)
2666
{
2667
  unsigned int byte;
2668
  enum machine_mode mode;
2669
 
2670
  mode = GET_MODE (op);
2671
  if (mode == VOIDmode)
2672
    mode = DImode;
2673
 
2674
  if (TARGET_BIG_ENDIAN ? !high_p : high_p)
2675
    byte = UNITS_PER_WORD;
2676
  else
2677
    byte = 0;
2678
 
2679
  if (REG_P (op))
2680
    {
2681
      if (FP_REG_P (REGNO (op)))
2682
        return gen_rtx_REG (word_mode, high_p ? REGNO (op) + 1 : REGNO (op));
2683
      if (ACC_HI_REG_P (REGNO (op)))
2684
        return gen_rtx_REG (word_mode, high_p ? REGNO (op) : REGNO (op) + 1);
2685
    }
2686
 
2687
  if (MEM_P (op))
2688
    return mips_rewrite_small_data (adjust_address (op, word_mode, byte));
2689
 
2690
  return simplify_gen_subreg (word_mode, op, mode, byte);
2691
}
2692
 
2693
 
2694
/* Return true if a 64-bit move from SRC to DEST should be split into two.  */
2695
 
2696
bool
2697
mips_split_64bit_move_p (rtx dest, rtx src)
2698
{
2699
  if (TARGET_64BIT)
2700
    return false;
2701
 
2702
  /* FP->FP moves can be done in a single instruction.  */
2703
  if (FP_REG_RTX_P (src) && FP_REG_RTX_P (dest))
2704
    return false;
2705
 
2706
  /* Check for floating-point loads and stores.  They can be done using
2707
     ldc1 and sdc1 on MIPS II and above.  */
2708
  if (mips_isa > 1)
2709
    {
2710
      if (FP_REG_RTX_P (dest) && MEM_P (src))
2711
        return false;
2712
      if (FP_REG_RTX_P (src) && MEM_P (dest))
2713
        return false;
2714
    }
2715
  return true;
2716
}
2717
 
2718
 
2719
/* Split a 64-bit move from SRC to DEST assuming that
2720
   mips_split_64bit_move_p holds.
2721
 
2722
   Moves into and out of FPRs cause some difficulty here.  Such moves
2723
   will always be DFmode, since paired FPRs are not allowed to store
2724
   DImode values.  The most natural representation would be two separate
2725
   32-bit moves, such as:
2726
 
2727
        (set (reg:SI $f0) (mem:SI ...))
2728
        (set (reg:SI $f1) (mem:SI ...))
2729
 
2730
   However, the second insn is invalid because odd-numbered FPRs are
2731
   not allowed to store independent values.  Use the patterns load_df_low,
2732
   load_df_high and store_df_high instead.  */
2733
 
2734
void
2735
mips_split_64bit_move (rtx dest, rtx src)
2736
{
2737
  if (FP_REG_RTX_P (dest))
2738
    {
2739
      /* Loading an FPR from memory or from GPRs.  */
2740
      emit_insn (gen_load_df_low (copy_rtx (dest), mips_subword (src, 0)));
2741
      emit_insn (gen_load_df_high (dest, mips_subword (src, 1),
2742
                                   copy_rtx (dest)));
2743
    }
2744
  else if (FP_REG_RTX_P (src))
2745
    {
2746
      /* Storing an FPR into memory or GPRs.  */
2747
      emit_move_insn (mips_subword (dest, 0), mips_subword (src, 0));
2748
      emit_insn (gen_store_df_high (mips_subword (dest, 1), src));
2749
    }
2750
  else
2751
    {
2752
      /* The operation can be split into two normal moves.  Decide in
2753
         which order to do them.  */
2754
      rtx low_dest;
2755
 
2756
      low_dest = mips_subword (dest, 0);
2757
      if (REG_P (low_dest)
2758
          && reg_overlap_mentioned_p (low_dest, src))
2759
        {
2760
          emit_move_insn (mips_subword (dest, 1), mips_subword (src, 1));
2761
          emit_move_insn (low_dest, mips_subword (src, 0));
2762
        }
2763
      else
2764
        {
2765
          emit_move_insn (low_dest, mips_subword (src, 0));
2766
          emit_move_insn (mips_subword (dest, 1), mips_subword (src, 1));
2767
        }
2768
    }
2769
}
2770
 
2771
/* Return the appropriate instructions to move SRC into DEST.  Assume
2772
   that SRC is operand 1 and DEST is operand 0.  */
2773
 
2774
const char *
2775
mips_output_move (rtx dest, rtx src)
2776
{
2777
  enum rtx_code dest_code, src_code;
2778
  bool dbl_p;
2779
 
2780
  dest_code = GET_CODE (dest);
2781
  src_code = GET_CODE (src);
2782
  dbl_p = (GET_MODE_SIZE (GET_MODE (dest)) == 8);
2783
 
2784
  if (dbl_p && mips_split_64bit_move_p (dest, src))
2785
    return "#";
2786
 
2787
  if ((src_code == REG && GP_REG_P (REGNO (src)))
2788
      || (!TARGET_MIPS16 && src == CONST0_RTX (GET_MODE (dest))))
2789
    {
2790
      if (dest_code == REG)
2791
        {
2792
          if (GP_REG_P (REGNO (dest)))
2793
            return "move\t%0,%z1";
2794
 
2795
          if (MD_REG_P (REGNO (dest)))
2796
            return "mt%0\t%z1";
2797
 
2798
          if (DSP_ACC_REG_P (REGNO (dest)))
2799
            {
2800
              static char retval[] = "mt__\t%z1,%q0";
2801
              retval[2] = reg_names[REGNO (dest)][4];
2802
              retval[3] = reg_names[REGNO (dest)][5];
2803
              return retval;
2804
            }
2805
 
2806
          if (FP_REG_P (REGNO (dest)))
2807
            return (dbl_p ? "dmtc1\t%z1,%0" : "mtc1\t%z1,%0");
2808
 
2809
          if (ALL_COP_REG_P (REGNO (dest)))
2810
            {
2811
              static char retval[] = "dmtc_\t%z1,%0";
2812
 
2813
              retval[4] = COPNUM_AS_CHAR_FROM_REGNUM (REGNO (dest));
2814
              return (dbl_p ? retval : retval + 1);
2815
            }
2816
        }
2817
      if (dest_code == MEM)
2818
        return (dbl_p ? "sd\t%z1,%0" : "sw\t%z1,%0");
2819
    }
2820
  if (dest_code == REG && GP_REG_P (REGNO (dest)))
2821
    {
2822
      if (src_code == REG)
2823
        {
2824
          if (DSP_ACC_REG_P (REGNO (src)))
2825
            {
2826
              static char retval[] = "mf__\t%0,%q1";
2827
              retval[2] = reg_names[REGNO (src)][4];
2828
              retval[3] = reg_names[REGNO (src)][5];
2829
              return retval;
2830
            }
2831
 
2832
          if (ST_REG_P (REGNO (src)) && ISA_HAS_8CC)
2833
            return "lui\t%0,0x3f80\n\tmovf\t%0,%.,%1";
2834
 
2835
          if (FP_REG_P (REGNO (src)))
2836
            return (dbl_p ? "dmfc1\t%0,%1" : "mfc1\t%0,%1");
2837
 
2838
          if (ALL_COP_REG_P (REGNO (src)))
2839
            {
2840
              static char retval[] = "dmfc_\t%0,%1";
2841
 
2842
              retval[4] = COPNUM_AS_CHAR_FROM_REGNUM (REGNO (src));
2843
              return (dbl_p ? retval : retval + 1);
2844
            }
2845
        }
2846
 
2847
      if (src_code == MEM)
2848
        return (dbl_p ? "ld\t%0,%1" : "lw\t%0,%1");
2849
 
2850
      if (src_code == CONST_INT)
2851
        {
2852
          /* Don't use the X format, because that will give out of
2853
             range numbers for 64 bit hosts and 32 bit targets.  */
2854
          if (!TARGET_MIPS16)
2855
            return "li\t%0,%1\t\t\t# %X1";
2856
 
2857
          if (INTVAL (src) >= 0 && INTVAL (src) <= 0xffff)
2858
            return "li\t%0,%1";
2859
 
2860
          if (INTVAL (src) < 0 && INTVAL (src) >= -0xffff)
2861
            return "#";
2862
        }
2863
 
2864
      if (src_code == HIGH)
2865
        return "lui\t%0,%h1";
2866
 
2867
      if (CONST_GP_P (src))
2868
        return "move\t%0,%1";
2869
 
2870
      if (symbolic_operand (src, VOIDmode))
2871
        return (dbl_p ? "dla\t%0,%1" : "la\t%0,%1");
2872
    }
2873
  if (src_code == REG && FP_REG_P (REGNO (src)))
2874
    {
2875
      if (dest_code == REG && FP_REG_P (REGNO (dest)))
2876
        {
2877
          if (GET_MODE (dest) == V2SFmode)
2878
            return "mov.ps\t%0,%1";
2879
          else
2880
            return (dbl_p ? "mov.d\t%0,%1" : "mov.s\t%0,%1");
2881
        }
2882
 
2883
      if (dest_code == MEM)
2884
        return (dbl_p ? "sdc1\t%1,%0" : "swc1\t%1,%0");
2885
    }
2886
  if (dest_code == REG && FP_REG_P (REGNO (dest)))
2887
    {
2888
      if (src_code == MEM)
2889
        return (dbl_p ? "ldc1\t%0,%1" : "lwc1\t%0,%1");
2890
    }
2891
  if (dest_code == REG && ALL_COP_REG_P (REGNO (dest)) && src_code == MEM)
2892
    {
2893
      static char retval[] = "l_c_\t%0,%1";
2894
 
2895
      retval[1] = (dbl_p ? 'd' : 'w');
2896
      retval[3] = COPNUM_AS_CHAR_FROM_REGNUM (REGNO (dest));
2897
      return retval;
2898
    }
2899
  if (dest_code == MEM && src_code == REG && ALL_COP_REG_P (REGNO (src)))
2900
    {
2901
      static char retval[] = "s_c_\t%1,%0";
2902
 
2903
      retval[1] = (dbl_p ? 'd' : 'w');
2904
      retval[3] = COPNUM_AS_CHAR_FROM_REGNUM (REGNO (src));
2905
      return retval;
2906
    }
2907
  gcc_unreachable ();
2908
}
2909
 
2910
/* Restore $gp from its save slot.  Valid only when using o32 or
2911
   o64 abicalls.  */
2912
 
2913
void
2914
mips_restore_gp (void)
2915
{
2916
  rtx address, slot;
2917
 
2918
  gcc_assert (TARGET_ABICALLS && TARGET_OLDABI);
2919
 
2920
  address = mips_add_offset (pic_offset_table_rtx,
2921
                             frame_pointer_needed
2922
                             ? hard_frame_pointer_rtx
2923
                             : stack_pointer_rtx,
2924
                             current_function_outgoing_args_size);
2925
  slot = gen_rtx_MEM (Pmode, address);
2926
 
2927
  emit_move_insn (pic_offset_table_rtx, slot);
2928
  if (!TARGET_EXPLICIT_RELOCS)
2929
    emit_insn (gen_blockage ());
2930
}
2931
 
2932
/* Emit an instruction of the form (set TARGET (CODE OP0 OP1)).  */
2933
 
2934
static void
2935
mips_emit_binary (enum rtx_code code, rtx target, rtx op0, rtx op1)
2936
{
2937
  emit_insn (gen_rtx_SET (VOIDmode, target,
2938
                          gen_rtx_fmt_ee (code, GET_MODE (target), op0, op1)));
2939
}
2940
 
2941
/* Return true if CMP1 is a suitable second operand for relational
2942
   operator CODE.  See also the *sCC patterns in mips.md.  */
2943
 
2944
static bool
2945
mips_relational_operand_ok_p (enum rtx_code code, rtx cmp1)
2946
{
2947
  switch (code)
2948
    {
2949
    case GT:
2950
    case GTU:
2951
      return reg_or_0_operand (cmp1, VOIDmode);
2952
 
2953
    case GE:
2954
    case GEU:
2955
      return !TARGET_MIPS16 && cmp1 == const1_rtx;
2956
 
2957
    case LT:
2958
    case LTU:
2959
      return arith_operand (cmp1, VOIDmode);
2960
 
2961
    case LE:
2962
      return sle_operand (cmp1, VOIDmode);
2963
 
2964
    case LEU:
2965
      return sleu_operand (cmp1, VOIDmode);
2966
 
2967
    default:
2968
      gcc_unreachable ();
2969
    }
2970
}
2971
 
2972
/* Canonicalize LE or LEU comparisons into LT comparisons when
2973
   possible to avoid extra instructions or inverting the
2974
   comparison.  */
2975
 
2976
static bool
2977
mips_canonicalize_comparison (enum rtx_code *code, rtx *cmp1,
2978
                              enum machine_mode mode)
2979
{
2980
  HOST_WIDE_INT original, plus_one;
2981
 
2982
  if (GET_CODE (*cmp1) != CONST_INT)
2983
    return false;
2984
 
2985
  original = INTVAL (*cmp1);
2986
  plus_one = trunc_int_for_mode ((unsigned HOST_WIDE_INT) original + 1, mode);
2987
 
2988
  switch (*code)
2989
    {
2990
    case LE:
2991
      if (original < plus_one)
2992
        {
2993
          *code = LT;
2994
          *cmp1 = force_reg (mode, GEN_INT (plus_one));
2995
          return true;
2996
        }
2997
      break;
2998
 
2999
    case LEU:
3000
      if (plus_one != 0)
3001
        {
3002
          *code = LTU;
3003
          *cmp1 = force_reg (mode, GEN_INT (plus_one));
3004
          return true;
3005
        }
3006
      break;
3007
 
3008
    default:
3009
      return false;
3010
   }
3011
 
3012
  return false;
3013
 
3014
}
3015
 
3016
/* Compare CMP0 and CMP1 using relational operator CODE and store the
3017
   result in TARGET.  CMP0 and TARGET are register_operands that have
3018
   the same integer mode.  If INVERT_PTR is nonnull, it's OK to set
3019
   TARGET to the inverse of the result and flip *INVERT_PTR instead.  */
3020
 
3021
static void
3022
mips_emit_int_relational (enum rtx_code code, bool *invert_ptr,
3023
                          rtx target, rtx cmp0, rtx cmp1)
3024
{
3025
  /* First see if there is a MIPS instruction that can do this operation
3026
     with CMP1 in its current form. If not, try to canonicalize the
3027
     comparison to LT. If that fails, try doing the same for the
3028
     inverse operation.  If that also fails, force CMP1 into a register
3029
     and try again.  */
3030
  if (mips_relational_operand_ok_p (code, cmp1))
3031
    mips_emit_binary (code, target, cmp0, cmp1);
3032
  else if (mips_canonicalize_comparison (&code, &cmp1, GET_MODE (target)))
3033
    mips_emit_binary (code, target, cmp0, cmp1);
3034
  else
3035
    {
3036
      enum rtx_code inv_code = reverse_condition (code);
3037
      if (!mips_relational_operand_ok_p (inv_code, cmp1))
3038
        {
3039
          cmp1 = force_reg (GET_MODE (cmp0), cmp1);
3040
          mips_emit_int_relational (code, invert_ptr, target, cmp0, cmp1);
3041
        }
3042
      else if (invert_ptr == 0)
3043
        {
3044
          rtx inv_target = gen_reg_rtx (GET_MODE (target));
3045
          mips_emit_binary (inv_code, inv_target, cmp0, cmp1);
3046
          mips_emit_binary (XOR, target, inv_target, const1_rtx);
3047
        }
3048
      else
3049
        {
3050
          *invert_ptr = !*invert_ptr;
3051
          mips_emit_binary (inv_code, target, cmp0, cmp1);
3052
        }
3053
    }
3054
}
3055
 
3056
/* Return a register that is zero iff CMP0 and CMP1 are equal.
3057
   The register will have the same mode as CMP0.  */
3058
 
3059
static rtx
3060
mips_zero_if_equal (rtx cmp0, rtx cmp1)
3061
{
3062
  if (cmp1 == const0_rtx)
3063
    return cmp0;
3064
 
3065
  if (uns_arith_operand (cmp1, VOIDmode))
3066
    return expand_binop (GET_MODE (cmp0), xor_optab,
3067
                         cmp0, cmp1, 0, 0, OPTAB_DIRECT);
3068
 
3069
  return expand_binop (GET_MODE (cmp0), sub_optab,
3070
                       cmp0, cmp1, 0, 0, OPTAB_DIRECT);
3071
}
3072
 
3073
/* Convert a comparison into something that can be used in a branch or
3074
   conditional move.  cmp_operands[0] and cmp_operands[1] are the values
3075
   being compared and *CODE is the code used to compare them.
3076
 
3077
   Update *CODE, *OP0 and *OP1 so that they describe the final comparison.
3078
   If NEED_EQ_NE_P, then only EQ/NE comparisons against zero are possible,
3079
   otherwise any standard branch condition can be used.  The standard branch
3080
   conditions are:
3081
 
3082
      - EQ/NE between two registers.
3083
      - any comparison between a register and zero.  */
3084
 
3085
static void
3086
mips_emit_compare (enum rtx_code *code, rtx *op0, rtx *op1, bool need_eq_ne_p)
3087
{
3088
  if (GET_MODE_CLASS (GET_MODE (cmp_operands[0])) == MODE_INT)
3089
    {
3090
      if (!need_eq_ne_p && cmp_operands[1] == const0_rtx)
3091
        {
3092
          *op0 = cmp_operands[0];
3093
          *op1 = cmp_operands[1];
3094
        }
3095
      else if (*code == EQ || *code == NE)
3096
        {
3097
          if (need_eq_ne_p)
3098
            {
3099
              *op0 = mips_zero_if_equal (cmp_operands[0], cmp_operands[1]);
3100
              *op1 = const0_rtx;
3101
            }
3102
          else
3103
            {
3104
              *op0 = cmp_operands[0];
3105
              *op1 = force_reg (GET_MODE (*op0), cmp_operands[1]);
3106
            }
3107
        }
3108
      else
3109
        {
3110
          /* The comparison needs a separate scc instruction.  Store the
3111
             result of the scc in *OP0 and compare it against zero.  */
3112
          bool invert = false;
3113
          *op0 = gen_reg_rtx (GET_MODE (cmp_operands[0]));
3114
          *op1 = const0_rtx;
3115
          mips_emit_int_relational (*code, &invert, *op0,
3116
                                    cmp_operands[0], cmp_operands[1]);
3117
          *code = (invert ? EQ : NE);
3118
        }
3119
    }
3120
  else
3121
    {
3122
      enum rtx_code cmp_code;
3123
 
3124
      /* Floating-point tests use a separate c.cond.fmt comparison to
3125
         set a condition code register.  The branch or conditional move
3126
         will then compare that register against zero.
3127
 
3128
         Set CMP_CODE to the code of the comparison instruction and
3129
         *CODE to the code that the branch or move should use.  */
3130
      switch (*code)
3131
        {
3132
        case NE:
3133
        case LTGT:
3134
        case ORDERED:
3135
          cmp_code = reverse_condition_maybe_unordered (*code);
3136
          *code = EQ;
3137
          break;
3138
 
3139
        default:
3140
          cmp_code = *code;
3141
          *code = NE;
3142
          break;
3143
        }
3144
      *op0 = (ISA_HAS_8CC
3145
              ? gen_reg_rtx (CCmode)
3146
              : gen_rtx_REG (CCmode, FPSW_REGNUM));
3147
      *op1 = const0_rtx;
3148
      mips_emit_binary (cmp_code, *op0, cmp_operands[0], cmp_operands[1]);
3149
    }
3150
}
3151
 
3152
/* Try comparing cmp_operands[0] and cmp_operands[1] using rtl code CODE.
3153
   Store the result in TARGET and return true if successful.
3154
 
3155
   On 64-bit targets, TARGET may be wider than cmp_operands[0].  */
3156
 
3157
bool
3158
mips_emit_scc (enum rtx_code code, rtx target)
3159
{
3160
  if (GET_MODE_CLASS (GET_MODE (cmp_operands[0])) != MODE_INT)
3161
    return false;
3162
 
3163
  target = gen_lowpart (GET_MODE (cmp_operands[0]), target);
3164
  if (code == EQ || code == NE)
3165
    {
3166
      rtx zie = mips_zero_if_equal (cmp_operands[0], cmp_operands[1]);
3167
      mips_emit_binary (code, target, zie, const0_rtx);
3168
    }
3169
  else
3170
    mips_emit_int_relational (code, 0, target,
3171
                              cmp_operands[0], cmp_operands[1]);
3172
  return true;
3173
}
3174
 
3175
/* Emit the common code for doing conditional branches.
3176
   operand[0] is the label to jump to.
3177
   The comparison operands are saved away by cmp{si,di,sf,df}.  */
3178
 
3179
void
3180
gen_conditional_branch (rtx *operands, enum rtx_code code)
3181
{
3182
  rtx op0, op1, target;
3183
 
3184
  mips_emit_compare (&code, &op0, &op1, TARGET_MIPS16);
3185
  target = gen_rtx_IF_THEN_ELSE (VOIDmode,
3186
                                 gen_rtx_fmt_ee (code, GET_MODE (op0),
3187
                                                 op0, op1),
3188
                                 gen_rtx_LABEL_REF (VOIDmode, operands[0]),
3189
                                 pc_rtx);
3190
  emit_jump_insn (gen_rtx_SET (VOIDmode, pc_rtx, target));
3191
}
3192
 
3193
/* Emit the common code for conditional moves.  OPERANDS is the array
3194
   of operands passed to the conditional move define_expand.  */
3195
 
3196
void
3197
gen_conditional_move (rtx *operands)
3198
{
3199
  enum rtx_code code;
3200
  rtx op0, op1;
3201
 
3202
  code = GET_CODE (operands[1]);
3203
  mips_emit_compare (&code, &op0, &op1, true);
3204
  emit_insn (gen_rtx_SET (VOIDmode, operands[0],
3205
                          gen_rtx_IF_THEN_ELSE (GET_MODE (operands[0]),
3206
                                                gen_rtx_fmt_ee (code,
3207
                                                                GET_MODE (op0),
3208
                                                                op0, op1),
3209
                                                operands[2], operands[3])));
3210
}
3211
 
3212
/* Emit a conditional trap.  OPERANDS is the array of operands passed to
3213
   the conditional_trap expander.  */
3214
 
3215
void
3216
mips_gen_conditional_trap (rtx *operands)
3217
{
3218
  rtx op0, op1;
3219
  enum rtx_code cmp_code = GET_CODE (operands[0]);
3220
  enum machine_mode mode = GET_MODE (cmp_operands[0]);
3221
 
3222
  /* MIPS conditional trap machine instructions don't have GT or LE
3223
     flavors, so we must invert the comparison and convert to LT and
3224
     GE, respectively.  */
3225
  switch (cmp_code)
3226
    {
3227
    case GT: cmp_code = LT; break;
3228
    case LE: cmp_code = GE; break;
3229
    case GTU: cmp_code = LTU; break;
3230
    case LEU: cmp_code = GEU; break;
3231
    default: break;
3232
    }
3233
  if (cmp_code == GET_CODE (operands[0]))
3234
    {
3235
      op0 = cmp_operands[0];
3236
      op1 = cmp_operands[1];
3237
    }
3238
  else
3239
    {
3240
      op0 = cmp_operands[1];
3241
      op1 = cmp_operands[0];
3242
    }
3243
  op0 = force_reg (mode, op0);
3244
  if (!arith_operand (op1, mode))
3245
    op1 = force_reg (mode, op1);
3246
 
3247
  emit_insn (gen_rtx_TRAP_IF (VOIDmode,
3248
                              gen_rtx_fmt_ee (cmp_code, mode, op0, op1),
3249
                              operands[1]));
3250
}
3251
 
3252
/* Load function address ADDR into register DEST.  SIBCALL_P is true
3253
   if the address is needed for a sibling call.  */
3254
 
3255
static void
3256
mips_load_call_address (rtx dest, rtx addr, int sibcall_p)
3257
{
3258
  /* If we're generating PIC, and this call is to a global function,
3259
     try to allow its address to be resolved lazily.  This isn't
3260
     possible for NewABI sibcalls since the value of $gp on entry
3261
     to the stub would be our caller's gp, not ours.  */
3262
  if (TARGET_EXPLICIT_RELOCS
3263
      && !(sibcall_p && TARGET_NEWABI)
3264
      && global_got_operand (addr, VOIDmode))
3265
    {
3266
      rtx high, lo_sum_symbol;
3267
 
3268
      high = mips_unspec_offset_high (dest, pic_offset_table_rtx,
3269
                                      addr, SYMBOL_GOTOFF_CALL);
3270
      lo_sum_symbol = mips_unspec_address (addr, SYMBOL_GOTOFF_CALL);
3271
      if (Pmode == SImode)
3272
        emit_insn (gen_load_callsi (dest, high, lo_sum_symbol));
3273
      else
3274
        emit_insn (gen_load_calldi (dest, high, lo_sum_symbol));
3275
    }
3276
  else
3277
    emit_move_insn (dest, addr);
3278
}
3279
 
3280
 
3281
/* Expand a call or call_value instruction.  RESULT is where the
3282
   result will go (null for calls), ADDR is the address of the
3283
   function, ARGS_SIZE is the size of the arguments and AUX is
3284
   the value passed to us by mips_function_arg.  SIBCALL_P is true
3285
   if we are expanding a sibling call, false if we're expanding
3286
   a normal call.  */
3287
 
3288
void
3289
mips_expand_call (rtx result, rtx addr, rtx args_size, rtx aux, int sibcall_p)
3290
{
3291
  rtx orig_addr, pattern, insn;
3292
 
3293
  orig_addr = addr;
3294
  if (!call_insn_operand (addr, VOIDmode))
3295
    {
3296
      addr = gen_reg_rtx (Pmode);
3297
      mips_load_call_address (addr, orig_addr, sibcall_p);
3298
    }
3299
 
3300
  if (TARGET_MIPS16
3301
      && mips16_hard_float
3302
      && build_mips16_call_stub (result, addr, args_size,
3303
                                 aux == 0 ? 0 : (int) GET_MODE (aux)))
3304
    return;
3305
 
3306
  if (result == 0)
3307
    pattern = (sibcall_p
3308
               ? gen_sibcall_internal (addr, args_size)
3309
               : gen_call_internal (addr, args_size));
3310
  else if (GET_CODE (result) == PARALLEL && XVECLEN (result, 0) == 2)
3311
    {
3312
      rtx reg1, reg2;
3313
 
3314
      reg1 = XEXP (XVECEXP (result, 0, 0), 0);
3315
      reg2 = XEXP (XVECEXP (result, 0, 1), 0);
3316
      pattern =
3317
        (sibcall_p
3318
         ? gen_sibcall_value_multiple_internal (reg1, addr, args_size, reg2)
3319
         : gen_call_value_multiple_internal (reg1, addr, args_size, reg2));
3320
    }
3321
  else
3322
    pattern = (sibcall_p
3323
               ? gen_sibcall_value_internal (result, addr, args_size)
3324
               : gen_call_value_internal (result, addr, args_size));
3325
 
3326
  insn = emit_call_insn (pattern);
3327
 
3328
  /* Lazy-binding stubs require $gp to be valid on entry.  */
3329
  if (global_got_operand (orig_addr, VOIDmode))
3330
    use_reg (&CALL_INSN_FUNCTION_USAGE (insn), pic_offset_table_rtx);
3331
}
3332
 
3333
 
3334
/* We can handle any sibcall when TARGET_SIBCALLS is true.  */
3335
 
3336
static bool
3337
mips_function_ok_for_sibcall (tree decl ATTRIBUTE_UNUSED,
3338
                              tree exp ATTRIBUTE_UNUSED)
3339
{
3340
  return TARGET_SIBCALLS;
3341
}
3342
 
3343
/* Emit code to move general operand SRC into condition-code
3344
   register DEST.  SCRATCH is a scratch TFmode float register.
3345
   The sequence is:
3346
 
3347
        FP1 = SRC
3348
        FP2 = 0.0f
3349
        DEST = FP2 < FP1
3350
 
3351
   where FP1 and FP2 are single-precision float registers
3352
   taken from SCRATCH.  */
3353
 
3354
void
3355
mips_emit_fcc_reload (rtx dest, rtx src, rtx scratch)
3356
{
3357
  rtx fp1, fp2;
3358
 
3359
  /* Change the source to SFmode.  */
3360
  if (MEM_P (src))
3361
    src = adjust_address (src, SFmode, 0);
3362
  else if (REG_P (src) || GET_CODE (src) == SUBREG)
3363
    src = gen_rtx_REG (SFmode, true_regnum (src));
3364
 
3365
  fp1 = gen_rtx_REG (SFmode, REGNO (scratch));
3366
  fp2 = gen_rtx_REG (SFmode, REGNO (scratch) + FP_INC);
3367
 
3368
  emit_move_insn (copy_rtx (fp1), src);
3369
  emit_move_insn (copy_rtx (fp2), CONST0_RTX (SFmode));
3370
  emit_insn (gen_slt_sf (dest, fp2, fp1));
3371
}
3372
 
3373
/* Emit code to change the current function's return address to
3374
   ADDRESS.  SCRATCH is available as a scratch register, if needed.
3375
   ADDRESS and SCRATCH are both word-mode GPRs.  */
3376
 
3377
void
3378
mips_set_return_address (rtx address, rtx scratch)
3379
{
3380
  rtx slot_address;
3381
 
3382
  compute_frame_size (get_frame_size ());
3383
  gcc_assert ((cfun->machine->frame.mask >> 31) & 1);
3384
  slot_address = mips_add_offset (scratch, stack_pointer_rtx,
3385
                                  cfun->machine->frame.gp_sp_offset);
3386
 
3387
  emit_move_insn (gen_rtx_MEM (GET_MODE (address), slot_address), address);
3388
}
3389
 
3390
/* Emit straight-line code to move LENGTH bytes from SRC to DEST.
3391
   Assume that the areas do not overlap.  */
3392
 
3393
static void
3394
mips_block_move_straight (rtx dest, rtx src, HOST_WIDE_INT length)
3395
{
3396
  HOST_WIDE_INT offset, delta;
3397
  unsigned HOST_WIDE_INT bits;
3398
  int i;
3399
  enum machine_mode mode;
3400
  rtx *regs;
3401
 
3402
  /* Work out how many bits to move at a time.  If both operands have
3403
     half-word alignment, it is usually better to move in half words.
3404
     For instance, lh/lh/sh/sh is usually better than lwl/lwr/swl/swr
3405
     and lw/lw/sw/sw is usually better than ldl/ldr/sdl/sdr.
3406
     Otherwise move word-sized chunks.  */
3407
  if (MEM_ALIGN (src) == BITS_PER_WORD / 2
3408
      && MEM_ALIGN (dest) == BITS_PER_WORD / 2)
3409
    bits = BITS_PER_WORD / 2;
3410
  else
3411
    bits = BITS_PER_WORD;
3412
 
3413
  mode = mode_for_size (bits, MODE_INT, 0);
3414
  delta = bits / BITS_PER_UNIT;
3415
 
3416
  /* Allocate a buffer for the temporary registers.  */
3417
  regs = alloca (sizeof (rtx) * length / delta);
3418
 
3419
  /* Load as many BITS-sized chunks as possible.  Use a normal load if
3420
     the source has enough alignment, otherwise use left/right pairs.  */
3421
  for (offset = 0, i = 0; offset + delta <= length; offset += delta, i++)
3422
    {
3423
      regs[i] = gen_reg_rtx (mode);
3424
      if (MEM_ALIGN (src) >= bits)
3425
        emit_move_insn (regs[i], adjust_address (src, mode, offset));
3426
      else
3427
        {
3428
          rtx part = adjust_address (src, BLKmode, offset);
3429
          if (!mips_expand_unaligned_load (regs[i], part, bits, 0))
3430
            gcc_unreachable ();
3431
        }
3432
    }
3433
 
3434
  /* Copy the chunks to the destination.  */
3435
  for (offset = 0, i = 0; offset + delta <= length; offset += delta, i++)
3436
    if (MEM_ALIGN (dest) >= bits)
3437
      emit_move_insn (adjust_address (dest, mode, offset), regs[i]);
3438
    else
3439
      {
3440
        rtx part = adjust_address (dest, BLKmode, offset);
3441
        if (!mips_expand_unaligned_store (part, regs[i], bits, 0))
3442
          gcc_unreachable ();
3443
      }
3444
 
3445
  /* Mop up any left-over bytes.  */
3446
  if (offset < length)
3447
    {
3448
      src = adjust_address (src, BLKmode, offset);
3449
      dest = adjust_address (dest, BLKmode, offset);
3450
      move_by_pieces (dest, src, length - offset,
3451
                      MIN (MEM_ALIGN (src), MEM_ALIGN (dest)), 0);
3452
    }
3453
}
3454
 
3455
#define MAX_MOVE_REGS 4
3456
#define MAX_MOVE_BYTES (MAX_MOVE_REGS * UNITS_PER_WORD)
3457
 
3458
 
3459
/* Helper function for doing a loop-based block operation on memory
3460
   reference MEM.  Each iteration of the loop will operate on LENGTH
3461
   bytes of MEM.
3462
 
3463
   Create a new base register for use within the loop and point it to
3464
   the start of MEM.  Create a new memory reference that uses this
3465
   register.  Store them in *LOOP_REG and *LOOP_MEM respectively.  */
3466
 
3467
static void
3468
mips_adjust_block_mem (rtx mem, HOST_WIDE_INT length,
3469
                       rtx *loop_reg, rtx *loop_mem)
3470
{
3471
  *loop_reg = copy_addr_to_reg (XEXP (mem, 0));
3472
 
3473
  /* Although the new mem does not refer to a known location,
3474
     it does keep up to LENGTH bytes of alignment.  */
3475
  *loop_mem = change_address (mem, BLKmode, *loop_reg);
3476
  set_mem_align (*loop_mem, MIN (MEM_ALIGN (mem), length * BITS_PER_UNIT));
3477
}
3478
 
3479
 
3480
/* Move LENGTH bytes from SRC to DEST using a loop that moves MAX_MOVE_BYTES
3481
   per iteration.  LENGTH must be at least MAX_MOVE_BYTES.  Assume that the
3482
   memory regions do not overlap.  */
3483
 
3484
static void
3485
mips_block_move_loop (rtx dest, rtx src, HOST_WIDE_INT length)
3486
{
3487
  rtx label, src_reg, dest_reg, final_src;
3488
  HOST_WIDE_INT leftover;
3489
 
3490
  leftover = length % MAX_MOVE_BYTES;
3491
  length -= leftover;
3492
 
3493
  /* Create registers and memory references for use within the loop.  */
3494
  mips_adjust_block_mem (src, MAX_MOVE_BYTES, &src_reg, &src);
3495
  mips_adjust_block_mem (dest, MAX_MOVE_BYTES, &dest_reg, &dest);
3496
 
3497
  /* Calculate the value that SRC_REG should have after the last iteration
3498
     of the loop.  */
3499
  final_src = expand_simple_binop (Pmode, PLUS, src_reg, GEN_INT (length),
3500
                                   0, 0, OPTAB_WIDEN);
3501
 
3502
  /* Emit the start of the loop.  */
3503
  label = gen_label_rtx ();
3504
  emit_label (label);
3505
 
3506
  /* Emit the loop body.  */
3507
  mips_block_move_straight (dest, src, MAX_MOVE_BYTES);
3508
 
3509
  /* Move on to the next block.  */
3510
  emit_move_insn (src_reg, plus_constant (src_reg, MAX_MOVE_BYTES));
3511
  emit_move_insn (dest_reg, plus_constant (dest_reg, MAX_MOVE_BYTES));
3512
 
3513
  /* Emit the loop condition.  */
3514
  if (Pmode == DImode)
3515
    emit_insn (gen_cmpdi (src_reg, final_src));
3516
  else
3517
    emit_insn (gen_cmpsi (src_reg, final_src));
3518
  emit_jump_insn (gen_bne (label));
3519
 
3520
  /* Mop up any left-over bytes.  */
3521
  if (leftover)
3522
    mips_block_move_straight (dest, src, leftover);
3523
}
3524
 
3525
/* Expand a movmemsi instruction.  */
3526
 
3527
bool
3528
mips_expand_block_move (rtx dest, rtx src, rtx length)
3529
{
3530
  if (GET_CODE (length) == CONST_INT)
3531
    {
3532
      if (INTVAL (length) <= 2 * MAX_MOVE_BYTES)
3533
        {
3534
          mips_block_move_straight (dest, src, INTVAL (length));
3535
          return true;
3536
        }
3537
      else if (optimize)
3538
        {
3539
          mips_block_move_loop (dest, src, INTVAL (length));
3540
          return true;
3541
        }
3542
    }
3543
  return false;
3544
}
3545
 
3546
/* Argument support functions.  */
3547
 
3548
/* Initialize CUMULATIVE_ARGS for a function.  */
3549
 
3550
void
3551
init_cumulative_args (CUMULATIVE_ARGS *cum, tree fntype,
3552
                      rtx libname ATTRIBUTE_UNUSED)
3553
{
3554
  static CUMULATIVE_ARGS zero_cum;
3555
  tree param, next_param;
3556
 
3557
  *cum = zero_cum;
3558
  cum->prototype = (fntype && TYPE_ARG_TYPES (fntype));
3559
 
3560
  /* Determine if this function has variable arguments.  This is
3561
     indicated by the last argument being 'void_type_mode' if there
3562
     are no variable arguments.  The standard MIPS calling sequence
3563
     passes all arguments in the general purpose registers in this case.  */
3564
 
3565
  for (param = fntype ? TYPE_ARG_TYPES (fntype) : 0;
3566
       param != 0; param = next_param)
3567
    {
3568
      next_param = TREE_CHAIN (param);
3569
      if (next_param == 0 && TREE_VALUE (param) != void_type_node)
3570
        cum->gp_reg_found = 1;
3571
    }
3572
}
3573
 
3574
 
3575
/* Fill INFO with information about a single argument.  CUM is the
3576
   cumulative state for earlier arguments.  MODE is the mode of this
3577
   argument and TYPE is its type (if known).  NAMED is true if this
3578
   is a named (fixed) argument rather than a variable one.  */
3579
 
3580
static void
3581
mips_arg_info (const CUMULATIVE_ARGS *cum, enum machine_mode mode,
3582
               tree type, int named, struct mips_arg_info *info)
3583
{
3584
  bool doubleword_aligned_p;
3585
  unsigned int num_bytes, num_words, max_regs;
3586
 
3587
  /* Work out the size of the argument.  */
3588
  num_bytes = type ? int_size_in_bytes (type) : GET_MODE_SIZE (mode);
3589
  num_words = (num_bytes + UNITS_PER_WORD - 1) / UNITS_PER_WORD;
3590
 
3591
  /* Decide whether it should go in a floating-point register, assuming
3592
     one is free.  Later code checks for availability.
3593
 
3594
     The checks against UNITS_PER_FPVALUE handle the soft-float and
3595
     single-float cases.  */
3596
  switch (mips_abi)
3597
    {
3598
    case ABI_EABI:
3599
      /* The EABI conventions have traditionally been defined in terms
3600
         of TYPE_MODE, regardless of the actual type.  */
3601
      info->fpr_p = ((GET_MODE_CLASS (mode) == MODE_FLOAT
3602
                      || GET_MODE_CLASS (mode) == MODE_VECTOR_FLOAT)
3603
                     && GET_MODE_SIZE (mode) <= UNITS_PER_FPVALUE);
3604
      break;
3605
 
3606
    case ABI_32:
3607
    case ABI_O64:
3608
      /* Only leading floating-point scalars are passed in
3609
         floating-point registers.  We also handle vector floats the same
3610
         say, which is OK because they are not covered by the standard ABI.  */
3611
      info->fpr_p = (!cum->gp_reg_found
3612
                     && cum->arg_number < 2
3613
                     && (type == 0 || SCALAR_FLOAT_TYPE_P (type)
3614
                         || VECTOR_FLOAT_TYPE_P (type))
3615
                     && (GET_MODE_CLASS (mode) == MODE_FLOAT
3616
                         || GET_MODE_CLASS (mode) == MODE_VECTOR_FLOAT)
3617
                     && GET_MODE_SIZE (mode) <= UNITS_PER_FPVALUE);
3618
      break;
3619
 
3620
    case ABI_N32:
3621
    case ABI_64:
3622
      /* Scalar and complex floating-point types are passed in
3623
         floating-point registers.  */
3624
      info->fpr_p = (named
3625
                     && (type == 0 || FLOAT_TYPE_P (type))
3626
                     && (GET_MODE_CLASS (mode) == MODE_FLOAT
3627
                         || GET_MODE_CLASS (mode) == MODE_COMPLEX_FLOAT
3628
                         || GET_MODE_CLASS (mode) == MODE_VECTOR_FLOAT)
3629
                     && GET_MODE_UNIT_SIZE (mode) <= UNITS_PER_FPVALUE);
3630
 
3631
      /* ??? According to the ABI documentation, the real and imaginary
3632
         parts of complex floats should be passed in individual registers.
3633
         The real and imaginary parts of stack arguments are supposed
3634
         to be contiguous and there should be an extra word of padding
3635
         at the end.
3636
 
3637
         This has two problems.  First, it makes it impossible to use a
3638
         single "void *" va_list type, since register and stack arguments
3639
         are passed differently.  (At the time of writing, MIPSpro cannot
3640
         handle complex float varargs correctly.)  Second, it's unclear
3641
         what should happen when there is only one register free.
3642
 
3643
         For now, we assume that named complex floats should go into FPRs
3644
         if there are two FPRs free, otherwise they should be passed in the
3645
         same way as a struct containing two floats.  */
3646
      if (info->fpr_p
3647
          && GET_MODE_CLASS (mode) == MODE_COMPLEX_FLOAT
3648
          && GET_MODE_UNIT_SIZE (mode) < UNITS_PER_FPVALUE)
3649
        {
3650
          if (cum->num_gprs >= MAX_ARGS_IN_REGISTERS - 1)
3651
            info->fpr_p = false;
3652
          else
3653
            num_words = 2;
3654
        }
3655
      break;
3656
 
3657
    default:
3658
      gcc_unreachable ();
3659
    }
3660
 
3661
  /* See whether the argument has doubleword alignment.  */
3662
  doubleword_aligned_p = FUNCTION_ARG_BOUNDARY (mode, type) > BITS_PER_WORD;
3663
 
3664
  /* Set REG_OFFSET to the register count we're interested in.
3665
     The EABI allocates the floating-point registers separately,
3666
     but the other ABIs allocate them like integer registers.  */
3667
  info->reg_offset = (mips_abi == ABI_EABI && info->fpr_p
3668
                      ? cum->num_fprs
3669
                      : cum->num_gprs);
3670
 
3671
  /* Advance to an even register if the argument is doubleword-aligned.  */
3672
  if (doubleword_aligned_p)
3673
    info->reg_offset += info->reg_offset & 1;
3674
 
3675
  /* Work out the offset of a stack argument.  */
3676
  info->stack_offset = cum->stack_words;
3677
  if (doubleword_aligned_p)
3678
    info->stack_offset += info->stack_offset & 1;
3679
 
3680
  max_regs = MAX_ARGS_IN_REGISTERS - info->reg_offset;
3681
 
3682
  /* Partition the argument between registers and stack.  */
3683
  info->reg_words = MIN (num_words, max_regs);
3684
  info->stack_words = num_words - info->reg_words;
3685
}
3686
 
3687
 
3688
/* Implement FUNCTION_ARG_ADVANCE.  */
3689
 
3690
void
3691
function_arg_advance (CUMULATIVE_ARGS *cum, enum machine_mode mode,
3692
                      tree type, int named)
3693
{
3694
  struct mips_arg_info info;
3695
 
3696
  mips_arg_info (cum, mode, type, named, &info);
3697
 
3698
  if (!info.fpr_p)
3699
    cum->gp_reg_found = true;
3700
 
3701
  /* See the comment above the cumulative args structure in mips.h
3702
     for an explanation of what this code does.  It assumes the O32
3703
     ABI, which passes at most 2 arguments in float registers.  */
3704
  if (cum->arg_number < 2 && info.fpr_p)
3705
    cum->fp_code += (mode == SFmode ? 1 : 2) << ((cum->arg_number - 1) * 2);
3706
 
3707
  if (mips_abi != ABI_EABI || !info.fpr_p)
3708
    cum->num_gprs = info.reg_offset + info.reg_words;
3709
  else if (info.reg_words > 0)
3710
    cum->num_fprs += FP_INC;
3711
 
3712
  if (info.stack_words > 0)
3713
    cum->stack_words = info.stack_offset + info.stack_words;
3714
 
3715
  cum->arg_number++;
3716
}
3717
 
3718
/* Implement FUNCTION_ARG.  */
3719
 
3720
struct rtx_def *
3721
function_arg (const CUMULATIVE_ARGS *cum, enum machine_mode mode,
3722
              tree type, int named)
3723
{
3724
  struct mips_arg_info info;
3725
 
3726
  /* We will be called with a mode of VOIDmode after the last argument
3727
     has been seen.  Whatever we return will be passed to the call
3728
     insn.  If we need a mips16 fp_code, return a REG with the code
3729
     stored as the mode.  */
3730
  if (mode == VOIDmode)
3731
    {
3732
      if (TARGET_MIPS16 && cum->fp_code != 0)
3733
        return gen_rtx_REG ((enum machine_mode) cum->fp_code, 0);
3734
 
3735
      else
3736
        return 0;
3737
    }
3738
 
3739
  mips_arg_info (cum, mode, type, named, &info);
3740
 
3741
  /* Return straight away if the whole argument is passed on the stack.  */
3742
  if (info.reg_offset == MAX_ARGS_IN_REGISTERS)
3743
    return 0;
3744
 
3745
  if (type != 0
3746
      && TREE_CODE (type) == RECORD_TYPE
3747
      && TARGET_NEWABI
3748
      && TYPE_SIZE_UNIT (type)
3749
      && host_integerp (TYPE_SIZE_UNIT (type), 1)
3750
      && named)
3751
    {
3752
      /* The Irix 6 n32/n64 ABIs say that if any 64 bit chunk of the
3753
         structure contains a double in its entirety, then that 64 bit
3754
         chunk is passed in a floating point register.  */
3755
      tree field;
3756
 
3757
      /* First check to see if there is any such field.  */
3758
      for (field = TYPE_FIELDS (type); field; field = TREE_CHAIN (field))
3759
        if (TREE_CODE (field) == FIELD_DECL
3760
            && TREE_CODE (TREE_TYPE (field)) == REAL_TYPE
3761
            && TYPE_PRECISION (TREE_TYPE (field)) == BITS_PER_WORD
3762
            && host_integerp (bit_position (field), 0)
3763
            && int_bit_position (field) % BITS_PER_WORD == 0)
3764
          break;
3765
 
3766
      if (field != 0)
3767
        {
3768
          /* Now handle the special case by returning a PARALLEL
3769
             indicating where each 64 bit chunk goes.  INFO.REG_WORDS
3770
             chunks are passed in registers.  */
3771
          unsigned int i;
3772
          HOST_WIDE_INT bitpos;
3773
          rtx ret;
3774
 
3775
          /* assign_parms checks the mode of ENTRY_PARM, so we must
3776
             use the actual mode here.  */
3777
          ret = gen_rtx_PARALLEL (mode, rtvec_alloc (info.reg_words));
3778
 
3779
          bitpos = 0;
3780
          field = TYPE_FIELDS (type);
3781
          for (i = 0; i < info.reg_words; i++)
3782
            {
3783
              rtx reg;
3784
 
3785
              for (; field; field = TREE_CHAIN (field))
3786
                if (TREE_CODE (field) == FIELD_DECL
3787
                    && int_bit_position (field) >= bitpos)
3788
                  break;
3789
 
3790
              if (field
3791
                  && int_bit_position (field) == bitpos
3792
                  && TREE_CODE (TREE_TYPE (field)) == REAL_TYPE
3793
                  && !TARGET_SOFT_FLOAT
3794
                  && TYPE_PRECISION (TREE_TYPE (field)) == BITS_PER_WORD)
3795
                reg = gen_rtx_REG (DFmode, FP_ARG_FIRST + info.reg_offset + i);
3796
              else
3797
                reg = gen_rtx_REG (DImode, GP_ARG_FIRST + info.reg_offset + i);
3798
 
3799
              XVECEXP (ret, 0, i)
3800
                = gen_rtx_EXPR_LIST (VOIDmode, reg,
3801
                                     GEN_INT (bitpos / BITS_PER_UNIT));
3802
 
3803
              bitpos += BITS_PER_WORD;
3804
            }
3805
          return ret;
3806
        }
3807
    }
3808
 
3809
  /* Handle the n32/n64 conventions for passing complex floating-point
3810
     arguments in FPR pairs.  The real part goes in the lower register
3811
     and the imaginary part goes in the upper register.  */
3812
  if (TARGET_NEWABI
3813
      && info.fpr_p
3814
      && GET_MODE_CLASS (mode) == MODE_COMPLEX_FLOAT)
3815
    {
3816
      rtx real, imag;
3817
      enum machine_mode inner;
3818
      int reg;
3819
 
3820
      inner = GET_MODE_INNER (mode);
3821
      reg = FP_ARG_FIRST + info.reg_offset;
3822
      real = gen_rtx_EXPR_LIST (VOIDmode,
3823
                                gen_rtx_REG (inner, reg),
3824
                                const0_rtx);
3825
      imag = gen_rtx_EXPR_LIST (VOIDmode,
3826
                                gen_rtx_REG (inner, reg + info.reg_words / 2),
3827
                                GEN_INT (GET_MODE_SIZE (inner)));
3828
      return gen_rtx_PARALLEL (mode, gen_rtvec (2, real, imag));
3829
    }
3830
 
3831
  if (!info.fpr_p)
3832
    return gen_rtx_REG (mode, GP_ARG_FIRST + info.reg_offset);
3833
  else if (info.reg_offset == 1)
3834
    /* This code handles the special o32 case in which the second word
3835
       of the argument structure is passed in floating-point registers.  */
3836
    return gen_rtx_REG (mode, FP_ARG_FIRST + FP_INC);
3837
  else
3838
    return gen_rtx_REG (mode, FP_ARG_FIRST + info.reg_offset);
3839
}
3840
 
3841
 
3842
/* Implement TARGET_ARG_PARTIAL_BYTES.  */
3843
 
3844
static int
3845
mips_arg_partial_bytes (CUMULATIVE_ARGS *cum,
3846
                        enum machine_mode mode, tree type, bool named)
3847
{
3848
  struct mips_arg_info info;
3849
 
3850
  mips_arg_info (cum, mode, type, named, &info);
3851
  return info.stack_words > 0 ? info.reg_words * UNITS_PER_WORD : 0;
3852
}
3853
 
3854
 
3855
/* Implement FUNCTION_ARG_BOUNDARY.  Every parameter gets at least
3856
   PARM_BOUNDARY bits of alignment, but will be given anything up
3857
   to STACK_BOUNDARY bits if the type requires it.  */
3858
 
3859
int
3860
function_arg_boundary (enum machine_mode mode, tree type)
3861
{
3862
  unsigned int alignment;
3863
 
3864
  alignment = type ? TYPE_ALIGN (type) : GET_MODE_ALIGNMENT (mode);
3865
  if (alignment < PARM_BOUNDARY)
3866
    alignment = PARM_BOUNDARY;
3867
  if (alignment > STACK_BOUNDARY)
3868
    alignment = STACK_BOUNDARY;
3869
  return alignment;
3870
}
3871
 
3872
/* Return true if FUNCTION_ARG_PADDING (MODE, TYPE) should return
3873
   upward rather than downward.  In other words, return true if the
3874
   first byte of the stack slot has useful data, false if the last
3875
   byte does.  */
3876
 
3877
bool
3878
mips_pad_arg_upward (enum machine_mode mode, tree type)
3879
{
3880
  /* On little-endian targets, the first byte of every stack argument
3881
     is passed in the first byte of the stack slot.  */
3882
  if (!BYTES_BIG_ENDIAN)
3883
    return true;
3884
 
3885
  /* Otherwise, integral types are padded downward: the last byte of a
3886
     stack argument is passed in the last byte of the stack slot.  */
3887
  if (type != 0
3888
      ? INTEGRAL_TYPE_P (type) || POINTER_TYPE_P (type)
3889
      : GET_MODE_CLASS (mode) == MODE_INT)
3890
    return false;
3891
 
3892
  /* Big-endian o64 pads floating-point arguments downward.  */
3893
  if (mips_abi == ABI_O64)
3894
    if (type != 0 ? FLOAT_TYPE_P (type) : GET_MODE_CLASS (mode) == MODE_FLOAT)
3895
      return false;
3896
 
3897
  /* Other types are padded upward for o32, o64, n32 and n64.  */
3898
  if (mips_abi != ABI_EABI)
3899
    return true;
3900
 
3901
  /* Arguments smaller than a stack slot are padded downward.  */
3902
  if (mode != BLKmode)
3903
    return (GET_MODE_BITSIZE (mode) >= PARM_BOUNDARY);
3904
  else
3905
    return (int_size_in_bytes (type) >= (PARM_BOUNDARY / BITS_PER_UNIT));
3906
}
3907
 
3908
 
3909
/* Likewise BLOCK_REG_PADDING (MODE, TYPE, ...).  Return !BYTES_BIG_ENDIAN
3910
   if the least significant byte of the register has useful data.  Return
3911
   the opposite if the most significant byte does.  */
3912
 
3913
bool
3914
mips_pad_reg_upward (enum machine_mode mode, tree type)
3915
{
3916
  /* No shifting is required for floating-point arguments.  */
3917
  if (type != 0 ? FLOAT_TYPE_P (type) : GET_MODE_CLASS (mode) == MODE_FLOAT)
3918
    return !BYTES_BIG_ENDIAN;
3919
 
3920
  /* Otherwise, apply the same padding to register arguments as we do
3921
     to stack arguments.  */
3922
  return mips_pad_arg_upward (mode, type);
3923
}
3924
 
3925
static void
3926
mips_setup_incoming_varargs (CUMULATIVE_ARGS *cum, enum machine_mode mode,
3927
                             tree type, int *pretend_size ATTRIBUTE_UNUSED,
3928
                             int no_rtl)
3929
{
3930
  CUMULATIVE_ARGS local_cum;
3931
  int gp_saved, fp_saved;
3932
 
3933
  /* The caller has advanced CUM up to, but not beyond, the last named
3934
     argument.  Advance a local copy of CUM past the last "real" named
3935
     argument, to find out how many registers are left over.  */
3936
 
3937
  local_cum = *cum;
3938
  FUNCTION_ARG_ADVANCE (local_cum, mode, type, 1);
3939
 
3940
  /* Found out how many registers we need to save.  */
3941
  gp_saved = MAX_ARGS_IN_REGISTERS - local_cum.num_gprs;
3942
  fp_saved = (EABI_FLOAT_VARARGS_P
3943
              ? MAX_ARGS_IN_REGISTERS - local_cum.num_fprs
3944
              : 0);
3945
 
3946
  if (!no_rtl)
3947
    {
3948
      if (gp_saved > 0)
3949
        {
3950
          rtx ptr, mem;
3951
 
3952
          ptr = plus_constant (virtual_incoming_args_rtx,
3953
                               REG_PARM_STACK_SPACE (cfun->decl)
3954
                               - gp_saved * UNITS_PER_WORD);
3955
          mem = gen_rtx_MEM (BLKmode, ptr);
3956
          set_mem_alias_set (mem, get_varargs_alias_set ());
3957
 
3958
          move_block_from_reg (local_cum.num_gprs + GP_ARG_FIRST,
3959
                               mem, gp_saved);
3960
        }
3961
      if (fp_saved > 0)
3962
        {
3963
          /* We can't use move_block_from_reg, because it will use
3964
             the wrong mode.  */
3965
          enum machine_mode mode;
3966
          int off, i;
3967
 
3968
          /* Set OFF to the offset from virtual_incoming_args_rtx of
3969
             the first float register.  The FP save area lies below
3970
             the integer one, and is aligned to UNITS_PER_FPVALUE bytes.  */
3971
          off = -gp_saved * UNITS_PER_WORD;
3972
          off &= ~(UNITS_PER_FPVALUE - 1);
3973
          off -= fp_saved * UNITS_PER_FPREG;
3974
 
3975
          mode = TARGET_SINGLE_FLOAT ? SFmode : DFmode;
3976
 
3977
          for (i = local_cum.num_fprs; i < MAX_ARGS_IN_REGISTERS; i += FP_INC)
3978
            {
3979
              rtx ptr, mem;
3980
 
3981
              ptr = plus_constant (virtual_incoming_args_rtx, off);
3982
              mem = gen_rtx_MEM (mode, ptr);
3983
              set_mem_alias_set (mem, get_varargs_alias_set ());
3984
              emit_move_insn (mem, gen_rtx_REG (mode, FP_ARG_FIRST + i));
3985
              off += UNITS_PER_HWFPVALUE;
3986
            }
3987
        }
3988
    }
3989
  if (REG_PARM_STACK_SPACE (cfun->decl) == 0)
3990
    cfun->machine->varargs_size = (gp_saved * UNITS_PER_WORD
3991
                                   + fp_saved * UNITS_PER_FPREG);
3992
}
3993
 
3994
/* Create the va_list data type.
3995
   We keep 3 pointers, and two offsets.
3996
   Two pointers are to the overflow area, which starts at the CFA.
3997
     One of these is constant, for addressing into the GPR save area below it.
3998
     The other is advanced up the stack through the overflow region.
3999
   The third pointer is to the GPR save area.  Since the FPR save area
4000
     is just below it, we can address FPR slots off this pointer.
4001
   We also keep two one-byte offsets, which are to be subtracted from the
4002
     constant pointers to yield addresses in the GPR and FPR save areas.
4003
     These are downcounted as float or non-float arguments are used,
4004
     and when they get to zero, the argument must be obtained from the
4005
     overflow region.
4006
   If !EABI_FLOAT_VARARGS_P, then no FPR save area exists, and a single
4007
     pointer is enough.  It's started at the GPR save area, and is
4008
     advanced, period.
4009
   Note that the GPR save area is not constant size, due to optimization
4010
     in the prologue.  Hence, we can't use a design with two pointers
4011
     and two offsets, although we could have designed this with two pointers
4012
     and three offsets.  */
4013
 
4014
static tree
4015
mips_build_builtin_va_list (void)
4016
{
4017
  if (EABI_FLOAT_VARARGS_P)
4018
    {
4019
      tree f_ovfl, f_gtop, f_ftop, f_goff, f_foff, f_res, record;
4020
      tree array, index;
4021
 
4022
      record = (*lang_hooks.types.make_type) (RECORD_TYPE);
4023
 
4024
      f_ovfl = build_decl (FIELD_DECL, get_identifier ("__overflow_argptr"),
4025
                          ptr_type_node);
4026
      f_gtop = build_decl (FIELD_DECL, get_identifier ("__gpr_top"),
4027
                          ptr_type_node);
4028
      f_ftop = build_decl (FIELD_DECL, get_identifier ("__fpr_top"),
4029
                          ptr_type_node);
4030
      f_goff = build_decl (FIELD_DECL, get_identifier ("__gpr_offset"),
4031
                          unsigned_char_type_node);
4032
      f_foff = build_decl (FIELD_DECL, get_identifier ("__fpr_offset"),
4033
                          unsigned_char_type_node);
4034
      /* Explicitly pad to the size of a pointer, so that -Wpadded won't
4035
         warn on every user file.  */
4036
      index = build_int_cst (NULL_TREE, GET_MODE_SIZE (ptr_mode) - 2 - 1);
4037
      array = build_array_type (unsigned_char_type_node,
4038
                                build_index_type (index));
4039
      f_res = build_decl (FIELD_DECL, get_identifier ("__reserved"), array);
4040
 
4041
      DECL_FIELD_CONTEXT (f_ovfl) = record;
4042
      DECL_FIELD_CONTEXT (f_gtop) = record;
4043
      DECL_FIELD_CONTEXT (f_ftop) = record;
4044
      DECL_FIELD_CONTEXT (f_goff) = record;
4045
      DECL_FIELD_CONTEXT (f_foff) = record;
4046
      DECL_FIELD_CONTEXT (f_res) = record;
4047
 
4048
      TYPE_FIELDS (record) = f_ovfl;
4049
      TREE_CHAIN (f_ovfl) = f_gtop;
4050
      TREE_CHAIN (f_gtop) = f_ftop;
4051
      TREE_CHAIN (f_ftop) = f_goff;
4052
      TREE_CHAIN (f_goff) = f_foff;
4053
      TREE_CHAIN (f_foff) = f_res;
4054
 
4055
      layout_type (record);
4056
      return record;
4057
    }
4058
  else if (TARGET_IRIX && TARGET_IRIX6)
4059
    /* On IRIX 6, this type is 'char *'.  */
4060
    return build_pointer_type (char_type_node);
4061
  else
4062
    /* Otherwise, we use 'void *'.  */
4063
    return ptr_type_node;
4064
}
4065
 
4066
/* Implement va_start.  */
4067
 
4068
void
4069
mips_va_start (tree valist, rtx nextarg)
4070
{
4071
  if (EABI_FLOAT_VARARGS_P)
4072
    {
4073
      const CUMULATIVE_ARGS *cum;
4074
      tree f_ovfl, f_gtop, f_ftop, f_goff, f_foff;
4075
      tree ovfl, gtop, ftop, goff, foff;
4076
      tree t;
4077
      int gpr_save_area_size;
4078
      int fpr_save_area_size;
4079
      int fpr_offset;
4080
 
4081
      cum = &current_function_args_info;
4082
      gpr_save_area_size
4083
        = (MAX_ARGS_IN_REGISTERS - cum->num_gprs) * UNITS_PER_WORD;
4084
      fpr_save_area_size
4085
        = (MAX_ARGS_IN_REGISTERS - cum->num_fprs) * UNITS_PER_FPREG;
4086
 
4087
      f_ovfl = TYPE_FIELDS (va_list_type_node);
4088
      f_gtop = TREE_CHAIN (f_ovfl);
4089
      f_ftop = TREE_CHAIN (f_gtop);
4090
      f_goff = TREE_CHAIN (f_ftop);
4091
      f_foff = TREE_CHAIN (f_goff);
4092
 
4093
      ovfl = build (COMPONENT_REF, TREE_TYPE (f_ovfl), valist, f_ovfl,
4094
                    NULL_TREE);
4095
      gtop = build (COMPONENT_REF, TREE_TYPE (f_gtop), valist, f_gtop,
4096
                    NULL_TREE);
4097
      ftop = build (COMPONENT_REF, TREE_TYPE (f_ftop), valist, f_ftop,
4098
                    NULL_TREE);
4099
      goff = build (COMPONENT_REF, TREE_TYPE (f_goff), valist, f_goff,
4100
                    NULL_TREE);
4101
      foff = build (COMPONENT_REF, TREE_TYPE (f_foff), valist, f_foff,
4102
                    NULL_TREE);
4103
 
4104
      /* Emit code to initialize OVFL, which points to the next varargs
4105
         stack argument.  CUM->STACK_WORDS gives the number of stack
4106
         words used by named arguments.  */
4107
      t = make_tree (TREE_TYPE (ovfl), virtual_incoming_args_rtx);
4108
      if (cum->stack_words > 0)
4109
        t = build (PLUS_EXPR, TREE_TYPE (ovfl), t,
4110
                   build_int_cst (NULL_TREE,
4111
                                  cum->stack_words * UNITS_PER_WORD));
4112
      t = build (MODIFY_EXPR, TREE_TYPE (ovfl), ovfl, t);
4113
      expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
4114
 
4115
      /* Emit code to initialize GTOP, the top of the GPR save area.  */
4116
      t = make_tree (TREE_TYPE (gtop), virtual_incoming_args_rtx);
4117
      t = build (MODIFY_EXPR, TREE_TYPE (gtop), gtop, t);
4118
      expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
4119
 
4120
      /* Emit code to initialize FTOP, the top of the FPR save area.
4121
         This address is gpr_save_area_bytes below GTOP, rounded
4122
         down to the next fp-aligned boundary.  */
4123
      t = make_tree (TREE_TYPE (ftop), virtual_incoming_args_rtx);
4124
      fpr_offset = gpr_save_area_size + UNITS_PER_FPVALUE - 1;
4125
      fpr_offset &= ~(UNITS_PER_FPVALUE - 1);
4126
      if (fpr_offset)
4127
        t = build (PLUS_EXPR, TREE_TYPE (ftop), t,
4128
                   build_int_cst (NULL_TREE, -fpr_offset));
4129
      t = build (MODIFY_EXPR, TREE_TYPE (ftop), ftop, t);
4130
      expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
4131
 
4132
      /* Emit code to initialize GOFF, the offset from GTOP of the
4133
         next GPR argument.  */
4134
      t = build (MODIFY_EXPR, TREE_TYPE (goff), goff,
4135
                 build_int_cst (NULL_TREE, gpr_save_area_size));
4136
      expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
4137
 
4138
      /* Likewise emit code to initialize FOFF, the offset from FTOP
4139
         of the next FPR argument.  */
4140
      t = build (MODIFY_EXPR, TREE_TYPE (foff), foff,
4141
                 build_int_cst (NULL_TREE, fpr_save_area_size));
4142
      expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
4143
    }
4144
  else
4145
    {
4146
      nextarg = plus_constant (nextarg, -cfun->machine->varargs_size);
4147
      std_expand_builtin_va_start (valist, nextarg);
4148
    }
4149
}
4150
 
4151
/* Implement va_arg.  */
4152
 
4153
static tree
4154
mips_gimplify_va_arg_expr (tree valist, tree type, tree *pre_p, tree *post_p)
4155
{
4156
  HOST_WIDE_INT size, rsize;
4157
  tree addr;
4158
  bool indirect;
4159
 
4160
  indirect = pass_by_reference (NULL, TYPE_MODE (type), type, 0);
4161
 
4162
  if (indirect)
4163
    type = build_pointer_type (type);
4164
 
4165
  size = int_size_in_bytes (type);
4166
  rsize = (size + UNITS_PER_WORD - 1) & -UNITS_PER_WORD;
4167
 
4168
  if (mips_abi != ABI_EABI || !EABI_FLOAT_VARARGS_P)
4169
    addr = std_gimplify_va_arg_expr (valist, type, pre_p, post_p);
4170
  else
4171
    {
4172
      /* Not a simple merged stack.      */
4173
 
4174
      tree f_ovfl, f_gtop, f_ftop, f_goff, f_foff;
4175
      tree ovfl, top, off, align;
4176
      HOST_WIDE_INT osize;
4177
      tree t, u;
4178
 
4179
      f_ovfl = TYPE_FIELDS (va_list_type_node);
4180
      f_gtop = TREE_CHAIN (f_ovfl);
4181
      f_ftop = TREE_CHAIN (f_gtop);
4182
      f_goff = TREE_CHAIN (f_ftop);
4183
      f_foff = TREE_CHAIN (f_goff);
4184
 
4185
      /* We maintain separate pointers and offsets for floating-point
4186
         and integer arguments, but we need similar code in both cases.
4187
         Let:
4188
 
4189
         TOP be the top of the register save area;
4190
         OFF be the offset from TOP of the next register;
4191
         ADDR_RTX be the address of the argument;
4192
         RSIZE be the number of bytes used to store the argument
4193
         when it's in the register save area;
4194
         OSIZE be the number of bytes used to store it when it's
4195
         in the stack overflow area; and
4196
         PADDING be (BYTES_BIG_ENDIAN ? OSIZE - RSIZE : 0)
4197
 
4198
         The code we want is:
4199
 
4200
         1: off &= -rsize;        // round down
4201
         2: if (off != 0)
4202
         3:   {
4203
         4:      addr_rtx = top - off;
4204
         5:      off -= rsize;
4205
         6:   }
4206
         7: else
4207
         8:   {
4208
         9:      ovfl += ((intptr_t) ovfl + osize - 1) & -osize;
4209
         10:     addr_rtx = ovfl + PADDING;
4210
         11:     ovfl += osize;
4211
         14:   }
4212
 
4213
         [1] and [9] can sometimes be optimized away.  */
4214
 
4215
      ovfl = build (COMPONENT_REF, TREE_TYPE (f_ovfl), valist, f_ovfl,
4216
                    NULL_TREE);
4217
 
4218
      if (GET_MODE_CLASS (TYPE_MODE (type)) == MODE_FLOAT
4219
          && GET_MODE_SIZE (TYPE_MODE (type)) <= UNITS_PER_FPVALUE)
4220
        {
4221
          top = build (COMPONENT_REF, TREE_TYPE (f_ftop), valist, f_ftop,
4222
                       NULL_TREE);
4223
          off = build (COMPONENT_REF, TREE_TYPE (f_foff), valist, f_foff,
4224
                       NULL_TREE);
4225
 
4226
          /* When floating-point registers are saved to the stack,
4227
             each one will take up UNITS_PER_HWFPVALUE bytes, regardless
4228
             of the float's precision.  */
4229
          rsize = UNITS_PER_HWFPVALUE;
4230
 
4231
          /* Overflow arguments are padded to UNITS_PER_WORD bytes
4232
             (= PARM_BOUNDARY bits).  This can be different from RSIZE
4233
             in two cases:
4234
 
4235
             (1) On 32-bit targets when TYPE is a structure such as:
4236
 
4237
             struct s { float f; };
4238
 
4239
             Such structures are passed in paired FPRs, so RSIZE
4240
             will be 8 bytes.  However, the structure only takes
4241
             up 4 bytes of memory, so OSIZE will only be 4.
4242
 
4243
             (2) In combinations such as -mgp64 -msingle-float
4244
             -fshort-double.  Doubles passed in registers
4245
             will then take up 4 (UNITS_PER_HWFPVALUE) bytes,
4246
             but those passed on the stack take up
4247
             UNITS_PER_WORD bytes.  */
4248
          osize = MAX (GET_MODE_SIZE (TYPE_MODE (type)), UNITS_PER_WORD);
4249
        }
4250
      else
4251
        {
4252
          top = build (COMPONENT_REF, TREE_TYPE (f_gtop), valist, f_gtop,
4253
                       NULL_TREE);
4254
          off = build (COMPONENT_REF, TREE_TYPE (f_goff), valist, f_goff,
4255
                       NULL_TREE);
4256
          if (rsize > UNITS_PER_WORD)
4257
            {
4258
              /* [1] Emit code for: off &= -rsize.      */
4259
              t = build (BIT_AND_EXPR, TREE_TYPE (off), off,
4260
                         build_int_cst (NULL_TREE, -rsize));
4261
              t = build (MODIFY_EXPR, TREE_TYPE (off), off, t);
4262
              gimplify_and_add (t, pre_p);
4263
            }
4264
          osize = rsize;
4265
        }
4266
 
4267
      /* [2] Emit code to branch if off == 0.  */
4268
      t = build (NE_EXPR, boolean_type_node, off,
4269
                 build_int_cst (TREE_TYPE (off), 0));
4270
      addr = build (COND_EXPR, ptr_type_node, t, NULL, NULL);
4271
 
4272
      /* [5] Emit code for: off -= rsize.  We do this as a form of
4273
         post-increment not available to C.  Also widen for the
4274
         coming pointer arithmetic.  */
4275
      t = fold_convert (TREE_TYPE (off), build_int_cst (NULL_TREE, rsize));
4276
      t = build (POSTDECREMENT_EXPR, TREE_TYPE (off), off, t);
4277
      t = fold_convert (sizetype, t);
4278
      t = fold_convert (TREE_TYPE (top), t);
4279
 
4280
      /* [4] Emit code for: addr_rtx = top - off.  On big endian machines,
4281
         the argument has RSIZE - SIZE bytes of leading padding.  */
4282
      t = build (MINUS_EXPR, TREE_TYPE (top), top, t);
4283
      if (BYTES_BIG_ENDIAN && rsize > size)
4284
        {
4285
          u = fold_convert (TREE_TYPE (t), build_int_cst (NULL_TREE,
4286
                                                          rsize - size));
4287
          t = build (PLUS_EXPR, TREE_TYPE (t), t, u);
4288
        }
4289
      COND_EXPR_THEN (addr) = t;
4290
 
4291
      if (osize > UNITS_PER_WORD)
4292
        {
4293
          /* [9] Emit: ovfl += ((intptr_t) ovfl + osize - 1) & -osize.  */
4294
          u = fold_convert (TREE_TYPE (ovfl),
4295
                            build_int_cst (NULL_TREE, osize - 1));
4296
          t = build (PLUS_EXPR, TREE_TYPE (ovfl), ovfl, u);
4297
          u = fold_convert (TREE_TYPE (ovfl),
4298
                            build_int_cst (NULL_TREE, -osize));
4299
          t = build (BIT_AND_EXPR, TREE_TYPE (ovfl), t, u);
4300
          align = build (MODIFY_EXPR, TREE_TYPE (ovfl), ovfl, t);
4301
        }
4302
      else
4303
        align = NULL;
4304
 
4305
      /* [10, 11].      Emit code to store ovfl in addr_rtx, then
4306
         post-increment ovfl by osize.  On big-endian machines,
4307
         the argument has OSIZE - SIZE bytes of leading padding.  */
4308
      u = fold_convert (TREE_TYPE (ovfl),
4309
                        build_int_cst (NULL_TREE, osize));
4310
      t = build (POSTINCREMENT_EXPR, TREE_TYPE (ovfl), ovfl, u);
4311
      if (BYTES_BIG_ENDIAN && osize > size)
4312
        {
4313
          u = fold_convert (TREE_TYPE (t),
4314
                            build_int_cst (NULL_TREE, osize - size));
4315
          t = build (PLUS_EXPR, TREE_TYPE (t), t, u);
4316
        }
4317
 
4318
      /* String [9] and [10,11] together.  */
4319
      if (align)
4320
        t = build (COMPOUND_EXPR, TREE_TYPE (t), align, t);
4321
      COND_EXPR_ELSE (addr) = t;
4322
 
4323
      addr = fold_convert (build_pointer_type (type), addr);
4324
      addr = build_va_arg_indirect_ref (addr);
4325
    }
4326
 
4327
  if (indirect)
4328
    addr = build_va_arg_indirect_ref (addr);
4329
 
4330
  return addr;
4331
}
4332
 
4333
/* Return true if it is possible to use left/right accesses for a
4334
   bitfield of WIDTH bits starting BITPOS bits into *OP.  When
4335
   returning true, update *OP, *LEFT and *RIGHT as follows:
4336
 
4337
   *OP is a BLKmode reference to the whole field.
4338
 
4339
   *LEFT is a QImode reference to the first byte if big endian or
4340
   the last byte if little endian.  This address can be used in the
4341
   left-side instructions (lwl, swl, ldl, sdl).
4342
 
4343
   *RIGHT is a QImode reference to the opposite end of the field and
4344
   can be used in the patterning right-side instruction.  */
4345
 
4346
static bool
4347
mips_get_unaligned_mem (rtx *op, unsigned int width, int bitpos,
4348
                        rtx *left, rtx *right)
4349
{
4350
  rtx first, last;
4351
 
4352
  /* Check that the operand really is a MEM.  Not all the extv and
4353
     extzv predicates are checked.  */
4354
  if (!MEM_P (*op))
4355
    return false;
4356
 
4357
  /* Check that the size is valid.  */
4358
  if (width != 32 && (!TARGET_64BIT || width != 64))
4359
    return false;
4360
 
4361
  /* We can only access byte-aligned values.  Since we are always passed
4362
     a reference to the first byte of the field, it is not necessary to
4363
     do anything with BITPOS after this check.  */
4364
  if (bitpos % BITS_PER_UNIT != 0)
4365
    return false;
4366
 
4367
  /* Reject aligned bitfields: we want to use a normal load or store
4368
     instead of a left/right pair.  */
4369
  if (MEM_ALIGN (*op) >= width)
4370
    return false;
4371
 
4372
  /* Adjust *OP to refer to the whole field.  This also has the effect
4373
     of legitimizing *OP's address for BLKmode, possibly simplifying it.  */
4374
  *op = adjust_address (*op, BLKmode, 0);
4375
  set_mem_size (*op, GEN_INT (width / BITS_PER_UNIT));
4376
 
4377
  /* Get references to both ends of the field.  We deliberately don't
4378
     use the original QImode *OP for FIRST since the new BLKmode one
4379
     might have a simpler address.  */
4380
  first = adjust_address (*op, QImode, 0);
4381
  last = adjust_address (*op, QImode, width / BITS_PER_UNIT - 1);
4382
 
4383
  /* Allocate to LEFT and RIGHT according to endianness.  LEFT should
4384
     be the upper word and RIGHT the lower word.  */
4385
  if (TARGET_BIG_ENDIAN)
4386
    *left = first, *right = last;
4387
  else
4388
    *left = last, *right = first;
4389
 
4390
  return true;
4391
}
4392
 
4393
 
4394
/* Try to emit the equivalent of (set DEST (zero_extract SRC WIDTH BITPOS)).
4395
   Return true on success.  We only handle cases where zero_extract is
4396
   equivalent to sign_extract.  */
4397
 
4398
bool
4399
mips_expand_unaligned_load (rtx dest, rtx src, unsigned int width, int bitpos)
4400
{
4401
  rtx left, right, temp;
4402
 
4403
  /* If TARGET_64BIT, the destination of a 32-bit load will be a
4404
     paradoxical word_mode subreg.  This is the only case in which
4405
     we allow the destination to be larger than the source.  */
4406
  if (GET_CODE (dest) == SUBREG
4407
      && GET_MODE (dest) == DImode
4408
      && SUBREG_BYTE (dest) == 0
4409
      && GET_MODE (SUBREG_REG (dest)) == SImode)
4410
    dest = SUBREG_REG (dest);
4411
 
4412
  /* After the above adjustment, the destination must be the same
4413
     width as the source.  */
4414
  if (GET_MODE_BITSIZE (GET_MODE (dest)) != width)
4415
    return false;
4416
 
4417
  if (!mips_get_unaligned_mem (&src, width, bitpos, &left, &right))
4418
    return false;
4419
 
4420
  temp = gen_reg_rtx (GET_MODE (dest));
4421
  if (GET_MODE (dest) == DImode)
4422
    {
4423
      emit_insn (gen_mov_ldl (temp, src, left));
4424
      emit_insn (gen_mov_ldr (dest, copy_rtx (src), right, temp));
4425
    }
4426
  else
4427
    {
4428
      emit_insn (gen_mov_lwl (temp, src, left));
4429
      emit_insn (gen_mov_lwr (dest, copy_rtx (src), right, temp));
4430
    }
4431
  return true;
4432
}
4433
 
4434
 
4435
/* Try to expand (set (zero_extract DEST WIDTH BITPOS) SRC).  Return
4436
   true on success.  */
4437
 
4438
bool
4439
mips_expand_unaligned_store (rtx dest, rtx src, unsigned int width, int bitpos)
4440
{
4441
  rtx left, right;
4442
 
4443
  if (!mips_get_unaligned_mem (&dest, width, bitpos, &left, &right))
4444
    return false;
4445
 
4446
  src = gen_lowpart (mode_for_size (width, MODE_INT, 0), src);
4447
 
4448
  if (GET_MODE (src) == DImode)
4449
    {
4450
      emit_insn (gen_mov_sdl (dest, src, left));
4451
      emit_insn (gen_mov_sdr (copy_rtx (dest), copy_rtx (src), right));
4452
    }
4453
  else
4454
    {
4455
      emit_insn (gen_mov_swl (dest, src, left));
4456
      emit_insn (gen_mov_swr (copy_rtx (dest), copy_rtx (src), right));
4457
    }
4458
  return true;
4459
}
4460
 
4461
/* Return true if (zero_extract OP SIZE POSITION) can be used as the
4462
   source of an "ext" instruction or the destination of an "ins"
4463
   instruction.  OP must be a register operand and the following
4464
   conditions must hold:
4465
 
4466
 
4467
 
4468
 
4469
 
4470
   Also reject lengths equal to a word as they are better handled
4471
   by the move patterns.  */
4472
 
4473
bool
4474
mips_use_ins_ext_p (rtx op, rtx size, rtx position)
4475
{
4476
  HOST_WIDE_INT len, pos;
4477
 
4478
  if (!ISA_HAS_EXT_INS
4479
      || !register_operand (op, VOIDmode)
4480
      || GET_MODE_BITSIZE (GET_MODE (op)) > BITS_PER_WORD)
4481
    return false;
4482
 
4483
  len = INTVAL (size);
4484
  pos = INTVAL (position);
4485
 
4486
  if (len <= 0 || len >= GET_MODE_BITSIZE (GET_MODE (op))
4487
      || pos < 0 || pos + len > GET_MODE_BITSIZE (GET_MODE (op)))
4488
    return false;
4489
 
4490
  return true;
4491
}
4492
 
4493
/* Set up globals to generate code for the ISA or processor
4494
   described by INFO.  */
4495
 
4496
static void
4497
mips_set_architecture (const struct mips_cpu_info *info)
4498
{
4499
  if (info != 0)
4500
    {
4501
      mips_arch_info = info;
4502
      mips_arch = info->cpu;
4503
      mips_isa = info->isa;
4504
    }
4505
}
4506
 
4507
 
4508
/* Likewise for tuning.  */
4509
 
4510
static void
4511
mips_set_tune (const struct mips_cpu_info *info)
4512
{
4513
  if (info != 0)
4514
    {
4515
      mips_tune_info = info;
4516
      mips_tune = info->cpu;
4517
    }
4518
}
4519
 
4520
/* Implement TARGET_HANDLE_OPTION.  */
4521
 
4522
static bool
4523
mips_handle_option (size_t code, const char *arg, int value ATTRIBUTE_UNUSED)
4524
{
4525
  switch (code)
4526
    {
4527
    case OPT_mabi_:
4528
      if (strcmp (arg, "32") == 0)
4529
        mips_abi = ABI_32;
4530
      else if (strcmp (arg, "o64") == 0)
4531
        mips_abi = ABI_O64;
4532
      else if (strcmp (arg, "n32") == 0)
4533
        mips_abi = ABI_N32;
4534
      else if (strcmp (arg, "64") == 0)
4535
        mips_abi = ABI_64;
4536
      else if (strcmp (arg, "eabi") == 0)
4537
        mips_abi = ABI_EABI;
4538
      else
4539
        return false;
4540
      return true;
4541
 
4542
    case OPT_march_:
4543
    case OPT_mtune_:
4544
      return mips_parse_cpu (arg) != 0;
4545
 
4546
    case OPT_mips:
4547
      mips_isa_info = mips_parse_cpu (ACONCAT (("mips", arg, NULL)));
4548
      return mips_isa_info != 0;
4549
 
4550
    case OPT_mno_flush_func:
4551
      mips_cache_flush_func = NULL;
4552
      return true;
4553
 
4554
    default:
4555
      return true;
4556
    }
4557
}
4558
 
4559
/* Set up the threshold for data to go into the small data area, instead
4560
   of the normal data area, and detect any conflicts in the switches.  */
4561
 
4562
void
4563
override_options (void)
4564
{
4565
  int i, start, regno;
4566
  enum machine_mode mode;
4567
 
4568
  mips_section_threshold = g_switch_set ? g_switch_value : MIPS_DEFAULT_GVALUE;
4569
 
4570
  /* The following code determines the architecture and register size.
4571
     Similar code was added to GAS 2.14 (see tc-mips.c:md_after_parse_args()).
4572
     The GAS and GCC code should be kept in sync as much as possible.  */
4573
 
4574
  if (mips_arch_string != 0)
4575
    mips_set_architecture (mips_parse_cpu (mips_arch_string));
4576
 
4577
  if (mips_isa_info != 0)
4578
    {
4579
      if (mips_arch_info == 0)
4580
        mips_set_architecture (mips_isa_info);
4581
      else if (mips_arch_info->isa != mips_isa_info->isa)
4582
        error ("-%s conflicts with the other architecture options, "
4583
               "which specify a %s processor",
4584
               mips_isa_info->name,
4585
               mips_cpu_info_from_isa (mips_arch_info->isa)->name);
4586
    }
4587
 
4588
  if (mips_arch_info == 0)
4589
    {
4590
#ifdef MIPS_CPU_STRING_DEFAULT
4591
      mips_set_architecture (mips_parse_cpu (MIPS_CPU_STRING_DEFAULT));
4592
#else
4593
      mips_set_architecture (mips_cpu_info_from_isa (MIPS_ISA_DEFAULT));
4594
#endif
4595
    }
4596
 
4597
  if (ABI_NEEDS_64BIT_REGS && !ISA_HAS_64BIT_REGS)
4598
    error ("-march=%s is not compatible with the selected ABI",
4599
           mips_arch_info->name);
4600
 
4601
  /* Optimize for mips_arch, unless -mtune selects a different processor.  */
4602
  if (mips_tune_string != 0)
4603
    mips_set_tune (mips_parse_cpu (mips_tune_string));
4604
 
4605
  if (mips_tune_info == 0)
4606
    mips_set_tune (mips_arch_info);
4607
 
4608
  /* Set cost structure for the processor.  */
4609
  mips_cost = &mips_rtx_cost_data[mips_tune];
4610
 
4611
  if ((target_flags_explicit & MASK_64BIT) != 0)
4612
    {
4613
      /* The user specified the size of the integer registers.  Make sure
4614
         it agrees with the ABI and ISA.  */
4615
      if (TARGET_64BIT && !ISA_HAS_64BIT_REGS)
4616
        error ("-mgp64 used with a 32-bit processor");
4617
      else if (!TARGET_64BIT && ABI_NEEDS_64BIT_REGS)
4618
        error ("-mgp32 used with a 64-bit ABI");
4619
      else if (TARGET_64BIT && ABI_NEEDS_32BIT_REGS)
4620
        error ("-mgp64 used with a 32-bit ABI");
4621
    }
4622
  else
4623
    {
4624
      /* Infer the integer register size from the ABI and processor.
4625
         Restrict ourselves to 32-bit registers if that's all the
4626
         processor has, or if the ABI cannot handle 64-bit registers.  */
4627
      if (ABI_NEEDS_32BIT_REGS || !ISA_HAS_64BIT_REGS)
4628
        target_flags &= ~MASK_64BIT;
4629
      else
4630
        target_flags |= MASK_64BIT;
4631
    }
4632
 
4633
  if ((target_flags_explicit & MASK_FLOAT64) != 0)
4634
    {
4635
      /* Really, -mfp32 and -mfp64 are ornamental options.  There's
4636
         only one right answer here.  */
4637
      if (TARGET_64BIT && TARGET_DOUBLE_FLOAT && !TARGET_FLOAT64)
4638
        error ("unsupported combination: %s", "-mgp64 -mfp32 -mdouble-float");
4639
      else if (!TARGET_64BIT && TARGET_FLOAT64)
4640
        error ("unsupported combination: %s", "-mgp32 -mfp64");
4641
      else if (TARGET_SINGLE_FLOAT && TARGET_FLOAT64)
4642
        error ("unsupported combination: %s", "-mfp64 -msingle-float");
4643
    }
4644
  else
4645
    {
4646
      /* -msingle-float selects 32-bit float registers.  Otherwise the
4647
         float registers should be the same size as the integer ones.  */
4648
      if (TARGET_64BIT && TARGET_DOUBLE_FLOAT)
4649
        target_flags |= MASK_FLOAT64;
4650
      else
4651
        target_flags &= ~MASK_FLOAT64;
4652
    }
4653
 
4654
  /* End of code shared with GAS.  */
4655
 
4656
  if ((target_flags_explicit & MASK_LONG64) == 0)
4657
    {
4658
      if ((mips_abi == ABI_EABI && TARGET_64BIT) || mips_abi == ABI_64)
4659
        target_flags |= MASK_LONG64;
4660
      else
4661
        target_flags &= ~MASK_LONG64;
4662
    }
4663
 
4664
  if (MIPS_MARCH_CONTROLS_SOFT_FLOAT
4665
      && (target_flags_explicit & MASK_SOFT_FLOAT) == 0)
4666
    {
4667
      /* For some configurations, it is useful to have -march control
4668
         the default setting of MASK_SOFT_FLOAT.  */
4669
      switch ((int) mips_arch)
4670
        {
4671
        case PROCESSOR_R4100:
4672
        case PROCESSOR_R4111:
4673
        case PROCESSOR_R4120:
4674
        case PROCESSOR_R4130:
4675
          target_flags |= MASK_SOFT_FLOAT;
4676
          break;
4677
 
4678
        default:
4679
          target_flags &= ~MASK_SOFT_FLOAT;
4680
          break;
4681
        }
4682
    }
4683
 
4684
  if (!TARGET_OLDABI)
4685
    flag_pcc_struct_return = 0;
4686
 
4687
  if ((target_flags_explicit & MASK_BRANCHLIKELY) == 0)
4688
    {
4689
      /* If neither -mbranch-likely nor -mno-branch-likely was given
4690
         on the command line, set MASK_BRANCHLIKELY based on the target
4691
         architecture.
4692
 
4693
         By default, we enable use of Branch Likely instructions on
4694
         all architectures which support them with the following
4695
         exceptions: when creating MIPS32 or MIPS64 code, and when
4696
         tuning for architectures where their use tends to hurt
4697
         performance.
4698
 
4699
         The MIPS32 and MIPS64 architecture specifications say "Software
4700
         is strongly encouraged to avoid use of Branch Likely
4701
         instructions, as they will be removed from a future revision
4702
         of the [MIPS32 and MIPS64] architecture."  Therefore, we do not
4703
         issue those instructions unless instructed to do so by
4704
         -mbranch-likely.  */
4705
      if (ISA_HAS_BRANCHLIKELY
4706
          && !(ISA_MIPS32 || ISA_MIPS32R2 || ISA_MIPS64)
4707
          && !(TUNE_MIPS5500 || TUNE_SB1))
4708
        target_flags |= MASK_BRANCHLIKELY;
4709
      else
4710
        target_flags &= ~MASK_BRANCHLIKELY;
4711
    }
4712
  if (TARGET_BRANCHLIKELY && !ISA_HAS_BRANCHLIKELY)
4713
    warning (0, "generation of Branch Likely instructions enabled, but not supported by architecture");
4714
 
4715
  /* The effect of -mabicalls isn't defined for the EABI.  */
4716
  if (mips_abi == ABI_EABI && TARGET_ABICALLS)
4717
    {
4718
      error ("unsupported combination: %s", "-mabicalls -mabi=eabi");
4719
      target_flags &= ~MASK_ABICALLS;
4720
    }
4721
 
4722
  /* -fpic (-KPIC) is the default when TARGET_ABICALLS is defined.  We need
4723
     to set flag_pic so that the LEGITIMATE_PIC_OPERAND_P macro will work.  */
4724
  /* ??? -non_shared turns off pic code generation, but this is not
4725
     implemented.  */
4726
  if (TARGET_ABICALLS)
4727
    {
4728
      flag_pic = 1;
4729
      if (mips_section_threshold > 0)
4730
        warning (0, "-G is incompatible with PIC code which is the default");
4731
    }
4732
 
4733
  /* mips_split_addresses is a half-way house between explicit
4734
     relocations and the traditional assembler macros.  It can
4735
     split absolute 32-bit symbolic constants into a high/lo_sum
4736
     pair but uses macros for other sorts of access.
4737
 
4738
     Like explicit relocation support for REL targets, it relies
4739
     on GNU extensions in the assembler and the linker.
4740
 
4741
     Although this code should work for -O0, it has traditionally
4742
     been treated as an optimization.  */
4743
  if (!TARGET_MIPS16 && TARGET_SPLIT_ADDRESSES
4744
      && optimize && !flag_pic
4745
      && !ABI_HAS_64BIT_SYMBOLS)
4746
    mips_split_addresses = 1;
4747
  else
4748
    mips_split_addresses = 0;
4749
 
4750
  /* -mvr4130-align is a "speed over size" optimization: it usually produces
4751
     faster code, but at the expense of more nops.  Enable it at -O3 and
4752
     above.  */
4753
  if (optimize > 2 && (target_flags_explicit & MASK_VR4130_ALIGN) == 0)
4754
    target_flags |= MASK_VR4130_ALIGN;
4755
 
4756
  /* When compiling for the mips16, we cannot use floating point.  We
4757
     record the original hard float value in mips16_hard_float.  */
4758
  if (TARGET_MIPS16)
4759
    {
4760
      if (TARGET_SOFT_FLOAT)
4761
        mips16_hard_float = 0;
4762
      else
4763
        mips16_hard_float = 1;
4764
      target_flags |= MASK_SOFT_FLOAT;
4765
 
4766
      /* Don't run the scheduler before reload, since it tends to
4767
         increase register pressure.  */
4768
      flag_schedule_insns = 0;
4769
 
4770
      /* Don't do hot/cold partitioning.  The constant layout code expects
4771
         the whole function to be in a single section.  */
4772
      flag_reorder_blocks_and_partition = 0;
4773
 
4774
      /* Silently disable -mexplicit-relocs since it doesn't apply
4775
         to mips16 code.  Even so, it would overly pedantic to warn
4776
         about "-mips16 -mexplicit-relocs", especially given that
4777
         we use a %gprel() operator.  */
4778
      target_flags &= ~MASK_EXPLICIT_RELOCS;
4779
    }
4780
 
4781
  /* When using explicit relocs, we call dbr_schedule from within
4782
     mips_reorg.  */
4783
  if (TARGET_EXPLICIT_RELOCS)
4784
    {
4785
      mips_flag_delayed_branch = flag_delayed_branch;
4786
      flag_delayed_branch = 0;
4787
    }
4788
 
4789
#ifdef MIPS_TFMODE_FORMAT
4790
  REAL_MODE_FORMAT (TFmode) = &MIPS_TFMODE_FORMAT;
4791
#endif
4792
 
4793
  /* Make sure that the user didn't turn off paired single support when
4794
     MIPS-3D support is requested.  */
4795
  if (TARGET_MIPS3D && (target_flags_explicit & MASK_PAIRED_SINGLE_FLOAT)
4796
      && !TARGET_PAIRED_SINGLE_FLOAT)
4797
    error ("-mips3d requires -mpaired-single");
4798
 
4799
  /* If TARGET_MIPS3D, enable MASK_PAIRED_SINGLE_FLOAT.  */
4800
  if (TARGET_MIPS3D)
4801
    target_flags |= MASK_PAIRED_SINGLE_FLOAT;
4802
 
4803
  /* Make sure that when TARGET_PAIRED_SINGLE_FLOAT is true, TARGET_FLOAT64
4804
     and TARGET_HARD_FLOAT are both true.  */
4805
  if (TARGET_PAIRED_SINGLE_FLOAT && !(TARGET_FLOAT64 && TARGET_HARD_FLOAT))
4806
    error ("-mips3d/-mpaired-single must be used with -mfp64 -mhard-float");
4807
 
4808
  /* Make sure that the ISA supports TARGET_PAIRED_SINGLE_FLOAT when it is
4809
     enabled.  */
4810
  if (TARGET_PAIRED_SINGLE_FLOAT && !ISA_MIPS64)
4811
    error ("-mips3d/-mpaired-single must be used with -mips64");
4812
 
4813
  if (TARGET_MIPS16 && TARGET_DSP)
4814
    error ("-mips16 and -mdsp cannot be used together");
4815
 
4816
  mips_print_operand_punct['?'] = 1;
4817
  mips_print_operand_punct['#'] = 1;
4818
  mips_print_operand_punct['/'] = 1;
4819
  mips_print_operand_punct['&'] = 1;
4820
  mips_print_operand_punct['!'] = 1;
4821
  mips_print_operand_punct['*'] = 1;
4822
  mips_print_operand_punct['@'] = 1;
4823
  mips_print_operand_punct['.'] = 1;
4824
  mips_print_operand_punct['('] = 1;
4825
  mips_print_operand_punct[')'] = 1;
4826
  mips_print_operand_punct['['] = 1;
4827
  mips_print_operand_punct[']'] = 1;
4828
  mips_print_operand_punct['<'] = 1;
4829
  mips_print_operand_punct['>'] = 1;
4830
  mips_print_operand_punct['{'] = 1;
4831
  mips_print_operand_punct['}'] = 1;
4832
  mips_print_operand_punct['^'] = 1;
4833
  mips_print_operand_punct['$'] = 1;
4834
  mips_print_operand_punct['+'] = 1;
4835
  mips_print_operand_punct['~'] = 1;
4836
 
4837
  mips_char_to_class['d'] = TARGET_MIPS16 ? M16_REGS : GR_REGS;
4838
  mips_char_to_class['t'] = T_REG;
4839
  mips_char_to_class['f'] = (TARGET_HARD_FLOAT ? FP_REGS : NO_REGS);
4840
  mips_char_to_class['h'] = HI_REG;
4841
  mips_char_to_class['l'] = LO_REG;
4842
  mips_char_to_class['x'] = MD_REGS;
4843
  mips_char_to_class['b'] = ALL_REGS;
4844
  mips_char_to_class['c'] = (TARGET_ABICALLS ? PIC_FN_ADDR_REG :
4845
                             TARGET_MIPS16 ? M16_NA_REGS :
4846
                             GR_REGS);
4847
  mips_char_to_class['e'] = LEA_REGS;
4848
  mips_char_to_class['j'] = PIC_FN_ADDR_REG;
4849
  mips_char_to_class['v'] = V1_REG;
4850
  mips_char_to_class['y'] = GR_REGS;
4851
  mips_char_to_class['z'] = ST_REGS;
4852
  mips_char_to_class['B'] = COP0_REGS;
4853
  mips_char_to_class['C'] = COP2_REGS;
4854
  mips_char_to_class['D'] = COP3_REGS;
4855
  mips_char_to_class['A'] = DSP_ACC_REGS;
4856
  mips_char_to_class['a'] = ACC_REGS;
4857
 
4858
  /* Set up array to map GCC register number to debug register number.
4859
     Ignore the special purpose register numbers.  */
4860
 
4861
  for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
4862
    mips_dbx_regno[i] = -1;
4863
 
4864
  start = GP_DBX_FIRST - GP_REG_FIRST;
4865
  for (i = GP_REG_FIRST; i <= GP_REG_LAST; i++)
4866
    mips_dbx_regno[i] = i + start;
4867
 
4868
  start = FP_DBX_FIRST - FP_REG_FIRST;
4869
  for (i = FP_REG_FIRST; i <= FP_REG_LAST; i++)
4870
    mips_dbx_regno[i] = i + start;
4871
 
4872
  mips_dbx_regno[HI_REGNUM] = MD_DBX_FIRST + 0;
4873
  mips_dbx_regno[LO_REGNUM] = MD_DBX_FIRST + 1;
4874
 
4875
  /* Set up array giving whether a given register can hold a given mode.  */
4876
 
4877
  for (mode = VOIDmode;
4878
       mode != MAX_MACHINE_MODE;
4879
       mode = (enum machine_mode) ((int)mode + 1))
4880
    {
4881
      register int size              = GET_MODE_SIZE (mode);
4882
      register enum mode_class class = GET_MODE_CLASS (mode);
4883
 
4884
      for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++)
4885
        {
4886
          register int temp;
4887
 
4888
          if (mode == CCV2mode)
4889
            temp = (ISA_HAS_8CC
4890
                    && ST_REG_P (regno)
4891
                    && (regno - ST_REG_FIRST) % 2 == 0);
4892
 
4893
          else if (mode == CCV4mode)
4894
            temp = (ISA_HAS_8CC
4895
                    && ST_REG_P (regno)
4896
                    && (regno - ST_REG_FIRST) % 4 == 0);
4897
 
4898
          else if (mode == CCmode)
4899
            {
4900
              if (! ISA_HAS_8CC)
4901
                temp = (regno == FPSW_REGNUM);
4902
              else
4903
                temp = (ST_REG_P (regno) || GP_REG_P (regno)
4904
                        || FP_REG_P (regno));
4905
            }
4906
 
4907
          else if (GP_REG_P (regno))
4908
            temp = ((regno & 1) == 0 || size <= UNITS_PER_WORD);
4909
 
4910
          else if (FP_REG_P (regno))
4911
            temp = ((regno % FP_INC) == 0)
4912
                    && (((class == MODE_FLOAT || class == MODE_COMPLEX_FLOAT
4913
                          || class == MODE_VECTOR_FLOAT)
4914
                         && size <= UNITS_PER_FPVALUE)
4915
                        /* Allow integer modes that fit into a single
4916
                           register.  We need to put integers into FPRs
4917
                           when using instructions like cvt and trunc.
4918
                           We can't allow sizes smaller than a word,
4919
                           the FPU has no appropriate load/store
4920
                           instructions for those.  */
4921
                        || (class == MODE_INT
4922
                            && size >= MIN_UNITS_PER_WORD
4923
                            && size <= UNITS_PER_FPREG)
4924
                        /* Allow TFmode for CCmode reloads.  */
4925
                        || (ISA_HAS_8CC && mode == TFmode));
4926
 
4927
          else if (ACC_REG_P (regno))
4928
            temp = (INTEGRAL_MODE_P (mode)
4929
                    && (size <= UNITS_PER_WORD
4930
                        || (ACC_HI_REG_P (regno)
4931
                            && size == 2 * UNITS_PER_WORD)));
4932
 
4933
          else if (ALL_COP_REG_P (regno))
4934
            temp = (class == MODE_INT && size <= UNITS_PER_WORD);
4935
          else
4936
            temp = 0;
4937
 
4938
          mips_hard_regno_mode_ok[(int)mode][regno] = temp;
4939
        }
4940
    }
4941
 
4942
  /* Save GPR registers in word_mode sized hunks.  word_mode hasn't been
4943
     initialized yet, so we can't use that here.  */
4944
  gpr_mode = TARGET_64BIT ? DImode : SImode;
4945
 
4946
  /* Provide default values for align_* for 64-bit targets.  */
4947
  if (TARGET_64BIT && !TARGET_MIPS16)
4948
    {
4949
      if (align_loops == 0)
4950
        align_loops = 8;
4951
      if (align_jumps == 0)
4952
        align_jumps = 8;
4953
      if (align_functions == 0)
4954
        align_functions = 8;
4955
    }
4956
 
4957
  /* Function to allocate machine-dependent function status.  */
4958
  init_machine_status = &mips_init_machine_status;
4959
 
4960
  if (ABI_HAS_64BIT_SYMBOLS)
4961
    {
4962
      if (TARGET_EXPLICIT_RELOCS)
4963
        {
4964
          mips_split_p[SYMBOL_64_HIGH] = true;
4965
          mips_hi_relocs[SYMBOL_64_HIGH] = "%highest(";
4966
          mips_lo_relocs[SYMBOL_64_HIGH] = "%higher(";
4967
 
4968
          mips_split_p[SYMBOL_64_MID] = true;
4969
          mips_hi_relocs[SYMBOL_64_MID] = "%higher(";
4970
          mips_lo_relocs[SYMBOL_64_MID] = "%hi(";
4971
 
4972
          mips_split_p[SYMBOL_64_LOW] = true;
4973
          mips_hi_relocs[SYMBOL_64_LOW] = "%hi(";
4974
          mips_lo_relocs[SYMBOL_64_LOW] = "%lo(";
4975
 
4976
          mips_split_p[SYMBOL_GENERAL] = true;
4977
          mips_lo_relocs[SYMBOL_GENERAL] = "%lo(";
4978
        }
4979
    }
4980
  else
4981
    {
4982
      if (TARGET_EXPLICIT_RELOCS || mips_split_addresses)
4983
        {
4984
          mips_split_p[SYMBOL_GENERAL] = true;
4985
          mips_hi_relocs[SYMBOL_GENERAL] = "%hi(";
4986
          mips_lo_relocs[SYMBOL_GENERAL] = "%lo(";
4987
        }
4988
    }
4989
 
4990
  if (TARGET_MIPS16)
4991
    {
4992
      /* The high part is provided by a pseudo copy of $gp.  */
4993
      mips_split_p[SYMBOL_SMALL_DATA] = true;
4994
      mips_lo_relocs[SYMBOL_SMALL_DATA] = "%gprel(";
4995
    }
4996
 
4997
  if (TARGET_EXPLICIT_RELOCS)
4998
    {
4999
      /* Small data constants are kept whole until after reload,
5000
         then lowered by mips_rewrite_small_data.  */
5001
      mips_lo_relocs[SYMBOL_SMALL_DATA] = "%gp_rel(";
5002
 
5003
      mips_split_p[SYMBOL_GOT_LOCAL] = true;
5004
      if (TARGET_NEWABI)
5005
        {
5006
          mips_lo_relocs[SYMBOL_GOTOFF_PAGE] = "%got_page(";
5007
          mips_lo_relocs[SYMBOL_GOT_LOCAL] = "%got_ofst(";
5008
        }
5009
      else
5010
        {
5011
          mips_lo_relocs[SYMBOL_GOTOFF_PAGE] = "%got(";
5012
          mips_lo_relocs[SYMBOL_GOT_LOCAL] = "%lo(";
5013
        }
5014
 
5015
      if (TARGET_XGOT)
5016
        {
5017
          /* The HIGH and LO_SUM are matched by special .md patterns.  */
5018
          mips_split_p[SYMBOL_GOT_GLOBAL] = true;
5019
 
5020
          mips_split_p[SYMBOL_GOTOFF_GLOBAL] = true;
5021
          mips_hi_relocs[SYMBOL_GOTOFF_GLOBAL] = "%got_hi(";
5022
          mips_lo_relocs[SYMBOL_GOTOFF_GLOBAL] = "%got_lo(";
5023
 
5024
          mips_split_p[SYMBOL_GOTOFF_CALL] = true;
5025
          mips_hi_relocs[SYMBOL_GOTOFF_CALL] = "%call_hi(";
5026
          mips_lo_relocs[SYMBOL_GOTOFF_CALL] = "%call_lo(";
5027
        }
5028
      else
5029
        {
5030
          if (TARGET_NEWABI)
5031
            mips_lo_relocs[SYMBOL_GOTOFF_GLOBAL] = "%got_disp(";
5032
          else
5033
            mips_lo_relocs[SYMBOL_GOTOFF_GLOBAL] = "%got(";
5034
          mips_lo_relocs[SYMBOL_GOTOFF_CALL] = "%call16(";
5035
        }
5036
    }
5037
 
5038
  if (TARGET_NEWABI)
5039
    {
5040
      mips_split_p[SYMBOL_GOTOFF_LOADGP] = true;
5041
      mips_hi_relocs[SYMBOL_GOTOFF_LOADGP] = "%hi(%neg(%gp_rel(";
5042
      mips_lo_relocs[SYMBOL_GOTOFF_LOADGP] = "%lo(%neg(%gp_rel(";
5043
    }
5044
 
5045
  /* Thread-local relocation operators.  */
5046
  mips_lo_relocs[SYMBOL_TLSGD] = "%tlsgd(";
5047
  mips_lo_relocs[SYMBOL_TLSLDM] = "%tlsldm(";
5048
  mips_split_p[SYMBOL_DTPREL] = 1;
5049
  mips_hi_relocs[SYMBOL_DTPREL] = "%dtprel_hi(";
5050
  mips_lo_relocs[SYMBOL_DTPREL] = "%dtprel_lo(";
5051
  mips_lo_relocs[SYMBOL_GOTTPREL] = "%gottprel(";
5052
  mips_split_p[SYMBOL_TPREL] = 1;
5053
  mips_hi_relocs[SYMBOL_TPREL] = "%tprel_hi(";
5054
  mips_lo_relocs[SYMBOL_TPREL] = "%tprel_lo(";
5055
 
5056
  /* We don't have a thread pointer access instruction on MIPS16, or
5057
     appropriate TLS relocations.  */
5058
  if (TARGET_MIPS16)
5059
    targetm.have_tls = false;
5060
 
5061
  /* Default to working around R4000 errata only if the processor
5062
     was selected explicitly.  */
5063
  if ((target_flags_explicit & MASK_FIX_R4000) == 0
5064
      && mips_matching_cpu_name_p (mips_arch_info->name, "r4000"))
5065
    target_flags |= MASK_FIX_R4000;
5066
 
5067
  /* Default to working around R4400 errata only if the processor
5068
     was selected explicitly.  */
5069
  if ((target_flags_explicit & MASK_FIX_R4400) == 0
5070
      && mips_matching_cpu_name_p (mips_arch_info->name, "r4400"))
5071
    target_flags |= MASK_FIX_R4400;
5072
}
5073
 
5074
/* Implement CONDITIONAL_REGISTER_USAGE.  */
5075
 
5076
void
5077
mips_conditional_register_usage (void)
5078
{
5079
  if (!TARGET_DSP)
5080
    {
5081
      int regno;
5082
 
5083
      for (regno = DSP_ACC_REG_FIRST; regno <= DSP_ACC_REG_LAST; regno++)
5084
        fixed_regs[regno] = call_used_regs[regno] = 1;
5085
    }
5086
  if (!TARGET_HARD_FLOAT)
5087
    {
5088
      int regno;
5089
 
5090
      for (regno = FP_REG_FIRST; regno <= FP_REG_LAST; regno++)
5091
        fixed_regs[regno] = call_used_regs[regno] = 1;
5092
      for (regno = ST_REG_FIRST; regno <= ST_REG_LAST; regno++)
5093
        fixed_regs[regno] = call_used_regs[regno] = 1;
5094
    }
5095
  else if (! ISA_HAS_8CC)
5096
    {
5097
      int regno;
5098
 
5099
      /* We only have a single condition code register.  We
5100
         implement this by hiding all the condition code registers,
5101
         and generating RTL that refers directly to ST_REG_FIRST.  */
5102
      for (regno = ST_REG_FIRST; regno <= ST_REG_LAST; regno++)
5103
        fixed_regs[regno] = call_used_regs[regno] = 1;
5104
    }
5105
  /* In mips16 mode, we permit the $t temporary registers to be used
5106
     for reload.  We prohibit the unused $s registers, since they
5107
     are caller saved, and saving them via a mips16 register would
5108
     probably waste more time than just reloading the value.  */
5109
  if (TARGET_MIPS16)
5110
    {
5111
      fixed_regs[18] = call_used_regs[18] = 1;
5112
      fixed_regs[19] = call_used_regs[19] = 1;
5113
      fixed_regs[20] = call_used_regs[20] = 1;
5114
      fixed_regs[21] = call_used_regs[21] = 1;
5115
      fixed_regs[22] = call_used_regs[22] = 1;
5116
      fixed_regs[23] = call_used_regs[23] = 1;
5117
      fixed_regs[26] = call_used_regs[26] = 1;
5118
      fixed_regs[27] = call_used_regs[27] = 1;
5119
      fixed_regs[30] = call_used_regs[30] = 1;
5120
    }
5121
  /* fp20-23 are now caller saved.  */
5122
  if (mips_abi == ABI_64)
5123
    {
5124
      int regno;
5125
      for (regno = FP_REG_FIRST + 20; regno < FP_REG_FIRST + 24; regno++)
5126
        call_really_used_regs[regno] = call_used_regs[regno] = 1;
5127
    }
5128
  /* Odd registers from fp21 to fp31 are now caller saved.  */
5129
  if (mips_abi == ABI_N32)
5130
    {
5131
      int regno;
5132
      for (regno = FP_REG_FIRST + 21; regno <= FP_REG_FIRST + 31; regno+=2)
5133
        call_really_used_regs[regno] = call_used_regs[regno] = 1;
5134
    }
5135
}
5136
 
5137
/* Allocate a chunk of memory for per-function machine-dependent data.  */
5138
static struct machine_function *
5139
mips_init_machine_status (void)
5140
{
5141
  return ((struct machine_function *)
5142
          ggc_alloc_cleared (sizeof (struct machine_function)));
5143
}
5144
 
5145
/* On the mips16, we want to allocate $24 (T_REG) before other
5146
   registers for instructions for which it is possible.  This helps
5147
   avoid shuffling registers around in order to set up for an xor,
5148
   encouraging the compiler to use a cmp instead.  */
5149
 
5150
void
5151
mips_order_regs_for_local_alloc (void)
5152
{
5153
  register int i;
5154
 
5155
  for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
5156
    reg_alloc_order[i] = i;
5157
 
5158
  if (TARGET_MIPS16)
5159
    {
5160
      /* It really doesn't matter where we put register 0, since it is
5161
         a fixed register anyhow.  */
5162
      reg_alloc_order[0] = 24;
5163
      reg_alloc_order[24] = 0;
5164
    }
5165
}
5166
 
5167
 
5168
/* The MIPS debug format wants all automatic variables and arguments
5169
   to be in terms of the virtual frame pointer (stack pointer before
5170
   any adjustment in the function), while the MIPS 3.0 linker wants
5171
   the frame pointer to be the stack pointer after the initial
5172
   adjustment.  So, we do the adjustment here.  The arg pointer (which
5173
   is eliminated) points to the virtual frame pointer, while the frame
5174
   pointer (which may be eliminated) points to the stack pointer after
5175
   the initial adjustments.  */
5176
 
5177
HOST_WIDE_INT
5178
mips_debugger_offset (rtx addr, HOST_WIDE_INT offset)
5179
{
5180
  rtx offset2 = const0_rtx;
5181
  rtx reg = eliminate_constant_term (addr, &offset2);
5182
 
5183
  if (offset == 0)
5184
    offset = INTVAL (offset2);
5185
 
5186
  if (reg == stack_pointer_rtx || reg == frame_pointer_rtx
5187
      || reg == hard_frame_pointer_rtx)
5188
    {
5189
      HOST_WIDE_INT frame_size = (!cfun->machine->frame.initialized)
5190
                                  ? compute_frame_size (get_frame_size ())
5191
                                  : cfun->machine->frame.total_size;
5192
 
5193
      /* MIPS16 frame is smaller */
5194
      if (frame_pointer_needed && TARGET_MIPS16)
5195
        frame_size -= cfun->machine->frame.args_size;
5196
 
5197
      offset = offset - frame_size;
5198
    }
5199
 
5200
  /* sdbout_parms does not want this to crash for unrecognized cases.  */
5201
#if 0
5202
  else if (reg != arg_pointer_rtx)
5203
    fatal_insn ("mips_debugger_offset called with non stack/frame/arg pointer",
5204
                addr);
5205
#endif
5206
 
5207
  return offset;
5208
}
5209
 
5210
/* Implement the PRINT_OPERAND macro.  The MIPS-specific operand codes are:
5211
 
5212
   'X'  OP is CONST_INT, prints 32 bits in hexadecimal format = "0x%08x",
5213
   'x'  OP is CONST_INT, prints 16 bits in hexadecimal format = "0x%04x",
5214
   'h'  OP is HIGH, prints %hi(X),
5215
   'd'  output integer constant in decimal,
5216
   'z'  if the operand is 0, use $0 instead of normal operand.
5217
   'D'  print second part of double-word register or memory operand.
5218
   'L'  print low-order register of double-word register operand.
5219
   'M'  print high-order register of double-word register operand.
5220
   'C'  print part of opcode for a branch condition.
5221
   'F'  print part of opcode for a floating-point branch condition.
5222
   'N'  print part of opcode for a branch condition, inverted.
5223
   'W'  print part of opcode for a floating-point branch condition, inverted.
5224
   'T'  print 'f' for (eq:CC ...), 't' for (ne:CC ...),
5225
              'z' for (eq:?I ...), 'n' for (ne:?I ...).
5226
   't'  like 'T', but with the EQ/NE cases reversed
5227
   'Y'  for a CONST_INT X, print mips_fp_conditions[X]
5228
   'Z'  print the operand and a comma for ISA_HAS_8CC, otherwise print nothing
5229
   'R'  print the reloc associated with LO_SUM
5230
   'q'  print DSP accumulator registers
5231
 
5232
   The punctuation characters are:
5233
 
5234
   '('  Turn on .set noreorder
5235
   ')'  Turn on .set reorder
5236
   '['  Turn on .set noat
5237
   ']'  Turn on .set at
5238
   '<'  Turn on .set nomacro
5239
   '>'  Turn on .set macro
5240
   '{'  Turn on .set volatile (not GAS)
5241
   '}'  Turn on .set novolatile (not GAS)
5242
   '&'  Turn on .set noreorder if filling delay slots
5243
   '*'  Turn on both .set noreorder and .set nomacro if filling delay slots
5244
   '!'  Turn on .set nomacro if filling delay slots
5245
   '#'  Print nop if in a .set noreorder section.
5246
   '/'  Like '#', but does nothing within a delayed branch sequence
5247
   '?'  Print 'l' if we are to use a branch likely instead of normal branch.
5248
   '@'  Print the name of the assembler temporary register (at or $1).
5249
   '.'  Print the name of the register with a hard-wired zero (zero or $0).
5250
   '^'  Print the name of the pic call-through register (t9 or $25).
5251
   '$'  Print the name of the stack pointer register (sp or $29).
5252
   '+'  Print the name of the gp register (usually gp or $28).
5253
   '~'  Output a branch alignment to LABEL_ALIGN(NULL).  */
5254
 
5255
void
5256
print_operand (FILE *file, rtx op, int letter)
5257
{
5258
  register enum rtx_code code;
5259
 
5260
  if (PRINT_OPERAND_PUNCT_VALID_P (letter))
5261
    {
5262
      switch (letter)
5263
        {
5264
        case '?':
5265
          if (mips_branch_likely)
5266
            putc ('l', file);
5267
          break;
5268
 
5269
        case '@':
5270
          fputs (reg_names [GP_REG_FIRST + 1], file);
5271
          break;
5272
 
5273
        case '^':
5274
          fputs (reg_names [PIC_FUNCTION_ADDR_REGNUM], file);
5275
          break;
5276
 
5277
        case '.':
5278
          fputs (reg_names [GP_REG_FIRST + 0], file);
5279
          break;
5280
 
5281
        case '$':
5282
          fputs (reg_names[STACK_POINTER_REGNUM], file);
5283
          break;
5284
 
5285
        case '+':
5286
          fputs (reg_names[PIC_OFFSET_TABLE_REGNUM], file);
5287
          break;
5288
 
5289
        case '&':
5290
          if (final_sequence != 0 && set_noreorder++ == 0)
5291
            fputs (".set\tnoreorder\n\t", file);
5292
          break;
5293
 
5294
        case '*':
5295
          if (final_sequence != 0)
5296
            {
5297
              if (set_noreorder++ == 0)
5298
                fputs (".set\tnoreorder\n\t", file);
5299
 
5300
              if (set_nomacro++ == 0)
5301
                fputs (".set\tnomacro\n\t", file);
5302
            }
5303
          break;
5304
 
5305
        case '!':
5306
          if (final_sequence != 0 && set_nomacro++ == 0)
5307
            fputs ("\n\t.set\tnomacro", file);
5308
          break;
5309
 
5310
        case '#':
5311
          if (set_noreorder != 0)
5312
            fputs ("\n\tnop", file);
5313
          break;
5314
 
5315
        case '/':
5316
          /* Print an extra newline so that the delayed insn is separated
5317
             from the following ones.  This looks neater and is consistent
5318
             with non-nop delayed sequences.  */
5319
          if (set_noreorder != 0 && final_sequence == 0)
5320
            fputs ("\n\tnop\n", file);
5321
          break;
5322
 
5323
        case '(':
5324
          if (set_noreorder++ == 0)
5325
            fputs (".set\tnoreorder\n\t", file);
5326
          break;
5327
 
5328
        case ')':
5329
          if (set_noreorder == 0)
5330
            error ("internal error: %%) found without a %%( in assembler pattern");
5331
 
5332
          else if (--set_noreorder == 0)
5333
            fputs ("\n\t.set\treorder", file);
5334
 
5335
          break;
5336
 
5337
        case '[':
5338
          if (set_noat++ == 0)
5339
            fputs (".set\tnoat\n\t", file);
5340
          break;
5341
 
5342
        case ']':
5343
          if (set_noat == 0)
5344
            error ("internal error: %%] found without a %%[ in assembler pattern");
5345
          else if (--set_noat == 0)
5346
            fputs ("\n\t.set\tat", file);
5347
 
5348
          break;
5349
 
5350
        case '<':
5351
          if (set_nomacro++ == 0)
5352
            fputs (".set\tnomacro\n\t", file);
5353
          break;
5354
 
5355
        case '>':
5356
          if (set_nomacro == 0)
5357
            error ("internal error: %%> found without a %%< in assembler pattern");
5358
          else if (--set_nomacro == 0)
5359
            fputs ("\n\t.set\tmacro", file);
5360
 
5361
          break;
5362
 
5363
        case '{':
5364
          if (set_volatile++ == 0)
5365
            fputs ("#.set\tvolatile\n\t", file);
5366
          break;
5367
 
5368
        case '}':
5369
          if (set_volatile == 0)
5370
            error ("internal error: %%} found without a %%{ in assembler pattern");
5371
          else if (--set_volatile == 0)
5372
            fputs ("\n\t#.set\tnovolatile", file);
5373
 
5374
          break;
5375
 
5376
        case '~':
5377
          {
5378
            if (align_labels_log > 0)
5379
              ASM_OUTPUT_ALIGN (file, align_labels_log);
5380
          }
5381
          break;
5382
 
5383
        default:
5384
          error ("PRINT_OPERAND: unknown punctuation '%c'", letter);
5385
          break;
5386
        }
5387
 
5388
      return;
5389
    }
5390
 
5391
  if (! op)
5392
    {
5393
      error ("PRINT_OPERAND null pointer");
5394
      return;
5395
    }
5396
 
5397
  code = GET_CODE (op);
5398
 
5399
  if (letter == 'C')
5400
    switch (code)
5401
      {
5402
      case EQ:  fputs ("eq",  file); break;
5403
      case NE:  fputs ("ne",  file); break;
5404
      case GT:  fputs ("gt",  file); break;
5405
      case GE:  fputs ("ge",  file); break;
5406
      case LT:  fputs ("lt",  file); break;
5407
      case LE:  fputs ("le",  file); break;
5408
      case GTU: fputs ("gtu", file); break;
5409
      case GEU: fputs ("geu", file); break;
5410
      case LTU: fputs ("ltu", file); break;
5411
      case LEU: fputs ("leu", file); break;
5412
      default:
5413
        fatal_insn ("PRINT_OPERAND, invalid insn for %%C", op);
5414
      }
5415
 
5416
  else if (letter == 'N')
5417
    switch (code)
5418
      {
5419
      case EQ:  fputs ("ne",  file); break;
5420
      case NE:  fputs ("eq",  file); break;
5421
      case GT:  fputs ("le",  file); break;
5422
      case GE:  fputs ("lt",  file); break;
5423
      case LT:  fputs ("ge",  file); break;
5424
      case LE:  fputs ("gt",  file); break;
5425
      case GTU: fputs ("leu", file); break;
5426
      case GEU: fputs ("ltu", file); break;
5427
      case LTU: fputs ("geu", file); break;
5428
      case LEU: fputs ("gtu", file); break;
5429
      default:
5430
        fatal_insn ("PRINT_OPERAND, invalid insn for %%N", op);
5431
      }
5432
 
5433
  else if (letter == 'F')
5434
    switch (code)
5435
      {
5436
      case EQ: fputs ("c1f", file); break;
5437
      case NE: fputs ("c1t", file); break;
5438
      default:
5439
        fatal_insn ("PRINT_OPERAND, invalid insn for %%F", op);
5440
      }
5441
 
5442
  else if (letter == 'W')
5443
    switch (code)
5444
      {
5445
      case EQ: fputs ("c1t", file); break;
5446
      case NE: fputs ("c1f", file); break;
5447
      default:
5448
        fatal_insn ("PRINT_OPERAND, invalid insn for %%W", op);
5449
      }
5450
 
5451
  else if (letter == 'h')
5452
    {
5453
      if (GET_CODE (op) == HIGH)
5454
        op = XEXP (op, 0);
5455
 
5456
      print_operand_reloc (file, op, mips_hi_relocs);
5457
    }
5458
 
5459
  else if (letter == 'R')
5460
    print_operand_reloc (file, op, mips_lo_relocs);
5461
 
5462
  else if (letter == 'Y')
5463
    {
5464
      if (GET_CODE (op) == CONST_INT
5465
          && ((unsigned HOST_WIDE_INT) INTVAL (op)
5466
              < ARRAY_SIZE (mips_fp_conditions)))
5467
        fputs (mips_fp_conditions[INTVAL (op)], file);
5468
      else
5469
        output_operand_lossage ("invalid %%Y value");
5470
    }
5471
 
5472
  else if (letter == 'Z')
5473
    {
5474
      if (ISA_HAS_8CC)
5475
        {
5476
          print_operand (file, op, 0);
5477
          fputc (',', file);
5478
        }
5479
    }
5480
 
5481
  else if (letter == 'q')
5482
    {
5483
      int regnum;
5484
 
5485
      if (code != REG)
5486
        fatal_insn ("PRINT_OPERAND, invalid insn for %%q", op);
5487
 
5488
      regnum = REGNO (op);
5489
      if (MD_REG_P (regnum))
5490
        fprintf (file, "$ac0");
5491
      else if (DSP_ACC_REG_P (regnum))
5492
        fprintf (file, "$ac%c", reg_names[regnum][3]);
5493
      else
5494
        fatal_insn ("PRINT_OPERAND, invalid insn for %%q", op);
5495
    }
5496
 
5497
  else if (code == REG || code == SUBREG)
5498
    {
5499
      register int regnum;
5500
 
5501
      if (code == REG)
5502
        regnum = REGNO (op);
5503
      else
5504
        regnum = true_regnum (op);
5505
 
5506
      if ((letter == 'M' && ! WORDS_BIG_ENDIAN)
5507
          || (letter == 'L' && WORDS_BIG_ENDIAN)
5508
          || letter == 'D')
5509
        regnum++;
5510
 
5511
      fprintf (file, "%s", reg_names[regnum]);
5512
    }
5513
 
5514
  else if (code == MEM)
5515
    {
5516
      if (letter == 'D')
5517
        output_address (plus_constant (XEXP (op, 0), 4));
5518
      else
5519
        output_address (XEXP (op, 0));
5520
    }
5521
 
5522
  else if (letter == 'x' && GET_CODE (op) == CONST_INT)
5523
    fprintf (file, HOST_WIDE_INT_PRINT_HEX, 0xffff & INTVAL(op));
5524
 
5525
  else if (letter == 'X' && GET_CODE(op) == CONST_INT)
5526
    fprintf (file, HOST_WIDE_INT_PRINT_HEX, INTVAL (op));
5527
 
5528
  else if (letter == 'd' && GET_CODE(op) == CONST_INT)
5529
    fprintf (file, HOST_WIDE_INT_PRINT_DEC, (INTVAL(op)));
5530
 
5531
  else if (letter == 'z' && op == CONST0_RTX (GET_MODE (op)))
5532
    fputs (reg_names[GP_REG_FIRST], file);
5533
 
5534
  else if (letter == 'd' || letter == 'x' || letter == 'X')
5535
    output_operand_lossage ("invalid use of %%d, %%x, or %%X");
5536
 
5537
  else if (letter == 'T' || letter == 't')
5538
    {
5539
      int truth = (code == NE) == (letter == 'T');
5540
      fputc ("zfnt"[truth * 2 + (GET_MODE (op) == CCmode)], file);
5541
    }
5542
 
5543
  else if (CONST_GP_P (op))
5544
    fputs (reg_names[GLOBAL_POINTER_REGNUM], file);
5545
 
5546
  else
5547
    output_addr_const (file, op);
5548
}
5549
 
5550
 
5551
/* Print symbolic operand OP, which is part of a HIGH or LO_SUM.
5552
   RELOCS is the array of relocations to use.  */
5553
 
5554
static void
5555
print_operand_reloc (FILE *file, rtx op, const char **relocs)
5556
{
5557
  enum mips_symbol_type symbol_type;
5558
  const char *p;
5559
  rtx base;
5560
  HOST_WIDE_INT offset;
5561
 
5562
  if (!mips_symbolic_constant_p (op, &symbol_type) || relocs[symbol_type] == 0)
5563
    fatal_insn ("PRINT_OPERAND, invalid operand for relocation", op);
5564
 
5565
  /* If OP uses an UNSPEC address, we want to print the inner symbol.  */
5566
  mips_split_const (op, &base, &offset);
5567
  if (UNSPEC_ADDRESS_P (base))
5568
    op = plus_constant (UNSPEC_ADDRESS (base), offset);
5569
 
5570
  fputs (relocs[symbol_type], file);
5571
  output_addr_const (file, op);
5572
  for (p = relocs[symbol_type]; *p != 0; p++)
5573
    if (*p == '(')
5574
      fputc (')', file);
5575
}
5576
 
5577
/* Output address operand X to FILE.  */
5578
 
5579
void
5580
print_operand_address (FILE *file, rtx x)
5581
{
5582
  struct mips_address_info addr;
5583
 
5584
  if (mips_classify_address (&addr, x, word_mode, true))
5585
    switch (addr.type)
5586
      {
5587
      case ADDRESS_REG:
5588
        print_operand (file, addr.offset, 0);
5589
        fprintf (file, "(%s)", reg_names[REGNO (addr.reg)]);
5590
        return;
5591
 
5592
      case ADDRESS_LO_SUM:
5593
        print_operand (file, addr.offset, 'R');
5594
        fprintf (file, "(%s)", reg_names[REGNO (addr.reg)]);
5595
        return;
5596
 
5597
      case ADDRESS_CONST_INT:
5598
        output_addr_const (file, x);
5599
        fprintf (file, "(%s)", reg_names[0]);
5600
        return;
5601
 
5602
      case ADDRESS_SYMBOLIC:
5603
        output_addr_const (file, x);
5604
        return;
5605
      }
5606
  gcc_unreachable ();
5607
}
5608
 
5609
/* When using assembler macros, keep track of all of small-data externs
5610
   so that mips_file_end can emit the appropriate declarations for them.
5611
 
5612
   In most cases it would be safe (though pointless) to emit .externs
5613
   for other symbols too.  One exception is when an object is within
5614
   the -G limit but declared by the user to be in a section other
5615
   than .sbss or .sdata.  */
5616
 
5617
int
5618
mips_output_external (FILE *file ATTRIBUTE_UNUSED, tree decl, const char *name)
5619
{
5620
  register struct extern_list *p;
5621
 
5622
  if (!TARGET_EXPLICIT_RELOCS && mips_in_small_data_p (decl))
5623
    {
5624
      p = (struct extern_list *) ggc_alloc (sizeof (struct extern_list));
5625
      p->next = extern_head;
5626
      p->name = name;
5627
      p->size = int_size_in_bytes (TREE_TYPE (decl));
5628
      extern_head = p;
5629
    }
5630
 
5631
  if (TARGET_IRIX && mips_abi == ABI_32 && TREE_CODE (decl) == FUNCTION_DECL)
5632
    {
5633
      p = (struct extern_list *) ggc_alloc (sizeof (struct extern_list));
5634
      p->next = extern_head;
5635
      p->name = name;
5636
      p->size = -1;
5637
      extern_head = p;
5638
    }
5639
 
5640
  return 0;
5641
}
5642
 
5643
#if TARGET_IRIX
5644
static void
5645
irix_output_external_libcall (rtx fun)
5646
{
5647
  register struct extern_list *p;
5648
 
5649
  if (mips_abi == ABI_32)
5650
    {
5651
      p = (struct extern_list *) ggc_alloc (sizeof (struct extern_list));
5652
      p->next = extern_head;
5653
      p->name = XSTR (fun, 0);
5654
      p->size = -1;
5655
      extern_head = p;
5656
    }
5657
}
5658
#endif
5659
 
5660
/* Emit a new filename to a stream.  If we are smuggling stabs, try to
5661
   put out a MIPS ECOFF file and a stab.  */
5662
 
5663
void
5664
mips_output_filename (FILE *stream, const char *name)
5665
{
5666
 
5667
  /* If we are emitting DWARF-2, let dwarf2out handle the ".file"
5668
     directives.  */
5669
  if (write_symbols == DWARF2_DEBUG)
5670
    return;
5671
  else if (mips_output_filename_first_time)
5672
    {
5673
      mips_output_filename_first_time = 0;
5674
      num_source_filenames += 1;
5675
      current_function_file = name;
5676
      fprintf (stream, "\t.file\t%d ", num_source_filenames);
5677
      output_quoted_string (stream, name);
5678
      putc ('\n', stream);
5679
    }
5680
 
5681
  /* If we are emitting stabs, let dbxout.c handle this (except for
5682
     the mips_output_filename_first_time case).  */
5683
  else if (write_symbols == DBX_DEBUG)
5684
    return;
5685
 
5686
  else if (name != current_function_file
5687
           && strcmp (name, current_function_file) != 0)
5688
    {
5689
      num_source_filenames += 1;
5690
      current_function_file = name;
5691
      fprintf (stream, "\t.file\t%d ", num_source_filenames);
5692
      output_quoted_string (stream, name);
5693
      putc ('\n', stream);
5694
    }
5695
}
5696
 
5697
/* Output an ASCII string, in a space-saving way.  PREFIX is the string
5698
   that should be written before the opening quote, such as "\t.ascii\t"
5699
   for real string data or "\t# " for a comment.  */
5700
 
5701
void
5702
mips_output_ascii (FILE *stream, const char *string_param, size_t len,
5703
                   const char *prefix)
5704
{
5705
  size_t i;
5706
  int cur_pos = 17;
5707
  register const unsigned char *string =
5708
    (const unsigned char *)string_param;
5709
 
5710
  fprintf (stream, "%s\"", prefix);
5711
  for (i = 0; i < len; i++)
5712
    {
5713
      register int c = string[i];
5714
 
5715
      if (ISPRINT (c))
5716
        {
5717
          if (c == '\\' || c == '\"')
5718
            {
5719
              putc ('\\', stream);
5720
              cur_pos++;
5721
            }
5722
          putc (c, stream);
5723
          cur_pos++;
5724
        }
5725
      else
5726
        {
5727
          fprintf (stream, "\\%03o", c);
5728
          cur_pos += 4;
5729
        }
5730
 
5731
      if (cur_pos > 72 && i+1 < len)
5732
        {
5733
          cur_pos = 17;
5734
          fprintf (stream, "\"\n%s\"", prefix);
5735
        }
5736
    }
5737
  fprintf (stream, "\"\n");
5738
}
5739
 
5740
/* Implement TARGET_ASM_FILE_START.  */
5741
 
5742
static void
5743
mips_file_start (void)
5744
{
5745
  default_file_start ();
5746
 
5747
  if (!TARGET_IRIX)
5748
    {
5749
      /* Generate a special section to describe the ABI switches used to
5750
         produce the resultant binary.  This used to be done by the assembler
5751
         setting bits in the ELF header's flags field, but we have run out of
5752
         bits.  GDB needs this information in order to be able to correctly
5753
         debug these binaries.  See the function mips_gdbarch_init() in
5754
         gdb/mips-tdep.c.  This is unnecessary for the IRIX 5/6 ABIs and
5755
         causes unnecessary IRIX 6 ld warnings.  */
5756
      const char * abi_string = NULL;
5757
 
5758
      switch (mips_abi)
5759
        {
5760
        case ABI_32:   abi_string = "abi32"; break;
5761
        case ABI_N32:  abi_string = "abiN32"; break;
5762
        case ABI_64:   abi_string = "abi64"; break;
5763
        case ABI_O64:  abi_string = "abiO64"; break;
5764
        case ABI_EABI: abi_string = TARGET_64BIT ? "eabi64" : "eabi32"; break;
5765
        default:
5766
          gcc_unreachable ();
5767
        }
5768
      /* Note - we use fprintf directly rather than called named_section()
5769
         because in this way we can avoid creating an allocated section.  We
5770
         do not want this section to take up any space in the running
5771
         executable.  */
5772
      fprintf (asm_out_file, "\t.section .mdebug.%s\n", abi_string);
5773
 
5774
      /* There is no ELF header flag to distinguish long32 forms of the
5775
         EABI from long64 forms.  Emit a special section to help tools
5776
         such as GDB.  */
5777
      if (mips_abi == ABI_EABI)
5778
        fprintf (asm_out_file, "\t.section .gcc_compiled_long%d\n",
5779
                 TARGET_LONG64 ? 64 : 32);
5780
 
5781
      /* Restore the default section.  */
5782
      fprintf (asm_out_file, "\t.previous\n");
5783
    }
5784
 
5785
  /* Generate the pseudo ops that System V.4 wants.  */
5786
  if (TARGET_ABICALLS)
5787
    /* ??? but do not want this (or want pic0) if -non-shared? */
5788
    fprintf (asm_out_file, "\t.abicalls\n");
5789
 
5790
  if (TARGET_MIPS16)
5791
    fprintf (asm_out_file, "\t.set\tmips16\n");
5792
 
5793
  if (flag_verbose_asm)
5794
    fprintf (asm_out_file, "\n%s -G value = %d, Arch = %s, ISA = %d\n",
5795
             ASM_COMMENT_START,
5796
             mips_section_threshold, mips_arch_info->name, mips_isa);
5797
}
5798
 
5799
#ifdef BSS_SECTION_ASM_OP
5800
/* Implement ASM_OUTPUT_ALIGNED_BSS.  This differs from the default only
5801
   in the use of sbss.  */
5802
 
5803
void
5804
mips_output_aligned_bss (FILE *stream, tree decl, const char *name,
5805
                         unsigned HOST_WIDE_INT size, int align)
5806
{
5807
  extern tree last_assemble_variable_decl;
5808
 
5809
  if (mips_in_small_data_p (decl))
5810
    named_section (0, ".sbss", 0);
5811
  else
5812
    bss_section ();
5813
  ASM_OUTPUT_ALIGN (stream, floor_log2 (align / BITS_PER_UNIT));
5814
  last_assemble_variable_decl = decl;
5815
  ASM_DECLARE_OBJECT_NAME (stream, name, decl);
5816
  ASM_OUTPUT_SKIP (stream, size != 0 ? size : 1);
5817
}
5818
#endif
5819
 
5820
/* Implement TARGET_ASM_FILE_END.  When using assembler macros, emit
5821
   .externs for any small-data variables that turned out to be external.  */
5822
 
5823
static void
5824
mips_file_end (void)
5825
{
5826
  tree name_tree;
5827
  struct extern_list *p;
5828
 
5829
  if (extern_head)
5830
    {
5831
      fputs ("\n", asm_out_file);
5832
 
5833
      for (p = extern_head; p != 0; p = p->next)
5834
        {
5835
          name_tree = get_identifier (p->name);
5836
 
5837
          /* Positively ensure only one .extern for any given symbol.  */
5838
          if (!TREE_ASM_WRITTEN (name_tree)
5839
              && TREE_SYMBOL_REFERENCED (name_tree))
5840
            {
5841
              TREE_ASM_WRITTEN (name_tree) = 1;
5842
              /* In IRIX 5 or IRIX 6 for the O32 ABI, we must output a
5843
                 `.global name .text' directive for every used but
5844
                 undefined function.  If we don't, the linker may perform
5845
                 an optimization (skipping over the insns that set $gp)
5846
                 when it is unsafe.  */
5847
              if (TARGET_IRIX && mips_abi == ABI_32 && p->size == -1)
5848
                {
5849
                  fputs ("\t.globl ", asm_out_file);
5850
                  assemble_name (asm_out_file, p->name);
5851
                  fputs (" .text\n", asm_out_file);
5852
                }
5853
              else
5854
                {
5855
                  fputs ("\t.extern\t", asm_out_file);
5856
                  assemble_name (asm_out_file, p->name);
5857
                  fprintf (asm_out_file, ", %d\n", p->size);
5858
                }
5859
            }
5860
        }
5861
    }
5862
}
5863
 
5864
/* Implement ASM_OUTPUT_ALIGNED_DECL_COMMON.  This is usually the same as the
5865
   elfos.h version, but we also need to handle -muninit-const-in-rodata.  */
5866
 
5867
void
5868
mips_output_aligned_decl_common (FILE *stream, tree decl, const char *name,
5869
                                 unsigned HOST_WIDE_INT size,
5870
                                 unsigned int align)
5871
{
5872
  /* If the target wants uninitialized const declarations in
5873
     .rdata then don't put them in .comm.  */
5874
  if (TARGET_EMBEDDED_DATA && TARGET_UNINIT_CONST_IN_RODATA
5875
      && TREE_CODE (decl) == VAR_DECL && TREE_READONLY (decl)
5876
      && (DECL_INITIAL (decl) == 0 || DECL_INITIAL (decl) == error_mark_node))
5877
    {
5878
      if (TREE_PUBLIC (decl) && DECL_NAME (decl))
5879
        targetm.asm_out.globalize_label (stream, name);
5880
 
5881
      readonly_data_section ();
5882
      ASM_OUTPUT_ALIGN (stream, floor_log2 (align / BITS_PER_UNIT));
5883
      mips_declare_object (stream, name, "",
5884
                           ":\n\t.space\t" HOST_WIDE_INT_PRINT_UNSIGNED "\n",
5885
                           size);
5886
    }
5887
  else
5888
    mips_declare_common_object (stream, name, "\n\t.comm\t",
5889
                                size, align, true);
5890
}
5891
 
5892
/* Declare a common object of SIZE bytes using asm directive INIT_STRING.
5893
   NAME is the name of the object and ALIGN is the required alignment
5894
   in bytes.  TAKES_ALIGNMENT_P is true if the directive takes a third
5895
   alignment argument.  */
5896
 
5897
void
5898
mips_declare_common_object (FILE *stream, const char *name,
5899
                            const char *init_string,
5900
                            unsigned HOST_WIDE_INT size,
5901
                            unsigned int align, bool takes_alignment_p)
5902
{
5903
  if (!takes_alignment_p)
5904
    {
5905
      size += (align / BITS_PER_UNIT) - 1;
5906
      size -= size % (align / BITS_PER_UNIT);
5907
      mips_declare_object (stream, name, init_string,
5908
                           "," HOST_WIDE_INT_PRINT_UNSIGNED "\n", size);
5909
    }
5910
  else
5911
    mips_declare_object (stream, name, init_string,
5912
                         "," HOST_WIDE_INT_PRINT_UNSIGNED ",%u\n",
5913
                         size, align / BITS_PER_UNIT);
5914
}
5915
 
5916
/* Emit either a label, .comm, or .lcomm directive.  When using assembler
5917
   macros, mark the symbol as written so that mips_file_end won't emit an
5918
   .extern for it.  STREAM is the output file, NAME is the name of the
5919
   symbol, INIT_STRING is the string that should be written before the
5920
   symbol and FINAL_STRING is the string that should be written after it.
5921
   FINAL_STRING is a printf() format that consumes the remaining arguments.  */
5922
 
5923
void
5924
mips_declare_object (FILE *stream, const char *name, const char *init_string,
5925
                     const char *final_string, ...)
5926
{
5927
  va_list ap;
5928
 
5929
  fputs (init_string, stream);
5930
  assemble_name (stream, name);
5931
  va_start (ap, final_string);
5932
  vfprintf (stream, final_string, ap);
5933
  va_end (ap);
5934
 
5935
  if (!TARGET_EXPLICIT_RELOCS)
5936
    {
5937
      tree name_tree = get_identifier (name);
5938
      TREE_ASM_WRITTEN (name_tree) = 1;
5939
    }
5940
}
5941
 
5942
#ifdef ASM_OUTPUT_SIZE_DIRECTIVE
5943
extern int size_directive_output;
5944
 
5945
/* Implement ASM_DECLARE_OBJECT_NAME.  This is like most of the standard ELF
5946
   definitions except that it uses mips_declare_object() to emit the label.  */
5947
 
5948
void
5949
mips_declare_object_name (FILE *stream, const char *name,
5950
                          tree decl ATTRIBUTE_UNUSED)
5951
{
5952
#ifdef ASM_OUTPUT_TYPE_DIRECTIVE
5953
  ASM_OUTPUT_TYPE_DIRECTIVE (stream, name, "object");
5954
#endif
5955
 
5956
  size_directive_output = 0;
5957
  if (!flag_inhibit_size_directive && DECL_SIZE (decl))
5958
    {
5959
      HOST_WIDE_INT size;
5960
 
5961
      size_directive_output = 1;
5962
      size = int_size_in_bytes (TREE_TYPE (decl));
5963
      ASM_OUTPUT_SIZE_DIRECTIVE (stream, name, size);
5964
    }
5965
 
5966
  mips_declare_object (stream, name, "", ":\n");
5967
}
5968
 
5969
/* Implement ASM_FINISH_DECLARE_OBJECT.  This is generic ELF stuff.  */
5970
 
5971
void
5972
mips_finish_declare_object (FILE *stream, tree decl, int top_level, int at_end)
5973
{
5974
  const char *name;
5975
 
5976
  name = XSTR (XEXP (DECL_RTL (decl), 0), 0);
5977
  if (!flag_inhibit_size_directive
5978
      && DECL_SIZE (decl) != 0
5979
      && !at_end && top_level
5980
      && DECL_INITIAL (decl) == error_mark_node
5981
      && !size_directive_output)
5982
    {
5983
      HOST_WIDE_INT size;
5984
 
5985
      size_directive_output = 1;
5986
      size = int_size_in_bytes (TREE_TYPE (decl));
5987
      ASM_OUTPUT_SIZE_DIRECTIVE (stream, name, size);
5988
    }
5989
}
5990
#endif
5991
 
5992
/* Return true if X is a small data address that can be rewritten
5993
   as a LO_SUM.  */
5994
 
5995
static bool
5996
mips_rewrite_small_data_p (rtx x)
5997
{
5998
  enum mips_symbol_type symbol_type;
5999
 
6000
  return (TARGET_EXPLICIT_RELOCS
6001
          && mips_symbolic_constant_p (x, &symbol_type)
6002
          && symbol_type == SYMBOL_SMALL_DATA);
6003
}
6004
 
6005
 
6006
/* A for_each_rtx callback for mips_small_data_pattern_p.  */
6007
 
6008
static int
6009
mips_small_data_pattern_1 (rtx *loc, void *data ATTRIBUTE_UNUSED)
6010
{
6011
  if (GET_CODE (*loc) == LO_SUM)
6012
    return -1;
6013
 
6014
  return mips_rewrite_small_data_p (*loc);
6015
}
6016
 
6017
/* Return true if OP refers to small data symbols directly, not through
6018
   a LO_SUM.  */
6019
 
6020
bool
6021
mips_small_data_pattern_p (rtx op)
6022
{
6023
  return for_each_rtx (&op, mips_small_data_pattern_1, 0);
6024
}
6025
 
6026
/* A for_each_rtx callback, used by mips_rewrite_small_data.  */
6027
 
6028
static int
6029
mips_rewrite_small_data_1 (rtx *loc, void *data ATTRIBUTE_UNUSED)
6030
{
6031
  if (mips_rewrite_small_data_p (*loc))
6032
    *loc = gen_rtx_LO_SUM (Pmode, pic_offset_table_rtx, *loc);
6033
 
6034
  if (GET_CODE (*loc) == LO_SUM)
6035
    return -1;
6036
 
6037
  return 0;
6038
}
6039
 
6040
/* If possible, rewrite OP so that it refers to small data using
6041
   explicit relocations.  */
6042
 
6043
rtx
6044
mips_rewrite_small_data (rtx op)
6045
{
6046
  op = copy_insn (op);
6047
  for_each_rtx (&op, mips_rewrite_small_data_1, 0);
6048
  return op;
6049
}
6050
 
6051
/* Return true if the current function has an insn that implicitly
6052
   refers to $gp.  */
6053
 
6054
static bool
6055
mips_function_has_gp_insn (void)
6056
{
6057
  /* Don't bother rechecking if we found one last time.  */
6058
  if (!cfun->machine->has_gp_insn_p)
6059
    {
6060
      rtx insn;
6061
 
6062
      push_topmost_sequence ();
6063
      for (insn = get_insns (); insn; insn = NEXT_INSN (insn))
6064
        if (INSN_P (insn)
6065
            && GET_CODE (PATTERN (insn)) != USE
6066
            && GET_CODE (PATTERN (insn)) != CLOBBER
6067
            && (get_attr_got (insn) != GOT_UNSET
6068
                || small_data_pattern (PATTERN (insn), VOIDmode)))
6069
          break;
6070
      pop_topmost_sequence ();
6071
 
6072
      cfun->machine->has_gp_insn_p = (insn != 0);
6073
    }
6074
  return cfun->machine->has_gp_insn_p;
6075
}
6076
 
6077
 
6078
/* Return the register that should be used as the global pointer
6079
   within this function.  Return 0 if the function doesn't need
6080
   a global pointer.  */
6081
 
6082
static unsigned int
6083
mips_global_pointer (void)
6084
{
6085
  unsigned int regno;
6086
 
6087
  /* $gp is always available in non-abicalls code.  */
6088
  if (!TARGET_ABICALLS)
6089
    return GLOBAL_POINTER_REGNUM;
6090
 
6091
  /* We must always provide $gp when it is used implicitly.  */
6092
  if (!TARGET_EXPLICIT_RELOCS)
6093
    return GLOBAL_POINTER_REGNUM;
6094
 
6095
  /* FUNCTION_PROFILER includes a jal macro, so we need to give it
6096
     a valid gp.  */
6097
  if (current_function_profile)
6098
    return GLOBAL_POINTER_REGNUM;
6099
 
6100
  /* If the function has a nonlocal goto, $gp must hold the correct
6101
     global pointer for the target function.  */
6102
  if (current_function_has_nonlocal_goto)
6103
    return GLOBAL_POINTER_REGNUM;
6104
 
6105
  /* If the gp is never referenced, there's no need to initialize it.
6106
     Note that reload can sometimes introduce constant pool references
6107
     into a function that otherwise didn't need them.  For example,
6108
     suppose we have an instruction like:
6109
 
6110
          (set (reg:DF R1) (float:DF (reg:SI R2)))
6111
 
6112
     If R2 turns out to be constant such as 1, the instruction may have a
6113
     REG_EQUAL note saying that R1 == 1.0.  Reload then has the option of
6114
     using this constant if R2 doesn't get allocated to a register.
6115
 
6116
     In cases like these, reload will have added the constant to the pool
6117
     but no instruction will yet refer to it.  */
6118
  if (!regs_ever_live[GLOBAL_POINTER_REGNUM]
6119
      && !current_function_uses_const_pool
6120
      && !mips_function_has_gp_insn ())
6121
    return 0;
6122
 
6123
  /* We need a global pointer, but perhaps we can use a call-clobbered
6124
     register instead of $gp.  */
6125
  if (TARGET_NEWABI && current_function_is_leaf)
6126
    for (regno = GP_REG_FIRST; regno <= GP_REG_LAST; regno++)
6127
      if (!regs_ever_live[regno]
6128
          && call_used_regs[regno]
6129
          && !fixed_regs[regno]
6130
          && regno != PIC_FUNCTION_ADDR_REGNUM)
6131
        return regno;
6132
 
6133
  return GLOBAL_POINTER_REGNUM;
6134
}
6135
 
6136
 
6137
/* Return true if the current function must save REGNO.  */
6138
 
6139
static bool
6140
mips_save_reg_p (unsigned int regno)
6141
{
6142
  /* We only need to save $gp for NewABI PIC.  */
6143
  if (regno == GLOBAL_POINTER_REGNUM)
6144
    return (TARGET_ABICALLS && TARGET_NEWABI
6145
            && cfun->machine->global_pointer == regno);
6146
 
6147
  /* Check call-saved registers.  */
6148
  if (regs_ever_live[regno] && !call_used_regs[regno])
6149
    return true;
6150
 
6151
  /* We need to save the old frame pointer before setting up a new one.  */
6152
  if (regno == HARD_FRAME_POINTER_REGNUM && frame_pointer_needed)
6153
    return true;
6154
 
6155
  /* We need to save the incoming return address if it is ever clobbered
6156
     within the function.  */
6157
  if (regno == GP_REG_FIRST + 31 && regs_ever_live[regno])
6158
    return true;
6159
 
6160
  if (TARGET_MIPS16)
6161
    {
6162
      tree return_type;
6163
 
6164
      return_type = DECL_RESULT (current_function_decl);
6165
 
6166
      /* $18 is a special case in mips16 code.  It may be used to call
6167
         a function which returns a floating point value, but it is
6168
         marked in call_used_regs.  */
6169
      if (regno == GP_REG_FIRST + 18 && regs_ever_live[regno])
6170
        return true;
6171
 
6172
      /* $31 is also a special case.  It will be used to copy a return
6173
         value into the floating point registers if the return value is
6174
         floating point.  */
6175
      if (regno == GP_REG_FIRST + 31
6176
          && mips16_hard_float
6177
          && !aggregate_value_p (return_type, current_function_decl)
6178
          && GET_MODE_CLASS (DECL_MODE (return_type)) == MODE_FLOAT
6179
          && GET_MODE_SIZE (DECL_MODE (return_type)) <= UNITS_PER_FPVALUE)
6180
        return true;
6181
    }
6182
 
6183
  return false;
6184
}
6185
 
6186
 
6187
/* Return the bytes needed to compute the frame pointer from the current
6188
   stack pointer.  SIZE is the size (in bytes) of the local variables.
6189
 
6190
   MIPS stack frames look like:
6191
 
6192
             Before call                        After call
6193
        +-----------------------+       +-----------------------+
6194
   high |                       |       |                       |
6195
   mem. |                       |       |                       |
6196
        |  caller's temps.      |       |  caller's temps.      |
6197
        |                       |       |                       |
6198
        +-----------------------+       +-----------------------+
6199
        |                       |       |                       |
6200
        |  arguments on stack.  |       |  arguments on stack.  |
6201
        |                       |       |                       |
6202
        +-----------------------+       +-----------------------+
6203
        |  4 words to save      |       |  4 words to save      |
6204
        |  arguments passed     |       |  arguments passed     |
6205
        |  in registers, even   |       |  in registers, even   |
6206
    SP->|  if not passed.       |  VFP->|  if not passed.       |
6207
        +-----------------------+       +-----------------------+
6208
                                        |                       |
6209
                                        |  fp register save     |
6210
                                        |                       |
6211
                                        +-----------------------+
6212
                                        |                       |
6213
                                        |  gp register save     |
6214
                                        |                       |
6215
                                        +-----------------------+
6216
                                        |                       |
6217
                                        |  local variables      |
6218
                                        |                       |
6219
                                        +-----------------------+
6220
                                        |                       |
6221
                                        |  alloca allocations   |
6222
                                        |                       |
6223
                                        +-----------------------+
6224
                                        |                       |
6225
                                        |  GP save for V.4 abi  |
6226
                                        |                       |
6227
                                        +-----------------------+
6228
                                        |                       |
6229
                                        |  arguments on stack   |
6230
                                        |                       |
6231
                                        +-----------------------+
6232
                                        |  4 words to save      |
6233
                                        |  arguments passed     |
6234
                                        |  in registers, even   |
6235
   low                              SP->|  if not passed.       |
6236
   memory                               +-----------------------+
6237
 
6238
*/
6239
 
6240
HOST_WIDE_INT
6241
compute_frame_size (HOST_WIDE_INT size)
6242
{
6243
  unsigned int regno;
6244
  HOST_WIDE_INT total_size;     /* # bytes that the entire frame takes up */
6245
  HOST_WIDE_INT var_size;       /* # bytes that variables take up */
6246
  HOST_WIDE_INT args_size;      /* # bytes that outgoing arguments take up */
6247
  HOST_WIDE_INT cprestore_size; /* # bytes that the cprestore slot takes up */
6248
  HOST_WIDE_INT gp_reg_rounded; /* # bytes needed to store gp after rounding */
6249
  HOST_WIDE_INT gp_reg_size;    /* # bytes needed to store gp regs */
6250
  HOST_WIDE_INT fp_reg_size;    /* # bytes needed to store fp regs */
6251
  unsigned int mask;            /* mask of saved gp registers */
6252
  unsigned int fmask;           /* mask of saved fp registers */
6253
 
6254
  cfun->machine->global_pointer = mips_global_pointer ();
6255
 
6256
  gp_reg_size = 0;
6257
  fp_reg_size = 0;
6258
  mask = 0;
6259
  fmask = 0;
6260
  var_size = MIPS_STACK_ALIGN (size);
6261
  args_size = current_function_outgoing_args_size;
6262
  cprestore_size = MIPS_STACK_ALIGN (STARTING_FRAME_OFFSET) - args_size;
6263
 
6264
  /* The space set aside by STARTING_FRAME_OFFSET isn't needed in leaf
6265
     functions.  If the function has local variables, we're committed
6266
     to allocating it anyway.  Otherwise reclaim it here.  */
6267
  if (var_size == 0 && current_function_is_leaf)
6268
    cprestore_size = args_size = 0;
6269
 
6270
  /* The MIPS 3.0 linker does not like functions that dynamically
6271
     allocate the stack and have 0 for STACK_DYNAMIC_OFFSET, since it
6272
     looks like we are trying to create a second frame pointer to the
6273
     function, so allocate some stack space to make it happy.  */
6274
 
6275
  if (args_size == 0 && current_function_calls_alloca)
6276
    args_size = 4 * UNITS_PER_WORD;
6277
 
6278
  total_size = var_size + args_size + cprestore_size;
6279
 
6280
  /* Calculate space needed for gp registers.  */
6281
  for (regno = GP_REG_FIRST; regno <= GP_REG_LAST; regno++)
6282
    if (mips_save_reg_p (regno))
6283
      {
6284
        gp_reg_size += GET_MODE_SIZE (gpr_mode);
6285
        mask |= 1 << (regno - GP_REG_FIRST);
6286
      }
6287
 
6288
  /* We need to restore these for the handler.  */
6289
  if (current_function_calls_eh_return)
6290
    {
6291
      unsigned int i;
6292
      for (i = 0; ; ++i)
6293
        {
6294
          regno = EH_RETURN_DATA_REGNO (i);
6295
          if (regno == INVALID_REGNUM)
6296
            break;
6297
          gp_reg_size += GET_MODE_SIZE (gpr_mode);
6298
          mask |= 1 << (regno - GP_REG_FIRST);
6299
        }
6300
    }
6301
 
6302
  /* This loop must iterate over the same space as its companion in
6303
     save_restore_insns.  */
6304
  for (regno = (FP_REG_LAST - FP_INC + 1);
6305
       regno >= FP_REG_FIRST;
6306
       regno -= FP_INC)
6307
    {
6308
      if (mips_save_reg_p (regno))
6309
        {
6310
          fp_reg_size += FP_INC * UNITS_PER_FPREG;
6311
          fmask |= ((1 << FP_INC) - 1) << (regno - FP_REG_FIRST);
6312
        }
6313
    }
6314
 
6315
  gp_reg_rounded = MIPS_STACK_ALIGN (gp_reg_size);
6316
  total_size += gp_reg_rounded + MIPS_STACK_ALIGN (fp_reg_size);
6317
 
6318
  /* Add in the space required for saving incoming register arguments.  */
6319
  total_size += current_function_pretend_args_size;
6320
  total_size += MIPS_STACK_ALIGN (cfun->machine->varargs_size);
6321
 
6322
  /* Save other computed information.  */
6323
  cfun->machine->frame.total_size = total_size;
6324
  cfun->machine->frame.var_size = var_size;
6325
  cfun->machine->frame.args_size = args_size;
6326
  cfun->machine->frame.cprestore_size = cprestore_size;
6327
  cfun->machine->frame.gp_reg_size = gp_reg_size;
6328
  cfun->machine->frame.fp_reg_size = fp_reg_size;
6329
  cfun->machine->frame.mask = mask;
6330
  cfun->machine->frame.fmask = fmask;
6331
  cfun->machine->frame.initialized = reload_completed;
6332
  cfun->machine->frame.num_gp = gp_reg_size / UNITS_PER_WORD;
6333
  cfun->machine->frame.num_fp = fp_reg_size / (FP_INC * UNITS_PER_FPREG);
6334
 
6335
  if (mask)
6336
    {
6337
      HOST_WIDE_INT offset;
6338
 
6339
      offset = (args_size + cprestore_size + var_size
6340
                + gp_reg_size - GET_MODE_SIZE (gpr_mode));
6341
      cfun->machine->frame.gp_sp_offset = offset;
6342
      cfun->machine->frame.gp_save_offset = offset - total_size;
6343
    }
6344
  else
6345
    {
6346
      cfun->machine->frame.gp_sp_offset = 0;
6347
      cfun->machine->frame.gp_save_offset = 0;
6348
    }
6349
 
6350
  if (fmask)
6351
    {
6352
      HOST_WIDE_INT offset;
6353
 
6354
      offset = (args_size + cprestore_size + var_size
6355
                + gp_reg_rounded + fp_reg_size
6356
                - FP_INC * UNITS_PER_FPREG);
6357
      cfun->machine->frame.fp_sp_offset = offset;
6358
      cfun->machine->frame.fp_save_offset = offset - total_size;
6359
    }
6360
  else
6361
    {
6362
      cfun->machine->frame.fp_sp_offset = 0;
6363
      cfun->machine->frame.fp_save_offset = 0;
6364
    }
6365
 
6366
  /* Ok, we're done.  */
6367
  return total_size;
6368
}
6369
 
6370
/* Implement INITIAL_ELIMINATION_OFFSET.  FROM is either the frame
6371
   pointer or argument pointer.  TO is either the stack pointer or
6372
   hard frame pointer.  */
6373
 
6374
HOST_WIDE_INT
6375
mips_initial_elimination_offset (int from, int to)
6376
{
6377
  HOST_WIDE_INT offset;
6378
 
6379
  compute_frame_size (get_frame_size ());
6380
 
6381
  /* Set OFFSET to the offset from the stack pointer.  */
6382
  switch (from)
6383
    {
6384
    case FRAME_POINTER_REGNUM:
6385
      offset = 0;
6386
      break;
6387
 
6388
    case ARG_POINTER_REGNUM:
6389
      offset = (cfun->machine->frame.total_size
6390
                - current_function_pretend_args_size);
6391
      break;
6392
 
6393
    default:
6394
      gcc_unreachable ();
6395
    }
6396
 
6397
  if (TARGET_MIPS16 && to == HARD_FRAME_POINTER_REGNUM)
6398
    offset -= cfun->machine->frame.args_size;
6399
 
6400
  return offset;
6401
}
6402
 
6403
/* Implement RETURN_ADDR_RTX.  Note, we do not support moving
6404
   back to a previous frame.  */
6405
rtx
6406
mips_return_addr (int count, rtx frame ATTRIBUTE_UNUSED)
6407
{
6408
  if (count != 0)
6409
    return const0_rtx;
6410
 
6411
  return get_hard_reg_initial_val (Pmode, GP_REG_FIRST + 31);
6412
}
6413
 
6414
/* Use FN to save or restore register REGNO.  MODE is the register's
6415
   mode and OFFSET is the offset of its save slot from the current
6416
   stack pointer.  */
6417
 
6418
static void
6419
mips_save_restore_reg (enum machine_mode mode, int regno,
6420
                       HOST_WIDE_INT offset, mips_save_restore_fn fn)
6421
{
6422
  rtx mem;
6423
 
6424
  mem = gen_rtx_MEM (mode, plus_constant (stack_pointer_rtx, offset));
6425
 
6426
  fn (gen_rtx_REG (mode, regno), mem);
6427
}
6428
 
6429
 
6430
/* Call FN for each register that is saved by the current function.
6431
   SP_OFFSET is the offset of the current stack pointer from the start
6432
   of the frame.  */
6433
 
6434
static void
6435
mips_for_each_saved_reg (HOST_WIDE_INT sp_offset, mips_save_restore_fn fn)
6436
{
6437
#define BITSET_P(VALUE, BIT) (((VALUE) & (1L << (BIT))) != 0)
6438
 
6439
  enum machine_mode fpr_mode;
6440
  HOST_WIDE_INT offset;
6441
  int regno;
6442
 
6443
  /* Save registers starting from high to low.  The debuggers prefer at least
6444
     the return register be stored at func+4, and also it allows us not to
6445
     need a nop in the epilog if at least one register is reloaded in
6446
     addition to return address.  */
6447
  offset = cfun->machine->frame.gp_sp_offset - sp_offset;
6448
  for (regno = GP_REG_LAST; regno >= GP_REG_FIRST; regno--)
6449
    if (BITSET_P (cfun->machine->frame.mask, regno - GP_REG_FIRST))
6450
      {
6451
        mips_save_restore_reg (gpr_mode, regno, offset, fn);
6452
        offset -= GET_MODE_SIZE (gpr_mode);
6453
      }
6454
 
6455
  /* This loop must iterate over the same space as its companion in
6456
     compute_frame_size.  */
6457
  offset = cfun->machine->frame.fp_sp_offset - sp_offset;
6458
  fpr_mode = (TARGET_SINGLE_FLOAT ? SFmode : DFmode);
6459
  for (regno = (FP_REG_LAST - FP_INC + 1);
6460
       regno >= FP_REG_FIRST;
6461
       regno -= FP_INC)
6462
    if (BITSET_P (cfun->machine->frame.fmask, regno - FP_REG_FIRST))
6463
      {
6464
        mips_save_restore_reg (fpr_mode, regno, offset, fn);
6465
        offset -= GET_MODE_SIZE (fpr_mode);
6466
      }
6467
#undef BITSET_P
6468
}
6469
 
6470
/* If we're generating n32 or n64 abicalls, and the current function
6471
   does not use $28 as its global pointer, emit a cplocal directive.
6472
   Use pic_offset_table_rtx as the argument to the directive.  */
6473
 
6474
static void
6475
mips_output_cplocal (void)
6476
{
6477
  if (!TARGET_EXPLICIT_RELOCS
6478
      && cfun->machine->global_pointer > 0
6479
      && cfun->machine->global_pointer != GLOBAL_POINTER_REGNUM)
6480
    output_asm_insn (".cplocal %+", 0);
6481
}
6482
 
6483
/* If we're generating n32 or n64 abicalls, emit instructions
6484
   to set up the global pointer.  */
6485
 
6486
static void
6487
mips_emit_loadgp (void)
6488
{
6489
  if (TARGET_ABICALLS && TARGET_NEWABI && cfun->machine->global_pointer > 0)
6490
    {
6491
      rtx addr, offset, incoming_address;
6492
 
6493
      addr = XEXP (DECL_RTL (current_function_decl), 0);
6494
      offset = mips_unspec_address (addr, SYMBOL_GOTOFF_LOADGP);
6495
      incoming_address = gen_rtx_REG (Pmode, PIC_FUNCTION_ADDR_REGNUM);
6496
      emit_insn (gen_loadgp (offset, incoming_address));
6497
      if (!TARGET_EXPLICIT_RELOCS)
6498
        emit_insn (gen_loadgp_blockage ());
6499
    }
6500
}
6501
 
6502
/* Set up the stack and frame (if desired) for the function.  */
6503
 
6504
static void
6505
mips_output_function_prologue (FILE *file, HOST_WIDE_INT size ATTRIBUTE_UNUSED)
6506
{
6507
  const char *fnname;
6508
  HOST_WIDE_INT tsize = cfun->machine->frame.total_size;
6509
 
6510
#ifdef SDB_DEBUGGING_INFO
6511
  if (debug_info_level != DINFO_LEVEL_TERSE && write_symbols == SDB_DEBUG)
6512
    SDB_OUTPUT_SOURCE_LINE (file, DECL_SOURCE_LINE (current_function_decl));
6513
#endif
6514
 
6515
  /* In mips16 mode, we may need to generate a 32 bit to handle
6516
     floating point arguments.  The linker will arrange for any 32 bit
6517
     functions to call this stub, which will then jump to the 16 bit
6518
     function proper.  */
6519
  if (TARGET_MIPS16 && !TARGET_SOFT_FLOAT
6520
      && current_function_args_info.fp_code != 0)
6521
    build_mips16_function_stub (file);
6522
 
6523
  if (!FUNCTION_NAME_ALREADY_DECLARED)
6524
    {
6525
      /* Get the function name the same way that toplev.c does before calling
6526
         assemble_start_function.  This is needed so that the name used here
6527
         exactly matches the name used in ASM_DECLARE_FUNCTION_NAME.  */
6528
      fnname = XSTR (XEXP (DECL_RTL (current_function_decl), 0), 0);
6529
 
6530
      if (!flag_inhibit_size_directive)
6531
        {
6532
          fputs ("\t.ent\t", file);
6533
          assemble_name (file, fnname);
6534
          fputs ("\n", file);
6535
        }
6536
 
6537
      assemble_name (file, fnname);
6538
      fputs (":\n", file);
6539
    }
6540
 
6541
  /* Stop mips_file_end from treating this function as external.  */
6542
  if (TARGET_IRIX && mips_abi == ABI_32)
6543
    TREE_ASM_WRITTEN (DECL_NAME (cfun->decl)) = 1;
6544
 
6545
  if (!flag_inhibit_size_directive)
6546
    {
6547
      /* .frame FRAMEREG, FRAMESIZE, RETREG */
6548
      fprintf (file,
6549
               "\t.frame\t%s," HOST_WIDE_INT_PRINT_DEC ",%s\t\t"
6550
               "# vars= " HOST_WIDE_INT_PRINT_DEC ", regs= %d/%d"
6551
               ", args= " HOST_WIDE_INT_PRINT_DEC
6552
               ", gp= " HOST_WIDE_INT_PRINT_DEC "\n",
6553
               (reg_names[(frame_pointer_needed)
6554
                          ? HARD_FRAME_POINTER_REGNUM : STACK_POINTER_REGNUM]),
6555
               ((frame_pointer_needed && TARGET_MIPS16)
6556
                ? tsize - cfun->machine->frame.args_size
6557
                : tsize),
6558
               reg_names[GP_REG_FIRST + 31],
6559
               cfun->machine->frame.var_size,
6560
               cfun->machine->frame.num_gp,
6561
               cfun->machine->frame.num_fp,
6562
               cfun->machine->frame.args_size,
6563
               cfun->machine->frame.cprestore_size);
6564
 
6565
      /* .mask MASK, GPOFFSET; .fmask FPOFFSET */
6566
      fprintf (file, "\t.mask\t0x%08x," HOST_WIDE_INT_PRINT_DEC "\n",
6567
               cfun->machine->frame.mask,
6568
               cfun->machine->frame.gp_save_offset);
6569
      fprintf (file, "\t.fmask\t0x%08x," HOST_WIDE_INT_PRINT_DEC "\n",
6570
               cfun->machine->frame.fmask,
6571
               cfun->machine->frame.fp_save_offset);
6572
 
6573
      /* Require:
6574
         OLD_SP == *FRAMEREG + FRAMESIZE => can find old_sp from nominated FP reg.
6575
         HIGHEST_GP_SAVED == *FRAMEREG + FRAMESIZE + GPOFFSET => can find saved regs.  */
6576
    }
6577
 
6578
  if (TARGET_ABICALLS && !TARGET_NEWABI && cfun->machine->global_pointer > 0)
6579
    {
6580
      /* Handle the initialization of $gp for SVR4 PIC.  */
6581
      if (!cfun->machine->all_noreorder_p)
6582
        output_asm_insn ("%(.cpload\t%^%)", 0);
6583
      else
6584
        output_asm_insn ("%(.cpload\t%^\n\t%<", 0);
6585
    }
6586
  else if (cfun->machine->all_noreorder_p)
6587
    output_asm_insn ("%(%<", 0);
6588
 
6589
  /* Tell the assembler which register we're using as the global
6590
     pointer.  This is needed for thunks, since they can use either
6591
     explicit relocs or assembler macros.  */
6592
  mips_output_cplocal ();
6593
}
6594
 
6595
/* Make the last instruction frame related and note that it performs
6596
   the operation described by FRAME_PATTERN.  */
6597
 
6598
static void
6599
mips_set_frame_expr (rtx frame_pattern)
6600
{
6601
  rtx insn;
6602
 
6603
  insn = get_last_insn ();
6604
  RTX_FRAME_RELATED_P (insn) = 1;
6605
  REG_NOTES (insn) = alloc_EXPR_LIST (REG_FRAME_RELATED_EXPR,
6606
                                      frame_pattern,
6607
                                      REG_NOTES (insn));
6608
}
6609
 
6610
 
6611
/* Return a frame-related rtx that stores REG at MEM.
6612
   REG must be a single register.  */
6613
 
6614
static rtx
6615
mips_frame_set (rtx mem, rtx reg)
6616
{
6617
  rtx set;
6618
 
6619
  /* If we're saving the return address register and the dwarf return
6620
     address column differs from the hard register number, adjust the
6621
     note reg to refer to the former.  */
6622
  if (REGNO (reg) == GP_REG_FIRST + 31
6623
      && DWARF_FRAME_RETURN_COLUMN != GP_REG_FIRST + 31)
6624
    reg = gen_rtx_REG (GET_MODE (reg), DWARF_FRAME_RETURN_COLUMN);
6625
 
6626
  set = gen_rtx_SET (VOIDmode, mem, reg);
6627
  RTX_FRAME_RELATED_P (set) = 1;
6628
 
6629
  return set;
6630
}
6631
 
6632
 
6633
/* Save register REG to MEM.  Make the instruction frame-related.  */
6634
 
6635
static void
6636
mips_save_reg (rtx reg, rtx mem)
6637
{
6638
  if (GET_MODE (reg) == DFmode && !TARGET_FLOAT64)
6639
    {
6640
      rtx x1, x2;
6641
 
6642
      if (mips_split_64bit_move_p (mem, reg))
6643
        mips_split_64bit_move (mem, reg);
6644
      else
6645
        emit_move_insn (mem, reg);
6646
 
6647
      x1 = mips_frame_set (mips_subword (mem, 0), mips_subword (reg, 0));
6648
      x2 = mips_frame_set (mips_subword (mem, 1), mips_subword (reg, 1));
6649
      mips_set_frame_expr (gen_rtx_PARALLEL (VOIDmode, gen_rtvec (2, x1, x2)));
6650
    }
6651
  else
6652
    {
6653
      if (TARGET_MIPS16
6654
          && REGNO (reg) != GP_REG_FIRST + 31
6655
          && !M16_REG_P (REGNO (reg)))
6656
        {
6657
          /* Save a non-mips16 register by moving it through a temporary.
6658
             We don't need to do this for $31 since there's a special
6659
             instruction for it.  */
6660
          emit_move_insn (MIPS_PROLOGUE_TEMP (GET_MODE (reg)), reg);
6661
          emit_move_insn (mem, MIPS_PROLOGUE_TEMP (GET_MODE (reg)));
6662
        }
6663
      else
6664
        emit_move_insn (mem, reg);
6665
 
6666
      mips_set_frame_expr (mips_frame_set (mem, reg));
6667
    }
6668
}
6669
 
6670
 
6671
/* Expand the prologue into a bunch of separate insns.  */
6672
 
6673
void
6674
mips_expand_prologue (void)
6675
{
6676
  HOST_WIDE_INT size;
6677
 
6678
  if (cfun->machine->global_pointer > 0)
6679
    REGNO (pic_offset_table_rtx) = cfun->machine->global_pointer;
6680
 
6681
  size = compute_frame_size (get_frame_size ());
6682
 
6683
  /* Save the registers.  Allocate up to MIPS_MAX_FIRST_STACK_STEP
6684
     bytes beforehand; this is enough to cover the register save area
6685
     without going out of range.  */
6686
  if ((cfun->machine->frame.mask | cfun->machine->frame.fmask) != 0)
6687
    {
6688
      HOST_WIDE_INT step1;
6689
 
6690
      step1 = MIN (size, MIPS_MAX_FIRST_STACK_STEP);
6691
      RTX_FRAME_RELATED_P (emit_insn (gen_add3_insn (stack_pointer_rtx,
6692
                                                     stack_pointer_rtx,
6693
                                                     GEN_INT (-step1)))) = 1;
6694
      size -= step1;
6695
      mips_for_each_saved_reg (size, mips_save_reg);
6696
    }
6697
 
6698
  /* Allocate the rest of the frame.  */
6699
  if (size > 0)
6700
    {
6701
      if (SMALL_OPERAND (-size))
6702
        RTX_FRAME_RELATED_P (emit_insn (gen_add3_insn (stack_pointer_rtx,
6703
                                                       stack_pointer_rtx,
6704
                                                       GEN_INT (-size)))) = 1;
6705
      else
6706
        {
6707
          emit_move_insn (MIPS_PROLOGUE_TEMP (Pmode), GEN_INT (size));
6708
          if (TARGET_MIPS16)
6709
            {
6710
              /* There are no instructions to add or subtract registers
6711
                 from the stack pointer, so use the frame pointer as a
6712
                 temporary.  We should always be using a frame pointer
6713
                 in this case anyway.  */
6714
              gcc_assert (frame_pointer_needed);
6715
              emit_move_insn (hard_frame_pointer_rtx, stack_pointer_rtx);
6716
              emit_insn (gen_sub3_insn (hard_frame_pointer_rtx,
6717
                                        hard_frame_pointer_rtx,
6718
                                        MIPS_PROLOGUE_TEMP (Pmode)));
6719
              emit_move_insn (stack_pointer_rtx, hard_frame_pointer_rtx);
6720
            }
6721
          else
6722
            emit_insn (gen_sub3_insn (stack_pointer_rtx,
6723
                                      stack_pointer_rtx,
6724
                                      MIPS_PROLOGUE_TEMP (Pmode)));
6725
 
6726
          /* Describe the combined effect of the previous instructions.  */
6727
          mips_set_frame_expr
6728
            (gen_rtx_SET (VOIDmode, stack_pointer_rtx,
6729
                          plus_constant (stack_pointer_rtx, -size)));
6730
        }
6731
    }
6732
 
6733
  /* Set up the frame pointer, if we're using one.  In mips16 code,
6734
     we point the frame pointer ahead of the outgoing argument area.
6735
     This should allow more variables & incoming arguments to be
6736
     accessed with unextended instructions.  */
6737
  if (frame_pointer_needed)
6738
    {
6739
      if (TARGET_MIPS16 && cfun->machine->frame.args_size != 0)
6740
        {
6741
          rtx offset = GEN_INT (cfun->machine->frame.args_size);
6742
          if (SMALL_OPERAND (cfun->machine->frame.args_size))
6743
            RTX_FRAME_RELATED_P
6744
              (emit_insn (gen_add3_insn (hard_frame_pointer_rtx,
6745
                                         stack_pointer_rtx,
6746
                                         offset))) = 1;
6747
          else
6748
            {
6749
              emit_move_insn (MIPS_PROLOGUE_TEMP (Pmode), offset);
6750
              emit_move_insn (hard_frame_pointer_rtx, stack_pointer_rtx);
6751
              emit_insn (gen_add3_insn (hard_frame_pointer_rtx,
6752
                                        hard_frame_pointer_rtx,
6753
                                        MIPS_PROLOGUE_TEMP (Pmode)));
6754
              mips_set_frame_expr
6755
                (gen_rtx_SET (VOIDmode, hard_frame_pointer_rtx,
6756
                              plus_constant (stack_pointer_rtx,
6757
                                             cfun->machine->frame.args_size)));
6758
            }
6759
        }
6760
      else
6761
        RTX_FRAME_RELATED_P (emit_move_insn (hard_frame_pointer_rtx,
6762
                                             stack_pointer_rtx)) = 1;
6763
    }
6764
 
6765
  /* If generating o32/o64 abicalls, save $gp on the stack.  */
6766
  if (TARGET_ABICALLS && !TARGET_NEWABI && !current_function_is_leaf)
6767
    emit_insn (gen_cprestore (GEN_INT (current_function_outgoing_args_size)));
6768
 
6769
  mips_emit_loadgp ();
6770
 
6771
  /* If we are profiling, make sure no instructions are scheduled before
6772
     the call to mcount.  */
6773
 
6774
  if (current_function_profile)
6775
    emit_insn (gen_blockage ());
6776
}
6777
 
6778
/* Do any necessary cleanup after a function to restore stack, frame,
6779
   and regs.  */
6780
 
6781
#define RA_MASK BITMASK_HIGH    /* 1 << 31 */
6782
 
6783
static void
6784
mips_output_function_epilogue (FILE *file ATTRIBUTE_UNUSED,
6785
                               HOST_WIDE_INT size ATTRIBUTE_UNUSED)
6786
{
6787
  /* Reinstate the normal $gp.  */
6788
  REGNO (pic_offset_table_rtx) = GLOBAL_POINTER_REGNUM;
6789
  mips_output_cplocal ();
6790
 
6791
  if (cfun->machine->all_noreorder_p)
6792
    {
6793
      /* Avoid using %>%) since it adds excess whitespace.  */
6794
      output_asm_insn (".set\tmacro", 0);
6795
      output_asm_insn (".set\treorder", 0);
6796
      set_noreorder = set_nomacro = 0;
6797
    }
6798
 
6799
  if (!FUNCTION_NAME_ALREADY_DECLARED && !flag_inhibit_size_directive)
6800
    {
6801
      const char *fnname;
6802
 
6803
      /* Get the function name the same way that toplev.c does before calling
6804
         assemble_start_function.  This is needed so that the name used here
6805
         exactly matches the name used in ASM_DECLARE_FUNCTION_NAME.  */
6806
      fnname = XSTR (XEXP (DECL_RTL (current_function_decl), 0), 0);
6807
      fputs ("\t.end\t", file);
6808
      assemble_name (file, fnname);
6809
      fputs ("\n", file);
6810
    }
6811
}
6812
 
6813
/* Emit instructions to restore register REG from slot MEM.  */
6814
 
6815
static void
6816
mips_restore_reg (rtx reg, rtx mem)
6817
{
6818
  /* There's no mips16 instruction to load $31 directly.  Load into
6819
     $7 instead and adjust the return insn appropriately.  */
6820
  if (TARGET_MIPS16 && REGNO (reg) == GP_REG_FIRST + 31)
6821
    reg = gen_rtx_REG (GET_MODE (reg), 7);
6822
 
6823
  if (TARGET_MIPS16 && !M16_REG_P (REGNO (reg)))
6824
    {
6825
      /* Can't restore directly; move through a temporary.  */
6826
      emit_move_insn (MIPS_EPILOGUE_TEMP (GET_MODE (reg)), mem);
6827
      emit_move_insn (reg, MIPS_EPILOGUE_TEMP (GET_MODE (reg)));
6828
    }
6829
  else
6830
    emit_move_insn (reg, mem);
6831
}
6832
 
6833
 
6834
/* Expand the epilogue into a bunch of separate insns.  SIBCALL_P is true
6835
   if this epilogue precedes a sibling call, false if it is for a normal
6836
   "epilogue" pattern.  */
6837
 
6838
void
6839
mips_expand_epilogue (int sibcall_p)
6840
{
6841
  HOST_WIDE_INT step1, step2;
6842
  rtx base, target;
6843
 
6844
  if (!sibcall_p && mips_can_use_return_insn ())
6845
    {
6846
      emit_jump_insn (gen_return ());
6847
      return;
6848
    }
6849
 
6850
  /* Split the frame into two.  STEP1 is the amount of stack we should
6851
     deallocate before restoring the registers.  STEP2 is the amount we
6852
     should deallocate afterwards.
6853
 
6854
     Start off by assuming that no registers need to be restored.  */
6855
  step1 = cfun->machine->frame.total_size;
6856
  step2 = 0;
6857
 
6858
  /* Work out which register holds the frame address.  Account for the
6859
     frame pointer offset used by mips16 code.  */
6860
  if (!frame_pointer_needed)
6861
    base = stack_pointer_rtx;
6862
  else
6863
    {
6864
      base = hard_frame_pointer_rtx;
6865
      if (TARGET_MIPS16)
6866
        step1 -= cfun->machine->frame.args_size;
6867
    }
6868
 
6869
  /* If we need to restore registers, deallocate as much stack as
6870
     possible in the second step without going out of range.  */
6871
  if ((cfun->machine->frame.mask | cfun->machine->frame.fmask) != 0)
6872
    {
6873
      step2 = MIN (step1, MIPS_MAX_FIRST_STACK_STEP);
6874
      step1 -= step2;
6875
    }
6876
 
6877
  /* Set TARGET to BASE + STEP1.  */
6878
  target = base;
6879
  if (step1 > 0)
6880
    {
6881
      rtx adjust;
6882
 
6883
      /* Get an rtx for STEP1 that we can add to BASE.  */
6884
      adjust = GEN_INT (step1);
6885
      if (!SMALL_OPERAND (step1))
6886
        {
6887
          emit_move_insn (MIPS_EPILOGUE_TEMP (Pmode), adjust);
6888
          adjust = MIPS_EPILOGUE_TEMP (Pmode);
6889
        }
6890
 
6891
      /* Normal mode code can copy the result straight into $sp.  */
6892
      if (!TARGET_MIPS16)
6893
        target = stack_pointer_rtx;
6894
 
6895
      emit_insn (gen_add3_insn (target, base, adjust));
6896
    }
6897
 
6898
  /* Copy TARGET into the stack pointer.  */
6899
  if (target != stack_pointer_rtx)
6900
    emit_move_insn (stack_pointer_rtx, target);
6901
 
6902
  /* If we're using addressing macros for n32/n64 abicalls, $gp is
6903
     implicitly used by all SYMBOL_REFs.  We must emit a blockage
6904
     insn before restoring it.  */
6905
  if (TARGET_ABICALLS && TARGET_NEWABI && !TARGET_EXPLICIT_RELOCS)
6906
    emit_insn (gen_blockage ());
6907
 
6908
  /* Restore the registers.  */
6909
  mips_for_each_saved_reg (cfun->machine->frame.total_size - step2,
6910
                           mips_restore_reg);
6911
 
6912
  /* Deallocate the final bit of the frame.  */
6913
  if (step2 > 0)
6914
    emit_insn (gen_add3_insn (stack_pointer_rtx,
6915
                              stack_pointer_rtx,
6916
                              GEN_INT (step2)));
6917
 
6918
  /* Add in the __builtin_eh_return stack adjustment.  We need to
6919
     use a temporary in mips16 code.  */
6920
  if (current_function_calls_eh_return)
6921
    {
6922
      if (TARGET_MIPS16)
6923
        {
6924
          emit_move_insn (MIPS_EPILOGUE_TEMP (Pmode), stack_pointer_rtx);
6925
          emit_insn (gen_add3_insn (MIPS_EPILOGUE_TEMP (Pmode),
6926
                                    MIPS_EPILOGUE_TEMP (Pmode),
6927
                                    EH_RETURN_STACKADJ_RTX));
6928
          emit_move_insn (stack_pointer_rtx, MIPS_EPILOGUE_TEMP (Pmode));
6929
        }
6930
      else
6931
        emit_insn (gen_add3_insn (stack_pointer_rtx,
6932
                                  stack_pointer_rtx,
6933
                                  EH_RETURN_STACKADJ_RTX));
6934
    }
6935
 
6936
  if (!sibcall_p)
6937
    {
6938
      /* The mips16 loads the return address into $7, not $31.  */
6939
      if (TARGET_MIPS16 && (cfun->machine->frame.mask & RA_MASK) != 0)
6940
        emit_jump_insn (gen_return_internal (gen_rtx_REG (Pmode,
6941
                                                          GP_REG_FIRST + 7)));
6942
      else
6943
        emit_jump_insn (gen_return_internal (gen_rtx_REG (Pmode,
6944
                                                          GP_REG_FIRST + 31)));
6945
    }
6946
}
6947
 
6948
/* Return nonzero if this function is known to have a null epilogue.
6949
   This allows the optimizer to omit jumps to jumps if no stack
6950
   was created.  */
6951
 
6952
int
6953
mips_can_use_return_insn (void)
6954
{
6955
  tree return_type;
6956
 
6957
  if (! reload_completed)
6958
    return 0;
6959
 
6960
  if (regs_ever_live[31] || current_function_profile)
6961
    return 0;
6962
 
6963
  return_type = DECL_RESULT (current_function_decl);
6964
 
6965
  /* In mips16 mode, a function which returns a floating point value
6966
     needs to arrange to copy the return value into the floating point
6967
     registers.  */
6968
  if (TARGET_MIPS16
6969
      && mips16_hard_float
6970
      && ! aggregate_value_p (return_type, current_function_decl)
6971
      && GET_MODE_CLASS (DECL_MODE (return_type)) == MODE_FLOAT
6972
      && GET_MODE_SIZE (DECL_MODE (return_type)) <= UNITS_PER_FPVALUE)
6973
    return 0;
6974
 
6975
  if (cfun->machine->frame.initialized)
6976
    return cfun->machine->frame.total_size == 0;
6977
 
6978
  return compute_frame_size (get_frame_size ()) == 0;
6979
}
6980
 
6981
/* Implement TARGET_ASM_OUTPUT_MI_THUNK.  Generate rtl rather than asm text
6982
   in order to avoid duplicating too much logic from elsewhere.  */
6983
 
6984
static void
6985
mips_output_mi_thunk (FILE *file, tree thunk_fndecl ATTRIBUTE_UNUSED,
6986
                      HOST_WIDE_INT delta, HOST_WIDE_INT vcall_offset,
6987
                      tree function)
6988
{
6989
  rtx this, temp1, temp2, insn, fnaddr;
6990
 
6991
  /* Pretend to be a post-reload pass while generating rtl.  */
6992
  no_new_pseudos = 1;
6993
  reload_completed = 1;
6994
  reset_block_changes ();
6995
 
6996
  /* Pick a global pointer for -mabicalls.  Use $15 rather than $28
6997
     for TARGET_NEWABI since the latter is a call-saved register.  */
6998
  if (TARGET_ABICALLS)
6999
    cfun->machine->global_pointer
7000
      = REGNO (pic_offset_table_rtx)
7001
      = TARGET_NEWABI ? 15 : GLOBAL_POINTER_REGNUM;
7002
 
7003
  /* Set up the global pointer for n32 or n64 abicalls.  */
7004
  mips_emit_loadgp ();
7005
 
7006
  /* We need two temporary registers in some cases.  */
7007
  temp1 = gen_rtx_REG (Pmode, 2);
7008
  temp2 = gen_rtx_REG (Pmode, 3);
7009
 
7010
  /* Find out which register contains the "this" pointer.  */
7011
  if (aggregate_value_p (TREE_TYPE (TREE_TYPE (function)), function))
7012
    this = gen_rtx_REG (Pmode, GP_ARG_FIRST + 1);
7013
  else
7014
    this = gen_rtx_REG (Pmode, GP_ARG_FIRST);
7015
 
7016
  /* Add DELTA to THIS.  */
7017
  if (delta != 0)
7018
    {
7019
      rtx offset = GEN_INT (delta);
7020
      if (!SMALL_OPERAND (delta))
7021
        {
7022
          emit_move_insn (temp1, offset);
7023
          offset = temp1;
7024
        }
7025
      emit_insn (gen_add3_insn (this, this, offset));
7026
    }
7027
 
7028
  /* If needed, add *(*THIS + VCALL_OFFSET) to THIS.  */
7029
  if (vcall_offset != 0)
7030
    {
7031
      rtx addr;
7032
 
7033
      /* Set TEMP1 to *THIS.  */
7034
      emit_move_insn (temp1, gen_rtx_MEM (Pmode, this));
7035
 
7036
      /* Set ADDR to a legitimate address for *THIS + VCALL_OFFSET.  */
7037
      addr = mips_add_offset (temp2, temp1, vcall_offset);
7038
 
7039
      /* Load the offset and add it to THIS.  */
7040
      emit_move_insn (temp1, gen_rtx_MEM (Pmode, addr));
7041
      emit_insn (gen_add3_insn (this, this, temp1));
7042
    }
7043
 
7044
  /* Jump to the target function.  Use a sibcall if direct jumps are
7045
     allowed, otherwise load the address into a register first.  */
7046
  fnaddr = XEXP (DECL_RTL (function), 0);
7047
  if (TARGET_MIPS16 || TARGET_ABICALLS || TARGET_LONG_CALLS)
7048
    {
7049
      /* This is messy.  gas treats "la $25,foo" as part of a call
7050
         sequence and may allow a global "foo" to be lazily bound.
7051
         The general move patterns therefore reject this combination.
7052
 
7053
         In this context, lazy binding would actually be OK for o32 and o64,
7054
         but it's still wrong for n32 and n64; see mips_load_call_address.
7055
         We must therefore load the address via a temporary register if
7056
         mips_dangerous_for_la25_p.
7057
 
7058
         If we jump to the temporary register rather than $25, the assembler
7059
         can use the move insn to fill the jump's delay slot.  */
7060
      if (TARGET_ABICALLS && !mips_dangerous_for_la25_p (fnaddr))
7061
        temp1 = gen_rtx_REG (Pmode, PIC_FUNCTION_ADDR_REGNUM);
7062
      mips_load_call_address (temp1, fnaddr, true);
7063
 
7064
      if (TARGET_ABICALLS && REGNO (temp1) != PIC_FUNCTION_ADDR_REGNUM)
7065
        emit_move_insn (gen_rtx_REG (Pmode, PIC_FUNCTION_ADDR_REGNUM), temp1);
7066
      emit_jump_insn (gen_indirect_jump (temp1));
7067
    }
7068
  else
7069
    {
7070
      insn = emit_call_insn (gen_sibcall_internal (fnaddr, const0_rtx));
7071
      SIBLING_CALL_P (insn) = 1;
7072
    }
7073
 
7074
  /* Run just enough of rest_of_compilation.  This sequence was
7075
     "borrowed" from alpha.c.  */
7076
  insn = get_insns ();
7077
  insn_locators_initialize ();
7078
  split_all_insns_noflow ();
7079
  if (TARGET_MIPS16)
7080
    mips16_lay_out_constants ();
7081
  shorten_branches (insn);
7082
  final_start_function (insn, file, 1);
7083
  final (insn, file, 1);
7084
  final_end_function ();
7085
 
7086
  /* Clean up the vars set above.  Note that final_end_function resets
7087
     the global pointer for us.  */
7088
  reload_completed = 0;
7089
  no_new_pseudos = 0;
7090
}
7091
 
7092
/* Returns nonzero if X contains a SYMBOL_REF.  */
7093
 
7094
static int
7095
symbolic_expression_p (rtx x)
7096
{
7097
  if (GET_CODE (x) == SYMBOL_REF)
7098
    return 1;
7099
 
7100
  if (GET_CODE (x) == CONST)
7101
    return symbolic_expression_p (XEXP (x, 0));
7102
 
7103
  if (UNARY_P (x))
7104
    return symbolic_expression_p (XEXP (x, 0));
7105
 
7106
  if (ARITHMETIC_P (x))
7107
    return (symbolic_expression_p (XEXP (x, 0))
7108
            || symbolic_expression_p (XEXP (x, 1)));
7109
 
7110
  return 0;
7111
}
7112
 
7113
/* Choose the section to use for the constant rtx expression X that has
7114
   mode MODE.  */
7115
 
7116
static void
7117
mips_select_rtx_section (enum machine_mode mode, rtx x,
7118
                         unsigned HOST_WIDE_INT align)
7119
{
7120
  if (TARGET_MIPS16)
7121
    {
7122
      /* In mips16 mode, the constant table always goes in the same section
7123
         as the function, so that constants can be loaded using PC relative
7124
         addressing.  */
7125
      function_section (current_function_decl);
7126
    }
7127
  else if (TARGET_EMBEDDED_DATA)
7128
    {
7129
      /* For embedded applications, always put constants in read-only data,
7130
         in order to reduce RAM usage.  */
7131
      mergeable_constant_section (mode, align, 0);
7132
    }
7133
  else
7134
    {
7135
      /* For hosted applications, always put constants in small data if
7136
         possible, as this gives the best performance.  */
7137
      /* ??? Consider using mergeable small data sections.  */
7138
 
7139
      if (GET_MODE_SIZE (mode) <= (unsigned) mips_section_threshold
7140
          && mips_section_threshold > 0)
7141
        named_section (0, ".sdata", 0);
7142
      else if (flag_pic && symbolic_expression_p (x))
7143
        named_section (0, ".data.rel.ro", 3);
7144
      else
7145
        mergeable_constant_section (mode, align, 0);
7146
    }
7147
}
7148
 
7149
/* Implement TARGET_ASM_FUNCTION_RODATA_SECTION.
7150
 
7151
   The complication here is that, with the combination TARGET_ABICALLS
7152
   && !TARGET_GPWORD, jump tables will use absolute addresses, and should
7153
   therefore not be included in the read-only part of a DSO.  Handle such
7154
   cases by selecting a normal data section instead of a read-only one.
7155
   The logic apes that in default_function_rodata_section.  */
7156
 
7157
static void
7158
mips_function_rodata_section (tree decl)
7159
{
7160
  if (!TARGET_ABICALLS || TARGET_GPWORD)
7161
    default_function_rodata_section (decl);
7162
  else if (decl && DECL_SECTION_NAME (decl))
7163
    {
7164
      const char *name = TREE_STRING_POINTER (DECL_SECTION_NAME (decl));
7165
      if (DECL_ONE_ONLY (decl) && strncmp (name, ".gnu.linkonce.t.", 16) == 0)
7166
        {
7167
          char *rname = ASTRDUP (name);
7168
          rname[14] = 'd';
7169
          named_section_real (rname, SECTION_LINKONCE | SECTION_WRITE, decl);
7170
        }
7171
      else if (flag_function_sections && flag_data_sections
7172
               && strncmp (name, ".text.", 6) == 0)
7173
        {
7174
          char *rname = ASTRDUP (name);
7175
          memcpy (rname + 1, "data", 4);
7176
          named_section_flags (rname, SECTION_WRITE);
7177
        }
7178
      else
7179
        data_section ();
7180
    }
7181
  else
7182
    data_section ();
7183
}
7184
 
7185
/* Implement TARGET_IN_SMALL_DATA_P.  Return true if it would be safe to
7186
   access DECL using %gp_rel(...)($gp).  */
7187
 
7188
static bool
7189
mips_in_small_data_p (tree decl)
7190
{
7191
  HOST_WIDE_INT size;
7192
 
7193
  if (TREE_CODE (decl) == STRING_CST || TREE_CODE (decl) == FUNCTION_DECL)
7194
    return false;
7195
 
7196
  /* We don't yet generate small-data references for -mabicalls.  See related
7197
     -G handling in override_options.  */
7198
  if (TARGET_ABICALLS)
7199
    return false;
7200
 
7201
  if (TREE_CODE (decl) == VAR_DECL && DECL_SECTION_NAME (decl) != 0)
7202
    {
7203
      const char *name;
7204
 
7205
      /* Reject anything that isn't in a known small-data section.  */
7206
      name = TREE_STRING_POINTER (DECL_SECTION_NAME (decl));
7207
      if (strcmp (name, ".sdata") != 0 && strcmp (name, ".sbss") != 0)
7208
        return false;
7209
 
7210
      /* If a symbol is defined externally, the assembler will use the
7211
         usual -G rules when deciding how to implement macros.  */
7212
      if (TARGET_EXPLICIT_RELOCS || !DECL_EXTERNAL (decl))
7213
        return true;
7214
    }
7215
  else if (TARGET_EMBEDDED_DATA)
7216
    {
7217
      /* Don't put constants into the small data section: we want them
7218
         to be in ROM rather than RAM.  */
7219
      if (TREE_CODE (decl) != VAR_DECL)
7220
        return false;
7221
 
7222
      if (TREE_READONLY (decl)
7223
          && !TREE_SIDE_EFFECTS (decl)
7224
          && (!DECL_INITIAL (decl) || TREE_CONSTANT (DECL_INITIAL (decl))))
7225
        return false;
7226
    }
7227
 
7228
  size = int_size_in_bytes (TREE_TYPE (decl));
7229
  return (size > 0 && size <= mips_section_threshold);
7230
}
7231
 
7232
/* See whether VALTYPE is a record whose fields should be returned in
7233
   floating-point registers.  If so, return the number of fields and
7234
   list them in FIELDS (which should have two elements).  Return 0
7235
   otherwise.
7236
 
7237
   For n32 & n64, a structure with one or two fields is returned in
7238
   floating-point registers as long as every field has a floating-point
7239
   type.  */
7240
 
7241
static int
7242
mips_fpr_return_fields (tree valtype, tree *fields)
7243
{
7244
  tree field;
7245
  int i;
7246
 
7247
  if (!TARGET_NEWABI)
7248
    return 0;
7249
 
7250
  if (TREE_CODE (valtype) != RECORD_TYPE)
7251
    return 0;
7252
 
7253
  i = 0;
7254
  for (field = TYPE_FIELDS (valtype); field != 0; field = TREE_CHAIN (field))
7255
    {
7256
      if (TREE_CODE (field) != FIELD_DECL)
7257
        continue;
7258
 
7259
      if (TREE_CODE (TREE_TYPE (field)) != REAL_TYPE)
7260
        return 0;
7261
 
7262
      if (i == 2)
7263
        return 0;
7264
 
7265
      fields[i++] = field;
7266
    }
7267
  return i;
7268
}
7269
 
7270
 
7271
/* Implement TARGET_RETURN_IN_MSB.  For n32 & n64, we should return
7272
   a value in the most significant part of $2/$3 if:
7273
 
7274
      - the target is big-endian;
7275
 
7276
      - the value has a structure or union type (we generalize this to
7277
        cover aggregates from other languages too); and
7278
 
7279
      - the structure is not returned in floating-point registers.  */
7280
 
7281
static bool
7282
mips_return_in_msb (tree valtype)
7283
{
7284
  tree fields[2];
7285
 
7286
  return (TARGET_NEWABI
7287
          && TARGET_BIG_ENDIAN
7288
          && AGGREGATE_TYPE_P (valtype)
7289
          && mips_fpr_return_fields (valtype, fields) == 0);
7290
}
7291
 
7292
 
7293
/* Return a composite value in a pair of floating-point registers.
7294
   MODE1 and OFFSET1 are the mode and byte offset for the first value,
7295
   likewise MODE2 and OFFSET2 for the second.  MODE is the mode of the
7296
   complete value.
7297
 
7298
   For n32 & n64, $f0 always holds the first value and $f2 the second.
7299
   Otherwise the values are packed together as closely as possible.  */
7300
 
7301
static rtx
7302
mips_return_fpr_pair (enum machine_mode mode,
7303
                      enum machine_mode mode1, HOST_WIDE_INT offset1,
7304
                      enum machine_mode mode2, HOST_WIDE_INT offset2)
7305
{
7306
  int inc;
7307
 
7308
  inc = (TARGET_NEWABI ? 2 : FP_INC);
7309
  return gen_rtx_PARALLEL
7310
    (mode,
7311
     gen_rtvec (2,
7312
                gen_rtx_EXPR_LIST (VOIDmode,
7313
                                   gen_rtx_REG (mode1, FP_RETURN),
7314
                                   GEN_INT (offset1)),
7315
                gen_rtx_EXPR_LIST (VOIDmode,
7316
                                   gen_rtx_REG (mode2, FP_RETURN + inc),
7317
                                   GEN_INT (offset2))));
7318
 
7319
}
7320
 
7321
 
7322
/* Implement FUNCTION_VALUE and LIBCALL_VALUE.  For normal calls,
7323
   VALTYPE is the return type and MODE is VOIDmode.  For libcalls,
7324
   VALTYPE is null and MODE is the mode of the return value.  */
7325
 
7326
rtx
7327
mips_function_value (tree valtype, tree func ATTRIBUTE_UNUSED,
7328
                     enum machine_mode mode)
7329
{
7330
  if (valtype)
7331
    {
7332
      tree fields[2];
7333
      int unsignedp;
7334
 
7335
      mode = TYPE_MODE (valtype);
7336
      unsignedp = TYPE_UNSIGNED (valtype);
7337
 
7338
      /* Since we define TARGET_PROMOTE_FUNCTION_RETURN that returns
7339
         true, we must promote the mode just as PROMOTE_MODE does.  */
7340
      mode = promote_mode (valtype, mode, &unsignedp, 1);
7341
 
7342
      /* Handle structures whose fields are returned in $f0/$f2.  */
7343
      switch (mips_fpr_return_fields (valtype, fields))
7344
        {
7345
        case 1:
7346
          return gen_rtx_REG (mode, FP_RETURN);
7347
 
7348
        case 2:
7349
          return mips_return_fpr_pair (mode,
7350
                                       TYPE_MODE (TREE_TYPE (fields[0])),
7351
                                       int_byte_position (fields[0]),
7352
                                       TYPE_MODE (TREE_TYPE (fields[1])),
7353
                                       int_byte_position (fields[1]));
7354
        }
7355
 
7356
      /* If a value is passed in the most significant part of a register, see
7357
         whether we have to round the mode up to a whole number of words.  */
7358
      if (mips_return_in_msb (valtype))
7359
        {
7360
          HOST_WIDE_INT size = int_size_in_bytes (valtype);
7361
          if (size % UNITS_PER_WORD != 0)
7362
            {
7363
              size += UNITS_PER_WORD - size % UNITS_PER_WORD;
7364
              mode = mode_for_size (size * BITS_PER_UNIT, MODE_INT, 0);
7365
            }
7366
        }
7367
 
7368
      /* For EABI, the class of return register depends entirely on MODE.
7369
         For example, "struct { some_type x; }" and "union { some_type x; }"
7370
         are returned in the same way as a bare "some_type" would be.
7371
         Other ABIs only use FPRs for scalar, complex or vector types.  */
7372
      if (mips_abi != ABI_EABI && !FLOAT_TYPE_P (valtype))
7373
        return gen_rtx_REG (mode, GP_RETURN);
7374
    }
7375
 
7376
  if ((GET_MODE_CLASS (mode) == MODE_FLOAT
7377
       || GET_MODE_CLASS (mode) == MODE_VECTOR_FLOAT)
7378
      && GET_MODE_SIZE (mode) <= UNITS_PER_HWFPVALUE)
7379
    return gen_rtx_REG (mode, FP_RETURN);
7380
 
7381
  /* Handle long doubles for n32 & n64.  */
7382
  if (mode == TFmode)
7383
    return mips_return_fpr_pair (mode,
7384
                                 DImode, 0,
7385
                                 DImode, GET_MODE_SIZE (mode) / 2);
7386
 
7387
  if (GET_MODE_CLASS (mode) == MODE_COMPLEX_FLOAT
7388
      && GET_MODE_SIZE (mode) <= UNITS_PER_HWFPVALUE * 2)
7389
    return mips_return_fpr_pair (mode,
7390
                                 GET_MODE_INNER (mode), 0,
7391
                                 GET_MODE_INNER (mode),
7392
                                 GET_MODE_SIZE (mode) / 2);
7393
 
7394
  return gen_rtx_REG (mode, GP_RETURN);
7395
}
7396
 
7397
/* Return nonzero when an argument must be passed by reference.  */
7398
 
7399
static bool
7400
mips_pass_by_reference (CUMULATIVE_ARGS *cum ATTRIBUTE_UNUSED,
7401
                        enum machine_mode mode, tree type,
7402
                        bool named ATTRIBUTE_UNUSED)
7403
{
7404
  if (mips_abi == ABI_EABI)
7405
    {
7406
      int size;
7407
 
7408
      /* ??? How should SCmode be handled?  */
7409
      if (type == NULL_TREE || mode == DImode || mode == DFmode)
7410
        return 0;
7411
 
7412
      size = int_size_in_bytes (type);
7413
      return size == -1 || size > UNITS_PER_WORD;
7414
    }
7415
  else
7416
    {
7417
      /* If we have a variable-sized parameter, we have no choice.  */
7418
      return targetm.calls.must_pass_in_stack (mode, type);
7419
    }
7420
}
7421
 
7422
static bool
7423
mips_callee_copies (CUMULATIVE_ARGS *cum ATTRIBUTE_UNUSED,
7424
                    enum machine_mode mode ATTRIBUTE_UNUSED,
7425
                    tree type ATTRIBUTE_UNUSED, bool named)
7426
{
7427
  return mips_abi == ABI_EABI && named;
7428
}
7429
 
7430
/* Return true if registers of class CLASS cannot change from mode FROM
7431
   to mode TO.  */
7432
 
7433
bool
7434
mips_cannot_change_mode_class (enum machine_mode from,
7435
                               enum machine_mode to, enum reg_class class)
7436
{
7437
  if (MIN (GET_MODE_SIZE (from), GET_MODE_SIZE (to)) <= UNITS_PER_WORD
7438
      && MAX (GET_MODE_SIZE (from), GET_MODE_SIZE (to)) > UNITS_PER_WORD)
7439
    {
7440
      if (TARGET_BIG_ENDIAN)
7441
        {
7442
          /* When a multi-word value is stored in paired floating-point
7443
             registers, the first register always holds the low word.
7444
             We therefore can't allow FPRs to change between single-word
7445
             and multi-word modes.  */
7446
          if (FP_INC > 1 && reg_classes_intersect_p (FP_REGS, class))
7447
            return true;
7448
        }
7449
      else
7450
        {
7451
          /* LO_REGNO == HI_REGNO + 1, so if a multi-word value is stored
7452
             in LO and HI, the high word always comes first.  We therefore
7453
             can't allow values stored in HI to change between single-word
7454
             and multi-word modes.
7455
             This rule applies to both the original HI/LO pair and the new
7456
             DSP accumulators.  */
7457
          if (reg_classes_intersect_p (ACC_REGS, class))
7458
            return true;
7459
        }
7460
    }
7461
  /* Loading a 32-bit value into a 64-bit floating-point register
7462
     will not sign-extend the value, despite what LOAD_EXTEND_OP says.
7463
     We can't allow 64-bit float registers to change from SImode to
7464
     to a wider mode.  */
7465
  if (TARGET_FLOAT64
7466
      && from == SImode
7467
      && GET_MODE_SIZE (to) >= UNITS_PER_WORD
7468
      && reg_classes_intersect_p (FP_REGS, class))
7469
    return true;
7470
  return false;
7471
}
7472
 
7473
/* Return true if X should not be moved directly into register $25.
7474
   We need this because many versions of GAS will treat "la $25,foo" as
7475
   part of a call sequence and so allow a global "foo" to be lazily bound.  */
7476
 
7477
bool
7478
mips_dangerous_for_la25_p (rtx x)
7479
{
7480
  HOST_WIDE_INT offset;
7481
 
7482
  if (TARGET_EXPLICIT_RELOCS)
7483
    return false;
7484
 
7485
  mips_split_const (x, &x, &offset);
7486
  return global_got_operand (x, VOIDmode);
7487
}
7488
 
7489
/* Implement PREFERRED_RELOAD_CLASS.  */
7490
 
7491
enum reg_class
7492
mips_preferred_reload_class (rtx x, enum reg_class class)
7493
{
7494
  if (mips_dangerous_for_la25_p (x) && reg_class_subset_p (LEA_REGS, class))
7495
    return LEA_REGS;
7496
 
7497
  if (TARGET_HARD_FLOAT
7498
      && FLOAT_MODE_P (GET_MODE (x))
7499
      && reg_class_subset_p (FP_REGS, class))
7500
    return FP_REGS;
7501
 
7502
  if (reg_class_subset_p (GR_REGS, class))
7503
    class = GR_REGS;
7504
 
7505
  if (TARGET_MIPS16 && reg_class_subset_p (M16_REGS, class))
7506
    class = M16_REGS;
7507
 
7508
  return class;
7509
}
7510
 
7511
/* This function returns the register class required for a secondary
7512
   register when copying between one of the registers in CLASS, and X,
7513
   using MODE.  If IN_P is nonzero, the copy is going from X to the
7514
   register, otherwise the register is the source.  A return value of
7515
   NO_REGS means that no secondary register is required.  */
7516
 
7517
enum reg_class
7518
mips_secondary_reload_class (enum reg_class class,
7519
                             enum machine_mode mode, rtx x, int in_p)
7520
{
7521
  enum reg_class gr_regs = TARGET_MIPS16 ? M16_REGS : GR_REGS;
7522
  int regno = -1;
7523
  int gp_reg_p;
7524
 
7525
  if (REG_P (x)|| GET_CODE (x) == SUBREG)
7526
    regno = true_regnum (x);
7527
 
7528
  gp_reg_p = TARGET_MIPS16 ? M16_REG_P (regno) : GP_REG_P (regno);
7529
 
7530
  if (mips_dangerous_for_la25_p (x))
7531
    {
7532
      gr_regs = LEA_REGS;
7533
      if (TEST_HARD_REG_BIT (reg_class_contents[(int) class], 25))
7534
        return gr_regs;
7535
    }
7536
 
7537
  /* Copying from HI or LO to anywhere other than a general register
7538
     requires a general register.
7539
     This rule applies to both the original HI/LO pair and the new
7540
     DSP accumulators.  */
7541
  if (reg_class_subset_p (class, ACC_REGS))
7542
    {
7543
      if (TARGET_MIPS16 && in_p)
7544
        {
7545
          /* We can't really copy to HI or LO at all in mips16 mode.  */
7546
          return M16_REGS;
7547
        }
7548
      return gp_reg_p ? NO_REGS : gr_regs;
7549
    }
7550
  if (ACC_REG_P (regno))
7551
    {
7552
      if (TARGET_MIPS16 && ! in_p)
7553
        {
7554
          /* We can't really copy to HI or LO at all in mips16 mode.  */
7555
          return M16_REGS;
7556
        }
7557
      return class == gr_regs ? NO_REGS : gr_regs;
7558
    }
7559
 
7560
  /* We can only copy a value to a condition code register from a
7561
     floating point register, and even then we require a scratch
7562
     floating point register.  We can only copy a value out of a
7563
     condition code register into a general register.  */
7564
  if (class == ST_REGS)
7565
    {
7566
      if (in_p)
7567
        return FP_REGS;
7568
      return gp_reg_p ? NO_REGS : gr_regs;
7569
    }
7570
  if (ST_REG_P (regno))
7571
    {
7572
      if (! in_p)
7573
        return FP_REGS;
7574
      return class == gr_regs ? NO_REGS : gr_regs;
7575
    }
7576
 
7577
  if (class == FP_REGS)
7578
    {
7579
      if (MEM_P (x))
7580
        {
7581
          /* In this case we can use lwc1, swc1, ldc1 or sdc1.  */
7582
          return NO_REGS;
7583
        }
7584
      else if (CONSTANT_P (x) && GET_MODE_CLASS (mode) == MODE_FLOAT)
7585
        {
7586
          /* We can use the l.s and l.d macros to load floating-point
7587
             constants.  ??? For l.s, we could probably get better
7588
             code by returning GR_REGS here.  */
7589
          return NO_REGS;
7590
        }
7591
      else if (gp_reg_p || x == CONST0_RTX (mode))
7592
        {
7593
          /* In this case we can use mtc1, mfc1, dmtc1 or dmfc1.  */
7594
          return NO_REGS;
7595
        }
7596
      else if (FP_REG_P (regno))
7597
        {
7598
          /* In this case we can use mov.s or mov.d.  */
7599
          return NO_REGS;
7600
        }
7601
      else
7602
        {
7603
          /* Otherwise, we need to reload through an integer register.  */
7604
          return gr_regs;
7605
        }
7606
    }
7607
 
7608
  /* In mips16 mode, going between memory and anything but M16_REGS
7609
     requires an M16_REG.  */
7610
  if (TARGET_MIPS16)
7611
    {
7612
      if (class != M16_REGS && class != M16_NA_REGS)
7613
        {
7614
          if (gp_reg_p)
7615
            return NO_REGS;
7616
          return M16_REGS;
7617
        }
7618
      if (! gp_reg_p)
7619
        {
7620
          if (class == M16_REGS || class == M16_NA_REGS)
7621
            return NO_REGS;
7622
          return M16_REGS;
7623
        }
7624
    }
7625
 
7626
  return NO_REGS;
7627
}
7628
 
7629
/* Implement CLASS_MAX_NREGS.
7630
 
7631
   Usually all registers are word-sized.  The only supported exception
7632
   is -mgp64 -msingle-float, which has 64-bit words but 32-bit float
7633
   registers.  A word-based calculation is correct even in that case,
7634
   since -msingle-float disallows multi-FPR values.
7635
 
7636
   The FP status registers are an exception to this rule.  They are always
7637
   4 bytes wide as they only hold condition code modes, and CCmode is always
7638
   considered to be 4 bytes wide.  */
7639
 
7640
int
7641
mips_class_max_nregs (enum reg_class class ATTRIBUTE_UNUSED,
7642
                      enum machine_mode mode)
7643
{
7644
  if (class == ST_REGS)
7645
    return (GET_MODE_SIZE (mode) + 3) / 4;
7646
  else
7647
    return (GET_MODE_SIZE (mode) + UNITS_PER_WORD - 1) / UNITS_PER_WORD;
7648
}
7649
 
7650
static bool
7651
mips_valid_pointer_mode (enum machine_mode mode)
7652
{
7653
  return (mode == SImode || (TARGET_64BIT && mode == DImode));
7654
}
7655
 
7656
/* Target hook for vector_mode_supported_p.  */
7657
 
7658
static bool
7659
mips_vector_mode_supported_p (enum machine_mode mode)
7660
{
7661
  switch (mode)
7662
    {
7663
    case V2SFmode:
7664
      return TARGET_PAIRED_SINGLE_FLOAT;
7665
 
7666
    case V2HImode:
7667
    case V4QImode:
7668
      return TARGET_DSP;
7669
 
7670
    default:
7671
      return false;
7672
    }
7673
}
7674
 
7675
/* If we can access small data directly (using gp-relative relocation
7676
   operators) return the small data pointer, otherwise return null.
7677
 
7678
   For each mips16 function which refers to GP relative symbols, we
7679
   use a pseudo register, initialized at the start of the function, to
7680
   hold the $gp value.  */
7681
 
7682
static rtx
7683
mips16_gp_pseudo_reg (void)
7684
{
7685
  if (cfun->machine->mips16_gp_pseudo_rtx == NULL_RTX)
7686
    {
7687
      rtx unspec;
7688
      rtx insn, scan;
7689
 
7690
      cfun->machine->mips16_gp_pseudo_rtx = gen_reg_rtx (Pmode);
7691
 
7692
      /* We want to initialize this to a value which gcc will believe
7693
         is constant.  */
7694
      start_sequence ();
7695
      unspec = gen_rtx_UNSPEC (VOIDmode, gen_rtvec (1, const0_rtx), UNSPEC_GP);
7696
      emit_move_insn (cfun->machine->mips16_gp_pseudo_rtx,
7697
                      gen_rtx_CONST (Pmode, unspec));
7698
      insn = get_insns ();
7699
      end_sequence ();
7700
 
7701
      push_topmost_sequence ();
7702
      /* We need to emit the initialization after the FUNCTION_BEG
7703
         note, so that it will be integrated.  */
7704
      for (scan = get_insns (); scan != NULL_RTX; scan = NEXT_INSN (scan))
7705
        if (NOTE_P (scan)
7706
            && NOTE_LINE_NUMBER (scan) == NOTE_INSN_FUNCTION_BEG)
7707
          break;
7708
      if (scan == NULL_RTX)
7709
        scan = get_insns ();
7710
      insn = emit_insn_after (insn, scan);
7711
      pop_topmost_sequence ();
7712
    }
7713
 
7714
  return cfun->machine->mips16_gp_pseudo_rtx;
7715
}
7716
 
7717
/* Write out code to move floating point arguments in or out of
7718
   general registers.  Output the instructions to FILE.  FP_CODE is
7719
   the code describing which arguments are present (see the comment at
7720
   the definition of CUMULATIVE_ARGS in mips.h).  FROM_FP_P is nonzero if
7721
   we are copying from the floating point registers.  */
7722
 
7723
static void
7724
mips16_fp_args (FILE *file, int fp_code, int from_fp_p)
7725
{
7726
  const char *s;
7727
  int gparg, fparg;
7728
  unsigned int f;
7729
 
7730
  /* This code only works for the original 32 bit ABI and the O64 ABI.  */
7731
  gcc_assert (TARGET_OLDABI);
7732
 
7733
  if (from_fp_p)
7734
    s = "mfc1";
7735
  else
7736
    s = "mtc1";
7737
  gparg = GP_ARG_FIRST;
7738
  fparg = FP_ARG_FIRST;
7739
  for (f = (unsigned int) fp_code; f != 0; f >>= 2)
7740
    {
7741
      if ((f & 3) == 1)
7742
        {
7743
          if ((fparg & 1) != 0)
7744
            ++fparg;
7745
          fprintf (file, "\t%s\t%s,%s\n", s,
7746
                   reg_names[gparg], reg_names[fparg]);
7747
        }
7748
      else if ((f & 3) == 2)
7749
        {
7750
          if (TARGET_64BIT)
7751
            fprintf (file, "\td%s\t%s,%s\n", s,
7752
                     reg_names[gparg], reg_names[fparg]);
7753
          else
7754
            {
7755
              if ((fparg & 1) != 0)
7756
                ++fparg;
7757
              if (TARGET_BIG_ENDIAN)
7758
                fprintf (file, "\t%s\t%s,%s\n\t%s\t%s,%s\n", s,
7759
                         reg_names[gparg], reg_names[fparg + 1], s,
7760
                         reg_names[gparg + 1], reg_names[fparg]);
7761
              else
7762
                fprintf (file, "\t%s\t%s,%s\n\t%s\t%s,%s\n", s,
7763
                         reg_names[gparg], reg_names[fparg], s,
7764
                         reg_names[gparg + 1], reg_names[fparg + 1]);
7765
              ++gparg;
7766
              ++fparg;
7767
            }
7768
        }
7769
      else
7770
        gcc_unreachable ();
7771
 
7772
      ++gparg;
7773
      ++fparg;
7774
    }
7775
}
7776
 
7777
/* Build a mips16 function stub.  This is used for functions which
7778
   take arguments in the floating point registers.  It is 32 bit code
7779
   that moves the floating point args into the general registers, and
7780
   then jumps to the 16 bit code.  */
7781
 
7782
static void
7783
build_mips16_function_stub (FILE *file)
7784
{
7785
  const char *fnname;
7786
  char *secname, *stubname;
7787
  tree stubid, stubdecl;
7788
  int need_comma;
7789
  unsigned int f;
7790
 
7791
  fnname = XSTR (XEXP (DECL_RTL (current_function_decl), 0), 0);
7792
  secname = (char *) alloca (strlen (fnname) + 20);
7793
  sprintf (secname, ".mips16.fn.%s", fnname);
7794
  stubname = (char *) alloca (strlen (fnname) + 20);
7795
  sprintf (stubname, "__fn_stub_%s", fnname);
7796
  stubid = get_identifier (stubname);
7797
  stubdecl = build_decl (FUNCTION_DECL, stubid,
7798
                         build_function_type (void_type_node, NULL_TREE));
7799
  DECL_SECTION_NAME (stubdecl) = build_string (strlen (secname), secname);
7800
 
7801
  fprintf (file, "\t# Stub function for %s (", current_function_name ());
7802
  need_comma = 0;
7803
  for (f = (unsigned int) current_function_args_info.fp_code; f != 0; f >>= 2)
7804
    {
7805
      fprintf (file, "%s%s",
7806
               need_comma ? ", " : "",
7807
               (f & 3) == 1 ? "float" : "double");
7808
      need_comma = 1;
7809
    }
7810
  fprintf (file, ")\n");
7811
 
7812
  fprintf (file, "\t.set\tnomips16\n");
7813
  function_section (stubdecl);
7814
  ASM_OUTPUT_ALIGN (file, floor_log2 (FUNCTION_BOUNDARY / BITS_PER_UNIT));
7815
 
7816
  /* ??? If FUNCTION_NAME_ALREADY_DECLARED is defined, then we are
7817
     within a .ent, and we cannot emit another .ent.  */
7818
  if (!FUNCTION_NAME_ALREADY_DECLARED)
7819
    {
7820
      fputs ("\t.ent\t", file);
7821
      assemble_name (file, stubname);
7822
      fputs ("\n", file);
7823
    }
7824
 
7825
  assemble_name (file, stubname);
7826
  fputs (":\n", file);
7827
 
7828
  /* We don't want the assembler to insert any nops here.  */
7829
  fprintf (file, "\t.set\tnoreorder\n");
7830
 
7831
  mips16_fp_args (file, current_function_args_info.fp_code, 1);
7832
 
7833
  fprintf (asm_out_file, "\t.set\tnoat\n");
7834
  fprintf (asm_out_file, "\tla\t%s,", reg_names[GP_REG_FIRST + 1]);
7835
  assemble_name (file, fnname);
7836
  fprintf (file, "\n");
7837
  fprintf (asm_out_file, "\tjr\t%s\n", reg_names[GP_REG_FIRST + 1]);
7838
  fprintf (asm_out_file, "\t.set\tat\n");
7839
 
7840
  /* Unfortunately, we can't fill the jump delay slot.  We can't fill
7841
     with one of the mfc1 instructions, because the result is not
7842
     available for one instruction, so if the very first instruction
7843
     in the function refers to the register, it will see the wrong
7844
     value.  */
7845
  fprintf (file, "\tnop\n");
7846
 
7847
  fprintf (file, "\t.set\treorder\n");
7848
 
7849
  if (!FUNCTION_NAME_ALREADY_DECLARED)
7850
    {
7851
      fputs ("\t.end\t", file);
7852
      assemble_name (file, stubname);
7853
      fputs ("\n", file);
7854
    }
7855
 
7856
  fprintf (file, "\t.set\tmips16\n");
7857
 
7858
  function_section (current_function_decl);
7859
}
7860
 
7861
/* We keep a list of functions for which we have already built stubs
7862
   in build_mips16_call_stub.  */
7863
 
7864
struct mips16_stub
7865
{
7866
  struct mips16_stub *next;
7867
  char *name;
7868
  int fpret;
7869
};
7870
 
7871
static struct mips16_stub *mips16_stubs;
7872
 
7873
/* Build a call stub for a mips16 call.  A stub is needed if we are
7874
   passing any floating point values which should go into the floating
7875
   point registers.  If we are, and the call turns out to be to a 32
7876
   bit function, the stub will be used to move the values into the
7877
   floating point registers before calling the 32 bit function.  The
7878
   linker will magically adjust the function call to either the 16 bit
7879
   function or the 32 bit stub, depending upon where the function call
7880
   is actually defined.
7881
 
7882
   Similarly, we need a stub if the return value might come back in a
7883
   floating point register.
7884
 
7885
   RETVAL is the location of the return value, or null if this is
7886
   a call rather than a call_value.  FN is the address of the
7887
   function and ARG_SIZE is the size of the arguments.  FP_CODE
7888
   is the code built by function_arg.  This function returns a nonzero
7889
   value if it builds the call instruction itself.  */
7890
 
7891
int
7892
build_mips16_call_stub (rtx retval, rtx fn, rtx arg_size, int fp_code)
7893
{
7894
  int fpret;
7895
  const char *fnname;
7896
  char *secname, *stubname;
7897
  struct mips16_stub *l;
7898
  tree stubid, stubdecl;
7899
  int need_comma;
7900
  unsigned int f;
7901
 
7902
  /* We don't need to do anything if we aren't in mips16 mode, or if
7903
     we were invoked with the -msoft-float option.  */
7904
  if (! TARGET_MIPS16 || ! mips16_hard_float)
7905
    return 0;
7906
 
7907
  /* Figure out whether the value might come back in a floating point
7908
     register.  */
7909
  fpret = (retval != 0
7910
           && GET_MODE_CLASS (GET_MODE (retval)) == MODE_FLOAT
7911
           && GET_MODE_SIZE (GET_MODE (retval)) <= UNITS_PER_FPVALUE);
7912
 
7913
  /* We don't need to do anything if there were no floating point
7914
     arguments and the value will not be returned in a floating point
7915
     register.  */
7916
  if (fp_code == 0 && ! fpret)
7917
    return 0;
7918
 
7919
  /* We don't need to do anything if this is a call to a special
7920
     mips16 support function.  */
7921
  if (GET_CODE (fn) == SYMBOL_REF
7922
      && strncmp (XSTR (fn, 0), "__mips16_", 9) == 0)
7923
    return 0;
7924
 
7925
  /* This code will only work for o32 and o64 abis.  The other ABI's
7926
     require more sophisticated support.  */
7927
  gcc_assert (TARGET_OLDABI);
7928
 
7929
  /* We can only handle SFmode and DFmode floating point return
7930
     values.  */
7931
  if (fpret)
7932
    gcc_assert (GET_MODE (retval) == SFmode || GET_MODE (retval) == DFmode);
7933
 
7934
  /* If we're calling via a function pointer, then we must always call
7935
     via a stub.  There are magic stubs provided in libgcc.a for each
7936
     of the required cases.  Each of them expects the function address
7937
     to arrive in register $2.  */
7938
 
7939
  if (GET_CODE (fn) != SYMBOL_REF)
7940
    {
7941
      char buf[30];
7942
      tree id;
7943
      rtx stub_fn, insn;
7944
 
7945
      /* ??? If this code is modified to support other ABI's, we need
7946
         to handle PARALLEL return values here.  */
7947
 
7948
      sprintf (buf, "__mips16_call_stub_%s%d",
7949
               (fpret
7950
                ? (GET_MODE (retval) == SFmode ? "sf_" : "df_")
7951
                : ""),
7952
               fp_code);
7953
      id = get_identifier (buf);
7954
      stub_fn = gen_rtx_SYMBOL_REF (Pmode, IDENTIFIER_POINTER (id));
7955
 
7956
      emit_move_insn (gen_rtx_REG (Pmode, 2), fn);
7957
 
7958
      if (retval == NULL_RTX)
7959
        insn = gen_call_internal (stub_fn, arg_size);
7960
      else
7961
        insn = gen_call_value_internal (retval, stub_fn, arg_size);
7962
      insn = emit_call_insn (insn);
7963
 
7964
      /* Put the register usage information on the CALL.  */
7965
      CALL_INSN_FUNCTION_USAGE (insn) =
7966
        gen_rtx_EXPR_LIST (VOIDmode,
7967
                           gen_rtx_USE (VOIDmode, gen_rtx_REG (Pmode, 2)),
7968
                           CALL_INSN_FUNCTION_USAGE (insn));
7969
 
7970
      /* If we are handling a floating point return value, we need to
7971
         save $18 in the function prologue.  Putting a note on the
7972
         call will mean that regs_ever_live[$18] will be true if the
7973
         call is not eliminated, and we can check that in the prologue
7974
         code.  */
7975
      if (fpret)
7976
        CALL_INSN_FUNCTION_USAGE (insn) =
7977
          gen_rtx_EXPR_LIST (VOIDmode,
7978
                             gen_rtx_USE (VOIDmode,
7979
                                          gen_rtx_REG (word_mode, 18)),
7980
                             CALL_INSN_FUNCTION_USAGE (insn));
7981
 
7982
      /* Return 1 to tell the caller that we've generated the call
7983
         insn.  */
7984
      return 1;
7985
    }
7986
 
7987
  /* We know the function we are going to call.  If we have already
7988
     built a stub, we don't need to do anything further.  */
7989
 
7990
  fnname = XSTR (fn, 0);
7991
  for (l = mips16_stubs; l != NULL; l = l->next)
7992
    if (strcmp (l->name, fnname) == 0)
7993
      break;
7994
 
7995
  if (l == NULL)
7996
    {
7997
      /* Build a special purpose stub.  When the linker sees a
7998
         function call in mips16 code, it will check where the target
7999
         is defined.  If the target is a 32 bit call, the linker will
8000
         search for the section defined here.  It can tell which
8001
         symbol this section is associated with by looking at the
8002
         relocation information (the name is unreliable, since this
8003
         might be a static function).  If such a section is found, the
8004
         linker will redirect the call to the start of the magic
8005
         section.
8006
 
8007
         If the function does not return a floating point value, the
8008
         special stub section is named
8009
             .mips16.call.FNNAME
8010
 
8011
         If the function does return a floating point value, the stub
8012
         section is named
8013
             .mips16.call.fp.FNNAME
8014
         */
8015
 
8016
      secname = (char *) alloca (strlen (fnname) + 40);
8017
      sprintf (secname, ".mips16.call.%s%s",
8018
               fpret ? "fp." : "",
8019
               fnname);
8020
      stubname = (char *) alloca (strlen (fnname) + 20);
8021
      sprintf (stubname, "__call_stub_%s%s",
8022
               fpret ? "fp_" : "",
8023
               fnname);
8024
      stubid = get_identifier (stubname);
8025
      stubdecl = build_decl (FUNCTION_DECL, stubid,
8026
                             build_function_type (void_type_node, NULL_TREE));
8027
      DECL_SECTION_NAME (stubdecl) = build_string (strlen (secname), secname);
8028
 
8029
      fprintf (asm_out_file, "\t# Stub function to call %s%s (",
8030
               (fpret
8031
                ? (GET_MODE (retval) == SFmode ? "float " : "double ")
8032
                : ""),
8033
               fnname);
8034
      need_comma = 0;
8035
      for (f = (unsigned int) fp_code; f != 0; f >>= 2)
8036
        {
8037
          fprintf (asm_out_file, "%s%s",
8038
                   need_comma ? ", " : "",
8039
                   (f & 3) == 1 ? "float" : "double");
8040
          need_comma = 1;
8041
        }
8042
      fprintf (asm_out_file, ")\n");
8043
 
8044
      fprintf (asm_out_file, "\t.set\tnomips16\n");
8045
      assemble_start_function (stubdecl, stubname);
8046
 
8047
      if (!FUNCTION_NAME_ALREADY_DECLARED)
8048
        {
8049
          fputs ("\t.ent\t", asm_out_file);
8050
          assemble_name (asm_out_file, stubname);
8051
          fputs ("\n", asm_out_file);
8052
 
8053
          assemble_name (asm_out_file, stubname);
8054
          fputs (":\n", asm_out_file);
8055
        }
8056
 
8057
      /* We build the stub code by hand.  That's the only way we can
8058
         do it, since we can't generate 32 bit code during a 16 bit
8059
         compilation.  */
8060
 
8061
      /* We don't want the assembler to insert any nops here.  */
8062
      fprintf (asm_out_file, "\t.set\tnoreorder\n");
8063
 
8064
      mips16_fp_args (asm_out_file, fp_code, 0);
8065
 
8066
      if (! fpret)
8067
        {
8068
          fprintf (asm_out_file, "\t.set\tnoat\n");
8069
          fprintf (asm_out_file, "\tla\t%s,%s\n", reg_names[GP_REG_FIRST + 1],
8070
                   fnname);
8071
          fprintf (asm_out_file, "\tjr\t%s\n", reg_names[GP_REG_FIRST + 1]);
8072
          fprintf (asm_out_file, "\t.set\tat\n");
8073
          /* Unfortunately, we can't fill the jump delay slot.  We
8074
             can't fill with one of the mtc1 instructions, because the
8075
             result is not available for one instruction, so if the
8076
             very first instruction in the function refers to the
8077
             register, it will see the wrong value.  */
8078
          fprintf (asm_out_file, "\tnop\n");
8079
        }
8080
      else
8081
        {
8082
          fprintf (asm_out_file, "\tmove\t%s,%s\n",
8083
                   reg_names[GP_REG_FIRST + 18], reg_names[GP_REG_FIRST + 31]);
8084
          fprintf (asm_out_file, "\tjal\t%s\n", fnname);
8085
          /* As above, we can't fill the delay slot.  */
8086
          fprintf (asm_out_file, "\tnop\n");
8087
          if (GET_MODE (retval) == SFmode)
8088
            fprintf (asm_out_file, "\tmfc1\t%s,%s\n",
8089
                     reg_names[GP_REG_FIRST + 2], reg_names[FP_REG_FIRST + 0]);
8090
          else
8091
            {
8092
              if (TARGET_BIG_ENDIAN)
8093
                {
8094
                  fprintf (asm_out_file, "\tmfc1\t%s,%s\n",
8095
                           reg_names[GP_REG_FIRST + 2],
8096
                           reg_names[FP_REG_FIRST + 1]);
8097
                  fprintf (asm_out_file, "\tmfc1\t%s,%s\n",
8098
                           reg_names[GP_REG_FIRST + 3],
8099
                           reg_names[FP_REG_FIRST + 0]);
8100
                }
8101
              else
8102
                {
8103
                  fprintf (asm_out_file, "\tmfc1\t%s,%s\n",
8104
                           reg_names[GP_REG_FIRST + 2],
8105
                           reg_names[FP_REG_FIRST + 0]);
8106
                  fprintf (asm_out_file, "\tmfc1\t%s,%s\n",
8107
                           reg_names[GP_REG_FIRST + 3],
8108
                           reg_names[FP_REG_FIRST + 1]);
8109
                }
8110
            }
8111
          fprintf (asm_out_file, "\tj\t%s\n", reg_names[GP_REG_FIRST + 18]);
8112
          /* As above, we can't fill the delay slot.  */
8113
          fprintf (asm_out_file, "\tnop\n");
8114
        }
8115
 
8116
      fprintf (asm_out_file, "\t.set\treorder\n");
8117
 
8118
#ifdef ASM_DECLARE_FUNCTION_SIZE
8119
      ASM_DECLARE_FUNCTION_SIZE (asm_out_file, stubname, stubdecl);
8120
#endif
8121
 
8122
      if (!FUNCTION_NAME_ALREADY_DECLARED)
8123
        {
8124
          fputs ("\t.end\t", asm_out_file);
8125
          assemble_name (asm_out_file, stubname);
8126
          fputs ("\n", asm_out_file);
8127
        }
8128
 
8129
      fprintf (asm_out_file, "\t.set\tmips16\n");
8130
 
8131
      /* Record this stub.  */
8132
      l = (struct mips16_stub *) xmalloc (sizeof *l);
8133
      l->name = xstrdup (fnname);
8134
      l->fpret = fpret;
8135
      l->next = mips16_stubs;
8136
      mips16_stubs = l;
8137
    }
8138
 
8139
  /* If we expect a floating point return value, but we've built a
8140
     stub which does not expect one, then we're in trouble.  We can't
8141
     use the existing stub, because it won't handle the floating point
8142
     value.  We can't build a new stub, because the linker won't know
8143
     which stub to use for the various calls in this object file.
8144
     Fortunately, this case is illegal, since it means that a function
8145
     was declared in two different ways in a single compilation.  */
8146
  if (fpret && ! l->fpret)
8147
    error ("cannot handle inconsistent calls to %qs", fnname);
8148
 
8149
  /* If we are calling a stub which handles a floating point return
8150
     value, we need to arrange to save $18 in the prologue.  We do
8151
     this by marking the function call as using the register.  The
8152
     prologue will later see that it is used, and emit code to save
8153
     it.  */
8154
 
8155
  if (l->fpret)
8156
    {
8157
      rtx insn;
8158
 
8159
      if (retval == NULL_RTX)
8160
        insn = gen_call_internal (fn, arg_size);
8161
      else
8162
        insn = gen_call_value_internal (retval, fn, arg_size);
8163
      insn = emit_call_insn (insn);
8164
 
8165
      CALL_INSN_FUNCTION_USAGE (insn) =
8166
        gen_rtx_EXPR_LIST (VOIDmode,
8167
                           gen_rtx_USE (VOIDmode, gen_rtx_REG (word_mode, 18)),
8168
                           CALL_INSN_FUNCTION_USAGE (insn));
8169
 
8170
      /* Return 1 to tell the caller that we've generated the call
8171
         insn.  */
8172
      return 1;
8173
    }
8174
 
8175
  /* Return 0 to let the caller generate the call insn.  */
8176
  return 0;
8177
}
8178
 
8179
/* An entry in the mips16 constant pool.  VALUE is the pool constant,
8180
   MODE is its mode, and LABEL is the CODE_LABEL associated with it.  */
8181
 
8182
struct mips16_constant {
8183
  struct mips16_constant *next;
8184
  rtx value;
8185
  rtx label;
8186
  enum machine_mode mode;
8187
};
8188
 
8189
/* Information about an incomplete mips16 constant pool.  FIRST is the
8190
   first constant, HIGHEST_ADDRESS is the highest address that the first
8191
   byte of the pool can have, and INSN_ADDRESS is the current instruction
8192
   address.  */
8193
 
8194
struct mips16_constant_pool {
8195
  struct mips16_constant *first;
8196
  int highest_address;
8197
  int insn_address;
8198
};
8199
 
8200
/* Add constant VALUE to POOL and return its label.  MODE is the
8201
   value's mode (used for CONST_INTs, etc.).  */
8202
 
8203
static rtx
8204
add_constant (struct mips16_constant_pool *pool,
8205
              rtx value, enum machine_mode mode)
8206
{
8207
  struct mips16_constant **p, *c;
8208
  bool first_of_size_p;
8209
 
8210
  /* See whether the constant is already in the pool.  If so, return the
8211
     existing label, otherwise leave P pointing to the place where the
8212
     constant should be added.
8213
 
8214
     Keep the pool sorted in increasing order of mode size so that we can
8215
     reduce the number of alignments needed.  */
8216
  first_of_size_p = true;
8217
  for (p = &pool->first; *p != 0; p = &(*p)->next)
8218
    {
8219
      if (mode == (*p)->mode && rtx_equal_p (value, (*p)->value))
8220
        return (*p)->label;
8221
      if (GET_MODE_SIZE (mode) < GET_MODE_SIZE ((*p)->mode))
8222
        break;
8223
      if (GET_MODE_SIZE (mode) == GET_MODE_SIZE ((*p)->mode))
8224
        first_of_size_p = false;
8225
    }
8226
 
8227
  /* In the worst case, the constant needed by the earliest instruction
8228
     will end up at the end of the pool.  The entire pool must then be
8229
     accessible from that instruction.
8230
 
8231
     When adding the first constant, set the pool's highest address to
8232
     the address of the first out-of-range byte.  Adjust this address
8233
     downwards each time a new constant is added.  */
8234
  if (pool->first == 0)
8235
    /* For pc-relative lw, addiu and daddiu instructions, the base PC value
8236
       is the address of the instruction with the lowest two bits clear.
8237
       The base PC value for ld has the lowest three bits clear.  Assume
8238
       the worst case here.  */
8239
    pool->highest_address = pool->insn_address - (UNITS_PER_WORD - 2) + 0x8000;
8240
  pool->highest_address -= GET_MODE_SIZE (mode);
8241
  if (first_of_size_p)
8242
    /* Take into account the worst possible padding due to alignment.  */
8243
    pool->highest_address -= GET_MODE_SIZE (mode) - 1;
8244
 
8245
  /* Create a new entry.  */
8246
  c = (struct mips16_constant *) xmalloc (sizeof *c);
8247
  c->value = value;
8248
  c->mode = mode;
8249
  c->label = gen_label_rtx ();
8250
  c->next = *p;
8251
  *p = c;
8252
 
8253
  return c->label;
8254
}
8255
 
8256
/* Output constant VALUE after instruction INSN and return the last
8257
   instruction emitted.  MODE is the mode of the constant.  */
8258
 
8259
static rtx
8260
dump_constants_1 (enum machine_mode mode, rtx value, rtx insn)
8261
{
8262
  switch (GET_MODE_CLASS (mode))
8263
    {
8264
    case MODE_INT:
8265
      {
8266
        rtx size = GEN_INT (GET_MODE_SIZE (mode));
8267
        return emit_insn_after (gen_consttable_int (value, size), insn);
8268
      }
8269
 
8270
    case MODE_FLOAT:
8271
      return emit_insn_after (gen_consttable_float (value), insn);
8272
 
8273
    case MODE_VECTOR_FLOAT:
8274
    case MODE_VECTOR_INT:
8275
      {
8276
        int i;
8277
        for (i = 0; i < CONST_VECTOR_NUNITS (value); i++)
8278
          insn = dump_constants_1 (GET_MODE_INNER (mode),
8279
                                   CONST_VECTOR_ELT (value, i), insn);
8280
        return insn;
8281
      }
8282
 
8283
    default:
8284
      gcc_unreachable ();
8285
    }
8286
}
8287
 
8288
 
8289
/* Dump out the constants in CONSTANTS after INSN.  */
8290
 
8291
static void
8292
dump_constants (struct mips16_constant *constants, rtx insn)
8293
{
8294
  struct mips16_constant *c, *next;
8295
  int align;
8296
 
8297
  align = 0;
8298
  for (c = constants; c != NULL; c = next)
8299
    {
8300
      /* If necessary, increase the alignment of PC.  */
8301
      if (align < GET_MODE_SIZE (c->mode))
8302
        {
8303
          int align_log = floor_log2 (GET_MODE_SIZE (c->mode));
8304
          insn = emit_insn_after (gen_align (GEN_INT (align_log)), insn);
8305
        }
8306
      align = GET_MODE_SIZE (c->mode);
8307
 
8308
      insn = emit_label_after (c->label, insn);
8309
      insn = dump_constants_1 (c->mode, c->value, insn);
8310
 
8311
      next = c->next;
8312
      free (c);
8313
    }
8314
 
8315
  emit_barrier_after (insn);
8316
}
8317
 
8318
/* Return the length of instruction INSN.  */
8319
 
8320
static int
8321
mips16_insn_length (rtx insn)
8322
{
8323
  if (JUMP_P (insn))
8324
    {
8325
      rtx body = PATTERN (insn);
8326
      if (GET_CODE (body) == ADDR_VEC)
8327
        return GET_MODE_SIZE (GET_MODE (body)) * XVECLEN (body, 0);
8328
      if (GET_CODE (body) == ADDR_DIFF_VEC)
8329
        return GET_MODE_SIZE (GET_MODE (body)) * XVECLEN (body, 1);
8330
    }
8331
  return get_attr_length (insn);
8332
}
8333
 
8334
/* Rewrite *X so that constant pool references refer to the constant's
8335
   label instead.  DATA points to the constant pool structure.  */
8336
 
8337
static int
8338
mips16_rewrite_pool_refs (rtx *x, void *data)
8339
{
8340
  struct mips16_constant_pool *pool = data;
8341
  if (GET_CODE (*x) == SYMBOL_REF && CONSTANT_POOL_ADDRESS_P (*x))
8342
    *x = gen_rtx_LABEL_REF (Pmode, add_constant (pool,
8343
                                                 get_pool_constant (*x),
8344
                                                 get_pool_mode (*x)));
8345
  return 0;
8346
}
8347
 
8348
/* Build MIPS16 constant pools.  */
8349
 
8350
static void
8351
mips16_lay_out_constants (void)
8352
{
8353
  struct mips16_constant_pool pool;
8354
  rtx insn, barrier;
8355
 
8356
  barrier = 0;
8357
  memset (&pool, 0, sizeof (pool));
8358
  for (insn = get_insns (); insn; insn = NEXT_INSN (insn))
8359
    {
8360
      /* Rewrite constant pool references in INSN.  */
8361
      if (INSN_P (insn))
8362
        for_each_rtx (&PATTERN (insn), mips16_rewrite_pool_refs, &pool);
8363
 
8364
      pool.insn_address += mips16_insn_length (insn);
8365
 
8366
      if (pool.first != NULL)
8367
        {
8368
          /* If there are no natural barriers between the first user of
8369
             the pool and the highest acceptable address, we'll need to
8370
             create a new instruction to jump around the constant pool.
8371
             In the worst case, this instruction will be 4 bytes long.
8372
 
8373
             If it's too late to do this transformation after INSN,
8374
             do it immediately before INSN.  */
8375
          if (barrier == 0 && pool.insn_address + 4 > pool.highest_address)
8376
            {
8377
              rtx label, jump;
8378
 
8379
              label = gen_label_rtx ();
8380
 
8381
              jump = emit_jump_insn_before (gen_jump (label), insn);
8382
              JUMP_LABEL (jump) = label;
8383
              LABEL_NUSES (label) = 1;
8384
              barrier = emit_barrier_after (jump);
8385
 
8386
              emit_label_after (label, barrier);
8387
              pool.insn_address += 4;
8388
            }
8389
 
8390
          /* See whether the constant pool is now out of range of the first
8391
             user.  If so, output the constants after the previous barrier.
8392
             Note that any instructions between BARRIER and INSN (inclusive)
8393
             will use negative offsets to refer to the pool.  */
8394
          if (pool.insn_address > pool.highest_address)
8395
            {
8396
              dump_constants (pool.first, barrier);
8397
              pool.first = NULL;
8398
              barrier = 0;
8399
            }
8400
          else if (BARRIER_P (insn))
8401
            barrier = insn;
8402
        }
8403
    }
8404
  dump_constants (pool.first, get_last_insn ());
8405
}
8406
 
8407
/* A temporary variable used by for_each_rtx callbacks, etc.  */
8408
static rtx mips_sim_insn;
8409
 
8410
/* A structure representing the state of the processor pipeline.
8411
   Used by the mips_sim_* family of functions.  */
8412
struct mips_sim {
8413
  /* The maximum number of instructions that can be issued in a cycle.
8414
     (Caches mips_issue_rate.)  */
8415
  unsigned int issue_rate;
8416
 
8417
  /* The current simulation time.  */
8418
  unsigned int time;
8419
 
8420
  /* How many more instructions can be issued in the current cycle.  */
8421
  unsigned int insns_left;
8422
 
8423
  /* LAST_SET[X].INSN is the last instruction to set register X.
8424
     LAST_SET[X].TIME is the time at which that instruction was issued.
8425
     INSN is null if no instruction has yet set register X.  */
8426
  struct {
8427
    rtx insn;
8428
    unsigned int time;
8429
  } last_set[FIRST_PSEUDO_REGISTER];
8430
 
8431
  /* The pipeline's current DFA state.  */
8432
  state_t dfa_state;
8433
};
8434
 
8435
/* Reset STATE to the initial simulation state.  */
8436
 
8437
static void
8438
mips_sim_reset (struct mips_sim *state)
8439
{
8440
  state->time = 0;
8441
  state->insns_left = state->issue_rate;
8442
  memset (&state->last_set, 0, sizeof (state->last_set));
8443
  state_reset (state->dfa_state);
8444
}
8445
 
8446
/* Initialize STATE before its first use.  DFA_STATE points to an
8447
   allocated but uninitialized DFA state.  */
8448
 
8449
static void
8450
mips_sim_init (struct mips_sim *state, state_t dfa_state)
8451
{
8452
  state->issue_rate = mips_issue_rate ();
8453
  state->dfa_state = dfa_state;
8454
  mips_sim_reset (state);
8455
}
8456
 
8457
/* Advance STATE by one clock cycle.  */
8458
 
8459
static void
8460
mips_sim_next_cycle (struct mips_sim *state)
8461
{
8462
  state->time++;
8463
  state->insns_left = state->issue_rate;
8464
  state_transition (state->dfa_state, 0);
8465
}
8466
 
8467
/* Advance simulation state STATE until instruction INSN can read
8468
   register REG.  */
8469
 
8470
static void
8471
mips_sim_wait_reg (struct mips_sim *state, rtx insn, rtx reg)
8472
{
8473
  unsigned int i;
8474
 
8475
  for (i = 0; i < HARD_REGNO_NREGS (REGNO (reg), GET_MODE (reg)); i++)
8476
    if (state->last_set[REGNO (reg) + i].insn != 0)
8477
      {
8478
        unsigned int t;
8479
 
8480
        t = state->last_set[REGNO (reg) + i].time;
8481
        t += insn_latency (state->last_set[REGNO (reg) + i].insn, insn);
8482
        while (state->time < t)
8483
          mips_sim_next_cycle (state);
8484
    }
8485
}
8486
 
8487
/* A for_each_rtx callback.  If *X is a register, advance simulation state
8488
   DATA until mips_sim_insn can read the register's value.  */
8489
 
8490
static int
8491
mips_sim_wait_regs_2 (rtx *x, void *data)
8492
{
8493
  if (REG_P (*x))
8494
    mips_sim_wait_reg (data, mips_sim_insn, *x);
8495
  return 0;
8496
}
8497
 
8498
/* Call mips_sim_wait_regs_2 (R, DATA) for each register R mentioned in *X.  */
8499
 
8500
static void
8501
mips_sim_wait_regs_1 (rtx *x, void *data)
8502
{
8503
  for_each_rtx (x, mips_sim_wait_regs_2, data);
8504
}
8505
 
8506
/* Advance simulation state STATE until all of INSN's register
8507
   dependencies are satisfied.  */
8508
 
8509
static void
8510
mips_sim_wait_regs (struct mips_sim *state, rtx insn)
8511
{
8512
  mips_sim_insn = insn;
8513
  note_uses (&PATTERN (insn), mips_sim_wait_regs_1, state);
8514
}
8515
 
8516
/* Advance simulation state STATE until the units required by
8517
   instruction INSN are available.  */
8518
 
8519
static void
8520
mips_sim_wait_units (struct mips_sim *state, rtx insn)
8521
{
8522
  state_t tmp_state;
8523
 
8524
  tmp_state = alloca (state_size ());
8525
  while (state->insns_left == 0
8526
         || (memcpy (tmp_state, state->dfa_state, state_size ()),
8527
             state_transition (tmp_state, insn) >= 0))
8528
    mips_sim_next_cycle (state);
8529
}
8530
 
8531
/* Advance simulation state STATE until INSN is ready to issue.  */
8532
 
8533
static void
8534
mips_sim_wait_insn (struct mips_sim *state, rtx insn)
8535
{
8536
  mips_sim_wait_regs (state, insn);
8537
  mips_sim_wait_units (state, insn);
8538
}
8539
 
8540
/* mips_sim_insn has just set X.  Update the LAST_SET array
8541
   in simulation state DATA.  */
8542
 
8543
static void
8544
mips_sim_record_set (rtx x, rtx pat ATTRIBUTE_UNUSED, void *data)
8545
{
8546
  struct mips_sim *state;
8547
  unsigned int i;
8548
 
8549
  state = data;
8550
  if (REG_P (x))
8551
    for (i = 0; i < HARD_REGNO_NREGS (REGNO (x), GET_MODE (x)); i++)
8552
      {
8553
        state->last_set[REGNO (x) + i].insn = mips_sim_insn;
8554
        state->last_set[REGNO (x) + i].time = state->time;
8555
      }
8556
}
8557
 
8558
/* Issue instruction INSN in scheduler state STATE.  Assume that INSN
8559
   can issue immediately (i.e., that mips_sim_wait_insn has already
8560
   been called).  */
8561
 
8562
static void
8563
mips_sim_issue_insn (struct mips_sim *state, rtx insn)
8564
{
8565
  state_transition (state->dfa_state, insn);
8566
  state->insns_left--;
8567
 
8568
  mips_sim_insn = insn;
8569
  note_stores (PATTERN (insn), mips_sim_record_set, state);
8570
}
8571
 
8572
/* Simulate issuing a NOP in state STATE.  */
8573
 
8574
static void
8575
mips_sim_issue_nop (struct mips_sim *state)
8576
{
8577
  if (state->insns_left == 0)
8578
    mips_sim_next_cycle (state);
8579
  state->insns_left--;
8580
}
8581
 
8582
/* Update simulation state STATE so that it's ready to accept the instruction
8583
   after INSN.  INSN should be part of the main rtl chain, not a member of a
8584
   SEQUENCE.  */
8585
 
8586
static void
8587
mips_sim_finish_insn (struct mips_sim *state, rtx insn)
8588
{
8589
  /* If INSN is a jump with an implicit delay slot, simulate a nop.  */
8590
  if (JUMP_P (insn))
8591
    mips_sim_issue_nop (state);
8592
 
8593
  switch (GET_CODE (SEQ_BEGIN (insn)))
8594
    {
8595
    case CODE_LABEL:
8596
    case CALL_INSN:
8597
      /* We can't predict the processor state after a call or label.  */
8598
      mips_sim_reset (state);
8599
      break;
8600
 
8601
    case JUMP_INSN:
8602
      /* The delay slots of branch likely instructions are only executed
8603
         when the branch is taken.  Therefore, if the caller has simulated
8604
         the delay slot instruction, STATE does not really reflect the state
8605
         of the pipeline for the instruction after the delay slot.  Also,
8606
         branch likely instructions tend to incur a penalty when not taken,
8607
         so there will probably be an extra delay between the branch and
8608
         the instruction after the delay slot.  */
8609
      if (INSN_ANNULLED_BRANCH_P (SEQ_BEGIN (insn)))
8610
        mips_sim_reset (state);
8611
      break;
8612
 
8613
    default:
8614
      break;
8615
    }
8616
}
8617
 
8618
/* The VR4130 pipeline issues aligned pairs of instructions together,
8619
   but it stalls the second instruction if it depends on the first.
8620
   In order to cut down the amount of logic required, this dependence
8621
   check is not based on a full instruction decode.  Instead, any non-SPECIAL
8622
   instruction is assumed to modify the register specified by bits 20-16
8623
   (which is usually the "rt" field).
8624
 
8625
   In beq, beql, bne and bnel instructions, the rt field is actually an
8626
   input, so we can end up with a false dependence between the branch
8627
   and its delay slot.  If this situation occurs in instruction INSN,
8628
   try to avoid it by swapping rs and rt.  */
8629
 
8630
static void
8631
vr4130_avoid_branch_rt_conflict (rtx insn)
8632
{
8633
  rtx first, second;
8634
 
8635
  first = SEQ_BEGIN (insn);
8636
  second = SEQ_END (insn);
8637
  if (JUMP_P (first)
8638
      && NONJUMP_INSN_P (second)
8639
      && GET_CODE (PATTERN (first)) == SET
8640
      && GET_CODE (SET_DEST (PATTERN (first))) == PC
8641
      && GET_CODE (SET_SRC (PATTERN (first))) == IF_THEN_ELSE)
8642
    {
8643
      /* Check for the right kind of condition.  */
8644
      rtx cond = XEXP (SET_SRC (PATTERN (first)), 0);
8645
      if ((GET_CODE (cond) == EQ || GET_CODE (cond) == NE)
8646
          && REG_P (XEXP (cond, 0))
8647
          && REG_P (XEXP (cond, 1))
8648
          && reg_referenced_p (XEXP (cond, 1), PATTERN (second))
8649
          && !reg_referenced_p (XEXP (cond, 0), PATTERN (second)))
8650
        {
8651
          /* SECOND mentions the rt register but not the rs register.  */
8652
          rtx tmp = XEXP (cond, 0);
8653
          XEXP (cond, 0) = XEXP (cond, 1);
8654
          XEXP (cond, 1) = tmp;
8655
        }
8656
    }
8657
}
8658
 
8659
/* Implement -mvr4130-align.  Go through each basic block and simulate the
8660
   processor pipeline.  If we find that a pair of instructions could execute
8661
   in parallel, and the first of those instruction is not 8-byte aligned,
8662
   insert a nop to make it aligned.  */
8663
 
8664
static void
8665
vr4130_align_insns (void)
8666
{
8667
  struct mips_sim state;
8668
  rtx insn, subinsn, last, last2, next;
8669
  bool aligned_p;
8670
 
8671
  dfa_start ();
8672
 
8673
  /* LAST is the last instruction before INSN to have a nonzero length.
8674
     LAST2 is the last such instruction before LAST.  */
8675
  last = 0;
8676
  last2 = 0;
8677
 
8678
  /* ALIGNED_P is true if INSN is known to be at an aligned address.  */
8679
  aligned_p = true;
8680
 
8681
  mips_sim_init (&state, alloca (state_size ()));
8682
  for (insn = get_insns (); insn != 0; insn = next)
8683
    {
8684
      unsigned int length;
8685
 
8686
      next = NEXT_INSN (insn);
8687
 
8688
      /* See the comment above vr4130_avoid_branch_rt_conflict for details.
8689
         This isn't really related to the alignment pass, but we do it on
8690
         the fly to avoid a separate instruction walk.  */
8691
      vr4130_avoid_branch_rt_conflict (insn);
8692
 
8693
      if (USEFUL_INSN_P (insn))
8694
        FOR_EACH_SUBINSN (subinsn, insn)
8695
          {
8696
            mips_sim_wait_insn (&state, subinsn);
8697
 
8698
            /* If we want this instruction to issue in parallel with the
8699
               previous one, make sure that the previous instruction is
8700
               aligned.  There are several reasons why this isn't worthwhile
8701
               when the second instruction is a call:
8702
 
8703
                  - Calls are less likely to be performance critical,
8704
                  - There's a good chance that the delay slot can execute
8705
                    in parallel with the call.
8706
                  - The return address would then be unaligned.
8707
 
8708
               In general, if we're going to insert a nop between instructions
8709
               X and Y, it's better to insert it immediately after X.  That
8710
               way, if the nop makes Y aligned, it will also align any labels
8711
               between X and Y.  */
8712
            if (state.insns_left != state.issue_rate
8713
                && !CALL_P (subinsn))
8714
              {
8715
                if (subinsn == SEQ_BEGIN (insn) && aligned_p)
8716
                  {
8717
                    /* SUBINSN is the first instruction in INSN and INSN is
8718
                       aligned.  We want to align the previous instruction
8719
                       instead, so insert a nop between LAST2 and LAST.
8720
 
8721
                       Note that LAST could be either a single instruction
8722
                       or a branch with a delay slot.  In the latter case,
8723
                       LAST, like INSN, is already aligned, but the delay
8724
                       slot must have some extra delay that stops it from
8725
                       issuing at the same time as the branch.  We therefore
8726
                       insert a nop before the branch in order to align its
8727
                       delay slot.  */
8728
                    emit_insn_after (gen_nop (), last2);
8729
                    aligned_p = false;
8730
                  }
8731
                else if (subinsn != SEQ_BEGIN (insn) && !aligned_p)
8732
                  {
8733
                    /* SUBINSN is the delay slot of INSN, but INSN is
8734
                       currently unaligned.  Insert a nop between
8735
                       LAST and INSN to align it.  */
8736
                    emit_insn_after (gen_nop (), last);
8737
                    aligned_p = true;
8738
                  }
8739
              }
8740
            mips_sim_issue_insn (&state, subinsn);
8741
          }
8742
      mips_sim_finish_insn (&state, insn);
8743
 
8744
      /* Update LAST, LAST2 and ALIGNED_P for the next instruction.  */
8745
      length = get_attr_length (insn);
8746
      if (length > 0)
8747
        {
8748
          /* If the instruction is an asm statement or multi-instruction
8749
             mips.md patern, the length is only an estimate.  Insert an
8750
             8 byte alignment after it so that the following instructions
8751
             can be handled correctly.  */
8752
          if (NONJUMP_INSN_P (SEQ_BEGIN (insn))
8753
              && (recog_memoized (insn) < 0 || length >= 8))
8754
            {
8755
              next = emit_insn_after (gen_align (GEN_INT (3)), insn);
8756
              next = NEXT_INSN (next);
8757
              mips_sim_next_cycle (&state);
8758
              aligned_p = true;
8759
            }
8760
          else if (length & 4)
8761
            aligned_p = !aligned_p;
8762
          last2 = last;
8763
          last = insn;
8764
        }
8765
 
8766
      /* See whether INSN is an aligned label.  */
8767
      if (LABEL_P (insn) && label_to_alignment (insn) >= 3)
8768
        aligned_p = true;
8769
    }
8770
  dfa_finish ();
8771
}
8772
 
8773
/* Subroutine of mips_reorg.  If there is a hazard between INSN
8774
   and a previous instruction, avoid it by inserting nops after
8775
   instruction AFTER.
8776
 
8777
   *DELAYED_REG and *HILO_DELAY describe the hazards that apply at
8778
   this point.  If *DELAYED_REG is non-null, INSN must wait a cycle
8779
   before using the value of that register.  *HILO_DELAY counts the
8780
   number of instructions since the last hilo hazard (that is,
8781
   the number of instructions since the last mflo or mfhi).
8782
 
8783
   After inserting nops for INSN, update *DELAYED_REG and *HILO_DELAY
8784
   for the next instruction.
8785
 
8786
   LO_REG is an rtx for the LO register, used in dependence checking.  */
8787
 
8788
static void
8789
mips_avoid_hazard (rtx after, rtx insn, int *hilo_delay,
8790
                   rtx *delayed_reg, rtx lo_reg)
8791
{
8792
  rtx pattern, set;
8793
  int nops, ninsns;
8794
 
8795
  if (!INSN_P (insn))
8796
    return;
8797
 
8798
  pattern = PATTERN (insn);
8799
 
8800
  /* Do not put the whole function in .set noreorder if it contains
8801
     an asm statement.  We don't know whether there will be hazards
8802
     between the asm statement and the gcc-generated code.  */
8803
  if (GET_CODE (pattern) == ASM_INPUT || asm_noperands (pattern) >= 0)
8804
    cfun->machine->all_noreorder_p = false;
8805
 
8806
  /* Ignore zero-length instructions (barriers and the like).  */
8807
  ninsns = get_attr_length (insn) / 4;
8808
  if (ninsns == 0)
8809
    return;
8810
 
8811
  /* Work out how many nops are needed.  Note that we only care about
8812
     registers that are explicitly mentioned in the instruction's pattern.
8813
     It doesn't matter that calls use the argument registers or that they
8814
     clobber hi and lo.  */
8815
  if (*hilo_delay < 2 && reg_set_p (lo_reg, pattern))
8816
    nops = 2 - *hilo_delay;
8817
  else if (*delayed_reg != 0 && reg_referenced_p (*delayed_reg, pattern))
8818
    nops = 1;
8819
  else
8820
    nops = 0;
8821
 
8822
  /* Insert the nops between this instruction and the previous one.
8823
     Each new nop takes us further from the last hilo hazard.  */
8824
  *hilo_delay += nops;
8825
  while (nops-- > 0)
8826
    emit_insn_after (gen_hazard_nop (), after);
8827
 
8828
  /* Set up the state for the next instruction.  */
8829
  *hilo_delay += ninsns;
8830
  *delayed_reg = 0;
8831
  if (INSN_CODE (insn) >= 0)
8832
    switch (get_attr_hazard (insn))
8833
      {
8834
      case HAZARD_NONE:
8835
        break;
8836
 
8837
      case HAZARD_HILO:
8838
        *hilo_delay = 0;
8839
        break;
8840
 
8841
      case HAZARD_DELAY:
8842
        set = single_set (insn);
8843
        gcc_assert (set != 0);
8844
        *delayed_reg = SET_DEST (set);
8845
        break;
8846
      }
8847
}
8848
 
8849
 
8850
/* Go through the instruction stream and insert nops where necessary.
8851
   See if the whole function can then be put into .set noreorder &
8852
   .set nomacro.  */
8853
 
8854
static void
8855
mips_avoid_hazards (void)
8856
{
8857
  rtx insn, last_insn, lo_reg, delayed_reg;
8858
  int hilo_delay, i;
8859
 
8860
  /* Force all instructions to be split into their final form.  */
8861
  split_all_insns_noflow ();
8862
 
8863
  /* Recalculate instruction lengths without taking nops into account.  */
8864
  cfun->machine->ignore_hazard_length_p = true;
8865
  shorten_branches (get_insns ());
8866
 
8867
  cfun->machine->all_noreorder_p = true;
8868
 
8869
  /* Profiled functions can't be all noreorder because the profiler
8870
     support uses assembler macros.  */
8871
  if (current_function_profile)
8872
    cfun->machine->all_noreorder_p = false;
8873
 
8874
  /* Code compiled with -mfix-vr4120 can't be all noreorder because
8875
     we rely on the assembler to work around some errata.  */
8876
  if (TARGET_FIX_VR4120)
8877
    cfun->machine->all_noreorder_p = false;
8878
 
8879
  /* The same is true for -mfix-vr4130 if we might generate mflo or
8880
     mfhi instructions.  Note that we avoid using mflo and mfhi if
8881
     the VR4130 macc and dmacc instructions are available instead;
8882
     see the *mfhilo_{si,di}_macc patterns.  */
8883
  if (TARGET_FIX_VR4130 && !ISA_HAS_MACCHI)
8884
    cfun->machine->all_noreorder_p = false;
8885
 
8886
  last_insn = 0;
8887
  hilo_delay = 2;
8888
  delayed_reg = 0;
8889
  lo_reg = gen_rtx_REG (SImode, LO_REGNUM);
8890
 
8891
  for (insn = get_insns (); insn != 0; insn = NEXT_INSN (insn))
8892
    if (INSN_P (insn))
8893
      {
8894
        if (GET_CODE (PATTERN (insn)) == SEQUENCE)
8895
          for (i = 0; i < XVECLEN (PATTERN (insn), 0); i++)
8896
            mips_avoid_hazard (last_insn, XVECEXP (PATTERN (insn), 0, i),
8897
                               &hilo_delay, &delayed_reg, lo_reg);
8898
        else
8899
          mips_avoid_hazard (last_insn, insn, &hilo_delay,
8900
                             &delayed_reg, lo_reg);
8901
 
8902
        last_insn = insn;
8903
      }
8904
}
8905
 
8906
 
8907
/* Implement TARGET_MACHINE_DEPENDENT_REORG.  */
8908
 
8909
static void
8910
mips_reorg (void)
8911
{
8912
  if (TARGET_MIPS16)
8913
    mips16_lay_out_constants ();
8914
  else if (TARGET_EXPLICIT_RELOCS)
8915
    {
8916
      if (mips_flag_delayed_branch)
8917
        dbr_schedule (get_insns (), dump_file);
8918
      mips_avoid_hazards ();
8919
      if (TUNE_MIPS4130 && TARGET_VR4130_ALIGN)
8920
        vr4130_align_insns ();
8921
    }
8922
}
8923
 
8924
/* This function does three things:
8925
 
8926
   - Register the special divsi3 and modsi3 functions if -mfix-vr4120.
8927
   - Register the mips16 hardware floating point stubs.
8928
   - Register the gofast functions if selected using --enable-gofast.  */
8929
 
8930
#include "config/gofast.h"
8931
 
8932
static void
8933
mips_init_libfuncs (void)
8934
{
8935
  if (TARGET_FIX_VR4120)
8936
    {
8937
      set_optab_libfunc (sdiv_optab, SImode, "__vr4120_divsi3");
8938
      set_optab_libfunc (smod_optab, SImode, "__vr4120_modsi3");
8939
    }
8940
 
8941
  if (TARGET_MIPS16 && mips16_hard_float)
8942
    {
8943
      set_optab_libfunc (add_optab, SFmode, "__mips16_addsf3");
8944
      set_optab_libfunc (sub_optab, SFmode, "__mips16_subsf3");
8945
      set_optab_libfunc (smul_optab, SFmode, "__mips16_mulsf3");
8946
      set_optab_libfunc (sdiv_optab, SFmode, "__mips16_divsf3");
8947
 
8948
      set_optab_libfunc (eq_optab, SFmode, "__mips16_eqsf2");
8949
      set_optab_libfunc (ne_optab, SFmode, "__mips16_nesf2");
8950
      set_optab_libfunc (gt_optab, SFmode, "__mips16_gtsf2");
8951
      set_optab_libfunc (ge_optab, SFmode, "__mips16_gesf2");
8952
      set_optab_libfunc (lt_optab, SFmode, "__mips16_ltsf2");
8953
      set_optab_libfunc (le_optab, SFmode, "__mips16_lesf2");
8954
 
8955
      set_conv_libfunc (sfix_optab, SImode, SFmode, "__mips16_fix_truncsfsi");
8956
      set_conv_libfunc (sfloat_optab, SFmode, SImode, "__mips16_floatsisf");
8957
 
8958
      if (TARGET_DOUBLE_FLOAT)
8959
        {
8960
          set_optab_libfunc (add_optab, DFmode, "__mips16_adddf3");
8961
          set_optab_libfunc (sub_optab, DFmode, "__mips16_subdf3");
8962
          set_optab_libfunc (smul_optab, DFmode, "__mips16_muldf3");
8963
          set_optab_libfunc (sdiv_optab, DFmode, "__mips16_divdf3");
8964
 
8965
          set_optab_libfunc (eq_optab, DFmode, "__mips16_eqdf2");
8966
          set_optab_libfunc (ne_optab, DFmode, "__mips16_nedf2");
8967
          set_optab_libfunc (gt_optab, DFmode, "__mips16_gtdf2");
8968
          set_optab_libfunc (ge_optab, DFmode, "__mips16_gedf2");
8969
          set_optab_libfunc (lt_optab, DFmode, "__mips16_ltdf2");
8970
          set_optab_libfunc (le_optab, DFmode, "__mips16_ledf2");
8971
 
8972
          set_conv_libfunc (sext_optab, DFmode, SFmode, "__mips16_extendsfdf2");
8973
          set_conv_libfunc (trunc_optab, SFmode, DFmode, "__mips16_truncdfsf2");
8974
 
8975
          set_conv_libfunc (sfix_optab, SImode, DFmode, "__mips16_fix_truncdfsi");
8976
          set_conv_libfunc (sfloat_optab, DFmode, SImode, "__mips16_floatsidf");
8977
        }
8978
    }
8979
  else
8980
    gofast_maybe_init_libfuncs ();
8981
}
8982
 
8983
/* Return a number assessing the cost of moving a register in class
8984
   FROM to class TO.  The classes are expressed using the enumeration
8985
   values such as `GENERAL_REGS'.  A value of 2 is the default; other
8986
   values are interpreted relative to that.
8987
 
8988
   It is not required that the cost always equal 2 when FROM is the
8989
   same as TO; on some machines it is expensive to move between
8990
   registers if they are not general registers.
8991
 
8992
   If reload sees an insn consisting of a single `set' between two
8993
   hard registers, and if `REGISTER_MOVE_COST' applied to their
8994
   classes returns a value of 2, reload does not check to ensure that
8995
   the constraints of the insn are met.  Setting a cost of other than
8996
   2 will allow reload to verify that the constraints are met.  You
8997
   should do this if the `movM' pattern's constraints do not allow
8998
   such copying.
8999
 
9000
   ??? We make the cost of moving from HI/LO into general
9001
   registers the same as for one of moving general registers to
9002
   HI/LO for TARGET_MIPS16 in order to prevent allocating a
9003
   pseudo to HI/LO.  This might hurt optimizations though, it
9004
   isn't clear if it is wise.  And it might not work in all cases.  We
9005
   could solve the DImode LO reg problem by using a multiply, just
9006
   like reload_{in,out}si.  We could solve the SImode/HImode HI reg
9007
   problem by using divide instructions.  divu puts the remainder in
9008
   the HI reg, so doing a divide by -1 will move the value in the HI
9009
   reg for all values except -1.  We could handle that case by using a
9010
   signed divide, e.g.  -1 / 2 (or maybe 1 / -2?).  We'd have to emit
9011
   a compare/branch to test the input value to see which instruction
9012
   we need to use.  This gets pretty messy, but it is feasible.  */
9013
 
9014
int
9015
mips_register_move_cost (enum machine_mode mode ATTRIBUTE_UNUSED,
9016
                         enum reg_class to, enum reg_class from)
9017
{
9018
  if (from == M16_REGS && GR_REG_CLASS_P (to))
9019
    return 2;
9020
  else if (from == M16_NA_REGS && GR_REG_CLASS_P (to))
9021
    return 2;
9022
  else if (GR_REG_CLASS_P (from))
9023
    {
9024
      if (to == M16_REGS)
9025
        return 2;
9026
      else if (to == M16_NA_REGS)
9027
        return 2;
9028
      else if (GR_REG_CLASS_P (to))
9029
        {
9030
          if (TARGET_MIPS16)
9031
            return 4;
9032
          else
9033
            return 2;
9034
        }
9035
      else if (to == FP_REGS)
9036
        return 4;
9037
      else if (reg_class_subset_p (to, ACC_REGS))
9038
        {
9039
          if (TARGET_MIPS16)
9040
            return 12;
9041
          else
9042
            return 6;
9043
        }
9044
      else if (COP_REG_CLASS_P (to))
9045
        {
9046
          return 5;
9047
        }
9048
    }
9049
  else if (from == FP_REGS)
9050
    {
9051
      if (GR_REG_CLASS_P (to))
9052
        return 4;
9053
      else if (to == FP_REGS)
9054
        return 2;
9055
      else if (to == ST_REGS)
9056
        return 8;
9057
    }
9058
  else if (reg_class_subset_p (from, ACC_REGS))
9059
    {
9060
      if (GR_REG_CLASS_P (to))
9061
        {
9062
          if (TARGET_MIPS16)
9063
            return 12;
9064
          else
9065
            return 6;
9066
        }
9067
    }
9068
  else if (from == ST_REGS && GR_REG_CLASS_P (to))
9069
    return 4;
9070
  else if (COP_REG_CLASS_P (from))
9071
    {
9072
      return 5;
9073
    }
9074
 
9075
  /* Fall through.
9076
     ??? What cases are these? Shouldn't we return 2 here?  */
9077
 
9078
  return 12;
9079
}
9080
 
9081
/* Return the length of INSN.  LENGTH is the initial length computed by
9082
   attributes in the machine-description file.  */
9083
 
9084
int
9085
mips_adjust_insn_length (rtx insn, int length)
9086
{
9087
  /* A unconditional jump has an unfilled delay slot if it is not part
9088
     of a sequence.  A conditional jump normally has a delay slot, but
9089
     does not on MIPS16.  */
9090
  if (CALL_P (insn) || (TARGET_MIPS16 ? simplejump_p (insn) : JUMP_P (insn)))
9091
    length += 4;
9092
 
9093
  /* See how many nops might be needed to avoid hardware hazards.  */
9094
  if (!cfun->machine->ignore_hazard_length_p && INSN_CODE (insn) >= 0)
9095
    switch (get_attr_hazard (insn))
9096
      {
9097
      case HAZARD_NONE:
9098
        break;
9099
 
9100
      case HAZARD_DELAY:
9101
        length += 4;
9102
        break;
9103
 
9104
      case HAZARD_HILO:
9105
        length += 8;
9106
        break;
9107
      }
9108
 
9109
  /* All MIPS16 instructions are a measly two bytes.  */
9110
  if (TARGET_MIPS16)
9111
    length /= 2;
9112
 
9113
  return length;
9114
}
9115
 
9116
 
9117
/* Return an asm sequence to start a noat block and load the address
9118
   of a label into $1.  */
9119
 
9120
const char *
9121
mips_output_load_label (void)
9122
{
9123
  if (TARGET_EXPLICIT_RELOCS)
9124
    switch (mips_abi)
9125
      {
9126
      case ABI_N32:
9127
        return "%[lw\t%@,%%got_page(%0)(%+)\n\taddiu\t%@,%@,%%got_ofst(%0)";
9128
 
9129
      case ABI_64:
9130
        return "%[ld\t%@,%%got_page(%0)(%+)\n\tdaddiu\t%@,%@,%%got_ofst(%0)";
9131
 
9132
      default:
9133
        if (ISA_HAS_LOAD_DELAY)
9134
          return "%[lw\t%@,%%got(%0)(%+)%#\n\taddiu\t%@,%@,%%lo(%0)";
9135
        return "%[lw\t%@,%%got(%0)(%+)\n\taddiu\t%@,%@,%%lo(%0)";
9136
      }
9137
  else
9138
    {
9139
      if (Pmode == DImode)
9140
        return "%[dla\t%@,%0";
9141
      else
9142
        return "%[la\t%@,%0";
9143
    }
9144
}
9145
 
9146
 
9147
/* Output assembly instructions to peform a conditional branch.
9148
 
9149
   INSN is the branch instruction.  OPERANDS[0] is the condition.
9150
   OPERANDS[1] is the target of the branch.  OPERANDS[2] is the target
9151
   of the first operand to the condition.  If TWO_OPERANDS_P is
9152
   nonzero the comparison takes two operands; OPERANDS[3] will be the
9153
   second operand.
9154
 
9155
   If INVERTED_P is nonzero we are to branch if the condition does
9156
   not hold.  If FLOAT_P is nonzero this is a floating-point comparison.
9157
 
9158
   LENGTH is the length (in bytes) of the sequence we are to generate.
9159
   That tells us whether to generate a simple conditional branch, or a
9160
   reversed conditional branch around a `jr' instruction.  */
9161
const char *
9162
mips_output_conditional_branch (rtx insn, rtx *operands, int two_operands_p,
9163
                                int float_p, int inverted_p, int length)
9164
{
9165
  static char buffer[200];
9166
  /* The kind of comparison we are doing.  */
9167
  enum rtx_code code = GET_CODE (operands[0]);
9168
  /* Nonzero if the opcode for the comparison needs a `z' indicating
9169
     that it is a comparison against zero.  */
9170
  int need_z_p;
9171
  /* A string to use in the assembly output to represent the first
9172
     operand.  */
9173
  const char *op1 = "%z2";
9174
  /* A string to use in the assembly output to represent the second
9175
     operand.  Use the hard-wired zero register if there's no second
9176
     operand.  */
9177
  const char *op2 = (two_operands_p ? ",%z3" : ",%.");
9178
  /* The operand-printing string for the comparison.  */
9179
  const char *const comp = (float_p ? "%F0" : "%C0");
9180
  /* The operand-printing string for the inverted comparison.  */
9181
  const char *const inverted_comp = (float_p ? "%W0" : "%N0");
9182
 
9183
  /* The MIPS processors (for levels of the ISA at least two), have
9184
     "likely" variants of each branch instruction.  These instructions
9185
     annul the instruction in the delay slot if the branch is not
9186
     taken.  */
9187
  mips_branch_likely = (final_sequence && INSN_ANNULLED_BRANCH_P (insn));
9188
 
9189
  if (!two_operands_p)
9190
    {
9191
      /* To compute whether than A > B, for example, we normally
9192
         subtract B from A and then look at the sign bit.  But, if we
9193
         are doing an unsigned comparison, and B is zero, we don't
9194
         have to do the subtraction.  Instead, we can just check to
9195
         see if A is nonzero.  Thus, we change the CODE here to
9196
         reflect the simpler comparison operation.  */
9197
      switch (code)
9198
        {
9199
        case GTU:
9200
          code = NE;
9201
          break;
9202
 
9203
        case LEU:
9204
          code = EQ;
9205
          break;
9206
 
9207
        case GEU:
9208
          /* A condition which will always be true.  */
9209
          code = EQ;
9210
          op1 = "%.";
9211
          break;
9212
 
9213
        case LTU:
9214
          /* A condition which will always be false.  */
9215
          code = NE;
9216
          op1 = "%.";
9217
          break;
9218
 
9219
        default:
9220
          /* Not a special case.  */
9221
          break;
9222
        }
9223
    }
9224
 
9225
  /* Relative comparisons are always done against zero.  But
9226
     equality comparisons are done between two operands, and therefore
9227
     do not require a `z' in the assembly language output.  */
9228
  need_z_p = (!float_p && code != EQ && code != NE);
9229
  /* For comparisons against zero, the zero is not provided
9230
     explicitly.  */
9231
  if (need_z_p)
9232
    op2 = "";
9233
 
9234
  /* Begin by terminating the buffer.  That way we can always use
9235
     strcat to add to it.  */
9236
  buffer[0] = '\0';
9237
 
9238
  switch (length)
9239
    {
9240
    case 4:
9241
    case 8:
9242
      /* Just a simple conditional branch.  */
9243
      if (float_p)
9244
        sprintf (buffer, "%%*b%s%%?\t%%Z2%%1%%/",
9245
                 inverted_p ? inverted_comp : comp);
9246
      else
9247
        sprintf (buffer, "%%*b%s%s%%?\t%s%s,%%1%%/",
9248
                 inverted_p ? inverted_comp : comp,
9249
                 need_z_p ? "z" : "",
9250
                 op1,
9251
                 op2);
9252
      return buffer;
9253
 
9254
    case 12:
9255
    case 16:
9256
    case 24:
9257
    case 28:
9258
      {
9259
        /* Generate a reversed conditional branch around ` j'
9260
           instruction:
9261
 
9262
                .set noreorder
9263
                .set nomacro
9264
                bc    l
9265
                delay_slot or #nop
9266
                j     target
9267
                #nop
9268
             l:
9269
                .set macro
9270
                .set reorder
9271
 
9272
           If the original branch was a likely branch, the delay slot
9273
           must be executed only if the branch is taken, so generate:
9274
 
9275
                .set noreorder
9276
                .set nomacro
9277
                bc    l
9278
                #nop
9279
                j     target
9280
                delay slot or #nop
9281
             l:
9282
                .set macro
9283
                .set reorder
9284
 
9285
           When generating PIC, instead of:
9286
 
9287
                j     target
9288
 
9289
           we emit:
9290
 
9291
                .set noat
9292
                la    $at, target
9293
                jr    $at
9294
                .set at
9295
        */
9296
 
9297
        rtx orig_target;
9298
        rtx target = gen_label_rtx ();
9299
 
9300
        orig_target = operands[1];
9301
        operands[1] = target;
9302
        /* Generate the reversed comparison.  This takes four
9303
           bytes.  */
9304
        if (float_p)
9305
          sprintf (buffer, "%%*b%s\t%%Z2%%1",
9306
                   inverted_p ? comp : inverted_comp);
9307
        else
9308
          sprintf (buffer, "%%*b%s%s\t%s%s,%%1",
9309
                   inverted_p ? comp : inverted_comp,
9310
                   need_z_p ? "z" : "",
9311
                   op1,
9312
                   op2);
9313
        output_asm_insn (buffer, operands);
9314
 
9315
        if (length != 16 && length != 28 && ! mips_branch_likely)
9316
          {
9317
            /* Output delay slot instruction.  */
9318
            rtx insn = final_sequence;
9319
            final_scan_insn (XVECEXP (insn, 0, 1), asm_out_file,
9320
                             optimize, 1, NULL);
9321
            INSN_DELETED_P (XVECEXP (insn, 0, 1)) = 1;
9322
          }
9323
        else
9324
          output_asm_insn ("%#", 0);
9325
 
9326
        if (length <= 16)
9327
          output_asm_insn ("j\t%0", &orig_target);
9328
        else
9329
          {
9330
            output_asm_insn (mips_output_load_label (), &orig_target);
9331
            output_asm_insn ("jr\t%@%]", 0);
9332
          }
9333
 
9334
        if (length != 16 && length != 28 && mips_branch_likely)
9335
          {
9336
            /* Output delay slot instruction.  */
9337
            rtx insn = final_sequence;
9338
            final_scan_insn (XVECEXP (insn, 0, 1), asm_out_file,
9339
                             optimize, 1, NULL);
9340
            INSN_DELETED_P (XVECEXP (insn, 0, 1)) = 1;
9341
          }
9342
        else
9343
          output_asm_insn ("%#", 0);
9344
 
9345
        (*targetm.asm_out.internal_label) (asm_out_file, "L",
9346
                                   CODE_LABEL_NUMBER (target));
9347
 
9348
        return "";
9349
      }
9350
 
9351
    default:
9352
      gcc_unreachable ();
9353
    }
9354
 
9355
  /* NOTREACHED */
9356
  return 0;
9357
}
9358
 
9359
/* Used to output div or ddiv instruction DIVISION, which has the operands
9360
   given by OPERANDS.  Add in a divide-by-zero check if needed.
9361
 
9362
   When working around R4000 and R4400 errata, we need to make sure that
9363
   the division is not immediately followed by a shift[1][2].  We also
9364
   need to stop the division from being put into a branch delay slot[3].
9365
   The easiest way to avoid both problems is to add a nop after the
9366
   division.  When a divide-by-zero check is needed, this nop can be
9367
   used to fill the branch delay slot.
9368
 
9369
   [1] If a double-word or a variable shift executes immediately
9370
       after starting an integer division, the shift may give an
9371
       incorrect result.  See quotations of errata #16 and #28 from
9372
       "MIPS R4000PC/SC Errata, Processor Revision 2.2 and 3.0"
9373
       in mips.md for details.
9374
 
9375
   [2] A similar bug to [1] exists for all revisions of the
9376
       R4000 and the R4400 when run in an MC configuration.
9377
       From "MIPS R4000MC Errata, Processor Revision 2.2 and 3.0":
9378
 
9379
       "19. In this following sequence:
9380
 
9381
                    ddiv                (or ddivu or div or divu)
9382
                    dsll32              (or dsrl32, dsra32)
9383
 
9384
            if an MPT stall occurs, while the divide is slipping the cpu
9385
            pipeline, then the following double shift would end up with an
9386
            incorrect result.
9387
 
9388
            Workaround: The compiler needs to avoid generating any
9389
            sequence with divide followed by extended double shift."
9390
 
9391
       This erratum is also present in "MIPS R4400MC Errata, Processor
9392
       Revision 1.0" and "MIPS R4400MC Errata, Processor Revision 2.0
9393
       & 3.0" as errata #10 and #4, respectively.
9394
 
9395
   [3] From "MIPS R4000PC/SC Errata, Processor Revision 2.2 and 3.0"
9396
       (also valid for MIPS R4000MC processors):
9397
 
9398
       "52. R4000SC: This bug does not apply for the R4000PC.
9399
 
9400
            There are two flavors of this bug:
9401
 
9402
            1) If the instruction just after divide takes an RF exception
9403
               (tlb-refill, tlb-invalid) and gets an instruction cache
9404
               miss (both primary and secondary) and the line which is
9405
               currently in secondary cache at this index had the first
9406
               data word, where the bits 5..2 are set, then R4000 would
9407
               get a wrong result for the div.
9408
 
9409
            ##1
9410
                    nop
9411
                    div r8, r9
9412
                    -------------------         # end-of page. -tlb-refill
9413
                    nop
9414
            ##2
9415
                    nop
9416
                    div r8, r9
9417
                    -------------------         # end-of page. -tlb-invalid
9418
                    nop
9419
 
9420
            2) If the divide is in the taken branch delay slot, where the
9421
               target takes RF exception and gets an I-cache miss for the
9422
               exception vector or where I-cache miss occurs for the
9423
               target address, under the above mentioned scenarios, the
9424
               div would get wrong results.
9425
 
9426
            ##1
9427
                    j   r2              # to next page mapped or unmapped
9428
                    div r8,r9           # this bug would be there as long
9429
                                        # as there is an ICache miss and
9430
                    nop                 # the "data pattern" is present
9431
 
9432
            ##2
9433
                    beq r0, r0, NextPage        # to Next page
9434
                    div r8,r9
9435
                    nop
9436
 
9437
            This bug is present for div, divu, ddiv, and ddivu
9438
            instructions.
9439
 
9440
            Workaround: For item 1), OS could make sure that the next page
9441
            after the divide instruction is also mapped.  For item 2), the
9442
            compiler could make sure that the divide instruction is not in
9443
            the branch delay slot."
9444
 
9445
       These processors have PRId values of 0x00004220 and 0x00004300 for
9446
       the R4000 and 0x00004400, 0x00004500 and 0x00004600 for the R4400.  */
9447
 
9448
const char *
9449
mips_output_division (const char *division, rtx *operands)
9450
{
9451
  const char *s;
9452
 
9453
  s = division;
9454
  if (TARGET_FIX_R4000 || TARGET_FIX_R4400)
9455
    {
9456
      output_asm_insn (s, operands);
9457
      s = "nop";
9458
    }
9459
  if (TARGET_CHECK_ZERO_DIV)
9460
    {
9461
      if (TARGET_MIPS16)
9462
        {
9463
          output_asm_insn (s, operands);
9464
          s = "bnez\t%2,1f\n\tbreak\t7\n1:";
9465
        }
9466
      else if (GENERATE_DIVIDE_TRAPS)
9467
        {
9468
          output_asm_insn (s, operands);
9469
          s = "teq\t%2,%.,7";
9470
        }
9471
      else
9472
        {
9473
          output_asm_insn ("%(bne\t%2,%.,1f", operands);
9474
          output_asm_insn (s, operands);
9475
          s = "break\t7%)\n1:";
9476
        }
9477
    }
9478
  return s;
9479
}
9480
 
9481
/* Return true if GIVEN is the same as CANONICAL, or if it is CANONICAL
9482
   with a final "000" replaced by "k".  Ignore case.
9483
 
9484
   Note: this function is shared between GCC and GAS.  */
9485
 
9486
static bool
9487
mips_strict_matching_cpu_name_p (const char *canonical, const char *given)
9488
{
9489
  while (*given != 0 && TOLOWER (*given) == TOLOWER (*canonical))
9490
    given++, canonical++;
9491
 
9492
  return ((*given == 0 && *canonical == 0)
9493
          || (strcmp (canonical, "000") == 0 && strcasecmp (given, "k") == 0));
9494
}
9495
 
9496
 
9497
/* Return true if GIVEN matches CANONICAL, where GIVEN is a user-supplied
9498
   CPU name.  We've traditionally allowed a lot of variation here.
9499
 
9500
   Note: this function is shared between GCC and GAS.  */
9501
 
9502
static bool
9503
mips_matching_cpu_name_p (const char *canonical, const char *given)
9504
{
9505
  /* First see if the name matches exactly, or with a final "000"
9506
     turned into "k".  */
9507
  if (mips_strict_matching_cpu_name_p (canonical, given))
9508
    return true;
9509
 
9510
  /* If not, try comparing based on numerical designation alone.
9511
     See if GIVEN is an unadorned number, or 'r' followed by a number.  */
9512
  if (TOLOWER (*given) == 'r')
9513
    given++;
9514
  if (!ISDIGIT (*given))
9515
    return false;
9516
 
9517
  /* Skip over some well-known prefixes in the canonical name,
9518
     hoping to find a number there too.  */
9519
  if (TOLOWER (canonical[0]) == 'v' && TOLOWER (canonical[1]) == 'r')
9520
    canonical += 2;
9521
  else if (TOLOWER (canonical[0]) == 'r' && TOLOWER (canonical[1]) == 'm')
9522
    canonical += 2;
9523
  else if (TOLOWER (canonical[0]) == 'r')
9524
    canonical += 1;
9525
 
9526
  return mips_strict_matching_cpu_name_p (canonical, given);
9527
}
9528
 
9529
 
9530
/* Return the mips_cpu_info entry for the processor or ISA given
9531
   by CPU_STRING.  Return null if the string isn't recognized.
9532
 
9533
   A similar function exists in GAS.  */
9534
 
9535
static const struct mips_cpu_info *
9536
mips_parse_cpu (const char *cpu_string)
9537
{
9538
  const struct mips_cpu_info *p;
9539
  const char *s;
9540
 
9541
  /* In the past, we allowed upper-case CPU names, but it doesn't
9542
     work well with the multilib machinery.  */
9543
  for (s = cpu_string; *s != 0; s++)
9544
    if (ISUPPER (*s))
9545
      {
9546
        warning (0, "the cpu name must be lower case");
9547
        break;
9548
      }
9549
 
9550
  /* 'from-abi' selects the most compatible architecture for the given
9551
     ABI: MIPS I for 32-bit ABIs and MIPS III for 64-bit ABIs.  For the
9552
     EABIs, we have to decide whether we're using the 32-bit or 64-bit
9553
     version.  Look first at the -mgp options, if given, otherwise base
9554
     the choice on MASK_64BIT in TARGET_DEFAULT.  */
9555
  if (strcasecmp (cpu_string, "from-abi") == 0)
9556
    return mips_cpu_info_from_isa (ABI_NEEDS_32BIT_REGS ? 1
9557
                                   : ABI_NEEDS_64BIT_REGS ? 3
9558
                                   : (TARGET_64BIT ? 3 : 1));
9559
 
9560
  /* 'default' has traditionally been a no-op.  Probably not very useful.  */
9561
  if (strcasecmp (cpu_string, "default") == 0)
9562
    return 0;
9563
 
9564
  for (p = mips_cpu_info_table; p->name != 0; p++)
9565
    if (mips_matching_cpu_name_p (p->name, cpu_string))
9566
      return p;
9567
 
9568
  return 0;
9569
}
9570
 
9571
 
9572
/* Return the processor associated with the given ISA level, or null
9573
   if the ISA isn't valid.  */
9574
 
9575
static const struct mips_cpu_info *
9576
mips_cpu_info_from_isa (int isa)
9577
{
9578
  const struct mips_cpu_info *p;
9579
 
9580
  for (p = mips_cpu_info_table; p->name != 0; p++)
9581
    if (p->isa == isa)
9582
      return p;
9583
 
9584
  return 0;
9585
}
9586
 
9587
/* Implement HARD_REGNO_NREGS.  The size of FP registers is controlled
9588
   by UNITS_PER_FPREG.  The size of FP status registers is always 4, because
9589
   they only hold condition code modes, and CCmode is always considered to
9590
   be 4 bytes wide.  All other registers are word sized.  */
9591
 
9592
unsigned int
9593
mips_hard_regno_nregs (int regno, enum machine_mode mode)
9594
{
9595
  if (ST_REG_P (regno))
9596
    return ((GET_MODE_SIZE (mode) + 3) / 4);
9597
  else if (! FP_REG_P (regno))
9598
    return ((GET_MODE_SIZE (mode) + UNITS_PER_WORD - 1) / UNITS_PER_WORD);
9599
  else
9600
    return ((GET_MODE_SIZE (mode) + UNITS_PER_FPREG - 1) / UNITS_PER_FPREG);
9601
}
9602
 
9603
/* Implement TARGET_RETURN_IN_MEMORY.  Under the old (i.e., 32 and O64 ABIs)
9604
   all BLKmode objects are returned in memory.  Under the new (N32 and
9605
   64-bit MIPS ABIs) small structures are returned in a register.
9606
   Objects with varying size must still be returned in memory, of
9607
   course.  */
9608
 
9609
static bool
9610
mips_return_in_memory (tree type, tree fndecl ATTRIBUTE_UNUSED)
9611
{
9612
  if (TARGET_OLDABI)
9613
    return (TYPE_MODE (type) == BLKmode);
9614
  else
9615
    return ((int_size_in_bytes (type) > (2 * UNITS_PER_WORD))
9616
            || (int_size_in_bytes (type) == -1));
9617
}
9618
 
9619
static bool
9620
mips_strict_argument_naming (CUMULATIVE_ARGS *ca ATTRIBUTE_UNUSED)
9621
{
9622
  return !TARGET_OLDABI;
9623
}
9624
 
9625
/* Return true if INSN is a multiply-add or multiply-subtract
9626
   instruction and PREV assigns to the accumulator operand.  */
9627
 
9628
bool
9629
mips_linked_madd_p (rtx prev, rtx insn)
9630
{
9631
  rtx x;
9632
 
9633
  x = single_set (insn);
9634
  if (x == 0)
9635
    return false;
9636
 
9637
  x = SET_SRC (x);
9638
 
9639
  if (GET_CODE (x) == PLUS
9640
      && GET_CODE (XEXP (x, 0)) == MULT
9641
      && reg_set_p (XEXP (x, 1), prev))
9642
    return true;
9643
 
9644
  if (GET_CODE (x) == MINUS
9645
      && GET_CODE (XEXP (x, 1)) == MULT
9646
      && reg_set_p (XEXP (x, 0), prev))
9647
    return true;
9648
 
9649
  return false;
9650
}
9651
 
9652
/* Used by TUNE_MACC_CHAINS to record the last scheduled instruction
9653
   that may clobber hi or lo.  */
9654
 
9655
static rtx mips_macc_chains_last_hilo;
9656
 
9657
/* A TUNE_MACC_CHAINS helper function.  Record that instruction INSN has
9658
   been scheduled, updating mips_macc_chains_last_hilo appropriately.  */
9659
 
9660
static void
9661
mips_macc_chains_record (rtx insn)
9662
{
9663
  if (get_attr_may_clobber_hilo (insn))
9664
    mips_macc_chains_last_hilo = insn;
9665
}
9666
 
9667
/* A TUNE_MACC_CHAINS helper function.  Search ready queue READY, which
9668
   has NREADY elements, looking for a multiply-add or multiply-subtract
9669
   instruction that is cumulative with mips_macc_chains_last_hilo.
9670
   If there is one, promote it ahead of anything else that might
9671
   clobber hi or lo.  */
9672
 
9673
static void
9674
mips_macc_chains_reorder (rtx *ready, int nready)
9675
{
9676
  int i, j;
9677
 
9678
  if (mips_macc_chains_last_hilo != 0)
9679
    for (i = nready - 1; i >= 0; i--)
9680
      if (mips_linked_madd_p (mips_macc_chains_last_hilo, ready[i]))
9681
        {
9682
          for (j = nready - 1; j > i; j--)
9683
            if (recog_memoized (ready[j]) >= 0
9684
                && get_attr_may_clobber_hilo (ready[j]))
9685
              {
9686
                mips_promote_ready (ready, i, j);
9687
                break;
9688
              }
9689
          break;
9690
        }
9691
}
9692
 
9693
/* The last instruction to be scheduled.  */
9694
 
9695
static rtx vr4130_last_insn;
9696
 
9697
/* A note_stores callback used by vr4130_true_reg_dependence_p.  DATA
9698
   points to an rtx that is initially an instruction.  Nullify the rtx
9699
   if the instruction uses the value of register X.  */
9700
 
9701
static void
9702
vr4130_true_reg_dependence_p_1 (rtx x, rtx pat ATTRIBUTE_UNUSED, void *data)
9703
{
9704
  rtx *insn_ptr = data;
9705
  if (REG_P (x)
9706
      && *insn_ptr != 0
9707
      && reg_referenced_p (x, PATTERN (*insn_ptr)))
9708
    *insn_ptr = 0;
9709
}
9710
 
9711
/* Return true if there is true register dependence between vr4130_last_insn
9712
   and INSN.  */
9713
 
9714
static bool
9715
vr4130_true_reg_dependence_p (rtx insn)
9716
{
9717
  note_stores (PATTERN (vr4130_last_insn),
9718
               vr4130_true_reg_dependence_p_1, &insn);
9719
  return insn == 0;
9720
}
9721
 
9722
/* A TUNE_MIPS4130 helper function.  Given that INSN1 is at the head of
9723
   the ready queue and that INSN2 is the instruction after it, return
9724
   true if it is worth promoting INSN2 ahead of INSN1.  Look for cases
9725
   in which INSN1 and INSN2 can probably issue in parallel, but for
9726
   which (INSN2, INSN1) should be less sensitive to instruction
9727
   alignment than (INSN1, INSN2).  See 4130.md for more details.  */
9728
 
9729
static bool
9730
vr4130_swap_insns_p (rtx insn1, rtx insn2)
9731
{
9732
  rtx dep;
9733
 
9734
  /* Check for the following case:
9735
 
9736
     1) there is some other instruction X with an anti dependence on INSN1;
9737
     2) X has a higher priority than INSN2; and
9738
     3) X is an arithmetic instruction (and thus has no unit restrictions).
9739
 
9740
     If INSN1 is the last instruction blocking X, it would better to
9741
     choose (INSN1, X) over (INSN2, INSN1).  */
9742
  for (dep = INSN_DEPEND (insn1); dep != 0; dep = XEXP (dep, 1))
9743
    if (REG_NOTE_KIND (dep) == REG_DEP_ANTI
9744
        && INSN_PRIORITY (XEXP (dep, 0)) > INSN_PRIORITY (insn2)
9745
        && recog_memoized (XEXP (dep, 0)) >= 0
9746
        && get_attr_vr4130_class (XEXP (dep, 0)) == VR4130_CLASS_ALU)
9747
      return false;
9748
 
9749
  if (vr4130_last_insn != 0
9750
      && recog_memoized (insn1) >= 0
9751
      && recog_memoized (insn2) >= 0)
9752
    {
9753
      /* See whether INSN1 and INSN2 use different execution units,
9754
         or if they are both ALU-type instructions.  If so, they can
9755
         probably execute in parallel.  */
9756
      enum attr_vr4130_class class1 = get_attr_vr4130_class (insn1);
9757
      enum attr_vr4130_class class2 = get_attr_vr4130_class (insn2);
9758
      if (class1 != class2 || class1 == VR4130_CLASS_ALU)
9759
        {
9760
          /* If only one of the instructions has a dependence on
9761
             vr4130_last_insn, prefer to schedule the other one first.  */
9762
          bool dep1 = vr4130_true_reg_dependence_p (insn1);
9763
          bool dep2 = vr4130_true_reg_dependence_p (insn2);
9764
          if (dep1 != dep2)
9765
            return dep1;
9766
 
9767
          /* Prefer to schedule INSN2 ahead of INSN1 if vr4130_last_insn
9768
             is not an ALU-type instruction and if INSN1 uses the same
9769
             execution unit.  (Note that if this condition holds, we already
9770
             know that INSN2 uses a different execution unit.)  */
9771
          if (class1 != VR4130_CLASS_ALU
9772
              && recog_memoized (vr4130_last_insn) >= 0
9773
              && class1 == get_attr_vr4130_class (vr4130_last_insn))
9774
            return true;
9775
        }
9776
    }
9777
  return false;
9778
}
9779
 
9780
/* A TUNE_MIPS4130 helper function.  (READY, NREADY) describes a ready
9781
   queue with at least two instructions.  Swap the first two if
9782
   vr4130_swap_insns_p says that it could be worthwhile.  */
9783
 
9784
static void
9785
vr4130_reorder (rtx *ready, int nready)
9786
{
9787
  if (vr4130_swap_insns_p (ready[nready - 1], ready[nready - 2]))
9788
    mips_promote_ready (ready, nready - 2, nready - 1);
9789
}
9790
 
9791
/* Remove the instruction at index LOWER from ready queue READY and
9792
   reinsert it in front of the instruction at index HIGHER.  LOWER must
9793
   be <= HIGHER.  */
9794
 
9795
static void
9796
mips_promote_ready (rtx *ready, int lower, int higher)
9797
{
9798
  rtx new_head;
9799
  int i;
9800
 
9801
  new_head = ready[lower];
9802
  for (i = lower; i < higher; i++)
9803
    ready[i] = ready[i + 1];
9804
  ready[i] = new_head;
9805
}
9806
 
9807
/* Implement TARGET_SCHED_REORDER.  */
9808
 
9809
static int
9810
mips_sched_reorder (FILE *file ATTRIBUTE_UNUSED, int verbose ATTRIBUTE_UNUSED,
9811
                    rtx *ready, int *nreadyp, int cycle)
9812
{
9813
  if (!reload_completed && TUNE_MACC_CHAINS)
9814
    {
9815
      if (cycle == 0)
9816
        mips_macc_chains_last_hilo = 0;
9817
      if (*nreadyp > 0)
9818
        mips_macc_chains_reorder (ready, *nreadyp);
9819
    }
9820
  if (reload_completed && TUNE_MIPS4130 && !TARGET_VR4130_ALIGN)
9821
    {
9822
      if (cycle == 0)
9823
        vr4130_last_insn = 0;
9824
      if (*nreadyp > 1)
9825
        vr4130_reorder (ready, *nreadyp);
9826
    }
9827
  return mips_issue_rate ();
9828
}
9829
 
9830
/* Implement TARGET_SCHED_VARIABLE_ISSUE.  */
9831
 
9832
static int
9833
mips_variable_issue (FILE *file ATTRIBUTE_UNUSED, int verbose ATTRIBUTE_UNUSED,
9834
                     rtx insn, int more)
9835
{
9836
  switch (GET_CODE (PATTERN (insn)))
9837
    {
9838
    case USE:
9839
    case CLOBBER:
9840
      /* Don't count USEs and CLOBBERs against the issue rate.  */
9841
      break;
9842
 
9843
    default:
9844
      more--;
9845
      if (!reload_completed && TUNE_MACC_CHAINS)
9846
        mips_macc_chains_record (insn);
9847
      vr4130_last_insn = insn;
9848
      break;
9849
    }
9850
  return more;
9851
}
9852
 
9853
/* Implement TARGET_SCHED_ADJUST_COST.  We assume that anti and output
9854
   dependencies have no cost.  */
9855
 
9856
static int
9857
mips_adjust_cost (rtx insn ATTRIBUTE_UNUSED, rtx link,
9858
                  rtx dep ATTRIBUTE_UNUSED, int cost)
9859
{
9860
  if (REG_NOTE_KIND (link) != 0)
9861
    return 0;
9862
  return cost;
9863
}
9864
 
9865
/* Return the number of instructions that can be issued per cycle.  */
9866
 
9867
static int
9868
mips_issue_rate (void)
9869
{
9870
  switch (mips_tune)
9871
    {
9872
    case PROCESSOR_R4130:
9873
    case PROCESSOR_R5400:
9874
    case PROCESSOR_R5500:
9875
    case PROCESSOR_R7000:
9876
    case PROCESSOR_R9000:
9877
      return 2;
9878
 
9879
    case PROCESSOR_SB1:
9880
      /* This is actually 4, but we get better performance if we claim 3.
9881
         This is partly because of unwanted speculative code motion with the
9882
         larger number, and partly because in most common cases we can't
9883
         reach the theoretical max of 4.  */
9884
      return 3;
9885
 
9886
    default:
9887
      return 1;
9888
    }
9889
}
9890
 
9891
/* Implements TARGET_SCHED_FIRST_CYCLE_MULTIPASS_DFA_LOOKAHEAD.  This should
9892
   be as wide as the scheduling freedom in the DFA.  */
9893
 
9894
static int
9895
mips_multipass_dfa_lookahead (void)
9896
{
9897
  /* Can schedule up to 4 of the 6 function units in any one cycle.  */
9898
  if (mips_tune == PROCESSOR_SB1)
9899
    return 4;
9900
 
9901
  return 0;
9902
}
9903
 
9904
/* Given that we have an rtx of the form (prefetch ... WRITE LOCALITY),
9905
   return the first operand of the associated "pref" or "prefx" insn.  */
9906
 
9907
rtx
9908
mips_prefetch_cookie (rtx write, rtx locality)
9909
{
9910
  /* store_streamed / load_streamed.  */
9911
  if (INTVAL (locality) <= 0)
9912
    return GEN_INT (INTVAL (write) + 4);
9913
 
9914
  /* store / load.  */
9915
  if (INTVAL (locality) <= 2)
9916
    return write;
9917
 
9918
  /* store_retained / load_retained.  */
9919
  return GEN_INT (INTVAL (write) + 6);
9920
}
9921
 
9922
/* MIPS builtin function support. */
9923
 
9924
struct builtin_description
9925
{
9926
  /* The code of the main .md file instruction.  See mips_builtin_type
9927
     for more information.  */
9928
  enum insn_code icode;
9929
 
9930
  /* The floating-point comparison code to use with ICODE, if any.  */
9931
  enum mips_fp_condition cond;
9932
 
9933
  /* The name of the builtin function.  */
9934
  const char *name;
9935
 
9936
  /* Specifies how the function should be expanded.  */
9937
  enum mips_builtin_type builtin_type;
9938
 
9939
  /* The function's prototype.  */
9940
  enum mips_function_type function_type;
9941
 
9942
  /* The target flags required for this function.  */
9943
  int target_flags;
9944
};
9945
 
9946
/* Define a MIPS_BUILTIN_DIRECT function for instruction CODE_FOR_mips_<INSN>.
9947
   FUNCTION_TYPE and TARGET_FLAGS are builtin_description fields.  */
9948
#define DIRECT_BUILTIN(INSN, FUNCTION_TYPE, TARGET_FLAGS)               \
9949
  { CODE_FOR_mips_ ## INSN, 0, "__builtin_mips_" #INSN,                 \
9950
    MIPS_BUILTIN_DIRECT, FUNCTION_TYPE, TARGET_FLAGS }
9951
 
9952
/* Define __builtin_mips_<INSN>_<COND>_{s,d}, both of which require
9953
   TARGET_FLAGS.  */
9954
#define CMP_SCALAR_BUILTINS(INSN, COND, TARGET_FLAGS)                   \
9955
  { CODE_FOR_mips_ ## INSN ## _cond_s, MIPS_FP_COND_ ## COND,           \
9956
    "__builtin_mips_" #INSN "_" #COND "_s",                             \
9957
    MIPS_BUILTIN_CMP_SINGLE, MIPS_INT_FTYPE_SF_SF, TARGET_FLAGS },      \
9958
  { CODE_FOR_mips_ ## INSN ## _cond_d, MIPS_FP_COND_ ## COND,           \
9959
    "__builtin_mips_" #INSN "_" #COND "_d",                             \
9960
    MIPS_BUILTIN_CMP_SINGLE, MIPS_INT_FTYPE_DF_DF, TARGET_FLAGS }
9961
 
9962
/* Define __builtin_mips_{any,all,upper,lower}_<INSN>_<COND>_ps.
9963
   The lower and upper forms require TARGET_FLAGS while the any and all
9964
   forms require MASK_MIPS3D.  */
9965
#define CMP_PS_BUILTINS(INSN, COND, TARGET_FLAGS)                       \
9966
  { CODE_FOR_mips_ ## INSN ## _cond_ps, MIPS_FP_COND_ ## COND,          \
9967
    "__builtin_mips_any_" #INSN "_" #COND "_ps",                        \
9968
    MIPS_BUILTIN_CMP_ANY, MIPS_INT_FTYPE_V2SF_V2SF, MASK_MIPS3D },      \
9969
  { CODE_FOR_mips_ ## INSN ## _cond_ps, MIPS_FP_COND_ ## COND,          \
9970
    "__builtin_mips_all_" #INSN "_" #COND "_ps",                        \
9971
    MIPS_BUILTIN_CMP_ALL, MIPS_INT_FTYPE_V2SF_V2SF, MASK_MIPS3D },      \
9972
  { CODE_FOR_mips_ ## INSN ## _cond_ps, MIPS_FP_COND_ ## COND,          \
9973
    "__builtin_mips_lower_" #INSN "_" #COND "_ps",                      \
9974
    MIPS_BUILTIN_CMP_LOWER, MIPS_INT_FTYPE_V2SF_V2SF, TARGET_FLAGS },   \
9975
  { CODE_FOR_mips_ ## INSN ## _cond_ps, MIPS_FP_COND_ ## COND,          \
9976
    "__builtin_mips_upper_" #INSN "_" #COND "_ps",                      \
9977
    MIPS_BUILTIN_CMP_UPPER, MIPS_INT_FTYPE_V2SF_V2SF, TARGET_FLAGS }
9978
 
9979
/* Define __builtin_mips_{any,all}_<INSN>_<COND>_4s.  The functions
9980
   require MASK_MIPS3D.  */
9981
#define CMP_4S_BUILTINS(INSN, COND)                                     \
9982
  { CODE_FOR_mips_ ## INSN ## _cond_4s, MIPS_FP_COND_ ## COND,          \
9983
    "__builtin_mips_any_" #INSN "_" #COND "_4s",                        \
9984
    MIPS_BUILTIN_CMP_ANY, MIPS_INT_FTYPE_V2SF_V2SF_V2SF_V2SF,           \
9985
    MASK_MIPS3D },                                                      \
9986
  { CODE_FOR_mips_ ## INSN ## _cond_4s, MIPS_FP_COND_ ## COND,          \
9987
    "__builtin_mips_all_" #INSN "_" #COND "_4s",                        \
9988
    MIPS_BUILTIN_CMP_ALL, MIPS_INT_FTYPE_V2SF_V2SF_V2SF_V2SF,           \
9989
    MASK_MIPS3D }
9990
 
9991
/* Define __builtin_mips_mov{t,f}_<INSN>_<COND>_ps.  The comparison
9992
   instruction requires TARGET_FLAGS.  */
9993
#define MOVTF_BUILTINS(INSN, COND, TARGET_FLAGS)                        \
9994
  { CODE_FOR_mips_ ## INSN ## _cond_ps, MIPS_FP_COND_ ## COND,          \
9995
    "__builtin_mips_movt_" #INSN "_" #COND "_ps",                       \
9996
    MIPS_BUILTIN_MOVT, MIPS_V2SF_FTYPE_V2SF_V2SF_V2SF_V2SF,             \
9997
    TARGET_FLAGS },                                                     \
9998
  { CODE_FOR_mips_ ## INSN ## _cond_ps, MIPS_FP_COND_ ## COND,          \
9999
    "__builtin_mips_movf_" #INSN "_" #COND "_ps",                       \
10000
    MIPS_BUILTIN_MOVF, MIPS_V2SF_FTYPE_V2SF_V2SF_V2SF_V2SF,             \
10001
    TARGET_FLAGS }
10002
 
10003
/* Define all the builtins related to c.cond.fmt condition COND.  */
10004
#define CMP_BUILTINS(COND)                                              \
10005
  MOVTF_BUILTINS (c, COND, MASK_PAIRED_SINGLE_FLOAT),                   \
10006
  MOVTF_BUILTINS (cabs, COND, MASK_MIPS3D),                             \
10007
  CMP_SCALAR_BUILTINS (cabs, COND, MASK_MIPS3D),                        \
10008
  CMP_PS_BUILTINS (c, COND, MASK_PAIRED_SINGLE_FLOAT),                  \
10009
  CMP_PS_BUILTINS (cabs, COND, MASK_MIPS3D),                            \
10010
  CMP_4S_BUILTINS (c, COND),                                            \
10011
  CMP_4S_BUILTINS (cabs, COND)
10012
 
10013
/* __builtin_mips_abs_ps() maps to the standard absM2 pattern.  */
10014
#define CODE_FOR_mips_abs_ps CODE_FOR_absv2sf2
10015
 
10016
static const struct builtin_description mips_bdesc[] =
10017
{
10018
  DIRECT_BUILTIN (pll_ps, MIPS_V2SF_FTYPE_V2SF_V2SF, MASK_PAIRED_SINGLE_FLOAT),
10019
  DIRECT_BUILTIN (pul_ps, MIPS_V2SF_FTYPE_V2SF_V2SF, MASK_PAIRED_SINGLE_FLOAT),
10020
  DIRECT_BUILTIN (plu_ps, MIPS_V2SF_FTYPE_V2SF_V2SF, MASK_PAIRED_SINGLE_FLOAT),
10021
  DIRECT_BUILTIN (puu_ps, MIPS_V2SF_FTYPE_V2SF_V2SF, MASK_PAIRED_SINGLE_FLOAT),
10022
  DIRECT_BUILTIN (cvt_ps_s, MIPS_V2SF_FTYPE_SF_SF, MASK_PAIRED_SINGLE_FLOAT),
10023
  DIRECT_BUILTIN (cvt_s_pl, MIPS_SF_FTYPE_V2SF, MASK_PAIRED_SINGLE_FLOAT),
10024
  DIRECT_BUILTIN (cvt_s_pu, MIPS_SF_FTYPE_V2SF, MASK_PAIRED_SINGLE_FLOAT),
10025
  DIRECT_BUILTIN (abs_ps, MIPS_V2SF_FTYPE_V2SF, MASK_PAIRED_SINGLE_FLOAT),
10026
 
10027
  DIRECT_BUILTIN (alnv_ps, MIPS_V2SF_FTYPE_V2SF_V2SF_INT,
10028
                  MASK_PAIRED_SINGLE_FLOAT),
10029
  DIRECT_BUILTIN (addr_ps, MIPS_V2SF_FTYPE_V2SF_V2SF, MASK_MIPS3D),
10030
  DIRECT_BUILTIN (mulr_ps, MIPS_V2SF_FTYPE_V2SF_V2SF, MASK_MIPS3D),
10031
  DIRECT_BUILTIN (cvt_pw_ps, MIPS_V2SF_FTYPE_V2SF, MASK_MIPS3D),
10032
  DIRECT_BUILTIN (cvt_ps_pw, MIPS_V2SF_FTYPE_V2SF, MASK_MIPS3D),
10033
 
10034
  DIRECT_BUILTIN (recip1_s, MIPS_SF_FTYPE_SF, MASK_MIPS3D),
10035
  DIRECT_BUILTIN (recip1_d, MIPS_DF_FTYPE_DF, MASK_MIPS3D),
10036
  DIRECT_BUILTIN (recip1_ps, MIPS_V2SF_FTYPE_V2SF, MASK_MIPS3D),
10037
  DIRECT_BUILTIN (recip2_s, MIPS_SF_FTYPE_SF_SF, MASK_MIPS3D),
10038
  DIRECT_BUILTIN (recip2_d, MIPS_DF_FTYPE_DF_DF, MASK_MIPS3D),
10039
  DIRECT_BUILTIN (recip2_ps, MIPS_V2SF_FTYPE_V2SF_V2SF, MASK_MIPS3D),
10040
 
10041
  DIRECT_BUILTIN (rsqrt1_s, MIPS_SF_FTYPE_SF, MASK_MIPS3D),
10042
  DIRECT_BUILTIN (rsqrt1_d, MIPS_DF_FTYPE_DF, MASK_MIPS3D),
10043
  DIRECT_BUILTIN (rsqrt1_ps, MIPS_V2SF_FTYPE_V2SF, MASK_MIPS3D),
10044
  DIRECT_BUILTIN (rsqrt2_s, MIPS_SF_FTYPE_SF_SF, MASK_MIPS3D),
10045
  DIRECT_BUILTIN (rsqrt2_d, MIPS_DF_FTYPE_DF_DF, MASK_MIPS3D),
10046
  DIRECT_BUILTIN (rsqrt2_ps, MIPS_V2SF_FTYPE_V2SF_V2SF, MASK_MIPS3D),
10047
 
10048
  MIPS_FP_CONDITIONS (CMP_BUILTINS)
10049
};
10050
 
10051
/* Builtin functions for the SB-1 processor.  */
10052
 
10053
#define CODE_FOR_mips_sqrt_ps CODE_FOR_sqrtv2sf2
10054
 
10055
static const struct builtin_description sb1_bdesc[] =
10056
{
10057
  DIRECT_BUILTIN (sqrt_ps, MIPS_V2SF_FTYPE_V2SF, MASK_PAIRED_SINGLE_FLOAT)
10058
};
10059
 
10060
/* Builtin functions for DSP ASE.  */
10061
 
10062
#define CODE_FOR_mips_addq_ph CODE_FOR_addv2hi3
10063
#define CODE_FOR_mips_addu_qb CODE_FOR_addv4qi3
10064
#define CODE_FOR_mips_subq_ph CODE_FOR_subv2hi3
10065
#define CODE_FOR_mips_subu_qb CODE_FOR_subv4qi3
10066
 
10067
/* Define a MIPS_BUILTIN_DIRECT_NO_TARGET function for instruction
10068
   CODE_FOR_mips_<INSN>.  FUNCTION_TYPE and TARGET_FLAGS are
10069
   builtin_description fields.  */
10070
#define DIRECT_NO_TARGET_BUILTIN(INSN, FUNCTION_TYPE, TARGET_FLAGS)     \
10071
  { CODE_FOR_mips_ ## INSN, 0, "__builtin_mips_" #INSN,                 \
10072
    MIPS_BUILTIN_DIRECT_NO_TARGET, FUNCTION_TYPE, TARGET_FLAGS }
10073
 
10074
/* Define __builtin_mips_bposge<VALUE>.  <VALUE> is 32 for the MIPS32 DSP
10075
   branch instruction.  TARGET_FLAGS is a builtin_description field.  */
10076
#define BPOSGE_BUILTIN(VALUE, TARGET_FLAGS)                             \
10077
  { CODE_FOR_mips_bposge, 0, "__builtin_mips_bposge" #VALUE,             \
10078
    MIPS_BUILTIN_BPOSGE ## VALUE, MIPS_SI_FTYPE_VOID, TARGET_FLAGS }
10079
 
10080
static const struct builtin_description dsp_bdesc[] =
10081
{
10082
  DIRECT_BUILTIN (addq_ph, MIPS_V2HI_FTYPE_V2HI_V2HI, MASK_DSP),
10083
  DIRECT_BUILTIN (addq_s_ph, MIPS_V2HI_FTYPE_V2HI_V2HI, MASK_DSP),
10084
  DIRECT_BUILTIN (addq_s_w, MIPS_SI_FTYPE_SI_SI, MASK_DSP),
10085
  DIRECT_BUILTIN (addu_qb, MIPS_V4QI_FTYPE_V4QI_V4QI, MASK_DSP),
10086
  DIRECT_BUILTIN (addu_s_qb, MIPS_V4QI_FTYPE_V4QI_V4QI, MASK_DSP),
10087
  DIRECT_BUILTIN (subq_ph, MIPS_V2HI_FTYPE_V2HI_V2HI, MASK_DSP),
10088
  DIRECT_BUILTIN (subq_s_ph, MIPS_V2HI_FTYPE_V2HI_V2HI, MASK_DSP),
10089
  DIRECT_BUILTIN (subq_s_w, MIPS_SI_FTYPE_SI_SI, MASK_DSP),
10090
  DIRECT_BUILTIN (subu_qb, MIPS_V4QI_FTYPE_V4QI_V4QI, MASK_DSP),
10091
  DIRECT_BUILTIN (subu_s_qb, MIPS_V4QI_FTYPE_V4QI_V4QI, MASK_DSP),
10092
  DIRECT_BUILTIN (addsc, MIPS_SI_FTYPE_SI_SI, MASK_DSP),
10093
  DIRECT_BUILTIN (addwc, MIPS_SI_FTYPE_SI_SI, MASK_DSP),
10094
  DIRECT_BUILTIN (modsub, MIPS_SI_FTYPE_SI_SI, MASK_DSP),
10095
  DIRECT_BUILTIN (raddu_w_qb, MIPS_SI_FTYPE_V4QI, MASK_DSP),
10096
  DIRECT_BUILTIN (absq_s_ph, MIPS_V2HI_FTYPE_V2HI, MASK_DSP),
10097
  DIRECT_BUILTIN (absq_s_w, MIPS_SI_FTYPE_SI, MASK_DSP),
10098
  DIRECT_BUILTIN (precrq_qb_ph, MIPS_V4QI_FTYPE_V2HI_V2HI, MASK_DSP),
10099
  DIRECT_BUILTIN (precrq_ph_w, MIPS_V2HI_FTYPE_SI_SI, MASK_DSP),
10100
  DIRECT_BUILTIN (precrq_rs_ph_w, MIPS_V2HI_FTYPE_SI_SI, MASK_DSP),
10101
  DIRECT_BUILTIN (precrqu_s_qb_ph, MIPS_V4QI_FTYPE_V2HI_V2HI, MASK_DSP),
10102
  DIRECT_BUILTIN (preceq_w_phl, MIPS_SI_FTYPE_V2HI, MASK_DSP),
10103
  DIRECT_BUILTIN (preceq_w_phr, MIPS_SI_FTYPE_V2HI, MASK_DSP),
10104
  DIRECT_BUILTIN (precequ_ph_qbl, MIPS_V2HI_FTYPE_V4QI, MASK_DSP),
10105
  DIRECT_BUILTIN (precequ_ph_qbr, MIPS_V2HI_FTYPE_V4QI, MASK_DSP),
10106
  DIRECT_BUILTIN (precequ_ph_qbla, MIPS_V2HI_FTYPE_V4QI, MASK_DSP),
10107
  DIRECT_BUILTIN (precequ_ph_qbra, MIPS_V2HI_FTYPE_V4QI, MASK_DSP),
10108
  DIRECT_BUILTIN (preceu_ph_qbl, MIPS_V2HI_FTYPE_V4QI, MASK_DSP),
10109
  DIRECT_BUILTIN (preceu_ph_qbr, MIPS_V2HI_FTYPE_V4QI, MASK_DSP),
10110
  DIRECT_BUILTIN (preceu_ph_qbla, MIPS_V2HI_FTYPE_V4QI, MASK_DSP),
10111
  DIRECT_BUILTIN (preceu_ph_qbra, MIPS_V2HI_FTYPE_V4QI, MASK_DSP),
10112
  DIRECT_BUILTIN (shll_qb, MIPS_V4QI_FTYPE_V4QI_SI, MASK_DSP),
10113
  DIRECT_BUILTIN (shll_ph, MIPS_V2HI_FTYPE_V2HI_SI, MASK_DSP),
10114
  DIRECT_BUILTIN (shll_s_ph, MIPS_V2HI_FTYPE_V2HI_SI, MASK_DSP),
10115
  DIRECT_BUILTIN (shll_s_w, MIPS_SI_FTYPE_SI_SI, MASK_DSP),
10116
  DIRECT_BUILTIN (shrl_qb, MIPS_V4QI_FTYPE_V4QI_SI, MASK_DSP),
10117
  DIRECT_BUILTIN (shra_ph, MIPS_V2HI_FTYPE_V2HI_SI, MASK_DSP),
10118
  DIRECT_BUILTIN (shra_r_ph, MIPS_V2HI_FTYPE_V2HI_SI, MASK_DSP),
10119
  DIRECT_BUILTIN (shra_r_w, MIPS_SI_FTYPE_SI_SI, MASK_DSP),
10120
  DIRECT_BUILTIN (muleu_s_ph_qbl, MIPS_V2HI_FTYPE_V4QI_V2HI, MASK_DSP),
10121
  DIRECT_BUILTIN (muleu_s_ph_qbr, MIPS_V2HI_FTYPE_V4QI_V2HI, MASK_DSP),
10122
  DIRECT_BUILTIN (mulq_rs_ph, MIPS_V2HI_FTYPE_V2HI_V2HI, MASK_DSP),
10123
  DIRECT_BUILTIN (muleq_s_w_phl, MIPS_SI_FTYPE_V2HI_V2HI, MASK_DSP),
10124
  DIRECT_BUILTIN (muleq_s_w_phr, MIPS_SI_FTYPE_V2HI_V2HI, MASK_DSP),
10125
  DIRECT_BUILTIN (dpau_h_qbl, MIPS_DI_FTYPE_DI_V4QI_V4QI, MASK_DSP),
10126
  DIRECT_BUILTIN (dpau_h_qbr, MIPS_DI_FTYPE_DI_V4QI_V4QI, MASK_DSP),
10127
  DIRECT_BUILTIN (dpsu_h_qbl, MIPS_DI_FTYPE_DI_V4QI_V4QI, MASK_DSP),
10128
  DIRECT_BUILTIN (dpsu_h_qbr, MIPS_DI_FTYPE_DI_V4QI_V4QI, MASK_DSP),
10129
  DIRECT_BUILTIN (dpaq_s_w_ph, MIPS_DI_FTYPE_DI_V2HI_V2HI, MASK_DSP),
10130
  DIRECT_BUILTIN (dpsq_s_w_ph, MIPS_DI_FTYPE_DI_V2HI_V2HI, MASK_DSP),
10131
  DIRECT_BUILTIN (mulsaq_s_w_ph, MIPS_DI_FTYPE_DI_V2HI_V2HI, MASK_DSP),
10132
  DIRECT_BUILTIN (dpaq_sa_l_w, MIPS_DI_FTYPE_DI_SI_SI, MASK_DSP),
10133
  DIRECT_BUILTIN (dpsq_sa_l_w, MIPS_DI_FTYPE_DI_SI_SI, MASK_DSP),
10134
  DIRECT_BUILTIN (maq_s_w_phl, MIPS_DI_FTYPE_DI_V2HI_V2HI, MASK_DSP),
10135
  DIRECT_BUILTIN (maq_s_w_phr, MIPS_DI_FTYPE_DI_V2HI_V2HI, MASK_DSP),
10136
  DIRECT_BUILTIN (maq_sa_w_phl, MIPS_DI_FTYPE_DI_V2HI_V2HI, MASK_DSP),
10137
  DIRECT_BUILTIN (maq_sa_w_phr, MIPS_DI_FTYPE_DI_V2HI_V2HI, MASK_DSP),
10138
  DIRECT_BUILTIN (bitrev, MIPS_SI_FTYPE_SI, MASK_DSP),
10139
  DIRECT_BUILTIN (insv, MIPS_SI_FTYPE_SI_SI, MASK_DSP),
10140
  DIRECT_BUILTIN (repl_qb, MIPS_V4QI_FTYPE_SI, MASK_DSP),
10141
  DIRECT_BUILTIN (repl_ph, MIPS_V2HI_FTYPE_SI, MASK_DSP),
10142
  DIRECT_NO_TARGET_BUILTIN (cmpu_eq_qb, MIPS_VOID_FTYPE_V4QI_V4QI, MASK_DSP),
10143
  DIRECT_NO_TARGET_BUILTIN (cmpu_lt_qb, MIPS_VOID_FTYPE_V4QI_V4QI, MASK_DSP),
10144
  DIRECT_NO_TARGET_BUILTIN (cmpu_le_qb, MIPS_VOID_FTYPE_V4QI_V4QI, MASK_DSP),
10145
  DIRECT_BUILTIN (cmpgu_eq_qb, MIPS_SI_FTYPE_V4QI_V4QI, MASK_DSP),
10146
  DIRECT_BUILTIN (cmpgu_lt_qb, MIPS_SI_FTYPE_V4QI_V4QI, MASK_DSP),
10147
  DIRECT_BUILTIN (cmpgu_le_qb, MIPS_SI_FTYPE_V4QI_V4QI, MASK_DSP),
10148
  DIRECT_NO_TARGET_BUILTIN (cmp_eq_ph, MIPS_VOID_FTYPE_V2HI_V2HI, MASK_DSP),
10149
  DIRECT_NO_TARGET_BUILTIN (cmp_lt_ph, MIPS_VOID_FTYPE_V2HI_V2HI, MASK_DSP),
10150
  DIRECT_NO_TARGET_BUILTIN (cmp_le_ph, MIPS_VOID_FTYPE_V2HI_V2HI, MASK_DSP),
10151
  DIRECT_BUILTIN (pick_qb, MIPS_V4QI_FTYPE_V4QI_V4QI, MASK_DSP),
10152
  DIRECT_BUILTIN (pick_ph, MIPS_V2HI_FTYPE_V2HI_V2HI, MASK_DSP),
10153
  DIRECT_BUILTIN (packrl_ph, MIPS_V2HI_FTYPE_V2HI_V2HI, MASK_DSP),
10154
  DIRECT_BUILTIN (extr_w, MIPS_SI_FTYPE_DI_SI, MASK_DSP),
10155
  DIRECT_BUILTIN (extr_r_w, MIPS_SI_FTYPE_DI_SI, MASK_DSP),
10156
  DIRECT_BUILTIN (extr_rs_w, MIPS_SI_FTYPE_DI_SI, MASK_DSP),
10157
  DIRECT_BUILTIN (extr_s_h, MIPS_SI_FTYPE_DI_SI, MASK_DSP),
10158
  DIRECT_BUILTIN (extp, MIPS_SI_FTYPE_DI_SI, MASK_DSP),
10159
  DIRECT_BUILTIN (extpdp, MIPS_SI_FTYPE_DI_SI, MASK_DSP),
10160
  DIRECT_BUILTIN (shilo, MIPS_DI_FTYPE_DI_SI, MASK_DSP),
10161
  DIRECT_BUILTIN (mthlip, MIPS_DI_FTYPE_DI_SI, MASK_DSP),
10162
  DIRECT_NO_TARGET_BUILTIN (wrdsp, MIPS_VOID_FTYPE_SI_SI, MASK_DSP),
10163
  DIRECT_BUILTIN (rddsp, MIPS_SI_FTYPE_SI, MASK_DSP),
10164
  DIRECT_BUILTIN (lbux, MIPS_SI_FTYPE_PTR_SI, MASK_DSP),
10165
  DIRECT_BUILTIN (lhx, MIPS_SI_FTYPE_PTR_SI, MASK_DSP),
10166
  DIRECT_BUILTIN (lwx, MIPS_SI_FTYPE_PTR_SI, MASK_DSP),
10167
  BPOSGE_BUILTIN (32, MASK_DSP)
10168
};
10169
 
10170
/* This helps provide a mapping from builtin function codes to bdesc
10171
   arrays.  */
10172
 
10173
struct bdesc_map
10174
{
10175
  /* The builtin function table that this entry describes.  */
10176
  const struct builtin_description *bdesc;
10177
 
10178
  /* The number of entries in the builtin function table.  */
10179
  unsigned int size;
10180
 
10181
  /* The target processor that supports these builtin functions.
10182
     PROCESSOR_MAX means we enable them for all processors.  */
10183
  enum processor_type proc;
10184
};
10185
 
10186
static const struct bdesc_map bdesc_arrays[] =
10187
{
10188
  { mips_bdesc, ARRAY_SIZE (mips_bdesc), PROCESSOR_MAX },
10189
  { sb1_bdesc, ARRAY_SIZE (sb1_bdesc), PROCESSOR_SB1 },
10190
  { dsp_bdesc, ARRAY_SIZE (dsp_bdesc), PROCESSOR_MAX }
10191
};
10192
 
10193
/* Take the head of argument list *ARGLIST and convert it into a form
10194
   suitable for input operand OP of instruction ICODE.  Return the value
10195
   and point *ARGLIST at the next element of the list.  */
10196
 
10197
static rtx
10198
mips_prepare_builtin_arg (enum insn_code icode,
10199
                          unsigned int op, tree *arglist)
10200
{
10201
  rtx value;
10202
  enum machine_mode mode;
10203
 
10204
  value = expand_expr (TREE_VALUE (*arglist), NULL_RTX, VOIDmode, 0);
10205
  mode = insn_data[icode].operand[op].mode;
10206
  if (!insn_data[icode].operand[op].predicate (value, mode))
10207
    {
10208
      value = copy_to_mode_reg (mode, value);
10209
      /* Check the predicate again.  */
10210
      if (!insn_data[icode].operand[op].predicate (value, mode))
10211
        {
10212
          error ("invalid argument to builtin function");
10213
          return const0_rtx;
10214
        }
10215
    }
10216
 
10217
  *arglist = TREE_CHAIN (*arglist);
10218
  return value;
10219
}
10220
 
10221
/* Return an rtx suitable for output operand OP of instruction ICODE.
10222
   If TARGET is non-null, try to use it where possible.  */
10223
 
10224
static rtx
10225
mips_prepare_builtin_target (enum insn_code icode, unsigned int op, rtx target)
10226
{
10227
  enum machine_mode mode;
10228
 
10229
  mode = insn_data[icode].operand[op].mode;
10230
  if (target == 0 || !insn_data[icode].operand[op].predicate (target, mode))
10231
    target = gen_reg_rtx (mode);
10232
 
10233
  return target;
10234
}
10235
 
10236
/* Expand builtin functions.  This is called from TARGET_EXPAND_BUILTIN.  */
10237
 
10238
rtx
10239
mips_expand_builtin (tree exp, rtx target, rtx subtarget ATTRIBUTE_UNUSED,
10240
                     enum machine_mode mode ATTRIBUTE_UNUSED,
10241
                     int ignore ATTRIBUTE_UNUSED)
10242
{
10243
  enum insn_code icode;
10244
  enum mips_builtin_type type;
10245
  tree fndecl, arglist;
10246
  unsigned int fcode;
10247
  const struct builtin_description *bdesc;
10248
  const struct bdesc_map *m;
10249
 
10250
  fndecl = TREE_OPERAND (TREE_OPERAND (exp, 0), 0);
10251
  arglist = TREE_OPERAND (exp, 1);
10252
  fcode = DECL_FUNCTION_CODE (fndecl);
10253
 
10254
  bdesc = NULL;
10255
  for (m = bdesc_arrays; m < &bdesc_arrays[ARRAY_SIZE (bdesc_arrays)]; m++)
10256
    {
10257
      if (fcode < m->size)
10258
        {
10259
          bdesc = m->bdesc;
10260
          icode = bdesc[fcode].icode;
10261
          type = bdesc[fcode].builtin_type;
10262
          break;
10263
        }
10264
      fcode -= m->size;
10265
    }
10266
  if (bdesc == NULL)
10267
    return 0;
10268
 
10269
  switch (type)
10270
    {
10271
    case MIPS_BUILTIN_DIRECT:
10272
      return mips_expand_builtin_direct (icode, target, arglist, true);
10273
 
10274
    case MIPS_BUILTIN_DIRECT_NO_TARGET:
10275
      return mips_expand_builtin_direct (icode, target, arglist, false);
10276
 
10277
    case MIPS_BUILTIN_MOVT:
10278
    case MIPS_BUILTIN_MOVF:
10279
      return mips_expand_builtin_movtf (type, icode, bdesc[fcode].cond,
10280
                                        target, arglist);
10281
 
10282
    case MIPS_BUILTIN_CMP_ANY:
10283
    case MIPS_BUILTIN_CMP_ALL:
10284
    case MIPS_BUILTIN_CMP_UPPER:
10285
    case MIPS_BUILTIN_CMP_LOWER:
10286
    case MIPS_BUILTIN_CMP_SINGLE:
10287
      return mips_expand_builtin_compare (type, icode, bdesc[fcode].cond,
10288
                                          target, arglist);
10289
 
10290
    case MIPS_BUILTIN_BPOSGE32:
10291
      return mips_expand_builtin_bposge (type, target);
10292
 
10293
    default:
10294
      return 0;
10295
    }
10296
}
10297
 
10298
/* Init builtin functions.  This is called from TARGET_INIT_BUILTIN.  */
10299
 
10300
void
10301
mips_init_builtins (void)
10302
{
10303
  const struct builtin_description *d;
10304
  const struct bdesc_map *m;
10305
  tree types[(int) MIPS_MAX_FTYPE_MAX];
10306
  tree V2SF_type_node;
10307
  tree V2HI_type_node;
10308
  tree V4QI_type_node;
10309
  unsigned int offset;
10310
 
10311
  /* We have only builtins for -mpaired-single, -mips3d and -mdsp.  */
10312
  if (!TARGET_PAIRED_SINGLE_FLOAT && !TARGET_DSP)
10313
    return;
10314
 
10315
  if (TARGET_PAIRED_SINGLE_FLOAT)
10316
    {
10317
      V2SF_type_node = build_vector_type_for_mode (float_type_node, V2SFmode);
10318
 
10319
      types[MIPS_V2SF_FTYPE_V2SF]
10320
        = build_function_type_list (V2SF_type_node, V2SF_type_node, NULL_TREE);
10321
 
10322
      types[MIPS_V2SF_FTYPE_V2SF_V2SF]
10323
        = build_function_type_list (V2SF_type_node,
10324
                                    V2SF_type_node, V2SF_type_node, NULL_TREE);
10325
 
10326
      types[MIPS_V2SF_FTYPE_V2SF_V2SF_INT]
10327
        = build_function_type_list (V2SF_type_node,
10328
                                    V2SF_type_node, V2SF_type_node,
10329
                                    integer_type_node, NULL_TREE);
10330
 
10331
      types[MIPS_V2SF_FTYPE_V2SF_V2SF_V2SF_V2SF]
10332
        = build_function_type_list (V2SF_type_node,
10333
                                    V2SF_type_node, V2SF_type_node,
10334
                                    V2SF_type_node, V2SF_type_node, NULL_TREE);
10335
 
10336
      types[MIPS_V2SF_FTYPE_SF_SF]
10337
        = build_function_type_list (V2SF_type_node,
10338
                                    float_type_node, float_type_node, NULL_TREE);
10339
 
10340
      types[MIPS_INT_FTYPE_V2SF_V2SF]
10341
        = build_function_type_list (integer_type_node,
10342
                                    V2SF_type_node, V2SF_type_node, NULL_TREE);
10343
 
10344
      types[MIPS_INT_FTYPE_V2SF_V2SF_V2SF_V2SF]
10345
        = build_function_type_list (integer_type_node,
10346
                                    V2SF_type_node, V2SF_type_node,
10347
                                    V2SF_type_node, V2SF_type_node, NULL_TREE);
10348
 
10349
      types[MIPS_INT_FTYPE_SF_SF]
10350
        = build_function_type_list (integer_type_node,
10351
                                    float_type_node, float_type_node, NULL_TREE);
10352
 
10353
      types[MIPS_INT_FTYPE_DF_DF]
10354
        = build_function_type_list (integer_type_node,
10355
                                    double_type_node, double_type_node, NULL_TREE);
10356
 
10357
      types[MIPS_SF_FTYPE_V2SF]
10358
        = build_function_type_list (float_type_node, V2SF_type_node, NULL_TREE);
10359
 
10360
      types[MIPS_SF_FTYPE_SF]
10361
        = build_function_type_list (float_type_node,
10362
                                    float_type_node, NULL_TREE);
10363
 
10364
      types[MIPS_SF_FTYPE_SF_SF]
10365
        = build_function_type_list (float_type_node,
10366
                                    float_type_node, float_type_node, NULL_TREE);
10367
 
10368
      types[MIPS_DF_FTYPE_DF]
10369
        = build_function_type_list (double_type_node,
10370
                                    double_type_node, NULL_TREE);
10371
 
10372
      types[MIPS_DF_FTYPE_DF_DF]
10373
        = build_function_type_list (double_type_node,
10374
                                    double_type_node, double_type_node, NULL_TREE);
10375
    }
10376
 
10377
  if (TARGET_DSP)
10378
    {
10379
      V2HI_type_node = build_vector_type_for_mode (intHI_type_node, V2HImode);
10380
      V4QI_type_node = build_vector_type_for_mode (intQI_type_node, V4QImode);
10381
 
10382
      types[MIPS_V2HI_FTYPE_V2HI_V2HI]
10383
        = build_function_type_list (V2HI_type_node,
10384
                                    V2HI_type_node, V2HI_type_node,
10385
                                    NULL_TREE);
10386
 
10387
      types[MIPS_SI_FTYPE_SI_SI]
10388
        = build_function_type_list (intSI_type_node,
10389
                                    intSI_type_node, intSI_type_node,
10390
                                    NULL_TREE);
10391
 
10392
      types[MIPS_V4QI_FTYPE_V4QI_V4QI]
10393
        = build_function_type_list (V4QI_type_node,
10394
                                    V4QI_type_node, V4QI_type_node,
10395
                                    NULL_TREE);
10396
 
10397
      types[MIPS_SI_FTYPE_V4QI]
10398
        = build_function_type_list (intSI_type_node,
10399
                                    V4QI_type_node,
10400
                                    NULL_TREE);
10401
 
10402
      types[MIPS_V2HI_FTYPE_V2HI]
10403
        = build_function_type_list (V2HI_type_node,
10404
                                    V2HI_type_node,
10405
                                    NULL_TREE);
10406
 
10407
      types[MIPS_SI_FTYPE_SI]
10408
        = build_function_type_list (intSI_type_node,
10409
                                    intSI_type_node,
10410
                                    NULL_TREE);
10411
 
10412
      types[MIPS_V4QI_FTYPE_V2HI_V2HI]
10413
        = build_function_type_list (V4QI_type_node,
10414
                                    V2HI_type_node, V2HI_type_node,
10415
                                    NULL_TREE);
10416
 
10417
      types[MIPS_V2HI_FTYPE_SI_SI]
10418
        = build_function_type_list (V2HI_type_node,
10419
                                    intSI_type_node, intSI_type_node,
10420
                                    NULL_TREE);
10421
 
10422
      types[MIPS_SI_FTYPE_V2HI]
10423
        = build_function_type_list (intSI_type_node,
10424
                                    V2HI_type_node,
10425
                                    NULL_TREE);
10426
 
10427
      types[MIPS_V2HI_FTYPE_V4QI]
10428
        = build_function_type_list (V2HI_type_node,
10429
                                    V4QI_type_node,
10430
                                    NULL_TREE);
10431
 
10432
      types[MIPS_V4QI_FTYPE_V4QI_SI]
10433
        = build_function_type_list (V4QI_type_node,
10434
                                    V4QI_type_node, intSI_type_node,
10435
                                    NULL_TREE);
10436
 
10437
      types[MIPS_V2HI_FTYPE_V2HI_SI]
10438
        = build_function_type_list (V2HI_type_node,
10439
                                    V2HI_type_node, intSI_type_node,
10440
                                    NULL_TREE);
10441
 
10442
      types[MIPS_V2HI_FTYPE_V4QI_V2HI]
10443
        = build_function_type_list (V2HI_type_node,
10444
                                    V4QI_type_node, V2HI_type_node,
10445
                                    NULL_TREE);
10446
 
10447
      types[MIPS_SI_FTYPE_V2HI_V2HI]
10448
        = build_function_type_list (intSI_type_node,
10449
                                    V2HI_type_node, V2HI_type_node,
10450
                                    NULL_TREE);
10451
 
10452
      types[MIPS_DI_FTYPE_DI_V4QI_V4QI]
10453
        = build_function_type_list (intDI_type_node,
10454
                                    intDI_type_node, V4QI_type_node, V4QI_type_node,
10455
                                    NULL_TREE);
10456
 
10457
      types[MIPS_DI_FTYPE_DI_V2HI_V2HI]
10458
        = build_function_type_list (intDI_type_node,
10459
                                    intDI_type_node, V2HI_type_node, V2HI_type_node,
10460
                                    NULL_TREE);
10461
 
10462
      types[MIPS_DI_FTYPE_DI_SI_SI]
10463
        = build_function_type_list (intDI_type_node,
10464
                                    intDI_type_node, intSI_type_node, intSI_type_node,
10465
                                    NULL_TREE);
10466
 
10467
      types[MIPS_V4QI_FTYPE_SI]
10468
        = build_function_type_list (V4QI_type_node,
10469
                                    intSI_type_node,
10470
                                    NULL_TREE);
10471
 
10472
      types[MIPS_V2HI_FTYPE_SI]
10473
        = build_function_type_list (V2HI_type_node,
10474
                                    intSI_type_node,
10475
                                    NULL_TREE);
10476
 
10477
      types[MIPS_VOID_FTYPE_V4QI_V4QI]
10478
        = build_function_type_list (void_type_node,
10479
                                    V4QI_type_node, V4QI_type_node,
10480
                                    NULL_TREE);
10481
 
10482
      types[MIPS_SI_FTYPE_V4QI_V4QI]
10483
        = build_function_type_list (intSI_type_node,
10484
                                    V4QI_type_node, V4QI_type_node,
10485
                                    NULL_TREE);
10486
 
10487
      types[MIPS_VOID_FTYPE_V2HI_V2HI]
10488
        = build_function_type_list (void_type_node,
10489
                                    V2HI_type_node, V2HI_type_node,
10490
                                    NULL_TREE);
10491
 
10492
      types[MIPS_SI_FTYPE_DI_SI]
10493
        = build_function_type_list (intSI_type_node,
10494
                                    intDI_type_node, intSI_type_node,
10495
                                    NULL_TREE);
10496
 
10497
      types[MIPS_DI_FTYPE_DI_SI]
10498
        = build_function_type_list (intDI_type_node,
10499
                                    intDI_type_node, intSI_type_node,
10500
                                    NULL_TREE);
10501
 
10502
      types[MIPS_VOID_FTYPE_SI_SI]
10503
        = build_function_type_list (void_type_node,
10504
                                    intSI_type_node, intSI_type_node,
10505
                                    NULL_TREE);
10506
 
10507
      types[MIPS_SI_FTYPE_PTR_SI]
10508
        = build_function_type_list (intSI_type_node,
10509
                                    ptr_type_node, intSI_type_node,
10510
                                    NULL_TREE);
10511
 
10512
      types[MIPS_SI_FTYPE_VOID]
10513
        = build_function_type (intSI_type_node, void_list_node);
10514
    }
10515
 
10516
  /* Iterate through all of the bdesc arrays, initializing all of the
10517
     builtin functions.  */
10518
 
10519
  offset = 0;
10520
  for (m = bdesc_arrays; m < &bdesc_arrays[ARRAY_SIZE (bdesc_arrays)]; m++)
10521
    {
10522
      if (m->proc == PROCESSOR_MAX || (m->proc == mips_arch))
10523
        for (d = m->bdesc; d < &m->bdesc[m->size]; d++)
10524
          if ((d->target_flags & target_flags) == d->target_flags)
10525
            lang_hooks.builtin_function (d->name, types[d->function_type],
10526
                                         d - m->bdesc + offset,
10527
                                         BUILT_IN_MD, NULL, NULL);
10528
      offset += m->size;
10529
    }
10530
}
10531
 
10532
/* Expand a MIPS_BUILTIN_DIRECT function.  ICODE is the code of the
10533
   .md pattern and ARGLIST is the list of function arguments.  TARGET,
10534
   if nonnull, suggests a good place to put the result.
10535
   HAS_TARGET indicates the function must return something.  */
10536
 
10537
static rtx
10538
mips_expand_builtin_direct (enum insn_code icode, rtx target, tree arglist,
10539
                            bool has_target)
10540
{
10541
  rtx ops[MAX_RECOG_OPERANDS];
10542
  int i = 0;
10543
 
10544
  if (has_target)
10545
    {
10546
      /* We save target to ops[0].  */
10547
      ops[0] = mips_prepare_builtin_target (icode, 0, target);
10548
      i = 1;
10549
    }
10550
 
10551
  /* We need to test if arglist is not zero.  Some instructions have extra
10552
     clobber registers.  */
10553
  for (; i < insn_data[icode].n_operands && arglist != 0; i++)
10554
    ops[i] = mips_prepare_builtin_arg (icode, i, &arglist);
10555
 
10556
  switch (i)
10557
    {
10558
    case 2:
10559
      emit_insn (GEN_FCN (icode) (ops[0], ops[1]));
10560
      break;
10561
 
10562
    case 3:
10563
      emit_insn (GEN_FCN (icode) (ops[0], ops[1], ops[2]));
10564
      break;
10565
 
10566
    case 4:
10567
      emit_insn (GEN_FCN (icode) (ops[0], ops[1], ops[2], ops[3]));
10568
      break;
10569
 
10570
    default:
10571
      gcc_unreachable ();
10572
    }
10573
  return target;
10574
}
10575
 
10576
/* Expand a __builtin_mips_movt_*_ps() or __builtin_mips_movf_*_ps()
10577
   function (TYPE says which).  ARGLIST is the list of arguments to the
10578
   function, ICODE is the instruction that should be used to compare
10579
   the first two arguments, and COND is the condition it should test.
10580
   TARGET, if nonnull, suggests a good place to put the result.  */
10581
 
10582
static rtx
10583
mips_expand_builtin_movtf (enum mips_builtin_type type,
10584
                           enum insn_code icode, enum mips_fp_condition cond,
10585
                           rtx target, tree arglist)
10586
{
10587
  rtx cmp_result, op0, op1;
10588
 
10589
  cmp_result = mips_prepare_builtin_target (icode, 0, 0);
10590
  op0 = mips_prepare_builtin_arg (icode, 1, &arglist);
10591
  op1 = mips_prepare_builtin_arg (icode, 2, &arglist);
10592
  emit_insn (GEN_FCN (icode) (cmp_result, op0, op1, GEN_INT (cond)));
10593
 
10594
  icode = CODE_FOR_mips_cond_move_tf_ps;
10595
  target = mips_prepare_builtin_target (icode, 0, target);
10596
  if (type == MIPS_BUILTIN_MOVT)
10597
    {
10598
      op1 = mips_prepare_builtin_arg (icode, 2, &arglist);
10599
      op0 = mips_prepare_builtin_arg (icode, 1, &arglist);
10600
    }
10601
  else
10602
    {
10603
      op0 = mips_prepare_builtin_arg (icode, 1, &arglist);
10604
      op1 = mips_prepare_builtin_arg (icode, 2, &arglist);
10605
    }
10606
  emit_insn (gen_mips_cond_move_tf_ps (target, op0, op1, cmp_result));
10607
  return target;
10608
}
10609
 
10610
/* Expand a comparison builtin of type BUILTIN_TYPE.  ICODE is the code
10611
   of the comparison instruction and COND is the condition it should test.
10612
   ARGLIST is the list of function arguments and TARGET, if nonnull,
10613
   suggests a good place to put the boolean result.  */
10614
 
10615
static rtx
10616
mips_expand_builtin_compare (enum mips_builtin_type builtin_type,
10617
                             enum insn_code icode, enum mips_fp_condition cond,
10618
                             rtx target, tree arglist)
10619
{
10620
  rtx label1, label2, if_then_else;
10621
  rtx pat, cmp_result, ops[MAX_RECOG_OPERANDS];
10622
  rtx target_if_equal, target_if_unequal;
10623
  int cmp_value, i;
10624
 
10625
  if (target == 0 || GET_MODE (target) != SImode)
10626
    target = gen_reg_rtx (SImode);
10627
 
10628
  /* Prepare the operands to the comparison.  */
10629
  cmp_result = mips_prepare_builtin_target (icode, 0, 0);
10630
  for (i = 1; i < insn_data[icode].n_operands - 1; i++)
10631
    ops[i] = mips_prepare_builtin_arg (icode, i, &arglist);
10632
 
10633
  switch (insn_data[icode].n_operands)
10634
    {
10635
    case 4:
10636
      pat = GEN_FCN (icode) (cmp_result, ops[1], ops[2], GEN_INT (cond));
10637
      break;
10638
 
10639
    case 6:
10640
      pat = GEN_FCN (icode) (cmp_result, ops[1], ops[2],
10641
                             ops[3], ops[4], GEN_INT (cond));
10642
      break;
10643
 
10644
    default:
10645
      gcc_unreachable ();
10646
    }
10647
 
10648
  /* If the comparison sets more than one register, we define the result
10649
     to be 0 if all registers are false and -1 if all registers are true.
10650
     The value of the complete result is indeterminate otherwise.  It is
10651
     possible to test individual registers using SUBREGs.
10652
 
10653
     Set up CMP_RESULT, CMP_VALUE, TARGET_IF_EQUAL and TARGET_IF_UNEQUAL so
10654
     that the result should be TARGET_IF_EQUAL if (EQ CMP_RESULT CMP_VALUE)
10655
     and TARGET_IF_UNEQUAL otherwise.  */
10656
  if (builtin_type == MIPS_BUILTIN_CMP_ALL)
10657
    {
10658
      cmp_value = -1;
10659
      target_if_equal = const1_rtx;
10660
      target_if_unequal = const0_rtx;
10661
    }
10662
  else
10663
    {
10664
      cmp_value = 0;
10665
      target_if_equal = const0_rtx;
10666
      target_if_unequal = const1_rtx;
10667
      if (builtin_type == MIPS_BUILTIN_CMP_UPPER)
10668
        cmp_result = simplify_gen_subreg (CCmode, cmp_result, CCV2mode, 4);
10669
      else if (builtin_type == MIPS_BUILTIN_CMP_LOWER)
10670
        cmp_result = simplify_gen_subreg (CCmode, cmp_result, CCV2mode, 0);
10671
    }
10672
 
10673
  /* First assume that CMP_RESULT == CMP_VALUE.  */
10674
  emit_move_insn (target, target_if_equal);
10675
 
10676
  /* Branch to LABEL1 if CMP_RESULT != CMP_VALUE.  */
10677
  emit_insn (pat);
10678
  label1 = gen_label_rtx ();
10679
  label2 = gen_label_rtx ();
10680
  if_then_else
10681
    = gen_rtx_IF_THEN_ELSE (VOIDmode,
10682
                            gen_rtx_fmt_ee (NE, GET_MODE (cmp_result),
10683
                                            cmp_result, GEN_INT (cmp_value)),
10684
                            gen_rtx_LABEL_REF (VOIDmode, label1), pc_rtx);
10685
  emit_jump_insn (gen_rtx_SET (VOIDmode, pc_rtx, if_then_else));
10686
  emit_jump_insn (gen_rtx_SET (VOIDmode, pc_rtx,
10687
                               gen_rtx_LABEL_REF (VOIDmode, label2)));
10688
  emit_barrier ();
10689
  emit_label (label1);
10690
 
10691
  /* Fix TARGET for CMP_RESULT != CMP_VALUE.  */
10692
  emit_move_insn (target, target_if_unequal);
10693
  emit_label (label2);
10694
 
10695
  return target;
10696
}
10697
 
10698
/* Expand a bposge builtin of type BUILTIN_TYPE.  TARGET, if nonnull,
10699
   suggests a good place to put the boolean result.
10700
 
10701
   The sequence we want is
10702
 
10703
        li      target, 0
10704
        bposge* label1
10705
        j       label2
10706
   label1:
10707
        li      target, 1
10708
   label2:  */
10709
 
10710
static rtx
10711
mips_expand_builtin_bposge (enum mips_builtin_type builtin_type, rtx target)
10712
{
10713
  rtx label1, label2, if_then_else;
10714
  rtx cmp_result;
10715
  int cmp_value;
10716
 
10717
  if (target == 0 || GET_MODE (target) != SImode)
10718
    target = gen_reg_rtx (SImode);
10719
 
10720
  cmp_result = gen_rtx_REG (CCDSPmode, CCDSP_PO_REGNUM);
10721
 
10722
  if (builtin_type == MIPS_BUILTIN_BPOSGE32)
10723
    cmp_value = 32;
10724
  else
10725
    gcc_assert (0);
10726
 
10727
  /* Move 0 to target */
10728
  emit_move_insn (target, const0_rtx);
10729
 
10730
  /* Generate two labels */
10731
  label1 = gen_label_rtx ();
10732
  label2 = gen_label_rtx ();
10733
 
10734
  /* Generate if_then_else */
10735
  if_then_else
10736
    = gen_rtx_IF_THEN_ELSE (VOIDmode,
10737
                            gen_rtx_fmt_ee (GE, CCDSPmode,
10738
                                            cmp_result, GEN_INT (cmp_value)),
10739
                            gen_rtx_LABEL_REF (VOIDmode, label1), pc_rtx);
10740
 
10741
  emit_jump_insn (gen_rtx_SET (VOIDmode, pc_rtx, if_then_else));
10742
  emit_jump_insn (gen_rtx_SET (VOIDmode, pc_rtx,
10743
                               gen_rtx_LABEL_REF (VOIDmode, label2)));
10744
  emit_barrier ();
10745
  emit_label (label1);
10746
  emit_move_insn (target, const1_rtx);
10747
  emit_label (label2);
10748
 
10749
  return target;
10750
}
10751
 
10752
/* Set SYMBOL_REF_FLAGS for the SYMBOL_REF inside RTL, which belongs to DECL.
10753
   FIRST is true if this is the first time handling this decl.  */
10754
 
10755
static void
10756
mips_encode_section_info (tree decl, rtx rtl, int first)
10757
{
10758
  default_encode_section_info (decl, rtl, first);
10759
 
10760
  if (TREE_CODE (decl) == FUNCTION_DECL
10761
      && lookup_attribute ("long_call", TYPE_ATTRIBUTES (TREE_TYPE (decl))))
10762
    {
10763
      rtx symbol = XEXP (rtl, 0);
10764
      SYMBOL_REF_FLAGS (symbol) |= SYMBOL_FLAG_LONG_CALL;
10765
    }
10766
}
10767
 
10768
#include "gt-mips.h"

powered by: WebSVN 2.1.0

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