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, 2008, 2009
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 "libfuncs.h"
46 #include "flags.h"
47 #include "reload.h"
48 #include "tm_p.h"
49 #include "ggc.h"
50 #include "gstab.h"
51 #include "hashtab.h"
52 #include "debug.h"
53 #include "target.h"
54 #include "target-def.h"
55 #include "integrate.h"
56 #include "langhooks.h"
57 #include "cfglayout.h"
58 #include "sched-int.h"
59 #include "gimple.h"
60 #include "bitmap.h"
61 #include "diagnostic.h"
62
63 /* True if X is an UNSPEC wrapper around a SYMBOL_REF or LABEL_REF.  */
64 #define UNSPEC_ADDRESS_P(X)                                     \
65   (GET_CODE (X) == UNSPEC                                       \
66    && XINT (X, 1) >= UNSPEC_ADDRESS_FIRST                       \
67    && XINT (X, 1) < UNSPEC_ADDRESS_FIRST + NUM_SYMBOL_TYPES)
68
69 /* Extract the symbol or label from UNSPEC wrapper X.  */
70 #define UNSPEC_ADDRESS(X) \
71   XVECEXP (X, 0, 0)
72
73 /* Extract the symbol type from UNSPEC wrapper X.  */
74 #define UNSPEC_ADDRESS_TYPE(X) \
75   ((enum mips_symbol_type) (XINT (X, 1) - UNSPEC_ADDRESS_FIRST))
76
77 /* The maximum distance between the top of the stack frame and the
78    value $sp has when we save and restore registers.
79
80    The value for normal-mode code must be a SMALL_OPERAND and must
81    preserve the maximum stack alignment.  We therefore use a value
82    of 0x7ff0 in this case.
83
84    MIPS16e SAVE and RESTORE instructions can adjust the stack pointer by
85    up to 0x7f8 bytes and can usually save or restore all the registers
86    that we need to save or restore.  (Note that we can only use these
87    instructions for o32, for which the stack alignment is 8 bytes.)
88
89    We use a maximum gap of 0x100 or 0x400 for MIPS16 code when SAVE and
90    RESTORE are not available.  We can then use unextended instructions
91    to save and restore registers, and to allocate and deallocate the top
92    part of the frame.  */
93 #define MIPS_MAX_FIRST_STACK_STEP                                       \
94   (!TARGET_MIPS16 ? 0x7ff0                                              \
95    : GENERATE_MIPS16E_SAVE_RESTORE ? 0x7f8                              \
96    : TARGET_64BIT ? 0x100 : 0x400)
97
98 /* True if INSN is a mips.md pattern or asm statement.  */
99 #define USEFUL_INSN_P(INSN)                                             \
100   (NONDEBUG_INSN_P (INSN)                                               \
101    && GET_CODE (PATTERN (INSN)) != USE                                  \
102    && GET_CODE (PATTERN (INSN)) != CLOBBER                              \
103    && GET_CODE (PATTERN (INSN)) != ADDR_VEC                             \
104    && GET_CODE (PATTERN (INSN)) != ADDR_DIFF_VEC)
105
106 /* If INSN is a delayed branch sequence, return the first instruction
107    in the sequence, otherwise return INSN itself.  */
108 #define SEQ_BEGIN(INSN)                                                 \
109   (INSN_P (INSN) && GET_CODE (PATTERN (INSN)) == SEQUENCE               \
110    ? XVECEXP (PATTERN (INSN), 0, 0)                                     \
111    : (INSN))
112
113 /* Likewise for the last instruction in a delayed branch sequence.  */
114 #define SEQ_END(INSN)                                                   \
115   (INSN_P (INSN) && GET_CODE (PATTERN (INSN)) == SEQUENCE               \
116    ? XVECEXP (PATTERN (INSN), 0, XVECLEN (PATTERN (INSN), 0) - 1)       \
117    : (INSN))
118
119 /* Execute the following loop body with SUBINSN set to each instruction
120    between SEQ_BEGIN (INSN) and SEQ_END (INSN) inclusive.  */
121 #define FOR_EACH_SUBINSN(SUBINSN, INSN)                                 \
122   for ((SUBINSN) = SEQ_BEGIN (INSN);                                    \
123        (SUBINSN) != NEXT_INSN (SEQ_END (INSN));                         \
124        (SUBINSN) = NEXT_INSN (SUBINSN))
125
126 /* True if bit BIT is set in VALUE.  */
127 #define BITSET_P(VALUE, BIT) (((VALUE) & (1 << (BIT))) != 0)
128
129 /* Return the opcode for a ptr_mode load of the form:
130
131        l[wd]    DEST, OFFSET(BASE).  */
132 #define MIPS_LOAD_PTR(DEST, OFFSET, BASE)       \
133   (((ptr_mode == DImode ? 0x37 : 0x23) << 26)   \
134    | ((BASE) << 21)                             \
135    | ((DEST) << 16)                             \
136    | (OFFSET))
137
138 /* Return the opcode to move register SRC into register DEST.  */
139 #define MIPS_MOVE(DEST, SRC)            \
140   ((TARGET_64BIT ? 0x2d : 0x21)         \
141    | ((DEST) << 11)                     \
142    | ((SRC) << 21))
143
144 /* Return the opcode for:
145
146        lui      DEST, VALUE.  */
147 #define MIPS_LUI(DEST, VALUE) \
148   ((0xf << 26) | ((DEST) << 16) | (VALUE))
149
150 /* Return the opcode to jump to register DEST.  */
151 #define MIPS_JR(DEST) \
152   (((DEST) << 21) | 0x8)
153
154 /* Return the opcode for:
155
156        bal     . + (1 + OFFSET) * 4.  */
157 #define MIPS_BAL(OFFSET) \
158   ((0x1 << 26) | (0x11 << 16) | (OFFSET))
159
160 /* Return the usual opcode for a nop.  */
161 #define MIPS_NOP 0
162
163 /* Classifies an address.
164
165    ADDRESS_REG
166        A natural register + offset address.  The register satisfies
167        mips_valid_base_register_p and the offset is a const_arith_operand.
168
169    ADDRESS_LO_SUM
170        A LO_SUM rtx.  The first operand is a valid base register and
171        the second operand is a symbolic address.
172
173    ADDRESS_CONST_INT
174        A signed 16-bit constant address.
175
176    ADDRESS_SYMBOLIC:
177        A constant symbolic address.  */
178 enum mips_address_type {
179   ADDRESS_REG,
180   ADDRESS_LO_SUM,
181   ADDRESS_CONST_INT,
182   ADDRESS_SYMBOLIC
183 };
184
185 /* Enumerates the setting of the -mr10k-cache-barrier option.  */
186 enum mips_r10k_cache_barrier_setting {
187   R10K_CACHE_BARRIER_NONE,
188   R10K_CACHE_BARRIER_STORE,
189   R10K_CACHE_BARRIER_LOAD_STORE
190 };
191
192 /* Macros to create an enumeration identifier for a function prototype.  */
193 #define MIPS_FTYPE_NAME1(A, B) MIPS_##A##_FTYPE_##B
194 #define MIPS_FTYPE_NAME2(A, B, C) MIPS_##A##_FTYPE_##B##_##C
195 #define MIPS_FTYPE_NAME3(A, B, C, D) MIPS_##A##_FTYPE_##B##_##C##_##D
196 #define MIPS_FTYPE_NAME4(A, B, C, D, E) MIPS_##A##_FTYPE_##B##_##C##_##D##_##E
197
198 /* Classifies the prototype of a built-in function.  */
199 enum mips_function_type {
200 #define DEF_MIPS_FTYPE(NARGS, LIST) MIPS_FTYPE_NAME##NARGS LIST,
201 #include "config/mips/mips-ftypes.def"
202 #undef DEF_MIPS_FTYPE
203   MIPS_MAX_FTYPE_MAX
204 };
205
206 /* Specifies how a built-in function should be converted into rtl.  */
207 enum mips_builtin_type {
208   /* The function corresponds directly to an .md pattern.  The return
209      value is mapped to operand 0 and the arguments are mapped to
210      operands 1 and above.  */
211   MIPS_BUILTIN_DIRECT,
212
213   /* The function corresponds directly to an .md pattern.  There is no return
214      value and the arguments are mapped to operands 0 and above.  */
215   MIPS_BUILTIN_DIRECT_NO_TARGET,
216
217   /* The function corresponds to a comparison instruction followed by
218      a mips_cond_move_tf_ps pattern.  The first two arguments are the
219      values to compare and the second two arguments are the vector
220      operands for the movt.ps or movf.ps instruction (in assembly order).  */
221   MIPS_BUILTIN_MOVF,
222   MIPS_BUILTIN_MOVT,
223
224   /* The function corresponds to a V2SF comparison instruction.  Operand 0
225      of this instruction is the result of the comparison, which has mode
226      CCV2 or CCV4.  The function arguments are mapped to operands 1 and
227      above.  The function's return value is an SImode boolean that is
228      true under the following conditions:
229
230      MIPS_BUILTIN_CMP_ANY: one of the registers is true
231      MIPS_BUILTIN_CMP_ALL: all of the registers are true
232      MIPS_BUILTIN_CMP_LOWER: the first register is true
233      MIPS_BUILTIN_CMP_UPPER: the second register is true.  */
234   MIPS_BUILTIN_CMP_ANY,
235   MIPS_BUILTIN_CMP_ALL,
236   MIPS_BUILTIN_CMP_UPPER,
237   MIPS_BUILTIN_CMP_LOWER,
238
239   /* As above, but the instruction only sets a single $fcc register.  */
240   MIPS_BUILTIN_CMP_SINGLE,
241
242   /* For generating bposge32 branch instructions in MIPS32 DSP ASE.  */
243   MIPS_BUILTIN_BPOSGE32
244 };
245
246 /* Invoke MACRO (COND) for each C.cond.fmt condition.  */
247 #define MIPS_FP_CONDITIONS(MACRO) \
248   MACRO (f),    \
249   MACRO (un),   \
250   MACRO (eq),   \
251   MACRO (ueq),  \
252   MACRO (olt),  \
253   MACRO (ult),  \
254   MACRO (ole),  \
255   MACRO (ule),  \
256   MACRO (sf),   \
257   MACRO (ngle), \
258   MACRO (seq),  \
259   MACRO (ngl),  \
260   MACRO (lt),   \
261   MACRO (nge),  \
262   MACRO (le),   \
263   MACRO (ngt)
264
265 /* Enumerates the codes above as MIPS_FP_COND_<X>.  */
266 #define DECLARE_MIPS_COND(X) MIPS_FP_COND_ ## X
267 enum mips_fp_condition {
268   MIPS_FP_CONDITIONS (DECLARE_MIPS_COND)
269 };
270
271 /* Index X provides the string representation of MIPS_FP_COND_<X>.  */
272 #define STRINGIFY(X) #X
273 static const char *const mips_fp_conditions[] = {
274   MIPS_FP_CONDITIONS (STRINGIFY)
275 };
276
277 /* Information about a function's frame layout.  */
278 struct GTY(())  mips_frame_info {
279   /* The size of the frame in bytes.  */
280   HOST_WIDE_INT total_size;
281
282   /* The number of bytes allocated to variables.  */
283   HOST_WIDE_INT var_size;
284
285   /* The number of bytes allocated to outgoing function arguments.  */
286   HOST_WIDE_INT args_size;
287
288   /* The number of bytes allocated to the .cprestore slot, or 0 if there
289      is no such slot.  */
290   HOST_WIDE_INT cprestore_size;
291
292   /* Bit X is set if the function saves or restores GPR X.  */
293   unsigned int mask;
294
295   /* Likewise FPR X.  */
296   unsigned int fmask;
297
298   /* Likewise doubleword accumulator X ($acX).  */
299   unsigned int acc_mask;
300
301   /* The number of GPRs, FPRs, doubleword accumulators and COP0
302      registers saved.  */
303   unsigned int num_gp;
304   unsigned int num_fp;
305   unsigned int num_acc;
306   unsigned int num_cop0_regs;
307
308   /* The offset of the topmost GPR, FPR, accumulator and COP0-register
309      save slots from the top of the frame, or zero if no such slots are
310      needed.  */
311   HOST_WIDE_INT gp_save_offset;
312   HOST_WIDE_INT fp_save_offset;
313   HOST_WIDE_INT acc_save_offset;
314   HOST_WIDE_INT cop0_save_offset;
315
316   /* Likewise, but giving offsets from the bottom of the frame.  */
317   HOST_WIDE_INT gp_sp_offset;
318   HOST_WIDE_INT fp_sp_offset;
319   HOST_WIDE_INT acc_sp_offset;
320   HOST_WIDE_INT cop0_sp_offset;
321
322   /* The offset of arg_pointer_rtx from the bottom of the frame.  */
323   HOST_WIDE_INT arg_pointer_offset;
324
325   /* The offset of hard_frame_pointer_rtx from the bottom of the frame.  */
326   HOST_WIDE_INT hard_frame_pointer_offset;
327 };
328
329 struct GTY(())  machine_function {
330   /* The register returned by mips16_gp_pseudo_reg; see there for details.  */
331   rtx mips16_gp_pseudo_rtx;
332
333   /* The number of extra stack bytes taken up by register varargs.
334      This area is allocated by the callee at the very top of the frame.  */
335   int varargs_size;
336
337   /* The current frame information, calculated by mips_compute_frame_info.  */
338   struct mips_frame_info frame;
339
340   /* The register to use as the function's global pointer, or INVALID_REGNUM
341      if the function doesn't need one.  */
342   unsigned int global_pointer;
343
344   /* How many instructions it takes to load a label into $AT, or 0 if
345      this property hasn't yet been calculated.  */
346   unsigned int load_label_length;
347
348   /* True if mips_adjust_insn_length should ignore an instruction's
349      hazard attribute.  */
350   bool ignore_hazard_length_p;
351
352   /* True if the whole function is suitable for .set noreorder and
353      .set nomacro.  */
354   bool all_noreorder_p;
355
356   /* True if the function has "inflexible" and "flexible" references
357      to the global pointer.  See mips_cfun_has_inflexible_gp_ref_p
358      and mips_cfun_has_flexible_gp_ref_p for details.  */
359   bool has_inflexible_gp_insn_p;
360   bool has_flexible_gp_insn_p;
361
362   /* True if the function's prologue must load the global pointer
363      value into pic_offset_table_rtx and store the same value in
364      the function's cprestore slot (if any).  Even if this value
365      is currently false, we may decide to set it to true later;
366      see mips_must_initialize_gp_p () for details.  */
367   bool must_initialize_gp_p;
368
369   /* True if the current function must restore $gp after any potential
370      clobber.  This value is only meaningful during the first post-epilogue
371      split_insns pass; see mips_must_initialize_gp_p () for details.  */
372   bool must_restore_gp_when_clobbered_p;
373
374   /* True if we have emitted an instruction to initialize
375      mips16_gp_pseudo_rtx.  */
376   bool initialized_mips16_gp_pseudo_p;
377
378   /* True if this is an interrupt handler.  */
379   bool interrupt_handler_p;
380
381   /* True if this is an interrupt handler that uses shadow registers.  */
382   bool use_shadow_register_set_p;
383
384   /* True if this is an interrupt handler that should keep interrupts
385      masked.  */
386   bool keep_interrupts_masked_p;
387
388   /* True if this is an interrupt handler that should use DERET
389      instead of ERET.  */
390   bool use_debug_exception_return_p;
391 };
392
393 /* Information about a single argument.  */
394 struct mips_arg_info {
395   /* True if the argument is passed in a floating-point register, or
396      would have been if we hadn't run out of registers.  */
397   bool fpr_p;
398
399   /* The number of words passed in registers, rounded up.  */
400   unsigned int reg_words;
401
402   /* For EABI, the offset of the first register from GP_ARG_FIRST or
403      FP_ARG_FIRST.  For other ABIs, the offset of the first register from
404      the start of the ABI's argument structure (see the CUMULATIVE_ARGS
405      comment for details).
406
407      The value is MAX_ARGS_IN_REGISTERS if the argument is passed entirely
408      on the stack.  */
409   unsigned int reg_offset;
410
411   /* The number of words that must be passed on the stack, rounded up.  */
412   unsigned int stack_words;
413
414   /* The offset from the start of the stack overflow area of the argument's
415      first stack word.  Only meaningful when STACK_WORDS is nonzero.  */
416   unsigned int stack_offset;
417 };
418
419 /* Information about an address described by mips_address_type.
420
421    ADDRESS_CONST_INT
422        No fields are used.
423
424    ADDRESS_REG
425        REG is the base register and OFFSET is the constant offset.
426
427    ADDRESS_LO_SUM
428        REG and OFFSET are the operands to the LO_SUM and SYMBOL_TYPE
429        is the type of symbol it references.
430
431    ADDRESS_SYMBOLIC
432        SYMBOL_TYPE is the type of symbol that the address references.  */
433 struct mips_address_info {
434   enum mips_address_type type;
435   rtx reg;
436   rtx offset;
437   enum mips_symbol_type symbol_type;
438 };
439
440 /* One stage in a constant building sequence.  These sequences have
441    the form:
442
443         A = VALUE[0]
444         A = A CODE[1] VALUE[1]
445         A = A CODE[2] VALUE[2]
446         ...
447
448    where A is an accumulator, each CODE[i] is a binary rtl operation
449    and each VALUE[i] is a constant integer.  CODE[0] is undefined.  */
450 struct mips_integer_op {
451   enum rtx_code code;
452   unsigned HOST_WIDE_INT value;
453 };
454
455 /* The largest number of operations needed to load an integer constant.
456    The worst accepted case for 64-bit constants is LUI,ORI,SLL,ORI,SLL,ORI.
457    When the lowest bit is clear, we can try, but reject a sequence with
458    an extra SLL at the end.  */
459 #define MIPS_MAX_INTEGER_OPS 7
460
461 /* Information about a MIPS16e SAVE or RESTORE instruction.  */
462 struct mips16e_save_restore_info {
463   /* The number of argument registers saved by a SAVE instruction.
464      0 for RESTORE instructions.  */
465   unsigned int nargs;
466
467   /* Bit X is set if the instruction saves or restores GPR X.  */
468   unsigned int mask;
469
470   /* The total number of bytes to allocate.  */
471   HOST_WIDE_INT size;
472 };
473
474 /* Global variables for machine-dependent things.  */
475
476 /* The -G setting, or the configuration's default small-data limit if
477    no -G option is given.  */
478 static unsigned int mips_small_data_threshold;
479
480 /* The number of file directives written by mips_output_filename.  */
481 int num_source_filenames;
482
483 /* The name that appeared in the last .file directive written by
484    mips_output_filename, or "" if mips_output_filename hasn't
485    written anything yet.  */
486 const char *current_function_file = "";
487
488 /* A label counter used by PUT_SDB_BLOCK_START and PUT_SDB_BLOCK_END.  */
489 int sdb_label_count;
490
491 /* Arrays that map GCC register numbers to debugger register numbers.  */
492 int mips_dbx_regno[FIRST_PSEUDO_REGISTER];
493 int mips_dwarf_regno[FIRST_PSEUDO_REGISTER];
494
495 /* The nesting depth of the PRINT_OPERAND '%(', '%<' and '%[' constructs.  */
496 struct mips_asm_switch mips_noreorder = { "reorder", 0 };
497 struct mips_asm_switch mips_nomacro = { "macro", 0 };
498 struct mips_asm_switch mips_noat = { "at", 0 };
499
500 /* True if we're writing out a branch-likely instruction rather than a
501    normal branch.  */
502 static bool mips_branch_likely;
503
504 /* The current instruction-set architecture.  */
505 enum processor_type mips_arch;
506 const struct mips_cpu_info *mips_arch_info;
507
508 /* The processor that we should tune the code for.  */
509 enum processor_type mips_tune;
510 const struct mips_cpu_info *mips_tune_info;
511
512 /* The ISA level associated with mips_arch.  */
513 int mips_isa;
514
515 /* The architecture selected by -mipsN, or null if -mipsN wasn't used.  */
516 static const struct mips_cpu_info *mips_isa_option_info;
517
518 /* Which ABI to use.  */
519 int mips_abi = MIPS_ABI_DEFAULT;
520
521 /* Which cost information to use.  */
522 const struct mips_rtx_cost_data *mips_cost;
523
524 /* The ambient target flags, excluding MASK_MIPS16.  */
525 static int mips_base_target_flags;
526
527 /* True if MIPS16 is the default mode.  */
528 bool mips_base_mips16;
529
530 /* The ambient values of other global variables.  */
531 static int mips_base_schedule_insns; /* flag_schedule_insns */
532 static int mips_base_reorder_blocks_and_partition; /* flag_reorder... */
533 static int mips_base_move_loop_invariants; /* flag_move_loop_invariants */
534 static int mips_base_align_loops; /* align_loops */
535 static int mips_base_align_jumps; /* align_jumps */
536 static int mips_base_align_functions; /* align_functions */
537
538 /* The -mcode-readable setting.  */
539 enum mips_code_readable_setting mips_code_readable = CODE_READABLE_YES;
540
541 /* The -mr10k-cache-barrier setting.  */
542 static enum mips_r10k_cache_barrier_setting mips_r10k_cache_barrier;
543
544 /* Index [M][R] is true if register R is allowed to hold a value of mode M.  */
545 bool mips_hard_regno_mode_ok[(int) MAX_MACHINE_MODE][FIRST_PSEUDO_REGISTER];
546
547 /* Index C is true if character C is a valid PRINT_OPERAND punctation
548    character.  */
549 bool mips_print_operand_punct[256];
550
551 static GTY (()) int mips_output_filename_first_time = 1;
552
553 /* mips_split_p[X] is true if symbols of type X can be split by
554    mips_split_symbol.  */
555 bool mips_split_p[NUM_SYMBOL_TYPES];
556
557 /* mips_split_hi_p[X] is true if the high parts of symbols of type X
558    can be split by mips_split_symbol.  */
559 bool mips_split_hi_p[NUM_SYMBOL_TYPES];
560
561 /* mips_lo_relocs[X] is the relocation to use when a symbol of type X
562    appears in a LO_SUM.  It can be null if such LO_SUMs aren't valid or
563    if they are matched by a special .md file pattern.  */
564 static const char *mips_lo_relocs[NUM_SYMBOL_TYPES];
565
566 /* Likewise for HIGHs.  */
567 static const char *mips_hi_relocs[NUM_SYMBOL_TYPES];
568
569 /* Index R is the smallest register class that contains register R.  */
570 const enum reg_class mips_regno_to_class[FIRST_PSEUDO_REGISTER] = {
571   LEA_REGS,     LEA_REGS,       M16_REGS,       V1_REG,
572   M16_REGS,     M16_REGS,       M16_REGS,       M16_REGS,
573   LEA_REGS,     LEA_REGS,       LEA_REGS,       LEA_REGS,
574   LEA_REGS,     LEA_REGS,       LEA_REGS,       LEA_REGS,
575   M16_REGS,     M16_REGS,       LEA_REGS,       LEA_REGS,
576   LEA_REGS,     LEA_REGS,       LEA_REGS,       LEA_REGS,
577   T_REG,        PIC_FN_ADDR_REG, LEA_REGS,      LEA_REGS,
578   LEA_REGS,     LEA_REGS,       LEA_REGS,       LEA_REGS,
579   FP_REGS,      FP_REGS,        FP_REGS,        FP_REGS,
580   FP_REGS,      FP_REGS,        FP_REGS,        FP_REGS,
581   FP_REGS,      FP_REGS,        FP_REGS,        FP_REGS,
582   FP_REGS,      FP_REGS,        FP_REGS,        FP_REGS,
583   FP_REGS,      FP_REGS,        FP_REGS,        FP_REGS,
584   FP_REGS,      FP_REGS,        FP_REGS,        FP_REGS,
585   FP_REGS,      FP_REGS,        FP_REGS,        FP_REGS,
586   FP_REGS,      FP_REGS,        FP_REGS,        FP_REGS,
587   MD0_REG,      MD1_REG,        NO_REGS,        ST_REGS,
588   ST_REGS,      ST_REGS,        ST_REGS,        ST_REGS,
589   ST_REGS,      ST_REGS,        ST_REGS,        NO_REGS,
590   NO_REGS,      FRAME_REGS,     FRAME_REGS,     NO_REGS,
591   COP0_REGS,    COP0_REGS,      COP0_REGS,      COP0_REGS,
592   COP0_REGS,    COP0_REGS,      COP0_REGS,      COP0_REGS,
593   COP0_REGS,    COP0_REGS,      COP0_REGS,      COP0_REGS,
594   COP0_REGS,    COP0_REGS,      COP0_REGS,      COP0_REGS,
595   COP0_REGS,    COP0_REGS,      COP0_REGS,      COP0_REGS,
596   COP0_REGS,    COP0_REGS,      COP0_REGS,      COP0_REGS,
597   COP0_REGS,    COP0_REGS,      COP0_REGS,      COP0_REGS,
598   COP0_REGS,    COP0_REGS,      COP0_REGS,      COP0_REGS,
599   COP2_REGS,    COP2_REGS,      COP2_REGS,      COP2_REGS,
600   COP2_REGS,    COP2_REGS,      COP2_REGS,      COP2_REGS,
601   COP2_REGS,    COP2_REGS,      COP2_REGS,      COP2_REGS,
602   COP2_REGS,    COP2_REGS,      COP2_REGS,      COP2_REGS,
603   COP2_REGS,    COP2_REGS,      COP2_REGS,      COP2_REGS,
604   COP2_REGS,    COP2_REGS,      COP2_REGS,      COP2_REGS,
605   COP2_REGS,    COP2_REGS,      COP2_REGS,      COP2_REGS,
606   COP2_REGS,    COP2_REGS,      COP2_REGS,      COP2_REGS,
607   COP3_REGS,    COP3_REGS,      COP3_REGS,      COP3_REGS,
608   COP3_REGS,    COP3_REGS,      COP3_REGS,      COP3_REGS,
609   COP3_REGS,    COP3_REGS,      COP3_REGS,      COP3_REGS,
610   COP3_REGS,    COP3_REGS,      COP3_REGS,      COP3_REGS,
611   COP3_REGS,    COP3_REGS,      COP3_REGS,      COP3_REGS,
612   COP3_REGS,    COP3_REGS,      COP3_REGS,      COP3_REGS,
613   COP3_REGS,    COP3_REGS,      COP3_REGS,      COP3_REGS,
614   COP3_REGS,    COP3_REGS,      COP3_REGS,      COP3_REGS,
615   DSP_ACC_REGS, DSP_ACC_REGS,   DSP_ACC_REGS,   DSP_ACC_REGS,
616   DSP_ACC_REGS, DSP_ACC_REGS,   ALL_REGS,       ALL_REGS,
617   ALL_REGS,     ALL_REGS,       ALL_REGS,       ALL_REGS
618 };
619
620 /* The value of TARGET_ATTRIBUTE_TABLE.  */
621 static const struct attribute_spec mips_attribute_table[] = {
622   /* { name, min_len, max_len, decl_req, type_req, fn_type_req, handler } */
623   { "long_call",   0, 0, false, true,  true,  NULL },
624   { "far",         0, 0, false, true,  true,  NULL },
625   { "near",        0, 0, false, true,  true,  NULL },
626   /* We would really like to treat "mips16" and "nomips16" as type
627      attributes, but GCC doesn't provide the hooks we need to support
628      the right conversion rules.  As declaration attributes, they affect
629      code generation but don't carry other semantics.  */
630   { "mips16",      0, 0, true,  false, false, NULL },
631   { "nomips16",    0, 0, true,  false, false, NULL },
632   /* Allow functions to be specified as interrupt handlers */
633   { "interrupt",   0, 0, false, true,  true, NULL },
634   { "use_shadow_register_set",  0, 0, false, true,  true, NULL },
635   { "keep_interrupts_masked",   0, 0, false, true,  true, NULL },
636   { "use_debug_exception_return", 0, 0, false, true,  true, NULL },
637   { NULL,          0, 0, false, false, false, NULL }
638 };
639 \f
640 /* A table describing all the processors GCC knows about.  Names are
641    matched in the order listed.  The first mention of an ISA level is
642    taken as the canonical name for that ISA.
643
644    To ease comparison, please keep this table in the same order
645    as GAS's mips_cpu_info_table.  Please also make sure that
646    MIPS_ISA_LEVEL_SPEC and MIPS_ARCH_FLOAT_SPEC handle all -march
647    options correctly.  */
648 static const struct mips_cpu_info mips_cpu_info_table[] = {
649   /* Entries for generic ISAs.  */
650   { "mips1", PROCESSOR_R3000, 1, 0 },
651   { "mips2", PROCESSOR_R6000, 2, 0 },
652   { "mips3", PROCESSOR_R4000, 3, 0 },
653   { "mips4", PROCESSOR_R8000, 4, 0 },
654   /* Prefer not to use branch-likely instructions for generic MIPS32rX
655      and MIPS64rX code.  The instructions were officially deprecated
656      in revisions 2 and earlier, but revision 3 is likely to downgrade
657      that to a recommendation to avoid the instructions in code that
658      isn't tuned to a specific processor.  */
659   { "mips32", PROCESSOR_4KC, 32, PTF_AVOID_BRANCHLIKELY },
660   { "mips32r2", PROCESSOR_M4K, 33, PTF_AVOID_BRANCHLIKELY },
661   { "mips64", PROCESSOR_5KC, 64, PTF_AVOID_BRANCHLIKELY },
662   /* ??? For now just tune the generic MIPS64r2 for 5KC as well.   */
663   { "mips64r2", PROCESSOR_5KC, 65, PTF_AVOID_BRANCHLIKELY },
664
665   /* MIPS I processors.  */
666   { "r3000", PROCESSOR_R3000, 1, 0 },
667   { "r2000", PROCESSOR_R3000, 1, 0 },
668   { "r3900", PROCESSOR_R3900, 1, 0 },
669
670   /* MIPS II processors.  */
671   { "r6000", PROCESSOR_R6000, 2, 0 },
672
673   /* MIPS III processors.  */
674   { "r4000", PROCESSOR_R4000, 3, 0 },
675   { "vr4100", PROCESSOR_R4100, 3, 0 },
676   { "vr4111", PROCESSOR_R4111, 3, 0 },
677   { "vr4120", PROCESSOR_R4120, 3, 0 },
678   { "vr4130", PROCESSOR_R4130, 3, 0 },
679   { "vr4300", PROCESSOR_R4300, 3, 0 },
680   { "r4400", PROCESSOR_R4000, 3, 0 },
681   { "r4600", PROCESSOR_R4600, 3, 0 },
682   { "orion", PROCESSOR_R4600, 3, 0 },
683   { "r4650", PROCESSOR_R4650, 3, 0 },
684   /* ST Loongson 2E/2F processors.  */
685   { "loongson2e", PROCESSOR_LOONGSON_2E, 3, PTF_AVOID_BRANCHLIKELY },
686   { "loongson2f", PROCESSOR_LOONGSON_2F, 3, PTF_AVOID_BRANCHLIKELY },
687
688   /* MIPS IV processors. */
689   { "r8000", PROCESSOR_R8000, 4, 0 },
690   { "r10000", PROCESSOR_R10000, 4, 0 },
691   { "r12000", PROCESSOR_R10000, 4, 0 },
692   { "r14000", PROCESSOR_R10000, 4, 0 },
693   { "r16000", PROCESSOR_R10000, 4, 0 },
694   { "vr5000", PROCESSOR_R5000, 4, 0 },
695   { "vr5400", PROCESSOR_R5400, 4, 0 },
696   { "vr5500", PROCESSOR_R5500, 4, PTF_AVOID_BRANCHLIKELY },
697   { "rm7000", PROCESSOR_R7000, 4, 0 },
698   { "rm9000", PROCESSOR_R9000, 4, 0 },
699
700   /* MIPS32 processors.  */
701   { "4kc", PROCESSOR_4KC, 32, 0 },
702   { "4km", PROCESSOR_4KC, 32, 0 },
703   { "4kp", PROCESSOR_4KP, 32, 0 },
704   { "4ksc", PROCESSOR_4KC, 32, 0 },
705
706   /* MIPS32 Release 2 processors.  */
707   { "m4k", PROCESSOR_M4K, 33, 0 },
708   { "4kec", PROCESSOR_4KC, 33, 0 },
709   { "4kem", PROCESSOR_4KC, 33, 0 },
710   { "4kep", PROCESSOR_4KP, 33, 0 },
711   { "4ksd", PROCESSOR_4KC, 33, 0 },
712
713   { "24kc", PROCESSOR_24KC, 33, 0 },
714   { "24kf2_1", PROCESSOR_24KF2_1, 33, 0 },
715   { "24kf", PROCESSOR_24KF2_1, 33, 0 },
716   { "24kf1_1", PROCESSOR_24KF1_1, 33, 0 },
717   { "24kfx", PROCESSOR_24KF1_1, 33, 0 },
718   { "24kx", PROCESSOR_24KF1_1, 33, 0 },
719
720   { "24kec", PROCESSOR_24KC, 33, 0 }, /* 24K with DSP.  */
721   { "24kef2_1", PROCESSOR_24KF2_1, 33, 0 },
722   { "24kef", PROCESSOR_24KF2_1, 33, 0 },
723   { "24kef1_1", PROCESSOR_24KF1_1, 33, 0 },
724   { "24kefx", PROCESSOR_24KF1_1, 33, 0 },
725   { "24kex", PROCESSOR_24KF1_1, 33, 0 },
726
727   { "34kc", PROCESSOR_24KC, 33, 0 }, /* 34K with MT/DSP.  */
728   { "34kf2_1", PROCESSOR_24KF2_1, 33, 0 },
729   { "34kf", PROCESSOR_24KF2_1, 33, 0 },
730   { "34kf1_1", PROCESSOR_24KF1_1, 33, 0 },
731   { "34kfx", PROCESSOR_24KF1_1, 33, 0 },
732   { "34kx", PROCESSOR_24KF1_1, 33, 0 },
733
734   { "74kc", PROCESSOR_74KC, 33, 0 }, /* 74K with DSPr2.  */
735   { "74kf2_1", PROCESSOR_74KF2_1, 33, 0 },
736   { "74kf", PROCESSOR_74KF2_1, 33, 0 },
737   { "74kf1_1", PROCESSOR_74KF1_1, 33, 0 },
738   { "74kfx", PROCESSOR_74KF1_1, 33, 0 },
739   { "74kx", PROCESSOR_74KF1_1, 33, 0 },
740   { "74kf3_2", PROCESSOR_74KF3_2, 33, 0 },
741
742   { "1004kc", PROCESSOR_24KC, 33, 0 }, /* 1004K with MT/DSP.  */
743   { "1004kf2_1", PROCESSOR_24KF2_1, 33, 0 },
744   { "1004kf", PROCESSOR_24KF2_1, 33, 0 },
745   { "1004kf1_1", PROCESSOR_24KF1_1, 33, 0 },
746
747   /* MIPS64 processors.  */
748   { "5kc", PROCESSOR_5KC, 64, 0 },
749   { "5kf", PROCESSOR_5KF, 64, 0 },
750   { "20kc", PROCESSOR_20KC, 64, PTF_AVOID_BRANCHLIKELY },
751   { "sb1", PROCESSOR_SB1, 64, PTF_AVOID_BRANCHLIKELY },
752   { "sb1a", PROCESSOR_SB1A, 64, PTF_AVOID_BRANCHLIKELY },
753   { "sr71000", PROCESSOR_SR71000, 64, PTF_AVOID_BRANCHLIKELY },
754   { "xlr", PROCESSOR_XLR, 64, 0 },
755
756   /* MIPS64 Release 2 processors.  */
757   { "octeon", PROCESSOR_OCTEON, 65, PTF_AVOID_BRANCHLIKELY }
758 };
759
760 /* Default costs.  If these are used for a processor we should look
761    up the actual costs.  */
762 #define DEFAULT_COSTS COSTS_N_INSNS (6),  /* fp_add */       \
763                       COSTS_N_INSNS (7),  /* fp_mult_sf */   \
764                       COSTS_N_INSNS (8),  /* fp_mult_df */   \
765                       COSTS_N_INSNS (23), /* fp_div_sf */    \
766                       COSTS_N_INSNS (36), /* fp_div_df */    \
767                       COSTS_N_INSNS (10), /* int_mult_si */  \
768                       COSTS_N_INSNS (10), /* int_mult_di */  \
769                       COSTS_N_INSNS (69), /* int_div_si */   \
770                       COSTS_N_INSNS (69), /* int_div_di */   \
771                                        2, /* branch_cost */  \
772                                        4  /* memory_latency */
773
774 /* Floating-point costs for processors without an FPU.  Just assume that
775    all floating-point libcalls are very expensive.  */
776 #define SOFT_FP_COSTS COSTS_N_INSNS (256), /* fp_add */       \
777                       COSTS_N_INSNS (256), /* fp_mult_sf */   \
778                       COSTS_N_INSNS (256), /* fp_mult_df */   \
779                       COSTS_N_INSNS (256), /* fp_div_sf */    \
780                       COSTS_N_INSNS (256)  /* fp_div_df */
781
782 /* Costs to use when optimizing for size.  */
783 static const struct mips_rtx_cost_data mips_rtx_cost_optimize_size = {
784   COSTS_N_INSNS (1),            /* fp_add */
785   COSTS_N_INSNS (1),            /* fp_mult_sf */
786   COSTS_N_INSNS (1),            /* fp_mult_df */
787   COSTS_N_INSNS (1),            /* fp_div_sf */
788   COSTS_N_INSNS (1),            /* fp_div_df */
789   COSTS_N_INSNS (1),            /* int_mult_si */
790   COSTS_N_INSNS (1),            /* int_mult_di */
791   COSTS_N_INSNS (1),            /* int_div_si */
792   COSTS_N_INSNS (1),            /* int_div_di */
793                    2,           /* branch_cost */
794                    4            /* memory_latency */
795 };
796
797 /* Costs to use when optimizing for speed, indexed by processor.  */
798 static const struct mips_rtx_cost_data mips_rtx_cost_data[PROCESSOR_MAX] = {
799   { /* R3000 */
800     COSTS_N_INSNS (2),            /* fp_add */
801     COSTS_N_INSNS (4),            /* fp_mult_sf */
802     COSTS_N_INSNS (5),            /* fp_mult_df */
803     COSTS_N_INSNS (12),           /* fp_div_sf */
804     COSTS_N_INSNS (19),           /* fp_div_df */
805     COSTS_N_INSNS (12),           /* int_mult_si */
806     COSTS_N_INSNS (12),           /* int_mult_di */
807     COSTS_N_INSNS (35),           /* int_div_si */
808     COSTS_N_INSNS (35),           /* int_div_di */
809                      1,           /* branch_cost */
810                      4            /* memory_latency */
811   },
812   { /* 4KC */
813     SOFT_FP_COSTS,
814     COSTS_N_INSNS (6),            /* int_mult_si */
815     COSTS_N_INSNS (6),            /* int_mult_di */
816     COSTS_N_INSNS (36),           /* int_div_si */
817     COSTS_N_INSNS (36),           /* int_div_di */
818                      1,           /* branch_cost */
819                      4            /* memory_latency */
820   },
821   { /* 4KP */
822     SOFT_FP_COSTS,
823     COSTS_N_INSNS (36),           /* int_mult_si */
824     COSTS_N_INSNS (36),           /* int_mult_di */
825     COSTS_N_INSNS (37),           /* int_div_si */
826     COSTS_N_INSNS (37),           /* int_div_di */
827                      1,           /* branch_cost */
828                      4            /* memory_latency */
829   },
830   { /* 5KC */
831     SOFT_FP_COSTS,
832     COSTS_N_INSNS (4),            /* int_mult_si */
833     COSTS_N_INSNS (11),           /* int_mult_di */
834     COSTS_N_INSNS (36),           /* int_div_si */
835     COSTS_N_INSNS (68),           /* int_div_di */
836                      1,           /* branch_cost */
837                      4            /* memory_latency */
838   },
839   { /* 5KF */
840     COSTS_N_INSNS (4),            /* fp_add */
841     COSTS_N_INSNS (4),            /* fp_mult_sf */
842     COSTS_N_INSNS (5),            /* fp_mult_df */
843     COSTS_N_INSNS (17),           /* fp_div_sf */
844     COSTS_N_INSNS (32),           /* fp_div_df */
845     COSTS_N_INSNS (4),            /* int_mult_si */
846     COSTS_N_INSNS (11),           /* int_mult_di */
847     COSTS_N_INSNS (36),           /* int_div_si */
848     COSTS_N_INSNS (68),           /* int_div_di */
849                      1,           /* branch_cost */
850                      4            /* memory_latency */
851   },
852   { /* 20KC */
853     COSTS_N_INSNS (4),            /* fp_add */
854     COSTS_N_INSNS (4),            /* fp_mult_sf */
855     COSTS_N_INSNS (5),            /* fp_mult_df */
856     COSTS_N_INSNS (17),           /* fp_div_sf */
857     COSTS_N_INSNS (32),           /* fp_div_df */
858     COSTS_N_INSNS (4),            /* int_mult_si */
859     COSTS_N_INSNS (7),            /* int_mult_di */
860     COSTS_N_INSNS (42),           /* int_div_si */
861     COSTS_N_INSNS (72),           /* int_div_di */
862                      1,           /* branch_cost */
863                      4            /* memory_latency */
864   },
865   { /* 24KC */
866     SOFT_FP_COSTS,
867     COSTS_N_INSNS (5),            /* int_mult_si */
868     COSTS_N_INSNS (5),            /* int_mult_di */
869     COSTS_N_INSNS (41),           /* int_div_si */
870     COSTS_N_INSNS (41),           /* int_div_di */
871                      1,           /* branch_cost */
872                      4            /* memory_latency */
873   },
874   { /* 24KF2_1 */
875     COSTS_N_INSNS (8),            /* fp_add */
876     COSTS_N_INSNS (8),            /* fp_mult_sf */
877     COSTS_N_INSNS (10),           /* fp_mult_df */
878     COSTS_N_INSNS (34),           /* fp_div_sf */
879     COSTS_N_INSNS (64),           /* fp_div_df */
880     COSTS_N_INSNS (5),            /* int_mult_si */
881     COSTS_N_INSNS (5),            /* int_mult_di */
882     COSTS_N_INSNS (41),           /* int_div_si */
883     COSTS_N_INSNS (41),           /* int_div_di */
884                      1,           /* branch_cost */
885                      4            /* memory_latency */
886   },
887   { /* 24KF1_1 */
888     COSTS_N_INSNS (4),            /* fp_add */
889     COSTS_N_INSNS (4),            /* fp_mult_sf */
890     COSTS_N_INSNS (5),            /* fp_mult_df */
891     COSTS_N_INSNS (17),           /* fp_div_sf */
892     COSTS_N_INSNS (32),           /* fp_div_df */
893     COSTS_N_INSNS (5),            /* int_mult_si */
894     COSTS_N_INSNS (5),            /* int_mult_di */
895     COSTS_N_INSNS (41),           /* int_div_si */
896     COSTS_N_INSNS (41),           /* int_div_di */
897                      1,           /* branch_cost */
898                      4            /* memory_latency */
899   },
900   { /* 74KC */
901     SOFT_FP_COSTS,
902     COSTS_N_INSNS (5),            /* int_mult_si */
903     COSTS_N_INSNS (5),            /* int_mult_di */
904     COSTS_N_INSNS (41),           /* int_div_si */
905     COSTS_N_INSNS (41),           /* int_div_di */
906                      1,           /* branch_cost */
907                      4            /* memory_latency */
908   },
909   { /* 74KF2_1 */
910     COSTS_N_INSNS (8),            /* fp_add */
911     COSTS_N_INSNS (8),            /* fp_mult_sf */
912     COSTS_N_INSNS (10),           /* fp_mult_df */
913     COSTS_N_INSNS (34),           /* fp_div_sf */
914     COSTS_N_INSNS (64),           /* fp_div_df */
915     COSTS_N_INSNS (5),            /* int_mult_si */
916     COSTS_N_INSNS (5),            /* int_mult_di */
917     COSTS_N_INSNS (41),           /* int_div_si */
918     COSTS_N_INSNS (41),           /* int_div_di */
919                      1,           /* branch_cost */
920                      4            /* memory_latency */
921   },
922   { /* 74KF1_1 */
923     COSTS_N_INSNS (4),            /* fp_add */
924     COSTS_N_INSNS (4),            /* fp_mult_sf */
925     COSTS_N_INSNS (5),            /* fp_mult_df */
926     COSTS_N_INSNS (17),           /* fp_div_sf */
927     COSTS_N_INSNS (32),           /* fp_div_df */
928     COSTS_N_INSNS (5),            /* int_mult_si */
929     COSTS_N_INSNS (5),            /* int_mult_di */
930     COSTS_N_INSNS (41),           /* int_div_si */
931     COSTS_N_INSNS (41),           /* int_div_di */
932                      1,           /* branch_cost */
933                      4            /* memory_latency */
934   },
935   { /* 74KF3_2 */
936     COSTS_N_INSNS (6),            /* fp_add */
937     COSTS_N_INSNS (6),            /* fp_mult_sf */
938     COSTS_N_INSNS (7),            /* fp_mult_df */
939     COSTS_N_INSNS (25),           /* fp_div_sf */
940     COSTS_N_INSNS (48),           /* fp_div_df */
941     COSTS_N_INSNS (5),            /* int_mult_si */
942     COSTS_N_INSNS (5),            /* int_mult_di */
943     COSTS_N_INSNS (41),           /* int_div_si */
944     COSTS_N_INSNS (41),           /* int_div_di */
945                      1,           /* branch_cost */
946                      4            /* memory_latency */
947   },
948   { /* Loongson-2E */
949     DEFAULT_COSTS
950   },
951   { /* Loongson-2F */
952     DEFAULT_COSTS
953   },
954   { /* M4k */
955     DEFAULT_COSTS
956   },
957     /* Octeon */
958   {
959     SOFT_FP_COSTS,
960     COSTS_N_INSNS (5),            /* int_mult_si */
961     COSTS_N_INSNS (5),            /* int_mult_di */
962     COSTS_N_INSNS (72),           /* int_div_si */
963     COSTS_N_INSNS (72),           /* int_div_di */
964                      1,           /* branch_cost */
965                      4            /* memory_latency */
966   },
967   { /* R3900 */
968     COSTS_N_INSNS (2),            /* fp_add */
969     COSTS_N_INSNS (4),            /* fp_mult_sf */
970     COSTS_N_INSNS (5),            /* fp_mult_df */
971     COSTS_N_INSNS (12),           /* fp_div_sf */
972     COSTS_N_INSNS (19),           /* fp_div_df */
973     COSTS_N_INSNS (2),            /* int_mult_si */
974     COSTS_N_INSNS (2),            /* int_mult_di */
975     COSTS_N_INSNS (35),           /* int_div_si */
976     COSTS_N_INSNS (35),           /* int_div_di */
977                      1,           /* branch_cost */
978                      4            /* memory_latency */
979   },
980   { /* R6000 */
981     COSTS_N_INSNS (3),            /* fp_add */
982     COSTS_N_INSNS (5),            /* fp_mult_sf */
983     COSTS_N_INSNS (6),            /* fp_mult_df */
984     COSTS_N_INSNS (15),           /* fp_div_sf */
985     COSTS_N_INSNS (16),           /* fp_div_df */
986     COSTS_N_INSNS (17),           /* int_mult_si */
987     COSTS_N_INSNS (17),           /* int_mult_di */
988     COSTS_N_INSNS (38),           /* int_div_si */
989     COSTS_N_INSNS (38),           /* int_div_di */
990                      2,           /* branch_cost */
991                      6            /* memory_latency */
992   },
993   { /* R4000 */
994      COSTS_N_INSNS (6),           /* fp_add */
995      COSTS_N_INSNS (7),           /* fp_mult_sf */
996      COSTS_N_INSNS (8),           /* fp_mult_df */
997      COSTS_N_INSNS (23),          /* fp_div_sf */
998      COSTS_N_INSNS (36),          /* fp_div_df */
999      COSTS_N_INSNS (10),          /* int_mult_si */
1000      COSTS_N_INSNS (10),          /* int_mult_di */
1001      COSTS_N_INSNS (69),          /* int_div_si */
1002      COSTS_N_INSNS (69),          /* int_div_di */
1003                       2,          /* branch_cost */
1004                       6           /* memory_latency */
1005   },
1006   { /* R4100 */
1007     DEFAULT_COSTS
1008   },
1009   { /* R4111 */
1010     DEFAULT_COSTS
1011   },
1012   { /* R4120 */
1013     DEFAULT_COSTS
1014   },
1015   { /* R4130 */
1016     /* The only costs that appear to be updated here are
1017        integer multiplication.  */
1018     SOFT_FP_COSTS,
1019     COSTS_N_INSNS (4),            /* int_mult_si */
1020     COSTS_N_INSNS (6),            /* int_mult_di */
1021     COSTS_N_INSNS (69),           /* int_div_si */
1022     COSTS_N_INSNS (69),           /* int_div_di */
1023                      1,           /* branch_cost */
1024                      4            /* memory_latency */
1025   },
1026   { /* R4300 */
1027     DEFAULT_COSTS
1028   },
1029   { /* R4600 */
1030     DEFAULT_COSTS
1031   },
1032   { /* R4650 */
1033     DEFAULT_COSTS
1034   },
1035   { /* R5000 */
1036     COSTS_N_INSNS (6),            /* fp_add */
1037     COSTS_N_INSNS (4),            /* fp_mult_sf */
1038     COSTS_N_INSNS (5),            /* fp_mult_df */
1039     COSTS_N_INSNS (23),           /* fp_div_sf */
1040     COSTS_N_INSNS (36),           /* fp_div_df */
1041     COSTS_N_INSNS (5),            /* int_mult_si */
1042     COSTS_N_INSNS (5),            /* int_mult_di */
1043     COSTS_N_INSNS (36),           /* int_div_si */
1044     COSTS_N_INSNS (36),           /* int_div_di */
1045                      1,           /* branch_cost */
1046                      4            /* memory_latency */
1047   },
1048   { /* R5400 */
1049     COSTS_N_INSNS (6),            /* fp_add */
1050     COSTS_N_INSNS (5),            /* fp_mult_sf */
1051     COSTS_N_INSNS (6),            /* fp_mult_df */
1052     COSTS_N_INSNS (30),           /* fp_div_sf */
1053     COSTS_N_INSNS (59),           /* fp_div_df */
1054     COSTS_N_INSNS (3),            /* int_mult_si */
1055     COSTS_N_INSNS (4),            /* int_mult_di */
1056     COSTS_N_INSNS (42),           /* int_div_si */
1057     COSTS_N_INSNS (74),           /* int_div_di */
1058                      1,           /* branch_cost */
1059                      4            /* memory_latency */
1060   },
1061   { /* R5500 */
1062     COSTS_N_INSNS (6),            /* fp_add */
1063     COSTS_N_INSNS (5),            /* fp_mult_sf */
1064     COSTS_N_INSNS (6),            /* fp_mult_df */
1065     COSTS_N_INSNS (30),           /* fp_div_sf */
1066     COSTS_N_INSNS (59),           /* fp_div_df */
1067     COSTS_N_INSNS (5),            /* int_mult_si */
1068     COSTS_N_INSNS (9),            /* int_mult_di */
1069     COSTS_N_INSNS (42),           /* int_div_si */
1070     COSTS_N_INSNS (74),           /* int_div_di */
1071                      1,           /* branch_cost */
1072                      4            /* memory_latency */
1073   },
1074   { /* R7000 */
1075     /* The only costs that are changed here are
1076        integer multiplication.  */
1077     COSTS_N_INSNS (6),            /* fp_add */
1078     COSTS_N_INSNS (7),            /* fp_mult_sf */
1079     COSTS_N_INSNS (8),            /* fp_mult_df */
1080     COSTS_N_INSNS (23),           /* fp_div_sf */
1081     COSTS_N_INSNS (36),           /* fp_div_df */
1082     COSTS_N_INSNS (5),            /* int_mult_si */
1083     COSTS_N_INSNS (9),            /* int_mult_di */
1084     COSTS_N_INSNS (69),           /* int_div_si */
1085     COSTS_N_INSNS (69),           /* int_div_di */
1086                      1,           /* branch_cost */
1087                      4            /* memory_latency */
1088   },
1089   { /* R8000 */
1090     DEFAULT_COSTS
1091   },
1092   { /* R9000 */
1093     /* The only costs that are changed here are
1094        integer multiplication.  */
1095     COSTS_N_INSNS (6),            /* fp_add */
1096     COSTS_N_INSNS (7),            /* fp_mult_sf */
1097     COSTS_N_INSNS (8),            /* fp_mult_df */
1098     COSTS_N_INSNS (23),           /* fp_div_sf */
1099     COSTS_N_INSNS (36),           /* fp_div_df */
1100     COSTS_N_INSNS (3),            /* int_mult_si */
1101     COSTS_N_INSNS (8),            /* int_mult_di */
1102     COSTS_N_INSNS (69),           /* int_div_si */
1103     COSTS_N_INSNS (69),           /* int_div_di */
1104                      1,           /* branch_cost */
1105                      4            /* memory_latency */
1106   },
1107   { /* R1x000 */
1108     COSTS_N_INSNS (2),            /* fp_add */
1109     COSTS_N_INSNS (2),            /* fp_mult_sf */
1110     COSTS_N_INSNS (2),            /* fp_mult_df */
1111     COSTS_N_INSNS (12),           /* fp_div_sf */
1112     COSTS_N_INSNS (19),           /* fp_div_df */
1113     COSTS_N_INSNS (5),            /* int_mult_si */
1114     COSTS_N_INSNS (9),            /* int_mult_di */
1115     COSTS_N_INSNS (34),           /* int_div_si */
1116     COSTS_N_INSNS (66),           /* int_div_di */
1117                      1,           /* branch_cost */
1118                      4            /* memory_latency */
1119   },
1120   { /* SB1 */
1121     /* These costs are the same as the SB-1A below.  */
1122     COSTS_N_INSNS (4),            /* fp_add */
1123     COSTS_N_INSNS (4),            /* fp_mult_sf */
1124     COSTS_N_INSNS (4),            /* fp_mult_df */
1125     COSTS_N_INSNS (24),           /* fp_div_sf */
1126     COSTS_N_INSNS (32),           /* fp_div_df */
1127     COSTS_N_INSNS (3),            /* int_mult_si */
1128     COSTS_N_INSNS (4),            /* int_mult_di */
1129     COSTS_N_INSNS (36),           /* int_div_si */
1130     COSTS_N_INSNS (68),           /* int_div_di */
1131                      1,           /* branch_cost */
1132                      4            /* memory_latency */
1133   },
1134   { /* SB1-A */
1135     /* These costs are the same as the SB-1 above.  */
1136     COSTS_N_INSNS (4),            /* fp_add */
1137     COSTS_N_INSNS (4),            /* fp_mult_sf */
1138     COSTS_N_INSNS (4),            /* fp_mult_df */
1139     COSTS_N_INSNS (24),           /* fp_div_sf */
1140     COSTS_N_INSNS (32),           /* fp_div_df */
1141     COSTS_N_INSNS (3),            /* int_mult_si */
1142     COSTS_N_INSNS (4),            /* int_mult_di */
1143     COSTS_N_INSNS (36),           /* int_div_si */
1144     COSTS_N_INSNS (68),           /* int_div_di */
1145                      1,           /* branch_cost */
1146                      4            /* memory_latency */
1147   },
1148   { /* SR71000 */
1149     DEFAULT_COSTS
1150   },
1151   { /* XLR */
1152     SOFT_FP_COSTS,
1153     COSTS_N_INSNS (8),            /* int_mult_si */
1154     COSTS_N_INSNS (8),            /* int_mult_di */
1155     COSTS_N_INSNS (72),           /* int_div_si */
1156     COSTS_N_INSNS (72),           /* int_div_di */
1157                      1,           /* branch_cost */
1158                      4            /* memory_latency */
1159   }
1160 };
1161 \f
1162 static rtx mips_find_pic_call_symbol (rtx, rtx);
1163 \f
1164 /* This hash table keeps track of implicit "mips16" and "nomips16" attributes
1165    for -mflip_mips16.  It maps decl names onto a boolean mode setting.  */
1166 struct GTY (())  mflip_mips16_entry {
1167   const char *name;
1168   bool mips16_p;
1169 };
1170 static GTY ((param_is (struct mflip_mips16_entry))) htab_t mflip_mips16_htab;
1171
1172 /* Hash table callbacks for mflip_mips16_htab.  */
1173
1174 static hashval_t
1175 mflip_mips16_htab_hash (const void *entry)
1176 {
1177   return htab_hash_string (((const struct mflip_mips16_entry *) entry)->name);
1178 }
1179
1180 static int
1181 mflip_mips16_htab_eq (const void *entry, const void *name)
1182 {
1183   return strcmp (((const struct mflip_mips16_entry *) entry)->name,
1184                  (const char *) name) == 0;
1185 }
1186
1187 /* True if -mflip-mips16 should next add an attribute for the default MIPS16
1188    mode, false if it should next add an attribute for the opposite mode.  */
1189 static GTY(()) bool mips16_flipper;
1190
1191 /* DECL is a function that needs a default "mips16" or "nomips16" attribute
1192    for -mflip-mips16.  Return true if it should use "mips16" and false if
1193    it should use "nomips16".  */
1194
1195 static bool
1196 mflip_mips16_use_mips16_p (tree decl)
1197 {
1198   struct mflip_mips16_entry *entry;
1199   const char *name;
1200   hashval_t hash;
1201   void **slot;
1202
1203   /* Use the opposite of the command-line setting for anonymous decls.  */
1204   if (!DECL_NAME (decl))
1205     return !mips_base_mips16;
1206
1207   if (!mflip_mips16_htab)
1208     mflip_mips16_htab = htab_create_ggc (37, mflip_mips16_htab_hash,
1209                                          mflip_mips16_htab_eq, NULL);
1210
1211   name = IDENTIFIER_POINTER (DECL_NAME (decl));
1212   hash = htab_hash_string (name);
1213   slot = htab_find_slot_with_hash (mflip_mips16_htab, name, hash, INSERT);
1214   entry = (struct mflip_mips16_entry *) *slot;
1215   if (!entry)
1216     {
1217       mips16_flipper = !mips16_flipper;
1218       entry = GGC_NEW (struct mflip_mips16_entry);
1219       entry->name = name;
1220       entry->mips16_p = mips16_flipper ? !mips_base_mips16 : mips_base_mips16;
1221       *slot = entry;
1222     }
1223   return entry->mips16_p;
1224 }
1225 \f
1226 /* Predicates to test for presence of "near" and "far"/"long_call"
1227    attributes on the given TYPE.  */
1228
1229 static bool
1230 mips_near_type_p (const_tree type)
1231 {
1232   return lookup_attribute ("near", TYPE_ATTRIBUTES (type)) != NULL;
1233 }
1234
1235 static bool
1236 mips_far_type_p (const_tree type)
1237 {
1238   return (lookup_attribute ("long_call", TYPE_ATTRIBUTES (type)) != NULL
1239           || lookup_attribute ("far", TYPE_ATTRIBUTES (type)) != NULL);
1240 }
1241
1242 /* Similar predicates for "mips16"/"nomips16" function attributes.  */
1243
1244 static bool
1245 mips_mips16_decl_p (const_tree decl)
1246 {
1247   return lookup_attribute ("mips16", DECL_ATTRIBUTES (decl)) != NULL;
1248 }
1249
1250 static bool
1251 mips_nomips16_decl_p (const_tree decl)
1252 {
1253   return lookup_attribute ("nomips16", DECL_ATTRIBUTES (decl)) != NULL;
1254 }
1255
1256 /* Check if the interrupt attribute is set for a function.  */
1257
1258 static bool
1259 mips_interrupt_type_p (tree type)
1260 {
1261   return lookup_attribute ("interrupt", TYPE_ATTRIBUTES (type)) != NULL;
1262 }
1263
1264 /* Check if the attribute to use shadow register set is set for a function.  */
1265
1266 static bool
1267 mips_use_shadow_register_set_p (tree type)
1268 {
1269   return lookup_attribute ("use_shadow_register_set",
1270                            TYPE_ATTRIBUTES (type)) != NULL;
1271 }
1272
1273 /* Check if the attribute to keep interrupts masked is set for a function.  */
1274
1275 static bool
1276 mips_keep_interrupts_masked_p (tree type)
1277 {
1278   return lookup_attribute ("keep_interrupts_masked",
1279                            TYPE_ATTRIBUTES (type)) != NULL;
1280 }
1281
1282 /* Check if the attribute to use debug exception return is set for
1283    a function.  */
1284
1285 static bool
1286 mips_use_debug_exception_return_p (tree type)
1287 {
1288   return lookup_attribute ("use_debug_exception_return",
1289                            TYPE_ATTRIBUTES (type)) != NULL;
1290 }
1291
1292 /* Return true if function DECL is a MIPS16 function.  Return the ambient
1293    setting if DECL is null.  */
1294
1295 static bool
1296 mips_use_mips16_mode_p (tree decl)
1297 {
1298   if (decl)
1299     {
1300       /* Nested functions must use the same frame pointer as their
1301          parent and must therefore use the same ISA mode.  */
1302       tree parent = decl_function_context (decl);
1303       if (parent)
1304         decl = parent;
1305       if (mips_mips16_decl_p (decl))
1306         return true;
1307       if (mips_nomips16_decl_p (decl))
1308         return false;
1309     }
1310   return mips_base_mips16;
1311 }
1312
1313 /* Implement TARGET_COMP_TYPE_ATTRIBUTES.  */
1314
1315 static int
1316 mips_comp_type_attributes (const_tree type1, const_tree type2)
1317 {
1318   /* Disallow mixed near/far attributes.  */
1319   if (mips_far_type_p (type1) && mips_near_type_p (type2))
1320     return 0;
1321   if (mips_near_type_p (type1) && mips_far_type_p (type2))
1322     return 0;
1323   return 1;
1324 }
1325
1326 /* Implement TARGET_INSERT_ATTRIBUTES.  */
1327
1328 static void
1329 mips_insert_attributes (tree decl, tree *attributes)
1330 {
1331   const char *name;
1332   bool mips16_p, nomips16_p;
1333
1334   /* Check for "mips16" and "nomips16" attributes.  */
1335   mips16_p = lookup_attribute ("mips16", *attributes) != NULL;
1336   nomips16_p = lookup_attribute ("nomips16", *attributes) != NULL;
1337   if (TREE_CODE (decl) != FUNCTION_DECL)
1338     {
1339       if (mips16_p)
1340         error ("%qs attribute only applies to functions", "mips16");
1341       if (nomips16_p)
1342         error ("%qs attribute only applies to functions", "nomips16");
1343     }
1344   else
1345     {
1346       mips16_p |= mips_mips16_decl_p (decl);
1347       nomips16_p |= mips_nomips16_decl_p (decl);
1348       if (mips16_p || nomips16_p)
1349         {
1350           /* DECL cannot be simultaneously "mips16" and "nomips16".  */
1351           if (mips16_p && nomips16_p)
1352             error ("%qE cannot have both %<mips16%> and "
1353                    "%<nomips16%> attributes",
1354                    DECL_NAME (decl));
1355         }
1356       else if (TARGET_FLIP_MIPS16 && !DECL_ARTIFICIAL (decl))
1357         {
1358           /* Implement -mflip-mips16.  If DECL has neither a "nomips16" nor a
1359              "mips16" attribute, arbitrarily pick one.  We must pick the same
1360              setting for duplicate declarations of a function.  */
1361           name = mflip_mips16_use_mips16_p (decl) ? "mips16" : "nomips16";
1362           *attributes = tree_cons (get_identifier (name), NULL, *attributes);
1363         }
1364     }
1365 }
1366
1367 /* Implement TARGET_MERGE_DECL_ATTRIBUTES.  */
1368
1369 static tree
1370 mips_merge_decl_attributes (tree olddecl, tree newdecl)
1371 {
1372   /* The decls' "mips16" and "nomips16" attributes must match exactly.  */
1373   if (mips_mips16_decl_p (olddecl) != mips_mips16_decl_p (newdecl))
1374     error ("%qE redeclared with conflicting %qs attributes",
1375            DECL_NAME (newdecl), "mips16");
1376   if (mips_nomips16_decl_p (olddecl) != mips_nomips16_decl_p (newdecl))
1377     error ("%qE redeclared with conflicting %qs attributes",
1378            DECL_NAME (newdecl), "nomips16");
1379
1380   return merge_attributes (DECL_ATTRIBUTES (olddecl),
1381                            DECL_ATTRIBUTES (newdecl));
1382 }
1383 \f
1384 /* If X is a PLUS of a CONST_INT, return the two terms in *BASE_PTR
1385    and *OFFSET_PTR.  Return X in *BASE_PTR and 0 in *OFFSET_PTR otherwise.  */
1386
1387 static void
1388 mips_split_plus (rtx x, rtx *base_ptr, HOST_WIDE_INT *offset_ptr)
1389 {
1390   if (GET_CODE (x) == PLUS && CONST_INT_P (XEXP (x, 1)))
1391     {
1392       *base_ptr = XEXP (x, 0);
1393       *offset_ptr = INTVAL (XEXP (x, 1));
1394     }
1395   else
1396     {
1397       *base_ptr = x;
1398       *offset_ptr = 0;
1399     }
1400 }
1401 \f
1402 static unsigned int mips_build_integer (struct mips_integer_op *,
1403                                         unsigned HOST_WIDE_INT);
1404
1405 /* A subroutine of mips_build_integer, with the same interface.
1406    Assume that the final action in the sequence should be a left shift.  */
1407
1408 static unsigned int
1409 mips_build_shift (struct mips_integer_op *codes, HOST_WIDE_INT value)
1410 {
1411   unsigned int i, shift;
1412
1413   /* Shift VALUE right until its lowest bit is set.  Shift arithmetically
1414      since signed numbers are easier to load than unsigned ones.  */
1415   shift = 0;
1416   while ((value & 1) == 0)
1417     value /= 2, shift++;
1418
1419   i = mips_build_integer (codes, value);
1420   codes[i].code = ASHIFT;
1421   codes[i].value = shift;
1422   return i + 1;
1423 }
1424
1425 /* As for mips_build_shift, but assume that the final action will be
1426    an IOR or PLUS operation.  */
1427
1428 static unsigned int
1429 mips_build_lower (struct mips_integer_op *codes, unsigned HOST_WIDE_INT value)
1430 {
1431   unsigned HOST_WIDE_INT high;
1432   unsigned int i;
1433
1434   high = value & ~(unsigned HOST_WIDE_INT) 0xffff;
1435   if (!LUI_OPERAND (high) && (value & 0x18000) == 0x18000)
1436     {
1437       /* The constant is too complex to load with a simple LUI/ORI pair,
1438          so we want to give the recursive call as many trailing zeros as
1439          possible.  In this case, we know bit 16 is set and that the
1440          low 16 bits form a negative number.  If we subtract that number
1441          from VALUE, we will clear at least the lowest 17 bits, maybe more.  */
1442       i = mips_build_integer (codes, CONST_HIGH_PART (value));
1443       codes[i].code = PLUS;
1444       codes[i].value = CONST_LOW_PART (value);
1445     }
1446   else
1447     {
1448       /* Either this is a simple LUI/ORI pair, or clearing the lowest 16
1449          bits gives a value with at least 17 trailing zeros.  */
1450       i = mips_build_integer (codes, high);
1451       codes[i].code = IOR;
1452       codes[i].value = value & 0xffff;
1453     }
1454   return i + 1;
1455 }
1456
1457 /* Fill CODES with a sequence of rtl operations to load VALUE.
1458    Return the number of operations needed.  */
1459
1460 static unsigned int
1461 mips_build_integer (struct mips_integer_op *codes,
1462                     unsigned HOST_WIDE_INT value)
1463 {
1464   if (SMALL_OPERAND (value)
1465       || SMALL_OPERAND_UNSIGNED (value)
1466       || LUI_OPERAND (value))
1467     {
1468       /* The value can be loaded with a single instruction.  */
1469       codes[0].code = UNKNOWN;
1470       codes[0].value = value;
1471       return 1;
1472     }
1473   else if ((value & 1) != 0 || LUI_OPERAND (CONST_HIGH_PART (value)))
1474     {
1475       /* Either the constant is a simple LUI/ORI combination or its
1476          lowest bit is set.  We don't want to shift in this case.  */
1477       return mips_build_lower (codes, value);
1478     }
1479   else if ((value & 0xffff) == 0)
1480     {
1481       /* The constant will need at least three actions.  The lowest
1482          16 bits are clear, so the final action will be a shift.  */
1483       return mips_build_shift (codes, value);
1484     }
1485   else
1486     {
1487       /* The final action could be a shift, add or inclusive OR.
1488          Rather than use a complex condition to select the best
1489          approach, try both mips_build_shift and mips_build_lower
1490          and pick the one that gives the shortest sequence.
1491          Note that this case is only used once per constant.  */
1492       struct mips_integer_op alt_codes[MIPS_MAX_INTEGER_OPS];
1493       unsigned int cost, alt_cost;
1494
1495       cost = mips_build_shift (codes, value);
1496       alt_cost = mips_build_lower (alt_codes, value);
1497       if (alt_cost < cost)
1498         {
1499           memcpy (codes, alt_codes, alt_cost * sizeof (codes[0]));
1500           cost = alt_cost;
1501         }
1502       return cost;
1503     }
1504 }
1505 \f
1506 /* Return true if symbols of type TYPE require a GOT access.  */
1507
1508 static bool
1509 mips_got_symbol_type_p (enum mips_symbol_type type)
1510 {
1511   switch (type)
1512     {
1513     case SYMBOL_GOT_PAGE_OFST:
1514     case SYMBOL_GOT_DISP:
1515       return true;
1516
1517     default:
1518       return false;
1519     }
1520 }
1521
1522 /* Return true if X is a thread-local symbol.  */
1523
1524 static bool
1525 mips_tls_symbol_p (rtx x)
1526 {
1527   return GET_CODE (x) == SYMBOL_REF && SYMBOL_REF_TLS_MODEL (x) != 0;
1528 }
1529
1530 /* Return true if SYMBOL_REF X is associated with a global symbol
1531    (in the STB_GLOBAL sense).  */
1532
1533 static bool
1534 mips_global_symbol_p (const_rtx x)
1535 {
1536   const_tree decl = SYMBOL_REF_DECL (x);
1537
1538   if (!decl)
1539     return !SYMBOL_REF_LOCAL_P (x) || SYMBOL_REF_EXTERNAL_P (x);
1540
1541   /* Weakref symbols are not TREE_PUBLIC, but their targets are global
1542      or weak symbols.  Relocations in the object file will be against
1543      the target symbol, so it's that symbol's binding that matters here.  */
1544   return DECL_P (decl) && (TREE_PUBLIC (decl) || DECL_WEAK (decl));
1545 }
1546
1547 /* Return true if function X is a libgcc MIPS16 stub function.  */
1548
1549 static bool
1550 mips16_stub_function_p (const_rtx x)
1551 {
1552   return (GET_CODE (x) == SYMBOL_REF
1553           && strncmp (XSTR (x, 0), "__mips16_", 9) == 0);
1554 }
1555
1556 /* Return true if function X is a locally-defined and locally-binding
1557    MIPS16 function.  */
1558
1559 static bool
1560 mips16_local_function_p (const_rtx x)
1561 {
1562   return (GET_CODE (x) == SYMBOL_REF
1563           && SYMBOL_REF_LOCAL_P (x)
1564           && !SYMBOL_REF_EXTERNAL_P (x)
1565           && mips_use_mips16_mode_p (SYMBOL_REF_DECL (x)));
1566 }
1567
1568 /* Return true if SYMBOL_REF X binds locally.  */
1569
1570 static bool
1571 mips_symbol_binds_local_p (const_rtx x)
1572 {
1573   return (SYMBOL_REF_DECL (x)
1574           ? targetm.binds_local_p (SYMBOL_REF_DECL (x))
1575           : SYMBOL_REF_LOCAL_P (x));
1576 }
1577
1578 /* Return true if rtx constants of mode MODE should be put into a small
1579    data section.  */
1580
1581 static bool
1582 mips_rtx_constant_in_small_data_p (enum machine_mode mode)
1583 {
1584   return (!TARGET_EMBEDDED_DATA
1585           && TARGET_LOCAL_SDATA
1586           && GET_MODE_SIZE (mode) <= mips_small_data_threshold);
1587 }
1588
1589 /* Return true if X should not be moved directly into register $25.
1590    We need this because many versions of GAS will treat "la $25,foo" as
1591    part of a call sequence and so allow a global "foo" to be lazily bound.  */
1592
1593 bool
1594 mips_dangerous_for_la25_p (rtx x)
1595 {
1596   return (!TARGET_EXPLICIT_RELOCS
1597           && TARGET_USE_GOT
1598           && GET_CODE (x) == SYMBOL_REF
1599           && mips_global_symbol_p (x));
1600 }
1601
1602 /* Return true if calls to X might need $25 to be valid on entry.  */
1603
1604 bool
1605 mips_use_pic_fn_addr_reg_p (const_rtx x)
1606 {
1607   if (!TARGET_USE_PIC_FN_ADDR_REG)
1608     return false;
1609
1610   /* MIPS16 stub functions are guaranteed not to use $25.  */
1611   if (mips16_stub_function_p (x))
1612     return false;
1613
1614   if (GET_CODE (x) == SYMBOL_REF)
1615     {
1616       /* If PLTs and copy relocations are available, the static linker
1617          will make sure that $25 is valid on entry to the target function.  */
1618       if (TARGET_ABICALLS_PIC0)
1619         return false;
1620
1621       /* Locally-defined functions use absolute accesses to set up
1622          the global pointer.  */
1623       if (TARGET_ABSOLUTE_ABICALLS
1624           && mips_symbol_binds_local_p (x)
1625           && !SYMBOL_REF_EXTERNAL_P (x))
1626         return false;
1627     }
1628
1629   return true;
1630 }
1631
1632 /* Return the method that should be used to access SYMBOL_REF or
1633    LABEL_REF X in context CONTEXT.  */
1634
1635 static enum mips_symbol_type
1636 mips_classify_symbol (const_rtx x, enum mips_symbol_context context)
1637 {
1638   if (TARGET_RTP_PIC)
1639     return SYMBOL_GOT_DISP;
1640
1641   if (GET_CODE (x) == LABEL_REF)
1642     {
1643       /* LABEL_REFs are used for jump tables as well as text labels.
1644          Only return SYMBOL_PC_RELATIVE if we know the label is in
1645          the text section.  */
1646       if (TARGET_MIPS16_SHORT_JUMP_TABLES)
1647         return SYMBOL_PC_RELATIVE;
1648
1649       if (TARGET_ABICALLS && !TARGET_ABSOLUTE_ABICALLS)
1650         return SYMBOL_GOT_PAGE_OFST;
1651
1652       return SYMBOL_ABSOLUTE;
1653     }
1654
1655   gcc_assert (GET_CODE (x) == SYMBOL_REF);
1656
1657   if (SYMBOL_REF_TLS_MODEL (x))
1658     return SYMBOL_TLS;
1659
1660   if (CONSTANT_POOL_ADDRESS_P (x))
1661     {
1662       if (TARGET_MIPS16_TEXT_LOADS)
1663         return SYMBOL_PC_RELATIVE;
1664
1665       if (TARGET_MIPS16_PCREL_LOADS && context == SYMBOL_CONTEXT_MEM)
1666         return SYMBOL_PC_RELATIVE;
1667
1668       if (mips_rtx_constant_in_small_data_p (get_pool_mode (x)))
1669         return SYMBOL_GP_RELATIVE;
1670     }
1671
1672   /* Do not use small-data accesses for weak symbols; they may end up
1673      being zero.  */
1674   if (TARGET_GPOPT && SYMBOL_REF_SMALL_P (x) && !SYMBOL_REF_WEAK (x))
1675     return SYMBOL_GP_RELATIVE;
1676
1677   /* Don't use GOT accesses for locally-binding symbols when -mno-shared
1678      is in effect.  */
1679   if (TARGET_ABICALLS_PIC2
1680       && !(TARGET_ABSOLUTE_ABICALLS && mips_symbol_binds_local_p (x)))
1681     {
1682       /* There are three cases to consider:
1683
1684             - o32 PIC (either with or without explicit relocs)
1685             - n32/n64 PIC without explicit relocs
1686             - n32/n64 PIC with explicit relocs
1687
1688          In the first case, both local and global accesses will use an
1689          R_MIPS_GOT16 relocation.  We must correctly predict which of
1690          the two semantics (local or global) the assembler and linker
1691          will apply.  The choice depends on the symbol's binding rather
1692          than its visibility.
1693
1694          In the second case, the assembler will not use R_MIPS_GOT16
1695          relocations, but it chooses between local and global accesses
1696          in the same way as for o32 PIC.
1697
1698          In the third case we have more freedom since both forms of
1699          access will work for any kind of symbol.  However, there seems
1700          little point in doing things differently.  */
1701       if (mips_global_symbol_p (x))
1702         return SYMBOL_GOT_DISP;
1703
1704       return SYMBOL_GOT_PAGE_OFST;
1705     }
1706
1707   if (TARGET_MIPS16_PCREL_LOADS && context != SYMBOL_CONTEXT_CALL)
1708     return SYMBOL_FORCE_TO_MEM;
1709
1710   return SYMBOL_ABSOLUTE;
1711 }
1712
1713 /* Classify the base of symbolic expression X, given that X appears in
1714    context CONTEXT.  */
1715
1716 static enum mips_symbol_type
1717 mips_classify_symbolic_expression (rtx x, enum mips_symbol_context context)
1718 {
1719   rtx offset;
1720
1721   split_const (x, &x, &offset);
1722   if (UNSPEC_ADDRESS_P (x))
1723     return UNSPEC_ADDRESS_TYPE (x);
1724
1725   return mips_classify_symbol (x, context);
1726 }
1727
1728 /* Return true if OFFSET is within the range [0, ALIGN), where ALIGN
1729    is the alignment in bytes of SYMBOL_REF X.  */
1730
1731 static bool
1732 mips_offset_within_alignment_p (rtx x, HOST_WIDE_INT offset)
1733 {
1734   HOST_WIDE_INT align;
1735
1736   align = SYMBOL_REF_DECL (x) ? DECL_ALIGN_UNIT (SYMBOL_REF_DECL (x)) : 1;
1737   return IN_RANGE (offset, 0, align - 1);
1738 }
1739
1740 /* Return true if X is a symbolic constant that can be used in context
1741    CONTEXT.  If it is, store the type of the symbol in *SYMBOL_TYPE.  */
1742
1743 bool
1744 mips_symbolic_constant_p (rtx x, enum mips_symbol_context context,
1745                           enum mips_symbol_type *symbol_type)
1746 {
1747   rtx offset;
1748
1749   split_const (x, &x, &offset);
1750   if (UNSPEC_ADDRESS_P (x))
1751     {
1752       *symbol_type = UNSPEC_ADDRESS_TYPE (x);
1753       x = UNSPEC_ADDRESS (x);
1754     }
1755   else if (GET_CODE (x) == SYMBOL_REF || GET_CODE (x) == LABEL_REF)
1756     {
1757       *symbol_type = mips_classify_symbol (x, context);
1758       if (*symbol_type == SYMBOL_TLS)
1759         return false;
1760     }
1761   else
1762     return false;
1763
1764   if (offset == const0_rtx)
1765     return true;
1766
1767   /* Check whether a nonzero offset is valid for the underlying
1768      relocations.  */
1769   switch (*symbol_type)
1770     {
1771     case SYMBOL_ABSOLUTE:
1772     case SYMBOL_FORCE_TO_MEM:
1773     case SYMBOL_32_HIGH:
1774     case SYMBOL_64_HIGH:
1775     case SYMBOL_64_MID:
1776     case SYMBOL_64_LOW:
1777       /* If the target has 64-bit pointers and the object file only
1778          supports 32-bit symbols, the values of those symbols will be
1779          sign-extended.  In this case we can't allow an arbitrary offset
1780          in case the 32-bit value X + OFFSET has a different sign from X.  */
1781       if (Pmode == DImode && !ABI_HAS_64BIT_SYMBOLS)
1782         return offset_within_block_p (x, INTVAL (offset));
1783
1784       /* In other cases the relocations can handle any offset.  */
1785       return true;
1786
1787     case SYMBOL_PC_RELATIVE:
1788       /* Allow constant pool references to be converted to LABEL+CONSTANT.
1789          In this case, we no longer have access to the underlying constant,
1790          but the original symbol-based access was known to be valid.  */
1791       if (GET_CODE (x) == LABEL_REF)
1792         return true;
1793
1794       /* Fall through.  */
1795
1796     case SYMBOL_GP_RELATIVE:
1797       /* Make sure that the offset refers to something within the
1798          same object block.  This should guarantee that the final
1799          PC- or GP-relative offset is within the 16-bit limit.  */
1800       return offset_within_block_p (x, INTVAL (offset));
1801
1802     case SYMBOL_GOT_PAGE_OFST:
1803     case SYMBOL_GOTOFF_PAGE:
1804       /* If the symbol is global, the GOT entry will contain the symbol's
1805          address, and we will apply a 16-bit offset after loading it.
1806          If the symbol is local, the linker should provide enough local
1807          GOT entries for a 16-bit offset, but larger offsets may lead
1808          to GOT overflow.  */
1809       return SMALL_INT (offset);
1810
1811     case SYMBOL_TPREL:
1812     case SYMBOL_DTPREL:
1813       /* There is no carry between the HI and LO REL relocations, so the
1814          offset is only valid if we know it won't lead to such a carry.  */
1815       return mips_offset_within_alignment_p (x, INTVAL (offset));
1816
1817     case SYMBOL_GOT_DISP:
1818     case SYMBOL_GOTOFF_DISP:
1819     case SYMBOL_GOTOFF_CALL:
1820     case SYMBOL_GOTOFF_LOADGP:
1821     case SYMBOL_TLSGD:
1822     case SYMBOL_TLSLDM:
1823     case SYMBOL_GOTTPREL:
1824     case SYMBOL_TLS:
1825     case SYMBOL_HALF:
1826       return false;
1827     }
1828   gcc_unreachable ();
1829 }
1830 \f
1831 /* Like mips_symbol_insns, but treat extended MIPS16 instructions as a
1832    single instruction.  We rely on the fact that, in the worst case,
1833    all instructions involved in a MIPS16 address calculation are usually
1834    extended ones.  */
1835
1836 static int
1837 mips_symbol_insns_1 (enum mips_symbol_type type, enum machine_mode mode)
1838 {
1839   switch (type)
1840     {
1841     case SYMBOL_ABSOLUTE:
1842       /* When using 64-bit symbols, we need 5 preparatory instructions,
1843          such as:
1844
1845              lui     $at,%highest(symbol)
1846              daddiu  $at,$at,%higher(symbol)
1847              dsll    $at,$at,16
1848              daddiu  $at,$at,%hi(symbol)
1849              dsll    $at,$at,16
1850
1851          The final address is then $at + %lo(symbol).  With 32-bit
1852          symbols we just need a preparatory LUI for normal mode and
1853          a preparatory LI and SLL for MIPS16.  */
1854       return ABI_HAS_64BIT_SYMBOLS ? 6 : TARGET_MIPS16 ? 3 : 2;
1855
1856     case SYMBOL_GP_RELATIVE:
1857       /* Treat GP-relative accesses as taking a single instruction on
1858          MIPS16 too; the copy of $gp can often be shared.  */
1859       return 1;
1860
1861     case SYMBOL_PC_RELATIVE:
1862       /* PC-relative constants can be only be used with ADDIUPC,
1863          DADDIUPC, LWPC and LDPC.  */
1864       if (mode == MAX_MACHINE_MODE
1865           || GET_MODE_SIZE (mode) == 4
1866           || GET_MODE_SIZE (mode) == 8)
1867         return 1;
1868
1869       /* The constant must be loaded using ADDIUPC or DADDIUPC first.  */
1870       return 0;
1871
1872     case SYMBOL_FORCE_TO_MEM:
1873       /* LEAs will be converted into constant-pool references by
1874          mips_reorg.  */
1875       if (mode == MAX_MACHINE_MODE)
1876         return 1;
1877
1878       /* The constant must be loaded and then dereferenced.  */
1879       return 0;
1880
1881     case SYMBOL_GOT_DISP:
1882       /* The constant will have to be loaded from the GOT before it
1883          is used in an address.  */
1884       if (mode != MAX_MACHINE_MODE)
1885         return 0;
1886
1887       /* Fall through.  */
1888
1889     case SYMBOL_GOT_PAGE_OFST:
1890       /* Unless -funit-at-a-time is in effect, we can't be sure whether the
1891          local/global classification is accurate.  The worst cases are:
1892
1893          (1) For local symbols when generating o32 or o64 code.  The assembler
1894              will use:
1895
1896                  lw           $at,%got(symbol)
1897                  nop
1898
1899              ...and the final address will be $at + %lo(symbol).
1900
1901          (2) For global symbols when -mxgot.  The assembler will use:
1902
1903                  lui     $at,%got_hi(symbol)
1904                  (d)addu $at,$at,$gp
1905
1906              ...and the final address will be $at + %got_lo(symbol).  */
1907       return 3;
1908
1909     case SYMBOL_GOTOFF_PAGE:
1910     case SYMBOL_GOTOFF_DISP:
1911     case SYMBOL_GOTOFF_CALL:
1912     case SYMBOL_GOTOFF_LOADGP:
1913     case SYMBOL_32_HIGH:
1914     case SYMBOL_64_HIGH:
1915     case SYMBOL_64_MID:
1916     case SYMBOL_64_LOW:
1917     case SYMBOL_TLSGD:
1918     case SYMBOL_TLSLDM:
1919     case SYMBOL_DTPREL:
1920     case SYMBOL_GOTTPREL:
1921     case SYMBOL_TPREL:
1922     case SYMBOL_HALF:
1923       /* A 16-bit constant formed by a single relocation, or a 32-bit
1924          constant formed from a high 16-bit relocation and a low 16-bit
1925          relocation.  Use mips_split_p to determine which.  32-bit
1926          constants need an "lui; addiu" sequence for normal mode and
1927          an "li; sll; addiu" sequence for MIPS16 mode.  */
1928       return !mips_split_p[type] ? 1 : TARGET_MIPS16 ? 3 : 2;
1929
1930     case SYMBOL_TLS:
1931       /* We don't treat a bare TLS symbol as a constant.  */
1932       return 0;
1933     }
1934   gcc_unreachable ();
1935 }
1936
1937 /* If MODE is MAX_MACHINE_MODE, return the number of instructions needed
1938    to load symbols of type TYPE into a register.  Return 0 if the given
1939    type of symbol cannot be used as an immediate operand.
1940
1941    Otherwise, return the number of instructions needed to load or store
1942    values of mode MODE to or from addresses of type TYPE.  Return 0 if
1943    the given type of symbol is not valid in addresses.
1944
1945    In both cases, treat extended MIPS16 instructions as two instructions.  */
1946
1947 static int
1948 mips_symbol_insns (enum mips_symbol_type type, enum machine_mode mode)
1949 {
1950   return mips_symbol_insns_1 (type, mode) * (TARGET_MIPS16 ? 2 : 1);
1951 }
1952 \f
1953 /* A for_each_rtx callback.  Stop the search if *X references a
1954    thread-local symbol.  */
1955
1956 static int
1957 mips_tls_symbol_ref_1 (rtx *x, void *data ATTRIBUTE_UNUSED)
1958 {
1959   return mips_tls_symbol_p (*x);
1960 }
1961
1962 /* Implement TARGET_CANNOT_FORCE_CONST_MEM.  */
1963
1964 static bool
1965 mips_cannot_force_const_mem (rtx x)
1966 {
1967   enum mips_symbol_type type;
1968   rtx base, offset;
1969
1970   /* There is no assembler syntax for expressing an address-sized
1971      high part.  */
1972   if (GET_CODE (x) == HIGH)
1973     return true;
1974
1975   /* As an optimization, reject constants that mips_legitimize_move
1976      can expand inline.
1977
1978      Suppose we have a multi-instruction sequence that loads constant C
1979      into register R.  If R does not get allocated a hard register, and
1980      R is used in an operand that allows both registers and memory
1981      references, reload will consider forcing C into memory and using
1982      one of the instruction's memory alternatives.  Returning false
1983      here will force it to use an input reload instead.  */
1984   if (CONST_INT_P (x) && LEGITIMATE_CONSTANT_P (x))
1985     return true;
1986
1987   split_const (x, &base, &offset);
1988   if (mips_symbolic_constant_p (base, SYMBOL_CONTEXT_LEA, &type)
1989       && type != SYMBOL_FORCE_TO_MEM)
1990     {
1991       /* The same optimization as for CONST_INT.  */
1992       if (SMALL_INT (offset) && mips_symbol_insns (type, MAX_MACHINE_MODE) > 0)
1993         return true;
1994
1995       /* If MIPS16 constant pools live in the text section, they should
1996          not refer to anything that might need run-time relocation.  */
1997       if (TARGET_MIPS16_PCREL_LOADS && mips_got_symbol_type_p (type))
1998         return true;
1999     }
2000
2001   /* TLS symbols must be computed by mips_legitimize_move.  */
2002   if (for_each_rtx (&x, &mips_tls_symbol_ref_1, NULL))
2003     return true;
2004
2005   return false;
2006 }
2007
2008 /* Implement TARGET_USE_BLOCKS_FOR_CONSTANT_P.  We can't use blocks for
2009    constants when we're using a per-function constant pool.  */
2010
2011 static bool
2012 mips_use_blocks_for_constant_p (enum machine_mode mode ATTRIBUTE_UNUSED,
2013                                 const_rtx x ATTRIBUTE_UNUSED)
2014 {
2015   return !TARGET_MIPS16_PCREL_LOADS;
2016 }
2017 \f
2018 /* Return true if register REGNO is a valid base register for mode MODE.
2019    STRICT_P is true if REG_OK_STRICT is in effect.  */
2020
2021 int
2022 mips_regno_mode_ok_for_base_p (int regno, enum machine_mode mode,
2023                                bool strict_p)
2024 {
2025   if (!HARD_REGISTER_NUM_P (regno))
2026     {
2027       if (!strict_p)
2028         return true;
2029       regno = reg_renumber[regno];
2030     }
2031
2032   /* These fake registers will be eliminated to either the stack or
2033      hard frame pointer, both of which are usually valid base registers.
2034      Reload deals with the cases where the eliminated form isn't valid.  */
2035   if (regno == ARG_POINTER_REGNUM || regno == FRAME_POINTER_REGNUM)
2036     return true;
2037
2038   /* In MIPS16 mode, the stack pointer can only address word and doubleword
2039      values, nothing smaller.  There are two problems here:
2040
2041        (a) Instantiating virtual registers can introduce new uses of the
2042            stack pointer.  If these virtual registers are valid addresses,
2043            the stack pointer should be too.
2044
2045        (b) Most uses of the stack pointer are not made explicit until
2046            FRAME_POINTER_REGNUM and ARG_POINTER_REGNUM have been eliminated.
2047            We don't know until that stage whether we'll be eliminating to the
2048            stack pointer (which needs the restriction) or the hard frame
2049            pointer (which doesn't).
2050
2051      All in all, it seems more consistent to only enforce this restriction
2052      during and after reload.  */
2053   if (TARGET_MIPS16 && regno == STACK_POINTER_REGNUM)
2054     return !strict_p || GET_MODE_SIZE (mode) == 4 || GET_MODE_SIZE (mode) == 8;
2055
2056   return TARGET_MIPS16 ? M16_REG_P (regno) : GP_REG_P (regno);
2057 }
2058
2059 /* Return true if X is a valid base register for mode MODE.
2060    STRICT_P is true if REG_OK_STRICT is in effect.  */
2061
2062 static bool
2063 mips_valid_base_register_p (rtx x, enum machine_mode mode, bool strict_p)
2064 {
2065   if (!strict_p && GET_CODE (x) == SUBREG)
2066     x = SUBREG_REG (x);
2067
2068   return (REG_P (x)
2069           && mips_regno_mode_ok_for_base_p (REGNO (x), mode, strict_p));
2070 }
2071
2072 /* Return true if, for every base register BASE_REG, (plus BASE_REG X)
2073    can address a value of mode MODE.  */
2074
2075 static bool
2076 mips_valid_offset_p (rtx x, enum machine_mode mode)
2077 {
2078   /* Check that X is a signed 16-bit number.  */
2079   if (!const_arith_operand (x, Pmode))
2080     return false;
2081
2082   /* We may need to split multiword moves, so make sure that every word
2083      is accessible.  */
2084   if (GET_MODE_SIZE (mode) > UNITS_PER_WORD
2085       && !SMALL_OPERAND (INTVAL (x) + GET_MODE_SIZE (mode) - UNITS_PER_WORD))
2086     return false;
2087
2088   return true;
2089 }
2090
2091 /* Return true if a LO_SUM can address a value of mode MODE when the
2092    LO_SUM symbol has type SYMBOL_TYPE.  */
2093
2094 static bool
2095 mips_valid_lo_sum_p (enum mips_symbol_type symbol_type, enum machine_mode mode)
2096 {
2097   /* Check that symbols of type SYMBOL_TYPE can be used to access values
2098      of mode MODE.  */
2099   if (mips_symbol_insns (symbol_type, mode) == 0)
2100     return false;
2101
2102   /* Check that there is a known low-part relocation.  */
2103   if (mips_lo_relocs[symbol_type] == NULL)
2104     return false;
2105
2106   /* We may need to split multiword moves, so make sure that each word
2107      can be accessed without inducing a carry.  This is mainly needed
2108      for o64, which has historically only guaranteed 64-bit alignment
2109      for 128-bit types.  */
2110   if (GET_MODE_SIZE (mode) > UNITS_PER_WORD
2111       && GET_MODE_BITSIZE (mode) > GET_MODE_ALIGNMENT (mode))
2112     return false;
2113
2114   return true;
2115 }
2116
2117 /* Return true if X is a valid address for machine mode MODE.  If it is,
2118    fill in INFO appropriately.  STRICT_P is true if REG_OK_STRICT is in
2119    effect.  */
2120
2121 static bool
2122 mips_classify_address (struct mips_address_info *info, rtx x,
2123                        enum machine_mode mode, bool strict_p)
2124 {
2125   switch (GET_CODE (x))
2126     {
2127     case REG:
2128     case SUBREG:
2129       info->type = ADDRESS_REG;
2130       info->reg = x;
2131       info->offset = const0_rtx;
2132       return mips_valid_base_register_p (info->reg, mode, strict_p);
2133
2134     case PLUS:
2135       info->type = ADDRESS_REG;
2136       info->reg = XEXP (x, 0);
2137       info->offset = XEXP (x, 1);
2138       return (mips_valid_base_register_p (info->reg, mode, strict_p)
2139               && mips_valid_offset_p (info->offset, mode));
2140
2141     case LO_SUM:
2142       info->type = ADDRESS_LO_SUM;
2143       info->reg = XEXP (x, 0);
2144       info->offset = XEXP (x, 1);
2145       /* We have to trust the creator of the LO_SUM to do something vaguely
2146          sane.  Target-independent code that creates a LO_SUM should also
2147          create and verify the matching HIGH.  Target-independent code that
2148          adds an offset to a LO_SUM must prove that the offset will not
2149          induce a carry.  Failure to do either of these things would be
2150          a bug, and we are not required to check for it here.  The MIPS
2151          backend itself should only create LO_SUMs for valid symbolic
2152          constants, with the high part being either a HIGH or a copy
2153          of _gp. */
2154       info->symbol_type
2155         = mips_classify_symbolic_expression (info->offset, SYMBOL_CONTEXT_MEM);
2156       return (mips_valid_base_register_p (info->reg, mode, strict_p)
2157               && mips_valid_lo_sum_p (info->symbol_type, mode));
2158
2159     case CONST_INT:
2160       /* Small-integer addresses don't occur very often, but they
2161          are legitimate if $0 is a valid base register.  */
2162       info->type = ADDRESS_CONST_INT;
2163       return !TARGET_MIPS16 && SMALL_INT (x);
2164
2165     case CONST:
2166     case LABEL_REF:
2167     case SYMBOL_REF:
2168       info->type = ADDRESS_SYMBOLIC;
2169       return (mips_symbolic_constant_p (x, SYMBOL_CONTEXT_MEM,
2170                                         &info->symbol_type)
2171               && mips_symbol_insns (info->symbol_type, mode) > 0
2172               && !mips_split_p[info->symbol_type]);
2173
2174     default:
2175       return false;
2176     }
2177 }
2178
2179 /* Implement TARGET_LEGITIMATE_ADDRESS_P.  */
2180
2181 static bool
2182 mips_legitimate_address_p (enum machine_mode mode, rtx x, bool strict_p)
2183 {
2184   struct mips_address_info addr;
2185
2186   return mips_classify_address (&addr, x, mode, strict_p);
2187 }
2188
2189 /* Return true if X is a legitimate $sp-based address for mode MDOE.  */
2190
2191 bool
2192 mips_stack_address_p (rtx x, enum machine_mode mode)
2193 {
2194   struct mips_address_info addr;
2195
2196   return (mips_classify_address (&addr, x, mode, false)
2197           && addr.type == ADDRESS_REG
2198           && addr.reg == stack_pointer_rtx);
2199 }
2200
2201 /* Return true if ADDR matches the pattern for the LWXS load scaled indexed
2202    address instruction.  Note that such addresses are not considered
2203    legitimate in the TARGET_LEGITIMATE_ADDRESS_P sense, because their use
2204    is so restricted.  */
2205
2206 static bool
2207 mips_lwxs_address_p (rtx addr)
2208 {
2209   if (ISA_HAS_LWXS
2210       && GET_CODE (addr) == PLUS
2211       && REG_P (XEXP (addr, 1)))
2212     {
2213       rtx offset = XEXP (addr, 0);
2214       if (GET_CODE (offset) == MULT
2215           && REG_P (XEXP (offset, 0))
2216           && CONST_INT_P (XEXP (offset, 1))
2217           && INTVAL (XEXP (offset, 1)) == 4)
2218         return true;
2219     }
2220   return false;
2221 }
2222 \f
2223 /* Return true if a value at OFFSET bytes from base register BASE can be
2224    accessed using an unextended MIPS16 instruction.  MODE is the mode of
2225    the value.
2226
2227    Usually the offset in an unextended instruction is a 5-bit field.
2228    The offset is unsigned and shifted left once for LH and SH, twice
2229    for LW and SW, and so on.  An exception is LWSP and SWSP, which have
2230    an 8-bit immediate field that's shifted left twice.  */
2231
2232 static bool
2233 mips16_unextended_reference_p (enum machine_mode mode, rtx base,
2234                                unsigned HOST_WIDE_INT offset)
2235 {
2236   if (offset % GET_MODE_SIZE (mode) == 0)
2237     {
2238       if (GET_MODE_SIZE (mode) == 4 && base == stack_pointer_rtx)
2239         return offset < 256U * GET_MODE_SIZE (mode);
2240       return offset < 32U * GET_MODE_SIZE (mode);
2241     }
2242   return false;
2243 }
2244
2245 /* Return the number of instructions needed to load or store a value
2246    of mode MODE at address X.  Return 0 if X isn't valid for MODE.
2247    Assume that multiword moves may need to be split into word moves
2248    if MIGHT_SPLIT_P, otherwise assume that a single load or store is
2249    enough.
2250
2251    For MIPS16 code, count extended instructions as two instructions.  */
2252
2253 int
2254 mips_address_insns (rtx x, enum machine_mode mode, bool might_split_p)
2255 {
2256   struct mips_address_info addr;
2257   int factor;
2258
2259   /* BLKmode is used for single unaligned loads and stores and should
2260      not count as a multiword mode.  (GET_MODE_SIZE (BLKmode) is pretty
2261      meaningless, so we have to single it out as a special case one way
2262      or the other.)  */
2263   if (mode != BLKmode && might_split_p)
2264     factor = (GET_MODE_SIZE (mode) + UNITS_PER_WORD - 1) / UNITS_PER_WORD;
2265   else
2266     factor = 1;
2267
2268   if (mips_classify_address (&addr, x, mode, false))
2269     switch (addr.type)
2270       {
2271       case ADDRESS_REG:
2272         if (TARGET_MIPS16
2273             && !mips16_unextended_reference_p (mode, addr.reg,
2274                                                UINTVAL (addr.offset)))
2275           return factor * 2;
2276         return factor;
2277
2278       case ADDRESS_LO_SUM:
2279         return TARGET_MIPS16 ? factor * 2 : factor;
2280
2281       case ADDRESS_CONST_INT:
2282         return factor;
2283
2284       case ADDRESS_SYMBOLIC:
2285         return factor * mips_symbol_insns (addr.symbol_type, mode);
2286       }
2287   return 0;
2288 }
2289
2290 /* Return the number of instructions needed to load constant X.
2291    Return 0 if X isn't a valid constant.  */
2292
2293 int
2294 mips_const_insns (rtx x)
2295 {
2296   struct mips_integer_op codes[MIPS_MAX_INTEGER_OPS];
2297   enum mips_symbol_type symbol_type;
2298   rtx offset;
2299
2300   switch (GET_CODE (x))
2301     {
2302     case HIGH:
2303       if (!mips_symbolic_constant_p (XEXP (x, 0), SYMBOL_CONTEXT_LEA,
2304                                      &symbol_type)
2305           || !mips_split_p[symbol_type])
2306         return 0;
2307
2308       /* This is simply an LUI for normal mode.  It is an extended
2309          LI followed by an extended SLL for MIPS16.  */
2310       return TARGET_MIPS16 ? 4 : 1;
2311
2312     case CONST_INT:
2313       if (TARGET_MIPS16)
2314         /* Unsigned 8-bit constants can be loaded using an unextended
2315            LI instruction.  Unsigned 16-bit constants can be loaded
2316            using an extended LI.  Negative constants must be loaded
2317            using LI and then negated.  */
2318         return (IN_RANGE (INTVAL (x), 0, 255) ? 1
2319                 : SMALL_OPERAND_UNSIGNED (INTVAL (x)) ? 2
2320                 : IN_RANGE (-INTVAL (x), 0, 255) ? 2
2321                 : SMALL_OPERAND_UNSIGNED (-INTVAL (x)) ? 3
2322                 : 0);
2323
2324       return mips_build_integer (codes, INTVAL (x));
2325
2326     case CONST_DOUBLE:
2327     case CONST_VECTOR:
2328       /* Allow zeros for normal mode, where we can use $0.  */
2329       return !TARGET_MIPS16 && x == CONST0_RTX (GET_MODE (x)) ? 1 : 0;
2330
2331     case CONST:
2332       if (CONST_GP_P (x))
2333         return 1;
2334
2335       /* See if we can refer to X directly.  */
2336       if (mips_symbolic_constant_p (x, SYMBOL_CONTEXT_LEA, &symbol_type))
2337         return mips_symbol_insns (symbol_type, MAX_MACHINE_MODE);
2338
2339       /* Otherwise try splitting the constant into a base and offset.
2340          If the offset is a 16-bit value, we can load the base address
2341          into a register and then use (D)ADDIU to add in the offset.
2342          If the offset is larger, we can load the base and offset
2343          into separate registers and add them together with (D)ADDU.
2344          However, the latter is only possible before reload; during
2345          and after reload, we must have the option of forcing the
2346          constant into the pool instead.  */
2347       split_const (x, &x, &offset);
2348       if (offset != 0)
2349         {
2350           int n = mips_const_insns (x);
2351           if (n != 0)
2352             {
2353               if (SMALL_INT (offset))
2354                 return n + 1;
2355               else if (!targetm.cannot_force_const_mem (x))
2356                 return n + 1 + mips_build_integer (codes, INTVAL (offset));
2357             }
2358         }
2359       return 0;
2360
2361     case SYMBOL_REF:
2362     case LABEL_REF:
2363       return mips_symbol_insns (mips_classify_symbol (x, SYMBOL_CONTEXT_LEA),
2364                                 MAX_MACHINE_MODE);
2365
2366     default:
2367       return 0;
2368     }
2369 }
2370
2371 /* X is a doubleword constant that can be handled by splitting it into
2372    two words and loading each word separately.  Return the number of
2373    instructions required to do this.  */
2374
2375 int
2376 mips_split_const_insns (rtx x)
2377 {
2378   unsigned int low, high;
2379
2380   low = mips_const_insns (mips_subword (x, false));
2381   high = mips_const_insns (mips_subword (x, true));
2382   gcc_assert (low > 0 && high > 0);
2383   return low + high;
2384 }
2385
2386 /* Return the number of instructions needed to implement INSN,
2387    given that it loads from or stores to MEM.  Count extended
2388    MIPS16 instructions as two instructions.  */
2389
2390 int
2391 mips_load_store_insns (rtx mem, rtx insn)
2392 {
2393   enum machine_mode mode;
2394   bool might_split_p;
2395   rtx set;
2396
2397   gcc_assert (MEM_P (mem));
2398   mode = GET_MODE (mem);
2399
2400   /* Try to prove that INSN does not need to be split.  */
2401   might_split_p = true;
2402   if (GET_MODE_BITSIZE (mode) == 64)
2403     {
2404       set = single_set (insn);
2405       if (set && !mips_split_64bit_move_p (SET_DEST (set), SET_SRC (set)))
2406         might_split_p = false;
2407     }
2408
2409   return mips_address_insns (XEXP (mem, 0), mode, might_split_p);
2410 }
2411
2412 /* Return the number of instructions needed for an integer division.  */
2413
2414 int
2415 mips_idiv_insns (void)
2416 {
2417   int count;
2418
2419   count = 1;
2420   if (TARGET_CHECK_ZERO_DIV)
2421     {
2422       if (GENERATE_DIVIDE_TRAPS)
2423         count++;
2424       else
2425         count += 2;
2426     }
2427
2428   if (TARGET_FIX_R4000 || TARGET_FIX_R4400)
2429     count++;
2430   return count;
2431 }
2432 \f
2433 /* Emit a move from SRC to DEST.  Assume that the move expanders can
2434    handle all moves if !can_create_pseudo_p ().  The distinction is
2435    important because, unlike emit_move_insn, the move expanders know
2436    how to force Pmode objects into the constant pool even when the
2437    constant pool address is not itself legitimate.  */
2438
2439 rtx
2440 mips_emit_move (rtx dest, rtx src)
2441 {
2442   return (can_create_pseudo_p ()
2443           ? emit_move_insn (dest, src)
2444           : emit_move_insn_1 (dest, src));
2445 }
2446
2447 /* Emit an instruction of the form (set TARGET (CODE OP0 OP1)).  */
2448
2449 static void
2450 mips_emit_binary (enum rtx_code code, rtx target, rtx op0, rtx op1)
2451 {
2452   emit_insn (gen_rtx_SET (VOIDmode, target,
2453                           gen_rtx_fmt_ee (code, GET_MODE (target), op0, op1)));
2454 }
2455
2456 /* Compute (CODE OP0 OP1) and store the result in a new register
2457    of mode MODE.  Return that new register.  */
2458
2459 static rtx
2460 mips_force_binary (enum machine_mode mode, enum rtx_code code, rtx op0, rtx op1)
2461 {
2462   rtx reg;
2463
2464   reg = gen_reg_rtx (mode);
2465   mips_emit_binary (code, reg, op0, op1);
2466   return reg;
2467 }
2468
2469 /* Copy VALUE to a register and return that register.  If new pseudos
2470    are allowed, copy it into a new register, otherwise use DEST.  */
2471
2472 static rtx
2473 mips_force_temporary (rtx dest, rtx value)
2474 {
2475   if (can_create_pseudo_p ())
2476     return force_reg (Pmode, value);
2477   else
2478     {
2479       mips_emit_move (dest, value);
2480       return dest;
2481     }
2482 }
2483
2484 /* Emit a call sequence with call pattern PATTERN and return the call
2485    instruction itself (which is not necessarily the last instruction
2486    emitted).  ORIG_ADDR is the original, unlegitimized address,
2487    ADDR is the legitimized form, and LAZY_P is true if the call
2488    address is lazily-bound.  */
2489
2490 static rtx
2491 mips_emit_call_insn (rtx pattern, rtx orig_addr, rtx addr, bool lazy_p)
2492 {
2493   rtx insn, reg;
2494
2495   insn = emit_call_insn (pattern);
2496
2497   if (TARGET_MIPS16 && mips_use_pic_fn_addr_reg_p (orig_addr))
2498     {
2499       /* MIPS16 JALRs only take MIPS16 registers.  If the target
2500          function requires $25 to be valid on entry, we must copy it
2501          there separately.  The move instruction can be put in the
2502          call's delay slot.  */
2503       reg = gen_rtx_REG (Pmode, PIC_FUNCTION_ADDR_REGNUM);
2504       emit_insn_before (gen_move_insn (reg, addr), insn);
2505       use_reg (&CALL_INSN_FUNCTION_USAGE (insn), reg);
2506     }
2507
2508   if (lazy_p)
2509     /* Lazy-binding stubs require $gp to be valid on entry.  */
2510     use_reg (&CALL_INSN_FUNCTION_USAGE (insn), pic_offset_table_rtx);
2511
2512   if (TARGET_USE_GOT)
2513     {
2514       /* See the comment above load_call<mode> for details.  */
2515       use_reg (&CALL_INSN_FUNCTION_USAGE (insn),
2516                gen_rtx_REG (Pmode, GOT_VERSION_REGNUM));
2517       emit_insn (gen_update_got_version ());
2518     }
2519   return insn;
2520 }
2521 \f
2522 /* Wrap symbol or label BASE in an UNSPEC address of type SYMBOL_TYPE,
2523    then add CONST_INT OFFSET to the result.  */
2524
2525 static rtx
2526 mips_unspec_address_offset (rtx base, rtx offset,
2527                             enum mips_symbol_type symbol_type)
2528 {
2529   base = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, base),
2530                          UNSPEC_ADDRESS_FIRST + symbol_type);
2531   if (offset != const0_rtx)
2532     base = gen_rtx_PLUS (Pmode, base, offset);
2533   return gen_rtx_CONST (Pmode, base);
2534 }
2535
2536 /* Return an UNSPEC address with underlying address ADDRESS and symbol
2537    type SYMBOL_TYPE.  */
2538
2539 rtx
2540 mips_unspec_address (rtx address, enum mips_symbol_type symbol_type)
2541 {
2542   rtx base, offset;
2543
2544   split_const (address, &base, &offset);
2545   return mips_unspec_address_offset (base, offset, symbol_type);
2546 }
2547
2548 /* If OP is an UNSPEC address, return the address to which it refers,
2549    otherwise return OP itself.  */
2550
2551 static rtx
2552 mips_strip_unspec_address (rtx op)
2553 {
2554   rtx base, offset;
2555
2556   split_const (op, &base, &offset);
2557   if (UNSPEC_ADDRESS_P (base))
2558     op = plus_constant (UNSPEC_ADDRESS (base), INTVAL (offset));
2559   return op;
2560 }
2561
2562 /* If mips_unspec_address (ADDR, SYMBOL_TYPE) is a 32-bit value, add the
2563    high part to BASE and return the result.  Just return BASE otherwise.
2564    TEMP is as for mips_force_temporary.
2565
2566    The returned expression can be used as the first operand to a LO_SUM.  */
2567
2568 static rtx
2569 mips_unspec_offset_high (rtx temp, rtx base, rtx addr,
2570                          enum mips_symbol_type symbol_type)
2571 {
2572   if (mips_split_p[symbol_type])
2573     {
2574       addr = gen_rtx_HIGH (Pmode, mips_unspec_address (addr, symbol_type));
2575       addr = mips_force_temporary (temp, addr);
2576       base = mips_force_temporary (temp, gen_rtx_PLUS (Pmode, addr, base));
2577     }
2578   return base;
2579 }
2580 \f
2581 /* Return an instruction that copies $gp into register REG.  We want
2582    GCC to treat the register's value as constant, so that its value
2583    can be rematerialized on demand.  */
2584
2585 static rtx
2586 gen_load_const_gp (rtx reg)
2587 {
2588   return (Pmode == SImode
2589           ? gen_load_const_gp_si (reg)
2590           : gen_load_const_gp_di (reg));
2591 }
2592
2593 /* Return a pseudo register that contains the value of $gp throughout
2594    the current function.  Such registers are needed by MIPS16 functions,
2595    for which $gp itself is not a valid base register or addition operand.  */
2596
2597 static rtx
2598 mips16_gp_pseudo_reg (void)
2599 {
2600   if (cfun->machine->mips16_gp_pseudo_rtx == NULL_RTX)
2601     cfun->machine->mips16_gp_pseudo_rtx = gen_reg_rtx (Pmode);
2602
2603   /* Don't emit an instruction to initialize the pseudo register if
2604      we are being called from the tree optimizers' cost-calculation
2605      routines.  */
2606   if (!cfun->machine->initialized_mips16_gp_pseudo_p
2607       && (current_ir_type () != IR_GIMPLE || currently_expanding_to_rtl))
2608     {
2609       rtx insn, scan;
2610
2611       push_topmost_sequence ();
2612
2613       scan = get_insns ();
2614       while (NEXT_INSN (scan) && !INSN_P (NEXT_INSN (scan)))
2615         scan = NEXT_INSN (scan);
2616
2617       insn = gen_load_const_gp (cfun->machine->mips16_gp_pseudo_rtx);
2618       emit_insn_after (insn, scan);
2619
2620       pop_topmost_sequence ();
2621
2622       cfun->machine->initialized_mips16_gp_pseudo_p = true;
2623     }
2624
2625   return cfun->machine->mips16_gp_pseudo_rtx;
2626 }
2627
2628 /* Return a base register that holds pic_offset_table_rtx.
2629    TEMP, if nonnull, is a scratch Pmode base register.  */
2630
2631 rtx
2632 mips_pic_base_register (rtx temp)
2633 {
2634   if (!TARGET_MIPS16)
2635     return pic_offset_table_rtx;
2636
2637   if (can_create_pseudo_p ())
2638     return mips16_gp_pseudo_reg ();
2639
2640   if (TARGET_USE_GOT)
2641     /* The first post-reload split exposes all references to $gp
2642        (both uses and definitions).  All references must remain
2643        explicit after that point.
2644
2645        It is safe to introduce uses of $gp at any time, so for
2646        simplicity, we do that before the split too.  */
2647     mips_emit_move (temp, pic_offset_table_rtx);
2648   else
2649     emit_insn (gen_load_const_gp (temp));
2650   return temp;
2651 }
2652
2653 /* Return the RHS of a load_call<mode> insn.  */
2654
2655 static rtx
2656 mips_unspec_call (rtx reg, rtx symbol)
2657 {
2658   rtvec vec;
2659
2660   vec = gen_rtvec (3, reg, symbol, gen_rtx_REG (SImode, GOT_VERSION_REGNUM));
2661   return gen_rtx_UNSPEC (Pmode, vec, UNSPEC_LOAD_CALL);
2662 }
2663
2664 /* If SRC is the RHS of a load_call<mode> insn, return the underlying symbol
2665    reference.  Return NULL_RTX otherwise.  */
2666
2667 static rtx
2668 mips_strip_unspec_call (rtx src)
2669 {
2670   if (GET_CODE (src) == UNSPEC && XINT (src, 1) == UNSPEC_LOAD_CALL)
2671     return mips_strip_unspec_address (XVECEXP (src, 0, 1));
2672   return NULL_RTX;
2673 }
2674
2675 /* Create and return a GOT reference of type TYPE for address ADDR.
2676    TEMP, if nonnull, is a scratch Pmode base register.  */
2677
2678 rtx
2679 mips_got_load (rtx temp, rtx addr, enum mips_symbol_type type)
2680 {
2681   rtx base, high, lo_sum_symbol;
2682
2683   base = mips_pic_base_register (temp);
2684
2685   /* If we used the temporary register to load $gp, we can't use
2686      it for the high part as well.  */
2687   if (temp != NULL && reg_overlap_mentioned_p (base, temp))
2688     temp = NULL;
2689
2690   high = mips_unspec_offset_high (temp, base, addr, type);
2691   lo_sum_symbol = mips_unspec_address (addr, type);
2692
2693   if (type == SYMBOL_GOTOFF_CALL)
2694     return mips_unspec_call (high, lo_sum_symbol);
2695   else
2696     return (Pmode == SImode
2697             ? gen_unspec_gotsi (high, lo_sum_symbol)
2698             : gen_unspec_gotdi (high, lo_sum_symbol));
2699 }
2700
2701 /* If MODE is MAX_MACHINE_MODE, ADDR appears as a move operand, otherwise
2702    it appears in a MEM of that mode.  Return true if ADDR is a legitimate
2703    constant in that context and can be split into high and low parts.
2704    If so, and if LOW_OUT is nonnull, emit the high part and store the
2705    low part in *LOW_OUT.  Leave *LOW_OUT unchanged otherwise.
2706
2707    TEMP is as for mips_force_temporary and is used to load the high
2708    part into a register.
2709
2710    When MODE is MAX_MACHINE_MODE, the low part is guaranteed to be
2711    a legitimize SET_SRC for an .md pattern, otherwise the low part
2712    is guaranteed to be a legitimate address for mode MODE.  */
2713
2714 bool
2715 mips_split_symbol (rtx temp, rtx addr, enum machine_mode mode, rtx *low_out)
2716 {
2717   enum mips_symbol_context context;
2718   enum mips_symbol_type symbol_type;
2719   rtx high;
2720
2721   context = (mode == MAX_MACHINE_MODE
2722              ? SYMBOL_CONTEXT_LEA
2723              : SYMBOL_CONTEXT_MEM);
2724   if (GET_CODE (addr) == HIGH && context == SYMBOL_CONTEXT_LEA)
2725     {
2726       addr = XEXP (addr, 0);
2727       if (mips_symbolic_constant_p (addr, context, &symbol_type)
2728           && mips_symbol_insns (symbol_type, mode) > 0
2729           && mips_split_hi_p[symbol_type])
2730         {
2731           if (low_out)
2732             switch (symbol_type)
2733               {
2734               case SYMBOL_GOT_PAGE_OFST:
2735                 /* The high part of a page/ofst pair is loaded from the GOT.  */
2736                 *low_out = mips_got_load (temp, addr, SYMBOL_GOTOFF_PAGE);
2737                 break;
2738
2739               default:
2740                 gcc_unreachable ();
2741               }
2742           return true;
2743         }
2744     }
2745   else
2746     {
2747       if (mips_symbolic_constant_p (addr, context, &symbol_type)
2748           && mips_symbol_insns (symbol_type, mode) > 0
2749           && mips_split_p[symbol_type])
2750         {
2751           if (low_out)
2752             switch (symbol_type)
2753               {
2754               case SYMBOL_GOT_DISP:
2755                 /* SYMBOL_GOT_DISP symbols are loaded from the GOT.  */
2756                 *low_out = mips_got_load (temp, addr, SYMBOL_GOTOFF_DISP);
2757                 break;
2758
2759               case SYMBOL_GP_RELATIVE:
2760                 high = mips_pic_base_register (temp);
2761                 *low_out = gen_rtx_LO_SUM (Pmode, high, addr);
2762                 break;
2763
2764               default:
2765                 high = gen_rtx_HIGH (Pmode, copy_rtx (addr));
2766                 high = mips_force_temporary (temp, high);
2767                 *low_out = gen_rtx_LO_SUM (Pmode, high, addr);
2768                 break;
2769               }
2770           return true;
2771         }
2772     }
2773   return false;
2774 }
2775
2776 /* Return a legitimate address for REG + OFFSET.  TEMP is as for
2777    mips_force_temporary; it is only needed when OFFSET is not a
2778    SMALL_OPERAND.  */
2779
2780 static rtx
2781 mips_add_offset (rtx temp, rtx reg, HOST_WIDE_INT offset)
2782 {
2783   if (!SMALL_OPERAND (offset))
2784     {
2785       rtx high;
2786
2787       if (TARGET_MIPS16)
2788         {
2789           /* Load the full offset into a register so that we can use
2790              an unextended instruction for the address itself.  */
2791           high = GEN_INT (offset);
2792           offset = 0;
2793         }
2794       else
2795         {
2796           /* Leave OFFSET as a 16-bit offset and put the excess in HIGH.
2797              The addition inside the macro CONST_HIGH_PART may cause an
2798              overflow, so we need to force a sign-extension check.  */
2799           high = gen_int_mode (CONST_HIGH_PART (offset), Pmode);
2800           offset = CONST_LOW_PART (offset);
2801         }
2802       high = mips_force_temporary (temp, high);
2803       reg = mips_force_temporary (temp, gen_rtx_PLUS (Pmode, high, reg));
2804     }
2805   return plus_constant (reg, offset);
2806 }
2807 \f
2808 /* The __tls_get_attr symbol.  */
2809 static GTY(()) rtx mips_tls_symbol;
2810
2811 /* Return an instruction sequence that calls __tls_get_addr.  SYM is
2812    the TLS symbol we are referencing and TYPE is the symbol type to use
2813    (either global dynamic or local dynamic).  V0 is an RTX for the
2814    return value location.  */
2815
2816 static rtx
2817 mips_call_tls_get_addr (rtx sym, enum mips_symbol_type type, rtx v0)
2818 {
2819   rtx insn, loc, a0;
2820
2821   a0 = gen_rtx_REG (Pmode, GP_ARG_FIRST);
2822
2823   if (!mips_tls_symbol)
2824     mips_tls_symbol = init_one_libfunc ("__tls_get_addr");
2825
2826   loc = mips_unspec_address (sym, type);
2827
2828   start_sequence ();
2829
2830   emit_insn (gen_rtx_SET (Pmode, a0,
2831                           gen_rtx_LO_SUM (Pmode, pic_offset_table_rtx, loc)));
2832   insn = mips_expand_call (MIPS_CALL_NORMAL, v0, mips_tls_symbol,
2833                            const0_rtx, NULL_RTX, false);
2834   RTL_CONST_CALL_P (insn) = 1;
2835   use_reg (&CALL_INSN_FUNCTION_USAGE (insn), a0);
2836   insn = get_insns ();
2837
2838   end_sequence ();
2839
2840   return insn;
2841 }
2842
2843 /* Return a pseudo register that contains the current thread pointer.  */
2844
2845 static rtx
2846 mips_get_tp (void)
2847 {
2848   rtx tp;
2849
2850   tp = gen_reg_rtx (Pmode);
2851   if (Pmode == DImode)
2852     emit_insn (gen_tls_get_tp_di (tp));
2853   else
2854     emit_insn (gen_tls_get_tp_si (tp));
2855   return tp;
2856 }
2857
2858 /* Generate the code to access LOC, a thread-local SYMBOL_REF, and return
2859    its address.  The return value will be both a valid address and a valid
2860    SET_SRC (either a REG or a LO_SUM).  */
2861
2862 static rtx
2863 mips_legitimize_tls_address (rtx loc)
2864 {
2865   rtx dest, insn, v0, tp, tmp1, tmp2, eqv;
2866   enum tls_model model;
2867
2868   if (TARGET_MIPS16)
2869     {
2870       sorry ("MIPS16 TLS");
2871       return gen_reg_rtx (Pmode);
2872     }
2873
2874   model = SYMBOL_REF_TLS_MODEL (loc);
2875   /* Only TARGET_ABICALLS code can have more than one module; other
2876      code must be be static and should not use a GOT.  All TLS models
2877      reduce to local exec in this situation.  */
2878   if (!TARGET_ABICALLS)
2879     model = TLS_MODEL_LOCAL_EXEC;
2880
2881   switch (model)
2882     {
2883     case TLS_MODEL_GLOBAL_DYNAMIC:
2884       v0 = gen_rtx_REG (Pmode, GP_RETURN);
2885       insn = mips_call_tls_get_addr (loc, SYMBOL_TLSGD, v0);
2886       dest = gen_reg_rtx (Pmode);
2887       emit_libcall_block (insn, dest, v0, loc);
2888       break;
2889
2890     case TLS_MODEL_LOCAL_DYNAMIC:
2891       v0 = gen_rtx_REG (Pmode, GP_RETURN);
2892       insn = mips_call_tls_get_addr (loc, SYMBOL_TLSLDM, v0);
2893       tmp1 = gen_reg_rtx (Pmode);
2894
2895       /* Attach a unique REG_EQUIV, to allow the RTL optimizers to
2896          share the LDM result with other LD model accesses.  */
2897       eqv = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, const0_rtx),
2898                             UNSPEC_TLS_LDM);
2899       emit_libcall_block (insn, tmp1, v0, eqv);
2900
2901       tmp2 = mips_unspec_offset_high (NULL, tmp1, loc, SYMBOL_DTPREL);
2902       dest = gen_rtx_LO_SUM (Pmode, tmp2,
2903                              mips_unspec_address (loc, SYMBOL_DTPREL));
2904       break;
2905
2906     case TLS_MODEL_INITIAL_EXEC:
2907       tp = mips_get_tp ();
2908       tmp1 = gen_reg_rtx (Pmode);
2909       tmp2 = mips_unspec_address (loc, SYMBOL_GOTTPREL);
2910       if (Pmode == DImode)
2911         emit_insn (gen_load_gotdi (tmp1, pic_offset_table_rtx, tmp2));
2912       else
2913         emit_insn (gen_load_gotsi (tmp1, pic_offset_table_rtx, tmp2));
2914       dest = gen_reg_rtx (Pmode);
2915       emit_insn (gen_add3_insn (dest, tmp1, tp));
2916       break;
2917
2918     case TLS_MODEL_LOCAL_EXEC:
2919       tp = mips_get_tp ();
2920       tmp1 = mips_unspec_offset_high (NULL, tp, loc, SYMBOL_TPREL);
2921       dest = gen_rtx_LO_SUM (Pmode, tmp1,
2922                              mips_unspec_address (loc, SYMBOL_TPREL));
2923       break;
2924
2925     default:
2926       gcc_unreachable ();
2927     }
2928   return dest;
2929 }
2930 \f
2931 /* If X is not a valid address for mode MODE, force it into a register.  */
2932
2933 static rtx
2934 mips_force_address (rtx x, enum machine_mode mode)
2935 {
2936   if (!mips_legitimate_address_p (mode, x, false))
2937     x = force_reg (Pmode, x);
2938   return x;
2939 }
2940
2941 /* This function is used to implement LEGITIMIZE_ADDRESS.  If X can
2942    be legitimized in a way that the generic machinery might not expect,
2943    return a new address, otherwise return NULL.  MODE is the mode of
2944    the memory being accessed.  */
2945
2946 static rtx
2947 mips_legitimize_address (rtx x, rtx oldx ATTRIBUTE_UNUSED,
2948                          enum machine_mode mode)
2949 {
2950   rtx base, addr;
2951   HOST_WIDE_INT offset;
2952
2953   if (mips_tls_symbol_p (x))
2954     return mips_legitimize_tls_address (x);
2955
2956   /* See if the address can split into a high part and a LO_SUM.  */
2957   if (mips_split_symbol (NULL, x, mode, &addr))
2958     return mips_force_address (addr, mode);
2959
2960   /* Handle BASE + OFFSET using mips_add_offset.  */
2961   mips_split_plus (x, &base, &offset);
2962   if (offset != 0)
2963     {
2964       if (!mips_valid_base_register_p (base, mode, false))
2965         base = copy_to_mode_reg (Pmode, base);
2966       addr = mips_add_offset (NULL, base, offset);
2967       return mips_force_address (addr, mode);
2968     }
2969
2970   return x;
2971 }
2972
2973 /* Load VALUE into DEST.  TEMP is as for mips_force_temporary.  */
2974
2975 void
2976 mips_move_integer (rtx temp, rtx dest, unsigned HOST_WIDE_INT value)
2977 {
2978   struct mips_integer_op codes[MIPS_MAX_INTEGER_OPS];
2979   enum machine_mode mode;
2980   unsigned int i, num_ops;
2981   rtx x;
2982
2983   mode = GET_MODE (dest);
2984   num_ops = mips_build_integer (codes, value);
2985
2986   /* Apply each binary operation to X.  Invariant: X is a legitimate
2987      source operand for a SET pattern.  */
2988   x = GEN_INT (codes[0].value);
2989   for (i = 1; i < num_ops; i++)
2990     {
2991       if (!can_create_pseudo_p ())
2992         {
2993           emit_insn (gen_rtx_SET (VOIDmode, temp, x));
2994           x = temp;
2995         }
2996       else
2997         x = force_reg (mode, x);
2998       x = gen_rtx_fmt_ee (codes[i].code, mode, x, GEN_INT (codes[i].value));
2999     }
3000
3001   emit_insn (gen_rtx_SET (VOIDmode, dest, x));
3002 }
3003
3004 /* Subroutine of mips_legitimize_move.  Move constant SRC into register
3005    DEST given that SRC satisfies immediate_operand but doesn't satisfy
3006    move_operand.  */
3007
3008 static void
3009 mips_legitimize_const_move (enum machine_mode mode, rtx dest, rtx src)
3010 {
3011   rtx base, offset;
3012
3013   /* Split moves of big integers into smaller pieces.  */
3014   if (splittable_const_int_operand (src, mode))
3015     {
3016       mips_move_integer (dest, dest, INTVAL (src));
3017       return;
3018     }
3019
3020   /* Split moves of symbolic constants into high/low pairs.  */
3021   if (mips_split_symbol (dest, src, MAX_MACHINE_MODE, &src))
3022     {
3023       emit_insn (gen_rtx_SET (VOIDmode, dest, src));
3024       return;
3025     }
3026
3027   /* Generate the appropriate access sequences for TLS symbols.  */
3028   if (mips_tls_symbol_p (src))
3029     {
3030       mips_emit_move (dest, mips_legitimize_tls_address (src));
3031       return;
3032     }
3033
3034   /* If we have (const (plus symbol offset)), and that expression cannot
3035      be forced into memory, load the symbol first and add in the offset.
3036      In non-MIPS16 mode, prefer to do this even if the constant _can_ be
3037      forced into memory, as it usually produces better code.  */
3038   split_const (src, &base, &offset);
3039   if (offset != const0_rtx
3040       && (targetm.cannot_force_const_mem (src)
3041           || (!TARGET_MIPS16 && can_create_pseudo_p ())))
3042     {
3043       base = mips_force_temporary (dest, base);
3044       mips_emit_move (dest, mips_add_offset (NULL, base, INTVAL (offset)));
3045       return;
3046     }
3047
3048   src = force_const_mem (mode, src);
3049
3050   /* When using explicit relocs, constant pool references are sometimes
3051      not legitimate addresses.  */
3052   mips_split_symbol (dest, XEXP (src, 0), mode, &XEXP (src, 0));
3053   mips_emit_move (dest, src);
3054 }
3055
3056 /* If (set DEST SRC) is not a valid move instruction, emit an equivalent
3057    sequence that is valid.  */
3058
3059 bool
3060 mips_legitimize_move (enum machine_mode mode, rtx dest, rtx src)
3061 {
3062   if (!register_operand (dest, mode) && !reg_or_0_operand (src, mode))
3063     {
3064       mips_emit_move (dest, force_reg (mode, src));
3065       return true;
3066     }
3067
3068   /* We need to deal with constants that would be legitimate
3069      immediate_operands but aren't legitimate move_operands.  */
3070   if (CONSTANT_P (src) && !move_operand (src, mode))
3071     {
3072       mips_legitimize_const_move (mode, dest, src);
3073       set_unique_reg_note (get_last_insn (), REG_EQUAL, copy_rtx (src));
3074       return true;
3075     }
3076   return false;
3077 }
3078 \f
3079 /* Return true if value X in context CONTEXT is a small-data address
3080    that can be rewritten as a LO_SUM.  */
3081
3082 static bool
3083 mips_rewrite_small_data_p (rtx x, enum mips_symbol_context context)
3084 {
3085   enum mips_symbol_type symbol_type;
3086
3087   return (mips_lo_relocs[SYMBOL_GP_RELATIVE]
3088           && !mips_split_p[SYMBOL_GP_RELATIVE]
3089           && mips_symbolic_constant_p (x, context, &symbol_type)
3090           && symbol_type == SYMBOL_GP_RELATIVE);
3091 }
3092
3093 /* A for_each_rtx callback for mips_small_data_pattern_p.  DATA is the
3094    containing MEM, or null if none.  */
3095
3096 static int
3097 mips_small_data_pattern_1 (rtx *loc, void *data)
3098 {
3099   enum mips_symbol_context context;
3100
3101   if (GET_CODE (*loc) == LO_SUM)
3102     return -1;
3103
3104   if (MEM_P (*loc))
3105     {
3106       if (for_each_rtx (&XEXP (*loc, 0), mips_small_data_pattern_1, *loc))
3107         return 1;
3108       return -1;
3109     }
3110
3111   context = data ? SYMBOL_CONTEXT_MEM : SYMBOL_CONTEXT_LEA;
3112   return mips_rewrite_small_data_p (*loc, context);
3113 }
3114
3115 /* Return true if OP refers to small data symbols directly, not through
3116    a LO_SUM.  */
3117
3118 bool
3119 mips_small_data_pattern_p (rtx op)
3120 {
3121   return for_each_rtx (&op, mips_small_data_pattern_1, NULL);
3122 }
3123
3124 /* A for_each_rtx callback, used by mips_rewrite_small_data.
3125    DATA is the containing MEM, or null if none.  */
3126
3127 static int
3128 mips_rewrite_small_data_1 (rtx *loc, void *data)
3129 {
3130   enum mips_symbol_context context;
3131
3132   if (MEM_P (*loc))
3133     {
3134       for_each_rtx (&XEXP (*loc, 0), mips_rewrite_small_data_1, *loc);
3135       return -1;
3136     }
3137
3138   context = data ? SYMBOL_CONTEXT_MEM : SYMBOL_CONTEXT_LEA;
3139   if (mips_rewrite_small_data_p (*loc, context))
3140     *loc = gen_rtx_LO_SUM (Pmode, pic_offset_table_rtx, *loc);
3141
3142   if (GET_CODE (*loc) == LO_SUM)
3143     return -1;
3144
3145   return 0;
3146 }
3147
3148 /* Rewrite instruction pattern PATTERN so that it refers to small data
3149    using explicit relocations.  */
3150
3151 rtx
3152 mips_rewrite_small_data (rtx pattern)
3153 {
3154   pattern = copy_insn (pattern);
3155   for_each_rtx (&pattern, mips_rewrite_small_data_1, NULL);
3156   return pattern;
3157 }
3158 \f
3159 /* We need a lot of little routines to check the range of MIPS16 immediate
3160    operands.  */
3161
3162 static int
3163 m16_check_op (rtx op, int low, int high, int mask)
3164 {
3165   return (CONST_INT_P (op)
3166           && IN_RANGE (INTVAL (op), low, high)
3167           && (INTVAL (op) & mask) == 0);
3168 }
3169
3170 int
3171 m16_uimm3_b (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
3172 {
3173   return m16_check_op (op, 0x1, 0x8, 0);
3174 }
3175
3176 int
3177 m16_simm4_1 (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
3178 {
3179   return m16_check_op (op, -0x8, 0x7, 0);
3180 }
3181
3182 int
3183 m16_nsimm4_1 (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
3184 {
3185   return m16_check_op (op, -0x7, 0x8, 0);
3186 }
3187
3188 int
3189 m16_simm5_1 (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
3190 {
3191   return m16_check_op (op, -0x10, 0xf, 0);
3192 }
3193
3194 int
3195 m16_nsimm5_1 (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
3196 {
3197   return m16_check_op (op, -0xf, 0x10, 0);
3198 }
3199
3200 int
3201 m16_uimm5_4 (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
3202 {
3203   return m16_check_op (op, -0x10 << 2, 0xf << 2, 3);
3204 }
3205
3206 int
3207 m16_nuimm5_4 (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
3208 {
3209   return m16_check_op (op, -0xf << 2, 0x10 << 2, 3);
3210 }
3211
3212 int
3213 m16_simm8_1 (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
3214 {
3215   return m16_check_op (op, -0x80, 0x7f, 0);
3216 }
3217
3218 int
3219 m16_nsimm8_1 (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
3220 {
3221   return m16_check_op (op, -0x7f, 0x80, 0);
3222 }
3223
3224 int
3225 m16_uimm8_1 (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
3226 {
3227   return m16_check_op (op, 0x0, 0xff, 0);
3228 }
3229
3230 int
3231 m16_nuimm8_1 (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
3232 {
3233   return m16_check_op (op, -0xff, 0x0, 0);
3234 }
3235
3236 int
3237 m16_uimm8_m1_1 (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
3238 {
3239   return m16_check_op (op, -0x1, 0xfe, 0);
3240 }
3241
3242 int
3243 m16_uimm8_4 (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
3244 {
3245   return m16_check_op (op, 0x0, 0xff << 2, 3);
3246 }
3247
3248 int
3249 m16_nuimm8_4 (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
3250 {
3251   return m16_check_op (op, -0xff << 2, 0x0, 3);
3252 }
3253
3254 int
3255 m16_simm8_8 (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
3256 {
3257   return m16_check_op (op, -0x80 << 3, 0x7f << 3, 7);
3258 }
3259
3260 int
3261 m16_nsimm8_8 (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
3262 {
3263   return m16_check_op (op, -0x7f << 3, 0x80 << 3, 7);
3264 }
3265 \f
3266 /* The cost of loading values from the constant pool.  It should be
3267    larger than the cost of any constant we want to synthesize inline.  */
3268 #define CONSTANT_POOL_COST COSTS_N_INSNS (TARGET_MIPS16 ? 4 : 8)
3269
3270 /* Return the cost of X when used as an operand to the MIPS16 instruction
3271    that implements CODE.  Return -1 if there is no such instruction, or if
3272    X is not a valid immediate operand for it.  */
3273
3274 static int
3275 mips16_constant_cost (int code, HOST_WIDE_INT x)
3276 {
3277   switch (code)
3278     {
3279     case ASHIFT:
3280     case ASHIFTRT:
3281     case LSHIFTRT:
3282       /* Shifts by between 1 and 8 bits (inclusive) are unextended,
3283          other shifts are extended.  The shift patterns truncate the shift
3284          count to the right size, so there are no out-of-range values.  */
3285       if (IN_RANGE (x, 1, 8))
3286         return 0;
3287       return COSTS_N_INSNS (1);
3288
3289     case PLUS:
3290       if (IN_RANGE (x, -128, 127))
3291         return 0;
3292       if (SMALL_OPERAND (x))
3293         return COSTS_N_INSNS (1);
3294       return -1;
3295
3296     case LEU:
3297       /* Like LE, but reject the always-true case.  */
3298       if (x == -1)
3299         return -1;
3300     case LE:
3301       /* We add 1 to the immediate and use SLT.  */
3302       x += 1;
3303     case XOR:
3304       /* We can use CMPI for an xor with an unsigned 16-bit X.  */
3305     case LT:
3306     case LTU:
3307       if (IN_RANGE (x, 0, 255))
3308         return 0;
3309       if (SMALL_OPERAND_UNSIGNED (x))
3310         return COSTS_N_INSNS (1);
3311       return -1;
3312
3313     case EQ:
3314     case NE:
3315       /* Equality comparisons with 0 are cheap.  */
3316       if (x == 0)
3317         return 0;
3318       return -1;
3319
3320     default:
3321       return -1;
3322     }
3323 }
3324
3325 /* Return true if there is a non-MIPS16 instruction that implements CODE
3326    and if that instruction accepts X as an immediate operand.  */
3327
3328 static int
3329 mips_immediate_operand_p (int code, HOST_WIDE_INT x)
3330 {
3331   switch (code)
3332     {
3333     case ASHIFT:
3334     case ASHIFTRT:
3335     case LSHIFTRT:
3336       /* All shift counts are truncated to a valid constant.  */
3337       return true;
3338
3339     case ROTATE:
3340     case ROTATERT:
3341       /* Likewise rotates, if the target supports rotates at all.  */
3342       return ISA_HAS_ROR;
3343
3344     case AND:
3345     case IOR:
3346     case XOR:
3347       /* These instructions take 16-bit unsigned immediates.  */
3348       return SMALL_OPERAND_UNSIGNED (x);
3349
3350     case PLUS:
3351     case LT:
3352     case LTU:
3353       /* These instructions take 16-bit signed immediates.  */
3354       return SMALL_OPERAND (x);
3355
3356     case EQ:
3357     case NE:
3358     case GT:
3359     case GTU:
3360       /* The "immediate" forms of these instructions are really
3361          implemented as comparisons with register 0.  */
3362       return x == 0;
3363
3364     case GE:
3365     case GEU:
3366       /* Likewise, meaning that the only valid immediate operand is 1.  */
3367       return x == 1;
3368
3369     case LE:
3370       /* We add 1 to the immediate and use SLT.  */
3371       return SMALL_OPERAND (x + 1);
3372
3373     case LEU:
3374       /* Likewise SLTU, but reject the always-true case.  */
3375       return SMALL_OPERAND (x + 1) && x + 1 != 0;
3376
3377     case SIGN_EXTRACT:
3378     case ZERO_EXTRACT:
3379       /* The bit position and size are immediate operands.  */
3380       return ISA_HAS_EXT_INS;
3381
3382     default:
3383       /* By default assume that $0 can be used for 0.  */
3384       return x == 0;
3385     }
3386 }
3387
3388 /* Return the cost of binary operation X, given that the instruction
3389    sequence for a word-sized or smaller operation has cost SINGLE_COST
3390    and that the sequence of a double-word operation has cost DOUBLE_COST.
3391    If SPEED is true, optimize for speed otherwise optimize for size.  */
3392
3393 static int
3394 mips_binary_cost (rtx x, int single_cost, int double_cost, bool speed)
3395 {
3396   int cost;
3397
3398   if (GET_MODE_SIZE (GET_MODE (x)) == UNITS_PER_WORD * 2)
3399     cost = double_cost;
3400   else
3401     cost = single_cost;
3402   return (cost
3403           + rtx_cost (XEXP (x, 0), SET, speed)
3404           + rtx_cost (XEXP (x, 1), GET_CODE (x), speed));
3405 }
3406
3407 /* Return the cost of floating-point multiplications of mode MODE.  */
3408
3409 static int
3410 mips_fp_mult_cost (enum machine_mode mode)
3411 {
3412   return mode == DFmode ? mips_cost->fp_mult_df : mips_cost->fp_mult_sf;
3413 }
3414
3415 /* Return the cost of floating-point divisions of mode MODE.  */
3416
3417 static int
3418 mips_fp_div_cost (enum machine_mode mode)
3419 {
3420   return mode == DFmode ? mips_cost->fp_div_df : mips_cost->fp_div_sf;
3421 }
3422
3423 /* Return the cost of sign-extending OP to mode MODE, not including the
3424    cost of OP itself.  */
3425
3426 static int
3427 mips_sign_extend_cost (enum machine_mode mode, rtx op)
3428 {
3429   if (MEM_P (op))
3430     /* Extended loads are as cheap as unextended ones.  */
3431     return 0;
3432
3433   if (TARGET_64BIT && mode == DImode && GET_MODE (op) == SImode)
3434     /* A sign extension from SImode to DImode in 64-bit mode is free.  */
3435     return 0;
3436
3437   if (ISA_HAS_SEB_SEH || GENERATE_MIPS16E)
3438     /* We can use SEB or SEH.  */
3439     return COSTS_N_INSNS (1);
3440
3441   /* We need to use a shift left and a shift right.  */
3442   return COSTS_N_INSNS (TARGET_MIPS16 ? 4 : 2);
3443 }
3444
3445 /* Return the cost of zero-extending OP to mode MODE, not including the
3446    cost of OP itself.  */
3447
3448 static int
3449 mips_zero_extend_cost (enum machine_mode mode, rtx op)
3450 {
3451   if (MEM_P (op))
3452     /* Extended loads are as cheap as unextended ones.  */
3453     return 0;
3454
3455   if (TARGET_64BIT && mode == DImode && GET_MODE (op) == SImode)
3456     /* We need a shift left by 32 bits and a shift right by 32 bits.  */
3457     return COSTS_N_INSNS (TARGET_MIPS16 ? 4 : 2);
3458
3459   if (GENERATE_MIPS16E)
3460     /* We can use ZEB or ZEH.  */
3461     return COSTS_N_INSNS (1);
3462
3463   if (TARGET_MIPS16)
3464     /* We need to load 0xff or 0xffff into a register and use AND.  */
3465     return COSTS_N_INSNS (GET_MODE (op) == QImode ? 2 : 3);
3466
3467   /* We can use ANDI.  */
3468   return COSTS_N_INSNS (1);
3469 }
3470
3471 /* Implement TARGET_RTX_COSTS.  */
3472
3473 static bool
3474 mips_rtx_costs (rtx x, int code, int outer_code, int *total, bool speed)
3475 {
3476   enum machine_mode mode = GET_MODE (x);
3477   bool float_mode_p = FLOAT_MODE_P (mode);
3478   int cost;
3479   rtx addr;
3480
3481   /* The cost of a COMPARE is hard to define for MIPS.  COMPAREs don't
3482      appear in the instruction stream, and the cost of a comparison is
3483      really the cost of the branch or scc condition.  At the time of
3484      writing, GCC only uses an explicit outer COMPARE code when optabs
3485      is testing whether a constant is expensive enough to force into a
3486      register.  We want optabs to pass such constants through the MIPS
3487      expanders instead, so make all constants very cheap here.  */
3488   if (outer_code == COMPARE)
3489     {
3490       gcc_assert (CONSTANT_P (x));
3491       *total = 0;
3492       return true;
3493     }
3494
3495   switch (code)
3496     {
3497     case CONST_INT:
3498       /* Treat *clear_upper32-style ANDs as having zero cost in the
3499          second operand.  The cost is entirely in the first operand.
3500
3501          ??? This is needed because we would otherwise try to CSE
3502          the constant operand.  Although that's the right thing for
3503          instructions that continue to be a register operation throughout
3504          compilation, it is disastrous for instructions that could
3505          later be converted into a memory operation.  */
3506       if (TARGET_64BIT
3507           && outer_code == AND
3508           && UINTVAL (x) == 0xffffffff)
3509         {
3510           *total = 0;
3511           return true;
3512         }
3513
3514       if (TARGET_MIPS16)
3515         {
3516           cost = mips16_constant_cost (outer_code, INTVAL (x));
3517           if (cost >= 0)
3518             {
3519               *total = cost;
3520               return true;
3521             }
3522         }
3523       else
3524         {
3525           /* When not optimizing for size, we care more about the cost
3526              of hot code, and hot code is often in a loop.  If a constant
3527              operand needs to be forced into a register, we will often be
3528              able to hoist the constant load out of the loop, so the load
3529              should not contribute to the cost.  */
3530           if (speed || mips_immediate_operand_p (outer_code, INTVAL (x)))
3531             {
3532               *total = 0;
3533               return true;
3534             }
3535         }
3536       /* Fall through.  */
3537
3538     case CONST:
3539     case SYMBOL_REF:
3540     case LABEL_REF:
3541     case CONST_DOUBLE:
3542       if (force_to_mem_operand (x, VOIDmode))
3543         {
3544           *total = COSTS_N_INSNS (1);
3545           return true;
3546         }
3547       cost = mips_const_insns (x);
3548       if (cost > 0)
3549         {
3550           /* If the constant is likely to be stored in a GPR, SETs of
3551              single-insn constants are as cheap as register sets; we
3552              never want to CSE them.
3553
3554              Don't reduce the cost of storing a floating-point zero in
3555              FPRs.  If we have a zero in an FPR for other reasons, we
3556              can get better cfg-cleanup and delayed-branch results by
3557              using it consistently, rather than using $0 sometimes and
3558              an FPR at other times.  Also, moves between floating-point
3559              registers are sometimes cheaper than (D)MTC1 $0.  */
3560           if (cost == 1
3561               && outer_code == SET
3562               && !(float_mode_p && TARGET_HARD_FLOAT))
3563             cost = 0;
3564           /* When non-MIPS16 code loads a constant N>1 times, we rarely
3565              want to CSE the constant itself.  It is usually better to
3566              have N copies of the last operation in the sequence and one
3567              shared copy of the other operations.  (Note that this is
3568              not true for MIPS16 code, where the final operation in the
3569              sequence is often an extended instruction.)
3570
3571              Also, if we have a CONST_INT, we don't know whether it is
3572              for a word or doubleword operation, so we cannot rely on
3573              the result of mips_build_integer.  */
3574           else if (!TARGET_MIPS16
3575                    && (outer_code == SET || mode == VOIDmode))
3576             cost = 1;
3577           *total = COSTS_N_INSNS (cost);
3578           return true;
3579         }
3580       /* The value will need to be fetched from the constant pool.  */
3581       *total = CONSTANT_POOL_COST;
3582       return true;
3583
3584     case MEM:
3585       /* If the address is legitimate, return the number of
3586          instructions it needs.  */
3587       addr = XEXP (x, 0);
3588       cost = mips_address_insns (addr, mode, true);
3589       if (cost > 0)
3590         {
3591           *total = COSTS_N_INSNS (cost + 1);
3592           return true;
3593         }
3594       /* Check for a scaled indexed address.  */
3595       if (mips_lwxs_address_p (addr))
3596         {
3597           *total = COSTS_N_INSNS (2);
3598           return true;
3599         }
3600       /* Otherwise use the default handling.  */
3601       return false;
3602
3603     case FFS:
3604       *total = COSTS_N_INSNS (6);
3605       return false;
3606
3607     case NOT:
3608       *total = COSTS_N_INSNS (GET_MODE_SIZE (mode) > UNITS_PER_WORD ? 2 : 1);
3609       return false;
3610
3611     case AND:
3612       /* Check for a *clear_upper32 pattern and treat it like a zero
3613          extension.  See the pattern's comment for details.  */
3614       if (TARGET_64BIT
3615           && mode == DImode
3616           && CONST_INT_P (XEXP (x, 1))
3617           && UINTVAL (XEXP (x, 1)) == 0xffffffff)
3618         {
3619           *total = (mips_zero_extend_cost (mode, XEXP (x, 0))
3620                     + rtx_cost (XEXP (x, 0), SET, speed));
3621           return true;
3622         }
3623       /* Fall through.  */
3624
3625     case IOR:
3626     case XOR:
3627       /* Double-word operations use two single-word operations.  */
3628       *total = mips_binary_cost (x, COSTS_N_INSNS (1), COSTS_N_INSNS (2),
3629                                  speed);
3630       return true;
3631
3632     case ASHIFT:
3633     case ASHIFTRT:
3634     case LSHIFTRT:
3635     case ROTATE:
3636     case ROTATERT:
3637       if (CONSTANT_P (XEXP (x, 1)))
3638         *total = mips_binary_cost (x, COSTS_N_INSNS (1), COSTS_N_INSNS (4),
3639                                    speed);
3640       else
3641         *total = mips_binary_cost (x, COSTS_N_INSNS (1), COSTS_N_INSNS (12),
3642                                    speed);
3643       return true;
3644
3645     case ABS:
3646       if (float_mode_p)
3647         *total = mips_cost->fp_add;
3648       else
3649         *total = COSTS_N_INSNS (4);
3650       return false;
3651
3652     case LO_SUM:
3653       /* Low-part immediates need an extended MIPS16 instruction.  */
3654       *total = (COSTS_N_INSNS (TARGET_MIPS16 ? 2 : 1)
3655                 + rtx_cost (XEXP (x, 0), SET, speed));
3656       return true;
3657
3658     case LT:
3659     case LTU:
3660     case LE:
3661     case LEU:
3662     case GT:
3663     case GTU:
3664     case GE:
3665     case GEU:
3666     case EQ:
3667     case NE:
3668     case UNORDERED:
3669     case LTGT:
3670       /* Branch comparisons have VOIDmode, so use the first operand's
3671          mode instead.  */
3672       mode = GET_MODE (XEXP (x, 0));
3673       if (FLOAT_MODE_P (mode))
3674         {
3675           *total = mips_cost->fp_add;
3676           return false;
3677         }
3678       *total = mips_binary_cost (x, COSTS_N_INSNS (1), COSTS_N_INSNS (4),
3679                                  speed);
3680       return true;
3681
3682     case MINUS:
3683       if (float_mode_p
3684           && (ISA_HAS_NMADD4_NMSUB4 (mode) || ISA_HAS_NMADD3_NMSUB3 (mode))
3685           && TARGET_FUSED_MADD
3686           && !HONOR_NANS (mode)
3687           && !HONOR_SIGNED_ZEROS (mode))
3688         {
3689           /* See if we can use NMADD or NMSUB.  See mips.md for the
3690              associated patterns.  */
3691           rtx op0 = XEXP (x, 0);
3692           rtx op1 = XEXP (x, 1);
3693           if (GET_CODE (op0) == MULT && GET_CODE (XEXP (op0, 0)) == NEG)
3694             {
3695               *total = (mips_fp_mult_cost (mode)
3696                         + rtx_cost (XEXP (XEXP (op0, 0), 0), SET, speed)
3697                         + rtx_cost (XEXP (op0, 1), SET, speed)
3698                         + rtx_cost (op1, SET, speed));
3699               return true;
3700             }
3701           if (GET_CODE (op1) == MULT)
3702             {
3703               *total = (mips_fp_mult_cost (mode)
3704                         + rtx_cost (op0, SET, speed)
3705                         + rtx_cost (XEXP (op1, 0), SET, speed)
3706                         + rtx_cost (XEXP (op1, 1), SET, speed));
3707               return true;
3708             }
3709         }
3710       /* Fall through.  */
3711
3712     case PLUS:
3713       if (float_mode_p)
3714         {
3715           /* If this is part of a MADD or MSUB, treat the PLUS as
3716              being free.  */
3717           if (ISA_HAS_FP4
3718               && TARGET_FUSED_MADD
3719               && GET_CODE (XEXP (x, 0)) == MULT)
3720             *total = 0;
3721           else
3722             *total = mips_cost->fp_add;
3723           return false;
3724         }
3725
3726       /* Double-word operations require three single-word operations and
3727          an SLTU.  The MIPS16 version then needs to move the result of
3728          the SLTU from $24 to a MIPS16 register.  */
3729       *total = mips_binary_cost (x, COSTS_N_INSNS (1),
3730                                  COSTS_N_INSNS (TARGET_MIPS16 ? 5 : 4),
3731                                  speed);
3732       return true;
3733
3734     case NEG:
3735       if (float_mode_p
3736           && (ISA_HAS_NMADD4_NMSUB4 (mode) || ISA_HAS_NMADD3_NMSUB3 (mode))
3737           && TARGET_FUSED_MADD
3738           && !HONOR_NANS (mode)
3739           && HONOR_SIGNED_ZEROS (mode))
3740         {
3741           /* See if we can use NMADD or NMSUB.  See mips.md for the
3742              associated patterns.  */
3743           rtx op = XEXP (x, 0);
3744           if ((GET_CODE (op) == PLUS || GET_CODE (op) == MINUS)
3745               && GET_CODE (XEXP (op, 0)) == MULT)
3746             {
3747               *total = (mips_fp_mult_cost (mode)
3748                         + rtx_cost (XEXP (XEXP (op, 0), 0), SET, speed)
3749                         + rtx_cost (XEXP (XEXP (op, 0), 1), SET, speed)
3750                         + rtx_cost (XEXP (op, 1), SET, speed));
3751               return true;
3752             }
3753         }
3754
3755       if (float_mode_p)
3756         *total = mips_cost->fp_add;
3757       else
3758         *total = COSTS_N_INSNS (GET_MODE_SIZE (mode) > UNITS_PER_WORD ? 4 : 1);
3759       return false;
3760
3761     case MULT:
3762       if (float_mode_p)
3763         *total = mips_fp_mult_cost (mode);
3764       else if (mode == DImode && !TARGET_64BIT)
3765         /* Synthesized from 2 mulsi3s, 1 mulsidi3 and two additions,
3766            where the mulsidi3 always includes an MFHI and an MFLO.  */
3767         *total = (speed
3768                   ? mips_cost->int_mult_si * 3 + 6
3769                   : COSTS_N_INSNS (ISA_HAS_MUL3 ? 7 : 9));
3770       else if (!speed)
3771         *total = (ISA_HAS_MUL3 ? 1 : 2);
3772       else if (mode == DImode)
3773         *total = mips_cost->int_mult_di;
3774       else
3775         *total = mips_cost->int_mult_si;
3776       return false;
3777
3778     case DIV:
3779       /* Check for a reciprocal.  */
3780       if (float_mode_p
3781           && ISA_HAS_FP4
3782           && flag_unsafe_math_optimizations
3783           && XEXP (x, 0) == CONST1_RTX (mode))
3784         {
3785           if (outer_code == SQRT || GET_CODE (XEXP (x, 1)) == SQRT)
3786             /* An rsqrt<mode>a or rsqrt<mode>b pattern.  Count the
3787                division as being free.  */
3788             *total = rtx_cost (XEXP (x, 1), SET, speed);
3789           else
3790             *total = (mips_fp_div_cost (mode)
3791                       + rtx_cost (XEXP (x, 1), SET, speed));
3792           return true;
3793         }
3794       /* Fall through.  */
3795
3796     case SQRT:
3797     case MOD:
3798       if (float_mode_p)
3799         {
3800           *total = mips_fp_div_cost (mode);
3801           return false;
3802         }
3803       /* Fall through.  */
3804
3805     case UDIV:
3806     case UMOD:
3807       if (!speed)
3808         {
3809           /* It is our responsibility to make division by a power of 2
3810              as cheap as 2 register additions if we want the division
3811              expanders to be used for such operations; see the setting
3812              of sdiv_pow2_cheap in optabs.c.  Using (D)DIV for MIPS16
3813              should always produce shorter code than using
3814              expand_sdiv2_pow2.  */
3815           if (TARGET_MIPS16
3816               && CONST_INT_P (XEXP (x, 1))
3817               && exact_log2 (INTVAL (XEXP (x, 1))) >= 0)
3818             {
3819               *total = COSTS_N_INSNS (2) + rtx_cost (XEXP (x, 0), SET, speed);
3820               return true;
3821             }
3822           *total = COSTS_N_INSNS (mips_idiv_insns ());
3823         }
3824       else if (mode == DImode)
3825         *total = mips_cost->int_div_di;
3826       else
3827         *total = mips_cost->int_div_si;
3828       return false;
3829
3830     case SIGN_EXTEND:
3831       *total = mips_sign_extend_cost (mode, XEXP (x, 0));
3832       return false;
3833
3834     case ZERO_EXTEND:
3835       *total = mips_zero_extend_cost (mode, XEXP (x, 0));
3836       return false;
3837
3838     case FLOAT:
3839     case UNSIGNED_FLOAT:
3840     case FIX:
3841     case FLOAT_EXTEND:
3842     case FLOAT_TRUNCATE:
3843       *total = mips_cost->fp_add;
3844       return false;
3845
3846     default:
3847       return false;
3848     }
3849 }
3850
3851 /* Implement TARGET_ADDRESS_COST.  */
3852
3853 static int
3854 mips_address_cost (rtx addr, bool speed ATTRIBUTE_UNUSED)
3855 {
3856   return mips_address_insns (addr, SImode, false);
3857 }
3858 \f
3859 /* Information about a single instruction in a multi-instruction
3860    asm sequence.  */
3861 struct mips_multi_member {
3862   /* True if this is a label, false if it is code.  */
3863   bool is_label_p;
3864
3865   /* The output_asm_insn format of the instruction.  */
3866   const char *format;
3867
3868   /* The operands to the instruction.  */
3869   rtx operands[MAX_RECOG_OPERANDS];
3870 };
3871 typedef struct mips_multi_member mips_multi_member;
3872
3873 /* Vector definitions for the above.  */
3874 DEF_VEC_O(mips_multi_member);
3875 DEF_VEC_ALLOC_O(mips_multi_member, heap);
3876
3877 /* The instructions that make up the current multi-insn sequence.  */
3878 static VEC (mips_multi_member, heap) *mips_multi_members;
3879
3880 /* How many instructions (as opposed to labels) are in the current
3881    multi-insn sequence.  */
3882 static unsigned int mips_multi_num_insns;
3883
3884 /* Start a new multi-insn sequence.  */
3885
3886 static void
3887 mips_multi_start (void)
3888 {
3889   VEC_truncate (mips_multi_member, mips_multi_members, 0);
3890   mips_multi_num_insns = 0;
3891 }
3892
3893 /* Add a new, uninitialized member to the current multi-insn sequence.  */
3894
3895 static struct mips_multi_member *
3896 mips_multi_add (void)
3897 {
3898   return VEC_safe_push (mips_multi_member, heap, mips_multi_members, 0);
3899 }
3900
3901 /* Add a normal insn with the given asm format to the current multi-insn
3902    sequence.  The other arguments are a null-terminated list of operands.  */
3903
3904 static void
3905 mips_multi_add_insn (const char *format, ...)
3906 {
3907   struct mips_multi_member *member;
3908   va_list ap;
3909   unsigned int i;
3910   rtx op;
3911
3912   member = mips_multi_add ();
3913   member->is_label_p = false;
3914   member->format = format;
3915   va_start (ap, format);
3916   i = 0;
3917   while ((op = va_arg (ap, rtx)))
3918     member->operands[i++] = op;
3919   va_end (ap);
3920   mips_multi_num_insns++;
3921 }
3922
3923 /* Add the given label definition to the current multi-insn sequence.
3924    The definition should include the colon.  */
3925
3926 static void
3927 mips_multi_add_label (const char *label)
3928 {
3929   struct mips_multi_member *member;
3930
3931   member = mips_multi_add ();
3932   member->is_label_p = true;
3933   member->format = label;
3934 }
3935
3936 /* Return the index of the last member of the current multi-insn sequence.  */
3937
3938 static unsigned int
3939 mips_multi_last_index (void)
3940 {
3941   return VEC_length (mips_multi_member, mips_multi_members) - 1;
3942 }
3943
3944 /* Add a copy of an existing instruction to the current multi-insn
3945    sequence.  I is the index of the instruction that should be copied.  */
3946
3947 static void
3948 mips_multi_copy_insn (unsigned int i)
3949 {
3950   struct mips_multi_member *member;
3951
3952   member = mips_multi_add ();
3953   memcpy (member, VEC_index (mips_multi_member, mips_multi_members, i),
3954           sizeof (*member));
3955   gcc_assert (!member->is_label_p);
3956 }
3957
3958 /* Change the operand of an existing instruction in the current
3959    multi-insn sequence.  I is the index of the instruction,
3960    OP is the index of the operand, and X is the new value.  */
3961
3962 static void
3963 mips_multi_set_operand (unsigned int i, unsigned int op, rtx x)
3964 {
3965   VEC_index (mips_multi_member, mips_multi_members, i)->operands[op] = x;
3966 }
3967
3968 /* Write out the asm code for the current multi-insn sequence.  */
3969
3970 static void
3971 mips_multi_write (void)
3972 {
3973   struct mips_multi_member *member;
3974   unsigned int i;
3975
3976   for (i = 0;
3977        VEC_iterate (mips_multi_member, mips_multi_members, i, member);
3978        i++)
3979     if (member->is_label_p)
3980       fprintf (asm_out_file, "%s\n", member->format);
3981     else
3982       output_asm_insn (member->format, member->operands);
3983 }
3984 \f
3985 /* Return one word of double-word value OP, taking into account the fixed
3986    endianness of certain registers.  HIGH_P is true to select the high part,
3987    false to select the low part.  */
3988
3989 rtx
3990 mips_subword (rtx op, bool high_p)
3991 {
3992   unsigned int byte, offset;
3993   enum machine_mode mode;
3994
3995   mode = GET_MODE (op);
3996   if (mode == VOIDmode)
3997     mode = TARGET_64BIT ? TImode : DImode;
3998
3999   if (TARGET_BIG_ENDIAN ? !high_p : high_p)
4000     byte = UNITS_PER_WORD;
4001   else
4002     byte = 0;
4003
4004   if (FP_REG_RTX_P (op))
4005     {
4006       /* Paired FPRs are always ordered little-endian.  */
4007       offset = (UNITS_PER_WORD < UNITS_PER_HWFPVALUE ? high_p : byte != 0);
4008       return gen_rtx_REG (word_mode, REGNO (op) + offset);
4009     }
4010
4011   if (MEM_P (op))
4012     return mips_rewrite_small_data (adjust_address (op, word_mode, byte));
4013
4014   return simplify_gen_subreg (word_mode, op, mode, byte);
4015 }
4016
4017 /* Return true if a 64-bit move from SRC to DEST should be split into two.  */
4018
4019 bool
4020 mips_split_64bit_move_p (rtx dest, rtx src)
4021 {
4022   if (TARGET_64BIT)
4023     return false;
4024
4025   /* FPR-to-FPR moves can be done in a single instruction, if they're
4026      allowed at all.  */
4027   if (FP_REG_RTX_P (src) && FP_REG_RTX_P (dest))
4028     return false;
4029
4030   /* Check for floating-point loads and stores.  */
4031   if (ISA_HAS_LDC1_SDC1)
4032     {
4033       if (FP_REG_RTX_P (dest) && MEM_P (src))
4034         return false;
4035       if (FP_REG_RTX_P (src) && MEM_P (dest))
4036         return false;
4037     }
4038   return true;
4039 }
4040
4041 /* Split a doubleword move from SRC to DEST.  On 32-bit targets,
4042    this function handles 64-bit moves for which mips_split_64bit_move_p
4043    holds.  For 64-bit targets, this function handles 128-bit moves.  */
4044
4045 void
4046 mips_split_doubleword_move (rtx dest, rtx src)
4047 {
4048   rtx low_dest;
4049
4050   if (FP_REG_RTX_P (dest) || FP_REG_RTX_P (src))
4051     {
4052       if (!TARGET_64BIT && GET_MODE (dest) == DImode)
4053         emit_insn (gen_move_doubleword_fprdi (dest, src));
4054       else if (!TARGET_64BIT && GET_MODE (dest) == DFmode)
4055         emit_insn (gen_move_doubleword_fprdf (dest, src));
4056       else if (!TARGET_64BIT && GET_MODE (dest) == V2SFmode)
4057         emit_insn (gen_move_doubleword_fprv2sf (dest, src));
4058       else if (!TARGET_64BIT && GET_MODE (dest) == V2SImode)
4059         emit_insn (gen_move_doubleword_fprv2si (dest, src));
4060       else if (!TARGET_64BIT && GET_MODE (dest) == V4HImode)
4061         emit_insn (gen_move_doubleword_fprv4hi (dest, src));
4062       else if (!TARGET_64BIT && GET_MODE (dest) == V8QImode)
4063         emit_insn (gen_move_doubleword_fprv8qi (dest, src));
4064       else if (TARGET_64BIT && GET_MODE (dest) == TFmode)
4065         emit_insn (gen_move_doubleword_fprtf (dest, src));
4066       else
4067         gcc_unreachable ();
4068     }
4069   else if (REG_P (dest) && REGNO (dest) == MD_REG_FIRST)
4070     {
4071       low_dest = mips_subword (dest, false);
4072       mips_emit_move (low_dest, mips_subword (src, false));
4073       if (TARGET_64BIT)
4074         emit_insn (gen_mthidi_ti (dest, mips_subword (src, true), low_dest));
4075       else
4076         emit_insn (gen_mthisi_di (dest, mips_subword (src, true), low_dest));
4077     }
4078   else if (REG_P (src) && REGNO (src) == MD_REG_FIRST)
4079     {
4080       mips_emit_move (mips_subword (dest, false), mips_subword (src, false));
4081       if (TARGET_64BIT)
4082         emit_insn (gen_mfhidi_ti (mips_subword (dest, true), src));
4083       else
4084         emit_insn (gen_mfhisi_di (mips_subword (dest, true), src));
4085     }
4086   else
4087     {
4088       /* The operation can be split into two normal moves.  Decide in
4089          which order to do them.  */
4090       low_dest = mips_subword (dest, false);
4091       if (REG_P (low_dest)
4092           && reg_overlap_mentioned_p (low_dest, src))
4093         {
4094           mips_emit_move (mips_subword (dest, true), mips_subword (src, true));
4095           mips_emit_move (low_dest, mips_subword (src, false));
4096         }
4097       else
4098         {
4099           mips_emit_move (low_dest, mips_subword (src, false));
4100           mips_emit_move (mips_subword (dest, true), mips_subword (src, true));
4101         }
4102     }
4103 }
4104 \f
4105 /* Return the appropriate instructions to move SRC into DEST.  Assume
4106    that SRC is operand 1 and DEST is operand 0.  */
4107
4108 const char *
4109 mips_output_move (rtx dest, rtx src)
4110 {
4111   enum rtx_code dest_code, src_code;
4112   enum machine_mode mode;
4113   enum mips_symbol_type symbol_type;
4114   bool dbl_p;
4115
4116   dest_code = GET_CODE (dest);
4117   src_code = GET_CODE (src);
4118   mode = GET_MODE (dest);
4119   dbl_p = (GET_MODE_SIZE (mode) == 8);
4120
4121   if (dbl_p && mips_split_64bit_move_p (dest, src))
4122     return "#";
4123
4124   if ((src_code == REG && GP_REG_P (REGNO (src)))
4125       || (!TARGET_MIPS16 && src == CONST0_RTX (mode)))
4126     {
4127       if (dest_code == REG)
4128         {
4129           if (GP_REG_P (REGNO (dest)))
4130             return "move\t%0,%z1";
4131
4132           /* Moves to HI are handled by special .md insns.  */
4133           if (REGNO (dest) == LO_REGNUM)
4134             return "mtlo\t%z1";
4135
4136           if (DSP_ACC_REG_P (REGNO (dest)))
4137             {
4138               static char retval[] = "mt__\t%z1,%q0";
4139
4140               retval[2] = reg_names[REGNO (dest)][4];
4141               retval[3] = reg_names[REGNO (dest)][5];
4142               return retval;
4143             }
4144
4145           if (FP_REG_P (REGNO (dest)))
4146             return dbl_p ? "dmtc1\t%z1,%0" : "mtc1\t%z1,%0";
4147
4148           if (ALL_COP_REG_P (REGNO (dest)))
4149             {
4150               static char retval[] = "dmtc_\t%z1,%0";
4151
4152               retval[4] = COPNUM_AS_CHAR_FROM_REGNUM (REGNO (dest));
4153               return dbl_p ? retval : retval + 1;
4154             }
4155         }
4156       if (dest_code == MEM)
4157         switch (GET_MODE_SIZE (mode))
4158           {
4159           case 1: return "sb\t%z1,%0";
4160           case 2: return "sh\t%z1,%0";
4161           case 4: return "sw\t%z1,%0";
4162           case 8: return "sd\t%z1,%0";
4163           }
4164     }
4165   if (dest_code == REG && GP_REG_P (REGNO (dest)))
4166     {
4167       if (src_code == REG)
4168         {
4169           /* Moves from HI are handled by special .md insns.  */
4170           if (REGNO (src) == LO_REGNUM)
4171             {
4172               /* When generating VR4120 or VR4130 code, we use MACC and
4173                  DMACC instead of MFLO.  This avoids both the normal
4174                  MIPS III HI/LO hazards and the errata related to
4175                  -mfix-vr4130.  */
4176               if (ISA_HAS_MACCHI)
4177                 return dbl_p ? "dmacc\t%0,%.,%." : "macc\t%0,%.,%.";
4178               return "mflo\t%0";
4179             }
4180
4181           if (DSP_ACC_REG_P (REGNO (src)))
4182             {
4183               static char retval[] = "mf__\t%0,%q1";
4184
4185               retval[2] = reg_names[REGNO (src)][4];
4186               retval[3] = reg_names[REGNO (src)][5];
4187               return retval;
4188             }
4189
4190           if (FP_REG_P (REGNO (src)))
4191             return dbl_p ? "dmfc1\t%0,%1" : "mfc1\t%0,%1";
4192
4193           if (ALL_COP_REG_P (REGNO (src)))
4194             {
4195               static char retval[] = "dmfc_\t%0,%1";
4196
4197               retval[4] = COPNUM_AS_CHAR_FROM_REGNUM (REGNO (src));
4198               return dbl_p ? retval : retval + 1;
4199             }
4200
4201           if (ST_REG_P (REGNO (src)) && ISA_HAS_8CC)
4202             return "lui\t%0,0x3f80\n\tmovf\t%0,%.,%1";
4203         }
4204
4205       if (src_code == MEM)
4206         switch (GET_MODE_SIZE (mode))
4207           {
4208           case 1: return "lbu\t%0,%1";
4209           case 2: return "lhu\t%0,%1";
4210           case 4: return "lw\t%0,%1";
4211           case 8: return "ld\t%0,%1";
4212           }
4213
4214       if (src_code == CONST_INT)
4215         {
4216           /* Don't use the X format for the operand itself, because that
4217              will give out-of-range numbers for 64-bit hosts and 32-bit
4218              targets.  */
4219           if (!TARGET_MIPS16)
4220             return "li\t%0,%1\t\t\t# %X1";
4221
4222           if (SMALL_OPERAND_UNSIGNED (INTVAL (src)))
4223             return "li\t%0,%1";
4224
4225           if (SMALL_OPERAND_UNSIGNED (-INTVAL (src)))
4226             return "#";
4227         }
4228
4229       if (src_code == HIGH)
4230         return TARGET_MIPS16 ? "#" : "lui\t%0,%h1";
4231
4232       if (CONST_GP_P (src))
4233         return "move\t%0,%1";
4234
4235       if (mips_symbolic_constant_p (src, SYMBOL_CONTEXT_LEA, &symbol_type)
4236           && mips_lo_relocs[symbol_type] != 0)
4237         {
4238           /* A signed 16-bit constant formed by applying a relocation
4239              operator to a symbolic address.  */
4240           gcc_assert (!mips_split_p[symbol_type]);
4241           return "li\t%0,%R1";
4242         }
4243
4244       if (symbolic_operand (src, VOIDmode))
4245         {
4246           gcc_assert (TARGET_MIPS16
4247                       ? TARGET_MIPS16_TEXT_LOADS
4248                       : !TARGET_EXPLICIT_RELOCS);
4249           return dbl_p ? "dla\t%0,%1" : "la\t%0,%1";
4250         }
4251     }
4252   if (src_code == REG && FP_REG_P (REGNO (src)))
4253     {
4254       if (dest_code == REG && FP_REG_P (REGNO (dest)))
4255         {
4256           if (GET_MODE (dest) == V2SFmode)
4257             return "mov.ps\t%0,%1";
4258           else
4259             return dbl_p ? "mov.d\t%0,%1" : "mov.s\t%0,%1";
4260         }
4261
4262       if (dest_code == MEM)
4263         return dbl_p ? "sdc1\t%1,%0" : "swc1\t%1,%0";
4264     }
4265   if (dest_code == REG && FP_REG_P (REGNO (dest)))
4266     {
4267       if (src_code == MEM)
4268         return dbl_p ? "ldc1\t%0,%1" : "lwc1\t%0,%1";
4269     }
4270   if (dest_code == REG && ALL_COP_REG_P (REGNO (dest)) && src_code == MEM)
4271     {
4272       static char retval[] = "l_c_\t%0,%1";
4273
4274       retval[1] = (dbl_p ? 'd' : 'w');
4275       retval[3] = COPNUM_AS_CHAR_FROM_REGNUM (REGNO (dest));
4276       return retval;
4277     }
4278   if (dest_code == MEM && src_code == REG && ALL_COP_REG_P (REGNO (src)))
4279     {
4280       static char retval[] = "s_c_\t%1,%0";
4281
4282       retval[1] = (dbl_p ? 'd' : 'w');
4283       retval[3] = COPNUM_AS_CHAR_FROM_REGNUM (REGNO (src));
4284       return retval;
4285     }
4286   gcc_unreachable ();
4287 }
4288 \f
4289 /* Return true if CMP1 is a suitable second operand for integer ordering
4290    test CODE.  See also the *sCC patterns in mips.md.  */
4291
4292 static bool
4293 mips_int_order_operand_ok_p (enum rtx_code code, rtx cmp1)
4294 {
4295   switch (code)
4296     {
4297     case GT:
4298     case GTU:
4299       return reg_or_0_operand (cmp1, VOIDmode);
4300
4301     case GE:
4302     case GEU:
4303       return !TARGET_MIPS16 && cmp1 == const1_rtx;
4304
4305     case LT:
4306     case LTU:
4307       return arith_operand (cmp1, VOIDmode);
4308
4309     case LE:
4310       return sle_operand (cmp1, VOIDmode);
4311
4312     case LEU:
4313       return sleu_operand (cmp1, VOIDmode);
4314
4315     default:
4316       gcc_unreachable ();
4317     }
4318 }
4319
4320 /* Return true if *CMP1 (of mode MODE) is a valid second operand for
4321    integer ordering test *CODE, or if an equivalent combination can
4322    be formed by adjusting *CODE and *CMP1.  When returning true, update
4323    *CODE and *CMP1 with the chosen code and operand, otherwise leave
4324    them alone.  */
4325
4326 static bool
4327 mips_canonicalize_int_order_test (enum rtx_code *code, rtx *cmp1,
4328                                   enum machine_mode mode)
4329 {
4330   HOST_WIDE_INT plus_one;
4331
4332   if (mips_int_order_operand_ok_p (*code, *cmp1))
4333     return true;
4334
4335   if (CONST_INT_P (*cmp1))
4336     switch (*code)
4337       {
4338       case LE:
4339         plus_one = trunc_int_for_mode (UINTVAL (*cmp1) + 1, mode);
4340         if (INTVAL (*cmp1) < plus_one)
4341           {
4342             *code = LT;
4343             *cmp1 = force_reg (mode, GEN_INT (plus_one));
4344             return true;
4345           }
4346         break;
4347
4348       case LEU:
4349         plus_one = trunc_int_for_mode (UINTVAL (*cmp1) + 1, mode);
4350         if (plus_one != 0)
4351           {
4352             *code = LTU;
4353             *cmp1 = force_reg (mode, GEN_INT (plus_one));
4354             return true;
4355           }
4356         break;
4357
4358       default:
4359         break;
4360       }
4361   return false;
4362 }
4363
4364 /* Compare CMP0 and CMP1 using ordering test CODE and store the result
4365    in TARGET.  CMP0 and TARGET are register_operands.  If INVERT_PTR
4366    is nonnull, it's OK to set TARGET to the inverse of the result and
4367    flip *INVERT_PTR instead.  */
4368
4369 static void
4370 mips_emit_int_order_test (enum rtx_code code, bool *invert_ptr,
4371                           rtx target, rtx cmp0, rtx cmp1)
4372 {
4373   enum machine_mode mode;
4374
4375   /* First see if there is a MIPS instruction that can do this operation.
4376      If not, try doing the same for the inverse operation.  If that also
4377      fails, force CMP1 into a register and try again.  */
4378   mode = GET_MODE (cmp0);
4379   if (mips_canonicalize_int_order_test (&code, &cmp1, mode))
4380     mips_emit_binary (code, target, cmp0, cmp1);
4381   else
4382     {
4383       enum rtx_code inv_code = reverse_condition (code);
4384       if (!mips_canonicalize_int_order_test (&inv_code, &cmp1, mode))
4385         {
4386           cmp1 = force_reg (mode, cmp1);
4387           mips_emit_int_order_test (code, invert_ptr, target, cmp0, cmp1);
4388         }
4389       else if (invert_ptr == 0)
4390         {
4391           rtx inv_target;
4392
4393           inv_target = mips_force_binary (GET_MODE (target),
4394                                           inv_code, cmp0, cmp1);
4395           mips_emit_binary (XOR, target, inv_target, const1_rtx);
4396         }
4397       else
4398         {
4399           *invert_ptr = !*invert_ptr;
4400           mips_emit_binary (inv_code, target, cmp0, cmp1);
4401         }
4402     }
4403 }
4404
4405 /* Return a register that is zero iff CMP0 and CMP1 are equal.
4406    The register will have the same mode as CMP0.  */
4407
4408 static rtx
4409 mips_zero_if_equal (rtx cmp0, rtx cmp1)
4410 {
4411   if (cmp1 == const0_rtx)
4412     return cmp0;
4413
4414   if (uns_arith_operand (cmp1, VOIDmode))
4415     return expand_binop (GET_MODE (cmp0), xor_optab,
4416                          cmp0, cmp1, 0, 0, OPTAB_DIRECT);
4417
4418   return expand_binop (GET_MODE (cmp0), sub_optab,
4419                        cmp0, cmp1, 0, 0, OPTAB_DIRECT);
4420 }
4421
4422 /* Convert *CODE into a code that can be used in a floating-point
4423    scc instruction (C.cond.fmt).  Return true if the values of
4424    the condition code registers will be inverted, with 0 indicating
4425    that the condition holds.  */
4426
4427 static bool
4428 mips_reversed_fp_cond (enum rtx_code *code)
4429 {
4430   switch (*code)
4431     {
4432     case NE:
4433     case LTGT:
4434     case ORDERED:
4435       *code = reverse_condition_maybe_unordered (*code);
4436       return true;
4437
4438     default:
4439       return false;
4440     }
4441 }
4442
4443 /* Convert a comparison into something that can be used in a branch or
4444    conditional move.  On entry, *OP0 and *OP1 are the values being
4445    compared and *CODE is the code used to compare them.
4446
4447    Update *CODE, *OP0 and *OP1 so that they describe the final comparison.
4448    If NEED_EQ_NE_P, then only EQ or NE comparisons against zero are possible,
4449    otherwise any standard branch condition can be used.  The standard branch
4450    conditions are:
4451
4452       - EQ or NE between two registers.
4453       - any comparison between a register and zero.  */
4454
4455 static void
4456 mips_emit_compare (enum rtx_code *code, rtx *op0, rtx *op1, bool need_eq_ne_p)
4457 {
4458   rtx cmp_op0 = *op0;
4459   rtx cmp_op1 = *op1;
4460
4461   if (GET_MODE_CLASS (GET_MODE (*op0)) == MODE_INT)
4462     {
4463       if (!need_eq_ne_p && *op1 == const0_rtx)
4464         ;
4465       else if (*code == EQ || *code == NE)
4466         {
4467           if (need_eq_ne_p)
4468             {
4469               *op0 = mips_zero_if_equal (cmp_op0, cmp_op1);
4470               *op1 = const0_rtx;
4471             }
4472           else
4473             *op1 = force_reg (GET_MODE (cmp_op0), cmp_op1);
4474         }
4475       else
4476         {
4477           /* The comparison needs a separate scc instruction.  Store the
4478              result of the scc in *OP0 and compare it against zero.  */
4479           bool invert = false;
4480           *op0 = gen_reg_rtx (GET_MODE (cmp_op0));
4481           mips_emit_int_order_test (*code, &invert, *op0, cmp_op0, cmp_op1);
4482           *code = (invert ? EQ : NE);
4483           *op1 = const0_rtx;
4484         }
4485     }
4486   else if (ALL_FIXED_POINT_MODE_P (GET_MODE (cmp_op0)))
4487     {
4488       *op0 = gen_rtx_REG (CCDSPmode, CCDSP_CC_REGNUM);
4489       mips_emit_binary (*code, *op0, cmp_op0, cmp_op1);
4490       *code = NE;
4491       *op1 = const0_rtx;
4492     }
4493   else
4494     {
4495       enum rtx_code cmp_code;
4496
4497       /* Floating-point tests use a separate C.cond.fmt comparison to
4498          set a condition code register.  The branch or conditional move
4499          will then compare that register against zero.
4500
4501          Set CMP_CODE to the code of the comparison instruction and
4502          *CODE to the code that the branch or move should use.  */
4503       cmp_code = *code;
4504       *code = mips_reversed_fp_cond (&cmp_code) ? EQ : NE;
4505       *op0 = (ISA_HAS_8CC
4506               ? gen_reg_rtx (CCmode)
4507               : gen_rtx_REG (CCmode, FPSW_REGNUM));
4508       *op1 = const0_rtx;
4509       mips_emit_binary (cmp_code, *op0, cmp_op0, cmp_op1);
4510     }
4511 }
4512 \f
4513 /* Try performing the comparison in OPERANDS[1], whose arms are OPERANDS[2]
4514    and OPERAND[3].  Store the result in OPERANDS[0].
4515
4516    On 64-bit targets, the mode of the comparison and target will always be
4517    SImode, thus possibly narrower than that of the comparison's operands.  */
4518
4519 void
4520 mips_expand_scc (rtx operands[])
4521 {
4522   rtx target = operands[0];
4523   enum rtx_code code = GET_CODE (operands[1]);
4524   rtx op0 = operands[2];
4525   rtx op1 = operands[3];
4526
4527   gcc_assert (GET_MODE_CLASS (GET_MODE (op0)) == MODE_INT);
4528
4529   if (code == EQ || code == NE)
4530     {
4531       if (ISA_HAS_SEQ_SNE
4532           && reg_imm10_operand (op1, GET_MODE (op1)))
4533         mips_emit_binary (code, target, op0, op1);
4534       else
4535         {
4536           rtx zie = mips_zero_if_equal (op0, op1);
4537           mips_emit_binary (code, target, zie, const0_rtx);
4538         }
4539     }
4540   else
4541     mips_emit_int_order_test (code, 0, target, op0, op1);
4542 }
4543
4544 /* Compare OPERANDS[1] with OPERANDS[2] using comparison code
4545    CODE and jump to OPERANDS[3] if the condition holds.  */
4546
4547 void
4548 mips_expand_conditional_branch (rtx *operands)
4549 {
4550   enum rtx_code code = GET_CODE (operands[0]);
4551   rtx op0 = operands[1];
4552   rtx op1 = operands[2];
4553   rtx condition;
4554
4555   mips_emit_compare (&code, &op0, &op1, TARGET_MIPS16);
4556   condition = gen_rtx_fmt_ee (code, VOIDmode, op0, op1);
4557   emit_jump_insn (gen_condjump (condition, operands[3]));
4558 }
4559
4560 /* Implement:
4561
4562    (set temp (COND:CCV2 CMP_OP0 CMP_OP1))
4563    (set DEST (unspec [TRUE_SRC FALSE_SRC temp] UNSPEC_MOVE_TF_PS))  */
4564
4565 void
4566 mips_expand_vcondv2sf (rtx dest, rtx true_src, rtx false_src,
4567                        enum rtx_code cond, rtx cmp_op0, rtx cmp_op1)
4568 {
4569   rtx cmp_result;
4570   bool reversed_p;
4571
4572   reversed_p = mips_reversed_fp_cond (&cond);
4573   cmp_result = gen_reg_rtx (CCV2mode);
4574   emit_insn (gen_scc_ps (cmp_result,
4575                          gen_rtx_fmt_ee (cond, VOIDmode, cmp_op0, cmp_op1)));
4576   if (reversed_p)
4577     emit_insn (gen_mips_cond_move_tf_ps (dest, false_src, true_src,
4578                                          cmp_result));
4579   else
4580     emit_insn (gen_mips_cond_move_tf_ps (dest, true_src, false_src,
4581                                          cmp_result));
4582 }
4583
4584 /* Perform the comparison in OPERANDS[1].  Move OPERANDS[2] into OPERANDS[0]
4585    if the condition holds, otherwise move OPERANDS[3] into OPERANDS[0].  */
4586
4587 void
4588 mips_expand_conditional_move (rtx *operands)
4589 {
4590   rtx cond;
4591   enum rtx_code code = GET_CODE (operands[1]);
4592   rtx op0 = XEXP (operands[1], 0);
4593   rtx op1 = XEXP (operands[1], 1);
4594
4595   mips_emit_compare (&code, &op0, &op1, true);
4596   cond = gen_rtx_fmt_ee (code, GET_MODE (op0), op0, op1);
4597   emit_insn (gen_rtx_SET (VOIDmode, operands[0],
4598                           gen_rtx_IF_THEN_ELSE (GET_MODE (operands[0]), cond,
4599                                                 operands[2], operands[3])));
4600 }
4601
4602 /* Perform the comparison in COMPARISON, then trap if the condition holds.  */
4603
4604 void
4605 mips_expand_conditional_trap (rtx comparison)
4606 {
4607   rtx op0, op1;
4608   enum machine_mode mode;
4609   enum rtx_code code;
4610
4611   /* MIPS conditional trap instructions don't have GT or LE flavors,
4612      so we must swap the operands and convert to LT and GE respectively.  */
4613   code = GET_CODE (comparison);
4614   switch (code)
4615     {
4616     case GT:
4617     case LE:
4618     case GTU:
4619     case LEU:
4620       code = swap_condition (code);
4621       op0 = XEXP (comparison, 1);
4622       op1 = XEXP (comparison, 0);
4623       break;
4624
4625     default:
4626       op0 = XEXP (comparison, 0);
4627       op1 = XEXP (comparison, 1);
4628       break;
4629     }
4630
4631   mode = GET_MODE (XEXP (comparison, 0));
4632   op0 = force_reg (mode, op0);
4633   if (!arith_operand (op1, mode))
4634     op1 = force_reg (mode, op1);
4635
4636   emit_insn (gen_rtx_TRAP_IF (VOIDmode,
4637                               gen_rtx_fmt_ee (code, mode, op0, op1),
4638                               const0_rtx));
4639 }
4640 \f
4641 /* Initialize *CUM for a call to a function of type FNTYPE.  */
4642
4643 void
4644 mips_init_cumulative_args (CUMULATIVE_ARGS *cum, tree fntype)
4645 {
4646   memset (cum, 0, sizeof (*cum));
4647   cum->prototype = (fntype && prototype_p (fntype));
4648   cum->gp_reg_found = (cum->prototype && stdarg_p (fntype));
4649 }
4650
4651 /* Fill INFO with information about a single argument.  CUM is the
4652    cumulative state for earlier arguments.  MODE is the mode of this
4653    argument and TYPE is its type (if known).  NAMED is true if this
4654    is a named (fixed) argument rather than a variable one.  */
4655
4656 static void
4657 mips_get_arg_info (struct mips_arg_info *info, const CUMULATIVE_ARGS *cum,
4658                    enum machine_mode mode, tree type, int named)
4659 {
4660   bool doubleword_aligned_p;
4661   unsigned int num_bytes, num_words, max_regs;
4662
4663   /* Work out the size of the argument.  */
4664   num_bytes = type ? int_size_in_bytes (type) : GET_MODE_SIZE (mode);
4665   num_words = (num_bytes + UNITS_PER_WORD - 1) / UNITS_PER_WORD;
4666
4667   /* Decide whether it should go in a floating-point register, assuming
4668      one is free.  Later code checks for availability.
4669
4670      The checks against UNITS_PER_FPVALUE handle the soft-float and
4671      single-float cases.  */
4672   switch (mips_abi)
4673     {
4674     case ABI_EABI:
4675       /* The EABI conventions have traditionally been defined in terms
4676          of TYPE_MODE, regardless of the actual type.  */
4677       info->fpr_p = ((GET_MODE_CLASS (mode) == MODE_FLOAT
4678                       || GET_MODE_CLASS (mode) == MODE_VECTOR_FLOAT)
4679                      && GET_MODE_SIZE (mode) <= UNITS_PER_FPVALUE);
4680       break;
4681
4682     case ABI_32:
4683     case ABI_O64:
4684       /* Only leading floating-point scalars are passed in
4685          floating-point registers.  We also handle vector floats the same
4686          say, which is OK because they are not covered by the standard ABI.  */
4687       info->fpr_p = (!cum->gp_reg_found
4688                      && cum->arg_number < 2
4689                      && (type == 0
4690                          || SCALAR_FLOAT_TYPE_P (type)
4691                          || VECTOR_FLOAT_TYPE_P (type))
4692                      && (GET_MODE_CLASS (mode) == MODE_FLOAT
4693                          || GET_MODE_CLASS (mode) == MODE_VECTOR_FLOAT)
4694                      && GET_MODE_SIZE (mode) <= UNITS_PER_FPVALUE);
4695       break;
4696
4697     case ABI_N32:
4698     case ABI_64:
4699       /* Scalar, complex and vector floating-point types are passed in
4700          floating-point registers, as long as this is a named rather
4701          than a variable argument.  */
4702       info->fpr_p = (named
4703                      && (type == 0 || FLOAT_TYPE_P (type))
4704                      && (GET_MODE_CLASS (mode) == MODE_FLOAT
4705                          || GET_MODE_CLASS (mode) == MODE_COMPLEX_FLOAT
4706                          || GET_MODE_CLASS (mode) == MODE_VECTOR_FLOAT)
4707                      && GET_MODE_UNIT_SIZE (mode) <= UNITS_PER_FPVALUE);
4708
4709       /* ??? According to the ABI documentation, the real and imaginary
4710          parts of complex floats should be passed in individual registers.
4711          The real and imaginary parts of stack arguments are supposed
4712          to be contiguous and there should be an extra word of padding
4713          at the end.
4714
4715          This has two problems.  First, it makes it impossible to use a
4716          single "void *" va_list type, since register and stack arguments
4717          are passed differently.  (At the time of writing, MIPSpro cannot
4718          handle complex float varargs correctly.)  Second, it's unclear
4719          what should happen when there is only one register free.
4720
4721          For now, we assume that named complex floats should go into FPRs
4722          if there are two FPRs free, otherwise they should be passed in the
4723          same way as a struct containing two floats.  */
4724       if (info->fpr_p
4725           && GET_MODE_CLASS (mode) == MODE_COMPLEX_FLOAT
4726           && GET_MODE_UNIT_SIZE (mode) < UNITS_PER_FPVALUE)
4727         {
4728           if (cum->num_gprs >= MAX_ARGS_IN_REGISTERS - 1)
4729             info->fpr_p = false;
4730           else
4731             num_words = 2;
4732         }
4733       break;
4734
4735     default:
4736       gcc_unreachable ();
4737     }
4738
4739   /* See whether the argument has doubleword alignment.  */
4740   doubleword_aligned_p = FUNCTION_ARG_BOUNDARY (mode, type) > BITS_PER_WORD;
4741
4742   /* Set REG_OFFSET to the register count we're interested in.
4743      The EABI allocates the floating-point registers separately,
4744      but the other ABIs allocate them like integer registers.  */
4745   info->reg_offset = (mips_abi == ABI_EABI && info->fpr_p
4746                       ? cum->num_fprs
4747                       : cum->num_gprs);
4748
4749   /* Advance to an even register if the argument is doubleword-aligned.  */
4750   if (doubleword_aligned_p)
4751     info->reg_offset += info->reg_offset & 1;
4752
4753   /* Work out the offset of a stack argument.  */
4754   info->stack_offset = cum->stack_words;
4755   if (doubleword_aligned_p)
4756     info->stack_offset += info->stack_offset & 1;
4757
4758   max_regs = MAX_ARGS_IN_REGISTERS - info->reg_offset;
4759
4760   /* Partition the argument between registers and stack.  */
4761   info->reg_words = MIN (num_words, max_regs);
4762   info->stack_words = num_words - info->reg_words;
4763 }
4764
4765 /* INFO describes a register argument that has the normal format for the
4766    argument's mode.  Return the register it uses, assuming that FPRs are
4767    available if HARD_FLOAT_P.  */
4768
4769 static unsigned int
4770 mips_arg_regno (const struct mips_arg_info *info, bool hard_float_p)
4771 {
4772   if (!info->fpr_p || !hard_float_p)
4773     return GP_ARG_FIRST + info->reg_offset;
4774   else if (mips_abi == ABI_32 && TARGET_DOUBLE_FLOAT && info->reg_offset > 0)
4775     /* In o32, the second argument is always passed in $f14
4776        for TARGET_DOUBLE_FLOAT, regardless of whether the
4777        first argument was a word or doubleword.  */
4778     return FP_ARG_FIRST + 2;
4779   else
4780     return FP_ARG_FIRST + info->reg_offset;
4781 }
4782
4783 /* Implement TARGET_STRICT_ARGUMENT_NAMING.  */
4784
4785 static bool
4786 mips_strict_argument_naming (CUMULATIVE_ARGS *ca ATTRIBUTE_UNUSED)
4787 {
4788   return !TARGET_OLDABI;
4789 }
4790
4791 /* Implement FUNCTION_ARG.  */
4792
4793 rtx
4794 mips_function_arg (const CUMULATIVE_ARGS *cum, enum machine_mode mode,
4795                    tree type, int named)
4796 {
4797   struct mips_arg_info info;
4798
4799   /* We will be called with a mode of VOIDmode after the last argument
4800      has been seen.  Whatever we return will be passed to the call expander.
4801      If we need a MIPS16 fp_code, return a REG with the code stored as
4802      the mode.  */
4803   if (mode == VOIDmode)
4804     {
4805       if (TARGET_MIPS16 && cum->fp_code != 0)
4806         return gen_rtx_REG ((enum machine_mode) cum->fp_code, 0);
4807       else
4808         return NULL;
4809     }
4810
4811   mips_get_arg_info (&info, cum, mode, type, named);
4812
4813   /* Return straight away if the whole argument is passed on the stack.  */
4814   if (info.reg_offset == MAX_ARGS_IN_REGISTERS)
4815     return NULL;
4816
4817   /* The n32 and n64 ABIs say that if any 64-bit chunk of the structure
4818      contains a double in its entirety, then that 64-bit chunk is passed
4819      in a floating-point register.  */
4820   if (TARGET_NEWABI
4821       && TARGET_HARD_FLOAT
4822       && named
4823       && type != 0
4824       && TREE_CODE (type) == RECORD_TYPE
4825       && TYPE_SIZE_UNIT (type)
4826       && host_integerp (TYPE_SIZE_UNIT (type), 1))
4827     {
4828       tree field;
4829
4830       /* First check to see if there is any such field.  */
4831       for (field = TYPE_FIELDS (type); field; field = TREE_CHAIN (field))
4832         if (TREE_CODE (field) == FIELD_DECL
4833             && SCALAR_FLOAT_TYPE_P (TREE_TYPE (field))
4834             && TYPE_PRECISION (TREE_TYPE (field)) == BITS_PER_WORD
4835             && host_integerp (bit_position (field), 0)
4836             && int_bit_position (field) % BITS_PER_WORD == 0)
4837           break;
4838
4839       if (field != 0)
4840         {
4841           /* Now handle the special case by returning a PARALLEL
4842              indicating where each 64-bit chunk goes.  INFO.REG_WORDS
4843              chunks are passed in registers.  */
4844           unsigned int i;
4845           HOST_WIDE_INT bitpos;
4846           rtx ret;
4847
4848           /* assign_parms checks the mode of ENTRY_PARM, so we must
4849              use the actual mode here.  */
4850           ret = gen_rtx_PARALLEL (mode, rtvec_alloc (info.reg_words));
4851
4852           bitpos = 0;
4853           field = TYPE_FIELDS (type);
4854           for (i = 0; i < info.reg_words; i++)
4855             {
4856               rtx reg;
4857
4858               for (; field; field = TREE_CHAIN (field))
4859                 if (TREE_CODE (field) == FIELD_DECL
4860                     && int_bit_position (field) >= bitpos)
4861                   break;
4862
4863               if (field
4864                   && int_bit_position (field) == bitpos
4865                   && SCALAR_FLOAT_TYPE_P (TREE_TYPE (field))
4866                   && TYPE_PRECISION (TREE_TYPE (field)) == BITS_PER_WORD)
4867                 reg = gen_rtx_REG (DFmode, FP_ARG_FIRST + info.reg_offset + i);
4868               else
4869                 reg = gen_rtx_REG (DImode, GP_ARG_FIRST + info.reg_offset + i);
4870
4871               XVECEXP (ret, 0, i)
4872                 = gen_rtx_EXPR_LIST (VOIDmode, reg,
4873                                      GEN_INT (bitpos / BITS_PER_UNIT));
4874
4875               bitpos += BITS_PER_WORD;
4876             }
4877           return ret;
4878         }
4879     }
4880
4881   /* Handle the n32/n64 conventions for passing complex floating-point
4882      arguments in FPR pairs.  The real part goes in the lower register
4883      and the imaginary part goes in the upper register.  */
4884   if (TARGET_NEWABI
4885       && info.fpr_p
4886       && GET_MODE_CLASS (mode) == MODE_COMPLEX_FLOAT)
4887     {
4888       rtx real, imag;
4889       enum machine_mode inner;
4890       unsigned int regno;
4891
4892       inner = GET_MODE_INNER (mode);
4893       regno = FP_ARG_FIRST + info.reg_offset;
4894       if (info.reg_words * UNITS_PER_WORD == GET_MODE_SIZE (inner))
4895         {
4896           /* Real part in registers, imaginary part on stack.  */
4897           gcc_assert (info.stack_words == info.reg_words);
4898           return gen_rtx_REG (inner, regno);
4899         }
4900       else
4901         {
4902           gcc_assert (info.stack_words == 0);
4903           real = gen_rtx_EXPR_LIST (VOIDmode,
4904                                     gen_rtx_REG (inner, regno),
4905                                     const0_rtx);
4906           imag = gen_rtx_EXPR_LIST (VOIDmode,
4907                                     gen_rtx_REG (inner,
4908                                                  regno + info.reg_words / 2),
4909                                     GEN_INT (GET_MODE_SIZE (inner)));
4910           return gen_rtx_PARALLEL (mode, gen_rtvec (2, real, imag));
4911         }
4912     }
4913
4914   return gen_rtx_REG (mode, mips_arg_regno (&info, TARGET_HARD_FLOAT));
4915 }
4916
4917 /* Implement FUNCTION_ARG_ADVANCE.  */
4918
4919 void
4920 mips_function_arg_advance (CUMULATIVE_ARGS *cum, enum machine_mode mode,
4921                            tree type, int named)
4922 {
4923   struct mips_arg_info info;
4924
4925   mips_get_arg_info (&info, cum, mode, type, named);
4926
4927   if (!info.fpr_p)
4928     cum->gp_reg_found = true;
4929
4930   /* See the comment above the CUMULATIVE_ARGS structure in mips.h for
4931      an explanation of what this code does.  It assumes that we're using
4932      either the o32 or the o64 ABI, both of which pass at most 2 arguments
4933      in FPRs.  */
4934   if (cum->arg_number < 2 && info.fpr_p)
4935     cum->fp_code += (mode == SFmode ? 1 : 2) << (cum->arg_number * 2);
4936
4937   /* Advance the register count.  This has the effect of setting
4938      num_gprs to MAX_ARGS_IN_REGISTERS if a doubleword-aligned
4939      argument required us to skip the final GPR and pass the whole
4940      argument on the stack.  */
4941   if (mips_abi != ABI_EABI || !info.fpr_p)
4942     cum->num_gprs = info.reg_offset + info.reg_words;
4943   else if (info.reg_words > 0)
4944     cum->num_fprs += MAX_FPRS_PER_FMT;
4945
4946   /* Advance the stack word count.  */
4947   if (info.stack_words > 0)
4948     cum->stack_words = info.stack_offset + info.stack_words;
4949
4950   cum->arg_number++;
4951 }
4952
4953 /* Implement TARGET_ARG_PARTIAL_BYTES.  */
4954
4955 static int
4956 mips_arg_partial_bytes (CUMULATIVE_ARGS *cum,
4957                         enum machine_mode mode, tree type, bool named)
4958 {
4959   struct mips_arg_info info;
4960
4961   mips_get_arg_info (&info, cum, mode, type, named);
4962   return info.stack_words > 0 ? info.reg_words * UNITS_PER_WORD : 0;
4963 }
4964
4965 /* Implement FUNCTION_ARG_BOUNDARY.  Every parameter gets at least
4966    PARM_BOUNDARY bits of alignment, but will be given anything up
4967    to STACK_BOUNDARY bits if the type requires it.  */
4968
4969 int
4970 mips_function_arg_boundary (enum machine_mode mode, tree type)
4971 {
4972   unsigned int alignment;
4973
4974   alignment = type ? TYPE_ALIGN (type) : GET_MODE_ALIGNMENT (mode);
4975   if (alignment < PARM_BOUNDARY)
4976     alignment = PARM_BOUNDARY;
4977   if (alignment > STACK_BOUNDARY)
4978     alignment = STACK_BOUNDARY;
4979   return alignment;
4980 }
4981
4982 /* Return true if FUNCTION_ARG_PADDING (MODE, TYPE) should return
4983    upward rather than downward.  In other words, return true if the
4984    first byte of the stack slot has useful data, false if the last
4985    byte does.  */
4986
4987 bool
4988 mips_pad_arg_upward (enum machine_mode mode, const_tree type)
4989 {
4990   /* On little-endian targets, the first byte of every stack argument
4991      is passed in the first byte of the stack slot.  */
4992   if (!BYTES_BIG_ENDIAN)
4993     return true;
4994
4995   /* Otherwise, integral types are padded downward: the last byte of a
4996      stack argument is passed in the last byte of the stack slot.  */
4997   if (type != 0
4998       ? (INTEGRAL_TYPE_P (type)
4999          || POINTER_TYPE_P (type)
5000          || FIXED_POINT_TYPE_P (type))
5001       : (SCALAR_INT_MODE_P (mode)
5002          || ALL_SCALAR_FIXED_POINT_MODE_P (mode)))
5003     return false;
5004
5005   /* Big-endian o64 pads floating-point arguments downward.  */
5006   if (mips_abi == ABI_O64)
5007     if (type != 0 ? FLOAT_TYPE_P (type) : GET_MODE_CLASS (mode) == MODE_FLOAT)
5008       return false;
5009
5010   /* Other types are padded upward for o32, o64, n32 and n64.  */
5011   if (mips_abi != ABI_EABI)
5012     return true;
5013
5014   /* Arguments smaller than a stack slot are padded downward.  */
5015   if (mode != BLKmode)
5016     return GET_MODE_BITSIZE (mode) >= PARM_BOUNDARY;
5017   else
5018     return int_size_in_bytes (type) >= (PARM_BOUNDARY / BITS_PER_UNIT);
5019 }
5020
5021 /* Likewise BLOCK_REG_PADDING (MODE, TYPE, ...).  Return !BYTES_BIG_ENDIAN
5022    if the least significant byte of the register has useful data.  Return
5023    the opposite if the most significant byte does.  */
5024
5025 bool
5026 mips_pad_reg_upward (enum machine_mode mode, tree type)
5027 {
5028   /* No shifting is required for floating-point arguments.  */
5029   if (type != 0 ? FLOAT_TYPE_P (type) : GET_MODE_CLASS (mode) == MODE_FLOAT)
5030     return !BYTES_BIG_ENDIAN;
5031
5032   /* Otherwise, apply the same padding to register arguments as we do
5033      to stack arguments.  */
5034   return mips_pad_arg_upward (mode, type);
5035 }
5036
5037 /* Return nonzero when an argument must be passed by reference.  */
5038
5039 static bool
5040 mips_pass_by_reference (CUMULATIVE_ARGS *cum ATTRIBUTE_UNUSED,
5041                         enum machine_mode mode, const_tree type,
5042                         bool named ATTRIBUTE_UNUSED)
5043 {
5044   if (mips_abi == ABI_EABI)
5045     {
5046       int size;
5047
5048       /* ??? How should SCmode be handled?  */
5049       if (mode == DImode || mode == DFmode
5050           || mode == DQmode || mode == UDQmode
5051           || mode == DAmode || mode == UDAmode)
5052         return 0;
5053
5054       size = type ? int_size_in_bytes (type) : GET_MODE_SIZE (mode);
5055       return size == -1 || size > UNITS_PER_WORD;
5056     }
5057   else
5058     {
5059       /* If we have a variable-sized parameter, we have no choice.  */
5060       return targetm.calls.must_pass_in_stack (mode, type);
5061     }
5062 }
5063
5064 /* Implement TARGET_CALLEE_COPIES.  */
5065
5066 static bool
5067 mips_callee_copies (CUMULATIVE_ARGS *cum ATTRIBUTE_UNUSED,
5068                     enum machine_mode mode ATTRIBUTE_UNUSED,
5069                     const_tree type ATTRIBUTE_UNUSED, bool named)
5070 {
5071   return mips_abi == ABI_EABI && named;
5072 }
5073 \f
5074 /* See whether VALTYPE is a record whose fields should be returned in
5075    floating-point registers.  If so, return the number of fields and
5076    list them in FIELDS (which should have two elements).  Return 0
5077    otherwise.
5078
5079    For n32 & n64, a structure with one or two fields is returned in
5080    floating-point registers as long as every field has a floating-point
5081    type.  */
5082
5083 static int
5084 mips_fpr_return_fields (const_tree valtype, tree *fields)
5085 {
5086   tree field;
5087   int i;
5088
5089   if (!TARGET_NEWABI)
5090     return 0;
5091
5092   if (TREE_CODE (valtype) != RECORD_TYPE)
5093     return 0;
5094
5095   i = 0;
5096   for (field = TYPE_FIELDS (valtype); field != 0; field = TREE_CHAIN (field))
5097     {
5098       if (TREE_CODE (field) != FIELD_DECL)
5099         continue;
5100
5101       if (!SCALAR_FLOAT_TYPE_P (TREE_TYPE (field)))
5102         return 0;
5103
5104       if (i == 2)
5105         return 0;
5106
5107       fields[i++] = field;
5108     }
5109   return i;
5110 }
5111
5112 /* Implement TARGET_RETURN_IN_MSB.  For n32 & n64, we should return
5113    a value in the most significant part of $2/$3 if:
5114
5115       - the target is big-endian;
5116
5117       - the value has a structure or union type (we generalize this to
5118         cover aggregates from other languages too); and
5119
5120       - the structure is not returned in floating-point registers.  */
5121
5122 static bool
5123 mips_return_in_msb (const_tree valtype)
5124 {
5125   tree fields[2];
5126
5127   return (TARGET_NEWABI
5128           && TARGET_BIG_ENDIAN
5129           && AGGREGATE_TYPE_P (valtype)
5130           && mips_fpr_return_fields (valtype, fields) == 0);
5131 }
5132
5133 /* Return true if the function return value MODE will get returned in a
5134    floating-point register.  */
5135
5136 static bool
5137 mips_return_mode_in_fpr_p (enum machine_mode mode)
5138 {
5139   return ((GET_MODE_CLASS (mode) == MODE_FLOAT
5140            || GET_MODE_CLASS (mode) == MODE_VECTOR_FLOAT
5141            || GET_MODE_CLASS (mode) == MODE_COMPLEX_FLOAT)
5142           && GET_MODE_UNIT_SIZE (mode) <= UNITS_PER_HWFPVALUE);
5143 }
5144
5145 /* Return the representation of an FPR return register when the
5146    value being returned in FP_RETURN has mode VALUE_MODE and the
5147    return type itself has mode TYPE_MODE.  On NewABI targets,
5148    the two modes may be different for structures like:
5149
5150        struct __attribute__((packed)) foo { float f; }
5151
5152    where we return the SFmode value of "f" in FP_RETURN, but where
5153    the structure itself has mode BLKmode.  */
5154
5155 static rtx
5156 mips_return_fpr_single (enum machine_mode type_mode,
5157                         enum machine_mode value_mode)
5158 {
5159   rtx x;
5160
5161   x = gen_rtx_REG (value_mode, FP_RETURN);
5162   if (type_mode != value_mode)
5163     {
5164       x = gen_rtx_EXPR_LIST (VOIDmode, x, const0_rtx);
5165       x = gen_rtx_PARALLEL (type_mode, gen_rtvec (1, x));
5166     }
5167   return x;
5168 }
5169
5170 /* Return a composite value in a pair of floating-point registers.
5171    MODE1 and OFFSET1 are the mode and byte offset for the first value,
5172    likewise MODE2 and OFFSET2 for the second.  MODE is the mode of the
5173    complete value.
5174
5175    For n32 & n64, $f0 always holds the first value and $f2 the second.
5176    Otherwise the values are packed together as closely as possible.  */
5177
5178 static rtx
5179 mips_return_fpr_pair (enum machine_mode mode,
5180                       enum machine_mode mode1, HOST_WIDE_INT offset1,
5181                       enum machine_mode mode2, HOST_WIDE_INT offset2)
5182 {
5183   int inc;
5184
5185   inc = (TARGET_NEWABI ? 2 : MAX_FPRS_PER_FMT);
5186   return gen_rtx_PARALLEL
5187     (mode,
5188      gen_rtvec (2,
5189                 gen_rtx_EXPR_LIST (VOIDmode,
5190                                    gen_rtx_REG (mode1, FP_RETURN),
5191                                    GEN_INT (offset1)),
5192                 gen_rtx_EXPR_LIST (VOIDmode,
5193                                    gen_rtx_REG (mode2, FP_RETURN + inc),
5194                                    GEN_INT (offset2))));
5195
5196 }
5197
5198 /* Implement FUNCTION_VALUE and LIBCALL_VALUE.  For normal calls,
5199    VALTYPE is the return type and MODE is VOIDmode.  For libcalls,
5200    VALTYPE is null and MODE is the mode of the return value.  */
5201
5202 rtx
5203 mips_function_value (const_tree valtype, const_tree func, enum machine_mode mode)
5204 {
5205   if (valtype)
5206     {
5207       tree fields[2];
5208       int unsigned_p;
5209
5210       mode = TYPE_MODE (valtype);
5211       unsigned_p = TYPE_UNSIGNED (valtype);
5212
5213       /* Since TARGET_PROMOTE_FUNCTION_MODE unconditionally promotes,
5214          return values, promote the mode here too.  */
5215       mode = promote_function_mode (valtype, mode, &unsigned_p, func, 1);
5216
5217       /* Handle structures whose fields are returned in $f0/$f2.  */
5218       switch (mips_fpr_return_fields (valtype, fields))
5219         {
5220         case 1:
5221           return mips_return_fpr_single (mode,
5222                                          TYPE_MODE (TREE_TYPE (fields[0])));
5223
5224         case 2:
5225           return mips_return_fpr_pair (mode,
5226                                        TYPE_MODE (TREE_TYPE (fields[0])),
5227                                        int_byte_position (fields[0]),
5228                                        TYPE_MODE (TREE_TYPE (fields[1])),
5229                                        int_byte_position (fields[1]));
5230         }
5231
5232       /* If a value is passed in the most significant part of a register, see
5233          whether we have to round the mode up to a whole number of words.  */
5234       if (mips_return_in_msb (valtype))
5235         {
5236           HOST_WIDE_INT size = int_size_in_bytes (valtype);
5237           if (size % UNITS_PER_WORD != 0)
5238             {
5239               size += UNITS_PER_WORD - size % UNITS_PER_WORD;
5240               mode = mode_for_size (size * BITS_PER_UNIT, MODE_INT, 0);
5241             }
5242         }
5243
5244       /* For EABI, the class of return register depends entirely on MODE.
5245          For example, "struct { some_type x; }" and "union { some_type x; }"
5246          are returned in the same way as a bare "some_type" would be.
5247          Other ABIs only use FPRs for scalar, complex or vector types.  */
5248       if (mips_abi != ABI_EABI && !FLOAT_TYPE_P (valtype))
5249         return gen_rtx_REG (mode, GP_RETURN);
5250     }
5251
5252   if (!TARGET_MIPS16)
5253     {
5254       /* Handle long doubles for n32 & n64.  */
5255       if (mode == TFmode)
5256         return mips_return_fpr_pair (mode,
5257                                      DImode, 0,
5258                                      DImode, GET_MODE_SIZE (mode) / 2);
5259
5260       if (mips_return_mode_in_fpr_p (mode))
5261         {
5262           if (GET_MODE_CLASS (mode) == MODE_COMPLEX_FLOAT)
5263             return mips_return_fpr_pair (mode,
5264                                          GET_MODE_INNER (mode), 0,
5265                                          GET_MODE_INNER (mode),
5266                                          GET_MODE_SIZE (mode) / 2);
5267           else
5268             return gen_rtx_REG (mode, FP_RETURN);
5269         }
5270     }
5271
5272   return gen_rtx_REG (mode, GP_RETURN);
5273 }
5274
5275 /* Implement TARGET_RETURN_IN_MEMORY.  Under the o32 and o64 ABIs,
5276    all BLKmode objects are returned in memory.  Under the n32, n64
5277    and embedded ABIs, small structures are returned in a register.
5278    Objects with varying size must still be returned in memory, of
5279    course.  */
5280
5281 static bool
5282 mips_return_in_memory (const_tree type, const_tree fndecl ATTRIBUTE_UNUSED)
5283 {
5284   return (TARGET_OLDABI
5285           ? TYPE_MODE (type) == BLKmode
5286           : !IN_RANGE (int_size_in_bytes (type), 0, 2 * UNITS_PER_WORD));
5287 }
5288 \f
5289 /* Implement TARGET_SETUP_INCOMING_VARARGS.  */
5290
5291 static void
5292 mips_setup_incoming_varargs (CUMULATIVE_ARGS *cum, enum machine_mode mode,
5293                              tree type, int *pretend_size ATTRIBUTE_UNUSED,
5294                              int no_rtl)
5295 {
5296   CUMULATIVE_ARGS local_cum;
5297   int gp_saved, fp_saved;
5298
5299   /* The caller has advanced CUM up to, but not beyond, the last named
5300      argument.  Advance a local copy of CUM past the last "real" named
5301      argument, to find out how many registers are left over.  */
5302   local_cum = *cum;
5303   FUNCTION_ARG_ADVANCE (local_cum, mode, type, true);
5304
5305   /* Found out how many registers we need to save.  */
5306   gp_saved = MAX_ARGS_IN_REGISTERS - local_cum.num_gprs;
5307   fp_saved = (EABI_FLOAT_VARARGS_P
5308               ? MAX_ARGS_IN_REGISTERS - local_cum.num_fprs
5309               : 0);
5310
5311   if (!no_rtl)
5312     {
5313       if (gp_saved > 0)
5314         {
5315           rtx ptr, mem;
5316
5317           ptr = plus_constant (virtual_incoming_args_rtx,
5318                                REG_PARM_STACK_SPACE (cfun->decl)
5319                                - gp_saved * UNITS_PER_WORD);
5320           mem = gen_frame_mem (BLKmode, ptr);
5321           set_mem_alias_set (mem, get_varargs_alias_set ());
5322
5323           move_block_from_reg (local_cum.num_gprs + GP_ARG_FIRST,
5324                                mem, gp_saved);
5325         }
5326       if (fp_saved > 0)
5327         {
5328           /* We can't use move_block_from_reg, because it will use
5329              the wrong mode.  */
5330           enum machine_mode mode;
5331           int off, i;
5332
5333           /* Set OFF to the offset from virtual_incoming_args_rtx of
5334              the first float register.  The FP save area lies below
5335              the integer one, and is aligned to UNITS_PER_FPVALUE bytes.  */
5336           off = (-gp_saved * UNITS_PER_WORD) & -UNITS_PER_FPVALUE;
5337           off -= fp_saved * UNITS_PER_FPREG;
5338
5339           mode = TARGET_SINGLE_FLOAT ? SFmode : DFmode;
5340
5341           for (i = local_cum.num_fprs; i < MAX_ARGS_IN_REGISTERS;
5342                i += MAX_FPRS_PER_FMT)
5343             {
5344               rtx ptr, mem;
5345
5346               ptr = plus_constant (virtual_incoming_args_rtx, off);
5347               mem = gen_frame_mem (mode, ptr);
5348               set_mem_alias_set (mem, get_varargs_alias_set ());
5349               mips_emit_move (mem, gen_rtx_REG (mode, FP_ARG_FIRST + i));
5350               off += UNITS_PER_HWFPVALUE;
5351             }
5352         }
5353     }
5354   if (REG_PARM_STACK_SPACE (cfun->decl) == 0)
5355     cfun->machine->varargs_size = (gp_saved * UNITS_PER_WORD
5356                                    + fp_saved * UNITS_PER_FPREG);
5357 }
5358
5359 /* Implement TARGET_BUILTIN_VA_LIST.  */
5360
5361 static tree
5362 mips_build_builtin_va_list (void)
5363 {
5364   if (EABI_FLOAT_VARARGS_P)
5365     {
5366       /* We keep 3 pointers, and two offsets.
5367
5368          Two pointers are to the overflow area, which starts at the CFA.
5369          One of these is constant, for addressing into the GPR save area
5370          below it.  The other is advanced up the stack through the
5371          overflow region.
5372
5373          The third pointer is to the bottom of the GPR save area.
5374          Since the FPR save area is just below it, we can address
5375          FPR slots off this pointer.
5376
5377          We also keep two one-byte offsets, which are to be subtracted
5378          from the constant pointers to yield addresses in the GPR and
5379          FPR save areas.  These are downcounted as float or non-float
5380          arguments are used, and when they get to zero, the argument
5381          must be obtained from the overflow region.  */
5382       tree f_ovfl, f_gtop, f_ftop, f_goff, f_foff, f_res, record;
5383       tree array, index;
5384
5385       record = lang_hooks.types.make_type (RECORD_TYPE);
5386
5387       f_ovfl = build_decl (BUILTINS_LOCATION,
5388                            FIELD_DECL, get_identifier ("__overflow_argptr"),
5389                            ptr_type_node);
5390       f_gtop = build_decl (BUILTINS_LOCATION,
5391                            FIELD_DECL, get_identifier ("__gpr_top"),
5392                            ptr_type_node);
5393       f_ftop = build_decl (BUILTINS_LOCATION,
5394                            FIELD_DECL, get_identifier ("__fpr_top"),
5395                            ptr_type_node);
5396       f_goff = build_decl (BUILTINS_LOCATION,
5397                            FIELD_DECL, get_identifier ("__gpr_offset"),
5398                            unsigned_char_type_node);
5399       f_foff = build_decl (BUILTINS_LOCATION,
5400                            FIELD_DECL, get_identifier ("__fpr_offset"),
5401                            unsigned_char_type_node);
5402       /* Explicitly pad to the size of a pointer, so that -Wpadded won't
5403          warn on every user file.  */
5404       index = build_int_cst (NULL_TREE, GET_MODE_SIZE (ptr_mode) - 2 - 1);
5405       array = build_array_type (unsigned_char_type_node,
5406                                 build_index_type (index));
5407       f_res = build_decl (BUILTINS_LOCATION,
5408                           FIELD_DECL, get_identifier ("__reserved"), array);
5409
5410       DECL_FIELD_CONTEXT (f_ovfl) = record;
5411       DECL_FIELD_CONTEXT (f_gtop) = record;
5412       DECL_FIELD_CONTEXT (f_ftop) = record;
5413       DECL_FIELD_CONTEXT (f_goff) = record;
5414       DECL_FIELD_CONTEXT (f_foff) = record;
5415       DECL_FIELD_CONTEXT (f_res) = record;
5416
5417       TYPE_FIELDS (record) = f_ovfl;
5418       TREE_CHAIN (f_ovfl) = f_gtop;
5419       TREE_CHAIN (f_gtop) = f_ftop;
5420       TREE_CHAIN (f_ftop) = f_goff;
5421       TREE_CHAIN (f_goff) = f_foff;
5422       TREE_CHAIN (f_foff) = f_res;
5423
5424       layout_type (record);
5425       return record;
5426     }
5427   else if (TARGET_IRIX && TARGET_IRIX6)
5428     /* On IRIX 6, this type is 'char *'.  */
5429     return build_pointer_type (char_type_node);
5430   else
5431     /* Otherwise, we use 'void *'.  */
5432     return ptr_type_node;
5433 }
5434
5435 /* Implement TARGET_EXPAND_BUILTIN_VA_START.  */
5436
5437 static void
5438 mips_va_start (tree valist, rtx nextarg)
5439 {
5440   if (EABI_FLOAT_VARARGS_P)
5441     {
5442       const CUMULATIVE_ARGS *cum;
5443       tree f_ovfl, f_gtop, f_ftop, f_goff, f_foff;
5444       tree ovfl, gtop, ftop, goff, foff;
5445       tree t;
5446       int gpr_save_area_size;
5447       int fpr_save_area_size;
5448       int fpr_offset;
5449
5450       cum = &crtl->args.info;
5451       gpr_save_area_size
5452         = (MAX_ARGS_IN_REGISTERS - cum->num_gprs) * UNITS_PER_WORD;
5453       fpr_save_area_size
5454         = (MAX_ARGS_IN_REGISTERS - cum->num_fprs) * UNITS_PER_FPREG;
5455
5456       f_ovfl = TYPE_FIELDS (va_list_type_node);
5457       f_gtop = TREE_CHAIN (f_ovfl);
5458       f_ftop = TREE_CHAIN (f_gtop);
5459       f_goff = TREE_CHAIN (f_ftop);
5460       f_foff = TREE_CHAIN (f_goff);
5461
5462       ovfl = build3 (COMPONENT_REF, TREE_TYPE (f_ovfl), valist, f_ovfl,
5463                      NULL_TREE);
5464       gtop = build3 (COMPONENT_REF, TREE_TYPE (f_gtop), valist, f_gtop,
5465                      NULL_TREE);
5466       ftop = build3 (COMPONENT_REF, TREE_TYPE (f_ftop), valist, f_ftop,
5467                      NULL_TREE);
5468       goff = build3 (COMPONENT_REF, TREE_TYPE (f_goff), valist, f_goff,
5469                      NULL_TREE);
5470       foff = build3 (COMPONENT_REF, TREE_TYPE (f_foff), valist, f_foff,
5471                      NULL_TREE);
5472
5473       /* Emit code to initialize OVFL, which points to the next varargs
5474          stack argument.  CUM->STACK_WORDS gives the number of stack
5475          words used by named arguments.  */
5476       t = make_tree (TREE_TYPE (ovfl), virtual_incoming_args_rtx);
5477       if (cum->stack_words > 0)
5478         t = build2 (POINTER_PLUS_EXPR, TREE_TYPE (ovfl), t,
5479                     size_int (cum->stack_words * UNITS_PER_WORD));
5480       t = build2 (MODIFY_EXPR, TREE_TYPE (ovfl), ovfl, t);
5481       expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
5482
5483       /* Emit code to initialize GTOP, the top of the GPR save area.  */
5484       t = make_tree (TREE_TYPE (gtop), virtual_incoming_args_rtx);
5485       t = build2 (MODIFY_EXPR, TREE_TYPE (gtop), gtop, t);
5486       expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
5487
5488       /* Emit code to initialize FTOP, the top of the FPR save area.
5489          This address is gpr_save_area_bytes below GTOP, rounded
5490          down to the next fp-aligned boundary.  */
5491       t = make_tree (TREE_TYPE (ftop), virtual_incoming_args_rtx);
5492       fpr_offset = gpr_save_area_size + UNITS_PER_FPVALUE - 1;
5493       fpr_offset &= -UNITS_PER_FPVALUE;
5494       if (fpr_offset)
5495         t = build2 (POINTER_PLUS_EXPR, TREE_TYPE (ftop), t,
5496                     size_int (-fpr_offset));
5497       t = build2 (MODIFY_EXPR, TREE_TYPE (ftop), ftop, t);
5498       expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
5499
5500       /* Emit code to initialize GOFF, the offset from GTOP of the
5501          next GPR argument.  */
5502       t = build2 (MODIFY_EXPR, TREE_TYPE (goff), goff,
5503                   build_int_cst (TREE_TYPE (goff), gpr_save_area_size));
5504       expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
5505
5506       /* Likewise emit code to initialize FOFF, the offset from FTOP
5507          of the next FPR argument.  */
5508       t = build2 (MODIFY_EXPR, TREE_TYPE (foff), foff,
5509                   build_int_cst (TREE_TYPE (foff), fpr_save_area_size));
5510       expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
5511     }
5512   else
5513     {
5514       nextarg = plus_constant (nextarg, -cfun->machine->varargs_size);
5515       std_expand_builtin_va_start (valist, nextarg);
5516     }
5517 }
5518
5519 /* Implement TARGET_GIMPLIFY_VA_ARG_EXPR.  */
5520
5521 static tree
5522 mips_gimplify_va_arg_expr (tree valist, tree type, gimple_seq *pre_p,
5523                            gimple_seq *post_p)
5524 {
5525   tree addr;
5526   bool indirect_p;
5527
5528   indirect_p = pass_by_reference (NULL, TYPE_MODE (type), type, 0);
5529   if (indirect_p)
5530     type = build_pointer_type (type);
5531
5532   if (!EABI_FLOAT_VARARGS_P)
5533     addr = std_gimplify_va_arg_expr (valist, type, pre_p, post_p);
5534   else
5535     {
5536       tree f_ovfl, f_gtop, f_ftop, f_goff, f_foff;
5537       tree ovfl, top, off, align;
5538       HOST_WIDE_INT size, rsize, osize;
5539       tree t, u;
5540
5541       f_ovfl = TYPE_FIELDS (va_list_type_node);
5542       f_gtop = TREE_CHAIN (f_ovfl);
5543       f_ftop = TREE_CHAIN (f_gtop);
5544       f_goff = TREE_CHAIN (f_ftop);
5545       f_foff = TREE_CHAIN (f_goff);
5546
5547       /* Let:
5548
5549          TOP be the top of the GPR or FPR save area;
5550          OFF be the offset from TOP of the next register;
5551          ADDR_RTX be the address of the argument;
5552          SIZE be the number of bytes in the argument type;
5553          RSIZE be the number of bytes used to store the argument
5554            when it's in the register save area; and
5555          OSIZE be the number of bytes used to store it when it's
5556            in the stack overflow area.
5557
5558          The code we want is:
5559
5560          1: off &= -rsize;        // round down
5561          2: if (off != 0)
5562          3:   {
5563          4:     addr_rtx = top - off + (BYTES_BIG_ENDIAN ? RSIZE - SIZE : 0);
5564          5:     off -= rsize;
5565          6:   }
5566          7: else
5567          8:   {
5568          9:     ovfl = ((intptr_t) ovfl + osize - 1) & -osize;
5569          10:    addr_rtx = ovfl + (BYTES_BIG_ENDIAN ? OSIZE - SIZE : 0);
5570          11:    ovfl += osize;
5571          14:  }
5572
5573          [1] and [9] can sometimes be optimized away.  */
5574
5575       ovfl = build3 (COMPONENT_REF, TREE_TYPE (f_ovfl), valist, f_ovfl,
5576                      NULL_TREE);
5577       size = int_size_in_bytes (type);
5578
5579       if (GET_MODE_CLASS (TYPE_MODE (type)) == MODE_FLOAT
5580           && GET_MODE_SIZE (TYPE_MODE (type)) <= UNITS_PER_FPVALUE)
5581         {
5582           top = build3 (COMPONENT_REF, TREE_TYPE (f_ftop),
5583                         unshare_expr (valist), f_ftop, NULL_TREE);
5584           off = build3 (COMPONENT_REF, TREE_TYPE (f_foff),
5585                         unshare_expr (valist), f_foff, NULL_TREE);
5586
5587           /* When va_start saves FPR arguments to the stack, each slot
5588              takes up UNITS_PER_HWFPVALUE bytes, regardless of the
5589              argument's precision.  */
5590           rsize = UNITS_PER_HWFPVALUE;
5591
5592           /* Overflow arguments are padded to UNITS_PER_WORD bytes
5593              (= PARM_BOUNDARY bits).  This can be different from RSIZE
5594              in two cases:
5595
5596              (1) On 32-bit targets when TYPE is a structure such as:
5597
5598              struct s { float f; };
5599
5600              Such structures are passed in paired FPRs, so RSIZE
5601              will be 8 bytes.  However, the structure only takes
5602              up 4 bytes of memory, so OSIZE will only be 4.
5603
5604              (2) In combinations such as -mgp64 -msingle-float
5605              -fshort-double.  Doubles passed in registers will then take
5606              up 4 (UNITS_PER_HWFPVALUE) bytes, but those passed on the
5607              stack take up UNITS_PER_WORD bytes.  */
5608           osize = MAX (GET_MODE_SIZE (TYPE_MODE (type)), UNITS_PER_WORD);
5609         }
5610       else
5611         {
5612           top = build3 (COMPONENT_REF, TREE_TYPE (f_gtop),
5613                         unshare_expr (valist), f_gtop, NULL_TREE);
5614           off = build3 (COMPONENT_REF, TREE_TYPE (f_goff),
5615                         unshare_expr (valist), f_goff, NULL_TREE);
5616           rsize = (size + UNITS_PER_WORD - 1) & -UNITS_PER_WORD;
5617           if (rsize > UNITS_PER_WORD)
5618             {
5619               /* [1] Emit code for: off &= -rsize.      */
5620               t = build2 (BIT_AND_EXPR, TREE_TYPE (off), unshare_expr (off),
5621                           build_int_cst (TREE_TYPE (off), -rsize));
5622               gimplify_assign (unshare_expr (off), t, pre_p);
5623             }
5624           osize = rsize;
5625         }
5626
5627       /* [2] Emit code to branch if off == 0.  */
5628       t = build2 (NE_EXPR, boolean_type_node, off,
5629                   build_int_cst (TREE_TYPE (off), 0));
5630       addr = build3 (COND_EXPR, ptr_type_node, t, NULL_TREE, NULL_TREE);
5631
5632       /* [5] Emit code for: off -= rsize.  We do this as a form of
5633          post-decrement not available to C.  */
5634       t = fold_convert (TREE_TYPE (off), build_int_cst (NULL_TREE, rsize));
5635       t = build2 (POSTDECREMENT_EXPR, TREE_TYPE (off), off, t);
5636
5637       /* [4] Emit code for:
5638          addr_rtx = top - off + (BYTES_BIG_ENDIAN ? RSIZE - SIZE : 0).  */
5639       t = fold_convert (sizetype, t);
5640       t = fold_build1 (NEGATE_EXPR, sizetype, t);
5641       t = build2 (POINTER_PLUS_EXPR, TREE_TYPE (top), top, t);
5642       if (BYTES_BIG_ENDIAN && rsize > size)
5643         {
5644           u = size_int (rsize - size);
5645           t = build2 (POINTER_PLUS_EXPR, TREE_TYPE (t), t, u);
5646         }
5647       COND_EXPR_THEN (addr) = t;
5648
5649       if (osize > UNITS_PER_WORD)
5650         {
5651           /* [9] Emit: ovfl = ((intptr_t) ovfl + osize - 1) & -osize.  */
5652           u = size_int (osize - 1);
5653           t = build2 (POINTER_PLUS_EXPR, TREE_TYPE (ovfl),
5654                       unshare_expr (ovfl), u);
5655           t = fold_convert (sizetype, t);
5656           u = size_int (-osize);
5657           t = build2 (BIT_AND_EXPR, sizetype, t, u);
5658           t = fold_convert (TREE_TYPE (ovfl), t);
5659           align = build2 (MODIFY_EXPR, TREE_TYPE (ovfl),
5660                           unshare_expr (ovfl), t);
5661         }
5662       else
5663         align = NULL;
5664
5665       /* [10, 11] Emit code for:
5666          addr_rtx = ovfl + (BYTES_BIG_ENDIAN ? OSIZE - SIZE : 0)
5667          ovfl += osize.  */
5668       u = fold_convert (TREE_TYPE (ovfl), build_int_cst (NULL_TREE, osize));
5669       t = build2 (POSTINCREMENT_EXPR, TREE_TYPE (ovfl), ovfl, u);
5670       if (BYTES_BIG_ENDIAN && osize > size)
5671         {
5672           u = size_int (osize - size);
5673           t = build2 (POINTER_PLUS_EXPR, TREE_TYPE (t), t, u);
5674         }
5675
5676       /* String [9] and [10, 11] together.  */
5677       if (align)
5678         t = build2 (COMPOUND_EXPR, TREE_TYPE (t), align, t);
5679       COND_EXPR_ELSE (addr) = t;
5680
5681       addr = fold_convert (build_pointer_type (type), addr);
5682       addr = build_va_arg_indirect_ref (addr);
5683     }
5684
5685   if (indirect_p)
5686     addr = build_va_arg_indirect_ref (addr);
5687
5688   return addr;
5689 }
5690 \f
5691 /* Start a definition of function NAME.  MIPS16_P indicates whether the
5692    function contains MIPS16 code.  */
5693
5694 static void
5695 mips_start_function_definition (const char *name, bool mips16_p)
5696 {
5697   if (mips16_p)
5698     fprintf (asm_out_file, "\t.set\tmips16\n");
5699   else
5700     fprintf (asm_out_file, "\t.set\tnomips16\n");
5701
5702   if (!flag_inhibit_size_directive)
5703     {
5704       fputs ("\t.ent\t", asm_out_file);
5705       assemble_name (asm_out_file, name);
5706       fputs ("\n", asm_out_file);
5707     }
5708
5709   ASM_OUTPUT_TYPE_DIRECTIVE (asm_out_file, name, "function");
5710
5711   /* Start the definition proper.  */
5712   assemble_name (asm_out_file, name);
5713   fputs (":\n", asm_out_file);
5714 }
5715
5716 /* End a function definition started by mips_start_function_definition.  */
5717
5718 static void
5719 mips_end_function_definition (const char *name)
5720 {
5721   if (!flag_inhibit_size_directive)
5722     {
5723       fputs ("\t.end\t", asm_out_file);
5724       assemble_name (asm_out_file, name);
5725       fputs ("\n", asm_out_file);
5726     }
5727 }
5728 \f
5729 /* Return true if calls to X can use R_MIPS_CALL* relocations.  */
5730
5731 static bool
5732 mips_ok_for_lazy_binding_p (rtx x)
5733 {
5734   return (TARGET_USE_GOT
5735           && GET_CODE (x) == SYMBOL_REF
5736           && !SYMBOL_REF_BIND_NOW_P (x)
5737           && !mips_symbol_binds_local_p (x));
5738 }
5739
5740 /* Load function address ADDR into register DEST.  TYPE is as for
5741    mips_expand_call.  Return true if we used an explicit lazy-binding
5742    sequence.  */
5743
5744 static bool
5745 mips_load_call_address (enum mips_call_type type, rtx dest, rtx addr)
5746 {
5747   /* If we're generating PIC, and this call is to a global function,
5748      try to allow its address to be resolved lazily.  This isn't
5749      possible for sibcalls when $gp is call-saved because the value
5750      of $gp on entry to the stub would be our caller's gp, not ours.  */
5751   if (TARGET_EXPLICIT_RELOCS
5752       && !(type == MIPS_CALL_SIBCALL && TARGET_CALL_SAVED_GP)
5753       && mips_ok_for_lazy_binding_p (addr))
5754     {
5755       addr = mips_got_load (dest, addr, SYMBOL_GOTOFF_CALL);
5756       emit_insn (gen_rtx_SET (VOIDmode, dest, addr));
5757       return true;
5758     }
5759   else
5760     {
5761       mips_emit_move (dest, addr);
5762       return false;
5763     }
5764 }
5765 \f
5766 /* Each locally-defined hard-float MIPS16 function has a local symbol
5767    associated with it.  This hash table maps the function symbol (FUNC)
5768    to the local symbol (LOCAL). */
5769 struct GTY(()) mips16_local_alias {
5770   rtx func;
5771   rtx local;
5772 };
5773 static GTY ((param_is (struct mips16_local_alias))) htab_t mips16_local_aliases;
5774
5775 /* Hash table callbacks for mips16_local_aliases.  */
5776
5777 static hashval_t
5778 mips16_local_aliases_hash (const void *entry)
5779 {
5780   const struct mips16_local_alias *alias;
5781
5782   alias = (const struct mips16_local_alias *) entry;
5783   return htab_hash_string (XSTR (alias->func, 0));
5784 }
5785
5786 static int
5787 mips16_local_aliases_eq (const void *entry1, const void *entry2)
5788 {
5789   const struct mips16_local_alias *alias1, *alias2;
5790
5791   alias1 = (const struct mips16_local_alias *) entry1;
5792   alias2 = (const struct mips16_local_alias *) entry2;
5793   return rtx_equal_p (alias1->func, alias2->func);
5794 }
5795
5796 /* FUNC is the symbol for a locally-defined hard-float MIPS16 function.
5797    Return a local alias for it, creating a new one if necessary.  */
5798
5799 static rtx
5800 mips16_local_alias (rtx func)
5801 {
5802   struct mips16_local_alias *alias, tmp_alias;
5803   void **slot;
5804
5805   /* Create the hash table if this is the first call.  */
5806   if (mips16_local_aliases == NULL)
5807     mips16_local_aliases = htab_create_ggc (37, mips16_local_aliases_hash,
5808                                             mips16_local_aliases_eq, NULL);
5809
5810   /* Look up the function symbol, creating a new entry if need be.  */
5811   tmp_alias.func = func;
5812   slot = htab_find_slot (mips16_local_aliases, &tmp_alias, INSERT);
5813   gcc_assert (slot != NULL);
5814
5815   alias = (struct mips16_local_alias *) *slot;
5816   if (alias == NULL)
5817     {
5818       const char *func_name, *local_name;
5819       rtx local;
5820
5821       /* Create a new SYMBOL_REF for the local symbol.  The choice of
5822          __fn_local_* is based on the __fn_stub_* names that we've
5823          traditionally used for the non-MIPS16 stub.  */
5824       func_name = targetm.strip_name_encoding (XSTR (func, 0));
5825       local_name = ACONCAT (("__fn_local_", func_name, NULL));
5826       local = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (local_name));
5827       SYMBOL_REF_FLAGS (local) = SYMBOL_REF_FLAGS (func) | SYMBOL_FLAG_LOCAL;
5828
5829       /* Create a new structure to represent the mapping.  */
5830       alias = GGC_NEW (struct mips16_local_alias);
5831       alias->func = func;
5832       alias->local = local;
5833       *slot = alias;
5834     }
5835   return alias->local;
5836 }
5837 \f
5838 /* A chained list of functions for which mips16_build_call_stub has already
5839    generated a stub.  NAME is the name of the function and FP_RET_P is true
5840    if the function returns a value in floating-point registers.  */
5841 struct mips16_stub {
5842   struct mips16_stub *next;
5843   char *name;
5844   bool fp_ret_p;
5845 };
5846 static struct mips16_stub *mips16_stubs;
5847
5848 /* Return a SYMBOL_REF for a MIPS16 function called NAME.  */
5849
5850 static rtx
5851 mips16_stub_function (const char *name)
5852 {
5853   rtx x;
5854
5855   x = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (name));
5856   SYMBOL_REF_FLAGS (x) |= (SYMBOL_FLAG_EXTERNAL | SYMBOL_FLAG_FUNCTION);
5857   return x;
5858 }
5859
5860 /* Return the two-character string that identifies floating-point
5861    return mode MODE in the name of a MIPS16 function stub.  */
5862
5863 static const char *
5864 mips16_call_stub_mode_suffix (enum machine_mode mode)
5865 {
5866   if (mode == SFmode)
5867     return "sf";
5868   else if (mode == DFmode)
5869     return "df";
5870   else if (mode == SCmode)
5871     return "sc";
5872   else if (mode == DCmode)
5873     return "dc";
5874   else if (mode == V2SFmode)
5875     return "df";
5876   else
5877     gcc_unreachable ();
5878 }
5879
5880 /* Write instructions to move a 32-bit value between general register
5881    GPREG and floating-point register FPREG.  DIRECTION is 't' to move
5882    from GPREG to FPREG and 'f' to move in the opposite direction.  */
5883
5884 static void
5885 mips_output_32bit_xfer (char direction, unsigned int gpreg, unsigned int fpreg)
5886 {
5887   fprintf (asm_out_file, "\tm%cc1\t%s,%s\n", direction,
5888            reg_names[gpreg], reg_names[fpreg]);
5889 }
5890
5891 /* Likewise for 64-bit values.  */
5892
5893 static void
5894 mips_output_64bit_xfer (char direction, unsigned int gpreg, unsigned int fpreg)
5895 {
5896   if (TARGET_64BIT)
5897     fprintf (asm_out_file, "\tdm%cc1\t%s,%s\n", direction,
5898              reg_names[gpreg], reg_names[fpreg]);
5899   else if (TARGET_FLOAT64)
5900     {
5901       fprintf (asm_out_file, "\tm%cc1\t%s,%s\n", direction,
5902                reg_names[gpreg + TARGET_BIG_ENDIAN], reg_names[fpreg]);
5903       fprintf (asm_out_file, "\tm%chc1\t%s,%s\n", direction,
5904                reg_names[gpreg + TARGET_LITTLE_ENDIAN], reg_names[fpreg]);
5905     }
5906   else
5907     {
5908       /* Move the least-significant word.  */
5909       fprintf (asm_out_file, "\tm%cc1\t%s,%s\n", direction,
5910                reg_names[gpreg + TARGET_BIG_ENDIAN], reg_names[fpreg]);
5911       /* ...then the most significant word.  */
5912       fprintf (asm_out_file, "\tm%cc1\t%s,%s\n", direction,
5913                reg_names[gpreg + TARGET_LITTLE_ENDIAN], reg_names[fpreg + 1]);
5914     }
5915 }
5916
5917 /* Write out code to move floating-point arguments into or out of
5918    general registers.  FP_CODE is the code describing which arguments
5919    are present (see the comment above the definition of CUMULATIVE_ARGS
5920    in mips.h).  DIRECTION is as for mips_output_32bit_xfer.  */
5921
5922 static void
5923 mips_output_args_xfer (int fp_code, char direction)
5924 {
5925   unsigned int gparg, fparg, f;
5926   CUMULATIVE_ARGS cum;
5927
5928   /* This code only works for o32 and o64.  */
5929   gcc_assert (TARGET_OLDABI);
5930
5931   mips_init_cumulative_args (&cum, NULL);
5932
5933   for (f = (unsigned int) fp_code; f != 0; f >>= 2)
5934     {
5935       enum machine_mode mode;
5936       struct mips_arg_info info;
5937
5938       if ((f & 3) == 1)
5939         mode = SFmode;
5940       else if ((f & 3) == 2)
5941         mode = DFmode;
5942       else
5943         gcc_unreachable ();
5944
5945       mips_get_arg_info (&info, &cum, mode, NULL, true);
5946       gparg = mips_arg_regno (&info, false);
5947       fparg = mips_arg_regno (&info, true);
5948
5949       if (mode == SFmode)
5950         mips_output_32bit_xfer (direction, gparg, fparg);
5951       else
5952         mips_output_64bit_xfer (direction, gparg, fparg);
5953
5954       mips_function_arg_advance (&cum, mode, NULL, true);
5955     }
5956 }
5957
5958 /* Write a MIPS16 stub for the current function.  This stub is used
5959    for functions which take arguments in the floating-point registers.
5960    It is normal-mode code that moves the floating-point arguments
5961    into the general registers and then jumps to the MIPS16 code.  */
5962
5963 static void
5964 mips16_build_function_stub (void)
5965 {
5966   const char *fnname, *alias_name, *separator;
5967   char *secname, *stubname;
5968   tree stubdecl;
5969   unsigned int f;
5970   rtx symbol, alias;
5971
5972   /* Create the name of the stub, and its unique section.  */
5973   symbol = XEXP (DECL_RTL (current_function_decl), 0);
5974   alias = mips16_local_alias (symbol);
5975
5976   fnname = targetm.strip_name_encoding (XSTR (symbol, 0));
5977   alias_name = targetm.strip_name_encoding (XSTR (alias, 0));
5978   secname = ACONCAT ((".mips16.fn.", fnname, NULL));
5979   stubname = ACONCAT (("__fn_stub_", fnname, NULL));
5980
5981   /* Build a decl for the stub.  */
5982   stubdecl = build_decl (BUILTINS_LOCATION,
5983                          FUNCTION_DECL, get_identifier (stubname),
5984                          build_function_type (void_type_node, NULL_TREE));
5985   DECL_SECTION_NAME (stubdecl) = build_string (strlen (secname), secname);
5986   DECL_RESULT (stubdecl) = build_decl (BUILTINS_LOCATION,
5987                                        RESULT_DECL, NULL_TREE, void_type_node);
5988
5989   /* Output a comment.  */
5990   fprintf (asm_out_file, "\t# Stub function for %s (",
5991            current_function_name ());
5992   separator = "";
5993   for (f = (unsigned int) crtl->args.info.fp_code; f != 0; f >>= 2)
5994     {
5995       fprintf (asm_out_file, "%s%s", separator,
5996                (f & 3) == 1 ? "float" : "double");
5997       separator = ", ";
5998     }
5999   fprintf (asm_out_file, ")\n");
6000
6001   /* Start the function definition.  */
6002   assemble_start_function (stubdecl, stubname);
6003   mips_start_function_definition (stubname, false);
6004
6005   /* If generating pic2 code, either set up the global pointer or
6006      switch to pic0.  */
6007   if (TARGET_ABICALLS_PIC2)
6008     {
6009       if (TARGET_ABSOLUTE_ABICALLS)
6010         fprintf (asm_out_file, "\t.option\tpic0\n");
6011       else
6012         {
6013           output_asm_insn ("%(.cpload\t%^%)", NULL);
6014           /* Emit an R_MIPS_NONE relocation to tell the linker what the
6015              target function is.  Use a local GOT access when loading the
6016              symbol, to cut down on the number of unnecessary GOT entries
6017              for stubs that aren't needed.  */
6018           output_asm_insn (".reloc\t0,R_MIPS_NONE,%0", &symbol);
6019           symbol = alias;
6020         }
6021     }
6022
6023   /* Load the address of the MIPS16 function into $25.  Do this first so
6024      that targets with coprocessor interlocks can use an MFC1 to fill the
6025      delay slot.  */
6026   output_asm_insn ("la\t%^,%0", &symbol);
6027
6028   /* Move the arguments from floating-point registers to general registers.  */
6029   mips_output_args_xfer (crtl->args.info.fp_code, 'f');
6030
6031   /* Jump to the MIPS16 function.  */
6032   output_asm_insn ("jr\t%^", NULL);
6033
6034   if (TARGET_ABICALLS_PIC2 && TARGET_ABSOLUTE_ABICALLS)
6035     fprintf (asm_out_file, "\t.option\tpic2\n");
6036
6037   mips_end_function_definition (stubname);
6038
6039   /* If the linker needs to create a dynamic symbol for the target
6040      function, it will associate the symbol with the stub (which,
6041      unlike the target function, follows the proper calling conventions).
6042      It is therefore useful to have a local alias for the target function,
6043      so that it can still be identified as MIPS16 code.  As an optimization,
6044      this symbol can also be used for indirect MIPS16 references from
6045      within this file.  */
6046   ASM_OUTPUT_DEF (asm_out_file, alias_name, fnname);
6047
6048   switch_to_section (function_section (current_function_decl));
6049 }
6050
6051 /* The current function is a MIPS16 function that returns a value in an FPR.
6052    Copy the return value from its soft-float to its hard-float location.
6053    libgcc2 has special non-MIPS16 helper functions for each case.  */
6054
6055 static void
6056 mips16_copy_fpr_return_value (void)
6057 {
6058   rtx fn, insn, retval;
6059   tree return_type;
6060   enum machine_mode return_mode;
6061   const char *name;
6062
6063   return_type = DECL_RESULT (current_function_decl);
6064   return_mode = DECL_MODE (return_type);
6065
6066   name = ACONCAT (("__mips16_ret_",
6067                    mips16_call_stub_mode_suffix (return_mode),
6068                    NULL));
6069   fn = mips16_stub_function (name);
6070
6071   /* The function takes arguments in $2 (and possibly $3), so calls
6072      to it cannot be lazily bound.  */
6073   SYMBOL_REF_FLAGS (fn) |= SYMBOL_FLAG_BIND_NOW;
6074
6075   /* Model the call as something that takes the GPR return value as
6076      argument and returns an "updated" value.  */
6077   retval = gen_rtx_REG (return_mode, GP_RETURN);
6078   insn = mips_expand_call (MIPS_CALL_EPILOGUE, retval, fn,
6079                            const0_rtx, NULL_RTX, false);
6080   use_reg (&CALL_INSN_FUNCTION_USAGE (insn), retval);
6081 }
6082
6083 /* Consider building a stub for a MIPS16 call to function *FN_PTR.
6084    RETVAL is the location of the return value, or null if this is
6085    a "call" rather than a "call_value".  ARGS_SIZE is the size of the
6086    arguments and FP_CODE is the code built by mips_function_arg;
6087    see the comment before the fp_code field in CUMULATIVE_ARGS for details.
6088
6089    There are three alternatives:
6090
6091    - If a stub was needed, emit the call and return the call insn itself.
6092
6093    - If we can avoid using a stub by redirecting the call, set *FN_PTR
6094      to the new target and return null.
6095
6096    - If *FN_PTR doesn't need a stub, return null and leave *FN_PTR
6097      unmodified.
6098
6099    A stub is needed for calls to functions that, in normal mode,
6100    receive arguments in FPRs or return values in FPRs.  The stub
6101    copies the arguments from their soft-float positions to their
6102    hard-float positions, calls the real function, then copies the
6103    return value from its hard-float position to its soft-float
6104    position.
6105
6106    We can emit a JAL to *FN_PTR even when *FN_PTR might need a stub.
6107    If *FN_PTR turns out to be to a non-MIPS16 function, the linker
6108    automatically redirects the JAL to the stub, otherwise the JAL
6109    continues to call FN directly.  */
6110
6111 static rtx
6112 mips16_build_call_stub (rtx retval, rtx *fn_ptr, rtx args_size, int fp_code)
6113 {
6114   const char *fnname;
6115   bool fp_ret_p;
6116   struct mips16_stub *l;
6117   rtx insn, fn;
6118
6119   /* We don't need to do anything if we aren't in MIPS16 mode, or if
6120      we were invoked with the -msoft-float option.  */
6121   if (!TARGET_MIPS16 || TARGET_SOFT_FLOAT_ABI)
6122     return NULL_RTX;
6123
6124   /* Figure out whether the value might come back in a floating-point
6125      register.  */
6126   fp_ret_p = retval && mips_return_mode_in_fpr_p (GET_MODE (retval));
6127
6128   /* We don't need to do anything if there were no floating-point
6129      arguments and the value will not be returned in a floating-point
6130      register.  */
6131   if (fp_code == 0 && !fp_ret_p)
6132     return NULL_RTX;
6133
6134   /* We don't need to do anything if this is a call to a special
6135      MIPS16 support function.  */
6136   fn = *fn_ptr;
6137   if (mips16_stub_function_p (fn))
6138     return NULL_RTX;
6139
6140   /* This code will only work for o32 and o64 abis.  The other ABI's
6141      require more sophisticated support.  */
6142   gcc_assert (TARGET_OLDABI);
6143
6144   /* If we're calling via a function pointer, use one of the magic
6145      libgcc.a stubs provided for each (FP_CODE, FP_RET_P) combination.
6146      Each stub expects the function address to arrive in register $2.  */
6147   if (GET_CODE (fn) != SYMBOL_REF
6148       || !call_insn_operand (fn, VOIDmode))
6149     {
6150       char buf[30];
6151       rtx stub_fn, insn, addr;
6152       bool lazy_p;
6153
6154       /* If this is a locally-defined and locally-binding function,
6155          avoid the stub by calling the local alias directly.  */
6156       if (mips16_local_function_p (fn))
6157         {
6158           *fn_ptr = mips16_local_alias (fn);
6159           return NULL_RTX;
6160         }
6161
6162       /* Create a SYMBOL_REF for the libgcc.a function.  */
6163       if (fp_ret_p)
6164         sprintf (buf, "__mips16_call_stub_%s_%d",
6165                  mips16_call_stub_mode_suffix (GET_MODE (retval)),
6166                  fp_code);
6167       else
6168         sprintf (buf, "__mips16_call_stub_%d", fp_code);
6169       stub_fn = mips16_stub_function (buf);
6170
6171       /* The function uses $2 as an argument, so calls to it
6172          cannot be lazily bound.  */
6173       SYMBOL_REF_FLAGS (stub_fn) |= SYMBOL_FLAG_BIND_NOW;
6174
6175       /* Load the target function into $2.  */
6176       addr = gen_rtx_REG (Pmode, GP_REG_FIRST + 2);
6177       lazy_p = mips_load_call_address (MIPS_CALL_NORMAL, addr, fn);
6178
6179       /* Emit the call.  */
6180       insn = mips_expand_call (MIPS_CALL_NORMAL, retval, stub_fn,
6181                                args_size, NULL_RTX, lazy_p);
6182
6183       /* Tell GCC that this call does indeed use the value of $2.  */
6184       use_reg (&CALL_INSN_FUNCTION_USAGE (insn), addr);
6185
6186       /* If we are handling a floating-point return value, we need to
6187          save $18 in the function prologue.  Putting a note on the
6188          call will mean that df_regs_ever_live_p ($18) will be true if the
6189          call is not eliminated, and we can check that in the prologue
6190          code.  */
6191       if (fp_ret_p)
6192         CALL_INSN_FUNCTION_USAGE (insn) =
6193           gen_rtx_EXPR_LIST (VOIDmode,
6194                              gen_rtx_CLOBBER (VOIDmode,
6195                                               gen_rtx_REG (word_mode, 18)),
6196                              CALL_INSN_FUNCTION_USAGE (insn));
6197
6198       return insn;
6199     }
6200
6201   /* We know the function we are going to call.  If we have already
6202      built a stub, we don't need to do anything further.  */
6203   fnname = targetm.strip_name_encoding (XSTR (fn, 0));
6204   for (l = mips16_stubs; l != NULL; l = l->next)
6205     if (strcmp (l->name, fnname) == 0)
6206       break;
6207
6208   if (l == NULL)
6209     {
6210       const char *separator;
6211       char *secname, *stubname;
6212       tree stubid, stubdecl;
6213       unsigned int f;
6214
6215       /* If the function does not return in FPRs, the special stub
6216          section is named
6217              .mips16.call.FNNAME
6218
6219          If the function does return in FPRs, the stub section is named
6220              .mips16.call.fp.FNNAME
6221
6222          Build a decl for the stub.  */
6223       secname = ACONCAT ((".mips16.call.", fp_ret_p ? "fp." : "",
6224                           fnname, NULL));
6225       stubname = ACONCAT (("__call_stub_", fp_ret_p ? "fp_" : "",
6226                            fnname, NULL));
6227       stubid = get_identifier (stubname);
6228       stubdecl = build_decl (BUILTINS_LOCATION,
6229                              FUNCTION_DECL, stubid,
6230                              build_function_type (void_type_node, NULL_TREE));
6231       DECL_SECTION_NAME (stubdecl) = build_string (strlen (secname), secname);
6232       DECL_RESULT (stubdecl) = build_decl (BUILTINS_LOCATION,
6233                                            RESULT_DECL, NULL_TREE,
6234                                            void_type_node);
6235
6236       /* Output a comment.  */
6237       fprintf (asm_out_file, "\t# Stub function to call %s%s (",
6238                (fp_ret_p
6239                 ? (GET_MODE (retval) == SFmode ? "float " : "double ")
6240                 : ""),
6241                fnname);
6242       separator = "";
6243       for (f = (unsigned int) fp_code; f != 0; f >>= 2)
6244         {
6245           fprintf (asm_out_file, "%s%s", separator,
6246                    (f & 3) == 1 ? "float" : "double");
6247           separator = ", ";
6248         }
6249       fprintf (asm_out_file, ")\n");
6250
6251       /* Start the function definition.  */
6252       assemble_start_function (stubdecl, stubname);
6253       mips_start_function_definition (stubname, false);
6254
6255       if (!fp_ret_p)
6256         {
6257           /* Load the address of the MIPS16 function into $25.  Do this
6258              first so that targets with coprocessor interlocks can use
6259              an MFC1 to fill the delay slot.  */
6260           if (TARGET_EXPLICIT_RELOCS)
6261             {
6262               output_asm_insn ("lui\t%^,%%hi(%0)", &fn);
6263               output_asm_insn ("addiu\t%^,%^,%%lo(%0)", &fn);
6264             }
6265           else
6266             output_asm_insn ("la\t%^,%0", &fn);
6267         }
6268
6269       /* Move the arguments from general registers to floating-point
6270          registers.  */
6271       mips_output_args_xfer (fp_code, 't');
6272
6273       if (!fp_ret_p)
6274         {
6275           /* Jump to the previously-loaded address.  */
6276           output_asm_insn ("jr\t%^", NULL);
6277         }
6278       else
6279         {
6280           /* Save the return address in $18 and call the non-MIPS16 function.
6281              The stub's caller knows that $18 might be clobbered, even though
6282              $18 is usually a call-saved register.  */
6283           fprintf (asm_out_file, "\tmove\t%s,%s\n",
6284                    reg_names[GP_REG_FIRST + 18], reg_names[RETURN_ADDR_REGNUM]);
6285           output_asm_insn (MIPS_CALL ("jal", &fn, 0, -1), &fn);
6286
6287           /* Move the result from floating-point registers to
6288              general registers.  */
6289           switch (GET_MODE (retval))
6290             {
6291             case SCmode:
6292               mips_output_32bit_xfer ('f', GP_RETURN + 1,
6293                                       FP_REG_FIRST + MAX_FPRS_PER_FMT);
6294               /* Fall though.  */
6295             case SFmode:
6296               mips_output_32bit_xfer ('f', GP_RETURN, FP_REG_FIRST);
6297               if (GET_MODE (retval) == SCmode && TARGET_64BIT)
6298                 {
6299                   /* On 64-bit targets, complex floats are returned in
6300                      a single GPR, such that "sd" on a suitably-aligned
6301                      target would store the value correctly.  */
6302                   fprintf (asm_out_file, "\tdsll\t%s,%s,32\n",
6303                            reg_names[GP_RETURN + TARGET_LITTLE_ENDIAN],
6304                            reg_names[GP_RETURN + TARGET_LITTLE_ENDIAN]);
6305                   fprintf (asm_out_file, "\tor\t%s,%s,%s\n",
6306                            reg_names[GP_RETURN],
6307                            reg_names[GP_RETURN],
6308                            reg_names[GP_RETURN + 1]);
6309                 }
6310               break;
6311
6312             case DCmode:
6313               mips_output_64bit_xfer ('f', GP_RETURN + (8 / UNITS_PER_WORD),
6314                                       FP_REG_FIRST + MAX_FPRS_PER_FMT);
6315               /* Fall though.  */
6316             case DFmode:
6317             case V2SFmode:
6318               mips_output_64bit_xfer ('f', GP_RETURN, FP_REG_FIRST);
6319               break;
6320
6321             default:
6322               gcc_unreachable ();
6323             }
6324           fprintf (asm_out_file, "\tjr\t%s\n", reg_names[GP_REG_FIRST + 18]);
6325         }
6326
6327 #ifdef ASM_DECLARE_FUNCTION_SIZE
6328       ASM_DECLARE_FUNCTION_SIZE (asm_out_file, stubname, stubdecl);
6329 #endif
6330
6331       mips_end_function_definition (stubname);
6332
6333       /* Record this stub.  */
6334       l = XNEW (struct mips16_stub);
6335       l->name = xstrdup (fnname);
6336       l->fp_ret_p = fp_ret_p;
6337       l->next = mips16_stubs;
6338       mips16_stubs = l;
6339     }
6340
6341   /* If we expect a floating-point return value, but we've built a
6342      stub which does not expect one, then we're in trouble.  We can't
6343      use the existing stub, because it won't handle the floating-point
6344      value.  We can't build a new stub, because the linker won't know
6345      which stub to use for the various calls in this object file.
6346      Fortunately, this case is illegal, since it means that a function
6347      was declared in two different ways in a single compilation.  */
6348   if (fp_ret_p && !l->fp_ret_p)
6349     error ("cannot handle inconsistent calls to %qs", fnname);
6350
6351   if (retval == NULL_RTX)
6352     insn = gen_call_internal_direct (fn, args_size);
6353   else
6354     insn = gen_call_value_internal_direct (retval, fn, args_size);
6355   insn = mips_emit_call_insn (insn, fn, fn, false);
6356
6357   /* If we are calling a stub which handles a floating-point return
6358      value, we need to arrange to save $18 in the prologue.  We do this
6359      by marking the function call as using the register.  The prologue
6360      will later see that it is used, and emit code to save it.  */
6361   if (fp_ret_p)
6362     CALL_INSN_FUNCTION_USAGE (insn) =
6363       gen_rtx_EXPR_LIST (VOIDmode,
6364                          gen_rtx_CLOBBER (VOIDmode,
6365                                           gen_rtx_REG (word_mode, 18)),
6366                          CALL_INSN_FUNCTION_USAGE (insn));
6367
6368   return insn;
6369 }
6370 \f
6371 /* Expand a call of type TYPE.  RESULT is where the result will go (null
6372    for "call"s and "sibcall"s), ADDR is the address of the function,
6373    ARGS_SIZE is the size of the arguments and AUX is the value passed
6374    to us by mips_function_arg.  LAZY_P is true if this call already
6375    involves a lazily-bound function address (such as when calling
6376    functions through a MIPS16 hard-float stub).
6377
6378    Return the call itself.  */
6379
6380 rtx
6381 mips_expand_call (enum mips_call_type type, rtx result, rtx addr,
6382                   rtx args_size, rtx aux, bool lazy_p)
6383 {
6384   rtx orig_addr, pattern, insn;
6385   int fp_code;
6386
6387   fp_code = aux == 0 ? 0 : (int) GET_MODE (aux);
6388   insn = mips16_build_call_stub (result, &addr, args_size, fp_code);
6389   if (insn)
6390     {
6391       gcc_assert (!lazy_p && type == MIPS_CALL_NORMAL);
6392       return insn;
6393     }
6394                                  ;
6395   orig_addr = addr;
6396   if (!call_insn_operand (addr, VOIDmode))
6397     {
6398       if (type == MIPS_CALL_EPILOGUE)
6399         addr = MIPS_EPILOGUE_TEMP (Pmode);
6400       else
6401         addr = gen_reg_rtx (Pmode);
6402       lazy_p |= mips_load_call_address (type, addr, orig_addr);
6403     }
6404
6405   if (result == 0)
6406     {
6407       rtx (*fn) (rtx, rtx);
6408
6409       if (type == MIPS_CALL_SIBCALL)
6410         fn = gen_sibcall_internal;
6411       else
6412         fn = gen_call_internal;
6413
6414       pattern = fn (addr, args_size);
6415     }
6416   else if (GET_CODE (result) == PARALLEL && XVECLEN (result, 0) == 2)
6417     {
6418       /* Handle return values created by mips_return_fpr_pair.  */
6419       rtx (*fn) (rtx, rtx, rtx, rtx);
6420       rtx reg1, reg2;
6421
6422       if (type == MIPS_CALL_SIBCALL)
6423         fn = gen_sibcall_value_multiple_internal;
6424       else
6425         fn = gen_call_value_multiple_internal;
6426
6427       reg1 = XEXP (XVECEXP (result, 0, 0), 0);
6428       reg2 = XEXP (XVECEXP (result, 0, 1), 0);
6429       pattern = fn (reg1, addr, args_size, reg2);
6430     }
6431   else
6432     {
6433       rtx (*fn) (rtx, rtx, rtx);
6434
6435       if (type == MIPS_CALL_SIBCALL)
6436         fn = gen_sibcall_value_internal;
6437       else
6438         fn = gen_call_value_internal;
6439
6440       /* Handle return values created by mips_return_fpr_single.  */
6441       if (GET_CODE (result) == PARALLEL && XVECLEN (result, 0) == 1)
6442         result = XEXP (XVECEXP (result, 0, 0), 0);
6443       pattern = fn (result, addr, args_size);
6444     }
6445
6446   return mips_emit_call_insn (pattern, orig_addr, addr, lazy_p);
6447 }
6448
6449 /* Split call instruction INSN into a $gp-clobbering call and
6450    (where necessary) an instruction to restore $gp from its save slot.
6451    CALL_PATTERN is the pattern of the new call.  */
6452
6453 void
6454 mips_split_call (rtx insn, rtx call_pattern)
6455 {
6456   rtx new_insn;
6457
6458   new_insn = emit_call_insn (call_pattern);
6459   CALL_INSN_FUNCTION_USAGE (new_insn)
6460     = copy_rtx (CALL_INSN_FUNCTION_USAGE (insn));
6461   if (!find_reg_note (insn, REG_NORETURN, 0))
6462     /* Pick a temporary register that is suitable for both MIPS16 and
6463        non-MIPS16 code.  $4 and $5 are used for returning complex double
6464        values in soft-float code, so $6 is the first suitable candidate.  */
6465     mips_restore_gp_from_cprestore_slot (gen_rtx_REG (Pmode, GP_ARG_FIRST + 2));
6466 }
6467
6468 /* Implement TARGET_FUNCTION_OK_FOR_SIBCALL.  */
6469
6470 static bool
6471 mips_function_ok_for_sibcall (tree decl, tree exp ATTRIBUTE_UNUSED)
6472 {
6473   if (!TARGET_SIBCALLS)
6474     return false;
6475
6476   /* Interrupt handlers need special epilogue code and therefore can't
6477      use sibcalls.  */
6478   if (mips_interrupt_type_p (TREE_TYPE (current_function_decl)))
6479     return false;
6480
6481   /* We can't do a sibcall if the called function is a MIPS16 function
6482      because there is no direct "jx" instruction equivalent to "jalx" to
6483      switch the ISA mode.  We only care about cases where the sibling
6484      and normal calls would both be direct.  */
6485   if (decl
6486       && mips_use_mips16_mode_p (decl)
6487       && const_call_insn_operand (XEXP (DECL_RTL (decl), 0), VOIDmode))
6488     return false;
6489
6490   /* When -minterlink-mips16 is in effect, assume that non-locally-binding
6491      functions could be MIPS16 ones unless an attribute explicitly tells
6492      us otherwise.  */
6493   if (TARGET_INTERLINK_MIPS16
6494       && decl
6495       && (DECL_EXTERNAL (decl) || !targetm.binds_local_p (decl))
6496       && !mips_nomips16_decl_p (decl)
6497       && const_call_insn_operand (XEXP (DECL_RTL (decl), 0), VOIDmode))
6498     return false;
6499
6500   /* Otherwise OK.  */
6501   return true;
6502 }
6503 \f
6504 /* Emit code to move general operand SRC into condition-code
6505    register DEST given that SCRATCH is a scratch TFmode FPR.
6506    The sequence is:
6507
6508         FP1 = SRC
6509         FP2 = 0.0f
6510         DEST = FP2 < FP1
6511
6512    where FP1 and FP2 are single-precision FPRs taken from SCRATCH.  */
6513
6514 void
6515 mips_expand_fcc_reload (rtx dest, rtx src, rtx scratch)
6516 {
6517   rtx fp1, fp2;
6518
6519   /* Change the source to SFmode.  */
6520   if (MEM_P (src))
6521     src = adjust_address (src, SFmode, 0);
6522   else if (REG_P (src) || GET_CODE (src) == SUBREG)
6523     src = gen_rtx_REG (SFmode, true_regnum (src));
6524
6525   fp1 = gen_rtx_REG (SFmode, REGNO (scratch));
6526   fp2 = gen_rtx_REG (SFmode, REGNO (scratch) + MAX_FPRS_PER_FMT);
6527
6528   mips_emit_move (copy_rtx (fp1), src);
6529   mips_emit_move (copy_rtx (fp2), CONST0_RTX (SFmode));
6530   emit_insn (gen_slt_sf (dest, fp2, fp1));
6531 }
6532 \f
6533 /* Emit straight-line code to move LENGTH bytes from SRC to DEST.
6534    Assume that the areas do not overlap.  */
6535
6536 static void
6537 mips_block_move_straight (rtx dest, rtx src, HOST_WIDE_INT length)
6538 {
6539   HOST_WIDE_INT offset, delta;
6540   unsigned HOST_WIDE_INT bits;
6541   int i;
6542   enum machine_mode mode;
6543   rtx *regs;
6544
6545   /* Work out how many bits to move at a time.  If both operands have
6546      half-word alignment, it is usually better to move in half words.
6547      For instance, lh/lh/sh/sh is usually better than lwl/lwr/swl/swr
6548      and lw/lw/sw/sw is usually better than ldl/ldr/sdl/sdr.
6549      Otherwise move word-sized chunks.  */
6550   if (MEM_ALIGN (src) == BITS_PER_WORD / 2
6551       && MEM_ALIGN (dest) == BITS_PER_WORD / 2)
6552     bits = BITS_PER_WORD / 2;
6553   else
6554     bits = BITS_PER_WORD;
6555
6556   mode = mode_for_size (bits, MODE_INT, 0);
6557   delta = bits / BITS_PER_UNIT;
6558
6559   /* Allocate a buffer for the temporary registers.  */
6560   regs = XALLOCAVEC (rtx, length / delta);
6561
6562   /* Load as many BITS-sized chunks as possible.  Use a normal load if
6563      the source has enough alignment, otherwise use left/right pairs.  */
6564   for (offset = 0, i = 0; offset + delta <= length; offset += delta, i++)
6565     {
6566       regs[i] = gen_reg_rtx (mode);
6567       if (MEM_ALIGN (src) >= bits)
6568         mips_emit_move (regs[i], adjust_address (src, mode, offset));
6569       else
6570         {
6571           rtx part = adjust_address (src, BLKmode, offset);
6572           if (!mips_expand_ext_as_unaligned_load (regs[i], part, bits, 0))
6573             gcc_unreachable ();
6574         }
6575     }
6576
6577   /* Copy the chunks to the destination.  */
6578   for (offset = 0, i = 0; offset + delta <= length; offset += delta, i++)
6579     if (MEM_ALIGN (dest) >= bits)
6580       mips_emit_move (adjust_address (dest, mode, offset), regs[i]);
6581     else
6582       {
6583         rtx part = adjust_address (dest, BLKmode, offset);
6584         if (!mips_expand_ins_as_unaligned_store (part, regs[i], bits, 0))
6585           gcc_unreachable ();
6586       }
6587
6588   /* Mop up any left-over bytes.  */
6589   if (offset < length)
6590     {
6591       src = adjust_address (src, BLKmode, offset);
6592       dest = adjust_address (dest, BLKmode, offset);
6593       move_by_pieces (dest, src, length - offset,
6594                       MIN (MEM_ALIGN (src), MEM_ALIGN (dest)), 0);
6595     }
6596 }
6597
6598 /* Helper function for doing a loop-based block operation on memory
6599    reference MEM.  Each iteration of the loop will operate on LENGTH
6600    bytes of MEM.
6601
6602    Create a new base register for use within the loop and point it to
6603    the start of MEM.  Create a new memory reference that uses this
6604    register.  Store them in *LOOP_REG and *LOOP_MEM respectively.  */
6605
6606 static void
6607 mips_adjust_block_mem (rtx mem, HOST_WIDE_INT length,
6608                        rtx *loop_reg, rtx *loop_mem)
6609 {
6610   *loop_reg = copy_addr_to_reg (XEXP (mem, 0));
6611
6612   /* Although the new mem does not refer to a known location,
6613      it does keep up to LENGTH bytes of alignment.  */
6614   *loop_mem = change_address (mem, BLKmode, *loop_reg);
6615   set_mem_align (*loop_mem, MIN (MEM_ALIGN (mem), length * BITS_PER_UNIT));
6616 }
6617
6618 /* Move LENGTH bytes from SRC to DEST using a loop that moves BYTES_PER_ITER
6619    bytes at a time.  LENGTH must be at least BYTES_PER_ITER.  Assume that
6620    the memory regions do not overlap.  */
6621
6622 static void
6623 mips_block_move_loop (rtx dest, rtx src, HOST_WIDE_INT length,
6624                       HOST_WIDE_INT bytes_per_iter)
6625 {
6626   rtx label, src_reg, dest_reg, final_src, test;
6627   HOST_WIDE_INT leftover;
6628
6629   leftover = length % bytes_per_iter;
6630   length -= leftover;
6631
6632   /* Create registers and memory references for use within the loop.  */
6633   mips_adjust_block_mem (src, bytes_per_iter, &src_reg, &src);
6634   mips_adjust_block_mem (dest, bytes_per_iter, &dest_reg, &dest);
6635
6636   /* Calculate the value that SRC_REG should have after the last iteration
6637      of the loop.  */
6638   final_src = expand_simple_binop (Pmode, PLUS, src_reg, GEN_INT (length),
6639                                    0, 0, OPTAB_WIDEN);
6640
6641   /* Emit the start of the loop.  */
6642   label = gen_label_rtx ();
6643   emit_label (label);
6644
6645   /* Emit the loop body.  */
6646   mips_block_move_straight (dest, src, bytes_per_iter);
6647
6648   /* Move on to the next block.  */
6649   mips_emit_move (src_reg, plus_constant (src_reg, bytes_per_iter));
6650   mips_emit_move (dest_reg, plus_constant (dest_reg, bytes_per_iter));
6651
6652   /* Emit the loop condition.  */
6653   test = gen_rtx_NE (VOIDmode, src_reg, final_src);
6654   if (Pmode == DImode)
6655     emit_jump_insn (gen_cbranchdi4 (test, src_reg, final_src, label));
6656   else
6657     emit_jump_insn (gen_cbranchsi4 (test, src_reg, final_src, label));
6658
6659   /* Mop up any left-over bytes.  */
6660   if (leftover)
6661     mips_block_move_straight (dest, src, leftover);
6662 }
6663
6664 /* Expand a movmemsi instruction, which copies LENGTH bytes from
6665    memory reference SRC to memory reference DEST.  */
6666
6667 bool
6668 mips_expand_block_move (rtx dest, rtx src, rtx length)
6669 {
6670   if (CONST_INT_P (length))
6671     {
6672       if (INTVAL (length) <= MIPS_MAX_MOVE_BYTES_STRAIGHT)
6673         {
6674           mips_block_move_straight (dest, src, INTVAL (length));
6675           return true;
6676         }
6677       else if (optimize)
6678         {
6679           mips_block_move_loop (dest, src, INTVAL (length),
6680                                 MIPS_MAX_MOVE_BYTES_PER_LOOP_ITER);
6681           return true;
6682         }
6683     }
6684   return false;
6685 }
6686 \f
6687 /* Expand a loop of synci insns for the address range [BEGIN, END).  */
6688
6689 void
6690 mips_expand_synci_loop (rtx begin, rtx end)
6691 {
6692   rtx inc, label, cmp, cmp_result;
6693
6694   /* Load INC with the cache line size (rdhwr INC,$1).  */
6695   inc = gen_reg_rtx (Pmode);
6696   emit_insn (Pmode == SImode
6697              ? gen_rdhwr_synci_step_si (inc)
6698              : gen_rdhwr_synci_step_di (inc));
6699
6700   /* Loop back to here.  */
6701   label = gen_label_rtx ();
6702   emit_label (label);
6703
6704   emit_insn (gen_synci (begin));
6705
6706   cmp = mips_force_binary (Pmode, GTU, begin, end);
6707
6708   mips_emit_binary (PLUS, begin, begin, inc);
6709
6710   cmp_result = gen_rtx_EQ (VOIDmode, cmp, const0_rtx);
6711   emit_jump_insn (gen_condjump (cmp_result, label));
6712 }
6713 \f
6714 /* Expand a QI or HI mode atomic memory operation.
6715
6716    GENERATOR contains a pointer to the gen_* function that generates
6717    the SI mode underlying atomic operation using masks that we
6718    calculate.
6719
6720    RESULT is the return register for the operation.  Its value is NULL
6721    if unused.
6722
6723    MEM is the location of the atomic access.
6724
6725    OLDVAL is the first operand for the operation.
6726
6727    NEWVAL is the optional second operand for the operation.  Its value
6728    is NULL if unused.  */
6729
6730 void
6731 mips_expand_atomic_qihi (union mips_gen_fn_ptrs generator,
6732                          rtx result, rtx mem, rtx oldval, rtx newval)
6733 {
6734   rtx orig_addr, memsi_addr, memsi, shift, shiftsi, unshifted_mask;
6735   rtx unshifted_mask_reg, mask, inverted_mask, si_op;
6736   rtx res = NULL;
6737   enum machine_mode mode;
6738
6739   mode = GET_MODE (mem);
6740
6741   /* Compute the address of the containing SImode value.  */
6742   orig_addr = force_reg (Pmode, XEXP (mem, 0));
6743   memsi_addr = mips_force_binary (Pmode, AND, orig_addr,
6744                                   force_reg (Pmode, GEN_INT (-4)));
6745
6746   /* Create a memory reference for it.  */
6747   memsi = gen_rtx_MEM (SImode, memsi_addr);
6748   set_mem_alias_set (memsi, ALIAS_SET_MEMORY_BARRIER);
6749   MEM_VOLATILE_P (memsi) = MEM_VOLATILE_P (mem);
6750
6751   /* Work out the byte offset of the QImode or HImode value,
6752      counting from the least significant byte.  */
6753   shift = mips_force_binary (Pmode, AND, orig_addr, GEN_INT (3));
6754   if (TARGET_BIG_ENDIAN)
6755     mips_emit_binary (XOR, shift, shift, GEN_INT (mode == QImode ? 3 : 2));
6756
6757   /* Multiply by eight to convert the shift value from bytes to bits.  */
6758   mips_emit_binary (ASHIFT, shift, shift, GEN_INT (3));
6759
6760   /* Make the final shift an SImode value, so that it can be used in
6761      SImode operations.  */
6762   shiftsi = force_reg (SImode, gen_lowpart (SImode, shift));
6763
6764   /* Set MASK to an inclusive mask of the QImode or HImode value.  */
6765   unshifted_mask = GEN_INT (GET_MODE_MASK (mode));
6766   unshifted_mask_reg = force_reg (SImode, unshifted_mask);
6767   mask = mips_force_binary (SImode, ASHIFT, unshifted_mask_reg, shiftsi);
6768
6769   /* Compute the equivalent exclusive mask.  */
6770   inverted_mask = gen_reg_rtx (SImode);
6771   emit_insn (gen_rtx_SET (VOIDmode, inverted_mask,
6772                           gen_rtx_NOT (SImode, mask)));
6773
6774   /* Shift the old value into place.  */
6775   if (oldval != const0_rtx)
6776     {
6777       oldval = convert_modes (SImode, mode, oldval, true);
6778       oldval = force_reg (SImode, oldval);
6779       oldval = mips_force_binary (SImode, ASHIFT, oldval, shiftsi);
6780     }
6781
6782   /* Do the same for the new value.  */
6783   if (newval && newval != const0_rtx)
6784     {
6785       newval = convert_modes (SImode, mode, newval, true);
6786       newval = force_reg (SImode, newval);
6787       newval = mips_force_binary (SImode, ASHIFT, newval, shiftsi);
6788     }
6789
6790   /* Do the SImode atomic access.  */
6791   if (result)
6792     res = gen_reg_rtx (SImode);
6793   if (newval)
6794     si_op = generator.fn_6 (res, memsi, mask, inverted_mask, oldval, newval);
6795   else if (result)
6796     si_op = generator.fn_5 (res, memsi, mask, inverted_mask, oldval);
6797   else
6798     si_op = generator.fn_4 (memsi, mask, inverted_mask, oldval);
6799
6800   emit_insn (si_op);
6801
6802   if (result)
6803     {
6804       /* Shift and convert the result.  */
6805       mips_emit_binary (AND, res, res, mask);
6806       mips_emit_binary (LSHIFTRT, res, res, shiftsi);
6807       mips_emit_move (result, gen_lowpart (GET_MODE (result), res));
6808     }
6809 }
6810
6811 /* Return true if it is possible to use left/right accesses for a
6812    bitfield of WIDTH bits starting BITPOS bits into *OP.  When
6813    returning true, update *OP, *LEFT and *RIGHT as follows:
6814
6815    *OP is a BLKmode reference to the whole field.
6816
6817    *LEFT is a QImode reference to the first byte if big endian or
6818    the last byte if little endian.  This address can be used in the
6819    left-side instructions (LWL, SWL, LDL, SDL).
6820
6821    *RIGHT is a QImode reference to the opposite end of the field and
6822    can be used in the patterning right-side instruction.  */
6823
6824 static bool
6825 mips_get_unaligned_mem (rtx *op, HOST_WIDE_INT width, HOST_WIDE_INT bitpos,
6826                         rtx *left, rtx *right)
6827 {
6828   rtx first, last;
6829
6830   /* Check that the operand really is a MEM.  Not all the extv and
6831      extzv predicates are checked.  */
6832   if (!MEM_P (*op))
6833     return false;
6834
6835   /* Check that the size is valid.  */
6836   if (width != 32 && (!TARGET_64BIT || width != 64))
6837     return false;
6838
6839   /* We can only access byte-aligned values.  Since we are always passed
6840      a reference to the first byte of the field, it is not necessary to
6841      do anything with BITPOS after this check.  */
6842   if (bitpos % BITS_PER_UNIT != 0)
6843     return false;
6844
6845   /* Reject aligned bitfields: we want to use a normal load or store
6846      instead of a left/right pair.  */
6847   if (MEM_ALIGN (*op) >= width)
6848     return false;
6849
6850   /* Adjust *OP to refer to the whole field.  This also has the effect
6851      of legitimizing *OP's address for BLKmode, possibly simplifying it.  */
6852   *op = adjust_address (*op, BLKmode, 0);
6853   set_mem_size (*op, GEN_INT (width / BITS_PER_UNIT));
6854
6855   /* Get references to both ends of the field.  We deliberately don't
6856      use the original QImode *OP for FIRST since the new BLKmode one
6857      might have a simpler address.  */
6858   first = adjust_address (*op, QImode, 0);
6859   last = adjust_address (*op, QImode, width / BITS_PER_UNIT - 1);
6860
6861   /* Allocate to LEFT and RIGHT according to endianness.  LEFT should
6862      correspond to the MSB and RIGHT to the LSB.  */
6863   if (TARGET_BIG_ENDIAN)
6864     *left = first, *right = last;
6865   else
6866     *left = last, *right = first;
6867
6868   return true;
6869 }
6870
6871 /* Try to use left/right loads to expand an "extv" or "extzv" pattern.
6872    DEST, SRC, WIDTH and BITPOS are the operands passed to the expander;
6873    the operation is the equivalent of:
6874
6875       (set DEST (*_extract SRC WIDTH BITPOS))
6876
6877    Return true on success.  */
6878
6879 bool
6880 mips_expand_ext_as_unaligned_load (rtx dest, rtx src, HOST_WIDE_INT width,
6881                                    HOST_WIDE_INT bitpos)
6882 {
6883   rtx left, right, temp;
6884
6885   /* If TARGET_64BIT, the destination of a 32-bit "extz" or "extzv" will
6886      be a paradoxical word_mode subreg.  This is the only case in which
6887      we allow the destination to be larger than the source.  */
6888   if (GET_CODE (dest) == SUBREG
6889       && GET_MODE (dest) == DImode
6890       && GET_MODE (SUBREG_REG (dest)) == SImode)
6891     dest = SUBREG_REG (dest);
6892
6893   /* After the above adjustment, the destination must be the same
6894      width as the source.  */
6895   if (GET_MODE_BITSIZE (GET_MODE (dest)) != width)
6896     return false;
6897
6898   if (!mips_get_unaligned_mem (&src, width, bitpos, &left, &right))
6899     return false;
6900
6901   temp = gen_reg_rtx (GET_MODE (dest));
6902   if (GET_MODE (dest) == DImode)
6903     {
6904       emit_insn (gen_mov_ldl (temp, src, left));
6905       emit_insn (gen_mov_ldr (dest, copy_rtx (src), right, temp));
6906     }
6907   else
6908     {
6909       emit_insn (gen_mov_lwl (temp, src, left));
6910       emit_insn (gen_mov_lwr (dest, copy_rtx (src), right, temp));
6911     }
6912   return true;
6913 }
6914
6915 /* Try to use left/right stores to expand an "ins" pattern.  DEST, WIDTH,
6916    BITPOS and SRC are the operands passed to the expander; the operation
6917    is the equivalent of:
6918
6919        (set (zero_extract DEST WIDTH BITPOS) SRC)
6920
6921    Return true on success.  */
6922
6923 bool
6924 mips_expand_ins_as_unaligned_store (rtx dest, rtx src, HOST_WIDE_INT width,
6925                                     HOST_WIDE_INT bitpos)
6926 {
6927   rtx left, right;
6928   enum machine_mode mode;
6929
6930   if (!mips_get_unaligned_mem (&dest, width, bitpos, &left, &right))
6931     return false;
6932
6933   mode = mode_for_size (width, MODE_INT, 0);
6934   src = gen_lowpart (mode, src);
6935   if (mode == DImode)
6936     {
6937       emit_insn (gen_mov_sdl (dest, src, left));
6938       emit_insn (gen_mov_sdr (copy_rtx (dest), copy_rtx (src), right));
6939     }
6940   else
6941     {
6942       emit_insn (gen_mov_swl (dest, src, left));
6943       emit_insn (gen_mov_swr (copy_rtx (dest), copy_rtx (src), right));
6944     }
6945   return true;
6946 }
6947
6948 /* Return true if X is a MEM with the same size as MODE.  */
6949
6950 bool
6951 mips_mem_fits_mode_p (enum machine_mode mode, rtx x)
6952 {
6953   rtx size;
6954
6955   if (!MEM_P (x))
6956     return false;
6957
6958   size = MEM_SIZE (x);
6959   return size && INTVAL (size) == GET_MODE_SIZE (mode);
6960 }
6961
6962 /* Return true if (zero_extract OP WIDTH BITPOS) can be used as the
6963    source of an "ext" instruction or the destination of an "ins"
6964    instruction.  OP must be a register operand and the following
6965    conditions must hold:
6966
6967      0 <= BITPOS < GET_MODE_BITSIZE (GET_MODE (op))
6968      0 < WIDTH <= GET_MODE_BITSIZE (GET_MODE (op))
6969      0 < BITPOS + WIDTH <= GET_MODE_BITSIZE (GET_MODE (op))
6970
6971    Also reject lengths equal to a word as they are better handled
6972    by the move patterns.  */
6973
6974 bool
6975 mips_use_ins_ext_p (rtx op, HOST_WIDE_INT width, HOST_WIDE_INT bitpos)
6976 {
6977   if (!ISA_HAS_EXT_INS
6978       || !register_operand (op, VOIDmode)
6979       || GET_MODE_BITSIZE (GET_MODE (op)) > BITS_PER_WORD)
6980     return false;
6981
6982   if (!IN_RANGE (width, 1, GET_MODE_BITSIZE (GET_MODE (op)) - 1))
6983     return false;
6984
6985   if (bitpos < 0 || bitpos + width > GET_MODE_BITSIZE (GET_MODE (op)))
6986     return false;
6987
6988   return true;
6989 }
6990
6991 /* Check if MASK and SHIFT are valid in mask-low-and-shift-left
6992    operation if MAXLEN is the maxium length of consecutive bits that
6993    can make up MASK.  MODE is the mode of the operation.  See
6994    mask_low_and_shift_len for the actual definition.  */
6995
6996 bool
6997 mask_low_and_shift_p (enum machine_mode mode, rtx mask, rtx shift, int maxlen)
6998 {
6999   return IN_RANGE (mask_low_and_shift_len (mode, mask, shift), 1, maxlen);
7000 }
7001
7002 /* Return true iff OP1 and OP2 are valid operands together for the
7003    *and<MODE>3 and *and<MODE>3_mips16 patterns.  For the cases to consider,
7004    see the table in the comment before the pattern.  */
7005
7006 bool
7007 and_operands_ok (enum machine_mode mode, rtx op1, rtx op2)
7008 {
7009   return (memory_operand (op1, mode)
7010           ? and_load_operand (op2, mode)
7011           : and_reg_operand (op2, mode));
7012 }
7013
7014 /* The canonical form of a mask-low-and-shift-left operation is
7015    (and (ashift X SHIFT) MASK) where MASK has the lower SHIFT number of bits
7016    cleared.  Thus we need to shift MASK to the right before checking if it
7017    is a valid mask value.  MODE is the mode of the operation.  If true
7018    return the length of the mask, otherwise return -1.  */
7019
7020 int
7021 mask_low_and_shift_len (enum machine_mode mode, rtx mask, rtx shift)
7022 {
7023   HOST_WIDE_INT shval;
7024
7025   shval = INTVAL (shift) & (GET_MODE_BITSIZE (mode) - 1);
7026   return exact_log2 ((UINTVAL (mask) >> shval) + 1);
7027 }
7028 \f
7029 /* Return true if -msplit-addresses is selected and should be honored.
7030
7031    -msplit-addresses is a half-way house between explicit relocations
7032    and the traditional assembler macros.  It can split absolute 32-bit
7033    symbolic constants into a high/lo_sum pair but uses macros for other
7034    sorts of access.
7035
7036    Like explicit relocation support for REL targets, it relies
7037    on GNU extensions in the assembler and the linker.
7038
7039    Although this code should work for -O0, it has traditionally
7040    been treated as an optimization.  */
7041
7042 static bool
7043 mips_split_addresses_p (void)
7044 {
7045   return (TARGET_SPLIT_ADDRESSES
7046           && optimize
7047           && !TARGET_MIPS16
7048           && !flag_pic
7049           && !ABI_HAS_64BIT_SYMBOLS);
7050 }
7051
7052 /* (Re-)Initialize mips_split_p, mips_lo_relocs and mips_hi_relocs.  */
7053
7054 static void
7055 mips_init_relocs (void)
7056 {
7057   memset (mips_split_p, '\0', sizeof (mips_split_p));
7058   memset (mips_split_hi_p, '\0', sizeof (mips_split_hi_p));
7059   memset (mips_hi_relocs, '\0', sizeof (mips_hi_relocs));
7060   memset (mips_lo_relocs, '\0', sizeof (mips_lo_relocs));
7061
7062   if (ABI_HAS_64BIT_SYMBOLS)
7063     {
7064       if (TARGET_EXPLICIT_RELOCS)
7065         {
7066           mips_split_p[SYMBOL_64_HIGH] = true;
7067           mips_hi_relocs[SYMBOL_64_HIGH] = "%highest(";
7068           mips_lo_relocs[SYMBOL_64_HIGH] = "%higher(";
7069
7070           mips_split_p[SYMBOL_64_MID] = true;
7071           mips_hi_relocs[SYMBOL_64_MID] = "%higher(";
7072           mips_lo_relocs[SYMBOL_64_MID] = "%hi(";
7073
7074           mips_split_p[SYMBOL_64_LOW] = true;
7075           mips_hi_relocs[SYMBOL_64_LOW] = "%hi(";
7076           mips_lo_relocs[SYMBOL_64_LOW] = "%lo(";
7077
7078           mips_split_p[SYMBOL_ABSOLUTE] = true;
7079           mips_lo_relocs[SYMBOL_ABSOLUTE] = "%lo(";
7080         }
7081     }
7082   else
7083     {
7084       if (TARGET_EXPLICIT_RELOCS || mips_split_addresses_p () || TARGET_MIPS16)
7085         {
7086           mips_split_p[SYMBOL_ABSOLUTE] = true;
7087           mips_hi_relocs[SYMBOL_ABSOLUTE] = "%hi(";
7088           mips_lo_relocs[SYMBOL_ABSOLUTE] = "%lo(";
7089
7090           mips_lo_relocs[SYMBOL_32_HIGH] = "%hi(";
7091         }
7092     }
7093
7094   if (TARGET_MIPS16)
7095     {
7096       /* The high part is provided by a pseudo copy of $gp.  */
7097       mips_split_p[SYMBOL_GP_RELATIVE] = true;
7098       mips_lo_relocs[SYMBOL_GP_RELATIVE] = "%gprel(";
7099     }
7100   else if (TARGET_EXPLICIT_RELOCS)
7101     /* Small data constants are kept whole until after reload,
7102        then lowered by mips_rewrite_small_data.  */
7103     mips_lo_relocs[SYMBOL_GP_RELATIVE] = "%gp_rel(";
7104
7105   if (TARGET_EXPLICIT_RELOCS)
7106     {
7107       mips_split_p[SYMBOL_GOT_PAGE_OFST] = true;
7108       if (TARGET_NEWABI)
7109         {
7110           mips_lo_relocs[SYMBOL_GOTOFF_PAGE] = "%got_page(";
7111           mips_lo_relocs[SYMBOL_GOT_PAGE_OFST] = "%got_ofst(";
7112         }
7113       else
7114         {
7115           mips_lo_relocs[SYMBOL_GOTOFF_PAGE] = "%got(";
7116           mips_lo_relocs[SYMBOL_GOT_PAGE_OFST] = "%lo(";
7117         }
7118       if (TARGET_MIPS16)
7119         /* Expose the use of $28 as soon as possible.  */
7120         mips_split_hi_p[SYMBOL_GOT_PAGE_OFST] = true;
7121
7122       if (TARGET_XGOT)
7123         {
7124           /* The HIGH and LO_SUM are matched by special .md patterns.  */
7125           mips_split_p[SYMBOL_GOT_DISP] = true;
7126
7127           mips_split_p[SYMBOL_GOTOFF_DISP] = true;
7128           mips_hi_relocs[SYMBOL_GOTOFF_DISP] = "%got_hi(";
7129           mips_lo_relocs[SYMBOL_GOTOFF_DISP] = "%got_lo(";
7130
7131           mips_split_p[SYMBOL_GOTOFF_CALL] = true;
7132           mips_hi_relocs[SYMBOL_GOTOFF_CALL] = "%call_hi(";
7133           mips_lo_relocs[SYMBOL_GOTOFF_CALL] = "%call_lo(";
7134         }
7135       else
7136         {
7137           if (TARGET_NEWABI)
7138             mips_lo_relocs[SYMBOL_GOTOFF_DISP] = "%got_disp(";
7139           else
7140             mips_lo_relocs[SYMBOL_GOTOFF_DISP] = "%got(";
7141           mips_lo_relocs[SYMBOL_GOTOFF_CALL] = "%call16(";
7142           if (TARGET_MIPS16)
7143             /* Expose the use of $28 as soon as possible.  */
7144             mips_split_p[SYMBOL_GOT_DISP] = true;
7145         }
7146     }
7147
7148   if (TARGET_NEWABI)
7149     {
7150       mips_split_p[SYMBOL_GOTOFF_LOADGP] = true;
7151       mips_hi_relocs[SYMBOL_GOTOFF_LOADGP] = "%hi(%neg(%gp_rel(";
7152       mips_lo_relocs[SYMBOL_GOTOFF_LOADGP] = "%lo(%neg(%gp_rel(";
7153     }
7154
7155   mips_lo_relocs[SYMBOL_TLSGD] = "%tlsgd(";
7156   mips_lo_relocs[SYMBOL_TLSLDM] = "%tlsldm(";
7157
7158   mips_split_p[SYMBOL_DTPREL] = true;
7159   mips_hi_relocs[SYMBOL_DTPREL] = "%dtprel_hi(";
7160   mips_lo_relocs[SYMBOL_DTPREL] = "%dtprel_lo(";
7161
7162   mips_lo_relocs[SYMBOL_GOTTPREL] = "%gottprel(";
7163
7164   mips_split_p[SYMBOL_TPREL] = true;
7165   mips_hi_relocs[SYMBOL_TPREL] = "%tprel_hi(";
7166   mips_lo_relocs[SYMBOL_TPREL] = "%tprel_lo(";
7167
7168   mips_lo_relocs[SYMBOL_HALF] = "%half(";
7169 }
7170
7171 /* Print symbolic operand OP, which is part of a HIGH or LO_SUM
7172    in context CONTEXT.  RELOCS is the array of relocations to use.  */
7173
7174 static void
7175 mips_print_operand_reloc (FILE *file, rtx op, enum mips_symbol_context context,
7176                           const char **relocs)
7177 {
7178   enum mips_symbol_type symbol_type;
7179   const char *p;
7180
7181   symbol_type = mips_classify_symbolic_expression (op, context);
7182   gcc_assert (relocs[symbol_type]);
7183
7184   fputs (relocs[symbol_type], file);
7185   output_addr_const (file, mips_strip_unspec_address (op));
7186   for (p = relocs[symbol_type]; *p != 0; p++)
7187     if (*p == '(')
7188       fputc (')', file);
7189 }
7190
7191 /* Start a new block with the given asm switch enabled.  If we need
7192    to print a directive, emit PREFIX before it and SUFFIX after it.  */
7193
7194 static void
7195 mips_push_asm_switch_1 (struct mips_asm_switch *asm_switch,
7196                         const char *prefix, const char *suffix)
7197 {
7198   if (asm_switch->nesting_level == 0)
7199     fprintf (asm_out_file, "%s.set\tno%s%s", prefix, asm_switch->name, suffix);
7200   asm_switch->nesting_level++;
7201 }
7202
7203 /* Likewise, but end a block.  */
7204
7205 static void
7206 mips_pop_asm_switch_1 (struct mips_asm_switch *asm_switch,
7207                        const char *prefix, const char *suffix)
7208 {
7209   gcc_assert (asm_switch->nesting_level);
7210   asm_switch->nesting_level--;
7211   if (asm_switch->nesting_level == 0)
7212     fprintf (asm_out_file, "%s.set\t%s%s", prefix, asm_switch->name, suffix);
7213 }
7214
7215 /* Wrappers around mips_push_asm_switch_1 and mips_pop_asm_switch_1
7216    that either print a complete line or print nothing.  */
7217
7218 void
7219 mips_push_asm_switch (struct mips_asm_switch *asm_switch)
7220 {
7221   mips_push_asm_switch_1 (asm_switch, "\t", "\n");
7222 }
7223
7224 void
7225 mips_pop_asm_switch (struct mips_asm_switch *asm_switch)
7226 {
7227   mips_pop_asm_switch_1 (asm_switch, "\t", "\n");
7228 }
7229
7230 /* Print the text for PRINT_OPERAND punctation character CH to FILE.
7231    The punctuation characters are:
7232
7233    '('  Start a nested ".set noreorder" block.
7234    ')'  End a nested ".set noreorder" block.
7235    '['  Start a nested ".set noat" block.
7236    ']'  End a nested ".set noat" block.
7237    '<'  Start a nested ".set nomacro" block.
7238    '>'  End a nested ".set nomacro" block.
7239    '*'  Behave like %(%< if generating a delayed-branch sequence.
7240    '#'  Print a nop if in a ".set noreorder" block.
7241    '/'  Like '#', but do nothing within a delayed-branch sequence.
7242    '?'  Print "l" if mips_branch_likely is true
7243    '~'  Print a nop if mips_branch_likely is true
7244    '.'  Print the name of the register with a hard-wired zero (zero or $0).
7245    '@'  Print the name of the assembler temporary register (at or $1).
7246    '^'  Print the name of the pic call-through register (t9 or $25).
7247    '+'  Print the name of the gp register (usually gp or $28).
7248    '$'  Print the name of the stack pointer register (sp or $29).
7249
7250    See also mips_init_print_operand_pucnt.  */
7251
7252 static void
7253 mips_print_operand_punctuation (FILE *file, int ch)
7254 {
7255   switch (ch)
7256     {
7257     case '(':
7258       mips_push_asm_switch_1 (&mips_noreorder, "", "\n\t");
7259       break;
7260
7261     case ')':
7262       mips_pop_asm_switch_1 (&mips_noreorder, "\n\t", "");
7263       break;
7264
7265     case '[':
7266       mips_push_asm_switch_1 (&mips_noat, "", "\n\t");
7267       break;
7268
7269     case ']':
7270       mips_pop_asm_switch_1 (&mips_noat, "\n\t", "");
7271       break;
7272
7273     case '<':
7274       mips_push_asm_switch_1 (&mips_nomacro, "", "\n\t");
7275       break;
7276
7277     case '>':
7278       mips_pop_asm_switch_1 (&mips_nomacro, "\n\t", "");
7279       break;
7280
7281     case '*':
7282       if (final_sequence != 0)
7283         {
7284           mips_print_operand_punctuation (file, '(');
7285           mips_print_operand_punctuation (file, '<');
7286         }
7287       break;
7288
7289     case '#':
7290       if (mips_noreorder.nesting_level > 0)
7291         fputs ("\n\tnop", file);
7292       break;
7293
7294     case '/':
7295       /* Print an extra newline so that the delayed insn is separated
7296          from the following ones.  This looks neater and is consistent
7297          with non-nop delayed sequences.  */
7298       if (mips_noreorder.nesting_level > 0 && final_sequence == 0)
7299         fputs ("\n\tnop\n", file);
7300       break;
7301
7302     case '?':
7303       if (mips_branch_likely)
7304         putc ('l', file);
7305       break;
7306
7307     case '~':
7308       if (mips_branch_likely)
7309         fputs ("\n\tnop", file);
7310       break;
7311
7312     case '.':
7313       fputs (reg_names[GP_REG_FIRST + 0], file);
7314       break;
7315
7316     case '@':
7317       fputs (reg_names[AT_REGNUM], file);
7318       break;
7319
7320     case '^':
7321       fputs (reg_names[PIC_FUNCTION_ADDR_REGNUM], file);
7322       break;
7323
7324     case '+':
7325       fputs (reg_names[PIC_OFFSET_TABLE_REGNUM], file);
7326       break;
7327
7328     case '$':
7329       fputs (reg_names[STACK_POINTER_REGNUM], file);
7330       break;
7331
7332     default:
7333       gcc_unreachable ();
7334       break;
7335     }
7336 }
7337
7338 /* Initialize mips_print_operand_punct.  */
7339
7340 static void
7341 mips_init_print_operand_punct (void)
7342 {
7343   const char *p;
7344
7345   for (p = "()[]<>*#/?~.@^+$"; *p; p++)
7346     mips_print_operand_punct[(unsigned char) *p] = true;
7347 }
7348
7349 /* PRINT_OPERAND prefix LETTER refers to the integer branch instruction
7350    associated with condition CODE.  Print the condition part of the
7351    opcode to FILE.  */
7352
7353 static void
7354 mips_print_int_branch_condition (FILE *file, enum rtx_code code, int letter)
7355 {
7356   switch (code)
7357     {
7358     case EQ:
7359     case NE:
7360     case GT:
7361     case GE:
7362     case LT:
7363     case LE:
7364     case GTU:
7365     case GEU:
7366     case LTU:
7367     case LEU:
7368       /* Conveniently, the MIPS names for these conditions are the same
7369          as their RTL equivalents.  */
7370       fputs (GET_RTX_NAME (code), file);
7371       break;
7372
7373     default:
7374       output_operand_lossage ("'%%%c' is not a valid operand prefix", letter);
7375       break;
7376     }
7377 }
7378
7379 /* Likewise floating-point branches.  */
7380
7381 static void
7382 mips_print_float_branch_condition (FILE *file, enum rtx_code code, int letter)
7383 {
7384   switch (code)
7385     {
7386     case EQ:
7387       fputs ("c1f", file);
7388       break;
7389
7390     case NE:
7391       fputs ("c1t", file);
7392       break;
7393
7394     default:
7395       output_operand_lossage ("'%%%c' is not a valid operand prefix", letter);
7396       break;
7397     }
7398 }
7399
7400 /* Implement the PRINT_OPERAND macro.  The MIPS-specific operand codes are:
7401
7402    'X'  Print CONST_INT OP in hexadecimal format.
7403    'x'  Print the low 16 bits of CONST_INT OP in hexadecimal format.
7404    'd'  Print CONST_INT OP in decimal.
7405    'm'  Print one less than CONST_INT OP in decimal.
7406    'h'  Print the high-part relocation associated with OP, after stripping
7407           any outermost HIGH.
7408    'R'  Print the low-part relocation associated with OP.
7409    'C'  Print the integer branch condition for comparison OP.
7410    'N'  Print the inverse of the integer branch condition for comparison OP.
7411    'F'  Print the FPU branch condition for comparison OP.
7412    'W'  Print the inverse of the FPU branch condition for comparison OP.
7413    'T'  Print 'f' for (eq:CC ...), 't' for (ne:CC ...),
7414               'z' for (eq:?I ...), 'n' for (ne:?I ...).
7415    't'  Like 'T', but with the EQ/NE cases reversed
7416    'Y'  Print mips_fp_conditions[INTVAL (OP)]
7417    'Z'  Print OP and a comma for ISA_HAS_8CC, otherwise print nothing.
7418    'q'  Print a DSP accumulator register.
7419    'D'  Print the second part of a double-word register or memory operand.
7420    'L'  Print the low-order register in a double-word register operand.
7421    'M'  Print high-order register in a double-word register operand.
7422    'z'  Print $0 if OP is zero, otherwise print OP normally.  */
7423
7424 void
7425 mips_print_operand (FILE *file, rtx op, int letter)
7426 {
7427   enum rtx_code code;
7428
7429   if (PRINT_OPERAND_PUNCT_VALID_P (letter))
7430     {
7431       mips_print_operand_punctuation (file, letter);
7432       return;
7433     }
7434
7435   gcc_assert (op);
7436   code = GET_CODE (op);
7437
7438   switch (letter)
7439     {
7440     case 'X':
7441       if (CONST_INT_P (op))
7442         fprintf (file, HOST_WIDE_INT_PRINT_HEX, INTVAL (op));
7443       else
7444         output_operand_lossage ("invalid use of '%%%c'", letter);
7445       break;
7446
7447     case 'x':
7448       if (CONST_INT_P (op))
7449         fprintf (file, HOST_WIDE_INT_PRINT_HEX, INTVAL (op) & 0xffff);
7450       else
7451         output_operand_lossage ("invalid use of '%%%c'", letter);
7452       break;
7453
7454     case 'd':
7455       if (CONST_INT_P (op))
7456         fprintf (file, HOST_WIDE_INT_PRINT_DEC, INTVAL (op));
7457       else
7458         output_operand_lossage ("invalid use of '%%%c'", letter);
7459       break;
7460
7461     case 'm':
7462       if (CONST_INT_P (op))
7463         fprintf (file, HOST_WIDE_INT_PRINT_DEC, INTVAL (op) - 1);
7464       else
7465         output_operand_lossage ("invalid use of '%%%c'", letter);
7466       break;
7467
7468     case 'h':
7469       if (code == HIGH)
7470         op = XEXP (op, 0);
7471       mips_print_operand_reloc (file, op, SYMBOL_CONTEXT_LEA, mips_hi_relocs);
7472       break;
7473
7474     case 'R':
7475       mips_print_operand_reloc (file, op, SYMBOL_CONTEXT_LEA, mips_lo_relocs);
7476       break;
7477
7478     case 'C':
7479       mips_print_int_branch_condition (file, code, letter);
7480       break;
7481
7482     case 'N':
7483       mips_print_int_branch_condition (file, reverse_condition (code), letter);
7484       break;
7485
7486     case 'F':
7487       mips_print_float_branch_condition (file, code, letter);
7488       break;
7489
7490     case 'W':
7491       mips_print_float_branch_condition (file, reverse_condition (code),
7492                                          letter);
7493       break;
7494
7495     case 'T':
7496     case 't':
7497       {
7498         int truth = (code == NE) == (letter == 'T');
7499         fputc ("zfnt"[truth * 2 + (GET_MODE (op) == CCmode)], file);
7500       }
7501       break;
7502
7503     case 'Y':
7504       if (code == CONST_INT && UINTVAL (op) < ARRAY_SIZE (mips_fp_conditions))
7505         fputs (mips_fp_conditions[UINTVAL (op)], file);
7506       else
7507         output_operand_lossage ("'%%%c' is not a valid operand prefix",
7508                                 letter);
7509       break;
7510
7511     case 'Z':
7512       if (ISA_HAS_8CC)
7513         {
7514           mips_print_operand (file, op, 0);
7515           fputc (',', file);
7516         }
7517       break;
7518
7519     case 'q':
7520       if (code == REG && MD_REG_P (REGNO (op)))
7521         fprintf (file, "$ac0");
7522       else if (code == REG && DSP_ACC_REG_P (REGNO (op)))
7523         fprintf (file, "$ac%c", reg_names[REGNO (op)][3]);
7524       else
7525         output_operand_lossage ("invalid use of '%%%c'", letter);
7526       break;
7527
7528     default:
7529       switch (code)
7530         {
7531         case REG:
7532           {
7533             unsigned int regno = REGNO (op);
7534             if ((letter == 'M' && TARGET_LITTLE_ENDIAN)
7535                 || (letter == 'L' && TARGET_BIG_ENDIAN)
7536                 || letter == 'D')
7537               regno++;
7538             else if (letter && letter != 'z' && letter != 'M' && letter != 'L')
7539               output_operand_lossage ("invalid use of '%%%c'", letter);
7540             /* We need to print $0 .. $31 for COP0 registers.  */
7541             if (COP0_REG_P (regno))
7542               fprintf (file, "$%s", &reg_names[regno][4]);
7543             else
7544               fprintf (file, "%s", reg_names[regno]);
7545           }
7546           break;
7547
7548         case MEM:
7549           if (letter == 'D')
7550             output_address (plus_constant (XEXP (op, 0), 4));
7551           else if (letter && letter != 'z')
7552             output_operand_lossage ("invalid use of '%%%c'", letter);
7553           else
7554             output_address (XEXP (op, 0));
7555           break;
7556
7557         default:
7558           if (letter == 'z' && op == CONST0_RTX (GET_MODE (op)))
7559             fputs (reg_names[GP_REG_FIRST], file);
7560           else if (letter && letter != 'z')
7561             output_operand_lossage ("invalid use of '%%%c'", letter);
7562           else if (CONST_GP_P (op))
7563             fputs (reg_names[GLOBAL_POINTER_REGNUM], file);
7564           else
7565             output_addr_const (file, mips_strip_unspec_address (op));
7566           break;
7567         }
7568     }
7569 }
7570
7571 /* Output address operand X to FILE.  */
7572
7573 void
7574 mips_print_operand_address (FILE *file, rtx x)
7575 {
7576   struct mips_address_info addr;
7577
7578   if (mips_classify_address (&addr, x, word_mode, true))
7579     switch (addr.type)
7580       {
7581       case ADDRESS_REG:
7582         mips_print_operand (file, addr.offset, 0);
7583         fprintf (file, "(%s)", reg_names[REGNO (addr.reg)]);
7584         return;
7585
7586       case ADDRESS_LO_SUM:
7587         mips_print_operand_reloc (file, addr.offset, SYMBOL_CONTEXT_MEM,
7588                                   mips_lo_relocs);
7589         fprintf (file, "(%s)", reg_names[REGNO (addr.reg)]);
7590         return;
7591
7592       case ADDRESS_CONST_INT:
7593         output_addr_const (file, x);
7594         fprintf (file, "(%s)", reg_names[GP_REG_FIRST]);
7595         return;
7596
7597       case ADDRESS_SYMBOLIC:
7598         output_addr_const (file, mips_strip_unspec_address (x));
7599         return;
7600       }
7601   gcc_unreachable ();
7602 }
7603 \f
7604 /* Implement TARGET_ENCODE_SECTION_INFO.  */
7605
7606 static void
7607 mips_encode_section_info (tree decl, rtx rtl, int first)
7608 {
7609   default_encode_section_info (decl, rtl, first);
7610
7611   if (TREE_CODE (decl) == FUNCTION_DECL)
7612     {
7613       rtx symbol = XEXP (rtl, 0);
7614       tree type = TREE_TYPE (decl);
7615
7616       /* Encode whether the symbol is short or long.  */
7617       if ((TARGET_LONG_CALLS && !mips_near_type_p (type))
7618           || mips_far_type_p (type))
7619         SYMBOL_REF_FLAGS (symbol) |= SYMBOL_FLAG_LONG_CALL;
7620     }
7621 }
7622
7623 /* Implement TARGET_SELECT_RTX_SECTION.  */
7624
7625 static section *
7626 mips_select_rtx_section (enum machine_mode mode, rtx x,
7627                          unsigned HOST_WIDE_INT align)
7628 {
7629   /* ??? Consider using mergeable small data sections.  */
7630   if (mips_rtx_constant_in_small_data_p (mode))
7631     return get_named_section (NULL, ".sdata", 0);
7632
7633   return default_elf_select_rtx_section (mode, x, align);
7634 }
7635
7636 /* Implement TARGET_ASM_FUNCTION_RODATA_SECTION.
7637
7638    The complication here is that, with the combination TARGET_ABICALLS
7639    && !TARGET_ABSOLUTE_ABICALLS && !TARGET_GPWORD, jump tables will use
7640    absolute addresses, and should therefore not be included in the
7641    read-only part of a DSO.  Handle such cases by selecting a normal
7642    data section instead of a read-only one.  The logic apes that in
7643    default_function_rodata_section.  */
7644
7645 static section *
7646 mips_function_rodata_section (tree decl)
7647 {
7648   if (!TARGET_ABICALLS || TARGET_ABSOLUTE_ABICALLS || TARGET_GPWORD)
7649     return default_function_rodata_section (decl);
7650
7651   if (decl && DECL_SECTION_NAME (decl))
7652     {
7653       const char *name = TREE_STRING_POINTER (DECL_SECTION_NAME (decl));
7654       if (DECL_ONE_ONLY (decl) && strncmp (name, ".gnu.linkonce.t.", 16) == 0)
7655         {
7656           char *rname = ASTRDUP (name);
7657           rname[14] = 'd';
7658           return get_section (rname, SECTION_LINKONCE | SECTION_WRITE, decl);
7659         }
7660       else if (flag_function_sections
7661                && flag_data_sections
7662                && strncmp (name, ".text.", 6) == 0)
7663         {
7664           char *rname = ASTRDUP (name);
7665           memcpy (rname + 1, "data", 4);
7666           return get_section (rname, SECTION_WRITE, decl);
7667         }
7668     }
7669   return data_section;
7670 }
7671
7672 /* Implement TARGET_IN_SMALL_DATA_P.  */
7673
7674 static bool
7675 mips_in_small_data_p (const_tree decl)
7676 {
7677   unsigned HOST_WIDE_INT size;
7678
7679   if (TREE_CODE (decl) == STRING_CST || TREE_CODE (decl) == FUNCTION_DECL)
7680     return false;
7681
7682   /* We don't yet generate small-data references for -mabicalls
7683      or VxWorks RTP code.  See the related -G handling in
7684      mips_override_options.  */
7685   if (TARGET_ABICALLS || TARGET_VXWORKS_RTP)
7686     return false;
7687
7688   if (TREE_CODE (decl) == VAR_DECL && DECL_SECTION_NAME (decl) != 0)
7689     {
7690       const char *name;
7691
7692       /* Reject anything that isn't in a known small-data section.  */
7693       name = TREE_STRING_POINTER (DECL_SECTION_NAME (decl));
7694       if (strcmp (name, ".sdata") != 0 && strcmp (name, ".sbss") != 0)
7695         return false;
7696
7697       /* If a symbol is defined externally, the assembler will use the
7698          usual -G rules when deciding how to implement macros.  */
7699       if (mips_lo_relocs[SYMBOL_GP_RELATIVE] || !DECL_EXTERNAL (decl))
7700         return true;
7701     }
7702   else if (TARGET_EMBEDDED_DATA)
7703     {
7704       /* Don't put constants into the small data section: we want them
7705          to be in ROM rather than RAM.  */
7706       if (TREE_CODE (decl) != VAR_DECL)
7707         return false;
7708
7709       if (TREE_READONLY (decl)
7710           && !TREE_SIDE_EFFECTS (decl)
7711           && (!DECL_INITIAL (decl) || TREE_CONSTANT (DECL_INITIAL (decl))))
7712         return false;
7713     }
7714
7715   /* Enforce -mlocal-sdata.  */
7716   if (!TARGET_LOCAL_SDATA && !TREE_PUBLIC (decl))
7717     return false;
7718
7719   /* Enforce -mextern-sdata.  */
7720   if (!TARGET_EXTERN_SDATA && DECL_P (decl))
7721     {
7722       if (DECL_EXTERNAL (decl))
7723         return false;
7724       if (DECL_COMMON (decl) && DECL_INITIAL (decl) == NULL)
7725         return false;
7726     }
7727
7728   /* We have traditionally not treated zero-sized objects as small data,
7729      so this is now effectively part of the ABI.  */
7730   size = int_size_in_bytes (TREE_TYPE (decl));
7731   return size > 0 && size <= mips_small_data_threshold;
7732 }
7733
7734 /* Implement TARGET_USE_ANCHORS_FOR_SYMBOL_P.  We don't want to use
7735    anchors for small data: the GP register acts as an anchor in that
7736    case.  We also don't want to use them for PC-relative accesses,
7737    where the PC acts as an anchor.  */
7738
7739 static bool
7740 mips_use_anchors_for_symbol_p (const_rtx symbol)
7741 {
7742   switch (mips_classify_symbol (symbol, SYMBOL_CONTEXT_MEM))
7743     {
7744     case SYMBOL_PC_RELATIVE:
7745     case SYMBOL_GP_RELATIVE:
7746       return false;
7747
7748     default:
7749       return default_use_anchors_for_symbol_p (symbol);
7750     }
7751 }
7752 \f
7753 /* The MIPS debug format wants all automatic variables and arguments
7754    to be in terms of the virtual frame pointer (stack pointer before
7755    any adjustment in the function), while the MIPS 3.0 linker wants
7756    the frame pointer to be the stack pointer after the initial
7757    adjustment.  So, we do the adjustment here.  The arg pointer (which
7758    is eliminated) points to the virtual frame pointer, while the frame
7759    pointer (which may be eliminated) points to the stack pointer after
7760    the initial adjustments.  */
7761
7762 HOST_WIDE_INT
7763 mips_debugger_offset (rtx addr, HOST_WIDE_INT offset)
7764 {
7765   rtx offset2 = const0_rtx;
7766   rtx reg = eliminate_constant_term (addr, &offset2);
7767
7768   if (offset == 0)
7769     offset = INTVAL (offset2);
7770
7771   if (reg == stack_pointer_rtx
7772       || reg == frame_pointer_rtx
7773       || reg == hard_frame_pointer_rtx)
7774     {
7775       offset -= cfun->machine->frame.total_size;
7776       if (reg == hard_frame_pointer_rtx)
7777         offset += cfun->machine->frame.hard_frame_pointer_offset;
7778     }
7779
7780   /* sdbout_parms does not want this to crash for unrecognized cases.  */
7781 #if 0
7782   else if (reg != arg_pointer_rtx)
7783     fatal_insn ("mips_debugger_offset called with non stack/frame/arg pointer",
7784                 addr);
7785 #endif
7786
7787   return offset;
7788 }
7789 \f
7790 /* Implement ASM_OUTPUT_EXTERNAL.  */
7791
7792 void
7793 mips_output_external (FILE *file, tree decl, const char *name)
7794 {
7795   default_elf_asm_output_external (file, decl, name);
7796
7797   /* We output the name if and only if TREE_SYMBOL_REFERENCED is
7798      set in order to avoid putting out names that are never really
7799      used. */
7800   if (TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (decl)))
7801     {
7802       if (!TARGET_EXPLICIT_RELOCS && mips_in_small_data_p (decl))
7803         {
7804           /* When using assembler macros, emit .extern directives for
7805              all small-data externs so that the assembler knows how
7806              big they are.
7807
7808              In most cases it would be safe (though pointless) to emit
7809              .externs for other symbols too.  One exception is when an
7810              object is within the -G limit but declared by the user to
7811              be in a section other than .sbss or .sdata.  */
7812           fputs ("\t.extern\t", file);
7813           assemble_name (file, name);
7814           fprintf (file, ", " HOST_WIDE_INT_PRINT_DEC "\n",
7815                    int_size_in_bytes (TREE_TYPE (decl)));
7816         }
7817       else if (TARGET_IRIX
7818                && mips_abi == ABI_32
7819                && TREE_CODE (decl) == FUNCTION_DECL)
7820         {
7821           /* In IRIX 5 or IRIX 6 for the O32 ABI, we must output a
7822              `.global name .text' directive for every used but
7823              undefined function.  If we don't, the linker may perform
7824              an optimization (skipping over the insns that set $gp)
7825              when it is unsafe.  */
7826           fputs ("\t.globl ", file);
7827           assemble_name (file, name);
7828           fputs (" .text\n", file);
7829         }
7830     }
7831 }
7832
7833 /* Implement ASM_OUTPUT_SOURCE_FILENAME.  */
7834
7835 void
7836 mips_output_filename (FILE *stream, const char *name)
7837 {
7838   /* If we are emitting DWARF-2, let dwarf2out handle the ".file"
7839      directives.  */
7840   if (write_symbols == DWARF2_DEBUG)
7841     return;
7842   else if (mips_output_filename_first_time)
7843     {
7844       mips_output_filename_first_time = 0;
7845       num_source_filenames += 1;
7846       current_function_file = name;
7847       fprintf (stream, "\t.file\t%d ", num_source_filenames);
7848       output_quoted_string (stream, name);
7849       putc ('\n', stream);
7850     }
7851   /* If we are emitting stabs, let dbxout.c handle this (except for
7852      the mips_output_filename_first_time case).  */
7853   else if (write_symbols == DBX_DEBUG)
7854     return;
7855   else if (name != current_function_file
7856            && strcmp (name, current_function_file) != 0)
7857     {
7858       num_source_filenames += 1;
7859       current_function_file = name;
7860       fprintf (stream, "\t.file\t%d ", num_source_filenames);
7861       output_quoted_string (stream, name);
7862       putc ('\n', stream);
7863     }
7864 }
7865
7866 /* Implement TARGET_ASM_OUTPUT_DWARF_DTPREL.  */
7867
7868 static void ATTRIBUTE_UNUSED
7869 mips_output_dwarf_dtprel (FILE *file, int size, rtx x)
7870 {
7871   switch (size)
7872     {
7873     case 4:
7874       fputs ("\t.dtprelword\t", file);
7875       break;
7876
7877     case 8:
7878       fputs ("\t.dtpreldword\t", file);
7879       break;
7880
7881     default:
7882       gcc_unreachable ();
7883     }
7884   output_addr_const (file, x);
7885   fputs ("+0x8000", file);
7886 }
7887
7888 /* Implement TARGET_DWARF_REGISTER_SPAN.  */
7889
7890 static rtx
7891 mips_dwarf_register_span (rtx reg)
7892 {
7893   rtx high, low;
7894   enum machine_mode mode;
7895
7896   /* By default, GCC maps increasing register numbers to increasing
7897      memory locations, but paired FPRs are always little-endian,
7898      regardless of the prevailing endianness.  */
7899   mode = GET_MODE (reg);
7900   if (FP_REG_P (REGNO (reg))
7901       && TARGET_BIG_ENDIAN
7902       && MAX_FPRS_PER_FMT > 1
7903       && GET_MODE_SIZE (mode) > UNITS_PER_FPREG)
7904     {
7905       gcc_assert (GET_MODE_SIZE (mode) == UNITS_PER_HWFPVALUE);
7906       high = mips_subword (reg, true);
7907       low = mips_subword (reg, false);
7908       return gen_rtx_PARALLEL (VOIDmode, gen_rtvec (2, high, low));
7909     }
7910
7911   return NULL_RTX;
7912 }
7913
7914 /* Implement ASM_OUTPUT_ASCII.  */
7915
7916 void
7917 mips_output_ascii (FILE *stream, const char *string, size_t len)
7918 {
7919   size_t i;
7920   int cur_pos;
7921
7922   cur_pos = 17;
7923   fprintf (stream, "\t.ascii\t\"");
7924   for (i = 0; i < len; i++)
7925     {
7926       int c;
7927
7928       c = (unsigned char) string[i];
7929       if (ISPRINT (c))
7930         {
7931           if (c == '\\' || c == '\"')
7932             {
7933               putc ('\\', stream);
7934               cur_pos++;
7935             }
7936           putc (c, stream);
7937           cur_pos++;
7938         }
7939       else
7940         {
7941           fprintf (stream, "\\%03o", c);
7942           cur_pos += 4;
7943         }
7944
7945       if (cur_pos > 72 && i+1 < len)
7946         {
7947           cur_pos = 17;
7948           fprintf (stream, "\"\n\t.ascii\t\"");
7949         }
7950     }
7951   fprintf (stream, "\"\n");
7952 }
7953
7954 /* Emit either a label, .comm, or .lcomm directive.  When using assembler
7955    macros, mark the symbol as written so that mips_asm_output_external
7956    won't emit an .extern for it.  STREAM is the output file, NAME is the
7957    name of the symbol, INIT_STRING is the string that should be written
7958    before the symbol and FINAL_STRING is the string that should be
7959    written after it.  FINAL_STRING is a printf format that consumes the
7960    remaining arguments.  */
7961
7962 void
7963 mips_declare_object (FILE *stream, const char *name, const char *init_string,
7964                      const char *final_string, ...)
7965 {
7966   va_list ap;
7967
7968   fputs (init_string, stream);
7969   assemble_name (stream, name);
7970   va_start (ap, final_string);
7971   vfprintf (stream, final_string, ap);
7972   va_end (ap);
7973
7974   if (!TARGET_EXPLICIT_RELOCS)
7975     {
7976       tree name_tree = get_identifier (name);
7977       TREE_ASM_WRITTEN (name_tree) = 1;
7978     }
7979 }
7980
7981 /* Declare a common object of SIZE bytes using asm directive INIT_STRING.
7982    NAME is the name of the object and ALIGN is the required alignment
7983    in bytes.  TAKES_ALIGNMENT_P is true if the directive takes a third
7984    alignment argument.  */
7985
7986 void
7987 mips_declare_common_object (FILE *stream, const char *name,
7988                             const char *init_string,
7989                             unsigned HOST_WIDE_INT size,
7990                             unsigned int align, bool takes_alignment_p)
7991 {
7992   if (!takes_alignment_p)
7993     {
7994       size += (align / BITS_PER_UNIT) - 1;
7995       size -= size % (align / BITS_PER_UNIT);
7996       mips_declare_object (stream, name, init_string,
7997                            "," HOST_WIDE_INT_PRINT_UNSIGNED "\n", size);
7998     }
7999   else
8000     mips_declare_object (stream, name, init_string,
8001                          "," HOST_WIDE_INT_PRINT_UNSIGNED ",%u\n",
8002                          size, align / BITS_PER_UNIT);
8003 }
8004
8005 /* Implement ASM_OUTPUT_ALIGNED_DECL_COMMON.  This is usually the same as the
8006    elfos.h version, but we also need to handle -muninit-const-in-rodata.  */
8007
8008 void
8009 mips_output_aligned_decl_common (FILE *stream, tree decl, const char *name,
8010                                  unsigned HOST_WIDE_INT size,
8011                                  unsigned int align)
8012 {
8013   /* If the target wants uninitialized const declarations in
8014      .rdata then don't put them in .comm.  */
8015   if (TARGET_EMBEDDED_DATA
8016       && TARGET_UNINIT_CONST_IN_RODATA
8017       && TREE_CODE (decl) == VAR_DECL
8018       && TREE_READONLY (decl)
8019       && (DECL_INITIAL (decl) == 0 || DECL_INITIAL (decl) == error_mark_node))
8020     {
8021       if (TREE_PUBLIC (decl) && DECL_NAME (decl))
8022         targetm.asm_out.globalize_label (stream, name);
8023
8024       switch_to_section (readonly_data_section);
8025       ASM_OUTPUT_ALIGN (stream, floor_log2 (align / BITS_PER_UNIT));
8026       mips_declare_object (stream, name, "",
8027                            ":\n\t.space\t" HOST_WIDE_INT_PRINT_UNSIGNED "\n",
8028                            size);
8029     }
8030   else
8031     mips_declare_common_object (stream, name, "\n\t.comm\t",
8032                                 size, align, true);
8033 }
8034
8035 #ifdef ASM_OUTPUT_SIZE_DIRECTIVE
8036 extern int size_directive_output;
8037
8038 /* Implement ASM_DECLARE_OBJECT_NAME.  This is like most of the standard ELF
8039    definitions except that it uses mips_declare_object to emit the label.  */
8040
8041 void
8042 mips_declare_object_name (FILE *stream, const char *name,
8043                           tree decl ATTRIBUTE_UNUSED)
8044 {
8045 #ifdef ASM_OUTPUT_TYPE_DIRECTIVE
8046   ASM_OUTPUT_TYPE_DIRECTIVE (stream, name, "object");
8047 #endif
8048
8049   size_directive_output = 0;
8050   if (!flag_inhibit_size_directive && DECL_SIZE (decl))
8051     {
8052       HOST_WIDE_INT size;
8053
8054       size_directive_output = 1;
8055       size = int_size_in_bytes (TREE_TYPE (decl));
8056       ASM_OUTPUT_SIZE_DIRECTIVE (stream, name, size);
8057     }
8058
8059   mips_declare_object (stream, name, "", ":\n");
8060 }
8061
8062 /* Implement ASM_FINISH_DECLARE_OBJECT.  This is generic ELF stuff.  */
8063
8064 void
8065 mips_finish_declare_object (FILE *stream, tree decl, int top_level, int at_end)
8066 {
8067   const char *name;
8068
8069   name = XSTR (XEXP (DECL_RTL (decl), 0), 0);
8070   if (!flag_inhibit_size_directive
8071       && DECL_SIZE (decl) != 0
8072       && !at_end
8073       && top_level
8074       && DECL_INITIAL (decl) == error_mark_node
8075       && !size_directive_output)
8076     {
8077       HOST_WIDE_INT size;
8078
8079       size_directive_output = 1;
8080       size = int_size_in_bytes (TREE_TYPE (decl));
8081       ASM_OUTPUT_SIZE_DIRECTIVE (stream, name, size);
8082     }
8083 }
8084 #endif
8085 \f
8086 /* Return the FOO in the name of the ".mdebug.FOO" section associated
8087    with the current ABI.  */
8088
8089 static const char *
8090 mips_mdebug_abi_name (void)
8091 {
8092   switch (mips_abi)
8093     {
8094     case ABI_32:
8095       return "abi32";
8096     case ABI_O64:
8097       return "abiO64";
8098     case ABI_N32:
8099       return "abiN32";
8100     case ABI_64:
8101       return "abi64";
8102     case ABI_EABI:
8103       return TARGET_64BIT ? "eabi64" : "eabi32";
8104     default:
8105       gcc_unreachable ();
8106     }
8107 }
8108
8109 /* Implement TARGET_ASM_FILE_START.  */
8110
8111 static void
8112 mips_file_start (void)
8113 {
8114   default_file_start ();
8115
8116   /* Generate a special section to describe the ABI switches used to
8117      produce the resultant binary.  This is unnecessary on IRIX and
8118      causes unwanted warnings from the native linker.  */
8119   if (!TARGET_IRIX)
8120     {
8121       /* Record the ABI itself.  Modern versions of binutils encode
8122          this information in the ELF header flags, but GDB needs the
8123          information in order to correctly debug binaries produced by
8124          older binutils.  See the function mips_gdbarch_init in
8125          gdb/mips-tdep.c.  */
8126       fprintf (asm_out_file, "\t.section .mdebug.%s\n\t.previous\n",
8127                mips_mdebug_abi_name ());
8128
8129       /* There is no ELF header flag to distinguish long32 forms of the
8130          EABI from long64 forms.  Emit a special section to help tools
8131          such as GDB.  Do the same for o64, which is sometimes used with
8132          -mlong64.  */
8133       if (mips_abi == ABI_EABI || mips_abi == ABI_O64)
8134         fprintf (asm_out_file, "\t.section .gcc_compiled_long%d\n"
8135                  "\t.previous\n", TARGET_LONG64 ? 64 : 32);
8136
8137 #ifdef HAVE_AS_GNU_ATTRIBUTE
8138       fprintf (asm_out_file, "\t.gnu_attribute 4, %d\n",
8139                (TARGET_HARD_FLOAT_ABI
8140                 ? (TARGET_DOUBLE_FLOAT
8141                    ? ((!TARGET_64BIT && TARGET_FLOAT64) ? 4 : 1) : 2) : 3));
8142 #endif
8143     }
8144
8145   /* If TARGET_ABICALLS, tell GAS to generate -KPIC code.  */
8146   if (TARGET_ABICALLS)
8147     {
8148       fprintf (asm_out_file, "\t.abicalls\n");
8149       if (TARGET_ABICALLS_PIC0)
8150         fprintf (asm_out_file, "\t.option\tpic0\n");
8151     }
8152
8153   if (flag_verbose_asm)
8154     fprintf (asm_out_file, "\n%s -G value = %d, Arch = %s, ISA = %d\n",
8155              ASM_COMMENT_START,
8156              mips_small_data_threshold, mips_arch_info->name, mips_isa);
8157 }
8158 \f
8159 /* Make the last instruction frame-related and note that it performs
8160    the operation described by FRAME_PATTERN.  */
8161
8162 static void
8163 mips_set_frame_expr (rtx frame_pattern)
8164 {
8165   rtx insn;
8166
8167   insn = get_last_insn ();
8168   RTX_FRAME_RELATED_P (insn) = 1;
8169   REG_NOTES (insn) = alloc_EXPR_LIST (REG_FRAME_RELATED_EXPR,
8170                                       frame_pattern,
8171                                       REG_NOTES (insn));
8172 }
8173
8174 /* Return a frame-related rtx that stores REG at MEM.
8175    REG must be a single register.  */
8176
8177 static rtx
8178 mips_frame_set (rtx mem, rtx reg)
8179 {
8180   rtx set;
8181
8182   /* If we're saving the return address register and the DWARF return
8183      address column differs from the hard register number, adjust the
8184      note reg to refer to the former.  */
8185   if (REGNO (reg) == RETURN_ADDR_REGNUM
8186       && DWARF_FRAME_RETURN_COLUMN != RETURN_ADDR_REGNUM)
8187     reg = gen_rtx_REG (GET_MODE (reg), DWARF_FRAME_RETURN_COLUMN);
8188
8189   set = gen_rtx_SET (VOIDmode, mem, reg);
8190   RTX_FRAME_RELATED_P (set) = 1;
8191
8192   return set;
8193 }
8194 \f
8195 /* If a MIPS16e SAVE or RESTORE instruction saves or restores register
8196    mips16e_s2_s8_regs[X], it must also save the registers in indexes
8197    X + 1 onwards.  Likewise mips16e_a0_a3_regs.  */
8198 static const unsigned char mips16e_s2_s8_regs[] = {
8199   30, 23, 22, 21, 20, 19, 18
8200 };
8201 static const unsigned char mips16e_a0_a3_regs[] = {
8202   4, 5, 6, 7
8203 };
8204
8205 /* A list of the registers that can be saved by the MIPS16e SAVE instruction,
8206    ordered from the uppermost in memory to the lowest in memory.  */
8207 static const unsigned char mips16e_save_restore_regs[] = {
8208   31, 30, 23, 22, 21, 20, 19, 18, 17, 16, 7, 6, 5, 4
8209 };
8210
8211 /* Return the index of the lowest X in the range [0, SIZE) for which
8212    bit REGS[X] is set in MASK.  Return SIZE if there is no such X.  */
8213
8214 static unsigned int
8215 mips16e_find_first_register (unsigned int mask, const unsigned char *regs,
8216                              unsigned int size)
8217 {
8218   unsigned int i;
8219
8220   for (i = 0; i < size; i++)
8221     if (BITSET_P (mask, regs[i]))
8222       break;
8223
8224   return i;
8225 }
8226
8227 /* *MASK_PTR is a mask of general-purpose registers and *NUM_REGS_PTR
8228    is the number of set bits.  If *MASK_PTR contains REGS[X] for some X
8229    in [0, SIZE), adjust *MASK_PTR and *NUM_REGS_PTR so that the same
8230    is true for all indexes (X, SIZE).  */
8231
8232 static void
8233 mips16e_mask_registers (unsigned int *mask_ptr, const unsigned char *regs,
8234                         unsigned int size, unsigned int *num_regs_ptr)
8235 {
8236   unsigned int i;
8237
8238   i = mips16e_find_first_register (*mask_ptr, regs, size);
8239   for (i++; i < size; i++)
8240     if (!BITSET_P (*mask_ptr, regs[i]))
8241       {
8242         *num_regs_ptr += 1;
8243         *mask_ptr |= 1 << regs[i];
8244       }
8245 }
8246
8247 /* Return a simplified form of X using the register values in REG_VALUES.
8248    REG_VALUES[R] is the last value assigned to hard register R, or null
8249    if R has not been modified.
8250
8251    This function is rather limited, but is good enough for our purposes.  */
8252
8253 static rtx
8254 mips16e_collect_propagate_value (rtx x, rtx *reg_values)
8255 {
8256   x = avoid_constant_pool_reference (x);
8257
8258   if (UNARY_P (x))
8259     {
8260       rtx x0 = mips16e_collect_propagate_value (XEXP (x, 0), reg_values);
8261       return simplify_gen_unary (GET_CODE (x), GET_MODE (x),
8262                                  x0, GET_MODE (XEXP (x, 0)));
8263     }
8264
8265   if (ARITHMETIC_P (x))
8266     {
8267       rtx x0 = mips16e_collect_propagate_value (XEXP (x, 0), reg_values);
8268       rtx x1 = mips16e_collect_propagate_value (XEXP (x, 1), reg_values);
8269       return simplify_gen_binary (GET_CODE (x), GET_MODE (x), x0, x1);
8270     }
8271
8272   if (REG_P (x)
8273       && reg_values[REGNO (x)]
8274       && !rtx_unstable_p (reg_values[REGNO (x)]))
8275     return reg_values[REGNO (x)];
8276
8277   return x;
8278 }
8279
8280 /* Return true if (set DEST SRC) stores an argument register into its
8281    caller-allocated save slot, storing the number of that argument
8282    register in *REGNO_PTR if so.  REG_VALUES is as for
8283    mips16e_collect_propagate_value.  */
8284
8285 static bool
8286 mips16e_collect_argument_save_p (rtx dest, rtx src, rtx *reg_values,
8287                                  unsigned int *regno_ptr)
8288 {
8289   unsigned int argno, regno;
8290   HOST_WIDE_INT offset, required_offset;
8291   rtx addr, base;
8292
8293   /* Check that this is a word-mode store.  */
8294   if (!MEM_P (dest) || !REG_P (src) || GET_MODE (dest) != word_mode)
8295     return false;
8296
8297   /* Check that the register being saved is an unmodified argument
8298      register.  */
8299   regno = REGNO (src);
8300   if (!IN_RANGE (regno, GP_ARG_FIRST, GP_ARG_LAST) || reg_values[regno])
8301     return false;
8302   argno = regno - GP_ARG_FIRST;
8303
8304   /* Check whether the address is an appropriate stack-pointer or
8305      frame-pointer access.  */
8306   addr = mips16e_collect_propagate_value (XEXP (dest, 0), reg_values);
8307   mips_split_plus (addr, &base, &offset);
8308   required_offset = cfun->machine->frame.total_size + argno * UNITS_PER_WORD;
8309   if (base == hard_frame_pointer_rtx)
8310     required_offset -= cfun->machine->frame.hard_frame_pointer_offset;
8311   else if (base != stack_pointer_rtx)
8312     return false;
8313   if (offset != required_offset)
8314     return false;
8315
8316   *regno_ptr = regno;
8317   return true;
8318 }
8319
8320 /* A subroutine of mips_expand_prologue, called only when generating
8321    MIPS16e SAVE instructions.  Search the start of the function for any
8322    instructions that save argument registers into their caller-allocated
8323    save slots.  Delete such instructions and return a value N such that
8324    saving [GP_ARG_FIRST, GP_ARG_FIRST + N) would make all the deleted
8325    instructions redundant.  */
8326
8327 static unsigned int
8328 mips16e_collect_argument_saves (void)
8329 {
8330   rtx reg_values[FIRST_PSEUDO_REGISTER];
8331   rtx insn, next, set, dest, src;
8332   unsigned int nargs, regno;
8333
8334   push_topmost_sequence ();
8335   nargs = 0;
8336   memset (reg_values, 0, sizeof (reg_values));
8337   for (insn = get_insns (); insn; insn = next)
8338     {
8339       next = NEXT_INSN (insn);
8340       if (NOTE_P (insn) || DEBUG_INSN_P (insn))
8341         continue;
8342
8343       if (!INSN_P (insn))
8344         break;
8345
8346       set = PATTERN (insn);
8347       if (GET_CODE (set) != SET)
8348         break;
8349
8350       dest = SET_DEST (set);
8351       src = SET_SRC (set);
8352       if (mips16e_collect_argument_save_p (dest, src, reg_values, &regno))
8353         {
8354           if (!BITSET_P (cfun->machine->frame.mask, regno))
8355             {
8356               delete_insn (insn);
8357               nargs = MAX (nargs, (regno - GP_ARG_FIRST) + 1);
8358             }
8359         }
8360       else if (REG_P (dest) && GET_MODE (dest) == word_mode)
8361         reg_values[REGNO (dest)]
8362           = mips16e_collect_propagate_value (src, reg_values);
8363       else
8364         break;
8365     }
8366   pop_topmost_sequence ();
8367
8368   return nargs;
8369 }
8370
8371 /* Return a move between register REGNO and memory location SP + OFFSET.
8372    Make the move a load if RESTORE_P, otherwise make it a frame-related
8373    store.  */
8374
8375 static rtx
8376 mips16e_save_restore_reg (bool restore_p, HOST_WIDE_INT offset,
8377                           unsigned int regno)
8378 {
8379   rtx reg, mem;
8380
8381   mem = gen_frame_mem (SImode, plus_constant (stack_pointer_rtx, offset));
8382   reg = gen_rtx_REG (SImode, regno);
8383   return (restore_p
8384           ? gen_rtx_SET (VOIDmode, reg, mem)
8385           : mips_frame_set (mem, reg));
8386 }
8387
8388 /* Return RTL for a MIPS16e SAVE or RESTORE instruction; RESTORE_P says which.
8389    The instruction must:
8390
8391      - Allocate or deallocate SIZE bytes in total; SIZE is known
8392        to be nonzero.
8393
8394      - Save or restore as many registers in *MASK_PTR as possible.
8395        The instruction saves the first registers at the top of the
8396        allocated area, with the other registers below it.
8397
8398      - Save NARGS argument registers above the allocated area.
8399
8400    (NARGS is always zero if RESTORE_P.)
8401
8402    The SAVE and RESTORE instructions cannot save and restore all general
8403    registers, so there may be some registers left over for the caller to
8404    handle.  Destructively modify *MASK_PTR so that it contains the registers
8405    that still need to be saved or restored.  The caller can save these
8406    registers in the memory immediately below *OFFSET_PTR, which is a
8407    byte offset from the bottom of the allocated stack area.  */
8408
8409 static rtx
8410 mips16e_build_save_restore (bool restore_p, unsigned int *mask_ptr,
8411                             HOST_WIDE_INT *offset_ptr, unsigned int nargs,
8412                             HOST_WIDE_INT size)
8413 {
8414   rtx pattern, set;
8415   HOST_WIDE_INT offset, top_offset;
8416   unsigned int i, regno;
8417   int n;
8418
8419   gcc_assert (cfun->machine->frame.num_fp == 0);
8420
8421   /* Calculate the number of elements in the PARALLEL.  We need one element
8422      for the stack adjustment, one for each argument register save, and one
8423      for each additional register move.  */
8424   n = 1 + nargs;
8425   for (i = 0; i < ARRAY_SIZE (mips16e_save_restore_regs); i++)
8426     if (BITSET_P (*mask_ptr, mips16e_save_restore_regs[i]))
8427       n++;
8428
8429   /* Create the final PARALLEL.  */
8430   pattern = gen_rtx_PARALLEL (VOIDmode, rtvec_alloc (n));
8431   n = 0;
8432
8433   /* Add the stack pointer adjustment.  */
8434   set = gen_rtx_SET (VOIDmode, stack_pointer_rtx,
8435                      plus_constant (stack_pointer_rtx,
8436                                     restore_p ? size : -size));
8437   RTX_FRAME_RELATED_P (set) = 1;
8438   XVECEXP (pattern, 0, n++) = set;
8439
8440   /* Stack offsets in the PARALLEL are relative to the old stack pointer.  */
8441   top_offset = restore_p ? size : 0;
8442
8443   /* Save the arguments.  */
8444   for (i = 0; i < nargs; i++)
8445     {
8446       offset = top_offset + i * UNITS_PER_WORD;
8447       set = mips16e_save_restore_reg (restore_p, offset, GP_ARG_FIRST + i);
8448       XVECEXP (pattern, 0, n++) = set;
8449     }
8450
8451   /* Then fill in the other register moves.  */
8452   offset = top_offset;
8453   for (i = 0; i < ARRAY_SIZE (mips16e_save_restore_regs); i++)
8454     {
8455       regno = mips16e_save_restore_regs[i];
8456       if (BITSET_P (*mask_ptr, regno))
8457         {
8458           offset -= UNITS_PER_WORD;
8459           set = mips16e_save_restore_reg (restore_p, offset, regno);
8460           XVECEXP (pattern, 0, n++) = set;
8461           *mask_ptr &= ~(1 << regno);
8462         }
8463     }
8464
8465   /* Tell the caller what offset it should use for the remaining registers.  */
8466   *offset_ptr = size + (offset - top_offset);
8467
8468   gcc_assert (n == XVECLEN (pattern, 0));
8469
8470   return pattern;
8471 }
8472
8473 /* PATTERN is a PARALLEL whose first element adds ADJUST to the stack
8474    pointer.  Return true if PATTERN matches the kind of instruction
8475    generated by mips16e_build_save_restore.  If INFO is nonnull,
8476    initialize it when returning true.  */
8477
8478 bool
8479 mips16e_save_restore_pattern_p (rtx pattern, HOST_WIDE_INT adjust,
8480                                 struct mips16e_save_restore_info *info)
8481 {
8482   unsigned int i, nargs, mask, extra;
8483   HOST_WIDE_INT top_offset, save_offset, offset;
8484   rtx set, reg, mem, base;
8485   int n;
8486
8487   if (!GENERATE_MIPS16E_SAVE_RESTORE)
8488     return false;
8489
8490   /* Stack offsets in the PARALLEL are relative to the old stack pointer.  */
8491   top_offset = adjust > 0 ? adjust : 0;
8492
8493   /* Interpret all other members of the PARALLEL.  */
8494   save_offset = top_offset - UNITS_PER_WORD;
8495   mask = 0;
8496   nargs = 0;
8497   i = 0;
8498   for (n = 1; n < XVECLEN (pattern, 0); n++)
8499     {
8500       /* Check that we have a SET.  */
8501       set = XVECEXP (pattern, 0, n);
8502       if (GET_CODE (set) != SET)
8503         return false;
8504
8505       /* Check that the SET is a load (if restoring) or a store
8506          (if saving).  */
8507       mem = adjust > 0 ? SET_SRC (set) : SET_DEST (set);
8508       if (!MEM_P (mem))
8509         return false;
8510
8511       /* Check that the address is the sum of the stack pointer and a
8512          possibly-zero constant offset.  */
8513       mips_split_plus (XEXP (mem, 0), &base, &offset);
8514       if (base != stack_pointer_rtx)
8515         return false;
8516
8517       /* Check that SET's other operand is a register.  */
8518       reg = adjust > 0 ? SET_DEST (set) : SET_SRC (set);
8519       if (!REG_P (reg))
8520         return false;
8521
8522       /* Check for argument saves.  */
8523       if (offset == top_offset + nargs * UNITS_PER_WORD
8524           && REGNO (reg) == GP_ARG_FIRST + nargs)
8525         nargs++;
8526       else if (offset == save_offset)
8527         {
8528           while (mips16e_save_restore_regs[i++] != REGNO (reg))
8529             if (i == ARRAY_SIZE (mips16e_save_restore_regs))
8530               return false;
8531
8532           mask |= 1 << REGNO (reg);
8533           save_offset -= UNITS_PER_WORD;
8534         }
8535       else
8536         return false;
8537     }
8538
8539   /* Check that the restrictions on register ranges are met.  */
8540   extra = 0;
8541   mips16e_mask_registers (&mask, mips16e_s2_s8_regs,
8542                           ARRAY_SIZE (mips16e_s2_s8_regs), &extra);
8543   mips16e_mask_registers (&mask, mips16e_a0_a3_regs,
8544                           ARRAY_SIZE (mips16e_a0_a3_regs), &extra);
8545   if (extra != 0)
8546     return false;
8547
8548   /* Make sure that the topmost argument register is not saved twice.
8549      The checks above ensure that the same is then true for the other
8550      argument registers.  */
8551   if (nargs > 0 && BITSET_P (mask, GP_ARG_FIRST + nargs - 1))
8552     return false;
8553
8554   /* Pass back information, if requested.  */
8555   if (info)
8556     {
8557       info->nargs = nargs;
8558       info->mask = mask;
8559       info->size = (adjust > 0 ? adjust : -adjust);
8560     }
8561
8562   return true;
8563 }
8564
8565 /* Add a MIPS16e SAVE or RESTORE register-range argument to string S
8566    for the register range [MIN_REG, MAX_REG].  Return a pointer to
8567    the null terminator.  */
8568
8569 static char *
8570 mips16e_add_register_range (char *s, unsigned int min_reg,
8571                             unsigned int max_reg)
8572 {
8573   if (min_reg != max_reg)
8574     s += sprintf (s, ",%s-%s", reg_names[min_reg], reg_names[max_reg]);
8575   else
8576     s += sprintf (s, ",%s", reg_names[min_reg]);
8577   return s;
8578 }
8579
8580 /* Return the assembly instruction for a MIPS16e SAVE or RESTORE instruction.
8581    PATTERN and ADJUST are as for mips16e_save_restore_pattern_p.  */
8582
8583 const char *
8584 mips16e_output_save_restore (rtx pattern, HOST_WIDE_INT adjust)
8585 {
8586   static char buffer[300];
8587
8588   struct mips16e_save_restore_info info;
8589   unsigned int i, end;
8590   char *s;
8591
8592   /* Parse the pattern.  */
8593   if (!mips16e_save_restore_pattern_p (pattern, adjust, &info))
8594     gcc_unreachable ();
8595
8596   /* Add the mnemonic.  */
8597   s = strcpy (buffer, adjust > 0 ? "restore\t" : "save\t");
8598   s += strlen (s);
8599
8600   /* Save the arguments.  */
8601   if (info.nargs > 1)
8602     s += sprintf (s, "%s-%s,", reg_names[GP_ARG_FIRST],
8603                   reg_names[GP_ARG_FIRST + info.nargs - 1]);
8604   else if (info.nargs == 1)
8605     s += sprintf (s, "%s,", reg_names[GP_ARG_FIRST]);
8606
8607   /* Emit the amount of stack space to allocate or deallocate.  */
8608   s += sprintf (s, "%d", (int) info.size);
8609
8610   /* Save or restore $16.  */
8611   if (BITSET_P (info.mask, 16))
8612     s += sprintf (s, ",%s", reg_names[GP_REG_FIRST + 16]);
8613
8614   /* Save or restore $17.  */
8615   if (BITSET_P (info.mask, 17))
8616     s += sprintf (s, ",%s", reg_names[GP_REG_FIRST + 17]);
8617
8618   /* Save or restore registers in the range $s2...$s8, which
8619      mips16e_s2_s8_regs lists in decreasing order.  Note that this
8620      is a software register range; the hardware registers are not
8621      numbered consecutively.  */
8622   end = ARRAY_SIZE (mips16e_s2_s8_regs);
8623   i = mips16e_find_first_register (info.mask, mips16e_s2_s8_regs, end);
8624   if (i < end)
8625     s = mips16e_add_register_range (s, mips16e_s2_s8_regs[end - 1],
8626                                     mips16e_s2_s8_regs[i]);
8627
8628   /* Save or restore registers in the range $a0...$a3.  */
8629   end = ARRAY_SIZE (mips16e_a0_a3_regs);
8630   i = mips16e_find_first_register (info.mask, mips16e_a0_a3_regs, end);
8631   if (i < end)
8632     s = mips16e_add_register_range (s, mips16e_a0_a3_regs[i],
8633                                     mips16e_a0_a3_regs[end - 1]);
8634
8635   /* Save or restore $31.  */
8636   if (BITSET_P (info.mask, RETURN_ADDR_REGNUM))
8637     s += sprintf (s, ",%s", reg_names[RETURN_ADDR_REGNUM]);
8638
8639   return buffer;
8640 }
8641 \f
8642 /* Return true if the current function returns its value in a floating-point
8643    register in MIPS16 mode.  */
8644
8645 static bool
8646 mips16_cfun_returns_in_fpr_p (void)
8647 {
8648   tree return_type = DECL_RESULT (current_function_decl);
8649   return (TARGET_MIPS16
8650           && TARGET_HARD_FLOAT_ABI
8651           && !aggregate_value_p (return_type, current_function_decl)
8652           && mips_return_mode_in_fpr_p (DECL_MODE (return_type)));
8653 }
8654
8655 /* Return true if predicate PRED is true for at least one instruction.
8656    Cache the result in *CACHE, and assume that the result is true
8657    if *CACHE is already true.  */
8658
8659 static bool
8660 mips_find_gp_ref (bool *cache, bool (*pred) (rtx))
8661 {
8662   rtx insn;
8663
8664   if (!*cache)
8665     {
8666       push_topmost_sequence ();
8667       for (insn = get_insns (); insn; insn = NEXT_INSN (insn))
8668         if (USEFUL_INSN_P (insn) && pred (insn))
8669           {
8670             *cache = true;
8671             break;
8672           }
8673       pop_topmost_sequence ();
8674     }
8675   return *cache;
8676 }
8677
8678 /* Return true if INSN refers to the global pointer in an "inflexible" way.
8679    See mips_cfun_has_inflexible_gp_ref_p for details.  */
8680
8681 static bool
8682 mips_insn_has_inflexible_gp_ref_p (rtx insn)
8683 {
8684   /* Uses of pic_offset_table_rtx in CALL_INSN_FUNCTION_USAGE
8685      indicate that the target could be a traditional MIPS
8686      lazily-binding stub.  */
8687   return find_reg_fusage (insn, USE, pic_offset_table_rtx);
8688 }
8689
8690 /* Return true if the current function refers to the global pointer
8691    in a way that forces $28 to be valid.  This means that we can't
8692    change the choice of global pointer, even for NewABI code.
8693
8694    One example of this (and one which needs several checks) is that
8695    $28 must be valid when calling traditional MIPS lazy-binding stubs.
8696    (This restriction does not apply to PLTs.)  */
8697
8698 static bool
8699 mips_cfun_has_inflexible_gp_ref_p (void)
8700 {
8701   /* If the function has a nonlocal goto, $28 must hold the correct
8702      global pointer for the target function.  That is, the target
8703      of the goto implicitly uses $28.  */
8704   if (crtl->has_nonlocal_goto)
8705     return true;
8706
8707   if (TARGET_ABICALLS_PIC2)
8708     {
8709       /* Symbolic accesses implicitly use the global pointer unless
8710          -mexplicit-relocs is in effect.  JAL macros to symbolic addresses
8711          might go to traditional MIPS lazy-binding stubs.  */
8712       if (!TARGET_EXPLICIT_RELOCS)
8713         return true;
8714
8715       /* FUNCTION_PROFILER includes a JAL to _mcount, which again
8716          can be lazily-bound.  */
8717       if (crtl->profile)
8718         return true;
8719
8720       /* MIPS16 functions that return in FPRs need to call an
8721          external libgcc routine.  This call is only made explict
8722          during mips_expand_epilogue, and it too might be lazily bound.  */
8723       if (mips16_cfun_returns_in_fpr_p ())
8724         return true;
8725     }
8726
8727   return mips_find_gp_ref (&cfun->machine->has_inflexible_gp_insn_p,
8728                            mips_insn_has_inflexible_gp_ref_p);
8729 }
8730
8731 /* Return true if INSN refers to the global pointer in a "flexible" way.
8732    See mips_cfun_has_flexible_gp_ref_p for details.  */
8733
8734 static bool
8735 mips_insn_has_flexible_gp_ref_p (rtx insn)
8736 {
8737   return (get_attr_got (insn) != GOT_UNSET
8738           || mips_small_data_pattern_p (PATTERN (insn))
8739           || reg_overlap_mentioned_p (pic_offset_table_rtx, PATTERN (insn)));
8740 }
8741
8742 /* Return true if the current function references the global pointer,
8743    but if those references do not inherently require the global pointer
8744    to be $28.  Assume !mips_cfun_has_inflexible_gp_ref_p ().  */
8745
8746 static bool
8747 mips_cfun_has_flexible_gp_ref_p (void)
8748 {
8749   /* Reload can sometimes introduce constant pool references
8750      into a function that otherwise didn't need them.  For example,
8751      suppose we have an instruction like:
8752
8753         (set (reg:DF R1) (float:DF (reg:SI R2)))
8754
8755      If R2 turns out to be a constant such as 1, the instruction may
8756      have a REG_EQUAL note saying that R1 == 1.0.  Reload then has
8757      the option of using this constant if R2 doesn't get allocated
8758      to a register.
8759
8760      In cases like these, reload will have added the constant to the
8761      pool but no instruction will yet refer to it.  */
8762   if (TARGET_ABICALLS_PIC2 && !reload_completed && crtl->uses_const_pool)
8763     return true;
8764
8765   return mips_find_gp_ref (&cfun->machine->has_flexible_gp_insn_p,
8766                            mips_insn_has_flexible_gp_ref_p);
8767 }
8768
8769 /* Return the register that should be used as the global pointer
8770    within this function.  Return INVALID_REGNUM if the function
8771    doesn't need a global pointer.  */
8772
8773 static unsigned int
8774 mips_global_pointer (void)
8775 {
8776   unsigned int regno;
8777
8778   /* $gp is always available unless we're using a GOT.  */
8779   if (!TARGET_USE_GOT)
8780     return GLOBAL_POINTER_REGNUM;
8781
8782   /* If there are inflexible references to $gp, we must use the
8783      standard register.  */
8784   if (mips_cfun_has_inflexible_gp_ref_p ())
8785     return GLOBAL_POINTER_REGNUM;
8786
8787   /* If there are no current references to $gp, then the only uses
8788      we can introduce later are those involved in long branches.  */
8789   if (TARGET_ABSOLUTE_JUMPS && !mips_cfun_has_flexible_gp_ref_p ())
8790     return INVALID_REGNUM;
8791
8792   /* If the global pointer is call-saved, try to use a call-clobbered
8793      alternative.  */
8794   if (TARGET_CALL_SAVED_GP && current_function_is_leaf)
8795     for (regno = GP_REG_FIRST; regno <= GP_REG_LAST; regno++)
8796       if (!df_regs_ever_live_p (regno)
8797           && call_really_used_regs[regno]
8798           && !fixed_regs[regno]
8799           && regno != PIC_FUNCTION_ADDR_REGNUM)
8800         return regno;
8801
8802   return GLOBAL_POINTER_REGNUM;
8803 }
8804
8805 /* Return true if the current function's prologue must load the global
8806    pointer value into pic_offset_table_rtx and store the same value in
8807    the function's cprestore slot (if any).
8808
8809    One problem we have to deal with is that, when emitting GOT-based
8810    position independent code, long-branch sequences will need to load
8811    the address of the branch target from the GOT.  We don't know until
8812    the very end of compilation whether (and where) the function needs
8813    long branches, so we must ensure that _any_ branch can access the
8814    global pointer in some form.  However, we do not want to pessimize
8815    the usual case in which all branches are short.
8816
8817    We handle this as follows:
8818
8819    (1) During reload, we set cfun->machine->global_pointer to
8820        INVALID_REGNUM if we _know_ that the current function
8821        doesn't need a global pointer.  This is only valid if
8822        long branches don't need the GOT.
8823
8824        Otherwise, we assume that we might need a global pointer
8825        and pick an appropriate register.
8826
8827    (2) If cfun->machine->global_pointer != INVALID_REGNUM,
8828        we ensure that the global pointer is available at every
8829        block boundary bar entry and exit.  We do this in one of two ways:
8830
8831        - If the function has a cprestore slot, we ensure that this
8832          slot is valid at every branch.  However, as explained in
8833          point (6) below, there is no guarantee that pic_offset_table_rtx
8834          itself is valid if new uses of the global pointer are introduced
8835          after the first post-epilogue split.
8836
8837          We guarantee that the cprestore slot is valid by loading it
8838          into a fake register, CPRESTORE_SLOT_REGNUM.  We then make
8839          this register live at every block boundary bar function entry
8840          and exit.  It is then invalid to move the load (and thus the
8841          preceding store) across a block boundary.
8842
8843        - If the function has no cprestore slot, we guarantee that
8844          pic_offset_table_rtx itself is valid at every branch.
8845
8846        See mips_eh_uses for the handling of the register liveness.
8847
8848    (3) During prologue and epilogue generation, we emit "ghost"
8849        placeholder instructions to manipulate the global pointer.
8850
8851    (4) During prologue generation, we set cfun->machine->must_initialize_gp_p
8852        and cfun->machine->must_restore_gp_when_clobbered_p if we already know
8853        that the function needs a global pointer.  (There is no need to set
8854        them earlier than this, and doing it as late as possible leads to
8855        fewer false positives.)
8856
8857    (5) If cfun->machine->must_initialize_gp_p is true during a
8858        split_insns pass, we split the ghost instructions into real
8859        instructions.  These split instructions can then be optimized in
8860        the usual way.  Otherwise, we keep the ghost instructions intact,
8861        and optimize for the case where they aren't needed.  We still
8862        have the option of splitting them later, if we need to introduce
8863        new uses of the global pointer.
8864
8865        For example, the scheduler ignores a ghost instruction that
8866        stores $28 to the stack, but it handles the split form of
8867        the ghost instruction as an ordinary store.
8868
8869    (6) [OldABI only.]  If cfun->machine->must_restore_gp_when_clobbered_p
8870        is true during the first post-epilogue split_insns pass, we split
8871        calls and restore_gp patterns into instructions that explicitly
8872        load pic_offset_table_rtx from the cprestore slot.  Otherwise,
8873        we split these patterns into instructions that _don't_ load from
8874        the cprestore slot.
8875
8876        If cfun->machine->must_restore_gp_when_clobbered_p is true at the
8877        time of the split, then any instructions that exist at that time
8878        can make free use of pic_offset_table_rtx.  However, if we want
8879        to introduce new uses of the global pointer after the split,
8880        we must explicitly load the value from the cprestore slot, since
8881        pic_offset_table_rtx itself might not be valid at a given point
8882        in the function.
8883
8884        The idea is that we want to be able to delete redundant
8885        loads from the cprestore slot in the usual case where no
8886        long branches are needed.
8887
8888    (7) If cfun->machine->must_initialize_gp_p is still false at the end
8889        of md_reorg, we decide whether the global pointer is needed for
8890        long branches.  If so, we set cfun->machine->must_initialize_gp_p
8891        to true and split the ghost instructions into real instructions
8892        at that stage.
8893
8894    Note that the ghost instructions must have a zero length for three reasons:
8895
8896    - Giving the length of the underlying $gp sequence might cause
8897      us to use long branches in cases where they aren't really needed.
8898
8899    - They would perturb things like alignment calculations.
8900
8901    - More importantly, the hazard detection in md_reorg relies on
8902      empty instructions having a zero length.
8903
8904    If we find a long branch and split the ghost instructions at the
8905    end of md_reorg, the split could introduce more long branches.
8906    That isn't a problem though, because we still do the split before
8907    the final shorten_branches pass.
8908
8909    This is extremely ugly, but it seems like the best compromise between
8910    correctness and efficiency.  */
8911
8912 bool
8913 mips_must_initialize_gp_p (void)
8914 {
8915   return cfun->machine->must_initialize_gp_p;
8916 }
8917
8918 /* Return true if REGNO is a register that is ordinarily call-clobbered
8919    but must nevertheless be preserved by an interrupt handler.  */
8920
8921 static bool
8922 mips_interrupt_extra_call_saved_reg_p (unsigned int regno)
8923 {
8924   if (MD_REG_P (regno))
8925     return true;
8926
8927   if (TARGET_DSP && DSP_ACC_REG_P (regno))
8928     return true;
8929
8930   if (GP_REG_P (regno) && !cfun->machine->use_shadow_register_set_p)
8931     {
8932       /* $0 is hard-wired.  */
8933       if (regno == GP_REG_FIRST)
8934         return false;
8935
8936       /* The interrupt handler can treat kernel registers as
8937          scratch registers.  */
8938       if (KERNEL_REG_P (regno))
8939         return false;
8940
8941       /* The function will return the stack pointer to its original value
8942          anyway.  */
8943       if (regno == STACK_POINTER_REGNUM)
8944         return false;
8945
8946       /* Otherwise, return true for registers that aren't ordinarily
8947          call-clobbered.  */
8948       return call_really_used_regs[regno];
8949     }
8950
8951   return false;
8952 }
8953
8954 /* Return true if the current function should treat register REGNO
8955    as call-saved.  */
8956
8957 static bool
8958 mips_cfun_call_saved_reg_p (unsigned int regno)
8959 {
8960   /* Interrupt handlers need to save extra registers.  */
8961   if (cfun->machine->interrupt_handler_p
8962       && mips_interrupt_extra_call_saved_reg_p (regno))
8963     return true;
8964
8965   /* call_insns preserve $28 unless they explicitly say otherwise,
8966      so call_really_used_regs[] treats $28 as call-saved.  However,
8967      we want the ABI property rather than the default call_insn
8968      property here.  */
8969   return (regno == GLOBAL_POINTER_REGNUM
8970           ? TARGET_CALL_SAVED_GP
8971           : !call_really_used_regs[regno]);
8972 }
8973
8974 /* Return true if the function body might clobber register REGNO.
8975    We know that REGNO is call-saved.  */
8976
8977 static bool
8978 mips_cfun_might_clobber_call_saved_reg_p (unsigned int regno)
8979 {
8980   /* Some functions should be treated as clobbering all call-saved
8981      registers.  */
8982   if (crtl->saves_all_registers)
8983     return true;
8984
8985   /* DF handles cases where a register is explicitly referenced in
8986      the rtl.  Incoming values are passed in call-clobbered registers,
8987      so we can assume that any live call-saved register is set within
8988      the function.  */
8989   if (df_regs_ever_live_p (regno))
8990     return true;
8991
8992   /* Check for registers that are clobbered by FUNCTION_PROFILER.
8993      These clobbers are not explicit in the rtl.  */
8994   if (crtl->profile && MIPS_SAVE_REG_FOR_PROFILING_P (regno))
8995     return true;
8996
8997   /* If we're using a call-saved global pointer, the function's
8998      prologue will need to set it up.  */
8999   if (cfun->machine->global_pointer == regno)
9000     return true;
9001
9002   /* The function's prologue will need to set the frame pointer if
9003      frame_pointer_needed.  */
9004   if (regno == HARD_FRAME_POINTER_REGNUM && frame_pointer_needed)
9005     return true;
9006
9007   /* If a MIPS16 function returns a value in FPRs, its epilogue
9008      will need to call an external libgcc routine.  This yet-to-be
9009      generated call_insn will clobber $31.  */
9010   if (regno == RETURN_ADDR_REGNUM && mips16_cfun_returns_in_fpr_p ())
9011     return true;
9012
9013   /* If REGNO is ordinarily call-clobbered, we must assume that any
9014      called function could modify it.  */
9015   if (cfun->machine->interrupt_handler_p
9016       && !current_function_is_leaf
9017       && mips_interrupt_extra_call_saved_reg_p (regno))
9018     return true;
9019
9020   return false;
9021 }
9022
9023 /* Return true if the current function must save register REGNO.  */
9024
9025 static bool
9026 mips_save_reg_p (unsigned int regno)
9027 {
9028   if (mips_cfun_call_saved_reg_p (regno))
9029     {
9030       if (mips_cfun_might_clobber_call_saved_reg_p (regno))
9031         return true;
9032
9033       /* Save both registers in an FPR pair if either one is used.  This is
9034          needed for the case when MIN_FPRS_PER_FMT == 1, which allows the odd
9035          register to be used without the even register.  */
9036       if (FP_REG_P (regno)
9037           && MAX_FPRS_PER_FMT == 2
9038           && mips_cfun_might_clobber_call_saved_reg_p (regno + 1))
9039         return true;
9040     }
9041
9042   /* We need to save the incoming return address if __builtin_eh_return
9043      is being used to set a different return address.  */
9044   if (regno == RETURN_ADDR_REGNUM && crtl->calls_eh_return)
9045     return true;
9046
9047   return false;
9048 }
9049
9050 /* Populate the current function's mips_frame_info structure.
9051
9052    MIPS stack frames look like:
9053
9054         +-------------------------------+
9055         |                               |
9056         |  incoming stack arguments     |
9057         |                               |
9058         +-------------------------------+
9059         |                               |
9060         |  caller-allocated save area   |
9061       A |  for register arguments       |
9062         |                               |
9063         +-------------------------------+ <-- incoming stack pointer
9064         |                               |
9065         |  callee-allocated save area   |
9066       B |  for arguments that are       |
9067         |  split between registers and  |
9068         |  the stack                    |
9069         |                               |
9070         +-------------------------------+ <-- arg_pointer_rtx
9071         |                               |
9072       C |  callee-allocated save area   |
9073         |  for register varargs         |
9074         |                               |
9075         +-------------------------------+ <-- frame_pointer_rtx
9076         |                               |       + cop0_sp_offset
9077         |  COP0 reg save area           |       + UNITS_PER_WORD
9078         |                               |
9079         +-------------------------------+ <-- frame_pointer_rtx + acc_sp_offset
9080         |                               |       + UNITS_PER_WORD
9081         |  accumulator save area        |
9082         |                               |
9083         +-------------------------------+ <-- stack_pointer_rtx + fp_sp_offset
9084         |                               |       + UNITS_PER_HWFPVALUE
9085         |  FPR save area                |
9086         |                               |
9087         +-------------------------------+ <-- stack_pointer_rtx + gp_sp_offset
9088         |                               |       + UNITS_PER_WORD
9089         |  GPR save area                |
9090         |                               |
9091         +-------------------------------+ <-- frame_pointer_rtx with
9092         |                               | \     -fstack-protector
9093         |  local variables              |  | var_size
9094         |                               | /
9095         +-------------------------------+
9096         |                               | \
9097         |  $gp save area                |  | cprestore_size
9098         |                               | /
9099       P +-------------------------------+ <-- hard_frame_pointer_rtx for
9100         |                               | \     MIPS16 code
9101         |  outgoing stack arguments     |  |
9102         |                               |  |
9103         +-------------------------------+  | args_size
9104         |                               |  |
9105         |  caller-allocated save area   |  |
9106         |  for register arguments       |  |
9107         |                               | /
9108         +-------------------------------+ <-- stack_pointer_rtx
9109                                               frame_pointer_rtx without
9110                                                 -fstack-protector
9111                                               hard_frame_pointer_rtx for
9112                                                 non-MIPS16 code.
9113
9114    At least two of A, B and C will be empty.
9115
9116    Dynamic stack allocations such as alloca insert data at point P.
9117    They decrease stack_pointer_rtx but leave frame_pointer_rtx and
9118    hard_frame_pointer_rtx unchanged.  */
9119
9120 static void
9121 mips_compute_frame_info (void)
9122 {
9123   struct mips_frame_info *frame;
9124   HOST_WIDE_INT offset, size;
9125   unsigned int regno, i;
9126
9127   /* Set this function's interrupt properties.  */
9128   if (mips_interrupt_type_p (TREE_TYPE (current_function_decl)))
9129     {
9130       if (!ISA_MIPS32R2)
9131         error ("the %<interrupt%> attribute requires a MIPS32r2 processor");
9132       else if (TARGET_HARD_FLOAT)
9133         error ("the %<interrupt%> attribute requires %<-msoft-float%>");
9134       else if (TARGET_MIPS16)
9135         error ("interrupt handlers cannot be MIPS16 functions");
9136       else
9137         {
9138           cfun->machine->interrupt_handler_p = true;
9139           cfun->machine->use_shadow_register_set_p =
9140             mips_use_shadow_register_set_p (TREE_TYPE (current_function_decl));
9141           cfun->machine->keep_interrupts_masked_p =
9142             mips_keep_interrupts_masked_p (TREE_TYPE (current_function_decl));
9143           cfun->machine->use_debug_exception_return_p =
9144             mips_use_debug_exception_return_p (TREE_TYPE
9145                                                (current_function_decl));
9146         }
9147     }
9148
9149   frame = &cfun->machine->frame;
9150   memset (frame, 0, sizeof (*frame));
9151   size = get_frame_size ();
9152
9153   cfun->machine->global_pointer = mips_global_pointer ();
9154
9155   /* The first two blocks contain the outgoing argument area and the $gp save
9156      slot.  This area isn't needed in leaf functions, but if the
9157      target-independent frame size is nonzero, we have already committed to
9158      allocating these in STARTING_FRAME_OFFSET for !FRAME_GROWS_DOWNWARD.  */
9159   if ((size == 0 || FRAME_GROWS_DOWNWARD) && current_function_is_leaf)
9160     {
9161       /* The MIPS 3.0 linker does not like functions that dynamically
9162          allocate the stack and have 0 for STACK_DYNAMIC_OFFSET, since it
9163          looks like we are trying to create a second frame pointer to the
9164          function, so allocate some stack space to make it happy.  */
9165       if (cfun->calls_alloca)
9166         frame->args_size = REG_PARM_STACK_SPACE (cfun->decl);
9167       else
9168         frame->args_size = 0;
9169       frame->cprestore_size = 0;
9170     }
9171   else
9172     {
9173       frame->args_size = crtl->outgoing_args_size;
9174       frame->cprestore_size = MIPS_GP_SAVE_AREA_SIZE;
9175     }
9176   offset = frame->args_size + frame->cprestore_size;
9177
9178   /* Move above the local variables.  */
9179   frame->var_size = MIPS_STACK_ALIGN (size);
9180   offset += frame->var_size;
9181
9182   /* Find out which GPRs we need to save.  */
9183   for (regno = GP_REG_FIRST; regno <= GP_REG_LAST; regno++)
9184     if (mips_save_reg_p (regno))
9185       {
9186         frame->num_gp++;
9187         frame->mask |= 1 << (regno - GP_REG_FIRST);
9188       }
9189
9190   /* If this function calls eh_return, we must also save and restore the
9191      EH data registers.  */
9192   if (crtl->calls_eh_return)
9193     for (i = 0; EH_RETURN_DATA_REGNO (i) != INVALID_REGNUM; i++)
9194       {
9195         frame->num_gp++;
9196         frame->mask |= 1 << (EH_RETURN_DATA_REGNO (i) - GP_REG_FIRST);
9197       }
9198
9199   /* The MIPS16e SAVE and RESTORE instructions have two ranges of registers:
9200      $a3-$a0 and $s2-$s8.  If we save one register in the range, we must
9201      save all later registers too.  */
9202   if (GENERATE_MIPS16E_SAVE_RESTORE)
9203     {
9204       mips16e_mask_registers (&frame->mask, mips16e_s2_s8_regs,
9205                               ARRAY_SIZE (mips16e_s2_s8_regs), &frame->num_gp);
9206       mips16e_mask_registers (&frame->mask, mips16e_a0_a3_regs,
9207                               ARRAY_SIZE (mips16e_a0_a3_regs), &frame->num_gp);
9208     }
9209
9210   /* Move above the GPR save area.  */
9211   if (frame->num_gp > 0)
9212     {
9213       offset += MIPS_STACK_ALIGN (frame->num_gp * UNITS_PER_WORD);
9214       frame->gp_sp_offset = offset - UNITS_PER_WORD;
9215     }
9216
9217   /* Find out which FPRs we need to save.  This loop must iterate over
9218      the same space as its companion in mips_for_each_saved_gpr_and_fpr.  */
9219   if (TARGET_HARD_FLOAT)
9220     for (regno = FP_REG_FIRST; regno <= FP_REG_LAST; regno += MAX_FPRS_PER_FMT)
9221       if (mips_save_reg_p (regno))
9222         {
9223           frame->num_fp += MAX_FPRS_PER_FMT;
9224           frame->fmask |= ~(~0 << MAX_FPRS_PER_FMT) << (regno - FP_REG_FIRST);
9225         }
9226
9227   /* Move above the FPR save area.  */
9228   if (frame->num_fp > 0)
9229     {
9230       offset += MIPS_STACK_ALIGN (frame->num_fp * UNITS_PER_FPREG);
9231       frame->fp_sp_offset = offset - UNITS_PER_HWFPVALUE;
9232     }
9233
9234   /* Add in space for the interrupt context information.  */
9235   if (cfun->machine->interrupt_handler_p)
9236     {
9237       /* Check HI/LO.  */
9238       if (mips_save_reg_p (LO_REGNUM) || mips_save_reg_p (HI_REGNUM))
9239         {
9240           frame->num_acc++;
9241           frame->acc_mask |= (1 << 0);
9242         }
9243
9244       /* Check accumulators 1, 2, 3.  */
9245       for (i = DSP_ACC_REG_FIRST; i <= DSP_ACC_REG_LAST; i += 2)
9246         if (mips_save_reg_p (i) || mips_save_reg_p (i + 1))
9247           {
9248             frame->num_acc++;
9249             frame->acc_mask |= 1 << (((i - DSP_ACC_REG_FIRST) / 2) + 1);
9250           }
9251
9252       /* All interrupt context functions need space to preserve STATUS.  */
9253       frame->num_cop0_regs++;
9254
9255       /* If we don't keep interrupts masked, we need to save EPC.  */
9256       if (!cfun->machine->keep_interrupts_masked_p)
9257         frame->num_cop0_regs++;
9258     }
9259
9260   /* Move above the accumulator save area.  */
9261   if (frame->num_acc > 0)
9262     {
9263       /* Each accumulator needs 2 words.  */
9264       offset += frame->num_acc * 2 * UNITS_PER_WORD;
9265       frame->acc_sp_offset = offset - UNITS_PER_WORD;
9266     }
9267
9268   /* Move above the COP0 register save area.  */
9269   if (frame->num_cop0_regs > 0)
9270     {
9271       offset += frame->num_cop0_regs * UNITS_PER_WORD;
9272       frame->cop0_sp_offset = offset - UNITS_PER_WORD;
9273     }
9274
9275   /* Move above the callee-allocated varargs save area.  */
9276   offset += MIPS_STACK_ALIGN (cfun->machine->varargs_size);
9277   frame->arg_pointer_offset = offset;
9278
9279   /* Move above the callee-allocated area for pretend stack arguments.  */
9280   offset += crtl->args.pretend_args_size;
9281   frame->total_size = offset;
9282
9283   /* Work out the offsets of the save areas from the top of the frame.  */
9284   if (frame->gp_sp_offset > 0)
9285     frame->gp_save_offset = frame->gp_sp_offset - offset;
9286   if (frame->fp_sp_offset > 0)
9287     frame->fp_save_offset = frame->fp_sp_offset - offset;
9288   if (frame->acc_sp_offset > 0)
9289     frame->acc_save_offset = frame->acc_sp_offset - offset;
9290   if (frame->num_cop0_regs > 0)
9291     frame->cop0_save_offset = frame->cop0_sp_offset - offset;
9292
9293   /* MIPS16 code offsets the frame pointer by the size of the outgoing
9294      arguments.  This tends to increase the chances of using unextended
9295      instructions for local variables and incoming arguments.  */
9296   if (TARGET_MIPS16)
9297     frame->hard_frame_pointer_offset = frame->args_size;
9298 }
9299
9300 /* Return the style of GP load sequence that is being used for the
9301    current function.  */
9302
9303 enum mips_loadgp_style
9304 mips_current_loadgp_style (void)
9305 {
9306   if (!TARGET_USE_GOT || cfun->machine->global_pointer == INVALID_REGNUM)
9307     return LOADGP_NONE;
9308
9309   if (TARGET_RTP_PIC)
9310     return LOADGP_RTP;
9311
9312   if (TARGET_ABSOLUTE_ABICALLS)
9313     return LOADGP_ABSOLUTE;
9314
9315   return TARGET_NEWABI ? LOADGP_NEWABI : LOADGP_OLDABI;
9316 }
9317
9318 /* Implement TARGET_FRAME_POINTER_REQUIRED.  */
9319
9320 static bool
9321 mips_frame_pointer_required (void)
9322 {
9323   /* If the function contains dynamic stack allocations, we need to
9324      use the frame pointer to access the static parts of the frame.  */
9325   if (cfun->calls_alloca)
9326     return true;
9327
9328   /* In MIPS16 mode, we need a frame pointer for a large frame; otherwise,
9329      reload may be unable to compute the address of a local variable,
9330      since there is no way to add a large constant to the stack pointer
9331      without using a second temporary register.  */
9332   if (TARGET_MIPS16)
9333     {
9334       mips_compute_frame_info ();
9335       if (!SMALL_OPERAND (cfun->machine->frame.total_size))
9336         return true;
9337     }
9338
9339   return false;
9340 }
9341
9342 /* Make sure that we're not trying to eliminate to the wrong hard frame
9343    pointer.  */
9344
9345 static bool
9346 mips_can_eliminate (const int from ATTRIBUTE_UNUSED, const int to)
9347 {
9348   return (to == HARD_FRAME_POINTER_REGNUM || to == STACK_POINTER_REGNUM);
9349 }
9350
9351 /* Implement INITIAL_ELIMINATION_OFFSET.  FROM is either the frame pointer
9352    or argument pointer.  TO is either the stack pointer or hard frame
9353    pointer.  */
9354
9355 HOST_WIDE_INT
9356 mips_initial_elimination_offset (int from, int to)
9357 {
9358   HOST_WIDE_INT offset;
9359
9360   mips_compute_frame_info ();
9361
9362   /* Set OFFSET to the offset from the end-of-prologue stack pointer.  */
9363   switch (from)
9364     {
9365     case FRAME_POINTER_REGNUM:
9366       if (FRAME_GROWS_DOWNWARD)
9367         offset = (cfun->machine->frame.args_size
9368                   + cfun->machine->frame.cprestore_size
9369                   + cfun->machine->frame.var_size);
9370       else
9371         offset = 0;
9372       break;
9373
9374     case ARG_POINTER_REGNUM:
9375       offset = cfun->machine->frame.arg_pointer_offset;
9376       break;
9377
9378     default:
9379       gcc_unreachable ();
9380     }
9381
9382   if (to == HARD_FRAME_POINTER_REGNUM)
9383     offset -= cfun->machine->frame.hard_frame_pointer_offset;
9384
9385   return offset;
9386 }
9387 \f
9388 /* Implement TARGET_EXTRA_LIVE_ON_ENTRY.  */
9389
9390 static void
9391 mips_extra_live_on_entry (bitmap regs)
9392 {
9393   if (TARGET_USE_GOT)
9394     {
9395       /* PIC_FUNCTION_ADDR_REGNUM is live if we need it to set up
9396          the global pointer.   */
9397       if (!TARGET_ABSOLUTE_ABICALLS)
9398         bitmap_set_bit (regs, PIC_FUNCTION_ADDR_REGNUM);
9399
9400       /* The prologue may set MIPS16_PIC_TEMP_REGNUM to the value of
9401          the global pointer.  */
9402       if (TARGET_MIPS16)
9403         bitmap_set_bit (regs, MIPS16_PIC_TEMP_REGNUM);
9404
9405       /* See the comment above load_call<mode> for details.  */
9406       bitmap_set_bit (regs, GOT_VERSION_REGNUM);
9407     }
9408 }
9409
9410 /* Implement RETURN_ADDR_RTX.  We do not support moving back to a
9411    previous frame.  */
9412
9413 rtx
9414 mips_return_addr (int count, rtx frame ATTRIBUTE_UNUSED)
9415 {
9416   if (count != 0)
9417     return const0_rtx;
9418
9419   return get_hard_reg_initial_val (Pmode, RETURN_ADDR_REGNUM);
9420 }
9421
9422 /* Emit code to change the current function's return address to
9423    ADDRESS.  SCRATCH is available as a scratch register, if needed.
9424    ADDRESS and SCRATCH are both word-mode GPRs.  */
9425
9426 void
9427 mips_set_return_address (rtx address, rtx scratch)
9428 {
9429   rtx slot_address;
9430
9431   gcc_assert (BITSET_P (cfun->machine->frame.mask, RETURN_ADDR_REGNUM));
9432   slot_address = mips_add_offset (scratch, stack_pointer_rtx,
9433                                   cfun->machine->frame.gp_sp_offset);
9434   mips_emit_move (gen_frame_mem (GET_MODE (address), slot_address), address);
9435 }
9436
9437 /* Return true if the current function has a cprestore slot.  */
9438
9439 bool
9440 mips_cfun_has_cprestore_slot_p (void)
9441 {
9442   return (cfun->machine->global_pointer != INVALID_REGNUM
9443           && cfun->machine->frame.cprestore_size > 0);
9444 }
9445
9446 /* Fill *BASE and *OFFSET such that *BASE + *OFFSET refers to the
9447    cprestore slot.  LOAD_P is true if the caller wants to load from
9448    the cprestore slot; it is false if the caller wants to store to
9449    the slot.  */
9450
9451 static void
9452 mips_get_cprestore_base_and_offset (rtx *base, HOST_WIDE_INT *offset,
9453                                     bool load_p)
9454 {
9455   const struct mips_frame_info *frame;
9456
9457   frame = &cfun->machine->frame;
9458   /* .cprestore always uses the stack pointer instead of the frame pointer.
9459      We have a free choice for direct stores for non-MIPS16 functions,
9460      and for MIPS16 functions whose cprestore slot is in range of the
9461      stack pointer.  Using the stack pointer would sometimes give more
9462      (early) scheduling freedom, but using the frame pointer would
9463      sometimes give more (late) scheduling freedom.  It's hard to
9464      predict which applies to a given function, so let's keep things
9465      simple.
9466
9467      Loads must always use the frame pointer in functions that call
9468      alloca, and there's little benefit to using the stack pointer
9469      otherwise.  */
9470   if (frame_pointer_needed && !(TARGET_CPRESTORE_DIRECTIVE && !load_p))
9471     {
9472       *base = hard_frame_pointer_rtx;
9473       *offset = frame->args_size - frame->hard_frame_pointer_offset;
9474     }
9475   else
9476     {
9477       *base = stack_pointer_rtx;
9478       *offset = frame->args_size;
9479     }
9480 }
9481
9482 /* Return true if X is the load or store address of the cprestore slot;
9483    LOAD_P says which.  */
9484
9485 bool
9486 mips_cprestore_address_p (rtx x, bool load_p)
9487 {
9488   rtx given_base, required_base;
9489   HOST_WIDE_INT given_offset, required_offset;
9490
9491   mips_split_plus (x, &given_base, &given_offset);
9492   mips_get_cprestore_base_and_offset (&required_base, &required_offset, load_p);
9493   return given_base == required_base && given_offset == required_offset;
9494 }
9495
9496 /* Return a MEM rtx for the cprestore slot.  LOAD_P is true if we are
9497    going to load from it, false if we are going to store to it.
9498    Use TEMP as a temporary register if need be.  */
9499
9500 static rtx
9501 mips_cprestore_slot (rtx temp, bool load_p)
9502 {
9503   rtx base;
9504   HOST_WIDE_INT offset;
9505
9506   mips_get_cprestore_base_and_offset (&base, &offset, load_p);
9507   return gen_frame_mem (Pmode, mips_add_offset (temp, base, offset));
9508 }
9509
9510 /* Emit instructions to save global pointer value GP into cprestore
9511    slot MEM.  OFFSET is the offset that MEM applies to the base register.
9512
9513    MEM may not be a legitimate address.  If it isn't, TEMP is a
9514    temporary register that can be used, otherwise it is a SCRATCH.  */
9515
9516 void
9517 mips_save_gp_to_cprestore_slot (rtx mem, rtx offset, rtx gp, rtx temp)
9518 {
9519   if (TARGET_CPRESTORE_DIRECTIVE)
9520     {
9521       gcc_assert (gp == pic_offset_table_rtx);
9522       emit_insn (gen_cprestore (mem, offset));
9523     }
9524   else
9525     mips_emit_move (mips_cprestore_slot (temp, false), gp);
9526 }
9527
9528 /* Restore $gp from its save slot, using TEMP as a temporary base register
9529    if need be.  This function is for o32 and o64 abicalls only.
9530
9531    See mips_must_initialize_gp_p for details about how we manage the
9532    global pointer.  */
9533
9534 void
9535 mips_restore_gp_from_cprestore_slot (rtx temp)
9536 {
9537   gcc_assert (TARGET_ABICALLS && TARGET_OLDABI && epilogue_completed);
9538
9539   if (!cfun->machine->must_restore_gp_when_clobbered_p)
9540     {
9541       emit_note (NOTE_INSN_DELETED);
9542       return;
9543     }
9544
9545   if (TARGET_MIPS16)
9546     {
9547       mips_emit_move (temp, mips_cprestore_slot (temp, true));
9548       mips_emit_move (pic_offset_table_rtx, temp);
9549     }
9550   else
9551     mips_emit_move (pic_offset_table_rtx, mips_cprestore_slot (temp, true));
9552   if (!TARGET_EXPLICIT_RELOCS)
9553     emit_insn (gen_blockage ());
9554 }
9555 \f
9556 /* A function to save or store a register.  The first argument is the
9557    register and the second is the stack slot.  */
9558 typedef void (*mips_save_restore_fn) (rtx, rtx);
9559
9560 /* Use FN to save or restore register REGNO.  MODE is the register's
9561    mode and OFFSET is the offset of its save slot from the current
9562    stack pointer.  */
9563
9564 static void
9565 mips_save_restore_reg (enum machine_mode mode, int regno,
9566                        HOST_WIDE_INT offset, mips_save_restore_fn fn)
9567 {
9568   rtx mem;
9569
9570   mem = gen_frame_mem (mode, plus_constant (stack_pointer_rtx, offset));
9571   fn (gen_rtx_REG (mode, regno), mem);
9572 }
9573
9574 /* Call FN for each accumlator that is saved by the current function.
9575    SP_OFFSET is the offset of the current stack pointer from the start
9576    of the frame.  */
9577
9578 static void
9579 mips_for_each_saved_acc (HOST_WIDE_INT sp_offset, mips_save_restore_fn fn)
9580 {
9581   HOST_WIDE_INT offset;
9582   int regno;
9583
9584   offset = cfun->machine->frame.acc_sp_offset - sp_offset;
9585   if (BITSET_P (cfun->machine->frame.acc_mask, 0))
9586     {
9587       mips_save_restore_reg (word_mode, LO_REGNUM, offset, fn);
9588       offset -= UNITS_PER_WORD;
9589       mips_save_restore_reg (word_mode, HI_REGNUM, offset, fn);
9590       offset -= UNITS_PER_WORD;
9591     }
9592
9593   for (regno = DSP_ACC_REG_FIRST; regno <= DSP_ACC_REG_LAST; regno++)
9594     if (BITSET_P (cfun->machine->frame.acc_mask,
9595                   ((regno - DSP_ACC_REG_FIRST) / 2) + 1))
9596       {
9597         mips_save_restore_reg (word_mode, regno, offset, fn);
9598         offset -= UNITS_PER_WORD;
9599       }
9600 }
9601
9602 /* Call FN for each register that is saved by the current function.
9603    SP_OFFSET is the offset of the current stack pointer from the start
9604    of the frame.  */
9605
9606 static void
9607 mips_for_each_saved_gpr_and_fpr (HOST_WIDE_INT sp_offset,
9608                                  mips_save_restore_fn fn)
9609 {
9610   enum machine_mode fpr_mode;
9611   HOST_WIDE_INT offset;
9612   int regno;
9613
9614   /* Save registers starting from high to low.  The debuggers prefer at least
9615      the return register be stored at func+4, and also it allows us not to
9616      need a nop in the epilogue if at least one register is reloaded in
9617      addition to return address.  */
9618   offset = cfun->machine->frame.gp_sp_offset - sp_offset;
9619   for (regno = GP_REG_LAST; regno >= GP_REG_FIRST; regno--)
9620     if (BITSET_P (cfun->machine->frame.mask, regno - GP_REG_FIRST))
9621       {
9622         mips_save_restore_reg (word_mode, regno, offset, fn);
9623         offset -= UNITS_PER_WORD;
9624       }
9625
9626   /* This loop must iterate over the same space as its companion in
9627      mips_compute_frame_info.  */
9628   offset = cfun->machine->frame.fp_sp_offset - sp_offset;
9629   fpr_mode = (TARGET_SINGLE_FLOAT ? SFmode : DFmode);
9630   for (regno = FP_REG_LAST - MAX_FPRS_PER_FMT + 1;
9631        regno >= FP_REG_FIRST;
9632        regno -= MAX_FPRS_PER_FMT)
9633     if (BITSET_P (cfun->machine->frame.fmask, regno - FP_REG_FIRST))
9634       {
9635         mips_save_restore_reg (fpr_mode, regno, offset, fn);
9636         offset -= GET_MODE_SIZE (fpr_mode);
9637       }
9638 }
9639
9640 /* Return true if a move between register REGNO and its save slot (MEM)
9641    can be done in a single move.  LOAD_P is true if we are loading
9642    from the slot, false if we are storing to it.  */
9643
9644 static bool
9645 mips_direct_save_slot_move_p (unsigned int regno, rtx mem, bool load_p)
9646 {
9647   /* There is a specific MIPS16 instruction for saving $31 to the stack.  */
9648   if (TARGET_MIPS16 && !load_p && regno == RETURN_ADDR_REGNUM)
9649     return false;
9650
9651   return mips_secondary_reload_class (REGNO_REG_CLASS (regno),
9652                                       GET_MODE (mem), mem, load_p) == NO_REGS;
9653 }
9654
9655 /* Emit a move from SRC to DEST, given that one of them is a register
9656    save slot and that the other is a register.  TEMP is a temporary
9657    GPR of the same mode that is available if need be.  */
9658
9659 void
9660 mips_emit_save_slot_move (rtx dest, rtx src, rtx temp)
9661 {
9662   unsigned int regno;
9663   rtx mem;
9664
9665   if (REG_P (src))
9666     {
9667       regno = REGNO (src);
9668       mem = dest;
9669     }
9670   else
9671     {
9672       regno = REGNO (dest);
9673       mem = src;
9674     }
9675
9676   if (regno == cfun->machine->global_pointer && !mips_must_initialize_gp_p ())
9677     {
9678       /* We don't yet know whether we'll need this instruction or not.
9679          Postpone the decision by emitting a ghost move.  This move
9680          is specifically not frame-related; only the split version is.  */
9681       if (TARGET_64BIT)
9682         emit_insn (gen_move_gpdi (dest, src));
9683       else
9684         emit_insn (gen_move_gpsi (dest, src));
9685       return;
9686     }
9687
9688   if (regno == HI_REGNUM)
9689     {
9690       if (REG_P (dest))
9691         {
9692           mips_emit_move (temp, src);
9693           if (TARGET_64BIT)
9694             emit_insn (gen_mthisi_di (gen_rtx_REG (TImode, MD_REG_FIRST),
9695                                       temp, gen_rtx_REG (DImode, LO_REGNUM)));
9696           else
9697             emit_insn (gen_mthisi_di (gen_rtx_REG (DImode, MD_REG_FIRST),
9698                                       temp, gen_rtx_REG (SImode, LO_REGNUM)));
9699         }
9700       else
9701         {
9702           if (TARGET_64BIT)
9703             emit_insn (gen_mfhidi_ti (temp,
9704                                       gen_rtx_REG (TImode, MD_REG_FIRST)));
9705           else
9706             emit_insn (gen_mfhisi_di (temp,
9707                                       gen_rtx_REG (DImode, MD_REG_FIRST)));
9708           mips_emit_move (dest, temp);
9709         }
9710     }
9711   else if (mips_direct_save_slot_move_p (regno, mem, mem == src))
9712     mips_emit_move (dest, src);
9713   else
9714     {
9715       gcc_assert (!reg_overlap_mentioned_p (dest, temp));
9716       mips_emit_move (temp, src);
9717       mips_emit_move (dest, temp);
9718     }
9719   if (MEM_P (dest))
9720     mips_set_frame_expr (mips_frame_set (dest, src));
9721 }
9722 \f
9723 /* If we're generating n32 or n64 abicalls, and the current function
9724    does not use $28 as its global pointer, emit a cplocal directive.
9725    Use pic_offset_table_rtx as the argument to the directive.  */
9726
9727 static void
9728 mips_output_cplocal (void)
9729 {
9730   if (!TARGET_EXPLICIT_RELOCS
9731       && mips_must_initialize_gp_p ()
9732       && cfun->machine->global_pointer != GLOBAL_POINTER_REGNUM)
9733     output_asm_insn (".cplocal %+", 0);
9734 }
9735
9736 /* Implement TARGET_OUTPUT_FUNCTION_PROLOGUE.  */
9737
9738 static void
9739 mips_output_function_prologue (FILE *file, HOST_WIDE_INT size ATTRIBUTE_UNUSED)
9740 {
9741   const char *fnname;
9742
9743 #ifdef SDB_DEBUGGING_INFO
9744   if (debug_info_level != DINFO_LEVEL_TERSE && write_symbols == SDB_DEBUG)
9745     SDB_OUTPUT_SOURCE_LINE (file, DECL_SOURCE_LINE (current_function_decl));
9746 #endif
9747
9748   /* In MIPS16 mode, we may need to generate a non-MIPS16 stub to handle
9749      floating-point arguments.  */
9750   if (TARGET_MIPS16
9751       && TARGET_HARD_FLOAT_ABI
9752       && crtl->args.info.fp_code != 0)
9753     mips16_build_function_stub ();
9754
9755   /* Get the function name the same way that toplev.c does before calling
9756      assemble_start_function.  This is needed so that the name used here
9757      exactly matches the name used in ASM_DECLARE_FUNCTION_NAME.  */
9758   fnname = XSTR (XEXP (DECL_RTL (current_function_decl), 0), 0);
9759   mips_start_function_definition (fnname, TARGET_MIPS16);
9760
9761   /* Stop mips_file_end from treating this function as external.  */
9762   if (TARGET_IRIX && mips_abi == ABI_32)
9763     TREE_ASM_WRITTEN (DECL_NAME (cfun->decl)) = 1;
9764
9765   /* Output MIPS-specific frame information.  */
9766   if (!flag_inhibit_size_directive)
9767     {
9768       const struct mips_frame_info *frame;
9769
9770       frame = &cfun->machine->frame;
9771
9772       /* .frame FRAMEREG, FRAMESIZE, RETREG.  */
9773       fprintf (file,
9774                "\t.frame\t%s," HOST_WIDE_INT_PRINT_DEC ",%s\t\t"
9775                "# vars= " HOST_WIDE_INT_PRINT_DEC
9776                ", regs= %d/%d"
9777                ", args= " HOST_WIDE_INT_PRINT_DEC
9778                ", gp= " HOST_WIDE_INT_PRINT_DEC "\n",
9779                reg_names[frame_pointer_needed
9780                          ? HARD_FRAME_POINTER_REGNUM
9781                          : STACK_POINTER_REGNUM],
9782                (frame_pointer_needed
9783                 ? frame->total_size - frame->hard_frame_pointer_offset
9784                 : frame->total_size),
9785                reg_names[RETURN_ADDR_REGNUM],
9786                frame->var_size,
9787                frame->num_gp, frame->num_fp,
9788                frame->args_size,
9789                frame->cprestore_size);
9790
9791       /* .mask MASK, OFFSET.  */
9792       fprintf (file, "\t.mask\t0x%08x," HOST_WIDE_INT_PRINT_DEC "\n",
9793                frame->mask, frame->gp_save_offset);
9794
9795       /* .fmask MASK, OFFSET.  */
9796       fprintf (file, "\t.fmask\t0x%08x," HOST_WIDE_INT_PRINT_DEC "\n",
9797                frame->fmask, frame->fp_save_offset);
9798     }
9799
9800   /* Handle the initialization of $gp for SVR4 PIC, if applicable.
9801      Also emit the ".set noreorder; .set nomacro" sequence for functions
9802      that need it.  */
9803   if (mips_must_initialize_gp_p ()
9804       && mips_current_loadgp_style () == LOADGP_OLDABI)
9805     {
9806       if (TARGET_MIPS16)
9807         {
9808           /* This is a fixed-form sequence.  The position of the
9809              first two instructions is important because of the
9810              way _gp_disp is defined.  */
9811           output_asm_insn ("li\t$2,%%hi(_gp_disp)", 0);
9812           output_asm_insn ("addiu\t$3,$pc,%%lo(_gp_disp)", 0);
9813           output_asm_insn ("sll\t$2,16", 0);
9814           output_asm_insn ("addu\t$2,$3", 0);
9815         }
9816       else
9817         {
9818           /* .cpload must be in a .set noreorder but not a
9819              .set nomacro block.  */
9820           mips_push_asm_switch (&mips_noreorder);
9821           output_asm_insn (".cpload\t%^", 0);
9822           if (!cfun->machine->all_noreorder_p)
9823             mips_pop_asm_switch (&mips_noreorder);
9824           else
9825             mips_push_asm_switch (&mips_nomacro);
9826         }
9827     }
9828   else if (cfun->machine->all_noreorder_p)
9829     {
9830       mips_push_asm_switch (&mips_noreorder);
9831       mips_push_asm_switch (&mips_nomacro);
9832     }
9833
9834   /* Tell the assembler which register we're using as the global
9835      pointer.  This is needed for thunks, since they can use either
9836      explicit relocs or assembler macros.  */
9837   mips_output_cplocal ();
9838 }
9839
9840 /* Implement TARGET_OUTPUT_FUNCTION_EPILOGUE.  */
9841
9842 static void
9843 mips_output_function_epilogue (FILE *file ATTRIBUTE_UNUSED,
9844                                HOST_WIDE_INT size ATTRIBUTE_UNUSED)
9845 {
9846   const char *fnname;
9847
9848   /* Reinstate the normal $gp.  */
9849   SET_REGNO (pic_offset_table_rtx, GLOBAL_POINTER_REGNUM);
9850   mips_output_cplocal ();
9851
9852   if (cfun->machine->all_noreorder_p)
9853     {
9854       mips_pop_asm_switch (&mips_nomacro);
9855       mips_pop_asm_switch (&mips_noreorder);
9856     }
9857
9858   /* Get the function name the same way that toplev.c does before calling
9859      assemble_start_function.  This is needed so that the name used here
9860      exactly matches the name used in ASM_DECLARE_FUNCTION_NAME.  */
9861   fnname = XSTR (XEXP (DECL_RTL (current_function_decl), 0), 0);
9862   mips_end_function_definition (fnname);
9863 }
9864 \f
9865 /* Save register REG to MEM.  Make the instruction frame-related.  */
9866
9867 static void
9868 mips_save_reg (rtx reg, rtx mem)
9869 {
9870   if (GET_MODE (reg) == DFmode && !TARGET_FLOAT64)
9871     {
9872       rtx x1, x2;
9873
9874       if (mips_split_64bit_move_p (mem, reg))
9875         mips_split_doubleword_move (mem, reg);
9876       else
9877         mips_emit_move (mem, reg);
9878
9879       x1 = mips_frame_set (mips_subword (mem, false),
9880                            mips_subword (reg, false));
9881       x2 = mips_frame_set (mips_subword (mem, true),
9882                            mips_subword (reg, true));
9883       mips_set_frame_expr (gen_rtx_PARALLEL (VOIDmode, gen_rtvec (2, x1, x2)));
9884     }
9885   else
9886     mips_emit_save_slot_move (mem, reg, MIPS_PROLOGUE_TEMP (GET_MODE (reg)));
9887 }
9888
9889 /* The __gnu_local_gp symbol.  */
9890
9891 static GTY(()) rtx mips_gnu_local_gp;
9892
9893 /* If we're generating n32 or n64 abicalls, emit instructions
9894    to set up the global pointer.  */
9895
9896 static void
9897 mips_emit_loadgp (void)
9898 {
9899   rtx addr, offset, incoming_address, base, index, pic_reg;
9900
9901   pic_reg = TARGET_MIPS16 ? MIPS16_PIC_TEMP : pic_offset_table_rtx;
9902   switch (mips_current_loadgp_style ())
9903     {
9904     case LOADGP_ABSOLUTE:
9905       if (mips_gnu_local_gp == NULL)
9906         {
9907           mips_gnu_local_gp = gen_rtx_SYMBOL_REF (Pmode, "__gnu_local_gp");
9908           SYMBOL_REF_FLAGS (mips_gnu_local_gp) |= SYMBOL_FLAG_LOCAL;
9909         }
9910       emit_insn (Pmode == SImode
9911                  ? gen_loadgp_absolute_si (pic_reg, mips_gnu_local_gp)
9912                  : gen_loadgp_absolute_di (pic_reg, mips_gnu_local_gp));
9913       break;
9914
9915     case LOADGP_OLDABI:
9916       /* Added by mips_output_function_prologue.  */
9917       break;
9918
9919     case LOADGP_NEWABI:
9920       addr = XEXP (DECL_RTL (current_function_decl), 0);
9921       offset = mips_unspec_address (addr, SYMBOL_GOTOFF_LOADGP);
9922       incoming_address = gen_rtx_REG (Pmode, PIC_FUNCTION_ADDR_REGNUM);
9923       emit_insn (Pmode == SImode
9924                  ? gen_loadgp_newabi_si (pic_reg, offset, incoming_address)
9925                  : gen_loadgp_newabi_di (pic_reg, offset, incoming_address));
9926       break;
9927
9928     case LOADGP_RTP:
9929       base = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (VXWORKS_GOTT_BASE));
9930       index = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (VXWORKS_GOTT_INDEX));
9931       emit_insn (Pmode == SImode
9932                  ? gen_loadgp_rtp_si (pic_reg, base, index)
9933                  : gen_loadgp_rtp_di (pic_reg, base, index));
9934       break;
9935
9936     default:
9937       return;
9938     }
9939
9940   if (TARGET_MIPS16)
9941     emit_insn (gen_copygp_mips16 (pic_offset_table_rtx, pic_reg));
9942
9943   /* Emit a blockage if there are implicit uses of the GP register.
9944      This includes profiled functions, because FUNCTION_PROFILE uses
9945      a jal macro.  */
9946   if (!TARGET_EXPLICIT_RELOCS || crtl->profile)
9947     emit_insn (gen_loadgp_blockage ());
9948 }
9949
9950 /* A for_each_rtx callback.  Stop the search if *X is a kernel register.  */
9951
9952 static int
9953 mips_kernel_reg_p (rtx *x, void *data ATTRIBUTE_UNUSED)
9954 {
9955   return REG_P (*x) && KERNEL_REG_P (REGNO (*x));
9956 }
9957
9958 /* Expand the "prologue" pattern.  */
9959
9960 void
9961 mips_expand_prologue (void)
9962 {
9963   const struct mips_frame_info *frame;
9964   HOST_WIDE_INT size;
9965   unsigned int nargs;
9966   rtx insn;
9967
9968   if (cfun->machine->global_pointer != INVALID_REGNUM)
9969     {
9970       /* Check whether an insn uses pic_offset_table_rtx, either explicitly
9971          or implicitly.  If so, we can commit to using a global pointer
9972          straight away, otherwise we need to defer the decision.  */
9973       if (mips_cfun_has_inflexible_gp_ref_p ()
9974           || mips_cfun_has_flexible_gp_ref_p ())
9975         {
9976           cfun->machine->must_initialize_gp_p = true;
9977           cfun->machine->must_restore_gp_when_clobbered_p = true;
9978         }
9979
9980       SET_REGNO (pic_offset_table_rtx, cfun->machine->global_pointer);
9981     }
9982
9983   frame = &cfun->machine->frame;
9984   size = frame->total_size;
9985
9986   /* Save the registers.  Allocate up to MIPS_MAX_FIRST_STACK_STEP
9987      bytes beforehand; this is enough to cover the register save area
9988      without going out of range.  */
9989   if (((frame->mask | frame->fmask | frame->acc_mask) != 0)
9990       || frame->num_cop0_regs > 0)
9991     {
9992       HOST_WIDE_INT step1;
9993
9994       step1 = MIN (size, MIPS_MAX_FIRST_STACK_STEP);
9995       if (GENERATE_MIPS16E_SAVE_RESTORE)
9996         {
9997           HOST_WIDE_INT offset;
9998           unsigned int mask, regno;
9999
10000           /* Try to merge argument stores into the save instruction.  */
10001           nargs = mips16e_collect_argument_saves ();
10002
10003           /* Build the save instruction.  */
10004           mask = frame->mask;
10005           insn = mips16e_build_save_restore (false, &mask, &offset,
10006                                              nargs, step1);
10007           RTX_FRAME_RELATED_P (emit_insn (insn)) = 1;
10008           size -= step1;
10009
10010           /* Check if we need to save other registers.  */
10011           for (regno = GP_REG_FIRST; regno < GP_REG_LAST; regno++)
10012             if (BITSET_P (mask, regno - GP_REG_FIRST))
10013               {
10014                 offset -= UNITS_PER_WORD;
10015                 mips_save_restore_reg (word_mode, regno,
10016                                        offset, mips_save_reg);
10017               }
10018         }
10019       else
10020         {
10021           if (cfun->machine->interrupt_handler_p)
10022             {
10023               HOST_WIDE_INT offset;
10024               rtx mem;
10025
10026               /* If this interrupt is using a shadow register set, we need to
10027                  get the stack pointer from the previous register set.  */
10028               if (cfun->machine->use_shadow_register_set_p)
10029                 emit_insn (gen_mips_rdpgpr (stack_pointer_rtx,
10030                                             stack_pointer_rtx));
10031
10032               if (!cfun->machine->keep_interrupts_masked_p)
10033                 {
10034                   /* Move from COP0 Cause to K0.  */
10035                   emit_insn (gen_cop0_move (gen_rtx_REG (SImode, K0_REG_NUM),
10036                                             gen_rtx_REG (SImode,
10037                                                          COP0_CAUSE_REG_NUM)));
10038                   /* Move from COP0 EPC to K1.  */
10039                   emit_insn (gen_cop0_move (gen_rtx_REG (SImode, K1_REG_NUM),
10040                                             gen_rtx_REG (SImode,
10041                                                          COP0_EPC_REG_NUM)));
10042                 }
10043
10044               /* Allocate the first part of the frame.  */
10045               insn = gen_add3_insn (stack_pointer_rtx, stack_pointer_rtx,
10046                                     GEN_INT (-step1));
10047               RTX_FRAME_RELATED_P (emit_insn (insn)) = 1;
10048               size -= step1;
10049
10050               /* Start at the uppermost location for saving.  */
10051               offset = frame->cop0_sp_offset - size;
10052               if (!cfun->machine->keep_interrupts_masked_p)
10053                 {
10054                   /* Push EPC into its stack slot.  */
10055                   mem = gen_frame_mem (word_mode,
10056                                        plus_constant (stack_pointer_rtx,
10057                                                       offset));
10058                   mips_emit_move (mem, gen_rtx_REG (word_mode, K1_REG_NUM));
10059                   offset -= UNITS_PER_WORD;
10060                 }
10061
10062               /* Move from COP0 Status to K1.  */
10063               emit_insn (gen_cop0_move (gen_rtx_REG (SImode, K1_REG_NUM),
10064                                         gen_rtx_REG (SImode,
10065                                                      COP0_STATUS_REG_NUM)));
10066
10067               /* Right justify the RIPL in k0.  */
10068               if (!cfun->machine->keep_interrupts_masked_p)
10069                 emit_insn (gen_lshrsi3 (gen_rtx_REG (SImode, K0_REG_NUM),
10070                                         gen_rtx_REG (SImode, K0_REG_NUM),
10071                                         GEN_INT (CAUSE_IPL)));
10072
10073               /* Push Status into its stack slot.  */
10074               mem = gen_frame_mem (word_mode,
10075                                    plus_constant (stack_pointer_rtx, offset));
10076               mips_emit_move (mem, gen_rtx_REG (word_mode, K1_REG_NUM));
10077               offset -= UNITS_PER_WORD;
10078
10079               /* Insert the RIPL into our copy of SR (k1) as the new IPL.  */
10080               if (!cfun->machine->keep_interrupts_masked_p)
10081                 emit_insn (gen_insvsi (gen_rtx_REG (SImode, K1_REG_NUM),
10082                                        GEN_INT (6),
10083                                        GEN_INT (SR_IPL),
10084                                        gen_rtx_REG (SImode, K0_REG_NUM)));
10085
10086               if (!cfun->machine->keep_interrupts_masked_p)
10087                 /* Enable interrupts by clearing the KSU ERL and EXL bits.
10088                    IE is already the correct value, so we don't have to do
10089                    anything explicit.  */
10090                 emit_insn (gen_insvsi (gen_rtx_REG (SImode, K1_REG_NUM),
10091                                        GEN_INT (4),
10092                                        GEN_INT (SR_EXL),
10093                                        gen_rtx_REG (SImode, GP_REG_FIRST)));
10094               else
10095                 /* Disable interrupts by clearing the KSU, ERL, EXL,
10096                    and IE bits.  */
10097                 emit_insn (gen_insvsi (gen_rtx_REG (SImode, K1_REG_NUM),
10098                                        GEN_INT (5),
10099                                        GEN_INT (SR_IE),
10100                                        gen_rtx_REG (SImode, GP_REG_FIRST)));
10101             }
10102           else
10103             {
10104               insn = gen_add3_insn (stack_pointer_rtx,
10105                                     stack_pointer_rtx,
10106                                     GEN_INT (-step1));
10107               RTX_FRAME_RELATED_P (emit_insn (insn)) = 1;
10108               size -= step1;
10109             }
10110           mips_for_each_saved_acc (size, mips_save_reg);
10111           mips_for_each_saved_gpr_and_fpr (size, mips_save_reg);
10112         }
10113     }
10114
10115   /* Allocate the rest of the frame.  */
10116   if (size > 0)
10117     {
10118       if (SMALL_OPERAND (-size))
10119         RTX_FRAME_RELATED_P (emit_insn (gen_add3_insn (stack_pointer_rtx,
10120                                                        stack_pointer_rtx,
10121                                                        GEN_INT (-size)))) = 1;
10122       else
10123         {
10124           mips_emit_move (MIPS_PROLOGUE_TEMP (Pmode), GEN_INT (size));
10125           if (TARGET_MIPS16)
10126             {
10127               /* There are no instructions to add or subtract registers
10128                  from the stack pointer, so use the frame pointer as a
10129                  temporary.  We should always be using a frame pointer
10130                  in this case anyway.  */
10131               gcc_assert (frame_pointer_needed);
10132               mips_emit_move (hard_frame_pointer_rtx, stack_pointer_rtx);
10133               emit_insn (gen_sub3_insn (hard_frame_pointer_rtx,
10134                                         hard_frame_pointer_rtx,
10135                                         MIPS_PROLOGUE_TEMP (Pmode)));
10136               mips_emit_move (stack_pointer_rtx, hard_frame_pointer_rtx);
10137             }
10138           else
10139             emit_insn (gen_sub3_insn (stack_pointer_rtx,
10140                                       stack_pointer_rtx,
10141                                       MIPS_PROLOGUE_TEMP (Pmode)));
10142
10143           /* Describe the combined effect of the previous instructions.  */
10144           mips_set_frame_expr
10145             (gen_rtx_SET (VOIDmode, stack_pointer_rtx,
10146                           plus_constant (stack_pointer_rtx, -size)));
10147         }
10148     }
10149
10150   /* Set up the frame pointer, if we're using one.  */
10151   if (frame_pointer_needed)
10152     {
10153       HOST_WIDE_INT offset;
10154
10155       offset = frame->hard_frame_pointer_offset;
10156       if (offset == 0)
10157         {
10158           insn = mips_emit_move (hard_frame_pointer_rtx, stack_pointer_rtx);
10159           RTX_FRAME_RELATED_P (insn) = 1;
10160         }
10161       else if (SMALL_OPERAND (offset))
10162         {
10163           insn = gen_add3_insn (hard_frame_pointer_rtx,
10164                                 stack_pointer_rtx, GEN_INT (offset));
10165           RTX_FRAME_RELATED_P (emit_insn (insn)) = 1;
10166         }
10167       else
10168         {
10169           mips_emit_move (MIPS_PROLOGUE_TEMP (Pmode), GEN_INT (offset));
10170           mips_emit_move (hard_frame_pointer_rtx, stack_pointer_rtx);
10171           emit_insn (gen_add3_insn (hard_frame_pointer_rtx,
10172                                     hard_frame_pointer_rtx,
10173                                     MIPS_PROLOGUE_TEMP (Pmode)));
10174           mips_set_frame_expr
10175             (gen_rtx_SET (VOIDmode, hard_frame_pointer_rtx,
10176                           plus_constant (stack_pointer_rtx, offset)));
10177         }
10178     }
10179
10180   mips_emit_loadgp ();
10181
10182   /* Initialize the $gp save slot.  */
10183   if (mips_cfun_has_cprestore_slot_p ())
10184     {
10185       rtx base, mem, gp, temp;
10186       HOST_WIDE_INT offset;
10187
10188       mips_get_cprestore_base_and_offset (&base, &offset, false);
10189       mem = gen_frame_mem (Pmode, plus_constant (base, offset));
10190       gp = TARGET_MIPS16 ? MIPS16_PIC_TEMP : pic_offset_table_rtx;
10191       temp = (SMALL_OPERAND (offset)
10192               ? gen_rtx_SCRATCH (Pmode)
10193               : MIPS_PROLOGUE_TEMP (Pmode));
10194       emit_insn (gen_potential_cprestore (mem, GEN_INT (offset), gp, temp));
10195
10196       mips_get_cprestore_base_and_offset (&base, &offset, true);
10197       mem = gen_frame_mem (Pmode, plus_constant (base, offset));
10198       emit_insn (gen_use_cprestore (mem));
10199     }
10200
10201   /* We need to search back to the last use of K0 or K1.  */
10202   if (cfun->machine->interrupt_handler_p)
10203     {
10204       for (insn = get_last_insn (); insn != NULL_RTX; insn = PREV_INSN (insn))
10205         if (INSN_P (insn)
10206             && for_each_rtx (&PATTERN (insn), mips_kernel_reg_p, NULL))
10207           break;
10208       /* Emit a move from K1 to COP0 Status after insn.  */
10209       gcc_assert (insn != NULL_RTX);
10210       emit_insn_after (gen_cop0_move (gen_rtx_REG (SImode, COP0_STATUS_REG_NUM),
10211                                       gen_rtx_REG (SImode, K1_REG_NUM)),
10212                        insn);
10213     }
10214
10215   /* If we are profiling, make sure no instructions are scheduled before
10216      the call to mcount.  */
10217   if (crtl->profile)
10218     emit_insn (gen_blockage ());
10219 }
10220 \f
10221 /* Emit instructions to restore register REG from slot MEM.  */
10222
10223 static void
10224 mips_restore_reg (rtx reg, rtx mem)
10225 {
10226   /* There's no MIPS16 instruction to load $31 directly.  Load into
10227      $7 instead and adjust the return insn appropriately.  */
10228   if (TARGET_MIPS16 && REGNO (reg) == RETURN_ADDR_REGNUM)
10229     reg = gen_rtx_REG (GET_MODE (reg), GP_REG_FIRST + 7);
10230
10231   mips_emit_save_slot_move (reg, mem, MIPS_EPILOGUE_TEMP (GET_MODE (reg)));
10232 }
10233
10234 /* Emit any instructions needed before a return.  */
10235
10236 void
10237 mips_expand_before_return (void)
10238 {
10239   /* When using a call-clobbered gp, we start out with unified call
10240      insns that include instructions to restore the gp.  We then split
10241      these unified calls after reload.  These split calls explicitly
10242      clobber gp, so there is no need to define
10243      PIC_OFFSET_TABLE_REG_CALL_CLOBBERED.
10244
10245      For consistency, we should also insert an explicit clobber of $28
10246      before return insns, so that the post-reload optimizers know that
10247      the register is not live on exit.  */
10248   if (TARGET_CALL_CLOBBERED_GP)
10249     emit_clobber (pic_offset_table_rtx);
10250 }
10251
10252 /* Expand an "epilogue" or "sibcall_epilogue" pattern; SIBCALL_P
10253    says which.  */
10254
10255 void
10256 mips_expand_epilogue (bool sibcall_p)
10257 {
10258   const struct mips_frame_info *frame;
10259   HOST_WIDE_INT step1, step2;
10260   rtx base, target, insn;
10261
10262   if (!sibcall_p && mips_can_use_return_insn ())
10263     {
10264       emit_jump_insn (gen_return ());
10265       return;
10266     }
10267
10268   /* In MIPS16 mode, if the return value should go into a floating-point
10269      register, we need to call a helper routine to copy it over.  */
10270   if (mips16_cfun_returns_in_fpr_p ())
10271     mips16_copy_fpr_return_value ();
10272
10273   /* Split the frame into two.  STEP1 is the amount of stack we should
10274      deallocate before restoring the registers.  STEP2 is the amount we
10275      should deallocate afterwards.
10276
10277      Start off by assuming that no registers need to be restored.  */
10278   frame = &cfun->machine->frame;
10279   step1 = frame->total_size;
10280   step2 = 0;
10281
10282   /* Work out which register holds the frame address.  */
10283   if (!frame_pointer_needed)
10284     base = stack_pointer_rtx;
10285   else
10286     {
10287       base = hard_frame_pointer_rtx;
10288       step1 -= frame->hard_frame_pointer_offset;
10289     }
10290
10291   /* If we need to restore registers, deallocate as much stack as
10292      possible in the second step without going out of range.  */
10293   if ((frame->mask | frame->fmask | frame->acc_mask) != 0
10294       || frame->num_cop0_regs > 0)
10295     {
10296       step2 = MIN (step1, MIPS_MAX_FIRST_STACK_STEP);
10297       step1 -= step2;
10298     }
10299
10300   /* Set TARGET to BASE + STEP1.  */
10301   target = base;
10302   if (step1 > 0)
10303     {
10304       rtx adjust;
10305
10306       /* Get an rtx for STEP1 that we can add to BASE.  */
10307       adjust = GEN_INT (step1);
10308       if (!SMALL_OPERAND (step1))
10309         {
10310           mips_emit_move (MIPS_EPILOGUE_TEMP (Pmode), adjust);
10311           adjust = MIPS_EPILOGUE_TEMP (Pmode);
10312         }
10313
10314       /* Normal mode code can copy the result straight into $sp.  */
10315       if (!TARGET_MIPS16)
10316         target = stack_pointer_rtx;
10317
10318       emit_insn (gen_add3_insn (target, base, adjust));
10319     }
10320
10321   /* Copy TARGET into the stack pointer.  */
10322   if (target != stack_pointer_rtx)
10323     mips_emit_move (stack_pointer_rtx, target);
10324
10325   /* If we're using addressing macros, $gp is implicitly used by all
10326      SYMBOL_REFs.  We must emit a blockage insn before restoring $gp
10327      from the stack.  */
10328   if (TARGET_CALL_SAVED_GP && !TARGET_EXPLICIT_RELOCS)
10329     emit_insn (gen_blockage ());
10330
10331   if (GENERATE_MIPS16E_SAVE_RESTORE && frame->mask != 0)
10332     {
10333       unsigned int regno, mask;
10334       HOST_WIDE_INT offset;
10335       rtx restore;
10336
10337       /* Generate the restore instruction.  */
10338       mask = frame->mask;
10339       restore = mips16e_build_save_restore (true, &mask, &offset, 0, step2);
10340
10341       /* Restore any other registers manually.  */
10342       for (regno = GP_REG_FIRST; regno < GP_REG_LAST; regno++)
10343         if (BITSET_P (mask, regno - GP_REG_FIRST))
10344           {
10345             offset -= UNITS_PER_WORD;
10346             mips_save_restore_reg (word_mode, regno, offset, mips_restore_reg);
10347           }
10348
10349       /* Restore the remaining registers and deallocate the final bit
10350          of the frame.  */
10351       emit_insn (restore);
10352     }
10353   else
10354     {
10355       /* Restore the registers.  */
10356       mips_for_each_saved_acc (frame->total_size - step2, mips_restore_reg);
10357       mips_for_each_saved_gpr_and_fpr (frame->total_size - step2,
10358                                        mips_restore_reg);
10359
10360       if (cfun->machine->interrupt_handler_p)
10361         {
10362           HOST_WIDE_INT offset;
10363           rtx mem;
10364
10365           offset = frame->cop0_sp_offset - (frame->total_size - step2);
10366           if (!cfun->machine->keep_interrupts_masked_p)
10367             {
10368               /* Restore the original EPC.  */
10369               mem = gen_frame_mem (word_mode,
10370                                    plus_constant (stack_pointer_rtx, offset));
10371               mips_emit_move (gen_rtx_REG (word_mode, K0_REG_NUM), mem);
10372               offset -= UNITS_PER_WORD;
10373
10374               /* Move to COP0 EPC.  */
10375               emit_insn (gen_cop0_move (gen_rtx_REG (SImode, COP0_EPC_REG_NUM),
10376                                         gen_rtx_REG (SImode, K0_REG_NUM)));
10377             }
10378
10379           /* Restore the original Status.  */
10380           mem = gen_frame_mem (word_mode,
10381                                plus_constant (stack_pointer_rtx, offset));
10382           mips_emit_move (gen_rtx_REG (word_mode, K0_REG_NUM), mem);
10383           offset -= UNITS_PER_WORD;
10384
10385           /* If we don't use shoadow register set, we need to update SP.  */
10386           if (!cfun->machine->use_shadow_register_set_p && step2 > 0)
10387             emit_insn (gen_add3_insn (stack_pointer_rtx,
10388                                       stack_pointer_rtx,
10389                                       GEN_INT (step2)));
10390
10391           /* Move to COP0 Status.  */
10392           emit_insn (gen_cop0_move (gen_rtx_REG (SImode, COP0_STATUS_REG_NUM),
10393                                     gen_rtx_REG (SImode, K0_REG_NUM)));
10394         }
10395       else
10396         {
10397           /* Deallocate the final bit of the frame.  */
10398           if (step2 > 0)
10399             emit_insn (gen_add3_insn (stack_pointer_rtx,
10400                                       stack_pointer_rtx,
10401                                       GEN_INT (step2)));
10402         }
10403     }
10404
10405   /* Add in the __builtin_eh_return stack adjustment.  We need to
10406      use a temporary in MIPS16 code.  */
10407   if (crtl->calls_eh_return)
10408     {
10409       if (TARGET_MIPS16)
10410         {
10411           mips_emit_move (MIPS_EPILOGUE_TEMP (Pmode), stack_pointer_rtx);
10412           emit_insn (gen_add3_insn (MIPS_EPILOGUE_TEMP (Pmode),
10413                                     MIPS_EPILOGUE_TEMP (Pmode),
10414                                     EH_RETURN_STACKADJ_RTX));
10415           mips_emit_move (stack_pointer_rtx, MIPS_EPILOGUE_TEMP (Pmode));
10416         }
10417       else
10418         emit_insn (gen_add3_insn (stack_pointer_rtx,
10419                                   stack_pointer_rtx,
10420                                   EH_RETURN_STACKADJ_RTX));
10421     }
10422
10423   if (!sibcall_p)
10424     {
10425       mips_expand_before_return ();
10426       if (cfun->machine->interrupt_handler_p)
10427         {
10428           /* Interrupt handlers generate eret or deret.  */
10429           if (cfun->machine->use_debug_exception_return_p)
10430             emit_jump_insn (gen_mips_deret ());
10431           else
10432             emit_jump_insn (gen_mips_eret ());
10433         }
10434       else
10435         {
10436           unsigned int regno;
10437
10438           /* When generating MIPS16 code, the normal
10439              mips_for_each_saved_gpr_and_fpr path will restore the return
10440              address into $7 rather than $31.  */
10441           if (TARGET_MIPS16
10442               && !GENERATE_MIPS16E_SAVE_RESTORE
10443               && BITSET_P (frame->mask, RETURN_ADDR_REGNUM))
10444             regno = GP_REG_FIRST + 7;
10445           else
10446             regno = RETURN_ADDR_REGNUM;
10447           emit_jump_insn (gen_return_internal (gen_rtx_REG (Pmode, regno)));
10448         }
10449     }
10450
10451   /* Search from the beginning to the first use of K0 or K1.  */
10452   if (cfun->machine->interrupt_handler_p
10453       && !cfun->machine->keep_interrupts_masked_p)
10454     {
10455       for (insn = get_insns (); insn != NULL_RTX; insn = NEXT_INSN (insn))
10456         if (INSN_P (insn)
10457             && for_each_rtx (&PATTERN(insn), mips_kernel_reg_p, NULL))
10458           break;
10459       gcc_assert (insn != NULL_RTX);
10460       /* Insert disable interrupts before the first use of K0 or K1.  */
10461       emit_insn_before (gen_mips_di (), insn);
10462       emit_insn_before (gen_mips_ehb (), insn);
10463     }
10464 }
10465 \f
10466 /* Return nonzero if this function is known to have a null epilogue.
10467    This allows the optimizer to omit jumps to jumps if no stack
10468    was created.  */
10469
10470 bool
10471 mips_can_use_return_insn (void)
10472 {
10473   /* Interrupt handlers need to go through the epilogue.  */
10474   if (cfun->machine->interrupt_handler_p)
10475     return false;
10476
10477   if (!reload_completed)
10478     return false;
10479
10480   if (crtl->profile)
10481     return false;
10482
10483   /* In MIPS16 mode, a function that returns a floating-point value
10484      needs to arrange to copy the return value into the floating-point
10485      registers.  */
10486   if (mips16_cfun_returns_in_fpr_p ())
10487     return false;
10488
10489   return cfun->machine->frame.total_size == 0;
10490 }
10491 \f
10492 /* Return true if register REGNO can store a value of mode MODE.
10493    The result of this function is cached in mips_hard_regno_mode_ok.  */
10494
10495 static bool
10496 mips_hard_regno_mode_ok_p (unsigned int regno, enum machine_mode mode)
10497 {
10498   unsigned int size;
10499   enum mode_class mclass;
10500
10501   if (mode == CCV2mode)
10502     return (ISA_HAS_8CC
10503             && ST_REG_P (regno)
10504             && (regno - ST_REG_FIRST) % 2 == 0);
10505
10506   if (mode == CCV4mode)
10507     return (ISA_HAS_8CC
10508             && ST_REG_P (regno)
10509             && (regno - ST_REG_FIRST) % 4 == 0);
10510
10511   if (mode == CCmode)
10512     {
10513       if (!ISA_HAS_8CC)
10514         return regno == FPSW_REGNUM;
10515
10516       return (ST_REG_P (regno)
10517               || GP_REG_P (regno)
10518               || FP_REG_P (regno));
10519     }
10520
10521   size = GET_MODE_SIZE (mode);
10522   mclass = GET_MODE_CLASS (mode);
10523
10524   if (GP_REG_P (regno))
10525     return ((regno - GP_REG_FIRST) & 1) == 0 || size <= UNITS_PER_WORD;
10526
10527   if (FP_REG_P (regno)
10528       && (((regno - FP_REG_FIRST) % MAX_FPRS_PER_FMT) == 0
10529           || (MIN_FPRS_PER_FMT == 1 && size <= UNITS_PER_FPREG)))
10530     {
10531       /* Allow TFmode for CCmode reloads.  */
10532       if (mode == TFmode && ISA_HAS_8CC)
10533         return true;
10534
10535       /* Allow 64-bit vector modes for Loongson-2E/2F.  */
10536       if (TARGET_LOONGSON_VECTORS
10537           && (mode == V2SImode
10538               || mode == V4HImode
10539               || mode == V8QImode
10540               || mode == DImode))
10541         return true;
10542
10543       if (mclass == MODE_FLOAT
10544           || mclass == MODE_COMPLEX_FLOAT
10545           || mclass == MODE_VECTOR_FLOAT)
10546         return size <= UNITS_PER_FPVALUE;
10547
10548       /* Allow integer modes that fit into a single register.  We need
10549          to put integers into FPRs when using instructions like CVT
10550          and TRUNC.  There's no point allowing sizes smaller than a word,
10551          because the FPU has no appropriate load/store instructions.  */
10552       if (mclass == MODE_INT)
10553         return size >= MIN_UNITS_PER_WORD && size <= UNITS_PER_FPREG;
10554     }
10555
10556   if (ACC_REG_P (regno)
10557       && (INTEGRAL_MODE_P (mode) || ALL_FIXED_POINT_MODE_P (mode)))
10558     {
10559       if (MD_REG_P (regno))
10560         {
10561           /* After a multiplication or division, clobbering HI makes
10562              the value of LO unpredictable, and vice versa.  This means
10563              that, for all interesting cases, HI and LO are effectively
10564              a single register.
10565
10566              We model this by requiring that any value that uses HI
10567              also uses LO.  */
10568           if (size <= UNITS_PER_WORD * 2)
10569             return regno == (size <= UNITS_PER_WORD ? LO_REGNUM : MD_REG_FIRST);
10570         }
10571       else
10572         {
10573           /* DSP accumulators do not have the same restrictions as
10574              HI and LO, so we can treat them as normal doubleword
10575              registers.  */
10576           if (size <= UNITS_PER_WORD)
10577             return true;
10578
10579           if (size <= UNITS_PER_WORD * 2
10580               && ((regno - DSP_ACC_REG_FIRST) & 1) == 0)
10581             return true;
10582         }
10583     }
10584
10585   if (ALL_COP_REG_P (regno))
10586     return mclass == MODE_INT && size <= UNITS_PER_WORD;
10587
10588   if (regno == GOT_VERSION_REGNUM)
10589     return mode == SImode;
10590
10591   return false;
10592 }
10593
10594 /* Implement HARD_REGNO_NREGS.  */
10595
10596 unsigned int
10597 mips_hard_regno_nregs (int regno, enum machine_mode mode)
10598 {
10599   if (ST_REG_P (regno))
10600     /* The size of FP status registers is always 4, because they only hold
10601        CCmode values, and CCmode is always considered to be 4 bytes wide.  */
10602     return (GET_MODE_SIZE (mode) + 3) / 4;
10603
10604   if (FP_REG_P (regno))
10605     return (GET_MODE_SIZE (mode) + UNITS_PER_FPREG - 1) / UNITS_PER_FPREG;
10606
10607   /* All other registers are word-sized.  */
10608   return (GET_MODE_SIZE (mode) + UNITS_PER_WORD - 1) / UNITS_PER_WORD;
10609 }
10610
10611 /* Implement CLASS_MAX_NREGS, taking the maximum of the cases
10612    in mips_hard_regno_nregs.  */
10613
10614 int
10615 mips_class_max_nregs (enum reg_class rclass, enum machine_mode mode)
10616 {
10617   int size;
10618   HARD_REG_SET left;
10619
10620   size = 0x8000;
10621   COPY_HARD_REG_SET (left, reg_class_contents[(int) rclass]);
10622   if (hard_reg_set_intersect_p (left, reg_class_contents[(int) ST_REGS]))
10623     {
10624       size = MIN (size, 4);
10625       AND_COMPL_HARD_REG_SET (left, reg_class_contents[(int) ST_REGS]);
10626     }
10627   if (hard_reg_set_intersect_p (left, reg_class_contents[(int) FP_REGS]))
10628     {
10629       size = MIN (size, UNITS_PER_FPREG);
10630       AND_COMPL_HARD_REG_SET (left, reg_class_contents[(int) FP_REGS]);
10631     }
10632   if (!hard_reg_set_empty_p (left))
10633     size = MIN (size, UNITS_PER_WORD);
10634   return (GET_MODE_SIZE (mode) + size - 1) / size;
10635 }
10636
10637 /* Implement CANNOT_CHANGE_MODE_CLASS.  */
10638
10639 bool
10640 mips_cannot_change_mode_class (enum machine_mode from ATTRIBUTE_UNUSED,
10641                                enum machine_mode to ATTRIBUTE_UNUSED,
10642                                enum reg_class rclass)
10643 {
10644   /* There are several problems with changing the modes of values
10645      in floating-point registers:
10646
10647      - When a multi-word value is stored in paired floating-point
10648        registers, the first register always holds the low word.
10649        We therefore can't allow FPRs to change between single-word
10650        and multi-word modes on big-endian targets.
10651
10652      - GCC assumes that each word of a multiword register can be accessed
10653        individually using SUBREGs.  This is not true for floating-point
10654        registers if they are bigger than a word.
10655
10656      - Loading a 32-bit value into a 64-bit floating-point register
10657        will not sign-extend the value, despite what LOAD_EXTEND_OP says.
10658        We can't allow FPRs to change from SImode to to a wider mode on
10659        64-bit targets.
10660
10661      - If the FPU has already interpreted a value in one format, we must
10662        not ask it to treat the value as having a different format.
10663
10664      We therefore disallow all mode changes involving FPRs.  */
10665   return reg_classes_intersect_p (FP_REGS, rclass);
10666 }
10667
10668 /* Return true if moves in mode MODE can use the FPU's mov.fmt instruction.  */
10669
10670 static bool
10671 mips_mode_ok_for_mov_fmt_p (enum machine_mode mode)
10672 {
10673   switch (mode)
10674     {
10675     case SFmode:
10676       return TARGET_HARD_FLOAT;
10677
10678     case DFmode:
10679       return TARGET_HARD_FLOAT && TARGET_DOUBLE_FLOAT;
10680
10681     case V2SFmode:
10682       return TARGET_HARD_FLOAT && TARGET_PAIRED_SINGLE_FLOAT;
10683
10684     default:
10685       return false;
10686     }
10687 }
10688
10689 /* Implement MODES_TIEABLE_P.  */
10690
10691 bool
10692 mips_modes_tieable_p (enum machine_mode mode1, enum machine_mode mode2)
10693 {
10694   /* FPRs allow no mode punning, so it's not worth tying modes if we'd
10695      prefer to put one of them in FPRs.  */
10696   return (mode1 == mode2
10697           || (!mips_mode_ok_for_mov_fmt_p (mode1)
10698               && !mips_mode_ok_for_mov_fmt_p (mode2)));
10699 }
10700
10701 /* Implement PREFERRED_RELOAD_CLASS.  */
10702
10703 enum reg_class
10704 mips_preferred_reload_class (rtx x, enum reg_class rclass)
10705 {
10706   if (mips_dangerous_for_la25_p (x) && reg_class_subset_p (LEA_REGS, rclass))
10707     return LEA_REGS;
10708
10709   if (reg_class_subset_p (FP_REGS, rclass)
10710       && mips_mode_ok_for_mov_fmt_p (GET_MODE (x)))
10711     return FP_REGS;
10712
10713   if (reg_class_subset_p (GR_REGS, rclass))
10714     rclass = GR_REGS;
10715
10716   if (TARGET_MIPS16 && reg_class_subset_p (M16_REGS, rclass))
10717     rclass = M16_REGS;
10718
10719   return rclass;
10720 }
10721
10722 /* RCLASS is a class involved in a REGISTER_MOVE_COST calculation.
10723    Return a "canonical" class to represent it in later calculations.  */
10724
10725 static enum reg_class
10726 mips_canonicalize_move_class (enum reg_class rclass)
10727 {
10728   /* All moves involving accumulator registers have the same cost.  */
10729   if (reg_class_subset_p (rclass, ACC_REGS))
10730     rclass = ACC_REGS;
10731
10732   /* Likewise promote subclasses of general registers to the most
10733      interesting containing class.  */
10734   if (TARGET_MIPS16 && reg_class_subset_p (rclass, M16_REGS))
10735     rclass = M16_REGS;
10736   else if (reg_class_subset_p (rclass, GENERAL_REGS))
10737     rclass = GENERAL_REGS;
10738
10739   return rclass;
10740 }
10741
10742 /* Return the cost of moving a value of mode MODE from a register of
10743    class FROM to a GPR.  Return 0 for classes that are unions of other
10744    classes handled by this function.  */
10745
10746 static int
10747 mips_move_to_gpr_cost (enum machine_mode mode ATTRIBUTE_UNUSED,
10748                        enum reg_class from)
10749 {
10750   switch (from)
10751     {
10752     case GENERAL_REGS:
10753       /* A MIPS16 MOVE instruction, or a non-MIPS16 MOVE macro.  */
10754       return 2;
10755
10756     case ACC_REGS:
10757       /* MFLO and MFHI.  */
10758       return 6;
10759
10760     case FP_REGS:
10761       /* MFC1, etc.  */
10762       return 4;
10763
10764     case ST_REGS:
10765       /* LUI followed by MOVF.  */
10766       return 4;
10767
10768     case COP0_REGS:
10769     case COP2_REGS:
10770     case COP3_REGS:
10771       /* This choice of value is historical.  */
10772       return 5;
10773
10774     default:
10775       return 0;
10776     }
10777 }
10778
10779 /* Return the cost of moving a value of mode MODE from a GPR to a
10780    register of class TO.  Return 0 for classes that are unions of
10781    other classes handled by this function.  */
10782
10783 static int
10784 mips_move_from_gpr_cost (enum machine_mode mode, enum reg_class to)
10785 {
10786   switch (to)
10787     {
10788     case GENERAL_REGS:
10789       /* A MIPS16 MOVE instruction, or a non-MIPS16 MOVE macro.  */
10790       return 2;
10791
10792     case ACC_REGS:
10793       /* MTLO and MTHI.  */
10794       return 6;
10795
10796     case FP_REGS:
10797       /* MTC1, etc.  */
10798       return 4;
10799
10800     case ST_REGS:
10801       /* A secondary reload through an FPR scratch.  */
10802       return (mips_register_move_cost (mode, GENERAL_REGS, FP_REGS)
10803               + mips_register_move_cost (mode, FP_REGS, ST_REGS));
10804
10805     case COP0_REGS:
10806     case COP2_REGS:
10807     case COP3_REGS:
10808       /* This choice of value is historical.  */
10809       return 5;
10810
10811     default:
10812       return 0;
10813     }
10814 }
10815
10816 /* Implement REGISTER_MOVE_COST.  Return 0 for classes that are the
10817    maximum of the move costs for subclasses; regclass will work out
10818    the maximum for us.  */
10819
10820 int
10821 mips_register_move_cost (enum machine_mode mode,
10822                          enum reg_class from, enum reg_class to)
10823 {
10824   enum reg_class dregs;
10825   int cost1, cost2;
10826
10827   from = mips_canonicalize_move_class (from);
10828   to = mips_canonicalize_move_class (to);
10829
10830   /* Handle moves that can be done without using general-purpose registers.  */
10831   if (from == FP_REGS)
10832     {
10833       if (to == FP_REGS && mips_mode_ok_for_mov_fmt_p (mode))
10834         /* MOV.FMT.  */
10835         return 4;
10836       if (to == ST_REGS)
10837         /* The sequence generated by mips_expand_fcc_reload.  */
10838         return 8;
10839     }
10840
10841   /* Handle cases in which only one class deviates from the ideal.  */
10842   dregs = TARGET_MIPS16 ? M16_REGS : GENERAL_REGS;
10843   if (from == dregs)
10844     return mips_move_from_gpr_cost (mode, to);
10845   if (to == dregs)
10846     return mips_move_to_gpr_cost (mode, from);
10847
10848   /* Handles cases that require a GPR temporary.  */
10849   cost1 = mips_move_to_gpr_cost (mode, from);
10850   if (cost1 != 0)
10851     {
10852       cost2 = mips_move_from_gpr_cost (mode, to);
10853       if (cost2 != 0)
10854         return cost1 + cost2;
10855     }
10856
10857   return 0;
10858 }
10859
10860 /* Implement TARGET_IRA_COVER_CLASSES.  */
10861
10862 static const enum reg_class *
10863 mips_ira_cover_classes (void)
10864 {
10865   static const enum reg_class acc_classes[] = {
10866     GR_AND_ACC_REGS, FP_REGS, COP0_REGS, COP2_REGS, COP3_REGS,
10867     ST_REGS, LIM_REG_CLASSES
10868   };
10869   static const enum reg_class no_acc_classes[] = {
10870     GR_REGS, FP_REGS, COP0_REGS, COP2_REGS, COP3_REGS,
10871     ST_REGS, LIM_REG_CLASSES
10872   };
10873
10874   /* Don't allow the register allocators to use LO and HI in MIPS16 mode,
10875      which has no MTLO or MTHI instructions.  Also, using GR_AND_ACC_REGS
10876      as a cover class only works well when we keep per-register costs.
10877      Using it when not optimizing can cause us to think accumulators
10878      have the same cost as GPRs in cases where GPRs are actually much
10879      cheaper.  */
10880   return TARGET_MIPS16 || !optimize ? no_acc_classes : acc_classes;
10881 }
10882
10883 /* Return the register class required for a secondary register when
10884    copying between one of the registers in RCLASS and value X, which
10885    has mode MODE.  X is the source of the move if IN_P, otherwise it
10886    is the destination.  Return NO_REGS if no secondary register is
10887    needed.  */
10888
10889 enum reg_class
10890 mips_secondary_reload_class (enum reg_class rclass,
10891                              enum machine_mode mode, rtx x, bool in_p)
10892 {
10893   int regno;
10894
10895   /* If X is a constant that cannot be loaded into $25, it must be loaded
10896      into some other GPR.  No other register class allows a direct move.  */
10897   if (mips_dangerous_for_la25_p (x))
10898     return reg_class_subset_p (rclass, LEA_REGS) ? NO_REGS : LEA_REGS;
10899
10900   regno = true_regnum (x);
10901   if (TARGET_MIPS16)
10902     {
10903       /* In MIPS16 mode, every move must involve a member of M16_REGS.  */
10904       if (!reg_class_subset_p (rclass, M16_REGS) && !M16_REG_P (regno))
10905         return M16_REGS;
10906
10907       return NO_REGS;
10908     }
10909
10910   /* Copying from accumulator registers to anywhere other than a general
10911      register requires a temporary general register.  */
10912   if (reg_class_subset_p (rclass, ACC_REGS))
10913     return GP_REG_P (regno) ? NO_REGS : GR_REGS;
10914   if (ACC_REG_P (regno))
10915     return reg_class_subset_p (rclass, GR_REGS) ? NO_REGS : GR_REGS;
10916
10917   /* We can only copy a value to a condition code register from a
10918      floating-point register, and even then we require a scratch
10919      floating-point register.  We can only copy a value out of a
10920      condition-code register into a general register.  */
10921   if (reg_class_subset_p (rclass, ST_REGS))
10922     {
10923       if (in_p)
10924         return FP_REGS;
10925       return GP_REG_P (regno) ? NO_REGS : GR_REGS;
10926     }
10927   if (ST_REG_P (regno))
10928     {
10929       if (!in_p)
10930         return FP_REGS;
10931       return reg_class_subset_p (rclass, GR_REGS) ? NO_REGS : GR_REGS;
10932     }
10933
10934   if (reg_class_subset_p (rclass, FP_REGS))
10935     {
10936       if (MEM_P (x)
10937           && (GET_MODE_SIZE (mode) == 4 || GET_MODE_SIZE (mode) == 8))
10938         /* In this case we can use lwc1, swc1, ldc1 or sdc1.  We'll use
10939            pairs of lwc1s and swc1s if ldc1 and sdc1 are not supported.  */
10940         return NO_REGS;
10941
10942       if (GP_REG_P (regno) || x == CONST0_RTX (mode))
10943         /* In this case we can use mtc1, mfc1, dmtc1 or dmfc1.  */
10944         return NO_REGS;
10945
10946       if (CONSTANT_P (x) && !targetm.cannot_force_const_mem (x))
10947         /* We can force the constant to memory and use lwc1
10948            and ldc1.  As above, we will use pairs of lwc1s if
10949            ldc1 is not supported.  */
10950         return NO_REGS;
10951
10952       if (FP_REG_P (regno) && mips_mode_ok_for_mov_fmt_p (mode))
10953         /* In this case we can use mov.fmt.  */
10954         return NO_REGS;
10955
10956       /* Otherwise, we need to reload through an integer register.  */
10957       return GR_REGS;
10958     }
10959   if (FP_REG_P (regno))
10960     return reg_class_subset_p (rclass, GR_REGS) ? NO_REGS : GR_REGS;
10961
10962   return NO_REGS;
10963 }
10964
10965 /* Implement TARGET_MODE_REP_EXTENDED.  */
10966
10967 static int
10968 mips_mode_rep_extended (enum machine_mode mode, enum machine_mode mode_rep)
10969 {
10970   /* On 64-bit targets, SImode register values are sign-extended to DImode.  */
10971   if (TARGET_64BIT && mode == SImode && mode_rep == DImode)
10972     return SIGN_EXTEND;
10973
10974   return UNKNOWN;
10975 }
10976 \f
10977 /* Implement TARGET_VALID_POINTER_MODE.  */
10978
10979 static bool
10980 mips_valid_pointer_mode (enum machine_mode mode)
10981 {
10982   return mode == SImode || (TARGET_64BIT && mode == DImode);
10983 }
10984
10985 /* Implement TARGET_VECTOR_MODE_SUPPORTED_P.  */
10986
10987 static bool
10988 mips_vector_mode_supported_p (enum machine_mode mode)
10989 {
10990   switch (mode)
10991     {
10992     case V2SFmode:
10993       return TARGET_PAIRED_SINGLE_FLOAT;
10994
10995     case V2HImode:
10996     case V4QImode:
10997     case V2HQmode:
10998     case V2UHQmode:
10999     case V2HAmode:
11000     case V2UHAmode:
11001     case V4QQmode:
11002     case V4UQQmode:
11003       return TARGET_DSP;
11004
11005     case V2SImode:
11006     case V4HImode:
11007     case V8QImode:
11008       return TARGET_LOONGSON_VECTORS;
11009
11010     default:
11011       return false;
11012     }
11013 }
11014
11015 /* Implement TARGET_SCALAR_MODE_SUPPORTED_P.  */
11016
11017 static bool
11018 mips_scalar_mode_supported_p (enum machine_mode mode)
11019 {
11020   if (ALL_FIXED_POINT_MODE_P (mode)
11021       && GET_MODE_PRECISION (mode) <= 2 * BITS_PER_WORD)
11022     return true;
11023
11024   return default_scalar_mode_supported_p (mode);
11025 }
11026 \f
11027 /* Implement TARGET_INIT_LIBFUNCS.  */
11028
11029 #include "config/gofast.h"
11030
11031 static void
11032 mips_init_libfuncs (void)
11033 {
11034   if (TARGET_FIX_VR4120)
11035     {
11036       /* Register the special divsi3 and modsi3 functions needed to work
11037          around VR4120 division errata.  */
11038       set_optab_libfunc (sdiv_optab, SImode, "__vr4120_divsi3");
11039       set_optab_libfunc (smod_optab, SImode, "__vr4120_modsi3");
11040     }
11041
11042   if (TARGET_MIPS16 && TARGET_HARD_FLOAT_ABI)
11043     {
11044       /* Register the MIPS16 -mhard-float stubs.  */
11045       set_optab_libfunc (add_optab, SFmode, "__mips16_addsf3");
11046       set_optab_libfunc (sub_optab, SFmode, "__mips16_subsf3");
11047       set_optab_libfunc (smul_optab, SFmode, "__mips16_mulsf3");
11048       set_optab_libfunc (sdiv_optab, SFmode, "__mips16_divsf3");
11049
11050       set_optab_libfunc (eq_optab, SFmode, "__mips16_eqsf2");
11051       set_optab_libfunc (ne_optab, SFmode, "__mips16_nesf2");
11052       set_optab_libfunc (gt_optab, SFmode, "__mips16_gtsf2");
11053       set_optab_libfunc (ge_optab, SFmode, "__mips16_gesf2");
11054       set_optab_libfunc (lt_optab, SFmode, "__mips16_ltsf2");
11055       set_optab_libfunc (le_optab, SFmode, "__mips16_lesf2");
11056       set_optab_libfunc (unord_optab, SFmode, "__mips16_unordsf2");
11057
11058       set_conv_libfunc (sfix_optab, SImode, SFmode, "__mips16_fix_truncsfsi");
11059       set_conv_libfunc (sfloat_optab, SFmode, SImode, "__mips16_floatsisf");
11060       set_conv_libfunc (ufloat_optab, SFmode, SImode, "__mips16_floatunsisf");
11061
11062       if (TARGET_DOUBLE_FLOAT)
11063         {
11064           set_optab_libfunc (add_optab, DFmode, "__mips16_adddf3");
11065           set_optab_libfunc (sub_optab, DFmode, "__mips16_subdf3");
11066           set_optab_libfunc (smul_optab, DFmode, "__mips16_muldf3");
11067           set_optab_libfunc (sdiv_optab, DFmode, "__mips16_divdf3");
11068
11069           set_optab_libfunc (eq_optab, DFmode, "__mips16_eqdf2");
11070           set_optab_libfunc (ne_optab, DFmode, "__mips16_nedf2");
11071           set_optab_libfunc (gt_optab, DFmode, "__mips16_gtdf2");
11072           set_optab_libfunc (ge_optab, DFmode, "__mips16_gedf2");
11073           set_optab_libfunc (lt_optab, DFmode, "__mips16_ltdf2");
11074           set_optab_libfunc (le_optab, DFmode, "__mips16_ledf2");
11075           set_optab_libfunc (unord_optab, DFmode, "__mips16_unorddf2");
11076
11077           set_conv_libfunc (sext_optab, DFmode, SFmode,
11078                             "__mips16_extendsfdf2");
11079           set_conv_libfunc (trunc_optab, SFmode, DFmode,
11080                             "__mips16_truncdfsf2");
11081           set_conv_libfunc (sfix_optab, SImode, DFmode,
11082                             "__mips16_fix_truncdfsi");
11083           set_conv_libfunc (sfloat_optab, DFmode, SImode,
11084                             "__mips16_floatsidf");
11085           set_conv_libfunc (ufloat_optab, DFmode, SImode,
11086                             "__mips16_floatunsidf");
11087         }
11088     }
11089   else
11090     /* Register the gofast functions if selected using --enable-gofast.  */
11091     gofast_maybe_init_libfuncs ();
11092
11093   /* The MIPS16 ISA does not have an encoding for "sync", so we rely
11094      on an external non-MIPS16 routine to implement __sync_synchronize.  */
11095   if (TARGET_MIPS16)
11096     synchronize_libfunc = init_one_libfunc ("__sync_synchronize");
11097 }
11098
11099 /* Build up a multi-insn sequence that loads label TARGET into $AT.  */
11100
11101 static void
11102 mips_process_load_label (rtx target)
11103 {
11104   rtx base, gp, intop;
11105   HOST_WIDE_INT offset;
11106
11107   mips_multi_start ();
11108   switch (mips_abi)
11109     {
11110     case ABI_N32:
11111       mips_multi_add_insn ("lw\t%@,%%got_page(%0)(%+)", target, 0);
11112       mips_multi_add_insn ("addiu\t%@,%@,%%got_ofst(%0)", target, 0);
11113       break;
11114
11115     case ABI_64:
11116       mips_multi_add_insn ("ld\t%@,%%got_page(%0)(%+)", target, 0);
11117       mips_multi_add_insn ("daddiu\t%@,%@,%%got_ofst(%0)", target, 0);
11118       break;
11119
11120     default:
11121       gp = pic_offset_table_rtx;
11122       if (mips_cfun_has_cprestore_slot_p ())
11123         {
11124           gp = gen_rtx_REG (Pmode, AT_REGNUM);
11125           mips_get_cprestore_base_and_offset (&base, &offset, true);
11126           if (!SMALL_OPERAND (offset))
11127             {
11128               intop = GEN_INT (CONST_HIGH_PART (offset));
11129               mips_multi_add_insn ("lui\t%0,%1", gp, intop, 0);
11130               mips_multi_add_insn ("addu\t%0,%0,%1", gp, base, 0);
11131
11132               base = gp;
11133               offset = CONST_LOW_PART (offset);
11134             }
11135           intop = GEN_INT (offset);
11136           if (ISA_HAS_LOAD_DELAY)
11137             mips_multi_add_insn ("lw\t%0,%1(%2)%#", gp, intop, base, 0);
11138           else
11139             mips_multi_add_insn ("lw\t%0,%1(%2)", gp, intop, base, 0);
11140         }
11141       if (ISA_HAS_LOAD_DELAY)
11142         mips_multi_add_insn ("lw\t%@,%%got(%0)(%1)%#", target, gp, 0);
11143       else
11144         mips_multi_add_insn ("lw\t%@,%%got(%0)(%1)", target, gp, 0);
11145       mips_multi_add_insn ("addiu\t%@,%@,%%lo(%0)", target, 0);
11146       break;
11147     }
11148 }
11149
11150 /* Return the number of instructions needed to load a label into $AT.  */
11151
11152 static unsigned int
11153 mips_load_label_length (void)
11154 {
11155   if (cfun->machine->load_label_length == 0)
11156     {
11157       mips_process_load_label (pc_rtx);
11158       cfun->machine->load_label_length = mips_multi_num_insns;
11159     }
11160   return cfun->machine->load_label_length;
11161 }
11162
11163 /* Emit an asm sequence to start a noat block and load the address
11164    of a label into $1.  */
11165
11166 void
11167 mips_output_load_label (rtx target)
11168 {
11169   mips_push_asm_switch (&mips_noat);
11170   if (TARGET_EXPLICIT_RELOCS)
11171     {
11172       mips_process_load_label (target);
11173       mips_multi_write ();
11174     }
11175   else
11176     {
11177       if (Pmode == DImode)
11178         output_asm_insn ("dla\t%@,%0", &target);
11179       else
11180         output_asm_insn ("la\t%@,%0", &target);
11181     }
11182 }
11183
11184 /* Return the length of INSN.  LENGTH is the initial length computed by
11185    attributes in the machine-description file.  */
11186
11187 int
11188 mips_adjust_insn_length (rtx insn, int length)
11189 {
11190   /* mips.md uses MAX_PIC_BRANCH_LENGTH as a placeholder for the length
11191      of a PIC long-branch sequence.  Substitute the correct value.  */
11192   if (length == MAX_PIC_BRANCH_LENGTH
11193       && INSN_CODE (insn) >= 0
11194       && get_attr_type (insn) == TYPE_BRANCH)
11195     {
11196       /* Add the branch-over instruction and its delay slot, if this
11197          is a conditional branch.  */
11198       length = simplejump_p (insn) ? 0 : 8;
11199
11200       /* Load the label into $AT and jump to it.  Ignore the delay
11201          slot of the jump.  */
11202       length += mips_load_label_length () + 4;
11203     }
11204
11205   /* A unconditional jump has an unfilled delay slot if it is not part
11206      of a sequence.  A conditional jump normally has a delay slot, but
11207      does not on MIPS16.  */
11208   if (CALL_P (insn) || (TARGET_MIPS16 ? simplejump_p (insn) : JUMP_P (insn)))
11209     length += 4;
11210
11211   /* See how many nops might be needed to avoid hardware hazards.  */
11212   if (!cfun->machine->ignore_hazard_length_p && INSN_CODE (insn) >= 0)
11213     switch (get_attr_hazard (insn))
11214       {
11215       case HAZARD_NONE:
11216         break;
11217
11218       case HAZARD_DELAY:
11219         length += 4;
11220         break;
11221
11222       case HAZARD_HILO:
11223         length += 8;
11224         break;
11225       }
11226
11227   /* In order to make it easier to share MIPS16 and non-MIPS16 patterns,
11228      the .md file length attributes are 4-based for both modes.
11229      Adjust the MIPS16 ones here.  */
11230   if (TARGET_MIPS16)
11231     length /= 2;
11232
11233   return length;
11234 }
11235
11236 /* Return the assembly code for INSN, which has the operands given by
11237    OPERANDS, and which branches to OPERANDS[0] if some condition is true.
11238    BRANCH_IF_TRUE is the asm template that should be used if OPERANDS[0]
11239    is in range of a direct branch.  BRANCH_IF_FALSE is an inverted
11240    version of BRANCH_IF_TRUE.  */
11241
11242 const char *
11243 mips_output_conditional_branch (rtx insn, rtx *operands,
11244                                 const char *branch_if_true,
11245                                 const char *branch_if_false)
11246 {
11247   unsigned int length;
11248   rtx taken, not_taken;
11249
11250   gcc_assert (LABEL_P (operands[0]));
11251
11252   length = get_attr_length (insn);
11253   if (length <= 8)
11254     {
11255       /* Just a simple conditional branch.  */
11256       mips_branch_likely = (final_sequence && INSN_ANNULLED_BRANCH_P (insn));
11257       return branch_if_true;
11258     }
11259
11260   /* Generate a reversed branch around a direct jump.  This fallback does
11261      not use branch-likely instructions.  */
11262   mips_branch_likely = false;
11263   not_taken = gen_label_rtx ();
11264   taken = operands[0];
11265
11266   /* Generate the reversed branch to NOT_TAKEN.  */
11267   operands[0] = not_taken;
11268   output_asm_insn (branch_if_false, operands);
11269
11270   /* If INSN has a delay slot, we must provide delay slots for both the
11271      branch to NOT_TAKEN and the conditional jump.  We must also ensure
11272      that INSN's delay slot is executed in the appropriate cases.  */
11273   if (final_sequence)
11274     {
11275       /* This first delay slot will always be executed, so use INSN's
11276          delay slot if is not annulled.  */
11277       if (!INSN_ANNULLED_BRANCH_P (insn))
11278         {
11279           final_scan_insn (XVECEXP (final_sequence, 0, 1),
11280                            asm_out_file, optimize, 1, NULL);
11281           INSN_DELETED_P (XVECEXP (final_sequence, 0, 1)) = 1;
11282         }
11283       else
11284         output_asm_insn ("nop", 0);
11285       fprintf (asm_out_file, "\n");
11286     }
11287
11288   /* Output the unconditional branch to TAKEN.  */
11289   if (TARGET_ABSOLUTE_JUMPS)
11290     output_asm_insn (MIPS_ABSOLUTE_JUMP ("j\t%0%/"), &taken);
11291   else
11292     {
11293       mips_output_load_label (taken);
11294       output_asm_insn ("jr\t%@%]%/", 0);
11295     }
11296
11297   /* Now deal with its delay slot; see above.  */
11298   if (final_sequence)
11299     {
11300       /* This delay slot will only be executed if the branch is taken.
11301          Use INSN's delay slot if is annulled.  */
11302       if (INSN_ANNULLED_BRANCH_P (insn))
11303         {
11304           final_scan_insn (XVECEXP (final_sequence, 0, 1),
11305                            asm_out_file, optimize, 1, NULL);
11306           INSN_DELETED_P (XVECEXP (final_sequence, 0, 1)) = 1;
11307         }
11308       else
11309         output_asm_insn ("nop", 0);
11310       fprintf (asm_out_file, "\n");
11311     }
11312
11313   /* Output NOT_TAKEN.  */
11314   targetm.asm_out.internal_label (asm_out_file, "L",
11315                                   CODE_LABEL_NUMBER (not_taken));
11316   return "";
11317 }
11318
11319 /* Return the assembly code for INSN, which branches to OPERANDS[0]
11320    if some ordering condition is true.  The condition is given by
11321    OPERANDS[1] if !INVERTED_P, otherwise it is the inverse of
11322    OPERANDS[1].  OPERANDS[2] is the comparison's first operand;
11323    its second is always zero.  */
11324
11325 const char *
11326 mips_output_order_conditional_branch (rtx insn, rtx *operands, bool inverted_p)
11327 {
11328   const char *branch[2];
11329
11330   /* Make BRANCH[1] branch to OPERANDS[0] when the condition is true.
11331      Make BRANCH[0] branch on the inverse condition.  */
11332   switch (GET_CODE (operands[1]))
11333     {
11334       /* These cases are equivalent to comparisons against zero.  */
11335     case LEU:
11336       inverted_p = !inverted_p;
11337       /* Fall through.  */
11338     case GTU:
11339       branch[!inverted_p] = MIPS_BRANCH ("bne", "%2,%.,%0");
11340       branch[inverted_p] = MIPS_BRANCH ("beq", "%2,%.,%0");
11341       break;
11342
11343       /* These cases are always true or always false.  */
11344     case LTU:
11345       inverted_p = !inverted_p;
11346       /* Fall through.  */
11347     case GEU:
11348       branch[!inverted_p] = MIPS_BRANCH ("beq", "%.,%.,%0");
11349       branch[inverted_p] = MIPS_BRANCH ("bne", "%.,%.,%0");
11350       break;
11351
11352     default:
11353       branch[!inverted_p] = MIPS_BRANCH ("b%C1z", "%2,%0");
11354       branch[inverted_p] = MIPS_BRANCH ("b%N1z", "%2,%0");
11355       break;
11356     }
11357   return mips_output_conditional_branch (insn, operands, branch[1], branch[0]);
11358 }
11359 \f
11360 /* Start a block of code that needs access to the LL, SC and SYNC
11361    instructions.  */
11362
11363 static void
11364 mips_start_ll_sc_sync_block (void)
11365 {
11366   if (!ISA_HAS_LL_SC)
11367     {
11368       output_asm_insn (".set\tpush", 0);
11369       output_asm_insn (".set\tmips2", 0);
11370     }
11371 }
11372
11373 /* End a block started by mips_start_ll_sc_sync_block.  */
11374
11375 static void
11376 mips_end_ll_sc_sync_block (void)
11377 {
11378   if (!ISA_HAS_LL_SC)
11379     output_asm_insn (".set\tpop", 0);
11380 }
11381
11382 /* Output and/or return the asm template for a sync instruction.  */
11383
11384 const char *
11385 mips_output_sync (void)
11386 {
11387   mips_start_ll_sc_sync_block ();
11388   output_asm_insn ("sync", 0);
11389   mips_end_ll_sc_sync_block ();
11390   return "";
11391 }
11392
11393 /* Return the asm template associated with sync_insn1 value TYPE.
11394    IS_64BIT_P is true if we want a 64-bit rather than 32-bit operation.  */
11395
11396 static const char *
11397 mips_sync_insn1_template (enum attr_sync_insn1 type, bool is_64bit_p)
11398 {
11399   switch (type)
11400     {
11401     case SYNC_INSN1_MOVE:
11402       return "move\t%0,%z2";
11403     case SYNC_INSN1_LI:
11404       return "li\t%0,%2";
11405     case SYNC_INSN1_ADDU:
11406       return is_64bit_p ? "daddu\t%0,%1,%z2" : "addu\t%0,%1,%z2";
11407     case SYNC_INSN1_ADDIU:
11408       return is_64bit_p ? "daddiu\t%0,%1,%2" : "addiu\t%0,%1,%2";
11409     case SYNC_INSN1_SUBU:
11410       return is_64bit_p ? "dsubu\t%0,%1,%z2" : "subu\t%0,%1,%z2";
11411     case SYNC_INSN1_AND:
11412       return "and\t%0,%1,%z2";
11413     case SYNC_INSN1_ANDI:
11414       return "andi\t%0,%1,%2";
11415     case SYNC_INSN1_OR:
11416       return "or\t%0,%1,%z2";
11417     case SYNC_INSN1_ORI:
11418       return "ori\t%0,%1,%2";
11419     case SYNC_INSN1_XOR:
11420       return "xor\t%0,%1,%z2";
11421     case SYNC_INSN1_XORI:
11422       return "xori\t%0,%1,%2";
11423     }
11424   gcc_unreachable ();
11425 }
11426
11427 /* Return the asm template associated with sync_insn2 value TYPE.  */
11428
11429 static const char *
11430 mips_sync_insn2_template (enum attr_sync_insn2 type)
11431 {
11432   switch (type)
11433     {
11434     case SYNC_INSN2_NOP:
11435       gcc_unreachable ();
11436     case SYNC_INSN2_AND:
11437       return "and\t%0,%1,%z2";
11438     case SYNC_INSN2_XOR:
11439       return "xor\t%0,%1,%z2";
11440     case SYNC_INSN2_NOT:
11441       return "nor\t%0,%1,%.";
11442     }
11443   gcc_unreachable ();
11444 }
11445
11446 /* OPERANDS are the operands to a sync loop instruction and INDEX is
11447    the value of the one of the sync_* attributes.  Return the operand
11448    referred to by the attribute, or DEFAULT_VALUE if the insn doesn't
11449    have the associated attribute.  */
11450
11451 static rtx
11452 mips_get_sync_operand (rtx *operands, int index, rtx default_value)
11453 {
11454   if (index > 0)
11455     default_value = operands[index - 1];
11456   return default_value;
11457 }
11458
11459 /* INSN is a sync loop with operands OPERANDS.  Build up a multi-insn
11460    sequence for it.  */
11461
11462 static void
11463 mips_process_sync_loop (rtx insn, rtx *operands)
11464 {
11465   rtx at, mem, oldval, newval, inclusive_mask, exclusive_mask;
11466   rtx required_oldval, insn1_op2, tmp1, tmp2, tmp3;
11467   unsigned int tmp3_insn;
11468   enum attr_sync_insn1 insn1;
11469   enum attr_sync_insn2 insn2;
11470   bool is_64bit_p;
11471
11472   /* Read an operand from the sync_WHAT attribute and store it in
11473      variable WHAT.  DEFAULT is the default value if no attribute
11474      is specified.  */
11475 #define READ_OPERAND(WHAT, DEFAULT) \
11476   WHAT = mips_get_sync_operand (operands, (int) get_attr_sync_##WHAT (insn), \
11477                                 DEFAULT)
11478
11479   /* Read the memory.  */
11480   READ_OPERAND (mem, 0);
11481   gcc_assert (mem);
11482   is_64bit_p = (GET_MODE_BITSIZE (GET_MODE (mem)) == 64);
11483
11484   /* Read the other attributes.  */
11485   at = gen_rtx_REG (GET_MODE (mem), AT_REGNUM);
11486   READ_OPERAND (oldval, at);
11487   READ_OPERAND (newval, at);
11488   READ_OPERAND (inclusive_mask, 0);
11489   READ_OPERAND (exclusive_mask, 0);
11490   READ_OPERAND (required_oldval, 0);
11491   READ_OPERAND (insn1_op2, 0);
11492   insn1 = get_attr_sync_insn1 (insn);
11493   insn2 = get_attr_sync_insn2 (insn);
11494
11495   mips_multi_start ();
11496
11497   /* Output the release side of the memory barrier.  */
11498   if (get_attr_sync_release_barrier (insn) == SYNC_RELEASE_BARRIER_YES)
11499     {
11500       if (required_oldval == 0 && TARGET_OCTEON)
11501         {
11502           /* Octeon doesn't reorder reads, so a full barrier can be
11503              created by using SYNCW to order writes combined with the
11504              write from the following SC.  When the SC successfully
11505              completes, we know that all preceding writes are also
11506              committed to the coherent memory system.  It is possible
11507              for a single SYNCW to fail, but a pair of them will never
11508              fail, so we use two.  */
11509           mips_multi_add_insn ("syncw", NULL);
11510           mips_multi_add_insn ("syncw", NULL);
11511         }
11512       else
11513         mips_multi_add_insn ("sync", NULL);
11514     }
11515
11516   /* Output the branch-back label.  */
11517   mips_multi_add_label ("1:");
11518
11519   /* OLDVAL = *MEM.  */
11520   mips_multi_add_insn (is_64bit_p ? "lld\t%0,%1" : "ll\t%0,%1",
11521                        oldval, mem, NULL);
11522
11523   /* if ((OLDVAL & INCLUSIVE_MASK) != REQUIRED_OLDVAL) goto 2.  */
11524   if (required_oldval)
11525     {
11526       if (inclusive_mask == 0)
11527         tmp1 = oldval;
11528       else
11529         {
11530           gcc_assert (oldval != at);
11531           mips_multi_add_insn ("and\t%0,%1,%2",
11532                                at, oldval, inclusive_mask, NULL);
11533           tmp1 = at;
11534         }
11535       mips_multi_add_insn ("bne\t%0,%z1,2f", tmp1, required_oldval, NULL);
11536     }
11537
11538   /* $TMP1 = OLDVAL & EXCLUSIVE_MASK.  */
11539   if (exclusive_mask == 0)
11540     tmp1 = const0_rtx;
11541   else
11542     {
11543       gcc_assert (oldval != at);
11544       mips_multi_add_insn ("and\t%0,%1,%z2",
11545                            at, oldval, exclusive_mask, NULL);
11546       tmp1 = at;
11547     }
11548
11549   /* $TMP2 = INSN1 (OLDVAL, INSN1_OP2).
11550
11551      We can ignore moves if $TMP4 != INSN1_OP2, since we'll still emit
11552      at least one instruction in that case.  */
11553   if (insn1 == SYNC_INSN1_MOVE
11554       && (tmp1 != const0_rtx || insn2 != SYNC_INSN2_NOP))
11555     tmp2 = insn1_op2;
11556   else
11557     {
11558       mips_multi_add_insn (mips_sync_insn1_template (insn1, is_64bit_p),
11559                            newval, oldval, insn1_op2, NULL);
11560       tmp2 = newval;
11561     }
11562
11563   /* $TMP3 = INSN2 ($TMP2, INCLUSIVE_MASK).  */
11564   if (insn2 == SYNC_INSN2_NOP)
11565     tmp3 = tmp2;
11566   else
11567     {
11568       mips_multi_add_insn (mips_sync_insn2_template (insn2),
11569                            newval, tmp2, inclusive_mask, NULL);
11570       tmp3 = newval;
11571     }
11572   tmp3_insn = mips_multi_last_index ();
11573
11574   /* $AT = $TMP1 | $TMP3.  */
11575   if (tmp1 == const0_rtx || tmp3 == const0_rtx)
11576     {
11577       mips_multi_set_operand (tmp3_insn, 0, at);
11578       tmp3 = at;
11579     }
11580   else
11581     {
11582       gcc_assert (tmp1 != tmp3);
11583       mips_multi_add_insn ("or\t%0,%1,%2", at, tmp1, tmp3, NULL);
11584     }
11585
11586   /* if (!commit (*MEM = $AT)) goto 1.
11587
11588      This will sometimes be a delayed branch; see the write code below
11589      for details.  */
11590   mips_multi_add_insn (is_64bit_p ? "scd\t%0,%1" : "sc\t%0,%1", at, mem, NULL);
11591   mips_multi_add_insn ("beq%?\t%0,%.,1b", at, NULL);
11592
11593   /* if (INSN1 != MOVE && INSN1 != LI) NEWVAL = $TMP3 [delay slot].  */
11594   if (insn1 != SYNC_INSN1_MOVE && insn1 != SYNC_INSN1_LI && tmp3 != newval)
11595     {
11596       mips_multi_copy_insn (tmp3_insn);
11597       mips_multi_set_operand (mips_multi_last_index (), 0, newval);
11598     }
11599   else
11600     mips_multi_add_insn ("nop", NULL);
11601
11602   /* Output the acquire side of the memory barrier.  */
11603   if (TARGET_SYNC_AFTER_SC)
11604     mips_multi_add_insn ("sync", NULL);
11605
11606   /* Output the exit label, if needed.  */
11607   if (required_oldval)
11608     mips_multi_add_label ("2:");
11609
11610 #undef READ_OPERAND
11611 }
11612
11613 /* Output and/or return the asm template for sync loop INSN, which has
11614    the operands given by OPERANDS.  */
11615
11616 const char *
11617 mips_output_sync_loop (rtx insn, rtx *operands)
11618 {
11619   mips_process_sync_loop (insn, operands);
11620
11621   /* Use branch-likely instructions to work around the LL/SC R10000
11622      errata.  */
11623   mips_branch_likely = TARGET_FIX_R10000;
11624
11625   mips_push_asm_switch (&mips_noreorder);
11626   mips_push_asm_switch (&mips_nomacro);
11627   mips_push_asm_switch (&mips_noat);
11628   mips_start_ll_sc_sync_block ();
11629
11630   mips_multi_write ();
11631
11632   mips_end_ll_sc_sync_block ();
11633   mips_pop_asm_switch (&mips_noat);
11634   mips_pop_asm_switch (&mips_nomacro);
11635   mips_pop_asm_switch (&mips_noreorder);
11636
11637   return "";
11638 }
11639
11640 /* Return the number of individual instructions in sync loop INSN,
11641    which has the operands given by OPERANDS.  */
11642
11643 unsigned int
11644 mips_sync_loop_insns (rtx insn, rtx *operands)
11645 {
11646   mips_process_sync_loop (insn, operands);
11647   return mips_multi_num_insns;
11648 }
11649 \f
11650 /* Return the assembly code for DIV or DDIV instruction DIVISION, which has
11651    the operands given by OPERANDS.  Add in a divide-by-zero check if needed.
11652
11653    When working around R4000 and R4400 errata, we need to make sure that
11654    the division is not immediately followed by a shift[1][2].  We also
11655    need to stop the division from being put into a branch delay slot[3].
11656    The easiest way to avoid both problems is to add a nop after the
11657    division.  When a divide-by-zero check is needed, this nop can be
11658    used to fill the branch delay slot.
11659
11660    [1] If a double-word or a variable shift executes immediately
11661        after starting an integer division, the shift may give an
11662        incorrect result.  See quotations of errata #16 and #28 from
11663        "MIPS R4000PC/SC Errata, Processor Revision 2.2 and 3.0"
11664        in mips.md for details.
11665
11666    [2] A similar bug to [1] exists for all revisions of the
11667        R4000 and the R4400 when run in an MC configuration.
11668        From "MIPS R4000MC Errata, Processor Revision 2.2 and 3.0":
11669
11670        "19. In this following sequence:
11671
11672                     ddiv                (or ddivu or div or divu)
11673                     dsll32              (or dsrl32, dsra32)
11674
11675             if an MPT stall occurs, while the divide is slipping the cpu
11676             pipeline, then the following double shift would end up with an
11677             incorrect result.
11678
11679             Workaround: The compiler needs to avoid generating any
11680             sequence with divide followed by extended double shift."
11681
11682        This erratum is also present in "MIPS R4400MC Errata, Processor
11683        Revision 1.0" and "MIPS R4400MC Errata, Processor Revision 2.0
11684        & 3.0" as errata #10 and #4, respectively.
11685
11686    [3] From "MIPS R4000PC/SC Errata, Processor Revision 2.2 and 3.0"
11687        (also valid for MIPS R4000MC processors):
11688
11689        "52. R4000SC: This bug does not apply for the R4000PC.
11690
11691             There are two flavors of this bug:
11692
11693             1) If the instruction just after divide takes an RF exception
11694                (tlb-refill, tlb-invalid) and gets an instruction cache
11695                miss (both primary and secondary) and the line which is
11696                currently in secondary cache at this index had the first
11697                data word, where the bits 5..2 are set, then R4000 would
11698                get a wrong result for the div.
11699
11700             ##1
11701                     nop
11702                     div r8, r9
11703                     -------------------         # end-of page. -tlb-refill
11704                     nop
11705             ##2
11706                     nop
11707                     div r8, r9
11708                     -------------------         # end-of page. -tlb-invalid
11709                     nop
11710
11711             2) If the divide is in the taken branch delay slot, where the
11712                target takes RF exception and gets an I-cache miss for the
11713                exception vector or where I-cache miss occurs for the
11714                target address, under the above mentioned scenarios, the
11715                div would get wrong results.
11716
11717             ##1
11718                     j   r2              # to next page mapped or unmapped
11719                     div r8,r9           # this bug would be there as long
11720                                         # as there is an ICache miss and
11721                     nop                 # the "data pattern" is present
11722
11723             ##2
11724                     beq r0, r0, NextPage        # to Next page
11725                     div r8,r9
11726                     nop
11727
11728             This bug is present for div, divu, ddiv, and ddivu
11729             instructions.
11730
11731             Workaround: For item 1), OS could make sure that the next page
11732             after the divide instruction is also mapped.  For item 2), the
11733             compiler could make sure that the divide instruction is not in
11734             the branch delay slot."
11735
11736        These processors have PRId values of 0x00004220 and 0x00004300 for
11737        the R4000 and 0x00004400, 0x00004500 and 0x00004600 for the R4400.  */
11738
11739 const char *
11740 mips_output_division (const char *division, rtx *operands)
11741 {
11742   const char *s;
11743
11744   s = division;
11745   if (TARGET_FIX_R4000 || TARGET_FIX_R4400)
11746     {
11747       output_asm_insn (s, operands);
11748       s = "nop";
11749     }
11750   if (TARGET_CHECK_ZERO_DIV)
11751     {
11752       if (TARGET_MIPS16)
11753         {
11754           output_asm_insn (s, operands);
11755           s = "bnez\t%2,1f\n\tbreak\t7\n1:";
11756         }
11757       else if (GENERATE_DIVIDE_TRAPS)
11758         {
11759           output_asm_insn (s, operands);
11760           s = "teq\t%2,%.,7";
11761         }
11762       else
11763         {
11764           output_asm_insn ("%(bne\t%2,%.,1f", operands);
11765           output_asm_insn (s, operands);
11766           s = "break\t7%)\n1:";
11767         }
11768     }
11769   return s;
11770 }
11771 \f
11772 /* Return true if IN_INSN is a multiply-add or multiply-subtract
11773    instruction and if OUT_INSN assigns to the accumulator operand.  */
11774
11775 bool
11776 mips_linked_madd_p (rtx out_insn, rtx in_insn)
11777 {
11778   rtx x;
11779
11780   x = single_set (in_insn);
11781   if (x == 0)
11782     return false;
11783
11784   x = SET_SRC (x);
11785
11786   if (GET_CODE (x) == PLUS
11787       && GET_CODE (XEXP (x, 0)) == MULT
11788       && reg_set_p (XEXP (x, 1), out_insn))
11789     return true;
11790
11791   if (GET_CODE (x) == MINUS
11792       && GET_CODE (XEXP (x, 1)) == MULT
11793       && reg_set_p (XEXP (x, 0), out_insn))
11794     return true;
11795
11796   return false;
11797 }
11798
11799 /* True if the dependency between OUT_INSN and IN_INSN is on the store
11800    data rather than the address.  We need this because the cprestore
11801    pattern is type "store", but is defined using an UNSPEC_VOLATILE,
11802    which causes the default routine to abort.  We just return false
11803    for that case.  */
11804
11805 bool
11806 mips_store_data_bypass_p (rtx out_insn, rtx in_insn)
11807 {
11808   if (GET_CODE (PATTERN (in_insn)) == UNSPEC_VOLATILE)
11809     return false;
11810
11811   return !store_data_bypass_p (out_insn, in_insn);
11812 }
11813 \f
11814
11815 /* Variables and flags used in scheduler hooks when tuning for
11816    Loongson 2E/2F.  */
11817 static struct
11818 {
11819   /* Variables to support Loongson 2E/2F round-robin [F]ALU1/2 dispatch
11820      strategy.  */
11821
11822   /* If true, then next ALU1/2 instruction will go to ALU1.  */
11823   bool alu1_turn_p;
11824
11825   /* If true, then next FALU1/2 unstruction will go to FALU1.  */
11826   bool falu1_turn_p;
11827
11828   /* Codes to query if [f]alu{1,2}_core units are subscribed or not.  */
11829   int alu1_core_unit_code;
11830   int alu2_core_unit_code;
11831   int falu1_core_unit_code;
11832   int falu2_core_unit_code;
11833
11834   /* True if current cycle has a multi instruction.
11835      This flag is used in mips_ls2_dfa_post_advance_cycle.  */
11836   bool cycle_has_multi_p;
11837
11838   /* Instructions to subscribe ls2_[f]alu{1,2}_turn_enabled units.
11839      These are used in mips_ls2_dfa_post_advance_cycle to initialize
11840      DFA state.
11841      E.g., when alu1_turn_enabled_insn is issued it makes next ALU1/2
11842      instruction to go ALU1.  */
11843   rtx alu1_turn_enabled_insn;
11844   rtx alu2_turn_enabled_insn;
11845   rtx falu1_turn_enabled_insn;
11846   rtx falu2_turn_enabled_insn;
11847 } mips_ls2;
11848
11849 /* Implement TARGET_SCHED_ADJUST_COST.  We assume that anti and output
11850    dependencies have no cost, except on the 20Kc where output-dependence
11851    is treated like input-dependence.  */
11852
11853 static int
11854 mips_adjust_cost (rtx insn ATTRIBUTE_UNUSED, rtx link,
11855                   rtx dep ATTRIBUTE_UNUSED, int cost)
11856 {
11857   if (REG_NOTE_KIND (link) == REG_DEP_OUTPUT
11858       && TUNE_20KC)
11859     return cost;
11860   if (REG_NOTE_KIND (link) != 0)
11861     return 0;
11862   return cost;
11863 }
11864
11865 /* Return the number of instructions that can be issued per cycle.  */
11866
11867 static int
11868 mips_issue_rate (void)
11869 {
11870   switch (mips_tune)
11871     {
11872     case PROCESSOR_74KC:
11873     case PROCESSOR_74KF2_1:
11874     case PROCESSOR_74KF1_1:
11875     case PROCESSOR_74KF3_2:
11876       /* The 74k is not strictly quad-issue cpu, but can be seen as one
11877          by the scheduler.  It can issue 1 ALU, 1 AGEN and 2 FPU insns,
11878          but in reality only a maximum of 3 insns can be issued as
11879          floating-point loads and stores also require a slot in the
11880          AGEN pipe.  */
11881     case PROCESSOR_R10000:
11882       /* All R10K Processors are quad-issue (being the first MIPS
11883          processors to support this feature). */
11884       return 4;
11885
11886     case PROCESSOR_20KC:
11887     case PROCESSOR_R4130:
11888     case PROCESSOR_R5400:
11889     case PROCESSOR_R5500:
11890     case PROCESSOR_R7000:
11891     case PROCESSOR_R9000:
11892     case PROCESSOR_OCTEON:
11893       return 2;
11894
11895     case PROCESSOR_SB1:
11896     case PROCESSOR_SB1A:
11897       /* This is actually 4, but we get better performance if we claim 3.
11898          This is partly because of unwanted speculative code motion with the
11899          larger number, and partly because in most common cases we can't
11900          reach the theoretical max of 4.  */
11901       return 3;
11902
11903     case PROCESSOR_LOONGSON_2E:
11904     case PROCESSOR_LOONGSON_2F:
11905       return 4;
11906
11907     default:
11908       return 1;
11909     }
11910 }
11911
11912 /* Implement TARGET_SCHED_INIT_DFA_POST_CYCLE_INSN hook for Loongson2.  */
11913
11914 static void
11915 mips_ls2_init_dfa_post_cycle_insn (void)
11916 {
11917   start_sequence ();
11918   emit_insn (gen_ls2_alu1_turn_enabled_insn ());
11919   mips_ls2.alu1_turn_enabled_insn = get_insns ();
11920   end_sequence ();
11921
11922   start_sequence ();
11923   emit_insn (gen_ls2_alu2_turn_enabled_insn ());
11924   mips_ls2.alu2_turn_enabled_insn = get_insns ();
11925   end_sequence ();
11926
11927   start_sequence ();
11928   emit_insn (gen_ls2_falu1_turn_enabled_insn ());
11929   mips_ls2.falu1_turn_enabled_insn = get_insns ();
11930   end_sequence ();
11931
11932   start_sequence ();
11933   emit_insn (gen_ls2_falu2_turn_enabled_insn ());
11934   mips_ls2.falu2_turn_enabled_insn = get_insns ();
11935   end_sequence ();
11936
11937   mips_ls2.alu1_core_unit_code = get_cpu_unit_code ("ls2_alu1_core");
11938   mips_ls2.alu2_core_unit_code = get_cpu_unit_code ("ls2_alu2_core");
11939   mips_ls2.falu1_core_unit_code = get_cpu_unit_code ("ls2_falu1_core");
11940   mips_ls2.falu2_core_unit_code = get_cpu_unit_code ("ls2_falu2_core");
11941 }
11942
11943 /* Implement TARGET_SCHED_INIT_DFA_POST_CYCLE_INSN hook.
11944    Init data used in mips_dfa_post_advance_cycle.  */
11945
11946 static void
11947 mips_init_dfa_post_cycle_insn (void)
11948 {
11949   if (TUNE_LOONGSON_2EF)
11950     mips_ls2_init_dfa_post_cycle_insn ();
11951 }
11952
11953 /* Initialize STATE when scheduling for Loongson 2E/2F.
11954    Support round-robin dispatch scheme by enabling only one of
11955    ALU1/ALU2 and one of FALU1/FALU2 units for ALU1/2 and FALU1/2 instructions
11956    respectively.  */
11957
11958 static void
11959 mips_ls2_dfa_post_advance_cycle (state_t state)
11960 {
11961   if (cpu_unit_reservation_p (state, mips_ls2.alu1_core_unit_code))
11962     {
11963       /* Though there are no non-pipelined ALU1 insns,
11964          we can get an instruction of type 'multi' before reload.  */
11965       gcc_assert (mips_ls2.cycle_has_multi_p);
11966       mips_ls2.alu1_turn_p = false;
11967     }
11968
11969   mips_ls2.cycle_has_multi_p = false;
11970
11971   if (cpu_unit_reservation_p (state, mips_ls2.alu2_core_unit_code))
11972     /* We have a non-pipelined alu instruction in the core,
11973        adjust round-robin counter.  */
11974     mips_ls2.alu1_turn_p = true;
11975
11976   if (mips_ls2.alu1_turn_p)
11977     {
11978       if (state_transition (state, mips_ls2.alu1_turn_enabled_insn) >= 0)
11979         gcc_unreachable ();
11980     }
11981   else
11982     {
11983       if (state_transition (state, mips_ls2.alu2_turn_enabled_insn) >= 0)
11984         gcc_unreachable ();
11985     }
11986
11987   if (cpu_unit_reservation_p (state, mips_ls2.falu1_core_unit_code))
11988     {
11989       /* There are no non-pipelined FALU1 insns.  */
11990       gcc_unreachable ();
11991       mips_ls2.falu1_turn_p = false;
11992     }
11993
11994   if (cpu_unit_reservation_p (state, mips_ls2.falu2_core_unit_code))
11995     /* We have a non-pipelined falu instruction in the core,
11996        adjust round-robin counter.  */
11997     mips_ls2.falu1_turn_p = true;
11998
11999   if (mips_ls2.falu1_turn_p)
12000     {
12001       if (state_transition (state, mips_ls2.falu1_turn_enabled_insn) >= 0)
12002         gcc_unreachable ();
12003     }
12004   else
12005     {
12006       if (state_transition (state, mips_ls2.falu2_turn_enabled_insn) >= 0)
12007         gcc_unreachable ();
12008     }
12009 }
12010
12011 /* Implement TARGET_SCHED_DFA_POST_ADVANCE_CYCLE.
12012    This hook is being called at the start of each cycle.  */
12013
12014 static void
12015 mips_dfa_post_advance_cycle (void)
12016 {
12017   if (TUNE_LOONGSON_2EF)
12018     mips_ls2_dfa_post_advance_cycle (curr_state);
12019 }
12020
12021 /* Implement TARGET_SCHED_FIRST_CYCLE_MULTIPASS_DFA_LOOKAHEAD.  This should
12022    be as wide as the scheduling freedom in the DFA.  */
12023
12024 static int
12025 mips_multipass_dfa_lookahead (void)
12026 {
12027   /* Can schedule up to 4 of the 6 function units in any one cycle.  */
12028   if (TUNE_SB1)
12029     return 4;
12030
12031   if (TUNE_LOONGSON_2EF)
12032     return 4;
12033
12034   if (TUNE_OCTEON)
12035     return 2;
12036
12037   return 0;
12038 }
12039 \f
12040 /* Remove the instruction at index LOWER from ready queue READY and
12041    reinsert it in front of the instruction at index HIGHER.  LOWER must
12042    be <= HIGHER.  */
12043
12044 static void
12045 mips_promote_ready (rtx *ready, int lower, int higher)
12046 {
12047   rtx new_head;
12048   int i;
12049
12050   new_head = ready[lower];
12051   for (i = lower; i < higher; i++)
12052     ready[i] = ready[i + 1];
12053   ready[i] = new_head;
12054 }
12055
12056 /* If the priority of the instruction at POS2 in the ready queue READY
12057    is within LIMIT units of that of the instruction at POS1, swap the
12058    instructions if POS2 is not already less than POS1.  */
12059
12060 static void
12061 mips_maybe_swap_ready (rtx *ready, int pos1, int pos2, int limit)
12062 {
12063   if (pos1 < pos2
12064       && INSN_PRIORITY (ready[pos1]) + limit >= INSN_PRIORITY (ready[pos2]))
12065     {
12066       rtx temp;
12067
12068       temp = ready[pos1];
12069       ready[pos1] = ready[pos2];
12070       ready[pos2] = temp;
12071     }
12072 }
12073 \f
12074 /* Used by TUNE_MACC_CHAINS to record the last scheduled instruction
12075    that may clobber hi or lo.  */
12076 static rtx mips_macc_chains_last_hilo;
12077
12078 /* A TUNE_MACC_CHAINS helper function.  Record that instruction INSN has
12079    been scheduled, updating mips_macc_chains_last_hilo appropriately.  */
12080
12081 static void
12082 mips_macc_chains_record (rtx insn)
12083 {
12084   if (get_attr_may_clobber_hilo (insn))
12085     mips_macc_chains_last_hilo = insn;
12086 }
12087
12088 /* A TUNE_MACC_CHAINS helper function.  Search ready queue READY, which
12089    has NREADY elements, looking for a multiply-add or multiply-subtract
12090    instruction that is cumulative with mips_macc_chains_last_hilo.
12091    If there is one, promote it ahead of anything else that might
12092    clobber hi or lo.  */
12093
12094 static void
12095 mips_macc_chains_reorder (rtx *ready, int nready)
12096 {
12097   int i, j;
12098
12099   if (mips_macc_chains_last_hilo != 0)
12100     for (i = nready - 1; i >= 0; i--)
12101       if (mips_linked_madd_p (mips_macc_chains_last_hilo, ready[i]))
12102         {
12103           for (j = nready - 1; j > i; j--)
12104             if (recog_memoized (ready[j]) >= 0
12105                 && get_attr_may_clobber_hilo (ready[j]))
12106               {
12107                 mips_promote_ready (ready, i, j);
12108                 break;
12109               }
12110           break;
12111         }
12112 }
12113 \f
12114 /* The last instruction to be scheduled.  */
12115 static rtx vr4130_last_insn;
12116
12117 /* A note_stores callback used by vr4130_true_reg_dependence_p.  DATA
12118    points to an rtx that is initially an instruction.  Nullify the rtx
12119    if the instruction uses the value of register X.  */
12120
12121 static void
12122 vr4130_true_reg_dependence_p_1 (rtx x, const_rtx pat ATTRIBUTE_UNUSED,
12123                                 void *data)
12124 {
12125   rtx *insn_ptr;
12126
12127   insn_ptr = (rtx *) data;
12128   if (REG_P (x)
12129       && *insn_ptr != 0
12130       && reg_referenced_p (x, PATTERN (*insn_ptr)))
12131     *insn_ptr = 0;
12132 }
12133
12134 /* Return true if there is true register dependence between vr4130_last_insn
12135    and INSN.  */
12136
12137 static bool
12138 vr4130_true_reg_dependence_p (rtx insn)
12139 {
12140   note_stores (PATTERN (vr4130_last_insn),
12141                vr4130_true_reg_dependence_p_1, &insn);
12142   return insn == 0;
12143 }
12144
12145 /* A TUNE_MIPS4130 helper function.  Given that INSN1 is at the head of
12146    the ready queue and that INSN2 is the instruction after it, return
12147    true if it is worth promoting INSN2 ahead of INSN1.  Look for cases
12148    in which INSN1 and INSN2 can probably issue in parallel, but for
12149    which (INSN2, INSN1) should be less sensitive to instruction
12150    alignment than (INSN1, INSN2).  See 4130.md for more details.  */
12151
12152 static bool
12153 vr4130_swap_insns_p (rtx insn1, rtx insn2)
12154 {
12155   sd_iterator_def sd_it;
12156   dep_t dep;
12157
12158   /* Check for the following case:
12159
12160      1) there is some other instruction X with an anti dependence on INSN1;
12161      2) X has a higher priority than INSN2; and
12162      3) X is an arithmetic instruction (and thus has no unit restrictions).
12163
12164      If INSN1 is the last instruction blocking X, it would better to
12165      choose (INSN1, X) over (INSN2, INSN1).  */
12166   FOR_EACH_DEP (insn1, SD_LIST_FORW, sd_it, dep)
12167     if (DEP_TYPE (dep) == REG_DEP_ANTI
12168         && INSN_PRIORITY (DEP_CON (dep)) > INSN_PRIORITY (insn2)
12169         && recog_memoized (DEP_CON (dep)) >= 0
12170         && get_attr_vr4130_class (DEP_CON (dep)) == VR4130_CLASS_ALU)
12171       return false;
12172
12173   if (vr4130_last_insn != 0
12174       && recog_memoized (insn1) >= 0
12175       && recog_memoized (insn2) >= 0)
12176     {
12177       /* See whether INSN1 and INSN2 use different execution units,
12178          or if they are both ALU-type instructions.  If so, they can
12179          probably execute in parallel.  */
12180       enum attr_vr4130_class class1 = get_attr_vr4130_class (insn1);
12181       enum attr_vr4130_class class2 = get_attr_vr4130_class (insn2);
12182       if (class1 != class2 || class1 == VR4130_CLASS_ALU)
12183         {
12184           /* If only one of the instructions has a dependence on
12185              vr4130_last_insn, prefer to schedule the other one first.  */
12186           bool dep1_p = vr4130_true_reg_dependence_p (insn1);
12187           bool dep2_p = vr4130_true_reg_dependence_p (insn2);
12188           if (dep1_p != dep2_p)
12189             return dep1_p;
12190
12191           /* Prefer to schedule INSN2 ahead of INSN1 if vr4130_last_insn
12192              is not an ALU-type instruction and if INSN1 uses the same
12193              execution unit.  (Note that if this condition holds, we already
12194              know that INSN2 uses a different execution unit.)  */
12195           if (class1 != VR4130_CLASS_ALU
12196               && recog_memoized (vr4130_last_insn) >= 0
12197               && class1 == get_attr_vr4130_class (vr4130_last_insn))
12198             return true;
12199         }
12200     }
12201   return false;
12202 }
12203
12204 /* A TUNE_MIPS4130 helper function.  (READY, NREADY) describes a ready
12205    queue with at least two instructions.  Swap the first two if
12206    vr4130_swap_insns_p says that it could be worthwhile.  */
12207
12208 static void
12209 vr4130_reorder (rtx *ready, int nready)
12210 {
12211   if (vr4130_swap_insns_p (ready[nready - 1], ready[nready - 2]))
12212     mips_promote_ready (ready, nready - 2, nready - 1);
12213 }
12214 \f
12215 /* Record whether last 74k AGEN instruction was a load or store.  */
12216 static enum attr_type mips_last_74k_agen_insn = TYPE_UNKNOWN;
12217
12218 /* Initialize mips_last_74k_agen_insn from INSN.  A null argument
12219    resets to TYPE_UNKNOWN state.  */
12220
12221 static void
12222 mips_74k_agen_init (rtx insn)
12223 {
12224   if (!insn || CALL_P (insn) || JUMP_P (insn))
12225     mips_last_74k_agen_insn = TYPE_UNKNOWN;
12226   else
12227     {
12228       enum attr_type type = get_attr_type (insn);
12229       if (type == TYPE_LOAD || type == TYPE_STORE)
12230         mips_last_74k_agen_insn = type;
12231     }
12232 }
12233
12234 /* A TUNE_74K helper function.  The 74K AGEN pipeline likes multiple
12235    loads to be grouped together, and multiple stores to be grouped
12236    together.  Swap things around in the ready queue to make this happen.  */
12237
12238 static void
12239 mips_74k_agen_reorder (rtx *ready, int nready)
12240 {
12241   int i;
12242   int store_pos, load_pos;
12243
12244   store_pos = -1;
12245   load_pos = -1;
12246
12247   for (i = nready - 1; i >= 0; i--)
12248     {
12249       rtx insn = ready[i];
12250       if (USEFUL_INSN_P (insn))
12251         switch (get_attr_type (insn))
12252           {
12253           case TYPE_STORE:
12254             if (store_pos == -1)
12255               store_pos = i;
12256             break;
12257
12258           case TYPE_LOAD:
12259             if (load_pos == -1)
12260               load_pos = i;
12261             break;
12262
12263           default:
12264             break;
12265           }
12266     }
12267
12268   if (load_pos == -1 || store_pos == -1)
12269     return;
12270
12271   switch (mips_last_74k_agen_insn)
12272     {
12273     case TYPE_UNKNOWN:
12274       /* Prefer to schedule loads since they have a higher latency.  */
12275     case TYPE_LOAD:
12276       /* Swap loads to the front of the queue.  */
12277       mips_maybe_swap_ready (ready, load_pos, store_pos, 4);
12278       break;
12279     case TYPE_STORE:
12280       /* Swap stores to the front of the queue.  */
12281       mips_maybe_swap_ready (ready, store_pos, load_pos, 4);
12282       break;
12283     default:
12284       break;
12285     }
12286 }
12287 \f
12288 /* Implement TARGET_SCHED_INIT.  */
12289
12290 static void
12291 mips_sched_init (FILE *file ATTRIBUTE_UNUSED, int verbose ATTRIBUTE_UNUSED,
12292                  int max_ready ATTRIBUTE_UNUSED)
12293 {
12294   mips_macc_chains_last_hilo = 0;
12295   vr4130_last_insn = 0;
12296   mips_74k_agen_init (NULL_RTX);
12297
12298   /* When scheduling for Loongson2, branch instructions go to ALU1,
12299      therefore basic block is most likely to start with round-robin counter
12300      pointed to ALU2.  */
12301   mips_ls2.alu1_turn_p = false;
12302   mips_ls2.falu1_turn_p = true;
12303 }
12304
12305 /* Implement TARGET_SCHED_REORDER and TARGET_SCHED_REORDER2.  */
12306
12307 static int
12308 mips_sched_reorder (FILE *file ATTRIBUTE_UNUSED, int verbose ATTRIBUTE_UNUSED,
12309                     rtx *ready, int *nreadyp, int cycle ATTRIBUTE_UNUSED)
12310 {
12311   if (!reload_completed
12312       && TUNE_MACC_CHAINS
12313       && *nreadyp > 0)
12314     mips_macc_chains_reorder (ready, *nreadyp);
12315
12316   if (reload_completed
12317       && TUNE_MIPS4130
12318       && !TARGET_VR4130_ALIGN
12319       && *nreadyp > 1)
12320     vr4130_reorder (ready, *nreadyp);
12321
12322   if (TUNE_74K)
12323     mips_74k_agen_reorder (ready, *nreadyp);
12324
12325   return mips_issue_rate ();
12326 }
12327
12328 /* Update round-robin counters for ALU1/2 and FALU1/2.  */
12329
12330 static void
12331 mips_ls2_variable_issue (rtx insn)
12332 {
12333   if (mips_ls2.alu1_turn_p)
12334     {
12335       if (cpu_unit_reservation_p (curr_state, mips_ls2.alu1_core_unit_code))
12336         mips_ls2.alu1_turn_p = false;
12337     }
12338   else
12339     {
12340       if (cpu_unit_reservation_p (curr_state, mips_ls2.alu2_core_unit_code))
12341         mips_ls2.alu1_turn_p = true;
12342     }
12343
12344   if (mips_ls2.falu1_turn_p)
12345     {
12346       if (cpu_unit_reservation_p (curr_state, mips_ls2.falu1_core_unit_code))
12347         mips_ls2.falu1_turn_p = false;
12348     }
12349   else
12350     {
12351       if (cpu_unit_reservation_p (curr_state, mips_ls2.falu2_core_unit_code))
12352         mips_ls2.falu1_turn_p = true;
12353     }
12354
12355   if (recog_memoized (insn) >= 0)
12356     mips_ls2.cycle_has_multi_p |= (get_attr_type (insn) == TYPE_MULTI);
12357 }
12358
12359 /* Implement TARGET_SCHED_VARIABLE_ISSUE.  */
12360
12361 static int
12362 mips_variable_issue (FILE *file ATTRIBUTE_UNUSED, int verbose ATTRIBUTE_UNUSED,
12363                      rtx insn, int more)
12364 {
12365   /* Ignore USEs and CLOBBERs; don't count them against the issue rate.  */
12366   if (USEFUL_INSN_P (insn))
12367     {
12368       if (get_attr_type (insn) != TYPE_GHOST)
12369         more--;
12370       if (!reload_completed && TUNE_MACC_CHAINS)
12371         mips_macc_chains_record (insn);
12372       vr4130_last_insn = insn;
12373       if (TUNE_74K)
12374         mips_74k_agen_init (insn);
12375       else if (TUNE_LOONGSON_2EF)
12376         mips_ls2_variable_issue (insn);
12377     }
12378
12379   /* Instructions of type 'multi' should all be split before
12380      the second scheduling pass.  */
12381   gcc_assert (!reload_completed
12382               || recog_memoized (insn) < 0
12383               || get_attr_type (insn) != TYPE_MULTI);
12384
12385   return more;
12386 }
12387 \f
12388 /* Given that we have an rtx of the form (prefetch ... WRITE LOCALITY),
12389    return the first operand of the associated PREF or PREFX insn.  */
12390
12391 rtx
12392 mips_prefetch_cookie (rtx write, rtx locality)
12393 {
12394   /* store_streamed / load_streamed.  */
12395   if (INTVAL (locality) <= 0)
12396     return GEN_INT (INTVAL (write) + 4);
12397
12398   /* store / load.  */
12399   if (INTVAL (locality) <= 2)
12400     return write;
12401
12402   /* store_retained / load_retained.  */
12403   return GEN_INT (INTVAL (write) + 6);
12404 }
12405 \f
12406 /* Flags that indicate when a built-in function is available.
12407
12408    BUILTIN_AVAIL_NON_MIPS16
12409         The function is available on the current target, but only
12410         in non-MIPS16 mode.  */
12411 #define BUILTIN_AVAIL_NON_MIPS16 1
12412
12413 /* Declare an availability predicate for built-in functions that
12414    require non-MIPS16 mode and also require COND to be true.
12415    NAME is the main part of the predicate's name.  */
12416 #define AVAIL_NON_MIPS16(NAME, COND)                                    \
12417  static unsigned int                                                    \
12418  mips_builtin_avail_##NAME (void)                                       \
12419  {                                                                      \
12420    return (COND) ? BUILTIN_AVAIL_NON_MIPS16 : 0;                        \
12421  }
12422
12423 /* This structure describes a single built-in function.  */
12424 struct mips_builtin_description {
12425   /* The code of the main .md file instruction.  See mips_builtin_type
12426      for more information.  */
12427   enum insn_code icode;
12428
12429   /* The floating-point comparison code to use with ICODE, if any.  */
12430   enum mips_fp_condition cond;
12431
12432   /* The name of the built-in function.  */
12433   const char *name;
12434
12435   /* Specifies how the function should be expanded.  */
12436   enum mips_builtin_type builtin_type;
12437
12438   /* The function's prototype.  */
12439   enum mips_function_type function_type;
12440
12441   /* Whether the function is available.  */
12442   unsigned int (*avail) (void);
12443 };
12444
12445 AVAIL_NON_MIPS16 (paired_single, TARGET_PAIRED_SINGLE_FLOAT)
12446 AVAIL_NON_MIPS16 (sb1_paired_single, TARGET_SB1 && TARGET_PAIRED_SINGLE_FLOAT)
12447 AVAIL_NON_MIPS16 (mips3d, TARGET_MIPS3D)
12448 AVAIL_NON_MIPS16 (dsp, TARGET_DSP)
12449 AVAIL_NON_MIPS16 (dspr2, TARGET_DSPR2)
12450 AVAIL_NON_MIPS16 (dsp_32, !TARGET_64BIT && TARGET_DSP)
12451 AVAIL_NON_MIPS16 (dspr2_32, !TARGET_64BIT && TARGET_DSPR2)
12452 AVAIL_NON_MIPS16 (loongson, TARGET_LOONGSON_VECTORS)
12453 AVAIL_NON_MIPS16 (cache, TARGET_CACHE_BUILTIN)
12454
12455 /* Construct a mips_builtin_description from the given arguments.
12456
12457    INSN is the name of the associated instruction pattern, without the
12458    leading CODE_FOR_mips_.
12459
12460    CODE is the floating-point condition code associated with the
12461    function.  It can be 'f' if the field is not applicable.
12462
12463    NAME is the name of the function itself, without the leading
12464    "__builtin_mips_".
12465
12466    BUILTIN_TYPE and FUNCTION_TYPE are mips_builtin_description fields.
12467
12468    AVAIL is the name of the availability predicate, without the leading
12469    mips_builtin_avail_.  */
12470 #define MIPS_BUILTIN(INSN, COND, NAME, BUILTIN_TYPE,                    \
12471                      FUNCTION_TYPE, AVAIL)                              \
12472   { CODE_FOR_mips_ ## INSN, MIPS_FP_COND_ ## COND,                      \
12473     "__builtin_mips_" NAME, BUILTIN_TYPE, FUNCTION_TYPE,                \
12474     mips_builtin_avail_ ## AVAIL }
12475
12476 /* Define __builtin_mips_<INSN>, which is a MIPS_BUILTIN_DIRECT function
12477    mapped to instruction CODE_FOR_mips_<INSN>,  FUNCTION_TYPE and AVAIL
12478    are as for MIPS_BUILTIN.  */
12479 #define DIRECT_BUILTIN(INSN, FUNCTION_TYPE, AVAIL)                      \
12480   MIPS_BUILTIN (INSN, f, #INSN, MIPS_BUILTIN_DIRECT, FUNCTION_TYPE, AVAIL)
12481
12482 /* Define __builtin_mips_<INSN>_<COND>_{s,d} functions, both of which
12483    are subject to mips_builtin_avail_<AVAIL>.  */
12484 #define CMP_SCALAR_BUILTINS(INSN, COND, AVAIL)                          \
12485   MIPS_BUILTIN (INSN ## _cond_s, COND, #INSN "_" #COND "_s",            \
12486                 MIPS_BUILTIN_CMP_SINGLE, MIPS_INT_FTYPE_SF_SF, AVAIL),  \
12487   MIPS_BUILTIN (INSN ## _cond_d, COND, #INSN "_" #COND "_d",            \
12488                 MIPS_BUILTIN_CMP_SINGLE, MIPS_INT_FTYPE_DF_DF, AVAIL)
12489
12490 /* Define __builtin_mips_{any,all,upper,lower}_<INSN>_<COND>_ps.
12491    The lower and upper forms are subject to mips_builtin_avail_<AVAIL>
12492    while the any and all forms are subject to mips_builtin_avail_mips3d.  */
12493 #define CMP_PS_BUILTINS(INSN, COND, AVAIL)                              \
12494   MIPS_BUILTIN (INSN ## _cond_ps, COND, "any_" #INSN "_" #COND "_ps",   \
12495                 MIPS_BUILTIN_CMP_ANY, MIPS_INT_FTYPE_V2SF_V2SF,         \
12496                 mips3d),                                                \
12497   MIPS_BUILTIN (INSN ## _cond_ps, COND, "all_" #INSN "_" #COND "_ps",   \
12498                 MIPS_BUILTIN_CMP_ALL, MIPS_INT_FTYPE_V2SF_V2SF,         \
12499                 mips3d),                                                \
12500   MIPS_BUILTIN (INSN ## _cond_ps, COND, "lower_" #INSN "_" #COND "_ps", \
12501                 MIPS_BUILTIN_CMP_LOWER, MIPS_INT_FTYPE_V2SF_V2SF,       \
12502                 AVAIL),                                                 \
12503   MIPS_BUILTIN (INSN ## _cond_ps, COND, "upper_" #INSN "_" #COND "_ps", \
12504                 MIPS_BUILTIN_CMP_UPPER, MIPS_INT_FTYPE_V2SF_V2SF,       \
12505                 AVAIL)
12506
12507 /* Define __builtin_mips_{any,all}_<INSN>_<COND>_4s.  The functions
12508    are subject to mips_builtin_avail_mips3d.  */
12509 #define CMP_4S_BUILTINS(INSN, COND)                                     \
12510   MIPS_BUILTIN (INSN ## _cond_4s, COND, "any_" #INSN "_" #COND "_4s",   \
12511                 MIPS_BUILTIN_CMP_ANY,                                   \
12512                 MIPS_INT_FTYPE_V2SF_V2SF_V2SF_V2SF, mips3d),            \
12513   MIPS_BUILTIN (INSN ## _cond_4s, COND, "all_" #INSN "_" #COND "_4s",   \
12514                 MIPS_BUILTIN_CMP_ALL,                                   \
12515                 MIPS_INT_FTYPE_V2SF_V2SF_V2SF_V2SF, mips3d)
12516
12517 /* Define __builtin_mips_mov{t,f}_<INSN>_<COND>_ps.  The comparison
12518    instruction requires mips_builtin_avail_<AVAIL>.  */
12519 #define MOVTF_BUILTINS(INSN, COND, AVAIL)                               \
12520   MIPS_BUILTIN (INSN ## _cond_ps, COND, "movt_" #INSN "_" #COND "_ps",  \
12521                 MIPS_BUILTIN_MOVT, MIPS_V2SF_FTYPE_V2SF_V2SF_V2SF_V2SF, \
12522                 AVAIL),                                                 \
12523   MIPS_BUILTIN (INSN ## _cond_ps, COND, "movf_" #INSN "_" #COND "_ps",  \
12524                 MIPS_BUILTIN_MOVF, MIPS_V2SF_FTYPE_V2SF_V2SF_V2SF_V2SF, \
12525                 AVAIL)
12526
12527 /* Define all the built-in functions related to C.cond.fmt condition COND.  */
12528 #define CMP_BUILTINS(COND)                                              \
12529   MOVTF_BUILTINS (c, COND, paired_single),                              \
12530   MOVTF_BUILTINS (cabs, COND, mips3d),                                  \
12531   CMP_SCALAR_BUILTINS (cabs, COND, mips3d),                             \
12532   CMP_PS_BUILTINS (c, COND, paired_single),                             \
12533   CMP_PS_BUILTINS (cabs, COND, mips3d),                                 \
12534   CMP_4S_BUILTINS (c, COND),                                            \
12535   CMP_4S_BUILTINS (cabs, COND)
12536
12537 /* Define __builtin_mips_<INSN>, which is a MIPS_BUILTIN_DIRECT_NO_TARGET
12538    function mapped to instruction CODE_FOR_mips_<INSN>,  FUNCTION_TYPE
12539    and AVAIL are as for MIPS_BUILTIN.  */
12540 #define DIRECT_NO_TARGET_BUILTIN(INSN, FUNCTION_TYPE, AVAIL)            \
12541   MIPS_BUILTIN (INSN, f, #INSN, MIPS_BUILTIN_DIRECT_NO_TARGET,          \
12542                 FUNCTION_TYPE, AVAIL)
12543
12544 /* Define __builtin_mips_bposge<VALUE>.  <VALUE> is 32 for the MIPS32 DSP
12545    branch instruction.  AVAIL is as for MIPS_BUILTIN.  */
12546 #define BPOSGE_BUILTIN(VALUE, AVAIL)                                    \
12547   MIPS_BUILTIN (bposge, f, "bposge" #VALUE,                             \
12548                 MIPS_BUILTIN_BPOSGE ## VALUE, MIPS_SI_FTYPE_VOID, AVAIL)
12549
12550 /* Define a Loongson MIPS_BUILTIN_DIRECT function __builtin_loongson_<FN_NAME>
12551    for instruction CODE_FOR_loongson_<INSN>.  FUNCTION_TYPE is a
12552    builtin_description field.  */
12553 #define LOONGSON_BUILTIN_ALIAS(INSN, FN_NAME, FUNCTION_TYPE)            \
12554   { CODE_FOR_loongson_ ## INSN, MIPS_FP_COND_f,                         \
12555     "__builtin_loongson_" #FN_NAME, MIPS_BUILTIN_DIRECT,                \
12556     FUNCTION_TYPE, mips_builtin_avail_loongson }
12557
12558 /* Define a Loongson MIPS_BUILTIN_DIRECT function __builtin_loongson_<INSN>
12559    for instruction CODE_FOR_loongson_<INSN>.  FUNCTION_TYPE is a
12560    builtin_description field.  */
12561 #define LOONGSON_BUILTIN(INSN, FUNCTION_TYPE)                           \
12562   LOONGSON_BUILTIN_ALIAS (INSN, INSN, FUNCTION_TYPE)
12563
12564 /* Like LOONGSON_BUILTIN, but add _<SUFFIX> to the end of the function name.
12565    We use functions of this form when the same insn can be usefully applied
12566    to more than one datatype.  */
12567 #define LOONGSON_BUILTIN_SUFFIX(INSN, SUFFIX, FUNCTION_TYPE)            \
12568   LOONGSON_BUILTIN_ALIAS (INSN, INSN ## _ ## SUFFIX, FUNCTION_TYPE)
12569
12570 #define CODE_FOR_mips_sqrt_ps CODE_FOR_sqrtv2sf2
12571 #define CODE_FOR_mips_addq_ph CODE_FOR_addv2hi3
12572 #define CODE_FOR_mips_addu_qb CODE_FOR_addv4qi3
12573 #define CODE_FOR_mips_subq_ph CODE_FOR_subv2hi3
12574 #define CODE_FOR_mips_subu_qb CODE_FOR_subv4qi3
12575 #define CODE_FOR_mips_mul_ph CODE_FOR_mulv2hi3
12576
12577 #define CODE_FOR_loongson_packsswh CODE_FOR_vec_pack_ssat_v2si
12578 #define CODE_FOR_loongson_packsshb CODE_FOR_vec_pack_ssat_v4hi
12579 #define CODE_FOR_loongson_packushb CODE_FOR_vec_pack_usat_v4hi
12580 #define CODE_FOR_loongson_paddw CODE_FOR_addv2si3
12581 #define CODE_FOR_loongson_paddh CODE_FOR_addv4hi3
12582 #define CODE_FOR_loongson_paddb CODE_FOR_addv8qi3
12583 #define CODE_FOR_loongson_paddsh CODE_FOR_ssaddv4hi3
12584 #define CODE_FOR_loongson_paddsb CODE_FOR_ssaddv8qi3
12585 #define CODE_FOR_loongson_paddush CODE_FOR_usaddv4hi3
12586 #define CODE_FOR_loongson_paddusb CODE_FOR_usaddv8qi3
12587 #define CODE_FOR_loongson_pmaxsh CODE_FOR_smaxv4hi3
12588 #define CODE_FOR_loongson_pmaxub CODE_FOR_umaxv8qi3
12589 #define CODE_FOR_loongson_pminsh CODE_FOR_sminv4hi3
12590 #define CODE_FOR_loongson_pminub CODE_FOR_uminv8qi3
12591 #define CODE_FOR_loongson_pmulhuh CODE_FOR_umulv4hi3_highpart
12592 #define CODE_FOR_loongson_pmulhh CODE_FOR_smulv4hi3_highpart
12593 #define CODE_FOR_loongson_psubw CODE_FOR_subv2si3
12594 #define CODE_FOR_loongson_psubh CODE_FOR_subv4hi3
12595 #define CODE_FOR_loongson_psubb CODE_FOR_subv8qi3
12596 #define CODE_FOR_loongson_psubsh CODE_FOR_sssubv4hi3
12597 #define CODE_FOR_loongson_psubsb CODE_FOR_sssubv8qi3
12598 #define CODE_FOR_loongson_psubush CODE_FOR_ussubv4hi3
12599 #define CODE_FOR_loongson_psubusb CODE_FOR_ussubv8qi3
12600 #define CODE_FOR_loongson_punpckhbh CODE_FOR_vec_interleave_highv8qi
12601 #define CODE_FOR_loongson_punpckhhw CODE_FOR_vec_interleave_highv4hi
12602 #define CODE_FOR_loongson_punpckhwd CODE_FOR_vec_interleave_highv2si
12603 #define CODE_FOR_loongson_punpcklbh CODE_FOR_vec_interleave_lowv8qi
12604 #define CODE_FOR_loongson_punpcklhw CODE_FOR_vec_interleave_lowv4hi
12605 #define CODE_FOR_loongson_punpcklwd CODE_FOR_vec_interleave_lowv2si
12606
12607 static const struct mips_builtin_description mips_builtins[] = {
12608   DIRECT_BUILTIN (pll_ps, MIPS_V2SF_FTYPE_V2SF_V2SF, paired_single),
12609   DIRECT_BUILTIN (pul_ps, MIPS_V2SF_FTYPE_V2SF_V2SF, paired_single),
12610   DIRECT_BUILTIN (plu_ps, MIPS_V2SF_FTYPE_V2SF_V2SF, paired_single),
12611   DIRECT_BUILTIN (puu_ps, MIPS_V2SF_FTYPE_V2SF_V2SF, paired_single),
12612   DIRECT_BUILTIN (cvt_ps_s, MIPS_V2SF_FTYPE_SF_SF, paired_single),
12613   DIRECT_BUILTIN (cvt_s_pl, MIPS_SF_FTYPE_V2SF, paired_single),
12614   DIRECT_BUILTIN (cvt_s_pu, MIPS_SF_FTYPE_V2SF, paired_single),
12615   DIRECT_BUILTIN (abs_ps, MIPS_V2SF_FTYPE_V2SF, paired_single),
12616
12617   DIRECT_BUILTIN (alnv_ps, MIPS_V2SF_FTYPE_V2SF_V2SF_INT, paired_single),
12618   DIRECT_BUILTIN (addr_ps, MIPS_V2SF_FTYPE_V2SF_V2SF, mips3d),
12619   DIRECT_BUILTIN (mulr_ps, MIPS_V2SF_FTYPE_V2SF_V2SF, mips3d),
12620   DIRECT_BUILTIN (cvt_pw_ps, MIPS_V2SF_FTYPE_V2SF, mips3d),
12621   DIRECT_BUILTIN (cvt_ps_pw, MIPS_V2SF_FTYPE_V2SF, mips3d),
12622
12623   DIRECT_BUILTIN (recip1_s, MIPS_SF_FTYPE_SF, mips3d),
12624   DIRECT_BUILTIN (recip1_d, MIPS_DF_FTYPE_DF, mips3d),
12625   DIRECT_BUILTIN (recip1_ps, MIPS_V2SF_FTYPE_V2SF, mips3d),
12626   DIRECT_BUILTIN (recip2_s, MIPS_SF_FTYPE_SF_SF, mips3d),
12627   DIRECT_BUILTIN (recip2_d, MIPS_DF_FTYPE_DF_DF, mips3d),
12628   DIRECT_BUILTIN (recip2_ps, MIPS_V2SF_FTYPE_V2SF_V2SF, mips3d),
12629
12630   DIRECT_BUILTIN (rsqrt1_s, MIPS_SF_FTYPE_SF, mips3d),
12631   DIRECT_BUILTIN (rsqrt1_d, MIPS_DF_FTYPE_DF, mips3d),
12632   DIRECT_BUILTIN (rsqrt1_ps, MIPS_V2SF_FTYPE_V2SF, mips3d),
12633   DIRECT_BUILTIN (rsqrt2_s, MIPS_SF_FTYPE_SF_SF, mips3d),
12634   DIRECT_BUILTIN (rsqrt2_d, MIPS_DF_FTYPE_DF_DF, mips3d),
12635   DIRECT_BUILTIN (rsqrt2_ps, MIPS_V2SF_FTYPE_V2SF_V2SF, mips3d),
12636
12637   MIPS_FP_CONDITIONS (CMP_BUILTINS),
12638
12639   /* Built-in functions for the SB-1 processor.  */
12640   DIRECT_BUILTIN (sqrt_ps, MIPS_V2SF_FTYPE_V2SF, sb1_paired_single),
12641
12642   /* Built-in functions for the DSP ASE (32-bit and 64-bit).  */
12643   DIRECT_BUILTIN (addq_ph, MIPS_V2HI_FTYPE_V2HI_V2HI, dsp),
12644   DIRECT_BUILTIN (addq_s_ph, MIPS_V2HI_FTYPE_V2HI_V2HI, dsp),
12645   DIRECT_BUILTIN (addq_s_w, MIPS_SI_FTYPE_SI_SI, dsp),
12646   DIRECT_BUILTIN (addu_qb, MIPS_V4QI_FTYPE_V4QI_V4QI, dsp),
12647   DIRECT_BUILTIN (addu_s_qb, MIPS_V4QI_FTYPE_V4QI_V4QI, dsp),
12648   DIRECT_BUILTIN (subq_ph, MIPS_V2HI_FTYPE_V2HI_V2HI, dsp),
12649   DIRECT_BUILTIN (subq_s_ph, MIPS_V2HI_FTYPE_V2HI_V2HI, dsp),
12650   DIRECT_BUILTIN (subq_s_w, MIPS_SI_FTYPE_SI_SI, dsp),
12651   DIRECT_BUILTIN (subu_qb, MIPS_V4QI_FTYPE_V4QI_V4QI, dsp),
12652   DIRECT_BUILTIN (subu_s_qb, MIPS_V4QI_FTYPE_V4QI_V4QI, dsp),
12653   DIRECT_BUILTIN (addsc, MIPS_SI_FTYPE_SI_SI, dsp),
12654   DIRECT_BUILTIN (addwc, MIPS_SI_FTYPE_SI_SI, dsp),
12655   DIRECT_BUILTIN (modsub, MIPS_SI_FTYPE_SI_SI, dsp),
12656   DIRECT_BUILTIN (raddu_w_qb, MIPS_SI_FTYPE_V4QI, dsp),
12657   DIRECT_BUILTIN (absq_s_ph, MIPS_V2HI_FTYPE_V2HI, dsp),
12658   DIRECT_BUILTIN (absq_s_w, MIPS_SI_FTYPE_SI, dsp),
12659   DIRECT_BUILTIN (precrq_qb_ph, MIPS_V4QI_FTYPE_V2HI_V2HI, dsp),
12660   DIRECT_BUILTIN (precrq_ph_w, MIPS_V2HI_FTYPE_SI_SI, dsp),
12661   DIRECT_BUILTIN (precrq_rs_ph_w, MIPS_V2HI_FTYPE_SI_SI, dsp),
12662   DIRECT_BUILTIN (precrqu_s_qb_ph, MIPS_V4QI_FTYPE_V2HI_V2HI, dsp),
12663   DIRECT_BUILTIN (preceq_w_phl, MIPS_SI_FTYPE_V2HI, dsp),
12664   DIRECT_BUILTIN (preceq_w_phr, MIPS_SI_FTYPE_V2HI, dsp),
12665   DIRECT_BUILTIN (precequ_ph_qbl, MIPS_V2HI_FTYPE_V4QI, dsp),
12666   DIRECT_BUILTIN (precequ_ph_qbr, MIPS_V2HI_FTYPE_V4QI, dsp),
12667   DIRECT_BUILTIN (precequ_ph_qbla, MIPS_V2HI_FTYPE_V4QI, dsp),
12668   DIRECT_BUILTIN (precequ_ph_qbra, MIPS_V2HI_FTYPE_V4QI, dsp),
12669   DIRECT_BUILTIN (preceu_ph_qbl, MIPS_V2HI_FTYPE_V4QI, dsp),
12670   DIRECT_BUILTIN (preceu_ph_qbr, MIPS_V2HI_FTYPE_V4QI, dsp),
12671   DIRECT_BUILTIN (preceu_ph_qbla, MIPS_V2HI_FTYPE_V4QI, dsp),
12672   DIRECT_BUILTIN (preceu_ph_qbra, MIPS_V2HI_FTYPE_V4QI, dsp),
12673   DIRECT_BUILTIN (shll_qb, MIPS_V4QI_FTYPE_V4QI_SI, dsp),
12674   DIRECT_BUILTIN (shll_ph, MIPS_V2HI_FTYPE_V2HI_SI, dsp),
12675   DIRECT_BUILTIN (shll_s_ph, MIPS_V2HI_FTYPE_V2HI_SI, dsp),
12676   DIRECT_BUILTIN (shll_s_w, MIPS_SI_FTYPE_SI_SI, dsp),
12677   DIRECT_BUILTIN (shrl_qb, MIPS_V4QI_FTYPE_V4QI_SI, dsp),
12678   DIRECT_BUILTIN (shra_ph, MIPS_V2HI_FTYPE_V2HI_SI, dsp),
12679   DIRECT_BUILTIN (shra_r_ph, MIPS_V2HI_FTYPE_V2HI_SI, dsp),
12680   DIRECT_BUILTIN (shra_r_w, MIPS_SI_FTYPE_SI_SI, dsp),
12681   DIRECT_BUILTIN (muleu_s_ph_qbl, MIPS_V2HI_FTYPE_V4QI_V2HI, dsp),
12682   DIRECT_BUILTIN (muleu_s_ph_qbr, MIPS_V2HI_FTYPE_V4QI_V2HI, dsp),
12683   DIRECT_BUILTIN (mulq_rs_ph, MIPS_V2HI_FTYPE_V2HI_V2HI, dsp),
12684   DIRECT_BUILTIN (muleq_s_w_phl, MIPS_SI_FTYPE_V2HI_V2HI, dsp),
12685   DIRECT_BUILTIN (muleq_s_w_phr, MIPS_SI_FTYPE_V2HI_V2HI, dsp),
12686   DIRECT_BUILTIN (bitrev, MIPS_SI_FTYPE_SI, dsp),
12687   DIRECT_BUILTIN (insv, MIPS_SI_FTYPE_SI_SI, dsp),
12688   DIRECT_BUILTIN (repl_qb, MIPS_V4QI_FTYPE_SI, dsp),
12689   DIRECT_BUILTIN (repl_ph, MIPS_V2HI_FTYPE_SI, dsp),
12690   DIRECT_NO_TARGET_BUILTIN (cmpu_eq_qb, MIPS_VOID_FTYPE_V4QI_V4QI, dsp),
12691   DIRECT_NO_TARGET_BUILTIN (cmpu_lt_qb, MIPS_VOID_FTYPE_V4QI_V4QI, dsp),
12692   DIRECT_NO_TARGET_BUILTIN (cmpu_le_qb, MIPS_VOID_FTYPE_V4QI_V4QI, dsp),
12693   DIRECT_BUILTIN (cmpgu_eq_qb, MIPS_SI_FTYPE_V4QI_V4QI, dsp),
12694   DIRECT_BUILTIN (cmpgu_lt_qb, MIPS_SI_FTYPE_V4QI_V4QI, dsp),
12695   DIRECT_BUILTIN (cmpgu_le_qb, MIPS_SI_FTYPE_V4QI_V4QI, dsp),
12696   DIRECT_NO_TARGET_BUILTIN (cmp_eq_ph, MIPS_VOID_FTYPE_V2HI_V2HI, dsp),
12697   DIRECT_NO_TARGET_BUILTIN (cmp_lt_ph, MIPS_VOID_FTYPE_V2HI_V2HI, dsp),
12698   DIRECT_NO_TARGET_BUILTIN (cmp_le_ph, MIPS_VOID_FTYPE_V2HI_V2HI, dsp),
12699   DIRECT_BUILTIN (pick_qb, MIPS_V4QI_FTYPE_V4QI_V4QI, dsp),
12700   DIRECT_BUILTIN (pick_ph, MIPS_V2HI_FTYPE_V2HI_V2HI, dsp),
12701   DIRECT_BUILTIN (packrl_ph, MIPS_V2HI_FTYPE_V2HI_V2HI, dsp),
12702   DIRECT_NO_TARGET_BUILTIN (wrdsp, MIPS_VOID_FTYPE_SI_SI, dsp),
12703   DIRECT_BUILTIN (rddsp, MIPS_SI_FTYPE_SI, dsp),
12704   DIRECT_BUILTIN (lbux, MIPS_SI_FTYPE_POINTER_SI, dsp),
12705   DIRECT_BUILTIN (lhx, MIPS_SI_FTYPE_POINTER_SI, dsp),
12706   DIRECT_BUILTIN (lwx, MIPS_SI_FTYPE_POINTER_SI, dsp),
12707   BPOSGE_BUILTIN (32, dsp),
12708
12709   /* The following are for the MIPS DSP ASE REV 2 (32-bit and 64-bit).  */
12710   DIRECT_BUILTIN (absq_s_qb, MIPS_V4QI_FTYPE_V4QI, dspr2),
12711   DIRECT_BUILTIN (addu_ph, MIPS_V2HI_FTYPE_V2HI_V2HI, dspr2),
12712   DIRECT_BUILTIN (addu_s_ph, MIPS_V2HI_FTYPE_V2HI_V2HI, dspr2),
12713   DIRECT_BUILTIN (adduh_qb, MIPS_V4QI_FTYPE_V4QI_V4QI, dspr2),
12714   DIRECT_BUILTIN (adduh_r_qb, MIPS_V4QI_FTYPE_V4QI_V4QI, dspr2),
12715   DIRECT_BUILTIN (append, MIPS_SI_FTYPE_SI_SI_SI, dspr2),
12716   DIRECT_BUILTIN (balign, MIPS_SI_FTYPE_SI_SI_SI, dspr2),
12717   DIRECT_BUILTIN (cmpgdu_eq_qb, MIPS_SI_FTYPE_V4QI_V4QI, dspr2),
12718   DIRECT_BUILTIN (cmpgdu_lt_qb, MIPS_SI_FTYPE_V4QI_V4QI, dspr2),
12719   DIRECT_BUILTIN (cmpgdu_le_qb, MIPS_SI_FTYPE_V4QI_V4QI, dspr2),
12720   DIRECT_BUILTIN (mul_ph, MIPS_V2HI_FTYPE_V2HI_V2HI, dspr2),
12721   DIRECT_BUILTIN (mul_s_ph, MIPS_V2HI_FTYPE_V2HI_V2HI, dspr2),
12722   DIRECT_BUILTIN (mulq_rs_w, MIPS_SI_FTYPE_SI_SI, dspr2),
12723   DIRECT_BUILTIN (mulq_s_ph, MIPS_V2HI_FTYPE_V2HI_V2HI, dspr2),
12724   DIRECT_BUILTIN (mulq_s_w, MIPS_SI_FTYPE_SI_SI, dspr2),
12725   DIRECT_BUILTIN (precr_qb_ph, MIPS_V4QI_FTYPE_V2HI_V2HI, dspr2),
12726   DIRECT_BUILTIN (precr_sra_ph_w, MIPS_V2HI_FTYPE_SI_SI_SI, dspr2),
12727   DIRECT_BUILTIN (precr_sra_r_ph_w, MIPS_V2HI_FTYPE_SI_SI_SI, dspr2),
12728   DIRECT_BUILTIN (prepend, MIPS_SI_FTYPE_SI_SI_SI, dspr2),
12729   DIRECT_BUILTIN (shra_qb, MIPS_V4QI_FTYPE_V4QI_SI, dspr2),
12730   DIRECT_BUILTIN (shra_r_qb, MIPS_V4QI_FTYPE_V4QI_SI, dspr2),
12731   DIRECT_BUILTIN (shrl_ph, MIPS_V2HI_FTYPE_V2HI_SI, dspr2),
12732   DIRECT_BUILTIN (subu_ph, MIPS_V2HI_FTYPE_V2HI_V2HI, dspr2),
12733   DIRECT_BUILTIN (subu_s_ph, MIPS_V2HI_FTYPE_V2HI_V2HI, dspr2),
12734   DIRECT_BUILTIN (subuh_qb, MIPS_V4QI_FTYPE_V4QI_V4QI, dspr2),
12735   DIRECT_BUILTIN (subuh_r_qb, MIPS_V4QI_FTYPE_V4QI_V4QI, dspr2),
12736   DIRECT_BUILTIN (addqh_ph, MIPS_V2HI_FTYPE_V2HI_V2HI, dspr2),
12737   DIRECT_BUILTIN (addqh_r_ph, MIPS_V2HI_FTYPE_V2HI_V2HI, dspr2),
12738   DIRECT_BUILTIN (addqh_w, MIPS_SI_FTYPE_SI_SI, dspr2),
12739   DIRECT_BUILTIN (addqh_r_w, MIPS_SI_FTYPE_SI_SI, dspr2),
12740   DIRECT_BUILTIN (subqh_ph, MIPS_V2HI_FTYPE_V2HI_V2HI, dspr2),
12741   DIRECT_BUILTIN (subqh_r_ph, MIPS_V2HI_FTYPE_V2HI_V2HI, dspr2),
12742   DIRECT_BUILTIN (subqh_w, MIPS_SI_FTYPE_SI_SI, dspr2),
12743   DIRECT_BUILTIN (subqh_r_w, MIPS_SI_FTYPE_SI_SI, dspr2),
12744
12745   /* Built-in functions for the DSP ASE (32-bit only).  */
12746   DIRECT_BUILTIN (dpau_h_qbl, MIPS_DI_FTYPE_DI_V4QI_V4QI, dsp_32),
12747   DIRECT_BUILTIN (dpau_h_qbr, MIPS_DI_FTYPE_DI_V4QI_V4QI, dsp_32),
12748   DIRECT_BUILTIN (dpsu_h_qbl, MIPS_DI_FTYPE_DI_V4QI_V4QI, dsp_32),
12749   DIRECT_BUILTIN (dpsu_h_qbr, MIPS_DI_FTYPE_DI_V4QI_V4QI, dsp_32),
12750   DIRECT_BUILTIN (dpaq_s_w_ph, MIPS_DI_FTYPE_DI_V2HI_V2HI, dsp_32),
12751   DIRECT_BUILTIN (dpsq_s_w_ph, MIPS_DI_FTYPE_DI_V2HI_V2HI, dsp_32),
12752   DIRECT_BUILTIN (mulsaq_s_w_ph, MIPS_DI_FTYPE_DI_V2HI_V2HI, dsp_32),
12753   DIRECT_BUILTIN (dpaq_sa_l_w, MIPS_DI_FTYPE_DI_SI_SI, dsp_32),
12754   DIRECT_BUILTIN (dpsq_sa_l_w, MIPS_DI_FTYPE_DI_SI_SI, dsp_32),
12755   DIRECT_BUILTIN (maq_s_w_phl, MIPS_DI_FTYPE_DI_V2HI_V2HI, dsp_32),
12756   DIRECT_BUILTIN (maq_s_w_phr, MIPS_DI_FTYPE_DI_V2HI_V2HI, dsp_32),
12757   DIRECT_BUILTIN (maq_sa_w_phl, MIPS_DI_FTYPE_DI_V2HI_V2HI, dsp_32),
12758   DIRECT_BUILTIN (maq_sa_w_phr, MIPS_DI_FTYPE_DI_V2HI_V2HI, dsp_32),
12759   DIRECT_BUILTIN (extr_w, MIPS_SI_FTYPE_DI_SI, dsp_32),
12760   DIRECT_BUILTIN (extr_r_w, MIPS_SI_FTYPE_DI_SI, dsp_32),
12761   DIRECT_BUILTIN (extr_rs_w, MIPS_SI_FTYPE_DI_SI, dsp_32),
12762   DIRECT_BUILTIN (extr_s_h, MIPS_SI_FTYPE_DI_SI, dsp_32),
12763   DIRECT_BUILTIN (extp, MIPS_SI_FTYPE_DI_SI, dsp_32),
12764   DIRECT_BUILTIN (extpdp, MIPS_SI_FTYPE_DI_SI, dsp_32),
12765   DIRECT_BUILTIN (shilo, MIPS_DI_FTYPE_DI_SI, dsp_32),
12766   DIRECT_BUILTIN (mthlip, MIPS_DI_FTYPE_DI_SI, dsp_32),
12767
12768   /* The following are for the MIPS DSP ASE REV 2 (32-bit only).  */
12769   DIRECT_BUILTIN (dpa_w_ph, MIPS_DI_FTYPE_DI_V2HI_V2HI, dspr2_32),
12770   DIRECT_BUILTIN (dps_w_ph, MIPS_DI_FTYPE_DI_V2HI_V2HI, dspr2_32),
12771   DIRECT_BUILTIN (madd, MIPS_DI_FTYPE_DI_SI_SI, dspr2_32),
12772   DIRECT_BUILTIN (maddu, MIPS_DI_FTYPE_DI_USI_USI, dspr2_32),
12773   DIRECT_BUILTIN (msub, MIPS_DI_FTYPE_DI_SI_SI, dspr2_32),
12774   DIRECT_BUILTIN (msubu, MIPS_DI_FTYPE_DI_USI_USI, dspr2_32),
12775   DIRECT_BUILTIN (mulsa_w_ph, MIPS_DI_FTYPE_DI_V2HI_V2HI, dspr2_32),
12776   DIRECT_BUILTIN (mult, MIPS_DI_FTYPE_SI_SI, dspr2_32),
12777   DIRECT_BUILTIN (multu, MIPS_DI_FTYPE_USI_USI, dspr2_32),
12778   DIRECT_BUILTIN (dpax_w_ph, MIPS_DI_FTYPE_DI_V2HI_V2HI, dspr2_32),
12779   DIRECT_BUILTIN (dpsx_w_ph, MIPS_DI_FTYPE_DI_V2HI_V2HI, dspr2_32),
12780   DIRECT_BUILTIN (dpaqx_s_w_ph, MIPS_DI_FTYPE_DI_V2HI_V2HI, dspr2_32),
12781   DIRECT_BUILTIN (dpaqx_sa_w_ph, MIPS_DI_FTYPE_DI_V2HI_V2HI, dspr2_32),
12782   DIRECT_BUILTIN (dpsqx_s_w_ph, MIPS_DI_FTYPE_DI_V2HI_V2HI, dspr2_32),
12783   DIRECT_BUILTIN (dpsqx_sa_w_ph, MIPS_DI_FTYPE_DI_V2HI_V2HI, dspr2_32),
12784
12785   /* Builtin functions for ST Microelectronics Loongson-2E/2F cores.  */
12786   LOONGSON_BUILTIN (packsswh, MIPS_V4HI_FTYPE_V2SI_V2SI),
12787   LOONGSON_BUILTIN (packsshb, MIPS_V8QI_FTYPE_V4HI_V4HI),
12788   LOONGSON_BUILTIN (packushb, MIPS_UV8QI_FTYPE_UV4HI_UV4HI),
12789   LOONGSON_BUILTIN_SUFFIX (paddw, u, MIPS_UV2SI_FTYPE_UV2SI_UV2SI),
12790   LOONGSON_BUILTIN_SUFFIX (paddh, u, MIPS_UV4HI_FTYPE_UV4HI_UV4HI),
12791   LOONGSON_BUILTIN_SUFFIX (paddb, u, MIPS_UV8QI_FTYPE_UV8QI_UV8QI),
12792   LOONGSON_BUILTIN_SUFFIX (paddw, s, MIPS_V2SI_FTYPE_V2SI_V2SI),
12793   LOONGSON_BUILTIN_SUFFIX (paddh, s, MIPS_V4HI_FTYPE_V4HI_V4HI),
12794   LOONGSON_BUILTIN_SUFFIX (paddb, s, MIPS_V8QI_FTYPE_V8QI_V8QI),
12795   LOONGSON_BUILTIN_SUFFIX (paddd, u, MIPS_UDI_FTYPE_UDI_UDI),
12796   LOONGSON_BUILTIN_SUFFIX (paddd, s, MIPS_DI_FTYPE_DI_DI),
12797   LOONGSON_BUILTIN (paddsh, MIPS_V4HI_FTYPE_V4HI_V4HI),
12798   LOONGSON_BUILTIN (paddsb, MIPS_V8QI_FTYPE_V8QI_V8QI),
12799   LOONGSON_BUILTIN (paddush, MIPS_UV4HI_FTYPE_UV4HI_UV4HI),
12800   LOONGSON_BUILTIN (paddusb, MIPS_UV8QI_FTYPE_UV8QI_UV8QI),
12801   LOONGSON_BUILTIN_ALIAS (pandn_d, pandn_ud, MIPS_UDI_FTYPE_UDI_UDI),
12802   LOONGSON_BUILTIN_ALIAS (pandn_w, pandn_uw, MIPS_UV2SI_FTYPE_UV2SI_UV2SI),
12803   LOONGSON_BUILTIN_ALIAS (pandn_h, pandn_uh, MIPS_UV4HI_FTYPE_UV4HI_UV4HI),
12804   LOONGSON_BUILTIN_ALIAS (pandn_b, pandn_ub, MIPS_UV8QI_FTYPE_UV8QI_UV8QI),
12805   LOONGSON_BUILTIN_ALIAS (pandn_d, pandn_sd, MIPS_DI_FTYPE_DI_DI),
12806   LOONGSON_BUILTIN_ALIAS (pandn_w, pandn_sw, MIPS_V2SI_FTYPE_V2SI_V2SI),
12807   LOONGSON_BUILTIN_ALIAS (pandn_h, pandn_sh, MIPS_V4HI_FTYPE_V4HI_V4HI),
12808   LOONGSON_BUILTIN_ALIAS (pandn_b, pandn_sb, MIPS_V8QI_FTYPE_V8QI_V8QI),
12809   LOONGSON_BUILTIN (pavgh, MIPS_UV4HI_FTYPE_UV4HI_UV4HI),
12810   LOONGSON_BUILTIN (pavgb, MIPS_UV8QI_FTYPE_UV8QI_UV8QI),
12811   LOONGSON_BUILTIN_SUFFIX (pcmpeqw, u, MIPS_UV2SI_FTYPE_UV2SI_UV2SI),
12812   LOONGSON_BUILTIN_SUFFIX (pcmpeqh, u, MIPS_UV4HI_FTYPE_UV4HI_UV4HI),
12813   LOONGSON_BUILTIN_SUFFIX (pcmpeqb, u, MIPS_UV8QI_FTYPE_UV8QI_UV8QI),
12814   LOONGSON_BUILTIN_SUFFIX (pcmpeqw, s, MIPS_V2SI_FTYPE_V2SI_V2SI),
12815   LOONGSON_BUILTIN_SUFFIX (pcmpeqh, s, MIPS_V4HI_FTYPE_V4HI_V4HI),
12816   LOONGSON_BUILTIN_SUFFIX (pcmpeqb, s, MIPS_V8QI_FTYPE_V8QI_V8QI),
12817   LOONGSON_BUILTIN_SUFFIX (pcmpgtw, u, MIPS_UV2SI_FTYPE_UV2SI_UV2SI),
12818   LOONGSON_BUILTIN_SUFFIX (pcmpgth, u, MIPS_UV4HI_FTYPE_UV4HI_UV4HI),
12819   LOONGSON_BUILTIN_SUFFIX (pcmpgtb, u, MIPS_UV8QI_FTYPE_UV8QI_UV8QI),
12820   LOONGSON_BUILTIN_SUFFIX (pcmpgtw, s, MIPS_V2SI_FTYPE_V2SI_V2SI),
12821   LOONGSON_BUILTIN_SUFFIX (pcmpgth, s, MIPS_V4HI_FTYPE_V4HI_V4HI),
12822   LOONGSON_BUILTIN_SUFFIX (pcmpgtb, s, MIPS_V8QI_FTYPE_V8QI_V8QI),
12823   LOONGSON_BUILTIN_SUFFIX (pextrh, u, MIPS_UV4HI_FTYPE_UV4HI_USI),
12824   LOONGSON_BUILTIN_SUFFIX (pextrh, s, MIPS_V4HI_FTYPE_V4HI_USI),
12825   LOONGSON_BUILTIN_SUFFIX (pinsrh_0, u, MIPS_UV4HI_FTYPE_UV4HI_UV4HI),
12826   LOONGSON_BUILTIN_SUFFIX (pinsrh_1, u, MIPS_UV4HI_FTYPE_UV4HI_UV4HI),
12827   LOONGSON_BUILTIN_SUFFIX (pinsrh_2, u, MIPS_UV4HI_FTYPE_UV4HI_UV4HI),
12828   LOONGSON_BUILTIN_SUFFIX (pinsrh_3, u, MIPS_UV4HI_FTYPE_UV4HI_UV4HI),
12829   LOONGSON_BUILTIN_SUFFIX (pinsrh_0, s, MIPS_V4HI_FTYPE_V4HI_V4HI),
12830   LOONGSON_BUILTIN_SUFFIX (pinsrh_1, s, MIPS_V4HI_FTYPE_V4HI_V4HI),
12831   LOONGSON_BUILTIN_SUFFIX (pinsrh_2, s, MIPS_V4HI_FTYPE_V4HI_V4HI),
12832   LOONGSON_BUILTIN_SUFFIX (pinsrh_3, s, MIPS_V4HI_FTYPE_V4HI_V4HI),
12833   LOONGSON_BUILTIN (pmaddhw, MIPS_V2SI_FTYPE_V4HI_V4HI),
12834   LOONGSON_BUILTIN (pmaxsh, MIPS_V4HI_FTYPE_V4HI_V4HI),
12835   LOONGSON_BUILTIN (pmaxub, MIPS_UV8QI_FTYPE_UV8QI_UV8QI),
12836   LOONGSON_BUILTIN (pminsh, MIPS_V4HI_FTYPE_V4HI_V4HI),
12837   LOONGSON_BUILTIN (pminub, MIPS_UV8QI_FTYPE_UV8QI_UV8QI),
12838   LOONGSON_BUILTIN_SUFFIX (pmovmskb, u, MIPS_UV8QI_FTYPE_UV8QI),
12839   LOONGSON_BUILTIN_SUFFIX (pmovmskb, s, MIPS_V8QI_FTYPE_V8QI),
12840   LOONGSON_BUILTIN (pmulhuh, MIPS_UV4HI_FTYPE_UV4HI_UV4HI),
12841   LOONGSON_BUILTIN (pmulhh, MIPS_V4HI_FTYPE_V4HI_V4HI),
12842   LOONGSON_BUILTIN (pmullh, MIPS_V4HI_FTYPE_V4HI_V4HI),
12843   LOONGSON_BUILTIN (pmuluw, MIPS_UDI_FTYPE_UV2SI_UV2SI),
12844   LOONGSON_BUILTIN (pasubub, MIPS_UV8QI_FTYPE_UV8QI_UV8QI),
12845   LOONGSON_BUILTIN (biadd, MIPS_UV4HI_FTYPE_UV8QI),
12846   LOONGSON_BUILTIN (psadbh, MIPS_UV4HI_FTYPE_UV8QI_UV8QI),
12847   LOONGSON_BUILTIN_SUFFIX (pshufh, u, MIPS_UV4HI_FTYPE_UV4HI_UV4HI_UQI),
12848   LOONGSON_BUILTIN_SUFFIX (pshufh, s, MIPS_V4HI_FTYPE_V4HI_V4HI_UQI),
12849   LOONGSON_BUILTIN_SUFFIX (psllh, u, MIPS_UV4HI_FTYPE_UV4HI_UQI),
12850   LOONGSON_BUILTIN_SUFFIX (psllh, s, MIPS_V4HI_FTYPE_V4HI_UQI),
12851   LOONGSON_BUILTIN_SUFFIX (psllw, u, MIPS_UV2SI_FTYPE_UV2SI_UQI),
12852   LOONGSON_BUILTIN_SUFFIX (psllw, s, MIPS_V2SI_FTYPE_V2SI_UQI),
12853   LOONGSON_BUILTIN_SUFFIX (psrah, u, MIPS_UV4HI_FTYPE_UV4HI_UQI),
12854   LOONGSON_BUILTIN_SUFFIX (psrah, s, MIPS_V4HI_FTYPE_V4HI_UQI),
12855   LOONGSON_BUILTIN_SUFFIX (psraw, u, MIPS_UV2SI_FTYPE_UV2SI_UQI),
12856   LOONGSON_BUILTIN_SUFFIX (psraw, s, MIPS_V2SI_FTYPE_V2SI_UQI),
12857   LOONGSON_BUILTIN_SUFFIX (psrlh, u, MIPS_UV4HI_FTYPE_UV4HI_UQI),
12858   LOONGSON_BUILTIN_SUFFIX (psrlh, s, MIPS_V4HI_FTYPE_V4HI_UQI),
12859   LOONGSON_BUILTIN_SUFFIX (psrlw, u, MIPS_UV2SI_FTYPE_UV2SI_UQI),
12860   LOONGSON_BUILTIN_SUFFIX (psrlw, s, MIPS_V2SI_FTYPE_V2SI_UQI),
12861   LOONGSON_BUILTIN_SUFFIX (psubw, u, MIPS_UV2SI_FTYPE_UV2SI_UV2SI),
12862   LOONGSON_BUILTIN_SUFFIX (psubh, u, MIPS_UV4HI_FTYPE_UV4HI_UV4HI),
12863   LOONGSON_BUILTIN_SUFFIX (psubb, u, MIPS_UV8QI_FTYPE_UV8QI_UV8QI),
12864   LOONGSON_BUILTIN_SUFFIX (psubw, s, MIPS_V2SI_FTYPE_V2SI_V2SI),
12865   LOONGSON_BUILTIN_SUFFIX (psubh, s, MIPS_V4HI_FTYPE_V4HI_V4HI),
12866   LOONGSON_BUILTIN_SUFFIX (psubb, s, MIPS_V8QI_FTYPE_V8QI_V8QI),
12867   LOONGSON_BUILTIN_SUFFIX (psubd, u, MIPS_UDI_FTYPE_UDI_UDI),
12868   LOONGSON_BUILTIN_SUFFIX (psubd, s, MIPS_DI_FTYPE_DI_DI),
12869   LOONGSON_BUILTIN (psubsh, MIPS_V4HI_FTYPE_V4HI_V4HI),
12870   LOONGSON_BUILTIN (psubsb, MIPS_V8QI_FTYPE_V8QI_V8QI),
12871   LOONGSON_BUILTIN (psubush, MIPS_UV4HI_FTYPE_UV4HI_UV4HI),
12872   LOONGSON_BUILTIN (psubusb, MIPS_UV8QI_FTYPE_UV8QI_UV8QI),
12873   LOONGSON_BUILTIN_SUFFIX (punpckhbh, u, MIPS_UV8QI_FTYPE_UV8QI_UV8QI),
12874   LOONGSON_BUILTIN_SUFFIX (punpckhhw, u, MIPS_UV4HI_FTYPE_UV4HI_UV4HI),
12875   LOONGSON_BUILTIN_SUFFIX (punpckhwd, u, MIPS_UV2SI_FTYPE_UV2SI_UV2SI),
12876   LOONGSON_BUILTIN_SUFFIX (punpckhbh, s, MIPS_V8QI_FTYPE_V8QI_V8QI),
12877   LOONGSON_BUILTIN_SUFFIX (punpckhhw, s, MIPS_V4HI_FTYPE_V4HI_V4HI),
12878   LOONGSON_BUILTIN_SUFFIX (punpckhwd, s, MIPS_V2SI_FTYPE_V2SI_V2SI),
12879   LOONGSON_BUILTIN_SUFFIX (punpcklbh, u, MIPS_UV8QI_FTYPE_UV8QI_UV8QI),
12880   LOONGSON_BUILTIN_SUFFIX (punpcklhw, u, MIPS_UV4HI_FTYPE_UV4HI_UV4HI),
12881   LOONGSON_BUILTIN_SUFFIX (punpcklwd, u, MIPS_UV2SI_FTYPE_UV2SI_UV2SI),
12882   LOONGSON_BUILTIN_SUFFIX (punpcklbh, s, MIPS_V8QI_FTYPE_V8QI_V8QI),
12883   LOONGSON_BUILTIN_SUFFIX (punpcklhw, s, MIPS_V4HI_FTYPE_V4HI_V4HI),
12884   LOONGSON_BUILTIN_SUFFIX (punpcklwd, s, MIPS_V2SI_FTYPE_V2SI_V2SI),
12885
12886   /* Sundry other built-in functions.  */
12887   DIRECT_NO_TARGET_BUILTIN (cache, MIPS_VOID_FTYPE_SI_CVPOINTER, cache)
12888 };
12889
12890 /* MODE is a vector mode whose elements have type TYPE.  Return the type
12891    of the vector itself.  */
12892
12893 static tree
12894 mips_builtin_vector_type (tree type, enum machine_mode mode)
12895 {
12896   static tree types[2 * (int) MAX_MACHINE_MODE];
12897   int mode_index;
12898
12899   mode_index = (int) mode;
12900
12901   if (TREE_CODE (type) == INTEGER_TYPE && TYPE_UNSIGNED (type))
12902     mode_index += MAX_MACHINE_MODE;
12903
12904   if (types[mode_index] == NULL_TREE)
12905     types[mode_index] = build_vector_type_for_mode (type, mode);
12906   return types[mode_index];
12907 }
12908
12909 /* Return a type for 'const volatile void *'.  */
12910
12911 static tree
12912 mips_build_cvpointer_type (void)
12913 {
12914   static tree cache;
12915
12916   if (cache == NULL_TREE)
12917     cache = build_pointer_type (build_qualified_type
12918                                 (void_type_node,
12919                                  TYPE_QUAL_CONST | TYPE_QUAL_VOLATILE));
12920   return cache;
12921 }
12922
12923 /* Source-level argument types.  */
12924 #define MIPS_ATYPE_VOID void_type_node
12925 #define MIPS_ATYPE_INT integer_type_node
12926 #define MIPS_ATYPE_POINTER ptr_type_node
12927 #define MIPS_ATYPE_CVPOINTER mips_build_cvpointer_type ()
12928
12929 /* Standard mode-based argument types.  */
12930 #define MIPS_ATYPE_UQI unsigned_intQI_type_node
12931 #define MIPS_ATYPE_SI intSI_type_node
12932 #define MIPS_ATYPE_USI unsigned_intSI_type_node
12933 #define MIPS_ATYPE_DI intDI_type_node
12934 #define MIPS_ATYPE_UDI unsigned_intDI_type_node
12935 #define MIPS_ATYPE_SF float_type_node
12936 #define MIPS_ATYPE_DF double_type_node
12937
12938 /* Vector argument types.  */
12939 #define MIPS_ATYPE_V2SF mips_builtin_vector_type (float_type_node, V2SFmode)
12940 #define MIPS_ATYPE_V2HI mips_builtin_vector_type (intHI_type_node, V2HImode)
12941 #define MIPS_ATYPE_V2SI mips_builtin_vector_type (intSI_type_node, V2SImode)
12942 #define MIPS_ATYPE_V4QI mips_builtin_vector_type (intQI_type_node, V4QImode)
12943 #define MIPS_ATYPE_V4HI mips_builtin_vector_type (intHI_type_node, V4HImode)
12944 #define MIPS_ATYPE_V8QI mips_builtin_vector_type (intQI_type_node, V8QImode)
12945 #define MIPS_ATYPE_UV2SI                                        \
12946   mips_builtin_vector_type (unsigned_intSI_type_node, V2SImode)
12947 #define MIPS_ATYPE_UV4HI                                        \
12948   mips_builtin_vector_type (unsigned_intHI_type_node, V4HImode)
12949 #define MIPS_ATYPE_UV8QI                                        \
12950   mips_builtin_vector_type (unsigned_intQI_type_node, V8QImode)
12951
12952 /* MIPS_FTYPE_ATYPESN takes N MIPS_FTYPES-like type codes and lists
12953    their associated MIPS_ATYPEs.  */
12954 #define MIPS_FTYPE_ATYPES1(A, B) \
12955   MIPS_ATYPE_##A, MIPS_ATYPE_##B
12956
12957 #define MIPS_FTYPE_ATYPES2(A, B, C) \
12958   MIPS_ATYPE_##A, MIPS_ATYPE_##B, MIPS_ATYPE_##C
12959
12960 #define MIPS_FTYPE_ATYPES3(A, B, C, D) \
12961   MIPS_ATYPE_##A, MIPS_ATYPE_##B, MIPS_ATYPE_##C, MIPS_ATYPE_##D
12962
12963 #define MIPS_FTYPE_ATYPES4(A, B, C, D, E) \
12964   MIPS_ATYPE_##A, MIPS_ATYPE_##B, MIPS_ATYPE_##C, MIPS_ATYPE_##D, \
12965   MIPS_ATYPE_##E
12966
12967 /* Return the function type associated with function prototype TYPE.  */
12968
12969 static tree
12970 mips_build_function_type (enum mips_function_type type)
12971 {
12972   static tree types[(int) MIPS_MAX_FTYPE_MAX];
12973
12974   if (types[(int) type] == NULL_TREE)
12975     switch (type)
12976       {
12977 #define DEF_MIPS_FTYPE(NUM, ARGS)                                       \
12978   case MIPS_FTYPE_NAME##NUM ARGS:                                       \
12979     types[(int) type]                                                   \
12980       = build_function_type_list (MIPS_FTYPE_ATYPES##NUM ARGS,          \
12981                                   NULL_TREE);                           \
12982     break;
12983 #include "config/mips/mips-ftypes.def"
12984 #undef DEF_MIPS_FTYPE
12985       default:
12986         gcc_unreachable ();
12987       }
12988
12989   return types[(int) type];
12990 }
12991
12992 /* Implement TARGET_INIT_BUILTINS.  */
12993
12994 static void
12995 mips_init_builtins (void)
12996 {
12997   const struct mips_builtin_description *d;
12998   unsigned int i;
12999
13000   /* Iterate through all of the bdesc arrays, initializing all of the
13001      builtin functions.  */
13002   for (i = 0; i < ARRAY_SIZE (mips_builtins); i++)
13003     {
13004       d = &mips_builtins[i];
13005       if (d->avail ())
13006         add_builtin_function (d->name,
13007                               mips_build_function_type (d->function_type),
13008                               i, BUILT_IN_MD, NULL, NULL);
13009     }
13010 }
13011
13012 /* Take argument ARGNO from EXP's argument list and convert it into a
13013    form suitable for input operand OPNO of instruction ICODE.  Return the
13014    value.  */
13015
13016 static rtx
13017 mips_prepare_builtin_arg (enum insn_code icode,
13018                           unsigned int opno, tree exp, unsigned int argno)
13019 {
13020   tree arg;
13021   rtx value;
13022   enum machine_mode mode;
13023
13024   arg = CALL_EXPR_ARG (exp, argno);
13025   value = expand_normal (arg);
13026   mode = insn_data[icode].operand[opno].mode;
13027   if (!insn_data[icode].operand[opno].predicate (value, mode))
13028     {
13029       /* We need to get the mode from ARG for two reasons:
13030
13031            - to cope with address operands, where MODE is the mode of the
13032              memory, rather than of VALUE itself.
13033
13034            - to cope with special predicates like pmode_register_operand,
13035              where MODE is VOIDmode.  */
13036       value = copy_to_mode_reg (TYPE_MODE (TREE_TYPE (arg)), value);
13037
13038       /* Check the predicate again.  */
13039       if (!insn_data[icode].operand[opno].predicate (value, mode))
13040         {
13041           error ("invalid argument to built-in function");
13042           return const0_rtx;
13043         }
13044     }
13045
13046   return value;
13047 }
13048
13049 /* Return an rtx suitable for output operand OP of instruction ICODE.
13050    If TARGET is non-null, try to use it where possible.  */
13051
13052 static rtx
13053 mips_prepare_builtin_target (enum insn_code icode, unsigned int op, rtx target)
13054 {
13055   enum machine_mode mode;
13056
13057   mode = insn_data[icode].operand[op].mode;
13058   if (target == 0 || !insn_data[icode].operand[op].predicate (target, mode))
13059     target = gen_reg_rtx (mode);
13060
13061   return target;
13062 }
13063
13064 /* Expand a MIPS_BUILTIN_DIRECT or MIPS_BUILTIN_DIRECT_NO_TARGET function;
13065    HAS_TARGET_P says which.  EXP is the CALL_EXPR that calls the function
13066    and ICODE is the code of the associated .md pattern.  TARGET, if nonnull,
13067    suggests a good place to put the result.  */
13068
13069 static rtx
13070 mips_expand_builtin_direct (enum insn_code icode, rtx target, tree exp,
13071                             bool has_target_p)
13072 {
13073   rtx ops[MAX_RECOG_OPERANDS];
13074   int opno, argno;
13075
13076   /* Map any target to operand 0.  */
13077   opno = 0;
13078   if (has_target_p)
13079     {
13080       target = mips_prepare_builtin_target (icode, opno, target);
13081       ops[opno] = target;
13082       opno++;
13083     }
13084
13085   /* Map the arguments to the other operands.  The n_operands value
13086      for an expander includes match_dups and match_scratches as well as
13087      match_operands, so n_operands is only an upper bound on the number
13088      of arguments to the expander function.  */
13089   gcc_assert (opno + call_expr_nargs (exp) <= insn_data[icode].n_operands);
13090   for (argno = 0; argno < call_expr_nargs (exp); argno++, opno++)
13091     ops[opno] = mips_prepare_builtin_arg (icode, opno, exp, argno);
13092
13093   switch (opno)
13094     {
13095     case 2:
13096       emit_insn (GEN_FCN (icode) (ops[0], ops[1]));
13097       break;
13098
13099     case 3:
13100       emit_insn (GEN_FCN (icode) (ops[0], ops[1], ops[2]));
13101       break;
13102
13103     case 4:
13104       emit_insn (GEN_FCN (icode) (ops[0], ops[1], ops[2], ops[3]));
13105       break;
13106
13107     default:
13108       gcc_unreachable ();
13109     }
13110   return target;
13111 }
13112
13113 /* Expand a __builtin_mips_movt_*_ps or __builtin_mips_movf_*_ps
13114    function; TYPE says which.  EXP is the CALL_EXPR that calls the
13115    function, ICODE is the instruction that should be used to compare
13116    the first two arguments, and COND is the condition it should test.
13117    TARGET, if nonnull, suggests a good place to put the result.  */
13118
13119 static rtx
13120 mips_expand_builtin_movtf (enum mips_builtin_type type,
13121                            enum insn_code icode, enum mips_fp_condition cond,
13122                            rtx target, tree exp)
13123 {
13124   rtx cmp_result, op0, op1;
13125
13126   cmp_result = mips_prepare_builtin_target (icode, 0, 0);
13127   op0 = mips_prepare_builtin_arg (icode, 1, exp, 0);
13128   op1 = mips_prepare_builtin_arg (icode, 2, exp, 1);
13129   emit_insn (GEN_FCN (icode) (cmp_result, op0, op1, GEN_INT (cond)));
13130
13131   icode = CODE_FOR_mips_cond_move_tf_ps;
13132   target = mips_prepare_builtin_target (icode, 0, target);
13133   if (type == MIPS_BUILTIN_MOVT)
13134     {
13135       op1 = mips_prepare_builtin_arg (icode, 2, exp, 2);
13136       op0 = mips_prepare_builtin_arg (icode, 1, exp, 3);
13137     }
13138   else
13139     {
13140       op0 = mips_prepare_builtin_arg (icode, 1, exp, 2);
13141       op1 = mips_prepare_builtin_arg (icode, 2, exp, 3);
13142     }
13143   emit_insn (gen_mips_cond_move_tf_ps (target, op0, op1, cmp_result));
13144   return target;
13145 }
13146
13147 /* Move VALUE_IF_TRUE into TARGET if CONDITION is true; move VALUE_IF_FALSE
13148    into TARGET otherwise.  Return TARGET.  */
13149
13150 static rtx
13151 mips_builtin_branch_and_move (rtx condition, rtx target,
13152                               rtx value_if_true, rtx value_if_false)
13153 {
13154   rtx true_label, done_label;
13155
13156   true_label = gen_label_rtx ();
13157   done_label = gen_label_rtx ();
13158
13159   /* First assume that CONDITION is false.  */
13160   mips_emit_move (target, value_if_false);
13161
13162   /* Branch to TRUE_LABEL if CONDITION is true and DONE_LABEL otherwise.  */
13163   emit_jump_insn (gen_condjump (condition, true_label));
13164   emit_jump_insn (gen_jump (done_label));
13165   emit_barrier ();
13166
13167   /* Fix TARGET if CONDITION is true.  */
13168   emit_label (true_label);
13169   mips_emit_move (target, value_if_true);
13170
13171   emit_label (done_label);
13172   return target;
13173 }
13174
13175 /* Expand a comparison built-in function of type BUILTIN_TYPE.  EXP is
13176    the CALL_EXPR that calls the function, ICODE is the code of the
13177    comparison instruction, and COND is the condition it should test.
13178    TARGET, if nonnull, suggests a good place to put the boolean result.  */
13179
13180 static rtx
13181 mips_expand_builtin_compare (enum mips_builtin_type builtin_type,
13182                              enum insn_code icode, enum mips_fp_condition cond,
13183                              rtx target, tree exp)
13184 {
13185   rtx offset, condition, cmp_result, args[MAX_RECOG_OPERANDS];
13186   int argno;
13187
13188   if (target == 0 || GET_MODE (target) != SImode)
13189     target = gen_reg_rtx (SImode);
13190
13191   /* The instruction should have a target operand, an operand for each
13192      argument, and an operand for COND.  */
13193   gcc_assert (call_expr_nargs (exp) + 2 == insn_data[icode].n_operands);
13194
13195   /* Prepare the operands to the comparison.  */
13196   cmp_result = mips_prepare_builtin_target (icode, 0, 0);
13197   for (argno = 0; argno < call_expr_nargs (exp); argno++)
13198     args[argno] = mips_prepare_builtin_arg (icode, argno + 1, exp, argno);
13199
13200   switch (insn_data[icode].n_operands)
13201     {
13202     case 4:
13203       emit_insn (GEN_FCN (icode) (cmp_result, args[0], args[1],
13204                                   GEN_INT (cond)));
13205       break;
13206
13207     case 6:
13208       emit_insn (GEN_FCN (icode) (cmp_result, args[0], args[1],
13209                                   args[2], args[3], GEN_INT (cond)));
13210       break;
13211
13212     default:
13213       gcc_unreachable ();
13214     }
13215
13216   /* If the comparison sets more than one register, we define the result
13217      to be 0 if all registers are false and -1 if all registers are true.
13218      The value of the complete result is indeterminate otherwise.  */
13219   switch (builtin_type)
13220     {
13221     case MIPS_BUILTIN_CMP_ALL:
13222       condition = gen_rtx_NE (VOIDmode, cmp_result, constm1_rtx);
13223       return mips_builtin_branch_and_move (condition, target,
13224                                            const0_rtx, const1_rtx);
13225
13226     case MIPS_BUILTIN_CMP_UPPER:
13227     case MIPS_BUILTIN_CMP_LOWER:
13228       offset = GEN_INT (builtin_type == MIPS_BUILTIN_CMP_UPPER);
13229       condition = gen_single_cc (cmp_result, offset);
13230       return mips_builtin_branch_and_move (condition, target,
13231                                            const1_rtx, const0_rtx);
13232
13233     default:
13234       condition = gen_rtx_NE (VOIDmode, cmp_result, const0_rtx);
13235       return mips_builtin_branch_and_move (condition, target,
13236                                            const1_rtx, const0_rtx);
13237     }
13238 }
13239
13240 /* Expand a bposge built-in function of type BUILTIN_TYPE.  TARGET,
13241    if nonnull, suggests a good place to put the boolean result.  */
13242
13243 static rtx
13244 mips_expand_builtin_bposge (enum mips_builtin_type builtin_type, rtx target)
13245 {
13246   rtx condition, cmp_result;
13247   int cmp_value;
13248
13249   if (target == 0 || GET_MODE (target) != SImode)
13250     target = gen_reg_rtx (SImode);
13251
13252   cmp_result = gen_rtx_REG (CCDSPmode, CCDSP_PO_REGNUM);
13253
13254   if (builtin_type == MIPS_BUILTIN_BPOSGE32)
13255     cmp_value = 32;
13256   else
13257     gcc_assert (0);
13258
13259   condition = gen_rtx_GE (VOIDmode, cmp_result, GEN_INT (cmp_value));
13260   return mips_builtin_branch_and_move (condition, target,
13261                                        const1_rtx, const0_rtx);
13262 }
13263
13264 /* Implement TARGET_EXPAND_BUILTIN.  */
13265
13266 static rtx
13267 mips_expand_builtin (tree exp, rtx target, rtx subtarget ATTRIBUTE_UNUSED,
13268                      enum machine_mode mode, int ignore)
13269 {
13270   tree fndecl;
13271   unsigned int fcode, avail;
13272   const struct mips_builtin_description *d;
13273
13274   fndecl = TREE_OPERAND (CALL_EXPR_FN (exp), 0);
13275   fcode = DECL_FUNCTION_CODE (fndecl);
13276   gcc_assert (fcode < ARRAY_SIZE (mips_builtins));
13277   d = &mips_builtins[fcode];
13278   avail = d->avail ();
13279   gcc_assert (avail != 0);
13280   if (TARGET_MIPS16)
13281     {
13282       error ("built-in function %qE not supported for MIPS16",
13283              DECL_NAME (fndecl));
13284       return ignore ? const0_rtx : CONST0_RTX (mode);
13285     }
13286   switch (d->builtin_type)
13287     {
13288     case MIPS_BUILTIN_DIRECT:
13289       return mips_expand_builtin_direct (d->icode, target, exp, true);
13290
13291     case MIPS_BUILTIN_DIRECT_NO_TARGET:
13292       return mips_expand_builtin_direct (d->icode, target, exp, false);
13293
13294     case MIPS_BUILTIN_MOVT:
13295     case MIPS_BUILTIN_MOVF:
13296       return mips_expand_builtin_movtf (d->builtin_type, d->icode,
13297                                         d->cond, target, exp);
13298
13299     case MIPS_BUILTIN_CMP_ANY:
13300     case MIPS_BUILTIN_CMP_ALL:
13301     case MIPS_BUILTIN_CMP_UPPER:
13302     case MIPS_BUILTIN_CMP_LOWER:
13303     case MIPS_BUILTIN_CMP_SINGLE:
13304       return mips_expand_builtin_compare (d->builtin_type, d->icode,
13305                                           d->cond, target, exp);
13306
13307     case MIPS_BUILTIN_BPOSGE32:
13308       return mips_expand_builtin_bposge (d->builtin_type, target);
13309     }
13310   gcc_unreachable ();
13311 }
13312 \f
13313 /* An entry in the MIPS16 constant pool.  VALUE is the pool constant,
13314    MODE is its mode, and LABEL is the CODE_LABEL associated with it.  */
13315 struct mips16_constant {
13316   struct mips16_constant *next;
13317   rtx value;
13318   rtx label;
13319   enum machine_mode mode;
13320 };
13321
13322 /* Information about an incomplete MIPS16 constant pool.  FIRST is the
13323    first constant, HIGHEST_ADDRESS is the highest address that the first
13324    byte of the pool can have, and INSN_ADDRESS is the current instruction
13325    address.  */
13326 struct mips16_constant_pool {
13327   struct mips16_constant *first;
13328   int highest_address;
13329   int insn_address;
13330 };
13331
13332 /* Add constant VALUE to POOL and return its label.  MODE is the
13333    value's mode (used for CONST_INTs, etc.).  */
13334
13335 static rtx
13336 mips16_add_constant (struct mips16_constant_pool *pool,
13337                      rtx value, enum machine_mode mode)
13338 {
13339   struct mips16_constant **p, *c;
13340   bool first_of_size_p;
13341
13342   /* See whether the constant is already in the pool.  If so, return the
13343      existing label, otherwise leave P pointing to the place where the
13344      constant should be added.
13345
13346      Keep the pool sorted in increasing order of mode size so that we can
13347      reduce the number of alignments needed.  */
13348   first_of_size_p = true;
13349   for (p = &pool->first; *p != 0; p = &(*p)->next)
13350     {
13351       if (mode == (*p)->mode && rtx_equal_p (value, (*p)->value))
13352         return (*p)->label;
13353       if (GET_MODE_SIZE (mode) < GET_MODE_SIZE ((*p)->mode))
13354         break;
13355       if (GET_MODE_SIZE (mode) == GET_MODE_SIZE ((*p)->mode))
13356         first_of_size_p = false;
13357     }
13358
13359   /* In the worst case, the constant needed by the earliest instruction
13360      will end up at the end of the pool.  The entire pool must then be
13361      accessible from that instruction.
13362
13363      When adding the first constant, set the pool's highest address to
13364      the address of the first out-of-range byte.  Adjust this address
13365      downwards each time a new constant is added.  */
13366   if (pool->first == 0)
13367     /* For LWPC, ADDIUPC and DADDIUPC, the base PC value is the address
13368        of the instruction with the lowest two bits clear.  The base PC
13369        value for LDPC has the lowest three bits clear.  Assume the worst
13370        case here; namely that the PC-relative instruction occupies the
13371        last 2 bytes in an aligned word.  */
13372     pool->highest_address = pool->insn_address - (UNITS_PER_WORD - 2) + 0x8000;
13373   pool->highest_address -= GET_MODE_SIZE (mode);
13374   if (first_of_size_p)
13375     /* Take into account the worst possible padding due to alignment.  */
13376     pool->highest_address -= GET_MODE_SIZE (mode) - 1;
13377
13378   /* Create a new entry.  */
13379   c = XNEW (struct mips16_constant);
13380   c->value = value;
13381   c->mode = mode;
13382   c->label = gen_label_rtx ();
13383   c->next = *p;
13384   *p = c;
13385
13386   return c->label;
13387 }
13388
13389 /* Output constant VALUE after instruction INSN and return the last
13390    instruction emitted.  MODE is the mode of the constant.  */
13391
13392 static rtx
13393 mips16_emit_constants_1 (enum machine_mode mode, rtx value, rtx insn)
13394 {
13395   if (SCALAR_INT_MODE_P (mode) || ALL_SCALAR_FIXED_POINT_MODE_P (mode))
13396     {
13397       rtx size = GEN_INT (GET_MODE_SIZE (mode));
13398       return emit_insn_after (gen_consttable_int (value, size), insn);
13399     }
13400
13401   if (SCALAR_FLOAT_MODE_P (mode))
13402     return emit_insn_after (gen_consttable_float (value), insn);
13403
13404   if (VECTOR_MODE_P (mode))
13405     {
13406       int i;
13407
13408       for (i = 0; i < CONST_VECTOR_NUNITS (value); i++)
13409         insn = mips16_emit_constants_1 (GET_MODE_INNER (mode),
13410                                         CONST_VECTOR_ELT (value, i), insn);
13411       return insn;
13412     }
13413
13414   gcc_unreachable ();
13415 }
13416
13417 /* Dump out the constants in CONSTANTS after INSN.  */
13418
13419 static void
13420 mips16_emit_constants (struct mips16_constant *constants, rtx insn)
13421 {
13422   struct mips16_constant *c, *next;
13423   int align;
13424
13425   align = 0;
13426   for (c = constants; c != NULL; c = next)
13427     {
13428       /* If necessary, increase the alignment of PC.  */
13429       if (align < GET_MODE_SIZE (c->mode))
13430         {
13431           int align_log = floor_log2 (GET_MODE_SIZE (c->mode));
13432           insn = emit_insn_after (gen_align (GEN_INT (align_log)), insn);
13433         }
13434       align = GET_MODE_SIZE (c->mode);
13435
13436       insn = emit_label_after (c->label, insn);
13437       insn = mips16_emit_constants_1 (c->mode, c->value, insn);
13438
13439       next = c->next;
13440       free (c);
13441     }
13442
13443   emit_barrier_after (insn);
13444 }
13445
13446 /* Return the length of instruction INSN.  */
13447
13448 static int
13449 mips16_insn_length (rtx insn)
13450 {
13451   if (JUMP_P (insn))
13452     {
13453       rtx body = PATTERN (insn);
13454       if (GET_CODE (body) == ADDR_VEC)
13455         return GET_MODE_SIZE (GET_MODE (body)) * XVECLEN (body, 0);
13456       if (GET_CODE (body) == ADDR_DIFF_VEC)
13457         return GET_MODE_SIZE (GET_MODE (body)) * XVECLEN (body, 1);
13458     }
13459   return get_attr_length (insn);
13460 }
13461
13462 /* If *X is a symbolic constant that refers to the constant pool, add
13463    the constant to POOL and rewrite *X to use the constant's label.  */
13464
13465 static void
13466 mips16_rewrite_pool_constant (struct mips16_constant_pool *pool, rtx *x)
13467 {
13468   rtx base, offset, label;
13469
13470   split_const (*x, &base, &offset);
13471   if (GET_CODE (base) == SYMBOL_REF && CONSTANT_POOL_ADDRESS_P (base))
13472     {
13473       label = mips16_add_constant (pool, get_pool_constant (base),
13474                                    get_pool_mode (base));
13475       base = gen_rtx_LABEL_REF (Pmode, label);
13476       *x = mips_unspec_address_offset (base, offset, SYMBOL_PC_RELATIVE);
13477     }
13478 }
13479
13480 /* This structure is used to communicate with mips16_rewrite_pool_refs.
13481    INSN is the instruction we're rewriting and POOL points to the current
13482    constant pool.  */
13483 struct mips16_rewrite_pool_refs_info {
13484   rtx insn;
13485   struct mips16_constant_pool *pool;
13486 };
13487
13488 /* Rewrite *X so that constant pool references refer to the constant's
13489    label instead.  DATA points to a mips16_rewrite_pool_refs_info
13490    structure.  */
13491
13492 static int
13493 mips16_rewrite_pool_refs (rtx *x, void *data)
13494 {
13495   struct mips16_rewrite_pool_refs_info *info =
13496     (struct mips16_rewrite_pool_refs_info *) data;
13497
13498   if (force_to_mem_operand (*x, Pmode))
13499     {
13500       rtx mem = force_const_mem (GET_MODE (*x), *x);
13501       validate_change (info->insn, x, mem, false);
13502     }
13503
13504   if (MEM_P (*x))
13505     {
13506       mips16_rewrite_pool_constant (info->pool, &XEXP (*x, 0));
13507       return -1;
13508     }
13509
13510   if (TARGET_MIPS16_TEXT_LOADS)
13511     mips16_rewrite_pool_constant (info->pool, x);
13512
13513   return GET_CODE (*x) == CONST ? -1 : 0;
13514 }
13515
13516 /* Return whether CFG is used in mips_reorg.  */
13517
13518 static bool
13519 mips_cfg_in_reorg (void)
13520 {
13521   return (mips_r10k_cache_barrier != R10K_CACHE_BARRIER_NONE
13522           || TARGET_RELAX_PIC_CALLS);
13523 }
13524
13525 /* Build MIPS16 constant pools.  */
13526
13527 static void
13528 mips16_lay_out_constants (void)
13529 {
13530   struct mips16_constant_pool pool;
13531   struct mips16_rewrite_pool_refs_info info;
13532   rtx insn, barrier;
13533
13534   if (!TARGET_MIPS16_PCREL_LOADS)
13535     return;
13536
13537   if (mips_cfg_in_reorg ())
13538     split_all_insns ();
13539   else
13540     split_all_insns_noflow ();
13541   barrier = 0;
13542   memset (&pool, 0, sizeof (pool));
13543   for (insn = get_insns (); insn; insn = NEXT_INSN (insn))
13544     {
13545       /* Rewrite constant pool references in INSN.  */
13546       if (USEFUL_INSN_P (insn))
13547         {
13548           info.insn = insn;
13549           info.pool = &pool;
13550           for_each_rtx (&PATTERN (insn), mips16_rewrite_pool_refs, &info);
13551         }
13552
13553       pool.insn_address += mips16_insn_length (insn);
13554
13555       if (pool.first != NULL)
13556         {
13557           /* If there are no natural barriers between the first user of
13558              the pool and the highest acceptable address, we'll need to
13559              create a new instruction to jump around the constant pool.
13560              In the worst case, this instruction will be 4 bytes long.
13561
13562              If it's too late to do this transformation after INSN,
13563              do it immediately before INSN.  */
13564           if (barrier == 0 && pool.insn_address + 4 > pool.highest_address)
13565             {
13566               rtx label, jump;
13567
13568               label = gen_label_rtx ();
13569
13570               jump = emit_jump_insn_before (gen_jump (label), insn);
13571               JUMP_LABEL (jump) = label;
13572               LABEL_NUSES (label) = 1;
13573               barrier = emit_barrier_after (jump);
13574
13575               emit_label_after (label, barrier);
13576               pool.insn_address += 4;
13577             }
13578
13579           /* See whether the constant pool is now out of range of the first
13580              user.  If so, output the constants after the previous barrier.
13581              Note that any instructions between BARRIER and INSN (inclusive)
13582              will use negative offsets to refer to the pool.  */
13583           if (pool.insn_address > pool.highest_address)
13584             {
13585               mips16_emit_constants (pool.first, barrier);
13586               pool.first = NULL;
13587               barrier = 0;
13588             }
13589           else if (BARRIER_P (insn))
13590             barrier = insn;
13591         }
13592     }
13593   mips16_emit_constants (pool.first, get_last_insn ());
13594 }
13595 \f
13596 /* Return true if it is worth r10k_simplify_address's while replacing
13597    an address with X.  We are looking for constants, and for addresses
13598    at a known offset from the incoming stack pointer.  */
13599
13600 static bool
13601 r10k_simplified_address_p (rtx x)
13602 {
13603   if (GET_CODE (x) == PLUS && CONST_INT_P (XEXP (x, 1)))
13604     x = XEXP (x, 0);
13605   return x == virtual_incoming_args_rtx || CONSTANT_P (x);
13606 }
13607
13608 /* X is an expression that appears in INSN.  Try to use the UD chains
13609    to simplify it, returning the simplified form on success and the
13610    original form otherwise.  Replace the incoming value of $sp with
13611    virtual_incoming_args_rtx (which should never occur in X otherwise).  */
13612
13613 static rtx
13614 r10k_simplify_address (rtx x, rtx insn)
13615 {
13616   rtx newx, op0, op1, set, def_insn, note;
13617   df_ref use, def;
13618   struct df_link *defs;
13619
13620   newx = NULL_RTX;
13621   if (UNARY_P (x))
13622     {
13623       op0 = r10k_simplify_address (XEXP (x, 0), insn);
13624       if (op0 != XEXP (x, 0))
13625         newx = simplify_gen_unary (GET_CODE (x), GET_MODE (x),
13626                                    op0, GET_MODE (XEXP (x, 0)));
13627     }
13628   else if (BINARY_P (x))
13629     {
13630       op0 = r10k_simplify_address (XEXP (x, 0), insn);
13631       op1 = r10k_simplify_address (XEXP (x, 1), insn);
13632       if (op0 != XEXP (x, 0) || op1 != XEXP (x, 1))
13633         newx = simplify_gen_binary (GET_CODE (x), GET_MODE (x), op0, op1);
13634     }
13635   else if (GET_CODE (x) == LO_SUM)
13636     {
13637       /* LO_SUMs can be offset from HIGHs, if we know they won't
13638          overflow.  See mips_classify_address for the rationale behind
13639          the lax check.  */
13640       op0 = r10k_simplify_address (XEXP (x, 0), insn);
13641       if (GET_CODE (op0) == HIGH)
13642         newx = XEXP (x, 1);
13643     }
13644   else if (REG_P (x))
13645     {
13646       /* Uses are recorded by regno_reg_rtx, not X itself.  */
13647       use = df_find_use (insn, regno_reg_rtx[REGNO (x)]);
13648       gcc_assert (use);
13649       defs = DF_REF_CHAIN (use);
13650
13651       /* Require a single definition.  */
13652       if (defs && defs->next == NULL)
13653         {
13654           def = defs->ref;
13655           if (DF_REF_IS_ARTIFICIAL (def))
13656             {
13657               /* Replace the incoming value of $sp with
13658                  virtual_incoming_args_rtx.  */
13659               if (x == stack_pointer_rtx
13660                   && DF_REF_BB (def) == ENTRY_BLOCK_PTR)
13661                 newx = virtual_incoming_args_rtx;
13662             }
13663           else if (dominated_by_p (CDI_DOMINATORS, DF_REF_BB (use),
13664                                    DF_REF_BB (def)))
13665             {
13666               /* Make sure that DEF_INSN is a single set of REG.  */
13667               def_insn = DF_REF_INSN (def);
13668               if (NONJUMP_INSN_P (def_insn))
13669                 {
13670                   set = single_set (def_insn);
13671                   if (set && rtx_equal_p (SET_DEST (set), x))
13672                     {
13673                       /* Prefer to use notes, since the def-use chains
13674                          are often shorter.  */
13675                       note = find_reg_equal_equiv_note (def_insn);
13676                       if (note)
13677                         newx = XEXP (note, 0);
13678                       else
13679                         newx = SET_SRC (set);
13680                       newx = r10k_simplify_address (newx, def_insn);
13681                     }
13682                 }
13683             }
13684         }
13685     }
13686   if (newx && r10k_simplified_address_p (newx))
13687     return newx;
13688   return x;
13689 }
13690
13691 /* Return true if ADDRESS is known to be an uncached address
13692    on R10K systems.  */
13693
13694 static bool
13695 r10k_uncached_address_p (unsigned HOST_WIDE_INT address)
13696 {
13697   unsigned HOST_WIDE_INT upper;
13698
13699   /* Check for KSEG1.  */
13700   if (address + 0x60000000 < 0x20000000)
13701     return true;
13702
13703   /* Check for uncached XKPHYS addresses.  */
13704   if (Pmode == DImode)
13705     {
13706       upper = (address >> 40) & 0xf9ffff;
13707       if (upper == 0x900000 || upper == 0xb80000)
13708         return true;
13709     }
13710   return false;
13711 }
13712
13713 /* Return true if we can prove that an access to address X in instruction
13714    INSN would be safe from R10K speculation.  This X is a general
13715    expression; it might not be a legitimate address.  */
13716
13717 static bool
13718 r10k_safe_address_p (rtx x, rtx insn)
13719 {
13720   rtx base, offset;
13721   HOST_WIDE_INT offset_val;
13722
13723   x = r10k_simplify_address (x, insn);
13724
13725   /* Check for references to the stack frame.  It doesn't really matter
13726      how much of the frame has been allocated at INSN; -mr10k-cache-barrier
13727      allows us to assume that accesses to any part of the eventual frame
13728      is safe from speculation at any point in the function.  */
13729   mips_split_plus (x, &base, &offset_val);
13730   if (base == virtual_incoming_args_rtx
13731       && offset_val >= -cfun->machine->frame.total_size
13732       && offset_val < cfun->machine->frame.args_size)
13733     return true;
13734
13735   /* Check for uncached addresses.  */
13736   if (CONST_INT_P (x))
13737     return r10k_uncached_address_p (INTVAL (x));
13738
13739   /* Check for accesses to a static object.  */
13740   split_const (x, &base, &offset);
13741   return offset_within_block_p (base, INTVAL (offset));
13742 }
13743
13744 /* Return true if a MEM with MEM_EXPR EXPR and MEM_OFFSET OFFSET is
13745    an in-range access to an automatic variable, or to an object with
13746    a link-time-constant address.  */
13747
13748 static bool
13749 r10k_safe_mem_expr_p (tree expr, rtx offset)
13750 {
13751   if (expr == NULL_TREE
13752       || offset == NULL_RTX
13753       || !CONST_INT_P (offset)
13754       || INTVAL (offset) < 0
13755       || INTVAL (offset) >= int_size_in_bytes (TREE_TYPE (expr)))
13756     return false;
13757
13758   while (TREE_CODE (expr) == COMPONENT_REF)
13759     {
13760       expr = TREE_OPERAND (expr, 0);
13761       if (expr == NULL_TREE)
13762         return false;
13763     }
13764
13765   return DECL_P (expr);
13766 }
13767
13768 /* A for_each_rtx callback for which DATA points to the instruction
13769    containing *X.  Stop the search if we find a MEM that is not safe
13770    from R10K speculation.  */
13771
13772 static int
13773 r10k_needs_protection_p_1 (rtx *loc, void *data)
13774 {
13775   rtx mem;
13776
13777   mem = *loc;
13778   if (!MEM_P (mem))
13779     return 0;
13780
13781   if (r10k_safe_mem_expr_p (MEM_EXPR (mem), MEM_OFFSET (mem)))
13782     return -1;
13783
13784   if (r10k_safe_address_p (XEXP (mem, 0), (rtx) data))
13785     return -1;
13786
13787   return 1;
13788 }
13789
13790 /* A note_stores callback for which DATA points to an instruction pointer.
13791    If *DATA is nonnull, make it null if it X contains a MEM that is not
13792    safe from R10K speculation.  */
13793
13794 static void
13795 r10k_needs_protection_p_store (rtx x, const_rtx pat ATTRIBUTE_UNUSED,
13796                                void *data)
13797 {
13798   rtx *insn_ptr;
13799
13800   insn_ptr = (rtx *) data;
13801   if (*insn_ptr && for_each_rtx (&x, r10k_needs_protection_p_1, *insn_ptr))
13802     *insn_ptr = NULL_RTX;
13803 }
13804
13805 /* A for_each_rtx callback that iterates over the pattern of a CALL_INSN.
13806    Return nonzero if the call is not to a declared function.  */
13807
13808 static int
13809 r10k_needs_protection_p_call (rtx *loc, void *data ATTRIBUTE_UNUSED)
13810 {
13811   rtx x;
13812
13813   x = *loc;
13814   if (!MEM_P (x))
13815     return 0;
13816
13817   x = XEXP (x, 0);
13818   if (GET_CODE (x) == SYMBOL_REF && SYMBOL_REF_DECL (x))
13819     return -1;
13820
13821   return 1;
13822 }
13823
13824 /* Return true if instruction INSN needs to be protected by an R10K
13825    cache barrier.  */
13826
13827 static bool
13828 r10k_needs_protection_p (rtx insn)
13829 {
13830   if (CALL_P (insn))
13831     return for_each_rtx (&PATTERN (insn), r10k_needs_protection_p_call, NULL);
13832
13833   if (mips_r10k_cache_barrier == R10K_CACHE_BARRIER_STORE)
13834     {
13835       note_stores (PATTERN (insn), r10k_needs_protection_p_store, &insn);
13836       return insn == NULL_RTX;
13837     }
13838
13839   return for_each_rtx (&PATTERN (insn), r10k_needs_protection_p_1, insn);
13840 }
13841
13842 /* Return true if BB is only reached by blocks in PROTECTED_BBS and if every
13843    edge is unconditional.  */
13844
13845 static bool
13846 r10k_protected_bb_p (basic_block bb, sbitmap protected_bbs)
13847 {
13848   edge_iterator ei;
13849   edge e;
13850
13851   FOR_EACH_EDGE (e, ei, bb->preds)
13852     if (!single_succ_p (e->src)
13853         || !TEST_BIT (protected_bbs, e->src->index)
13854         || (e->flags & EDGE_COMPLEX) != 0)
13855       return false;
13856   return true;
13857 }
13858
13859 /* Implement -mr10k-cache-barrier= for the current function.  */
13860
13861 static void
13862 r10k_insert_cache_barriers (void)
13863 {
13864   int *rev_post_order;
13865   unsigned int i, n;
13866   basic_block bb;
13867   sbitmap protected_bbs;
13868   rtx insn, end, unprotected_region;
13869
13870   if (TARGET_MIPS16)
13871     {
13872       sorry ("%qs does not support MIPS16 code", "-mr10k-cache-barrier");
13873       return;
13874     }
13875
13876   /* Calculate dominators.  */
13877   calculate_dominance_info (CDI_DOMINATORS);
13878
13879   /* Bit X of PROTECTED_BBS is set if the last operation in basic block
13880      X is protected by a cache barrier.  */
13881   protected_bbs = sbitmap_alloc (last_basic_block);
13882   sbitmap_zero (protected_bbs);
13883
13884   /* Iterate over the basic blocks in reverse post-order.  */
13885   rev_post_order = XNEWVEC (int, last_basic_block);
13886   n = pre_and_rev_post_order_compute (NULL, rev_post_order, false);
13887   for (i = 0; i < n; i++)
13888     {
13889       bb = BASIC_BLOCK (rev_post_order[i]);
13890
13891       /* If this block is only reached by unconditional edges, and if the
13892          source of every edge is protected, the beginning of the block is
13893          also protected.  */
13894       if (r10k_protected_bb_p (bb, protected_bbs))
13895         unprotected_region = NULL_RTX;
13896       else
13897         unprotected_region = pc_rtx;
13898       end = NEXT_INSN (BB_END (bb));
13899
13900       /* UNPROTECTED_REGION is:
13901
13902          - null if we are processing a protected region,
13903          - pc_rtx if we are processing an unprotected region but have
13904            not yet found the first instruction in it
13905          - the first instruction in an unprotected region otherwise.  */
13906       for (insn = BB_HEAD (bb); insn != end; insn = NEXT_INSN (insn))
13907         {
13908           if (unprotected_region && USEFUL_INSN_P (insn))
13909             {
13910               if (recog_memoized (insn) == CODE_FOR_mips_cache)
13911                 /* This CACHE instruction protects the following code.  */
13912                 unprotected_region = NULL_RTX;
13913               else
13914                 {
13915                   /* See if INSN is the first instruction in this
13916                      unprotected region.  */
13917                   if (unprotected_region == pc_rtx)
13918                     unprotected_region = insn;
13919
13920                   /* See if INSN needs to be protected.  If so,
13921                      we must insert a cache barrier somewhere between
13922                      PREV_INSN (UNPROTECTED_REGION) and INSN.  It isn't
13923                      clear which position is better performance-wise,
13924                      but as a tie-breaker, we assume that it is better
13925                      to allow delay slots to be back-filled where
13926                      possible, and that it is better not to insert
13927                      barriers in the middle of already-scheduled code.
13928                      We therefore insert the barrier at the beginning
13929                      of the region.  */
13930                   if (r10k_needs_protection_p (insn))
13931                     {
13932                       emit_insn_before (gen_r10k_cache_barrier (),
13933                                         unprotected_region);
13934                       unprotected_region = NULL_RTX;
13935                     }
13936                 }
13937             }
13938
13939           if (CALL_P (insn))
13940             /* The called function is not required to protect the exit path.
13941                The code that follows a call is therefore unprotected.  */
13942             unprotected_region = pc_rtx;
13943         }
13944
13945       /* Record whether the end of this block is protected.  */
13946       if (unprotected_region == NULL_RTX)
13947         SET_BIT (protected_bbs, bb->index);
13948     }
13949   XDELETEVEC (rev_post_order);
13950
13951   sbitmap_free (protected_bbs);
13952
13953   free_dominance_info (CDI_DOMINATORS);
13954 }
13955 \f
13956 /* If INSN is a call, return the underlying CALL expr.  Return NULL_RTX
13957    otherwise.  */
13958
13959 static rtx
13960 mips_call_expr_from_insn (rtx insn)
13961 {
13962   rtx x;
13963
13964   if (!CALL_P (insn))
13965     return NULL_RTX;
13966
13967   x = PATTERN (insn);
13968   if (GET_CODE (x) == PARALLEL)
13969     x = XVECEXP (x, 0, 0);
13970   if (GET_CODE (x) == SET)
13971     x = XEXP (x, 1);
13972
13973   gcc_assert (GET_CODE (x) == CALL);
13974   return x;
13975 }
13976
13977 /* REG is set in DEF.  See if the definition is one of the ways we load a
13978    register with a symbol address for a mips_use_pic_fn_addr_reg_p call.  If
13979    it is return the symbol reference of the function, otherwise return
13980    NULL_RTX.  */
13981
13982 static rtx
13983 mips_pic_call_symbol_from_set (df_ref def, rtx reg)
13984 {
13985   rtx def_insn, set;
13986
13987   if (DF_REF_IS_ARTIFICIAL (def))
13988     return NULL_RTX;
13989
13990   def_insn = DF_REF_INSN (def);
13991   set = single_set (def_insn);
13992   if (set && rtx_equal_p (SET_DEST (set), reg))
13993     {
13994       rtx note, src, symbol;
13995
13996       /* First, look at REG_EQUAL/EQUIV notes.  */
13997       note = find_reg_equal_equiv_note (def_insn);
13998       if (note && GET_CODE (XEXP (note, 0)) == SYMBOL_REF)
13999         return XEXP (note, 0);
14000
14001       /* For %call16 references we don't have REG_EQUAL.  */
14002       src = SET_SRC (set);
14003       symbol = mips_strip_unspec_call (src);
14004       if (symbol)
14005         {
14006           gcc_assert (GET_CODE (symbol) == SYMBOL_REF);
14007           return symbol;
14008         }
14009
14010       /* Follow simple register copies.  */
14011       if (REG_P (src))
14012         return mips_find_pic_call_symbol (def_insn, src);
14013     }
14014
14015   return NULL_RTX;
14016 }
14017
14018 /* Find the definition of the use of REG in INSN.  See if the definition is
14019    one of the ways we load a register with a symbol address for a
14020    mips_use_pic_fn_addr_reg_p call.  If it is return the symbol reference of
14021    the function, otherwise return NULL_RTX.  */
14022
14023 static rtx
14024 mips_find_pic_call_symbol (rtx insn, rtx reg)
14025 {
14026   df_ref use;
14027   struct df_link *defs;
14028   rtx symbol;
14029
14030   use = df_find_use (insn, regno_reg_rtx[REGNO (reg)]);
14031   if (!use)
14032     return NULL_RTX;
14033   defs = DF_REF_CHAIN (use);
14034   if (!defs)
14035     return NULL_RTX;
14036   symbol = mips_pic_call_symbol_from_set (defs->ref, reg);
14037   if (!symbol)
14038     return NULL_RTX;
14039
14040   /* If we have more than one definition, they need to be identical.  */
14041   for (defs = defs->next; defs; defs = defs->next)
14042     {
14043       rtx other;
14044
14045       other = mips_pic_call_symbol_from_set (defs->ref, reg);
14046       if (!rtx_equal_p (symbol, other))
14047         return NULL_RTX;
14048     }
14049
14050   return symbol;
14051 }
14052
14053 /* Replace the args_size operand of the call expression CALL with the
14054    call-attribute UNSPEC and fill in SYMBOL as the function symbol.  */
14055
14056 static void
14057 mips_annotate_pic_call_expr (rtx call, rtx symbol)
14058 {
14059   rtx args_size;
14060
14061   args_size = XEXP (call, 1);
14062   XEXP (call, 1) = gen_rtx_UNSPEC (GET_MODE (args_size),
14063                                    gen_rtvec (2, args_size, symbol),
14064                                    UNSPEC_CALL_ATTR);
14065 }
14066
14067 /* OPERANDS[ARGS_SIZE_OPNO] is the arg_size operand of a CALL expression.  See
14068    if instead of the arg_size argument it contains the call attributes.  If
14069    yes return true along with setting OPERANDS[ARGS_SIZE_OPNO] to the function
14070    symbol from the call attributes.  Also return false if ARGS_SIZE_OPNO is
14071    -1.  */
14072
14073 bool
14074 mips_get_pic_call_symbol (rtx *operands, int args_size_opno)
14075 {
14076   rtx args_size, symbol;
14077
14078   if (!TARGET_RELAX_PIC_CALLS || args_size_opno == -1)
14079     return false;
14080
14081   args_size = operands[args_size_opno];
14082   if (GET_CODE (args_size) != UNSPEC)
14083     return false;
14084   gcc_assert (XINT (args_size, 1) == UNSPEC_CALL_ATTR);
14085
14086   symbol = XVECEXP (args_size, 0, 1);
14087   gcc_assert (GET_CODE (symbol) == SYMBOL_REF);
14088
14089   operands[args_size_opno] = symbol;
14090   return true;
14091 }
14092
14093 /* Use DF to annotate PIC indirect calls with the function symbol they
14094    dispatch to.  */
14095
14096 static void
14097 mips_annotate_pic_calls (void)
14098 {
14099   basic_block bb;
14100   rtx insn;
14101
14102   FOR_EACH_BB (bb)
14103     FOR_BB_INSNS (bb, insn)
14104     {
14105       rtx call, reg, symbol;
14106
14107       call = mips_call_expr_from_insn (insn);
14108       if (!call)
14109         continue;
14110       gcc_assert (MEM_P (XEXP (call, 0)));
14111       reg = XEXP (XEXP (call, 0), 0);
14112       if (!REG_P (reg))
14113         continue;
14114
14115       symbol = mips_find_pic_call_symbol (insn, reg);
14116       if (symbol)
14117         mips_annotate_pic_call_expr (call, symbol);
14118     }
14119 }
14120 \f
14121 /* A temporary variable used by for_each_rtx callbacks, etc.  */
14122 static rtx mips_sim_insn;
14123
14124 /* A structure representing the state of the processor pipeline.
14125    Used by the mips_sim_* family of functions.  */
14126 struct mips_sim {
14127   /* The maximum number of instructions that can be issued in a cycle.
14128      (Caches mips_issue_rate.)  */
14129   unsigned int issue_rate;
14130
14131   /* The current simulation time.  */
14132   unsigned int time;
14133
14134   /* How many more instructions can be issued in the current cycle.  */
14135   unsigned int insns_left;
14136
14137   /* LAST_SET[X].INSN is the last instruction to set register X.
14138      LAST_SET[X].TIME is the time at which that instruction was issued.
14139      INSN is null if no instruction has yet set register X.  */
14140   struct {
14141     rtx insn;
14142     unsigned int time;
14143   } last_set[FIRST_PSEUDO_REGISTER];
14144
14145   /* The pipeline's current DFA state.  */
14146   state_t dfa_state;
14147 };
14148
14149 /* Reset STATE to the initial simulation state.  */
14150
14151 static void
14152 mips_sim_reset (struct mips_sim *state)
14153 {
14154   state->time = 0;
14155   state->insns_left = state->issue_rate;
14156   memset (&state->last_set, 0, sizeof (state->last_set));
14157   state_reset (state->dfa_state);
14158 }
14159
14160 /* Initialize STATE before its first use.  DFA_STATE points to an
14161    allocated but uninitialized DFA state.  */
14162
14163 static void
14164 mips_sim_init (struct mips_sim *state, state_t dfa_state)
14165 {
14166   state->issue_rate = mips_issue_rate ();
14167   state->dfa_state = dfa_state;
14168   mips_sim_reset (state);
14169 }
14170
14171 /* Advance STATE by one clock cycle.  */
14172
14173 static void
14174 mips_sim_next_cycle (struct mips_sim *state)
14175 {
14176   state->time++;
14177   state->insns_left = state->issue_rate;
14178   state_transition (state->dfa_state, 0);
14179 }
14180
14181 /* Advance simulation state STATE until instruction INSN can read
14182    register REG.  */
14183
14184 static void
14185 mips_sim_wait_reg (struct mips_sim *state, rtx insn, rtx reg)
14186 {
14187   unsigned int regno, end_regno;
14188
14189   end_regno = END_REGNO (reg);
14190   for (regno = REGNO (reg); regno < end_regno; regno++)
14191     if (state->last_set[regno].insn != 0)
14192       {
14193         unsigned int t;
14194
14195         t = (state->last_set[regno].time
14196              + insn_latency (state->last_set[regno].insn, insn));
14197         while (state->time < t)
14198           mips_sim_next_cycle (state);
14199     }
14200 }
14201
14202 /* A for_each_rtx callback.  If *X is a register, advance simulation state
14203    DATA until mips_sim_insn can read the register's value.  */
14204
14205 static int
14206 mips_sim_wait_regs_2 (rtx *x, void *data)
14207 {
14208   if (REG_P (*x))
14209     mips_sim_wait_reg ((struct mips_sim *) data, mips_sim_insn, *x);
14210   return 0;
14211 }
14212
14213 /* Call mips_sim_wait_regs_2 (R, DATA) for each register R mentioned in *X.  */
14214
14215 static void
14216 mips_sim_wait_regs_1 (rtx *x, void *data)
14217 {
14218   for_each_rtx (x, mips_sim_wait_regs_2, data);
14219 }
14220
14221 /* Advance simulation state STATE until all of INSN's register
14222    dependencies are satisfied.  */
14223
14224 static void
14225 mips_sim_wait_regs (struct mips_sim *state, rtx insn)
14226 {
14227   mips_sim_insn = insn;
14228   note_uses (&PATTERN (insn), mips_sim_wait_regs_1, state);
14229 }
14230
14231 /* Advance simulation state STATE until the units required by
14232    instruction INSN are available.  */
14233
14234 static void
14235 mips_sim_wait_units (struct mips_sim *state, rtx insn)
14236 {
14237   state_t tmp_state;
14238
14239   tmp_state = alloca (state_size ());
14240   while (state->insns_left == 0
14241          || (memcpy (tmp_state, state->dfa_state, state_size ()),
14242              state_transition (tmp_state, insn) >= 0))
14243     mips_sim_next_cycle (state);
14244 }
14245
14246 /* Advance simulation state STATE until INSN is ready to issue.  */
14247
14248 static void
14249 mips_sim_wait_insn (struct mips_sim *state, rtx insn)
14250 {
14251   mips_sim_wait_regs (state, insn);
14252   mips_sim_wait_units (state, insn);
14253 }
14254
14255 /* mips_sim_insn has just set X.  Update the LAST_SET array
14256    in simulation state DATA.  */
14257
14258 static void
14259 mips_sim_record_set (rtx x, const_rtx pat ATTRIBUTE_UNUSED, void *data)
14260 {
14261   struct mips_sim *state;
14262
14263   state = (struct mips_sim *) data;
14264   if (REG_P (x))
14265     {
14266       unsigned int regno, end_regno;
14267
14268       end_regno = END_REGNO (x);
14269       for (regno = REGNO (x); regno < end_regno; regno++)
14270         {
14271           state->last_set[regno].insn = mips_sim_insn;
14272           state->last_set[regno].time = state->time;
14273         }
14274     }
14275 }
14276
14277 /* Issue instruction INSN in scheduler state STATE.  Assume that INSN
14278    can issue immediately (i.e., that mips_sim_wait_insn has already
14279    been called).  */
14280
14281 static void
14282 mips_sim_issue_insn (struct mips_sim *state, rtx insn)
14283 {
14284   state_transition (state->dfa_state, insn);
14285   state->insns_left--;
14286
14287   mips_sim_insn = insn;
14288   note_stores (PATTERN (insn), mips_sim_record_set, state);
14289 }
14290
14291 /* Simulate issuing a NOP in state STATE.  */
14292
14293 static void
14294 mips_sim_issue_nop (struct mips_sim *state)
14295 {
14296   if (state->insns_left == 0)
14297     mips_sim_next_cycle (state);
14298   state->insns_left--;
14299 }
14300
14301 /* Update simulation state STATE so that it's ready to accept the instruction
14302    after INSN.  INSN should be part of the main rtl chain, not a member of a
14303    SEQUENCE.  */
14304
14305 static void
14306 mips_sim_finish_insn (struct mips_sim *state, rtx insn)
14307 {
14308   /* If INSN is a jump with an implicit delay slot, simulate a nop.  */
14309   if (JUMP_P (insn))
14310     mips_sim_issue_nop (state);
14311
14312   switch (GET_CODE (SEQ_BEGIN (insn)))
14313     {
14314     case CODE_LABEL:
14315     case CALL_INSN:
14316       /* We can't predict the processor state after a call or label.  */
14317       mips_sim_reset (state);
14318       break;
14319
14320     case JUMP_INSN:
14321       /* The delay slots of branch likely instructions are only executed
14322          when the branch is taken.  Therefore, if the caller has simulated
14323          the delay slot instruction, STATE does not really reflect the state
14324          of the pipeline for the instruction after the delay slot.  Also,
14325          branch likely instructions tend to incur a penalty when not taken,
14326          so there will probably be an extra delay between the branch and
14327          the instruction after the delay slot.  */
14328       if (INSN_ANNULLED_BRANCH_P (SEQ_BEGIN (insn)))
14329         mips_sim_reset (state);
14330       break;
14331
14332     default:
14333       break;
14334     }
14335 }
14336 \f
14337 /* The VR4130 pipeline issues aligned pairs of instructions together,
14338    but it stalls the second instruction if it depends on the first.
14339    In order to cut down the amount of logic required, this dependence
14340    check is not based on a full instruction decode.  Instead, any non-SPECIAL
14341    instruction is assumed to modify the register specified by bits 20-16
14342    (which is usually the "rt" field).
14343
14344    In BEQ, BEQL, BNE and BNEL instructions, the rt field is actually an
14345    input, so we can end up with a false dependence between the branch
14346    and its delay slot.  If this situation occurs in instruction INSN,
14347    try to avoid it by swapping rs and rt.  */
14348
14349 static void
14350 vr4130_avoid_branch_rt_conflict (rtx insn)
14351 {
14352   rtx first, second;
14353
14354   first = SEQ_BEGIN (insn);
14355   second = SEQ_END (insn);
14356   if (JUMP_P (first)
14357       && NONJUMP_INSN_P (second)
14358       && GET_CODE (PATTERN (first)) == SET
14359       && GET_CODE (SET_DEST (PATTERN (first))) == PC
14360       && GET_CODE (SET_SRC (PATTERN (first))) == IF_THEN_ELSE)
14361     {
14362       /* Check for the right kind of condition.  */
14363       rtx cond = XEXP (SET_SRC (PATTERN (first)), 0);
14364       if ((GET_CODE (cond) == EQ || GET_CODE (cond) == NE)
14365           && REG_P (XEXP (cond, 0))
14366           && REG_P (XEXP (cond, 1))
14367           && reg_referenced_p (XEXP (cond, 1), PATTERN (second))
14368           && !reg_referenced_p (XEXP (cond, 0), PATTERN (second)))
14369         {
14370           /* SECOND mentions the rt register but not the rs register.  */
14371           rtx tmp = XEXP (cond, 0);
14372           XEXP (cond, 0) = XEXP (cond, 1);
14373           XEXP (cond, 1) = tmp;
14374         }
14375     }
14376 }
14377
14378 /* Implement -mvr4130-align.  Go through each basic block and simulate the
14379    processor pipeline.  If we find that a pair of instructions could execute
14380    in parallel, and the first of those instructions is not 8-byte aligned,
14381    insert a nop to make it aligned.  */
14382
14383 static void
14384 vr4130_align_insns (void)
14385 {
14386   struct mips_sim state;
14387   rtx insn, subinsn, last, last2, next;
14388   bool aligned_p;
14389
14390   dfa_start ();
14391
14392   /* LAST is the last instruction before INSN to have a nonzero length.
14393      LAST2 is the last such instruction before LAST.  */
14394   last = 0;
14395   last2 = 0;
14396
14397   /* ALIGNED_P is true if INSN is known to be at an aligned address.  */
14398   aligned_p = true;
14399
14400   mips_sim_init (&state, alloca (state_size ()));
14401   for (insn = get_insns (); insn != 0; insn = next)
14402     {
14403       unsigned int length;
14404
14405       next = NEXT_INSN (insn);
14406
14407       /* See the comment above vr4130_avoid_branch_rt_conflict for details.
14408          This isn't really related to the alignment pass, but we do it on
14409          the fly to avoid a separate instruction walk.  */
14410       vr4130_avoid_branch_rt_conflict (insn);
14411
14412       if (USEFUL_INSN_P (insn))
14413         FOR_EACH_SUBINSN (subinsn, insn)
14414           {
14415             mips_sim_wait_insn (&state, subinsn);
14416
14417             /* If we want this instruction to issue in parallel with the
14418                previous one, make sure that the previous instruction is
14419                aligned.  There are several reasons why this isn't worthwhile
14420                when the second instruction is a call:
14421
14422                   - Calls are less likely to be performance critical,
14423                   - There's a good chance that the delay slot can execute
14424                     in parallel with the call.
14425                   - The return address would then be unaligned.
14426
14427                In general, if we're going to insert a nop between instructions
14428                X and Y, it's better to insert it immediately after X.  That
14429                way, if the nop makes Y aligned, it will also align any labels
14430                between X and Y.  */
14431             if (state.insns_left != state.issue_rate
14432                 && !CALL_P (subinsn))
14433               {
14434                 if (subinsn == SEQ_BEGIN (insn) && aligned_p)
14435                   {
14436                     /* SUBINSN is the first instruction in INSN and INSN is
14437                        aligned.  We want to align the previous instruction
14438                        instead, so insert a nop between LAST2 and LAST.
14439
14440                        Note that LAST could be either a single instruction
14441                        or a branch with a delay slot.  In the latter case,
14442                        LAST, like INSN, is already aligned, but the delay
14443                        slot must have some extra delay that stops it from
14444                        issuing at the same time as the branch.  We therefore
14445                        insert a nop before the branch in order to align its
14446                        delay slot.  */
14447                     emit_insn_after (gen_nop (), last2);
14448                     aligned_p = false;
14449                   }
14450                 else if (subinsn != SEQ_BEGIN (insn) && !aligned_p)
14451                   {
14452                     /* SUBINSN is the delay slot of INSN, but INSN is
14453                        currently unaligned.  Insert a nop between
14454                        LAST and INSN to align it.  */
14455                     emit_insn_after (gen_nop (), last);
14456                     aligned_p = true;
14457                   }
14458               }
14459             mips_sim_issue_insn (&state, subinsn);
14460           }
14461       mips_sim_finish_insn (&state, insn);
14462
14463       /* Update LAST, LAST2 and ALIGNED_P for the next instruction.  */
14464       length = get_attr_length (insn);
14465       if (length > 0)
14466         {
14467           /* If the instruction is an asm statement or multi-instruction
14468              mips.md patern, the length is only an estimate.  Insert an
14469              8 byte alignment after it so that the following instructions
14470              can be handled correctly.  */
14471           if (NONJUMP_INSN_P (SEQ_BEGIN (insn))
14472               && (recog_memoized (insn) < 0 || length >= 8))
14473             {
14474               next = emit_insn_after (gen_align (GEN_INT (3)), insn);
14475               next = NEXT_INSN (next);
14476               mips_sim_next_cycle (&state);
14477               aligned_p = true;
14478             }
14479           else if (length & 4)
14480             aligned_p = !aligned_p;
14481           last2 = last;
14482           last = insn;
14483         }
14484
14485       /* See whether INSN is an aligned label.  */
14486       if (LABEL_P (insn) && label_to_alignment (insn) >= 3)
14487         aligned_p = true;
14488     }
14489   dfa_finish ();
14490 }
14491 \f
14492 /* This structure records that the current function has a LO_SUM
14493    involving SYMBOL_REF or LABEL_REF BASE and that MAX_OFFSET is
14494    the largest offset applied to BASE by all such LO_SUMs.  */
14495 struct mips_lo_sum_offset {
14496   rtx base;
14497   HOST_WIDE_INT offset;
14498 };
14499
14500 /* Return a hash value for SYMBOL_REF or LABEL_REF BASE.  */
14501
14502 static hashval_t
14503 mips_hash_base (rtx base)
14504 {
14505   int do_not_record_p;
14506
14507   return hash_rtx (base, GET_MODE (base), &do_not_record_p, NULL, false);
14508 }
14509
14510 /* Hash-table callbacks for mips_lo_sum_offsets.  */
14511
14512 static hashval_t
14513 mips_lo_sum_offset_hash (const void *entry)
14514 {
14515   return mips_hash_base (((const struct mips_lo_sum_offset *) entry)->base);
14516 }
14517
14518 static int
14519 mips_lo_sum_offset_eq (const void *entry, const void *value)
14520 {
14521   return rtx_equal_p (((const struct mips_lo_sum_offset *) entry)->base,
14522                       (const_rtx) value);
14523 }
14524
14525 /* Look up symbolic constant X in HTAB, which is a hash table of
14526    mips_lo_sum_offsets.  If OPTION is NO_INSERT, return true if X can be
14527    paired with a recorded LO_SUM, otherwise record X in the table.  */
14528
14529 static bool
14530 mips_lo_sum_offset_lookup (htab_t htab, rtx x, enum insert_option option)
14531 {
14532   rtx base, offset;
14533   void **slot;
14534   struct mips_lo_sum_offset *entry;
14535
14536   /* Split X into a base and offset.  */
14537   split_const (x, &base, &offset);
14538   if (UNSPEC_ADDRESS_P (base))
14539     base = UNSPEC_ADDRESS (base);
14540
14541   /* Look up the base in the hash table.  */
14542   slot = htab_find_slot_with_hash (htab, base, mips_hash_base (base), option);
14543   if (slot == NULL)
14544     return false;
14545
14546   entry = (struct mips_lo_sum_offset *) *slot;
14547   if (option == INSERT)
14548     {
14549       if (entry == NULL)
14550         {
14551           entry = XNEW (struct mips_lo_sum_offset);
14552           entry->base = base;
14553           entry->offset = INTVAL (offset);
14554           *slot = entry;
14555         }
14556       else
14557         {
14558           if (INTVAL (offset) > entry->offset)
14559             entry->offset = INTVAL (offset);
14560         }
14561     }
14562   return INTVAL (offset) <= entry->offset;
14563 }
14564
14565 /* A for_each_rtx callback for which DATA is a mips_lo_sum_offset hash table.
14566    Record every LO_SUM in *LOC.  */
14567
14568 static int
14569 mips_record_lo_sum (rtx *loc, void *data)
14570 {
14571   if (GET_CODE (*loc) == LO_SUM)
14572     mips_lo_sum_offset_lookup ((htab_t) data, XEXP (*loc, 1), INSERT);
14573   return 0;
14574 }
14575
14576 /* Return true if INSN is a SET of an orphaned high-part relocation.
14577    HTAB is a hash table of mips_lo_sum_offsets that describes all the
14578    LO_SUMs in the current function.  */
14579
14580 static bool
14581 mips_orphaned_high_part_p (htab_t htab, rtx insn)
14582 {
14583   enum mips_symbol_type type;
14584   rtx x, set;
14585
14586   set = single_set (insn);
14587   if (set)
14588     {
14589       /* Check for %his.  */
14590       x = SET_SRC (set);
14591       if (GET_CODE (x) == HIGH
14592           && absolute_symbolic_operand (XEXP (x, 0), VOIDmode))
14593         return !mips_lo_sum_offset_lookup (htab, XEXP (x, 0), NO_INSERT);
14594
14595       /* Check for local %gots (and %got_pages, which is redundant but OK).  */
14596       if (GET_CODE (x) == UNSPEC
14597           && XINT (x, 1) == UNSPEC_LOAD_GOT
14598           && mips_symbolic_constant_p (XVECEXP (x, 0, 1),
14599                                        SYMBOL_CONTEXT_LEA, &type)
14600           && type == SYMBOL_GOTOFF_PAGE)
14601         return !mips_lo_sum_offset_lookup (htab, XVECEXP (x, 0, 1), NO_INSERT);
14602     }
14603   return false;
14604 }
14605
14606 /* Subroutine of mips_reorg_process_insns.  If there is a hazard between
14607    INSN and a previous instruction, avoid it by inserting nops after
14608    instruction AFTER.
14609
14610    *DELAYED_REG and *HILO_DELAY describe the hazards that apply at
14611    this point.  If *DELAYED_REG is non-null, INSN must wait a cycle
14612    before using the value of that register.  *HILO_DELAY counts the
14613    number of instructions since the last hilo hazard (that is,
14614    the number of instructions since the last MFLO or MFHI).
14615
14616    After inserting nops for INSN, update *DELAYED_REG and *HILO_DELAY
14617    for the next instruction.
14618
14619    LO_REG is an rtx for the LO register, used in dependence checking.  */
14620
14621 static void
14622 mips_avoid_hazard (rtx after, rtx insn, int *hilo_delay,
14623                    rtx *delayed_reg, rtx lo_reg)
14624 {
14625   rtx pattern, set;
14626   int nops, ninsns;
14627
14628   pattern = PATTERN (insn);
14629
14630   /* Do not put the whole function in .set noreorder if it contains
14631      an asm statement.  We don't know whether there will be hazards
14632      between the asm statement and the gcc-generated code.  */
14633   if (GET_CODE (pattern) == ASM_INPUT || asm_noperands (pattern) >= 0)
14634     cfun->machine->all_noreorder_p = false;
14635
14636   /* Ignore zero-length instructions (barriers and the like).  */
14637   ninsns = get_attr_length (insn) / 4;
14638   if (ninsns == 0)
14639     return;
14640
14641   /* Work out how many nops are needed.  Note that we only care about
14642      registers that are explicitly mentioned in the instruction's pattern.
14643      It doesn't matter that calls use the argument registers or that they
14644      clobber hi and lo.  */
14645   if (*hilo_delay < 2 && reg_set_p (lo_reg, pattern))
14646     nops = 2 - *hilo_delay;
14647   else if (*delayed_reg != 0 && reg_referenced_p (*delayed_reg, pattern))
14648     nops = 1;
14649   else
14650     nops = 0;
14651
14652   /* Insert the nops between this instruction and the previous one.
14653      Each new nop takes us further from the last hilo hazard.  */
14654   *hilo_delay += nops;
14655   while (nops-- > 0)
14656     emit_insn_after (gen_hazard_nop (), after);
14657
14658   /* Set up the state for the next instruction.  */
14659   *hilo_delay += ninsns;
14660   *delayed_reg = 0;
14661   if (INSN_CODE (insn) >= 0)
14662     switch (get_attr_hazard (insn))
14663       {
14664       case HAZARD_NONE:
14665         break;
14666
14667       case HAZARD_HILO:
14668         *hilo_delay = 0;
14669         break;
14670
14671       case HAZARD_DELAY:
14672         set = single_set (insn);
14673         gcc_assert (set);
14674         *delayed_reg = SET_DEST (set);
14675         break;
14676       }
14677 }
14678
14679 /* Go through the instruction stream and insert nops where necessary.
14680    Also delete any high-part relocations whose partnering low parts
14681    are now all dead.  See if the whole function can then be put into
14682    .set noreorder and .set nomacro.  */
14683
14684 static void
14685 mips_reorg_process_insns (void)
14686 {
14687   rtx insn, last_insn, subinsn, next_insn, lo_reg, delayed_reg;
14688   int hilo_delay;
14689   htab_t htab;
14690
14691   /* Force all instructions to be split into their final form.  */
14692   split_all_insns_noflow ();
14693
14694   /* Recalculate instruction lengths without taking nops into account.  */
14695   cfun->machine->ignore_hazard_length_p = true;
14696   shorten_branches (get_insns ());
14697
14698   cfun->machine->all_noreorder_p = true;
14699
14700   /* We don't track MIPS16 PC-relative offsets closely enough to make
14701      a good job of "set .noreorder" code in MIPS16 mode.  */
14702   if (TARGET_MIPS16)
14703     cfun->machine->all_noreorder_p = false;
14704
14705   /* Code that doesn't use explicit relocs can't be ".set nomacro".  */
14706   if (!TARGET_EXPLICIT_RELOCS)
14707     cfun->machine->all_noreorder_p = false;
14708
14709   /* Profiled functions can't be all noreorder because the profiler
14710      support uses assembler macros.  */
14711   if (crtl->profile)
14712     cfun->machine->all_noreorder_p = false;
14713
14714   /* Code compiled with -mfix-vr4120 can't be all noreorder because
14715      we rely on the assembler to work around some errata.  */
14716   if (TARGET_FIX_VR4120)
14717     cfun->machine->all_noreorder_p = false;
14718
14719   /* The same is true for -mfix-vr4130 if we might generate MFLO or
14720      MFHI instructions.  Note that we avoid using MFLO and MFHI if
14721      the VR4130 MACC and DMACC instructions are available instead;
14722      see the *mfhilo_{si,di}_macc patterns.  */
14723   if (TARGET_FIX_VR4130 && !ISA_HAS_MACCHI)
14724     cfun->machine->all_noreorder_p = false;
14725
14726   htab = htab_create (37, mips_lo_sum_offset_hash,
14727                       mips_lo_sum_offset_eq, free);
14728
14729   /* Make a first pass over the instructions, recording all the LO_SUMs.  */
14730   for (insn = get_insns (); insn != 0; insn = NEXT_INSN (insn))
14731     FOR_EACH_SUBINSN (subinsn, insn)
14732       if (USEFUL_INSN_P (subinsn))
14733         for_each_rtx (&PATTERN (subinsn), mips_record_lo_sum, htab);
14734
14735   last_insn = 0;
14736   hilo_delay = 2;
14737   delayed_reg = 0;
14738   lo_reg = gen_rtx_REG (SImode, LO_REGNUM);
14739
14740   /* Make a second pass over the instructions.  Delete orphaned
14741      high-part relocations or turn them into NOPs.  Avoid hazards
14742      by inserting NOPs.  */
14743   for (insn = get_insns (); insn != 0; insn = next_insn)
14744     {
14745       next_insn = NEXT_INSN (insn);
14746       if (USEFUL_INSN_P (insn))
14747         {
14748           if (GET_CODE (PATTERN (insn)) == SEQUENCE)
14749             {
14750               /* If we find an orphaned high-part relocation in a delay
14751                  slot, it's easier to turn that instruction into a NOP than
14752                  to delete it.  The delay slot will be a NOP either way.  */
14753               FOR_EACH_SUBINSN (subinsn, insn)
14754                 if (INSN_P (subinsn))
14755                   {
14756                     if (mips_orphaned_high_part_p (htab, subinsn))
14757                       {
14758                         PATTERN (subinsn) = gen_nop ();
14759                         INSN_CODE (subinsn) = CODE_FOR_nop;
14760                       }
14761                     mips_avoid_hazard (last_insn, subinsn, &hilo_delay,
14762                                        &delayed_reg, lo_reg);
14763                   }
14764               last_insn = insn;
14765             }
14766           else
14767             {
14768               /* INSN is a single instruction.  Delete it if it's an
14769                  orphaned high-part relocation.  */
14770               if (mips_orphaned_high_part_p (htab, insn))
14771                 delete_insn (insn);
14772               /* Also delete cache barriers if the last instruction
14773                  was an annulled branch.  INSN will not be speculatively
14774                  executed.  */
14775               else if (recog_memoized (insn) == CODE_FOR_r10k_cache_barrier
14776                        && last_insn
14777                        && INSN_ANNULLED_BRANCH_P (SEQ_BEGIN (last_insn)))
14778                 delete_insn (insn);
14779               else
14780                 {
14781                   mips_avoid_hazard (last_insn, insn, &hilo_delay,
14782                                      &delayed_reg, lo_reg);
14783                   last_insn = insn;
14784                 }
14785             }
14786         }
14787     }
14788
14789   htab_delete (htab);
14790 }
14791
14792 /* If we are using a GOT, but have not decided to use a global pointer yet,
14793    see whether we need one to implement long branches.  Convert the ghost
14794    global-pointer instructions into real ones if so.  */
14795
14796 static bool
14797 mips_expand_ghost_gp_insns (void)
14798 {
14799   rtx insn;
14800   int normal_length;
14801
14802   /* Quick exit if we already know that we will or won't need a
14803      global pointer.  */
14804   if (!TARGET_USE_GOT
14805       || cfun->machine->global_pointer == INVALID_REGNUM
14806       || mips_must_initialize_gp_p ())
14807     return false;
14808
14809   shorten_branches (get_insns ());
14810
14811   /* Look for a branch that is longer than normal.  The normal length for
14812      non-MIPS16 branches is 8, because the length includes the delay slot.
14813      It is 4 for MIPS16, because MIPS16 branches are extended instructions,
14814      but they have no delay slot.  */
14815   normal_length = (TARGET_MIPS16 ? 4 : 8);
14816   for (insn = get_insns (); insn; insn = NEXT_INSN (insn))
14817     if (JUMP_P (insn)
14818         && USEFUL_INSN_P (insn)
14819         && get_attr_length (insn) > normal_length)
14820       break;
14821
14822   if (insn == NULL_RTX)
14823     return false;
14824
14825   /* We've now established that we need $gp.  */
14826   cfun->machine->must_initialize_gp_p = true;
14827   split_all_insns_noflow ();
14828
14829   return true;
14830 }
14831
14832 /* Subroutine of mips_reorg to manage passes that require DF.  */
14833
14834 static void
14835 mips_df_reorg (void)
14836 {
14837   /* Create def-use chains.  */
14838   df_set_flags (DF_EQ_NOTES);
14839   df_chain_add_problem (DF_UD_CHAIN);
14840   df_analyze ();
14841
14842   if (TARGET_RELAX_PIC_CALLS)
14843     mips_annotate_pic_calls ();
14844
14845   if (mips_r10k_cache_barrier != R10K_CACHE_BARRIER_NONE)
14846     r10k_insert_cache_barriers ();
14847
14848   df_finish_pass (false);
14849 }
14850
14851 /* Implement TARGET_MACHINE_DEPENDENT_REORG.  */
14852
14853 static void
14854 mips_reorg (void)
14855 {
14856   /* Restore the BLOCK_FOR_INSN pointers, which are needed by DF.  Also during
14857      insn splitting in mips16_lay_out_constants, DF insn info is only kept up
14858      to date if the CFG is available.  */
14859   if (mips_cfg_in_reorg ())
14860     compute_bb_for_insn ();
14861   mips16_lay_out_constants ();
14862   if (mips_cfg_in_reorg ())
14863     {
14864       mips_df_reorg ();
14865       free_bb_for_insn ();
14866     }
14867
14868   if (optimize > 0 && flag_delayed_branch)
14869     dbr_schedule (get_insns ());
14870   mips_reorg_process_insns ();
14871   if (!TARGET_MIPS16
14872       && TARGET_EXPLICIT_RELOCS
14873       && TUNE_MIPS4130
14874       && TARGET_VR4130_ALIGN)
14875     vr4130_align_insns ();
14876   if (mips_expand_ghost_gp_insns ())
14877     /* The expansion could invalidate some of the VR4130 alignment
14878        optimizations, but this should be an extremely rare case anyhow.  */
14879     mips_reorg_process_insns ();
14880 }
14881 \f
14882 /* Implement TARGET_ASM_OUTPUT_MI_THUNK.  Generate rtl rather than asm text
14883    in order to avoid duplicating too much logic from elsewhere.  */
14884
14885 static void
14886 mips_output_mi_thunk (FILE *file, tree thunk_fndecl ATTRIBUTE_UNUSED,
14887                       HOST_WIDE_INT delta, HOST_WIDE_INT vcall_offset,
14888                       tree function)
14889 {
14890   rtx this_rtx, temp1, temp2, insn, fnaddr;
14891   bool use_sibcall_p;
14892
14893   /* Pretend to be a post-reload pass while generating rtl.  */
14894   reload_completed = 1;
14895
14896   /* Mark the end of the (empty) prologue.  */
14897   emit_note (NOTE_INSN_PROLOGUE_END);
14898
14899   /* Determine if we can use a sibcall to call FUNCTION directly.  */
14900   fnaddr = XEXP (DECL_RTL (function), 0);
14901   use_sibcall_p = (mips_function_ok_for_sibcall (function, NULL)
14902                    && const_call_insn_operand (fnaddr, Pmode));
14903
14904   /* Determine if we need to load FNADDR from the GOT.  */
14905   if (!use_sibcall_p
14906       && (mips_got_symbol_type_p
14907           (mips_classify_symbol (fnaddr, SYMBOL_CONTEXT_LEA))))
14908     {
14909       /* Pick a global pointer.  Use a call-clobbered register if
14910          TARGET_CALL_SAVED_GP.  */
14911       cfun->machine->global_pointer
14912         = TARGET_CALL_SAVED_GP ? 15 : GLOBAL_POINTER_REGNUM;
14913       cfun->machine->must_initialize_gp_p = true;
14914       SET_REGNO (pic_offset_table_rtx, cfun->machine->global_pointer);
14915
14916       /* Set up the global pointer for n32 or n64 abicalls.  */
14917       mips_emit_loadgp ();
14918     }
14919
14920   /* We need two temporary registers in some cases.  */
14921   temp1 = gen_rtx_REG (Pmode, 2);
14922   temp2 = gen_rtx_REG (Pmode, 3);
14923
14924   /* Find out which register contains the "this" pointer.  */
14925   if (aggregate_value_p (TREE_TYPE (TREE_TYPE (function)), function))
14926     this_rtx = gen_rtx_REG (Pmode, GP_ARG_FIRST + 1);
14927   else
14928     this_rtx = gen_rtx_REG (Pmode, GP_ARG_FIRST);
14929
14930   /* Add DELTA to THIS_RTX.  */
14931   if (delta != 0)
14932     {
14933       rtx offset = GEN_INT (delta);
14934       if (!SMALL_OPERAND (delta))
14935         {
14936           mips_emit_move (temp1, offset);
14937           offset = temp1;
14938         }
14939       emit_insn (gen_add3_insn (this_rtx, this_rtx, offset));
14940     }
14941
14942   /* If needed, add *(*THIS_RTX + VCALL_OFFSET) to THIS_RTX.  */
14943   if (vcall_offset != 0)
14944     {
14945       rtx addr;
14946
14947       /* Set TEMP1 to *THIS_RTX.  */
14948       mips_emit_move (temp1, gen_rtx_MEM (Pmode, this_rtx));
14949
14950       /* Set ADDR to a legitimate address for *THIS_RTX + VCALL_OFFSET.  */
14951       addr = mips_add_offset (temp2, temp1, vcall_offset);
14952
14953       /* Load the offset and add it to THIS_RTX.  */
14954       mips_emit_move (temp1, gen_rtx_MEM (Pmode, addr));
14955       emit_insn (gen_add3_insn (this_rtx, this_rtx, temp1));
14956     }
14957
14958   /* Jump to the target function.  Use a sibcall if direct jumps are
14959      allowed, otherwise load the address into a register first.  */
14960   if (use_sibcall_p)
14961     {
14962       insn = emit_call_insn (gen_sibcall_internal (fnaddr, const0_rtx));
14963       SIBLING_CALL_P (insn) = 1;
14964     }
14965   else
14966     {
14967       /* This is messy.  GAS treats "la $25,foo" as part of a call
14968          sequence and may allow a global "foo" to be lazily bound.
14969          The general move patterns therefore reject this combination.
14970
14971          In this context, lazy binding would actually be OK
14972          for TARGET_CALL_CLOBBERED_GP, but it's still wrong for
14973          TARGET_CALL_SAVED_GP; see mips_load_call_address.
14974          We must therefore load the address via a temporary
14975          register if mips_dangerous_for_la25_p.
14976
14977          If we jump to the temporary register rather than $25,
14978          the assembler can use the move insn to fill the jump's
14979          delay slot.
14980
14981          We can use the same technique for MIPS16 code, where $25
14982          is not a valid JR register.  */
14983       if (TARGET_USE_PIC_FN_ADDR_REG
14984           && !TARGET_MIPS16
14985           && !mips_dangerous_for_la25_p (fnaddr))
14986         temp1 = gen_rtx_REG (Pmode, PIC_FUNCTION_ADDR_REGNUM);
14987       mips_load_call_address (MIPS_CALL_SIBCALL, temp1, fnaddr);
14988
14989       if (TARGET_USE_PIC_FN_ADDR_REG
14990           && REGNO (temp1) != PIC_FUNCTION_ADDR_REGNUM)
14991         mips_emit_move (gen_rtx_REG (Pmode, PIC_FUNCTION_ADDR_REGNUM), temp1);
14992       emit_jump_insn (gen_indirect_jump (temp1));
14993     }
14994
14995   /* Run just enough of rest_of_compilation.  This sequence was
14996      "borrowed" from alpha.c.  */
14997   insn = get_insns ();
14998   insn_locators_alloc ();
14999   split_all_insns_noflow ();
15000   mips16_lay_out_constants ();
15001   shorten_branches (insn);
15002   final_start_function (insn, file, 1);
15003   final (insn, file, 1);
15004   final_end_function ();
15005
15006   /* Clean up the vars set above.  Note that final_end_function resets
15007      the global pointer for us.  */
15008   reload_completed = 0;
15009 }
15010 \f
15011 /* The last argument passed to mips_set_mips16_mode, or negative if the
15012    function hasn't been called yet.
15013
15014    There are two copies of this information.  One is saved and restored
15015    by the PCH process while the other is specific to this compiler
15016    invocation.  The information calculated by mips_set_mips16_mode
15017    is invalid unless the two variables are the same.  */
15018 static int was_mips16_p = -1;
15019 static GTY(()) int was_mips16_pch_p = -1;
15020
15021 /* Set up the target-dependent global state so that it matches the
15022    current function's ISA mode.  */
15023
15024 static void
15025 mips_set_mips16_mode (int mips16_p)
15026 {
15027   if (mips16_p == was_mips16_p
15028       && mips16_p == was_mips16_pch_p)
15029     return;
15030
15031   /* Restore base settings of various flags.  */
15032   target_flags = mips_base_target_flags;
15033   flag_schedule_insns = mips_base_schedule_insns;
15034   flag_reorder_blocks_and_partition = mips_base_reorder_blocks_and_partition;
15035   flag_move_loop_invariants = mips_base_move_loop_invariants;
15036   align_loops = mips_base_align_loops;
15037   align_jumps = mips_base_align_jumps;
15038   align_functions = mips_base_align_functions;
15039
15040   if (mips16_p)
15041     {
15042       /* Switch to MIPS16 mode.  */
15043       target_flags |= MASK_MIPS16;
15044
15045       /* Don't run the scheduler before reload, since it tends to
15046          increase register pressure.  */
15047       flag_schedule_insns = 0;
15048
15049       /* Don't do hot/cold partitioning.  mips16_lay_out_constants expects
15050          the whole function to be in a single section.  */
15051       flag_reorder_blocks_and_partition = 0;
15052
15053       /* Don't move loop invariants, because it tends to increase
15054          register pressure.  It also introduces an extra move in cases
15055          where the constant is the first operand in a two-operand binary
15056          instruction, or when it forms a register argument to a functon
15057          call.  */
15058       flag_move_loop_invariants = 0;
15059
15060       target_flags |= MASK_EXPLICIT_RELOCS;
15061
15062       /* Experiments suggest we get the best overall section-anchor
15063          results from using the range of an unextended LW or SW.  Code
15064          that makes heavy use of byte or short accesses can do better
15065          with ranges of 0...31 and 0...63 respectively, but most code is
15066          sensitive to the range of LW and SW instead.  */
15067       targetm.min_anchor_offset = 0;
15068       targetm.max_anchor_offset = 127;
15069
15070       targetm.const_anchor = 0;
15071
15072       /* MIPS16 has no BAL instruction.  */
15073       target_flags &= ~MASK_RELAX_PIC_CALLS;
15074
15075       if (flag_pic && !TARGET_OLDABI)
15076         sorry ("MIPS16 PIC for ABIs other than o32 and o64");
15077
15078       if (TARGET_XGOT)
15079         sorry ("MIPS16 -mxgot code");
15080
15081       if (TARGET_HARD_FLOAT_ABI && !TARGET_OLDABI)
15082         sorry ("hard-float MIPS16 code for ABIs other than o32 and o64");
15083     }
15084   else
15085     {
15086       /* Switch to normal (non-MIPS16) mode.  */
15087       target_flags &= ~MASK_MIPS16;
15088
15089       /* Provide default values for align_* for 64-bit targets.  */
15090       if (TARGET_64BIT)
15091         {
15092           if (align_loops == 0)
15093             align_loops = 8;
15094           if (align_jumps == 0)
15095             align_jumps = 8;
15096           if (align_functions == 0)
15097             align_functions = 8;
15098         }
15099
15100       targetm.min_anchor_offset = -32768;
15101       targetm.max_anchor_offset = 32767;
15102
15103       targetm.const_anchor = 0x8000;
15104     }
15105
15106   /* (Re)initialize MIPS target internals for new ISA.  */
15107   mips_init_relocs ();
15108
15109   if (was_mips16_p >= 0 || was_mips16_pch_p >= 0)
15110     /* Reinitialize target-dependent state.  */
15111     target_reinit ();
15112
15113   was_mips16_p = mips16_p;
15114   was_mips16_pch_p = mips16_p;
15115 }
15116
15117 /* Implement TARGET_SET_CURRENT_FUNCTION.  Decide whether the current
15118    function should use the MIPS16 ISA and switch modes accordingly.  */
15119
15120 static void
15121 mips_set_current_function (tree fndecl)
15122 {
15123   mips_set_mips16_mode (mips_use_mips16_mode_p (fndecl));
15124 }
15125 \f
15126 /* Allocate a chunk of memory for per-function machine-dependent data.  */
15127
15128 static struct machine_function *
15129 mips_init_machine_status (void)
15130 {
15131   return ((struct machine_function *)
15132           ggc_alloc_cleared (sizeof (struct machine_function)));
15133 }
15134
15135 /* Return the processor associated with the given ISA level, or null
15136    if the ISA isn't valid.  */
15137
15138 static const struct mips_cpu_info *
15139 mips_cpu_info_from_isa (int isa)
15140 {
15141   unsigned int i;
15142
15143   for (i = 0; i < ARRAY_SIZE (mips_cpu_info_table); i++)
15144     if (mips_cpu_info_table[i].isa == isa)
15145       return mips_cpu_info_table + i;
15146
15147   return NULL;
15148 }
15149
15150 /* Return true if GIVEN is the same as CANONICAL, or if it is CANONICAL
15151    with a final "000" replaced by "k".  Ignore case.
15152
15153    Note: this function is shared between GCC and GAS.  */
15154
15155 static bool
15156 mips_strict_matching_cpu_name_p (const char *canonical, const char *given)
15157 {
15158   while (*given != 0 && TOLOWER (*given) == TOLOWER (*canonical))
15159     given++, canonical++;
15160
15161   return ((*given == 0 && *canonical == 0)
15162           || (strcmp (canonical, "000") == 0 && strcasecmp (given, "k") == 0));
15163 }
15164
15165 /* Return true if GIVEN matches CANONICAL, where GIVEN is a user-supplied
15166    CPU name.  We've traditionally allowed a lot of variation here.
15167
15168    Note: this function is shared between GCC and GAS.  */
15169
15170 static bool
15171 mips_matching_cpu_name_p (const char *canonical, const char *given)
15172 {
15173   /* First see if the name matches exactly, or with a final "000"
15174      turned into "k".  */
15175   if (mips_strict_matching_cpu_name_p (canonical, given))
15176     return true;
15177
15178   /* If not, try comparing based on numerical designation alone.
15179      See if GIVEN is an unadorned number, or 'r' followed by a number.  */
15180   if (TOLOWER (*given) == 'r')
15181     given++;
15182   if (!ISDIGIT (*given))
15183     return false;
15184
15185   /* Skip over some well-known prefixes in the canonical name,
15186      hoping to find a number there too.  */
15187   if (TOLOWER (canonical[0]) == 'v' && TOLOWER (canonical[1]) == 'r')
15188     canonical += 2;
15189   else if (TOLOWER (canonical[0]) == 'r' && TOLOWER (canonical[1]) == 'm')
15190     canonical += 2;
15191   else if (TOLOWER (canonical[0]) == 'r')
15192     canonical += 1;
15193
15194   return mips_strict_matching_cpu_name_p (canonical, given);
15195 }
15196
15197 /* Return the mips_cpu_info entry for the processor or ISA given
15198    by CPU_STRING.  Return null if the string isn't recognized.
15199
15200    A similar function exists in GAS.  */
15201
15202 static const struct mips_cpu_info *
15203 mips_parse_cpu (const char *cpu_string)
15204 {
15205   unsigned int i;
15206   const char *s;
15207
15208   /* In the past, we allowed upper-case CPU names, but it doesn't
15209      work well with the multilib machinery.  */
15210   for (s = cpu_string; *s != 0; s++)
15211     if (ISUPPER (*s))
15212       {
15213         warning (0, "CPU names must be lower case");
15214         break;
15215       }
15216
15217   /* 'from-abi' selects the most compatible architecture for the given
15218      ABI: MIPS I for 32-bit ABIs and MIPS III for 64-bit ABIs.  For the
15219      EABIs, we have to decide whether we're using the 32-bit or 64-bit
15220      version.  */
15221   if (strcasecmp (cpu_string, "from-abi") == 0)
15222     return mips_cpu_info_from_isa (ABI_NEEDS_32BIT_REGS ? 1
15223                                    : ABI_NEEDS_64BIT_REGS ? 3
15224                                    : (TARGET_64BIT ? 3 : 1));
15225
15226   /* 'default' has traditionally been a no-op.  Probably not very useful.  */
15227   if (strcasecmp (cpu_string, "default") == 0)
15228     return NULL;
15229
15230   for (i = 0; i < ARRAY_SIZE (mips_cpu_info_table); i++)
15231     if (mips_matching_cpu_name_p (mips_cpu_info_table[i].name, cpu_string))
15232       return mips_cpu_info_table + i;
15233
15234   return NULL;
15235 }
15236
15237 /* Set up globals to generate code for the ISA or processor
15238    described by INFO.  */
15239
15240 static void
15241 mips_set_architecture (const struct mips_cpu_info *info)
15242 {
15243   if (info != 0)
15244     {
15245       mips_arch_info = info;
15246       mips_arch = info->cpu;
15247       mips_isa = info->isa;
15248     }
15249 }
15250
15251 /* Likewise for tuning.  */
15252
15253 static void
15254 mips_set_tune (const struct mips_cpu_info *info)
15255 {
15256   if (info != 0)
15257     {
15258       mips_tune_info = info;
15259       mips_tune = info->cpu;
15260     }
15261 }
15262
15263 /* Implement TARGET_HANDLE_OPTION.  */
15264
15265 static bool
15266 mips_handle_option (size_t code, const char *arg, int value ATTRIBUTE_UNUSED)
15267 {
15268   switch (code)
15269     {
15270     case OPT_mabi_:
15271       if (strcmp (arg, "32") == 0)
15272         mips_abi = ABI_32;
15273       else if (strcmp (arg, "o64") == 0)
15274         mips_abi = ABI_O64;
15275       else if (strcmp (arg, "n32") == 0)
15276         mips_abi = ABI_N32;
15277       else if (strcmp (arg, "64") == 0)
15278         mips_abi = ABI_64;
15279       else if (strcmp (arg, "eabi") == 0)
15280         mips_abi = ABI_EABI;
15281       else
15282         return false;
15283       return true;
15284
15285     case OPT_march_:
15286     case OPT_mtune_:
15287       return mips_parse_cpu (arg) != 0;
15288
15289     case OPT_mips:
15290       mips_isa_option_info = mips_parse_cpu (ACONCAT (("mips", arg, NULL)));
15291       return mips_isa_option_info != 0;
15292
15293     case OPT_mno_flush_func:
15294       mips_cache_flush_func = NULL;
15295       return true;
15296
15297     case OPT_mcode_readable_:
15298       if (strcmp (arg, "yes") == 0)
15299         mips_code_readable = CODE_READABLE_YES;
15300       else if (strcmp (arg, "pcrel") == 0)
15301         mips_code_readable = CODE_READABLE_PCREL;
15302       else if (strcmp (arg, "no") == 0)
15303         mips_code_readable = CODE_READABLE_NO;
15304       else
15305         return false;
15306       return true;
15307
15308     case OPT_mr10k_cache_barrier_:
15309       if (strcmp (arg, "load-store") == 0)
15310         mips_r10k_cache_barrier = R10K_CACHE_BARRIER_LOAD_STORE;
15311       else if (strcmp (arg, "store") == 0)
15312         mips_r10k_cache_barrier = R10K_CACHE_BARRIER_STORE;
15313       else if (strcmp (arg, "none") == 0)
15314         mips_r10k_cache_barrier = R10K_CACHE_BARRIER_NONE;
15315       else
15316         return false;
15317       return true;
15318
15319     default:
15320       return true;
15321     }
15322 }
15323
15324 /* Implement OVERRIDE_OPTIONS.  */
15325
15326 void
15327 mips_override_options (void)
15328 {
15329   int i, start, regno, mode;
15330
15331   /* Process flags as though we were generating non-MIPS16 code.  */
15332   mips_base_mips16 = TARGET_MIPS16;
15333   target_flags &= ~MASK_MIPS16;
15334
15335 #ifdef SUBTARGET_OVERRIDE_OPTIONS
15336   SUBTARGET_OVERRIDE_OPTIONS;
15337 #endif
15338
15339   /* Set the small data limit.  */
15340   mips_small_data_threshold = (g_switch_set
15341                                ? g_switch_value
15342                                : MIPS_DEFAULT_GVALUE);
15343
15344   /* The following code determines the architecture and register size.
15345      Similar code was added to GAS 2.14 (see tc-mips.c:md_after_parse_args()).
15346      The GAS and GCC code should be kept in sync as much as possible.  */
15347
15348   if (mips_arch_string != 0)
15349     mips_set_architecture (mips_parse_cpu (mips_arch_string));
15350
15351   if (mips_isa_option_info != 0)
15352     {
15353       if (mips_arch_info == 0)
15354         mips_set_architecture (mips_isa_option_info);
15355       else if (mips_arch_info->isa != mips_isa_option_info->isa)
15356         error ("%<-%s%> conflicts with the other architecture options, "
15357                "which specify a %s processor",
15358                mips_isa_option_info->name,
15359                mips_cpu_info_from_isa (mips_arch_info->isa)->name);
15360     }
15361
15362   if (mips_arch_info == 0)
15363     {
15364 #ifdef MIPS_CPU_STRING_DEFAULT
15365       mips_set_architecture (mips_parse_cpu (MIPS_CPU_STRING_DEFAULT));
15366 #else
15367       mips_set_architecture (mips_cpu_info_from_isa (MIPS_ISA_DEFAULT));
15368 #endif
15369     }
15370
15371   if (ABI_NEEDS_64BIT_REGS && !ISA_HAS_64BIT_REGS)
15372     error ("%<-march=%s%> is not compatible with the selected ABI",
15373            mips_arch_info->name);
15374
15375   /* Optimize for mips_arch, unless -mtune selects a different processor.  */
15376   if (mips_tune_string != 0)
15377     mips_set_tune (mips_parse_cpu (mips_tune_string));
15378
15379   if (mips_tune_info == 0)
15380     mips_set_tune (mips_arch_info);
15381
15382   if ((target_flags_explicit & MASK_64BIT) != 0)
15383     {
15384       /* The user specified the size of the integer registers.  Make sure
15385          it agrees with the ABI and ISA.  */
15386       if (TARGET_64BIT && !ISA_HAS_64BIT_REGS)
15387         error ("%<-mgp64%> used with a 32-bit processor");
15388       else if (!TARGET_64BIT && ABI_NEEDS_64BIT_REGS)
15389         error ("%<-mgp32%> used with a 64-bit ABI");
15390       else if (TARGET_64BIT && ABI_NEEDS_32BIT_REGS)
15391         error ("%<-mgp64%> used with a 32-bit ABI");
15392     }
15393   else
15394     {
15395       /* Infer the integer register size from the ABI and processor.
15396          Restrict ourselves to 32-bit registers if that's all the
15397          processor has, or if the ABI cannot handle 64-bit registers.  */
15398       if (ABI_NEEDS_32BIT_REGS || !ISA_HAS_64BIT_REGS)
15399         target_flags &= ~MASK_64BIT;
15400       else
15401         target_flags |= MASK_64BIT;
15402     }
15403
15404   if ((target_flags_explicit & MASK_FLOAT64) != 0)
15405     {
15406       if (TARGET_SINGLE_FLOAT && TARGET_FLOAT64)
15407         error ("unsupported combination: %s", "-mfp64 -msingle-float");
15408       else if (TARGET_64BIT && TARGET_DOUBLE_FLOAT && !TARGET_FLOAT64)
15409         error ("unsupported combination: %s", "-mgp64 -mfp32 -mdouble-float");
15410       else if (!TARGET_64BIT && TARGET_FLOAT64)
15411         {
15412           if (!ISA_HAS_MXHC1)
15413             error ("%<-mgp32%> and %<-mfp64%> can only be combined if"
15414                    " the target supports the mfhc1 and mthc1 instructions");
15415           else if (mips_abi != ABI_32)
15416             error ("%<-mgp32%> and %<-mfp64%> can only be combined when using"
15417                    " the o32 ABI");
15418         }
15419     }
15420   else
15421     {
15422       /* -msingle-float selects 32-bit float registers.  Otherwise the
15423          float registers should be the same size as the integer ones.  */
15424       if (TARGET_64BIT && TARGET_DOUBLE_FLOAT)
15425         target_flags |= MASK_FLOAT64;
15426       else
15427         target_flags &= ~MASK_FLOAT64;
15428     }
15429
15430   /* End of code shared with GAS.  */
15431
15432   /* If no -mlong* option was given, infer it from the other options.  */
15433   if ((target_flags_explicit & MASK_LONG64) == 0)
15434     {
15435       if ((mips_abi == ABI_EABI && TARGET_64BIT) || mips_abi == ABI_64)
15436         target_flags |= MASK_LONG64;
15437       else
15438         target_flags &= ~MASK_LONG64;
15439     }
15440
15441   if (!TARGET_OLDABI)
15442     flag_pcc_struct_return = 0;
15443
15444   /* Decide which rtx_costs structure to use.  */
15445   if (optimize_size)
15446     mips_cost = &mips_rtx_cost_optimize_size;
15447   else
15448     mips_cost = &mips_rtx_cost_data[mips_tune];
15449
15450   /* If the user hasn't specified a branch cost, use the processor's
15451      default.  */
15452   if (mips_branch_cost == 0)
15453     mips_branch_cost = mips_cost->branch_cost;
15454
15455   /* If neither -mbranch-likely nor -mno-branch-likely was given
15456      on the command line, set MASK_BRANCHLIKELY based on the target
15457      architecture and tuning flags.  Annulled delay slots are a
15458      size win, so we only consider the processor-specific tuning
15459      for !optimize_size.  */
15460   if ((target_flags_explicit & MASK_BRANCHLIKELY) == 0)
15461     {
15462       if (ISA_HAS_BRANCHLIKELY
15463           && (optimize_size
15464               || (mips_tune_info->tune_flags & PTF_AVOID_BRANCHLIKELY) == 0))
15465         target_flags |= MASK_BRANCHLIKELY;
15466       else
15467         target_flags &= ~MASK_BRANCHLIKELY;
15468     }
15469   else if (TARGET_BRANCHLIKELY && !ISA_HAS_BRANCHLIKELY)
15470     warning (0, "the %qs architecture does not support branch-likely"
15471              " instructions", mips_arch_info->name);
15472
15473   /* The effect of -mabicalls isn't defined for the EABI.  */
15474   if (mips_abi == ABI_EABI && TARGET_ABICALLS)
15475     {
15476       error ("unsupported combination: %s", "-mabicalls -mabi=eabi");
15477       target_flags &= ~MASK_ABICALLS;
15478     }
15479
15480   if (TARGET_ABICALLS_PIC2)
15481     /* We need to set flag_pic for executables as well as DSOs
15482        because we may reference symbols that are not defined in
15483        the final executable.  (MIPS does not use things like
15484        copy relocs, for example.)
15485
15486        There is a body of code that uses __PIC__ to distinguish
15487        between -mabicalls and -mno-abicalls code.  The non-__PIC__
15488        variant is usually appropriate for TARGET_ABICALLS_PIC0, as
15489        long as any indirect jumps use $25.  */
15490     flag_pic = 1;
15491
15492   /* -mvr4130-align is a "speed over size" optimization: it usually produces
15493      faster code, but at the expense of more nops.  Enable it at -O3 and
15494      above.  */
15495   if (optimize > 2 && (target_flags_explicit & MASK_VR4130_ALIGN) == 0)
15496     target_flags |= MASK_VR4130_ALIGN;
15497
15498   /* Prefer a call to memcpy over inline code when optimizing for size,
15499      though see MOVE_RATIO in mips.h.  */
15500   if (optimize_size && (target_flags_explicit & MASK_MEMCPY) == 0)
15501     target_flags |= MASK_MEMCPY;
15502
15503   /* If we have a nonzero small-data limit, check that the -mgpopt
15504      setting is consistent with the other target flags.  */
15505   if (mips_small_data_threshold > 0)
15506     {
15507       if (!TARGET_GPOPT)
15508         {
15509           if (!TARGET_EXPLICIT_RELOCS)
15510             error ("%<-mno-gpopt%> needs %<-mexplicit-relocs%>");
15511
15512           TARGET_LOCAL_SDATA = false;
15513           TARGET_EXTERN_SDATA = false;
15514         }
15515       else
15516         {
15517           if (TARGET_VXWORKS_RTP)
15518             warning (0, "cannot use small-data accesses for %qs", "-mrtp");
15519
15520           if (TARGET_ABICALLS)
15521             warning (0, "cannot use small-data accesses for %qs",
15522                      "-mabicalls");
15523         }
15524     }
15525
15526 #ifdef MIPS_TFMODE_FORMAT
15527   REAL_MODE_FORMAT (TFmode) = &MIPS_TFMODE_FORMAT;
15528 #endif
15529
15530   /* Make sure that the user didn't turn off paired single support when
15531      MIPS-3D support is requested.  */
15532   if (TARGET_MIPS3D
15533       && (target_flags_explicit & MASK_PAIRED_SINGLE_FLOAT)
15534       && !TARGET_PAIRED_SINGLE_FLOAT)
15535     error ("%<-mips3d%> requires %<-mpaired-single%>");
15536
15537   /* If TARGET_MIPS3D, enable MASK_PAIRED_SINGLE_FLOAT.  */
15538   if (TARGET_MIPS3D)
15539     target_flags |= MASK_PAIRED_SINGLE_FLOAT;
15540
15541   /* Make sure that when TARGET_PAIRED_SINGLE_FLOAT is true, TARGET_FLOAT64
15542      and TARGET_HARD_FLOAT_ABI are both true.  */
15543   if (TARGET_PAIRED_SINGLE_FLOAT && !(TARGET_FLOAT64 && TARGET_HARD_FLOAT_ABI))
15544     error ("%qs must be used with %qs",
15545            TARGET_MIPS3D ? "-mips3d" : "-mpaired-single",
15546            TARGET_HARD_FLOAT_ABI ? "-mfp64" : "-mhard-float");
15547
15548   /* Make sure that the ISA supports TARGET_PAIRED_SINGLE_FLOAT when it is
15549      enabled.  */
15550   if (TARGET_PAIRED_SINGLE_FLOAT && !ISA_HAS_PAIRED_SINGLE)
15551     warning (0, "the %qs architecture does not support paired-single"
15552              " instructions", mips_arch_info->name);
15553
15554   if (mips_r10k_cache_barrier != R10K_CACHE_BARRIER_NONE
15555       && !TARGET_CACHE_BUILTIN)
15556     {
15557       error ("%qs requires a target that provides the %qs instruction",
15558              "-mr10k-cache-barrier", "cache");
15559       mips_r10k_cache_barrier = R10K_CACHE_BARRIER_NONE;
15560     }
15561
15562   /* If TARGET_DSPR2, enable MASK_DSP.  */
15563   if (TARGET_DSPR2)
15564     target_flags |= MASK_DSP;
15565
15566   /* .eh_frame addresses should be the same width as a C pointer.
15567      Most MIPS ABIs support only one pointer size, so the assembler
15568      will usually know exactly how big an .eh_frame address is.
15569
15570      Unfortunately, this is not true of the 64-bit EABI.  The ABI was
15571      originally defined to use 64-bit pointers (i.e. it is LP64), and
15572      this is still the default mode.  However, we also support an n32-like
15573      ILP32 mode, which is selected by -mlong32.  The problem is that the
15574      assembler has traditionally not had an -mlong option, so it has
15575      traditionally not known whether we're using the ILP32 or LP64 form.
15576
15577      As it happens, gas versions up to and including 2.19 use _32-bit_
15578      addresses for EABI64 .cfi_* directives.  This is wrong for the
15579      default LP64 mode, so we can't use the directives by default.
15580      Moreover, since gas's current behavior is at odds with gcc's
15581      default behavior, it seems unwise to rely on future versions
15582      of gas behaving the same way.  We therefore avoid using .cfi
15583      directives for -mlong32 as well.  */
15584   if (mips_abi == ABI_EABI && TARGET_64BIT)
15585     flag_dwarf2_cfi_asm = 0;
15586
15587   /* .cfi_* directives generate a read-only section, so fall back on
15588      manual .eh_frame creation if we need the section to be writable.  */
15589   if (TARGET_WRITABLE_EH_FRAME)
15590     flag_dwarf2_cfi_asm = 0;
15591
15592   mips_init_print_operand_punct ();
15593
15594   /* Set up array to map GCC register number to debug register number.
15595      Ignore the special purpose register numbers.  */
15596
15597   for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
15598     {
15599       mips_dbx_regno[i] = INVALID_REGNUM;
15600       if (GP_REG_P (i) || FP_REG_P (i) || ALL_COP_REG_P (i))
15601         mips_dwarf_regno[i] = i;
15602       else
15603         mips_dwarf_regno[i] = INVALID_REGNUM;
15604     }
15605
15606   start = GP_DBX_FIRST - GP_REG_FIRST;
15607   for (i = GP_REG_FIRST; i <= GP_REG_LAST; i++)
15608     mips_dbx_regno[i] = i + start;
15609
15610   start = FP_DBX_FIRST - FP_REG_FIRST;
15611   for (i = FP_REG_FIRST; i <= FP_REG_LAST; i++)
15612     mips_dbx_regno[i] = i + start;
15613
15614   /* Accumulator debug registers use big-endian ordering.  */
15615   mips_dbx_regno[HI_REGNUM] = MD_DBX_FIRST + 0;
15616   mips_dbx_regno[LO_REGNUM] = MD_DBX_FIRST + 1;
15617   mips_dwarf_regno[HI_REGNUM] = MD_REG_FIRST + 0;
15618   mips_dwarf_regno[LO_REGNUM] = MD_REG_FIRST + 1;
15619   for (i = DSP_ACC_REG_FIRST; i <= DSP_ACC_REG_LAST; i += 2)
15620     {
15621       mips_dwarf_regno[i + TARGET_LITTLE_ENDIAN] = i;
15622       mips_dwarf_regno[i + TARGET_BIG_ENDIAN] = i + 1;
15623     }
15624
15625   /* Set up mips_hard_regno_mode_ok.  */
15626   for (mode = 0; mode < MAX_MACHINE_MODE; mode++)
15627     for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++)
15628       mips_hard_regno_mode_ok[mode][regno]
15629         = mips_hard_regno_mode_ok_p (regno, (enum machine_mode) mode);
15630
15631   /* Function to allocate machine-dependent function status.  */
15632   init_machine_status = &mips_init_machine_status;
15633
15634   /* Default to working around R4000 errata only if the processor
15635      was selected explicitly.  */
15636   if ((target_flags_explicit & MASK_FIX_R4000) == 0
15637       && mips_matching_cpu_name_p (mips_arch_info->name, "r4000"))
15638     target_flags |= MASK_FIX_R4000;
15639
15640   /* Default to working around R4400 errata only if the processor
15641      was selected explicitly.  */
15642   if ((target_flags_explicit & MASK_FIX_R4400) == 0
15643       && mips_matching_cpu_name_p (mips_arch_info->name, "r4400"))
15644     target_flags |= MASK_FIX_R4400;
15645
15646   /* Default to working around R10000 errata only if the processor
15647      was selected explicitly.  */
15648   if ((target_flags_explicit & MASK_FIX_R10000) == 0
15649       && mips_matching_cpu_name_p (mips_arch_info->name, "r10000"))
15650     target_flags |= MASK_FIX_R10000;
15651
15652   /* Make sure that branch-likely instructions available when using
15653      -mfix-r10000.  The instructions are not available if either:
15654
15655         1. -mno-branch-likely was passed.
15656         2. The selected ISA does not support branch-likely and
15657            the command line does not include -mbranch-likely.  */
15658   if (TARGET_FIX_R10000
15659       && ((target_flags_explicit & MASK_BRANCHLIKELY) == 0
15660           ? !ISA_HAS_BRANCHLIKELY
15661           : !TARGET_BRANCHLIKELY))
15662     sorry ("%qs requires branch-likely instructions", "-mfix-r10000");
15663
15664   if (TARGET_SYNCI && !ISA_HAS_SYNCI)
15665     {
15666       warning (0, "the %qs architecture does not support the synci "
15667                "instruction", mips_arch_info->name);
15668       target_flags &= ~MASK_SYNCI;
15669     }
15670
15671   /* Only optimize PIC indirect calls if they are actually required.  */
15672   if (!TARGET_USE_GOT || !TARGET_EXPLICIT_RELOCS)
15673     target_flags &= ~MASK_RELAX_PIC_CALLS;
15674
15675   /* Save base state of options.  */
15676   mips_base_target_flags = target_flags;
15677   mips_base_schedule_insns = flag_schedule_insns;
15678   mips_base_reorder_blocks_and_partition = flag_reorder_blocks_and_partition;
15679   mips_base_move_loop_invariants = flag_move_loop_invariants;
15680   mips_base_align_loops = align_loops;
15681   mips_base_align_jumps = align_jumps;
15682   mips_base_align_functions = align_functions;
15683
15684   /* Now select the ISA mode.
15685
15686      Do all CPP-sensitive stuff in non-MIPS16 mode; we'll switch to
15687      MIPS16 mode afterwards if need be.  */
15688   mips_set_mips16_mode (false);
15689 }
15690
15691 /* Swap the register information for registers I and I + 1, which
15692    currently have the wrong endianness.  Note that the registers'
15693    fixedness and call-clobberedness might have been set on the
15694    command line.  */
15695
15696 static void
15697 mips_swap_registers (unsigned int i)
15698 {
15699   int tmpi;
15700   const char *tmps;
15701
15702 #define SWAP_INT(X, Y) (tmpi = (X), (X) = (Y), (Y) = tmpi)
15703 #define SWAP_STRING(X, Y) (tmps = (X), (X) = (Y), (Y) = tmps)
15704
15705   SWAP_INT (fixed_regs[i], fixed_regs[i + 1]);
15706   SWAP_INT (call_used_regs[i], call_used_regs[i + 1]);
15707   SWAP_INT (call_really_used_regs[i], call_really_used_regs[i + 1]);
15708   SWAP_STRING (reg_names[i], reg_names[i + 1]);
15709
15710 #undef SWAP_STRING
15711 #undef SWAP_INT
15712 }
15713
15714 /* Implement CONDITIONAL_REGISTER_USAGE.  */
15715
15716 void
15717 mips_conditional_register_usage (void)
15718 {
15719
15720   if (ISA_HAS_DSP)
15721     {
15722       /* These DSP control register fields are global.  */
15723       global_regs[CCDSP_PO_REGNUM] = 1;
15724       global_regs[CCDSP_SC_REGNUM] = 1;
15725     }
15726   else 
15727     {
15728       int regno;
15729
15730       for (regno = DSP_ACC_REG_FIRST; regno <= DSP_ACC_REG_LAST; regno++)
15731         fixed_regs[regno] = call_used_regs[regno] = 1;
15732     }
15733   if (!TARGET_HARD_FLOAT)
15734     {
15735       int regno;
15736
15737       for (regno = FP_REG_FIRST; regno <= FP_REG_LAST; regno++)
15738         fixed_regs[regno] = call_used_regs[regno] = 1;
15739       for (regno = ST_REG_FIRST; regno <= ST_REG_LAST; regno++)
15740         fixed_regs[regno] = call_used_regs[regno] = 1;
15741     }
15742   else if (! ISA_HAS_8CC)
15743     {
15744       int regno;
15745
15746       /* We only have a single condition-code register.  We implement
15747          this by fixing all the condition-code registers and generating
15748          RTL that refers directly to ST_REG_FIRST.  */
15749       for (regno = ST_REG_FIRST; regno <= ST_REG_LAST; regno++)
15750         fixed_regs[regno] = call_used_regs[regno] = 1;
15751     }
15752   /* In MIPS16 mode, we permit the $t temporary registers to be used
15753      for reload.  We prohibit the unused $s registers, since they
15754      are call-saved, and saving them via a MIPS16 register would
15755      probably waste more time than just reloading the value.  */
15756   if (TARGET_MIPS16)
15757     {
15758       fixed_regs[18] = call_used_regs[18] = 1;
15759       fixed_regs[19] = call_used_regs[19] = 1;
15760       fixed_regs[20] = call_used_regs[20] = 1;
15761       fixed_regs[21] = call_used_regs[21] = 1;
15762       fixed_regs[22] = call_used_regs[22] = 1;
15763       fixed_regs[23] = call_used_regs[23] = 1;
15764       fixed_regs[26] = call_used_regs[26] = 1;
15765       fixed_regs[27] = call_used_regs[27] = 1;
15766       fixed_regs[30] = call_used_regs[30] = 1;
15767     }
15768   /* $f20-$f23 are call-clobbered for n64.  */
15769   if (mips_abi == ABI_64)
15770     {
15771       int regno;
15772       for (regno = FP_REG_FIRST + 20; regno < FP_REG_FIRST + 24; regno++)
15773         call_really_used_regs[regno] = call_used_regs[regno] = 1;
15774     }
15775   /* Odd registers in the range $f21-$f31 (inclusive) are call-clobbered
15776      for n32.  */
15777   if (mips_abi == ABI_N32)
15778     {
15779       int regno;
15780       for (regno = FP_REG_FIRST + 21; regno <= FP_REG_FIRST + 31; regno+=2)
15781         call_really_used_regs[regno] = call_used_regs[regno] = 1;
15782     }
15783   /* Make sure that double-register accumulator values are correctly
15784      ordered for the current endianness.  */
15785   if (TARGET_LITTLE_ENDIAN)
15786     {
15787       unsigned int regno;
15788
15789       mips_swap_registers (MD_REG_FIRST);
15790       for (regno = DSP_ACC_REG_FIRST; regno <= DSP_ACC_REG_LAST; regno += 2)
15791         mips_swap_registers (regno);
15792     }
15793 }
15794
15795 /* Initialize vector TARGET to VALS.  */
15796
15797 void
15798 mips_expand_vector_init (rtx target, rtx vals)
15799 {
15800   enum machine_mode mode;
15801   enum machine_mode inner;
15802   unsigned int i, n_elts;
15803   rtx mem;
15804
15805   mode = GET_MODE (target);
15806   inner = GET_MODE_INNER (mode);
15807   n_elts = GET_MODE_NUNITS (mode);
15808
15809   gcc_assert (VECTOR_MODE_P (mode));
15810
15811   mem = assign_stack_temp (mode, GET_MODE_SIZE (mode), 0);
15812   for (i = 0; i < n_elts; i++)
15813     emit_move_insn (adjust_address_nv (mem, inner, i * GET_MODE_SIZE (inner)),
15814                     XVECEXP (vals, 0, i));
15815
15816   emit_move_insn (target, mem);
15817 }
15818
15819 /* When generating MIPS16 code, we want to allocate $24 (T_REG) before
15820    other registers for instructions for which it is possible.  This
15821    encourages the compiler to use CMP in cases where an XOR would
15822    require some register shuffling.  */
15823
15824 void
15825 mips_order_regs_for_local_alloc (void)
15826 {
15827   int i;
15828
15829   for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
15830     reg_alloc_order[i] = i;
15831
15832   if (TARGET_MIPS16)
15833     {
15834       /* It really doesn't matter where we put register 0, since it is
15835          a fixed register anyhow.  */
15836       reg_alloc_order[0] = 24;
15837       reg_alloc_order[24] = 0;
15838     }
15839 }
15840
15841 /* Implement EH_USES.  */
15842
15843 bool
15844 mips_eh_uses (unsigned int regno)
15845 {
15846   if (reload_completed && !TARGET_ABSOLUTE_JUMPS)
15847     {
15848       /* We need to force certain registers to be live in order to handle
15849          PIC long branches correctly.  See mips_must_initialize_gp_p for
15850          details.  */
15851       if (mips_cfun_has_cprestore_slot_p ())
15852         {
15853           if (regno == CPRESTORE_SLOT_REGNUM)
15854             return true;
15855         }
15856       else
15857         {
15858           if (cfun->machine->global_pointer == regno)
15859             return true;
15860         }
15861     }
15862
15863   return false;
15864 }
15865
15866 /* Implement EPILOGUE_USES.  */
15867
15868 bool
15869 mips_epilogue_uses (unsigned int regno)
15870 {
15871   /* Say that the epilogue uses the return address register.  Note that
15872      in the case of sibcalls, the values "used by the epilogue" are
15873      considered live at the start of the called function.  */
15874   if (regno == RETURN_ADDR_REGNUM)
15875     return true;
15876
15877   /* If using a GOT, say that the epilogue also uses GOT_VERSION_REGNUM.
15878      See the comment above load_call<mode> for details.  */
15879   if (TARGET_USE_GOT && (regno) == GOT_VERSION_REGNUM)
15880     return true;
15881
15882   /* An interrupt handler must preserve some registers that are
15883      ordinarily call-clobbered.  */
15884   if (cfun->machine->interrupt_handler_p
15885       && mips_interrupt_extra_call_saved_reg_p (regno))
15886     return true;
15887
15888   return false;
15889 }
15890
15891 /* A for_each_rtx callback.  Stop the search if *X is an AT register.  */
15892
15893 static int
15894 mips_at_reg_p (rtx *x, void *data ATTRIBUTE_UNUSED)
15895 {
15896   return REG_P (*x) && REGNO (*x) == AT_REGNUM;
15897 }
15898
15899 /* Return true if INSN needs to be wrapped in ".set noat".
15900    INSN has NOPERANDS operands, stored in OPVEC.  */
15901
15902 static bool
15903 mips_need_noat_wrapper_p (rtx insn, rtx *opvec, int noperands)
15904 {
15905   int i;
15906
15907   if (recog_memoized (insn) >= 0)
15908     for (i = 0; i < noperands; i++)
15909       if (for_each_rtx (&opvec[i], mips_at_reg_p, NULL))
15910         return true;
15911   return false;
15912 }
15913
15914 /* Implement FINAL_PRESCAN_INSN.  */
15915
15916 void
15917 mips_final_prescan_insn (rtx insn, rtx *opvec, int noperands)
15918 {
15919   if (mips_need_noat_wrapper_p (insn, opvec, noperands))
15920     mips_push_asm_switch (&mips_noat);
15921 }
15922
15923 /* Implement TARGET_ASM_FINAL_POSTSCAN_INSN.  */
15924
15925 static void
15926 mips_final_postscan_insn (FILE *file ATTRIBUTE_UNUSED, rtx insn,
15927                           rtx *opvec, int noperands)
15928 {
15929   if (mips_need_noat_wrapper_p (insn, opvec, noperands))
15930     mips_pop_asm_switch (&mips_noat);
15931 }
15932 \f
15933 /* Return the size in bytes of the trampoline code, padded to
15934    TRAMPOLINE_ALIGNMENT bits.  The static chain pointer and target
15935    function address immediately follow.  */
15936
15937 int
15938 mips_trampoline_code_size (void)
15939 {
15940   if (TARGET_USE_PIC_FN_ADDR_REG)
15941     return 4 * 4;
15942   else if (ptr_mode == DImode)
15943     return 8 * 4;
15944   else if (ISA_HAS_LOAD_DELAY)
15945     return 6 * 4;
15946   else
15947     return 4 * 4;
15948 }
15949
15950 /* Implement TARGET_TRAMPOLINE_INIT.  */
15951
15952 static void
15953 mips_trampoline_init (rtx m_tramp, tree fndecl, rtx chain_value)
15954 {
15955   rtx addr, end_addr, high, low, opcode, mem;
15956   rtx trampoline[8];
15957   unsigned int i, j;
15958   HOST_WIDE_INT end_addr_offset, static_chain_offset, target_function_offset;
15959
15960   /* Work out the offsets of the pointers from the start of the
15961      trampoline code.  */
15962   end_addr_offset = mips_trampoline_code_size ();
15963   static_chain_offset = end_addr_offset;
15964   target_function_offset = static_chain_offset + GET_MODE_SIZE (ptr_mode);
15965
15966   /* Get pointers to the beginning and end of the code block.  */
15967   addr = force_reg (Pmode, XEXP (m_tramp, 0));
15968   end_addr = mips_force_binary (Pmode, PLUS, addr, GEN_INT (end_addr_offset));
15969
15970 #define OP(X) gen_int_mode (X, SImode)
15971
15972   /* Build up the code in TRAMPOLINE.  */
15973   i = 0;
15974   if (TARGET_USE_PIC_FN_ADDR_REG)
15975     {
15976       /* $25 contains the address of the trampoline.  Emit code of the form:
15977
15978              l[wd]    $1, target_function_offset($25)
15979              l[wd]    $static_chain, static_chain_offset($25)
15980              jr       $1
15981              move     $25,$1.  */
15982       trampoline[i++] = OP (MIPS_LOAD_PTR (AT_REGNUM,
15983                                            target_function_offset,
15984                                            PIC_FUNCTION_ADDR_REGNUM));
15985       trampoline[i++] = OP (MIPS_LOAD_PTR (STATIC_CHAIN_REGNUM,
15986                                            static_chain_offset,
15987                                            PIC_FUNCTION_ADDR_REGNUM));
15988       trampoline[i++] = OP (MIPS_JR (AT_REGNUM));
15989       trampoline[i++] = OP (MIPS_MOVE (PIC_FUNCTION_ADDR_REGNUM, AT_REGNUM));
15990     }
15991   else if (ptr_mode == DImode)
15992     {
15993       /* It's too cumbersome to create the full 64-bit address, so let's
15994          instead use:
15995
15996              move    $1, $31
15997              bal     1f
15998              nop
15999          1:  l[wd]   $25, target_function_offset - 12($31)
16000              l[wd]   $static_chain, static_chain_offset - 12($31)
16001              jr      $25
16002              move    $31, $1
16003
16004         where 12 is the offset of "1:" from the start of the code block.  */
16005       trampoline[i++] = OP (MIPS_MOVE (AT_REGNUM, RETURN_ADDR_REGNUM));
16006       trampoline[i++] = OP (MIPS_BAL (1));
16007       trampoline[i++] = OP (MIPS_NOP);
16008       trampoline[i++] = OP (MIPS_LOAD_PTR (PIC_FUNCTION_ADDR_REGNUM,
16009                                            target_function_offset - 12,
16010                                            RETURN_ADDR_REGNUM));
16011       trampoline[i++] = OP (MIPS_LOAD_PTR (STATIC_CHAIN_REGNUM,
16012                                            static_chain_offset - 12,
16013                                            RETURN_ADDR_REGNUM));
16014       trampoline[i++] = OP (MIPS_JR (PIC_FUNCTION_ADDR_REGNUM));
16015       trampoline[i++] = OP (MIPS_MOVE (RETURN_ADDR_REGNUM, AT_REGNUM));
16016     }
16017   else
16018     {
16019       /* If the target has load delays, emit:
16020
16021              lui     $1, %hi(end_addr)
16022              lw      $25, %lo(end_addr + ...)($1)
16023              lw      $static_chain, %lo(end_addr + ...)($1)
16024              jr      $25
16025              nop
16026
16027          Otherwise emit:
16028
16029              lui     $1, %hi(end_addr)
16030              lw      $25, %lo(end_addr + ...)($1)
16031              jr      $25
16032              lw      $static_chain, %lo(end_addr + ...)($1).  */
16033
16034       /* Split END_ADDR into %hi and %lo values.  Trampolines are aligned
16035          to 64 bits, so the %lo value will have the bottom 3 bits clear.  */
16036       high = expand_simple_binop (SImode, PLUS, end_addr, GEN_INT (0x8000),
16037                                   NULL, false, OPTAB_WIDEN);
16038       high = expand_simple_binop (SImode, LSHIFTRT, high, GEN_INT (16),
16039                                   NULL, false, OPTAB_WIDEN);
16040       low = convert_to_mode (SImode, gen_lowpart (HImode, end_addr), true);
16041
16042       /* Emit the LUI.  */
16043       opcode = OP (MIPS_LUI (AT_REGNUM, 0));
16044       trampoline[i++] = expand_simple_binop (SImode, IOR, opcode, high,
16045                                              NULL, false, OPTAB_WIDEN);
16046
16047       /* Emit the load of the target function.  */
16048       opcode = OP (MIPS_LOAD_PTR (PIC_FUNCTION_ADDR_REGNUM,
16049                                   target_function_offset - end_addr_offset,
16050                                   AT_REGNUM));
16051       trampoline[i++] = expand_simple_binop (SImode, IOR, opcode, low,
16052                                              NULL, false, OPTAB_WIDEN);
16053
16054       /* Emit the JR here, if we can.  */
16055       if (!ISA_HAS_LOAD_DELAY)
16056         trampoline[i++] = OP (MIPS_JR (PIC_FUNCTION_ADDR_REGNUM));
16057
16058       /* Emit the load of the static chain register.  */
16059       opcode = OP (MIPS_LOAD_PTR (STATIC_CHAIN_REGNUM,
16060                                   static_chain_offset - end_addr_offset,
16061                                   AT_REGNUM));
16062       trampoline[i++] = expand_simple_binop (SImode, IOR, opcode, low,
16063                                              NULL, false, OPTAB_WIDEN);
16064
16065       /* Emit the JR, if we couldn't above.  */
16066       if (ISA_HAS_LOAD_DELAY)
16067         {
16068           trampoline[i++] = OP (MIPS_JR (PIC_FUNCTION_ADDR_REGNUM));
16069           trampoline[i++] = OP (MIPS_NOP);
16070         }
16071     }
16072
16073 #undef OP
16074
16075   /* Copy the trampoline code.  Leave any padding uninitialized.  */
16076   for (j = 0; j < i; j++)
16077     {
16078       mem = adjust_address (m_tramp, SImode, j * GET_MODE_SIZE (SImode));
16079       mips_emit_move (mem, trampoline[j]);
16080     }
16081
16082   /* Set up the static chain pointer field.  */
16083   mem = adjust_address (m_tramp, ptr_mode, static_chain_offset);
16084   mips_emit_move (mem, chain_value);
16085
16086   /* Set up the target function field.  */
16087   mem = adjust_address (m_tramp, ptr_mode, target_function_offset);
16088   mips_emit_move (mem, XEXP (DECL_RTL (fndecl), 0));
16089
16090   /* Flush the code part of the trampoline.  */
16091   emit_insn (gen_add3_insn (end_addr, addr, GEN_INT (TRAMPOLINE_SIZE)));
16092   emit_insn (gen_clear_cache (addr, end_addr));
16093 }
16094 \f
16095 /* Initialize the GCC target structure.  */
16096 #undef TARGET_ASM_ALIGNED_HI_OP
16097 #define TARGET_ASM_ALIGNED_HI_OP "\t.half\t"
16098 #undef TARGET_ASM_ALIGNED_SI_OP
16099 #define TARGET_ASM_ALIGNED_SI_OP "\t.word\t"
16100 #undef TARGET_ASM_ALIGNED_DI_OP
16101 #define TARGET_ASM_ALIGNED_DI_OP "\t.dword\t"
16102
16103 #undef TARGET_LEGITIMIZE_ADDRESS
16104 #define TARGET_LEGITIMIZE_ADDRESS mips_legitimize_address
16105
16106 #undef TARGET_ASM_FUNCTION_PROLOGUE
16107 #define TARGET_ASM_FUNCTION_PROLOGUE mips_output_function_prologue
16108 #undef TARGET_ASM_FUNCTION_EPILOGUE
16109 #define TARGET_ASM_FUNCTION_EPILOGUE mips_output_function_epilogue
16110 #undef TARGET_ASM_SELECT_RTX_SECTION
16111 #define TARGET_ASM_SELECT_RTX_SECTION mips_select_rtx_section
16112 #undef TARGET_ASM_FUNCTION_RODATA_SECTION
16113 #define TARGET_ASM_FUNCTION_RODATA_SECTION mips_function_rodata_section
16114
16115 #undef TARGET_SCHED_INIT
16116 #define TARGET_SCHED_INIT mips_sched_init
16117 #undef TARGET_SCHED_REORDER
16118 #define TARGET_SCHED_REORDER mips_sched_reorder
16119 #undef TARGET_SCHED_REORDER2
16120 #define TARGET_SCHED_REORDER2 mips_sched_reorder
16121 #undef TARGET_SCHED_VARIABLE_ISSUE
16122 #define TARGET_SCHED_VARIABLE_ISSUE mips_variable_issue
16123 #undef TARGET_SCHED_ADJUST_COST
16124 #define TARGET_SCHED_ADJUST_COST mips_adjust_cost
16125 #undef TARGET_SCHED_ISSUE_RATE
16126 #define TARGET_SCHED_ISSUE_RATE mips_issue_rate
16127 #undef TARGET_SCHED_INIT_DFA_POST_CYCLE_INSN
16128 #define TARGET_SCHED_INIT_DFA_POST_CYCLE_INSN mips_init_dfa_post_cycle_insn
16129 #undef TARGET_SCHED_DFA_POST_ADVANCE_CYCLE
16130 #define TARGET_SCHED_DFA_POST_ADVANCE_CYCLE mips_dfa_post_advance_cycle
16131 #undef TARGET_SCHED_FIRST_CYCLE_MULTIPASS_DFA_LOOKAHEAD
16132 #define TARGET_SCHED_FIRST_CYCLE_MULTIPASS_DFA_LOOKAHEAD \
16133   mips_multipass_dfa_lookahead
16134
16135 #undef TARGET_DEFAULT_TARGET_FLAGS
16136 #define TARGET_DEFAULT_TARGET_FLAGS             \
16137   (TARGET_DEFAULT                               \
16138    | TARGET_CPU_DEFAULT                         \
16139    | TARGET_ENDIAN_DEFAULT                      \
16140    | TARGET_FP_EXCEPTIONS_DEFAULT               \
16141    | MASK_CHECK_ZERO_DIV                        \
16142    | MASK_FUSED_MADD)
16143 #undef TARGET_HANDLE_OPTION
16144 #define TARGET_HANDLE_OPTION mips_handle_option
16145
16146 #undef TARGET_FUNCTION_OK_FOR_SIBCALL
16147 #define TARGET_FUNCTION_OK_FOR_SIBCALL mips_function_ok_for_sibcall
16148
16149 #undef TARGET_INSERT_ATTRIBUTES
16150 #define TARGET_INSERT_ATTRIBUTES mips_insert_attributes
16151 #undef TARGET_MERGE_DECL_ATTRIBUTES
16152 #define TARGET_MERGE_DECL_ATTRIBUTES mips_merge_decl_attributes
16153 #undef TARGET_SET_CURRENT_FUNCTION
16154 #define TARGET_SET_CURRENT_FUNCTION mips_set_current_function
16155
16156 #undef TARGET_VALID_POINTER_MODE
16157 #define TARGET_VALID_POINTER_MODE mips_valid_pointer_mode
16158 #undef TARGET_RTX_COSTS
16159 #define TARGET_RTX_COSTS mips_rtx_costs
16160 #undef TARGET_ADDRESS_COST
16161 #define TARGET_ADDRESS_COST mips_address_cost
16162
16163 #undef TARGET_IN_SMALL_DATA_P
16164 #define TARGET_IN_SMALL_DATA_P mips_in_small_data_p
16165
16166 #undef TARGET_MACHINE_DEPENDENT_REORG
16167 #define TARGET_MACHINE_DEPENDENT_REORG mips_reorg
16168
16169 #undef TARGET_ASM_FILE_START
16170 #define TARGET_ASM_FILE_START mips_file_start
16171 #undef TARGET_ASM_FILE_START_FILE_DIRECTIVE
16172 #define TARGET_ASM_FILE_START_FILE_DIRECTIVE true
16173
16174 #undef TARGET_INIT_LIBFUNCS
16175 #define TARGET_INIT_LIBFUNCS mips_init_libfuncs
16176
16177 #undef TARGET_BUILD_BUILTIN_VA_LIST
16178 #define TARGET_BUILD_BUILTIN_VA_LIST mips_build_builtin_va_list
16179 #undef TARGET_EXPAND_BUILTIN_VA_START
16180 #define TARGET_EXPAND_BUILTIN_VA_START mips_va_start
16181 #undef TARGET_GIMPLIFY_VA_ARG_EXPR
16182 #define TARGET_GIMPLIFY_VA_ARG_EXPR mips_gimplify_va_arg_expr
16183
16184 #undef  TARGET_PROMOTE_FUNCTION_MODE
16185 #define TARGET_PROMOTE_FUNCTION_MODE default_promote_function_mode_always_promote
16186 #undef TARGET_PROMOTE_PROTOTYPES
16187 #define TARGET_PROMOTE_PROTOTYPES hook_bool_const_tree_true
16188
16189 #undef TARGET_RETURN_IN_MEMORY
16190 #define TARGET_RETURN_IN_MEMORY mips_return_in_memory
16191 #undef TARGET_RETURN_IN_MSB
16192 #define TARGET_RETURN_IN_MSB mips_return_in_msb
16193
16194 #undef TARGET_ASM_OUTPUT_MI_THUNK
16195 #define TARGET_ASM_OUTPUT_MI_THUNK mips_output_mi_thunk
16196 #undef TARGET_ASM_CAN_OUTPUT_MI_THUNK
16197 #define TARGET_ASM_CAN_OUTPUT_MI_THUNK hook_bool_const_tree_hwi_hwi_const_tree_true
16198
16199 #undef TARGET_SETUP_INCOMING_VARARGS
16200 #define TARGET_SETUP_INCOMING_VARARGS mips_setup_incoming_varargs
16201 #undef TARGET_STRICT_ARGUMENT_NAMING
16202 #define TARGET_STRICT_ARGUMENT_NAMING mips_strict_argument_naming
16203 #undef TARGET_MUST_PASS_IN_STACK
16204 #define TARGET_MUST_PASS_IN_STACK must_pass_in_stack_var_size
16205 #undef TARGET_PASS_BY_REFERENCE
16206 #define TARGET_PASS_BY_REFERENCE mips_pass_by_reference
16207 #undef TARGET_CALLEE_COPIES
16208 #define TARGET_CALLEE_COPIES mips_callee_copies
16209 #undef TARGET_ARG_PARTIAL_BYTES
16210 #define TARGET_ARG_PARTIAL_BYTES mips_arg_partial_bytes
16211
16212 #undef TARGET_MODE_REP_EXTENDED
16213 #define TARGET_MODE_REP_EXTENDED mips_mode_rep_extended
16214
16215 #undef TARGET_VECTOR_MODE_SUPPORTED_P
16216 #define TARGET_VECTOR_MODE_SUPPORTED_P mips_vector_mode_supported_p
16217
16218 #undef TARGET_SCALAR_MODE_SUPPORTED_P
16219 #define TARGET_SCALAR_MODE_SUPPORTED_P mips_scalar_mode_supported_p
16220
16221 #undef TARGET_INIT_BUILTINS
16222 #define TARGET_INIT_BUILTINS mips_init_builtins
16223 #undef TARGET_EXPAND_BUILTIN
16224 #define TARGET_EXPAND_BUILTIN mips_expand_builtin
16225
16226 #undef TARGET_HAVE_TLS
16227 #define TARGET_HAVE_TLS HAVE_AS_TLS
16228
16229 #undef TARGET_CANNOT_FORCE_CONST_MEM
16230 #define TARGET_CANNOT_FORCE_CONST_MEM mips_cannot_force_const_mem
16231
16232 #undef TARGET_ENCODE_SECTION_INFO
16233 #define TARGET_ENCODE_SECTION_INFO mips_encode_section_info
16234
16235 #undef TARGET_ATTRIBUTE_TABLE
16236 #define TARGET_ATTRIBUTE_TABLE mips_attribute_table
16237 /* All our function attributes are related to how out-of-line copies should
16238    be compiled or called.  They don't in themselves prevent inlining.  */
16239 #undef TARGET_FUNCTION_ATTRIBUTE_INLINABLE_P
16240 #define TARGET_FUNCTION_ATTRIBUTE_INLINABLE_P hook_bool_const_tree_true
16241
16242 #undef TARGET_EXTRA_LIVE_ON_ENTRY
16243 #define TARGET_EXTRA_LIVE_ON_ENTRY mips_extra_live_on_entry
16244
16245 #undef TARGET_USE_BLOCKS_FOR_CONSTANT_P
16246 #define TARGET_USE_BLOCKS_FOR_CONSTANT_P mips_use_blocks_for_constant_p
16247 #undef TARGET_USE_ANCHORS_FOR_SYMBOL_P
16248 #define TARGET_USE_ANCHORS_FOR_SYMBOL_P mips_use_anchors_for_symbol_p
16249
16250 #undef  TARGET_COMP_TYPE_ATTRIBUTES
16251 #define TARGET_COMP_TYPE_ATTRIBUTES mips_comp_type_attributes
16252
16253 #ifdef HAVE_AS_DTPRELWORD
16254 #undef TARGET_ASM_OUTPUT_DWARF_DTPREL
16255 #define TARGET_ASM_OUTPUT_DWARF_DTPREL mips_output_dwarf_dtprel
16256 #endif
16257 #undef TARGET_DWARF_REGISTER_SPAN
16258 #define TARGET_DWARF_REGISTER_SPAN mips_dwarf_register_span
16259
16260 #undef TARGET_IRA_COVER_CLASSES
16261 #define TARGET_IRA_COVER_CLASSES mips_ira_cover_classes
16262
16263 #undef TARGET_ASM_FINAL_POSTSCAN_INSN
16264 #define TARGET_ASM_FINAL_POSTSCAN_INSN mips_final_postscan_insn
16265
16266 #undef TARGET_LEGITIMATE_ADDRESS_P
16267 #define TARGET_LEGITIMATE_ADDRESS_P     mips_legitimate_address_p
16268
16269 #undef TARGET_FRAME_POINTER_REQUIRED
16270 #define TARGET_FRAME_POINTER_REQUIRED mips_frame_pointer_required
16271
16272 #undef TARGET_CAN_ELIMINATE
16273 #define TARGET_CAN_ELIMINATE mips_can_eliminate
16274
16275 #undef TARGET_TRAMPOLINE_INIT
16276 #define TARGET_TRAMPOLINE_INIT mips_trampoline_init
16277
16278 struct gcc_target targetm = TARGET_INITIALIZER;
16279 \f
16280 #include "gt-mips.h"