OSDN Git Service

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